feat(docs): 完成星撰平台M2基础用户系统完整设计文档体系

 新增功能设计文档:
- M2基础用户系统数据库设计(12个核心表,RBAC权限模型)
- M2基础用户系统接口设计(41个API接口,含排序功能)
- 完整的项目需求文档和开发计划

📚 核心文档结构:
- 数据库设计:支持树形结构、软删除、审计日志的完整用户权限体系
- 接口设计:包含认证、用户管理、角色权限、组织架构、字典标签等9大模块
- 排序功能:新增7个排序接口,支持拖拽和批量操作
- 项目规划:从MVP到完整生态的4阶段开发计划

🔧 技术栈确定:
- 后端:Elysia + Bun.js + MySQL + Redis + Elasticsearch
- 前端:Vue.js/React + TypeScript
- 部署:Docker + Docker Compose
- 测试:Vitest + 完整测试规范

📋 设计亮点:
- 无外键约束设计,应用层维护数据完整性
- 树形结构支持(path、level字段优化查询)
- 完整的权限继承机制和权限快照
- 支持root超级管理员和多级角色体系
- 标签系统和智能推荐功能
- 统一的响应格式和错误码规范

🎯 覆盖功能:
- 用户认证与管理(注册、登录、权限控制)
- RBAC角色权限体系(树形角色、权限继承)
- 组织架构管理(多级组织、人员分配)
- 数据字典与标签系统
- 完整的排序和数据导入导出功能

📈 文档规模:
- 数据库设计:38KB,922行
- 接口设计:55KB,3024行
- 总计:约100KB的详细技术文档

🔄 配套更新:
- 更新Elysia后端开发规范
- 完善健康检查控制器
- 统一项目代码规范和注释规范
This commit is contained in:
expressgy 2025-06-29 03:11:35 +08:00
parent 2ee70e5d42
commit 2518986557
12 changed files with 14604 additions and 34 deletions

View File

@ -13,7 +13,6 @@ alwaysApply: true
│ ├── controllers/ # 路由与业务入口 │ ├── controllers/ # 路由与业务入口
│ ├── services/ # 业务逻辑 │ ├── services/ # 业务逻辑
│ ├── models/ # 数据模型与类型定义 │ ├── models/ # 数据模型与类型定义
│ ├── middlewares/ # 中间件
│ ├── plugins/ # Elysia 插件 │ ├── plugins/ # Elysia 插件
│ ├── utils/ # 工具函数 │ ├── utils/ # 工具函数
│ ├── validators/ # 参数校验,注意!!!所有的参数校验必须挡在此目录中,目录结构遵照路由结构 │ ├── validators/ # 参数校验,注意!!!所有的参数校验必须挡在此目录中,目录结构遵照路由结构

7312
aiChat/003-cursor_.md Normal file

File diff suppressed because it is too large Load Diff

