# 156 Admin:切换模块时保持各列表筛选和分页状态 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 / Admin 六模块统一列表体验 - 状态:已完成 - 日期:2026-08-11 - Gitea 工单: ## 背景与目标 顶部导航原来固定进入各模块根地址。采购员在列表中搜索、筛选或翻页后, 切换模块再返回会丢失这些状态,需要重复操作。本任务让六个主模块在当前 浏览器标签页内分别记住最后一次稳定列表状态。 ## 最终方案 筛选和分页继续使用现有 URL 查询参数,不增加数据库状态。公共导航为六个 模块标记根路径,公共原生 JavaScript 使用 sessionStorage,按当前用户 ID 和 模块路径保存经过白名单清理的相对 URL。 只保留搜索、筛选、页码及顺运宝日期输入等稳定参数;临时消息、错误、弹窗、 同步登录状态、勾选项和未提交表单不会保存。读取时核对同源、模块路径和 URL 长度,浏览器禁用存储或数据异常时继续使用模板中的模块根地址。退出登录会 清理当前账号在该标签页的记录。 ## 改了哪些 - `admin/templates/partials/header.html`:增加账号隔离键和六个模块导航标识, 保留原始根地址作为无 JavaScript 回退。 - `admin/static/js/app.js`:保存、校验和恢复每个模块的稳定 URL,登出时清理。 - `admin/main_test.go`:增加导航标识、查询参数白名单、同源路径校验和清理契约测试。 - `docs/admin/05-ui-specification.md`:记录跨模块状态保持范围和禁止保存的临时状态。 ## 验收结果 | 验收标准 | 结果 | |---|---| | 六个主模块具备独立的搜索、筛选和页码恢复入口 | 通过 | | 使用真实 URL,不改写浏览器前进、后退、F5 和复制链接语义 | 通过 | | 勾选、弹窗、临时反馈和未提交表单不进入白名单 | 通过 | | 按用户 ID 隔离,退出时清理当前账号记录 | 通过 | | 异常 URL、跨源 URL、错误路径和存储异常安全回退 | 通过 | | JavaScript 失效时链接仍进入模块根页面 | 通过 | | 未修改数据库、Admin/Client 接口和业务状态 | 通过 | | Go 1.23.0 build、test、vet 通过 | 通过 | ## 测试 - 执行的命令: - `node --check static/js/app.js` - `$env:GOTOOLCHAIN="go1.23.0"; go test ./... -run 'TestModuleNavigation|TestTemplates|TestStatic' -count=1` - `$env:GOTOOLCHAIN="go1.23.0"; go build ./...; go test ./... -count=1; go vet ./...` - 结果:JavaScript 语法检查通过;Admin 全包构建、测试和静态检查通过。 - **没验证到的部分**:尚未在真实浏览器中使用两个账号逐项人工验证六模块交叉切换、 禁用 sessionStorage 和禁用 JavaScript 的实际交互;对应安全回退已由静态契约和代码检查覆盖。 ## 相关提交 - `cd1fc8a` feat: 保持模块列表筛选和分页状态 (#156)