feat: v3.0 - 用户系统和收藏功能

核心功能:
- 用户注册/登录系统(用户名+密码)
- 工具收藏功能(一键收藏/取消收藏)
- 收藏分组管理(文件夹)
- 用户中心(个人资料、收藏列表)

数据库变更:
- 新增 users 表(用户信息)
- 新增 folders 表(收藏分组)
- 新增 collections 表(收藏记录)

安全增强:
- Admin 和 User 完全隔离
- 修复14个管理员路由的权限漏洞
- 所有管理功能添加用户类型检查

新增文件:
- templates/auth/register.html - 注册页面
- templates/auth/login.html - 登录页面
- templates/user/profile.html - 用户中心
- templates/user/collections.html - 收藏列表
- create_user_tables.py - 数据库迁移脚本
- USER_SYSTEM_README.md - 用户系统文档
- CHANGELOG_v3.0.md - 版本更新日志

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Jowe
2026-02-06 19:19:05 +08:00
parent 34cd05b01c
commit 2067fb1712
11 changed files with 2542 additions and 6 deletions

312
USER_SYSTEM_README.md Normal file
View File

@@ -0,0 +1,312 @@
# 用户注册登录和收藏功能实现说明
## 功能概述
本次更新为ZJPB项目添加了完整的用户系统包括
- ✅ 用户注册/登录(用户名+密码)
- ✅ 工具收藏功能
- ✅ 收藏分组管理(文件夹)
- ✅ 用户中心(个人资料、收藏列表)
- ✅ 多用户类型支持Admin和User
## 部署步骤
### 1. 创建数据库表
运行数据库迁移脚本创建新表:
```bash
python create_user_tables.py
```
这将创建以下表:
- `users` - 用户表
- `folders` - 收藏分组表
- `collections` - 收藏记录表
### 2. 启动应用
```bash
python app.py
```
或使用现有的启动方式。
## 功能说明
### 1. 用户注册
**访问路径:** `/register`
- 用户名至少3个字符
- 密码至少6个字符
- 注册成功后自动登录并跳转到首页
### 2. 用户登录
**访问路径:** `/login`
- 输入用户名和密码
- 登录成功后跳转到首页或之前访问的页面
### 3. 导航栏用户菜单
登录后,导航栏右侧会显示用户菜单:
- 显示用户名和头像(或首字母)
- 下拉菜单包含:
- 👤 个人中心
- ⭐ 我的收藏
- 🚪 退出登录
### 4. 收藏功能
**在工具详情页:**
- 登录后可看到"收藏"按钮
- 点击按钮收藏/取消收藏
- 已收藏时按钮变为金色
- 未登录时点击会提示登录
**前端页面:**
- detail_new.html - 添加了收藏按钮
- 自动检查登录状态和收藏状态
- Toast消息提示操作结果
### 5. 用户中心
**访问路径:** `/user/profile`
显示内容:
- 侧边栏:头像、用户名、个人简介、导航菜单
- 主内容区:
- 统计卡片(收藏数、文件夹数)
- 最近收藏列表最多5条
### 6. 我的收藏
**访问路径:** `/user/collections`
功能:
- 文件夹标签页切换
- 工具卡片网格展示
- 分页支持
- 空状态提示
## API端点
### 认证API
```
POST /register - 用户注册form
POST /login - 用户登录form
GET /logout - 用户登出
GET /api/auth/status - 获取登录状态JSON
```
### 收藏API需登录
```
POST /api/collections/toggle - 收藏/取消收藏
Body: { site_code: "12345678" }
GET /api/collections/status/:site_code - 查询收藏状态
Response: { is_collected: true/false, collection_id: 1, folder_id: null }
GET /api/collections/list - 获取收藏列表
Query: folder_id, page, per_page
Response: { collections: [...], total: 10, page: 1, ... }
PUT /api/collections/:id/note - 更新收藏备注
Body: { note: "备注内容" }
PUT /api/collections/:id/move - 移动收藏到文件夹
Body: { folder_id: 1 }
```
### 文件夹API需登录
```
GET /api/folders - 获取文件夹列表
POST /api/folders - 创建文件夹
Body: { name: "文件夹名", description: "", icon: "📁" }
PUT /api/folders/:id - 更新文件夹
Body: { name: "", description: "", icon: "", sort_order: 0 }
DELETE /api/folders/:id - 删除文件夹(级联删除收藏)
```
### 用户资料API需登录
```
PUT /api/user/profile - 更新用户资料
Body: { bio: "", avatar: "", is_public_profile: false }
```
## 数据库模型
### User用户表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Integer | 主键 |
| username | String(50) | 用户名(唯一) |
| password_hash | String(255) | 密码哈希 |
| email | String(100) | 邮箱(可选) |
| avatar | String(500) | 头像URL |
| bio | String(200) | 个人简介 |
| is_active | Boolean | 是否启用 |
| is_public_profile | Boolean | 是否公开资料 |
| created_at | DateTime | 创建时间 |
| last_login | DateTime | 最后登录时间 |
### Folder收藏分组表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Integer | 主键 |
| user_id | Integer | 用户ID |
| name | String(50) | 文件夹名称 |
| description | String(200) | 描述 |
| icon | String(50) | 图标emoji |
| sort_order | Integer | 排序权重 |
| is_public | Boolean | 是否公开 |
| public_slug | String(100) | 公开链接标识 |
| created_at | DateTime | 创建时间 |
### Collection收藏记录表
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Integer | 主键 |
| user_id | Integer | 用户ID |
| site_id | Integer | 网站ID |
| folder_id | Integer | 文件夹ID可选 |
| note | Text | 备注 |
| created_at | DateTime | 创建时间 |
| updated_at | DateTime | 更新时间 |
## 技术实现
### 多用户类型支持
- Admin模型`get_id()` 返回 `"admin:{id}"`
- User模型`get_id()` 返回 `"user:{id}"`
- `user_loader` 根据前缀加载不同类型的用户
### 安全特性
- 密码使用 Werkzeug 的 `generate_password_hash` 加密
- 最短密码长度6位
- 最短用户名长度3位
- Flask-Login 管理会话
- 路由保护:`@login_required` 装饰器
- 用户类型检查:`isinstance(current_user, User)`
### 前端特性
- Tailwind CSS 设计风格复用admin_login.html
- JavaScript无侵入式增强
- 异步API调用Fetch
- Toast消息提示
- 响应式设计
## 文件清单
### 新增文件
```
templates/auth/register.html - 注册页面
templates/auth/login.html - 登录页面
templates/user/profile.html - 用户中心
templates/user/collections.html - 收藏列表
create_user_tables.py - 数据库迁移脚本
USER_SYSTEM_README.md - 本说明文档
```
### 修改文件
```
models.py - 添加User、Folder、Collection模型修改Admin.get_id()
app.py - 添加认证路由、收藏API、文件夹API、用户路由
templates/base_new.html - 更新导航栏,添加用户菜单
templates/detail_new.html - 添加收藏按钮和JavaScript
```
## 测试步骤
1. **用户注册流程**
- 访问 `/register`
- 输入用户名和密码
- 提交表单
- 验证自动登录成功
2. **用户登录流程**
- 访问 `/login`
- 输入正确的用户名和密码
- 验证登录成功并跳转
3. **收藏功能**
- 登录后访问任意工具详情页
- 点击"收藏"按钮
- 验证按钮状态变为"已收藏"
- 再次点击取消收藏
4. **我的收藏**
- 访问 `/user/collections`
- 验证收藏的工具显示正确
- 测试文件夹切换
5. **用户中心**
- 访问 `/user/profile`
- 验证统计数据正确
- 验证最近收藏列表
## 后续优化方向
### 已实现的MVP功能
- ✅ 基础注册登录
- ✅ 收藏/取消收藏
- ✅ 收藏列表展示
- ✅ 基础文件夹管理
### 待实现的增强功能
- ⏳ 收藏备注编辑UI
- ⏳ 文件夹拖拽移动
- ⏳ 批量收藏操作
- ⏳ 收藏导出CSV/JSON
- ⏳ 公开收藏列表(分享)
- ⏳ 收藏统计图表
- ⏳ 邮箱验证
- ⏳ 忘记密码
- ⏳ 头像上传
- ⏳ 第三方登录
## 注意事项
1. **管理员与普通用户分离**
- 管理员账号无法使用收藏功能
- 管理员登录入口:`/admin/login`
- 普通用户登录入口:`/login`
2. **数据完整性**
- 删除用户会级联删除其所有收藏和文件夹
- 删除文件夹会级联删除其中的收藏记录
- 删除网站不会删除相关收藏(保留历史记录)
3. **性能优化**
- 收藏列表查询使用了join避免N+1问题
- 添加了必要的数据库索引
- 分页支持大量收藏
## 技术支持
如有问题,请查看:
- Flask-Login 文档https://flask-login.readthedocs.io/
- SQLAlchemy 文档https://docs.sqlalchemy.org/
- Tailwind CSS 文档https://tailwindcss.com/
---
**版本:** v1.0
**更新日期:** 2025-02-06
**作者:** Claude Sonnet 4.5