useLogin.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. import { checkOnlyUser } from '/@/api/sys/user';
  6. import { defHttp } from '/@/utils/http/axios';
  7. import { OAUTH2_THIRD_LOGIN_TENANT_ID } from "/@/enums/cacheEnum";
  8. import { getAuthCache } from "/@/utils/auth";
  9. export enum LoginStateEnum {
  10. LOGIN,
  11. REGISTER,
  12. RESET_PASSWORD,
  13. MOBILE,
  14. QR_CODE,
  15. }
  16. export enum SmsEnum {
  17. LOGIN = '0',
  18. REGISTER = '1',
  19. FORGET_PASSWORD = '2',
  20. }
  21. const currentState = ref(LoginStateEnum.LOGIN);
  22. export function useLoginState() {
  23. function setLoginState(state: LoginStateEnum) {
  24. currentState.value = state;
  25. }
  26. const getLoginState = computed(() => currentState.value);
  27. function handleBackLogin() {
  28. setLoginState(LoginStateEnum.LOGIN);
  29. }
  30. return { setLoginState, getLoginState, handleBackLogin };
  31. }
  32. export function useFormValid<T extends Object = any>(formRef: Ref<any>) {
  33. async function validForm() {
  34. const form = unref(formRef);
  35. if (!form) return;
  36. const data = await form.validate();
  37. return data as T;
  38. }
  39. return { validForm };
  40. }
  41. export function useFormRules(formData?: Recordable) {
  42. const { t } = useI18n();
  43. const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));
  44. const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder')));
  45. const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));
  46. const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));
  47. const getRegisterAccountRule = computed(() => createRegisterAccountRule('account'));
  48. const getRegisterMobileRule = computed(() => createRegisterAccountRule('mobile'));
  49. const validatePolicy = async (_: RuleObject, value: boolean) => {
  50. return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();
  51. };
  52. const validateConfirmPassword = (password: string) => {
  53. return async (_: RuleObject, value: string) => {
  54. if (!value) {
  55. return Promise.reject(t('sys.login.passwordPlaceholder'));
  56. }
  57. if (value !== password) {
  58. return Promise.reject(t('sys.login.diffPwd'));
  59. }
  60. return Promise.resolve();
  61. };
  62. };
  63. const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => {
  64. const accountFormRule = unref(getAccountFormRule);
  65. const passwordFormRule = unref(getPasswordFormRule);
  66. const smsFormRule = unref(getSmsFormRule);
  67. const mobileFormRule = unref(getMobileFormRule);
  68. const registerAccountRule = unref(getRegisterAccountRule);
  69. const registerMobileRule = unref(getRegisterMobileRule);
  70. const mobileRule = {
  71. sms: smsFormRule,
  72. mobile: mobileFormRule,
  73. };
  74. switch (unref(currentState)) {
  75. // register form rules
  76. case LoginStateEnum.REGISTER:
  77. return {
  78. account: registerAccountRule,
  79. password: passwordFormRule,
  80. mobile: registerMobileRule,
  81. sms: smsFormRule,
  82. confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }],
  83. policy: [{ validator: validatePolicy, trigger: 'change' }],
  84. };
  85. // reset password form rules
  86. case LoginStateEnum.RESET_PASSWORD:
  87. return {
  88. username: accountFormRule,
  89. confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }],
  90. ...mobileRule,
  91. };
  92. // mobile form rules
  93. case LoginStateEnum.MOBILE:
  94. return mobileRule;
  95. // login form rules
  96. default:
  97. return {
  98. account: accountFormRule,
  99. password: passwordFormRule,
  100. };
  101. }
  102. });
  103. return { getFormRules };
  104. }
  105. function createRule(message: string) {
  106. return [
  107. {
  108. required: true,
  109. message,
  110. trigger: 'change',
  111. },
  112. ];
  113. }
  114. function createRegisterAccountRule(type) {
  115. return [
  116. {
  117. validator: type == 'account' ? checkUsername : checkPhone,
  118. trigger: 'change',
  119. },
  120. ];
  121. }
  122. function checkUsername(rule, value, callback) {
  123. const { t } = useI18n();
  124. if (!value) {
  125. return Promise.reject(t('sys.login.accountPlaceholder'));
  126. } else {
  127. return new Promise((resolve, reject) => {
  128. checkOnlyUser({ username: value }).then((res) => {
  129. res.success ? resolve() : reject('用户名已存在!');
  130. });
  131. });
  132. }
  133. }
  134. async function checkPhone(rule, value, callback) {
  135. const { t } = useI18n();
  136. var reg = /^1[3456789]\d{9}$/;
  137. if (!reg.test(value)) {
  138. return Promise.reject(new Error('请输入正确手机号'));
  139. } else {
  140. return new Promise((resolve, reject) => {
  141. checkOnlyUser({ phone: value }).then((res) => {
  142. res.success ? resolve() : reject('手机号已存在!');
  143. });
  144. });
  145. }
  146. }
  147. //update-begin---author:wangshuai ---date:20220629 for:[issues/I5BG1I]vue3不支持auth2登录------------
  148. /**
  149. * 判断是否是OAuth2APP环境
  150. */
  151. export function isOAuth2AppEnv() {
  152. return /wxwork|dingtalk/i.test(navigator.userAgent);
  153. }
  154. /**
  155. * 后台构造oauth2登录地址
  156. * @param source
  157. * @param tenantId
  158. */
  159. export function sysOAuth2Login(source) {
  160. let url = `${window._CONFIG['domianURL']}/sys/thirdLogin/oauth2/${source}/login`;
  161. url += `?state=${encodeURIComponent(window.location.origin)}`;
  162. //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------
  163. let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);
  164. if(tenantId){
  165. url += `&tenantId=${tenantId}`;
  166. }
  167. //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------
  168. window.location.href = url;
  169. }
  170. //update-end---author:wangshuai ---date:20220629 for:[issues/I5BG1I]vue3不支持auth2登录------------