|
@@ -72,7 +72,8 @@
|
|
|
<div class="rightBox" >
|
|
|
<div class="box1 bg skew">
|
|
|
<el-dropdown class="bg">
|
|
|
- <span class="rSkew" @click = " ">用户登录</span>
|
|
|
+ <span v-if="username === ''" class="rSkew" @click = "handleLogin2">用户登录</span>
|
|
|
+ <span v-else class="rSkew">当前用户:{{username}}</span>
|
|
|
<!-- <template #dropdown>-->
|
|
|
<!-- <el-dropdown-menu>-->
|
|
|
<!-- <el-dropdown-item >平台管理员</el-dropdown-item>-->
|
|
@@ -94,11 +95,92 @@
|
|
|
<div class="main">
|
|
|
<Main></Main>
|
|
|
</div>
|
|
|
+
|
|
|
+ <!-- 对话框组件 -->
|
|
|
+ <el-dialog
|
|
|
+ title=""
|
|
|
+ v-model="dialogVisible"
|
|
|
+ width="400px"
|
|
|
+ height="100%"
|
|
|
+ :before-close="handleClose"
|
|
|
+ >
|
|
|
+
|
|
|
+ <div class="login">
|
|
|
+ <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
|
|
|
+ <h3 class="title">用户登录</h3>
|
|
|
+ <el-form-item prop="username">
|
|
|
+ <el-input
|
|
|
+ v-model="loginForm.username"
|
|
|
+ type="text"
|
|
|
+ size="large"
|
|
|
+ auto-complete="off"
|
|
|
+ placeholder="账号"
|
|
|
+ >
|
|
|
+ <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="password">
|
|
|
+ <el-input
|
|
|
+ v-model="loginForm.password"
|
|
|
+ type="password"
|
|
|
+ size="large"
|
|
|
+ auto-complete="off"
|
|
|
+ placeholder="密码"
|
|
|
+ @keyup.enter="handleLogin"
|
|
|
+ >
|
|
|
+ <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="code" v-if="captchaEnabled">
|
|
|
+ <el-input
|
|
|
+ v-model="loginForm.code"
|
|
|
+ size="large"
|
|
|
+ auto-complete="off"
|
|
|
+ placeholder="验证码"
|
|
|
+ style="width: 63%"
|
|
|
+ @keyup.enter="handleLogin"
|
|
|
+ >
|
|
|
+ <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
|
|
|
+ </el-input>
|
|
|
+ <div class="login-code">
|
|
|
+ <img :src="codeUrl" @click="getCode" class="login-code-img"/>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
|
|
|
+ <el-form-item style="width:100%;">
|
|
|
+ <el-button
|
|
|
+ :loading="loading"
|
|
|
+ size="large"
|
|
|
+ type="primary"
|
|
|
+ style="width:100%;"
|
|
|
+ @click.prevent="handleLogin"
|
|
|
+ >
|
|
|
+ <span v-if="!loading">登 录</span>
|
|
|
+ <span v-else>登 录 中...</span>
|
|
|
+ </el-button>
|
|
|
+ <div style="float: right;" v-if="register">
|
|
|
+ <router-link class="link-type" :to="'/register'">立即注册</router-link>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <!-- 底部 -->
|
|
|
+ <!-- <div class="el-login-footer">-->
|
|
|
+ <!-- <span>Copyright © 2024东南大学 All Rights Reserved.</span>-->
|
|
|
+ <!-- </div>-->
|
|
|
+ </div>
|
|
|
+
|
|
|
+
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script setup name="Index">
|
|
|
+
|
|
|
+import { getCodeImg } from "@/api/login";
|
|
|
+import { encrypt, decrypt } from "@/utils/jsencrypt";
|
|
|
+
|
|
|
import {formatTime} from '@/utils/formatTime'
|
|
|
import {onMounted, reactive, ref} from "vue";
|
|
|
import Main from "@/views/dashboard/components/main/Main.vue";
|
|
@@ -106,7 +188,39 @@ import {ElMessage, ElMessageBox} from "element-plus";
|
|
|
const userStore=useUserStore();
|
|
|
import {useRouter} from "vue-router";
|
|
|
import useUserStore from "@/store/modules/user.js";
|
|
|
+import user from "@/store/modules/user.js";
|
|
|
+import Cookies from "js-cookie";
|
|
|
const router=useRouter();
|
|
|
+
|
|
|
+const route = useRoute();
|
|
|
+const { proxy } = getCurrentInstance();
|
|
|
+
|
|
|
+const loginForm = ref({
|
|
|
+ username: "admin",
|
|
|
+ password: "admin123",
|
|
|
+ rememberMe: false,
|
|
|
+ code: "",
|
|
|
+ uuid: ""
|
|
|
+});
|
|
|
+
|
|
|
+const loginRules = {
|
|
|
+ username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
|
|
|
+ password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
|
|
|
+ code: [{ required: true, trigger: "change", message: "请输入验证码" }]
|
|
|
+};
|
|
|
+
|
|
|
+const codeUrl = ref("");
|
|
|
+const loading = ref(false);
|
|
|
+// 验证码开关
|
|
|
+const captchaEnabled = ref(true);
|
|
|
+// 注册开关
|
|
|
+const register = ref(false);
|
|
|
+const redirect = ref(undefined);
|
|
|
+
|
|
|
+watch(route, (newRoute) => {
|
|
|
+ redirect.value = newRoute.query && newRoute.query.redirect;
|
|
|
+}, { immediate: true });
|
|
|
+
|
|
|
const handleReloginAdmin=()=>{
|
|
|
ElMessage({
|
|
|
type:'warning',
|
|
@@ -145,6 +259,21 @@ const WEEK = ['周日', '周一', '周二', '周三', '周四', '周五', '周
|
|
|
let height;
|
|
|
let width;
|
|
|
|
|
|
+// 当前登录的用户名
|
|
|
+const username = ref("");
|
|
|
+
|
|
|
+// 设置对话框的显示状态
|
|
|
+const dialogVisible = ref(false);
|
|
|
+
|
|
|
+// 对话框中 iframe 的 URL
|
|
|
+const dialogUrl = ref("http://localhost:8182/myLogin");
|
|
|
+
|
|
|
+// 关闭对话框时的处理函数
|
|
|
+const handleClose = () => {
|
|
|
+ // 可选的处理逻辑
|
|
|
+ dialogVisible.value = false;
|
|
|
+}
|
|
|
+
|
|
|
// * 时间内容
|
|
|
const timeInfo = reactive({
|
|
|
setInterval: 0,
|
|
@@ -242,6 +371,85 @@ const intelligentAggregation = ()=>{
|
|
|
|
|
|
}
|
|
|
|
|
|
+// 登录方法
|
|
|
+function handleLogin() {
|
|
|
+ proxy.$refs.loginRef.validate(valid => {
|
|
|
+ if (valid) {
|
|
|
+ loading.value = true;
|
|
|
+ // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
|
|
|
+ if (loginForm.value.rememberMe) {
|
|
|
+ Cookies.set("username", loginForm.value.username, { expires: 30 });
|
|
|
+ Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 });
|
|
|
+ Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
|
|
|
+ } else {
|
|
|
+ // 否则移除
|
|
|
+ Cookies.remove("username");
|
|
|
+ Cookies.remove("password");
|
|
|
+ Cookies.remove("rememberMe");
|
|
|
+ }
|
|
|
+ // 调用action的登录方法
|
|
|
+ userStore.login(loginForm.value).then(() => {
|
|
|
+ const query = route.query;
|
|
|
+ const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
|
|
|
+ if (cur !== "redirect") {
|
|
|
+ acc[cur] = query[cur];
|
|
|
+ }
|
|
|
+ return acc;
|
|
|
+ }, {});
|
|
|
+
|
|
|
+ // router.push({ path: redirect.value || "/", query: otherQueryParams });
|
|
|
+
|
|
|
+ // 登录成功后,提示 并 关闭弹窗、显示用户名
|
|
|
+ username.value = loginForm.value.username;
|
|
|
+ dialogVisible.value = false;
|
|
|
+
|
|
|
+ }).catch(() => {
|
|
|
+ loading.value = false;
|
|
|
+ // 重新获取验证码
|
|
|
+ if (captchaEnabled.value) {
|
|
|
+ getCode();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+function getCode() {
|
|
|
+ getCodeImg().then(res => {
|
|
|
+ captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled;
|
|
|
+ if (captchaEnabled.value) {
|
|
|
+ codeUrl.value = "data:image/gif;base64," + res.img;
|
|
|
+ loginForm.value.uuid = res.uuid;
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+function getCookie() {
|
|
|
+ const username = Cookies.get("username");
|
|
|
+ const password = Cookies.get("password");
|
|
|
+ const rememberMe = Cookies.get("rememberMe");
|
|
|
+ loginForm.value = {
|
|
|
+ username: username === undefined ? loginForm.value.username : username,
|
|
|
+ password: password === undefined ? loginForm.value.password : decrypt(password),
|
|
|
+ rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function handleLogin2() {
|
|
|
+
|
|
|
+ Cookies.remove("username");
|
|
|
+ Cookies.remove("password");
|
|
|
+ Cookies.remove("rememberMe");
|
|
|
+
|
|
|
+ // username.value = "已登录";
|
|
|
+
|
|
|
+ dialogVisible.value = true;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+getCode();
|
|
|
+getCookie();
|
|
|
+
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
@@ -398,5 +606,68 @@ const intelligentAggregation = ()=>{
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.login {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ height: 280px;
|
|
|
+ //background-image: url("../../../src/assets/images/login-background.jpg");
|
|
|
+ //background-image: url("../assets/images/mylogin3.png");
|
|
|
+ background-size: cover;
|
|
|
+}
|
|
|
+.title {
|
|
|
+ margin: 0px auto 30px auto;
|
|
|
+ text-align: center;
|
|
|
+ color: #707070;
|
|
|
+}
|
|
|
+
|
|
|
+.login-form {
|
|
|
+ border-radius: 6px;
|
|
|
+ background: #ffffff;
|
|
|
+ width: 400px;
|
|
|
+ padding: 25px 5px 25px;
|
|
|
+ .el-input {
|
|
|
+ height: 40px;
|
|
|
+ input {
|
|
|
+ height: 40px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .input-icon {
|
|
|
+ height: 39px;
|
|
|
+ width: 14px;
|
|
|
+ margin-left: 0px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.login-tip {
|
|
|
+ font-size: 13px;
|
|
|
+ text-align: center;
|
|
|
+ color: #bfbfbf;
|
|
|
+}
|
|
|
+.login-code {
|
|
|
+ width: 33%;
|
|
|
+ height: 40px;
|
|
|
+ float: right;
|
|
|
+ img {
|
|
|
+ cursor: pointer;
|
|
|
+ vertical-align: middle;
|
|
|
+ }
|
|
|
+}
|
|
|
+.el-login-footer {
|
|
|
+ height: 40px;
|
|
|
+ line-height: 40px;
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ width: 100%;
|
|
|
+ text-align: center;
|
|
|
+ color: #fff;
|
|
|
+ font-family: Arial;
|
|
|
+ font-size: 12px;
|
|
|
+ letter-spacing: 1px;
|
|
|
+}
|
|
|
+.login-code-img {
|
|
|
+ height: 40px;
|
|
|
+ padding-left: 12px;
|
|
|
+}
|
|
|
</style>
|
|
|
|