useLogin.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
  2. import type { RuleObject } from 'ant-design-vue/lib/form/interface';
  3. import { ref, computed, unref, Ref } from 'vue';
  4. import { useI18n } from '/@/hooks/web/useI18n';
  5. export enum LoginStateEnum {
  6. LOGIN,
  7. REGISTER,
  8. RESET_PASSWORD,
  9. MOBILE,
  10. QR_CODE,
  11. }
  12. const currentState = ref(LoginStateEnum.LOGIN);
  13. export function useLoginState() {
  14. function setLoginState(state: LoginStateEnum) {
  15. currentState.value = state;
  16. }
  17. const getLoginState = computed(() => currentState.value);
  18. function handleBackLogin() {
  19. setLoginState(LoginStateEnum.LOGIN);
  20. }
  21. return { setLoginState, getLoginState, handleBackLogin };
  22. }
  23. export function useFormValid<T extends Object = any>(formRef: Ref<any>) {
  24. async function validForm() {
  25. const form = unref(formRef);
  26. if (!form) return;
  27. const data = await form.validate();
  28. return data as T;
  29. }
  30. return { validForm };
  31. }
  32. export function useFormRules(formData?: Recordable) {
  33. const { t } = useI18n();
  34. const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));
  35. const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));
  36. const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));
  37. const validatePolicy = async (_: RuleObject, value: boolean) => {
  38. return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();
  39. };
  40. const getPasswordFormRule = (value) => {
  41. return async (_: RuleObject, value: string) => {
  42. if (!value) {
  43. return Promise.reject(t('sys.login.passwordPlaceholder'));
  44. }
  45. const regPos = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/; // 非中文
  46. if (!regPos.test(value)) {
  47. /* eslint-disable-next-line */
  48. return Promise.reject('请输入8-16位数字、字母大小写组合');
  49. }
  50. return Promise.resolve();
  51. };
  52. };
  53. const validateConfirmPassword = (password: string) => {
  54. return async (_: RuleObject, value: string) => {
  55. if (!value) {
  56. return Promise.reject(t('sys.login.passwordPlaceholder'));
  57. }
  58. if (value !== password) {
  59. return Promise.reject(t('sys.login.diffPwd'));
  60. }
  61. return Promise.resolve();
  62. };
  63. };
  64. const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => {
  65. const accountFormRule = unref(getAccountFormRule);
  66. // const passwordFormRule = unref(getPasswordFormRule);
  67. const smsFormRule = unref(getSmsFormRule);
  68. const mobileFormRule = unref(getMobileFormRule);
  69. const mobileRule = {
  70. sms: smsFormRule,
  71. mobile: mobileFormRule,
  72. };
  73. switch (unref(currentState)) {
  74. // register form rules
  75. case LoginStateEnum.REGISTER:
  76. return {
  77. account: accountFormRule,
  78. password: [{
  79. required: true,
  80. trigger: 'change',
  81. // @ts-ignore
  82. validator: async (rule, value) => {
  83. console.log('value',value)
  84. const regPos = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/; // 非中文
  85. if (!value) {
  86. return Promise.reject('请输入8-16位数字、字母大小写组合');
  87. }
  88. if (!regPos.test(value)) {
  89. /* eslint-disable-next-line */
  90. return Promise.reject('请输入8-16位数字、字母大小写组合');
  91. }
  92. return Promise.resolve();
  93. },
  94. }],
  95. confirmPassword: [
  96. { validator: validateConfirmPassword(formData?.password), trigger: 'change' },
  97. ],
  98. policy: [{ validator: validatePolicy, trigger: 'change' }],
  99. ...mobileRule,
  100. };
  101. // reset password form rules
  102. case LoginStateEnum.RESET_PASSWORD:
  103. return {
  104. account: accountFormRule,
  105. ...mobileRule,
  106. };
  107. // mobile form rules
  108. case LoginStateEnum.MOBILE:
  109. return mobileRule;
  110. // login form rules
  111. default:
  112. return {
  113. account: accountFormRule,
  114. password: [
  115. { validator: getPasswordFormRule(formData?.password), trigger: 'change' },
  116. ],
  117. };
  118. }
  119. });
  120. return { getFormRules };
  121. }
  122. function createRule(message: string) {
  123. return [
  124. {
  125. required: true,
  126. message,
  127. trigger: 'change',
  128. },
  129. ];
  130. }