Commit Graph
138 Commits
Author SHA1 Message Date
TermiNexus bff4a9f743 fix(Talk): 头像绑定改用 :userUUID,修正 prop 匹配以显示 GERP 系统头像 2026-10-13 17:47:32 +08:00
TermiNexus 07992a5621 fix(Talk): 头像组件 prop 改为 camelCase,恢复显示 GERP 系统头像 2026-10-13 17:42:04 +08:00
TermiNexus 5b3a75ea75 feat(Talk): 抽屉支持点击遮罩关闭 2026-10-13 17:32:59 +08:00
TermiNexus dd1ece0a7f feat(Talk): 系统消息居中展示,订阅 talk:conversation 实时同步
talkSocket 新增 talk:conversation 事件;Talk.vue 收到该事件后:解散或本人被移出则直接移除该会话(在会话中同时清空聊天区并提示),其余变更(改名/公告/角色/移出他人)重新拉取会话列表。

消息区区分 MsgType=3 系统消息,居中灰字展示(不带头像与名字);api/talk 补齐 MsgType.System。
2026-10-13 17:21:12 +08:00
TermiNexus 04535d2dc0 feat(Talk): 成员支持移出群聊/转让群主,新增群公告展示与编辑
成员「更多」菜单按权限显示:设为/取消管理员(群主/Talk 管理员)、转让群主(群主/Talk 管理员,二次确认)、移出群聊(群主可移出任意成员,群管理员仅普通成员,二次确认)。

群聊会话顶部展示群公告横幅(群主/管理员可直接编辑),群菜单新增「群公告」入口,抽屉内可编辑或清空。
2026-10-13 16:38:52 +08:00
TermiNexus 899dfbc8e9 feat(Talk): 用户头像改用 GERP 系统头像,成员面板支持设置群管理员
新增 TalkAvatar 组件:优先取 /Query/GetELTUserAvatar(带 server/admin_verify 作用域参数),加载失败或群聊无对应用户时回退首字母色块;会话列表/消息/成员面板统一改用它,移除本地首字母色块逻辑。

成员面板显示群主/管理员标签与「管理员 x/上限」,群主可对成员设为/取消管理员(上限取 Entry.GroupAdminLimit,与后端一致);改群名入口与操作加权限判定(群主/管理员/Talk 管理员)。
2026-10-13 16:08:24 +08:00
TermiNexus 65aa99a505 fix(微前端): 修复远端应用深链/硬刷新落到 404 及 Promise 误渲染
- main.ts 在 app.use(router) 之前注入远端路由:首帧导航即刻解析路由表,晚注入会让直开 #/remote-app/xxx 落进 NotFound(页面不存在)

- 动态路由改名 RemoteMicroApp,避免与 legacy /remote/:appCode 路由重名(重名会被 vue-router 先移除)

- RemoteAppHost 直开时按 AppCode 反查「我的订阅」补齐登记(EnsureProductRemoteApp)

- LoadRemoteComponent 解包 thenable,避免 Promise 被当组件渲染成 [object Promise]
2026-10-05 18:20:38 +08:00
TermiNexus 4be6ed89ee feat(微前端): 远端宿主支持 mount/unmount 微应用契约
- remoteLoader 拆出 LoadRemoteModule,先探测远端模块的 mount/unmount,再回退组件工厂

