核心功能: - 用户注册/登录系统(用户名+密码) - 工具收藏功能(一键收藏/取消收藏) - 收藏分组管理(文件夹) - 用户中心(个人资料、收藏列表) 数据库变更: - 新增 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>
7.6 KiB
7.6 KiB
用户注册登录和收藏功能实现说明
功能概述
本次更新为ZJPB项目添加了完整的用户系统,包括:
- ✅ 用户注册/登录(用户名+密码)
- ✅ 工具收藏功能
- ✅ 收藏分组管理(文件夹)
- ✅ 用户中心(个人资料、收藏列表)
- ✅ 多用户类型支持(Admin和User)
部署步骤
1. 创建数据库表
运行数据库迁移脚本创建新表:
python create_user_tables.py
这将创建以下表:
users- 用户表folders- 收藏分组表collections- 收藏记录表
2. 启动应用
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) | 密码哈希 |
| 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
测试步骤
-
用户注册流程
- 访问
/register - 输入用户名和密码
- 提交表单
- 验证自动登录成功
- 访问
-
用户登录流程
- 访问
/login - 输入正确的用户名和密码
- 验证登录成功并跳转
- 访问
-
收藏功能
- 登录后访问任意工具详情页
- 点击"收藏"按钮
- 验证按钮状态变为"已收藏"
- 再次点击取消收藏
-
我的收藏
- 访问
/user/collections - 验证收藏的工具显示正确
- 测试文件夹切换
- 访问
-
用户中心
- 访问
/user/profile - 验证统计数据正确
- 验证最近收藏列表
- 访问
后续优化方向
已实现的MVP功能
- ✅ 基础注册登录
- ✅ 收藏/取消收藏
- ✅ 收藏列表展示
- ✅ 基础文件夹管理
待实现的增强功能
- ⏳ 收藏备注编辑UI
- ⏳ 文件夹拖拽移动
- ⏳ 批量收藏操作
- ⏳ 收藏导出(CSV/JSON)
- ⏳ 公开收藏列表(分享)
- ⏳ 收藏统计图表
- ⏳ 邮箱验证
- ⏳ 忘记密码
- ⏳ 头像上传
- ⏳ 第三方登录
注意事项
-
管理员与普通用户分离
- 管理员账号无法使用收藏功能
- 管理员登录入口:
/admin/login - 普通用户登录入口:
/login
-
数据完整性
- 删除用户会级联删除其所有收藏和文件夹
- 删除文件夹会级联删除其中的收藏记录
- 删除网站不会删除相关收藏(保留历史记录)
-
性能优化
- 收藏列表查询使用了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