zzw
10 小时以前 3edc06d8b1e2449be45dbaa552f635eee72d1519
feat: load status dictionary from public assets
1个文件已添加
4个文件已修改
152 ■■■■■ 已修改文件
HANDOFF.md 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
emergency-repair-web/public/dict.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
emergency-repair-web/src/main.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
emergency-repair-web/src/utils/dict.js 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
requirement/交接文件_2026.10.3.md 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HANDOFF.md
@@ -854,6 +854,26 @@
- `.codex-run`、Office é”æ–‡ä»¶åŠ `emergency-repair-web/public/新建 æ–‡æœ¬æ–‡æ¡£.txt` ä»ä¸ºæœ¬åœ°ä¸´æ—¶æ–‡ä»¶ï¼Œä¸åº”提交。
- `emergency-repair-web/public/sensitive-words.json` æ˜¯ç”¨æˆ·æ—¢æœ‰æœªæäº¤ä¿®æ”¹ï¼Œæœ¬è½®ä¸çº³å…¥æäº¤ã€‚
## 28. æ”¶å°¾å¿«ç…§ï¼ˆ2026-10-07 å‘¨ä¸‰ï¼Œä¸šåŠ¡å­—å…¸æ”¹ä¸ºå‘å¸ƒåŽå¯ä¿®æ”¹ï¼‰
**实现方式**
- å°†ä»»åŠ¡çŠ¶æ€ã€å®Œå·¥çŠ¶æ€ã€éªŒæ”¶çŠ¶æ€å­—å…¸è¿ç§»åˆ° `emergency-repair-web/public/dict.js`,以 `window.__APP_DICT__` æš´éœ²è¿è¡Œæ—¶é…ç½®ã€‚
- åŽŸ `src/utils/dict.js` ä¿ç•™ä¸ºé€‚配层,提供内置兜底字典、运行时字典合并和加载函数;`src/main.js` åœ¨æŒ‚载应用前加载 `dict.js?ts=时间戳`,避免浏览器缓存旧字典。
- å‰ç«¯æž„建后文件位于 `dist/dict.js`。发布后直接修改该文件中的 `text`、`type` æˆ–状态项,刷新页面即可生效,无需重新执行 `npm run build`。
**主要文件**
- `emergency-repair-web/public/dict.js`
- `emergency-repair-web/src/utils/dict.js`
- `emergency-repair-web/src/main.js`
**验证结果**
- å‰ç«¯ `npm run build` é€šè¿‡ï¼Œ`dist/dict.js` æ­£å¸¸ç”Ÿæˆï¼Œä»…有既有包体积告警。
- ä¸´æ—¶å°† `public/dict.js` ä¸­ `UNREPORTED.text` æ”¹ä¸º `未上报[外部测试]`,不重新构建,仅刷新故障上报页面后筛选下拉立即显示新文字;恢复原值后刷新也立即恢复。
- æµè§ˆå™¨å®žé™…请求包含 `http://localhost:8082/dict.js?ts=...`;应用在字典加载完成后再挂载,接口不可用时仍使用内置兜底字典。
**发布后操作**
- ç¼–辑部署目录中的 `dist/dict.js`,保存后刷新浏览器即可。不要再重新构建前端,否则会用当前源码字典覆盖手工修改。
## 21. æ”¶å°¾å¿«ç…§ï¼ˆ2026-10-06 å‘¨ä¸€ï¼Œéœ€æ±‚ 21 æƒé™è®¾ç½®èŒƒå›´åˆ‡æ¢ï¼‰
**本轮完成内容**
emergency-repair-web/public/dict.js
New file
@@ -0,0 +1,33 @@
/*
 * è¿è¡Œæ—¶ä¸šåŠ¡å­—å…¸ã€‚
 * å‘布后可直接修改部署目录中的 dist/dict.js,刷新页面即可生效,无需重新构建前端。
 */
