update-password.tsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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 === '') {
  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 gotoClassPage = () => {
  42. formsRef.value.validate(async (error: any) => {
  43. if (error) return;
  44. if (forms.password !== forms.rePassword) {
  45. message.error('两次输入密码不一致');
  46. return;
  47. }
  48. await updatePassword({
  49. mobile: forms.mobile,
  50. password: forms.password,
  51. clientType: 'TEACHER',
  52. code: forms.code
  53. });
  54. message.success('更新成功');
  55. emit('submit');
  56. });
  57. };
  58. const formsRef = ref();
  59. const isDisabledCode = ref(false);
  60. const starTimer = ref(60);
  61. const codeName = '发送短信';
  62. const sendMessage = async () => {
  63. if (!forms.mobile) {
  64. message.error('请输入手机号');
  65. return;
  66. }
  67. try {
  68. await sendSms({
  69. clientId: 'cooleshow-teacher',
  70. mobile: forms.mobile,
  71. type: 'LOGIN'
  72. });
  73. checkTimeOut();
  74. } catch (e) {
  75. console.log(e);
  76. }
  77. };
  78. const checkTimeOut = () => {
  79. if (isDisabledCode.value) {
  80. return;
  81. }
  82. isDisabledCode.value = true;
  83. const tiemr = setInterval(() => {
  84. starTimer.value--;
  85. console.log(starTimer.value);
  86. if (starTimer.value <= 0) {
  87. isDisabledCode.value = false;
  88. clearInterval(tiemr);
  89. }
  90. }, 1000);
  91. };
  92. onMounted(async () => {
  93. //
  94. });
  95. return () => (
  96. <div class={styles.updatePassword}>
  97. <p class={styles.tips}>
  98. 检测到您尚未修改默认密码,为了您的账户安全,请重新设置登录密码
  99. </p>
  100. <NForm
  101. labelAlign="right"
  102. labelPlacement="left"
  103. labelWidth={'auto'}
  104. ref={formsRef}
  105. model={forms}
  106. requireMarkPlacement="left">
  107. <NFormItem
  108. path="currentClass"
  109. label="手机号"
  110. class={styles.phoneContainer}>
  111. <p class={styles.phone}>{forms.mobile}</p>
  112. </NFormItem>
  113. <NFormItem
  114. path="password"
  115. label="新密码"
  116. rule={[
  117. {
  118. required: true,
  119. message: '请输入新密码'
  120. },
  121. {
  122. pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
  123. message: '密码为6-20位数字和字母组合',
  124. trigger: 'blur'
  125. }
  126. ]}>
  127. <NInput
  128. v-model:value={forms.password}
  129. clearable
  130. type="password"
  131. show-password-on="click"
  132. placeholder={'请输入新密码'}
  133. />
  134. </NFormItem>
  135. <NFormItem
  136. path="rePassword"
  137. label="再次输入"
  138. rule={[
  139. {
  140. validator: validatePass2,
  141. trigger: 'blur',
  142. required: true
  143. }
  144. ]}>
  145. <NInput
  146. v-model:value={forms.rePassword}
  147. clearable
  148. type="password"
  149. show-password-on="click"
  150. placeholder={'再次输入新密码'}
  151. />
  152. </NFormItem>
  153. <NFormItem
  154. path="code"
  155. label="验证码"
  156. rule={[
  157. {
  158. required: true,
  159. message: '请输入验证码',
  160. trigger: 'change'
  161. }
  162. ]}>
  163. <NInput
  164. v-model:value={forms.code}
  165. placeholder={'请输入验证码'}
  166. clearable
  167. class={styles.sendInput}
  168. maxlength={6}>
  169. {{
  170. suffix: () => (
  171. <NButton
  172. class={styles.sendMsg}
  173. disabled={isDisabledCode.value}
  174. onClick={() => sendMessage()}>
  175. {isDisabledCode.value ? starTimer.value + 'S' : codeName}
  176. </NButton>
  177. )
  178. }}
  179. </NInput>
  180. </NFormItem>
  181. <div class={styles.updateBtnGroup}>
  182. <NButton
  183. strong
  184. type="primary"
  185. round
  186. onClick={() => gotoClassPage()}>
  187. 确认
  188. </NButton>
  189. </div>
  190. </NForm>
  191. </div>
  192. );
  193. }
  194. });