feat(detection): 添加检测锁机制防止多用户同时操作

- 新增 detectionLock store 管理检测锁状态
- 实现检测锁相关的弹窗提示功能
- 添加 DETECTION_BUSY 错误码处理多人竞争逻辑
- 在 websocket 中集成检测锁超时处理
- 修改程序源控制接口以同步锁状态
- 更新项目标题和图标配置
- 添加 docs 目录到忽略列表
This commit is contained in:
2026-05-28 20:44:53 +08:00
parent f9809197e8
commit 19ea08d5e0
12 changed files with 192 additions and 9 deletions

View File

@@ -0,0 +1,72 @@
import { ElMessage, ElMessageBox } from 'element-plus'
import type { DetectionLockHolder } from '@/stores/modules/detectionLock'
/**
* S1:他人正在做检测,自己抢锁被挡
*/
export const showLockBusyDialog = (holder: DetectionLockHolder) => {
ElMessageBox.confirm(
`${holder.holderUserName}」正在做检测,请稍后。`,
'检测进行中',
{
confirmButtonText: '观看检测视频教学',
cancelButtonText: '我知道了',
type: 'warning',
distinguishCancelAndClose: true,
customClass: 'detection-lock-busy-dialog'
}
)
.then(() => {
// 视频教学跳转 URL 暂未配置,先用 Toast 兜底
ElMessage.info('视频教学功能开发中,敬请期待')
})
.catch(() => {
// 用户点了"我知道了"或关闭,什么都不做
})
}
/**
* S2:未开始检测就调中间接口
*/
export const showLockNotStartedToast = () => {
ElMessage.warning('请先点击"开始检测"按钮启动本轮检测')
}
/**
* S3:自己暂停超 10 分钟,被 WS 推 STOP_TIMEOUT 强制结束
*/
export const showPauseTimeoutDialog = () => {
ElMessageBox.alert('暂停超过 10 分钟未恢复,系统已自动结束本次检测。\n\n如需继续,请重新发起检测。', '本次检测已结束', {
confirmButtonText: '我知道了',
type: 'warning'
}).catch(() => {})
}
/**
* S4:被管理员强制释放
* - holder 为 null → 强释后无人接手
* - holder 非 null → 强释后被别人立刻抢占
*/
export const showForceReleasedDialog = (holder: DetectionLockHolder | null) => {
if (holder) {
ElMessageBox.confirm(
`当前「${holder.holderUserName}」正在做检测,您无法继续检测,请稍后。`,
'检测已被中止',
{
confirmButtonText: '观看检测视频教学',
cancelButtonText: '我知道了',
type: 'warning',
distinguishCancelAndClose: true
}
)
.then(() => {
ElMessage.info('视频教学功能开发中,敬请期待')
})
.catch(() => {})
} else {
ElMessageBox.alert('您的检测已被管理员强制结束。\n如需继续,请重新发起检测。', '检测已被中止', {
confirmButtonText: '我知道了',
type: 'warning'
}).catch(() => {})
}
}