docs: 官网文档全面更新 — M2-M8 指南 + API 参考 + v0.2.0 更新日志

- 更新 changelog.md: v0.2.0 记录 M2-M8 全部完成,路线图更新
- 新增 5 篇指南: RBAC、组织管理、审计日志、通知模块、质量横切
- 新增 5 篇 API 文档: RBAC(11)、Org(5)、Audit(1)、Settings(7)、Notification(7)
- 更新 api/overview.md: 完整 37 端点列表
- 更新 config.ts: 侧边栏分组 + 11 页 SEO 元数据
This commit is contained in:
MengStack Dev 2026-10-03 01:55:55 +08:00
parent c08de67a24
commit fca3326e34
13 changed files with 1414 additions and 35 deletions

View File

@ -28,8 +28,8 @@ const seoPages: Record<string, { title: string; description: string; keywords: s
}, },
'/changelog': { '/changelog': {
title: '更新日志 | 版本迭代记录与路线图 - MengStack开源框架', title: '更新日志 | 版本迭代记录与路线图 - MengStack开源框架',
description: 'MengStack各版本更新记录,包含v0.1.0首发版本技术栈说明、功能特性清单,以及后续版本路线图规划,跟进MengStack框架最新功能动态。', description: 'MengStack各版本更新记录,v0.2.0完成RBAC权限模型、组织管理、审计日志、通知模块、配置管理增强、Docker+CI/CD、质量横切等全部M2-M8里程碑,以及v0.1.0首发版本技术栈说明。',
keywords: 'MengStack更新日志,MengStack版本,Go框架更新,开源项目路线图', keywords: 'MengStack更新日志,MengStack版本,Go框架更新,开源项目路线图,RBAC权限,审计日志',
}, },
'/demo': { '/demo': {
title: '在线演示 | 免费体验MengStack接口服务 - MengStack官方', title: '在线演示 | 免费体验MengStack接口服务 - MengStack官方',
@ -41,6 +41,56 @@ const seoPages: Record<string, { title: string; description: string; keywords: s
description: 'MengStack开源开发者社区,提供代码仓库地址、问题反馈渠道、功能建议入口,以及Bug报告、代码提交、代码规范等贡献指引,欢迎所有开发者参与MengStack共建。', description: 'MengStack开源开发者社区,提供代码仓库地址、问题反馈渠道、功能建议入口,以及Bug报告、代码提交、代码规范等贡献指引,欢迎所有开发者参与MengStack共建。',
keywords: 'MengStack社区,Go开源社区,Go开发者交流,开源项目贡献', keywords: 'MengStack社区,Go开源社区,Go开发者交流,开源项目贡献',
}, },
'/guide/rbac': {
title: 'RBAC 权限模型 | 角色权限管理与中间件鉴权 - MengStack官方文档',
description: 'MengStack内置RBAC权限模型,基于Permission/Role/UserRole四表设计,支持多租户隔离下的角色管理、权限分配、中间件鉴权,预置admin/editor/viewer角色种子数据。',
keywords: 'RBAC权限模型,Go角色权限,Go中间件鉴权,多租户权限,MengStack RBAC',
},
'/guide/org': {
title: '组织管理 | 多租户 CRUD 与状态管理 - MengStack官方文档',
description: 'MengStack组织管理模块提供租户完整生命周期管理,包括租户创建、查询、更新、删除、状态管理(启用/禁用),UUID主键,与多租户中间件配合实现数据隔离。',
keywords: 'MengStack组织管理,Go租户管理,多租户CRUD,租户状态管理',
},
'/guide/audit': {
title: '审计日志 | 操作追踪与合规记录 - MengStack官方文档',
description: 'MengStack审计日志模块自动记录关键操作(用户、动作、资源、IP),支持多维筛选和分页查询,按租户隔离,只写不删,满足企业合规审计需求。',
keywords: '审计日志,Go操作审计,合规记录,操作追踪,MengStack审计',
},
'/guide/notification': {
title: '通知模块 | 用户通知的发送与管理 - MengStack官方文档',
description: 'MengStack通知模块提供用户级消息推送,支持info/success/warning/error四种类型,单条/全部标记已读,未读计数,分页查询,为前端通知中心提供完整后端能力。',
keywords: 'MengStack通知模块,Go用户通知,未读消息,通知管理',
},
'/guide/quality': {
title: '质量横切 | 安全基线、限流、日志与优雅停机 - MengStack官方文档',
description: 'MengStack M8质量横切:IP限流中间件、安全响应头(X-Frame-Options/CSP等)、请求体限制、Zap结构化请求日志、自定义Recovery、优雅停机(10秒超时)、testutil测试工具包、11个中间件单元测试。',
keywords: 'Go安全中间件,IP限流,优雅停机,结构化日志,MengStack质量基线',
},
'/api/rbac': {
title: 'RBAC API | 角色权限管理接口 - MengStack官方文档',
description: 'MengStack RBAC接口文档,包含权限列表、角色CRUD、权限绑定、用户角色分配等11个API端点,完整的请求/响应示例和参数说明。',
keywords: 'RBAC API,Go权限接口,角色管理API,MengStack接口文档',
},
'/api/org': {
title: '组织管理 API | 租户 CRUD 接口 - MengStack官方文档',
description: 'MengStack组织管理接口文档,包含租户创建、列表查询、详情获取、更新、删除5个API端点,UUID主键,完整请求/响应示例。',
keywords: '组织管理API,Go租户接口,租户CRUD API,MengStack接口文档',
},
'/api/audit': {
title: '审计日志 API | 操作审计查询接口 - MengStack官方文档',
description: 'MengStack审计日志接口文档,支持按用户、操作类型、资源类型多维筛选,分页查询,完整请求/响应示例。',
keywords: '审计日志API,Go审计接口,操作查询API,MengStack接口文档',
},
'/api/settings': {
title: '配置管理 API | 全局与租户配置接口 - MengStack官方文档',
description: 'MengStack配置管理接口文档,全局配置与租户配置两级管理,支持运行时读写和upsert,配置优先级:租户>全局>默认,完整API参考。',
keywords: '配置管理API,Go配置接口,运行时配置,MengStack接口文档',
},
'/api/notification': {
title: '通知 API | 用户通知管理接口 - MengStack官方文档',
description: 'MengStack通知接口文档,包含通知创建、查询、标记已读、全部已读、未读计数、删除7个API端点,完整请求/响应示例。',
keywords: '通知API,Go通知接口,未读消息API,MengStack接口文档',
},
} }
function getPagePath(relativePath: string) { function getPagePath(relativePath: string) {
@ -131,10 +181,20 @@ export default defineConfig({
text: '核心功能', text: '核心功能',
items: [ items: [
{ text: '认证与授权', link: '/guide/auth' }, { text: '认证与授权', link: '/guide/auth' },
{ text: 'RBAC 权限模型', link: '/guide/rbac' },
{ text: '多租户系统', link: '/guide/multi-tenancy' }, { text: '多租户系统', link: '/guide/multi-tenancy' },
{ text: '组织管理', link: '/guide/org' },
{ text: '审计日志', link: '/guide/audit' },
{ text: '通知模块', link: '/guide/notification' },
{ text: '配置管理', link: '/guide/configuration' }, { text: '配置管理', link: '/guide/configuration' },
], ],
}, },
{
text: '质量保障',
items: [
{ text: '安全基线与中间件', link: '/guide/quality' },
],
},
{ {
text: '部署', text: '部署',
items: [ items: [
@ -149,6 +209,11 @@ export default defineConfig({
items: [ items: [
{ text: '概览', link: '/api/overview' }, { text: '概览', link: '/api/overview' },
{ text: '认证接口', link: '/api/auth' }, { text: '认证接口', link: '/api/auth' },
{ text: 'RBAC 接口', link: '/api/rbac' },
{ text: '组织管理接口', link: '/api/org' },
{ text: '审计日志接口', link: '/api/audit' },
{ text: '配置管理接口', link: '/api/settings' },
{ text: '通知接口', link: '/api/notification' },
{ text: '系统接口', link: '/api/system' }, { text: '系统接口', link: '/api/system' },
], ],
}, },

60
api/audit.md Normal file
View File

@ -0,0 +1,60 @@
---
title: 审计日志 API | 操作审计查询接口 - MengStack官方文档
---
# 审计日志接口
所有接口需要认证,并携带 `X-Tenant-ID` 头。
## 查询审计日志
**`GET /api/v1/audit/logs`**
### 查询参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `user_id` | int | 否 | 按操作人 ID 筛选 |
| `action` | string | 否 | 按操作类型筛选(create / update / delete / login / assign) |
| `resource` | string | 否 | 按资源类型筛选(user / role / tenant / setting / auth) |
| `page` | int | 否 | 页码,默认 1 |
| `page_size` | int | 否 | 每页条数,默认 20 |
### 响应
```json
{
"code": 0,
"data": {
"items": [
{
"id": 1,
"tenant_id": "550e8400-...",
"user_id": 1,
"action": "create",
"resource": "role",
"resource_id": "5",
"detail": "{\"name\":\"editor\"}",
"ip": "192.168.1.100",
"created_at": "2026-10-03T10:00:00+08:00"
}
],
"total": 42,
"page": 1
}
}
```
### 示例
```bash
# 查询所有删除操作
curl "http://localhost:2222/api/v1/audit/logs?action=delete" \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
# 查询指定用户的日志
curl "http://localhost:2222/api/v1/audit/logs?user_id=1&page_size=10" \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
```

137
api/notification.md Normal file
View File

@ -0,0 +1,137 @@
---
title: 通知 API | 用户通知管理接口 - MengStack官方文档
---
# 通知接口
所有接口需要认证,并携带 `X-Tenant-ID` 头。
## 创建通知
**`POST /api/v1/notifications`**
### 请求体
```json
{
"user_id": 1,
"title": "欢迎加入",
"content": "您的账号已成功创建。",
"type": "info"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `user_id` | int | 是 | 接收用户 ID |
| `title` | string | 是 | 通知标题 |
| `content` | string | 否 | 通知内容 |
| `type` | string | 否 | 类型:info / success / warning / error,默认 info |
### 响应
返回 `NotificationDTO`。
---
## 获取通知详情
**`GET /api/v1/notifications/:id`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | int | 通知 ID |
---
## 获取用户通知列表
**`GET /api/v1/notifications/user/:userId`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `userId` | int | 用户 ID |
### 查询参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `page` | int | 否 | 页码,默认 1 |
| `page_size` | int | 否 | 每页条数,默认 20 |
### 响应
```json
{
"code": 0,
"data": {
"items": [
{
"id": 1,
"tenant_id": "550e8400-...",
"user_id": 1,
"title": "欢迎加入",
"content": "您的账号已成功创建。",
"type": "info",
"is_read": false,
"created_at": "2026-10-03T10:00:00+08:00"
}
],
"total": 15,
"page": 1
}
}
```
---
## 标记通知已读
**`PUT /api/v1/notifications/:id/read`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | int | 通知 ID |
---
## 全部标记已读
**`PUT /api/v1/notifications/read-all`**
将当前用户(从 JWT 提取)的所有通知标记为已读。
---
## 获取未读数量
**`GET /api/v1/notifications/unread-count`**
### 响应
```json
{
"code": 0,
"data": {
"count": 5
}
}
```
---
## 删除通知
**`DELETE /api/v1/notifications/:id`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | int | 通知 ID |

118
api/org.md Normal file
View File

@ -0,0 +1,118 @@
---
title: 组织管理 API | 租户 CRUD 接口 - MengStack官方文档
---
# 组织管理接口
所有接口需要认证。
## 创建租户
**`POST /api/v1/org/tenants`**
### 请求体
```json
{
"name": "示例科技有限公司",
"slug": "example-tech"
}
```
| 字段 | 类型 | 必填 | 约束 |
|------|------|------|------|
| `name` | string | 是 | 最长 128 字符 |
| `slug` | string | 是 | 最长 64 字符,唯一 |
### 响应
```json
{
"code": 0,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "示例科技有限公司",
"slug": "example-tech",
"status": 1,
"created_at": "2026-10-03T10:00:00+08:00",
"updated_at": "2026-10-03T10:00:00+08:00"
}
}
```
### 错误
| 状态码 | 说明 |
|--------|------|
| 400 | 参数校验失败 |
| 409 | slug 已存在 |
---
## 列出所有租户
**`GET /api/v1/org/tenants`**
### 响应
返回 `TenantDTO` 数组。
---
## 获取租户详情
**`GET /api/v1/org/tenants/:id`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | string | 租户 UUID |
### 响应
返回 `TenantDTO`。
---
## 更新租户
**`PUT /api/v1/org/tenants/:id`**
### 请求体
```json
{
"name": "新名称",
"slug": "new-slug",
"status": 0
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `name` | string | 否 | 新名称 |
| `slug` | string | 否 | 新 slug |
| `status` | int | 否 | 1=启用, 0=禁用 |
---
## 删除租户
**`DELETE /api/v1/org/tenants/:id`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | string | 租户 UUID |
### 响应
```json
{
"code": 0,
"message": "success",
"data": null
}
```

View File

@ -58,15 +58,78 @@ X-Tenant-ID: <tenant_id>
## 接口列表 ## 接口列表
| 模块 | 端点 | 说明 | ### 认证模块
| 方法 | 端点 | 说明 |
|------|------|------| |------|------|------|
| 认证 | `POST /auth/register` | 用户注册,详见[认证接口](/api/auth) | | POST | `/auth/register` | 用户注册,详见[认证接口](/api/auth) |
| 认证 | `POST /auth/login` | 用户登录,详见[认证接口](/api/auth) | | POST | `/auth/login` | 用户登录,详见[认证接口](/api/auth) |
| 认证 | `POST /auth/refresh` | 刷新令牌,详见[认证接口](/api/auth) | | POST | `/auth/refresh` | 刷新令牌,详见[认证接口](/api/auth) |
| 认证 | `POST /password` | 修改密码,详见[认证接口](/api/auth) | | POST | `/password` | 修改密码,详见[认证接口](/api/auth) |
| 认证 | `GET /profile` | 获取当前用户,详见[认证接口](/api/auth) | | GET | `/profile` | 获取当前用户,详见[认证接口](/api/auth) |
| 系统 | `GET /health` | 健康检查,详见[系统接口](/api/system) |
| 系统 | `GET /ping` | 连通性测试,详见[系统接口](/api/system) | ### RBAC 权限模块
| 方法 | 端点 | 说明 |
|------|------|------|
| GET | `/api/v1/rbac/permissions` | 列出权限,详见[RBAC 接口](/api/rbac) |
| POST | `/api/v1/rbac/roles` | 创建角色 |
| GET | `/api/v1/rbac/roles` | 列出角色 |
| GET | `/api/v1/rbac/roles/:id` | 获取角色详情 |
| PUT | `/api/v1/rbac/roles/:id` | 更新角色 |
| DELETE | `/api/v1/rbac/roles/:id` | 删除角色 |
| PUT | `/api/v1/rbac/roles/:id/permissions` | 设置角色权限 |
| GET | `/api/v1/rbac/roles/:id/permissions` | 获取角色权限 |
| POST | `/api/v1/rbac/users/:userId/roles` | 分配角色给用户 |
| DELETE | `/api/v1/rbac/users/:userId/roles/:roleId` | 移除用户角色 |
| GET | `/api/v1/rbac/users/:userId/roles` | 获取用户角色 |
### 组织管理模块
| 方法 | 端点 | 说明 |
|------|------|------|
| POST | `/api/v1/org/tenants` | 创建租户,详见[组织管理接口](/api/org) |
| GET | `/api/v1/org/tenants` | 列出所有租户 |
| GET | `/api/v1/org/tenants/:id` | 获取租户详情 |
| PUT | `/api/v1/org/tenants/:id` | 更新租户 |
| DELETE | `/api/v1/org/tenants/:id` | 删除租户 |
### 审计日志模块
| 方法 | 端点 | 说明 |
|------|------|------|
| GET | `/api/v1/audit/logs` | 查询审计日志,详见[审计日志接口](/api/audit) |
### 配置管理模块
| 方法 | 端点 | 说明 |
|------|------|------|
| GET | `/api/v1/settings` | 列出全局配置,详见[配置管理接口](/api/settings) |
| GET | `/api/v1/settings/global/:key` | 获取全局配置 |
| PUT | `/api/v1/settings/global/:key` | 更新全局配置 |
| GET | `/api/v1/settings/tenant` | 列出租户配置 |
| GET | `/api/v1/settings/tenant/:key` | 获取租户配置 |
| PUT | `/api/v1/settings/tenant/:key` | 更新租户配置 |
| DELETE | `/api/v1/settings/tenant/:key` | 删除租户配置 |
### 通知模块
| 方法 | 端点 | 说明 |
|------|------|------|
| POST | `/api/v1/notifications` | 创建通知,详见[通知接口](/api/notification) |
| GET | `/api/v1/notifications/:id` | 获取通知详情 |
| GET | `/api/v1/notifications/user/:userId` | 获取用户通知列表 |
| PUT | `/api/v1/notifications/:id/read` | 标记通知已读 |
| PUT | `/api/v1/notifications/read-all` | 全部标记已读 |
| GET | `/api/v1/notifications/unread-count` | 获取未读数量 |
| DELETE | `/api/v1/notifications/:id` | 删除通知 |
### 系统模块
| 方法 | 端点 | 说明 |
|------|------|------|
| GET | `/health` | 健康检查,详见[系统接口](/api/system) |
| GET | `/ping` | 连通性测试,详见[系统接口](/api/system) |
## Swagger UI ## Swagger UI

212
api/rbac.md Normal file
View File

@ -0,0 +1,212 @@
---
title: RBAC API | 角色权限管理接口 - MengStack官方文档
---
# RBAC 接口
所有接口需要认证,并携带 `X-Tenant-ID` 头。
## 列出权限
**`GET /api/v1/rbac/permissions`**
### 查询参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `module` | string | 否 | 按模块筛选 |
### 响应
```json
{
"code": 0,
"data": [
{
"id": 1,
"code": "auth:user:read",
"name": "查看用户",
"module": "auth",
"description": "查看用户列表和详情"
}
]
}
```
---
## 创建角色
**`POST /api/v1/rbac/roles`**
### 请求体
```json
{
"name": "editor",
"description": "内容编辑者"
}
```
| 字段 | 类型 | 必填 |
|------|------|------|
| `name` | string | 是 |
| `description` | string | 否 |
### 响应
返回 `RoleDTO`(含 `permissions` 数组)。
### 错误
| 状态码 | 说明 |
|--------|------|
| 400 | 参数校验失败 |
| 409 | 角色名已存在 |
---
## 列出角色
**`GET /api/v1/rbac/roles`**
### 响应
```json
{
"code": 0,
"data": [
{
"id": 1,
"tenant_id": "550e8400-...",
"name": "admin",
"description": "系统管理员",
"is_system": true,
"permissions": [...]
}
]
}
```
---
## 获取角色详情
**`GET /api/v1/rbac/roles/:id`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | int | 角色 ID |
### 响应
返回 `RoleDTO`。
---
## 更新角色
**`PUT /api/v1/rbac/roles/:id`**
### 请求体
```json
{
"name": "senior-editoror",
"description": "高级编辑"
}
```
| 字段 | 类型 | 必填 |
|------|------|------|
| `name` | string | 否 |
| `description` | string | 否 |
---
## 删除角色
**`DELETE /api/v1/rbac/roles/:id`**
### 错误
| 状态码 | 说明 |
|--------|------|
| 403 | 系统角色不可删除 |
---
## 设置角色权限
**`PUT /api/v1/rbac/roles/:id/permissions`**
### 请求体
```json
{
"permission_ids": [1, 2, 3, 5]
}
```
覆盖该角色的全部权限。
---
## 获取角色权限
**`GET /api/v1/rbac/roles/:id/permissions`**
### 响应
返回 `PermissionDTO` 数组。
---
## 分配角色给用户
**`POST /api/v1/rbac/users/:userId/roles`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `userId` | int | 用户 ID |
### 请求体
```json
{
"role_id": 2
}
```
### 错误
| 状态码 | 说明 |
|--------|------|
| 409 | 用户已拥有该角色 |
---
## 移除用户角色
**`DELETE /api/v1/rbac/users/:userId/roles/:roleId`**
### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `userId` | int | 用户 ID |
| `roleId` | int | 角色 ID |
---
## 获取用户角色
**`GET /api/v1/rbac/users/:userId/roles`**
### 响应
返回 `RoleDTO` 数组,包含该用户在此租户下的所有角色及权限。

118
api/settings.md Normal file
View File

@ -0,0 +1,118 @@
---
title: 配置管理 API | 全局与租户配置接口 - MengStack官方文档
---
# 配置管理接口
配置分为两级:全局配置(所有租户共享)和租户配置(覆盖全局默认)。
所有接口需要认证,并携带 `X-Tenant-ID` 头。
## 全局配置
### 列出全局配置
**`GET /api/v1/settings`**
#### 响应
```json
{
"code": 0,
"data": [
{
"id": 1,
"tenant_id": "",
"key": "site_name",
"value": "MengStack",
"type": "string",
"scope": "global",
"updated_by": 1,
"updated_at": "2026-10-03T10:00:00+08:00"
}
]
}
```
### 获取全局配置
**`GET /api/v1/settings/global/:key`**
#### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `key` | string | 配置键名 |
#### 响应
返回 `SettingDTO`。
### 更新全局配置
**`PUT /api/v1/settings/global/:key`**
#### 请求体
```json
{
"value": "新值",
"type": "string"
}
```
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `value` | string | 是 | 配置值 |
| `type` | string | 否 | 类型标记(string / number / boolean / json),默认 string |
---
## 租户配置
### 列出租户配置
**`GET /api/v1/settings/tenant`**
返回当前租户的所有配置项。
### 获取租户配置
**`GET /api/v1/settings/tenant/:key`**
#### 路径参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `key` | string | 配置键名 |
### 更新租户配置
**`PUT /api/v1/settings/tenant/:key`**
#### 请求体
```json
{
"value": "租户级覆盖值",
"type": "string"
}
```
如果该 key 不存在,自动创建(upsert 语义)。
### 删除租户配置
**`DELETE /api/v1/settings/tenant/:key`**
删除后,该租户将回退到全局默认值。
---
## 配置优先级
```
租户配置 > 全局配置 > 默认值
```
读取配置时,应用层按此优先级合并。

View File

@ -4,6 +4,68 @@ title: 更新日志 | 版本迭代记录与路线图 - MengStack开源框架
# 更新日志 # 更新日志
## v0.2.0 (2026-10-03)
**全模块完成** — M2 至 M8 全部交付,框架能力齐备
### 新增
- **RBAC 权限模型 (M3)**:
- Permission / Role / UserRole 四表设计
- 角色 CRUD + 权限批量绑定
- 用户角色分配与移除
- RBAC 中间件:基于权限码的接口级鉴权
- 种子数据:预置 admin / editor / viewer 角色及基础权限
- **组织管理 (M4)**:
- 租户 CRUD(UUID 主键)
- 租户状态管理(启用 / 禁用)
- **审计日志 (M4)**:
- 自动记录关键操作(用户、动作、资源、IP)
- 分页查询 + 多维筛选(用户 / 操作 / 资源类型)
- **通知模块 (M6)**:
- 通知 CRUD
- 按用户分页查询
- 单条 / 全部标记已读
- 未读计数
- **配置管理增强 (M5)**:
- 运行时配置 API(全局 + 租户两级)
- 租户级配置覆盖全局默认
- 配置类型标记(string / number / boolean / json)
- **Docker + CI/CD (M7)**:
- 多阶段 Dockerfile(golang:1.23-alpine → alpine:3.20)
- .dockerignore 安全排除
- Gitea Actions CI 流水线(lint → vet → test → build)
- docker-compose.yml 增加 restart 策略
- Makefile 增加 docker-build 目标
- **质量横切 (M8)**:
- IP 限流中间件(100 次/分钟,内存 + 自动清理)
- 安全响应头(X-Content-Type-Options、X-Frame-Options、X-XSS-Protection、Referrer-Policy、CSP)
- 请求体大小限制(10MB)
- Zap 结构化请求日志(status / method / path / latency / trace_id)
- 自定义 Recovery 中间件(panic 捕获 + Zap 记录)
- 优雅停机(10 秒超时)
- 测试工具包(testutil)+ 11 个中间件单元测试
- PostgreSQL DSN 增加 TimeZone=Asia/Shanghai
- **Swagger 全量注解**:
- 37 个 handler 方法全部添加 godoc 注解
- 6 个模块 API 文档自动生成
### 技术栈(新增依赖)
| 组件 | 版本 | 说明 |
|------|------|------|
| swaggo/swag | latest | Swagger 注解解析 |
| gin-swagger | latest | Swagger UI 中间件 |
---
## v0.1.0 (2026-10-02) ## v0.1.0 (2026-10-02)
**初始版本** — 项目骨架 + 认证模块 **初始版本** — 项目骨架 + 认证模块
@ -16,7 +78,7 @@ title: 更新日志 | 版本迭代记录与路线图 - MengStack开源框架
- **配置管理**:Viper 分层配置,支持 YAML + 环境变量覆盖 - **配置管理**:Viper 分层配置,支持 YAML + 环境变量覆盖
- **结构化日志**:Zap 结构化输出,请求级 trace_id - **结构化日志**:Zap 结构化输出,请求级 trace_id
- **多租户支持**:基于 X-Tenant-ID 的租户隔离中间件 - **多租户支持**:基于 X-Tenant-ID 的租户隔离中间件
- **认证模块**: - **认证模块 (M2)**:
- 用户注册(邮箱 + 用户名 + 密码) - 用户注册(邮箱 + 用户名 + 密码)
- 用户登录(邮箱 + 密码) - 用户登录(邮箱 + 密码)
- JWT 双 Token 机制(Access + Refresh) - JWT 双 Token 机制(Access + Refresh)
@ -48,34 +110,22 @@ title: 更新日志 | 版本迭代记录与路线图 - MengStack开源框架
## 路线图 ## 路线图
### v0.2.0 — RBAC 权限模型 ### v0.3.0 — 插件接口预留
- Role / Permission 数据模型 - Plugin 生命周期接口定义
- 用户角色分配 - 插件注册 / 发现机制
- RBAC 中间件 - 示例插件(日志增强 / 自定义鉴权)
- 权限校验装饰器
### v0.3.0 — 组织管理 + 审计日志 ### v0.4.0 — 客户端前台 (Nuxt 3)
- 组织 CRUD - 14 页演示站 UI(首页、登录、注册、Dashboard、通知中心等)
- 用户-组织关系 - API 对接层(Pinia + composables)
- 操作审计日志 - 暗色模式 + 响应式适配
### v0.4.0 — 配置管理增强
- 运行时配置 API
- 全局默认 + 租户覆盖
- 配置变更历史
### v0.5.0 — 用户示例模块
- 完整用户 CRUD
- 单元测试 + 集成测试
- 示例代码
### v1.0.0 — 正式发布 ### v1.0.0 — 正式发布
- 完整测试覆盖 - 完整测试覆盖(单元 + 集成 > 80%)
- 安全审计 - 安全审计(OWASP Top 10 检查)
- 性能基准测试 - 性能基准测试
- 生产部署文档 - 生产部署文档完善
- 插件生态首批社区贡献

99
guide/audit.md Normal file
View File

@ -0,0 +1,99 @@
---
title: 审计日志 | 操作追踪与合规记录 - MengStack官方文档
---
# 审计日志
审计日志模块自动记录系统中的关键操作,支持多维筛选和分页查询,满足合规审计需求。
## 数据模型
```go
type AuditLog struct {
ID uint // 自增主键
TenantID string // 租户 ID
UserID uint // 操作人 ID
Action string // 操作类型(create / update / delete / login 等)
Resource string // 资源类型(user / role / tenant 等)
ResourceID string // 资源 ID
Detail string // 操作详情(JSON 格式)
IP string // 操作人 IP 地址
CreatedAt time.Time // 操作时间
}
```
## 记录时机
审计日志在以下场景自动写入:
| 场景 | Action | Resource |
|------|--------|----------|
| 用户注册 | `create` | `user` |
| 用户登录 | `login` | `auth` |
| 修改密码 | `update` | `user` |
| 创建角色 | `create` | `role` |
| 删除角色 | `delete` | `role` |
| 分配角色 | `assign` | `user_role` |
| 创建租户 | `create` | `tenant` |
| 修改配置 | `update` | `setting` |
## 查询方式
支持按用户、操作类型、资源类型筛选,并支持分页:
```bash
# 查询所有审计日志
curl http://localhost:2222/api/v1/audit/logs \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
# 按用户筛选
curl "http://localhost:2222/api/v1/audit/logs?user_id=1" \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
# 按操作类型筛选 + 分页
curl "http://localhost:2222/api/v1/audit/logs?action=delete&page=1&page_size=10" \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
```
## 响应格式
```json
{
"code": 0,
"message": "success",
"data": {
"items": [
{
"id": 1,
"tenant_id": "550e8400-...",
"user_id": 1,
"action": "create",
"resource": "role",
"resource_id": "5",
"detail": "{\"name\":\"editor\"}",
"ip": "192.168.1.100",
"created_at": "2026-10-03T10:00:00+08:00"
}
],
"total": 42,
"page": 1
}
}
```
## 安全特性
- 审计日志按 `tenant_id` 严格隔离,租户只能查看自己的日志
- 日志记录不可修改、不可删除(只写不删)
- IP 地址从请求上下文中自动提取
## API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/v1/audit/logs` | 分页查询审计日志 |
详细接口参数见 [审计日志 API 参考](/api/audit)。

119
guide/notification.md Normal file
View File

@ -0,0 +1,119 @@
---
title: 通知模块 | 用户通知的发送与管理 - MengStack官方文档
---
# 通知模块
通知模块提供用户级别的消息推送和管理能力,支持多种通知类型和已读状态管理。
## 数据模型
```go
type Notification struct {
ID uint // 自增主键
TenantID string // 租户 ID
UserID uint // 接收用户 ID
Title string // 通知标题
Content string // 通知内容
Type string // 通知类型(info / warning / error / success)
IsRead bool // 是否已读
CreatedAt time.Time
UpdatedAt time.Time
}
```
## 通知类型
| 类型 | 用途 | 建议样式 |
|------|------|----------|
| `info` | 一般信息通知 | 蓝色图标 |
| `success` | 操作成功通知 | 绿色图标 |
| `warning` | 警告通知 | 黄色图标 |
| `error` | 错误通知 | 红色图标 |
## 核心能力
| 能力 | 说明 |
|------|------|
| 发送通知 | 向指定用户创建通知 |
| 查询通知 | 按用户分页查询通知列表 |
| 标记已读 | 单条或全部标记为已读 |
| 未读计数 | 获取用户未读通知数量 |
| 删除通知 | 删除指定通知 |
## 使用方式
### 发送通知
```bash
curl -X POST http://localhost:2222/api/v1/notifications \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>" \
-H "Content-Type: application/json" \
-d '{
"user_id": 1,
"title": "欢迎加入",
"content": "您的账号已成功创建,请完善个人资料。",
"type": "info"
}'
```
### 获取用户通知列表
```bash
curl "http://localhost:2222/api/v1/notifications/user/1?page=1&page_size=20" \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
```
### 获取未读数量
```bash
curl http://localhost:2222/api/v1/notifications/unread-count \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
```
响应:
```json
{
"code": 0,
"message": "success",
"data": {
"count": 5
}
}
```
### 全部标记已读
```bash
curl -X PUT http://localhost:2222/api/v1/notifications/read-all \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>"
```
## 扩展方向
当前通知模块为基础版本,后续可扩展:
- WebSocket 实时推送
- 通知模板引擎
- 邮件 / 短信多渠道通知
- 通知分组与标签
- 定时通知与批量发送
## API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/v1/notifications` | 创建通知 |
| GET | `/api/v1/notifications/:id` | 获取通知详情 |
| GET | `/api/v1/notifications/user/:userId` | 获取用户通知列表 |
| PUT | `/api/v1/notifications/:id/read` | 标记通知已读 |
| PUT | `/api/v1/notifications/read-all` | 全部标记已读 |
| GET | `/api/v1/notifications/unread-count` | 获取未读数量 |
| DELETE | `/api/v1/notifications/:id` | 删除通知 |
详细接口参数见 [通知 API 参考](/api/notification)。

92
guide/org.md Normal file
View File

@ -0,0 +1,92 @@
---
title: 组织管理 | 多租户 CRUD 与状态管理 - MengStack官方文档
---
# 组织管理
组织管理模块提供租户(Tenant)的完整生命周期管理,是多租户系统的基础。
## 数据模型
```go
type Tenant struct {
ID string // UUID 主键
Name string // 组织名称
Slug string // 唯一标识符(用于 URL 友好展示)
Status int // 1=启用, 0=禁用
Settings string // JSON 扩展配置
CreatedAt time.Time
UpdatedAt time.Time
}
```
## 核心能力
| 能力 | 说明 |
|------|------|
| 创建租户 | 自动生成 UUID,需提供 name 和 slug |
| 查询租户 | 支持列表查询和单条详情查询 |
| 更新租户 | 可修改名称、slug、状态 |
| 删除租户 | 级联清理关联数据 |
| 状态管理 | 启用 / 禁用租户,禁用后该租户用户无法登录 |
## 使用方式
### 创建租户
```bash
curl -X POST http://localhost:2222/api/v1/org/tenants \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "示例科技有限公司",
"slug": "example-tech"
}'
```
响应:
```json
{
"code": 0,
"message": "success",
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "示例科技有限公司",
"slug": "example-tech",
"status": 1,
"created_at": "2026-10-03T10:00:00+08:00",
"updated_at": "2026-10-03T10:00:00+08:00"
}
}
```
### 禁用租户
```bash
curl -X PUT http://localhost:2222/api/v1/org/tenants/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"status": 0}'
```
## 与多租户中间件的关系
组织管理模块负责租户数据的 CRUD,而多租户中间件(`X-Tenant-ID` header)负责在请求级别隔离数据。两者配合实现完整的多租户能力:
1. 通过 **组织管理 API** 创建租户
2. 用户登录时通过 **X-Tenant-ID** 指定所属租户
3. 中间件自动验证租户状态并注入上下文
4. 后续所有数据库操作自动按 `tenant_id` 过滤
## API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/v1/org/tenants` | 创建租户 |
| GET | `/api/v1/org/tenants` | 列出所有租户 |
| GET | `/api/v1/org/tenants/:id` | 获取租户详情 |
| PUT | `/api/v1/org/tenants/:id` | 更新租户 |
| DELETE | `/api/v1/org/tenants/:id` | 删除租户 |
详细接口参数见 [组织管理 API 参考](/api/org)。

145
guide/quality.md Normal file
View File

@ -0,0 +1,145 @@
---
title: 质量横切 | 安全基线、限流、日志与优雅停机 - MengStack官方文档
---
# 质量横切
M8 为框架添加了生产级质量基线,覆盖安全、限流、日志、容错和测试基础设施。
## 中间件链
所有请求经过以下中间件链(按顺序):
```
RequestID → RequestLogger → SecurityHeaders → CORS → RateLimit → BodyLimit → Recovery
```
## IP 限流
基于内存的 IP 限流中间件,自动清理过期记录:
```go
// 每个 IP 每分钟最多 100 次请求
r.Use(middleware.RateLimit(100, time.Minute))
```
| 特性 | 说明 |
|------|------|
| 限流维度 | 客户端 IP |
| 存储方式 | 内存 map + sync.Mutex |
| 自动清理 | 后台 goroutine 每分钟清理过期记录 |
| 超限响应 | HTTP 429 + `RATE_LIMITED` 错误码 |
::: warning
内存限流适合单机部署。多实例部署建议替换为 Redis 限流。
:::
## 安全响应头
自动为所有响应添加安全头:
| Header | 值 | 作用 |
|--------|------|------|
| `X-Content-Type-Options` | `nosniff` | 防止 MIME 类型嗅探 |
| `X-Frame-Options` | `DENY` | 防止点击劫持 |
| `X-XSS-Protection` | `1; mode=block` | 浏览器 XSS 过滤 |
| `Referrer-Policy` | `strict-origin-when-cross-origin` | 控制 Referer 泄露 |
| `Content-Security-Policy` | `default-src 'self'` | 限制资源加载来源 |
## 请求体限制
限制请求体最大为 10MB,防止大文件攻击:
```go
r.Use(middleware.BodyLimit(10 << 20)) // 10 MB
```
- 先检查 `Content-Length` header,超限直接返回 413
- 再通过 `http.MaxBytesReader` 限制实际读取大小
## 结构化请求日志
使用 Zap 替代 fmt,输出结构化 JSON 日志:
```json
{
"level": "info",
"msg": "request",
"status": 200,
"method": "GET",
"path": "/api/v1/profile",
"query": "",
"ip": "192.168.1.100",
"user-agent": "Mozilla/5.0",
"latency_ms": 12,
"trace_id": "req-abc-123"
}
```
日志级别按状态码自动选择:
| 状态码范围 | 日志级别 |
|-----------|---------|
| < 400 | INFO |
| 400-499 | WARN |
| >= 500 | ERROR |
## 自定义 Recovery
替代 `gin.Recovery()`,panic 信息通过 Zap 记录而非 stdout:
```go
r.Use(middleware.Recovery(log))
```
记录的字段:panic 内容、stack trace、请求方法、路径、trace_id。
## 优雅停机
应用收到终止信号后,等待最多 10 秒处理完进行中的请求:
```go
// app.go
OnStop: func(ctx context.Context) error {
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return srv.Shutdown(shutdownCtx)
}
```
## 测试基础设施
### testutil 包
```go
import "mengstack/internal/kernel/testutil"
func TestSomething(t *testing.T) {
log := testutil.TestLogger(t) // 测试专用 Zap logger
cfg := testutil.TestConfig() // 最小化测试配置
}
```
### 中间件测试
内置 11 个单元测试覆盖所有中间件:
```bash
go test ./internal/app/middleware/ -v
```
| 测试 | 覆盖场景 |
|------|----------|
| TestRequestID_GeneratesNew | 无 trace_id 时自动生成 |
| TestRequestID_PreservesExisting | 已有 trace_id 时保留 |
| TestSecurityHeaders | 5 个安全头全部设置 |
| TestRateLimit_AllowsWithinLimit | 限额内请求正常通过 |
| TestRateLimit_BlocksOverLimit | 超限额返回 429 |
| TestRequestLogger_DoesNotPanic | 日志中间件不 panic |
| TestRecovery_HandlesPanic | 捕获 panic 并记录 |
| TestBodyLimit_RejectsLargeBody | 超大 body 返回 413 |
| TestBodyLimit_AllowsSmallBody | 正常 body 通过 |
## 数据库时区
PostgreSQL DSN 默认携带 `TimeZone=Asia/Shanghai`,确保时间字段按中国时区存储和返回。

101
guide/rbac.md Normal file
View File

@ -0,0 +1,101 @@
---
title: RBAC 权限模型 | 角色权限管理与中间件鉴权 - MengStack官方文档
---
# RBAC 权限模型
MengStack 内置基于角色的访问控制(RBAC)模块,支持多租户隔离下的权限管理。
## 数据模型
RBAC 由 4 张核心表组成:
| 表 | 说明 | 关键字段 |
|------|------|----------|
| `permissions` | 权限定义 | code(唯一码)、name、module |
| `roles` | 角色定义 | tenant_id、name、is_system |
| `role_permissions` | 角色-权限关联(多对多) | role_id、permission_id |
| `user_roles` | 用户-角色关联 | user_id、tenant_id、role_id |
```
Permission ←→ Role ←→ User
(M:N) (M:N)
```
## 权限码规范
权限码采用 `模块:资源:动作` 三段式命名:
```
auth:user:read # 查看用户
auth:user:write # 编辑用户
rbac:role:manage # 管理角色
org:tenant:manage # 管理租户
notification:send # 发送通知
```
## 种子数据
框架启动时自动创建预置角色和权限:
| 角色 | 说明 | 权限范围 |
|------|------|----------|
| `admin` | 管理员(系统角色,不可删除) | 全部权限 |
| `editor` | 编辑者 | 内容读写 + 通知 |
| `viewer` | 查看者 | 只读权限 |
## 使用方式
### 1. 给用户分配角色
```bash
curl -X POST http://localhost:2222/api/v1/rbac/users/1/roles \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>" \
-H "Content-Type: application/json" \
-d '{"role_id": 1}'
```
### 2. 为角色设置权限
```bash
curl -X PUT http://localhost:2222/api/v1/rbac/roles/1/permissions \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-ID: <tenant_id>" \
-H "Content-Type: application/json" \
-d '{"permission_ids": [1, 2, 3]}'
```
### 3. 在路由中使用权限中间件
```go
// 在 routes.go 中
rbac.GET("/users", h.ListUsers, permMW.Require("auth:user:read"))
rbac.POST("/users", h.CreateUser, permMW.Require("auth:user:write"))
```
`permMW.Require()` 会从 JWT 中提取用户 ID 和租户 ID,查询该用户在此租户下的所有角色权限并集,判断是否包含所需权限码。
## 多租户隔离
- 角色按 `tenant_id` 隔离,不同租户的角色互不影响
- 用户角色关联也按 `tenant_id` 隔离,同一用户在不同租户可拥有不同角色
- 权限定义是全局共享的(不区分租户)
## API 端点
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/v1/rbac/permissions` | 列出权限(可按 module 筛选) |
| POST | `/api/v1/rbac/roles` | 创建角色 |
| GET | `/api/v1/rbac/roles` | 列出角色 |
| GET | `/api/v1/rbac/roles/:id` | 获取角色详情 |
| PUT | `/api/v1/rbac/roles/:id` | 更新角色 |
| DELETE | `/api/v1/rbac/roles/:id` | 删除角色 |
| PUT | `/api/v1/rbac/roles/:id/permissions` | 设置角色权限 |
| GET | `/api/v1/rbac/roles/:id/permissions` | 获取角色权限 |
| POST | `/api/v1/rbac/users/:userId/roles` | 分配角色给用户 |
| DELETE | `/api/v1/rbac/users/:userId/roles/:roleId` | 移除用户角色 |
| GET | `/api/v1/rbac/users/:userId/roles` | 获取用户角色 |
详细接口参数见 [RBAC API 参考](/api/rbac)。