All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 21s
- 后端: Auth(登录/登出/me + session 中间件)、Users、Tokens 路由与 Service, scrypt 哈希+timingSafeEqual 校验、requireAdmin 保护、admin 用户自动初始化 - 前端: login.html(登录页, 无账号密码提示)、admin.html(用户+Token 管理, 令牌明文显隐/复制/吊销/重置密码)、标题栏用户信息+系统管理入口 - 持久化: jsonAdapter 支持 users/api-tokens,运行时数据忽略入库 - 文档: 需求.md/原型设计.md 同步
126 lines
4.1 KiB
Markdown
126 lines
4.1 KiB
Markdown
# 页面实现文档:登录 / 项目列表 / 系统管理
|
||
|
||
## 1. 页面流程
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[登录页 login.html] -->|登录成功| B[项目列表页 projects.html]
|
||
B -->|点击项目卡片| D[配置管理页 index.html]
|
||
B -->|管理员点击「系统管理」| C[系统管理 admin.html]
|
||
C -->|返回项目列表| B
|
||
A -.->|未登录访问任意页面| B
|
||
B -.->|token 过期 API 返回 401| A
|
||
```
|
||
|
||
## 2. 认证机制
|
||
|
||
- 登录成功返回 `{ token, user }`,前端存入 `localStorage`。
|
||
- 所有 API 请求自动携带 `Authorization: Bearer <token>` 头。
|
||
- 服务端使用内存 session(`src/routes/auth.js`),TTL 24 小时。
|
||
- API 返回 401 时前端自动清理凭证并跳转登录页。
|
||
- **首次启动自动创建默认管理员**:`admin / admin123`(密码经 scrypt 加盐哈希,存于 `data/users.json`)。
|
||
|
||
| 角色 | 项目列表 | 进入配置 | 系统管理 |
|
||
|------|---------|---------|---------|
|
||
| 管理员 (admin) | ✓ | ✓ | ✓ |
|
||
| 普通用户 (user) | ✓ | ✓ | ✗(入口隐藏 + 后端 403) |
|
||
|
||
## 3. 页面清单(public/ 目录)
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `public/login.html` | 登录页,居中卡片,深蓝渐变背景 |
|
||
| `public/projects.html` | 项目列表页,卡片网格 + 搜索 + 新建/删除项目 |
|
||
| `public/admin.html` | 系统管理页,用户管理 + Token 管理两个 Tab |
|
||
| `public/index.html` | 配置管理页(原有),标题栏增加用户信息/系统管理/退出入口 |
|
||
|
||
## 4. 新增 API
|
||
|
||
### 4.1 认证
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| POST | `/api/auth/login` | 登录,Body: `{ username, password }`,返回 `{ token, user }` |
|
||
| POST | `/api/auth/logout` | 注销,销毁 session |
|
||
| GET | `/api/auth/me` | 获取当前登录用户 |
|
||
|
||
### 4.2 用户管理(需管理员)
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | `/api/users` | 用户列表(不含密码字段) |
|
||
| POST | `/api/users` | 新增用户 `{ username, displayName, password, role, enabled }` |
|
||
| PUT | `/api/users/:id` | 编辑 `{ displayName, role, enabled }` |
|
||
| PUT | `/api/users/:id/password` | 重置密码 `{ password }` |
|
||
| DELETE | `/api/users/:id` | 删除用户 |
|
||
|
||
### 4.3 Token 管理(需管理员)
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | `/api/tokens` | Token 列表 |
|
||
| POST | `/api/tokens` | 生成 `{ name, projectId, permission, expiresInDays }`,返回含明文 value |
|
||
| PUT | `/api/tokens/:id` | 编辑 `{ name, projectId, permission, enabled }` |
|
||
| PUT | `/api/tokens/:id/revoke` | 吊销 |
|
||
| DELETE | `/api/tokens/:id` | 删除 |
|
||
|
||
## 5. 数据模型
|
||
|
||
`data/` 目录扩展:
|
||
|
||
```
|
||
data/
|
||
├── users.json # 用户表(password 为 salt:hash)
|
||
└── api-tokens.json # API Token 表(reg_ 前缀,MCP token 仍由 mcp.json 管理)
|
||
```
|
||
|
||
### 用户 (User)
|
||
|
||
```json
|
||
{
|
||
"id": "a1b2c3d4",
|
||
"username": "admin",
|
||
"displayName": "系统管理员",
|
||
"password": "salt:scrypt-hash",
|
||
"role": "admin",
|
||
"enabled": true,
|
||
"createdAt": "2026-09-11T08:00:00.000Z",
|
||
"updatedAt": "2026-09-11T08:00:00.000Z",
|
||
"lastLoginAt": "2026-09-11T09:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
### API Token
|
||
|
||
```json
|
||
{
|
||
"id": "x1y2z3a4",
|
||
"name": "CI 自动发布",
|
||
"projectId": "proj-001",
|
||
"permission": "readwrite",
|
||
"value": "reg_<hex>",
|
||
"enabled": true,
|
||
"createdAt": "2026-09-11T08:00:00.000Z",
|
||
"expiresAt": "2026-12-10T08:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
## 6. 目录结构变更
|
||
|
||
```
|
||
src/
|
||
├── server.js # 挂载 auth/users/tokens 路由 + 全局认证中间件
|
||
├── routes/
|
||
│ ├── auth.js # 登录/登出/me + session 管理
|
||
│ ├── users.js # 用户管理(管理员)
|
||
│ └── tokens.js # Token 管理(管理员)
|
||
└── services/
|
||
├── userService.js # 用户业务逻辑 + scrypt 密码哈希
|
||
└── tokenService.js # Token 业务逻辑
|
||
|
||
public/
|
||
├── login.html # 登录页
|
||
├── projects.html # 项目列表页
|
||
├── admin.html # 系统管理页
|
||
└── js/api.js # 新增 auth/user/token 接口封装
|
||
``` |