Browse Source

驾驶舱首页增加用户登录

wudi 1 year ago
parent
commit
5b6e81720e
2 changed files with 278 additions and 1 deletions
  1. 6 0
      .gitignore
  2. 272 1
      ruoyi-ui/src/views/index.vue

+ 6 - 0
.gitignore

@@ -45,3 +45,9 @@ nbdist/
 !*/build/*.java
 !*/build/*.html
 !*/build/*.xml
+
+
+# 去除压缩包
+*.rar
+*.7z
+*.zip

+ 272 - 1
ruoyi-ui/src/views/index.vue

@@ -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>