码上问学问代码之理,学编程之道

项目文档 · 把项目说清楚

技术栈、目录结构、数据库设计、接口约定、部署方式、排错手册——接手一个项目先读这页, 面试被问「介绍一下你的项目」也照这个讲。

一、项目是什么

一句话 + 三个数字
一句话|古典文学网是一个前后端分离的文学赏析网站:Flask 提供 18 个 JSON 接口, Vue 3 渲染 5 个页面,MySQL / SQLite 存 7 张表的数据。支持注册登录(JWT)、作品浏览与检索、书评、点赞、收藏、头像上传。
  • 演示站:https://m369d.cn/wenxue/(本站线上部署,打开即玩,数据存于浏览器本地)
  • 在线调试:API 实验室(接口讲解 + 调试台)· Swagger 文档 /apidocs(Try it out 直接看到真实返回)
  • 源码:后端 hiflask(Flask,zip 下载) · 前端 hivue(Vue 3,zip 下载)。 两份源码的注释都是「逐句级」的:文件开头讲设计思路,每行代码旁讲具体含义。
  • 二、技术栈

    每一层都写明「为什么选它」
    层技术为什么
    前端框架Vue 3(组合式 API)+ Vite组合式 API 逻辑聚在一处好教学;Vite 冷启动秒开
    UI 组件Element Plus表单 / 表格 / 弹窗开箱即用,把时间留给业务
    状态 / 路由Pinia + Vue Router(history 模式)登录态全局共享 + localStorage 持久化
    HTTPaxios(统一封装 request.js)拦截器统一带 token、统一处理 code
    后端Flask 3 + 蓝图轻、显式,适合理解 Web 原理;蓝图按业务分五模块
    ORMFlask-SQLAlchemy + Flask-Migrate模型即表结构;换数据库不改业务代码
    鉴权Flask-JWT-Extended(Bearer token)无状态鉴权,前后端分离的事实标准
    数据库MySQL 8(课程)/ SQLite(线上演示)本机学标准 SQL;小服务器上 SQLite 零运维
    部署gunicorn + nginx + systemd + HTTPS经典三件套,全部在本站真实运行

    三、目录结构

    「一棵树看懂职责」
    后端 hiflask/
    hiflask/
    ├── app.py            # 工厂 create_app + JWT 异常统一 + 全局错误兜底 + Swagger 文档挂载
    ├── config.py         # dev / prod / testing 三套配置(.env 驱动)
    ├── extensions.py     # db / jwt / cors / migrate(防循环导入)
    ├── seed_demo.py      # 演示数据种子(SQLite / MySQL 通用)
    ├── models/           # user / article / comment 三个文件导出 7 个模型
    ├── views/            # home / user / article / comment / favorite 五蓝图
    ├── utils/            # response.py(统一响应)· auth.py(登录装饰器)
    ├── static/
    │   ├── openapi.yaml  # Swagger 接口契约(/apidocs 页面渲染的就是它)
    │   └── upload/       # 头像等上传文件(nginx 反代 /static/)
    ├── requirements.txt
    └── .env.example      # 环境变量模板(真实 .env 不进版本库)
    前端 hivue/
    hivue/
    ├── index.html
    ├── vite.config.js    # @ 别名 + 开发代理(/api → 127.0.0.1:5000)
    ├── .env.development / .env.production   # VITE_API_BASE=/api(不写死 IP)
    └── src/
        ├── main.js       # Pinia / Router / Element Plus 装配
        ├── router/       # 5 条路由 + 登录守卫
        ├── stores/       # user.js:token + 用户信息(localStorage 持久化)
        ├── utils/        # request.js:全站唯一请求出口(拦截器)
        ├── api/          # home / user / article / comment / favorite 五个模块
        ├── layouts/      # BasicLayout:顶栏导航 + 内容出口
        ├── components/   # ArticleCard 作品卡片(七 computed 兼容字段)
        └── views/        # Home / ArticleList / ArticleDetail / Login / UserCenter

    四、数据库设计

    7 张表 · 完整字段见 pyweb/sql/hiwen.sql · 关系见 ER 图
    表职责关键字段
    user注册用户username(唯一)、password(哈希)、avatar、status(1 正常 / 0 禁用)
    category文学分类name(唯一)、sort(排序值)、status
    article文学作品title、author、dynasty、category_id↗、summary、content、views、likes、is_recommend、status
    banner首页轮播title、image、link、sort、status
    comment书评(两级)user_id↗、article_id↗、parent_id(回复)、content、likes、status
    favorite收藏(user_id, article_id) 联合唯一、created_at
    user_like点赞(通用)user_id↗、target_type(article/comment)、target_id —— 一张表服务两种对象
    ⚠ 设计红线
    密码只存哈希;所有表带 created_at;用 utf8mb4;删数据一律 status 软删除。

    五、接口约定

    全部 18 个接口的可视化文档与在线调试 → API 实验室
  • BaseURL:开发 http://127.0.0.1:5000/api(Vite 代理)· 线上 https://m369d.cn/api(nginx 反代)
  • 响应结构:{"code":200,"msg":"success","data":{}} —— HTTP 恒 200,业务看 code;分页 data = {list,total,page,page_size}
  • 鉴权:需登录接口带 Authorization: Bearer <token>;token 过期统一返回 code 401,前端拦截器自动跳登录页
  • 参数:GET 用 query,POST/PUT 用 JSON body,头像上传用 form-data;分页参数一律服务端夹取(page≥1、page_size≤50)
  • 六、部署运维(本站真实运行方式)

    速查命令
    服务器上 · 常用运维命令
    systemctl status  hiwen-api        # 看服务状态
    systemctl restart hiwen-api        # 改完代码 / 配置后重启
    journalctl -u hiwen-api -n 50      # 最近 50 行日志(排错第一步)
    curl 127.0.0.1:5099/api/health     # 绕过 nginx 直接探后端
    ls /var/lib/hiwen-api/             # SQLite 数据文件在这里(备份它=备份全部数据)
  • 本地一键部署菜单 [8] 更新后端 · [1] 全链路
  • 后端代码改动:rsync 源码 → install-hiwen-api.sh 幂等重装(数据不丢,.env 与库文件被排除保护)
  • 前端改动:本地 npm run dev 联调通过后按「开发十步 · 第 10 步」自行构建上线
  • 七、排错手册

    按现象查,每条都给「先做什么」
    现象原因与处理
    前端一直「网络异常」后端没起:curl 127.0.0.1:5000/api/health 自证;起了就是代理没配好(检查 vite.config.js 是否重启)
    控制台 CORS 报错绕过了代理直连 5000。开发走 Vite 代理;生产走 nginx 同域反代;实在要跨域用 Flask-CORS
    不停弹「登录已过期」token 没带上:Network 看请求头有没有 Authorization;或后端 JWT 密钥变了(重启后旧 token 全失效,重新登录即可)
    注册报「用户名已存在」但没注册过SQLite / MySQL 里已有同名演示账号——换一个用户名,或 seed_demo.py --reset
    build 后白屏部署在子目录却没加 --base=子路径,资源全 404
    刷新子路由 404nginx 没配 SPA 回落:try_files $uri $uri/ /index.html;
    上传头像 500上传目录没有写权限:chown -R www-data /opt/hiwen-api/app/static
    列表翻页重复 / 漏条排序没带次关键字 id(后端已处理;自己实现时别忘)

    八、怎么用这个项目学习

    三条路径按需选
    你是谁路径
    零基础入门开发十步 从第 1 步走到第 10 步,每步过「过关标准」再前进
    已会单端,补另一端前端熟 → 直接读 hiflask 的 views/article.py(最丰富的一个蓝图);后端熟 → 读 hivue 的 request.js + ArticleList.vue
    准备课程设计 / 面试把 六张图 讲清楚,再对着 接口总表 说设计取舍(冗余计数 / 软删除 / 统一响应)