个人博客系统 PRD
个人博客系统 PRD
文档版本:V1.0 作者:王清国(产品经理 / 前端开发工程师) 日期:2026年7月
一、项目背景
1.1 项目定位
这是一个个人数字身份门户 + 内容发布系统,区别于传统博客(以长文章为唯一内容单元),本项目融合:
- 个人展示(引导页/主页:个人简介、身份标签、MBTI人格、运动数据)
- 文章内容(分类、标签,参考技术博客的组织方式)
- 摄影作品展示(照片、视频,呼应个人摄影师背景)
- 项目展示(DIY项目作品集,如翻页钟、儿童玩具车等)
系统本人独立开发、独立运营,后期计划开源,因此在架构设计上需要兼顾"个人可控"与"代码可读性/可复用性"。
1.2 参考产品
- kobin.cn:个人引导页 + 分类博客的组合形态
- 19楼/篱笆网:本地社区的内容组织逻辑(本项目不涉及,仅参考分类/标签体系设计)
- Strava、Now Page:动态个人状态/数据展示的理念参考
二、产品目标
2.1 核心目标
- 打造一个持续更新的个人数字身份载体,沉淀文章、项目、思考
- 通过内容积累,为未来的个人品牌、接单、创业方向提供曝光和信任背书
- 借助本项目学习并实践 Python/FastAPI 技术栈,同时探索"AI辅助编程"的工程实践
2.2 非目标(明确不做的事)
- 不做多用户内容发布(仅本人可发布文章/动态,其他用户仅能评论)
- 不做复杂的企业级权限体系(RBAC/多租户等,用户角色仅两种:管理员、认证访客)
- MVP阶段不做社交关系链(关注/粉丝体系)
三、用户角色定义
| 角色 | 权限范围 | 登录方式 |
|---|---|---|
| 管理员(仅本人) | 发布/编辑/删除文章、摄影作品、项目展示;管理评论(审核/删除);管理个人主页信息;管理背景音乐 | 账号密码登录 |
| 认证访客(其他所有用户) | 浏览所有公开内容;对文章发表评论 | 微信认证登录(Web端网站应用OAuth / 小程序端静默登录) |
| 未登录访客 | 仅可浏览公开内容,无法评论 | 无需登录 |
四、产品架构:三端说明
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 后台管理系统 │ │ Web 端 │ │ 小程序端 │
│ (仅管理员使用) │ │ (公开访问+SEO) │ │ (公开访问) │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
└───────────────────────┼────────────────────────┘
│
┌───────▼────────┐
│ 统一后端 API │
│ (FastAPI服务) │
└───────┬────────┘
│
┌───────▼────────┐
│ PostgreSQL 数据库 │
└────────────────┘
三端共享同一套后端API和数据库,内容一次录入,多端同步展示,避免维护多套数据源。
4.1 后台管理系统(管理员专用)
简洁的CRUD管理界面,不引入完整中后台模板(如vue-element-admin),自行设计精简界面,只需覆盖以下管理功能:
- 文章管理(新建/编辑/删除/发布状态切换)
- 摄影作品管理(上传/编辑/删除照片、视频)
- 项目展示管理(新建/编辑/删除作品集条目)
- 个人主页信息管理(个人简介、MBTI、运动数据等字段编辑)
- 评论管理(查看/删除/违规内容处理)
- 分类/标签管理
- 背景音乐管理(上传/编辑/删除音乐、设置默认播放曲目)
4.2 Web端(面向公开访问,需考虑SEO)
- 引导页/主页(个人简介、身份标签、MBTI、运动数据卡片,支持背景音乐播放)
- 文章列表页(按分类/标签筛选)+ 文章详情页
- 摄影作品展示页(照片、视频,支持分类/画廊形式展示)
- 项目展示页(作品集)
- 评论区(需微信网站应用OAuth登录后可发表)
技术建议使用支持SSR的框架(如Next.js),便于搜索引擎收录。
4.3 小程序端
- 与Web端功能基本对齐,UI适配小程序交互规范
- 登录采用小程序静默授权登录(wx.login + 后端换取openid)
- 评论功能同样仅认证用户可用
五、功能模块清单(MVP范围界定)
| 模块 | 功能点 | 优先级 |
|---|---|---|
| 引导页/主页 | 个人简介、身份标签、MBTI标签展示 | P0 |
| 引导页/主页 | 运动数据展示(初期支持手动录入) | P1 |
| 引导页/主页 | 背景音乐播放 | P1 |
| 文章系统 | 文章列表、分类筛选、标签筛选 | P0 |
| 文章系统 | 文章详情页 | P0 |
| 文章系统 | 文章内搜索 | P2 |
| 摄影作品展示 | 照片/视频上传(管理员)、画廊/分类浏览(所有人) | P0 |
| 项目展示 | 作品集列表 + 详情(图文形式) | P1 |
| 评论系统 | 微信认证登录 | P0 |
| 评论系统 | 发表评论、查看评论 | P0 |
| 评论系统 | 评论违规内容过滤(接入微信内容安全接口) | P0 |
| 评论系统 | 评论点赞 | P2 |
| 后台管理 | 文章/摄影作品/项目/评论管理CRUD | P0 |
| 后台管理 | 背景音乐管理(上传/编辑/删除、设置默认曲目) | P1 |
| 账号体系 | 管理员账号密码登录 | P0 |
| 账号体系 | Web端微信网站应用OAuth登录 | P0 |
| 账号体系 | 小程序端静默登录 | P0 |
说明:P0为MVP必须实现,P1可在MVP基础上快速补充,P2放入后续迭代。
六、数据模型草案
6.1 核心数据表
users(用户表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | 主键 | |
| role | enum | admin / visitor |
| wechat_openid | string,可空 | 微信认证用户的唯一标识 |
| wechat_unionid | string,可空 | 用于打通Web端与小程序端同一微信用户 |
| nickname | string | 微信昵称或管理员昵称 |
| avatar_url | string | 头像 |
| username | string,可空 | 仅管理员使用,账号密码登录 |
| password_hash | string,可空 | 仅管理员使用 |
| created_at | datetime |
articles(文章表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | 主键 | |
| title | string | |
| content | text | Markdown格式 |
| category_id | 外键 | 关联分类表 |
| status | enum | draft / published |
| view_count | int | 阅读量统计 |
| published_at | datetime |
tags / article_tags(标签及关联表) 多对多关系,一篇文章可对应多个标签。
photography_works(摄影作品表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | 主键 | |
| title | string | 作品标题,可空 |
| media_type | enum | photo / video |
| media_url | string | 照片或视频文件地址 |
| cover_image | string,可空 | 视频封面图,photo类型可为空 |
| description | text,可空 | 拍摄说明 |
| category | string,可空 | 作品分类(如人像/风光/延时等) |
| created_at | datetime |
projects(项目展示表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | 主键 | |
| title | string | |
| description | text | |
| cover_image | string | |
| gallery | json | 图片列表 |
| created_at | datetime |
background_music(背景音乐表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | 主键 | |
| title | string | 曲目名称 |
| artist | string,可空 | 艺术家/来源 |
| file_url | string | 音频文件地址 |
| is_default | boolean | 是否为引导页默认播放曲目 |
| created_at | datetime |
comments(评论表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | 主键 | |
| article_id | 外键 | |
| user_id | 外键 | 关联users表 |
| content | text | |
| status | enum | normal / hidden(违规隐藏) |
| created_at | datetime |
profile(个人主页信息表,单条记录)
| 字段 | 类型 | 说明 |
|---|---|---|
| mbti_type | string | 如 INTJ |
| bio | text | 个人简介 |
| sports_data | json | 运动数据(初期结构灵活,便于后续扩展) |
七、技术方案
7.1 技术选型
| 层级 | 选型 | 说明 |
|---|---|---|
| 后端语言/框架 | Python + FastAPI | 类型注解友好,适合AI辅助编程,异步性能好 |
| ORM | SQLModel | FastAPI作者出品,与Pydantic类型无缝衔接 |
| 数据库 | PostgreSQL | 类型支持丰富(如原生JSON字段),社区成熟,AI训练数据覆盖充分 |
| Web端框架 | Next.js(React) | 支持SSR,利于SEO收录 |
| 小程序端 | 微信小程序原生开发 | 复用已有开发经验 |
| 后台管理前端 | Vue3 或 React(自行选择,不引入完整中后台模板) | 简洁自定义,仅覆盖实际管理需求 |
| 部署 | Uvicorn + Nginx反向代理 | 轻量,适合个人VPS |
7.2 微信登录方案(需重点设计,两端逻辑不同)
- Web端:微信开放平台"网站应用"扫码登录(OAuth2.0),获取openid/unionid
- 小程序端:
wx.login()获取code,后端换取openid,静默登录无需用户额外操作 - 统一用户体系:通过
unionid打通同一微信用户在Web端和小程序端的身份,避免重复注册
建议将登录鉴权模块独立设计(单独的auth模块),不与文章/评论等业务逻辑耦合,便于后续开源时该模块可被替换或裁剪。
7.3 AI辅助编程的工程建议
- 建议先确定好数据库表结构和API接口规范(可先写OpenAPI/Swagger文档草稿),再让AI按统一规范生成代码,避免多次生成的代码风格不一致
- 核心模块(尤其是微信OAuth鉴权)建议AI生成后逐行人工审查,这部分安全敏感度较高
- 善用FastAPI自动生成的Swagger文档,作为验证AI生成接口是否符合预期的直接手段
八、非功能性需求
- 性能:个人博客量级,无需过度设计,但异步接口(FastAPI原生支持)可保证未来流量增长时有余量
- 安全:管理员密码需加密存储(如bcrypt);评论内容需接入内容安全检测(微信官方
msgSecCheck接口或第三方内容审核服务) - 可维护性:因后期计划开源,代码需保持清晰的模块划分(auth / articles / comments / photography / projects / music 各自独立),并配套基础的README和部署文档
九、开源相关考虑(面向未来)
- 需将个人敏感信息(数据库密码、微信AppID/AppSecret等)通过环境变量/配置文件隔离,避免开源时泄露
- 建议在架构设计阶段就考虑"可裁剪性",比如MBTI、运动数据这类个性化模块尽量设计成可选配置,方便其他开发者fork后按自己需求增减模块
- 开源许可证的选择、贡献指南等,可在项目基本稳定后再补充,不影响MVP阶段开发
十、路线图
- V1(MVP):完成P0功能,三端打通,微信登录+评论跑通
- V2:完善运动数据展示(评估是否接入第三方运动平台开放接口)、项目展示模块优化
- V3:评论点赞、文章内搜索等P2功能
- V4:视个人精力与开源反馈,决定是否扩展更多个性化模块