×

一个基于 ThinkPHP 8 + Uniapp 的全功能智慧图书馆管理系统

独孤求败 独孤求败 发表于2026-06-25 15:32:14 浏览37 评论0

抢沙发发表评论

项目简介

智慧图书馆是一个面向中小型图书馆、社区书屋、校园图书馆的商业级管理系统。读者可通过手机完成图书检索、借阅/续借、座位预约、扫码签到、缴纳罚款等全流程操作;馆员通过管理后台进行图书管理、读者管理、借阅审核、数据统计、运营配置等工作。

在多分馆、规则引擎、读者等级、微信支付、模板消息推送、运营推荐书单等方面做了完整的产品化升级。

项目地址: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(管理端)拆分为独立应用,路由、中间件、验证器完全隔离。读者端不可访问管理接口,管理端通过 admin role 中间件二次鉴权。
  • 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


测试账号

角色
手机号
密码
读者
13910000001 ~ 13910000030
123456
管理员
13800000000
admin123


端口一览

服务
端口
后端 API
8000
uni-app H5
5173
管理后台
5175
MySQL
3306
Redis
6379


项目结构

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 张核心表:

表名
说明
user
用户/读者(含等级、信用分、押金)
category
图书分类
book
图书信息
borrow
借阅记录
seat
座位资源
reservation
座位预约
collection
收藏
book_review
书评
user_behavior
用户行为(浏览/收藏/借阅日志)
book_similarity
图书相似度(推荐系统)
fine
罚款记录
notice
通知公告
admin
管理员


核心功能特色

  • 多分馆运营 — 数据级隔离,各分馆独立图书库存、座位资源、读者数据
  • 可配置规则引擎 — 借阅数量、天数、续借次数、罚款金额等后台实时调整
  • 读者等级体系 — 普通 / 银卡 / 金卡,等级越高可借数量越多、借期越长
  • 微信支付 — 支持押金缴纳、罚款支付
  • 原生微信小程序 — 一套代码编译 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

感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。


群贤毕至

访客