125 lines
7.0 KiB
Markdown
125 lines
7.0 KiB
Markdown
## 项目概述
|
||
- 框架:Python Flask + Jinja2 服务端渲染,REST API 供前端交互
|
||
- 角色:`未审核用户`、`普通用户`、`管理员`
|
||
- 审核点:注册身份审核、公开作品审核、活动投稿审核
|
||
|
||
## 技术栈与依赖
|
||
- 后端:`Flask`、`Flask-Login`、`Flask-WTF`、`Flask-SQLAlchemy`、`Flask-Migrate`
|
||
- 图片处理:`Pillow`
|
||
- 表单与校验:`WTForms`
|
||
- UI:`Bootstrap`(Jinja2 模板)
|
||
- 数据库:开发用 `SQLite`,部署用 `PostgreSQL`
|
||
- 可选:`Flask-Admin`(或自定义后台)、`Flask-Mail`(邮件通知)
|
||
|
||
## 数据库设计(核心表)
|
||
- `users`:id,email,username,password_hash,role,status(pending/approved/rejected),identity_photo_path,created_at
|
||
- `profiles`:id,user_id,avatar_path,bio,grade,class_name,links,updated_at
|
||
- `posts`:id,user_id,title,description,visibility(public/followers/private),status(pending/approved/rejected),created_at,published_at
|
||
- `post_images`:id,post_id,original_path,web_path,thumb_path,exif_json,order_index
|
||
- `comments`:id,post_id,user_id,body,status(active/removed),created_at
|
||
- `follows`:follower_id,followee_id,created_at(唯一索引: follower_id+followee_id)
|
||
- `activities`:id,title,theme,description,start_at,end_at,status(draft/published/closed),created_at
|
||
- `activity_submissions`:id,activity_id,user_id,status(pending/approved/rejected),created_at
|
||
- `submission_images`:id,submission_id,original_path,web_path,thumb_path,exif_json,order_index
|
||
- `likes`(可选):id,post_id,user_id,created_at
|
||
- `notifications`:id,user_id,type,payload_json,read_at,created_at
|
||
- `review_logs`:id,target_type(user/post/submission),target_id,admin_id,action(approve/reject),reason,created_at
|
||
|
||
## 目录结构
|
||
- `app/`:应用工厂(`create_app`)、配置、扩展注册
|
||
- `app/blueprints/`:`auth`、`users`、`posts`、`comments`、`follows`、`feed`、`activities`、`admin`
|
||
- `app/models/`:SQLAlchemy 模型
|
||
- `app/services/`:图片处理、审核服务、通知服务
|
||
- `app/templates/`:Jinja2 模板(含后台)
|
||
- `app/static/`:CSS/JS/图片
|
||
- `uploads/`:`identity/`、`posts/`、`activities/`
|
||
- `migrations/`:数据库迁移
|
||
|
||
## 权限与审核流程
|
||
- 注册:用户提交基础信息 + 学生身份照片 → `status=pending` → 管理员审核通过后 `approved`,可登录和发帖
|
||
- 发帖:用户创建作品(多图)→ 若设置 `public`,则 `status=pending`,管理员审核通过后公开;`followers/private` 直接可见(仍可被管理员撤回)
|
||
- 活动投稿:在活动期内提交→管理员审核→通过后在活动展示页公开
|
||
- 管理员操作记录进入 `review_logs`
|
||
|
||
## 业务模块与页面
|
||
- 认证:注册、登录、退出、找回密码(可选邮件)
|
||
- 主页:个人资料、TA的作品、关注/粉丝、活动投稿
|
||
- 作品:创建/编辑/删除、多图上传、EXIF展示、评论区
|
||
- 发现:全站公开作品流(按热度/最新),可筛选主题、活动
|
||
- 关注:显示所关注用户的最新作品(含非公开中 `followers` 可见)
|
||
- 活动:活动列表、详情、投稿入口、获奖/精选展示
|
||
- 管理后台:注册审核队列、公开作品审核、活动创建与审核、用户管理、审核日志
|
||
|
||
## API 路由草案
|
||
- `POST /api/auth/register`(multipart,含身份照)
|
||
- `POST /api/auth/login`,`GET /api/auth/logout`
|
||
- `GET /api/users/<id>`,`PUT /api/users/<id>`(资料)
|
||
- `POST /api/posts`,`PUT /api/posts/<id>`,`DELETE /api/posts/<id>`,`GET /api/posts/<id>`
|
||
- `POST /api/posts/<id>/images`(追加图片),`DELETE /api/posts/<id>/images/<img_id>`
|
||
- `POST /api/posts/<id>/comments`,`GET /api/posts/<id>/comments`,`DELETE /api/comments/<id>`
|
||
- `POST /api/users/<id>/follow`,`DELETE /api/users/<id>/follow`
|
||
- `GET /api/feed/discover`,`GET /api/feed/following`
|
||
- `GET /api/activities`,`GET /api/activities/<id>`
|
||
- `POST /api/activities/<id>/submit`(multipart,多图)
|
||
- 管理员:
|
||
- `GET /admin/reviews/users`,`POST /admin/reviews/users/<id>/approve|reject`
|
||
- `GET /admin/reviews/posts`,`POST /admin/reviews/posts/<id>/approve|reject`
|
||
- `POST /admin/activities`,`PUT /admin/activities/<id>`,`POST /admin/activities/<id>/publish|close`
|
||
- `GET /admin/reviews/submissions`,`POST /admin/reviews/submissions/<id>/approve|reject`
|
||
|
||
## 图片上传与处理
|
||
- 校验:文件类型(JPEG/PNG)、大小限制、内容解码(用 Pillow 防伪造)
|
||
- 生成:`thumb`(方形或短边)、`web`(最大边约 1600px)、保留原图
|
||
- 提取:EXIF(相机、镜头、快门、光圈、ISO、焦距)
|
||
- 存储:磁盘分目录;文件名 `uuid`;数据库保存路径与元数据
|
||
- 访问:统一 `send_from_directory` 或静态映射;考虑防盗链与权限检查(非公开资源鉴权)
|
||
|
||
## 活动模块设计
|
||
- 活动生命周期:`draft → published → closed`
|
||
- 字段:主题、时间窗、规则、允许每人投稿数量、是否匿名展示
|
||
- 审核:投稿队列、通过后进入活动展示;支持精选/获奖标记
|
||
|
||
## 关注与发现
|
||
- 发现流:`approved & public` 的作品,按 `score = w1*likes + w2*comments + w3*recency`
|
||
- 关注流:所关注用户的最新作品,按时间倒序;含 `followers` 可见内容
|
||
- 索引与缓存:热门榜单每日重算(可用简单缓存或定时任务)
|
||
|
||
## 通知与消息
|
||
- 事件:审核结果、评论提醒、关注提醒、活动邀请/通过结果
|
||
- 拉取:通知列表页与角标;邮件可选
|
||
|
||
## 管理后台
|
||
- 仪表盘:待审核计数、近期活动、违规内容处理
|
||
- 队列:注册、公开作品、活动投稿
|
||
- 用户管理:封禁/解除、角色变更、作品/评论移除
|
||
- 审核日志:可检索与导出
|
||
|
||
## 安全与合规
|
||
- 密码:`werkzeug.security` 哈希(PBKDF2),强密码政策
|
||
- 会话:`Flask-Login`,保护关键路由;CSRF 防护(`Flask-WTF`)
|
||
- 上传:限制大小与类型,文件名随机化,路径隔离,权限控制
|
||
- 敏感信息:`SECRET_KEY`、数据库连接通过环境变量;不记录敏感日志
|
||
- 速率限制(可选):注册/登录/评论防刷
|
||
|
||
## 测试与验证
|
||
- 单元测试:模型、服务(图片处理、审核)
|
||
- 集成测试:注册→审核→发帖→公开→评论→关注→活动投稿全链路
|
||
- 工具:`pytest`,`Flask-Testing`(可选),`Flask-Migrate` 迁移验证
|
||
|
||
## 部署与环境
|
||
- 开发:`SQLite` + 内置服务器
|
||
- 生产:`Gunicorn + Nginx`(Linux)或 `Waitress`(Windows);`PostgreSQL`
|
||
- 静态与上传:Nginx 映射,非公开资源走鉴权路由
|
||
- 初始脚本:创建管理员、迁移数据库、配置环境变量
|
||
|
||
## 里程碑与实施顺序
|
||
1. 项目骨架与配置、模型与迁移
|
||
2. 认证与注册审核链路
|
||
3. 作品与多图上传、EXIF、可见性
|
||
4. 评论与关注、发现与关注流
|
||
5. 活动模块与投稿审核
|
||
6. 管理后台与审核日志
|
||
7. 通知与优化、测试覆盖与部署
|
||
|
||
---
|
||
请确认是否按此方案开始实现,或指出需要调整的部分。 |