- RemoteAppHost 兼容两种契约:微应用由远端自带运行时挂载,组件工厂由宿主渲染
2026-10-05 17:45:40 +08:00
TermiNexus 7db725d9f4 fix(微前端): 远端应用改为 Layout 子路由,不再覆盖 GERP 框架
此前 /remote-app/:code 经 router.addRoute 注册为顶层路由,会绕过 DefaultLayout 直接铺满整屏(盖住侧边栏/顶栏);现给布局父路由命名 Layout 并以 router.addRoute('Layout', ...) 注入子路由,远端页面渲染在 GERP 框架内(保留导航与标签页)。
2026-10-05 17:05:11 +08:00
TermiNexus 5ffadd3f8a feat(订阅式软件提供): 新增「我的订阅」页并动态加载产品定制页
新增 MySubscriptions 页(列出当前用户已订阅产品、提供者与订阅部门);对已声明 RemoteEntry 的产品经 RegisterProductRemoteApp 登记为远端应用,点「打开定制页」走 /remote-app/:code 由 RemoteAppHost 原生渲染;新增 GET /API/Subscription/MySubscriptions 客户端与类型;路由新增 subscription/my。
2026-10-05 17:02:20 +08:00
TermiNexus bcd4aca403 feat(微前端): 新增远端组件加载器与动态路由(PoC)
补上宿主侧微前端基础设施:main.ts 启动时经 router.addRoute 注入 /remote-app/:code;remoteLoader 支持工厂/模块联邦/直接导出三种远端约定并把宿主运行时(Vue/Router/Pinia/Element Plus)传给远端以共享单例;新增 RemoteAppHost 宿主页与 public/remote-demo 演示远端模块;AppFrontendModule 增加 remote 类型与 RemoteEntry/RemoteModule 字段。仅登记演示应用,不接后端清单。
2026-10-05 12:04:29 +08:00
TermiNexus 70cce18b23 fix(订阅式软件提供): 精简凭据提示文案并修正密钥输入框宽度
API 与密钥弹窗顶部说明改为「提供者子服务器用这对凭据换取访问令牌,以启用本软件功能。」;一次性密钥行加 flex:1,令输入框占满剩余宽度。
2026-10-05 11:33:14 +08:00
TermiNexus 75cb2b6b97 feat(订阅式软件提供): 软件管理页新增 API 与密钥、订阅成员弹窗
Group.vue 每个产品新增「API 与密钥」弹窗(激活/查看 ApiKey/重置密钥,密钥仅一次性展示可复制)与「订阅成员」弹窗(选消费者公司 + 部门员工选择器批量添加、列表移除);subscription.ts 增加凭据与成员接口及类型;entityPickerPresets 增加 DeptEmployee 预设;MultiEntityPicker 增加 company 过滤属性。
2026-10-05 11:29:13 +08:00
TermiNexus 43998fee1d feat(gerp): 订阅表单取消提供者/消费者的互斥禁用
- 订阅组管理弹窗与应用订阅方卡片:两方下拉不再互相 disabled,同一家公司可同时选中
- 提示文案改为「同一家公司也可同时作为另一侧」
2026-10-05 11:03:59 +08:00
TermiNexus 30bd077e93 feat(gerp): 配置页注入「应用订阅方」卡片,订阅应用新增软件管理菜单
- ConfigPanel.vue 重写为可编辑卡片:按租户分组多选提供者/消费者公司(互斥),保存应用级订阅方(初始化引用)
- apps/index.ts:subscription 入口改 /subscription/software,注入卡片改「应用订阅方」
- router:新增 /subscription/software(软件管理,与订阅组管理同页不同入口)
- Group.vue:按路由切换页面标题(软件管理 / 订阅组管理)
2026-10-02 23:12:32 +08:00
TermiNexus 3010a116c2 feat(gerp): 应用可注入自己的配置页/配置区块,配置范围只列已安装公司
- apps/index.ts:注册表新增 ConfigPage(替换通用「配置项」表单)与 ConfigPanels(注入自定义区块),新增 getAppConfigPage/getAppConfigPanels,并登记 subscription 应用
- AppConfigPage.vue:渲染应用注入的配置页/区块(下发 AppUUID/公司/范围上下文);右上角范围下拉只列「该应用已安装 且 有管理权」的公司,全租户安装视为全部公司已装
- subscription:注入「订阅关系概览」区块(按公司展示作为提供者/消费者参与的产品)
2026-10-02 22:35:04 +08:00
TermiNexus 8146b319fb fix(gerp): 切换角色后重新判定管理员身份
RoleSwitcher 切角色后只刷新用户信息/菜单/角色,未刷新 CheckAdmin,导致 isAdmin 与 role_scope 停留在上一个角色:从普通角色切到「银河锋锐负责人」(admin:tenant)后,应用市场不显示「安装」按钮,无法开通应用。

