Files
inquiry_robot/inquiry-backend/src/views/sys/login/useLogin.ts
T
jillion886andCursor 4dfd756bcf 销售侧汇总统一叫费用合计,并认准空运费的金额。
企微跳转改为账号密码登录,报价卡上的费用按原金额改回;航线按单价数量金额报价时不再记成海运费。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 11:15:33 +08:00

185 lines
5.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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';
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 false;
}
/**
* 后台构造oauth2登录地址
* @param source
*/
export function sysOAuth2Login(source) {
let url = `${window._CONFIG['domianURL']}/sys/thirdLogin/oauth2/${source}/login`;
url += `?state=${encodeURIComponent(window.location.origin)}`;
window.location.href = url;
}
//update-end---author:wangshuai ---date:20220629 for:[issues/I5BG1I]vue3不支持auth2登录------------