FindPassword.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <template>
  2. <div
  3. class="find-password"
  4. >
  5. <div class="bg-deco" />
  6. <img
  7. class="logo-and-title"
  8. src="@/assets/images/logo-and-title.png"
  9. alt=""
  10. draggable="false"
  11. >
  12. <div class="form-item">
  13. <div class="title">
  14. <img
  15. src="@/assets/images/icon-account.png"
  16. alt=""
  17. draggable="false"
  18. >
  19. <span>帐号</span>
  20. </div>
  21. <input
  22. v-model.trim="account"
  23. type="text"
  24. placeholder="请输入邮箱"
  25. aotufocus
  26. :class="{
  27. invalid: isAccountInputOver && !isAccountValid
  28. }"
  29. @blur="isAccountInputOver=true"
  30. >
  31. </div>
  32. <div class="form-item">
  33. <div class="title">
  34. <img
  35. src="@/assets/images/icon-phone.png"
  36. alt=""
  37. draggable="false"
  38. >
  39. <span>手机号</span>
  40. </div>
  41. <input
  42. v-model="phone"
  43. type="number"
  44. placeholder="请输入11位手机号"
  45. :class="{
  46. invalid: isPhoneInputOver && !isPhoneValid
  47. }"
  48. @blur="isPhoneInputOver=true"
  49. >
  50. </div>
  51. <button
  52. class="submit"
  53. @click="submit"
  54. >
  55. 发送验证邮件
  56. </button>
  57. <button
  58. class="return"
  59. @click="$router.push({
  60. name: 'HomeView',
  61. })"
  62. >
  63. 返回首页
  64. </button>
  65. </div>
  66. </template>
  67. <script setup>
  68. import { ref, computed, watch, onMounted } from "vue"
  69. import { useRoute, useRouter } from "vue-router"
  70. import { useStore } from "vuex"
  71. import { showDialog } from 'vant'
  72. import { findPassowrd } from '@/api.js'
  73. const route = useRoute()
  74. const router = useRouter()
  75. const store = useStore()
  76. const {
  77. windowSizeInCssForRef,
  78. windowSizeWhenDesignForRef,
  79. } = useSizeAdapt(390, 752)
  80. const account = ref('')
  81. const phone = ref('')
  82. const password = ref('')
  83. const passwordRepeat = ref('')
  84. const accountTrimed = computed(() => {
  85. return account.value.trim()
  86. })
  87. const phoneTrimed = computed(() => {
  88. return phone.value.toString().trim()
  89. })
  90. const isAccountValid = computed(() => {
  91. return !!accountTrimed.value
  92. })
  93. const isPhoneValid = computed(() => {
  94. return phoneTrimed.value.length === 11
  95. })
  96. const isAccountInputOver = ref(false)
  97. const isPhoneInputOver = ref(false)
  98. function submit() {
  99. if (!isAccountValid.value) {
  100. showDialog({
  101. message: '请正确输入邮箱',
  102. theme: 'round-button',
  103. })
  104. isAccountInputOver.value = true
  105. return
  106. }
  107. if (!isPhoneValid.value) {
  108. showDialog({
  109. message: '请正确输入手机号',
  110. theme: 'round-button',
  111. })
  112. isPhoneInputOver.value = true
  113. return
  114. }
  115. findPassowrd(accountTrimed.value, phoneTrimed.value).then(() => {
  116. showDialog({
  117. message: '已发送邮件到您的邮箱',
  118. theme: 'round-button',
  119. }).then(() => {
  120. router.replace({
  121. name: 'HomeView'
  122. })
  123. })
  124. }).catch((err) => {
  125. showDialog({
  126. message: err,
  127. theme: 'round-button',
  128. })
  129. })
  130. }
  131. </script>
  132. <style lang="less" scoped>
  133. .find-password{
  134. display: flex;
  135. flex-direction: column;
  136. align-items: center;
  137. position: absolute;
  138. left: 0;
  139. top: 0;
  140. width: 100%;
  141. height: 100%;
  142. overflow: hidden;
  143. >.bg-deco{
  144. position: absolute;
  145. left: calc(-67 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  146. bottom: calc(-130 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  147. width: calc(250 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  148. height: calc(250 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  149. background: #D1B489;
  150. filter: blur(calc(100 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')));
  151. }
  152. >.logo-and-title{
  153. margin-top: calc(53 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  154. width: calc(120 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  155. margin-bottom: calc(38 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  156. }
  157. >.form-item{
  158. width: calc(321 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  159. margin-bottom: calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  160. >.title{
  161. width: 100%;
  162. display: flex;
  163. align-items: center;
  164. margin-bottom: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  165. >img{
  166. width: calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  167. height: calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  168. margin-right: calc(10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  169. }
  170. >span{
  171. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  172. font-family: Source Han Sans SC, Source Han Sans SC;
  173. font-weight: 400;
  174. color: #D1B489;
  175. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  176. }
  177. }
  178. >input{
  179. width: 100%;
  180. height: calc(29 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  181. border-bottom: 1px solid #D9D9D9;
  182. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  183. font-family: Source Han Sans SC, Source Han Sans SC;
  184. font-weight: 400;
  185. color: black;
  186. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  187. &::placeholder {
  188. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  189. font-family: Source Han Sans SC, Source Han Sans SC;
  190. font-weight: 400;
  191. color: #B8B8B8;
  192. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  193. }
  194. }
  195. >input.invalid{
  196. border-bottom: 1px solid red;
  197. }
  198. }
  199. >button.submit{
  200. width: calc(332 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  201. height: calc(56 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  202. background: rgba(197, 161, 108, 0.8);
  203. border-radius: calc(10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  204. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  205. font-family: Source Han Sans SC, Source Han Sans SC;
  206. font-weight: 400;
  207. color: #FFFFFF;
  208. line-height: calc(23 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  209. }
  210. >button.return{
  211. font-size: calc(16 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  212. font-family: Source Han Sans SC, Source Han Sans SC;
  213. font-weight: 400;
  214. color: #A97C46;
  215. line-height: calc(19 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  216. padding: calc(15 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  217. opacity: 0.5;
  218. }
  219. }
  220. </style>