100 Commits
Author SHA1 Message Date
TermiNexus 0d3745cd04 feat: 头像预压缩尺寸由 50x50 调整为 96x96 2026-10-13 19:05:06 +08:00
TermiNexus 0559a5d883 feat: 头像上传前端预压缩为 50x50 JPEG,降低上传延迟 2026-10-13 18:52:47 +08:00
TermiNexus 4f9ec9c694 feat(Talk): 群头像改为成员九宫格默认并支持自定义,移除成员面板管理员计数 2026-10-13 18:23:39 +08:00
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
TermiNexus 1b907b3bb6 feat(app): 授权审批页面按公司管理员及以上判定,并统一相关文案
- 新增 userStore.isCompanyAdmin(消费 CheckAdmin.is_company_admin)

- AppPending 用 isCompanyAdmin 判定并更新空态文案

- 申请成功提示与 api/app.ts 注释从「租户管理员」改为「管理员」
2026-09-28 18:23:19 +08:00
TermiNexus a918c9d488 feat(system): 站内信页面 UI 改版,列表与详情更易读
- 改为 el-card 卡片布局,标题/未读数/操作按钮收进卡片头

- 列表项:未读红点 + 左侧主色边、标题右侧显示时间、元信息加分隔

- 刷新按钮同时刷新列表与未读数;无未读时禁用「全部已读」

- 详情正文改为浅底内容块(限高滚动),元信息加分隔线

- 分页增加总数显示
2026-09-28 18:03:23 +08:00
TermiNexus 5405a4dade fix(deploy): deploy.ps1 改为先构建后替换,消除部署空窗期
- 旧流程先删 dist/TempLate 资源再构建,窗口期内请求 404 或命中根目录站点

- 新流程:构建 -> 同步 assets -> 最后替换 index.html -> 清理镜像目录陈旧文件

- 清理仅限 assets/ 与 tinymce/,保留 pages/ 等生产独有目录
2026-09-28 18:03:21 +08:00
TermiNexus cdfd6f827d feat(app): 应用市场详情抽屉加遮罩并内联安装管理
- 抽屉改为带遮罩阴影,点击遮罩即关闭;宽度 420 -> 560

- 将「管理」弹窗内容(全租户状态/公司级勾选/保存)内联进抽屉

- 卡片「管理」按钮改为打开抽屉,移除独立管理弹窗

- 打开抽屉预取安装数据,保存后自动刷新勾选与「已装」标记

- 修复 loadMarket 重建列表后 detailApp 引用失效
2026-09-28 17:53:57 +08:00
TermiNexus efd7f98522 fix(talk): 实时通道连接失败时透出错误原因
- 新增 connect_error 监听,dispatch talk:error 携带原因

- 避免握手被拒时前端无任何提示
2026-09-28 17:42:59 +08:00
TermiNexus d00451c924 feat(app): 应用市场卡片支持右侧详情抽屉
- 卡片主体点击弹出 el-drawer,展示图标/名称/简介/标签与安装管理

- 配置入口仍跳转原独立页面 /app/config

- 操作区阻止冒泡,避免误触抽屉
2026-09-28 17:42:55 +08:00
TermiNexus 2b13f72045 fix(talk): 兼容历史菜单链接(/talk/index 重定向到 /talk)
- 后端菜单链接历史上写过 pages/talk/index.html,前端会规范化为 /talk/index
- 前端菜单有 localStorage 缓存,加此重定向兜住缓存里的旧链接,避免点进去 404
2026-09-28 17:29:28 +08:00
TermiNexus eb5b51a474 feat(talk): 新增 Talk 企业聊天页面(仿微信三栏)
- 新增 src/views/talk/{Talk.vue,GroupCreateDialog.vue}、src/api/talk.ts、src/utils/talkSocket.ts
- 引入 socket.io-client:/talk 命名空间连接、断线重连、401 自动换令牌、心跳与 typing 节流
- 会话列表 / 消息气泡区(图片预览、文件卡片、时间分组、未读红点、上滑加载更早消息)/ 群成员面板
- 建群对话框:选本公司成员 + 配额实时提示(公司群/个人群/单群人数/公司参与人数)
- 路由 /talk(menuGuarded)+ apps/index.ts 注册 + vite.config.ts 增加 /socket.io 代理(ws)
2026-09-26 23:46:41 +08:00
TermiNexus e79e3bb28b feat(dashboard): 欢迎页对齐原生 GERP 并移除技术栈展示
- 欢迎区:logo + 标题 + 欢迎语 + 每日一言(6s 轮播/点击切换/300ms 淡入淡出)+ 个人中心/快捷操作
- 欢迎区改为占满剩余空间垂直居中(对齐原生 welcome-container),去除面板边框
- 删除「系统信息」面板(含前端/表格/后端技术栈描述行)
- 快捷入口超过 10 项折叠为「展开全部(N)/ 收起」,避免菜单过多拉长页面
2026-09-26 23:46:41 +08:00
TermiNexus 1c0885126d fix(app-config): 虚拟职务绑定按公司隔离,租户默认层不展示绑定
- 新增 bindingEnabled(要求明确选中公司),租户默认层不加载虚拟职务绑定并清空已展示数据、复位脏标记

