Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
1
合并请求
1
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
84a5fa39
提交
84a5fa39
authored
4月 13, 2026
作者:
付康
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'zz-dev' 到 'pre'
feat:给风险信号的dialog统一加背景模糊以及header的图片加一个margin-right:6px;完善登录及退出登录功能 查看合并请求
!335
上级
a6e7aeaa
2a5ddbf3
流水线
#427
已通过 于阶段
in 3 分 5 秒
变更
5
流水线
1
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
87 行增加
和
1 行删除
+87
-1
risk-signal-overview-detail-dialog.scss
...rviewDetailDialog/risk-signal-overview-detail-dialog.scss
+4
-0
index.vue
src/components/base/moduleHeader/index.vue
+2
-0
index.js
src/router/index.js
+55
-0
authCrossTabLogout.js
src/utils/authCrossTabLogout.js
+19
-0
index.vue
src/views/viewRiskSignal/index.vue
+7
-1
没有找到文件。
src/components/base/RiskSignalOverviewDetailDialog/risk-signal-overview-detail-dialog.scss
浏览文件 @
84a5fa39
...
...
@@ -5,6 +5,9 @@
justify-content
:
center
;
overflow
:
hidden
!
important
;
z-index
:
20000
!
important
;
background-color
:
rgba
(
0
,
0
,
0
,
0
.25
)
!
important
;
backdrop-filter
:
blur
(
30px
);
-webkit-backdrop-filter
:
blur
(
30px
);
}
.risk-signal-detail-modal
.el-overlay-dialog
{
...
...
@@ -218,6 +221,7 @@
.risk-signal-detail-dialog
.header-icon
{
width
:
32px
;
height
:
32px
;
margin-right
:
6px
;
}
.risk-signal-detail-dialog
.header-icon
img
{
...
...
src/components/base/moduleHeader/index.vue
浏览文件 @
84a5fa39
...
...
@@ -85,6 +85,7 @@ import { useRouter } from "vue-router";
import
{
useRoute
}
from
"vue-router"
;
import
{
getPersonType
}
from
"@/api/common/index"
;
import
request
,
{
removeToken
}
from
"@/api/request.js"
;
import
{
broadcastAuthLogout
}
from
"@/utils/authCrossTabLogout.js"
;
import
SearchBar
from
"@/components/layout/SearchBar.vue"
;
import
Menu1
from
"@/assets/icons/overview/menu1.png"
;
...
...
@@ -478,6 +479,7 @@ const handleUserCommand = async (command) => {
}
catch
{
// ignore
}
broadcastAuthLogout
();
try
{
window
.
sessionStorage
.
removeItem
(
"auth_token"
);
}
catch
{
...
...
src/router/index.js
浏览文件 @
84a5fa39
import
{
createRouter
,
createWebHistory
}
from
"vue-router"
;
import
{
setToken
,
removeToken
,
getToken
}
from
"@/api/request.js"
;
import
{
AUTH_LOGOUT_CHANNEL
}
from
"@/utils/authCrossTabLogout.js"
;
/** localStorage:跨标签页记录当前前端的 bootId(与 vite define 的 __APP_BOOT_ID__ 对齐) */
const
VITE_BOOT_STORAGE_KEY
=
"app_vite_boot_id"
;
...
...
@@ -241,5 +242,59 @@ router.beforeEach((to, from, next) => {
next
();
});
/**
* 在其它标签页/窗口退出登录时,本页立即跳转登录页(不依赖用户再点一次路由)。
* 1)storage:监听同源其它文档对 `force_login` 的写入
* 2)BroadcastChannel:与登出时的 `broadcastAuthLogout()` 配对,减少仅依赖 storage 的时序问题
*/
function
installCrossTabLogoutRedirect
()
{
if
(
typeof
window
===
"undefined"
)
{
return
;
}
const
redirectToLoginAfterRemoteLogout
=
()
=>
{
try
{
window
.
localStorage
.
setItem
(
FORCE_LOGIN_KEY
,
"1"
);
}
catch
{
// ignore
}
try
{
removeToken
();
window
.
localStorage
.
removeItem
(
"auth_token"
);
window
.
sessionStorage
.
removeItem
(
"auth_token"
);
}
catch
{
// ignore
}
try
{
if
(
router
.
currentRoute
.
value
.
path
!==
"/login"
)
{
router
.
replace
({
path
:
"/login"
,
replace
:
true
}).
catch
(()
=>
{});
}
}
catch
{
// ignore
}
};
window
.
addEventListener
(
"storage"
,
(
e
)
=>
{
if
(
e
.
key
!==
FORCE_LOGIN_KEY
||
e
.
newValue
!==
"1"
)
{
return
;
}
redirectToLoginAfterRemoteLogout
();
});
try
{
if
(
typeof
BroadcastChannel
!==
"undefined"
)
{
const
authBroadcast
=
new
BroadcastChannel
(
AUTH_LOGOUT_CHANNEL
);
authBroadcast
.
addEventListener
(
"message"
,
(
ev
)
=>
{
if
(
ev
?.
data
?.
type
===
"force_logout"
)
{
redirectToLoginAfterRemoteLogout
();
}
});
}
}
catch
{
// ignore
}
}
installCrossTabLogoutRedirect
();
export
default
router
;
src/utils/authCrossTabLogout.js
0 → 100644
浏览文件 @
84a5fa39
/** 与 `router/index.js` 中 BroadcastChannel 监听使用同一频道名 */
export
const
AUTH_LOGOUT_CHANNEL
=
"risk_monitor_auth"
;
/**
* 通知同源其它标签页/窗口:用户已退出,应立即进入登录页。
* 与 localStorage `force_login=1` 配合;发起退出的标签页在写入后调用一次即可。
*/
export
function
broadcastAuthLogout
()
{
try
{
if
(
typeof
BroadcastChannel
===
"undefined"
)
{
return
;
}
const
ch
=
new
BroadcastChannel
(
AUTH_LOGOUT_CHANNEL
);
ch
.
postMessage
({
type
:
"force_logout"
});
ch
.
close
();
}
catch
{
// ignore
}
}
src/views/viewRiskSignal/index.vue
浏览文件 @
84a5fa39
...
...
@@ -1288,7 +1288,6 @@ onMounted(async () => {
width
:
32px
;
height
:
32px
;
img
{
width
:
100%
;
height
:
100%
;
...
...
@@ -1397,6 +1396,9 @@ onMounted(async () => {
align-items
:
center
;
justify-content
:
center
;
overflow
:
hidden
!
important
;
background-color
:
rgba
(
0
,
0
,
0
,
0
.25
)
!
important
;
backdrop-filter
:
blur
(
30px
);
-webkit-backdrop-filter
:
blur
(
30px
);
}
.risk-signal-detail-modal
.el-overlay-dialog
{
...
...
@@ -1527,6 +1529,10 @@ onMounted(async () => {
position
:
relative
;
}
.risk-signal-detail-dialog
.header-icon
{
margin-right
:
6px
;
}
/* 顶部分隔线:替代原 header 底边框,宽度与底部分隔线一致(左右各多 16px) */
.
risk-signal-detail-dialog
.
el-dialog__header
:
:
after
{
content
:
""
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论