window.__APP_DICT__ = {
  taskStatuses: {
    UNREPORTED: { text: '未上报', type: 'info' },
    REPORTED_XCB: { text: '已上报rk_XCB', type: 'warning' },
    RETURNED: { text: '上级打回', type: 'danger' },
    XCB_REVIEWED: { text: 'rk_XCB助理审核完成', type: 'primary' },
    CMB_APPROVED: { text: 'rk_CMB领导审批完成', type: 'success' },
    JCC_ASSISTANT_APPROVED: { text: 'rk_JCC助理审批完成', type: 'success' },
    JCC_DIRECTOR_APPROVED: { text: 'rk_JCC处长已阅', type: 'success' },
    DISPATCHED: { text: '已派单', type: 'primary' },
    CANCELLED: { text: '已销项', type: 'info' }
  },
  completionStatuses: {
    UNFINISHED: { text: '未完工', type: 'info' },
    WAIT_PARTS: { text: '待备件', type: 'warning' },
    WAIT_TEST: { text: '完工待试验', type: 'primary' },
    COMPLETED: { text: '完工', type: 'success' }
  },
  acceptanceStatuses: {
    APPLICATION_PENDING: { text: '待提交验收申请', type: 'warning' },
    QUALITY_INSPECTOR_PENDING: { text: '待质检员验收', type: 'primary' },
    QUALITY_LEADER_PENDING: { text: '待质检负责人验收', type: 'primary' },
    PRINT_PENDING: { text: '待打印输出', type: 'warning' },
    RATING_PENDING: { text: '待修后质量评级', type: 'warning' },
    COMPLETED: { text: '验收完成', type: 'success' },
    RETURNED_APPLICATION: { text: '已打回验收申请', type: 'danger' },
    RETURNED_INSPECTOR: { text: '已打回质检员验收', type: 'danger' }
  }
}
emergency-repair-web/src/main.js
@@ -5,6 +5,7 @@
import router from './router'
import './styles/global.css'
import { installSensitiveWords } from './utils/sensitive'
import { loadDictionary } from './utils/dict'
Vue.use(ElementUI, { size: 'small' })
Vue.config.productionTip = false
@@ -31,9 +32,11 @@
  }
})
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')
loadDictionary().then(() => {
  new Vue({
    router,
    render: h => h(App)
  }).$mount('#app')
installSensitiveWords()
  installSensitiveWords()
})
emergency-repair-web/src/utils/dict.js
@@ -1,4 +1,4 @@
export const taskStatuses = {
const defaultTaskStatuses = {
  UNREPORTED: { text: '未上报', type: 'info' },
  REPORTED_XCB: { text: '已上报rk_XCB', type: 'warning' },
  RETURNED: { text: '上级打回', type: 'danger' },
@@ -10,14 +10,14 @@
  CANCELLED: { text: '已销项', type: 'info' }
}
export const completionStatuses = {
const defaultCompletionStatuses = {
  UNFINISHED: { text: '未完工', type: 'info' },
  WAIT_PARTS: { text: '待备件', type: 'warning' },
  WAIT_TEST: { text: '完工待试验', type: 'primary' },
  COMPLETED: { text: '完工', type: 'success' }
}
export const acceptanceStatuses = {
const defaultAcceptanceStatuses = {
  APPLICATION_PENDING: { text: '待提交验收申请', type: 'warning' },
  QUALITY_INSPECTOR_PENDING: { text: '待质检员验收', type: 'primary' },
  QUALITY_LEADER_PENDING: { text: '待质检负责人验收', type: 'primary' },
@@ -28,6 +28,62 @@
  RETURNED_INSPECTOR: { text: '已打回质检员验收', type: 'danger' }
}
export const taskStatuses = { ...defaultTaskStatuses }
export const completionStatuses = { ...defaultCompletionStatuses }
export const acceptanceStatuses = { ...defaultAcceptanceStatuses }
function normalizeDictionary(source, fallback) {
  if (!source || typeof source !== 'object' || Array.isArray(source)) {
    return fallback
  }
  const result = {}
  Object.keys(source).forEach(key => {
    const item = source[key]
    if (item && typeof item === 'object' && item.text) {
      result[key] = {
        text: String(item.text),
        type: item.type ? String(item.type) : 'info'
      }
    }
  })
  return Object.keys(result).length ? result : fallback
}
function replaceDictionary(target, source) {
  Object.keys(target).forEach(key => { delete target[key] })
  Object.keys(source).forEach(key => { target[key] = source[key] })
}
function applyRuntimeDictionary() {
  const runtime = window.__APP_DICT__ || {}
  replaceDictionary(taskStatuses, normalizeDictionary(runtime.taskStatuses, defaultTaskStatuses))
  replaceDictionary(completionStatuses, normalizeDictionary(runtime.completionStatuses, defaultCompletionStatuses))
  replaceDictionary(acceptanceStatuses, normalizeDictionary(runtime.acceptanceStatuses, defaultAcceptanceStatuses))
}
let loadingPromise = null
export function loadDictionary() {
  if (loadingPromise) {
    return loadingPromise
  }
  loadingPromise = new Promise(resolve => {
    const script = document.createElement('script')
    const baseUrl = process.env.BASE_URL || '/'
    script.async = true
    script.src = baseUrl + 'dict.js?ts=' + Date.now()
    script.onload = () => {
      applyRuntimeDictionary()
      resolve()
    }
    script.onerror = () => resolve()
    document.head.appendChild(script)
  })
  return loadingPromise
}
export function statusMeta(dict, value) {
  return dict[value] || { text: value || '-', type: 'info' }
}
requirement/½»½ÓÎļþ_2026.10.3.md
@@ -815,3 +815,27 @@
- å½“前前端 PID `57312`,监听 `http://localhost:8082`;后端 PID `56124`,监听 `http://127.0.0.1:8091`;DM8 `127.0.0.1:5236`;Edge CDP `9222`;登录 `admin / admin123`。
- `.codex-run`、Office é”æ–‡ä»¶åŠ `emergency-repair-web/public/新建 æ–‡æœ¬æ–‡æ¡£.txt` ä»ä¸ºæœ¬åœ°ä¸´æ—¶æ–‡ä»¶ï¼Œä¸åº”提交。
- `emergency-repair-web/public/sensitive-words.json` æ˜¯ç”¨æˆ·æ—¢æœ‰æœªæäº¤ä¿®æ”¹ï¼Œæœ¬è½®ä¸çº³å…¥æäº¤ã€‚
## äºŒåäºŒã€2026-10-07 ä¸šåŠ¡å­—å…¸æ”¹ä¸ºå‘å¸ƒåŽå¯ä¿®æ”¹
| éœ€æ±‚ | çŠ¶æ€ | å®žçް |
| --- | --- | --- |
| `dict.js` ç§»åˆ° `public`,发布后仍可修改 | å·²å®Œæˆ | æ–°å¢ž `public/dict.js` ä¿å­˜ä»»åŠ¡ã€å®Œå·¥ã€éªŒæ”¶çŠ¶æ€å­—å…¸ï¼Œé€šè¿‡ `window.__APP_DICT__` æš´éœ²ï¼›`src/utils/dict.js` ä½œä¸ºåŠ è½½å’Œå…œåº•é€‚é…å±‚ï¼›åº”ç”¨å¯åŠ¨å‰æŒ‰æ—¶é—´æˆ³åŠ è½½ï¼Œæž„å»ºåŽå¯¹åº”æ–‡ä»¶ä¸º `dist/dict.js` |
### 22.1 ä¸»è¦å˜æ›´æ–‡ä»¶
- `emergency-repair-web/public/dict.js`
- `emergency-repair-web/src/utils/dict.js`
- `emergency-repair-web/src/main.js`
### 22.2 éªŒè¯ç»“æžœ
- å‰ç«¯ `npm run build` é€šè¿‡ï¼Œ`dist/dict.js` æ­£å¸¸ç”Ÿæˆï¼Œä»…有既有包体积告警。
- ä¸´æ—¶ä¿®æ”¹ `public/dict.js` çš„“未上报”文字后,不重新构建,仅刷新故障上报页面即生效;恢复后刷新也立即恢复。
- é¡µé¢èµ„源请求包含 `/dict.js?ts=...`,发布后修改文件不会被旧缓存阻塞。
### 22.3 å‘布后维护说明
- ç”Ÿäº§çŽ¯å¢ƒç›´æŽ¥ç¼–è¾‘éƒ¨ç½²ç›®å½•ä¸­çš„ `dist/dict.js`,可修改状态显示文字和 `type`,刷新页面生效。
- ä¸è¦é‡æ–°æ‰§è¡Œå‰ç«¯æž„建,否则当前 `public/dict.js` ä¼šå†æ¬¡è¦†ç›–部署目录中的修改。
- `dict.js` ä¸å¯ç”¨æˆ–字段非法时,应用继续使用源码内置字典,不影响页面启动。