From 4cc7ee8b53da5eff394290a22f0c851897f8aab8 Mon Sep 17 00:00:00 2001 From: douyage Date: Thu, 10 Sep 2026 14:11:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=A8=E6=88=B7=E5=88=86?= =?UTF-8?q?=E9=85=8D=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=95=B4=E4=B8=AA=E7=B3=BB=E7=BB=9F=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E5=B7=A1=E8=A7=86=E7=BB=9F=E4=B8=80=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=B7=A1=E6=A3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- .env.htjc6 | 2 +- .env.production | 2 +- .env.staging | 2 +- src/api/analysis/index.js | 2 +- src/api/area/area.js | 8 +- src/api/basedata/area/area.js | 14 +- src/api/basedata/patrolpointmnt/patroltype.js | 2 +- src/api/device.js | 2 +- src/api/home/index.js | 6 +- .../inspectionDataManage/inspectionArchive.js | 8 +- .../inspectionReporter.js | 2 +- src/api/videosMonitor/index.js | 14 +- src/assets/styles/sidebar.scss | 220 ++++++++++++++---- src/assets/styles/variables.scss | 7 +- .../InspectionArchiveContrastDialog.vue | 12 +- src/lang/en/index.js | 2 +- src/lang/zh/administration.json | 2 +- src/lang/zh/index.js | 2 +- src/layout/components/Navbar.vue | 64 ++--- src/layout/components/Sidebar/Item.vue | 45 ++-- src/layout/components/Sidebar/SidebarItem.vue | 5 +- src/layout/components/Sidebar/index.vue | 124 +++++++--- src/layout/index.vue | 31 ++- src/permission.js | 31 +-- src/router/index.js | 36 +-- src/store/modules/permission.js | 11 + src/utils/embeddedAuth.js | 31 +++ src/utils/patrolName.js | 5 + src/utils/request.js | 45 ++-- src/views/administration/edit_task.vue | 20 +- src/views/administration/new_task.vue | 20 +- .../cards/components/ImagePreview/index.vue | 2 +- src/views/cards/defectRecord/index.vue | 2 +- .../patrolAbnormalStatistics.vue | 2 +- .../cards/patrolPlan/summary_editTask.vue | 12 +- .../cards/patrolPlan/summary_newTask.vue | 16 +- .../cards/patrolReport/InspectionReporter.vue | 12 +- .../cards/patrolReport/patrolReportDetail.vue | 24 +- src/views/cards/site_management/algorithm.vue | 12 +- .../cards/site_management/site_management.vue | 6 +- .../cards/taskSummary/inspectionTask.vue | 16 +- .../taskSummary/newInspectionTaskDetail.vue | 8 +- src/views/login.vue | 16 +- src/views/point/algorithm.vue | 11 +- src/views/point/site_management.vue | 5 +- 46 files changed, 607 insertions(+), 316 deletions(-) create mode 100644 src/utils/embeddedAuth.js create mode 100644 src/utils/patrolName.js diff --git a/.env.development b/.env.development index 09664d8..def44a3 100644 --- a/.env.development +++ b/.env.development @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 智能巡视 +VUE_APP_TITLE = 智能巡检 # 开发环境配置 ENV = 'development' diff --git a/.env.htjc6 b/.env.htjc6 index 85525cc..0654176 100644 --- a/.env.htjc6 +++ b/.env.htjc6 @@ -1,7 +1,7 @@ NODE_ENV = 'production' ENV = 'production' -VUE_APP_TITLE = 智能巡视 +VUE_APP_TITLE = 智能巡检 VUE_APP_BASE_API = '/app/htjc6/api' VUE_APP_NVR_API = '/nvr-api' diff --git a/.env.production b/.env.production index 10200d5..3582916 100644 --- a/.env.production +++ b/.env.production @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 智能巡视 +VUE_APP_TITLE = 智能巡检 # 生产环境配置 ENV = 'production' diff --git a/.env.staging b/.env.staging index 013ebde..1ca17f1 100644 --- a/.env.staging +++ b/.env.staging @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 智能巡视 +VUE_APP_TITLE = 智能巡检 BABEL_ENV = production diff --git a/src/api/analysis/index.js b/src/api/analysis/index.js index f84c977..72deaad 100644 --- a/src/api/analysis/index.js +++ b/src/api/analysis/index.js @@ -1,7 +1,7 @@ // 告警确认 import request from '@/utils/request' -// 巡视结果列表 +// 巡检结果列表 export function getPatrolData(query) { return request({ url: '/patrol/statistics/listMulti', diff --git a/src/api/area/area.js b/src/api/area/area.js index 28e9234..42b2488 100644 --- a/src/api/area/area.js +++ b/src/api/area/area.js @@ -127,7 +127,7 @@ export function editSave (data) { data: data }) } -//主设备下巡检点和巡检点巡检设备树(巡视任务回显) +//主设备下巡检点和巡检点巡检设备树(巡检任务回显) export function editList (query) { return request({ url: '/basedata/prodevmnt/device/treeProMainDevicePatrolEquSelectByEqookCode', @@ -135,7 +135,7 @@ export function editList (query) { params: query }) } -// 巡视任务编辑回显 +// 巡检任务编辑回显 export function editTask (taskId) { return request({ url: '/patrol/task/' + taskId, @@ -178,7 +178,7 @@ export function controlChange (id) { method: 'get', }) } -//巡视任务列表修改任务状态(列表开关) +//巡检任务列表修改任务状态(列表开关) export function changeStatus (query) { return request({ url: '/patrol/task/changeStatus', @@ -195,7 +195,7 @@ export function addPatrol (data) { data: data }) } -// 巡视任务管理列表 +// 巡检任务管理列表 export function taskPatrol (query) { return request({ url: 'patrol/task/list', diff --git a/src/api/basedata/area/area.js b/src/api/basedata/area/area.js index 465103b..af65000 100644 --- a/src/api/basedata/area/area.js +++ b/src/api/basedata/area/area.js @@ -68,7 +68,7 @@ export function editSave (data) { data: data }) } -// 修改巡视任务(绍兴) +// 修改巡检任务(绍兴) export function shaoxingEditSave (data) { return request({ url: '/patrol/task/shaoxing/save', @@ -76,7 +76,7 @@ export function shaoxingEditSave (data) { data: data }) } -//主设备下巡检点和巡检点巡检设备树(巡视任务回显) +//主设备下巡检点和巡检点巡检设备树(巡检任务回显) export function editList (query) { return request({ url: '/basedata/prodevmnt/device/treeProMainDevicePatrolEquSelectByEqookCode', @@ -84,14 +84,14 @@ export function editList (query) { params: query }) } -// 巡视任务编辑回显 +// 巡检任务编辑回显 export function editTask (taskId) { return request({ url: '/patrol/task/' + taskId, method: 'get', }) } -// 巡视任务编辑回显(绍兴) +// 巡检任务编辑回显(绍兴) export function editTaskShaoxing (taskId) { return request({ url: '/patrol/task/shaoxing/' + taskId, @@ -134,7 +134,7 @@ export function controlChange (id) { method: 'get', }) } -//巡视任务列表修改任务状态(列表开关) +//巡检任务列表修改任务状态(列表开关) export function changeStatus (query) { return request({ url: '/patrol/task/changeStatus', @@ -151,7 +151,7 @@ export function addPatrol (data) { data: data }) } -// 绍兴站新增/修改巡视任务 +// 绍兴站新增/修改巡检任务 export function shaoxingAddPatrol (data) { return request({ url: '/patrol/task/shaoxing/add', @@ -159,7 +159,7 @@ export function shaoxingAddPatrol (data) { data: data }) } -// 巡视任务管理列表 +// 巡检任务管理列表 export function taskPatrol (query) { return request({ url: 'patrol/task/list', diff --git a/src/api/basedata/patrolpointmnt/patroltype.js b/src/api/basedata/patrolpointmnt/patroltype.js index 4063a1c..df9af67 100644 --- a/src/api/basedata/patrolpointmnt/patroltype.js +++ b/src/api/basedata/patrolpointmnt/patroltype.js @@ -39,7 +39,7 @@ export function postRemove(query) { // params: query }) } -// 查询巡视类型列表 +// 查询巡检类型列表 export function listPatroltype(query) { return request({ url: "/basedata/patrolpointmnt/patroltype/list", diff --git a/src/api/device.js b/src/api/device.js index 02fabd5..4b3bb1a 100644 --- a/src/api/device.js +++ b/src/api/device.js @@ -91,7 +91,7 @@ export function getDeviceChannelList (deviceCode) { /** - * 根据任务获取巡视设备及视频通道树 + * 根据任务获取巡检设备及视频通道树 */ export function taskByEqbookchannel (taskCode) { return request({ diff --git a/src/api/home/index.js b/src/api/home/index.js index 5874624..0dd044d 100644 --- a/src/api/home/index.js +++ b/src/api/home/index.js @@ -27,7 +27,7 @@ export function alarmDeviceList(query) { }); } -// 巡视告警详情 +// 巡检告警详情 export function alarmPatrolList(query) { return request({ url: "/basedata/eqpbook/alarmList/alarm", @@ -36,7 +36,7 @@ export function alarmPatrolList(query) { }); } -// 巡视异常详情 +// 巡检异常详情 export function abnormalPatrolList(query) { return request({ url: "/basedata/eqpbook/alarmList/abnormal", @@ -44,7 +44,7 @@ export function abnormalPatrolList(query) { params: query, }); } -// 巡视异常 +// 巡检异常 export function getAbnormalPatrolList(query) { return request({ url: "/patrol/analysis/list_exception", diff --git a/src/api/inspectionDataManage/inspectionArchive.js b/src/api/inspectionDataManage/inspectionArchive.js index dd98b6a..a3f7664 100644 --- a/src/api/inspectionDataManage/inspectionArchive.js +++ b/src/api/inspectionDataManage/inspectionArchive.js @@ -3,7 +3,7 @@ import request from '@/utils/request' import { parseStrEmpty } from "@/utils/ruoyi"; -// 巡视结果列表 +// 巡检结果列表 export function listPartrolResult (query) { return request({ url: '/patrol/resultmain/list', @@ -12,7 +12,7 @@ export function listPartrolResult (query) { }) } -// 巡视结果修正 +// 巡检结果修正 export function correctPartrolResult (params) { return request({ url: '/patrol/partrolresult/edit', @@ -21,7 +21,7 @@ export function correctPartrolResult (params) { }) } -// 巡视详情 +// 巡检详情 export function partrolResultDetail (params) { return request({ url: '/patrol/partrolresult/detail', @@ -30,7 +30,7 @@ export function partrolResultDetail (params) { }) } -// 巡视详情列表 +// 巡检详情列表 export function listPartrolResultDetail (params) { return request({ url: '/patrol/partrolresult/list', diff --git a/src/api/inspectionDataManage/inspectionReporter.js b/src/api/inspectionDataManage/inspectionReporter.js index b80d1b8..60c3271 100644 --- a/src/api/inspectionDataManage/inspectionReporter.js +++ b/src/api/inspectionDataManage/inspectionReporter.js @@ -1,4 +1,4 @@ -// 巡视报告 +// 巡检报告 import request from "@/utils/request"; import { parseStrEmpty } from "@/utils/ruoyi"; diff --git a/src/api/videosMonitor/index.js b/src/api/videosMonitor/index.js index 582a713..406161f 100644 --- a/src/api/videosMonitor/index.js +++ b/src/api/videosMonitor/index.js @@ -2,7 +2,7 @@ import request from "@/utils/request"; import { defectList } from "../home/index"; /** - * 巡视设备树 + * 巡检设备树 * @param {*} data * @returns */ @@ -23,7 +23,7 @@ export function getAreaEqubookTreeSelect(params) { }); } /** - * 巡视任务--任务展示--日 + * 巡检任务--任务展示--日 * @param {*} data * @returns */ @@ -35,7 +35,7 @@ export function list(params) { }); } /** - * 巡视任务--任务展示--月、年 + * 巡检任务--任务展示--月、年 * @param {*} data * @returns */ @@ -72,7 +72,7 @@ export function taskInfo(params) { }); } -// 查询巡视类型列表 +// 查询巡检类型列表 export function listPatroltype(query) { return request({ url: "/basedata/patrolpointmnt/patroltype/list", @@ -278,7 +278,7 @@ export function getDefectAlarmList(params = {}) { } /** - * 巡视任务--任务日历展示年 + * 巡检任务--任务日历展示年 * @param {*} data * @returns */ @@ -292,7 +292,7 @@ export function getDefectAlarmList(params = {}) { /** - * 巡视任务--任务日历展示月 + * 巡检任务--任务日历展示月 * @param {*} data * @returns */ @@ -305,7 +305,7 @@ export function getDefectAlarmList(params = {}) { } /** - * 巡视任务--任务日历展示日 + * 巡检任务--任务日历展示日 * @param {*} data * @returns */ diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index 9642955..796792b 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -85,9 +85,9 @@ } .menu-item-inner.is-root { - width: 100%; - justify-content: center; - gap: 10px; + justify-content: flex-start; + gap: 8px; + min-width: 0; } .menu-item-inner.is-root .svg-icon, @@ -129,18 +129,91 @@ white-space: nowrap !important; } - // Center the first-level icon/text group inside the narrower sidebar. + // 全部菜单项统一行高,保证上下级之间垂直间距一致 + .el-menu-item, + .el-submenu__title { + height: 48px !important; + line-height: 48px !important; + } + + // 子分组的小三角紧跟文字排布,不钉在导航右缘 + .el-submenu__title .el-submenu__icon-arrow { + position: static; + margin-top: 0; + margin-left: 6px; + margin-right: 0; + vertical-align: middle; + line-height: 1; + flex-shrink: 0; + } + + // 子级菜单逐级缩进:每一级固定缩进 16px,紧凑但层级分明。 + // 二级缩进 44px 与一级文字起点对齐,子级始终缩在父级里面。 + .el-submenu > .el-menu > div > a > .el-menu-item, + .el-submenu > .el-menu > div > .el-submenu > .el-submenu__title { + padding-left: 44px !important; + font-size: 13px; + color: rgba(255, 255, 255, 0.78) !important; + } + + .el-submenu > .el-menu > div > .el-submenu > .el-menu > div > a > .el-menu-item, + .el-submenu > .el-menu > div > .el-submenu > .el-menu > div > .el-submenu > .el-submenu__title { + padding-left: 60px !important; + } + + .el-submenu > .el-menu > div > .el-submenu > .el-menu > div > .el-submenu > .el-menu > div > a > .el-menu-item, + .el-submenu > .el-menu > div > .el-submenu > .el-menu > div > .el-submenu > .el-menu > div > .el-submenu > .el-submenu__title { + padding-left: 76px !important; + } + + // 子级菜单保持激活/悬停高亮使用主题色 + .el-submenu > .el-menu .el-menu-item.is-active { + color: $base-menu-color-active !important; + } + + // 展开的每一级子菜单左侧画一条淡淡的引导竖线,强化层级感 + .el-submenu > .el-menu { + position: relative; + + &::before { + content: ""; + position: absolute; + top: 6px; + bottom: 6px; + left: 32px; + width: 1px; + background: linear-gradient(180deg, rgba(84, 255, 255, 0) 0%, rgba(84, 255, 255, 0.28) 18%, rgba(84, 255, 255, 0.28) 82%, rgba(84, 255, 255, 0) 100%); + pointer-events: none; + } + } + + .el-submenu .el-submenu > .el-menu::before { + left: 48px; + } + + .el-submenu .el-submenu .el-submenu > .el-menu::before { + left: 64px; + } + + // 一级菜单靠左对齐(图标+文字),子级缩进在其右侧,形成明确的父子层级。 + // 字号 13px + 加粗:在 120px 宽度下仍能容纳文字与展开小三角,加粗保持与子级的层级对比 .el-menu > div > a > .submenu-title-noDropdown, .el-menu > div > .el-submenu > .el-submenu__title { display: flex !important; align-items: center; - justify-content: center; width: 100%; - padding-left: 0 !important; - padding-right: 0 !important; + padding-left: 18px !important; + padding-right: 4px !important; + font-size: 13px; + font-weight: 600; box-sizing: border-box; } + // 叶子项:图标(inner)与标题文字(title 插槽)之间的间距 + .el-menu > div > a > .submenu-title-noDropdown { + gap: 8px; + } + // menu hover .submenu-title-noDropdown, .el-submenu__title { @@ -182,6 +255,26 @@ } } + .sidebarWide2.openSidebar { + .main-container { + margin-left: $base-sidebar-wide2-width; + } + + .sidebar-container { + width: $base-sidebar-wide2-width !important; + } + } + + .sidebarWide3.openSidebar { + .main-container { + margin-left: $base-sidebar-wide3-width; + } + + .sidebar-container { + width: $base-sidebar-wide3-width !important; + } + } + .hideSidebar { .sidebar-container { width: 54px !important; @@ -191,51 +284,40 @@ margin-left: 54px; } + // 收起时所有根级图标统一靠 margin 对齐(覆盖一级标题的靠左缩进) + .el-menu > div > a > .submenu-title-noDropdown, + .el-menu > div > .el-submenu > .el-submenu__title { + padding-left: 0 !important; + padding-right: 0 !important; + } + .submenu-title-noDropdown { padding: 0 !important; position: relative; + } - .el-tooltip { - padding: 0 !important; + // 收起时只保留图标,不显示文字 + .sidebar-container .el-menu-item > span.menu-item-title { + display: none !important; + } - .svg-icon { - margin-left: 20px; - } + .sidebar-container .el-submenu__title .menu-item-inner > span:not(.menu-icon-img):not(.menu-icon-placeholder) { + display: none !important; + } - .menu-icon-img { - margin-left: 20px; - } - } + // 收起时只保留图标,行高压缩为 38px,保证全部根级图标一屏内可见 + .sidebar-container .el-menu-item, + .sidebar-container .el-submenu__title { + height: 38px !important; + line-height: 38px !important; } .el-submenu { overflow: hidden; - &>.el-submenu__title { - padding: 0 !important; - - .svg-icon { - margin-left: 20px; - } - - .menu-icon-img { - margin-left: 20px; - } - - } - } - - .el-menu--collapse { - .el-submenu { - &>.el-submenu__title { - &>span { - height: 0; - width: 0; - overflow: hidden; - visibility: hidden; - display: inline-block; - } - } + // 收起时只保留图标,不显示展开箭头 + .el-submenu__icon-arrow { + display: none; } } @@ -251,6 +333,62 @@ } } + // 收起模式:作用域挂在 Element 自身的 el-menu--collapse 类上(与收起状态强一致, + // 不依赖外层 hideSidebar 类的挂载时序)。行高 38px 保证 13 个根级图标一屏内可见。 + .el-menu--collapse { + .el-menu-item, + .el-submenu__title { + height: 38px !important; + line-height: 38px !important; + padding-left: 0 !important; + padding-right: 0 !important; + position: relative; + justify-content: center; + gap: 0; + } + + // 分组标题内的图标容器与叶子的 tooltip 覆盖层同样绝对定位居中 + .el-submenu__title .menu-item-inner { + position: absolute !important; + left: 0 !important; + top: 0 !important; + height: 100% !important; + width: 100% !important; + display: flex !important; + align-items: center; + justify-content: center; + } + + // 只保留图标:隐藏文字与展开箭头(箭头在 hover 弹层里另行展示子菜单) + .menu-item-inner > span:not(.menu-icon-img):not(.menu-icon-placeholder), + span.menu-item-title, + .el-submenu__icon-arrow { + display: none !important; + } + + .menu-icon-img, + .svg-icon, + .menu-icon-placeholder { + margin-left: 0 !important; + margin-right: 0 !important; + } + + // 分组标题内部的图标容器撑满标题并居中,与叶子图标对齐 + .el-submenu__title .menu-item-inner { + display: flex; + justify-content: center; + width: 100%; + } + + // 叶子项收起后由 el-tooltip 覆盖层承载图标,去掉其内边距并用 flex 居中 + .submenu-title-noDropdown .el-tooltip { + padding: 0 !important; + display: flex !important; + align-items: center; + justify-content: center; + } + } + .el-menu--collapse .el-menu .el-submenu { min-width: $base-sidebar-width !important; } diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss index 4f61977..116359a 100644 --- a/src/assets/styles/variables.scss +++ b/src/assets/styles/variables.scss @@ -40,8 +40,11 @@ $base-sub-menu-background:#000c17; $base-sub-menu-hover:#001528; */ -$base-sidebar-width: 160px; -$base-sidebar-wide-width: 200px; +$base-sidebar-width: 120px; +$base-sidebar-wide-width: 180px; +// 侧边栏随展开层级逐级加宽:展开一级 180px,两级 205px,三级 230px +$base-sidebar-wide2-width: 205px; +$base-sidebar-wide3-width: 230px; // the :export directive is the magic sauce for webpack // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass diff --git a/src/components/InspectionArchiveContrastDialog.vue b/src/components/InspectionArchiveContrastDialog.vue index 000ee8c..17b1fd7 100644 --- a/src/components/InspectionArchiveContrastDialog.vue +++ b/src/components/InspectionArchiveContrastDialog.vue @@ -45,15 +45,15 @@
详情数据
- + {{ showInfo.patroldeviceName }} - + {{ showInfo.patroldeviceCode }} - + {{ showInfo.taskPatrolledId }} @@ -133,7 +133,7 @@ {{ originalInfo.checkTime }} - + {{ originalInfo.checkResult }} @@ -281,7 +281,7 @@ import ImagePreviewDialog from "../../components/ImagePreviewDialog/index.vue"; import AsyncVideo from "../../components/AsyncVideo/index.vue"; import { getAllAlgorithmList } from "@/api/inspectionDataManage/alarmConfirm.js"; -// 巡视归档对比对话框 +// 巡检归档对比对话框 export default { name: "InspectionArchiveContrastDialog", components: { ImagePreviewDialog, AsyncVideo }, @@ -294,7 +294,7 @@ export default { // 标题 title: { type: String, - default: "巡视结果详情", + default: "巡检结果详情", }, // 是否显示弹窗 visible: { diff --git a/src/lang/en/index.js b/src/lang/en/index.js index a41c134..c858b87 100644 --- a/src/lang/en/index.js +++ b/src/lang/en/index.js @@ -24,7 +24,7 @@ export default { routerIl8n: { homePage: 'homePage' }, - logName:"Smart patrols", + logName:"Smart inspection", navBar: { IndividualCenter: 'Individual center', LayoutSetting: 'Layout setting', diff --git a/src/lang/zh/administration.json b/src/lang/zh/administration.json index 03ca1b5..035af1a 100644 --- a/src/lang/zh/administration.json +++ b/src/lang/zh/administration.json @@ -20,7 +20,7 @@ "PeriodicExecution": "周期执行", "IntervalExecution": "间隔执行", "ExecutionDate": "执行日期", - "WalkThrough": "现场巡视", + "WalkThrough": "现场巡检", "timeSetting": "时间设置", "SelectByWeek": "按周选择", "MonthlySelection": "按月选择", diff --git a/src/lang/zh/index.js b/src/lang/zh/index.js index 69212ed..3b483e8 100644 --- a/src/lang/zh/index.js +++ b/src/lang/zh/index.js @@ -24,7 +24,7 @@ export default { routerIl8n: { homePage: '首页' }, - logName:"智能巡视", + logName:"智能巡检", navBar: { IndividualCenter: '个人中心', LayoutSetting: '布局设置', diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index b0eb050..11e500b 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -51,6 +51,7 @@ import { mapGetters } from "vuex"; import TopNav from "@/components/TopNav"; import Screenfull from "@/components/Screenfull"; +import { getEmbeddedUser } from "@/utils/embeddedAuth"; import headerLogo from "@/assets/images/header/logo.png"; import xfdhTitleNavbar from "@/assets/images/header/xfdh-title-navbar.png"; import xfdhBrand from "@/assets/images/header/xfdh-brand.png"; @@ -81,7 +82,14 @@ export default { return true }, displayName() { - return (this.frameworkUser && (this.frameworkUser.realName || this.frameworkUser.userName || this.frameworkUser.username)) || this.name || '超级管理员' + return ( + (this.frameworkUser && + (this.frameworkUser.realName || + this.frameworkUser.userName || + this.frameworkUser.username)) || + this.name || + "" + ); }, displayAvatar() { return this.loginAvatar @@ -96,28 +104,14 @@ export default { }, methods: { loadFrameworkUser() { - try { - const contexts = [window] - try { if (window.parent && contexts.indexOf(window.parent) === -1) contexts.push(window.parent) } catch (e) {} - try { if (window.top && contexts.indexOf(window.top) === -1) contexts.push(window.top) } catch (e) {} - let cachedUser = null - for (let index = 0; index < contexts.length && !cachedUser; index += 1) { - try { cachedUser = contexts[index].sessionStorage.getItem('main_userInfo') } catch (e) {} + // 优先展示外部系统(宿主框架)提供的用户信息,本系统登录用户则展示 name。 + const user = getEmbeddedUser(); + if (user) { + this.frameworkUser = user; + if (this.frameworkUserPoller) { + window.clearInterval(this.frameworkUserPoller); + this.frameworkUserPoller = null; } - if (cachedUser) { - const user = JSON.parse(cachedUser) - if (user && typeof user === 'object') { - this.frameworkUser = user - if (this.frameworkUserPoller) { - window.clearInterval(this.frameworkUserPoller) - this.frameworkUserPoller = null - } - } - } - return - } catch (error) { - // 外部框架不可用时保留本地框架用户信息,避免影响页面使用。 - console.warn('[framework-auth] unable to load external user', error) } }, async logout() { @@ -127,19 +121,31 @@ export default { type: "warning", }) .then(() => { - sessionStorage.removeItem('joinbright-token'); - sessionStorage.removeItem('main_userInfo'); - sessionStorage.removeItem('main_joinbright_token'); - sessionStorage.removeItem('main_islogin'); + try { + sessionStorage.removeItem('joinbright-token'); + sessionStorage.removeItem('main_userInfo'); + sessionStorage.removeItem('main_joinbright_token'); + sessionStorage.removeItem('main_islogin'); + } catch (e) {} if (window.parent && window.parent !== window) { window.parent.postMessage(JSON.stringify({ event: { type: "LOGOUT" }, source: "xfdh" }), "*"); } - this.$store.dispatch("LogOut").then(() => { - location.href = "/index"; - }); + const toLoginPage = () => { + // 标记本次为主动退出:登录页不再自动登录,由用户手动输入账号密码 + try { sessionStorage.setItem('manual-login', '1'); } catch (e) {} + const base = (process.env.VUE_APP_PUBLIC_PATH || "/").replace(/\/+$/, ""); + location.href = base + "/login"; + }; + if (this.$store.getters.token) { + // 本系统登录的用户:调用后端注销后回到登录页,可切换其它账号登录 + this.$store.dispatch("LogOut").then(toLoginPage).catch(toLoginPage); + } else { + // 外部系统跳转进入:本地无token,清理后直接回登录页 + this.$store.dispatch("FedLogOut").then(toLoginPage).catch(toLoginPage); + } }) .catch(() => {}); } diff --git a/src/layout/components/Sidebar/Item.vue b/src/layout/components/Sidebar/Item.vue index f41760b..56d46c7 100644 --- a/src/layout/components/Sidebar/Item.vue +++ b/src/layout/components/Sidebar/Item.vue @@ -1,28 +1,27 @@