import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
import type { RuleObject } from 'ant-design-vue/lib/form/interface';
import { ref, computed, unref, Ref } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { checkOnlyUser } from '/@/api/sys/user';
import { defHttp } from '/@/utils/http/axios';
import { OAUTH2_THIRD_LOGIN_TENANT_ID } from "/@/enums/cacheEnum";
import { getAuthCache } from "/@/utils/auth";
export enum LoginStateEnum {
LOGIN,
REGISTER,
RESET_PASSWORD,
MOBILE,
QR_CODE,
}
export enum SmsEnum {
LOGIN = '0',
REGISTER = '1',
FORGET_PASSWORD = '2',
}
const currentState = ref(LoginStateEnum.LOGIN);
export function useLoginState() {
function setLoginState(state: LoginStateEnum) {
currentState.value = state;
}
const getLoginState = computed(() => currentState.value);
function handleBackLogin() {
setLoginState(LoginStateEnum.LOGIN);
}
return { setLoginState, getLoginState, handleBackLogin };
}
export function useFormValid<T extends Object = any>(formRef: Ref<any>) {
async function validForm() {
const form = unref(formRef);
if (!form) return;
const data = await form.validate();
return data as T;
}
return { validForm };
}
export function useFormRules(formData?: Recordable) {
const { t } = useI18n();
const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));
const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder')));
const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));
const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));
const getRegisterAccountRule = computed(() => createRegisterAccountRule('account'));
const getRegisterMobileRule = computed(() => createRegisterAccountRule('mobile'));
const validatePolicy = async (_: RuleObject, value: boolean) => {
return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();
};
const validateConfirmPassword = (password: string) => {
return async (_: RuleObject, value: string) => {
if (!value) {
return Promise.reject(t('sys.login.passwordPlaceholder'));
}
if (value !== password) {
return Promise.reject(t('sys.login.diffPwd'));
}
return Promise.resolve();
};
};
const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => {
const accountFormRule = unref(getAccountFormRule);
const passwordFormRule = unref(getPasswordFormRule);
const smsFormRule = unref(getSmsFormRule);
const mobileFormRule = unref(getMobileFormRule);
const registerAccountRule = unref(getRegisterAccountRule);
const registerMobileRule = unref(getRegisterMobileRule);
const mobileRule = {
sms: smsFormRule,
mobile: mobileFormRule,
};
switch (unref(currentState)) {
// register form rules
case LoginStateEnum.REGISTER:
return {
account: registerAccountRule,
password: passwordFormRule,
mobile: registerMobileRule,
sms: smsFormRule,
confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }],
policy: [{ validator: validatePolicy, trigger: 'change' }],
};
// reset password form rules
case LoginStateEnum.RESET_PASSWORD:
return {
username: accountFormRule,
confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }],
...mobileRule,
};
// mobile form rules
case LoginStateEnum.MOBILE:
return mobileRule;
// login form rules
default:
return {
account: accountFormRule,
password: passwordFormRule,
};
}
});
return { getFormRules };
}
function createRule(message: string) {
return [
{
required: true,
message,
trigger: 'change',
},
];
}
function createRegisterAccountRule(type) {
return [
{
validator: type == 'account' ? checkUsername : checkPhone,
trigger: 'change',
},
];
}
function checkUsername(rule, value, callback) {
const { t } = useI18n();
if (!value) {
return Promise.reject(t('sys.login.accountPlaceholder'));
} else {
return new Promise((resolve, reject) => {
checkOnlyUser({ username: value }).then((res) => {
res.success ? resolve() : reject('用户名已存在!');
});
});
}
}
async function checkPhone(rule, value, callback) {
const { t } = useI18n();
var reg = /^1[3456789]\d{9}$/;
if (!reg.test(value)) {
return Promise.reject(new Error('请输入正确手机号'));
} else {
return new Promise((resolve, reject) => {
checkOnlyUser({ phone: value }).then((res) => {
res.success ? resolve() : reject('手机号已存在!');
});
});
}
}
//update-begin---author:wangshuai ---date:20220629 for:[issues/I5BG1I]vue3不支持auth2登录------------
/**
* 判断是否是OAuth2APP环境
*/
export function isOAuth2AppEnv() {
return /wxwork|dingtalk/i.test(navigator.userAgent);
}
/**
* 判断是否是钉钉环境
*/
export function isOAuth2DingAppEnv() {
return /dingtalk/i.test(navigator.userAgent);
}
/**
* 后台构造oauth2登录地址
* @param source
* @param tenantId
*/
export function sysOAuth2Login(source) {
let url = `${window._CONFIG['domianURL']}/sys/thirdLogin/oauth2/${source}/login`;
url += `?state=${encodeURIComponent(window.location.origin)}`;
//update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------
let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);
if(tenantId){
url += `&tenantId=${tenantId}`;
}
//update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------
window.location.href = url;
}
//update-end---author:wangshuai ---date:20220629 for:[issues/I5BG1I]vue3不支持auth2登录------------
//update-begin---author:wangshuai ---date:20241108 for:[QQYUN-9421]vue3新版auth登录,用户不用点击登录------------
/**
* 后台callBack
* @param code
*/
export function sysOAuth2Callback(code:string) {
let url = `${window._CONFIG['domianURL']}/sys/thirdLogin/oauth2/dingding/login`;
url += `?state=${encodeURIComponent(window.location.origin)}&authCode=${code}`;
let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);
if(tenantId){
url += `&tenantId=${tenantId}`;
}
window.location.href = url;
}
//update-end---author:wangshuai ---date:20241108 for:[QQYUN-9421]vue3新版auth登录,用户不用点击登录------------