`(注意 Bearer 后面有空格)
5. 之后所有需要认证的接口会自动携带 Token
### 🗄️ 数据库设计
#### ER 图
```mermaid
erDiagram
USER ||--o{ ARTICLE : "作者"
USER ||--o{ BOOKMARK : "拥有"
USER ||--o{ MIND_GRID : "创建"
MIND_GRID ||--o{ GRID_NODE : "包含"
GRID_NODE ||--o{ GRID_NODE : "父子"
ARTICLE ||--o{ COMMENT : "收到"
ARTICLE ||--o{ CODE_SNIPPET : "包含"
ARTICLE ||--o{ ANNOTATION : "被批注"
ARTICLE }o--o{ TAG : "标签"
USER {
bigint id PK
varchar username UK
varchar password
varchar role
int status
}
ARTICLE {
bigint id PK
varchar title
text content_md
varchar visibility
varchar status
bigint author_id FK
}
GRID_NODE {
bigint id PK
bigint grid_id FK
bigint parent_id FK
varchar title
varchar type "FOLDER/ARTICLE/FILE"
bigint article_id FK
int pos_x
int pos_y
varchar color
varchar file_name
varchar file_url
}
```
### 🧩 前端组件说明
| 组件 | 路径 | 说明 |
|-----------------|-----------------------|------------------|
| `LandingPage` | `/` | 主页,深海蓝渐变背景,引导入口 |
| `SquarePage` | `/square` | 探索色板,公开文章列表 |
| `MyWorks` | `/my-works` | 我的画布,思维网格缩略图列表 |
| `GridDetail` | `/my-works/:id` | 思维网格详情,拖拽、染色、文件等 |
| `ArticleDetail` | `/article/:id` | 文章详情,批注、评论、卡片生成 |
| `AuthPage` | `/login`, `/register` | 登录注册页,左右分栏设计 |
| `SnippetPage` | `/my-snippets` | 代码色谱 |
| `BookmarkPage` | `/my-bookmarks` | 收藏中转站 |
| `DashboardPage` | `/admin/dashboard` | 知识仪表盘 |
### 🧪 单元测试说明
#### 测试覆盖范围
| 测试类 | 覆盖内容 |
|-----------------------|---------------------------|
| `AuthServiceTest` | 注册成功/重复用户名、登录成功/密码错误/账号禁用 |
| `ArticleServiceTest` | CRUD 操作、权限校验 |
| `TagServiceTest` | 标签创建/重复、删除权限、标签列表 |
| `SearchServiceTest` | 公开搜索、登录搜索、标签筛选 |
| `MindGridServiceTest` | 网格创建、节点添加、级联删除、坐标更新 |
#### 运行测试
```bash
cd backend
gradle test
```
测试报告路径:`backend/build/reports/tests/test/index.html`
---
## 7. 部署说明
### 📦 生产环境配置
#### 后端打包
```bash
cd backend
gradle bootJar
```
生成的 JAR 包位于 `backend/build/libs/mindpalette-server-1.0.0-SNAPSHOT.jar`
#### 运行
```bash
java -jar mindpalette-server-1.0.0-SNAPSHOT.jar --spring.profiles.active=mysql
```
### 🌐 前端 Nginx 部署
1. 构建前端:
```bash
cd frontend
npm run build
```
2. 将 `dist/` 目录下的文件上传到 Nginx 的静态文件目录
3. Nginx 配置示例:
```nginx
server {
listen 80;
server_name example.com;
root /var/www/mindpalette;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /uploads {
proxy_pass http://localhost:8080;
}
}
```
### ⚠️ 注意事项
- 生产环境请务必修改 JWT 密钥(`mindpalette.jwt.secret`)
- 建议使用 MySQL 作为生产数据库,并将 `sql.init.mode` 设为 `never`
- 前端 `vite.config.js` 中的代理配置仅用于开发环境,生产环境由 Nginx 处理
- 文件上传目录 `uploads` 需确保有写入权限,或在 `application.yml` 中配置绝对路径
---
## 8. 贡献指南
### 🤝 如何参与贡献
1. Fork 本仓库
2. 创建特性分支:`git checkout -b feature/amazing-feature`
3. 提交代码:`git commit -m '[feat] 添加了xxx功能'`
4. 推送到远程分支:`git push origin feature/amazing-feature`
5. 提交 Pull Request
### 📝 代码规范
- **后端**:遵循阿里巴巴 Java 开发规范
- **前端**:使用 ESLint + Prettier
- **提交信息**:遵循 `[类型] 简要描述` 格式
- `[feat]` - 新功能
- `[fix]` - Bug修复
- `[refactor]` - 重构
- `[test]` - 测试
- `[docs]` - 文档
### 🔀 提交 PR 流程
1. 确保所有测试通过
2. 更新相关文档
3. 提交 PR 到 `master` 分支
4. 等待代码评审
---
## 9. 许可证
本项目采用 **MIT License** 开源协议。详见 [LICENSE](LICENSE) 文件。
---
## 10. 联系方式
### 👤 作者信息
- **作者**:与世无争
- **Gitee**:[https://gitee.com/qjx010/mind-palette](https://gitee.com/qjx010/mind-palette)
### 📮 问题反馈
如有问题或建议,请通过以下方式联系:
- 在 Gitee 仓库提交 Issue
- 发送邮件至项目维护者邮箱
---
## 📊 项目状态
| 模块 | 状态 | 进度 |
|-----------|:-----:|:----:|
| 后端 P0 模块 | ✅ 已完成 | 100% |
| 前端 P0 页面 | ✅ 已完成 | 100% |
| 后端 P1 模块 | ✅ 已完成 | 100% |
| 前端 P1 页面 | ✅ 已完成 | 100% |
| 思维网格与可视化 | ✅ 已完成 | 100% |
| 管理员功能 | ✅ 已完成 | 100% |
| README 文档 | ✅ 已完成 | 100% |
---
MindPalette —— 把碎片知识变成精美卡片
Made with ❤️ by 与世无争