Browse Source

监督端-查询统计

dev-V1.0.1
庄锐波 5 months ago
parent
commit
b28df49508
  1. 27
      zdxt-web-client/zdxt-admin-plus-ui/src/layout/components/Navbar.vue
  2. 1
      zdxt-web-client/zdxt-admin-plus-ui/src/router/index.ts
  3. 21
      zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/permission.ts
  4. 13
      zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/user.ts
  5. 17
      zdxt-web-client/zdxt-admin-plus-ui/src/utils/request.ts
  6. 85
      zdxt-web-client/zdxt-admin-plus-ui/src/views/index.vue
  7. 14
      zdxt-web-server/zdxt-admin-web-server/src/main/java/org/dromara/web/controller/AuthController.java

27
zdxt-web-client/zdxt-admin-plus-ui/src/layout/components/Navbar.vue

@ -19,7 +19,7 @@
<template #prefix><svg-icon icon-class="tree-table" class="el-input__icon input-icon" /></template>
</el-select>
<el-select
<!-- <el-select
v-if="userId === 1 && tenantEnabled"
v-model="companyName"
class="min-w-244px"
@ -32,16 +32,16 @@
>
<el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option>
<template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
</el-select>
</el-select>-->
<search-menu ref="searchMenuRef" />
<!-- <search-menu ref="searchMenuRef" />
<el-tooltip content="搜索" effect="dark" placement="bottom">
<div class="right-menu-item hover-effect" @click="openSearchMenu">
<svg-icon class-name="search-icon" icon-class="search" />
</div>
</el-tooltip>
</el-tooltip>-->
<!-- 消息 -->
<el-tooltip :content="proxy.$t('navbar.message')" effect="dark" placement="bottom">
<!-- <el-tooltip :content="proxy.$t('navbar.message')" effect="dark" placement="bottom">
<div>
<el-popover placement="bottom" trigger="click" transition="el-zoom-in-top" :width="300" :persistent="false">
<template #reference>
@ -73,7 +73,7 @@
<el-tooltip :content="proxy.$t('navbar.layoutSize')" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
</el-tooltip>-->
</template>
<div class="avatar-container">
<el-dropdown class="right-menu-item hover-effect" trigger="click" @command="handleCommand">
@ -192,14 +192,13 @@ const logout = async () => {
cancelButtonText: '取消',
type: 'warning'
} as ElMessageBoxOptions);
userStore.logout().then(() => {
router.replace({
path: '/login',
query: {
redirect: encodeURIComponent(router.currentRoute.value.fullPath || '/')
}
});
proxy?.$tab.closeAllPage();
await userStore.logout();
proxy?.$tab.closeAllPage();
router.replace({
path: '/login',
query: {
redirect: encodeURIComponent(router.currentRoute.value.fullPath || '/')
}
});
};

1
zdxt-web-client/zdxt-admin-plus-ui/src/router/index.ts

@ -61,6 +61,7 @@ export const constantRoutes: RouteRecordRaw[] = [
path: '',
component: Layout,
redirect: '/index',
hidden: true,
children: [
{
path: '/index',

21
zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/permission.ts

@ -194,6 +194,24 @@ export const usePermissionStore = defineStore('permission', () => {
console.log('[路由调试] switchSystemCode 完成, 当前路由列表 =', router.getRoutes().map((r) => ({ name: r.name, path: r.path })));
};
/**
* 清理路由缓存并重置系统码到首页,用于切换账号登录时
*/
const cleanRouteCache = () => {
allRouteDataCache.value = [];
routes.value = [];
addRoutes.value = [];
defaultRoutes.value = [];
topbarRouters.value = [];
sidebarRouters.value = [];
// 重置到首页
currentSystemCode.value = 'planindex';
sessionStorage.setItem(SYSTEM_CODE_KEY, 'planindex');
const defaultOption = systemCodeOptions.find((o) => o.value === 'planindex');
iframeMode.value = defaultOption?.iframeUrl ? true : false;
iframeUrl.value = defaultOption?.iframeUrl || '';
};
return {
routes,
topbarRouters,
@ -211,7 +229,8 @@ export const usePermissionStore = defineStore('permission', () => {
setRoutes,
generateRoutes,
setSidebarRouters,
switchSystemCode
switchSystemCode,
cleanRouteCache
};
});

13
zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/user.ts

@ -5,6 +5,7 @@ import { LoginData } from '@/api/types';
import defAva from '@/assets/images/profile.jpg';
import { defineStore } from 'pinia';
import { ref } from 'vue';
import { usePermissionStore } from '@/store/modules/permission';
export const useUserStore = defineStore('user', () => {
const token = ref(getToken());
@ -27,6 +28,10 @@ export const useUserStore = defineStore('user', () => {
const data = res.data;
setToken(data.access_token);
token.value = data.access_token;
// 重置用户状态和路由缓存,确保切换账号后重新加载菜单
roles.value = [];
permissions.value = [];
usePermissionStore().cleanRouteCache();
return Promise.resolve();
}
return Promise.reject(err);
@ -59,11 +64,17 @@ export const useUserStore = defineStore('user', () => {
// 注销
const logout = async (): Promise<void> => {
await logoutApi();
try {
await logoutApi();
} catch (e) {
// 即使后端注销接口失败(如token已过期),也要继续清理本地状态
console.warn('logoutApi 调用失败,继续清理本地状态', e);
}
token.value = '';
roles.value = [];
permissions.value = [];
removeToken();
usePermissionStore().cleanRouteCache();
};
const setAvatar = (value: string) => {

17
zdxt-web-client/zdxt-admin-plus-ui/src/utils/request.ts

@ -136,16 +136,15 @@ service.interceptors.response.use(
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
}).then(async () => {
isRelogin.show = false;
useUserStore().logout().then(() => {
router.replace({
path: '/login',
query: {
redirect: encodeURIComponent(router.currentRoute.value.fullPath || '/')
}
})
});
await useUserStore().logout();
router.replace({
path: '/login',
query: {
redirect: encodeURIComponent(router.currentRoute.value.fullPath || '/')
}
})
}).catch(() => {
isRelogin.show = false;
});

85
zdxt-web-client/zdxt-admin-plus-ui/src/views/index.vue

@ -2,92 +2,11 @@
<div class="app-container home">
<el-row :gutter="20">
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>zdxt-Vue-Plus多租户管理系统</h2>
<p>
zdxt-Vue-Plus 是基于 zdxt-Vue 针对 分布式集群 场景升级(不兼容原框架)
<br />
* 前端开发框架 Vue3、TS、Element Plus<br />
* 后端开发框架 Spring Boot<br />
* 容器框架 Undertow 基于 Netty 的高性能容器<br />
* 权限认证框架 Sa-Token 支持多终端认证系统<br />
* 关系数据库 MySQL 适配 8.X 最低 5.7<br />
* 缓存数据库 Redis 适配 6.X 最低 4.X<br />
* 数据库框架 Mybatis-Plus 快速 CRUD 增加开发效率<br />
* 数据库框架 p6spy 更强劲的 SQL 分析<br />
* 多数据源框架 dynamic-datasource 支持主从与多种类数据库异构<br />
* 序列化框架 Jackson 统一使用 jackson 高效可靠<br />
* Redis客户端 Redisson 性能强劲、API丰富<br />
* 分布式限流 Redisson 全局、请求IP、集群ID 多种限流<br />
* 分布式锁 Lock4j 注解锁、工具锁 多种多样<br />
* 分布式幂等 Lock4j 基于分布式锁实现<br />
* 分布式链路追踪 SkyWalking 支持链路追踪、网格分析、度量聚合、可视化<br />
* 分布式任务调度 SnailJob 高性能 高可靠 易扩展<br />
* 文件存储 Minio 本地存储<br />
* 文件存储 七牛、阿里、腾讯 云存储<br />
* 监控框架 SpringBoot-Admin 全方位服务监控<br />
* 校验框架 Validation 增强接口安全性 严谨性<br />
* Excel框架 FastExcel(原Alibaba EasyExcel) 性能优异 扩展性强<br />
* 文档框架 SpringDoc、javadoc 无注解零入侵基于java注释<br />
* 工具类框架 Hutool、Lombok 减少代码冗余 增加安全性<br />
* 代码生成器 适配MP、SpringDoc规范化代码 一键生成前后端代码<br />
* 部署方式 Docker 容器编排 一键部署业务集群<br />
* 国际化 SpringMessage Spring标准国际化方案<br />
</p>
<p><b>当前版本:</b> <span>v5.5.3</span></p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>
<p>
<el-button type="primary" icon="Cloudy" plain @click="goTarget('https://gitee.com/dromara/zdxt-Vue-Plus')">访问码云</el-button>
<el-button type="primary" icon="Cloudy" plain @click="goTarget('https://github.com/dromara/zdxt-Vue-Plus')">访问GitHub</el-button>
<el-button type="primary" icon="Cloudy" plain @click="goTarget('https://plus-doc.dromara.org/#/zdxt-vue-plus/changlog')"
>更新日志</el-button
>
</p>
</el-col>
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>zdxt-Cloud-Plus多租户微服务管理系统</h2>
<p>
zdxt-Cloud-Plus 微服务通用权限管理系统 重写 zdxt-Cloud 全方位升级(不兼容原框架)
<br />
* 前端开发框架 Vue3、TS、Element UI<br />
* 后端开发框架 Spring Boot<br />
* 微服务开发框架 Spring Cloud、Spring Cloud Alibaba<br />
* 容器框架 Undertow 基于 XNIO 的高性能容器<br />
* 权限认证框架 Sa-Token、Jwt 支持多终端认证系统<br />
* 关系数据库 MySQL 适配 8.X 最低 5.7<br />
* 关系数据库 Oracle 适配 11g 12c<br />
* 关系数据库 PostgreSQL 适配 13 14<br />
* 关系数据库 SQLServer 适配 2017 2019<br />
* 缓存数据库 Redis 适配 6.X 最低 5.X<br />
* 分布式注册中心 Alibaba Nacos 采用2.X 基于GRPC通信高性能<br />
* 分布式配置中心 Alibaba Nacos 采用2.X 基于GRPC通信高性能<br />
* 服务网关 Spring Cloud Gateway 响应式高性能网关<br />
* 负载均衡 Spring Cloud Loadbalancer 负载均衡处理<br />
* RPC远程调用 Apache Dubbo 原生态使用体验、高性能<br />
* 分布式限流熔断 Alibaba Sentinel 无侵入、高扩展<br />
* 分布式事务 Alibaba Seata 无侵入、高扩展 支持 四种模式<br />
* 分布式消息队列 Apache Kafka 高性能高速度<br />
* 分布式消息队列 Apache RocketMQ 高可用功能多样<br />
* 分布式消息队列 RabbitMQ 支持各种扩展插件功能多样性<br />
* 分布式搜索引擎 ElasticSearch 业界知名<br />
* 分布式链路追踪 Apache SkyWalking 链路追踪、网格分析、度量聚合、可视化<br />
* 分布式日志中心 ELK 业界成熟解决方案<br />
* 分布式监控 Prometheus、Grafana 全方位性能监控<br />
* 其余与 Vue 版本一致<br />
</p>
<p><b>当前版本:</b> <span>v2.5.3</span></p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>
<p>
<el-button type="primary" icon="Cloudy" plain @click="goTarget('https://gitee.com/dromara/zdxt-Cloud-Plus')">访问码云</el-button>
<el-button type="primary" icon="Cloudy" plain @click="goTarget('https://github.com/dromara/zdxt-Cloud-Plus')">访问GitHub</el-button>
<el-button type="primary" icon="Cloudy" plain @click="goTarget('https://plus-doc.dromara.org/#/zdxt-cloud-plus/changlog')"
>更新日志</el-button
>
</p>
</el-col>
</el-row>
<el-divider />

14
zdxt-web-server/zdxt-admin-web-server/src/main/java/org/dromara/web/controller/AuthController.java

@ -105,13 +105,13 @@ public class AuthController {
// 登录
LoginVo loginVo = IAuthStrategy.login(body, client, grantType);
Long userId = LoginHelper.getUserId();
scheduledExecutorService.schedule(() -> {
SseMessageDto dto = new SseMessageDto();
dto.setMessage(DateUtils.getTodayHour(new Date()) + "好,欢迎登录 zdxt-Vue-Plus 后台管理系统");
dto.setUserIds(List.of(userId));
SseMessageUtils.publishMessage(dto);
}, 5, TimeUnit.SECONDS);
// Long userId = LoginHelper.getUserId();
// scheduledExecutorService.schedule(() -> {
// SseMessageDto dto = new SseMessageDto();
// dto.setMessage(DateUtils.getTodayHour(new Date()) + "好,欢迎登录 zdxt-Vue-Plus 后台管理系统");
// dto.setUserIds(List.of(userId));
// SseMessageUtils.publishMessage(dto);
// }, 5, TimeUnit.SECONDS);
LoginUser loginUser = LoginHelper.getLoginUser();
System.out.println(JsonUtils.toJsonString(loginUser));

Loading…
Cancel
Save