Commit Graph

57 Commits

Author SHA1 Message Date
huangzd1997 7a6c3c3fa3 fix(菜单权限): 授权树按操作者置灰不可授予项 + 放行保留既有授权
普通管理员勾到无权授予的菜单后,ensureGrantable 抛 403,而 createUser/updateUser
都是 @Transactional,整笔回滚——线上表现就是「后台不能保存权限,也不能创建用户」
(2026-09-16 周丽娥账号创建用户与保存 uid=45 权限双双失败,库里查无新用户)。
根因是校验 2026-07-28 就加了,但授权树一直拿全量菜单,两边规则不一致。

- permission-menus 按操作者标记 grantable;授权树据此置灰(不隐藏:授权是整树替换,
  隐藏会把超管授予过、操作者自己没有的菜单当取消勾选删掉,与 09-13「权限自己没掉」同类)
- ensureGrantable 放行目标已持有的授权,只拦新增,不构成提权
- GlobalExceptionHandler 补业务异常日志:此前普通业务异常一行都不记,本次排查只能靠
  反推响应体字节数(nginx body_bytes_sent 含 chunked 开销)才定位到根因
2026-09-16 18:46:21 +08:00
huangzd1997 a0f6582914 feat(密钥管理): 代理配置后台明文展示 + 按次统计各密钥调用损耗
- 后台密钥管理「代理设置」列改为完整明文展示(含账号密码),便于运维核对;
  新增 full 字段仅对代理模块下发,密钥两列保持脱敏
- 新增 biz_user_secret_usage_daily(V117):用户 × 模块 × 天累计真实对外请求次数
- 计次口径:LLM 每次真实 HTTP 请求(含重试)计 1 次;代理每次成功提取计 1 次
- LLM 埋点走 SecretUsageContext 上下文(批次外设置、线程池内快照恢复)
- 新增内部上报接口 /api/internal/user-secret-usage(X-Internal-Token)
- 新增后台页「密钥用量统计」:日期范围 + 用户名 + 分组筛选,含范围内汇总
2026-09-13 21:56:46 +08:00
huangzd1997 a4f60ef21c fix(权限): 用户菜单权限“自己没掉”——分区落库时级联清理跨类型误删 + 编辑弹窗空授权提交
- 级联清理的有效集改为按目标「完整直接授权」计算(读库,含 admin/app 全类型)。
  此前 admin/app 分区落库把本次提交的 id 当成完整有效集,员工持有的另一类型授权
  会整体被判越权删除;两次分区落库互相补刀,最终清空员工全部菜单权限
  (生产表现:保存某非超管的权限后,他直建员工的菜单隔三差五自己消失)
- AdminUserService 改为两类落库完成后再统一级联一次,新增 cascadeSubordinateOverreach 入口
- 后台「编辑用户」弹窗:授权未加载完成/失败时禁用保存并明确提示,
  避免以空 columnIds 整树清空该用户授权(改动密码等操作也会连带触发)
- 回归测试:deferredCascadeKeepsSubordinateGrantsOfOtherMenuType、
  perTypeReplacementDoesNotCascadeBeforeAllTypesWritten、edit_user_dialog_blocks_save_until_auth_loaded

已知既有红测试(与本次改动无关,干净 HEAD 上同样复现,未新增):
ArchitectureBoundaryTest.taskToBusinessDependencyDoesNotGrow(110 > 基线 84)、
HttpClientTimeoutEffectiveTest.connectTimeoutFiresOnUnreachableHost(本机网络环境 60s)
2026-09-13 14:18:01 +08:00
huangzd1997 3f6ad0c6ad feat(后台分组): 分组筛选与分组列仅超管可见,非超管一律隐藏
管理员/普通用户数据已由后端裁剪到本人可访问分组,分组维度对其无意义;
账号归属分组是超管职责,故只有超管需要按分组筛选与区分。

- 隐藏分组筛选+分组列:品牌数据库、查询ASIN、最低价ASIN、去重总数据、
  店铺管理、用户密钥
