index.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <div class="p-password">
  3. <div v-if="action === 'change'" class="step ptc-inner">
  4. <div class="ptc-form">
  5. <h3 class="title">Change Password</h3>
  6. <div class="ptc-form-item">
  7. <input
  8. class="ptc-input"
  9. type="password"
  10. placeholder="Enter new password"
  11. />
  12. </div>
  13. <div class="ptc-form-item">
  14. <input
  15. class="ptc-input"
  16. type="password"
  17. placeholder="Repeat new password"
  18. />
  19. </div>
  20. <div class="ptc-form-item">
  21. <button class="ptc-button">SUBMIT</button>
  22. </div>
  23. </div>
  24. </div>
  25. <div v-else-if="step === 0" class="step ptc-inner">
  26. <h3 class="title">Recover password</h3>
  27. <div class="desc">
  28. We will send you an email for password reset. Please check it
  29. </div>
  30. <div class="ptc-form">
  31. <div class="ptc-form-item">
  32. <input
  33. v-model="resetForm.email"
  34. class="ptc-input"
  35. placeholder="email address"
  36. />
  37. </div>
  38. <div class="ptc-form-item">
  39. <button class="ptc-button" @click="sendEmail">NEXT</button>
  40. </div>
  41. <div class="ptc-form-item">
  42. <button class="ptc-button ptc-button--stroke" @click="$router.back()">
  43. BACK
  44. </button>
  45. </div>
  46. </div>
  47. </div>
  48. <div v-else-if="step === 1" class="step ptc-inner">
  49. <h3 class="title">Recover password</h3>
  50. <div class="desc">
  51. We will send you an email( {{ resetForm.email }} )The password reset
  52. email has been sent. Please go to check it
  53. </div>
  54. <div class="ptc-form">
  55. <div class="ptc-form-item">
  56. <button class="ptc-button" @click="next">GO</button>
  57. </div>
  58. </div>
  59. </div>
  60. <div v-if="step === 2" class="step ptc-inner">
  61. <h3 class="title">Recover password</h3>
  62. <div class="desc">
  63. Please set a new password for {{ resetForm.email }}. It is recommended
  64. to use a combination of numbers, letters, and characters to improve the
  65. password security level
  66. </div>
  67. <div class="ptc-form">
  68. <div class="ptc-form-item">
  69. <input
  70. class="ptc-input"
  71. placeholder="6-20 digits password, case sensitive"
  72. />
  73. </div>
  74. <div class="ptc-form-item">
  75. <button class="ptc-button" @click="next">SUBMIT</button>
  76. </div>
  77. </div>
  78. </div>
  79. <div v-else-if="step === 3" class="step ptc-inner">
  80. <i class="icon-success"></i>
  81. <h3 class="title tac">Password reset successfully</h3>
  82. <button class="ptc-button mgt96" @click="$router.push('/login')">
  83. TO LOG IN
  84. </button>
  85. </div>
  86. </div>
  87. </template>
  88. <script setup lang="ts">
  89. import { reactive } from 'vue'
  90. import { useRoute, useRouter } from 'vue-router'
  91. import { state } from '@/store'
  92. import { sendPasswordEmail, resetPassword } from '@/service/user'
  93. const props = defineProps<{ action: 'change' | 'reset' }>()
  94. const router = useRouter()
  95. const { query } = useRoute()
  96. const step = query.step ? +(query.step as string) : 0
  97. const resetForm = reactive({ email: '' })
  98. state.bgWhite = true
  99. function next() {
  100. router.push({
  101. path: '',
  102. query: { step: step + 1 },
  103. })
  104. }
  105. async function sendEmail() {
  106. await sendPasswordEmail(resetForm.email)
  107. next()
  108. }
  109. </script>
  110. <style lang="scss">
  111. .p-password {
  112. .step {
  113. margin-top: 98px;
  114. padding: 0 76px;
  115. @include media-breakpoint-up(md) {
  116. min-height: 1084px - 98px;
  117. }
  118. }
  119. .title {
  120. line-height: 56px;
  121. font-size: 40px;
  122. font-weight: 500;
  123. color: #333;
  124. }
  125. .desc {
  126. margin: 36px 0 64px;
  127. line-height: 44px;
  128. font-size: 32px;
  129. color: #333;
  130. }
  131. .icon-success {
  132. display: block;
  133. margin: 0 auto 32px;
  134. @include icon('@img/success.png', 96px);
  135. }
  136. .mgt96 {
  137. margin-top: 96px;
  138. }
  139. }
  140. </style>