本项目(ProjectAC::LibraryMS,简称ACLMS)是一个基于Web的图书管理系统,尽可能地贴近现实需求,利用关系型数据库(MySQL)对数据进行管理、统计。它的后端和数据库应该部署于图书馆内网,而客户端仅限于管理员登录和自助终端机刷卡登录,可以避免隐私数据(例如借还书信息)通过非官方终端泄露。
ACLMS采用的技术栈是:Mysql + koa2(on Node.js) + Vue.js + ProjectAC::UI。在正式上线时,请务必使用https以保证用户隐私数据的安全性(因为没有另外加安全措施)。
ACLMS具有3级权限系统:
- 第0级:未登录 - 此时只能进行图书查询功能,可以应用于自助图书检索终端;
- 第1级:自动柜员机(用户) - 可以通过刷借书证进行借还书;
- 第2级:工作人员 - 除了可以借还书,还可以办理办卡、注销卡、入库等业务;
- 隐藏级:后台 - 由专职的技术人员直接对后台进行操作,可以添加管理员或者建立新的业务。 本项目以GPLv3协议在Github网站上开源。另外,一个测试性的ACLMS系统已经在这里上线测试环境,可以进行各种功能的在线体验。
- 首次运行,请先配置好运行环境:
cd path/to/LibraryMS/
npm install -g nodemon
npm install
cd Frontend
npm install
- 开服
需要至少两个终端。
前端(nodemon测试服):
npm run dev
测试服端口号: 8080
后端(调试服):
npm start
测试服端口号:2333
- 在前端文件中修改后端服务器地址为真实地址
vim Frontend/src/config.js
会看见类似:
let serverURL = 'http://localhost:2333'
module.exports = {
serverURL
}
的内容,将serverURL的值改为真实服务器地址。
- 将设置数据库账户密码
vim lib/sql.js
会看见类似:
var wrapper = require("co-mysql");
var mysql = require("mysql");
var option =
{
host: 'localhost',
port: 3306,
database: 'library',
user: 'access',
password: '',
multipleStatements: true
}
var pool = mysql.createPool(option);
var p = wrapper(pool);
console.log('[INFO] MySQL Connector ready.');
async function execute(sql, args)
{
return await p.query(mysql.format(sql, args));
}
exports.sql = execute;
的内容,将option中的信息设置为服务器Mysql实际的配置。
- 数据库建立
在Mysql中运行source init.sql即可。
- 生成前端
./prepare.sh
- 开服
npm run koa
如果需要使用pm2来托管,请输入
npm run pm2
- 完成
打开 yourserver:yourport (例如sol-pic.com:8080),即可进入应用首页
后端的核心逻辑位于目录:/routes
前端的核心逻辑位于目录:/Frontend/src
如果需要对后端进行业务逻辑的更改,或是更好地了解ACLMS,请认真阅读本节内容。
ACLMS的后端主要分布在三个根url:/admin,/book,和__/card__。
说明:如果返回值为一个数字(或后面接一点信息而不是json格式),表示返回错误编码。其中:
let OK = 0
let NOT_LOGGED_IN = -1
let AUTH_FAILED = -2
let PERMISSION_DENIED = -3
let INFO_INCOMPLETE = -4
let NO_RESULT = -5
- /admin/login
功能:登录管理员账号
参数:
{
ano: 管理员用户ID,
password: 密码
}
返回值:
失败
-2
成功
{
ano: 管理员用户ID,
name: 管理员名字,
contact: 管理员联系方式
}
- /admin/logout
功能:登出管理员账号
参数:无
返回值:
未登录
-1
成功
0
- /admin
功能:查看当前登录的账号
参数:无
返回值:
未登录
-1
已登录
{
ano: 管理员用户ID,
name: 管理员名字,
contact: 管理员联系方式
}
- /book
功能:查询图书
参数:
{
bno: (可选)书号,
category: (可选)分类,
title: (可选)标题,
press: (可选)出版社,
yearl: (可选)年份下限,
yearr: (可选)年份上限,
author: (可选)作者,
pricel: (可选)价格下限,
pricer: (可选)价格上限,
order: (可选)排序方式(默认title),
number:(可选)显示的条数(默认50)
}
返回值:
{
list: [
{
bno: 书号,
category: 分类,
title: 标题,
press: 出版社,
year: 年份,
author: 作者,
price: 价格,
total: 总量,
stock: 库存
},
...
]
}
- /book/inbound
功能:批量入库
参数:
{
bno: 书号,
category: 分类,
title: 标题,
press: 出版社,
year: 年份,
author: 作者,
price: 价格,
total: 总量,
stock: 库存
}
返回值:
未登录权限2
-1
成功
0
- /book/borrowed
功能:显示某一张卡的借阅列表
参数:
{
cno: 卡号
}
返回值:
未登录权限1
-1
成功
{
list: [
{
bno: 书号,
title: 书名,
borrow_date: (最早)结束时间,
return_date: (最近)预计归还时间,
owed: 是否超期,
amount: 数量
},
...
]
}
- /book/borrow
功能:借书
参数:
{
bno: 要借的书的编号,
cno: 卡号
}
返回值:
未登录权限1
-1
书被借完
-5, 最近预计归还时间
书不存在
-3
成功
0
- /book/return
功能:还书
参数:
{
bno: 要还的书的编号,
cno: 卡号
}
返回值:
未登录权限1
-1
未借阅此书
-5
书不存在
-3
成功
0
- /card/list
功能:查看所有的卡信息
参数:无
返回值: 未登录权限2
-1
成功
{
list: [
{
cno: 卡号,
name: 名字,
department: 院系,
type: 类型,
Borrowed: 借书未还数目,
Owed: 超期未还数目
},
...
]
}
- /card/login
功能:刷卡登录
参数:
{
cno: 卡号
}
返回值:
卡不存在
-5
成功
{
cno: 卡号,
name: 名字,
department: 院系,
type: 类型
}
- /card/add
功能:添加一张卡
参数:
{
cno: 卡号,
name: 名字,
department: 院系,
type: 类型
}
返回值:
卡号已存在
-3
成功
0
- /card/remove
功能:删除一张卡
参数:
{
cno: 卡号
}
返回值:
卡号不存在
-5
成功
0