diff --git a/docs/UI橙色主题与交互顺序调整记录.md b/docs/UI橙色主题与交互顺序调整记录.md index f1bcffd..15ff182 100644 --- a/docs/UI橙色主题与交互顺序调整记录.md +++ b/docs/UI橙色主题与交互顺序调整记录.md @@ -1,4 +1,4 @@ -# UI 橙色主题与交互顺序调整记录 +# UI 橙色主题与交互顺序调整记录 ## 1. 变更背景 @@ -32,7 +32,8 @@ ### 2.2 按钮与弹窗按钮视觉顺序 -已统一主按钮视觉优先级,使确认类按钮更突出。 +已统一主按钮的视觉优先级,使确认类按钮更突出。 + 其中弹窗/抽屉底部操作区通过样式顺序优化为主按钮优先展示,但未改动原始点击逻辑。 ## 3. 暗夜模式取消 @@ -98,7 +99,8 @@ ## 6. 侧边栏折叠态图标居中修复 -在橙色样式改造后,发现侧边栏收起状态下图标未居中。 +在橙色样式改造后,发现侧边栏收起状态下图标未居中。 + 原因是旧实现依赖固定 `margin-left` 偏移,无法适配新的侧边栏宽度、内边距和圆角布局。 处理方式: @@ -123,7 +125,7 @@ /> ``` -存在“弹窗本体在遮罩层下方、展示不全且无法点击”的问题。 +存在“弹窗本体在遮罩层下方、显示不全且无法点击”的问题。 ### 7.1 原因 @@ -149,12 +151,13 @@ ### 7.2.1 `bank-balance/table` 页面补充修复 -后续排查发现 `views/user/bank-balance/table` 页面仍存在同类问题。 +后续排查发现 `views/user/bank-balance/table` 页面仍存在同类问题。 + 该页面内不仅有列表页内联弹窗,还包含开户弹窗、流水弹窗、导入弹窗等多个 `el-dialog`,其中部分弹窗未挂载到 `body`,因此在页面容器和遮罩层共同作用下,依旧会出现弹窗被压在遮罩层下方、无法完整展示和点击的问题。 本次补充修复范围: -- 发送/扣除弹窗 +- 发放/扣除弹窗 - 转账弹窗 - 导入数据弹窗 - 开户弹窗 `form-edit.vue` @@ -246,7 +249,7 @@ $env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod ### 11.3 复扫结论 -批量修复后,已再次对仓库内 `el-dialog` 与 `el-drawer` 做缺失项扫描,当前未再发现这类“未挂载到 body 导致遮罩层层级异常”的遗漏项。 +批量修复后,已再次对仓库内 `el-dialog` 与 `el-drawer` 做缺失项扫描,当前未再发现这类“未挂载到 `body` 导致遮罩层级异常”的遗漏项。 ### 11.4 验证情况 @@ -261,6 +264,7 @@ $env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod - 构建通过 - 仍存在项目原有 warning - 本轮弹窗挂载层级修复未引入新的构建错误 + ## 12. 批量弹窗修复后的重复属性问题记录 ### 12.1 问题现象 @@ -278,16 +282,16 @@ duplicate attribute: :append-to-body ### 12.2 原因 -上一轮批量补齐弹窗/抽屉挂载属性时,少数原本已经存在以下配置的组件被重复插入了一组属性: +上一轮批量补齐弹窗/抽屉挂载属性时,少数组件原本已经存在以下配置,却又被重复插入了一组: - `:modal-append-to-body="true"` - `:append-to-body="true"` -Vue 模板不允许同一个标签上出现重复属性,因此构建阶段直接报错。 +Vue 模板不允许同一个标签出现重复属性,因此构建阶段会直接报错。 ### 12.3 修复范围 -全仓扫描后发现重复项仅存在于以下文件: +全仓扫描后发现重复项存在于以下文件: - `src/views/dashboard/components/user-daily-currency-gold-top/index.vue` - `src/layout/components/Navbar.vue` @@ -321,9 +325,24 @@ $env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:atu-prod 结果: - 构建通过 -- 未再出现 duplicate attribute 模板编译错误 -- 仍存在项目原有 lint warning / eslint warning,与本次重复属性修复无关 +- 未再出现 `duplicate attribute` 模板编译错误 +- 仍存在项目原有 `lint warning / eslint warning`,与本次重复属性修复无关 ### 12.6 后续注意事项 -后续如继续做批量模板属性处理,需要先解析单个 `el-dialog` / `el-drawer` 标签块内是否已经存在目标属性,避免按文件级别判断导致重复插入。 \ No newline at end of file +后续如继续做批量模板属性处理,需要先解析单个 `el-dialog` / `el-drawer` 标签块内是否已经存在目标属性,避免按文件级别判断导致重复插入。 + +## 13. `NavbarLight.vue` 后续收口记录 + +在后续排查 `NavbarLight.vue` 生成后的实际使用情况时,对 Navbar 和导航搜索做了一次一致性收口: + +- 确认 `src/layout/index.vue` 真正使用的 `Navbar` 来自 `src/layout/components/index.js`,而其导出实际指向 `NavbarLight.vue` +- 原有 `src/layout/components/Navbar.vue` 已无实际引用,因此已删除,避免后续维护中出现同名导航栏文件的混淆 +- 修改 `src/components/HeaderSearch/index.vue` 的 `generateRoutes()` 逻辑,让导航栏搜索更倾向于真正可进入的页面路由 +- 新增对“仍有可见子菜单的容器路由”的过滤,避免搜索到一级/二级菜单壳路由后点击进入空白页面 + +验证情况: + +- 已执行 `npm run build:prod` +- 构建通过 +- 项目原有 warning 仍存在,但本次 `Navbar/Search` 收口未引入新的构建错误 diff --git a/docs/i18n/主要路由.md b/docs/i18n/主要路由.md index d735f1a..1780952 100644 --- a/docs/i18n/主要路由.md +++ b/docs/i18n/主要路由.md @@ -6,6 +6,7 @@ - 本文件用于把 `src/permission.js` 中 `store.dispatch('user/getMenus')` 的接口返回结果整理成便于国际化领取、验收和运行检查的父子级路由清单 - 需要查看主要路由的中文名、英文名、路由别名、路径、入口文件、完成状态时,统一以本文件为准 - 本文件中的菜单层级不默认限制为“父级 > 子级”两层,若实际菜单存在三级结构,则按真实父链整理 +- 路由是否记为独立菜单,先以原始接口返回为准;若入口页再直接引用同目录多个 `.vue` 文件,则这些文件记为页面内功能文件,不单独记成并列主路由 - 后续所有线程领取新任务前,除了读取 `线程协作.md`、`翻译进度.md`、`翻译清单.md`,还应先读取本文件 - 其他文档不再重复维护完整主路由树,最多保留摘要并引用本文件 - 下方保留原始接口返回,顶部摘要用于实际执行 @@ -13,11 +14,11 @@ ### 全线程统一优先级 - 适用于所有线程,不只线程三 -- 统一领取优先级:`已完成 src/views 页面私有组件复查 > 首页 > 本文件中的主要路由页面 > 其他路由页面` +- 统一领取优先级:`已完成 src/views 页面私有组件复查 > 首页 > 本文件中的主要路由页面` - 在“已完成 `src/views` 页面私有组件复查”完成前,暂不继续领取新的未完成普通页面 - 只要首页或本文件中的主要路由页面还有未完成项,后续线程都应优先从这两部分中选择 - 本文件中的主要路由页面之间,具体先领哪一个页面仍可按原来的方式灵活分配,只要先读 md、先写认领、避免冲突 -- 只有当首页和本文件中的主要路由页面全部处理完成后,才进入其他路由页面 +- 自 2026-04-22 起,后续翻译范围只保留本文件中的主要路由页面及其直接涉及组件;其他路由页面不再继续纳入新增翻译任务 ### 首页 @@ -52,9 +53,61 @@ ### 当前进行中的主要路由 -- 当前无 +- 系统管理 / System Management + - App系统 / App System + - 版本管理 / Version Management + - 路由别名:`sugartime:version` + - 路径:`version/app/index` + - 进行中文件: + - `src/views/version/app/index.vue` + - `src/views/version/app/app-version-edit.vue` + - `src/views/version/app/app-update-content.vue` + - 状态:进行中(线程三) -### 已完成主要路由总览 +### 当前接口返回的主要路由树(整理版) + +- 系统管理 / System Management + - 路由别名:`SystemManager` + - 用户管理 / User Management + - 路由别名:`sys:user:list` + - 路径:`sys/user-manager/index` + - 状态:待处理 + - 角色管理 / Role Management + - 路由别名:`sys:role:list` + - 路径:`sys/role-manager/index` + - 状态:待处理 + - 菜单管理 / Menu Management + - 路由别名:`sys:menu:list` + - 路径:`sys/menu-manager/index` + - 状态:待处理 + - 资源管理 / Resource Management + - 路由别名:`sys:resource:list` + - 路径:`sys/resources-manager/index` + - 状态:待处理 + - App系统 / App System + - 路由别名:`app:sys:manager` + - 状态:部分完成 + - 版本管理 / Version Management + - 路由别名:`sugartime:version` + - 路径:`version/app/index` + - 进行中文件: + - `src/views/version/app/index.vue` + - `src/views/version/app/app-version-edit.vue` + - `src/views/version/app/app-update-content.vue` + - 状态:进行中(线程三) + - APP运行日志 / APP Runtime Logs + - 路由别名:`Breakdown` + - 路径:`log/breakdown/index` + - 状态:待处理 + - IM通讯 / IM Communication + - 路由别名:`ExternalIm` + - 路径:`external/im` + - 状态:待处理 + - 请求黑名单 / Request Blacklist + - 路由别名:`request:blacklist` + - 路径:`sys/request-blacklist/index` + - 文件:`src/views/sys/request-blacklist/index.vue` + - 状态:已完成 - 用户管理 / User Management - 路由别名:`AppUserManager` @@ -63,28 +116,121 @@ - 路径:`user/user-table/index` - 文件:`src/views/user/user-table/index.vue` - 状态:已完成 + - 用户专属礼物制作 / User Custom Gift Creation + - 路由别名:`UserCustomGift` + - 路径:`user/custom-gift/index` + - 文件:`src/views/user/custom-gift/index.vue` + - 状态:已完成 + - 封禁设备列表 / Banned Device List + - 路由别名:`ArchiveDevice` + - 路径:`log/archive-device/index` + - 状态:待处理 + - 最新登记设备 / Latest Registered Devices + - 路由别名:`UserDevice` + - 路径:`user/user-device/index` + - 状态:待处理 + - 运营管理 / Operations Management - 路由别名:`OperationManager` + - 营收支出 / Revenue and Expenses + - 路由别名:`AppRevenue` + - 状态:待处理 - 数据配置 / Data Configuration - 路由别名:`data:conf` - - 转盘抽奖品配置 / Spin Wheel Prize Configuration - - 路由别名:`cnf:lottery` - - 路径:`cnf/lottery/index` - - 文件:`src/views/cnf/lottery/index.vue` + - 状态:部分完成 + - 参数配置 / Parameter Configuration + - 路由别名:`SysConfigSetting` + - 路径:`cnf/enums/manager/index` + - 状态:待处理 + - 幸运礼物规则配置 / Lucky Gift Rule Configuration + - 路由别名:`game:rule-config` + - 路径:`game/lucky-gift/rule-config/index` + - 状态:待处理 + - 幸运礼物规格配置 / Lucky Gift Standard Configuration + - 路由别名:`game:standard-config` + - 路径:`game/lucky-gift/standard-config/index` + - 状态:待处理 + - 靓号管理(角色) / Special ID Management (Role) + - 路由别名:`user:special:id:role` + - 路径:`user/special-id-role/index` + - 状态:待处理 + - 礼物管理 / Gift Management + - 路由别名:`ContentManagerGift` + - 路径:`cnf/gift/index` + - 状态:待处理 + - IM账号管理 / IM Account Management + - 路由别名:`ImAccountManager` + - 路径:`user/im-account-manager/index` + - 文件:`src/views/user/im-account-manager/index.vue` - 状态:已完成 + - Banner管理 / Banner Management + - 路由别名:`BannerManager` + - 路径:`sys/banner/index` + - 状态:待处理 + - 房间主题管理 / Room Theme Management + - 路由别名:`RoomThemeManager` + - 路径:`room/theme/index` + - 状态:待处理 - 国家管理 / Country Management - 路由别名:`SysCountryCode` - 路径:`sys/country-code/index` - 文件:`src/views/sys/country-code/index.vue` - 状态:已完成 + - 徽章配置管理 / Badge Configuration Management + - 路由别名:`content:manager:badge` + - 路径:`user/badge/index` + - 状态:待处理 + - 表情管理 / Emoji Management + - 路由别名:`EmojiConfig` + - 路径:`sys/emoji-config/index` + - 状态:待处理 + - 靓号管理 / Special ID Management + - 路由别名:`user:special:id` + - 路径:`user/special-id/index` + - 状态:待处理 + - 邀请用户配置 / Invite User Configuration + - 路由别名:`AswatInviteUserRule` + - 路径:`sys/invite-user-rule/index` + - 状态:待处理 + - 游戏列表 / Game List + - 路由别名:`game:config` + - 路径:`sys/game-config/index` + - 状态:待处理 + - 运营日志 / Operations Logs + - 路由别名:`operation:log` + - 状态:待处理 + - 内购配置 / In-App Purchase Configuration + - 路由别名:`in:app:purchase:conf` + - 状态:待处理 - 活动配置 / Activity Configuration - 路由别名:`Activity:Config` + - 状态:部分完成 - 活动管理 / Activity Management - 路由别名:`Activity:Manager` - 路径:`activity/template-cnf/index` - - 文件:`src/views/activity/template-cnf/index.vue` + - 已完成文件: + - `src/views/activity/template-cnf/index.vue` + - `src/views/activity/template-cnf/activity-rank.vue` + - `src/views/activity/template-cnf/activity-rank-reward.vue` + - `src/views/activity/template-cnf/form-edit.vue` + - `src/views/activity/template-cnf/reward-edit.vue` + - `src/views/activity/template-cnf/template-editor/attr-editor.vue` + - `src/views/activity/template-cnf/template-editor/index.vue` + - `src/views/activity/template-cnf/template-editor/lang-text-editor.vue` + - `src/views/activity/template-cnf/template-editor/page-editor.vue` + - `src/views/activity/template-cnf/template-editor/props-card.vue` + - `src/views/activity/template-cnf/template-editor/reward-array-editor.vue` + - `src/views/activity/template-cnf/template-form/index.vue` - 状态:已完成 - - 消息推送 / Message Push (需要重新检查) + - 活动模版 / Activity Template + - 路由别名:`Activity:Template` + - 路径:`activity/template-cnf/template-form/index` + - 状态:已完成 + - 活动规则配置 / Activity Rule Configuration + - 路由别名:`Props:Activity:Rule:Config` + - 路径:`props/props-activity-rule-config/index` + - 状态:待处理 + - 消息推送 / Message Push - 路由别名:`MessageManagerPush` - 路径:`message/push/index` - 已完成文件: @@ -93,17 +239,6 @@ - `src/views/message/push/push-log.vue` - `src/views/message/push/push-task.vue` - 状态:已完成 - - 运营日志 / Operations Logs - - 路由别名:`operation:log` - - 砸金蛋记录 / Golden Egg Smash Records - - 路由别名:`GameEgg` - - 路径:`game/egg/index` - - 已完成文件: - - `src/views/game/egg/index.vue` - - `src/views/game/egg/egg-exchange-record/index.vue` - - `src/views/game/egg/egg-lottery-record/index.vue` - - `src/views/game/egg/egg-lottery-cnf/index.vue` - - 状态:已完成 - APP管理员 / App Administrator - 路由别名:`AdministratorTable` - 路径:`user/app-manager/index` @@ -113,25 +248,95 @@ - `src/views/user/app-manager/administrator/auth.vue` - `src/views/user/app-manager/administrator-auth-resource/index.vue` - 状态:已完成 - - App启动页 / App Launch Page - - 路由别名:`StartPage` - - 路径:`sys/start/page` - - 已完成文件: - - `src/views/sys/start-page/index.vue` - - `src/views/sys/start-page/form-edit.vue` - - 状态:已完成 - 系统公告管理 / System Notice Management - 路由别名:`NoticeMessage` - 路径:`sys/notice-message/index` - 文件:`src/views/sys/notice-message/index.vue` - 状态:已完成 + - 金币代理 / Gold Agent + - 路由别名:`UserFreight` + - 路径:`user/freight/index` + - 已完成文件: + - `src/views/user/freight/index.vue` + - `src/views/user/freight/form-edit.vue` + - `src/views/user/freight/running-water.vue` + - `src/views/user/freight/seller-info.vue` + - `src/views/user/freight/freight-seller-running-water.vue` + - 状态:已完成 + - 申请靓号 / Special ID Application + - 路由别名:`BeautifulNumberApply` + - 路径:`user/beautiful-number-apply/index` + - 状态:待处理 + - App启动页 / App Launch Page + - 路由别名:`StartPage` + - 路径:`sys/start-page/index` + - 已完成文件: + - `src/views/sys/start-page/index.vue` + - `src/views/sys/start-page/form-edit.vue` + - 状态:已完成 + - 客服列表 / Customer Service List + - 路由别名:`CustomerService` + - 路径:`sys/customer-service/index` + - 状态:待处理 + - 金币余额榜 / Gold Balance Ranking + - 路由别名:`gold:balanc:top` + - 路径:`user/gold-balance/index` + - 状态:待处理 + - 区域配置 / Region Configuration + - 路由别名:`RegionConfig` + - 路径:`sys/region-config/index` + - 已完成文件: + - `src/views/sys/region-config/index.vue` + - `src/views/sys/region-config/assist/index.vue` + - `src/views/sys/region-config/region/index.vue` + - 状态:已完成 + - 用户银行 / User Bank + - 路由别名:`UserBankBalance` + - 状态:待处理 + - 用户工资钻石 / User Salary Diamond + - 路由别名:`UserSalaryDiamondBalance` + - 状态:待处理 + - 语音房间 / Voice Rooms - 路由别名:`VoiceRoom` + - 在线房间 / Online Rooms + - 路由别名:`RoomOnline` + - 路径:`room/online/index` + - 状态:待处理 - 房间资料列表 / Room Profile List - 路由别名:`ProfileRoom` - 路径:`room/profile/index` - - 文件:`src/views/room/profile/index.vue` + - 已完成文件: + - `src/views/room/profile/index.vue` + - `src/views/room/profile/room-active-charts.vue` + - `src/views/room/profile/room-operation-log.vue` + - `src/views/room/profile/room-visitor-log.vue` + - `src/views/room/profile/user-drawer.vue` - 状态:已完成 + - 置顶房间 / Featured Rooms + - 路由别名:`room:set:top` + - 路径:`sys/set-top/index` + - 状态:待处理 + - 房间黑名单 / Room Blacklist + - 路由别名:`room:user:blacklist` + - 路径:`log/blacklist/index` + - 状态:待处理 + +- 家族管理 / Family Management + - 路由别名:`FamilyManager` + - 家族配置 / Family Configuration + - 路由别名:`FamilyConfig` + - 路径:`family/config/index` + - 状态:待处理 + - 家族列表 / Family List + - 路由别名:`FamilyList` + - 路径:`family/list/index` + - 状态:待处理 + +- 审批管理 / Approval Management + - 路由别名:`ApprovalManager` + - 当前状态:待处理 + - 道具管理 / Prop Management - 路由别名:`PropsManager` - 资源组配置 / Resource Group Configuration @@ -141,38 +346,117 @@ - `src/views/props/props-source-group/index.vue` - `src/views/props/props-source-group/form-edit.vue` - 状态:已完成 -- 系统工具 / System Tools - - 路由别名:`ToolsManager` - - Redis缓存管理 / Redis Cache Management - - 路由别名:`RedisManager` - - 路径:`/redis` - - 文件:`src/views/tools/redis/index.vue` - - 状态:已完成 - - 文件上传 / File Upload - - 路由别名:`upload:file` - - 路径:`/upload/file` - - 文件:`src/views/tools/upload/index.vue` - - 状态:已完成 + - 道具赠送 / Prop Delivery + - 路由别名:`PropsSendTool` + - 路径:`props/props-send-tool/index` + - 状态:待处理 + - 道具商店 / Prop Store + - 路由别名:`props:store` + - 路径:`props/props-store/index` + - 状态:待处理 + - 主播中心 / Broadcaster Center - 路由别名:`team:manaber` - 代理钻石政策 / Agent Diamond Policy - 路由别名:`TeamDiamondPolicyManager` - 路径:`team/diamond-policy/index` - - 文件:`src/views/team/diamond-policy/index.vue` + - 已完成文件: + - `src/views/team/diamond-policy/index.vue` + - `src/views/team/diamond-policy/props-form-edit.vue` + - 状态:已完成 + - BD Lead + - 路由别名:`BdLead` + - 路径:`team/bd-lead/index` + - 已完成文件: + - `src/views/team/bd-lead/index.vue` + - `src/views/team/bd-lead/add-bd-lead.vue` + - `src/views/team/bd-lead/bind-bd.vue` - 状态:已完成 - 代理政策 / Agent Policy - 路由别名:`TeamPolicyManager` - 路径:`team/policy/index` - - 文件:`src/views/team/policy/index.vue` + - 已完成文件: + - `src/views/team/policy/index.vue` + - `src/views/team/policy/props-form-edit.vue` - 状态:已完成 + - BD工作统计 / BD Work Statistics + - 路由别名:`WorkStatistics` + - 路径:`team/work-statistics/index` + - 状态:待处理 - BD列表 / BD List - 路由别名:`BusinessDevelopment` - 路径:`team/business-development/index` - - 文件:`src/views/team/business-development/index.vue` + - 已完成文件: + - `src/views/team/business-development/index.vue` + - `src/views/team/business-development/add-bd.vue` + - `src/views/team/business-development/auth.vue` + - `src/views/team/business-development/bind-bd-leader.vue` + - `src/views/team/business-development/bind-team.vue` + - `src/views/team/business-development/team-member.vue` - 状态:已完成 + - 代理列表 / Agent List + - 路由别名:`team:list` + - 路径:`team/team-list/index` + - 状态:待处理 + - 主播成员 / Broadcaster Members + - 路由别名:`team:member` + - 路径:`team/team-member/index` + - 状态:待处理 + - 账单列表 / Bill List + - 路由别名:`team:bill` + - 路径:`team/team-bill/index` + - 状态:待处理 + - 主播工作 / Broadcaster Work + - 路由别名:`team:member:work` + - 路径:`team/team-member-work/index` + - 状态:待处理 + +### 当前已完成主要路由摘要 + +- 系统管理 / System Management + - App系统 / App System + - 请求黑名单 / Request Blacklist +- 用户管理 / User Management + - 用户列表 / User List +- 运营管理 / Operations Management + - 数据配置 / Data Configuration + - 国家管理 / Country Management + - IM账号管理 / IM Account Management + - 活动配置 / Activity Configuration + - 活动管理 / Activity Management + - 活动模版 / Activity Template + - 消息推送 / Message Push + - APP管理员 / App Administrator + - 系统公告管理 / System Notice Management + - 金币代理 / Gold Agent + - App启动页 / App Launch Page + - 区域配置 / Region Configuration +- 语音房间 / Voice Rooms + - 房间资料列表 / Room Profile List +- 道具管理 / Prop Management + - 资源组配置 / Resource Group Configuration +- 主播中心 / Broadcaster Center + - 代理钻石政策 / Agent Diamond Policy + - BD Lead / BD Lead + - 代理政策 / Agent Policy + - BD列表 / BD List ### 已完成但未在当前主要路由菜单返回中命中的补充页面 +- 当前接口返回里未出现 `工具管理` 顶层菜单,以下已完成页面暂归为补充页面: + - `src/views/tools/redis/index.vue` + - `src/views/tools/upload/index.vue` + - `src/views/tools/other/index.vue` + - `src/views/tools/other/alias-method.vue` + - `src/views/tools/other/api-sign.vue` + - `src/views/tools/other/redis-ops.vue` + - `src/views/tools/other/token-parse.vue` + - `src/views/tools/other/user-cancel-and-restore.vue` + - `src/views/tools/other/user-room-region.vue` + - `src/views/tools/other/user-swap-user.vue` + - `src/views/tools/gold-analyze/index.vue` + - `src/views/tools/compensate-order/index.vue` + - `src/views/tools/websocket/index.vue` - 抽奖概率配置 / Lottery Probability Settings - 路由别名:`GameLottery` - 路由来源:`src/router/index.js` 静态路由 @@ -195,339 +479,1248 @@ - 当前无 4. 本文件中“模块部分完成,入口页仍需复核”的页面: - 当前无 -5. 本文件之外的其他路由页面 -## 原始接口返回(保留) +## 主要路由 { - "time": "1776417483715", + "time": "1776839315693", "status": true, "errorCode": 0, - "body": { - "id": "160", - "theme": "normal", - "recentPreviews": [ - { - "reqTraceId": "GL-99fc25be00b9e5b70891628f3615fe89", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776417455831, - "id": "sys:role:list", - "type": "SYSTEM", - "name": "角色管理", - "link": "/system/manager/role", - "createTime": 1776417455831 - }, - { - "reqTraceId": "GL-4bdfb064bb5ba9936cc50ae6871d8094", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776417451877, - "id": "sys:user:list", - "type": "SYSTEM", - "name": "用户管理", - "link": "/system/manager/user", - "createTime": 1776417451878 - }, - { - "reqTraceId": "GL-5eea9989c975401d54c22eefce0def90", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776333417531, - "id": "RegionConfig", - "type": "SYSTEM", - "name": "区域配置", - "link": "/operation/manager/region/config", - "createTime": 1776333417531 - }, - { - "reqTraceId": "GL-0517a95d554779799e8899bffb75347b", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776332452114, - "id": "GameEgg", - "type": "SYSTEM", - "name": "砸金蛋记录", - "link": "/operation/manager/log/running_water/game/egg", - "createTime": 1776332452114 - }, - { - "reqTraceId": "GL-4c500d97fe3f6aa2e777c170e880bc31", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776313451145, - "id": "AppUserList", - "type": "SYSTEM", - "name": "用户列表", - "link": "/app/user/manager/user/table", - "createTime": 1776313451145 - }, - { - "reqTraceId": "GL-9eff89dc13f92cee8e476013e475b232", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776245058763, - "id": "TeamPolicyManager", - "type": "SYSTEM", - "name": "代理政策", - "link": "/team/team-policy", - "createTime": 1776245058764 - }, - { - "reqTraceId": "GL-dd55810a0797b1bd4288ebc6b7916f75", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776243303511, - "id": "team:member", - "type": "SYSTEM", - "name": "主播成员", - "link": "/team/team/member", - "createTime": 1776243303511 - }, - { - "reqTraceId": "GL-e41e534ef606191c784532ecefa38008", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776243294447, - "id": "BusinessDevelopment", - "type": "SYSTEM", - "name": "BD列表", - "link": "/team/business-development", - "createTime": 1776243294447 - }, - { - "reqTraceId": "GL-bae2f36d15f77bdb3e738dc58e1bc800", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776242391890, - "id": "game:config", - "type": "SYSTEM", - "name": "游戏列表", - "link": "/operation/manager/data_cnf/game-config", - "createTime": 1776242391890 - }, - { - "reqTraceId": "GL-022908aeb3ee33038d10981b0940fc26", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776158503061, - "id": "team:bdleader:work", - "type": "SYSTEM", - "name": "BDLeader工作", - "link": "/team/bd-leader-work", - "createTime": 1776158503061 - }, - { - "reqTraceId": "GL-7759554caea3846c5fca82c1478c28b3", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776074669162, - "id": "UserCustomGift", - "type": "SYSTEM", - "name": "用户专属礼物制作", - "link": "/app/user/manager/user_custom_gift", - "createTime": 1776074669162 - }, - { - "reqTraceId": "GL-9b16acbbd3ad6ac088740c1a30c564d1", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776074206583, - "id": "sys:resource:list", - "type": "SYSTEM", - "name": "资源管理", - "link": "/system/manager/resource", - "createTime": 1776074206583 - }, - { - "reqTraceId": "GL-d5e278dc379b183c02d52378775b1ad8", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776074206154, - "id": "sys:menu:list", - "type": "SYSTEM", - "name": "菜单管理", - "link": "/system/manager/menu", - "createTime": 1776074206154 - }, - { - "reqTraceId": "GL-f010314eafd3755510be60829bd7f5f8", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776070694764, - "id": "upload:file", - "type": "SYSTEM", - "name": "文件上传", - "link": "/system/manager/tools/manager/upload/file", - "createTime": 1776070694764 - }, - { - "reqTraceId": "GL-d305c7808e7665680e6f420c51f85be8", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776070692971, - "id": "tools:other", - "type": "SYSTEM", - "name": "小工具", - "link": "/system/manager/tools/manager/tools", - "createTime": 1776070692971 - }, - { - "reqTraceId": "GL-bfba1c4b6dddf7ca0e8afeb0567be6cb", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776070689919, - "id": "toot:gold:analyze", - "type": "SYSTEM", - "name": "金币分析", - "link": "/system/manager/tools/manager/gold-analyze", - "createTime": 1776070689919 - }, - { - "reqTraceId": "GL-9c6d5a4d2d0e240cdfa4f729d43b9fa8", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776070685881, - "id": "OrderCompensate", - "type": "SYSTEM", - "name": "订单补偿", - "link": "/system/manager/tools/manager/order/compensate", - "createTime": 1776070685882 - }, - { - "reqTraceId": "GL-f579fc5751d9d6867e1a703e7529ce18", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776070684510, - "id": "RedisManager", - "type": "SYSTEM", - "name": "Redis缓存管理", - "link": "/system/manager/tools/manager/redis", - "createTime": 1776070684511 - }, - { - "reqTraceId": "GL-dd1b84facd843153dd62aefea9fc01d4", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.20.94", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776070681380, - "id": "request:blacklist", - "type": "SYSTEM", - "name": "请求黑名单", - "link": "/system/manager/app/sys/request-blacklist", - "createTime": 1776070681380 - }, - { - "reqTraceId": "GL-2765d45daac6092185f983e42cc5c156", - "reqUserId": "160", - "reqLanguage": "en", - "reqZoneId": "UTC", - "reqIp": "10.0.12.49", - "reqClient": "OPS", - "reqApi": "/console/dashboard/previews", - "reqApiVersion": "v2", - "reqTime": 1776070679538, - "id": "ExternalIm", - "type": "SYSTEM", - "name": "IM通讯", - "link": "/system/manager/app/sys/external/im", - "createTime": 1776070679539 - } - ], - "customNavigations": [] - } + "body": [ + { + "id": 1, + "parentId": 0, + "childrens": [ + { + "id": 23, + "parentId": 1, + "childrens": [], + "menuName": "用户管理", + "menuType": 2, + "router": "user", + "path": "sys/user-manager/index", + "icon": "sys_manager_1", + "alias": "sys:user:list" + }, + { + "id": 24, + "parentId": 1, + "childrens": [], + "menuName": "角色管理", + "menuType": 2, + "router": "role", + "path": "sys/role-manager/index", + "icon": "user", + "alias": "sys:role:list" + }, + { + "id": 25, + "parentId": 1, + "childrens": [], + "menuName": "菜单管理", + "menuType": 2, + "router": "menu", + "path": "sys/menu-manager/index", + "icon": "nested", + "alias": "sys:menu:list" + }, + { + "id": 26, + "parentId": 1, + "childrens": [], + "menuName": "资源管理", + "menuType": 2, + "router": "resource", + "path": "sys/resources-manager/index", + "icon": "process", + "alias": "sys:resource:list" + }, + { + "id": 375, + "parentId": 1, + "childrens": [ + { + "id": 163, + "parentId": 375, + "childrens": [], + "menuName": "版本管理", + "menuType": 2, + "router": "app/version", + "path": "version/app/index", + "icon": "application_manager", + "alias": "sugartime:version" + }, + { + "id": 219, + "parentId": 375, + "childrens": [], + "menuName": "APP运行日志", + "menuType": 2, + "router": "breakdown/index", + "path": "log/breakdown/index", + "icon": "layer", + "alias": "Breakdown" + }, + { + "id": 229, + "parentId": 375, + "childrens": [], + "menuName": "IM通讯", + "menuType": 2, + "router": "external/im", + "path": "external/im", + "icon": "process", + "alias": "ExternalIm" + }, + { + "id": 415, + "parentId": 375, + "childrens": [], + "menuName": "请求黑名单", + "menuType": 2, + "router": "request-blacklist", + "path": "sys/request-blacklist/index", + "icon": "alarm", + "alias": "request:blacklist" + } + ], + "menuName": "App系统", + "menuType": 1, + "router": "app/sys", + "icon": "nested", + "alias": "app:sys:manager" + } + ], + "menuName": "系统管理", + "menuType": 1, + "router": "/system/manager", + "path": "", + "icon": "sys_manager_2", + "alias": "SystemManager" + }, + { + "id": 115, + "parentId": 0, + "childrens": [ + { + "id": 116, + "parentId": 115, + "childrens": [], + "menuName": "用户列表", + "menuType": 2, + "router": "user/table", + "path": "user/user-table/index", + "icon": "user", + "alias": "AppUserList" + }, + { + "id": 288, + "parentId": 115, + "childrens": [], + "menuName": "封禁设备列表", + "menuType": 2, + "router": "archive-device/index", + "path": "log/archive-device/index", + "icon": "sys_manager_1", + "alias": "ArchiveDevice" + }, + { + "id": 319, + "parentId": 115, + "childrens": [], + "menuName": "最新登记设备", + "menuType": 2, + "router": "user/user-device", + "path": "user/user-device/index", + "icon": "dashboard", + "alias": "UserDevice" + } + ], + "menuName": "用户管理", + "menuType": 1, + "router": "/app/user/manager", + "icon": "sys_manager_1", + "alias": "AppUserManager" + }, + { + "id": 184, + "parentId": 0, + "childrens": [ + { + "id": 177, + "parentId": 184, + "childrens": [ + { + "id": 179, + "parentId": 177, + "childrens": [], + "menuName": "消费商品订单", + "menuType": 2, + "router": "candy/purchasing", + "path": "order/candy/purchasing/index", + "icon": "bank_card", + "alias": "GoldPurchasing" + }, + { + "id": 180, + "parentId": 177, + "childrens": [], + "menuName": "金币收支记录", + "menuType": 2, + "router": "candy/running/water", + "path": "order/candy/running-water/index", + "icon": "layer", + "alias": "CandyRunningWater" + }, + { + "id": -1544110078, + "parentId": 177, + "childrens": [], + "menuName": "钻石流水列表", + "menuType": 2, + "router": "user/diamond-run-water", + "path": "user/diamond-run-water/index", + "icon": "gridding", + "alias": "User:Diamond:Run:Water" + }, + { + "id": 348, + "parentId": 177, + "childrens": [], + "menuName": "金币代理流水", + "menuType": 2, + "router": "freight-info-list/index", + "path": "user/freight-info-list/index", + "icon": "revenue", + "alias": "UserFreightInfoList" + }, + { + "id": 229699585, + "parentId": 177, + "childrens": [], + "menuName": "钻石余额列表", + "menuType": 2, + "router": "user/diamond-balance", + "path": "user/diamond-balance/index", + "icon": "gridding", + "alias": "User:Diamond:Balance" + }, + { + "id": 528, + "parentId": 177, + "childrens": [], + "menuName": "订单详情", + "menuType": 2, + "router": "order/details", + "path": "order/order-details/index", + "icon": "comprehensive_analysis", + "alias": "order:details" + } + ], + "menuName": "营收支出", + "menuType": 1, + "router": "/app/revenue", + "icon": "revenue", + "alias": "AppRevenue" + }, + { + "id": 381, + "parentId": 184, + "childrens": [ + { + "id": 197, + "parentId": 381, + "childrens": [], + "menuName": "参数配置", + "menuType": 2, + "router": "cnf/enums/manager", + "path": "cnf/enums/manager/index", + "icon": "sys_manager_2", + "alias": "SysConfigSetting" + }, + { + "id": -1995972607, + "parentId": 381, + "childrens": [], + "menuName": "幸运礼物规则配置", + "menuType": 2, + "router": "game/lucky-gift/rule-config/config", + "path": "game/lucky-gift/rule-config/index", + "icon": "gift", + "alias": "game:rule-config" + }, + { + "id": -1425547262, + "parentId": 381, + "childrens": [], + "menuName": "幸运礼物规格配置", + "menuType": 2, + "router": "game/lucky-gift/standard-config/config", + "path": "game/lucky-gift/standard-config/index", + "icon": "gift", + "alias": "game:standard-config" + }, + { + "id": -150990847, + "parentId": 381, + "childrens": [], + "menuName": "靓号管理", + "menuType": 2, + "router": "role_user_special_id", + "path": "user/special-id-role/index", + "icon": "", + "alias": "user:special:id:role" + }, + { + "id": 217, + "parentId": 381, + "childrens": [], + "menuName": "礼物管理", + "menuType": 2, + "router": "user/gift", + "path": "cnf/gift/index", + "icon": "the_mall", + "alias": "ContentManagerGift" + }, + { + "id": 231, + "parentId": 381, + "childrens": [], + "menuName": "IM账号管理", + "menuType": 2, + "router": "im/account/manager", + "path": "user/im-account-manager/index", + "icon": "log", + "alias": "ImAccountManager" + }, + { + "id": 260, + "parentId": 381, + "childrens": [], + "menuName": "Banner管理", + "menuType": 2, + "router": "sys/banner", + "path": "sys/banner/index", + "icon": "sys_manager_2", + "alias": "BannerManager" + }, + { + "id": 268, + "parentId": 381, + "childrens": [], + "menuName": "房间主题管理", + "menuType": 2, + "router": "room/theme", + "path": "room/theme/index", + "icon": "example", + "alias": "RoomThemeManager" + }, + { + "id": 277, + "parentId": 381, + "childrens": [], + "menuName": "国家管理", + "menuType": 2, + "router": "country-code/index", + "path": "sys/country-code/index", + "icon": "gridding", + "alias": "SysCountryCode" + }, + { + "id": 281, + "parentId": 381, + "childrens": [], + "menuName": "徽章配置管理", + "menuType": 2, + "router": "badge/index", + "path": "user/badge/index", + "icon": "message", + "alias": "content:manager:badge" + }, + { + "id": 346, + "parentId": 381, + "childrens": [], + "menuName": "表情管理", + "menuType": 2, + "router": "sys/emoji-config", + "path": "sys/emoji-config/index", + "icon": "gridding", + "alias": "EmojiConfig" + }, + { + "id": 406, + "parentId": 381, + "childrens": [], + "menuName": "靓号管理", + "menuType": 2, + "router": "user_special_id", + "path": "user/special-id/index", + "icon": "example", + "alias": "user:special:id" + }, + { + "id": 455, + "parentId": 381, + "childrens": [], + "menuName": "邀请用户配置", + "menuType": 2, + "router": "sys/invite-user-rule", + "path": "sys/invite-user-rule/index", + "icon": "forecast_information", + "alias": "AswatInviteUserRule" + }, + { + "id": 457, + "parentId": 381, + "childrens": [], + "menuName": "游戏列表", + "menuType": 2, + "router": "game-config", + "path": "sys/game-config/index", + "icon": "layer", + "alias": "game:config" + } + ], + "menuName": "数据配置", + "menuType": 1, + "router": "data_cnf", + "icon": "device_maintain", + "alias": "data:conf" + }, + { + "id": 380, + "parentId": 184, + "childrens": [ + { + "id": 209, + "parentId": 380, + "childrens": [], + "menuName": "礼物赠送记录", + "menuType": 2, + "router": "gift/history", + "path": "user/gift-history/index", + "icon": "gift", + "alias": "ContentManagerGiftHistory" + }, + { + "id": 306, + "parentId": 380, + "childrens": [], + "menuName": "用户道具流水", + "menuType": 2, + "router": "running/water/user/props", + "path": "user/user-prop-list/index", + "icon": "revenue", + "alias": "RunningWaterUserProps" + }, + { + "id": 475, + "parentId": 380, + "childrens": [], + "menuName": "邀请用户", + "menuType": 2, + "router": "invite-user-log", + "path": "log/invite-user-log/index", + "icon": "form", + "alias": "invite:user:register:log" + }, + { + "id": 1355276289, + "parentId": 380, + "childrens": [], + "menuName": "幸运礼物送礼记录", + "menuType": 2, + "router": "game/lucky-gift/give-record", + "path": "game/lucky-gift/give-record/index", + "icon": "gift", + "alias": "lucky:give-record" + }, + { + "id": 330, + "parentId": 380, + "childrens": [], + "menuName": "用户签到", + "menuType": 2, + "router": "user/check-in-log", + "path": "user/check-in-log/index", + "icon": "form", + "alias": "CheckInLog" + }, + { + "id": 411, + "parentId": 380, + "childrens": [], + "menuName": "登录日志", + "menuType": 2, + "router": "login/logger", + "path": "log/login-logger/index", + "icon": "broker", + "alias": "app:logger:login" + }, + { + "id": 454, + "parentId": 380, + "childrens": [], + "menuName": "Ludo飞行棋", + "menuType": 2, + "router": "game-ludo", + "path": "game/ludo/index", + "icon": "device", + "alias": "game:ludo" + }, + { + "id": 504, + "parentId": 380, + "childrens": [], + "menuName": "CP申请日志", + "menuType": 2, + "router": "cp", + "path": "log/cp/index", + "alias": "cp:apply:log" + }, + { + "id": 1490255874, + "parentId": 380, + "childrens": [], + "menuName": "用户密码日志", + "menuType": 2, + "router": "log/password-log", + "path": "log/password-log/index", + "icon": "integral", + "alias": "UserPasswordLog" + } + ], + "menuName": "运营日志", + "menuType": 1, + "router": "log/running_water", + "icon": "form", + "alias": "operation:log" + }, + { + "id": 391, + "parentId": 184, + "childrens": [ + { + "id": 393, + "parentId": 391, + "childrens": [], + "menuName": "渠道管理", + "menuType": 2, + "router": "pay/channel", + "path": "cnf/pay/channel/index", + "icon": "form", + "alias": "channel:manager" + }, + { + "id": 394, + "parentId": 391, + "childrens": [], + "menuName": "厂商管理", + "menuType": 2, + "router": "pay/factory", + "path": "cnf/pay/factory/index", + "icon": "form", + "alias": "pay:factory:manager" + }, + { + "id": -826257407, + "parentId": 391, + "childrens": [], + "menuName": "区域关联支付国家", + "menuType": 2, + "router": "region/relation", + "path": "cnf/pay/region-relation/index", + "icon": "tree", + "alias": "region:pay:country" + }, + { + "id": 396, + "parentId": 391, + "childrens": [], + "menuName": "开通支付国家", + "menuType": 2, + "router": "pay/country", + "path": "cnf/pay/country/index", + "icon": "form", + "alias": "open:pay:country" + }, + { + "id": 395, + "parentId": 391, + "childrens": [], + "menuName": "应用管理", + "menuType": 2, + "router": "pay/application", + "path": "cnf/pay/application/index", + "icon": "layer", + "alias": "pay:application" + }, + { + "id": 1325461505, + "parentId": 391, + "childrens": [], + "menuName": "Google/Apple-V2", + "menuType": 2, + "router": "cnf/product-v2", + "path": "cnf/product-v2/index", + "icon": "form", + "alias": "google:apple:product:config" + } + ], + "menuName": "内购配置", + "menuType": 1, + "router": "/in_app_purchase_conf", + "path": "77774", + "icon": "form", + "alias": "in:app:purchase:conf" + }, + { + "id": 468, + "parentId": 184, + "childrens": [ + { + "id": 469, + "parentId": 468, + "childrens": [], + "menuName": "活动管理", + "menuType": 2, + "router": "cnf", + "path": "activity/template-cnf/index", + "icon": "layer", + "alias": "Activity:Manager" + }, + { + "id": 470, + "parentId": 468, + "childrens": [], + "menuName": "活动模版", + "menuType": 2, + "router": "template", + "path": "activity/template-cnf/template-form/index", + "icon": "application_manager", + "alias": "Activity:Template" + }, + { + "id": 471, + "parentId": 468, + "childrens": [], + "menuName": "活动规则配置", + "menuType": 2, + "router": "props/props-activity-rule-config", + "path": "props/props-activity-rule-config/index", + "icon": "form", + "alias": "Props:Activity:Rule:Config" + } + ], + "menuName": "活动配置", + "menuType": 1, + "router": "/activity", + "icon": "example", + "alias": "Activity:Config" + }, + { + "id": 195, + "parentId": 184, + "childrens": [], + "menuName": "消息推送", + "menuType": 2, + "router": "/message/push", + "path": "message/push/index", + "icon": "form", + "alias": "MessageManagerPush" + }, + { + "id": 282, + "parentId": 184, + "childrens": [], + "menuName": "APP管理员", + "menuType": 2, + "router": "administrator", + "path": "user/app-manager/index", + "icon": "broker", + "alias": "AdministratorTable" + }, + { + "id": 285, + "parentId": 184, + "childrens": [], + "menuName": "系统公告管理", + "menuType": 2, + "router": "notice-message/index", + "path": "sys/notice-message/index", + "icon": "audio", + "alias": "NoticeMessage" + }, + { + "id": 324, + "parentId": 184, + "childrens": [], + "menuName": "金币代理", + "menuType": 2, + "router": "user_freight", + "path": "user/freight/index", + "icon": "user", + "alias": "UserFreight" + }, + { + "id": 343, + "parentId": 184, + "childrens": [], + "menuName": "申请靓号", + "menuType": 2, + "router": "user/beautiful-number-apply", + "path": "user/beautiful-number-apply/index", + "icon": "form", + "alias": "BeautifulNumberApply" + }, + { + "id": 397, + "parentId": 184, + "childrens": [], + "menuName": "App启动页", + "menuType": 2, + "router": "sys/start/page", + "path": "sys/start-page/index", + "icon": "comprehensive_analysis", + "alias": "StartPage" + }, + { + "id": 505, + "parentId": 184, + "childrens": [], + "menuName": "客服列表", + "menuType": 2, + "router": "customer-service", + "path": "sys/customer-service/index", + "icon": "forecast_information", + "alias": "CustomerService" + }, + { + "id": 536, + "parentId": 184, + "childrens": [], + "menuName": "金币余额榜", + "menuType": 2, + "router": "gold-balance-top", + "path": "user/gold-balance/index", + "icon": "gridding", + "alias": "gold:balanc:top" + }, + { + "id": 544, + "parentId": 184, + "childrens": [], + "menuName": "区域配置", + "menuType": 2, + "router": "region/config", + "path": "sys/region-config/index", + "icon": "table", + "alias": "RegionConfig" + }, + { + "id": 545, + "parentId": 184, + "childrens": [ + { + "id": -510427134, + "parentId": 545, + "childrens": [], + "menuName": "目标兑换工资记录", + "menuType": 2, + "router": "user/bank-balance/exchange-target-record", + "path": "user/bank-balance/exchange-target-record/index", + "icon": "form", + "alias": "ExchangeTargetRecord" + }, + { + "id": 547, + "parentId": 545, + "childrens": [], + "menuName": "用户银行流水", + "menuType": 2, + "router": "user/bank-balance/running-water", + "path": "user/bank-balance/running-water/index", + "icon": "log", + "alias": "UserBankRunningWater" + }, + { + "id": 548, + "parentId": 545, + "childrens": [], + "menuName": "用户银行账户", + "menuType": 2, + "router": "user/bank-balance/table", + "path": "user/bank-balance/table/index", + "icon": "anchor_management", + "alias": "UserBankBalance" + }, + { + "id": 549, + "parentId": 545, + "childrens": [], + "menuName": "美金兑换金币记录", + "menuType": 2, + "router": "user/bank-balance/withdraw-gold-apply", + "path": "user/bank-balance/withdraw-gold-apply/index", + "icon": "log", + "alias": "UserBankWithdrawGoldApply" + }, + { + "id": 550, + "parentId": 545, + "childrens": [], + "menuName": "现金提现申请", + "menuType": 2, + "router": "user/bank-balance/withdraw-money-apply", + "path": "user/bank-balance/withdraw-money-apply/index", + "icon": "bank_card", + "alias": "UserBankWithdrawMoneyApply" + }, + { + "id": 2093088769, + "parentId": 545, + "childrens": [], + "menuName": "自动支付工资凭据", + "menuType": 2, + "router": "user/bank-balance/auto-salary-pay-record", + "path": "user/bank-balance/auto-salary-pay-record/index", + "icon": "revenue", + "alias": "AutomaticSalaryPaymentRecord" + } + ], + "menuName": "用户银行", + "menuType": 1, + "router": "UserBank", + "icon": "bank_card", + "alias": "UserBankBalance" + }, + { + "id": 225759234, + "parentId": 184, + "childrens": [ + { + "id": -2106527742, + "parentId": 225759234, + "childrens": [], + "menuName": "用户工资钻石账户", + "menuType": 2, + "router": "user/salary-diamond-balance/table", + "path": "user/salary-diamond-balance/table/index", + "icon": "table", + "alias": "UserSalaryDiamondBalance" + }, + { + "id": -2093944830, + "parentId": 225759234, + "childrens": [], + "menuName": "用户工资钻石流水", + "menuType": 2, + "router": "user/salary-diamond-balance/running-water", + "path": "user/salary-diamond-balance/running-water/index", + "icon": "gridding", + "alias": "UserSalaryDiamondRunningWater" + }, + { + "id": -1901006846, + "parentId": 225759234, + "childrens": [], + "menuName": "钻石提现申请", + "menuType": 2, + "router": "user/bank-balance/withdraw-diamond-apply", + "path": "user/bank-balance/withdraw-diamond-apply/index", + "icon": "message", + "alias": "UserBankWithdrawDiamondApply" + }, + { + "id": 191950850, + "parentId": 225759234, + "childrens": [], + "menuName": "钻石兑换金币记录", + "menuType": 2, + "router": "user/bank-balance/diamond-withdraw-gold-apply", + "path": "user/bank-balance/diamond-withdraw-gold-apply/index", + "icon": "log", + "alias": "UserBankDiamondWithdrawGoldApply" + } + ], + "menuName": "用户工资钻石", + "menuType": 1, + "router": "UserSalaryDiamond", + "path": "", + "icon": "revenue", + "alias": "UserSalaryDiamondBalance" + } + ], + "menuName": "运营管理", + "menuType": 1, + "router": "/operation/manager", + "icon": "dashboard", + "alias": "OperationManager" + }, + { + "id": 271, + "parentId": 0, + "childrens": [ + { + "id": 274, + "parentId": 271, + "childrens": [], + "menuName": "在线房间", + "menuType": 2, + "router": "room/online", + "path": "room/online/index", + "icon": "data_analysis", + "alias": "RoomOnline" + }, + { + "id": 287, + "parentId": 271, + "childrens": [], + "menuName": "房间资料列表", + "menuType": 2, + "router": "profile/index", + "path": "room/profile/index", + "icon": "layer", + "alias": "ProfileRoom" + }, + { + "id": 434, + "parentId": 271, + "childrens": [], + "menuName": "置顶房间", + "menuType": 2, + "router": "set-top", + "path": "sys/set-top/index", + "icon": "layer", + "alias": "room:set:top" + }, + { + "id": 479, + "parentId": 271, + "childrens": [], + "menuName": "房间黑名单", + "menuType": 2, + "router": "log/blacklist", + "path": "log/blacklist/index", + "icon": "form", + "alias": "room:user:blacklist" + } + ], + "menuName": "语音房间", + "menuType": 1, + "router": "/voice/room", + "icon": "process", + "alias": "VoiceRoom" + }, + { + "id": 339, + "parentId": 0, + "childrens": [ + { + "id": 340, + "parentId": 339, + "childrens": [], + "menuName": "家族配置", + "menuType": 2, + "router": "family/config", + "path": "family/config/index", + "icon": "sys_manager_2", + "alias": "FamilyConfig" + }, + { + "id": 341, + "parentId": 339, + "childrens": [], + "menuName": "家族列表", + "menuType": 2, + "router": "family/list", + "path": "family/list/index", + "icon": "anchor_management", + "alias": "FamilyList" + } + ], + "menuName": "家族管理", + "menuType": 1, + "router": "/family/manager", + "icon": "tree", + "alias": "FamilyManager" + }, + { + "id": 236, + "parentId": 0, + "childrens": [ + { + "id": 238, + "parentId": 236, + "childrens": [], + "menuName": "用户头像", + "menuType": 2, + "router": "user/avatar/approval", + "path": "approval/avatar-approval/index", + "icon": "form", + "alias": "AvatatPhotoApproval" + }, + { + "id": 239, + "parentId": 236, + "childrens": [], + "menuName": "用户照片墙", + "menuType": 2, + "router": "user/photo/wall/approval", + "path": "approval/photo-wall-approval/index", + "icon": "form", + "alias": "PhotoWallApproval" + }, + { + "id": 240, + "parentId": 236, + "childrens": [], + "menuName": "用户昵称", + "menuType": 2, + "router": "user/nickname/approval", + "path": "approval/nickname-approval/index", + "icon": "form", + "alias": "NickNameApproval" + }, + { + "id": 242, + "parentId": 236, + "childrens": [], + "menuName": "举报信息", + "menuType": 2, + "router": "report/index", + "path": "approval/report/index", + "icon": "form", + "alias": "ReportManagerReport" + }, + { + "id": 243, + "parentId": 236, + "childrens": [], + "menuName": "意见反馈", + "menuType": 2, + "router": "ReportManagerFeedback", + "path": "feedback/index", + "icon": "form", + "alias": "user:feedback" + }, + { + "id": 245, + "parentId": 236, + "childrens": [], + "menuName": "用户个性签名", + "menuType": 2, + "router": "user/profile_desc/approval", + "path": "approval/user-profile-desc-approval/index", + "icon": "form", + "alias": "UserProfileDescApproval" + }, + { + "id": 246, + "parentId": 236, + "childrens": [], + "menuName": "房间封面", + "menuType": 2, + "router": "room/cover/approval", + "path": "approval/room-cover-wall-approval/index", + "icon": "form", + "alias": "RoomCoverWallApproval" + }, + { + "id": -6496254, + "parentId": 236, + "childrens": [], + "menuName": "KYC身份审核", + "menuType": 2, + "router": "user_bank/identity_info", + "path": "user/bank-identity/index", + "icon": "forecast_information", + "alias": "UserBankIdentity" + }, + { + "id": 261, + "parentId": 236, + "childrens": [], + "menuName": "房间主题审批", + "menuType": 2, + "router": "room/theme/approval", + "path": "approval/room-theme-approval/index", + "icon": "process", + "alias": "RoomThemeApproval" + }, + { + "id": 552, + "parentId": 236, + "childrens": [], + "menuName": "用户银行卡审批", + "menuType": 2, + "router": "user/bank-card/approval", + "path": "approval/user-bank-card/index", + "icon": "bank_card", + "alias": "UserBankCardApproval" + } + ], + "menuName": "审批管理", + "menuType": 1, + "router": "/approval/manager", + "icon": "alarm", + "alias": "ApprovalManager" + }, + { + "id": 305, + "parentId": 0, + "childrens": [ + { + "id": 312, + "parentId": 305, + "childrens": [], + "menuName": "资源组配置", + "menuType": 2, + "router": "props/props_source_group", + "path": "props/props-source-group/index", + "icon": "form", + "alias": "PropsActivitySourceGroup" + }, + { + "id": 315, + "parentId": 305, + "childrens": [], + "menuName": "道具赠送", + "menuType": 2, + "router": "props/send_tool", + "path": "props/props-send-tool/index", + "icon": "form", + "alias": "PropsSendTool" + }, + { + "id": 444, + "parentId": 305, + "childrens": [], + "menuName": "道具商店", + "menuType": 2, + "router": "props/props_store", + "path": "props/props-store/index", + "icon": "device_maintain", + "alias": "props:store" + } + ], + "menuName": "道具管理", + "menuType": 1, + "router": "/props/manager", + "icon": "gridding", + "alias": "PropsManager" + }, + { + "id": 537, + "parentId": 0, + "childrens": [ + { + "id": 728821762, + "parentId": 537, + "childrens": [], + "menuName": "代理钻石政策", + "menuType": 2, + "router": "team-diamond-policy", + "path": "team/diamond-policy/index", + "icon": "eye-open", + "alias": "TeamDiamondPolicyManager" + }, + { + "id": -1855930366, + "parentId": 537, + "childrens": [], + "menuName": "BD Lead", + "menuType": 2, + "router": "team/bd-lead", + "path": "team/bd-lead/index", + "icon": "broker", + "alias": "BdLead" + }, + { + "id": 541, + "parentId": 537, + "childrens": [], + "menuName": "代理政策", + "menuType": 2, + "router": "team-policy", + "path": "team/policy/index", + "icon": "audio", + "alias": "TeamPolicyManager" + }, + { + "id": -1142218751, + "parentId": 537, + "childrens": [], + "menuName": "BD工作统计", + "menuType": 2, + "router": "work-statistics", + "path": "team/work-statistics/index", + "icon": "table", + "alias": "WorkStatistics" + }, + { + "id": 538, + "parentId": 537, + "childrens": [], + "menuName": "BD列表", + "menuType": 2, + "router": "business-development", + "path": "team/business-development/index", + "icon": "broker", + "alias": "BusinessDevelopment" + }, + { + "id": 539, + "parentId": 537, + "childrens": [], + "menuName": "代理列表", + "menuType": 2, + "router": "team-list", + "path": "team/team-list/index", + "icon": "gridding", + "alias": "team:list" + }, + { + "id": 540, + "parentId": 537, + "childrens": [], + "menuName": "主播成员", + "menuType": 2, + "router": "team/member", + "path": "team/team-member/index", + "icon": "gridding", + "alias": "team:member" + }, + { + "id": 542, + "parentId": 537, + "childrens": [], + "menuName": "账单列表", + "menuType": 2, + "router": "team/bill", + "path": "team/team-bill/index", + "icon": "forecast_information", + "alias": "team:bill" + }, + { + "id": 543, + "parentId": 537, + "childrens": [], + "menuName": "主播工作", + "menuType": 2, + "router": "member-work", + "path": "team/team-member-work/index", + "icon": "form", + "alias": "team:member:work" + } + ], + "menuName": "主播中心", + "menuType": 1, + "router": "/team", + "icon": "layer", + "alias": "team:manaber" + } + ] } + diff --git a/docs/i18n/线程协作.md b/docs/i18n/线程协作.md index f0cc060..c0e31d8 100644 --- a/docs/i18n/线程协作.md +++ b/docs/i18n/线程协作.md @@ -33,10 +33,10 @@ - 已完成 `src/views` 页面私有组件复查任务 - 首页 `Dashboard` - `docs/i18n/主要路由.md` 中列出的主要路由页面 - - 其他路由页面 - 临时规则补充: - 在“已完成 `src/views` 页面私有组件复查任务”完成前,暂不继续领取新的未完成普通页面 - 这里的“私有组件”仅指 `src/views/**` 目录下、随页面一同渲染或由页面局部引用的组件,不包含公共组件目录 `src/components/**` + - 自 2026-04-22 起,后续任务范围只保留“主要路由页面 + 这些页面直接涉及的页面内组件/私有组件”;非主要路由页面不再继续补翻 - 当首页或 `主要路由.md` 中仍有未完成页面时,不应优先领取其他普通路由页面 - `主要路由.md` 中具体先领取哪一个页面,仍可按原来的灵活方式分配,只要遵守“不重复认领、不与其他线程冲突” - 每次正式认领任务时,必须先把认领结果写入 md,再开始修改源码;不要先改代码、后补文档 @@ -47,6 +47,10 @@ - 每完成一轮修改后,必须同步更新: - `docs/i18n/翻译进度.md` - `docs/i18n/翻译清单.md` +- 判断“独立路由”还是“页面内功能文件”时,统一按以下顺序执行: + - 先看原始接口返回中该菜单是否是独立菜单项 + - 再看入口 `index.vue` 是否通过 `import`/局部注册直接引用同目录文件 + - 如果接口只返回 1 个菜单项、而入口页直接引用多个同目录 `.vue` 文件,则记为“一个主路由页面 + 多个页面内功能文件”,不要误记成多个独立路由 - 自 2026-04-20 起,`src/views` 页面标记“已完成”时,还必须单独记录该页面私有组件状态: - `无私有组件` - `已随页面同步完成` @@ -155,13 +159,814 @@ | 线程 | 当前状态 | 认领范围 | 说明 | | --- | --- | --- | --- | -| 线程一 | 待分配 | 未认领 | 2026-04-20 已完成 `src/views/props/props-source-group/index.vue`、`src/views/sys/country-code/index.vue`、`src/views/user/app-manager/index.vue`、`src/views/sys/notice-message/index.vue` 与 `src/views/sys/start-page/index.vue` 国际化收口;当前无进行中任务 | -| 线程二 | 待分配 | 未认领 | 2026-04-17 已完成 `src/views/message/push/index.vue`、`src/views/message/push/new-push-form.vue`、`src/views/message/push/push-log.vue`、`src/views/message/push/push-task.vue` 的国际化收口、语言 key 补充、中文残留扫描、构建验证与 md 同步;`push-text-store.vue` 已登记为当前未纳入入口渲染链的排除项 | -| 线程三 | 待分配 | 未认领 | 2026-04-20 已完成 `src/views/tools/redis/index.vue` 与 `src/views/tools/upload/index.vue` 国际化收口、语言 key 补充、中文残留扫描、构建验证与 md 同步;当前无进行中任务,后续按临时规则优先处理“已完成 views 页面私有组件复查” | +| 线程一 | 进行中 | `src/views/family/config` | 2026-04-22 已认领 `家族配置 / Family Configuration` 模块:`index.vue` + `config-level/index.vue` + `config-create-role/index.vue` + `config-weekly-reward/index.vue` | +| 线程二 | 进行中 | `src/views/game/ludo/index.vue` | 2026-04-22 已按规则重新读取协作文档与语言文件,现认领 Ludo 对局页面国际化、中文残留扫描、构建验证与 md 同步 | +| 线程三 | 进行中 | `src/views/version/app/index.vue` | 2026-04-22 已按规则重新读取协作文档、主路由清单与语言文件,现认领 `版本管理 / Version Management` 模块:`index.vue` + `app-version-edit.vue` + `app-update-content.vue` | | 线程四 | 待分配 | 未认领 | 避免和其他线程同时编辑同一语言模块 | ## 最新认领记录 +- 2026-04-22 + - 线程三已新认领:`src/views/version/app/index.vue` + - 同步纳入范围: + - `src/views/version/app/app-version-edit.vue` + - `src/views/version/app/app-update-content.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已重新读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取 `src/views/external/im.vue`,确认该主路由页面当前仅为纯 iframe,无待翻静态展示文本 + - 已读取 `src/views/version/app/index.vue` + - 已读取 `src/views/version/app/app-version-edit.vue` + - 已读取 `src/views/version/app/app-update-content.vue` + - 已核对 `src/views/version/app` 目录当前可见文件为 `index.vue`、`app-version-edit.vue`、`app-update-content.vue` + - 已确认线程一当前认领 `src/views/family/config`、线程二当前认领 `src/views/game/ludo/index.vue`,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立刻复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/version/app/index.vue` + - `src/views/version/app/app-version-edit.vue` + - `src/views/version/app/app-update-content.vue` + - 筛选区、表格列头、状态展示、操作菜单、弹窗标题、表单标签、placeholder、按钮、校验提示、确认弹窗与本地提示国际化 + - 新增或复用 `pages.appVersionManager` 页面级 key + - 目录级中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 路由路径 + - 平台 / 渠道 / 语言 / appType 等提交值与接口依赖值 + - 版本号、构建号、下载链接、描述内容等动态数据 + - 新增、编辑、删除、服务强更与分页逻辑 + +- 2026-04-22 + - 线程三已完成:`src/views/team/bd-lead/index.vue` + - 同步完成: + - `src/views/team/bd-lead/add-bd-lead.vue` + - `src/views/team/bd-lead/bind-bd.vue` + - 完成范围包括: + - 筛选区、表格列头、操作菜单、抽屉标题、表单标签、placeholder、按钮、校验提示、确认弹窗与本地提示国际化 + - 新增 `pages.bdLead` + - 目录级中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` 同步更新 + - 页面私有组件状态: + - `src/views/team/bd-lead/add-bd-lead.vue`:已随页面同步完成 + - `src/views/team/bd-lead/bind-bd.vue`:已随页面同步完成 + - 补充说明: + - 未改动接口参数、权限码、路由路径、动态区域/成员/用户资料数据与新增/编辑/删除/绑定/分页逻辑 + - `npm run build:prod` 已通过,仍为项目既有 warning + - 线程三本轮完成后切回待分配 + +- 2026-04-22 + - 线程二已新认领:`src/views/game/ludo/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/game/ludo/index.vue` + - 已核对 `src/views/game/ludo` 目录仅包含当前 `index.vue` + - 已确认线程一当前认领 `src/views/family/config`、线程三当前认领 `src/views/team/bd-lead/index.vue`,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/game/ludo/index.vue` + - 筛选区 placeholder、搜索按钮、表格列头、玩家弹窗标题、按钮、分页提示、确认弹窗与本地状态/事件展示映射国际化 + - 新增或复用 `pages.gameLudo` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - `RUN`、`HISTORY`、`WAIT`、`PROGRESS`、`END`、`BACK_DISBAND` 等状态值 + - `permissionsSysOriginPlatforms`、`SearchRoomInput` 与接口返回的动态数据 + - 解散对局、加载更多与查询逻辑 + +- 2026-04-22 + - 线程一已新认领:`src/views/family/config/index.vue` + - 同步纳入范围: + - `src/views/family/config/config-level/index.vue` + - `src/views/family/config/config-create-role/index.vue` + - `src/views/family/config/config-weekly-reward/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已重新读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取 `src/views/family/config/index.vue`,并确认其通过 tab 直接渲染 3 个子页 + - 已核对 `src/views/family/config` 目录文件列表,仅包含入口页与 3 个可见子页 + - 已对上述 4 个文件执行中文扫描,确认当前未被其他线程认领 + - 已按规则先更新 md,写完后需立刻复读 4 份 md 再开始源码改动 + - 认领范围包括: + - 家族配置入口页 tab 标题国际化 + - 家族等级配置、创建家族规则、创建每周奖励规则 3 个可见子页的静态展示文案国际化 + - 新增或复用 `pages.familyConfig` 页面级 key + - 目录级中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 平台枚举值 + - 等级 key / 类型 value / 资源类型 value + - 接口返回的资源名称、徽章名称、礼物名称等动态数据 + - 新增、修改、查询逻辑 + +- 2026-04-22 + - 线程三已新认领:`src/views/team/bd-lead/index.vue` + - 同步纳入范围: + - `src/views/team/bd-lead/add-bd-lead.vue` + - `src/views/team/bd-lead/bind-bd.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已重新读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/team/bd-lead/index.vue` + - 已读取并扫描 `src/views/team/bd-lead/add-bd-lead.vue` + - 已读取并扫描 `src/views/team/bd-lead/bind-bd.vue` + - 已核对 `src/views/team/bd-lead` 目录当前可见文件为 `index.vue`、`add-bd-lead.vue`、`bind-bd.vue` + - 已确认线程一、线程二当前无进行中任务,当前无其他线程认领该模块 + - 已按规则先更新 md,写完后需立刻复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/team/bd-lead/index.vue` + - `src/views/team/bd-lead/add-bd-lead.vue` + - `src/views/team/bd-lead/bind-bd.vue` + - 筛选区、表格列头、操作菜单、抽屉标题、表单标签、placeholder、按钮、校验提示、确认弹窗与本地提示国际化 + - 新增或复用 `pages.bdLead` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 权限码 + - 路由路径 + - 区域、成员、用户资料等动态或接口返回内容 + - 新增、编辑、删除、绑定与分页逻辑 + +- 2026-04-22 + - 线程三已完成:`src/views/user/custom-gift/index.vue` + - 完成范围包括: + - 筛选区、状态/类型展示、表格列头、下载操作文案、成功与失败提示国际化 + - 新增 `pages.userCustomGift` + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` 同步更新 + - 补充说明: + - 本轮不修改接口参数、状态与类型实际值、区域/用户/资源地址等动态或接口返回内容,以及审核切换、下载与分页逻辑 + - `src/views/user/custom-gift/index.vue` 当前无中文残留 + - 直接执行 `npm run build:prod` 构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程三本轮完成后切回待分配 + +- 2026-04-22 + - 线程三已新认领:`src/views/user/custom-gift/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已重新读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/user/custom-gift/index.vue` + - 已核对 `src/views/user/custom-gift` 目录仅包含当前 `index.vue` + - 已确认线程一、线程二当前无进行中任务,当前无其他线程认领 `src/views/user/custom-gift/index.vue` + - 已按规则先更新 md,写完后需立刻复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/user/custom-gift/index.vue` + - 筛选区、状态/类型展示、表格列头、下载操作文案、成功与失败提示国际化 + - 新增或复用 `pages.userCustomGift` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 状态与类型实际值 + - 区域、用户、资源地址等动态或接口返回内容 + - 审核切换、下载与分页逻辑 + +- 2026-04-22 + - 线程一已完成:`src/views/user/im-account-manager/index.vue` + - 完成范围包括: + - 筛选区、提示说明、表格列头、操作按钮、弹窗标题、表单标签、placeholder、校验提示与确认弹窗国际化 + - 新增 `pages.imAccountManager` + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮未修改接口参数、默认密码值 `88888888`、动态昵称与业务逻辑 + - `src/views/user/im-account-manager/index.vue` 当前无中文残留 + - 直接执行 `npm run build:prod` 构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程一本轮完成后切回待分配 + +- 2026-04-22 + - 线程二已完成:`src/views/tools/websocket/index.vue` + - 完成范围包括: + - 广播订阅与点对点卡片标题、步骤说明、表单标签、placeholder、按钮、状态提示与本地错误提示国际化 + - 新增 `pages.websocketTool` + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮不修改 Socket 端点默认值、接口参数、订阅地址与发送地址实际值、Token/用户 ID/消息体字段和 WebSocket 连接发送逻辑 + - `src/views/tools/websocket/index.vue` 当前无中文残留 + - 直接执行 `npm run build:prod` 构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程二本轮完成后切回待分配 + +- 2026-04-22 + - 线程一已新认领:`src/views/user/im-account-manager/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已重新读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/user/im-account-manager/index.vue` + - 已核对 `src/views/user/im-account-manager` 目录仅包含当前 `index.vue` + - 已确认当前无其他线程认领该文件 + - 已按规则先更新 md,写完后需立刻复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/user/im-account-manager/index.vue` + - 筛选区、提示说明、表格列头、操作按钮、弹窗标题、表单标签、placeholder、校验提示与确认弹窗国际化 + - 新增或复用 `pages.imAccountManager` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 默认密码值 `88888888` + - 用户昵称等动态数据 + - 删除、重置密码与新增逻辑 + +- 2026-04-22 + - 线程一已完成:`src/views/sys/request-blacklist/index.vue` + - 完成范围包括: + - 请求黑名单页面新增按钮、确认弹窗、输入提示、提示文案与本地错误提示国际化 + - 新增 `pages.requestBlacklist` + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮未修改接口参数、黑名单内容值本身、路由路径与新增删除逻辑 + - `src/views/sys/request-blacklist/index.vue` 当前无中文残留 + - 直接执行 `npm run build:prod` 构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程一本轮完成后切回待分配 + +- 2026-04-22 + - 线程二已新认领:`src/views/tools/websocket/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/tools/websocket/index.vue` + - 已核对 `src/views/tools/websocket` 目录仅包含当前 `index.vue` + - 已确认线程一当前认领 `src/views/sys/request-blacklist/index.vue`,线程三当前无进行中任务,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/tools/websocket/index.vue` + - 广播订阅与点对点卡片标题、步骤说明、表单标签、placeholder、按钮、状态提示与本地错误提示国际化 + - 新增或复用 `pages.websocketTool` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - Socket 端点默认值 + - 接口参数 + - 订阅地址与发送地址实际值 + - Token、用户 ID 与消息体字段 + - WebSocket 连接、订阅与发送逻辑 + +- 2026-04-22 + - 线程一已新认领:`src/views/sys/request-blacklist/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/sys/request-blacklist/index.vue` + - 已确认当前无其他线程认领该文件 + - 已按规则先更新 md,写完后需立刻复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/sys/request-blacklist/index.vue` + - 按钮、确认弹窗、输入提示、提示文案与本地错误提示国际化 + - 新增或复用 `pages.requestBlacklist` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 黑名单内容值本身 + - 路由路径 + - 删除与新增逻辑 + +- 2026-04-22 + - 线程二已完成:`src/views/tools/gold-analyze/index.vue` + - 完成范围包括: + - 筛选区 placeholder、日期区间文案、搜索按钮、图表标题、副标题与本地 warn 提示国际化 + - 新增 `pages.goldAnalyze` + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮不修改接口参数、图表返回数据、`originName` 动态数据、图表配置结构与查询逻辑 + - `src/views/tools/gold-analyze/index.vue` 当前无中文残留 + - 直接执行 `npm run build:prod` 构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程二本轮完成后切回待分配 + +- 2026-04-22 + - 线程二已新认领:`src/views/tools/gold-analyze/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/tools/gold-analyze/index.vue` + - 已确认线程一、线程三当前均无进行中任务,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/tools/gold-analyze/index.vue` + - 筛选区 placeholder、日期区间文案、搜索按钮、图表标题、副标题与本地 warn 提示国际化 + - 新增或复用 `pages.goldAnalyze` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 图表返回数据 + - `originName` 动态数据 + - 图表配置结构与查询逻辑 + +- 2026-04-22 + - 线程二已完成:`src/views/tools/compensate-order/index.vue` + - 完成范围包括: + - 订单补偿与糖果补偿表单标题、标签、placeholder、按钮、校验文案与确认弹窗国际化 + - 新增 `pages.compensateOrder` + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮不修改接口参数、提交字段、平台枚举值、支付方式实际 value 或提交逻辑 + - `src/views/tools/compensate-order/index.vue` 当前无中文残留 + - 直接执行 `npm run build:prod` 构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程二本轮完成后切回待分配 + +- 2026-04-22 + - 线程一已完成:`src/views/tools/other` Utilities 路由页 + - 完成范围包括: + - `src/views/tools/other/index.vue` + - `src/views/tools/other/alias-method.vue` + - `src/views/tools/other/api-sign.vue` + - `src/views/tools/other/redis-ops.vue` + - `src/views/tools/other/token-parse.vue` + - `src/views/tools/other/user-cancel-and-restore.vue` + - `src/views/tools/other/user-room-region.vue` + - `src/views/tools/other/user-swap-user.vue` + - 入口页卡片标题、页面内功能文件的表单标签、placeholder、按钮、弹窗标题、校验提示、本地展示说明与本地检查项描述国际化 + - 新增 `pages.toolsOther` 模块级语言 key,便于后续语言继续复用同一键名结构 + - 对 `src/views/tools/other/*.vue` 执行目录级中文残留扫描 + - 构建验证 + - 同步更新 `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` + - 补充说明: + - 按原始接口返回与 `src/views/tools/other/index.vue` 的直接引用关系,当前记为“一个主路由页面 + 多个页面内功能文件”,不记为多个独立路由 + - 当前残留中文仅为 `alias-method.vue` 中会随表单提交到接口的快速填充样例值,以及 `user-swap-user.vue` 中注释掉的提示代码 + - 上述样例值属于提交数据,不按纯展示文案翻译,避免影响接口入参 + - 直接执行 `npm run build:prod` 已通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程一本轮完成后切回待分配 + +- 2026-04-22 + - 线程二已新认领:`src/views/tools/compensate-order/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/tools/compensate-order/index.vue` + - 已核对 `src/views/tools/compensate-order` 目录仅包含当前 `index.vue` + - 已确认线程一当前认领 `src/views/tools/other`,线程三当前无进行中任务,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/tools/compensate-order/index.vue` + - 订单补偿与糖果补偿表单标题、标签、placeholder、按钮、校验文案与确认弹窗国际化 + - 新增或复用 `pages.compensateOrder` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 提交字段 + - 平台枚举值 + - 支付方式实际 value + - 订单补偿与糖果补偿提交逻辑 + +- 2026-04-22 + - 线程二已完成:`src/views/401.vue` + - 完成范围包括: + - 401 权限错误页标题、副标题、导航提示、链接文案与图片弹窗标题国际化 + - 新增 `pages.page401` + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮不修改路由路径、返回上一页逻辑、首页跳转路径、图片资源或远程图片地址 + - `src/views/401.vue` 当前无中文残留 + - 本机当前直接执行 `npm run build:prod` 可通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 本机当前设置 `$env:NODE_OPTIONS='--openssl-legacy-provider'` 反而会报 `--openssl-legacy-provider is not allowed in NODE_OPTIONS`,新线程不要先默认加该变量 + - 线程二本轮完成后切回待分配 + +- 2026-04-22 + - 线程二已新认领:`src/views/401.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取并扫描 `src/views/401.vue` + - 已确认线程一当前认领 `src/views/tools/other`,线程三当前无进行中任务,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/401.vue` + - 401 权限错误页标题、副标题、导航提示、链接文案与图片弹窗标题国际化 + - 新增或复用 `pages.page401` 页面级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 路由路径 + - 返回上一页逻辑 + - 首页跳转路径 + - 图片资源与远程图片地址 + +- 2026-04-22 + - 线程一已新认领:`src/views/tools/other` Utilities 路由页 + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取并扫描 `src/views/tools/other` 目录文件列表 + - 已确认当前没有其他线程认领该模块 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/tools/other/index.vue` + - `src/views/tools/other/alias-method.vue` + - `src/views/tools/other/api-sign.vue` + - `src/views/tools/other/redis-ops.vue` + - `src/views/tools/other/token-parse.vue` + - `src/views/tools/other/user-cancel-and-restore.vue` + - `src/views/tools/other/user-room-region.vue` + - `src/views/tools/other/user-swap-user.vue` + - 按原始接口返回与入口页引用关系,一并作为同路由下的页面内功能文件处理 + - 入口页卡片标题、表单标签、placeholder、按钮、弹窗标题、校验提示、本地展示说明与本地检查项描述国际化 + - 优先新增 `pages.toolsOther` 模块级 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与必要的路由进度同步更新 + - 不包括: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 + - 表单提交字段 + - `CLEAR_KEYS`、`TOKEN_PARSE`、`GET_TOKEN` 等模式值 + +- 2026-04-22 + - 线程三已完成:`src/views/activity/template-cnf` 页面私有组件复查 + - 完成范围包括: + - `src/views/activity/template-cnf/activity-rank.vue` + - `src/views/activity/template-cnf/activity-rank-reward.vue` + - `src/views/activity/template-cnf/form-edit.vue` + - `src/views/activity/template-cnf/reward-edit.vue` + - `src/views/activity/template-cnf/template-editor/attr-editor.vue` + - `src/views/activity/template-cnf/template-editor/index.vue` + - `src/views/activity/template-cnf/template-editor/lang-text-editor.vue` + - `src/views/activity/template-cnf/template-editor/page-editor.vue` + - `src/views/activity/template-cnf/template-editor/props-card.vue` + - `src/views/activity/template-cnf/template-editor/reward-array-editor.vue` + - `src/views/activity/template-cnf/template-form/index.vue` + - 活动排名弹窗、奖品编辑、模板编辑器、模板表单与本地道具类型展示映射国际化 + - 补充 `pages.activityTemplateManage` 语言 key + - 对 `src/views/activity/template-cnf` 执行目录级中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` 同步更新 + - 补充说明: + - 本轮不修改接口参数、路由路径、权限码、提交字段或后端依赖值 + - 当前 `src/views/activity/template-cnf` 目录残余中文均为 `index.vue` 注释或源码注释,不属于可见展示文案 + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程三本轮完成后切回待分配,暂不继续认领新任务 + +- 2026-04-22 + - 线程二已完成:`src/views/team/components/TeamCreate/index.vue` + - 完成范围包括: + - 主播中心共享私有创建团队组件中的抽屉标题、表单标签、placeholder、单选展示文案、分组标题、按钮、校验提示与提交中提示国际化 + - 新增 `pages.teamCreate` 独立 key,避免继续扩散 `pages.businessDevelopment` 的页面语义 + - 将表单校验规则改为 computed 中按当前语言取值,支持语言切换后重新取当前文案 + - 中文残留扫描 + - 语言文件随生产构建完成校验 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮不修改接口参数、路由路径、权限码、表单提交字段或后端依赖值 + - `bindBd` 的 `yes/no` 绑定值、`bdAccountDefaultSelectType` 的 `LONG` 值与 `contactTypes` 的实际 value 均保持原样 + - `src/views/team/components/TeamCreate/index.vue` 当前无中文残留 + - `node --check` 不适合直接检查当前 `export default` 语言文件;本轮以生产构建结果作为语言文件校验依据 + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程二本轮完成后切回待分配,暂不继续认领新任务 + +- 2026-04-22 + - 线程二已新认领:`src/views/team/components/TeamCreate/index.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取共享私有组件 `src/views/team/components/TeamCreate/index.vue` + - 已核对该组件目录仅包含当前 `index.vue` + - 已核对引用位置:`src/views/team/business-development/index.vue` 与 `src/views/team/team-list/index.vue` 当前直接 import;`src/views/team/bd-lead/index.vue` 仅出现同名状态/方法文本匹配,未在本次直接引用扫描中命中 import + - 已执行当前组件中文扫描,确认待处理中文集中在抽屉标题、表单标签、placeholder、按钮、校验提示与提交中提示 + - 已确认线程一当前待分配,线程三当前认领 `src/views/activity/template-cnf/**`,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/team/components/TeamCreate/index.vue` + - 主播中心共享私有创建团队组件中的静态展示文本、抽屉标题、表单标签、placeholder、单选展示文案、分组标题、按钮、校验提示与提交中提示国际化 + - 优先复用 `pages.businessDevelopment` 既有 key,必要时补充 `pages.teamCreate` 独立 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包括: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 + - 表单提交字段 + - `bindBd` 的 `yes/no` 绑定值与 `bdAccountDefaultSelectType` 的 `LONG` 值 + +- 2026-04-22 + - 线程一已完成:`src/views/cnf/lottery/select-prize.vue` + - 完成范围包括: + - 转盘抽奖品配置页面奖品选择弹窗标题、表单标签、placeholder、按钮、校验提示、类型分组与类型选项展示国际化 + - 保持 `value`、`type`、接口字段、提交字段、路由路径与后端依赖值原样 + - 类型分组与选项改为 `labelKey` 展示映射,便于后续 `bn`、`ar`、`tr` 等语言文件复用同一组 key + - 补充 `pages.lotteryConfig.placeholder.select/quantity`、`pages.lotteryConfig.validation.requiredField` 与 `pages.lotteryConfig.selectPrize` + - 对 `src/views/cnf/lottery/*.vue` 执行目录级中文残留扫描 + - 执行语言文件语法检查与构建验证 + - 同步更新 `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` + - 补充说明: + - 当前 `src/views/cnf/lottery` 目录残余中文仅为 `index.vue` 中“扩展属性”注释,不属于可见展示文案 + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程一本轮完成后切回待分配,暂不继续认领新任务 + +- 2026-04-22 + - 线程三已新认领:`src/views/activity/template-cnf` 页面私有组件复查 + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取入口页 `src/views/activity/template-cnf/index.vue` + - 已核对 `src/views/activity/template-cnf` 目录文件列表、入口页本地 import 与子目录文件 + - 已执行 `src/views/activity/template-cnf` 目录级中文扫描 + - 已确认线程一当前认领 `src/views/cnf/lottery/select-prize.vue`,线程二在 `翻译清单.md` 与 `翻译进度.md` 中当前无进行中任务,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/activity/template-cnf/activity-rank.vue` + - `src/views/activity/template-cnf/activity-rank-reward.vue` + - `src/views/activity/template-cnf/form-edit.vue` + - `src/views/activity/template-cnf/reward-edit.vue` + - `src/views/activity/template-cnf/template-editor/attr-editor.vue` + - `src/views/activity/template-cnf/template-editor/index.vue` + - `src/views/activity/template-cnf/template-editor/lang-text-editor.vue` + - `src/views/activity/template-cnf/template-editor/page-editor.vue` + - `src/views/activity/template-cnf/template-editor/props-card.vue` + - `src/views/activity/template-cnf/template-editor/reward-array-editor.vue` + - `src/views/activity/template-cnf/template-form/index.vue` + - 活动管理页面同目录私有组件、活动排名弹窗、奖品编辑、模板编辑器与模板表单中的静态展示文本、按钮、placeholder、表格列头、提示、确认弹窗与本地展示映射国际化复核 + - 优先复用并补充 `pages.activityTemplateManage` 既有 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` 同步更新 + - 不包括: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 + +- 2026-04-22 + - 线程一已新认领:`src/views/cnf/lottery/select-prize.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` 中 `pages.lotteryConfig` 相关 key + - 已读取 `src/views/cnf/lottery/index.vue` + - 已读取 `src/views/cnf/lottery/select-prize.vue` + - 已读取 `src/views/cnf/lottery` 目录文件列表,确认该目录仅包含入口页与当前私有组件 + - 已对 `src/views/cnf/lottery/*.vue` 执行中文扫描,确认入口页残留中文仅为注释,当前私有组件仍有可见中文 + - 已确认当前没有其他线程认领该私有组件 + - 已按最新规则先更新 md,再开始源码改动 + - 认领范围包括: + - `src/views/cnf/lottery/select-prize.vue` + - 奖品选择弹窗标题、表单标签、placeholder、按钮、校验提示、类型分组与类型选项展示国际化 + - 优先复用并补充 `pages.lotteryConfig` 既有 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` 同步更新 + - 不包括: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 +- 2026-04-21 + - 线程三已完成:`src/views/room/profile` 页面同目录私有组件复查 + - 完成范围包括: + - `src/views/room/profile/room-active-charts.vue` + - `src/views/room/profile/room-operation-log.vue` + - `src/views/room/profile/room-visitor-log.vue` + - `src/views/room/profile/user-drawer.vue` + - 弹窗/抽屉标题、筛选 placeholder、按钮、表格列头、角色展示、图表标题与图表 series 名称国际化 + - `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` 中 `pages.roomProfile` key 补充 + - 图表组件监听 `language`,支持运行时切换语言后重绘 legend 与 series 名称 + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` 同步更新 + - 补充说明: + - 本轮不修改接口参数、路由路径、权限码、提交字段或后端依赖值 + - `roomRoles` 常量值保持原样,仅在页面展示层按 `HOMEOWNER`、`ADMIN`、`MEMBER` 映射翻译 + - 当前 `src/views/room/profile` 目录残余中文均在 `index.vue` 注释或注释掉的历史菜单代码中,不属于本轮可见展示文案 + - 首次直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程三本轮完成后切回待分配,暂不继续认领新任务 + +- 2026-04-21 + - 线程二已完成:`src/views/team/business-development` 页面同目录私有组件复查 + - 完成范围包括: + - `src/views/team/business-development/add-bd.vue` + - `src/views/team/business-development/auth.vue` + - `src/views/team/business-development/bind-bd-leader.vue` + - `src/views/team/business-development/bind-team.vue` + - `src/views/team/business-development/team-member.vue` + - 弹窗/抽屉标题、表单标签、placeholder、按钮、校验提示、提交中提示、表格列头、复制/删除反馈与确认弹窗国际化 + - `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` 中 `pages.businessDevelopment` key 补充 + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 补充说明: + - 本轮不修改接口参数、路由路径、权限码、提交字段或后端依赖值 + - `src/views/team/business-development/index.vue` 当前残留中文主要为注释,以及未传入本轮组件的历史 `textOptTitle` 赋值,不属于本轮私有组件可见文案 + - `src/views/team/components/TeamCreate/index.vue` 为 `bd-lead`、`team-list`、`business-development` 多页面共用组件,已保留为后续单独认领或随主要归属页面统一复查 + - 首次直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过,仍为项目既有 `22` 条 warning,未新增阻塞错误 + - 线程二本轮完成后切回待分配,暂不继续认领新任务 + +- 2026-04-21 + - 线程三已新认领:`src/views/room/profile` 页面私有组件复查 + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取入口页 `src/views/room/profile/index.vue` + - 已核对 `src/views/room/profile` 目录文件列表与入口页本地组件 + - 已执行 `src/views/room/profile` 目录级中文扫描 + - 已确认线程二当前认领 `src/views/team/business-development` 私有组件,线程一当前无进行中任务,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/room/profile/room-active-charts.vue` + - `src/views/room/profile/room-operation-log.vue` + - `src/views/room/profile/room-visitor-log.vue` + - `src/views/room/profile/user-drawer.vue` + - 房间资料列表同目录私有组件的静态展示文本、弹窗标题、筛选 placeholder、按钮、表格列头、角色展示、图表标题与图表 series 名称国际化复核 + - 优先复用并补充 `pages.roomProfile` 既有 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` 同步更新 + - 不包括: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 +- 2026-04-21 + - 线程一已完成:`src/views/team/diamond-policy/props-form-edit.vue` + - 完成范围包括: + - 代理钻石政策页面私有道具配置抽屉的静态展示文本复核 + - 可触发表单校验提示改为复用 `pages.propsSourceGroupForm.validation.requiredField` + - 资源类型兜底展示名称去除中文字面量;实际资源类型展示仍优先复用 `pages.propsSourceGroupForm.resourceType` + - 对 `src/views/team/diamond-policy/*.vue` 执行目录级中文残留扫描 + - 执行构建验证 + - 同步更新 `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` + - 补充说明: + - `pItem.name`、`item.badgeName`、礼物/徽章/道具名称等接口返回或动态数据保持原样 + - 当前 `src/views/team/diamond-policy` 目录残余中文均为注释中的中文,不属于可见展示文案 + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED`;随后使用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过,仍保留项目既有 `22` 条 warning,未新增阻塞错误 +- 2026-04-21 + - 线程二已新认领:`src/views/team/business-development` 页面私有组件复查 + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取最新 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` + - 已读取入口页 `src/views/team/business-development/index.vue` + - 已核对 `src/views/team/business-development` 目录文件列表与入口页本地 import + - 已执行 `src/views/team/business-development` 目录级中文扫描 + - 已确认线程一当前认领 `src/views/team/diamond-policy/props-form-edit.vue`,线程三当前无进行中任务,本轮不与其他线程冲突 + - 已按规则先更新 md,写完后需立即复读 4 份 md 再开始源码改动 + - 认领范围包括: + - `src/views/team/business-development/add-bd.vue` + - `src/views/team/business-development/auth.vue` + - `src/views/team/business-development/bind-bd-leader.vue` + - `src/views/team/business-development/bind-team.vue` + - `src/views/team/business-development/team-member.vue` + - 私有组件内静态展示文本、弹窗标题、表单标签、placeholder、按钮、校验提示、提交中提示、表格列头、复制/删除反馈与确认弹窗国际化复核 + - 优先复用并补充 `pages.businessDevelopment` 既有 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 暂不纳入: + - `src/views/team/components/TeamCreate/index.vue` + - 原因:该组件由 `bd-lead`、`team-list`、`business-development` 多个页面共用,虽然位于 `src/views` 下,但不是本轮 business-development 同目录私有组件;后续应作为共享私有组件单独认领或随其主要归属页面统一复查 + - 不包括: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 +- 2026-04-21 + - 线程一已新认领:`src/views/team/diamond-policy/props-form-edit.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取 `src/lang/messages/pages/en.js` 与 `src/lang/messages/pages/zh.js` 中相关 key 位置 + - 已读取 `src/views/team/diamond-policy/index.vue` + - 已读取 `src/views/team/diamond-policy/props-form-edit.vue` + - 已读取 `src/views/team/diamond-policy` 目录文件列表,确认该目录仅包含入口页与当前私有组件 + - 已对 `src/views/team/diamond-policy/*.vue` 执行中文扫描 + - 已确认当前没有其他线程认领该私有组件 + - 已按最新规则先更新 md,再开始源码改动 + - 认领范围包括: + - `src/views/team/diamond-policy/props-form-edit.vue` + - 私有组件静态展示文本、按钮、placeholder、校验提示、失败提示与资源类型展示国际化复核 + - 优先复用 `pages.teamDiamondPolicy` 与 `pages.propsSourceGroupForm` 既有 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包含: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 +- 2026-04-21 + - 线程三已完成:`src/views/team/policy/props-form-edit.vue` + - 完成范围包括: + - 代理政策页面私有道具配置抽屉的静态展示文本国际化 + - 奖励明细描述、添加配置表单、placeholder、校验提示、资源类型按钮、抽屉标题、保存/取消按钮与配置缺失提示国际化 + - 复用并扩展 `pages.propsSourceGroupForm` 既有 key,本轮仅新增 `pages.propsSourceGroupForm.action.view` + - 对 `src/views/team/policy/props-form-edit.vue` 执行中文残留扫描 + - 对 `src/views/team/policy/*.vue` 执行目录级中文扫描 + - 执行构建验证 + - 同步更新 `docs/i18n/翻译进度.md`、`docs/i18n/翻译清单.md` 与 `docs/i18n/主要路由.md` + - 补充说明: + - `pItem.name`、`item.badgeName`、接口返回礼物/徽章/道具名称等动态数据保持原样 + - 当前 `src/views/team/policy` 目录残余中文均为注释中的中文,不属于可见展示文案 + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED`;随后使用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 构建通过,仍保留项目既有 `22` 条 warning,未新增阻塞错误 +- 2026-04-21 + - 线程三已新认领:`src/views/team/policy/props-form-edit.vue` + - 领取前动作: + - 已重新读取 `docs/i18n/线程协作.md` + - 已重新读取 `docs/i18n/翻译进度.md` + - 已重新读取 `docs/i18n/翻译清单.md` + - 已重新读取 `docs/i18n/主要路由.md` + - 已读取 `src/views/team/policy/index.vue` + - 已读取 `src/views/team/policy/props-form-edit.vue` + - 已读取 `src/views/team/policy` 目录文件列表,确认该目录仅包含入口页与当前私有组件 + - 已确认当前没有其他线程认领该私有组件 + - 已按最新规则先更新 md,再开始源码改动 + - 认领范围包括: + - `src/views/team/policy/props-form-edit.vue` + - 私有组件静态展示文本、按钮、placeholder、校验提示、失败提示与资源类型展示国际化 + - 优先复用 `pages.teamPolicy` 与 `pages.propsSourceGroupForm` 既有 key,必要时补充语义 key + - 中文残留扫描 + - 构建验证 + - `docs/i18n/翻译进度.md` 与 `docs/i18n/翻译清单.md` 同步更新 + - 不包含: + - 接口参数 + - 路由路径 + - 权限码 + - 后端依赖值 - 2026-04-20 - 全线程临时任务更新: - 暂停继续领取新的未完成普通页面 @@ -1579,6 +2384,7 @@ 8. 修改完成后先本地构建验证 9. 把结果同步写入 `翻译进度.md` 和 `翻译清单.md` 10. 在线程认领表里把状态改为“已完成”或“阻塞” +11. 后续不要再新认领非主要路由页面;已经处理过的非主要路由保持现状即可 ## 线程之间如何“保持联系” diff --git a/docs/i18n/翻译清单.md b/docs/i18n/翻译清单.md index ae22181..78c6ce3 100644 --- a/docs/i18n/翻译清单.md +++ b/docs/i18n/翻译清单.md @@ -14,9 +14,9 @@ ### 翻译范围 -- 扫描项目中的中文展示文本 -- 只要不是涉及接口参数的内容,都要做翻译 -- 路由、导航、页面标题、选项、按钮、表单标签、表格列名、提示文案、空态文案等都属于处理范围 +- 后续任务范围只限 `docs/i18n/主要路由.md` 中列出的主要路由页面,以及这些页面直接涉及到的页面内组件 / 私有组件 +- 已经处理过的其他非主要路由页面保持现状,不回滚,也不再继续扩展翻译 +- 主要路由范围内,路由、导航、页面标题、选项、按钮、表单标签、表格列名、提示文案、空态文案等都属于处理范围 ### 禁止改动项 @@ -51,7 +51,7 @@ ## 领取优先级 - 适用于所有线程,不只线程三 -- 统一领取优先级:`已完成 src/views 页面私有组件复查 > 首页 > docs/i18n/主要路由.md > 其他路由` +- 统一领取优先级:`已完成 src/views 页面私有组件复查 > 首页 > docs/i18n/主要路由.md` - 在“已完成 `src/views` 页面私有组件复查”完成前,暂不继续领取新的未完成普通页面 - 只要首页或 `主要路由.md` 中页面仍未完成,后续线程都应优先从这两部分中选择任务 - `主要路由.md` 中具体优先领取哪个页面,仍可按原来的协作方式灵活分配,只要先读 md、先写认领、避免冲突 @@ -62,37 +62,51 @@ - 详细父子级结构、路由别名、路径与入口文件统一见 `docs/i18n/主要路由.md` - 以下索引已按 `docs/i18n/主要路由.md` 当前父子级顺序同步更新 +- 系统管理 / System Management + - App系统 / App System + - 请求黑名单 / Request Blacklist - 用户管理 / User Management - 用户列表 / User List + - 用户专属礼物制作 / User Custom Gift Creation - 运营管理 / Operations Management - 数据配置 / Data Configuration - - 转盘抽奖品配置 / Spin Wheel Prize Configuration - 国家管理 / Country Management + - IM账号管理 / IM Account Management - 活动配置 / Activity Configuration - 活动管理 / Activity Management + - 活动模版 / Activity Template - 消息推送 / Message Push - - 运营日志 / Operations Logs - - 砸金蛋记录 / Golden Egg Smash Records - APP管理员 / App Administrator - App启动页 / App Launch Page - 系统公告管理 / System Notice Management + - 金币代理 / Gold Agent + - 区域配置 / Region Configuration - 语音房间 / Voice Rooms - 房间资料列表 / Room Profile List - 道具管理 / Prop Management - 资源组配置 / Resource Group Configuration -- 系统工具 / System Tools - - Redis缓存管理 / Redis Cache Management - - 文件上传 / File Upload - 主播中心 / Broadcaster Center - 代理钻石政策 / Agent Diamond Policy + - BD Lead / BD Lead - 代理政策 / Agent Policy - BD列表 / BD List - 补充页面 + - Redis缓存管理 / Redis Cache Management + - 文件上传 / File Upload + - 小工具 / Utilities + - 金币分析 / Gold Analysis + - 订单补偿 / Order Compensation + - WebSocket调试 / WebSocket Tool - 抽奖概率配置 / Lottery Probability Settings ### 已完成文件平铺清单 - `src/views/login/index.vue` +- `src/views/401.vue` +- `src/views/tools/compensate-order/index.vue` +- `src/views/tools/gold-analyze/index.vue` +- `src/views/tools/websocket/index.vue` +- `src/views/sys/request-blacklist/index.vue` - `src/components/Breadcrumb/index.vue` - `src/components/HeaderSearch/index.vue` - `src/components/SizeSelect/index.vue` @@ -135,14 +149,42 @@ - `src/views/message/push/push-log.vue` - `src/views/message/push/push-task.vue` - `src/views/user/user-table/index.vue` +- `src/views/user/custom-gift/index.vue` - `src/components/data/UserInfo/BaseInfo/index.vue` - `src/views/room/profile/index.vue` +- `src/views/room/profile/room-active-charts.vue` +- `src/views/room/profile/room-operation-log.vue` +- `src/views/room/profile/room-visitor-log.vue` +- `src/views/room/profile/user-drawer.vue` - `src/views/team/policy/index.vue` +- `src/views/team/policy/props-form-edit.vue` - `src/views/props/props-source-group/form-edit.vue` - `src/views/cnf/lottery/index.vue` +- `src/views/cnf/lottery/select-prize.vue` - `src/views/activity/template-cnf/index.vue` +- `src/views/activity/template-cnf/activity-rank.vue` +- `src/views/activity/template-cnf/activity-rank-reward.vue` +- `src/views/activity/template-cnf/form-edit.vue` +- `src/views/activity/template-cnf/reward-edit.vue` +- `src/views/activity/template-cnf/template-editor/attr-editor.vue` +- `src/views/activity/template-cnf/template-editor/index.vue` +- `src/views/activity/template-cnf/template-editor/lang-text-editor.vue` +- `src/views/activity/template-cnf/template-editor/page-editor.vue` +- `src/views/activity/template-cnf/template-editor/props-card.vue` +- `src/views/activity/template-cnf/template-editor/reward-array-editor.vue` +- `src/views/activity/template-cnf/template-form/index.vue` - `src/views/team/business-development/index.vue` +- `src/views/team/business-development/add-bd.vue` +- `src/views/team/business-development/auth.vue` +- `src/views/team/business-development/bind-bd-leader.vue` +- `src/views/team/business-development/bind-team.vue` +- `src/views/team/business-development/team-member.vue` +- `src/views/team/bd-lead/index.vue` +- `src/views/team/bd-lead/add-bd-lead.vue` +- `src/views/team/bd-lead/bind-bd.vue` +- `src/views/team/components/TeamCreate/index.vue` - `src/views/team/diamond-policy/index.vue` +- `src/views/team/diamond-policy/props-form-edit.vue` - `src/components/data/AccountHanle/index.vue` - `src/views/sys/region-config/region/index.vue` - `src/components/data/RoomInfo/index.vue` @@ -192,17 +234,40 @@ - `src/views/user/app-manager/administrator/index.vue` - `src/views/user/app-manager/administrator/auth.vue` - `src/views/user/app-manager/administrator-auth-resource/index.vue` +- `src/views/user/im-account-manager/index.vue` - `src/views/sys/notice-message/index.vue` - `src/views/sys/start-page/index.vue` - `src/views/sys/start-page/form-edit.vue` - `src/views/tools/redis/index.vue` - `src/views/tools/upload/index.vue` +- `src/views/tools/other/index.vue` +- `src/views/tools/other/alias-method.vue` +- `src/views/tools/other/api-sign.vue` +- `src/views/tools/other/redis-ops.vue` +- `src/views/tools/other/token-parse.vue` +- `src/views/tools/other/user-cancel-and-restore.vue` +- `src/views/tools/other/user-room-region.vue` +- `src/views/tools/other/user-swap-user.vue` - 表格展示适配:表头自动换行 + 默认最小宽度补齐 - 表格展示适配:表头 `.cell` 高度自适应 + 纵向居中修正 - 表单展示适配:标题纵向居中 ## 进行中 +- `src/views/game/ludo/index.vue` + - 状态:进行中(线程二) + - 范围:筛选区 placeholder、搜索按钮、表格列头、玩家弹窗标题、按钮、分页提示、确认弹窗与本地状态/事件展示映射国际化;不改接口参数、状态值、动态数据与解散查询逻辑 + +- `src/views/family/config/index.vue` + - 状态:进行中(线程一) + - 同步范围:`src/views/family/config/config-level/index.vue`、`src/views/family/config/config-create-role/index.vue`、`src/views/family/config/config-weekly-reward/index.vue` + - 范围:入口页 tab 标题、3 个可见子页的按钮、表格列头、表单标签、placeholder、弹窗标题、提醒文案与校验提示国际化;不改接口参数、平台 value、等级 key、类型 value、动态资源名称与业务逻辑 + +- `src/views/version/app/index.vue` + - 状态:进行中(线程三) + - 同步范围:`src/views/version/app/app-version-edit.vue`、`src/views/version/app/app-update-content.vue` + - 范围:筛选区、表格列头、状态展示、操作菜单、弹窗标题、表单标签、placeholder、按钮、校验提示、确认弹窗与本地提示国际化;不改接口参数、路由路径、平台/渠道/语言/appType 等提交值、动态版本数据与业务逻辑 + - 临时任务:已完成 `src/views` 页面私有组件复查 - 状态:进行中 - 范围说明: @@ -210,36 +275,9 @@ - 只复查页面私有组件,不包含公共组件目录 `src/components/**` - 后续页面完成记录需要额外写明“私有组件状态” - 当前优先复核目录: - - `src/views/team/policy` - - `src/views/team/diamond-policy` - - `src/views/team/business-development` - - `src/views/room/profile` - - `src/views/activity/template-cnf` - - `src/views/cnf/lottery` + - 暂无明确剩余目录;领取前需重新读取本文件与 `docs/i18n/主要路由.md` 后确认 - 当前已发现但尚未补齐到已完成记录的私有组件: - - `src/views/team/policy/props-form-edit.vue` - - `src/views/team/diamond-policy/props-form-edit.vue` - - `src/views/team/business-development/add-bd.vue` - - `src/views/team/business-development/auth.vue` - - `src/views/team/business-development/bind-bd-leader.vue` - - `src/views/team/business-development/bind-team.vue` - - `src/views/team/business-development/team-member.vue` - - `src/views/room/profile/room-active-charts.vue` - - `src/views/room/profile/room-operation-log.vue` - - `src/views/room/profile/room-visitor-log.vue` - - `src/views/room/profile/user-drawer.vue` - - `src/views/activity/template-cnf/activity-rank.vue` - - `src/views/activity/template-cnf/activity-rank-reward.vue` - - `src/views/activity/template-cnf/form-edit.vue` - - `src/views/activity/template-cnf/reward-edit.vue` - - `src/views/activity/template-cnf/template-editor/attr-editor.vue` - - `src/views/activity/template-cnf/template-editor/index.vue` - - `src/views/activity/template-cnf/template-editor/lang-text-editor.vue` - - `src/views/activity/template-cnf/template-editor/page-editor.vue` - - `src/views/activity/template-cnf/template-editor/props-card.vue` - - `src/views/activity/template-cnf/template-editor/reward-array-editor.vue` - - `src/views/activity/template-cnf/template-form/index.vue` - - `src/views/cnf/lottery/select-prize.vue` + - 当前无 - 当前明确排除: - `src/views/message/push/push-text-store.vue` - 原因:当前未纳入入口渲染链,继续按既有排除项处理 @@ -252,7 +290,7 @@ - 主要路由中已部分完成、但仍需继续收口的入口页 - 主要路由中的其他页面 - 统一参考 `docs/i18n/主要路由.md` - - 当首页与本文件中的“优先待处理”完成后,再继续处理 `主要路由.md` 中剩余未完成页面 + - 后续只继续处理主要路由,不再继续补非主要路由页面 ## 第一批高优先级页面 @@ -286,6 +324,9 @@ - `src/components/data/UserInfo/AccountStatusLatestLog/index.vue`:已完成(线程二) ## 本轮保留项 +- `src/views/cnf/lottery/index.vue` + - 当前保留注释“扩展属性”原样 + - 原因:该内容仅为代码注释,不属于可见展示文案;`select-prize.vue` 已完成奖品选择弹窗私有组件复查 - `src/components/data/AccountHanle/index.vue` - 默认“警告”描述文案保留中文 - 原因:该内容会直接写入提交表单并发给后端,不按纯展示文案处理 @@ -304,6 +345,12 @@ - `src/views/sys/notice-message/index.vue` - 当前保留字段行尾注释与“删除”注释原样 - 原因:均不属于可见展示文案;`permissionsSysOriginPlatforms` 的 `item.label` 作为公共系统来源数据,本轮未改其值 +- `src/views/tools/other/alias-method.vue` + - 当前保留快速填充样例值中的中文名称 + - 原因:`fills` 中的 `name` 会随表单一起提交到接口,属于提交数据,不按纯展示文案处理 +- `src/views/tools/other/user-swap-user.vue` + - 当前保留注释掉的“用户id不可相同”原样 + - 原因:该内容仅存在于注释中,不属于可见展示文案 ## 需持续关注 diff --git a/docs/i18n/翻译进度.md b/docs/i18n/翻译进度.md index 9c20fd2..fa3e0fe 100644 --- a/docs/i18n/翻译进度.md +++ b/docs/i18n/翻译进度.md @@ -9,13 +9,14 @@ ## 当前目标 -- 将项目页面中出现的中文展示文本逐步接入国际化 +- 后续只对 `docs/i18n/主要路由.md` 中的主要路由页面及其直接涉及组件继续做国际化 +- 已经处理过的其他非主要路由页面保持现状,不回滚,也不再继续扩展 - 当前先支持 `en` 和 `zh` - 后续如果增加 `bn`、`ar`、`tr` 等语言,优先复用现有键名体系 ## 任务优先级 -- 全线程统一优先级:`已完成 src/views 页面私有组件复查 > 首页 > docs/i18n/主要路由.md > 其他路由` +- 全线程统一优先级:`已完成 src/views 页面私有组件复查 > 首页 > docs/i18n/主要路由.md` - 在“已完成 `src/views` 页面私有组件复查”完成前,暂不继续领取新的未完成普通页面 - 只要首页 `Dashboard` 模块或 `主要路由.md` 中页面仍未完成,后续线程领取新任务时都应优先从这两部分中选择 - `主要路由.md` 中具体先领哪个页面仍可灵活分配,但不得跳过首页整体优先级 @@ -46,32 +47,40 @@ - 详细父子级结构、路由别名、路径与验收入口统一见 `docs/i18n/主要路由.md` - 以下摘要已按 `docs/i18n/主要路由.md` 当前父子级顺序同步更新 - 已完成主路由摘要: + - 系统管理 / System Management + - App系统 / App System + - 请求黑名单 / Request Blacklist - 用户管理 / User Management - 用户列表 / User List - 运营管理 / Operations Management - 数据配置 / Data Configuration - - 转盘抽奖品配置 / Spin Wheel Prize Configuration - 国家管理 / Country Management + - IM账号管理 / IM Account Management - 活动配置 / Activity Configuration - 活动管理 / Activity Management + - 活动模版 / Activity Template - 消息推送 / Message Push - - 运营日志 / Operations Logs - - 砸金蛋记录 / Golden Egg Smash Records - APP管理员 / App Administrator - App启动页 / App Launch Page - 系统公告管理 / System Notice Management + - 金币代理 / Gold Agent + - 区域配置 / Region Configuration - 语音房间 / Voice Rooms - 房间资料列表 / Room Profile List - 道具管理 / Prop Management - 资源组配置 / Resource Group Configuration - - 系统工具 / System Tools - - Redis缓存管理 / Redis Cache Management - - 文件上传 / File Upload - 主播中心 / Broadcaster Center - 代理钻石政策 / Agent Diamond Policy + - BD Lead / BD Lead - 代理政策 / Agent Policy - BD列表 / BD List - 已完成但未在当前主要路由菜单返回中命中的补充页面: + - Redis缓存管理 / Redis Cache Management + - 文件上传 / File Upload + - 小工具 / Utilities + - 金币分析 / Gold Analysis + - 订单补偿 / Order Compensation + - WebSocket调试 / WebSocket Tool - 抽奖概率配置 / Lottery Probability Settings ### 基础能力 @@ -99,6 +108,296 @@ ## 本轮新增进展 +### 2026-04-22 + +- 已完成页面: + - `src/views/team/bd-lead/index.vue` + - 说明:已完成筛选区、表格列头、操作菜单、抽屉标题、表单标签、placeholder、按钮、校验提示、确认弹窗与本地提示国际化;接口参数、权限码、路由路径、区域/成员/用户资料等动态或接口返回内容,以及新增、编辑、删除、绑定与分页逻辑保持原样 +- 页面私有组件状态: + - `src/views/team/bd-lead/add-bd-lead.vue`:已随页面同步完成 + - `src/views/team/bd-lead/bind-bd.vue`:已随页面同步完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.bdLead` +- 已完成构建验证: + - `npm run build:prod` 已通过 + - 仍有项目既有 22 个 warning,无新增阻塞错误 + +- 已完成页面: + - `src/views/user/custom-gift/index.vue` + - 说明:已完成筛选区、状态/类型展示、表格列头、下载操作文案、成功与失败提示国际化;接口参数、状态与类型实际值、区域/用户/资源地址等动态或接口返回内容,以及审核切换、下载与分页逻辑保持原样 +- 页面私有组件状态: + - `src/views/user/custom-gift/index.vue`:无私有组件,已完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.userCustomGift` +- 已完成模块级复核: + - `src/views/user/custom-gift/index.vue` + - 说明:已执行中文残留扫描;当前未发现剩余中文可见文本 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `user/custom-gift` 国际化改动新增阻塞错误 +- 已完成页面: + - `src/views/user/im-account-manager/index.vue` + - 说明:已完成筛选区、提示说明、表格列头、操作按钮、弹窗标题、表单标签、placeholder、校验提示与确认弹窗国际化;接口参数、默认密码值 `88888888`、动态昵称与业务逻辑保持原样 +- 页面私有组件状态: + - `src/views/user/im-account-manager/index.vue`:无私有组件,已完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.imAccountManager` +- 已完成模块级复核: + - `src/views/user/im-account-manager/index.vue` + - 说明:已执行中文残留扫描;当前未发现剩余中文可见文本 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `im-account-manager` 国际化改动新增阻塞错误 +- 已完成页面: + - `src/views/tools/websocket/index.vue` + - 说明:已完成广播订阅与点对点卡片标题、步骤说明、表单标签、placeholder、按钮、状态提示与本地错误提示国际化;Socket 端点默认值、接口参数、订阅地址与发送地址实际值、Token/用户 ID/消息体字段和 WebSocket 连接发送逻辑保持原样 +- 页面私有组件状态: + - `src/views/tools/websocket/index.vue`:无私有组件,已完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.websocketTool` +- 已完成模块级复核: + - `src/views/tools/websocket/index.vue` + - 说明:已执行中文残留扫描;当前未发现剩余中文可见文本 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `websocket` 国际化改动新增阻塞错误 +- 已完成页面: + - `src/views/sys/request-blacklist/index.vue` + - 说明:已完成新增按钮、确认弹窗、输入提示、提示文案与本地错误提示国际化;接口参数、黑名单内容值本身、路由路径与新增删除逻辑保持原样 +- 页面私有组件状态: + - `src/views/sys/request-blacklist/index.vue`:无私有组件,已完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.requestBlacklist` +- 已完成模块级复核: + - `src/views/sys/request-blacklist/index.vue` + - 说明:已执行中文残留扫描;当前未发现剩余中文可见文本 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `request-blacklist` 国际化改动新增阻塞错误 +- 已完成页面: + - `src/views/tools/gold-analyze/index.vue` + - 说明:已完成筛选区 placeholder、日期区间文案、搜索按钮、图表标题、副标题与本地 warn 提示国际化;接口参数、图表返回数据、`originName` 动态数据、图表配置结构与查询逻辑保持原样 +- 页面私有组件状态: + - `src/views/tools/gold-analyze/index.vue`:无私有组件,已完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.goldAnalyze` +- 已完成模块级复核: + - `src/views/tools/gold-analyze/index.vue` + - 说明:已执行中文残留扫描;当前未发现剩余中文可见文本 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `gold-analyze` 国际化改动新增阻塞错误 +- 已完成页面: + - `src/views/tools/compensate-order/index.vue` + - 说明:已完成订单补偿与糖果补偿表单标题、标签、placeholder、按钮、校验文案与确认弹窗国际化;接口参数、提交字段、平台枚举值、支付方式实际 value 与提交逻辑保持原样 +- 页面私有组件状态: + - `src/views/tools/compensate-order/index.vue`:无私有组件,已完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.compensateOrder` +- 已完成模块级复核: + - `src/views/tools/compensate-order/index.vue` + - 说明:已执行中文残留扫描;当前未发现剩余中文可见文本 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `compensate-order` 国际化改动新增阻塞错误 +- 已完成页面: + - `src/views/tools/other/index.vue` + - `src/views/tools/other/alias-method.vue` + - `src/views/tools/other/api-sign.vue` + - `src/views/tools/other/redis-ops.vue` + - `src/views/tools/other/token-parse.vue` + - `src/views/tools/other/user-cancel-and-restore.vue` + - `src/views/tools/other/user-room-region.vue` + - `src/views/tools/other/user-swap-user.vue` + - 说明:已完成 Utilities 路由页入口卡片标题、页面内功能文件的表单标签、placeholder、按钮、弹窗标题、校验提示、本地说明文案与本地检查项提示国际化;`CLEAR_KEYS`、`TOKEN_PARSE`、`GET_TOKEN` 等模式值、接口参数、提交字段、路由路径与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/tools/other/index.vue`:已随页面同步完成;按原始接口返回与入口页引用关系,`alias-method.vue`、`api-sign.vue`、`redis-ops.vue`、`token-parse.vue`、`user-cancel-and-restore.vue`、`user-room-region.vue`、`user-swap-user.vue` 记为页面内功能文件,均已复核通过 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.toolsOther` +- 已完成模块级复核: + - `src/views/tools/other/*.vue` + - 说明:已执行目录级中文残留扫描;当前残留中文仅为 `alias-method.vue` 中会随表单提交到接口的快速填充样例值,以及 `user-swap-user.vue` 中注释掉的提示代码,不属于可继续按纯展示文案翻译的范围 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `tools/other` 国际化改动新增阻塞错误 + +- 已完成页面: + - `src/views/401.vue` + - 说明:已完成 401 权限错误页标题、副标题、导航提示、链接文案与图片弹窗标题国际化;未改动首页跳转路径、返回上一页逻辑、图片资源与远程图片地址 +- 页面私有组件状态: + - `src/views/401.vue`:无私有组件,已完成 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.page401` +- 已完成模块级复核: + - `src/views/401.vue` + - 说明:已执行中文残留扫描;当前未发现剩余中文可见文本 +- 已完成验证: + - 直接执行 `npm run build:prod` 构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `401.vue` 国际化改动新增阻塞错误 + - 环境补充:本机当前设置 `$env:NODE_OPTIONS='--openssl-legacy-provider'` 会报 `--openssl-legacy-provider is not allowed in NODE_OPTIONS`,后续新线程不要默认附加该变量 +- 已完成历史页面私有组件复查: + - `src/views/activity/template-cnf/activity-rank.vue` + - `src/views/activity/template-cnf/activity-rank-reward.vue` + - `src/views/activity/template-cnf/form-edit.vue` + - `src/views/activity/template-cnf/reward-edit.vue` + - `src/views/activity/template-cnf/template-editor/attr-editor.vue` + - `src/views/activity/template-cnf/template-editor/index.vue` + - `src/views/activity/template-cnf/template-editor/lang-text-editor.vue` + - `src/views/activity/template-cnf/template-editor/page-editor.vue` + - `src/views/activity/template-cnf/template-editor/props-card.vue` + - `src/views/activity/template-cnf/template-editor/reward-array-editor.vue` + - `src/views/activity/template-cnf/template-form/index.vue` + - 归属页面:`src/views/activity/template-cnf/index.vue` + - 说明:已完成活动管理页面同目录私有组件、活动排名弹窗、奖品编辑、模板编辑器、模板表单与本地道具类型展示映射国际化;接口参数、路由路径、权限码、提交字段与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/activity/template-cnf/index.vue`:历史已完成,同目录私有组件 `activity-rank.vue`、`activity-rank-reward.vue`、`form-edit.vue`、`reward-edit.vue`、`template-editor/*.vue`、`template-form/index.vue` 已复核通过 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 扩展范围:`pages.activityTemplateManage` 的模板编辑器、排名奖品、表单、提示、渐变方向、预览昵称与道具类型展示 key +- 已完成模块级复核: + - `src/views/activity/template-cnf/**/*.vue` + - 说明:已执行目录级中文残留扫描;当前残余中文均为 `index.vue` 注释或源码注释,不属于可见展示文案 +- 已完成验证: + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `activity/template-cnf` 私有组件复查新增阻塞错误 +- 已完成历史页面私有组件复查: + - `src/views/cnf/lottery/select-prize.vue` + - 归属页面:`src/views/cnf/lottery/index.vue` + - 说明:已完成转盘抽奖品配置页面奖品选择弹窗标题、表单标签、placeholder、按钮、校验提示、类型分组与类型选项展示国际化;接口字段、提交字段、`value`、`type`、路由路径与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/cnf/lottery/index.vue`:历史已完成,私有组件 `src/views/cnf/lottery/select-prize.vue` 已复核通过 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 扩展范围:`pages.lotteryConfig.placeholder.select/quantity`、`pages.lotteryConfig.validation.requiredField`、`pages.lotteryConfig.selectPrize` +- 已完成模块级复核: + - `src/views/cnf/lottery/*.vue` + - 说明:已执行目录级中文残留扫描;当前残余中文仅为 `index.vue` 中“扩展属性”注释,不属于可见展示文案 +- 已完成验证: + - `node -c src/lang/messages/pages/en.js` + - `node -c src/lang/messages/pages/zh.js` + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `cnf/lottery/select-prize.vue` 私有组件复查新增阻塞错误 +- 已完成历史页面共享私有组件复查: + - `src/views/team/components/TeamCreate/index.vue` + - 归属页面:主播中心共享私有组件,当前已知由 `src/views/team/business-development/index.vue` 与 `src/views/team/team-list/index.vue` 直接引用 + - 说明:已完成创建团队/代理抽屉标题、表单标签、placeholder、绑定 BD 单选展示文案、设置/联系方式分组、按钮、校验提示与提交中提示国际化;接口参数、提交字段、`bindBd` 的 `yes/no` 绑定值、`bdAccountDefaultSelectType` 的 `LONG` 值、`contactTypes` 实际 value 与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/team/components/TeamCreate/index.vue`:共享私有组件已单独复核通过 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 新增范围:`pages.teamCreate` +- 已完成模块级复核: + - `src/views/team/components/TeamCreate/index.vue` + - 说明:已执行中文残留扫描;当前源码未发现剩余中文可见文案 +- 已完成验证: + - `node --check` 不适合直接检查当前 `export default` 语言文件,本轮以生产构建结果作为语言文件校验依据 + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `TeamCreate` 共享私有组件复查新增阻塞错误 + +### 2026-04-21 + +- 已完成历史页面私有组件复查: + - `src/views/room/profile/room-active-charts.vue` + - `src/views/room/profile/room-operation-log.vue` + - `src/views/room/profile/room-visitor-log.vue` + - `src/views/room/profile/user-drawer.vue` + - 归属页面:`src/views/room/profile/index.vue` + - 说明:已完成房间资料列表页面同目录私有组件的弹窗/抽屉标题、筛选 placeholder、按钮、表格列头、角色展示、图表标题与图表 series 名称国际化;接口参数、角色提交值、路由路径与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/room/profile/index.vue`:历史已完成,同目录私有组件 `room-active-charts.vue`、`room-operation-log.vue`、`room-visitor-log.vue`、`user-drawer.vue` 已复核通过 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 扩展范围:`pages.roomProfile.filter`、`pages.roomProfile.table`、`pages.roomProfile.dialog`、`pages.roomProfile.chart` +- 已完成模块级复核: + - `src/views/room/profile/*.vue` + - 说明:已执行目录级中文残留扫描;当前残余中文均在 `index.vue` 注释或注释掉的历史菜单代码中,不属于可见展示文案 +- 已完成构建验证: + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `room/profile` 私有组件复查新增阻塞错误 +- 已完成历史页面私有组件复查: + - `src/views/team/business-development/add-bd.vue` + - `src/views/team/business-development/auth.vue` + - `src/views/team/business-development/bind-bd-leader.vue` + - `src/views/team/business-development/bind-team.vue` + - `src/views/team/business-development/team-member.vue` + - 归属页面:`src/views/team/business-development/index.vue` + - 说明:已完成 BD 列表页面同目录私有弹窗/抽屉组件的标题、表单标签、placeholder、按钮、校验提示、提交中提示、表格列头、复制/删除反馈与确认弹窗国际化;接口参数、提交字段、权限码、路由路径与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/team/business-development/index.vue`:历史已完成,同目录私有组件 `add-bd.vue`、`auth.vue`、`bind-bd-leader.vue`、`bind-team.vue`、`team-member.vue` 已复核通过 + - `src/views/team/components/TeamCreate/index.vue`:多页面共用组件,未纳入本轮同目录私有组件范围;后续已于 2026-04-22 单独复核通过 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 扩展范围:`pages.businessDevelopment.table`、`pages.businessDevelopment.action`、`pages.businessDevelopment.confirm`、`pages.businessDevelopment.dialog`、`pages.businessDevelopment.form`、`pages.businessDevelopment.placeholder`、`pages.businessDevelopment.validation`、`pages.businessDevelopment.message` +- 已完成模块级复核: + - `src/views/team/business-development/*.vue` + - 说明:已执行目录级中文残留扫描;本轮认领的 5 个私有组件中,剩余中文仅为注释,`index.vue` 中残留中文主要为历史注释与未传入本轮组件的本地标题赋值,不属于本轮私有组件可见文案 +- 已完成构建验证: + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过 + - 说明:当前仍保留项目既有 `22` 条 warning,未因本轮 `team/business-development` 私有组件复查新增阻塞错误 +- 已完成历史页面私有组件复查: + - `src/views/team/diamond-policy/props-form-edit.vue` + - 归属页面:`src/views/team/diamond-policy/index.vue` + - 说明:已完成代理钻石政策页面私有道具配置抽屉复核;可触发表单校验提示改为复用 `pages.propsSourceGroupForm.validation.requiredField`,资源类型兜底展示名称去除中文字面量;接口参数、提交字段、资源类型值与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/team/diamond-policy/index.vue`:历史已完成,私有组件 `src/views/team/diamond-policy/props-form-edit.vue` 已复核通过 +- 语言 key 处理: + - 本轮复用 `pages.propsSourceGroupForm.validation.requiredField` + - 本轮复用 `pages.propsSourceGroupForm.resourceType` + - 无需新增页面级语言 key +- 已完成模块级复核: + - `src/views/team/diamond-policy/*.vue` + - 说明:已执行目录级中文残留扫描;当前残余中文均为注释中的中文,不属于可见展示文案 +- 已完成构建验证: + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过 + - 说明:当前仍保留项目原有 `22` 条 warning,未因本轮 `team/diamond-policy` 私有组件复查改动新增阻塞错误 +- 已完成历史页面私有组件复查: + - `src/views/team/policy/props-form-edit.vue` + - 归属页面:`src/views/team/policy/index.vue` + - 说明:已完成代理政策页面私有道具配置抽屉的奖励明细描述、添加配置表单、placeholder、校验提示、资源类型按钮、抽屉标题、保存/取消按钮与配置缺失提示国际化;接口参数、提交字段、资源类型值与后端依赖值保持原样 +- 页面私有组件状态: + - `src/views/team/policy/index.vue`:历史已完成,私有组件 `src/views/team/policy/props-form-edit.vue` 已复核通过 +- 已补充页面级语言 key: + - `src/lang/messages/pages/en.js` + - `src/lang/messages/pages/zh.js` + - 扩展范围:`pages.propsSourceGroupForm.action.view` + - 复用范围:`pages.propsSourceGroupForm.dialog`、`pages.propsSourceGroupForm.form`、`pages.propsSourceGroupForm.summary`、`pages.propsSourceGroupForm.placeholder`、`pages.propsSourceGroupForm.resourceType`、`pages.propsSourceGroupForm.validation`、`pages.propsSourceGroupForm.word` +- 已完成模块级复核: + - `src/views/team/policy/*.vue` + - 说明:已执行目录级中文残留扫描;当前残余中文均为注释中的中文,不属于可见展示文案 +- 已完成构建验证: + - 直接执行 `npm run build:prod` 触发项目既有 `ERR_OSSL_EVP_UNSUPPORTED` + - 改用 `$env:NODE_OPTIONS='--openssl-legacy-provider'; npm run build:prod` 后构建通过 + - 说明:当前仍保留项目原有 `22` 条 warning,未因本轮 `team/policy` 私有组件国际化改动新增阻塞错误 + ### 2026-04-20 - 已完成页面: @@ -756,11 +1055,12 @@ - 历史已完成 `src/views` 页面私有组件复查任务当前优先于新页面认领 - 下一步目标: - 先补查已标记完成页面目录中的私有组件,并把组件状态补写入进度文档 - - 完成该临时任务后,再继续按 `docs/i18n/主要路由.md` 领取下一个未完成主路由页面 + - 完成该临时任务后,只继续按 `docs/i18n/主要路由.md` 领取下一个未完成主路由页面 + - 非主要路由页面后续不再继续扩展翻译 - 当前认领线程: - - 线程一:当前无进行中任务;已完成 `src/views/sys/start-page/index.vue` 与 `src/views/sys/start-page/form-edit.vue`,并已完成构建验证与 md 同步 - - 线程二:当前无进行中任务;已完成 `src/views/message/push/index.vue`、`src/views/message/push/new-push-form.vue`、`src/views/message/push/push-log.vue`、`src/views/message/push/push-task.vue`,并已完成构建验证与 md 同步 - - 线程三:当前无进行中任务;已完成 `src/views/tools/upload/index.vue`,后续与其他线程一样优先处理历史已完成页面私有组件复查 + - 线程一:进行中 `src/views/family/config/index.vue`;已完成认领前文档复读、语言文件复读、入口 import 核对、目录文件核对与模块中文扫描,准备进入页面国际化改动 + - 线程二:进行中 `src/views/game/ludo/index.vue`;已完成认领前文档复读、语言文件复读、目录核对与页面中文扫描,准备进入页面国际化改动 + - 线程三:进行中 `src/views/version/app/index.vue`;已完成认领前文档复读、语言文件复读、目录核对与模块中文扫描,准备进入页面国际化改动 ## 扫描概况 diff --git a/docs/问题排查记录-权限平台与开发服务地址.md b/docs/问题排查记录-权限平台与开发服务地址.md index f525e44..fa02242 100644 --- a/docs/问题排查记录-权限平台与开发服务地址.md +++ b/docs/问题排查记录-权限平台与开发服务地址.md @@ -6,10 +6,12 @@ ## 背景 -本次排查涉及两个独立但连续出现的问题: +本次排查涉及四个独立但连续出现的问题: 1. 页面初始化时,`this.permissionsSysOriginPlatforms[0]` 偶发拿不到,导致默认平台没有赋值,后续 `renderData(true)` 不执行。 2. 本地执行 `npm run dev` 后,控制台一直显示 `Network: unavailable`,但同机器的其他项目可以正常显示类似 `http://192.168.0.115:5173/` 的局域网访问地址。 +3. `src/views/user/user-table/index.vue` 页面刷新后,搜索栏中的系统默认选项为空,列表也没有自动刷出;只有再次手动点击搜索后,默认系统和列表才恢复正常。 +4. 除首页外,进入其他页面后刷新浏览器会出现页面空白。 --- @@ -90,6 +92,126 @@ await store.dispatch('user/buttonPermissions') --- +## 三、`user-table` 刷新后系统默认项为空 + +### 现象 + +在 `src/views/user/user-table/index.vue` 页面中: + +- 首次进入时有概率搜索栏中的“系统”默认值为空。 +- 刷新页面后更容易复现。 +- 首屏列表没有自动加载。 +- 用户手动点击一次搜索后,系统默认选项和列表又会恢复正常。 + +### 根因 + +这个问题本质上还是权限平台数据的异步时序问题,但触发点更具体: + +1. 页面在 `created()` 中直接读取 `this.permissionsSysOriginPlatforms[0]`。 +2. 如果刷新时权限平台数据尚未回填,`querySystem` 就为空。 +3. 原逻辑在判空后会直接 `return`,导致: + - `listQuery.sysOrigins` 没有默认值。 + - `renderData(true)` 不执行。 + - 页面其余初始化流程也被提前中断。 +4. 等到权限数据后续回填后,页面没有额外 watcher 继续补初始化,所以只能依赖用户再次手动搜索。 + +### 已做处理 + +本次针对这个页面做了两层修复: + +1. 在 `src/permission.js` 中继续保留并确认: + +```js +await store.dispatch('user/buttonPermissions') +``` + +确保路由放行前优先等待按钮权限加载完成。 + +2. 在 `src/views/user/user-table/index.vue` 中增加页面级兜底: + +- 新增 `hasInitializedSysOrigin` 标记,避免重复初始化。 +- 监听 `permissionsSysOriginPlatforms`。 +- 当权限平台列表第一次变为有值时: + - 自动取第一项写入 `listQuery.sysOrigins` + - 自动执行 `renderData(true)` + +3. 去掉 `created()` 中“拿不到系统平台就直接 return”的初始化方式,避免首屏逻辑因为一次空值被永久跳过。 + +### 处理结果 + +调整后,即使刷新页面时 `permissionsSysOriginPlatforms` 比页面创建更晚回填: + +- 搜索栏系统默认值也会在权限到达后自动补上。 +- 首屏列表会自动触发加载。 +- 不再需要用户手动点击搜索来恢复页面状态。 + +### 涉及文件 + +- `src/permission.js` +- `src/views/user/user-table/index.vue` + +--- + +## 四、非首页刷新后页面白屏 + +### 现象 + +- 首页通常可以正常刷新。 +- 进入其他菜单页后,直接刷新浏览器会出现页面空白。 +- 这类问题在二级、三级动态路由页面上更容易复现。 + +### 根因 + +问题出在刷新时的动态路由注入时序: + +1. 刷新页面后,应用会重新进入 `src/permission.js` 中的路由守卫。 +2. 当前项目的很多页面并不是一开始就存在于静态路由中,而是依赖 `getMenus()` 返回菜单后再通过 `router.addRoutes()` 动态注入。 +3. 原逻辑中虽然调用了 `getMenus()`,但没有等待菜单加载和动态路由注入真正完成,就提前执行了 `next()`。 +4. 当用户刷新的是非首页深层路由时,当前目标路由可能还没注册到 router 中,于是会出现匹配失败,最终表现为空白页。 + +首页之所以通常不受影响,是因为首页对应的是默认静态路由,不依赖后续动态注入。 + +### 已做处理 + +已将 `src/permission.js` 中刷新后的初始化流程改为严格串行: + +```js +await store.dispatch('user/getInfo') +const grantRouters = await store.dispatch('user/getMenus') +if (grantRouters && grantRouters.length > 0) { + router.addRoutes(grantRouters) +} +store.dispatch('user/getUserDashboard') +await store.dispatch('user/buttonPermissions') +next({ ...to, replace: true }) +``` + +### 修复要点 + +这次修复包含两个关键点: + +1. 先等待 `getMenus()` 返回,再执行 `router.addRoutes(grantRouters)`。 +2. 动态路由注入完成后,不再直接 `next()`,而是使用: + +```js +next({ ...to, replace: true }) +``` + +这样会用当前目标地址重新进入一次匹配流程,确保刚注入的动态路由能够正确命中当前页面。 + +### 处理结果 + +调整后: + +- 刷新非首页页面时,不会再因为动态路由尚未注册而白屏。 +- 当前页面会在动态路由注入完成后重新匹配并正常进入。 + +### 涉及文件 + +- `src/permission.js` + +--- + ## 二、开发服务 `Network: unavailable` ### 现象 @@ -201,6 +323,7 @@ npm run dev -- --public 192.168.0.115:9528 ## 本次涉及的改动文件 - `src/permission.js` +- `src/views/user/user-table/index.vue` - `vue.config.js` - `docs/问题排查记录-权限平台与开发服务地址.md` @@ -210,3 +333,5 @@ npm run dev -- --public 192.168.0.115:9528 2. `permissionsSysOriginPlatforms` 这类字段要区分“候选项来源”和“最终权限结果来源”。 3. 老版本 Vue CLI 对网卡选择并不稳定,机器上存在 VPN、TAP、虚拟网卡时,`Network: unavailable` 往往是地址识别问题,不代表 dev server 本身不可用。 4. 对局域网访问有明确需求的项目,最好显式配置 `devServer.host` 与 `devServer.public`,不要完全依赖工具链自动推断。 +5. 对首屏依赖异步权限数据的页面,不应只在 `created()` 中做一次性读取;更稳妥的方式是配合 watcher 或显式初始化状态,在权限到达后自动补齐默认值与首屏请求。 +6. 涉及动态路由的后台项目,刷新页面时必须保证“菜单加载 -> 路由注入 -> 再放行当前路由”是串行完成的,否则深层页面极易出现刷新白屏。 diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index b879245..b0a7066 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -111,6 +111,9 @@ export default { }] }) }, + hasVisibleChildren(route) { + return Array.isArray(route.children) && route.children.some(child => !child.hidden) + }, // Filter out the routes that can be displayed in the sidebar // And generate the internationalized title generateRoutes(routes, basePath = '/', prefixTitle = []) { @@ -128,9 +131,9 @@ export default { if (router.meta && router.meta.title) { data.title = [...data.title, translateRouteTitle(router.meta.title)] - if (router.redirect !== 'noRedirect') { + if (router.redirect !== 'noRedirect' && !this.hasVisibleChildren(router)) { // only push the routes with title - // special case: need to exclude parent router without redirect + // exclude menu container routes that only exist to hold children res.push(data) } } diff --git a/src/lang/messages/base/menu-en.js b/src/lang/messages/base/menu-en.js index 7e3cbc5..1200aa7 100644 --- a/src/lang/messages/base/menu-en.js +++ b/src/lang/messages/base/menu-en.js @@ -9,7 +9,7 @@ export default { 'APP运行日志': 'App Runtime Logs', 'IM通讯': 'IM Communication', '请求黑名单': 'Request Blacklist', - '工具管理': 'Tools Management', + '工具管理': 'Tools', 'Redis缓存管理': 'Redis Cache Management', '订单补偿': 'Order Compensation', '金币分析': 'Gold Analysis', diff --git a/src/lang/messages/pages/en.js b/src/lang/messages/pages/en.js index 0af834a..f1af8a1 100644 --- a/src/lang/messages/pages/en.js +++ b/src/lang/messages/pages/en.js @@ -1,5 +1,71 @@ export default { pages: { + page401: { + title: 'You do not have permission to access this page', + subtitle: 'Please contact your administrator if you need access.', + suggestion: 'Or you can go to:', + backHome: 'Back to Home', + viewImage: 'View Image', + backPrevious: 'Go Back', + dialog: { + imageTitle: 'Image Preview' + } + }, + compensateOrder: { + section: { + order: 'Order Compensation', + candy: 'Candy Compensation' + }, + form: { + userId: 'User ID', + orderId: 'Order ID', + system: 'System', + paymentPlatform: 'Payment Method', + productCode: 'Product Code', + expireTime: 'Expiration Date', + candy: 'Candy' + }, + placeholder: { + selectSystem: 'Please select a system', + selectPaymentPlatform: 'Please select a payment method' + }, + action: { + submit: 'Submit' + }, + validation: { + requiredField: 'Required field cannot be empty' + }, + confirm: { + submit: 'Are you sure you want to submit?', + title: 'Prompt', + confirm: 'Confirm', + cancel: 'Cancel' + } + }, + goldAnalyze: { + placeholder: { + system: 'System', + userId: 'User ID' + }, + dateRange: { + separator: 'To', + start: 'Registration Start Date', + end: 'Registration End Date' + }, + action: { + search: 'Search' + }, + chart: { + incomeTitle: 'Gold Income', + expenditureTitle: 'Gold Expenditure', + userSubtext: 'User: Data Distribution Chart', + systemSubtext: 'System: Data Distribution Chart' + }, + message: { + selectTime: 'Please select a time range', + withinOneMonth: 'The time range must be within one month' + } + }, messagePush: { tabs: { newPush: 'New Push', @@ -285,7 +351,9 @@ export default { description: 'Description' }, placeholder: { - system: 'System' + system: 'System', + select: 'Please select', + quantity: 'Quantity' }, type: { notification: 'Notification', @@ -1302,13 +1370,22 @@ export default { userId: 'User ID', search: 'Search', removeOrBlacklist: 'Remove/Blacklist Member', - roleChange: 'Permission Change' + roleChange: 'Permission Change', + rangeSeparator: 'to', + createDateStart: 'Start Date', + createDateEnd: 'End Date', + businessCode: 'Business Code', + role: 'Role' }, table: { cover: 'Cover', roomInfo: 'Room Info', time: 'Time', - actions: 'Actions' + actions: 'Actions', + user: 'User', + visitTime: 'Visit Time', + roomRole: 'Room Role', + registeredAt: 'Registered At' }, row: { account: 'Account', @@ -1370,7 +1447,16 @@ export default { roomPermissionChange: 'Room Permission Change', roomNicknameApproval: 'Room Nickname Approval', roomAvatarApproval: 'Room Avatar Approval', - roomNoticeApproval: 'Room Notice Approval' + roomNoticeApproval: 'Room Notice Approval', + activeMetrics: 'Room Activity Metrics', + operationLog: 'Room Operation Log', + visitorLog: 'Room Visitor Records', + memberDetails: 'Room Member Details' + }, + chart: { + onlineUsers: 'Online Users', + giftUsers: 'Gift Senders', + giftValue: 'Gift Value' }, validation: { uploadCover: 'Please upload a cover', @@ -1855,7 +1941,12 @@ export default { activityTime: 'Activity Time', updatedCreatedBy: 'Updated / Created By', updatedCreatedTime: 'Updated / Created Time', - actions: 'Actions' + actions: 'Actions', + name: 'Name', + createdAt: 'Created At', + updatedAt: 'Updated At', + createdBy: 'Created By', + updatedBy: 'Updated By' }, label: { start: 'Start', @@ -1879,7 +1970,16 @@ export default { copyActivityLink: 'Copy Activity Link', loadMore: 'Load More', confirm: 'Confirm', - cancel: 'Cancel' + cancel: 'Cancel', + save: 'Save', + exit: 'Exit', + send: 'Send', + add: 'Add', + addLanguage: 'Add Language', + reward: 'Reward', + clickToChange: 'Click to Change', + editName: 'Edit Name', + copyTemplate: 'Copy Template' }, word: { notStarted: 'Not Started', @@ -1887,7 +1987,13 @@ export default { ended: 'Ended', onShelf: 'On Shelf', offShelf: 'Off Shelf', - loadedAll: 'All Loaded' + loadedAll: 'All Loaded', + snapshot: 'Snapshot', + realtime: 'Real-Time', + sent: 'Sent', + notSent: 'Not Sent', + rangeSeparator: 'to', + permanent: 'Permanent' }, help: { title: 'Operation Manual', @@ -1909,6 +2015,112 @@ export default { confirm: { editTemplateMessage: 'Note: changing the template will synchronously affect all related references. Continue?', title: 'Prompt' + }, + dialog: { + rank: 'Activity Ranking', + rankReward: 'Activity Ranking Rewards - {mode}' + }, + section: { + button1: 'Button 1', + button2: 'Button 2', + button1Top20: 'Button 1 TOP20', + button2Top20: 'Button 2 TOP20', + prizeButton1: 'Prize - Button 1', + prizeButton2: 'Prize - Button 2', + basicInfo: 'Basic Info', + activityGift: 'Activity Gifts', + rankingRewards: 'Activity Ranking Rewards', + attributes: 'Attributes', + style: 'Style', + background: 'Background', + font: 'Font', + border: 'Border' + }, + form: { + system: 'System', + template: 'Template', + time: 'Time', + status: 'Status', + description: 'Description', + componentName: 'Component Name', + imageIndex: 'Image {index}', + rewardTier: 'Reward Tier', + backgroundImage: 'Background Image', + backgroundColor: 'Background Color', + backgroundRepeat: 'Background Repeat', + backgroundSize: 'Background Size', + color: 'Color', + size: 'Size', + weight: 'Weight', + borderWidth: 'Border Width', + borderStyle: 'Border Style', + borderColor: 'Border Color', + borderRadius: 'Border Radius' + }, + placeholder: { + template: 'Template', + startDate: 'Start Date', + endDate: 'End Date', + status: 'Status', + select: 'Please select', + rankRange: 'Ranking Range' + }, + message: { + rankRetention: 'Activity ranking data is retained for only 30 days. Rankings cannot be viewed after the activity ends.', + rankRewardRetention: 'After the activity ends, send rewards through the system activity module. The system keeps the winner list, and other data is gradually cleaned after 30 days.', + endedNotEditable: 'Activities cannot be edited after they end.', + expiredTimeWarning: 'Expired activities cannot be edited. Please check the activity time.', + endedCannotEdit: 'The activity has ended and cannot be edited here.', + giftQuantityInsufficient: 'At least 3 gifts are required.', + noButtonReward: '[{button}] has no associated activity ranking rewards.', + invalidButtonReward: '[{button}] has invalid records. The system will automatically correct and exclude them.', + continueConfirm: 'Click Confirm to continue. Continue?', + sysOriginRequired: 'Source system cannot be empty.', + rewardRuleTop20: '1. The ranking shows only the top 20, and backend reward processing supports only TOP20.', + rewardRuleSort: '2. Rankings are displayed in the order entered. The system will not sort them automatically.', + rewardRuleRange: '3. Enter a number such as 1, 2, 3, or connect two numbers with ~, such as 1~10 or 11~20.', + pcRecommended: 'We recommend editing on a PC.', + noPaginationTip: 'Pagination is not implemented. If there are more than 20 templates, please contact an administrator to add pagination.' + }, + validation: { + requiredField: 'Required field', + templateNameMax: 'Template name must be no more than 200 characters.' + }, + prompt: { + templateName: 'Please enter the template name', + newTemplateName: 'Please enter the new template name' + }, + gradient: { + none: 'None', + toRight: 'Gradient Left to Right', + toLeft: 'Gradient Right to Left', + toTop: 'Gradient Bottom to Top', + toBottom: 'Gradient Top to Bottom', + toBottomRight: 'Diagonal Gradient from Left', + toBottomLeft: 'Diagonal Gradient from Right' + }, + preview: { + nickname: 'User Nickname', + nicknameRank: 'User Nickname-1' + }, + propsType: { + GIFT: 'Gift', + DIAMOND: 'Diamond', + GOLD: 'Gold', + ROOM_BADGE: 'Room Badge', + BADGE: 'Personal Badge', + SPECIAL_ID: 'Special ID', + NOBLE_VIP: 'Noble VIP', + AVATAR_FRAME: 'Avatar Frame', + RIDE: 'Ride', + THEME: 'Room Background', + EMOJI: 'Emoji', + CHAT_BUBBLE: 'Chat Bubble', + GAME_COUPON: 'Game Coupon', + FRAGMENTS: 'Fragment', + FLOAT_PICTURE: 'Floating Window', + LAYOUT: 'Room Decoration', + CUSTOMIZE: 'Custom' } }, businessDevelopment: { @@ -1921,9 +2133,11 @@ export default { backendMember: 'Backend Member' }, table: { + system: 'System', user: 'User', region: 'Region', teamCount: 'Team Count', + anchorCount: 'Anchor Count', contact: 'Contact', createdBy: 'Created By', updatedBy: 'Updated By', @@ -1940,12 +2154,42 @@ export default { changeBdLeader: 'Rebind BD Leader', assignPermission: 'Assign Permission', confirm: 'Confirm', - cancel: 'Cancel' + cancel: 'Cancel', + close: 'Close', + save: 'Save', + submit: 'Submit' }, confirm: { deleteMessage: 'Are you sure you want to delete this item? This action cannot be undone and will disband the current team members.', + deleteMemberMessage: 'Are you sure you want to delete this member?', title: 'Friendly Reminder' }, + dialog: { + addBd: 'Add BD', + editBd: 'Edit BD', + permissionSettings: 'Permission Settings', + bindBdLeader: 'Bind BD Leader', + bindAgent: 'Bind Agent', + teamMembers: 'BD Team Agent Members' + }, + form: { + bd: 'BD', + region: 'Region', + contact: 'Contact', + agent: 'Agent', + bdLeader: 'BD Leader' + }, + placeholder: { + bdUserId: 'BD User ID', + selectRegion: 'Select a region', + contact: 'Contact', + accountOrSpecialId: 'Enter account or special ID', + agentAccount: 'Enter agent account', + userId: 'User ID' + }, + validation: { + requiredField: 'Required fields cannot be empty' + }, permission: { validating: 'Validating permissions...', deniedPrefix: 'Sorry, you do not have permission to view this page. Please contact the administrator to grant access.', @@ -1953,7 +2197,222 @@ export default { }, message: { copySuccess: 'Copied successfully', - copyFail: 'Copy failed' + copyFail: 'Copy failed', + submitting: 'Submitting!', + success: 'Successful' + } + }, + teamCreate: { + dialog: { + title: 'Create Agent' + }, + section: { + settingInfo: 'Settings', + contactInfo: 'Contact Information' + }, + form: { + region: 'Region', + agent: 'Agent', + bindBd: 'Bind BD', + bd: 'BD', + remark: 'Remark', + setting: 'Settings', + contactInfo: 'Contact Information', + memberQuantity: 'Member Quantity', + type: 'Type', + contact: 'Contact' + }, + placeholder: { + region: 'Region', + agentId: 'Enter agent ID', + bdId: 'Enter BD ID', + remark: 'Enter remark', + maxMember: 'Maximum member quantity', + selectType: 'Select a type', + contact: 'Enter contact information' + }, + action: { + cancel: 'Cancel', + save: 'Save' + }, + validation: { + requiredField: 'Required fields cannot be empty' + }, + message: { + submitting: 'Submitting!' + }, + word: { + yes: 'Yes', + no: 'No' + } + }, + bdLead: { + loading: 'Loading', + filter: { + system: 'System', + backendMember: 'Backend Member' + }, + table: { + system: 'System', + user: 'User', + region: 'Region', + bdQuantity: 'BD Count', + contact: 'Contact', + createdBy: 'Created By', + createdAt: 'Created At', + actions: 'Actions' + }, + form: { + leader: 'Leader', + bd: 'BD', + region: 'Region', + contact: 'Contact' + }, + placeholder: { + bdLeadUserId: 'BD Lead User ID', + bdLeadUserIdWithSpace: 'BD Lead User ID', + selectRegion: 'Please select a region', + contact: 'Contact', + bdAccount: 'Please enter the BD account' + }, + action: { + search: 'Search', + createBdLead: 'Add BD Lead', + addSubBd: 'Add Sub-BD', + edit: 'Edit', + delete: 'Delete', + confirm: 'Confirm', + cancel: 'Cancel', + close: 'Close', + save: 'Save' + }, + dialog: { + create: 'Create BD Lead', + edit: 'Edit BD Lead', + bindSubBd: 'Bind Sub-BD' + }, + validation: { + requiredField: 'Required field cannot be empty' + }, + confirm: { + deleteMessage: 'Are you sure you want to delete it? This will unbind its BD members and will not affect other BD identities.', + title: 'Friendly Reminder' + }, + message: { + copySuccess: 'Copied successfully', + copyFail: 'Copy failed', + submitting: 'Submitting!', + success: 'Successful' + } + }, + appVersionManager: { + loading: 'Loading', + filter: { + system: 'System', + platform: 'Platform', + channel: 'Channel' + }, + table: { + id: 'ID', + platform: 'Platform', + version: 'Version', + buildVersion: 'Build Version', + forceUpdate: 'Force Update', + review: 'Under Review', + appType: 'App Type', + patch: 'Patch', + updateDescribe: 'Version Description', + apkSize: 'Package Size', + downloadUrl: 'Download Link', + createTime: 'Created At', + actions: 'Actions', + language: 'Language', + description: 'Description', + worshipDescription: 'Worship Description' + }, + form: { + platform: 'Platform', + channel: 'Channel', + version: 'Version', + buildVersion: 'Build Version', + forceUpdate: 'Force Update', + appType: 'App Type', + review: 'Under Review', + patch: 'Patch', + apkSize: 'Package Size', + downloadUrl: 'Download Link', + language: 'Language', + updateDescribe: 'Update Description', + updateWorshipDescribe: 'Worship Update Description' + }, + placeholder: { + version: 'Please enter the version', + buildVersion: 'Please enter the build version', + apkSize: 'Please enter the package size', + downloadUrl: 'Please enter the download link', + language: 'Language', + updateDescribe: 'Please enter the update description', + updateWorshipDescribe: 'Please enter the worship update description' + }, + action: { + search: 'Search', + add: 'Add', + copy: 'Copy', + edit: 'Edit', + delete: 'Delete', + serviceForceUpdate: 'Server Force Update', + updateDescription: 'Update Description', + addDescription: 'Add Description', + save: 'Save', + cancel: 'Cancel', + submit: 'Submit', + confirm: 'Confirm' + }, + dialog: { + descriptionList: 'Description List', + addDescription: 'Add Description', + editDescription: 'Edit Description', + addVersion: 'Add ({sysOrigin})', + editVersion: 'Edit ({sysOrigin})' + }, + confirm: { + title: 'Prompt', + deleteVersion: 'Are you sure you want to delete it?', + setServerBuildVersion: 'The server will block requests below the current build version. It will take effect within 10 minutes. Continue?', + deleteDescription: 'Are you sure you want to delete this description?' + }, + validation: { + requiredField: 'Required field cannot be empty', + max500: 'Maximum 500 characters' + }, + message: { + copySuccess: 'Copied successfully', + copyFail: 'Copy failed', + deleteSuccess: 'Deleted successfully' + }, + word: { + yes: 'Yes', + no: 'No' + }, + appType: { + chat: 'Voice Chat', + worship: 'Worship' + }, + language: { + en: 'English', + ar: 'Arabic', + id: 'Indonesian', + tr: 'Turkish', + ru: 'Russian', + pt: 'Portuguese', + ko: 'Korean', + ja: 'Japanese', + hi: 'Hindi', + fr: 'French', + es: 'Spanish', + de: 'German', + zh_CN: 'Chinese', + zh_TW: 'Traditional Chinese' } }, lotteryConfig: { @@ -2052,7 +2511,33 @@ export default { resetConsumeStock: 'Reset consumed stock?' }, validation: { - positiveInteger: 'Please enter a positive integer' + positiveInteger: 'Please enter a positive integer', + requiredField: 'This field is required' + }, + selectPrize: { + title: 'Select Prize', + form: { + type: 'Select Type', + quantity: 'Quantity' + }, + group: { + common: 'Common', + props: 'Props', + badge: 'Badge', + currency: 'Currency' + }, + typeOptions: { + gift: 'Gift', + avatarFrame: 'Avatar Frame', + ride: 'Ride', + nobleVip: 'Noble VIP', + roomBackground: 'Room Background', + emoji: 'Emoji', + userBadge: 'User Badge', + roomBadge: 'Room Badge', + gold: 'Gold', + diamond: 'Diamond' + } }, defaultPrizeText: '{index} Yuan Red Packet' }, @@ -2199,6 +2684,304 @@ export default { sizeExceeded: '{fileName} exceeds {maxSize} MB' } }, + toolsOther: { + cards: { + userSwap: 'User Account Swap', + apiSign: 'API Parameter Signature', + aliasMethod: 'Alias Method Analysis', + tokenParse: 'User Token Parsing', + redisOps: 'Redis Operations', + userRoomRegion: 'User Room Region Update', + userCancelRestore: 'Restore Canceled User' + }, + action: { + setAttributes: 'Set Attributes', + rerun: 'Run Again', + clearAttributes: 'Clear Attributes', + addAttribute: 'Add Attribute', + quickFill: 'Quick Fill', + confirm: 'Confirm' + }, + form: { + mode: 'Mode', + userId: 'User ID', + longUserId: 'User Long ID', + country: 'Country' + }, + placeholder: { + enterKey: 'Please enter the key information', + enterUserToken: 'Please enter the user token', + enterUserId: 'Please enter the user ID', + enterSourceLongUserId: 'Please enter the source user long ID', + enterTargetLongUserId: 'Please enter the target user long ID', + selectCountry: 'Please select a country' + }, + validation: { + requiredField: 'Required field cannot be empty', + requiredParam: 'Required parameter cannot be empty' + }, + aliasMethod: { + dialogTitle: 'Set Probability', + probabilityDescription: 'Probability Notes', + averageProbability: 'Average probability: 1.0 / prize count = {value}', + probabilityFill: 'Probability fill: probability >= average probability (goes to large), otherwise it goes to small.', + sampling: 'Sampling:', + samplingRuleOne: '1. If all configured probabilities are lower than the average probability, the current probability becomes 1.', + samplingRuleTwo: '2. If (current maximum probability + current minimum probability - average probability) > average probability, continue using large.', + samplingScenario: 'Example: if probabilities are set to 0.9, 0.8, and 0.3, then 0.3 may become a high probability because the configured probabilities are too high and the first sampled probability keeps getting selected.', + suggestion: 'Suggestion: use probability + inventory together for a safer setup.', + runCount: 'Run Count', + item: 'Item', + probability: 'Probability' + }, + apiSign: { + platform: 'Signature Platform', + platformPlaceholder: 'Platform', + body: 'Payload', + signKey: 'Signature Key', + dialogTitle: 'API Content Attributes', + key: 'Key', + value: 'Value' + }, + tokenParse: { + parseToken: 'Parse Token', + getToken: 'Get Token', + token: 'Token' + }, + redisOps: { + clearKey: 'Clear Key' + }, + userSwap: { + sourceId: 'Source ID', + targetId: 'Target ID', + checkCondition: 'Validate Swap Conditions', + submitExecute: 'Submit Execution', + tips: { + sourceUserNotFound: 'Source user not found', + targetUserNotFound: 'Target user not found', + differentSystem: 'Users come from different systems', + sourceAuthNotFound: 'Source user authentication info not found', + targetAuthNotFound: 'Target user authentication info not found', + openIdMismatch: 'Registration source OpenId does not match' + } + } + }, + websocketTool: { + broadcast: { + title: 'Subscribe to Broadcast Messages' + }, + direct: { + title: 'Point-to-Point' + }, + step: { + flow: 'Create Connection -> Subscribe Topic -> Send Message' + }, + form: { + socketEndpoint: 'Socket Endpoint', + subscribePath: 'Subscription Path', + sendEndpoint: 'Send Endpoint', + myToken: 'My Token', + content: 'Message Content', + repositoryEndpoint: 'Repository Endpoint', + repositoryData: 'Repository Data', + statusDescription: 'Status Description', + subscribePrefix: 'Subscription Prefix', + targetUserId: 'Recipient User ID' + }, + placeholder: { + socketEndpoint: 'Socket endpoint', + subscribePath: 'Subscription path', + sendEndpoint: 'Send endpoint', + myToken: 'My token', + content: 'Message content', + repositoryEndpoint: 'Repository endpoint', + repositoryData: 'Insert repository data', + subscribePrefix: 'Subscription prefix', + targetUserId: 'Recipient user, long ID' + }, + action: { + addRepository: 'Add Repository', + sendMessage: 'Send Message', + subscribeTopic: 'Subscribe Topic', + disconnect: 'Disconnect', + connect: 'Connect' + }, + validation: { + requiredField: 'Required field' + }, + message: { + connected: 'Connected successfully', + disconnected: 'Disconnected', + connectFirst: 'Please connect first.', + createFirst: 'Please create a connection first.', + enterMessageContent: 'Please enter the message content.' + } + }, + gameLudo: { + placeholder: { + type: 'Type', + system: 'System' + }, + action: { + search: 'Search', + dismiss: 'Dismiss', + loadMore: 'Click to Load More' + }, + state: { + allLoaded: 'All data has been loaded' + }, + dialog: { + players: 'Game Players' + }, + table: { + system: 'System', + roomInfo: 'Room Info', + status: 'Status', + amount: 'Amount (Join/Bonus)', + situation: 'Situation', + playerCount: 'Players: {count}', + lockedSeat: 'Locked Seats: {count}', + victorySide: 'Winning Side', + createdAt: 'Created At', + updatedAt: 'Updated At', + actions: 'Actions', + avatar: 'Avatar', + nickname: 'Nickname', + board: 'Board', + ranking: 'Ranking', + roomOwner: 'Room Owner', + consume: 'Consumption' + }, + type: { + run: 'Running', + history: 'History' + }, + status: { + wait: 'Waiting to Start', + progress: 'In Progress', + end: 'Ended' + }, + event: { + none: 'None', + timeoutDisband: 'Timed out before the game started and was dismissed', + disconnectedDisband: 'The game started and was dismissed after all players disconnected', + otherDisband: 'Other unexpected state', + normalSettlement: 'Settled Normally', + backDisband: 'Dismissed from Back Office' + }, + confirm: { + dismiss: 'Dismissing the game from the back office will leave no winner. Are you sure you want to dismiss it?', + title: 'Prompt', + confirm: 'Confirm', + cancel: 'Cancel' + } + }, + requestBlacklist: { + action: { + addIp: 'Add IP', + addPhoneModel: 'Add Phone Model' + }, + confirm: { + delete: 'Are you sure you want to delete it?', + title: 'Prompt' + }, + prompt: { + invalidType: 'Invalid parameter type', + ipTip: + 'Please enter an IP. Example: 127.0.0.1 or 127.0.0. Each missing segment blocks one more network segment.', + phoneModelTip: 'Please enter the phone model. It will be stored in uppercase.', + title: 'Prompt', + confirm: 'Confirm', + cancel: 'Cancel' + }, + message: { + paramTypeError: 'Parameter type error.' + } + }, + imAccountManager: { + filter: { + userId: 'User ID' + }, + alert: { + title: 'Prompt', + description: + 'Use an in-app registered account to authorize IM login on the back-office PC side. The login account uses the short ID and the initial password is "88888888".' + }, + table: { + avatar: 'Avatar', + nickname: 'Nickname', + imUsername: 'IM Username', + createdAt: 'Created At', + actions: 'Actions' + }, + dialog: { + create: 'Add' + }, + form: { + userId: 'User ID', + password: 'Login Password' + }, + placeholder: { + userId: 'Please enter the user ID', + password: 'Please enter the login password' + }, + action: { + search: 'Search', + add: 'Add', + delete: 'Delete', + resetPassword: 'Reset Password', + cancel: 'Cancel', + submit: 'Submit' + }, + validation: { + requiredField: 'Required parameter cannot be empty' + }, + confirm: { + title: 'Prompt', + delete: 'Are you sure you want to delete "{nickname}"?', + resetPassword: 'Are you sure you want to reset the login password for "{nickname}"?', + confirm: 'Confirm', + cancel: 'Cancel' + } + }, + userCustomGift: { + loading: 'Loading', + filter: { + system: 'System', + userId: 'User ID', + status: 'Status', + type: 'Type', + region: 'Region' + }, + status: { + pending: 'Pending', + processed: 'Processed' + }, + type: { + uploadGift: 'Custom Gift', + increaseTime: 'Extend Duration' + }, + table: { + system: 'System', + user: 'User', + region: 'Region', + type: 'Type', + giftCode: 'Gift Code', + days: 'Days', + approveStatus: 'Pending / Processed', + createdAt: 'Created At', + actions: 'Actions' + }, + action: { + search: 'Search', + downloadImage: 'Download Image {index}', + downloadSong: 'Download Song' + }, + message: { + success: 'Operation successful', + resourceNotUploaded: 'The resource has not been uploaded by the user' + } + }, countryCode: { filter: { countryName: 'English Country Name', @@ -2298,6 +3081,7 @@ export default { action: { add: 'Add', edit: 'Edit', + view: 'View', cancel: 'Cancel', save: 'Save' }, diff --git a/src/lang/messages/pages/zh.js b/src/lang/messages/pages/zh.js index 61efa8d..22da806 100644 --- a/src/lang/messages/pages/zh.js +++ b/src/lang/messages/pages/zh.js @@ -1,5 +1,71 @@ export default { pages: { + page401: { + title: '你没有权限去该页面', + subtitle: '如需访问权限,请联系管理员', + suggestion: '或者你可以去:', + backHome: '回首页', + viewImage: '点我看图', + backPrevious: '返回上一级', + dialog: { + imageTitle: '随便看' + } + }, + compensateOrder: { + section: { + order: '补偿订单', + candy: '补偿糖果' + }, + form: { + userId: '用户ID', + orderId: '订单ID', + system: '平台', + paymentPlatform: '支付方式', + productCode: '产品CODE', + expireTime: '过期时间', + candy: '糖果' + }, + placeholder: { + selectSystem: '请选择平台', + selectPaymentPlatform: '请选择平台' + }, + action: { + submit: '提交' + }, + validation: { + requiredField: '必填字段不可为空' + }, + confirm: { + submit: '是否确认提交?', + title: '提示', + confirm: '确定', + cancel: '取消' + } + }, + goldAnalyze: { + placeholder: { + system: '系统', + userId: '用户ID' + }, + dateRange: { + separator: '至', + start: '注册开始日期', + end: '注册结束日期' + }, + action: { + search: '搜索' + }, + chart: { + incomeTitle: '金币收入', + expenditureTitle: '金币支出', + userSubtext: '用户:数据分配图', + systemSubtext: '系统:数据分配图' + }, + message: { + selectTime: '请选择时间', + withinOneMonth: '时间必须在1个月以内' + } + }, messagePush: { tabs: { newPush: '新建Push', @@ -285,7 +351,9 @@ export default { description: '描述' }, placeholder: { - system: '系统' + system: '系统', + select: '请选择', + quantity: '数量' }, type: { notification: '通知', @@ -1301,13 +1369,22 @@ export default { userId: '用户ID', search: '搜索', removeOrBlacklist: '移除/拉黑成员', - roleChange: '权限变更' + roleChange: '权限变更', + rangeSeparator: '至', + createDateStart: '创建日期开始', + createDateEnd: '创建日期结束', + businessCode: '业务CODE', + role: '角色' }, table: { cover: '封面', roomInfo: '房间信息', time: '时间', - actions: '操作' + actions: '操作', + user: '用户', + visitTime: '浏览时间', + roomRole: '房间角色', + registeredAt: '注册时间' }, row: { account: '账号', @@ -1369,7 +1446,16 @@ export default { roomPermissionChange: '房间内权限变更', roomNicknameApproval: '房间昵称审批', roomAvatarApproval: '房间头像审批', - roomNoticeApproval: '房间公告审批' + roomNoticeApproval: '房间公告审批', + activeMetrics: '房间活跃指标', + operationLog: '房间操作日志', + visitorLog: '房间访客记录', + memberDetails: '房间成员详情' + }, + chart: { + onlineUsers: '在线用户', + giftUsers: '送礼用户', + giftValue: '礼物价值' }, validation: { uploadCover: '请上传封面', @@ -1854,7 +1940,12 @@ export default { activityTime: '活动时间', updatedCreatedBy: '修改/创建人', updatedCreatedTime: '修改/创建时间', - actions: '操作' + actions: '操作', + name: '名称', + createdAt: '创建时间', + updatedAt: '修改时间', + createdBy: '创建人', + updatedBy: '修改人' }, label: { start: '开始', @@ -1878,7 +1969,16 @@ export default { copyActivityLink: '复制活动链接', loadMore: '加载更多', confirm: '确定', - cancel: '取消' + cancel: '取消', + save: '保存', + exit: '退出', + send: '发送', + add: '添加', + addLanguage: '添加语言', + reward: '奖品', + clickToChange: '点击更换', + editName: '编辑名称', + copyTemplate: '复制模版' }, word: { notStarted: '未开始', @@ -1886,7 +1986,13 @@ export default { ended: '已结束', onShelf: '上架', offShelf: '下架', - loadedAll: '已加载全部' + loadedAll: '已加载全部', + snapshot: '快照', + realtime: '实时', + sent: '已发送', + notSent: '未发送', + rangeSeparator: '至', + permanent: '永久' }, help: { title: '操作手册', @@ -1908,6 +2014,112 @@ export default { confirm: { editTemplateMessage: '注意: 模版发生改变后相关引用都会同步发生变化, 是否继续?', title: '提示' + }, + dialog: { + rank: '活动排名', + rankReward: '活动排名奖品-{mode}' + }, + section: { + button1: '按钮1', + button2: '按钮2', + button1Top20: '按钮1 TOP20', + button2Top20: '按钮2 TOP20', + prizeButton1: '奖品-按钮1', + prizeButton2: '奖品-按钮2', + basicInfo: '基础信息', + activityGift: '活动礼物', + rankingRewards: '活动排名奖品', + attributes: '属性', + style: '样式', + background: '背景', + font: '字体', + border: '边框' + }, + form: { + system: '系统', + template: '模版', + time: '时间', + status: '状态', + description: '描述', + componentName: '组件名称', + imageIndex: '图片{index}', + rewardTier: '奖励阶梯', + backgroundImage: '背景图', + backgroundColor: '背景颜色', + backgroundRepeat: '背景图重复', + backgroundSize: '背景图大小', + color: '颜色', + size: '大小', + weight: '粗细', + borderWidth: '边框宽', + borderStyle: '边框样式', + borderColor: '边框颜色', + borderRadius: '边框圆角' + }, + placeholder: { + template: '模版', + startDate: '开始日期', + endDate: '结束日期', + status: '状态', + select: '请选择', + rankRange: '排名范围' + }, + message: { + rankRetention: '活动排行榜数据只会保留30天,活动结束后排行榜不可查看。', + rankRewardRetention: '结束后通过系统活动模块发送奖品,系统会保留获奖名单数据,其他数据将在30天后逐渐清理。', + endedNotEditable: '活动结束后不可再编辑。', + expiredTimeWarning: '过期活动将不可编辑,请检查活动时间。', + endedCannotEdit: '活动已结束,不可在此编辑!', + giftQuantityInsufficient: '礼物数量不足3个。', + noButtonReward: '[{button}] 没有关联活动排名奖品。', + invalidButtonReward: '[{button}] 存在错误记录,系统将自动矫正排除。', + continueConfirm: '如果继续请点击确认按钮,是否继续?', + sysOriginRequired: '归属系统不可为空!', + rewardRuleTop20: '1. 排行榜只会展示前20名,后台处理奖品也只支持TOP20。', + rewardRuleSort: '2. 排名展示在输入的时候自行排好顺序,系统不会整理排序。', + rewardRuleRange: '3. 直接输入指定数字 1、2、3... 或使用 ~ 将两个数字连接:1~10、11~20...', + pcRecommended: '建议您使用PC电脑进行编辑!', + noPaginationTip: '没有做分页,模版数量 > 20 个后请联系管理员添加分页功能!' + }, + validation: { + requiredField: '必填字段', + templateNameMax: '模版名称必须 <= 200 个字符串。' + }, + prompt: { + templateName: '请输入模版名称', + newTemplateName: '请输入新的模版名称' + }, + gradient: { + none: '无', + toRight: '从左到右渐变', + toLeft: '从右到左渐变', + toTop: '从下到上渐变', + toBottom: '从上到下渐变', + toBottomRight: '从左对角渐变', + toBottomLeft: '从右对角渐变' + }, + preview: { + nickname: '用户昵称', + nicknameRank: '用户昵称-1' + }, + propsType: { + GIFT: '礼物', + DIAMOND: '钻石', + GOLD: '金币', + ROOM_BADGE: '房间徽章', + BADGE: '个人徽章', + SPECIAL_ID: '靓号', + NOBLE_VIP: '贵族VIP', + AVATAR_FRAME: '头像框', + RIDE: '座驾', + THEME: '房间背景', + EMOJI: '表情包', + CHAT_BUBBLE: '聊天气泡', + GAME_COUPON: '游戏券', + FRAGMENTS: '碎片', + FLOAT_PICTURE: '个人飘窗', + LAYOUT: '房间装扮', + CUSTOMIZE: '自定义' } }, businessDevelopment: { @@ -1920,9 +2132,11 @@ export default { backendMember: '后台成员' }, table: { + system: '系统', user: '用户', region: '区域', teamCount: '团队数量', + anchorCount: '主播数量', contact: '联系方式', createdBy: '创建人', updatedBy: '修改人', @@ -1939,12 +2153,42 @@ export default { changeBdLeader: '换绑BD Leader', assignPermission: '权限分配', confirm: '确定', - cancel: '取消' + cancel: '取消', + close: '关闭', + save: '保存', + submit: '提交' }, confirm: { deleteMessage: '您确定要删除吗(将无法恢复, 解散当前团队成员)?', + deleteMemberMessage: '您确定要删除吗', title: '温馨提示' }, + dialog: { + addBd: '添加BD', + editBd: '修改BD', + permissionSettings: '权限设置', + bindBdLeader: '绑定BDLeader', + bindAgent: '绑定代理', + teamMembers: 'BD团队代理成员' + }, + form: { + bd: 'BD', + region: '区域', + contact: '联系方式', + agent: '代理', + bdLeader: 'BD Leader' + }, + placeholder: { + bdUserId: 'BD用户ID', + selectRegion: '请选择区域', + contact: '联系方式', + accountOrSpecialId: '请输入账号或靓号', + agentAccount: '请输入代理账号', + userId: '用户ID' + }, + validation: { + requiredField: '必填字段不可为空' + }, permission: { validating: '权限验证中...', deniedPrefix: '抱歉您无权查看,请联系管理员开通查看权限', @@ -1952,7 +2196,222 @@ export default { }, message: { copySuccess: '复制成功', - copyFail: '复制失败' + copyFail: '复制失败', + submitting: '正在提交!', + success: '成功' + } + }, + teamCreate: { + dialog: { + title: '创建代理' + }, + section: { + settingInfo: '设置信息', + contactInfo: '联系方式' + }, + form: { + region: '区域', + agent: '代理', + bindBd: '绑定BD', + bd: 'BD', + remark: '备注', + setting: '设置', + contactInfo: '联系方式', + memberQuantity: '成员数量', + type: '类型', + contact: '联系' + }, + placeholder: { + region: '区域', + agentId: '请输入代理ID', + bdId: '请输入BD ID', + remark: '请输入备注', + maxMember: '最大成员数量', + selectType: '选择类型', + contact: '请输入联系方式' + }, + action: { + cancel: '取消', + save: '保存' + }, + validation: { + requiredField: '必填字段不可为空' + }, + message: { + submitting: '正在提交!' + }, + word: { + yes: '是', + no: '否' + } + }, + bdLead: { + loading: '加载中', + filter: { + system: '系统', + backendMember: '后台成员' + }, + table: { + system: '系统', + user: '用户', + region: '区域', + bdQuantity: 'BD数量', + contact: '联系方式', + createdBy: '创建人', + createdAt: '创建时间', + actions: '操作' + }, + form: { + leader: 'Leader', + bd: 'BD', + region: '区域', + contact: '联系方式' + }, + placeholder: { + bdLeadUserId: 'BD Leader用户ID', + bdLeadUserIdWithSpace: 'BD Leader 用户ID', + selectRegion: '请选择区域', + contact: '联系方式', + bdAccount: '请输入BD账号' + }, + action: { + search: '搜索', + createBdLead: '新增BD Lead', + addSubBd: '增加子级BD', + edit: '编辑', + delete: '删除', + confirm: '确定', + cancel: '取消', + close: '关闭', + save: '保存' + }, + dialog: { + create: '创建BD Leader', + edit: '编辑BD Leader', + bindSubBd: '绑定子级BD' + }, + validation: { + requiredField: '必填字段不可为空' + }, + confirm: { + deleteMessage: '您确定要删除吗(将与名下BD解除绑定, 不影响其他BD身份)?', + title: '温馨提示' + }, + message: { + copySuccess: '复制成功', + copyFail: '复制失败', + submitting: '正在提交!', + success: '成功' + } + }, + appVersionManager: { + loading: '加载中', + filter: { + system: '系统', + platform: '平台', + channel: '渠道' + }, + table: { + id: 'ID', + platform: '平台', + version: '版本', + buildVersion: '编译版本', + forceUpdate: '强更', + review: '审核中', + appType: 'App类型', + patch: '补丁', + updateDescribe: '版本描述', + apkSize: '安装包大小', + downloadUrl: '下载链接', + createTime: '创建时间', + actions: '操作', + language: '语言', + description: '描述', + worshipDescription: '朝拜描述' + }, + form: { + platform: '平台', + channel: '渠道', + version: '版本号', + buildVersion: '编译版本号', + forceUpdate: '强更', + appType: 'App类型', + review: '审核中', + patch: '补丁', + apkSize: '安装包大小', + downloadUrl: '下载链接', + language: '语言', + updateDescribe: '更新描述', + updateWorshipDescribe: '更新朝拜描述' + }, + placeholder: { + version: '请输入版本号', + buildVersion: '请输入编译版本号', + apkSize: '请输入安装包大小', + downloadUrl: '请输入下载链接', + language: '语言', + updateDescribe: '请输入更新描述', + updateWorshipDescribe: '请输入更新朝拜描述' + }, + action: { + search: '搜索', + add: '添加', + copy: '点击复制', + edit: '编辑', + delete: '删除', + serviceForceUpdate: '服务强更', + updateDescription: '更新描述', + addDescription: '新增描述', + save: '保存', + cancel: '取消', + submit: '提交', + confirm: '确定' + }, + dialog: { + descriptionList: '描述列表', + addDescription: '新增描述', + editDescription: '修改描述', + addVersion: '添加({sysOrigin})', + editVersion: '修改({sysOrigin})' + }, + confirm: { + title: '温馨提示', + deleteVersion: '是否确认删除', + setServerBuildVersion: '服务器将拦截小于当前buildVersion请求,10分钟内生效是否继续?', + deleteDescription: '确定删除描述吗?' + }, + validation: { + requiredField: '必填项不可为空', + max500: '最大 500 字符' + }, + message: { + copySuccess: '复制成功', + copyFail: '复制失败', + deleteSuccess: '删除成功' + }, + word: { + yes: '是', + no: '否' + }, + appType: { + chat: '语聊', + worship: '朝拜' + }, + language: { + en: '英语', + ar: '阿拉伯语', + id: '印尼语', + tr: '土耳其语', + ru: '俄语', + pt: '葡萄牙语', + ko: '韩语', + ja: '日语', + hi: '印地语', + fr: '法语', + es: '西班牙语', + de: '德语', + zh_CN: '中文', + zh_TW: '繁体' } }, lotteryConfig: { @@ -2051,7 +2510,33 @@ export default { resetConsumeStock: '是否重置消费库存' }, validation: { - positiveInteger: '请输入正整数' + positiveInteger: '请输入正整数', + requiredField: '必填字段不可为空' + }, + selectPrize: { + title: '选择奖品', + form: { + type: '选择类型', + quantity: '数量' + }, + group: { + common: '常用', + props: '道具', + badge: '徽章', + currency: '货币' + }, + typeOptions: { + gift: '礼物', + avatarFrame: '头像框', + ride: '座驾', + nobleVip: '贵族', + roomBackground: '房间背景', + emoji: '表情包', + userBadge: '用户徽章', + roomBadge: '房间徽章', + gold: '金币', + diamond: '钻石' + } }, defaultPrizeText: '{index} 元红包' }, @@ -2198,6 +2683,302 @@ export default { sizeExceeded: '{fileName} 超出 {maxSize}MB' } }, + toolsOther: { + cards: { + userSwap: '用户账户调换', + apiSign: 'API参数签名', + aliasMethod: 'Alias Method分析', + tokenParse: '用户令牌解析', + redisOps: 'Redis操作', + userRoomRegion: '用户房间区域变动', + userCancelRestore: '注销用户恢复' + }, + action: { + setAttributes: '设置属性', + rerun: '重新运行', + clearAttributes: '清空属性', + addAttribute: '新增属性', + quickFill: '快速填充', + confirm: '确定' + }, + form: { + mode: '模式', + userId: '用户ID', + longUserId: '用户长ID', + country: '国家' + }, + placeholder: { + enterKey: '请输入Key信息', + enterUserToken: '请输入用户令牌', + enterUserId: '请输入用户ID', + enterSourceLongUserId: '请输入原始用户长ID', + enterTargetLongUserId: '请输入目标用户长ID', + selectCountry: '请选择国家' + }, + validation: { + requiredField: '必填字段不可为空', + requiredParam: '必填参数不可为空' + }, + aliasMethod: { + dialogTitle: '设置概率', + probabilityDescription: '概率说明', + averageProbability: '平均概率: 1.0 / 奖品数量 = {value}', + probabilityFill: '概率填充: 概率 >= 平均概率(进入 large), 否则(进入 small)', + sampling: '采样:', + samplingRuleOne: '1. 如果设置概率全部小于平均概率, 当前概率 = 1', + samplingRuleTwo: '2. 如果设置概率 (当前最大概率 + 当前最小概率 - 平均概率) > 平均概率, 继续采用 large。', + samplingScenario: '出现情况: 我设置了概率 0.9、0.8、0.3, 但是 0.3 变成了大概率, 由于概率设置过高导致不够平均, 取到的第一个概率被不断采样。', + suggestion: '建议: 概率 + 库存这样比较保险安全', + runCount: '运行次数', + item: '商品', + probability: '概率' + }, + apiSign: { + platform: '签名平台', + platformPlaceholder: '平台', + body: '数据内容', + signKey: '签名KEY', + dialogTitle: 'API内容属性', + key: '键', + value: '值' + }, + tokenParse: { + parseToken: '令牌解析', + getToken: '获取令牌', + token: '令牌' + }, + redisOps: { + clearKey: '清理Key' + }, + userSwap: { + sourceId: '原始ID', + targetId: '目标ID', + checkCondition: '验证转换条件', + submitExecute: '提交执行', + tips: { + sourceUserNotFound: '原始用户没有找到', + targetUserNotFound: '目标用户没有找到', + differentSystem: '用户来自不同系统', + sourceAuthNotFound: '原始用户认证信息没找到', + targetAuthNotFound: '目标用户认证信息没找到', + openIdMismatch: '注册来源OpenId不一致' + } + } + }, + websocketTool: { + broadcast: { + title: '订阅广播消息' + }, + direct: { + title: '点对点' + }, + step: { + flow: '创建连接 -> 订阅主题 -> 发送消息' + }, + form: { + socketEndpoint: '连接端点', + subscribePath: '订阅地址', + sendEndpoint: '发送接口', + myToken: '我的token', + content: '消息内容', + repositoryEndpoint: '仓库端点', + repositoryData: '仓库数据', + statusDescription: '状态描述', + subscribePrefix: '订阅前缀', + targetUserId: '接收用户ID' + }, + placeholder: { + socketEndpoint: '连接端点', + subscribePath: '订阅地址', + sendEndpoint: '发送接口', + myToken: '我的token', + content: '消息内容', + repositoryEndpoint: '仓库端点', + repositoryData: '插入仓库数据', + subscribePrefix: '订阅前缀', + targetUserId: '接收用户,长ID' + }, + action: { + addRepository: '添加仓库', + sendMessage: '发送消息', + subscribeTopic: '订阅主题', + disconnect: '断开连接', + connect: '进行连接' + }, + validation: { + requiredField: '必填字段' + }, + message: { + connected: '连接成功', + disconnected: '断开连接', + connectFirst: '请先进行连接.', + createFirst: '请先创建连接.', + enterMessageContent: '请输入消息内容.' + } + }, + gameLudo: { + placeholder: { + type: '类型', + system: '系统' + }, + action: { + search: '搜索', + dismiss: '解散', + loadMore: '点击加载更多' + }, + state: { + allLoaded: '已经加载全部' + }, + dialog: { + players: '游戏玩家' + }, + table: { + system: '系统', + roomInfo: '房间信息', + status: '状态', + amount: '金额(加入/奖金)', + situation: '情况', + playerCount: '玩家:{count}', + lockedSeat: '锁定座位:{count}', + victorySide: '胜利方', + createdAt: '创建时间', + updatedAt: '修改时间', + actions: '操作', + avatar: '头像', + nickname: '昵称', + board: '棋盘', + ranking: '名次', + roomOwner: '房主', + consume: '消费' + }, + type: { + run: '运行', + history: '历史' + }, + status: { + wait: '等待开始', + progress: '进行中', + end: '已结束' + }, + event: { + none: '无', + timeoutDisband: '游戏未开始超时,解散', + disconnectedDisband: '游戏已开始,全部掉线后,解散', + otherDisband: '其他,不在预计状态内', + normalSettlement: '正常结算', + backDisband: '后台解散' + }, + confirm: { + dismiss: '后台解散游戏将没有胜利者, 是否确定解散?', + title: '提示', + confirm: '确定', + cancel: '取消' + } + }, + requestBlacklist: { + action: { + addIp: '新增IP', + addPhoneModel: '新增手机型号' + }, + confirm: { + delete: '确认删除吗?', + title: '提示' + }, + prompt: { + invalidType: '错误的参数类型', + ipTip: '请输入IP, 格式如:127.0.0.1 或 127.0.0 每少一位表示多屏蔽一个网络段', + phoneModelTip: '请输入手机型号, 最终系统保存为大写', + title: '提示', + confirm: '确定', + cancel: '取消' + }, + message: { + paramTypeError: '参数类型错误' + } + }, + imAccountManager: { + filter: { + userId: '用户ID' + }, + alert: { + title: '提示', + description: '使用站内注册账号关联后台PC端IM登录授权,登录账号“短ID”初始密码“88888888”' + }, + table: { + avatar: '头像', + nickname: '昵称', + imUsername: 'IM用户名', + createdAt: '创建时间', + actions: '操作' + }, + dialog: { + create: '添加' + }, + form: { + userId: '用户ID', + password: '登录密码' + }, + placeholder: { + userId: '请输入用户ID', + password: '请输入登录密码' + }, + action: { + search: '搜索', + add: '添加', + delete: '删除', + resetPassword: '重置密码', + cancel: '取消', + submit: '提交' + }, + validation: { + requiredField: '必填参数不可为空' + }, + confirm: { + title: '提示', + delete: '是否确认删除 "{nickname}" ?', + resetPassword: '是否确认重置 "{nickname}" 登录密码?', + confirm: '确定', + cancel: '取消' + } + }, + userCustomGift: { + loading: '加载中', + filter: { + system: '系统', + userId: '用户ID', + status: '状态', + type: '类型', + region: '区域' + }, + status: { + pending: '待处理', + processed: '已处理' + }, + type: { + uploadGift: '专属定制', + increaseTime: '增加时长' + }, + table: { + system: '归属系统', + user: '用户', + region: '区域', + type: '类型', + giftCode: '礼物Code', + days: '天数', + approveStatus: '待处理/已完成', + createdAt: '创建时间', + actions: '操作' + }, + action: { + search: '搜索', + downloadImage: '下载图片{index}', + downloadSong: '下载歌曲' + }, + message: { + success: '操作成功', + resourceNotUploaded: '资源用户未上传' + } + }, countryCode: { filter: { countryName: '英文国家名称', @@ -2297,6 +3078,7 @@ export default { action: { add: '添加', edit: '修改', + view: '查看', cancel: '取消', save: '保存' }, diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 71ddd65..b888653 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -11,13 +11,14 @@ diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue deleted file mode 100644 index a117eed..0000000 --- a/src/layout/components/Navbar.vue +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - diff --git a/src/permission.js b/src/permission.js index 98ff92b..ddb48c0 100644 --- a/src/permission.js +++ b/src/permission.js @@ -41,21 +41,15 @@ router.beforeEach(async(to, from, next) => { } else { try { // get user info - await store.dispatch('user/getInfo').then(res => { - store.dispatch('user/getMenus').then(res => { - // store.getters.routers - // router.addRoutes(store.getters.routers) - if (res && res.length > 0) { - router.addRoutes(res) - } - }) - // load dashboard - store.dispatch('user/getUserDashboard') - }).catch(err => { - console.error(err) - }) + await store.dispatch('user/getInfo') + const grantRouters = await store.dispatch('user/getMenus') + if (grantRouters && grantRouters.length > 0) { + router.addRoutes(grantRouters) + } + // load dashboard + store.dispatch('user/getUserDashboard') await store.dispatch('user/buttonPermissions') - next() + next({ ...to, replace: true }) } catch (error) { // remove token and go to login page to re-login await store.dispatch('user/resetToken') diff --git a/src/views/401.vue b/src/views/401.vue index b72954e..b65f92d 100644 --- a/src/views/401.vue +++ b/src/views/401.vue @@ -5,19 +5,19 @@
活动排行榜数据只会保留30天, 活动结束后排行榜不可查看
-结束后: 通过系统活动模块发送奖品,系统会保留获奖名单数据, 其他数据将在30天后逐渐清理
+{{ $t('pages.activityTemplateManage.message.rankRetention') }}
+{{ $t('pages.activityTemplateManage.message.rankRewardRetention') }}
-
1.排行榜只会展示前20名, 后台处理奖品也只支持道TOP20
-2.排名展示在输入的时候自行排好顺序, 系统不会整理排序
-3.直接输入指定数字 1、2、3... 或 使用~将两个数字连接: 1~10、11~20...
+{{ $t('pages.activityTemplateManage.message.rewardRuleTop20') }}
+{{ $t('pages.activityTemplateManage.message.rewardRuleSort') }}
+{{ $t('pages.activityTemplateManage.message.rewardRuleRange') }}