- confirm() 补 await userStore.fetchAdminCheck()
- 同类入口(DefaultLayout 的切换角色)走同一对话框,一并修复
2026-10-02 22:21:00 +08:00
TermiNexus 59d515875d feat(gerp): 新增订阅组管理与订阅关系页面
- api/subscription.ts:订阅组/订阅关系/可选公司接口
- views/subscription/Group.vue:订阅组(产品)增删改,提供者/消费者多选按租户分组且互斥禁用
- views/subscription/Relation.vue:按公司汇总提供/消费的产品,含统计与关键字过滤
- router 注册 /subscription/group、/subscription/relation
2026-10-02 21:36:14 +08:00
TermiNexus debc0d7745 feat(gerp): 用户详情页员工档案也加身份证解锁
- 抽出 useIdCardUnlock(解锁态 + 校验逻辑)与 IdCardUnlockDialog(密码弹窗),档案管理页与用户详情页共用同一套解锁态
- UserDetailPanel 员工档案卡片头加「查看身份证」(已解锁显示标签);未解锁时身份证只读行整行隐藏、编辑表单禁用 + 提示
- Profile.vue 改为复用公共 composable/弹窗,去掉内联实现
2026-10-02 16:29:42 +08:00
TermiNexus e2006534be feat(gerp): 档案表单未解锁时身份证禁用并提示
- 新增 ColumnSchema.tip 与 CrudFormPanel 提示行渲染
- CrudTable 新增 columnOverrides:父页面可按运行态覆盖表单列属性(仅表单,不影响表格)
- 档案页未解锁时身份证输入框禁用 + 提示「需验证密码才能查看/修改」,其余字段照常可改
2026-10-02 14:19:07 +08:00
TermiNexus e62aa86dd7 feat(gerp): 档案页身份证号二次密码解锁查看
- 档案管理页新增「查看身份证」按钮:输入当前登录账号密码解锁
- 解锁成功后刷新列表,10 分钟内切换他人档案同样可查看(解锁态后端按登录用户维护)
- api/form.ts 新增 ehrmIdCardApi(unlock/status)
2026-10-02 14:13:30 +08:00
TermiNexus c97d5ffb99 feat(gerp): 部门员工点击整行弹出用户详情抽屉
部门详情的部门员工子表:点击行内任意位置弹出 60% 宽抽屉,抽屉内容与
/system/user-detail 页面完全一致。

为此把用户详情页内容抽成可嵌入组件 UserDetailPanel(props: userUUID,
emit: loaded/loading/navigate,defineExpose: handleEdit):
- views/system/UserDetail.vue 退化为页面外壳(路由取 UUID + DetailPage 标题/
  加载态/编辑按钮),内容由面板提供,页面表现与改动前一致
- DepartmentDetail 的抽屉复用同一面板,因此抽屉里看到的就是同一份内容

顺带修掉一个既有 bug:CrudTable 原先绑定的 @row-click 在 vxe-table 上并不存在
(事件表只有 cell-click),该绑定从未触发过。现改为 cell-click,并放过
复选/单选/序号/展开列与行内按钮,避免勾选行或点操作按钮时误触发行点击。
2026-10-02 12:56:02 +08:00
TermiNexus 741d309715 feat(gerp): 工作组详情员工卡片标题显示角色数与用户数 2026-10-01 23:18:01 +08:00
TermiNexus 66304f9c5e feat(gerp): 部门/公司详情员工卡片标题显示角色数与用户数
部门详情卡片标题改为「部门员工(角色数:x/用户数:y)」,
公司详情改为「员工(角色数:x/用户数:y)」:
角色数取列表 total(用户-角色关系条数),用户数取后端新增的 user_count(去重用户数)。

