From 21deb676625eef63caed1caafb2b93cb09e153af Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 09 Feb 2026 15:57:36 +0800
Subject: [PATCH] feat: 免密登陆
---
applications/drone-command/src/page/login/index.vue | 4
/dev/null | 133 --------------------------
applications/drone-command/src/store/modules/user.js | 1
applications/drone-command/src/page/login/loginByUser.vue | 33 ++++++
applications/drone-command/src/page/login/userlogin.vue | 76 +--------------
applications/drone-command/src/router/page/index.js | 10 ++
6 files changed, 51 insertions(+), 206 deletions(-)
diff --git a/applications/drone-command/src/page/login/index.vue b/applications/drone-command/src/page/login/index.vue
index ad005da..f2dad62 100644
--- a/applications/drone-command/src/page/login/index.vue
+++ b/applications/drone-command/src/page/login/index.vue
@@ -74,10 +74,10 @@
created() {
this.handleLogin();
this.getTime();
- if(!loginTitle) {
+ if(!loginTitle) {
this.getSysConfigInfo();
}
-
+
},
mounted() {},
computed: {
diff --git a/applications/drone-command/src/page/login/loginByUser.vue b/applications/drone-command/src/page/login/loginByUser.vue
new file mode 100644
index 0000000..2f954ac
--- /dev/null
+++ b/applications/drone-command/src/page/login/loginByUser.vue
@@ -0,0 +1,33 @@
+<template>
+ <div style="width: 100%; height: 100%; background: #05050f"></div>
+</template>
+<script setup>
+import { useStore } from 'vuex'
+import { ElLoading } from 'element-plus'
+
+const store = useStore()
+const router = useRouter()
+const userName = window.localStorage?.userName
+const route = useRoute()
+let loading = ElLoading.service({ background: 'rgba(0, 0, 0, 0.3)', text: '加载中...' })
+const tagWel = computed(() => store.state.tags.tagWel)
+const redirect = route.query.redirect
+store
+ .dispatch('LoginByUsername', {
+ username: userName,
+ password: 'jadk@2026',
+ tenantId: '000000',
+ type: 'account',
+ })
+ .then(() => {
+ loading.close()
+ router.push(redirect || tagWel.value)
+ })
+ .catch(err => {
+ loading.close()
+ // 返回上一个路由
+ window.history.go(-1)
+ })
+</script>
+
+<style scoped lang="scss"></style>
diff --git a/applications/drone-command/src/page/login/userlogin.vue b/applications/drone-command/src/page/login/userlogin.vue
index ddeaf20..5759c1d 100644
--- a/applications/drone-command/src/page/login/userlogin.vue
+++ b/applications/drone-command/src/page/login/userlogin.vue
@@ -7,24 +7,12 @@
:model="loginForm"
label-width="0"
>
- <!-- <el-form-item v-if="tenantMode" prop="tenantId">
- <el-input
- @keyup.enter="handleLogin"
- v-model="loginForm.tenantId"
- auto-complete="off"
- :placeholder="$t('login.tenantId')"
- >
- <template #prefix>
- <i class="icon-quanxian" />
- </template>
- </el-input>
- </el-form-item> -->
<el-form-item prop="username">
<el-input
@keyup.enter="handleLogin"
v-model="loginForm.username"
auto-complete="off"
- :placeholder="$t('login.username')"
+ placeholder="请输入账号"
>
<template #prefix>
<i class="icon-yonghu" />
@@ -37,7 +25,7 @@
:type="passwordType"
v-model="loginForm.password"
auto-complete="off"
- :placeholder="$t('login.password')"
+ placeholder="请输入密码"
>
<template #suffix>
<i class="el-icon-view el-input__icon" @click="showPassword" />
@@ -47,49 +35,15 @@
</template>
</el-input>
</el-form-item>
- <!-- <el-form-item v-if="this.website.captchaMode" prop="code">
- <el-row :span="24">
- <el-col :span="16">
- <el-input
- @keyup.enter="handleLogin"
- v-model="loginForm.code"
- auto-complete="off"
- :placeholder="$t('login.code')"
- >
- <template #prefix>
- <i class="icon-yanzhengma" />
- </template>
- </el-input>
- </el-col>
- <el-col :span="8">
- <div class="login-code">
- <img :src="loginForm.image" class="login-code-img" @click="refreshCode" />
- </div>
- </el-col>
- </el-row>
- </el-form-item> -->
<el-form-item>
<el-button
style="width: 100%;"
type="primary"
@click.prevent="handleLogin"
:class="this.registerMode ? 'login-submit' : 'btn-submit'"
- >{{ $t('login.submit') }}
+ >登 录
</el-button>
- <!-- <el-button
- v-if="this.registerMode"
- type="danger"
- @click.prevent="handleRegister"
- class="register-submit"
- >{{ $t('login.register') }}
- </el-button> -->
</el-form-item>
- <!-- <el-dialog title="用户信息选择" append-to-body v-model="userBox" width="350px">
- <avue-form :option="userOption" v-model="userForm" @submit="submitLogin" />
- </el-dialog>
- <el-dialog title="用户信息注册" append-to-body v-model="registerBox" width="350px">
- <avue-form :option="registerOption" v-model="registerForm" @submit="submitRegister" />
- </el-dialog> -->
</el-form>
</template>
@@ -338,30 +292,10 @@
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
- const loading = this.$loading({
- lock: true,
- text: '登录中,请稍后',
- background: 'rgba(0, 0, 0, 0.7)',
- });
- this.$store
- .dispatch('LoginByUsername', this.loginForm)
+ const loading = this.$loading({ lock: true, text: '登录中,请稍后', background: 'rgba(0, 0, 0, 0.7)' });
+ this.$store.dispatch('LoginByUsername', this.loginForm)
.then(() => {
- if (this.website.switchMode) {
- const deptId = this.userInfo.dept_id;
- const roleId = this.userInfo.role_id;
- if (deptId.includes(',') || roleId.includes(',')) {
- this.loginForm.deptId = deptId;
- this.loginForm.roleId = roleId;
- this.userBox = true;
- this.$store.dispatch('LogOut').then(() => {
- loading.close();
- });
- return false;
- }
- }
loading.close();
- //加载工作流路由集
- this.loadFlowRoutes();
this.$router.push(this.tagWel);
})
.catch(err => {
diff --git a/applications/drone-command/src/permission copy 2.js b/applications/drone-command/src/permission copy 2.js
deleted file mode 100644
index d732623..0000000
--- a/applications/drone-command/src/permission copy 2.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * @Author: GuLiMmo 2820890765@qq.com
- * @Date: 2024-08-23 10:51:53
- * @LastEditors: GuLiMmo 2820890765@qq.com
- * @LastEditTime: 2024-08-29 14:10:56
- * @FilePath: /drone-command/src/permission.js
- * @Description:
- * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
- */
-import router from './router/'
-import store from './store'
-import { getToken } from '@/utils/auth'
-import { getUrlParams } from './utils/validate'
-import NProgress from 'nprogress' // progress bar
-import 'nprogress/nprogress.css' // progress bar style
-NProgress.configure({ showSpinner: false })
-const lockPage = '/lock' //锁屏页
-const urlParams = getUrlParams(window.location.href)
-
-router.beforeEach((to, from, next) => {
- const meta = to.meta || {}
- const isMenu = meta.menu === undefined ? to.query.menu : meta.menu
- store.commit('SET_IS_MENU', isMenu === undefined)
- if (getToken()) {
- if (store.getters.isLock && to.path !== lockPage) {
- //如果系统激活锁屏,全部跳转到锁屏页
- next({ path: lockPage })
- } else if (to.path === '/login') {
- //如果登录成功访问登录页跳转到主页
- next({ path: '/' })
- } else {
- const systemToken = store.getters.token || urlParams?.token
- if (systemToken === 0) {
- store.dispatch('FedLogOut').then(() => {
- next({ path: '/login' })
- })
- } else {
- const meta = to.meta || {}
- const query = to.query || {}
- if (meta.target) {
- window.open(query.url.replace(/#/g, '&'))
- return
- } else if (meta.isTab !== false) {
- store.commit('ADD_TAG', {
- name: query.name || to.name,
- path: to.path,
- fullPath: to.path,
- params: to.params,
- query: to.query,
- meta: meta,
- })
- }
- next()
- }
- }
- } else {
- //判断是否需要认证,没有登录访问去登录页
- if (meta.isAuth === false) {
- next()
- } else {
- next('/login')
- }
- }
-})
-
-router.afterEach(to => {
- NProgress.done()
- let title = router.$avueRouter.generateTitle(to, { label: 'name' })
- router.$avueRouter.setTitle(title)
- store.commit('SET_IS_SEARCH', false)
-})
diff --git a/applications/drone-command/src/permission copy.js b/applications/drone-command/src/permission copy.js
deleted file mode 100644
index cb2384e..0000000
--- a/applications/drone-command/src/permission copy.js
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * @Author: GuLiMmo 2820890765@qq.com
- * @Date: 2024-08-23 10:51:53
- * @LastEditors: GuLiMmo 2820890765@qq.com
- * @LastEditTime: 2024-08-29 14:10:56
- * @FilePath: /drone-command/src/permission.js
- * @Description:
- * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
- */
-
-import { getStore } from '@/utils/store'
-import router from './router/'
-import store from './store'
-import { getToken } from '@/utils/auth'
-import { getUrlParams } from './utils/validate'
-import NProgress from 'nprogress' // progress bar
-import 'nprogress/nprogress.css' // progress bar style
-NProgress.configure({ showSpinner: false })
-const lockPage = '/lock' //锁屏页
-const urlParams = getUrlParams(window.location.href)
-
-function findRouteByPath (routes, targetPath) {
- // 遍历数组中的每个路由对象
- for (const route of routes) {
- // 如果当前路由的path匹配目标路径,直接返回
- if (route.path === targetPath) {
- return route
- }
-
- // 如果有子路由,递归查找
- if (route.children && route.children.length > 0) {
- const foundInChildren = findRouteByPath(route.children, targetPath)
- if (foundInChildren) {
- return foundInChildren
- }
- }
- }
-
- // 遍历完所有路由都没找到,返回null
- return null
-}
-
-router.beforeEach((to, from, next) => {
- const meta = to.meta || {}
- const isMenu = meta.menu === undefined ? to.query.menu : meta.menu
- store.commit('SET_IS_MENU', isMenu === undefined)
-
- const menuAll = getStore({ name: 'menuAll' })
-
- if (!menuAll) {
- store.dispatch('GetMenu').then(data => {
- if (data.length !== 0) {
- router.$avueRouter.formatRoutes(data, true)
-
- let newMenu = getStore({ name: 'menuAll' })
-
- let firstMenu = newMenu[0]
-
- let toMenu = findRouteByPath(newMenu, to.path)
-
- store.commit('ADD_TAG', {
- name: firstMenu.name,
- path: firstMenu.path,
- fullPath: firstMenu.path,
- params: firstMenu.params || {},
- query: firstMenu.query || {},
- meta: firstMenu.meta || {},
- })
-
- store.commit('ADD_TAG', {
- name: toMenu.name,
- path: toMenu.path,
- fullPath: toMenu.path,
- params: toMenu.params || {},
- query: toMenu.query || {},
- meta: toMenu.meta || {},
- })
-
- next(to.fullPath)
- }
- })
-
- return
- }
-
- if (getToken()) {
- if (store.getters.isLock && to.path !== lockPage) {
- //如果系统激活锁屏,全部跳转到锁屏页
- next({ path: lockPage })
- } else if (to.path === '/login') {
- //如果登录成功访问登录页跳转到主页
- next({ path: '/' })
- } else {
- const systemToken = store.getters.token || urlParams?.token
- if (systemToken === 0) {
- store.dispatch('FedLogOut').then(() => {
- next({ path: '/login' })
- })
- } else {
- const meta = to.meta || {}
- const query = to.query || {}
- if (meta.target) {
- window.open(query.url.replace(/#/g, '&'))
- return
- } else if (meta.isTab !== false) {
- store.commit('ADD_TAG', {
- name: query.name || to.name,
- path: to.path,
- fullPath: to.path,
- params: to.params,
- query: to.query,
- meta: meta,
- })
- }
- next()
- }
- }
- } else {
- //判断是否需要认证,没有登录访问去登录页
- if (meta.isAuth === false) {
- next()
- } else {
- next('/login')
- }
- }
-})
-
-router.afterEach(to => {
- NProgress.done()
- let title = router.$avueRouter.generateTitle(to, { label: 'name' })
- router.$avueRouter.setTitle(title)
- store.commit('SET_IS_SEARCH', false)
-})
diff --git a/applications/drone-command/src/router/page/index.js b/applications/drone-command/src/router/page/index.js
index 14400b3..f0d2709 100644
--- a/applications/drone-command/src/router/page/index.js
+++ b/applications/drone-command/src/router/page/index.js
@@ -12,6 +12,16 @@
isAuth: false,
},
},
+ {
+ path: '/logInByUser',
+ name: '按用户登录',
+ component: () => import('@/page/login/loginByUser.vue'),
+ meta: {
+ keepAlive: false,
+ isTab: false,
+ isAuth: false,
+ },
+ },
{
path: '/oauth/redirect/:source',
name: '第三方登录',
diff --git a/applications/drone-command/src/store/modules/user.js b/applications/drone-command/src/store/modules/user.js
index 4dbd240..70af2ea 100644
--- a/applications/drone-command/src/store/modules/user.js
+++ b/applications/drone-command/src/store/modules/user.js
@@ -283,6 +283,7 @@
const data = res.data.data;
let menu = deepClone(data);
if (!res.data?.data?.length){
+ ElMessage.warning('当前角色没有配置菜单,请联系管理员配置')
errLogOut()
return
}
--
Gitblit v1.9.3