7.0 KiB
7.0 KiB
项目概述
- 框架: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_atprofiles:id,user_id,avatar_path,bio,grade,class_name,links,updated_atposts:id,user_id,title,description,visibility(public/followers/private),status(pending/approved/rejected),created_at,published_atpost_images:id,post_id,original_path,web_path,thumb_path,exif_json,order_indexcomments:id,post_id,user_id,body,status(active/removed),created_atfollows:follower_id,followee_id,created_at(唯一索引: follower_id+followee_id)activities:id,title,theme,description,start_at,end_at,status(draft/published/closed),created_atactivity_submissions:id,activity_id,user_id,status(pending/approved/rejected),created_atsubmission_images:id,submission_id,original_path,web_path,thumb_path,exif_json,order_indexlikes(可选):id,post_id,user_id,created_atnotifications:id,user_id,type,payload_json,read_at,created_atreview_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、adminapp/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/logoutGET /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>/followGET /api/feed/discover,GET /api/feed/followingGET /api/activities,GET /api/activities/<id>POST /api/activities/<id>/submit(multipart,多图)- 管理员:
GET /admin/reviews/users,POST /admin/reviews/users/<id>/approve|rejectGET /admin/reviews/posts,POST /admin/reviews/posts/<id>/approve|rejectPOST /admin/activities,PUT /admin/activities/<id>,POST /admin/activities/<id>/publish|closeGET /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 映射,非公开资源走鉴权路由
- 初始脚本:创建管理员、迁移数据库、配置环境变量
里程碑与实施顺序
- 项目骨架与配置、模型与迁移
- 认证与注册审核链路
- 作品与多图上传、EXIF、可见性
- 评论与关注、发现与关注流
- 活动模块与投稿审核
- 管理后台与审核日志
- 通知与优化、测试覆盖与部署
请确认是否按此方案开始实现,或指出需要调整的部分。