|
@@ -1,4 +1,4 @@
|
|
|
-# Story 008.001: 完善角色权限定义和默认数据
|
|
|
|
|
|
|
+# Story 008.001: 完善角色权限定义和默认数据(多租户MT版本)
|
|
|
|
|
|
|
|
## Status
|
|
## Status
|
|
|
🔄 In Progress
|
|
🔄 In Progress
|
|
@@ -9,30 +9,30 @@
|
|
|
**so that** 为系统提供清晰的权限基础
|
|
**so that** 为系统提供清晰的权限基础
|
|
|
|
|
|
|
|
## Acceptance Criteria
|
|
## Acceptance Criteria
|
|
|
-1. 在`user-module`中定义标准权限常量:`PERMISSION_ADVERTISEMENT_MANAGE = 'advertisement:manage'`等
|
|
|
|
|
|
|
+1. 在`user-module-mt`中定义标准权限常量:`PERMISSION_ADVERTISEMENT_MANAGE = 'advertisement:manage'`等
|
|
|
2. 创建超级管理员角色:`super-admin`,包含广告管理权限
|
|
2. 创建超级管理员角色:`super-admin`,包含广告管理权限
|
|
|
3. 创建普通管理员角色:`admin`,不包含广告管理权限
|
|
3. 创建普通管理员角色:`admin`,不包含广告管理权限
|
|
|
4. 权限定义仅针对广告管理,其他模块权限保持现有状态
|
|
4. 权限定义仅针对广告管理,其他模块权限保持现有状态
|
|
|
-5. 创建数据库迁移脚本添加默认角色数据到`role`表
|
|
|
|
|
|
|
+5. 创建数据库迁移脚本添加默认角色数据到`role_mt`表
|
|
|
6. 提供角色权限管理API:角色列表、权限分配、用户角色分配
|
|
6. 提供角色权限管理API:角色列表、权限分配、用户角色分配
|
|
|
7. 编写单元测试验证角色权限逻辑
|
|
7. 编写单元测试验证角色权限逻辑
|
|
|
|
|
|
|
|
## Tasks / Subtasks
|
|
## Tasks / Subtasks
|
|
|
- [x] **定义标准权限常量** (AC: 1)
|
|
- [x] **定义标准权限常量** (AC: 1)
|
|
|
- - [x] 在`packages/user-module/src/constants/`目录下创建`permissions.constants.ts`文件
|
|
|
|
|
|
|
+ - [x] 在`packages/user-module-mt/src/constants/`目录下创建`permissions.constants.ts`文件
|
|
|
- [x] 定义广告管理相关权限常量:`ADVERTISEMENT_VIEW`, `ADVERTISEMENT_CREATE`, `ADVERTISEMENT_EDIT`, `ADVERTISEMENT_DELETE`, `ADVERTISEMENT_MANAGE`
|
|
- [x] 定义广告管理相关权限常量:`ADVERTISEMENT_VIEW`, `ADVERTISEMENT_CREATE`, `ADVERTISEMENT_EDIT`, `ADVERTISEMENT_DELETE`, `ADVERTISEMENT_MANAGE`
|
|
|
- [x] 采用`entity:action`命名规范:`advertisement:view`, `advertisement:create`, `advertisement:edit`, `advertisement:delete`, `advertisement:manage`
|
|
- [x] 采用`entity:action`命名规范:`advertisement:view`, `advertisement:create`, `advertisement:edit`, `advertisement:delete`, `advertisement:manage`
|
|
|
- [x] 确保常量命名符合项目命名规范
|
|
- [x] 确保常量命名符合项目命名规范
|
|
|
|
|
|
|
|
- [x] **创建超级管理员和普通管理员角色定义** (AC: 2, 3)
|
|
- [x] **创建超级管理员和普通管理员角色定义** (AC: 2, 3)
|
|
|
- - [x] 在`user-module`中定义角色常量:`ROLE_SUPER_ADMIN = 'super-admin'`, `ROLE_ADMIN = 'admin'`
|
|
|
|
|
|
|
+ - [x] 在`user-module-mt`中定义角色常量:`ROLE_SUPER_ADMIN = 'super-admin'`, `ROLE_ADMIN = 'admin'`
|
|
|
- [x] 确保超级管理员角色包含`advertisement:manage`权限
|
|
- [x] 确保超级管理员角色包含`advertisement:manage`权限
|
|
|
- [x] 确保普通管理员角色不包含广告管理相关权限
|
|
- [x] 确保普通管理员角色不包含广告管理相关权限
|
|
|
- [x] 保持现有其他模块权限不变
|
|
- [x] 保持现有其他模块权限不变
|
|
|
|
|
|
|
|
- [x] **创建数据库迁移脚本** (AC: 5)
|
|
- [x] **创建数据库迁移脚本** (AC: 5)
|
|
|
- - [x] 在`packages/user-module/src/migrations/`目录下创建迁移文件:`1234567890-add-default-roles.ts`
|
|
|
|
|
- - [x] 实现SQL插入语句添加默认角色数据到`role`表
|
|
|
|
|
|
|
+ - [x] 在`packages/user-module-mt/src/migrations/`目录下创建迁移文件:`1234567890-add-default-roles.ts`
|
|
|
|
|
+ - [x] 实现SQL插入语句添加默认角色数据到`role_mt`表
|
|
|
- [x] 使用`ON CONFLICT`语句确保幂等性:如果角色已存在则更新权限
|
|
- [x] 使用`ON CONFLICT`语句确保幂等性:如果角色已存在则更新权限
|
|
|
- [x] 确保多租户环境下的默认数据一致性
|
|
- [x] 确保多租户环境下的默认数据一致性
|
|
|
- [x] 迁移脚本应包含回滚逻辑
|
|
- [x] 迁移脚本应包含回滚逻辑
|
|
@@ -45,7 +45,7 @@
|
|
|
- [x] 确保所有方法支持多租户上下文
|
|
- [x] 确保所有方法支持多租户上下文
|
|
|
|
|
|
|
|
- [x] **实现角色权限管理API** (AC: 6)
|
|
- [x] **实现角色权限管理API** (AC: 6)
|
|
|
- - [x] 在`user-module`中创建权限相关API路由
|
|
|
|
|
|
|
+ - [x] 在`user-module-mt`中创建权限相关API路由
|
|
|
- [x] `GET /api/user/permissions` - 获取当前用户权限列表
|
|
- [x] `GET /api/user/permissions` - 获取当前用户权限列表
|
|
|
- [x] `GET /api/roles` - 获取角色列表(带权限)
|
|
- [x] `GET /api/roles` - 获取角色列表(带权限)
|
|
|
- [x] `PUT /api/roles/{id}/permissions` - 更新角色权限
|
|
- [x] `PUT /api/roles/{id}/permissions` - 更新角色权限
|
|
@@ -110,11 +110,11 @@
|
|
|
- **测试执行频率**: 单元测试每次代码变更,集成测试每次API变更
|
|
- **测试执行频率**: 单元测试每次代码变更,集成测试每次API变更
|
|
|
|
|
|
|
|
### 数据模型设计 [Source: docs/prd/epic-008-permission-role-management.md#数据库设计]
|
|
### 数据模型设计 [Source: docs/prd/epic-008-permission-role-management.md#数据库设计]
|
|
|
-**role表结构**:
|
|
|
|
|
|
|
+**role_mt表结构**:
|
|
|
基于现有Role实体,使用simple-array存储权限列表:
|
|
基于现有Role实体,使用simple-array存储权限列表:
|
|
|
```sql
|
|
```sql
|
|
|
--- 现有role表结构
|
|
|
|
|
-CREATE TABLE role (
|
|
|
|
|
|
|
+-- 现有role_mt表结构
|
|
|
|
|
+CREATE TABLE role_mt (
|
|
|
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
|
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
|
|
tenant_id INT UNSIGNED NOT NULL COMMENT '租户ID',
|
|
tenant_id INT UNSIGNED NOT NULL COMMENT '租户ID',
|
|
|
name VARCHAR(100) NOT NULL COMMENT '角色名称',
|
|
name VARCHAR(100) NOT NULL COMMENT '角色名称',
|
|
@@ -128,7 +128,7 @@ CREATE TABLE role (
|
|
|
|
|
|
|
|
**默认角色数据迁移脚本**:
|
|
**默认角色数据迁移脚本**:
|
|
|
```sql
|
|
```sql
|
|
|
-INSERT INTO role (tenant_id, name, description, permissions)
|
|
|
|
|
|
|
+INSERT INTO role_mt (tenant_id, name, description, permissions)
|
|
|
VALUES
|
|
VALUES
|
|
|
(1, 'super-admin', '超级管理员', 'advertisement:manage'),
|
|
(1, 'super-admin', '超级管理员', 'advertisement:manage'),
|
|
|
(1, 'admin', '普通管理员', '')
|
|
(1, 'admin', '普通管理员', '')
|
|
@@ -138,12 +138,12 @@ SET permissions =
|
|
|
WHEN EXCLUDED.name = 'super-admin' THEN
|
|
WHEN EXCLUDED.name = 'super-admin' THEN
|
|
|
-- 超级管理员:确保有 advertisement:manage 权限,保留其他现有权限
|
|
-- 超级管理员:确保有 advertisement:manage 权限,保留其他现有权限
|
|
|
CASE
|
|
CASE
|
|
|
- WHEN role.permissions = '' THEN 'advertisement:manage'
|
|
|
|
|
- ELSE CONCAT(role.permissions, ',advertisement:manage')
|
|
|
|
|
|
|
+ WHEN role_mt.permissions = '' THEN 'advertisement:manage'
|
|
|
|
|
+ ELSE CONCAT(role_mt.permissions, ',advertisement:manage')
|
|
|
END
|
|
END
|
|
|
WHEN EXCLUDED.name = 'admin' THEN
|
|
WHEN EXCLUDED.name = 'admin' THEN
|
|
|
-- 普通管理员:确保没有 advertisement:manage 权限,保留其他现有权限
|
|
-- 普通管理员:确保没有 advertisement:manage 权限,保留其他现有权限
|
|
|
- REPLACE(role.permissions, 'advertisement:manage', '')
|
|
|
|
|
|
|
+ REPLACE(role_mt.permissions, 'advertisement:manage', '')
|
|
|
END,
|
|
END,
|
|
|
description = EXCLUDED.description;
|
|
description = EXCLUDED.description;
|
|
|
```
|
|
```
|
|
@@ -159,7 +159,7 @@ description = EXCLUDED.description;
|
|
|
### 模块结构
|
|
### 模块结构
|
|
|
```
|
|
```
|
|
|
packages/
|
|
packages/
|
|
|
-├── user-module/ # 用户模块(增强)
|
|
|
|
|
|
|
+├── user-module-mt/ # 多租户用户模块(增强)
|
|
|
│ ├── src/
|
|
│ ├── src/
|
|
|
│ │ ├── constants/ # 新增:权限常量定义
|
|
│ │ ├── constants/ # 新增:权限常量定义
|
|
|
│ │ │ └── permissions.constants.ts
|
|
│ │ │ └── permissions.constants.ts
|
|
@@ -175,17 +175,17 @@ packages/
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
### 文件位置和命名约定
|
|
### 文件位置和命名约定
|
|
|
-- **权限常量文件**: `packages/user-module/src/constants/permissions.constants.ts`
|
|
|
|
|
-- **角色服务文件**: `packages/user-module/src/services/role.service.ts` (现有文件扩展)
|
|
|
|
|
-- **迁移文件**: `packages/user-module/src/migrations/1234567890-add-default-roles.ts`
|
|
|
|
|
-- **权限API路由文件**: `packages/user-module/src/routes/role-permission.routes.ts`
|
|
|
|
|
-- **测试文件**: `packages/user-module/tests/unit/role-permission.test.ts`
|
|
|
|
|
|
|
+- **权限常量文件**: `packages/user-module-mt/src/constants/permissions.constants.ts`
|
|
|
|
|
+- **角色服务文件**: `packages/user-module-mt/src/services/role.service.ts` (现有文件扩展)
|
|
|
|
|
+- **迁移文件**: `packages/user-module-mt/src/migrations/1234567890-add-default-roles.ts`
|
|
|
|
|
+- **权限API路由文件**: `packages/user-module-mt/src/routes/role-permission.routes.ts`
|
|
|
|
|
+- **测试文件**: `packages/user-module-mt/tests/unit/role-permission.test.ts`
|
|
|
|
|
|
|
|
### 多租户实体命名模式
|
|
### 多租户实体命名模式
|
|
|
基于现有多租户模块观察:
|
|
基于现有多租户模块观察:
|
|
|
-- **实体类名**: 以`Mt`结尾(如`RoleMt`)
|
|
|
|
|
|
|
+- **实体类名**: 保持不变(如`Role`),与单租户版本相同
|
|
|
- **表名**: 以`_mt`结尾(如`role_mt`)
|
|
- **表名**: 以`_mt`结尾(如`role_mt`)
|
|
|
-- **文件命名**: `*.mt.ts` 或 `*.entity.ts`
|
|
|
|
|
|
|
+- **文件命名**: `*.entity.ts`(与单租户相同)
|
|
|
- **必须包含**: `tenant_id`字段用于租户隔离
|
|
- **必须包含**: `tenant_id`字段用于租户隔离
|
|
|
|
|
|
|
|
### 技术约束
|
|
### 技术约束
|
|
@@ -196,7 +196,7 @@ packages/
|
|
|
- **兼容性**: 保持现有API接口不变,仅添加新API
|
|
- **兼容性**: 保持现有API接口不变,仅添加新API
|
|
|
|
|
|
|
|
### 集成点
|
|
### 集成点
|
|
|
-1. **用户模块集成**: 扩展现有`user-module`,保持向后兼容
|
|
|
|
|
|
|
+1. **用户模块集成**: 扩展现有`user-module-mt`,保持向后兼容
|
|
|
2. **服务器集成**: 使用现有的`permission.middleware.ts`中间件
|
|
2. **服务器集成**: 使用现有的`permission.middleware.ts`中间件
|
|
|
3. **广告模块集成**: 后续故事中将广告模块路由集成权限检查
|
|
3. **广告模块集成**: 后续故事中将广告模块路由集成权限检查
|
|
|
4. **前端集成**: 后续故事中前端将使用权限API获取用户权限
|
|
4. **前端集成**: 后续故事中前端将使用权限API获取用户权限
|
|
@@ -209,7 +209,7 @@ packages/
|
|
|
|
|
|
|
|
### 项目结构注意事项
|
|
### 项目结构注意事项
|
|
|
- 需要遵循现有的模块包架构模式
|
|
- 需要遵循现有的模块包架构模式
|
|
|
-- 权限系统基于现有`user-module`扩展,不创建新模块
|
|
|
|
|
|
|
+- 权限系统基于现有`user-module-mt`扩展,不创建新模块
|
|
|
- 保持向后兼容性,不影响现有功能
|
|
- 保持向后兼容性,不影响现有功能
|
|
|
- 参考现有的多租户模块实现模式
|
|
- 参考现有的多租户模块实现模式
|
|
|
|
|
|
|
@@ -220,7 +220,7 @@ packages/
|
|
|
|
|
|
|
|
## Testing
|
|
## Testing
|
|
|
### 测试标准 [Source: architecture/testing-strategy.md]
|
|
### 测试标准 [Source: architecture/testing-strategy.md]
|
|
|
-- **测试文件位置**: `packages/user-module/tests/` 目录下
|
|
|
|
|
|
|
+- **测试文件位置**: `packages/user-module-mt/tests/` 目录下
|
|
|
- **单元测试位置**: `tests/unit/**/*.test.ts`
|
|
- **单元测试位置**: `tests/unit/**/*.test.ts`
|
|
|
- **集成测试位置**: `tests/integration/**/*.test.ts`
|
|
- **集成测试位置**: `tests/integration/**/*.test.ts`
|
|
|
- **测试框架**: Vitest + hono/testing + shared-test-util
|
|
- **测试框架**: Vitest + hono/testing + shared-test-util
|
|
@@ -267,18 +267,18 @@ packages/
|
|
|
|
|
|
|
|
### File List
|
|
### File List
|
|
|
**创建的文件:**
|
|
**创建的文件:**
|
|
|
-- packages/user-module/src/constants/permissions.constants.ts
|
|
|
|
|
-- packages/user-module/src/constants/roles.constants.ts
|
|
|
|
|
-- packages/user-module/src/constants/index.ts
|
|
|
|
|
-- packages/user-module/src/migrations/1234567890-add-default-roles.ts
|
|
|
|
|
-- packages/user-module/src/routes/role-permission.routes.ts
|
|
|
|
|
-- packages/user-module/tests/unit/permissions.constants.test.ts
|
|
|
|
|
|
|
+- packages/user-module-mt/src/constants/permissions.constants.ts
|
|
|
|
|
+- packages/user-module-mt/src/constants/roles.constants.ts
|
|
|
|
|
+- packages/user-module-mt/src/constants/index.ts
|
|
|
|
|
+- packages/user-module-mt/src/migrations/1234567890-add-default-roles.ts
|
|
|
|
|
+- packages/user-module-mt/src/routes/role-permission.routes.ts
|
|
|
|
|
+- packages/user-module-mt/tests/unit/permissions.constants.test.ts
|
|
|
|
|
|
|
|
**修改的文件:**
|
|
**修改的文件:**
|
|
|
-- packages/user-module/src/index.ts(添加常量导出)
|
|
|
|
|
-- packages/user-module/src/entities/role.entity.ts(添加 tenantId 字段、索引和唯一约束)
|
|
|
|
|
-- packages/user-module/src/services/role.service.ts(扩展权限管理方法)
|
|
|
|
|
-- packages/user-module/src/routes/index.ts(添加 rolePermissionRoutes 导出)
|
|
|
|
|
|
|
+- packages/user-module-mt/src/index.ts(添加常量导出)
|
|
|
|
|
+- packages/user-module-mt/src/entities/role.entity.ts(添加 tenantId 字段、索引和唯一约束)
|
|
|
|
|
+- packages/user-module-mt/src/services/role.service.ts(扩展权限管理方法)
|
|
|
|
|
+- packages/user-module-mt/src/routes/index.ts(添加 rolePermissionRoutes 导出)
|
|
|
- docs/stories/008.001.permission-role-definition.story.md(更新任务状态和开发记录)
|
|
- docs/stories/008.001.permission-role-definition.story.md(更新任务状态和开发记录)
|
|
|
|
|
|
|
|
## QA Results
|
|
## QA Results
|