|
@@ -34,39 +34,6 @@
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
</motion>
|
|
|
- <motion :delay="300">
|
|
|
- <el-form-item
|
|
|
- prop="verifyCode"
|
|
|
- class="mb30"
|
|
|
- :rules="[
|
|
|
- { required: true, message: '请输入验证码', trigger: 'blur' },
|
|
|
- {
|
|
|
- validator: validatePass,
|
|
|
- trigger: 'blur',
|
|
|
- },
|
|
|
- ]"
|
|
|
- >
|
|
|
- <el-col :span="15">
|
|
|
- <el-input
|
|
|
- type="text"
|
|
|
- maxlength="4"
|
|
|
- class="inputDeep"
|
|
|
- placeholder="验证码不区分大小写"
|
|
|
- v-model="state.ruleForm.verifyCode"
|
|
|
- @keyup.enter="onSignIn(ruleFormRef)"
|
|
|
- clearable
|
|
|
- autocomplete="off"
|
|
|
- >
|
|
|
- <template #prefix>
|
|
|
- <SvgIcon name="iconfont icon-quanxian" class="el-input__icon" />
|
|
|
- </template>
|
|
|
- </el-input>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8" :offset="1" class="flex">
|
|
|
- <ReImageVerify v-model:code="verifyCode" />
|
|
|
- </el-col>
|
|
|
- </el-form-item>
|
|
|
- </motion>
|
|
|
<motion :delay="400" v-if="themeConfig.isLoginMessageCode">
|
|
|
<el-form-item prop="msgCode" class="mb30" :rules="[{ required: msgCodeRequired, message: '请输入短信验证码', trigger: 'blur' }]">
|
|
|
<el-col :span="11">
|
|
@@ -95,6 +62,7 @@
|
|
|
<motion :delay="400">
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" class="login-content-submit" round @click="onSignIn(ruleFormRef)" :loading="state.loading">登录</el-button>
|
|
|
+ <puzzle-Code :show="showCode" @success="success" @close="close" @fail="fail" :imgs="imgList"></puzzle-Code>
|
|
|
</el-form-item>
|
|
|
</motion>
|
|
|
<motion :delay="500"> 运营管理系统 <span class="color-danger font-bold">v5.0</span> </motion>
|
|
@@ -108,7 +76,7 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts" name="loginAccount">
|
|
|
-import { reactive, computed, ref, defineAsyncComponent } from 'vue';
|
|
|
+import { reactive, computed, ref } from 'vue';
|
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
|
import { ElMessage, ElNotification } from 'element-plus';
|
|
|
import { storeToRefs } from 'pinia';
|
|
@@ -121,11 +89,11 @@ import { NextLoading } from '@/utils/loading';
|
|
|
import type { FormInstance } from 'element-plus';
|
|
|
import { sendCode, signIn } from '@/api/login';
|
|
|
import { JSEncrypt } from 'jsencrypt'; // rsa加密
|
|
|
-import { throttle } from '@/utils/tools';
|
|
|
+import { getImageUrl, throttle } from '@/utils/tools';
|
|
|
import Motion from '@/utils/motion';
|
|
|
-
|
|
|
-const ReImageVerify = defineAsyncComponent(() => import('@/components/ImgVerify/index.vue'));
|
|
|
-
|
|
|
+//引入'vue3-puzzle-vcode'插件
|
|
|
+import puzzleCode from 'vue3-puzzle-vcode';
|
|
|
+import Img from '@/assets/images/login/code1.png';
|
|
|
// 定义变量内容
|
|
|
const storesThemeConfig = useThemeConfig(); // 主题配置
|
|
|
const { themeConfig } = storeToRefs(storesThemeConfig); // 主题配置
|
|
@@ -135,7 +103,6 @@ const state = reactive<any>({
|
|
|
ruleForm: {
|
|
|
username: '', // 账号
|
|
|
password: '', // 密码
|
|
|
- verifyCode: '', // 验证码
|
|
|
msgCode: '', // 短信验证码
|
|
|
},
|
|
|
loading: false, // 加载
|
|
@@ -145,20 +112,6 @@ const ruleFormRef = ref<FormInstance>(); // 表单ref
|
|
|
const currentTime = computed(() => {
|
|
|
return formatAxis(new Date());
|
|
|
});
|
|
|
-const validatePass = (rule: any, value: any, callback: any) => {
|
|
|
- if (value === '') {
|
|
|
- callback(new Error('请输入验证码'));
|
|
|
- } else {
|
|
|
- if (state.ruleForm.verifyCode !== '') {
|
|
|
- if (state.ruleForm.verifyCode.toUpperCase() !== verifyCode.value.toUpperCase()) {
|
|
|
- callback(new Error('验证码错误,请重新输入'));
|
|
|
- }
|
|
|
- }
|
|
|
- callback();
|
|
|
- }
|
|
|
-};
|
|
|
-// 验证码
|
|
|
-const verifyCode = ref<string>(''); // 验证码
|
|
|
const count = ref(300); // 倒计时
|
|
|
const countText = ref('s后重新获取'); // 倒计时文本
|
|
|
const click = ref('获取验证码'); // 点击
|
|
@@ -169,15 +122,6 @@ const getIdentifyCodeBtn = () => {
|
|
|
ruleFormRef.value?.validateField('username');
|
|
|
return;
|
|
|
}
|
|
|
- if (!state.ruleForm.verifyCode) {
|
|
|
- ruleFormRef.value?.validateField('verifyCode');
|
|
|
- return;
|
|
|
- }
|
|
|
- // 验证码错误
|
|
|
- if (state.ruleForm.verifyCode.toUpperCase() !== verifyCode.value.toUpperCase()) {
|
|
|
- ruleFormRef.value?.validateField('verifyCode');
|
|
|
- return;
|
|
|
- }
|
|
|
// state.loading = true;
|
|
|
// 获取短信验证码
|
|
|
sendCode(state.ruleForm.username)
|
|
@@ -217,44 +161,59 @@ const countDown = () => {
|
|
|
}, 1000);
|
|
|
}
|
|
|
};
|
|
|
+console.log(getImageUrl('home/Call.png'));
|
|
|
+const imgList = [getImageUrl('login/code1.png'), getImageUrl('login/code2.png'), getImageUrl('login/code3.png'), getImageUrl('login/code4.png')];
|
|
|
+const showCode = ref(false); // 是否展示验证码
|
|
|
+const success = () => {
|
|
|
+ // 验证成功
|
|
|
+ showCode.value = false;
|
|
|
+ state.loading = true;
|
|
|
+ // 新建一个JSEncrypt对象
|
|
|
+ const encryptor = new JSEncrypt({ default_key_size: '2048' });
|
|
|
+ // 设置公钥
|
|
|
+ const publicKey =
|
|
|
+ '-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgw+/x6IQPkH0A4eoF63jkLThsOXWyNBdcL9LATGy/G1yTHOr1RyKJB//iNug+V8DIoIHuFTlhgLHDbSqxvRWMONxIIF289riS6bDI4Ox/pFmOfmElFRk0lKGihaTE2Aefd6g/N+RfLLaHWztY+/voVeDTiOIw9y3tokIxjKwuJ/mQ66MkKh78AqQjjSD/3jcBP8ZhMyCJOK9XQcqvhD6WBFWkxlAqKOWggDU7YohfrbNkg3bd0oGE6zCE2EHhkcQbzGCh3lu1zf4TfKMXD+PPrr5JWDNYQTXFQklqgae+Puge7xxZGYRoi5YpIUnkQGm6zpPxhIOdxlz+Yb5geSJUQIDAQAB-----END PUBLIC KEY-----';
|
|
|
+ encryptor.setPublicKey(publicKey); // publicKey为公钥
|
|
|
+ // 加密数据
|
|
|
+ const submitObj = {
|
|
|
+ username: encryptor.encrypt(state.ruleForm.username),
|
|
|
+ password: encryptor.encrypt(state.ruleForm.password),
|
|
|
+ msgCode: encryptor.encrypt(state.ruleForm.msgCode),
|
|
|
+ };
|
|
|
+ signIn(submitObj)
|
|
|
+ .then(async (res: any) => {
|
|
|
+ //登录
|
|
|
+ // 存储 token 到浏览器缓存
|
|
|
+ Cookie.set('token', res.result);
|
|
|
+ if (!themeConfig.value.isRequestRoutes) {
|
|
|
+ // 前端控制路由,2、请注意执行顺序
|
|
|
+ const isNoPower = await initFrontEndControlRoutes();
|
|
|
+ signInSuccess(isNoPower);
|
|
|
+ } else {
|
|
|
+ // 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由
|
|
|
+ // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/"
|
|
|
+ const isNoPower = await initBackEndControlRoutes();
|
|
|
+ // 执行完 initBackEndControlRoutes,再执行 signInSuccess
|
|
|
+ signInSuccess(isNoPower);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ state.loading = false;
|
|
|
+ });
|
|
|
+};
|
|
|
+const close = () => {
|
|
|
+ // 关闭验证码
|
|
|
+ showCode.value = false;
|
|
|
+};
|
|
|
+const fail = () => {
|
|
|
+ // 验证失败
|
|
|
+};
|
|
|
// 登录
|
|
|
const onSignIn = throttle(async (formEl: FormInstance | undefined) => {
|
|
|
if (!formEl) return;
|
|
|
await formEl.validate((valid: boolean) => {
|
|
|
if (!valid) return;
|
|
|
- state.loading = true;
|
|
|
- // 新建一个JSEncrypt对象
|
|
|
- const encryptor = new JSEncrypt({ default_key_size: '2048' });
|
|
|
- // 设置公钥
|
|
|
- const publicKey =
|
|
|
- '-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgw+/x6IQPkH0A4eoF63jkLThsOXWyNBdcL9LATGy/G1yTHOr1RyKJB//iNug+V8DIoIHuFTlhgLHDbSqxvRWMONxIIF289riS6bDI4Ox/pFmOfmElFRk0lKGihaTE2Aefd6g/N+RfLLaHWztY+/voVeDTiOIw9y3tokIxjKwuJ/mQ66MkKh78AqQjjSD/3jcBP8ZhMyCJOK9XQcqvhD6WBFWkxlAqKOWggDU7YohfrbNkg3bd0oGE6zCE2EHhkcQbzGCh3lu1zf4TfKMXD+PPrr5JWDNYQTXFQklqgae+Puge7xxZGYRoi5YpIUnkQGm6zpPxhIOdxlz+Yb5geSJUQIDAQAB-----END PUBLIC KEY-----';
|
|
|
- encryptor.setPublicKey(publicKey); // publicKey为公钥
|
|
|
- // 加密数据
|
|
|
- const submitObj = {
|
|
|
- username: encryptor.encrypt(state.ruleForm.username),
|
|
|
- password: encryptor.encrypt(state.ruleForm.password),
|
|
|
- msgCode: encryptor.encrypt(state.ruleForm.msgCode),
|
|
|
- };
|
|
|
- signIn(submitObj)
|
|
|
- .then(async (res: any) => {
|
|
|
- //登录
|
|
|
- // 存储 token 到浏览器缓存
|
|
|
- Cookie.set('token', res.result);
|
|
|
- if (!themeConfig.value.isRequestRoutes) {
|
|
|
- // 前端控制路由,2、请注意执行顺序
|
|
|
- const isNoPower = await initFrontEndControlRoutes();
|
|
|
- signInSuccess(isNoPower);
|
|
|
- } else {
|
|
|
- // 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由
|
|
|
- // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/"
|
|
|
- const isNoPower = await initBackEndControlRoutes();
|
|
|
- // 执行完 initBackEndControlRoutes,再执行 signInSuccess
|
|
|
- signInSuccess(isNoPower);
|
|
|
- }
|
|
|
- })
|
|
|
- .catch(() => {
|
|
|
- state.loading = false;
|
|
|
- });
|
|
|
+ showCode.value = true;
|
|
|
});
|
|
|
}, 1000);
|
|
|
// 登录成功后的跳转
|