update-password.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from './update-password.module.less';
  3. import {
  4. NButton,
  5. NForm,
  6. NFormItem,
  7. NInput,
  8. NSelect,
  9. NSpace,
  10. useMessage
  11. } from 'naive-ui';
  12. import { useRouter } from 'vue-router';
  13. import { useUserStore } from '/src/store/modules/users';
  14. import { gradeToCN } from '/src/utils/contants';
  15. import { sendSms, updatePassword } from '/src/views/login/api';
  16. export default defineComponent({
  17. name: 'train-update',
  18. emits: ['close', 'submit'],
  19. setup(props, { emit }) {
  20. const message = useMessage();
  21. const userStore = useUserStore();
  22. const forms = reactive({
  23. mobile: userStore.getUserInfo.phone || '',
  24. password: null,
  25. rePassword: null,
  26. clientType: 'TEACHER',
  27. code: null
  28. });
  29. const validatePass2 = (rule: any, value: any, callback: any): any => {
  30. const reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/;
  31. if (value === '' || !value) {
  32. callback(new Error('请再次输入新密码'));
  33. } else if (value !== forms.password) {
  34. callback(new Error('两次输入密码不一致'));
  35. } else if (!reg.test(value)) {
  36. callback(new Error('密码为6-20位数字和字母组合'));
  37. } else {
  38. callback();
  39. }
  40. };
  41. const validatePass = (rule: any, value: any, callback: any): any => {
  42. const reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/;
  43. if (value === '' || !value) {
  44. callback(new Error('请输入新密码'));
  45. } else if (!reg.test(value)) {
  46. callback(new Error('密码为6-20位数字和字母组合'));
  47. } else {
  48. callback();
  49. }
  50. };
  51. const gotoClassPage = () => {
  52. formsRef.value.validate(async (error: any) => {
  53. if (error) return;
  54. if (forms.password !== forms.rePassword) {
  55. message.error('两次输入密码不一致');
  56. return;
  57. }
  58. await updatePassword({
  59. mobile: forms.mobile,
  60. password: forms.password,
  61. clientType: 'TEACHER',
  62. code: forms.code
  63. });
  64. message.success('更新成功');
  65. emit('submit');
  66. });
  67. };
  68. const formsRef = ref();
  69. const isDisabledCode = ref(false);
  70. const starTimer = ref(60);
  71. const codeName = '发送短信';
  72. const sendMessage = async () => {
  73. if (!forms.mobile) {
  74. message.error('请输入手机号');
  75. return;
  76. }
  77. try {
  78. await sendSms({
  79. clientId: 'cooleshow-teacher',
  80. mobile: forms.mobile,
  81. type: 'LOGIN'
  82. });
  83. checkTimeOut();
  84. } catch (e) {
  85. console.log(e);
  86. }
  87. };
  88. const checkTimeOut = () => {
  89. if (isDisabledCode.value) {
  90. return;
  91. }
  92. isDisabledCode.value = true;
  93. const tiemr = setInterval(() => {
  94. starTimer.value--;
  95. console.log(starTimer.value);
  96. if (starTimer.value <= 0) {
  97. isDisabledCode.value = false;
  98. clearInterval(tiemr);
  99. }
  100. }, 1000);
  101. };
  102. onMounted(async () => {
  103. //
  104. });
  105. return () => (
  106. <div class={styles.updatePassword}>
  107. <p class={styles.tips}>
  108. 检测到您尚未修改默认密码,为了您的账户安全,请重新设置登录密码
  109. </p>
  110. <NForm
  111. labelAlign="right"
  112. labelPlacement="left"
  113. labelWidth={'auto'}
  114. ref={formsRef}
  115. model={forms}
  116. requireMarkPlacement="left">
  117. <NFormItem
  118. path="currentClass"
  119. label="手机号"
  120. class={styles.phoneContainer}>
  121. <p class={styles.phone}>{forms.mobile}</p>
  122. </NFormItem>
  123. <NFormItem
  124. path="password"
  125. label="新密码"
  126. rule={[
  127. {
  128. validator: validatePass,
  129. trigger: 'blur',
  130. required: true
  131. }
  132. ]}>
  133. <NInput
  134. v-model:value={forms.password}
  135. clearable
  136. type="password"
  137. show-password-on="click"
  138. placeholder={'请输入新密码'}
  139. />
  140. </NFormItem>
  141. <NFormItem
  142. path="rePassword"
  143. label="再次输入"
  144. rule={[
  145. {
  146. validator: validatePass2,
  147. trigger: 'blur',
  148. required: true
  149. }
  150. ]}>
  151. <NInput
  152. v-model:value={forms.rePassword}
  153. clearable
  154. type="password"
  155. show-password-on="click"
  156. placeholder={'再次输入新密码'}
  157. />
  158. </NFormItem>
  159. <NFormItem
  160. path="code"
  161. label="验证码"
  162. rule={[
  163. {
  164. required: true,
  165. message: '请输入验证码',
  166. trigger: 'blur'
  167. }
  168. ]}>
  169. <NInput
  170. v-model:value={forms.code}
  171. placeholder={'请输入验证码'}
  172. clearable
  173. class={styles.sendInput}
  174. maxlength={6}>
  175. {{
  176. suffix: () => (
  177. <NButton
  178. class={styles.sendMsg}
  179. disabled={isDisabledCode.value}
  180. onClick={() => sendMessage()}>
  181. {isDisabledCode.value ? starTimer.value + 'S' : codeName}
  182. </NButton>
  183. )
  184. }}
  185. </NInput>
  186. </NFormItem>
  187. <div class={styles.updateBtnGroup}>
  188. <NButton
  189. strong
  190. type="primary"
  191. round
  192. onClick={() => gotoClassPage()}>
  193. 确认
  194. </NButton>
  195. </div>
  196. </NForm>
  197. </div>
  198. );
  199. }
  200. });