- 仅隐藏分组展示:店铺数据记录(筛选框+卡片行)、图片视频任务(所属分组行)、
  撞款检测(明细抽屉分组列+卡片分组标签)
- 弹窗分组选择保留展示但锁定:非超管仅1个可访问分组时自动选中并置灰
  (查询/最低价ASIN 另联动加载该分组店铺),多分组不锁以免限制用户
- 空数据行 colspan 随列显隐动态化
- 新增 tests/align-group-visibility.test.ts 回归守卫(5 条)
2026-09-13 14:00:19 +08:00
huangzd1997 0323f0bb7b fix(密钥管理): 分组口径改为「分组创建人名下用户」
- 生产分组成员表 biz_shop_manage_group_member 基本未使用(仅 2 条老数据),导致分组列恒空
- 实际归属:分组 created_by_id/user_id 即主管,其组员为 users.created_by_id 指向该主管的用户
- 分组名批量查询与按分组圈人 SQL 均按此关系重写;按分组筛选含组长本人
- 无分组记录的用户分组列回退展示「所属主管(未建分组)」,避免空值
2026-09-13 13:42:06 +08:00
huangzd1997 1b733b23b9 feat(密钥管理): 按数据权限分组隔离与筛选
- 后台密钥列表改为按 biz_shop_manage_group 分组:主管只看自己带的分组成员,超管看全量可按 group_id 筛选
- 行数据补「所属分组」名称(批量查询);列表接口带回分组筛选项
- 修复超管筛选不生效:前端筛选参数统一 snake_case(camel 被后端静默忽略)
- 列表列/筛选项文案由「所属管理员」改为「分组」
2026-09-13 13:34:08 +08:00
huangzd1997 05ae0c62d6 feat(密钥管理): 后台分组过滤+欠费状态识别
- 后台密钥列表:主管只看本组子账户(created_by_id=自己),超管全量可按创建人筛选;行 VO 新增 createdById/createdByUsername
- 代理提取接口欠费(message=余额不足)识别为 insufficient_balance,不再静默回退直连
- 上游 LLM 网关欠费(code=insufficient_user_quota/预扣费额度失败)同样归为欠费并透传额度明细
- 前端:桌面设置面板显示"欠费",admin 后台单格药丸显示"欠费"、新增所属管理员列与超管筛选
2026-09-13 13:22:14 +08:00
huangzd1997 afa8560369 style(后台密钥管理): 用户名列加宽至 260px 并允许换行,长用户名不再截断 2026-09-13 10:51:19 +08:00
huangzd1997 b7d4d325e0 feat(密钥管理): 列表按用户聚合三字段列 + 代理配置服务端上报
- Java:后台列表一行一用户(货源查询密钥/外观专利密钥/代理设置),行级状态三项全通过才算通过;检测/清空改为按用户;搜索仅按用户名(去 UID);新增代理检测(经用户代理请求自家域名)与代理掩码(隐去账密)
- 后台前端:三字段列改版 + 行级状态筛选 + 用户名筛选
- 桌面前端:登录加载密钥时补报本地代理(只填空缺不覆盖)、保存/清空代理实时上报
2026-09-13 10:47:19 +08:00
huangzd1997 82a782550e feat(密钥): 用户 API 密钥服务端化——V115 按账号绑定存储 + 后台密钥管理页 + 桌面端全站拦截与配置引导
- 新增 usersecret 模块:外观专利/货源查询密钥从本地 localStorage 迁移至 biz_user_api_secret(AES 加密、按 uid 绑定)
- 后台「密钥管理」页:脱敏展示、立即检测、清空;每日 04:30 分布式锁定时巡检
- 桌面端:密钥设置面板走服务端、未配齐引导 /setup-secrets、代理余量展示
- 删除专利汇令牌全链路与密钥保留时长选择器
2026-09-13 10:03:59 +08:00
huangzd1997 02441565a0 fix(admin-vue): 编辑用户菜单权限已授权回显失效——树数据就绪后 await nextTick 再 setCheckedKeys(el-tree store 异步同步 props.data,旧实现作用在空 store 上勾选丢失),补源码断言防回归测试 2026-09-09 18:32:44 +08:00
huangzd1997 4994142a67 feat(需求): ①创建/编辑用户菜单权限勾选父菜单自动全选子菜单(el-tree去check-strictly走父子联动,提交前压缩为最小直接授权集,父勾选时后代不重复落库) ②修复管理员勾选店铺数据菜单仍提示'无权查看店铺数据任务'——admin分区授权后若有效授权含店铺数据任务/重复检查菜单(含经'店铺管理'分组展开),自动补内部数据权限 admin_shop_data_crawl_task_data(镜像V84惯例只增不删,回收仍走超管数据范围授权UI) 2026-09-07 14:22:53 +08:00
huangzd1997 056abcd473 fix(反馈): ①分组管理操作列加宽160px ②查询ASIN操作列补「删除」(整店全站配置清除,逐国端点) ③去重汇总编辑/删除间距(gap8) ④店铺数据记录下载文件按钮与全站编辑主色统一(btn-sm主蓝) ⑤撞款页按钮色统一蓝白(btn-primary #4f78a5);⑥全站分页统一收官: 分组管理/菜单管理/软件版本补 OldPagination(10/20/50/100) 2026-09-07 02:43:37 +08:00
huangzd1997 cd6beef388 feat(需求): ①全站列表/卡片分页统一为共享 OldPagination(共N条+10/20/50/100条数可选+跳页) ②创建用户菜单权限改左右布局(后台|桌面端并排) ③修复角色筛选失效(normalizeUserPageParams 白名单丢 role 字段) 2026-09-07 02:43:37 +08:00
huangzd1997 f00fdcd42a feat(需求): ①用户管理补「角色」筛选(前端+后端 role 参数) ②软件/数字人版本页补版本号搜索 ③全站 el-select 统一 filterable(分组/所属管理员/角色等大下拉可模糊搜索) 2026-09-07 02:43:37 +08:00
huangzd1997 970affec95 feat(需求): ①用户创建/编辑菜单权限按「后台/桌面端」一级分组展示(双树分区勾选合并) ②全站表格操作列编辑/删除横向对齐(ops-cell 统一 flex+gap 8px) 2026-09-07 02:43:37 +08:00
huangzd1997 4a9ddcab64 feat(需求): ①账户域菜单/分组补筛选(名称/组长/类型) + 分组管理移除「数据权限分组」摘要卡 ②店铺密钥列表补筛选(备注/紫鸟账号) ③店铺数据记录两级分页常显 ④全站分组筛选下拉支持模糊搜索(el-select filterable,样式对齐蓝白42px) 2026-09-07 02:43:37 +08:00
huangzd1997 c5c103b287 align(account·像素复刻): 用户管理/菜单权限配置/分组管理 三页自绘复刻旧版(panel-users/columns/group-manage)——原生表格+btn-sm行操作+原生confirm删除+旧式分页(菜单/分组全量无分页同旧版)+分组摘要chips;创建/编辑/菜单树弹窗保留现有组件 2026-09-07 02:43:37 +08:00
huangzd1997 2691472a5e align(account): 用户/菜单/分组行内操作统一实心 small 按钮(对齐旧版 .btn-sm),移除 link 形态 2026-09-07 02:43:36 +08:00
huangzd1997 26e062d32c task-284(收尾/在途批次): 页头按钮归位卡内toolbar+店铺数据记录改名+弹窗报错清除; Java page_size配对/按角色数据范围过滤/撞款导出XLSX/Excel图改WPS DISPIMG/V110查询索引 2026-09-07 02:43:36 +08:00
huangzd1997 898fae4cb3 align(用户菜单授权): 创建/编辑用户菜单权限补齐前端客户端(app)菜单并按类型分区落库
用户管理菜单权限此前只含后台 admin(单类型):前端授权树/回显仅拉 menuType=admin,
后端 replaceDirectPermissions 也固定用 ADMIN 作用域写。现改为同时覆盖 后台(admin)+前端客户端(app):
- 前端 user-menu-auth 节点携带 type,api 并行拉取 admin/app 两类可授权树与已授权 id 合并去重,树内两类根并存(账号与权限/视频/前端工具/运营工具/后勤工具等)
- 后端 PermissionMenuService 新增 resolveMenuTypes(按 id 解析类型);AdminUserService create/update 把勾选 id 拆 admin/app 分区整树替换(internal 不纳入)
- 前端 1556 测试全绿 + build 通过;后端单测(AdminUserServiceTest/PermissionMenuServiceTest/Controller/PermissionMenuResolveTypeTest) EXIT 0
- 本地 E2E:创建用户写入 admin=7+app=3 → 按类型回读 admin[7]/app[3],删除正常
2026-09-07 02:43:36 +08:00
huangzd1997 4c88964473 task-283(后台迁移收尾/发布): admin-vue 后台工程入库 + Flask 后台整体退役
- 新后台 admin-frontend-vue 整工程入库(base=/admin-vue/、History 路由、Nginx 静态托管方案与 verify-dist 校验)
- Java AdminConsoleController 改为入口重定向: /admin|/admin.html、/login|/login.html -> /admin-vue/; 删除 classpath:static 旧 admin.html/login.html 单页与 admin.js 副本
- Flask 后台整体退役: 删除 admin_api/auth/main 蓝图、web_source 页面、static 脚本与 admin 相关测试; app.py 收敛为仅注册 version_bp(/api/version、/api/version/latest, 供桌面端更新检查)
- AdminApiGuardFilterTest 豁免样例路径 /admin.html -> /admin-vue/
2026-09-06 10:41:47 +08:00
huangzd1997 3b5adff2e3 task-276(验收反馈): 分页组件全站统一(jumper+按钮高亮样式)+MenusPage补分页+最低价筛选同排+视频筛选加固+移除侧边栏收起按钮+gitignore战役脚本规则 2026-09-06 02:16:47 +08:00
huangzd1997 6e2e4bf8e7 task-275(验收反馈): 菜单权限标识/路由后台自动生成(menu_auto_/auto/ 前缀),表单移除两项输入;编辑缺省保持原值 2026-09-06 01:57:17 +08:00
huangzd1997 c3dc2a3f2f task-274(验收反馈): 15 列表页表格列 width→min-width 自适应(DuplicateCheck 例外) 2026-09-06 01:50:38 +08:00
huangzd1997 8add3ceaa4 task-272(验收反馈): 分组/软件版本/类目搜索表补齐分页组件(prev/next 中文由 locale 提供) 2026-09-06 01:46:49 +08:00
huangzd1997 596933eea2 align(文案尾批): 用户删除确认半角引号无后缀、品牌数据库删除确认对齐原文(对齐 admin.js:970/3775) 2026-09-05 23:36:56 +08:00
huangzd1997 32ef9a2ebb align(菜单管理): 同级拖拽排序接线(手柄列+类型/父级分组+reorder带menu_type)、列表拉全量类型、类型文案后台/软件、弹窗补菜单类型下拉、父菜单候选按类型过滤(对齐 admin.js loadColumns/bindColumnDragSort/persistColumnOrder) 2026-09-05 23:04:05 +08:00
huangzd1997 1692fa4a69 align(分组管理): 组员候选按归属过滤(超管全量/非超管仅本组长创建的普通账号)、新建组长恒为当前用户、补创建时间列、chips 全量渲染(对齐 admin.js getEligibleShopManageGroupUsers/帮助文案) 2026-09-05 23:00:08 +08:00
huangzd1997 63339b401c align(用户管理): 超管新建普通账号补所属管理员(createdBy)下拉,payload 仅 normal+已选时带 createdById(对齐 admin.js created_by_id 语义) 2026-09-05 22:54:49 +08:00
huangzd1997 eebdb7af2d fix(admin): 后台时间统一展示为 YYYY-MM-DD HH:mm:ss(formatDateTime 全页接入) 2026-09-05 21:52:00 +08:00
huangzd1997 6a0eb8cf63 fix(admin): 菜单管理去掉上移/下移,排序改由 sort_order 维护(产品已淘汰即时应序) 2026-09-05 21:36:26 +08:00
huangzd1997 3902acafb9 fix(admin): 菜单管理列表去掉权限标识/路由列并自适应列宽(编辑弹窗仍保留字段) 2026-09-05 21:32:56 +08:00
huangzd1997 f765b3ce67 task-253(admin.html观感对齐): 数据权限分组页对齐(新建/编辑/删除 + 组员 chips + 组长锁定) 2026-09-05 21:21:49 +08:00
huangzd1997 8b4955d9b5 task-252(admin.html观感对齐): 菜单管理列表列对齐(ID/菜单类型/上级菜单/创建时间)+ 类型中文映射 2026-09-05 21:18:59 +08:00
huangzd1997 07fda4cf22 task-251(admin.html观感对齐): 用户管理补齐新建/编辑/角色+菜单授权弹窗(接线孤儿模块) 2026-09-05 21:17:15 +08:00
huangzd1997 41cb4ce174 task-250(admin.html观感对齐): 用户管理列表页对齐(说明/所属管理员筛选/角色中文/删除文案/分页) 2026-09-05 21:13:03 +08:00
huangzd1997 cea7662fc3 fix(admin): 用户列表角色列改为中文显示(roleLabel 映射) 2026-09-05 21:02:47 +08:00
huangzd1997 eb526fef5d task-59(账号/权限页面): 实现数据权限分组列表和摘要
新增 shop-group-model.ts 解析 Java ShopManageGroupItemVo(camel)并汇总(groupCount/memberTotal);
shop-group-api.ts GET /api/admin/shop-manages/groups;GroupsPage 去内联 http,改走 adapter
展示分组列表 + 顶部摘要统计卡。8 用例全过,435 单测 + build 绿。
2026-09-05 15:23:38 +08:00
huangzd1997 aeb226a0e6 task-58(账号/权限页面): 实现同级菜单排序交互
menu-manage-model.ts 增 siblingOrderAfterMove 同级内上下移(越界/缺失原序);menu-manage-api.ts
增 reorderMenus POST /api/admin/column/reorder({ordered_ids});MenusPage 每行上移/下移按钮
按同级组计算新顺序并提交后刷新。8 用例全过,427 单测 + build 绿。
2026-09-05 15:21:56 +08:00
huangzd1997 50a6cf12e7 task-57(账号/权限页面): 实现菜单删除前置校验
menu-manage-model.ts 增 menuDeleteReason 镜像后端仅删叶子约束(有子先删);menu-manage-api.ts
增 deleteMenu DELETE /api/admin/permission-menus/{id};MenusPage 行删除二次确认、
带子节点禁用/拦截并刷新。8 用例全过,419 单测 + build 绿。
2026-09-05 15:20:39 +08:00
huangzd1997 45a8161bb2 task-56(账号/权限页面): 实现菜单编辑表单
menu-manage-model.ts 增 menuFormFromNode 回填 + menuParentChangeReason 防环(自身/子孙不可为父);
menu-manage-api.ts 增 updateMenu PUT /api/admin/permission-menus/{id};MenusPage 行内编辑复用
Dialog(新增/编辑切换)校验后提交并刷新。8 用例全过,411 单测 + build 绿。
2026-09-05 15:19:37 +08:00
huangzd1997 aaa943a86d task-55(账号/权限页面): 实现菜单新增表单
menu-manage-model.ts 增 createMenuForm/flattenMenuNodes/nextSiblingSort;menu-manage-api.ts
增 createMenu POST /api/admin/permission-menus(unwrap+解析落库节点);MenusPage 新增菜单
Dialog(名称/标识/父菜单/路由/排序)校验后提交并刷新。8 用例全过,403 单测 + build 绿。
2026-09-05 15:17:55 +08:00
huangzd1997 ffb16bea9a task-54(账号/权限页面): 实现后台菜单列表加载
menu-manage-model.ts 增 buildMenuManageTree 按 parentId 组装展示树(同级按 sort+name);
menu-manage-api.ts GET /api/admin/permission-menus(menuType=admin) 扁平拉取并建树;
MenusPage 去内联 http,改走 adapter 展示默认展开树形菜单。8 用例全过,395 单测 + build 绿。
2026-09-05 15:16:25 +08:00
huangzd1997 5d9019a40d task-53(账号/权限页面): 定义菜单管理 DTO
新增 menu-manage-model.ts 纯 DTO:parseMenuManageItem/List 归一 PermissionMenuItemVo(snake)、
MenuManageForm 工厂、validateMenuManageForm 镜像后端 NotBlank 文案、toMenuCreate/UpdateRequest
camelCase 对齐 Java PermissionMenuCreate/UpdateRequest(menuType=admin 固定)。8 用例全过,
387 单测 + build 绿。
2026-09-05 15:15:08 +08:00
huangzd1997 916f179fca task-52(账号/权限页面): 实现用户列表加载/空/错状态
新增 user-list-state.ts 纯 phase 归一(loading>error>empty>ready)与空/错提示;
UsersPage 显式 loadError 态 + 错误 el-alert(带重试)、加载/错误/空相位决策、
删除按钮对超管禁用。8 用例全过,379 单测 + build 绿。
2026-09-05 15:11:18 +08:00
huangzd1997 47d1c6bf80 task-51(账号/权限页面): 实现用户删除确认和刷新
新增 user-delete-model.ts 纯模型:deleteConfirmMessage/deleteBlockReason 镜像 Java
deleteUser 约束(不能删自己/超管)、isDeletableUser。users.ts 增 deleteUser DELETE
/api/admin/user/{uid} 并由 unwrap 抛后端 message;UsersPage 删除改走 adapter、二次确认后
刷新列表(超管行直接告警拦截),不再内联 http.delete、不入 session store。
8 用例全过,371 单测 + build 绿。
2026-09-05 15:09:55 +08:00
huangzd1997 2077f871f8 task-50(账号/权限页面): 实现用户菜单授权提交
buildUserColumnPermissionPayload 序列化勾选 id 为 {columnIds}(去重升序、空=清空),
镜像 Java UserColumnPermissionUpdateRequest;submitUserMenuAuth PUT /api/admin/
permission-users/{userId}/columns(menuType=admin) 整树替换,success=false 由 unwrap 抛后端 message。
8 用例全过,363 单测 + build 绿。
2026-09-05 15:07:57 +08:00
huangzd1997 0fcee02189 task-49(账号/权限页面): 实现用户菜单授权数据加载
新增 user-menu-auth.ts 纯解析:parseMenuOptionList 归一 permission-menus 扁平项、
buildMenuOptionTree 按 parent_id 组装并按 (sort,key) 排序、parseUserGrantedColumnIds/
normalizeMenuIds 解包用户已授权 id 去重升序。user-menu-auth-api.ts 走 GET
/api/admin/permission-menus(menuType=admin) 与 /permission-users/{id}/columns 加载授权树与已勾选。
8 用例全过,355 单测 + build 绿。
2026-09-05 15:06:58 +08:00
huangzd1997 fba8e35118 task-48(账号/权限页面): 实现用户角色字段映射
新增 user-role-map.ts 纯映射:roleDomainOf 行 role/is_admin → 角色域(空 role 按 is_admin
推断、未知归 normal)、selectRoleOf 超管不可选、USER_ROLE_OPTIONS 下拉候选 admin|normal、
userRoleLockMessage 镜像后端约束(超管不可改、admin 不可调角色)。8 用例全过,347 单测 + build 绿。
2026-09-05 15:04:35 +08:00