<template>
|
<el-form size="large" ref="ruleFormRef" :model="ruleForm" :rules="state.rules" class="login-content-form">
|
<el-form-item prop="account" class="login-animation1">
|
<el-input
|
text
|
:placeholder="$t('message.account.accountPlaceholder1')"
|
v-model="ruleForm.account"
|
clearable
|
autocomplete="username"
|
>
|
<template #prefix>
|
<el-icon class="el-input__icon"><ele-User /></el-icon>
|
</template>
|
</el-input>
|
</el-form-item>
|
<el-form-item prop="password" class="login-animation2">
|
<el-input
|
:type="state.isShowPassword ? 'text' : 'password'"
|
:placeholder="$t('message.account.accountPlaceholder2')"
|
v-model="ruleForm.password"
|
autocomplete="current-password"
|
>
|
<template #prefix>
|
<el-icon class="el-input__icon"><ele-Unlock /></el-icon>
|
</template>
|
<template #suffix>
|
<i
|
class="iconfont el-input__icon login-content-password"
|
:class="state.isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'"
|
@click="state.isShowPassword = !state.isShowPassword"
|
>
|
</i>
|
</template>
|
</el-input>
|
</el-form-item>
|
<!-- <el-form-item prop="code" class="login-animation3">
|
<el-col :span="15">
|
<el-input
|
text
|
maxlength="4"
|
:placeholder="$t('message.account.accountPlaceholder3')"
|
v-model="ruleForm.code"
|
clearable
|
autocomplete="off"
|
>
|
<template #prefix>
|
<el-icon class="el-input__icon"><ele-Position /></el-icon>
|
</template>
|
</el-input>
|
</el-col>
|
<el-col :span="1"></el-col>
|
<el-col :span="8">
|
<div class="login-content-code">
|
<img
|
class="login-content-code-img"
|
@click="getCaptcha"
|
width="130px"
|
height="38px"
|
:src="state.captchaImage"
|
style="cursor: pointer"
|
/>
|
</div>
|
</el-col>
|
</el-form-item> -->
|
<el-form-item class="login-animation4">
|
<el-button type="primary" class="login-content-submit" round v-waves @click="onSignIn" :loading="state.loading.signIn">
|
<span>{{ $t('message.account.accountBtnText') }}</span>
|
</el-button>
|
</el-form-item>
|
</el-form>
|
</template>
|
|
<script setup lang="ts" name="loginAccount">
|
import type { FormInstance } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
import { storeToRefs } from 'pinia';
|
import { computed, onMounted, onUnmounted, reactive, ref } from 'vue';
|
import { useI18n } from 'vue-i18n';
|
import { useRoute, useRouter } from 'vue-router';
|
import { GetCaptcha, GetRolesListByUserID, GetVerifyCaptcha, LoginSoftware } from '/@/api/login/index';
|
import profileMan from '/@/assets/profile/man.svg';
|
import { initBackEndControlRoutes } from '/@/router/backEnd';
|
import { initFrontEndControlRoutes } from '/@/router/frontEnd';
|
import { useThemeConfig } from '/@/stores/themeConfig';
|
import { useUserInfo } from '/@/stores/userInfo';
|
import { formatAxis } from '/@/utils/formatTime';
|
import { NextLoading } from '/@/utils/loading';
|
import { accessSessionKey, clearAccessTokens } from '/@/utils/request';
|
import { Local } from '/@/utils/storage';
|
import { PostLogin } from '/@/api/ai/user';
|
|
// 定义变量内容
|
const { t } = useI18n();
|
const storesThemeConfig = useThemeConfig();
|
const { themeConfig } = storeToRefs(storesThemeConfig);
|
const route = useRoute();
|
const router = useRouter();
|
const ruleFormRef = ref<FormInstance>();
|
const state = reactive({
|
isShowPassword: false,
|
ruleForm: {
|
account: '',
|
password: '',
|
code: '',
|
codeId: 0,
|
},
|
captchaImage: '',
|
loading: {
|
signIn: false,
|
},
|
rules: {
|
account: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
|
password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
|
// code: [{ required: true, message: '请输入验证码', trigger: 'blur' }],
|
},
|
});
|
const ruleForm = ref({
|
account: '',
|
password: '',
|
code: '',
|
codeId: 0,
|
});
|
|
const pressEnterLogin = (ev: KeyboardEvent) => {
|
if (ev.key === 'Enter') {
|
onSignIn();
|
}
|
};
|
|
onMounted(() => {
|
// getCaptcha();
|
ruleFormRef.value.$el.addEventListener('keypress', pressEnterLogin);
|
});
|
onUnmounted(() => {
|
ruleFormRef.value?.$el.removeEventListener('keypress', pressEnterLogin);
|
});
|
// 时间获取
|
const currentTime = computed(() => {
|
return formatAxis(new Date());
|
});
|
// 获取验证码
|
const getCaptcha = async () => {
|
ruleForm.value.code = '';
|
|
const res = await GetCaptcha();
|
if (res?.Code === 0) {
|
if (res.Data) {
|
ruleForm.value.codeId = Number(res.Data.Id);
|
state.captchaImage = 'data:text/html;base64,' + res.Data.Img;
|
} else {
|
ElMessage.error('获取验证码失败');
|
}
|
} else {
|
ElMessage.error('获取验证码失败' + (res?.Message ? `,${JSON.stringify(res.Message)}` : ''));
|
}
|
};
|
// 校验验证码
|
const verifyCaptcha = async () => {
|
let params = {
|
Id: ruleForm.value.codeId,
|
Code: ruleForm.value.code,
|
};
|
const res = await GetVerifyCaptcha(params);
|
if (res?.Code === 0) {
|
return res.Data;
|
} else {
|
ElMessage.error('验证码校验失败!' + (res?.Message ? `,${JSON.stringify(res.Message)}` : ''));
|
return false;
|
}
|
// return new Promise((resolve, reject) => {
|
// let params = {
|
// Id: ruleForm.value.codeId,
|
// Code: ruleForm.value.code,
|
// };
|
// axios
|
// .get(LOGIN_API_URL + '/Auth/Tool/VerifyCaptcha@V1.0', {
|
// params,
|
// })
|
// .then((res: any) => {
|
// resolve(res.data.Data);
|
// })
|
// .catch((err: any) => {
|
// reject(err);
|
// });
|
// apiSysAuthCaptchaRuleGet(params)
|
// .then((res: any) => {
|
// resolve(res.Data);
|
// })
|
// .catch((err: any) => {
|
// reject(err);
|
// });
|
// });
|
};
|
// 登录
|
const onSignIn = async () => {
|
ruleFormRef.value.validate(async (valid: boolean) => {
|
if (!valid) return false;
|
// 校验验证码
|
// let isPassCaptcha = await verifyCaptcha();
|
// if (!isPassCaptcha) {
|
// getCaptcha();
|
// ElMessage.error('验证码错误,请重新输入!');
|
// return;
|
// }
|
let params = {
|
user: ruleForm.value.account,
|
pass: ruleForm.value.password,
|
};
|
|
const res = await PostLogin(params, {
|
noAuth: true,
|
});
|
|
Local.set(accessSessionKey,res.hswatersession)
|
await useUserInfo().setUserInfos({
|
userName:ruleForm.value.account,
|
phoneNumber:'',
|
photo:profileMan
|
}); //缓存用户信息
|
state.loading.signIn = true;
|
if (!themeConfig.value.isRequestRoutes) {
|
// 前端控制路由,2、请注意执行顺序
|
const isNoPower = await initFrontEndControlRoutes();
|
// console.log(isNoPower,172)
|
signInSuccess(isNoPower);
|
} else {
|
// 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由
|
// 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/"
|
const isNoPower = await initBackEndControlRoutes();
|
// 执行完 initBackEndControlRoutes,再执行 signInSuccess
|
// console.log(isNoPower,178)
|
signInSuccess(isNoPower);
|
}
|
|
// 登录校验
|
// await apiSysAuthLoginPost(params)
|
// .then(async (res: any) => {
|
|
// })
|
// .catch((err: any) => {
|
// console.log(err);
|
// });
|
});
|
};
|
// 登录成功后的跳转
|
const signInSuccess = (isNoPower: boolean | undefined) => {
|
if (isNoPower) {
|
ElMessage.warning('您没有登录权限');
|
clearAccessTokens();
|
} else {
|
// 初始化登录成功时间问候语
|
let currentTimeInfo = currentTime.value;
|
// 登录成功,跳到转首页
|
// 如果是复制粘贴的路径,非首页/登录页,那么登录成功后重定向到对应的路径中
|
// console.log(route.query, 199);
|
if (route.query?.redirect) {
|
router.push({
|
path: <string>route.query?.redirect,
|
query: Object.keys(<string>route.query?.params).length > 0 ? JSON.parse(<string>route.query?.params) : '',
|
});
|
} else {
|
router.push('/');
|
}
|
// 登录成功提示
|
const signInText = t('message.signInText');
|
ElMessage.success(`${currentTimeInfo},${signInText}`);
|
// 添加 loading,防止第一次进入界面时出现短暂空白
|
NextLoading.start();
|
}
|
state.loading.signIn = false;
|
};
|
</script>
|
|
<style scoped lang="scss">
|
.login-content-form {
|
margin-top: 20px;
|
|
@for $i from 1 through 4 {
|
.login-animation#{$i} {
|
opacity: 0;
|
animation-name: error-num;
|
animation-duration: 0.5s;
|
animation-fill-mode: forwards;
|
animation-delay: calc($i/10) + s;
|
}
|
}
|
|
.login-content-password {
|
display: inline-block;
|
width: 20px;
|
cursor: pointer;
|
|
&:hover {
|
color: #909399;
|
}
|
}
|
|
.login-content-code {
|
display: flex;
|
align-items: center;
|
justify-content: space-around;
|
|
.login-content-code-img {
|
width: 100%;
|
height: 40px;
|
line-height: 40px;
|
background-color: #ffffff;
|
border: 1px solid rgb(220, 223, 230);
|
cursor: pointer;
|
transition: all ease 0.2s;
|
border-radius: 4px;
|
user-select: none;
|
|
&:hover {
|
border-color: #c0c4cc;
|
transition: all ease 0.2s;
|
}
|
}
|
}
|
|
.login-content-submit {
|
width: 100%;
|
letter-spacing: 2px;
|
font-weight: 300;
|
margin-top: 15px;
|
}
|
}
|
</style>
|