huangzd1997
|
ce27161bbb
|
task-66(ASIN 数据中心): 实现去重汇总导入轮询和终态
dedupe-import-model.ts 增 parseDedupeImportProgress(status/计数/errorMessage,缺省 pending、
未知状态不改) + importTaskFinished/importTaskSucceeded 终态判定;dedupe-import-api.ts 增
fetchDedupeImportProgress GET /api/admin/dedupe-total-data/import/{importId}。
8 用例全过,483 单测 + build 绿。
|
2026-09-05 15:39:29 +08:00 |
|
huangzd1997
|
abc8ed72d4
|
task-65(ASIN 数据中心): 实现去重汇总导入任务创建
dedupe-import-model.ts 纯解析 importId + isAllowedImportFile(xlsx/xls);dedupe-import-api.ts
startDedupeImport 以 FormData(file+groupId) multipart POST /api/admin/dedupe-total-data/import。
8 用例全过,475 单测 + build 绿。
|
2026-09-05 15:38:31 +08:00 |
|
huangzd1997
|
23037c669d
|
task-64(ASIN 数据中心): 实现去重汇总导出等待状态
新增 dedupe-total-export.ts 纯模型:buildDedupeExportQuery/toExportUrl 按用户名/日期区间/
分组/国家构造 /api/admin/dedupe-total-data/export 下载地址(空白/非法条件不下发),
DedupeExportStage + exportStageHint 提供运行/完成/失败等待提示。8 用例全过,467 单测 + build 绿。
|
2026-09-05 15:37:31 +08:00 |
|
huangzd1997
|
fb420c2988
|
task-63(ASIN 数据中心): 实现去重汇总日期和国家筛选
新增 dedupe-total-filter.ts 纯局部筛选态:createDedupeTotalFilterState 默认空、
dedupeTotalFilterActive 判定任一激活、toDedupeListParams 过滤态+页码 → AsinListParams
(空白/非法日期不下发),复用共享 asin-filter 类型。8 用例全过,459 单测 + build 绿。
|
2026-09-05 15:36:36 +08:00 |
|
huangzd1997
|
09b3d9f013
|
task-62(ASIN 数据中心): 实现去重汇总列表查询
新增 dedupe-total-model.ts 纯解析 DedupeTotalDataPageVo(camel items/total/page/pageSize,
条目 dataValue/country/groupId/groupName/uploader/username/createdAt,缺 id 过滤);
dedupe-total-api.ts fetchDedupeTotalList 复用共享筛选归一后 GET /api/admin/dedupe-total-data。
8 用例全过,451 单测 + build 绿。
|
2026-09-05 15:35:44 +08:00 |
|
huangzd1997
|
53b4cb52f3
|
task-61(ASIN 数据中心): 定义共享分页和筛选类型
新增 src/pages/asin/asin-filter.ts 纯共享层:AsinListParams 分页+keyword/username/日期区间/
groupId/国家筛选,normalizeAsinPageParams 钳制页码页大小并校验 ISO 日期,toAsinPageQuery
序列化 snake_case(仅下发非空),镜像 DedupeTotalDataController.page 参数契约。
8 用例全过,443 单测 + build 绿。
|
2026-09-05 15:26:42 +08:00 |
|
huangzd1997
|
8e5fc00945
|
task-60(账号/权限页面): 完成账号权限三页面真实 API 验收
新增 live 验收 task-60-account-live.test.ts:无凭据即可真实校验服务在线/登录页、
未登录 401、伪造 token 拒登(本机已跑通 3 例);带 AIIMAGE_LIVE_* 凭据时校验真实用户列表解析、
permission-menus 含 admin_users/admin_columns/admin_group_manage、分组列表、以及普通用户
创建→出现→删除闭环与授权 columnIds 读取。435 单测 + build 绿,live 目录 0 失败。
|
2026-09-05 15:25:13 +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 |
|
huangzd1997
|
311df66231
|
task-47(账号/权限页面): 实现编辑用户表单回填
新增 user-edit-model.ts 纯模型:fillEditUserForm 从用户行回填(用户名只读/密码留空/
角色归 normal|admin/columnIds 待授权加载)、isEditableUser 拒绝超管、密码留空不修改、
toEditUserUpdateRequest 序列化镜像 Java AdminUserUpdateRequest(空密码不下发、超管拒绝)。
8 用例全过,339 单测 + build 绿。
|
2026-09-05 15:03:02 +08:00 |
|
huangzd1997
|
0e8c5c7223
|
task-46(账号/权限页面): 实现新建用户请求适配
新增 user-create-adapter.ts 编排提交:先 validateCreateUserForm 校验(不通过抛首条错误不发请求)、
再 toCreateUserRequest 序列化 camelCase 请求体 POST /api/admin/user、最后解析返回新用户 id。
parseCreatedUserId 纯解析下沉 users-model.ts:解包 ApiResponse、success=false 抛后端 message、
data 非正整数抛可读错误。8 用例全过,331 单测 + build 绿。
|
2026-09-05 15:01:06 +08:00 |
|
huangzd1997
|
2f71b4be3c
|
feat(backend-java): 后台菜单接口改为返回菜单树并适配 admin-vue
菜单接口 /api/admin/current-user/menus 由扁平 route 列表改为含父子
层级的菜单树;权限标识用 column_key,页面地址用 route 单独下发;
/admin 与 / 入口重定向到 admin-vue。
|
2026-09-05 14:58:02 +08:00 |
|
huangzd1997
|
1063e5188c
|
feat(backend-java): 客户端版本更新新增公开查询接口
新增 /api/version 与 /api/version/latest 公开端点,路径与 file_url 字段
兼容 Python 时代客户端固定请求,供桌面端 ShuFuAI.exe 检查更新。
|
2026-09-05 14:57:58 +08:00 |
|
huangzd1997
|
dad9cda4ac
|
task-45(账号/权限页面): 实现新建用户表单模型
新增 user-create-model.ts 纯模型:role 仅 normal|admin(未知/超管归一 normal,
镜像后端白名单)、用户名≥2/密码≥6 镜像校验、toCreateUserRequest 去空格/拷
columnIds,字段对齐 Java AdminUserCreateRequest(camelCase)。8 用例全过,
323 单测 + build 绿。
|
2026-09-05 14:55:11 +08:00 |
|
huangzd1997
|
1ae4bb2a36
|
task-44(账号/权限页面): 实现用户分页边界行为
新增 user-pagination.ts 纯函数:totalPageCount(空数据=0、非整倍向上取整)、
clampPage(<1→1、超末页→末页、空态留第1页)、isPageOutOfRange;UsersPage
加载后若总页数收缩致当前页越界则回钳末页重新拉取一次。8 用例全过,315 单测 + build 绿。
|
2026-09-05 14:54:11 +08:00 |
|
huangzd1997
|
a8c5d357e6
|
task-43(账号/权限页面): 实现用户筛选条件状态
新增 users-filter.ts 页面局部状态机:keyword/createdByAdminId/page/pageSize
默认值、改条件重置第一页(withFilterReset)、翻页钳到>=1、空白关键字不算激活、
toUserListParams 映射查询参数;UsersPage 改用它,搜索按钮/回车重置页码。
筛选状态不入 Pinia。8 用例全过,307 单测 + build 绿。
|
2026-09-05 14:53:15 +08:00 |
|
huangzd1997
|
289f4488f9
|
fix(auth/logout): 禁用内置 LogoutFilter,登出改走 auth 模块清会话 cookie
POST /logout 原先被 Spring Security 内置 LogoutFilter 截走(204),只清空
SecurityContext,从不执行 LoginController.logout,导致 aiimage_token cookie
残留、退出登录后仍保持登录态。SecurityConfig 显式 logout.disable() 后请求
落到 POST /logout → 200 + Set-Cookie aiimage_token=;(Max-Age=0) 清除。
补充真实登出 E2E(live):登出返回 200、下发清除 cookie、无 cookie 后 401。
注:此前的 500/CNFE 系运行进程 jar 被覆盖为 thin jar 所致,重建 fat jar
并重启即恢复;本提交只改逻辑。11/11 live 用例通过。
|
2026-09-05 14:49:52 +08:00 |
|
huangzd1997
|
40224d8e56
|
fix(backend-java): 收口并发资源与恢复链路
|
2026-09-05 14:44:00 +08:00 |
|
huangzd1997
|
d760838e71
|
task-42(账号/权限页面): 实现用户列表查询适配
新增 users-model.ts 纯解析(Java AdminUserItemVo snake_case→camelCase、
缺 id 行过滤、分页字段归一、success=false 抛后端 message)与 users.ts
adapter(fetchUserList:normalize+GET /api/admin/users+parse);UsersPage
改用 adapter,去掉模板内联 http.get+unwrap。task-41 依赖断言改指数据层。
8 用例全过,299 单测 + build 绿。
|
2026-09-05 14:43:59 +08:00 |
|
huangzd1997
|
60fa5a818b
|
task-41(账号/权限页面): 定义用户列表与分页 DTO
新增纯模块 users-dto.ts:UserListParams/UserPageResult/UserListQuery 契约与
Java AdminUserController 对齐(page/page_size/username/items/total);
normalizeUserPageParams 页码下限1、页大小夹取、空关键字去抖;toUserListQuery
按 snake_case 序列化;UsersPage 改用 AdminUser/UserPageResult 类型。8 用例全过。
|
2026-09-05 14:43:59 +08:00 |
|
huangzd1997
|
837fc9bcc0
|
task-40(会话/菜单/权限): 真实登录态 smoke 收口本模块
用真实 admin 凭据打本地后端完成登录/cookie 会话/current-user/菜单树/401/
权限路由 smoke(8 场景全过)。smoke 暴露前端登出 URL 错误:session.ts 走
/api/admin/logout(后端无此映射,500),改为 auth 模块根端点 POST /logout;
同步修正 task-25/36 断言。注:当前本地后端 POST /logout 亦返回 500,属
Java 侧缺陷,待后端模块修复后补登出 E2E。
|
2026-09-05 14:43:59 +08:00 |
|
huangzd1997
|
aad11c71bb
|
task-39(会话/菜单/权限):
|
2026-09-05 14:43:59 +08:00 |
|
huangzd1997
|
4fd4d68460
|
task-38(会话/菜单/权限):
|
2026-09-05 14:43:59 +08:00 |
|
huangzd1997
|
836ea6ecc7
|
task-37(会话/菜单/权限):
|
2026-09-05 14:43:59 +08:00 |
|
huangzd1997
|
18a48e80b4
|
task-36(会话/菜单/权限):
|
2026-09-05 14:43:58 +08:00 |
|
huangzd1997
|
5b94eb1af6
|
task-35(会话/菜单/权限):
|
2026-09-05 14:43:58 +08:00 |
|
huangzd1997
|
0524489ac2
|
task-34(会话/菜单/权限):
|
2026-09-05 14:43:58 +08:00 |
|
huangzd1997
|
37d021500a
|
task-33(会话/菜单/权限): 路由菜单权限守卫统一准入判定
新增纯函数 isRouteAllowed(无 menuKey 开放页放行/super_admin 全放行/其余按
key 命中);beforeEach 越权回退首个可见页、全无则回根路由空态。8 用例全过。
|
2026-09-05 14:43:58 +08:00 |
|
huangzd1997
|
a7b184fbd7
|
task-32(会话/菜单/权限): 普通用户菜单 key 查找下沉为共享纯函数
hasMenuKey 深度优先查找(空 key/空树返回 false,不改输入)抽到 helpers 供
守卫复用,去掉路由内私有 hasMenu 副本。8 用例全过。
|
2026-09-05 14:43:58 +08:00 |
|
huangzd1997
|
1a0159b7fc
|
task-31(会话/菜单/权限): 超级管理员菜单判定走角色归一
store.isSuperAdmin getter 改用 isSuperAdminRole(role) 归一判定,替代裸等值
比较;大小写/空白差异的角色串也能正确放行全部菜单。8 用例全过。
|
2026-09-05 14:43:57 +08:00 |
|
huangzd1997
|
877a690635
|
task-30(会话/菜单/权限): 锁定初始化失败与重试状态契约
失败写 error 并重抛、finally 复位 loading;initialized 保持 false 可重试,
loading/initialized 双闸防并发重复触发;守卫捕获异常不白屏。8 用例全过。
|
2026-09-05 14:43:57 +08:00 |
|
huangzd1997
|
2957c575e6
|
task-29(会话/菜单/权限): 锁定菜单树初始化动作契约
store 用户就绪后拉取菜单树写入 menuTree 并置 initialized=true;空树与接口
失败区分,附加字段(sort/icon)不丢失。8 用例全过。
|
2026-09-05 14:43:57 +08:00 |
|
huangzd1997
|
115df85063
|
task-28(会话/菜单/权限): 锁定当前用户初始化动作契约
store.initialize 先拉当前用户再拉菜单;用户写入 store.user、成功/失败路径
及守卫短路均被契约锁定;解析器缺 id/接口失败抛可操作错误。8 用例全过。
|
2026-09-05 14:43:57 +08:00 |
|
huangzd1997
|
8b07321fbb
|
task-27(会话/菜单/权限): 锁定 Pinia admin-session store 初始状态契约
state 工厂返回全新对象含 user/menuTree/initialized/loading/error 五字段,
默认 null/[]/false/''/'',无凭证字段;仅一个 defineStore,守卫与 getter
依赖该初始态。8 用例全过。
|
2026-09-05 14:43:57 +08:00 |
|
huangzd1997
|
2d0d836d9a
|
task-26(会话/菜单/权限): 实现 401 登录跳转行为防循环守卫
401 统一跳 /login 并携带目标路径;新增纯函数守卫 isLoginLocation/
isAuthEndpointRequest/shouldRedirectUnauthorized:已处登录页或失败请求即
登录端点时不再二次跳转,避免登录页死循环与吞掉登录失败反馈。http 层
success/error 两支均带失败请求 URL 过守卫后再跳转。envelope/http 单测
8 用例 + 全量 179 单测 + vue-tsc/vite build 通过。
|
2026-09-05 14:43:57 +08:00 |
|
huangzd1997
|
7c8374424d
|
task-25(会话/菜单/权限): 锁定 Cookie/Session 请求配置契约
Cookie 规则回归契约:withCredentials 字面量开启、同源根路径、有界超时、
前端不写 localStorage/sessionStorage/document.cookie 持久化凭证、不注入
Authorization/Bearer;current-user/menus/logout 三类会话调用统一复用共享
http 实例;登出走 X-Requested-With AJAX 标识;401 统一拦截并携带目标路径。
8 用例全过,171 单测 + vue-tsc/vite build 通过。
|
2026-09-05 14:43:56 +08:00 |
|
huangzd1997
|
46622d9f42
|
task-24(会话/菜单/权限): 实现菜单树请求适配并锁定契约
parseMenuTree 兼容 data:{items}/{items}/数组信封,空树返回 [](与接口失败抛错
区分),success=false 抛后端 message;session.ts fetchAdminMenuTree 已复用;
单测 8 用例覆盖分组/单页/空/缺 route/异常,live 024 用真实菜单树验证。
|
2026-09-05 14:43:56 +08:00 |
|
huangzd1997
|
d3154a48b8
|
task-23(会话/菜单/权限): 实现当前用户请求适配 + 真后端 live 测试
session-model.parseCurrentUser 兼容 data:{item}/{item}/直接对象信封并校验 id;
session.ts fetchCurrentUser 复用;启用 allowImportingTsExtensions;npm run test:live
用 admin 账号真实登录打 18080 验证 current-user 与菜单树(023/024 live 全绿)。
|
2026-09-05 14:43:56 +08:00 |
|
huangzd1997
|
7ae595c91a
|
task-22(会话/菜单/权限): 定义 API 解包与错误归一化规则
envelope.ts 纯实现 unwrap(带 data 解包/success=false 抛错)、errorTextOf、
isUnauthorized(兼容 code/status/statusCode)、requestErrorMessage、loginRedirectTarget;
http.ts 复用 envelope 并对 HTTP200+code401 统一跳 /login?redirect=。
|
2026-09-05 14:43:56 +08:00 |
|
huangzd1997
|
9f73af5911
|
task-21(会话/菜单/权限): 定义 AdminUser/AdminMenuNode 类型契约并对齐后端字段
admin.ts 增加 AdminRole 域与 roleKind/isSuperAdminRole/isAdminRole/roleLabel/
isSuperUser,AdminUser 补齐 isAdmin/creatorUsername/createdAt 等真实字段;
契约覆盖“分组可无 route、页面必有 route”。
|
2026-09-05 14:43:55 +08:00 |
|