立项背景与目标: 传统图书管理存在手工登记已无法满足多角色协同与实时性需求。本项目目标是构建一套双端双角色的 Web 图书管理平台,让普通用户能自助借阅,管理员能高效运营。
核心功能模块(分双端):
普通用户端 — 书籍浏览与查询、书籍详情查看、在线借阅(自动判断库存与在借状态)、借阅记录追踪、最多 2 次续借、公告通知接收与未读标记。
管理员端 — 用户账号管理、书籍信息管理、借阅记录管理、公告发布、管理员权限设置。
业务流程路径: 用户注册→登录→首页浏览书籍→点击借阅→借阅成功生成记录→到期前可续借 30 天(上限 2 次)→到期未还自动转为逾期状态→管理员可标记归还→管理员发布公告→普通用户进入系统看到未读红点提示。
整体架构: 采用前后端分离的经典三层架构。后端 Flask + Blueprint 模块化拆分(6 个独立蓝图:auth / books / borrow / announcements / users / upload),SQLAlchemy ORM 操作 SQLite,JWT 实现双端鉴权;前端 Vue3 + Vite + Pinia 状态管理 + Vue Router 角色守卫 + Element Plus 组件库,通过 axios 拦截器统一处理 JWT 注入与错误响应。
各模块技术实现:
鉴权层: JWT 登录后 access token 中直接携带 role_id,后端自定义 @require_admin 装饰器在路由层强制拦截,实现 admin/user 双角色的后端硬隔离,前端 meta.roles 路由守卫做二次拦截防止 URL 直入。
书籍与借阅: Book 模型维护库存/在借状态,BorrowRecord 记录完整流转(borrowed→renewed→overdue→returned),续借前校验"已还/已逾期不可续借 + renew_count ≤ 2"的状态机规则。
公告未读系统: 未采用传统"阅读记录"数据表,而是在 localStorage 中按 userId 隔离存储 { announcementId: 最后查看时间戳 },判定逻辑为 公告 created_at > 我的查看时间 → 未读。零后端改动实现精准未读标记,支持脉冲红点/已读勾选/一键全部已读。
图片上传: 自定义 upload 路由做 MIME + 文件扩展名双重校验、5MB 上限校验,UUID 重命名防覆盖,Flask 静态文件服务对外提供 /uploads/covers/ 访问路径。
我的负责模块: 全栈独立完成 —— 数据库模型设计、后端 11 个 RESTful API、前端 15 个页面组件、Pinia store 封装、路由守卫矩阵。