hongrunxia 6 napja
szülő
commit
7e9858ecac

+ 3 - 3
.env

@@ -29,9 +29,9 @@ VITE_CACHE_CIPHER_IV_CHAR_CODE=64,49,49,49,49,49,48,48,48,48,48,49,49,49,49,95
 VITE_LOGIN_CIPHER_KEY_CHAR_CODE=95,49,49,49,49,49,48,48,48,48,48,49,49,49,49,64
 VITE_LOGIN_CIPHER_IV_CHAR_CODE=64,49,49,49,49,49,48,48,48,48,48,49,49,49,49,95
 
-# [SEC-20260913] mock-login 免密通道已剥离:原 VITE_MOCK_LOGIN_USERNAME_CHAR_CODE / VITE_MOCK_LOGIN_PASSWORD_CHAR_CODE
-# 两行(一组硬编码免密凭据)已随通道下线删除;mockLogin 在生产构建期不可达(见 src/store/modules/user.ts),
-# src/store/constant.ts 对缺失 env 读取返回空串、不抛错,无需保留占位。
+# Mock登录用户名/密码 — 使用 charCode 方式
+VITE_MOCK_LOGIN_USERNAME_CHAR_CODE=97,117,116,111,65,100,109,105,110
+VITE_MOCK_LOGIN_PASSWORD_CHAR_CODE=97,117,116,111,65,100,109,105,110,49,50,51
 
 # 签名密钥串(前后端要一致) — 使用 charCode 方式
 VITE_SIGNATURE_SECRET_CHAR_CODE=100,100,48,53,102,49,99,53,52,100,54,51,55,52,57,101,100,97,57,53,102,57,102,97,54,100,52,57,118,52,52,50,97

+ 2 - 5
public/fileEdit.html

@@ -7,11 +7,8 @@
 <body>
 
 <div id="fileEdit"></div>
-<!--// 页面引入document的api.js([SEC-20260913] 原硬编码 OnlyOffice 服务地址死链改为运行时配置下发:onlyOfficeUrl 反代前缀,与 src/utils/onlyOffice.ts 同约定)-->
-<script type="text/javascript" src="/js/config.js"></script>
-<script type="text/javascript">
-    document.write('<script type="text/javascript" src="' + ((typeof VUE_APP_URL !== 'undefined' && VUE_APP_URL.onlyOfficeUrl) || '/documents') + '/web-apps/apps/api/documents/api.js"><\/script>');
-</script>
+<!--// 页面引入document的api.js-->
+<script type="text/javascript" src="http://47.94.222.6:9050/web-apps/apps/api/documents/api.js"></script>
 <script>
 
     //office文件在线编辑、预览

+ 2 - 2
public/mxcad/mxServerConfig.json

@@ -23,8 +23,8 @@
 	"mxfilepath": "/mxcad/file/",
 	"?saveUrl": "保存文件服务地址",
 	"saveUrl": "http://localhost:1337/mxcad/savemxweb",
-	"?saveDwgUrl": "保存DWG文件服务地址(SEC-20260913-R2: 原为 http://182.92.126.35:8092/modelreq/... 硬编码 IP;现为 /modelreq 站点相对路径,同源经 nginx 反代网关,换部署环境无需改代码)",
-	"saveDwgUrl": "/modelreq/safety/cadFile/transformCadFileType",
+	"?saveDwgUrl": "保存DWG文件服务地址",
+	"saveDwgUrl": "http://182.92.126.35:8092/modelreq/safety/cadFile/transformCadFileType",
 	"?printPdfUrl": "把指定范围输出到pdf的服务地址",
 	"printPdfUrl": "http://localhost:1337/mxcad/print_to_pdf",
     "?cutDwgUrl": "把指定范围输出到DWG的服务地址",

+ 0 - 12
src/hooks/vent/useAutoLogin.ts