- 切换范围时仅在选中公司下重新加载绑定,避免误展示/误改他司数据

- getVirtualMapping/setVirtualMapping 注释澄清:CompanyUUID 缺省回落可管理公司
2026-09-15 14:24:46 +08:00
TermiNexus 9d1d6dca93 feat(role-scope): 接入 checkAdmin 细粒度作用域,CrudTable 支持只读模式
- stores/user: 新增 roleScopeType/Label 与 isScopeAdmin/isDeptManager/isWorkgroupLead/isScopeMember;AdminCheckResult.role_scope 补 DeptUUID/WorkgroupUUID

- CrudTable: 新增 editable prop,false 时隐藏新增/批量删除/编辑/删除(操作列全空则整列隐藏)

- Users: 四态标题/图标/横幅色/文案,仅 member 关闭行选择与编辑

- Products/Orders: 四态标题与文案、两态横幅;editable 取特权模式

- 清理 company 域 5 页与 system 三页的过期 role_scope TODO 注释
2026-09-15 14:24:40 +08:00
TermiNexus 3d4c46b7ee feat(gerp-ui): 批量职务调整树形选择 + OA 审批页 + 虚拟职务一键绑定
- BatchPositionDialog:部门列表页以部门树组织员工、工作组列表页以工作组树组织成员,
  均可勾选具体的人;选中行成员自动预勾选,可追加/取消;提交映射 UserRole/UserRoleWorkgroup
