项目简介
智慧图书馆是一个面向中小型图书馆、社区书屋、校园图书馆的商业级管理系统。读者可通过手机完成图书检索、借阅/续借、座位预约、扫码签到、缴纳罚款等全流程操作;馆员通过管理后台进行图书管理、读者管理、借阅审核、数据统计、运营配置等工作。
在多分馆、规则引擎、读者等级、微信支付、模板消息推送、运营推荐书单等方面做了完整的产品化升级。
项目地址:https://github.com/phpstage520/smart-library
技术方案设计思路
整体架构
┌─────────────────────────────────────────────────┐
│ 用户层 │
│ H5 (uni-app) 微信小程序 管理后台 │
└──────────────────────┬──────────────────────────┘
│ HTTP / JSON
┌──────────────────────▼──────────────────────────┐
│ Nginx 反向代理 │
│ /api/* → backend:8000 /admin/* → admin:5175 │
│ / → miniapp H5 静态文件 │
└──────────────────────┬──────────────────────────┘
│
┌──────────────────────▼──────────────────────────┐
│ ThinkPHP 8 后端 (多应用模式) │
│ ┌──────────┐ ┌──────────┐ ┌────────────────┐ │
│ │ api 应用 │ │ admin 应用│ │ common 公共层 │ │
│ │ (读者API) │ │ (管理API) │ │ Model/Service │ │
│ └────┬─────┘ └────┬─────┘ │ Middleware │ │
│ │ │ │ Util/Jwt │ │
│ └──────────────┘ └────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────┐ ┌──────────────┐ │
│ │ MySQL 8.0 │ │ Redis 7.0 │ │
│ │ (13 张核心表) │ │ (队列/缓存) │ │
│ └────────────────┘ └──────────────┘ │
└──────────────────────────────────────────────────┘设计决策
1. 后端:ThinkPHP 8 多应用模式
选择 ThinkPHP 8 作为后端框架的核心考量:
多应用隔离:将 api(读者端)和admin(管理端)拆分为独立应用,路由、中间件、验证器完全隔离。读者端不可访问管理接口,管理端通过adminrole 中间件二次鉴权。common 公共层:Model、Service、Middleware、Util 等跨应用共享代码收归 app/common/,避免重复。例如JwtUtil(基于 firebase/php-jwt,HS256 签名)、Resp(统一 JSON 响应格式)、Auth中间件(Bearer Token 解析 + 角色校验)。BizException 异常体系:自定义业务异常 + 统一错误码(1001 参数错误、1002 未登录、1003 无权限、2000 业务异常、5000 服务端错误),前端统一处理错误展示。
2. 认证体系:JWT + 双角色
使用 JWT(HS256,默认 2h 有效期)做无状态认证,token 通过 Authorization: Bearer <token>传递。两种角色: reader(读者)和admin(管理员)。同一个中间件通过$role参数切换鉴权粒度。微信小程序端支持 wx_login静默登录流程。
3. 前端:uni-app 跨端方案
基于 uni-app 3.0+Vue 3 Composition API+Vite 5,一套代码同时编译 H5 和微信小程序。采用 FirstUI 组件库加速开发, vue-i18n预留国际化能力。本地开发通过 Vite 热更新(端口 5173),生产构建为静态文件。
4. 管理后台:Vue3 + Element Plus
独立项目( admin-web/),使用 Vue3 + Vite + Element Plus + Pinia + Vue Router 构建。集成 ECharts 实现数据大屏(借阅趋势图), axios 封装统一 API 请求。 通过 Vite 开发服务器运行(端口 5175),生产构建后部署为独立前端。
5. 多分馆 + 规则引擎
数据库层面通过 branch_id字段实现数据级隔离,每个分馆拥有独立的图书库存、座位资源、读者数据。借阅规则(最大借阅数量、借阅天数、续借次数、逾期罚款金额等)通过配置表控制,不同分馆可配置不同规则,支持馆员在后台实时调整。 读者等级体系(普通/银卡/金卡)与借阅限额挂钩,等级越高可借数量越多、借期越长。
6. 微信支付与消息
集成 EasyWeChat 6.x SDK 实现微信小程序支付(押金缴纳、罚款缴纳)。 预留微信订阅消息模板配置,支持借阅到期提醒、逾期提醒、预约成功/取消通知。
7. 任务调度与队列
定时任务通过 ThinkPHP Command 实现,支持三组任务: daily:每日批量(逾期标记 + 推荐刷新 + 预约过期处理)overdue:单独执行逾期标记recommend:单独触发推荐刷新队列系统使用 Redis 驱动( think-queue),用于异步处理耗时操作,如微信模板消息推送。
8. 推荐系统
基于用户行为(浏览/收藏/借阅)计算图书相似度,存储在 book_similarity表。通过定时任务( RecommendService::refreshAll())每天批量刷新推荐结果。同时支持馆员手动配置运营推荐书单,兼顾算法推荐与人工运营。
9. API 设计
统一响应结构: {code: 0, msg: "ok", data: ...}分页响应: {code: 0, data: {list: [...], total: N, page: 1, size: 20, pages: N}}RESTful 风格路由,读者端与管理员端路由完全分离。
功能特性
读者端(uni-app H5 / 微信小程序)
图书浏览、搜索(支持 ISBN)、分类筛选 图书借阅、续借、归还 座位预约(多区域选择 + 扫码签到) 主题书单推荐(馆员配置) 消息中心(借书/到期/逾期/预约/系统通知) 个人中心(等级/信用分/押金/罚款/阅读报告) 扫码查书、借阅证二维码
管理后台(Vue3 + Element Plus)
数据大屏(借阅趋势图) 图书 CRUD + Excel 导入导出 读者管理(信用分、等级、封禁) 借阅记录 + 罚款管理 座位/空间管理 分类管理 通知公告 书评管理(审核/删除)
快速开始
环境要求
PHP 8.1+ MySQL 8.0+ Redis 7.0+ Node.js 18+ Composer 2.0+
1. 后端
cd backend
composer install
cp .env.example .env # 配置数据库连接
php think run --port=8000
.env 配置项:
DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=smart_library
DB_USER=root
DB_PASS=your_password
JWT_SECRET=your_random_secret
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
2. 初始化数据库
# 导入数据库结构
mysql -h 127.0.0.1 -P 3306 -uroot -p < backend/database/schema.sql
# 导入种子数据(200本图书 + 30读者 + 120座位)
mysql -h 127.0.0.1 -P 3306 -uroot -p < backend/database/seed.sql
3. 读者端(uni-app H5)
cd miniapp
npm install
npm run dev:h5
访问 http://localhost:5173
4. 管理后台
cd admin-web
npm install
npm run dev
访问 http://localhost:5175
测试账号
端口一览
项目结构
smart-library/
├── backend/ # ThinkPHP 8 后端
│ ├── app/
│ │ ├── api/ # 小程序/H5 API 控制器
│ │ ├── admin/ # 管理后台 API 控制器
│ │ ├── common/ # 公共层(Model/Service/Middleware/Util)
│ │ └── command/ # 定时任务调度
│ ├── config/ # 配置文件(数据库/缓存/队列/微信)
│ ├── database/ # 数据库迁移/种子数据
│ └── route/ # 应用级路由
├── miniapp/ # uni-app 读者端
│ ├── pages/ # 页面文件
│ ├── utils/ # 工具函数(API 封装)
│ └── static/ # 静态资源
├── admin-web/ # Vue3 管理后台
│ ├── src/
│ │ ├── views/ # 页面
│ │ ├── api/ # API 封装
│ │ └── router/ # 路由配置
│ └── vite.config.js
├── docs/ # 截图文档
└── README.md
数据库表
13 张核心表:
核心功能特色
多分馆运营 — 数据级隔离,各分馆独立图书库存、座位资源、读者数据 可配置规则引擎 — 借阅数量、天数、续借次数、罚款金额等后台实时调整 读者等级体系 — 普通 / 银卡 / 金卡,等级越高可借数量越多、借期越长 微信支付 — 支持押金缴纳、罚款支付 原生微信小程序 — 一套代码编译 H5 + 微信小程序 扫码签到 / 查书 — 座位预约签到、图书扫码查询 消息中心 + 模板消息 — 借阅到期/逾期/预约通知推送 运营推荐书单 — 算法推荐 + 馆员手动配置混合 运营工具 — 活动配置、书单管理、群发通知、数据报表
部署(生产环境)
# Nginx 配置示例
server {
listen 80;
server_name your-domain.com;
# 后端 API
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 管理后台
location /admin/ {
proxy_pass http://127.0.0.1:5175;
proxy_set_header Host $host;
}
# H5 静态文件
root /path/to/miniapp/dist/build/h5;
index index.html;
}
# 定时任务(crontab)
0 3 * * * cd /path/to/backend && php think schedule daily >> runtime/cron.log 2>&1
感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。