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 |
|
huangzd1997
|
1cfdcb5fb3
|
task-20(壳层/路由): 完成壳层真实浏览器 smoke 验收
e2e 8 用例端到端收口:登录态壳层渲染、折叠切换、刷新幂等、404、退出确认取消
不退出、确认后跳 /login、全程无未捕获错误与遗留弹层。
|
2026-09-05 14:43:55 +08:00 |
|
huangzd1997
|
bd4b2a579e
|
task-19(壳层/路由): 验证首批页面从壳层正确挂载
e2e 8 用例:users/menus/groups 三页面经壳层挂载、根路由跳首个可见页、菜单激活态、
面包屑(分组->页面) 与 404 兜底的真实浏览器断言。
|
2026-09-05 14:43:55 +08:00 |
|
huangzd1997
|
ba12e04d1e
|
task-18(壳层/路由): 实现壳层键盘焦点与可访问性语义
AdminLayout 增加 role=navigation 侧边栏地标、aria-expanded/aria-label 折叠按钮、
#admin-content 主区锚点与“跳到主内容”skip-link;main.css 提供 :focus-visible 焦点环
与 skip-link 聚焦样式;e2e 8 用例用键盘回车切换折叠并断言 ARIA 语义。
|
2026-09-05 14:43:55 +08:00 |
|
huangzd1997
|
7ffae78919
|
task-17(壳层/路由): 桌面端壳层响应式验收 + 浏览器验收基建
引入 @playwright/test(mdEdge 通道),playwright.config 起 mock admin API + vite dev;
e2e 覆盖宽/窄屏自动折叠、折叠持久化、无横向溢出等 8 用例;workspace 边界扫描
排除测试专用 e2e/scripts/playwright.config。
|
2026-09-05 14:43:54 +08:00 |
|
huangzd1997
|
d397c88c3c
|
task-16(壳层/路由): 实现退出登录入口的壳层交互(确认式)
logout.ts 定义 runLogout 纯流程(确认通过才 signOut,异常上抛由壳层反馈);
AdminLayout 用 ElMessageBox.confirm 确认后再执行 store.signOut($reset + /login)。
|
2026-09-05 14:43:54 +08:00 |
|
huangzd1997
|
83b935c11b
|
task-15(壳层/路由): 实现页面标题与面包屑规则
title-breadcrumb 提供 resolveDocumentTitle('页面 - 数富AI')、updateDocumentTitle
(非浏览器静默)、crumbsForActiveRoute(分组->页面);AdminLayout 用 watch 同步
document.title 并在层级>1 时渲染 el-breadcrumb。
|
2026-09-05 14:43:54 +08:00 |
|
huangzd1997
|
13e7a4c602
|
task-14(壳层/路由): 实现侧边栏折叠与窄屏行为及偏好持久化
sidebar-collapse 提供阈值/宽高常量、toggle、localStorage 偏好读写(失败容忍)、
initialCollapsed(持久化优先,窄屏自动收起);AdminLayout 接入并持久化折叠状态。
|
2026-09-05 14:43:54 +08:00 |
|
huangzd1997
|
c3f160afa5
|
task-13(壳层/路由): 实现全局请求错误提示容器
error-bus 提供框架无关的订阅式错误总线:notify/dismiss/clear、负载归一化、
3 条上限截断、订阅返回取消函数防泄漏;GlobalErrorContainer 订阅并渲染可关闭
错误条,挂在 AdminLayout 内容区顶部。
|
2026-09-05 14:43:54 +08:00 |
|
huangzd1997
|
f4f7268045
|
task-12(壳层/路由): 实现路由级错误页面(404 兜底)
新增 src/pages/error/NotFoundPage.vue(el-result + 返回首页),router 在业务路由
之后注册 :pathMatch(.*)* 兜底(无 menuKey,不参与权限门禁),保留壳层 chrome;
main.css 增加 .not-found 布局。
|
2026-09-05 14:43:53 +08:00 |
|
huangzd1997
|
50e70c43ab
|
task-11(壳层/路由): 实现无菜单权限空状态
empty-state 定义标题/引导文案与 shouldShowEmptyMenu 纯判定(Boolean 化防 undefined);
AdminLayout 侧边栏与内容区(根路由)共用空态,加载中不闪现,未初始化不误报。
|
2026-09-05 14:43:53 +08:00 |
|
huangzd1997
|
f1fa5f7adf
|
task-10(壳层/路由): 实现页面级异步组件加载边界
lazy-config 暴露 loading 延迟/超时/文案与懒加载判定;lazy-page 用
defineAsyncComponent 提供 loading/error 组件,router 对所有注册路由统一包裹;
main.css 增加 .page-loading/.page-error 兜底样式。
|
2026-09-05 14:43:53 +08:00 |
|
huangzd1997
|
ab7255a55b
|
task-9(壳层/路由): 实现路由 meta 菜单 key 约定与 RouteMeta 类型增强
新增 src/types/vue-router.d.ts 模块增强(RouteMeta.title/menuKey),meta.ts 提供
metaMenuKey/命名校验,router 守卫改类型化访问去掉 as cast,AdminLayout 标题同步
去 cast;校验首批注册表 menuKey 合规。
|
2026-09-05 14:43:53 +08:00 |
|
huangzd1997
|
02e0dc20b8
|
task-8(壳层/路由): 实现业务域路由注册表
新增 src/router/routes.ts:adminPages 登记业务域页面(account 首批),routeOf 生成
路由记录,validateAdminPages 校验路径唯一/相对/含 title/load;router/index.ts 改
消费 adminRouteRecords,移除内联懒加载与路径字面量。
|
2026-09-05 14:43:53 +08:00 |
|
huangzd1997
|
8e828c1204
|
task-7(壳层/路由): 根路由跳转到首个可见页面,移除硬编码默认页
helpers.firstVisiblePath 深度优先返回首个可路由页面,无页面返回空串;
store 增加 firstVisible;守卫在根路由/无权限时跳首个可见页,全部无页面则
停留根路由展示无菜单空态,删除 redirect:'/account/users' 硬编码。
|
2026-09-05 14:43:53 +08:00 |
|
huangzd1997
|
26edb9e6ed
|
task-6(壳层/路由): 定义后端菜单树到侧边栏节点映射规则并落地
新增 src/layout/menu-mapper.ts:toSidebarEntries 处理分组/顶级路由叶/畸形节点,
groupKeysForActive 按当前路由展开激活分组;AdminLayout 菜单区改用映射结果,
删除旧 visibleChildren/canSee 死逻辑;8 用例覆盖空树/单叶/缺 route 过滤等。
|
2026-09-05 14:43:52 +08:00 |
|
huangzd1997
|
4a0e464308
|
task-5(壳层/路由): 定义顶部栏用户信息与页面标题模型
新增 src/layout/topbar-model.ts(pageTitleOf 缺省回落 + topbarUserOf 空态视图模型),
AdminLayout 改用模型渲染标题/用户名/角色,删除模板内联缺省逻辑;8 用例覆盖标题
空值、用户缺字段、非法输入等。
|
2026-09-05 14:43:52 +08:00 |
|
huangzd1997
|
af68b20f87
|
task-4(壳层/路由): 定义深色侧边栏与浅色内容区设计 token 并锁定不变量
新增 src/styles/theme.ts 语义 token 单源 + 相对亮度/对比度/isDarkSurface,
tests 校验侧边栏暗、内容区亮、正文 WCAG AA、与 main.css 变量交叉一致防漂移。
|
2026-09-05 14:43:52 +08:00 |
|
huangzd1997
|
7065dbb53e
|
task-3(壳层/路由): 定义并锁定 AdminLayout 页面容器职责契约
壳层只做页面容器:唯一 RouterView 挂载业务视图、不静态 import 业务页面、
不直接调后台 API、Element Plus 按需命名导入;页面接线归 router 懒加载。
配套 tests/helpers.ts 提供只读源码分析与 @/ import 可解析校验。
|
2026-09-05 14:43:52 +08:00 |
|
huangzd1997
|
6f0357e41c
|
task-2(壳层/路由): 冻结 /admin-vue/ base 与 History 路由契约为单一事实源
新增 src/config/app.ts(APP_BASE_PATH/ensureAppBasePath/joinAdminPath),
vite.config base、router createWebHistory、AdminLayout logo 路径统一消费常量,
禁止散落字面量;8 用例覆盖归一化/幂等/空段/单段/非法输入与字面量单源。
|
2026-09-05 14:43:52 +08:00 |
|
huangzd1997
|
ec7d56d566
|
task-1(壳层/路由): 冻结独立后台工程工作区边界契约与基线测试
admin-frontend-vue/src/config/workspace.ts 提供可编程边界校验(独立包名、
必需清单/源码目录、客户端耦合 token 扫描、可操作缺失消息),供后续壳层
任务与验收脚本复用;tests/task-1.test.ts 以 8 用例锁定依赖/构建/测试/边界。
|
2026-09-05 14:43:51 +08:00 |
|