计数与子表同源:复用 List 接口带 WithUserCount=1 只取 1 行拿计数,保证与表格
完全相同的 DeptUUID/CompanyUUID 过滤;批量调整职务成功后与子表一起刷新。
PagedData 类型补充可选的 user_count 字段。
2026-10-01 23:16:14 +08:00
TermiNexus dfed6ef8bc fix(gerp): 详情卡片头只给标题图标上主色,修正操作按钮图标与文字异色
.detail-card-header 里的 .el-icon 原为后代选择器,把卡片头右侧 link 按钮(如 eHRM 档案的「删除」)的图标也刷成主色,与按钮 danger 文字色不一致;改为直接子选择器,按钮图标恢复随按钮自身配色。
2026-10-01 20:05:25 +08:00
TermiNexus c76c73d203 refactor(gerp): 日期选择器 value-format 收敛为共用 columnDateValueFormat
CompanyDetail/DepartmentDetail/RoleDetail(公司·系统)/TenantDetail(2 处)/WorkgroupDetail/UserDetail 主编辑弹窗共 8 处复制的 el-date-picker 补齐 value-format,与 CrudFormPanel 共用 utils/column 里的同一实现,避免同类 DateField 提交报错再次出现。
2026-10-01 20:01:53 +08:00
TermiNexus 0fdaf4afba fix(gerp): 日期字段统一回传纯日期串,修正 DateField 提交报错
date 类型(后端 DateField)此前按 Date 对象绑定,提交时被序列化成带时区的 ISO 时刻(2019-08-31T16:00:00.000Z),后端只接受 YYYY-MM-DD 而 500;改为 el-date-picker 显式 value-format=YYYY-MM-DD,跨时区也不会算偏一天。datetime 保持原样。列表与档案只读展示对 date 类型原样输出,不再走 UTC→本地时区转换。
2026-10-01 19:57:46 +08:00
TermiNexus a25cae3089 feat(gerp): 支持条件显示字段 visibleWhen
新增 utils/column.ts isColumnVisible(按另一字段值判定),CrudFormPanel 模板与校验规则只渲染可见列,UserDetail 档案只读展示同口径;types 增加 ColumnSchema.visibleWhen。
2026-10-01 19:51:27 +08:00
TermiNexus bf94cecea6 feat(gerp): 员工档案填写自动带出部门员工关联并隐藏该字段
用户详情页「点击填写/编辑」档案时,按本页 UserUUID 查该员工的主「部门员工关联」自动填充(取值即落库,后端解析出员工与部门),并隐藏表单里的选择器;查不到时(该员工尚未挂靠部门)仍显示选择器供手动选。
2026-10-01 19:39:44 +08:00
TermiNexus 6bb1edba88 feat(gerp): 新增子表单控件,员工档案展示新字段
CrudFormPanel 支持 type=subform(明细子表可增删行,明细数组随主表提交);新增 SubFormTable 组件;types 增加 SubFormConfig;UserDetail 档案面板按后端下发选项展示(布尔显示是/否、多选顿号分隔、部门名走关联标签、联系方式明细单独成块,类型名取后端选项)。
2026-10-01 19:36:51 +08:00
TermiNexus f806106c88 feat(gerp): 部门详情不提供新增入口,新增 creatable 属性
CrudTable 新增 creatable 属性(默认 true)只隐藏「新增」按钮,保留编辑/删除/批量删除;部门详情页部门员工子表传 creatable=false —— 部门成员须走入职流程(EmployeeProfile → UserRole/UserRoleDepartment),本页只保留编辑职务与批量调整职务。
2026-10-01 16:56:44 +08:00
TermiNexus 78866514e8 fix(gerp): 修复"空草稿"误判,只看用户可填列
草稿判定原来比对整个表单对象,隐藏列/父级注入列/自动时间戳(CreateTime 每次打开都不同)与多选列空数组规范化都会产生差异,导致明明是空草稿仍弹恢复提示。改为写入与恢复共用 hasUserInput:仅比对表单可填列(editableFields)且值非空、与基线不同;内容清空时同步清掉旧草稿。
2026-10-01 16:16:36 +08:00
TermiNexus 0e45175bc8 feat(gerp): 空草稿自动丢弃并新增"删除草稿"操作
useDraftAutosave:打开新增表单时,草稿无有效内容(全空值或与表单基线一致)直接丢弃不弹窗;恢复提示按钮改为「恢复草稿/删除草稿」,右上角关闭视为稍后再看(保留草稿)。
2026-10-01 16:13:18 +08:00
TermiNexus 85fba0ef9f fix(gerp): 实体选择器浏览面板标题去重并加宽加高
EntityPicker/MultiEntityPicker 浏览面板标题改用 browseTitle,占位文案已以「选择」开头时不再重复前缀;面板宽度 560->680px,列表高度 220-320 -> 420-560px。
2026-10-01 14:10:07 +08:00
TermiNexus 263375d11f refactor(batch-position): 批量职务弹窗的部门员工树改用统一数据源
新增 composables/useDeptEmployeeTree.ts(部门树 → 成员的单一实现,数据源 /API/FormAPI/DeptEmployeeSearch,与 EntityPicker(treeGroup) 同源):分页拉全 + 服务端部门树组装 + 统一成员标签,单部门模式返回单个分组节点。BatchPositionDialog 的公司页 / 部门列表页 / 部门详情页三个分支改为调用它,删除各自分页拉 UserRoleSearch 再前端拼树、以及 Get/UserRoleDepartment 的重复实现;工作组相关分支(非部门树)保持不动。顺带修正未分组节点 id 未计入 groupIds 导致勾选它会被当作成员 PK 提交的问题。
2026-10-01 00:35:20 +08:00
TermiNexus cf621cb9ec feat(ehrm): 用户详情员工档案改为单条档案面板(去表格)
去掉员工档案子表,改为一人一份的档案面板:无档案且有 eHRM 权限(菜单可见)时居中显示「点击填写」(抽屉动态表单),无权限显示「无权修改」;已有档案时用 el-descriptions 键值只读展示,卡片右上角提供编辑/删除。表单与列表共用 /API/FormAPI/Columns/EmployeeProfile 列定义,UserUUID 由本页上下文注入。撤回上一版 CrudTable 的 singleRow 属性(该方案已废弃)。
2026-09-30 23:45:46 +08:00
TermiNexus 1cdc44c1d0 fix(theme): 深色模式下主色衍生色阶改用暗底混合
applyPrimaryColor 恒定用白色混出 --el-color-primary-light-N,而这些值写的是 documentElement 内联变量,优先级高于 Element Plus 的 html.dark 样式表,导致深色下 light-9 仍是近白(#ecf5ff),plain 按钮(底色=light-9)在深色界面里是一块近白补丁。改为按当前明暗选择混合基色:深色 light-N 混 #141414、dark-2 反向混白 0.2,取值与 EP 暗色主题逐值一致(light-9 #18222b / dark-2 #66b1ff);浅色逻辑不变。
2026-09-30 20:24:46 +08:00
TermiNexus 5e277eb167 style(app): 我的应用/授权审批图标底色与应用市场统一
AppMine、AppPending 的 .app-icon 底色同样由主色渐变改为 var(--el-fill-color-light),三处应用图标块样式一致;同步移除 AppMine 的 html.dark 蓝色透明底特例。
2026-09-30 20:22:31 +08:00
TermiNexus d3e8901e19 style(app): 应用市场图标底色改为中性浅色块
图标底色由主色渐变(primary-light-8/7)改为 var(--el-fill-color-light),与应用/公司详情的图标块统一;同步移除 html.dark 下的蓝色透明底特例(浅色填充本身随主题自适应)。
2026-09-30 19:30:51 +08:00
TermiNexus bdc4cc776b fix(company): 公司详情 已启用应用 图标改按组件名渲染
AppIcon 存的是 Element Plus 图标组件名(UserFilled/Connection/Money 等)而非图片 URL,原实现用 img :src=AppIcon 会加载失败变成破图,且不落回默认图标。改为与 AppMarket/AppMine/AppPending 一致:el-icon + component :is=(AppIcon 或 Grid),无图标时回退默认 Grid 占位图标;顺带移除已失效的 .company-app-icon img 样式。
2026-09-30 19:24:44 +08:00
TermiNexus 507419b6d6 style(global): el-empty 统一居中
el-empty 默认宽度随内容收缩,作为 grid/flex 子项时会停在首列而偏左
(应用中心 /app/mine、/app/market 的 .app-grid 卡片栅格最明显)。
全局统一:grid 容器中跨满整行 + 撑满可用宽度 + 文本居中,覆盖全站 el-empty。
2026-09-30 19:08:54 +08:00
TermiNexus 0df186b5c8 fix(CrudTable): 补回 formMode 向 CrudFormPanel 的透传
上一轮给 CrudTable 增加 formMode(默认 drawer)时,CrudFormPanel 上的 :mode 绑定被 IDE 静默回滚,导致 mode 恒为 undefined、isDrawer 判定失败 —— 详情页子表(如部门详情页的部门员工)的新增/编辑仍以居中弹窗出现。

本次补回绑定。产物核验:CrudTable 产物中已出现 mode:e.formMode 绑定,容器分支为 isDrawer ? {direction: rtl, size: 600} : {width: 600px};入口 /assets/index-r5V6B5Zk.js。
2026-09-30 00:29:40 +08:00
TermiNexus 524d2ad630 refactor(ui): 剩余编辑/新增类表单弹窗统一改为右侧抽屉
承接 CrudTable formMode 默认 drawer,把页面自带的表单弹窗也统一成抽屉(direction=rtl,尺寸沿用原宽度):批量调整职务 780、编辑角色/编辑用户/支付网关配置 600、编辑工单 720、凭证详情分录编辑 900、申请企业邮箱 420、修改邮箱密码 400、编辑/新增联系人 420、申请 Gitea 账号 420、修改 Gitea 密码/一键迁移头像 400/420、修改名字/修改密码 420、邀请成员 460、修改群名 420、创建群聊 520。

保留居中弹窗(非编辑表单):EntityPicker/MultiEntityPicker 选择面板、应用市场安装与应用-职务绑定(内嵌 CrudTable)、AppConfigPage 的同步/复制/移除确认、拒绝入驻申请、审计日志与站内信详情、资产预览、写信与发送消息。

已部署:102 assets 校验一致,入口 /assets/index-xaOjq6Ha.js。
2026-09-30 00:26:28 +08:00
TermiNexus ce3a565006 feat(components): CrudTable 新增/编辑默认改为右侧抽屉
formMode 默认值由 dialog 改为 drawer:全站列表页与详情页子表的新增/编辑统一走右侧抽屉(含部门/角色/租户/工作组/员工/用户/订单/产品及各业务页)。

表格本身嵌在弹窗里的场景显式传 form-mode=dialog 保持居中弹窗:应用市场「应用-职务绑定」弹窗内的 AppPosition / AppVirtualPosition / AppVirtualBinding(弹窗内再叠抽屉会错位)。

已部署:102 assets 校验一致,入口 /assets/index-COtyrWR-.js。
2026-09-29 19:13:45 +08:00
TermiNexus bb25b6f4d6 feat(company): 公司列表编辑改抽屉 + 公司详情展示已启用应用
CrudFormPanel 支持 mode=drawer(CrudTable 新增 formMode prop 透传,默认仍是居中弹窗,避免表格嵌在弹窗里的场景叠抽屉);Company 列表页启用 form-mode=drawer。

公司详情页新增「已启用应用」卡片(仅管理员可见):列出该公司 InstallStatus=1 的应用,支持卸载(停用本公司安装,不动租户级/其它公司)与配置(跳 /app/config 并带 CompanyUUID 定位本公司范围)。新增 appApi.companyApps;AppConfigPage 支持 CompanyUUID 查询参数预选范围。
2026-09-29 18:50:16 +08:00
TermiNexus 2d989d5af1 fix(components): 修正 Boolean prop 缺默认值导致表格退化为只读
Vue 会把未传的 Boolean prop 强制转成 false,而代码按未传=undefined 判定:CrudTable 的 editable 未声明默认值,使 canEdit 恒为 false,所有未传 :editable 的表格操作栏只剩查看,新增/批量删除/行内编辑/删除全部消失(部门详情页部门员工子表即此现象);AdminBadge 的 visible 同样缺默认值,导致特权模式横幅从未显示。

两处均改用 withDefaults 显式声明默认 true,并同步部署产物(entry assets/index-Chv4xcO_.js)。
2026-09-29 13:20:53 +08:00
TermiNexus bf46dd93a0 refactor(company): 租户/角色详情编辑改为右侧抽屉
- TenantDetail:编辑租户(600)、编辑企业信息(700)由 el-dialog 改 el-drawer

- RoleDetail:编辑角色(600)由 el-dialog 改 el-drawer

- 与公司/部门/工作组保持一致,表单与 footer 按钮不变
2026-09-29 12:02:18 +08:00
TermiNexus 43a03857d1 refactor(company): 公司/部门/工作组编辑改为右侧抽屉
- 三个详情页的编辑 el-dialog 统一改为 el-drawer(direction=rtl, size=600)

- 保留原表单与 footer 按钮,destroy-on-close 语义不变
2026-09-29 12:01:02 +08:00
TermiNexus 6a488fe452 perf(layout): 分包预热改为菜单悬停懒预取
- prefetchRoutes 由「登录后全量预热」改为 WarmRouteByPath 按需预热(幂等、弱网跳过)

- 侧边栏菜单项 mouseenter/focusin 触发预热;分组菜单预热其全部子页面

- 首屏零额外请求,仅预热用户已表达意图的页面
2026-09-29 12:01:01 +08:00
TermiNexus 96e0776407 perf(layout): 登录后预热用户可访问页面的分包,配合 72h 强缓存
- 新增 utils/prefetchRoutes:遍历静态路由表收集懒加载 loader

- menuGuarded 路由仅当其路径在用户菜单树中才预热;其余登录即可访问的直接预热

- requestIdleCallback 启动 + 限并发 3 + 间隔 150ms,弱网/省流量模式跳过

- 按可见路径集合签名去重,菜单变化(切换角色)后重新预热一次
2026-09-29 11:32:43 +08:00