Admin:实现采购员账号管理 #51

Closed
opened 2026-08-09 13:14:57 +08:00 by ila · 3 comments
Owner

基本信息

  • 状态:已完成
  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / MVP
  • 阶段:Admin 登录与最小账号管理

要解决什么

管理员登录后需要手动创建和维护采购员账号;采购员只能使用现有业务页面,不能管理用户。

做什么 / 不做什么

  • 做:用户列表、搜索、新增采购员、启用/禁用、重置密码、管理员角色校验、Session 撤销和最后管理员保护。
  • 不做:不开放注册,不新增第二管理员入口,不物理删除用户,不做细粒度页面权限、API Key 或 Client 登录。

怎么做

依赖 #50。

  • 增加用户管理 Repository/Service/Handler 和 templates/user/list.html。
  • /users 全部路由要求管理员角色;采购员访问返回 403。
  • 新建账号固定为 purchaser,用户名大小写不敏感且唯一。
  • 禁用、启用和重置密码使用 POST、CSRF 和二次确认。
  • 禁用或重置密码后删除该用户全部 web_sessions。
  • 用户不物理删除;不能禁用最后一个有效管理员,也不能让唯一管理员禁用自己。
  • 页面和日志不显示密码、密码哈希或 Session。

预计修改:admin/repository/user.go、admin/service/user.go、admin/handler/web/user.go、admin/handler/web/web.go、admin/templates/user/list.html、公共导航和对应测试。

验收标准

  • 管理员可以创建用户名唯一的采购员。
  • 管理员可以搜索、启用和禁用采购员。
  • 管理员可以重置采购员密码。
  • 禁用或重置密码会撤销该用户全部 Session。
  • 采购员可以访问现有业务页面,但不能访问用户管理。
  • 不存在公开注册和物理删除入口。
  • 最后一个有效管理员不能被禁用。
  • 页面和日志不泄露密码、哈希和 Session。
  • Go 1.23.0 下构建、测试和 vet 通过。

怎么验证

从 admin/ 执行:

$env:GOTOOLCHAIN="go1.23.0"
go vet ./...
go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN

手动使用管理员创建采购员,再以采购员登录核对业务页面和 /users 权限。

风险和回退

账号禁用和密码重置会立即撤销 Session。实现必须把用户状态修改与 Session 撤销放在同一事务,失败时整体回滚。

## 基本信息 - 状态:已完成 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 / MVP - 阶段:Admin 登录与最小账号管理 ## 要解决什么 管理员登录后需要手动创建和维护采购员账号;采购员只能使用现有业务页面,不能管理用户。 ## 做什么 / 不做什么 - 做:用户列表、搜索、新增采购员、启用/禁用、重置密码、管理员角色校验、Session 撤销和最后管理员保护。 - 不做:不开放注册,不新增第二管理员入口,不物理删除用户,不做细粒度页面权限、API Key 或 Client 登录。 ## 怎么做 依赖 #50。 - 增加用户管理 Repository/Service/Handler 和 `templates/user/list.html`。 - `/users` 全部路由要求管理员角色;采购员访问返回 `403`。 - 新建账号固定为 `purchaser`,用户名大小写不敏感且唯一。 - 禁用、启用和重置密码使用 POST、CSRF 和二次确认。 - 禁用或重置密码后删除该用户全部 `web_sessions`。 - 用户不物理删除;不能禁用最后一个有效管理员,也不能让唯一管理员禁用自己。 - 页面和日志不显示密码、密码哈希或 Session。 预计修改:`admin/repository/user.go`、`admin/service/user.go`、`admin/handler/web/user.go`、`admin/handler/web/web.go`、`admin/templates/user/list.html`、公共导航和对应测试。 ## 验收标准 - [x] 管理员可以创建用户名唯一的采购员。 - [x] 管理员可以搜索、启用和禁用采购员。 - [x] 管理员可以重置采购员密码。 - [x] 禁用或重置密码会撤销该用户全部 Session。 - [x] 采购员可以访问现有业务页面,但不能访问用户管理。 - [x] 不存在公开注册和物理删除入口。 - [x] 最后一个有效管理员不能被禁用。 - [x] 页面和日志不泄露密码、哈希和 Session。 - [x] Go 1.23.0 下构建、测试和 vet 通过。 ## 怎么验证 从 `admin/` 执行: ```powershell $env:GOTOOLCHAIN="go1.23.0" go vet ./... go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN ``` 手动使用管理员创建采购员,再以采购员登录核对业务页面和 `/users` 权限。 ## 风险和回退 账号禁用和密码重置会立即撤销 Session。实现必须把用户状态修改与 Session 撤销放在同一事务,失败时整体回滚。
Author
Owner

状态:进行中。#50 依赖已完成,开始实现采购员列表/搜索/新增、启停、重置密码、管理员角色中间件与 Session 原子撤销。严格不包含 #52 API Key、公开注册、第二管理员入口或物理删除。

状态:进行中。#50 依赖已完成,开始实现采购员列表/搜索/新增、启停、重置密码、管理员角色中间件与 Session 原子撤销。严格不包含 #52 API Key、公开注册、第二管理员入口或物理删除。
Author
Owner

状态:待验收。

实现已完成并按工单边界提交:

  • eea0d65 feat: 实现 Admin 采购员账号管理 (#51)
  • cbc01f8 docs: 归档任务 #51
  • 归档:docs/task/51-admin-采购员账号管理.md

关键结果:

  • 管理员可按用户名/状态搜索、新增固定 purchaser 角色、启停和重置密码;
  • 启停、重置密码与目标账号全部 Session 撤销处于同一事务;
  • 最后一个有效管理员由页面和服务端双重保护;
  • 采购员可访问现有业务页,但看不到用户管理导航且访问 /users 返回 403;
  • 不存在公开注册、第二管理员、物理删除、API Key 或 Client 登录扩展;
  • 页面校验失败不回显密码,写操作均为 POST + CSRF,敏感操作有二次确认。

验证(Go 1.23.0):gofmt -l . 无输出,go vet ./...、go build ./...、go test ./... -count=1 全部通过;1366×768 隔离数据库浏览器流程通过。

未触发真实采购。工单保持开启,等待用户验收。

状态:待验收。 实现已完成并按工单边界提交: - `eea0d65` feat: 实现 Admin 采购员账号管理 (#51) - `cbc01f8` docs: 归档任务 #51 - 归档:`docs/task/51-admin-采购员账号管理.md` 关键结果: - 管理员可按用户名/状态搜索、新增固定 purchaser 角色、启停和重置密码; - 启停、重置密码与目标账号全部 Session 撤销处于同一事务; - 最后一个有效管理员由页面和服务端双重保护; - 采购员可访问现有业务页,但看不到用户管理导航且访问 `/users` 返回 403; - 不存在公开注册、第二管理员、物理删除、API Key 或 Client 登录扩展; - 页面校验失败不回显密码,写操作均为 POST + CSRF,敏感操作有二次确认。 验证(Go 1.23.0):`gofmt -l .` 无输出,`go vet ./...`、`go build ./...`、`go test ./... -count=1` 全部通过;1366×768 隔离数据库浏览器流程通过。 未触发真实采购。工单保持开启,等待用户验收。
Author
Owner

用户已于 2026-08-09 明确通过全部 Admin 待验收工单。本工单验收通过,现关闭,并同步父级 #15、#14 的任务清单。

用户已于 2026-08-09 明确通过全部 Admin 待验收工单。本工单验收通过,现关闭,并同步父级 #15、#14 的任务清单。
ila closed this issue 2026-08-09 21:15:52 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#51