2078
aiChat/004-cursor_.md Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,922 @@
# M2 - 基础用户系统 - 数据库设计文档
## 1. 概述
本文档为星撰个人综合平台的基础用户系统M2阶段提供详细的数据库设计方案。设计遵循以下原则
- **无外键约束**:所有关联关系通过应用层代码维护,提高性能和灵活性
- **软删除机制**:所有业务表支持软删除,保留数据历史
- **树形结构支持**:角色、组织、权限、字典等支持无限层级的树形结构
- **审计追踪**:完整的创建、修改记录
- **高性能**:合理的索引设计,支持大数据量查询
- **扩展性**:预留扩展字段,支持未来功能演进
## 2. 数据库 ER 图
```mermaid
erDiagram
%% 用户相关
sys_users {
bigint id PK "主键雪花ID"
varchar(50) username UK "用户名"
varchar(100) email UK "邮箱"
varchar(20) mobile "手机号"
varchar(255) password_hash "密码哈希"
varchar(255) avatar "头像URL"
varchar(100) nickname "昵称"
varchar(20) status "状态:字典[user_status]"
tinyint gender "性别0未知,1男,2女"
date birthday "生日"
varchar(500) bio "个人简介"
int login_count "登录次数"
datetime last_login_at "最后登录时间"
varchar(45) last_login_ip "最后登录IP"
int failed_attempts "失败尝试次数"
datetime locked_until "锁定截止时间"
boolean is_root "是否超级管理员"
json extra "扩展信息JSON"
bigint created_by "创建人"
datetime created_at "创建时间"
bigint updated_by "更新人"
datetime updated_at "更新时间"
datetime deleted_at "删除时间"
int version "乐观锁版本号"
}
%% 角色相关
sys_roles {
bigint id PK "主键"
varchar(50) code UK "角色代码"
varchar(100) name "角色名称"
text description "角色描述"
bigint pid "父角色ID"
varchar(500) path "层级路径,如:/1/2/3/"
int level "层级深度"
int sort_order "排序号"
varchar(20) status "状态:字典[role_status]"
boolean is_system "是否系统角色"
json permissions_snapshot "权限快照"
json extra "扩展信息"
bigint created_by "创建人"
datetime created_at "创建时间"
bigint updated_by "更新人"
datetime updated_at "更新时间"
datetime deleted_at "删除时间"
int version "版本号"
}
%% 权限相关
sys_permissions {
bigint id PK "主键"
varchar(100) code UK "权限代码"
varchar(100) name "权限名称"
varchar(20) type "类型menu,button,api,data"
varchar(50) resource "资源标识"
varchar(50) action "操作read,write,delete等"
text description "权限描述"
bigint pid "父权限ID"
varchar(500) path "层级路径"
int level "层级深度"
int sort_order "排序号"
varchar(20) status "状态"
json meta "元数据"
bigint created_by "创建人"
datetime created_at "创建时间"
bigint updated_by "更新人"
datetime updated_at "更新时间"
datetime deleted_at "删除时间"
}
%% 组织架构
sys_organizations {
bigint id PK "主键"
varchar(100) code UK "组织代码"
varchar(200) name "组织名称"
varchar(200) full_name "组织全称"
text description "组织描述"
bigint pid "父组织ID"
varchar(500) path "层级路径"
int level "层级深度"
varchar(20) type "类型:字典[org_type]"
varchar(20) status "状态:字典[org_status]"
int sort_order "排序号"
varchar(100) leader_id "负责人ID"
varchar(200) address "地址"
varchar(50) phone "电话"
json extra "扩展信息"
bigint created_by "创建人"
datetime created_at "创建时间"
bigint updated_by "更新人"
datetime updated_at "更新时间"
datetime deleted_at "删除时间"
int version "版本号"
}
%% 字典管理
sys_dict_types {
bigint id PK "主键"
varchar(50) code UK "字典类型代码"
varchar(100) name "字典类型名称"
text description "描述"
bigint pid "父字典类型ID"
varchar(500) path "层级路径"
int level "层级深度"
varchar(20) status "状态active,inactive"
boolean is_system "是否系统字典"
int sort_order "排序号"
bigint created_by "创建人"
datetime created_at "创建时间"
bigint updated_by "更新人"
datetime updated_at "更新时间"
datetime deleted_at "删除时间"
}
sys_dict_items {
bigint id PK "主键"
bigint type_id "字典类型ID"
varchar(50) item_key "字典项键"
varchar(200) item_value "字典项值"
varchar(100) label "显示标签"
varchar(200) label_en "英文标签"
text description "描述"
bigint pid "父字典项ID"
varchar(500) path "层级路径"
int level "层级深度"
int sort_order "排序号"
varchar(20) status "状态"
varchar(50) css_class "样式类"
varchar(50) color "颜色值"
json extra "扩展属性"
bigint created_by "创建人"
datetime created_at "创建时间"
bigint updated_by "更新人"
datetime updated_at "更新时间"
datetime deleted_at "删除时间"
}
%% 标签管理
sys_tags {
bigint id PK "主键"
varchar(50) name UK "标签名称"
varchar(50) type "标签类型user,role,content"
varchar(50) color "标签颜色"
text description "描述"
int usage_count "使用次数"
bigint created_by "创建人"
datetime created_at "创建时间"
datetime deleted_at "删除时间"
}
%% 关联表
sys_user_roles {
bigint id PK "主键"
bigint user_id "用户ID"
bigint role_id "角色ID"
datetime expired_at "过期时间"
bigint created_by "创建人"
datetime created_at "创建时间"
}
sys_role_permissions {
bigint id PK "主键"
bigint role_id "角色ID"
bigint permission_id "权限ID"
boolean is_half "是否半选(树形权限)"
bigint created_by "创建人"
datetime created_at "创建时间"
}
sys_user_organizations {
bigint id PK "主键"
bigint user_id "用户ID"
bigint organization_id "组织ID"
boolean is_primary "是否主组织"
varchar(100) position "职位"
datetime joined_at "加入时间"
bigint created_by "创建人"
datetime created_at "创建时间"
}
sys_user_tags {
bigint id PK "主键"
bigint user_id "用户ID"
bigint tag_id "标签ID"
bigint created_by "创建人"
datetime created_at "创建时间"
}
%% 操作日志
sys_operation_logs {
bigint id PK "主键"
bigint user_id "用户ID"
varchar(100) username "用户名"
varchar(50) module "模块"
varchar(50) action "操作"
varchar(200) target "操作对象"
bigint target_id "对象ID"
text request_data "请求数据"
text response_data "响应数据"
varchar(20) status "状态success,fail"
varchar(45) ip "IP地址"
varchar(200) user_agent "用户代理"
bigint duration "耗时(ms)"
text error_msg "错误信息"
datetime created_at "创建时间"
}
%% 关系定义
sys_users ||--o{ sys_user_roles : "拥有"
sys_roles ||--o{ sys_user_roles : "被分配"
sys_roles ||--o{ sys_role_permissions : "拥有"
sys_permissions ||--o{ sys_role_permissions : "被分配"
sys_users ||--o{ sys_user_organizations : "属于"
sys_organizations ||--o{ sys_user_organizations : "包含"
sys_users ||--o{ sys_user_tags : "拥有"
sys_tags ||--o{ sys_user_tags : "被使用"
sys_dict_types ||--o{ sys_dict_items : "包含"
sys_roles ||--o| sys_roles : "继承自"
sys_organizations ||--o| sys_organizations : "隶属于"
sys_permissions ||--o| sys_permissions : "包含"
sys_dict_items ||--o| sys_dict_items : "子项"
sys_dict_types ||--o| sys_dict_types : "包含"
```
## 3. 表结构详细设计
### 3.1 用户表 (sys_users)
用户系统的核心表,存储用户基本信息和认证信息。
```sql
-- 表结构
CREATE TABLE `sys_users` (
`id` BIGINT NOT NULL COMMENT '主键雪花ID',
`username` VARCHAR(50) NOT NULL COMMENT '用户名,唯一',
`email` VARCHAR(100) NOT NULL COMMENT '邮箱,唯一',
`mobile` VARCHAR(20) NULL COMMENT '手机号',
`password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希值',
`avatar` VARCHAR(255) NULL COMMENT '头像URL',
`nickname` VARCHAR(100) NULL COMMENT '昵称',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态active-正常,inactive-未激活,locked-锁定,disabled-禁用',
`gender` TINYINT NULL DEFAULT 0 COMMENT '性别0-未知,1-男,2-女',
`birthday` DATE NULL COMMENT '生日',
`bio` VARCHAR(500) NULL COMMENT '个人简介',
`login_count` INT NOT NULL DEFAULT 0 COMMENT '登录次数',
`last_login_at` DATETIME NULL COMMENT '最后登录时间',
`last_login_ip` VARCHAR(45) NULL COMMENT '最后登录IP',
`failed_attempts` INT NOT NULL DEFAULT 0 COMMENT '连续失败尝试次数',
`locked_until` DATETIME NULL COMMENT '锁定截止时间',
`is_root` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否超级管理员',
`extra` JSON NULL COMMENT '扩展信息JSON格式',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` BIGINT NULL COMMENT '更新人ID',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NULL COMMENT '删除时间,软删除标记',
`version` INT NOT NULL DEFAULT 1 COMMENT '乐观锁版本号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 索引设计
CREATE UNIQUE INDEX `uk_username` ON `sys_users` (`username`, `deleted_at`);
CREATE UNIQUE INDEX `uk_email` ON `sys_users` (`email`, `deleted_at`);
CREATE INDEX `idx_mobile` ON `sys_users` (`mobile`);
CREATE INDEX `idx_status` ON `sys_users` (`status`);
CREATE INDEX `idx_created_at` ON `sys_users` (`created_at`);
CREATE INDEX `idx_deleted_at` ON `sys_users` (`deleted_at`);
CREATE INDEX `idx_is_root` ON `sys_users` (`is_root`);
CREATE INDEX `idx_last_login` ON `sys_users` (`last_login_at`);
```
### 3.2 角色表 (sys_roles)
支持树形结构的角色管理表,实现角色继承。
```sql
-- 表结构
CREATE TABLE `sys_roles` (
`id` BIGINT NOT NULL COMMENT '主键',
`code` VARCHAR(50) NOT NULL COMMENT '角色代码,唯一',
`name` VARCHAR(100) NOT NULL COMMENT '角色名称',
`description` TEXT NULL COMMENT '角色描述',
`pid` BIGINT NULL DEFAULT 0 COMMENT '父角色ID0表示顶级',
`path` VARCHAR(500) NULL COMMENT '层级路径,如:/1/2/3/',
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '同级排序号',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态active-启用,inactive-禁用',
`is_system` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否系统内置角色',
`permissions_snapshot` JSON NULL COMMENT '权限快照,用于优化查询',
`extra` JSON NULL COMMENT '扩展信息',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` BIGINT NULL COMMENT '更新人ID',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NULL COMMENT '删除时间',
`version` INT NOT NULL DEFAULT 1 COMMENT '版本号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- 索引设计
CREATE UNIQUE INDEX `uk_code` ON `sys_roles` (`code`, `deleted_at`);
CREATE INDEX `idx_name` ON `sys_roles` (`name`);
CREATE INDEX `idx_pid` ON `sys_roles` (`pid`);
CREATE INDEX `idx_path` ON `sys_roles` (`path`);
CREATE INDEX `idx_status` ON `sys_roles` (`status`);
CREATE INDEX `idx_deleted_at` ON `sys_roles` (`deleted_at`);
CREATE INDEX `idx_is_system` ON `sys_roles` (`is_system`);
CREATE INDEX `idx_sort` ON `sys_roles` (`pid`, `sort_order`);
```
### 3.3 权限表 (sys_permissions)
细粒度的权限定义表,支持多种权限类型。
```sql
-- 表结构
CREATE TABLE `sys_permissions` (
`id` BIGINT NOT NULL COMMENT '主键',
`code` VARCHAR(100) NOT NULL COMMENT '权限代码,唯一',
`name` VARCHAR(100) NOT NULL COMMENT '权限名称',
`type` VARCHAR(20) NOT NULL COMMENT '权限类型menu-菜单,button-按钮,api-接口,data-数据',
`resource` VARCHAR(50) NULL COMMENT '资源标识user,role,post',
`action` VARCHAR(50) NULL COMMENT '操作标识read,create,update,delete',
`description` TEXT NULL COMMENT '权限描述',
`pid` BIGINT NULL DEFAULT 0 COMMENT '父权限ID',
`path` VARCHAR(500) NULL COMMENT '层级路径',
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
`meta` JSON NULL COMMENT '元数据,如:图标、路由等',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` BIGINT NULL COMMENT '更新人ID',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';
-- 索引设计
CREATE UNIQUE INDEX `uk_code` ON `sys_permissions` (`code`, `deleted_at`);
CREATE INDEX `idx_type` ON `sys_permissions` (`type`);
CREATE INDEX `idx_resource_action` ON `sys_permissions` (`resource`, `action`);
CREATE INDEX `idx_pid` ON `sys_permissions` (`pid`);
CREATE INDEX `idx_deleted_at` ON `sys_permissions` (`deleted_at`);
CREATE INDEX `idx_status` ON `sys_permissions` (`status`);
CREATE INDEX `idx_sort` ON `sys_permissions` (`pid`, `sort_order`);
```
### 3.4 组织架构表 (sys_organizations)
支持多级组织结构,用于用户归属管理。
```sql
-- 表结构
CREATE TABLE `sys_organizations` (
`id` BIGINT NOT NULL COMMENT '主键',
`code` VARCHAR(100) NOT NULL COMMENT '组织代码,唯一',
`name` VARCHAR(200) NOT NULL COMMENT '组织名称',
`full_name` VARCHAR(200) NULL COMMENT '组织全称',
`description` TEXT NULL COMMENT '组织描述',
`pid` BIGINT NULL DEFAULT 0 COMMENT '父组织ID',
`path` VARCHAR(500) NULL COMMENT '层级路径',
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
`type` VARCHAR(20) NULL COMMENT '组织类型company,department,team',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`leader_id` BIGINT NULL COMMENT '负责人ID',
`address` VARCHAR(200) NULL COMMENT '地址',
`phone` VARCHAR(50) NULL COMMENT '联系电话',
`extra` JSON NULL COMMENT '扩展信息',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` BIGINT NULL COMMENT '更新人ID',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NULL COMMENT '删除时间',
`version` INT NOT NULL DEFAULT 1 COMMENT '版本号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='组织架构表';
-- 索引设计
CREATE UNIQUE INDEX `uk_code` ON `sys_organizations` (`code`, `deleted_at`);
CREATE INDEX `idx_name` ON `sys_organizations` (`name`);
CREATE INDEX `idx_pid` ON `sys_organizations` (`pid`);
CREATE INDEX `idx_path` ON `sys_organizations` (`path`);
CREATE INDEX `idx_type` ON `sys_organizations` (`type`);
CREATE INDEX `idx_leader_id` ON `sys_organizations` (`leader_id`);
CREATE INDEX `idx_deleted_at` ON `sys_organizations` (`deleted_at`);
CREATE INDEX `idx_status` ON `sys_organizations` (`status`);
CREATE INDEX `idx_sort` ON `sys_organizations` (`pid`, `sort_order`);
```
### 3.5 字典类型表 (sys_dict_types)
管理系统中的各类数据字典,支持树形结构。
```sql
-- 表结构
CREATE TABLE `sys_dict_types` (
`id` BIGINT NOT NULL COMMENT '主键',
`code` VARCHAR(50) NOT NULL COMMENT '字典类型代码,唯一',
`name` VARCHAR(100) NOT NULL COMMENT '字典类型名称',
`description` TEXT NULL COMMENT '描述',
`pid` BIGINT NULL DEFAULT 0 COMMENT '父字典类型ID支持字典分类',
`path` VARCHAR(500) NULL COMMENT '层级路径',
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态active-启用,inactive-禁用',
`is_system` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否系统内置',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` BIGINT NULL COMMENT '更新人ID',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典类型表';
-- 索引设计
CREATE UNIQUE INDEX `uk_code` ON `sys_dict_types` (`code`, `deleted_at`);
CREATE INDEX `idx_name` ON `sys_dict_types` (`name`);
CREATE INDEX `idx_pid` ON `sys_dict_types` (`pid`);
CREATE INDEX `idx_path` ON `sys_dict_types` (`path`);
CREATE INDEX `idx_status` ON `sys_dict_types` (`status`);
CREATE INDEX `idx_deleted_at` ON `sys_dict_types` (`deleted_at`);
CREATE INDEX `idx_is_system` ON `sys_dict_types` (`is_system`);
CREATE INDEX `idx_sort` ON `sys_dict_types` (`pid`, `sort_order`);
```
### 3.6 字典项表 (sys_dict_items)
存储具体的字典数据,支持树形结构。
```sql
-- 表结构
CREATE TABLE `sys_dict_items` (
`id` BIGINT NOT NULL COMMENT '主键',
`type_id` BIGINT NOT NULL COMMENT '字典类型ID',
`item_key` VARCHAR(50) NOT NULL COMMENT '字典项键',
`item_value` VARCHAR(200) NOT NULL COMMENT '字典项值',
`label` VARCHAR(100) NOT NULL COMMENT '显示标签',
`label_en` VARCHAR(200) NULL COMMENT '英文标签',
`description` TEXT NULL COMMENT '描述',
`pid` BIGINT NULL DEFAULT 0 COMMENT '父字典项ID支持树形字典',
`path` VARCHAR(500) NULL COMMENT '层级路径',
`level` INT NOT NULL DEFAULT 1 COMMENT '层级深度',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
`css_class` VARCHAR(50) NULL COMMENT 'CSS样式类',
`color` VARCHAR(50) NULL COMMENT '颜色值,如:#FF0000',
`extra` JSON NULL COMMENT '扩展属性',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_by` BIGINT NULL COMMENT '更新人ID',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` DATETIME NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='字典项表';
-- 索引设计
CREATE UNIQUE INDEX `uk_type_key` ON `sys_dict_items` (`type_id`, `item_key`, `deleted_at`);
CREATE INDEX `idx_type_id` ON `sys_dict_items` (`type_id`);
CREATE INDEX `idx_pid` ON `sys_dict_items` (`pid`);
CREATE INDEX `idx_status` ON `sys_dict_items` (`status`);
CREATE INDEX `idx_deleted_at` ON `sys_dict_items` (`deleted_at`);
CREATE INDEX `idx_sort` ON `sys_dict_items` (`type_id`, `sort_order`);
CREATE INDEX `idx_key` ON `sys_dict_items` (`item_key`);
```
### 3.7 标签表 (sys_tags)
灵活的标签系统,可用于用户、内容等多种场景。
```sql
-- 表结构
CREATE TABLE `sys_tags` (
`id` BIGINT NOT NULL COMMENT '主键',
`name` VARCHAR(50) NOT NULL COMMENT '标签名称',
`type` VARCHAR(50) NULL DEFAULT 'user' COMMENT '标签类型user-用户标签,role-角色标签,content-内容标签',
`color` VARCHAR(50) NULL COMMENT '标签颜色,如:#FF0000',
`description` TEXT NULL COMMENT '描述',
`usage_count` INT NOT NULL DEFAULT 0 COMMENT '使用次数统计',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`deleted_at` DATETIME NULL COMMENT '删除时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='标签表';
-- 索引设计
CREATE UNIQUE INDEX `uk_name_type` ON `sys_tags` (`name`, `type`, `deleted_at`);
CREATE INDEX `idx_type` ON `sys_tags` (`type`);
CREATE INDEX `idx_usage_count` ON `sys_tags` (`usage_count` DESC);
CREATE INDEX `idx_deleted_at` ON `sys_tags` (`deleted_at`);
CREATE INDEX `idx_name` ON `sys_tags` (`name`);
```
### 3.8 用户角色关联表 (sys_user_roles)
```sql
-- 表结构
CREATE TABLE `sys_user_roles` (
`id` BIGINT NOT NULL COMMENT '主键',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`role_id` BIGINT NOT NULL COMMENT '角色ID',
`expired_at` DATETIME NULL COMMENT '过期时间NULL表示永久',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';
-- 索引设计
CREATE UNIQUE INDEX `uk_user_role` ON `sys_user_roles` (`user_id`, `role_id`);
CREATE INDEX `idx_user_id` ON `sys_user_roles` (`user_id`);
CREATE INDEX `idx_role_id` ON `sys_user_roles` (`role_id`);
CREATE INDEX `idx_expired_at` ON `sys_user_roles` (`expired_at`);
CREATE INDEX `idx_created_at` ON `sys_user_roles` (`created_at`);
```
### 3.9 角色权限关联表 (sys_role_permissions)
```sql
-- 表结构
CREATE TABLE `sys_role_permissions` (
`id` BIGINT NOT NULL COMMENT '主键',
`role_id` BIGINT NOT NULL COMMENT '角色ID',
`permission_id` BIGINT NOT NULL COMMENT '权限ID',
`is_half` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否半选状态(树形权限)',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限关联表';
-- 索引设计
CREATE UNIQUE INDEX `uk_role_permission` ON `sys_role_permissions` (`role_id`, `permission_id`);
CREATE INDEX `idx_role_id` ON `sys_role_permissions` (`role_id`);
CREATE INDEX `idx_permission_id` ON `sys_role_permissions` (`permission_id`);
CREATE INDEX `idx_is_half` ON `sys_role_permissions` (`is_half`);
```
### 3.10 用户组织关联表 (sys_user_organizations)
```sql
-- 表结构
CREATE TABLE `sys_user_organizations` (
`id` BIGINT NOT NULL COMMENT '主键',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`organization_id` BIGINT NOT NULL COMMENT '组织ID',
`is_primary` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否主组织',
`position` VARCHAR(100) NULL COMMENT '职位',
`joined_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户组织关联表';
-- 索引设计
CREATE UNIQUE INDEX `uk_user_org` ON `sys_user_organizations` (`user_id`, `organization_id`);
CREATE INDEX `idx_user_id` ON `sys_user_organizations` (`user_id`);
CREATE INDEX `idx_organization_id` ON `sys_user_organizations` (`organization_id`);
CREATE INDEX `idx_is_primary` ON `sys_user_organizations` (`is_primary`);
CREATE INDEX `idx_joined_at` ON `sys_user_organizations` (`joined_at`);
```
### 3.11 用户标签关联表 (sys_user_tags)
```sql
-- 表结构
CREATE TABLE `sys_user_tags` (
`id` BIGINT NOT NULL COMMENT '主键',
`user_id` BIGINT NOT NULL COMMENT '用户ID',
`tag_id` BIGINT NOT NULL COMMENT '标签ID',
`created_by` BIGINT NULL COMMENT '创建人ID',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户标签关联表';
-- 索引设计
CREATE UNIQUE INDEX `uk_user_tag` ON `sys_user_tags` (`user_id`, `tag_id`);
CREATE INDEX `idx_user_id` ON `sys_user_tags` (`user_id`);
CREATE INDEX `idx_tag_id` ON `sys_user_tags` (`tag_id`);
CREATE INDEX `idx_created_at` ON `sys_user_tags` (`created_at`);
```
### 3.12 操作日志表 (sys_operation_logs)
记录所有重要操作,用于审计和问题追踪。
```sql
-- 表结构
CREATE TABLE `sys_operation_logs` (
`id` BIGINT NOT NULL COMMENT '主键',
`user_id` BIGINT NULL COMMENT '操作用户ID',
`username` VARCHAR(100) NULL COMMENT '操作用户名',
`module` VARCHAR(50) NOT NULL COMMENT '操作模块',
`action` VARCHAR(50) NOT NULL COMMENT '操作类型',
`target` VARCHAR(200) NULL COMMENT '操作对象描述',
`target_id` BIGINT NULL COMMENT '操作对象ID',
`request_data` TEXT NULL COMMENT '请求数据',
`response_data` TEXT NULL COMMENT '响应数据',
`status` VARCHAR(20) NOT NULL COMMENT '操作状态success-成功,fail-失败',
`ip` VARCHAR(45) NULL COMMENT 'IP地址',
`user_agent` VARCHAR(200) NULL COMMENT '用户代理',
`duration` BIGINT NULL COMMENT '操作耗时(毫秒)',
`error_msg` TEXT NULL COMMENT '错误信息',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';
-- 索引设计
CREATE INDEX `idx_user_id` ON `sys_operation_logs` (`user_id`);
CREATE INDEX `idx_module_action` ON `sys_operation_logs` (`module`, `action`);
CREATE INDEX `idx_target` ON `sys_operation_logs` (`target_id`);
CREATE INDEX `idx_status` ON `sys_operation_logs` (`status`);
CREATE INDEX `idx_created_at` ON `sys_operation_logs` (`created_at`);
CREATE INDEX `idx_ip` ON `sys_operation_logs` (`ip`);
-- 分区建议:按月分区
ALTER TABLE `sys_operation_logs` PARTITION BY RANGE (YEAR(created_at) * 100 + MONTH(created_at)) (
PARTITION p202401 VALUES LESS THAN (202402),
PARTITION p202402 VALUES LESS THAN (202403),
-- 继续添加更多分区...
PARTITION p_future VALUES LESS THAN MAXVALUE
);
```
## 4. 设计特点说明
### 4.1 软删除机制
- 所有业务表都包含 `deleted_at` 字段
- 删除操作只更新 `deleted_at` 为当前时间
- 唯一索引都包含 `deleted_at`,确保已删除数据不影响唯一性
- 查询时默认过滤 `deleted_at IS NULL`
- 提供回收站功能,可恢复误删数据
### 4.2 树形结构支持
- 使用 `pid` 存储父节点ID0或NULL表示顶级节点
- `path` 字段存储完整路径(如:/1/2/3/),便于查询所有子节点
- `level` 记录层级深度,优化层级查询
- 支持无限层级嵌套
- 提供递归查询的存储过程优化性能
### 4.3 审计追踪
- 所有表包含 `created_by`、`created_at`、`updated_by`、`updated_at`
- 重要操作记录到 `sys_operation_logs`
- 支持数据变更历史追踪
- 可配置敏感操作的详细日志记录
### 4.4 性能优化
- 合理的索引设计,覆盖常用查询场景
- 使用JSON字段存储扩展信息减少表结构变更
- 权限快照机制,避免复杂的联表查询
- 日志表按月分区,提高查询效率
- 高频查询数据缓存到Redis
### 4.5 扩展性设计
- 预留 `extra` JSON字段支持灵活扩展
- 版本号字段支持乐观锁
- 标签系统支持多种业务场景
- 字典系统支持动态配置
- 支持插件化扩展新功能
### 4.6 数据完整性
- 虽然不使用外键,但通过应用层保证引用完整性
- 删除操作需级联处理关联数据
- 使用事务保证操作原子性
- 定期数据一致性检查任务
### 4.7 安全性设计
- 密码使用bcrypt算法加密成本因子不低于12
- 登录失败次数限制,防止暴力破解
- 操作日志记录IP和UserAgent便于审计
- 敏感数据(如手机号)部分存储时脱敏
- SQL注入防护通过参数化查询实现
## 5. 初始化数据
### 5.1 系统初始用户
```sql
-- 创建root超级管理员
INSERT INTO `sys_users` (`id`, `username`, `email`, `password_hash`, `nickname`, `is_root`, `status`)
VALUES (1, 'root', 'root@system.local', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewYpfQaXUIkRrPJK', '超级管理员', TRUE, 'active');
-- 创建系统管理员
INSERT INTO `sys_users` (`id`, `username`, `email`, `password_hash`, `nickname`, `status`)
VALUES (2, 'admin', 'admin@system.local', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewYpfQaXUIkRrPJK', '系统管理员', 'active');
```
### 5.2 系统初始角色
```sql
-- 超级管理员角色
INSERT INTO `sys_roles` (`id`, `code`, `name`, `description`, `is_system`, `status`)
VALUES (1, 'super_admin', '超级管理员', '拥有系统所有权限', TRUE, 'active');
-- 系统管理员角色
INSERT INTO `sys_roles` (`id`, `code`, `name`, `description`, `is_system`, `status`, `pid`, `path`, `level`)
VALUES (2, 'admin', '系统管理员', '负责系统配置和用户管理', TRUE, 'active', 1, '/1/2/', 2);
-- 普通用户角色
INSERT INTO `sys_roles` (`id`, `code`, `name`, `description`, `is_system`, `status`)
VALUES (3, 'user', '普通用户', '普通注册用户默认角色', TRUE, 'active');
-- 分配角色
INSERT INTO `sys_user_roles` (`user_id`, `role_id`) VALUES (1, 1);
INSERT INTO `sys_user_roles` (`user_id`, `role_id`) VALUES (2, 2);
```
### 5.3 基础字典数据
```sql
-- 字典分类
INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`) VALUES
(1, 'system', '系统字典', TRUE),
(2, 'business', '业务字典', TRUE);
-- 用户状态字典
INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
(10, 'user_status', '用户状态', TRUE, 1, '/1/10/');
INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `color`, `sort_order`) VALUES
(10, 'active', 'active', '正常', '#52c41a', 1),
(10, 'inactive', 'inactive', '未激活', '#faad14', 2),
(10, 'locked', 'locked', '锁定', '#ff4d4f', 3),
(10, 'disabled', 'disabled', '禁用', '#d9d9d9', 4);
-- 组织类型字典
INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
(11, 'org_type', '组织类型', TRUE, 1, '/1/11/');
INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
(11, 'company', 'company', '公司', 1),
(11, 'department', 'department', '部门', 2),
(11, 'team', 'team', '团队', 3),
(11, 'group', 'group', '小组', 4);
-- 性别字典
INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
(12, 'gender', '性别', TRUE, 1, '/1/12/');
INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
(12, '0', '0', '未知', 1),
(12, '1', '1', '男', 2),
(12, '2', '2', '女', 3);
-- 权限类型字典
INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
(13, 'permission_type', '权限类型', TRUE, 1, '/1/13/');
INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `color`, `sort_order`) VALUES
(13, 'menu', 'menu', '菜单', '#1890ff', 1),
(13, 'button', 'button', '按钮', '#52c41a', 2),
(13, 'api', 'api', '接口', '#fa8c16', 3),
(13, 'data', 'data', '数据', '#722ed1', 4);
-- 标签类型字典
INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
(14, 'tag_type', '标签类型', TRUE, 1, '/1/14/');
INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
(14, 'user', 'user', '用户标签', 1),
(14, 'role', 'role', '角色标签', 2),
(14, 'content', 'content', '内容标签', 3);
-- 地区字典(示例)
INSERT INTO `sys_dict_types` (`id`, `code`, `name`, `is_system`, `pid`, `path`) VALUES
(20, 'region', '地区', TRUE, 2, '/2/20/');
INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `sort_order`) VALUES
(20, 'CN', 'CN', '中国', 1);
INSERT INTO `sys_dict_items` (`type_id`, `item_key`, `item_value`, `label`, `pid`, `path`, `sort_order`) VALUES
(20, 'CN_BJ', 'CN_BJ', '北京', (SELECT id FROM sys_dict_items WHERE item_key = 'CN'), NULL, 1),
(20, 'CN_SH', 'CN_SH', '上海', (SELECT id FROM sys_dict_items WHERE item_key = 'CN'), NULL, 2);
```
### 5.4 基础权限数据
```sql
-- 系统管理权限
INSERT INTO `sys_permissions` (`id`, `code`, `name`, `type`, `resource`, `action`) VALUES
(1, 'system:manage', '系统管理', 'menu', 'system', 'manage'),
(2, 'user:read', '查看用户', 'api', 'user', 'read'),
(3, 'user:create', '创建用户', 'api', 'user', 'create'),
(4, 'user:update', '更新用户', 'api', 'user', 'update'),
(5, 'user:delete', '删除用户', 'api', 'user', 'delete'),
(6, 'role:read', '查看角色', 'api', 'role', 'read'),
(7, 'role:create', '创建角色', 'api', 'role', 'create'),
(8, 'role:update', '更新角色', 'api', 'role', 'update'),
(9, 'role:delete', '删除角色', 'api', 'role', 'delete');
-- 为超级管理员角色分配所有权限
INSERT INTO `sys_role_permissions` (`role_id`, `permission_id`)
SELECT 1, id FROM `sys_permissions`;
```
### 5.5 初始组织架构
```sql
-- 创建顶级组织
INSERT INTO `sys_organizations` (`id`, `code`, `name`, `type`, `status`) VALUES
(1, 'ROOT', '星撰集团', 'company', 'active');
-- 创建部门
INSERT INTO `sys_organizations` (`id`, `code`, `name`, `type`, `pid`, `path`, `level`, `status`) VALUES
(2, 'TECH', '技术部', 'department', 1, '/1/2/', 2, 'active'),
(3, 'PRODUCT', '产品部', 'department', 1, '/1/3/', 2, 'active'),
(4, 'OPERATE', '运营部', 'department', 1, '/1/4/', 2, 'active');
```
### 5.6 示例标签数据
```sql
-- 用户标签
INSERT INTO `sys_tags` (`name`, `type`, `color`, `description`) VALUES
('VIP', 'user', '#ff4d4f', 'VIP用户'),
('活跃用户', 'user', '#52c41a', '经常登录的用户'),
('内容创作者', 'user', '#1890ff', '发布优质内容的用户'),
('新用户', 'user', '#faad14', '注册不满30天的用户');
-- 角色标签
INSERT INTO `sys_tags` (`name`, `type`, `color`, `description`) VALUES
('核心角色', 'role', '#ff4d4f', '系统核心角色'),
('业务角色', 'role', '#1890ff', '业务相关角色');
```
## 6. 注意事项
1. **ID生成策略**建议使用雪花算法生成分布式ID避免自增ID的局限性
2. **密码存储**必须使用bcrypt或类似的强哈希算法成本因子不低于12
3. **并发控制**使用version字段实现乐观锁防止并发更新冲突
4. **查询优化**对于树形结构的查询优先使用path字段而非递归查询
5. **数据归档**:日志表建议定期归档,避免单表数据量过大
6. **缓存策略**权限、字典等数据变更不频繁建议缓存到Redis
7. **批量操作**大批量数据操作时使用批量SQL避免循环单条执行
8. **索引维护**:定期分析索引使用情况,删除无用索引,优化查询性能
## 7. 性能优化建议
### 7.1 查询优化
- 使用覆盖索引减少回表查询
- 合理使用联合索引,注意索引顺序
- 避免在WHERE子句中对字段进行函数操作
- 使用EXPLAIN分析SQL执行计划
### 7.2 树形结构查询优化
```sql
-- 查询所有子节点使用path
SELECT * FROM sys_roles WHERE path LIKE '/1/2/%' AND deleted_at IS NULL;
-- 查询直接子节点
SELECT * FROM sys_roles WHERE pid = 2 AND deleted_at IS NULL ORDER BY sort_order;
-- 递归查询所有子节点MySQL 8.0+
WITH RECURSIVE role_tree AS (
SELECT * FROM sys_roles WHERE id = 1
UNION ALL
SELECT r.* FROM sys_roles r
INNER JOIN role_tree rt ON r.pid = rt.id
)
SELECT * FROM role_tree;
```
### 7.3 权限查询优化
```sql
-- 使用权限快照避免多表联查
SELECT permissions_snapshot FROM sys_roles WHERE id = ?;
-- 获取用户所有权限(包括角色继承)
SELECT DISTINCT p.*
FROM sys_permissions p
JOIN sys_role_permissions rp ON p.id = rp.permission_id
JOIN sys_user_roles ur ON rp.role_id = ur.role_id
WHERE ur.user_id = ?
AND ur.expired_at IS NULL OR ur.expired_at > NOW()
AND p.deleted_at IS NULL;
```
## 8. 后续扩展建议
1. **多租户支持**预留tenant_id字段支持SaaS化部署
2. **数据权限**:扩展权限表,支持行级数据权限控制
3. **审批流程**:增加工作流相关表,支持复杂的审批场景
4. **消息通知**:增加消息表,支持站内信、邮件、短信等通知
5. **登录日志**:独立的登录日志表,记录所有登录尝试
6. **配置管理**:系统配置表,支持动态配置管理
7. **定时任务**:任务调度表,支持定时任务管理
8. **数据字典缓存**:实现字典数据的多级缓存机制
## 9. 安全建议
1. **SQL注入防护**使用参数化查询避免拼接SQL
2. **XSS防护**:对用户输入进行转义处理
3. **CSRF防护**使用Token机制防止跨站请求伪造
4. **敏感数据加密**:对敏感字段进行加密存储
5. **访问控制**:实施最小权限原则
6. **审计日志**:记录所有敏感操作
7. **数据备份**:定期备份,异地容灾
8. **安全扫描**:定期进行安全漏洞扫描

View File

@ -0,0 +1,249 @@
# M2 - 基础用户系统 - 详细设计 (V2)
---
## 1. 引言
### 1.1. 文档目的
本文档是 "M2 - 基础用户系统" 阶段的 **V2 修订版**旨在提供一份详尽、准确、可直接用于开发的技术设计方案。V2 版根据反馈进行了全面重构重点增强了数据库设计的合理性、API定义的完整性并补充了关键的 `root` 用户机制和标签功能。
### 1.2. 模块范围
本设计覆盖功能点包括:
- 用户认证(注册、登录)及 `root` 超级管理员机制。
- 用户、角色、权限、组织、字典的CRUD管理支持层级结构。
- 用户标签系统。
- 基于角色的访问控制RBAC的实现。
---
## 2. 数据库设计 (Revised)
### 2.1. E-R 图 (Entity-Relationship Diagram)
*已更新,包含标签和重构后的字典表*
```mermaid
erDiagram
users {
bigint id PK
varchar(50) username UK
varchar(255) email UK
varchar(255) password_hash
varchar(20) status
datetime created_at
datetime updated_at
}
roles {
bigint id PK
varchar(50) name UK
text description
bigint parent_id FK "nullable, self-ref"
datetime created_at
datetime updated_at
}
permissions {
bigint id PK
varchar(50) action UK
varchar(50) resource UK
text description
}
organizations {
bigint id PK
varchar(100) name
text description
bigint parent_id FK "nullable, self-ref"
datetime created_at
datetime updated_at
}
dictionary_types {
bigint id PK
varchar(50) type_name UK
text description
}
dictionary_items {
bigint id PK
bigint type_id FK
varchar(50) `key`
varchar(255) value
int sort_order
}
tags {
bigint id PK
varchar(50) name UK
}
users ||--o{ user_roles : "has"
roles ||--o{ user_roles : "assigned to"
roles ||--o{ role_permissions : "has"
permissions ||--o{ role_permissions : "granted to"
users ||--o{ user_organizations : "belongs to"
organizations ||--o{ user_organizations : "has"
users ||--o{ user_tags : "has"
tags ||--o{ user_tags : "applied to"
dictionary_types ||--o{ dictionary_items : "has"
roles }o..o| roles : "is child of"
organizations }o..o| organizations : "is child of"
user_roles { bigint user_id PK,FK; bigint role_id PK,FK }
role_permissions { bigint role_id PK,FK; bigint permission_id PK,FK }
user_organizations { bigint user_id PK,FK; bigint organization_id PK,FK }
user_tags { bigint user_id PK,FK; bigint tag_id PK,FK }
```
### 2.2. 表结构定义
#### `roles` / `organizations`
- **`parent_id`**: `BIGINT NULL`, `FOREIGN KEY (parent_id) REFERENCES roles(id) ON DELETE SET NULL`。此字段用于实现树形层级结构。值为`NULL`表示为顶级角色/组织。
#### `dictionary_types` - 字典类型表
| 字段名 | 类型 | 约束 | 描述 |
|---------------|---------------|---------------------|----------------------|
| `id` | `BIGINT` | `PK`, `AI` | 类型唯一ID |
| `type_name` | `VARCHAR(50)` | `UNIQUE`, `NOT NULL`| 字典类型名(如: `user_status` |
| `description` | `TEXT` | | 类型描述 |
#### `dictionary_items` - 字典条目表
| 字段名 | 类型 | 约束 | 描述 |
|---------------|----------------|----------------------|----------------------|
| `id` | `BIGINT` | `PK`, `AI` | 条目唯一ID |
| `type_id` | `BIGINT` | `NOT NULL`, `FK` | 关联到`dictionary_types.id` |
| `key` | `VARCHAR(50)` | `NOT NULL` | 键 (程序中使用) |
| `value` | `VARCHAR(255)` | `NOT NULL` | 值 (UI中显示) |
| `sort_order` | `INT` | `DEFAULT 0` | 排序字段 |
*复合唯一键: `(type_id, key)`*
#### `tags` - 标签表
| 字段名 | 类型 | 约束 | 描述 |
|--------|---------------|---------------------|------------|
| `id` | `BIGINT` | `PK`, `AI` | 标签唯一ID |
| `name` | `VARCHAR(50)` | `UNIQUE`, `NOT NULL`| 标签名 |
#### `user_tags` - 用户标签关联表
| 字段名 | 类型 | 约束 | 描述 |
|-----------|----------|----------|------------|
| `user_id` | `BIGINT` | `PK`, `FK` | 关联用户ID |
| `tag_id` | `BIGINT` | `PK`, `FK` | 关联标签ID |
---
## 3. Root 用户与系统初始化
- **`root` 用户**:
- `root` 是一个特殊的超级管理员账户,拥有系统中所有权限。
- 此账户 **不可通过 API 创建或删除**。它应在系统首次部署时,通过数据库 **Seeding (种子填充) 脚本** 创建。
- `root` 用户的角色是固定的(如 `super_admin`),此角色同样通过 Seeding 创建,并关联所有已定义的权限。
- 任何权限校验逻辑都必须对 `root` 用户或 `super_admin` 角色开绿灯。任何API都不能降低 `root` 的权限或删除该用户。
---
## 4. API 接口设计 (Detailed)
**Base URL**: `/api/v1`
**通用错误响应结构**:
```json
{
"code": 40001, // 详细业务错误码
"message": "Validation failed: username must be at least 3 characters.",
"data": null
}
```
### 3.1. Auth - 认证接口 (`/auth`)
#### `POST /register` - 用户注册
- **权限**: Public
- **请求体 (`application/json`)**:
| 名称 | 类型 | 必填 | 校验规则 | 描述 |
|------------|--------|------|----------------------------------------------------|----------------|
| `username` | string | 是 | min:3, max:50, 字母/数字/下划线组合 | 用户名 |
| `email` | string | 是 | valid email format | 邮箱地址 |
| `password` | string | 是 | min:8, max:100, 必须包含大小写字母和数字 | 密码 |
- **成功响应 (201 Created)**:
```json
{ "code": 0, "message": "User registered successfully.", "data": { "id": 1, "username": "newuser", "email": "..." } }
```
- **异常响应**:
| HTTP 码 | 业务码 | 原因 |
|---------|----------|----------------------------|
| 400 | 40001 | 请求参数不符合校验规则 |
| 409 | 40901 | 用户名或邮箱已被占用 |
#### `POST /login` - 用户登录
- **权限**: Public
- **请求体 (`application/json`)**:
| 名称 | 类型 | 必填 | 校验规则 | 描述 |
|------------|--------|------|------------------|------------------|
| `username` | string | 是 | - | 用户名或邮箱 |
| `password` | string | 是 | - | 密码 |
- **成功响应 (200 OK)**:
```json
{ "code": 0, "message": "Login successful.", "data": { "token": "ey..." } }
```
- **异常响应**:
| HTTP 码 | 业务码 | 原因 |
|---------|----------|--------------------------|
| 401 | 40101 | 用户名或密码错误 |
| 401 | 40102 | 账户被禁用或未激活 |
---
### 3.2. Users - 用户接口 (`/users`)
*除特殊说明外,均需认证*
#### `GET /me` - 获取当前用户信息
- **权限**: Authenticated
- **成功响应 (200 OK)**: `data` 包含当前用户详细信息、关联的角色和权限列表。
#### `GET /` - 获取用户列表
- **权限**: `read:users`
- **查询参数**:
| 名称 | 类型 | 必填 | 描述 |
|-----------|--------|------|------------------------------------|
| `page` | number | 否 | 页码, default 1 |
| `pageSize`| number | 否 | 每页数量, default 10 |
| `keyword` | string | 否 | 按用户名或邮箱模糊搜索 |
- **成功响应 (200 OK)**: `data` 包含 `items` (用户列表) 和 `pagination` (分页信息)。
#### `PUT /{userId}/status` - 更新用户状态
- **权限**: `update:user_status`
- **请求体**: `{ "status": "active" }` (status 必须是字典中 `user_status` 类型的值)
- **成功响应 (200 OK)**: 返回更新后的用户信息。
- **异常响应**:
| HTTP 码 | 业务码 | 原因 |
|---------|----------|--------------------------|
| 403 | 40301 | 试图修改 `root` 用户状态 |
| 404 | 40401 | 指定用户不存在 |
#### `POST /{userId}/tags` - 为用户打标签
- **权限**: `update:user_tags`
- **请求体**: `{ "tagIds": [1, 2, 3] }`
- **成功响应 (204 No Content)**.
---
### 3.3. Roles - 角色接口 (`/roles`)
*所有接口均需 `manage:roles` 权限*
#### `GET /` - 获取角色列表
- **描述**: 以树形结构返回所有角色。
- **成功响应 (200 OK)**: `data` 是一个包含 `children` 属性的树形数组。
#### `POST /` - 创建新角色
- **请求体**: `{ "name": "editor", "description": "...", "parentId": 1, "permissionIds": [101, 102] }`
- **成功响应 (201 Created)**: `data` 包含新创建的角色信息。
- **异常响应 (409 Conflict)**: 角色名已存在。
---
*其他模块Organizations, Dictionaries, Tags的API将遵循类似的详细设计模式提供完整的增删改查接口明确定义权限、请求体、校验规则和所有可能的成功/异常响应。*
# 补充说明
1. 你忽略了我在main.md中提到的root用户所以缺少一类集中管理的接口和机制请认真阅读
2. 接口设计太简陋了,太粗略了,需要把异常情况考虑进去,
3. 数据库设计完全无法满足需求没有pid如何实现层级结构
4. 字典确实,无法完成拓展任务
5. 标签功能呢
6. 接口参数范围,校验

65
prd/main.md Normal file
View File

@ -0,0 +1,65 @@
# 个人网站策划
## 前言
我想做一个个人博客网站需要有一下功能
1. 基本用户系统
- 字典,维护一些常用字典:地区省份、菜单类别、组织架构类别等,为以后其他功能开发提供可拓展的属性
- 角色,角色是树形结构,可以有标签、排序等功能
- 组织架构/用户组,是树形结构,用户可以在多个组织
- 用户标签,字典中维护的一些用户属性
- 权限,包括页面权限,接口权限和数据权限等,下级角色只能从上级角色已有的权限中分配
- 用户用户基础信息用户拓展信息用户创建注册通过邮箱注册可以限制错误登录次数也可以重置可以禁用用户注销用户找回密码修改个人信息最高管理员为root账户他能做所有事情
2. 笔记/博客系统
- 笔记结构是树形的,可以增加标签
- 笔记可以发布为博客,即设置为公开内容,博客是单独的内容,修改笔记不影响博客能容,但是有绑定关系,可以更新和重新发布
- 博客可以点赞、评论、收藏,也是层级结构,可以增加标签分类
- 内容有markdown、富文本、思维导图、画板结构通过关系型数据库存储内容可以通过其他数据库存储如mongodb、es等增强搜索性能可以嵌入文件等
- 对代码和编程友好
- 可以接入aimcp等将笔记作为知识库增强实用性
3. 个人空间
- 生活日志,分享照片、视频等
- 可以评论、收藏、分享、点赞
4. 阅读
- 可以上传自己下载的书,支持多种格式
- ai解读
- 评论、批注、分享
5. 工具
- 密码记录器(同步开发浏览器插件)
- 书签记录同步器(同步开发浏览器插件)
- bilibili收藏同步
- qq音乐、网易云音乐同步
- 文件管理nas、支持在线音视频播放、媒体文件预览
- 文件对传WEBRTC、P2P、阿里云OSS
- 热点新闻捕获
- 网页离线存储做成pdf

View File

@ -0,0 +1,455 @@
# 个人网站综合平台产品需求文档 (PRD)
## 引言/概述
### 项目背景
构建一个集成化的个人网站平台,涵盖内容创作、知识管理、生活记录、实用工具等多个维度,旨在打造一个功能完整、用户体验优秀的个人数字空间。
### 核心价值
- **知识管理中心**:统一管理个人笔记、博客、阅读内容
- **生活记录平台**:记录和分享个人生活点滴
- **实用工具集**:集成常用的个人效率工具
- **智能化体验**通过AI增强内容创作和知识检索
## 目标
### 主要目标
1. **建立完整的个人数字资产管理体系**
2. **提供便捷的内容创作和发布平台**
3. **构建实用的个人效率工具集**
4. **实现智能化的知识管理和检索**
### 可衡量目标
- 支持多种内容格式Markdown、富文本、思维导图、画板
- 实现秒级内容搜索响应
- 支持10+种实用工具集成
- 提供完整的权限管理体系
## 用户故事 (User Stories)
- **作为一名创作者**, 我希望能够在一个地方写笔记、画思维导图,并且能将它们无缝地整理成树状结构,方便我构建自己的知识体系。
- **作为一名博主**, 我希望可以一键将我精心撰写的笔记发布成一篇公开的博客,并且发布后对笔记的修改不会影响已发布的博客,除非我选择更新它。
- **作为一名普通用户**, 我希望能用我的邮箱快速注册一个账号,并且可以管理我的个人信息、重置密码,确保我的账户安全。
- **作为一名开发者**, 我希望有一个工具能帮我安全地记录各种网站的密码,并通过浏览器插件自动填充,还能同步我的书签,提升我的工作效率。
- **作为一名生活记录者**, 我希望能方便地上传照片和视频,以时间线的形式记录我的生活点滴,并能设置只对特定的人开放。
## 功能模块详述
### 1. 基础用户系统模块
#### 1.1 字典管理子系统
**功能描述**:维护系统中使用的各类数据字典
- **地区字典**:省份、城市、区县三级联动
- **分类字典**:菜单类别、标签类别、文件类型等
- **组织字典**:部门类型、角色类型、权限类型
- **状态字典**:用户状态、内容状态、审核状态等
- **扩展字典**:支持自定义字典类型
**验收标准**:
- 管理员可以增删改查字典类型和字典项。
- 系统关键状态(如用户禁用、启用)应与字典数据关联。
- 前端下拉框、选项等数据应能通过API动态获取字典。
#### 1.2 角色权限子系统
**功能描述**基于RBAC模型的权限管理体系
- **角色管理**
- 树形结构的角色层级
- 角色继承机制
- 角色标签和属性
- 角色排序和分组
- **权限管理**
- 页面访问权限
- 接口调用权限
- 数据访问权限(行级、字段级)
- 操作权限(增删改查)
- **权限分配**
- 下级角色只能分配上级已有权限
- 批量权限分配
- 权限模板机制
**验收标准**:
- Root管理员拥有所有权限且不可被修改。
- 角色创建时,其可分配的权限不能超过创建者拥有的权限。
- 用户访问未授权的页面或API时应返回403 Forbidden状态。
- 角色的树形结构应能正确地在前端展示和操作。
#### 1.3 组织架构子系统
**功能描述**:管理用户组织关系
- **组织结构**
- 树形组织架构
- 支持多级嵌套
- 组织属性和标签
- **用户归属**
- 用户可属于多个组织
- 主组织和辅助组织
- 组织内角色分配
**验收标准**:
- 用户可以被分配到多个组织节点下。
- 组织架构支持拖拽调整层级和顺序。
- 管理员可以根据组织架构筛选和管理用户。
#### 1.4 用户管理子系统
**功能描述**:完整的用户生命周期管理
- **用户注册**
- 邮箱注册验证
- 手机号注册(可选)
- 社交账号登录集成
- **用户认证**
- 密码登录
- 登录错误次数限制
- 账户锁定和解锁机制
- 双因子认证(可选)
- **用户信息**
- 基础信息:用户名、邮箱、手机、头像
- 扩展信息:个人简介、兴趣标签、社交链接
- 隐私设置:信息可见性控制
- **账户管理**
- 密码修改和重置
- 找回密码(邮箱/手机)
- 账户禁用和注销
- Root超级管理员
**验收标准**:
- 新用户注册后,系统需发送验证邮件,点击链接后方可激活账户。
- 用户连续5次输错密码后账户应被锁定30分钟。
- 用户可以随时修改自己的个人信息(除用户名外)。
- 注销功能需要用户二次确认,并告知数据将被永久删除。
### 2. 内容管理系统模块
#### 2.1 笔记管理子系统
**功能描述**:个人知识管理和笔记系统
- **笔记结构**
- 树形文件夹结构
- 无限层级嵌套
- 文件夹和笔记混合组织
- **内容格式**
- Markdown编辑器
- 富文本编辑器
- 思维导图工具
- 在线画板工具
- 代码片段高亮
- **笔记功能**
- 实时保存
- 版本历史
- 标签分类
- 全文搜索
- 笔记链接和引用
- 附件管理(图片、文档、音视频)
- **协作功能**
- 笔记分享(链接分享、权限控制)
- 协作编辑(可选)
- 评论和批注
**验收标准**:
- 笔记内容在编辑时应每隔30秒自动保存一次。
- 支持至少三级以上的树形目录结构。
- 全文搜索功能应能在1秒内返回标题或内容包含关键词的结果。
- 分享的笔记链接可以设置有效期和密码。
#### 2.2 博客发布子系统
**功能描述**:将笔记转化为公开博客
- **发布机制**
- 笔记一键发布为博客
- 博客独立存储(修改笔记不影响已发布博客)
- 绑定关系维护
- 重新发布和更新机制
- **博客管理**
- 发布状态管理(草稿、已发布、下线)
- SEO优化标题、描述、关键词
- 分类和标签
- 发布时间控制
- **互动功能**
- 点赞和收藏
- 评论系统(层级评论)
- 阅读量统计
- 分享功能
- **展示功能**
- 博客列表和详情页
- 分类和标签筛选
- 搜索功能
- RSS订阅
**验收标准**:
- 从笔记发布博客后,二者内容各自独立。
- 博客可以关联多个分类和标签。
- 未发布的博客(草稿)在公开列表不可见。
- 评论支持层级回复,并有新评论通知。
#### 2.3 AI集成子系统
**功能描述**AI增强的内容创作和知识管理
- **内容创作辅助**
- AI写作建议
- 文本润色和优化
- 自动摘要生成
- 关键词提取
- **知识库功能**
- 笔记内容向量化
- 智能检索和推荐
- 相关内容关联
- 问答系统
- **MCP集成**
- 多模态内容处理
- 代码理解和生成
- 图像识别和描述
### 3. 个人空间模块
#### 3.1 生活日志子系统
**功能描述**:记录和分享个人生活
- **内容类型**
- 文字日志
- 图片分享(支持多图)
- 视频分享
- 位置签到
- 心情记录
- **组织方式**
- 时间轴展示
- 分类管理
- 标签系统
- 重要程度标记
- **隐私控制**
- 公开/私密/好友可见
- 精细化权限控制
- 访客记录
#### 3.2 社交互动子系统
**功能描述**:与访客的互动功能
- **互动功能**
- 点赞系统
- 评论功能
- 收藏功能
- 分享功能
- **通知系统**
- 实时通知
- 消息聚合
- 邮件通知(可选)
### 4. 阅读管理模块
#### 4.1 电子书管理子系统
**功能描述**:个人电子书库管理
- **格式支持**
- PDF、EPUB、MOBI、TXT等
- 在线阅读器
- 进度同步
#### 4.2 阅读社区子系统
**功能描述**:阅读交流和分享
- **分享功能**
- 读书笔记分享
- 书评发布
- 阅读进度分享
### 5. 实用工具模块
#### 5.1 密码管理子系统
**功能描述**:个人密码安全管理
- **密码存储**
- 加密存储
- 分类管理
- 标签系统
- **浏览器插件**
- 自动填充
- 密码生成
- 同步功能
#### 5.2 书签同步子系统
**功能描述**:跨设备书签管理
- **同步功能**
- 浏览器书签导入/导出
- 实时同步
- 冲突解决
#### 5.3 第三方平台同步子系统
**功能描述**:整合各平台数据
- **Bilibili收藏同步**
- 收藏视频同步
- 分类管理
- 观看进度
#### 5.4 文件管理子系统
**功能描述**:个人云存储和媒体中心
- **存储功能**
- NAS集成
- 文件上传下载
- 文件夹管理
- 权限控制
- **媒体功能**
- 在线音视频播放
- 图片预览
- 文档在线查看
- **传输功能**
- WebRTC点对点传输
- 阿里云OSS集成
- 断点续传
#### 5.5 信息聚合子系统
**功能描述**:热点信息和内容聚合
- **新闻聚合**
- 多源新闻抓取
- 分类展示
- 关键词过滤
## 高阶数据模型概览 (High-Level Data Model)
此为概念模型,用于指导数据库设计,具体字段和关系将在详细设计阶段确定。
- **核心实体**:
- `User`: 存储用户信息 (id, username, email, password_hash)
- `Role`: 角色定义 (id, name, description)
- `Permission`: 权限定义 (id, action, resource)
- `Organization`: 组织架构 (id, name, parent_id)
- `Dictionary`: 数据字典 (id, type, key, value)
- `Note`: 笔记内容 (id, user_id, title, content, content_type, parent_id)
- `Post`: 博客文章 (id, user_id, source_note_id, title, content, status)
- `Tag`: 标签 (id, name)
- `Category`: 分类 (id, name)
- `Comment`: 评论 (id, post_id, user_id, content, parent_id)
- `File`: 文件管理 (id, user_id, file_name, path, type)
- `Bookmark`: 书签 (id, user_id, title, url)
- `Password`: 密码记录 (id, user_id, entry_name, username, encrypted_password)
- **关系**:
- `User` (多) <-> (多) `Role` (通过 `UserRole` 中间表)
- `Role` (多) <-> (多) `Permission` (通过 `RolePermission` 中间表)
- `User` (多) <-> (多) `Organization` (通过 `UserOrganization` 中间表)
- `Note` (一) -> (多) `Post`
- `Post` (多) <-> (多) `Tag` (通过 `PostTag` 中间表)
- `Post` (多) <-> (多) `Category` (通过 `PostCategory` 中间表)
- `Post` (一) -> (多) `Comment`
- `User` (一) -> (多) `Note`, `Post`, `File`, `Bookmark`, `Password`
## 关键用户交互流程 (Key User Flows)
### 流程一:新用户注册与激活
1. **访问首页**: 用户访问网站,点击"注册"按钮。
2. **填写信息**: 跳转至注册页面,要求输入用户名、邮箱和密码(密码需二次确认)。
3. **前端校验**: 实时校验用户名和邮箱是否已被占用,密码是否符合复杂度要求。
4. **提交注册**: 用户点击"注册",前端校验通过后,将数据发送至后端。
5. **后端处理**: 后端创建用户记录(状态为`inactive`生成验证Token并向用户邮箱发送一封包含激活链接含Token的邮件。
6. **用户激活**: 用户打开邮箱,点击激活链接。
7. **激活验证**: 后端验证Token有效性将用户状态更新为`active`,并引导用户至登录页面,提示"激活成功"。
### 流程二:从笔记到博客的发布
1. **创建笔记**: 用户在笔记系统中创建并编辑一篇笔记内容可以是Markdown、富文本等。
2. **发起发布**: 在笔记编辑页面,用户点击"发布为博客"按钮。
3. **配置博客信息**: 弹窗或新页面要求用户填写博客的URL slug、选择分类、添加标签、设置封面图等。
4. **确认发布**: 用户点击"确认发布"。
5. **后端处理**:
- 后端在`Posts`表中创建一条新记录。
- 复制当前版本的笔记内容到该`Post`记录中。
- 记录该`Post`与源`Note`的关联关系 (`source_note_id`)。
- 将博客状态设置为`published`。
6. **发布成功**: 系统提示"发布成功",并提供查看博客文章的链接。
7. **后续修改**: 用户后续在原笔记上的任何修改,都不会影响已发布的这篇博客文章。用户可在博客管理界面选择"从笔记更新内容"来同步最新修改。
## 技术架构需求
### 后端技术栈
- **框架**Elysia + Bun.js
- **数据库**MySQL (主) + Redis (缓存) + Elasticsearch (搜索)
- **对象存储**支持本地存储、阿里云OSS、自建NAS
- **消息队列**Redis/RabbitMQ处理异步任务
### 前端技术栈
- **Web端**Vue.js/React + TypeScript
- **移动端**PWA或React Native
- **浏览器插件**Manifest V3
### 基础设施
- **部署**Docker + Docker Compose
- **监控**:日志收集、性能监控、错误追踪
- **安全**HTTPS、数据加密、访问控制
### API设计原则
- **RESTful风格**: 使用标准的HTTP方法 (GET, POST, PUT, DELETE, PATCH)。
- **版本控制**: API URL中应包含版本号`/api/v1/...`
- **统一响应格式**: 所有响应遵循 `{ "code": 0, "message": "success", "data": {} }` 结构。
- **分页**: 对列表数据提供统一的分页参数,如 `page``pageSize`
- **排序与筛选**: 支持通过URL参数对结果进行排序和筛选。
- **认证**: 受保护的API需通过`Authorization`头传递JWT。
## 非功能性需求
### 性能要求
- **响应时间**:页面加载<2s接口响应<500ms
- **并发支持**支持1000+并发用户
- **可用性**99.9%系统可用性
### 安全要求
- **数据加密**:敏感数据加密存储和传输
- **访问控制**:完善的认证和授权机制
- **审计日志**:关键操作日志记录
### 扩展性要求
- **模块化设计**:支持功能模块独立部署
- **API设计**RESTful API支持版本控制
- **数据库**:支持读写分离和分库分表
## 开发优先级
### 第一期核心基础MVP
1. 基础用户系统(用户管理、角色权限)
2. 笔记系统核心功能
3. 基础博客发布
4. 系统基础架构
### 第二期:内容增强
1. 完整的博客系统
2. 个人空间功能
3. 基础工具(密码管理、书签)
4. 搜索优化
### 第三期:高级功能
1. 阅读管理系统
2. 文件管理系统
3. AI集成功能
4. 第三方平台同步
### 第四期:生态完善
1. 移动端应用
2. 浏览器插件
3. 高级分析功能
4. 性能优化
## 风险与挑战
### 技术风险
- **数据迁移**:大量历史数据的迁移和同步
- **性能优化**:大文件上传和处理
- **第三方集成**API变更和限制
### 产品风险
- **功能复杂度**:避免功能过于复杂影响用户体验
- **数据安全**:个人敏感数据的安全保护
- **兼容性**:跨浏览器和设备兼容
## 成功指标
### 用户指标
- 日活跃用户数
- 用户留存率
- 功能使用率
### 技术指标
- 系统响应时间
- 错误率控制
- 数据备份完整性
### 业务指标
- 内容创作量
- 用户满意度
- 功能完成度
## 后续规划
### 短期目标6个月内
- 完成第一期功能开发
- 系统稳定性优化
- 基础功能测试
### 中期目标1年内
- 完成主要功能模块
- 移动端支持
- 性能优化
### 长期目标1年以上
- AI功能深度集成
- 开放API生态
- 多语言支持

128
prd/星撰-工程设计.md Normal file
View File

@ -0,0 +1,128 @@
# 星撰个人综合平台 - 项目工程设计文档
---
## 0. 引言
本文档旨在为"星撰"个人综合平台项目提供全面的工程设计与规划。基于已确定的产品需求文档PRD本文档从软件工程和工程控制论的视角出发深入分析项目的技术指标、可行性、技术选型、未来展望及各项核心系统属性为项目的顺利开发、部署和长期演进提供一份结构化的工程蓝图。
**项目代号**: 星撰 (StarWriter)
**核心愿景**: 构建一个高度集成、数据私有、体验优秀的个人数字化中枢,统一管理知识、生活与工具。
---
## 1. 技术指标 (Technical Specifications)
为确保项目质量,我们设定以下可量化的关键技术指标:
| 类别 | 指标项 | 目标值 | 备注 |
|--------------|------------------------------|------------------------------------------------|----------------------------------------------|
| **性能** | API 平均响应时间 | < 200ms (95th percentile) | 针对核心数据读写操作 |
| | 复杂查询/搜索响应时间 | < 800ms | 如全文搜索聚合分析 |
| | 页面首次内容绘制 (FCP) | < 1.5s | 核心页面的加载性能 |
| **并发** | MVP 阶段并发用户数 | 100+ | 系统可稳定支持的并发会话数 |
| | 长期目标并发用户数 | 1000+ | |
| **可用性** | 系统年可用性 (Uptime) | 99.9% | 相当于每年停机时间不超过 8.76 小时 |
| **稳定性** | 核心 API 成功率 | > 99.95% | |
| | 数据备份恢复点目标 (RPO) | 24 小时 | 每日自动备份,最多丢失 24 小时数据 |
| | 数据备份恢复时间目标 (RTO) | < 2 小时 | 从灾难发生到恢复服务所需时间 |
| **安全性** | 安全漏洞响应 | 遵循 OWASP Top 10 防御原则0 高危漏洞 | 使用自动化工具扫描并定期审查 |
| | 敏感数据处理 | 密码、密钥等使用非对称加密或强哈希算法存储 | |
| **代码质量** | 核心模块单元测试覆盖率 | > 90% | 确保业务逻辑的稳定可靠 |
| | CI/CD 流水线单次执行时间 | < 10 分钟 | 从代码提交到构建部署完成 |
---
## 2. 可行性分析 (Feasibility Analysis)
- **技术可行性**:
- **技术栈成熟度**: 项目选用的 Elysia.js, Bun, Vue/React, MySQL, Redis 等技术均为成熟或高速发展的开源技术,拥有活跃的社区和丰富的文档,技术风险可控。
- **实现复杂度**: 项目功能虽多但采用模块化、分阶段MVP的开发策略可将复杂系统分解为多个可管理的小模块降低了单次开发的复杂度。
- **团队技能**: 核心开发人员具备所需的全栈技术能力,能够驾驭该技术栈。
- **经济可行性**:
- **初期成本**: 主要成本为服务器托管费用。初期可利用云服务商的免费套餐或低成本VPS成本极低。所有核心软件均为开源无授权费用。
- **长期成本**: 随着用户量和数据量的增长,服务器和存储成本会线性增加,但成本模型清晰可控。
- **开发成本**: 作为个人项目,主要为时间成本,无直接的人力资源开销。
- **操作与维护可行性**:
- **部署**: 采用 Docker 和 Docker Compose 进行容器化部署,实现了环境的标准化和一键部署,极大降低了操作和维护的复杂性。
- **监控**: 规划了完善的日志和监控体系,能够主动发现和定位问题,提升了系统的可维护性。
- **开发流程**: 明确的 PRD 和工程设计文档,结合 CI/CD 自动化流程,保障了开发过程的规范性和高效性。
---
## 3. 技术选型与论证 (Technology Stack Selection & Justification)
| 领域 | 技术选型 | 选型论证 |
|----------------|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **后端运行时** | **Bun.js** | 极高的执行效率,内置打包器、测试器、包管理器,提供了现代、一体化的开发体验,与 Elysia.js 完美契合。 |
| **后端框架** | **Elysia.js** | 基于 Bun 设计性能卓越。提供端到端的类型安全Type-Safe开发体验极佳插件生态丰富非常适合构建高性能、类型健壮的 API 服务。 |
| **前端框架** | **Vue.js / React** | 两者均为业界领先的声明式 UI 框架拥有强大的生态系统和组件库。选择其一可快速构建复杂、交互丰富的单页应用SPA。最终选择可根据个人偏好决定。 |
| **数据库** | **MySQL (主) + Redis (缓存) + Elasticsearch (搜索)** | **MySQL**: 成熟可靠的关系型数据库,提供事务支持和数据一致性,适合存储结构化的核心业务数据。**Redis**: 高性能内存数据库,用于缓存、会话管理、消息队列等场景,能极大提升系统响应速度。**Elasticsearch**: 强大的全文搜索引擎,为笔记、博客等内容提供毫秒级的复杂搜索能力,是内容驱动型平台的关键组件。 |
| **部署方案** | **Docker + Docker Compose** | 实现开发、测试、生产环境的一致性,简化部署流程,便于服务的水平扩展和管理。 |
---
## 4. 前沿技术展望 (Future Technology Outlook)
本项目在设计上保持开放,为未来集成前沿技术预留了接口:
- **深度 AI 集成 (LLM/RAG)**: 当前规划的 AI 功能是基础。未来可引入基于私有数据笔记、文档的检索增强生成RAG技术将平台打造成一个真正个性化的智能问答和创作助手。
- **去中心化身份与存储 (DID/IPFS)**: 探索使用去中心化身份标识DID进行用户认证增强用户的自主权。核心的、不可变的笔记或博客可选择性地发布到 IPFS/Arweave 等去中心化存储网络,实现数据的永久保存和抗审查。
- **边缘计算 (Edge Computing)**: 对于静态资源和一些低延迟要求的 API可以利用边缘计算节点进行分发和计算为全球用户提供更快的访问速度。
- **WebAssembly (WASM)**: 对于前端的性能敏感模块,如富文本编辑器、思维导图、在线画板的核心引擎,未来可采用 Rust/C++ 编写并通过 WASM 在浏览器中运行,以获得接近原生的性能。
---
## 5. 实用性分析 (Utility Analysis)
本项目的核心实用价值在于 **"终极整合"** 与 **"数据主权"**。
- **解决的核心痛点**: 现代人的数字信息散落在各个孤立的平台笔记在A应用书签在B浏览器密码在C工具博客在D平台。"星撰"旨在通过一个统一的平台整合这些功能,消除切换成本,构建个人数据的内在联系。
- **为用户创造的价值**:
1. **数据所有权**: 用户数据完全存储在自己的服务器上,彻底摆脱对商业平台的依赖和隐私泄露的担忧。
2. **高度可定制**: 作为一个自建项目,可以根据个人需求无限扩展和定制功能,不受商业产品的限制。
3. **效率提升**: 将多种高频工具集成,减少了跨应用的操作,提升了日常工作和学习的效率。
---
## 6. 商用性分析 (Commercial Viability Analysis)
尽管项目初衷为个人使用,但其架构和功能具备一定的商用潜力。
- **潜在市场**: 面向注重数据隐私、有极客精神、需要高度定制化解决方案的个人开发者、知识工作者、内容创作者。
- **商业模式探索**:
1. **SaaS 订阅服务**: 提供托管服务用户无需自行部署。可通过免费增值模式Freemium吸引用户高级功能如无限AI调用、团队协作、更大存储空间收费。
2. **开源+付费支持/高级版**: 项目核心开源,吸引社区贡献。提供付费的企业级支持、高级插件或一键部署的商业版。
3. **模板/插件市场**: 建立一个生态,允许开发者创建和销售主题模板、功能插件。
- **核心竞争力**: 与 Notion, Obsidian 等产品的竞争中,其核心优势是 **开源、可自托管、高度集成**。这对于目标市场中的特定群体具有强大吸引力。
---
## 7. 稳定性与可靠性设计 (Stability & Reliability Design)
- **冗余与备份**: 数据库采用主从复制Read Replicas实现读写分离和高可用。实施每日全量备份和增量备份策略并定期进行恢复演练。
- - **无状态服务**: 后端 API 设计为无状态,所有会话信息存储在 Redis 中。这使得服务可以轻松地进行水平扩展和故障切换。
- **优雅降级**: 当 Elasticsearch 或 Redis 等非核心依赖出现故障时,系统应能自动降级服务(如暂时关闭搜索功能、使用数据库替代缓存),保证核心功能(如读写笔记)不受影响。
- **健康检查**: 对外提供健康检查 API (`/health`),供负载均衡和监控系统调用,实现故障节点的自动摘除。
- **配置中心**: 所有配置(数据库连接、密钥等)通过环境变量或配置中心管理,实现配置与代码分离,增强安全性与灵活性。
---
## 8. 可拓展性设计 (Scalability & Extensibility Design)
- **水平扩展 (Scale Out)**: 无状态的后端服务设计,使其可以轻易地在负载均衡器后部署多个实例,以应对增长的流量。
- **垂直扩展 (Scale Up)**: 系统也可以通过增加单个服务器的 CPU 和内存来提升处理能力。
- **数据库扩展**: 初期采用读写分离。未来若数据量巨大可根据业务模块进行垂直拆分如用户库、内容库或对超大表进行水平分片Sharding
- **功能扩展 (Extensibility)**:
- **模块化架构**: `src` 目录下的 `controllers`, `services`, `plugins` 结构清晰,新增功能模块不会影响现有逻辑。
- **插件化设计**: 核心功能稳定后,可设计一套正式的插件机制,允许社区或自己以插件形式开发新功能(如新的编辑器、新的同步工具),实现真正的"热插拔"式扩展。
- **事件驱动**: 通过引入消息队列,采用事件驱动模式解耦核心业务和附加业务(如发送邮件、生成通知、索引文档),提高系统的响应能力和可扩展性。
---
## 9. 结论
"星撰"项目不仅在产品功能上满足了现代数字生活的需求,其工程设计也遵循了高标准。项目技术上可行,经济上低成本,且在稳定性、可扩展性方面进行了深思熟虑的规划。本文档将作为指导,确保项目沿着一条稳健、高效、可持续的道路前进。

121
prd/星撰-开发计划.md Normal file
View File

@ -0,0 +1,121 @@
# 星撰个人综合平台 - 详细开发计划 (按功能模块划分)
---
## 1. 引言
### 1.1. 文档目的
本文档基于《产品需求文档 (PRD)》和《概要设计》,旨在将项目需求拆分为具体、可执行的开发任务,并将其组织成一个以核心功能模块为导向、分阶段的开发计划。本文档是项目执行阶段的核心路线图。
### 1.2. 计划结构
本计划遵循迭代式增量开发模型,将整个项目划分为多个主要阶段。**此版本已根据 `main.md` 的功能列表进行重组**,每个阶段聚焦于一个完整的功能模块。
---
## 阶段一: 项目初始化与基础设施
**目标**: 搭建项目骨架,配置开发环境和规范,建立 CI/CD 基础流程。这是后续所有开发工作的基础。
- [ ] **1.1. 项目脚手架**: 初始化 Elysia + Bun + TypeScript 项目,配置 `tsconfig.json` 和路径别名。
- [ ] **1.2. 代码规范**: 配置 ESLint 和 Prettier确保代码风格和质量一致。
- [ ] **1.3. 配置文件管理**: 建立 `src/config` 目录管理数据库、JWT、日志等配置支持环境变量。
- [ ] **1.4. 数据库连接**: 编写并测试 MySQL 和 Redis 的连接模块。
- [ ] **1.5. 核心插件**: 实现全局错误处理、结构化日志 (`pino`) 和 Swagger API 文档插件。
- [ ] **1.6. 容器化**: 编写 `Dockerfile``docker-compose.yml`,实现开发环境一键启动。
- [ ] **1.7. CI/CD 基础**: 搭建基础的 GitHub Actions 工作流,实现提交代码时自动运行 lint 和测试。
---
## 阶段二: 基础用户系统
**目标**: 实现一个完整的、支持RBAC的用户中心包含用户、角色、权限、组织和字典等核心功能。
- [ ] **2.1. 数据库设计**: 设计并创建 `users`, `roles`, `permissions`, `organizations`, `dictionaries` 及相关联的表。
- [ ] **2.2. 用户认证 API**:
- [ ] `POST /api/v1/auth/register`: 实现用户注册(含数据校验、密码哈希)。
- [ ] `POST /api/v1/auth/login`: 实现用户登录,成功后返回 JWT。
- [ ] `GET /api/v1/users/me`: 创建受保护路由,获取当前登录用户信息。
- [ ] **2.3. JWT与权限中间件**:
- [ ] 实现 JWT 校验中间件。
- [ ] 实现一个基础的 RBAC 权限校验中间件。
- [ ] **2.4. 字典管理 CRUD API**: 实现对数据字典类型和条目的增删改查。
- [ ] **2.5. 角色管理 CRUD API**: 实现对角色的增删改查及权限分配。
- [ ] **2.6. 组织架构 CRUD API**: 实现树形组织架构的增删改查。
- [ ] **2.7. 用户管理 CRUD API**: 实现后台对用户的增删改查和角色分配。
---
## 阶段三: 笔记与博客系统
**目标**: 构建平台的内容核心,支持从私有笔记到公开博客的完整流程,并集成搜索和社交功能。
- [ ] **3.1. 数据库设计**: 设计 `notes`, `posts`, `tags`, `categories`, `comments` 及相关关联表。
- [ ] **3.2. 笔记核心 API**:
- [ ] 实现笔记的 CRUD (创建/读取/更新/删除)。
- [ ] `GET /api/v1/notes`: 获取用户的笔记树形结构列表。
- [ ] 实现笔记的标签管理功能。
- [ ] **3.3. 博客发布流程 API**:
- [ ] `POST /api/v1/notes/:id/publish`: 从笔记一键发布为博客。
- [ ] 实现博客的 CRUD包括分类管理。
- [ ] **3.4. 公开访问 API**:
- [ ] `GET /api/v1/public/posts`: (公开) 获取博客列表(分页、分类、标签筛选)。
- [ ] `GET /api/v1/public/posts/:slug`: (公开) 获取单篇博客内容。
- [ ] **3.5. 互动功能 API**:
- [ ] 实现博客的点赞、收藏功能。
- [ ] 实现层级评论的发表和查看功能。
- [ ] **3.6. 搜索引擎集成**:
- [ ] 配置 Elasticsearch 服务。
- [ ] 编写服务将 `posts` 数据索引到 ES。
- [ ] `GET /api/v1/public/search`: 实现基于 ES 的博客全文搜索 API。
---
## 阶段四: 个人空间
**目标**: 开发一个用于记录和分享个人生活点滴的模块。
- [ ] **4.1. 数据库设计**: 设计 `life_logs` 表,支持文本、图片/视频链接、位置、心情等。
- [ ] **4.2. 生活日志 CRUD API**: 实现生活日志的增删改查。
- [ ] **4.3. 时间线 API**: `GET /api/v1/space/timeline` 按时间线获取日志列表。
- [ ] **4.4. 隐私控制**: 为日志增加隐私设置(公开/私密/好友可见)。
---
## 阶段五: 阅读系统
**目标**: 构建个人电子书库,支持在线阅读、批注和智能解读。
- [ ] **5.1. 数据库设计**: 设计 `ebooks`, `annotations` (批注) 表。
- [ ] **5.2. 电子书 API**: 实现电子书文件的上传、元数据解析和列表管理。
- [ ] **5.3. 阅读功能 API**: 实现阅读时添加/查看批注、记录和同步阅读进度的功能。
- [ ] **5.4. (选做) AI 解读 API**: `POST /api/v1/ebooks/:id/interpret` 对书籍内容进行摘要或问答。
---
## 阶段六: 综合工具集
**目标**: 集成一系列实用工具,提升平台的附加价值和用户粘性。
- [ ] **6.1. 密码与书签管理**:
- [ ] 数据库设计 `passwords`, `bookmarks` 表,关键字段加密。
- [ ] 实现密码管理器的安全 CRUD API。
- [ ] 实现书签管理器的 CRUD API。
- [ ] **6.2. 文件管理系统**:
- [ ] 数据库设计 `files` 表,存储文件元数据。
- [ ] 封装一个支持本地/OSS的对象存储服务。
- [ ] 实现文件的上传、下载、删除、重命名和目录管理 API。
- [ ] **6.3. 第三方平台同步**:
- [ ] 设计同步任务管理模块和第三方平台适配器。
- [ ] 实现 Bilibili 收藏夹同步适配器。
- [ ] 实现 QQ音乐/网易云音乐 歌单同步适配器。
- [ ] **6.4. 信息聚合工具**:
- [ ] 实现热点新闻捕获和聚合的后台任务。
- [ ] `POST /api/v1/tools/web-to-pdf`: 实现网页离线存储为 PDF 的 API。
---
## 阶段七: 高级功能与生态完善
**目标**: 引入AI、实时通知等高级功能并通过跨平台应用完善生态。最后对系统进行加固和优化确保长期稳定。
- [ ] **7.1. AI 功能深度集成**:
- [ ] `POST /api/v1/ai/summary`: 对给定文本生成摘要。
- [ ] `POST /api/v1/ai/polish`: 对给定文本进行润色。
- [ ] (高级) 探索将笔记向量化,实现基于个人知识库的智能问答。
- [ ] **7.2. 高级功能与优化**:
- [ ] 使用 WebSocket 实现评论、点赞等事件的实时通知。
- [ ] 开发基础的网站访问统计和内容分析功能。
- [ ] 设计并实现基于 OAuth 2.0 的开放 API 体系。
- [ ] **7.3. 跨平台生态**:
- [ ] (前端) 将 Web 应用打包为 PWA。
- [ ] (前端) 开发用于快速保存书签和填充密码的浏览器插件。
- [ ] **7.4. 系统加固与维护**:
- [ ] 引入 CDN 加速静态资源,分析并优化慢查询 SQL。
- [ ] 定期进行依赖项安全扫描和代码审计。
- [ ] 完善所有功能的开发者文档和用户手册。

217
prd/星撰-概要设计.md Normal file
View File

@ -0,0 +1,217 @@
# 星撰个人综合平台 - 软件开发概要设计
---
## 1. 引言
### 1.1. 文档目的
本概要设计文档旨在为"星撰"个人综合平台项目定义一个完整的软件开发生命周期SDLC框架。它将作为项目从规划、设计、实现到部署和维护的最高指导性文件确保所有开发活动遵循标准化的软件工程最佳实践。
### 1.2. 项目概述
"星撰"是一个高度集成的个人数字化中枢,其核心功能、用户故事及非功能性需求已在《个人网站综合平台产品需求文档 (PRD)》中详细定义。本项目旨在将该PRD转化为一个稳定、可扩展、高质量的软件产品。
### 1.3. 范围
本文档覆盖范围包括:
- 项目开发模型的选定。
- 系统的高层体系结构设计。
- 各阶段(设计、开发、测试、部署)的规划和规范。
- 项目管理、风险控制和质量保证策略。
---
## 2. 项目规划与管理
### 2.1. 开发模型
本项目采用 **迭代式增量开发模型 (Iterative and Incremental Development)**
- **迭代式**: 将开发过程划分为多个短周期的迭代,每个迭代都包含需求分析、设计、编码、测试的完整流程。
- **增量式**: 每个迭代都会产出一个可测试、可交付的软件增量。产品功能将分阶段见PRD中的优先级规划逐步构建和完善。
**优势**: 此模型能够快速交付核心功能MVP及时获取反馈灵活应对需求变化并有效控制项目风险。
### 2.2. 项目里程碑
项目将按照PRD中的优先级划分为四个主要里程碑阶段
| 里程碑 | 名称 | 核心交付物 | 目标 |
|--------|--------------|------------------------------------------------------|------------------------------------|
| M1 | **核心基础 (MVP)** | 基础用户系统、笔记核心功能、基础博客发布、CI/CD流程建立 | 验证核心架构,跑通开发部署全流程 |
| M2 | **内容增强** | 完整博客系统、个人空间、基础工具、搜索引擎集成 | 完善内容生态,提升用户体验 |
| M3 | **高级功能** | 阅读管理、文件管理、AI功能集成、第三方平台同步 | 扩展平台能力,引入智能化 |
| M4 | **生态完善** | 移动端应用、浏览器插件、高级分析功能、性能深度优化 | 构建跨平台生态,实现长期稳定运营 |
### 2.3. 风险管理
| 风险类别 | 风险描述 | 可能性 | 影响 | 应对策略 |
|--------------|----------------------------------------|--------|------|------------------------------------------------------------------------|
| **技术风险** | 第三方API变更如B站、QQ音乐 | 中 | 中 | 封装Adapter层隔离变化设计优雅降级机制。 |
| | 新技术引入Bun/Elysia的未知问题 | 低 | 中 | 保持对社区的关注,构建完善的测试体系以快速发现问题。 |
| **进度风险** | 个人项目时间投入不稳定 | 高 | 高 | 严格遵循任务清单,将大任务分解为小任务,利用碎片时间完成。 |
| **安全风险** | 个人敏感数据(密码、文件)泄露 | 中 | 高 | 强制加密存储;定期进行安全扫描;代码审查时关注安全漏洞。 |
---
## 3. 系统设计
### 3.1. 系统架构
系统采用分层、模块化的架构,实现前后端分离。
```mermaid
graph TD
subgraph "客户端 (Clients)"
WebApp[Web 应用 (Vue/React)]
BrowserExt[浏览器插件]
MobileApp[移动应用 (PWA/Native)]
end
subgraph "服务端 (Backend - Elysia.js on Bun)"
API_Gateway[API 网关 / 路由层]
subgraph "核心服务层 (Core Services)"
AuthService[认证与授权服务]
UserService[用户管理服务]
ContentService[内容管理服务 (笔记/博客)]
FileService[文件管理服务]
end
subgraph "工具服务层 (Utility Services)"
ToolService[密码/书签/同步等工具服务]
end
subgraph "插件与中间件 (Plugins & Middlewares)"
Logger[日志插件]
ErrorHandler[错误处理]
JWTMiddleware[JWT认证]
Swagger[Swagger文档]
end
end
subgraph "数据与存储层 (Data & Storage)"
MySQL[(MySQL - 关系型数据)]
Redis[(Redis - 缓存/会话)]
Elasticsearch[(Elasticsearch - 全文搜索)]
ObjectStorage[对象存储 (OSS/NAS)]
end
subgraph "第三方服务 (3rd Party Services)"
EmailService[邮件服务]
OAuth[OAuth 2.0 提供商]
AI_API[AI/LLM API]
end
%% 连接关系
WebApp --> API_Gateway
BrowserExt --> API_Gateway
MobileApp --> API_Gateway
API_Gateway --> AuthService
API_Gateway --> UserService
API_Gateway --> ContentService
API_Gateway --> FileService
API_Gateway --> ToolService
AuthService <--> MySQL
UserService <--> MySQL
ContentService <--> MySQL
ContentService <--> Elasticsearch
FileService <--> ObjectStorage
ToolService <--> MySQL
AuthService --> JWTMiddleware
API_Gateway -- use --> Logger
API_Gateway -- use --> ErrorHandler
API_Gateway -- use --> JWTMiddleware
API_Gateway -- use --> Swagger
subgraph "通用依赖"
AuthService <--> Redis
UserService <--> Redis
ContentService <--> Redis
end
AuthService --> EmailService
AuthService --> OAuth
ContentService --> AI_API
```
* **客户端层**: 负责用户交互和数据展示。
* **服务端层**: 核心业务逻辑处理中心。通过API网关统一入口内部按业务垂直划分为多个服务模块。
* **数据与存储层**: 持久化存储数据,提供缓存和搜索能力。
* **第三方服务**: 集成外部服务以完成特定功能。
### 3.2. 模块划分
系统功能将按以下模块进行开发,每个模块对应`src/controllers`, `src/services`下的独立子目录。
1. **`core`**: 核心模块,包括用户、角色、权限、组织、字典等。
2. **`content`**: 内容模块,包括笔记、博客、评论、分类、标签等。
3. **`space`**: 个人空间模块,包括生活日志、社交互动。
4. **`reader`**: 阅读模块,包括电子书管理、批注。
5. **`tools`**: 工具模块,包括密码、书签、文件、同步等。
6. **`system`**: 系统模块,包括健康检查、监控、配置管理。
### 3.3. 详细设计规划
本概要设计完成后,将对每个模块进行详细设计,产出物包括:
- **数据库设计文档**: E-R图、表结构定义字段、类型、约束、索引、数据字典。
- **API接口设计文档**: 使用Swagger/OpenAPI规范定义每个端点的URL、HTTP方法、请求参数、响应体结构及错误码。
- **UI/UX设计稿**: 针对核心页面和流程,制作线框图或高保真原型。
---
## 4. 实现与编码
### 4.1. 开发环境与工具
- **IDE**: Visual Studio Code
- **语言**: TypeScript
- **运行时**: Bun.js
- **包管理器**: Bun
- **版本控制**: Git / GitHub
- **代码检查与格式化**: ESLint / Prettier
### 4.2. 编码规范
- 严格遵守项目已定义的注释、命名、代码风格规范。
- 所有业务逻辑必须在 `services` 层实现,`controllers` 层只负责路由和数据校验。
- 禁止在代码中硬编码配置项(如密钥、端口),所有配置通过环境变量或配置文件注入。
### 4.3. 版本控制策略
采用 **Gitflow工作流** 的简化版:
- `main`: 主分支,存放稳定、可发布的代码。每个里程碑完成后合并。
- `develop`: 开发分支,集成了所有已完成的功能。
- `feat/feature-name`: 功能分支,每个新功能或任务都在此分支开发,完成后合并到 `develop`
- `fix/bug-name`: Bug修复分支。
---
## 5. 测试策略
### 5.1. 测试层次
- **单元测试**: 使用 `Vitest``services``utils` 中的核心函数进行测试,目标覆盖率 > 90%。
- **接口测试 (集成测试)**: 使用 `supertest` 或Elysia的内置测试工具对每个API端点进行测试验证其与数据库、缓存的交互是否正确。
- **端到端测试 (系统测试)**: 使用 `Playwright``Cypress` 对关键用户流程(如注册登录、发布博客)进行自动化测试。
- **性能测试**: 使用 `autocannon` 对核心API进行压力测试确保其满足技术指标。
### 5.2. 测试执行
- 所有代码提交前,必须在本地通过相关单元测试和接口测试。
- CI/CD流水线将在每次向 `develop``main` 分支合并代码时,自动运行全量测试用例。测试不通过则禁止合并。
---
## 6. 部署与运维
### 6.1. 部署流程 (CI/CD)
使用 **GitHub Actions** 自动化构建、测试和部署流程。
1. **Push to `feat/*`**: 触发ESLint检查和单元测试。
2. **Merge to `develop`**: 触发全量测试构建Docker镜像并推送到镜像仓库然后部署到 **Staging (预发布)** 环境。
3. **Merge to `main`**: 触发全量测试构建生产Docker镜像并部署到 **Production (生产)** 环境。
### 6.2. 基础设施
- **运行环境**: Docker容器。
- **容器编排**: Docker Compose (初期) / Kubernetes (未来扩展)。
- **数据库/缓存**: 使用云服务商提供的托管服务或在Docker中自建。
### 6.3. 运维监控
- **日志**: 使用 `pino` 记录结构化日志并聚合到统一的日志管理平台如ELK Stack或Loki
- **监控与告警**: 使用 `Prometheus` 收集应用指标,`Grafana` 进行可视化展示并针对关键指标如API错误率、延迟设置告警。
---
## 7. 维护与演进
- **问题跟踪**: 使用GitHub Issues跟踪Bug和功能请求。
- **文档同步**: 所有代码变更若涉及架构、API或数据库设计必须同步更新相关设计文档。
- **定期审查**: 每个里程碑结束后,进行项目复盘,评估开发流程、代码质量和系统架构,并进行优化。
- **依赖更新**: 定期(如每季度)审查并更新项目依赖,以修复潜在的安全漏洞和利用新特性。

View File

@ -1,34 +1,34 @@
/** /**
* @file * @file
* @author hotok * @author hotok
* @date 2025-06-28 * @date 2025-06-28
* @lastEditor hotok * @lastEditor hotok
* @lastEditTime 2025-06-28 * @lastEditTime 2025-06-28
* @description Redis等依赖检查 * @description Redis等依赖检查
*/ */
import { Elysia } from 'elysia'; import { Elysia } from 'elysia';
import { healthService } from '@/services/health.service'; import { healthService } from '@/services/health.service';
import { healthResponse } from '@/validators/health.response'; import { healthResponse } from '@/validators/health.response';
/** /**
* *
* *
*/ */
export const healthController = new Elysia({ prefix: '/api' }) export const healthController = new Elysia({ prefix: '/api' })
.get('/health', async (ctx) => await healthService.getHealthStatus(ctx), { .get('/health', async (ctx) => await healthService.getHealthStatus(ctx), {
detail: { detail: {
tags: ['健康检查'], tags: ['健康检查'],
summary: '获取系统健康状态', summary: '获取系统健康状态',
description: '检查系统及各依赖服务的健康状态包括数据库、Redis等', description: '检查系统及各依赖服务的健康状态包括数据库、Redis等',
}, },
response: healthResponse, response: healthResponse,
}) })
.get('/health/detailed', async (ctx) => await healthService.getDetailedHealthStatus(ctx), { .get('/health/detailed', async (ctx) => await healthService.getDetailedHealthStatus(ctx), {
detail: { detail: {
tags: ['健康检查'], tags: ['健康检查'],
summary: '获取详细健康状态', summary: '获取详细健康状态',
description: '获取系统详细健康状态,包括性能指标、资源使用情况等', description: '获取系统详细健康状态,包括性能指标、资源使用情况等',
}, },
response: healthResponse, response: healthResponse,
}); });