@@ -52,18 +52,6 @@ export function useAutoLogin() {
     const { realname, workNo } = route.query;
     if (!realname || !workNo) return;
 
-    // [SEC-20260913-R3] 票据未配置时不发起必失败的 /sys/autoLogin 请求:
-    // 摘除 auto-login query 后按未登录态放行(query 对象语义下 path 串内 query 被 vue-router 丢弃,不会循环),
-    // 守卫后续分支转正常 SSO/登录页(与 mock-login 剥离一致的降级风格);配置票据后行为不变。
-    const autoLoginToken = typeof VUE_APP_URL !== 'undefined' ? VUE_APP_URL.autoLoginToken : '';
-    if (!autoLoginToken) {
-      console.warn('[security] 自动登录票据未配置(VUE_APP_URL.autoLoginToken),跳过 /sys/autoLogin 请求,转正常登录流程');
-      delete route.query[AUTO_LOGIN_URL_QUERY.key];
-      delete route.query['realname'];
-      delete route.query['workNo'];
-      return;
-    }
-
     const params = {
       username: realname as string,
       workNo: workNo as string,

+ 2 - 4
src/layouts/default/header/components/VoiceBroadcast.vue

@@ -58,7 +58,6 @@
   import { usePermissionStore } from '/@/store/modules/permission';
   import SpeakVoice from './notify/speakVoice';
   import { useDrag } from '@/hooks/event/useDrag';
-  import { useGlobSetting } from '/@/hooks/setting';
   import dayjs from 'dayjs';
   export default defineComponent({
     name: 'VoiceBroadcast',
@@ -71,7 +70,6 @@
       const { hasPermission } = usePermission();
       const permissionStore = usePermissionStore();
       const router = useRouter();
-      const glob = useGlobSetting();
       const list = (params) => defHttp.get({ url: '/safety/ventanalyAlarmLog/list', params });
       const cleanAlarm = () => defHttp.get({ url: '/safety/ventanalyAlarmLog/cleanAlarmLog' });
       const activeKey = ref(0);
@@ -132,8 +130,8 @@
         let userId = unref(userStore.getUserInfo).id + '?token=' + token;
         console.log(userStore.getUserInfo, 'userId---');
         // WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https
-        // [SEC-20260913] 端点改读运行时配置 glob.wsUrl(public/js/config.js 单点),去掉 :9999 硬编码
-        let url = glob.wsUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
+        // let url = glob.wsUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
+        let url = 'http://' + window.location.hostname + ':9999'?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
         console.log(url, 'url------');
         connectWebSocket(url);
         onWebSocket(onWebSocketMessage);

+ 1 - 4
src/layouts/default/header/components/VoiceBroadcastGsd.vue

@@ -47,7 +47,6 @@
   import dayjs from 'dayjs';
 
   import { useDrag } from '@/hooks/event/useDrag';
-  import { useGlobSetting } from '/@/hooks/setting';
   export default defineComponent({
     name: 'VoiceBroadcast',
     components: { SoundOutlined, ClearOutlined, BellOutlined, WarningOutlined, CloseOutlined },
@@ -59,7 +58,6 @@
       const { hasPermission } = usePermission();
       const permissionStore = usePermissionStore();
       const router = useRouter();
-      const glob = useGlobSetting();
       const activeKey = ref(0);
       const isShowWarningBroad = ref(false);
       const isBroad = ref(false);
@@ -101,8 +99,7 @@
         // let userId = unref(userStore.getUserInfo).id + '_' + wsClientId;
         let userId = unref(userStore.getUserInfo).id + '?token=' + token;
         // WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https
-        // [SEC-20260913] 端点改读运行时配置 glob.wsUrl(public/js/config.js 单点),去掉 :9999 硬编码
-        let url = glob.wsUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
+        let url = 'http://' + window.location.hostname + ':9999'?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
         connectWebSocket(url);
         onWebSocket(onWebSocketMessage);
       }

+ 0 - 5
src/qiankun/index.ts

@@ -35,11 +35,6 @@ const mountMicroApp = (name, isReFresh = false) => {
   }
 };
 
-// [SEC-20260913] 决策记录(用户 2026-09-13 定调:"恢复/回滚类改动以仓库现状为准",见 AGENTS.md §五):
-// 本函数曾在本分支 d8c0419b 恢复 fix-subapp-loading 的卸载竞态修复(顺序 await 逐个卸载 + 清理注册表),
-// 但用户实测恢复会引入其它问题,已由 89fb45e9 撤销,文件与 master(bd9f73ff,即 3621a200 覆盖版)完全一致,本轮不再改动。
-// 已知隐患(master 现状,暂不修,仅记录):multipleApp.some 为函数引用恒真;filter(async) 回调内的 await 不被任何方等待,
-// 卸载是"发射后不管",子应用切页互清场景可能旧新实例并存。如需再评估,须先做两子应用切换的回归验证。
 const unmountMicroApps = async (multipleApp) => {
   if (JSON.stringify(activeApps) !== '{}' && multipleApp.some) {
     for (const key in activeApps) {

+ 4 - 3
src/router/guard/permissionGuard.ts

@@ -90,10 +90,11 @@ export function createPermissionGuard(router: Router) {
       await doTokenLogin(tokenStr);
       return next({ path: to.fullPath, replace: true, query: to.query });
     }
-    // 【SEC-20260913】mock-login 免密通道已剥离:不再调用 mockLogin,仅告警并跳转正常登录页
+    // 如果指定了需要模拟登录则执行模拟登录,覆盖原有的登录信息
     if (to.query[MOCK_LOGIN_URL_QUERY.key] === MOCK_LOGIN_URL_QUERY.val) {
-      console.warn('[security] mock-login 免密通道已禁用,跳转登录页');
-      return next({ path: LOGIN_PATH, replace: true });
+      await userStore.mockLogin({ goHome: false });
+      delete to.query[MOCK_LOGIN_URL_QUERY.key];
+      return next({ path: to.fullPath, replace: true, query: to.query });
     }
 
     const token = userStore.getToken;

+ 0 - 5
src/store/modules/user.ts

@@ -373,11 +373,6 @@ export const useUserStore = defineStore({
         successMode?: SuccessMessageMode;
       } = {}
     ) {
-      // 【SEC-20260913】生产构建期剥离:import.meta.env.PROD 为构建期常量,生产产物中以下登录分支不可达
-      if (import.meta.env.PROD) {
-        console.warn('[security] mockLogin 免密通道在生产环境不可用');
-        return Promise.reject(new Error('mockLogin is disabled in production'));
-      }
       try {
         const loginParams = {
           username: MOCK_LOGIN_UESRNAME,

+ 1 - 3
src/utils/domUtils.ts

@@ -171,11 +171,10 @@ export function useRafThrottle<T extends FunctionArgs>(fn: T): T {
   };
 }
 
-export function resetMicroContentWH(domId, callBack?: Function, onTimeout?: Function, maxWaitMs = 60000) {
+export function resetMicroContentWH(domId, callBack?: Function, maxWaitMs = 60000) {
   // [fix-subapp-loading] 增加超时兜底:原实现每秒无限轮询等待微应用容器出现内容,
   // 微应用挂载失败/被卸载时容器永远为空 → 加载遮罩永久转圈(整页"正在加载"卡死,见 docs/17 §8)。
   // 超时后强制放行(隐藏遮罩),把"整页永久卡死"降级为"页面可见但内容可能缺失"。
-  // [SEC-20260913] 增加 onTimeout 回调:超时不再静默放行,由容器进入错误态 UI 并提供重试。
   const start = Date.now();
   let done = false;
   const poll = () => {
@@ -189,7 +188,6 @@ export function resetMicroContentWH(domId, callBack?: Function, onTimeout?: Func
     } else if (Date.now() - start >= maxWaitMs) {
       done = true;
       console.error('[fix-subapp-loading] 微应用容器等待超时,强制放行:', domId);
-      if (onTimeout) onTimeout();
       if (callBack) callBack();
     } else {
       setTimeout(poll, 1000);

+ 3 - 9
src/views/vent/home/configurable/configurable.data.ts

@@ -6510,9 +6510,7 @@ export const testConfigVent182: Config[] = [
       background: {
         show: true,
         type: 'video',
-        // SEC-20260913-R2: 原为 'http://182.92.126.35:8092/modelreq/sys/common/static/webfile/mainFan.mp4'(写死旧云环境 IP:端口);
-        // 改为站点相对路径,因为同源经 nginx /modelreq 反代网关即可达,去硬编码后换部署环境无需改代码
-        link: '/modelreq/sys/common/static/webfile/mainFan.mp4',
+        link: 'http://182.92.126.35:8092/modelreq/sys/common/static/webfile/mainFan.mp4',
       },
       layout: {
         direction: 'column',
@@ -6583,9 +6581,7 @@ export const testConfigVent182: Config[] = [
       background: {
         show: true,
         type: 'video',
-        // SEC-20260913-R2: 原为 'http://182.92.126.35:8092/modelreq/sys/common/static/webfile/fanLocal.mp4'(写死旧云环境 IP:端口);
-        // 改为站点相对路径,因为同源经 nginx /modelreq 反代网关即可达,去硬编码后换部署环境无需改代码
-        link: '/modelreq/sys/common/static/webfile/fanLocal.mp4',
+        link: 'http://182.92.126.35:8092/modelreq/sys/common/static/webfile/fanLocal.mp4',
       },
       layout: {
         direction: 'column',
@@ -6656,9 +6652,7 @@ export const testConfigVent182: Config[] = [
       background: {
         show: true,
         type: 'video',
-        // SEC-20260913-R2: 原为 'http://182.92.126.35:8092/modelreq/sys/common/static/webfile/gate.mp4'(写死旧云环境 IP:端口);
-        // 改为站点相对路径,因为同源经 nginx /modelreq 反代网关即可达,去硬编码后换部署环境无需改代码
-        link: '/modelreq/sys/common/static/webfile/gate.mp4',
+        link: 'http://182.92.126.35:8092/modelreq/sys/common/static/webfile/gate.mp4',
       },
       layout: {
         direction: 'row',

+ 2 - 5
src/views/vent/home/configurable/fireBD.vue

@@ -34,13 +34,10 @@
       </div>
     </div>
     <div class="right-t">
-      <!-- SEC-20260913: 原为 redirectTo('/grout-home?mock-login=1') / redirectTo('/nitrogen-home?mock-login=1')
-           (新标签页打开子系统时借 mock-login 免密通道自动登录);改为不带该参数,因为 mock-login 免密通道已剥离
-           (permissionGuard 命中 mock-login 参数仅告警并转正常登录页),继续携带只会触发安全告警跳转 -->
-      <div class="tcontent-l" @click="redirectTo('/grout-home')">
+      <div class="tcontent-l" @click="redirectTo('/grout-home?mock-login=1')">
         <div>智能注浆系统</div>
       </div>
-      <div class="tcontent-r" @click="redirectTo('/nitrogen-home')">
+      <div class="tcontent-r" @click="redirectTo('/nitrogen-home?mock-login=1')">
         <div>智能注氮系统</div>
       </div>
     </div>

+ 2 - 5
src/views/vent/home/configurable/green/fire-green.vue

@@ -24,13 +24,10 @@
         </div>
       </div>
       <div class="right-t">
-        <!-- SEC-20260913: 原为 redirectTo('/grout-home?mock-login=1') / redirectTo('/nitrogen-home?mock-login=1')
-             (新标签页打开子系统时借 mock-login 免密通道自动登录);改为不带该参数,因为 mock-login 免密通道已剥离
-             (permissionGuard 命中 mock-login 参数仅告警并转正常登录页),继续携带只会触发安全告警跳转 -->
-        <div class="tcontent-l" @click="redirectTo('/grout-home')">
+        <div class="tcontent-l" @click="redirectTo('/grout-home?mock-login=1')">
           <div>智能注浆系统</div>
         </div>
-        <div class="tcontent-r" @click="redirectTo('/nitrogen-home')">
+        <div class="tcontent-r" @click="redirectTo('/nitrogen-home?mock-login=1')">
           <div>智能注氮系统</div>
         </div>
       </div>