- Department/Workgroup 列表页 toolbar 新增"批量调整职务"入口(CompanyUUID 兜底当前用户公司)
- CrudTable 新增 #toolbar 插槽(暴露 selectedRows/refresh)
- OA 审批页 Approval.vue(请假/出差待审批,30s 轮询,通过/驳回)+ api/oa.ts
- AppConfigPage 虚拟职务"一键绑定"按钮 + api/app.ts autoBindVirtualPositions
- 附带:OA/财务/eHRM 应用页、MultiEntityPicker、菜单/布局优化等系列改动
2026-08-30 13:23:49 +08:00
TermiNexus 93464d0c3c fix(auth): 租户详情路由加 menuGuarded 守卫
- /company/tenant-detail 直链访问时按后端菜单树校验,普通角色菜单已隐藏则拦截跳转
2026-08-25 09:55:57 +08:00
TermiNexus c085594f51 fix(ui): 菜单 fa 图标宽度改用 --el-menu-icon-width
- .gerp-menu-icon 宽度 1em→var(--el-menu-icon-width,24px),与 EP el-icon 菜单图标盒宽一致,左间距/文字起点统一
2026-08-25 08:41:14 +08:00
TermiNexus 9a8cbb1c25 fix(ui): 侧边栏菜单 el-icon 与 fa 图标对齐(font-size/间距)
- el-menu-item/el-sub-menu__title 内 el-icon 统一 18px + margin-right 5px,与 .gerp-menu-icon(fa)一致,折叠态均去 margin
2026-08-25 08:39:26 +08:00
TermiNexus f32ce1ff03 fix(ui): 右上角头像 hover 去除背景圈
- 移除 .gerp-user-info:hover 背景色,hover 不再出现边框圈
2026-08-25 08:19:24 +08:00
TermiNexus 3aebb7a035 feat(ui): 切换角色对话框加 loading 遮罩
- 设置默认登录角色 / 确认切换时,对话框内容区显示 element-plus v-loading 遮罩(文字区分两种操作)
2026-08-22 01:45:40 +08:00
TermiNexus f61716f215 feat(auth): 默认登录角色设置(切换角色对话框星标)
- 切换角色对话框每张角色卡片加星标按钮:设为/取消默认登录角色(金色高亮)
- user store 新增 defaultRoleUuid 状态与 setDefaultRole 动作,fetchRoles 同步 IsDefault
- auth.ts 新增 SetDefaultRole 接口(POST /Auth/SetDefaultRole)
2026-08-22 01:23:28 +08:00
TermiNexus 1d5e406616 fix(style): 删除全局 el-dropdown-menu padding 4px 规则
- global.scss 移除 .el-dropdown__popper .el-dropdown-menu { padding: 4px 0 !important; }
- gerp-user-dropdown 自带 padding: 0 生效,用户下拉菜单无首尾空隙
2026-08-22 01:14:43 +08:00
TermiNexus 2eeaab6c5d feat(ui): 头像下拉改 hover 触发并加深阴影
- el-dropdown trigger 由 click 改为 hover(与官网 GVSite 一致)
- gerp-user-dropdown 加双层阴影(0 10px 30px + 0 2px 8px),层级感与官网超级菜单一致
2026-08-22 01:11:08 +08:00
TermiNexus a19874da72 feat(msync): 远端 App 打开链路——用户令牌签发拼 URL + 服务离线标记 + /remote 路由 2026-08-14 00:33:49 +08:00
TermiNexus 7e64bdf38a feat(ram): 应用中心安装弹窗支持 RAM 角色授权选择(角色多选→GrantRoles) 2026-08-14 00:03:32 +08:00
TermiNexus 36afde19da refactor(frontend): CrudTable 拆分——抽取 CrudFormPanel 动态表单与 useDraftAutosave 草稿 composable 2026-08-13 18:26:18 +08:00
TermiNexus ce7a17d170 refactor(frontend): Phase 3 质量整改——死状态清理、类型收口、路由收敛、上传统一
- stores: 移除未使用的 token/loading/locale 死状态;AdminCheckResult 统一收口 types/api.ts
- router: 移除全 Mock 的 SKU 页生产路由(源码保留待独立工程决策)
- api/request: 新增 requestRaw() 显式原始响应封装(替代 responseType hack)
- Manager.vue: SimpleUpload 弃用 XMLHttpRequest,改统一 axios upload + onUploadProgress(拦截器收益全覆盖)
2026-08-13 18:14:25 +08:00
TermiNexus 4d49e549b5 build(assets): 裁剪 tinymce 部署产物(40MB 整包 → 14 文件 1.19MB)
- copyTinymceAssets 只拷运行时必需文件(核心 js/主题/模型/图标/oxide 皮肤 + 8 个在用插件)
- closeBundle 先 rmSync 清空目标目录,防陈旧完整包残留混入 dist
- deploy.ps1 清理阶段同步删除生产 tinymce 残留,保证部署一致性
2026-08-13 18:14:24 +08:00
TermiNexus b80009c423 chore(gerp): 移除死依赖(FormKit/tinymce-i18n/@vxe-ui/plugin-render-element/vite-plugin-static-copy)并修正误导注释
- package.json: 移除 4 个未使用依赖,lock 同步(-27 包)
- main.ts: 去掉 FormKit 全局注册与对应 chunk
- vite.config.ts: 去掉 formkit manualChunk
- RichTextEditor.vue: 修正加载方式注释(自写 copyTinymceAssets 而非 vite-plugin-static-copy)
2026-08-13 17:36:13 +08:00
TermiNexus 08fa5d5139 style(ui): 导航/侧边栏/交互控件禁止文本选中(user-select:none),正文内容保持可选中 2026-08-13 09:44:19 +08:00
TermiNexus 7177f99cb8 feat(app): 应用配置公司化——配置页支持范围选择(租户默认/各公司)+ 批量复制到公司,权限随安装范围 2026-08-13 08:48:05 +08:00
TermiNexus e1f43efc74 fix(app): 恢复配置按钮——管理范围内已装(含非本公司)也显示配置入口,不再依赖 isAppUsable 2026-08-13 08:36:52 +08:00
TermiNexus eb0df83267 feat(app): 管理员视角安装分布——市场卡片标记可管理范围内已装该应用的公司名,管理范围内任意公司已装即显示管理 2026-08-13 08:34:58 +08:00
TermiNexus 2746fe4ce9 feat(app): 侧边栏刷新按钮升级为清缓存+全量重拉(用户信息/菜单/管理员状态),避免旧缓存导致安装状态显示错乱 2026-08-13 08:22:16 +08:00
TermiNexus e654d147db fix(app): 修复管理弹窗公司全未选中——manageCompanies 参数不再二次包裹 params,后端可正确收到 AppUUID 并返回各公司 Installed 状态 2026-08-13 08:22:16 +08:00
TermiNexus 5b221c07b7 feat(app): 应用中心公司级管理+配置页+身份徽标
- AppMarket 已安装应用改'管理':公司级安装/停用弹窗(diff 批量增删公司)
- 新增 AppConfigPage 独立配置页(AppConfig 键值表,/API/App/Config)
- 修复 Config 接口参数嵌套(params[AppUUID]→AppUUID)
- 侧边栏新增'强制刷新菜单'按钮
- 顶部导航新增当前身份徽标(角色+公司,管理员高亮,点击切换)
- 新增前端应用注册表 src/apps/index.ts(AppCode→路由/类型/旧页面映射,预留 MSYNC)
2026-08-13 07:46:59 +08:00
TermiNexus 91e2c186c7 feat(app): 应用中心支持公司维度安装——安装弹窗可选全租户/指定公司,停用双停(租户+当前公司) 2026-08-13 06:28:27 +08:00
TermiNexus 1894786327 chore(app): 删除已拆分的单页应用中心/单页GERP系统(由子页面取代) 2026-08-13 04:33:12 +08:00
TermiNexus b15d3fe89d refactor(app): 应用中心改父级菜单——拆分 应用市场/我的应用/授权审批 三个子页面 2026-08-13 04:33:02 +08:00
TermiNexus ca618aa512 refactor(system): GERP系统改父级菜单——拆分 系统状态/系统时序/配置文件/运行时调整 四个子页面 2026-08-13 04:23:46 +08:00
TermiNexus 797bada4e7 feat(system): GERP系统运维控制台(状态/时序/secrets.ini/运行时调整)+ 路由 2026-08-13 04:20:29 +08:00
TermiNexus f4aeaf94c4 feat(app): 应用中心页(应用市场/我的应用/授权审批)+ 路由与菜单入口 2026-08-13 04:06:16 +08:00
TermiNexus 6e9de08abc feat(company): 企业创建成功页新增"返回租户详情",形成填写→详情闭环 2026-08-13 03:06:10 +08:00
TermiNexus 54e0d5fd52 feat(company): 租户详情支持菜单直达(无参数时回退当前角色租户),AdminCheck 类型补充租户字段 2026-08-13 02:57:00 +08:00
TermiNexus b9e72ccf0e feat(company): 租户详情展示企业信息(CompanyInfo),未填写引导 epcreate 向导,支持编辑 2026-08-13 02:39:41 +08:00
TermiNexus e04e1bc91f feat(router): 新增 debug/epcreate 路由,支持调试路径访问企业创建向导 2026-08-13 02:34:02 +08:00
TermiNexus f894d81be8 fix(mail): 原文获取增加 blobId→Blob/get 回退,兼容 Stalwart 不支持 raw 属性 2026-08-13 01:24:41 +08:00
TermiNexus be64c62a12 fix(mail): 原文获取改 blobId 回退方案(兼容 Stalwart 不支持 raw 属性),安全浏览文案改企业级 2026-08-13 01:22:02 +08:00
TermiNexus ee6cd18c50 feat(mail): HTML 邮件 iframe 安全预览(默认禁脚本+JS 提示启用),支持查看源代码与原文 2026-08-13 01:16:52 +08:00
TermiNexus 670bb7bc76 feat(mail): 申请邮箱统一转为小写 2026-08-13 01:06:37 +08:00