update-password.tsx 7.0 KB

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