BM 是 BookManager 的缩写。

1,项目介绍

book-manager 是一套图书管理系统,前端界面使用了 EasyUI 框架,后端基于SpringBoot+MyBatis 实现。

本系统包含首页门户、系统管理、权限管理、图书管理等模块。

源码地址:https://gitee.com/codeshellme/book-manager

2,技术选型

主要技术

技术 说明 官网
Java 后端语言 https://www.java.com/zh-CN/
MySQL 数据库 https://www.mysql.com/

前端技术框架

技术 说明 官网
JQuery JavaScript 库 https://jquery.com/
EasyUI Web UI 框架 https://www.jeasyui.net/

后端技术框架

技术 说明 官网
SpringBoot 容器+MVC框架 https://spring.io/projects/spring-boot
SpringSecurity 认证和授权框架 https://spring.io/projects/spring-security
JWT JWT 登录支持 https://github.com/jwtk/jjwt
MyBatis ORM 框架 http://www.mybatis.org/mybatis-3/zh/index.html
Lombok Java 对象封装工具 https://github.com/rzwitserloot/lombok
PageHelper MyBatis 分页插件 https://pagehelper.github.io
Hutool Java 工具类库 https://www.hutool.cn
Maven 项目构建工具 https://maven.apache.org

开发工具

工具 说明 官网
IDEA Java 集成开发环境 https://www.jetbrains.com/idea/download/
X-shell Linux 远程连接工具 https://www.netsarang.com/zh/all-downloads/
Navicat 数据库连接工具 https://www.navicat.com.cn
Git 版本控制工具 https://git-scm.com
Typora Markdown 编辑器 https://typora.io/

Idea 插件

这里介绍两个 Idea 插件(File -> Settings -> Plugins):

  • Lombok
  • Free MyBatis plugin

因为项目中使用了 Lombok,所以 Lombok 插件是必须的;Free MyBatis plugin 可以实现 Dao 层接口到 Mapper 文件的跳转。

在这里插入图片描述

3,数据库构建

数据库使用的是 MySQL。

1,创建库

新建 book 数据库:

在这里插入图片描述

CREATE DATABASE `book` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

2,创建表

1,创建用户表 ums_user

-- Table structure for ums_user
DROP TABLE IF EXISTS `ums_user`;
CREATE TABLE `ums_user`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 ID',
  `username` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
  `nickname` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '昵称',
  `pincode` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '拼音简码',
  `status` tinyint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '帐号启用状态:0->禁用;1->启用',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  `role_id` int(0) UNSIGNED NOT NULL COMMENT '角色 ID',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx_username`(`username`) USING BTREE COMMENT '唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of ums_user
INSERT INTO `ums_user` VALUES (1, 'admin', '3', '超级管理员', 'cjgly', 1, now(), now(), 1);
INSERT INTO `ums_user` VALUES (2, 'book', '5', '图书管理员', 'tsgly', 1, now(), now(), 2);
INSERT INTO `ums_user` VALUES (3, '11', '11', '11', '11', 1, now(), now(), 3);
INSERT INTO `ums_user` VALUES (4, '12', '12', '12', '12', 1, now(), now(), 3);

2,创建角色表 ums_role

-- Table structure for ums_role
DROP TABLE IF EXISTS `ums_role`;
CREATE TABLE `ums_role`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `name` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称',
  `sign` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色标识',
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色说明',
  `status` tinyint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '帐号启用状态:0->禁用;1->启用',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx_sign`(`sign`) USING BTREE COMMENT '唯一索引,sign 作为唯一标识,不能重复'
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of ums_role
INSERT INTO `ums_role` VALUES (1, '超级用户', 'super', '拥有最高权限', 1, now(), now());
INSERT INTO `ums_role` VALUES (2, '图书管理员', 'manager', '图书管理员', 1, now(), now());
INSERT INTO `ums_role` VALUES (3, '普通用户', 'user', '普通用户', 1, now(), now());

3,创建菜单表 ums_menu

-- Table structure for ums_menu
DROP TABLE IF EXISTS `ums_menu`;
CREATE TABLE `ums_menu`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 ID',
  `parent_id` int(0) UNSIGNED NOT NULL COMMENT '上级菜单id',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '菜单名称',
  `icon` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单图标',
  `url` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '菜单url',
  `type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '菜单类型:DIR/SUBMENU',
  `order` tinyint(0) UNSIGNED NOT NULL COMMENT '菜单排序',
  `status` tinyint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '启用状态:0->禁用;1->启用',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of ums_menu
INSERT INTO `ums_menu` VALUES (1, 0, '权限管理', 'icon-computer-edit', '/', 'DIR', 1, 1, now(), now());
INSERT INTO `ums_menu` VALUES (2, 1, '菜单管理', 'icon-node-tree16', '/menu', 'SUBMENU', 1, 1, now(), now());
INSERT INTO `ums_menu` VALUES (3, 1, '角色管理', 'icon-user-group', '/role', 'SUBMENU', 2, 1, now(), now());
INSERT INTO `ums_menu` VALUES (4, 0, '图书管理', 'icon-book-open', '/', 'DIR', 2, 1, now(), now());
INSERT INTO `ums_menu` VALUES (5, 4, '图书借阅', 'icon-book-tabs', '/book_borrow', 'SUBMENU', 3, 1, now(), now());
INSERT INTO `ums_menu` VALUES (11, 1, '用户管理', 'icon-users', '/user', 'SUBMENU', 3, 1, now(), now());
INSERT INTO `ums_menu` VALUES (12, 0, '系统管理', 'icon-wrench', '/', 'DIR', 4, 1, now(), now());
INSERT INTO `ums_menu` VALUES (13, 12, '字典管理', 'icon-application-view-columns', '/sys_dict', 'SUBMENU', 1, 1, now(), now());
INSERT INTO `ums_menu` VALUES (14, 12, '作者管理', 'icon-user-suit', '/sys_author', 'SUBMENU', 2, 1, now(), now());
INSERT INTO `ums_menu` VALUES (15, 4, '图书条目', 'icon-application-side-list', '/sys_book', 'SUBMENU', 1, 1, now(), now());
INSERT INTO `ums_menu` VALUES (16, 4, '图书库存', 'icon-book-key', '/book_stock', 'SUBMENU', 2, 1, now(), now());

4,创建角色菜单关系表 ums_role_menu

-- Table structure for ums_role_menu
DROP TABLE IF EXISTS `ums_role_menu`;
CREATE TABLE `ums_role_menu`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `role_id` int(0) UNSIGNED NOT NULL COMMENT '角色 id',
  `menu_id` int(0) UNSIGNED NOT NULL COMMENT '角色 id 对应的菜单 id',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx_role_menu`(`role_id`, `menu_id`) USING BTREE COMMENT '联合唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 80 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of ums_role_menu
INSERT INTO `ums_role_menu` VALUES (11, 1, 1);
INSERT INTO `ums_role_menu` VALUES (55, 1, 2);
INSERT INTO `ums_role_menu` VALUES (14, 1, 3);
INSERT INTO `ums_role_menu` VALUES (71, 1, 4);
INSERT INTO `ums_role_menu` VALUES (69, 1, 5);
INSERT INTO `ums_role_menu` VALUES (70, 1, 6);
INSERT INTO `ums_role_menu` VALUES (3, 1, 7);
INSERT INTO `ums_role_menu` VALUES (5, 1, 9);
INSERT INTO `ums_role_menu` VALUES (67, 1, 11);
INSERT INTO `ums_role_menu` VALUES (73, 1, 12);
INSERT INTO `ums_role_menu` VALUES (72, 1, 13);
INSERT INTO `ums_role_menu` VALUES (74, 1, 14);
INSERT INTO `ums_role_menu` VALUES (76, 1, 15);
INSERT INTO `ums_role_menu` VALUES (78, 1, 16);
INSERT INTO `ums_role_menu` VALUES (60, 2, 1);
INSERT INTO `ums_role_menu` VALUES (59, 2, 3);
INSERT INTO `ums_role_menu` VALUES (44, 2, 4);
INSERT INTO `ums_role_menu` VALUES (43, 2, 6);
INSERT INTO `ums_role_menu` VALUES (42, 2, 7);
INSERT INTO `ums_role_menu` VALUES (41, 2, 9);
INSERT INTO `ums_role_menu` VALUES (66, 3, 4);
INSERT INTO `ums_role_menu` VALUES (65, 3, 5);

5,创建字典表 sys_dict

-- Table structure for sys_dict
DROP TABLE IF EXISTS `sys_dict`;
CREATE TABLE `sys_dict`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `father_id` int(0) UNSIGNED NOT NULL COMMENT '父 id',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
  `keyname` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '关键字',
  `dicttype` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典类型',
  `sn` int(0) UNSIGNED NOT NULL COMMENT '排序',
  `status` tinyint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '启用状态:0->禁用;1->启用',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  `pincode` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称简码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of sys_dict
INSERT INTO `sys_dict` VALUES (1, 0, '国籍', 'Nationality', 'Nationality', 0, 1, now(), now(), 'gj');
INSERT INTO `sys_dict` VALUES (2, 1, '中国', 'China', 'Nationality', 1, 1, now(), now(), 'zg');
INSERT INTO `sys_dict` VALUES (3, 1, '美国', 'America', 'Nationality', 2, 1, now(), now(), 'mg');
INSERT INTO `sys_dict` VALUES (4, 1, '俄罗斯', 'Russia', 'Nationality', 3, 1, now(), now(), 'els');
INSERT INTO `sys_dict` VALUES (5, 1, '法国', 'France', 'Nationality', 4, 1, now(), now(), 'fg');
INSERT INTO `sys_dict` VALUES (6, 1, '德国', 'Germany', 'Nationality', 5, 1, now(), now(), 'dg');
INSERT INTO `sys_dict` VALUES (7, 1, '日本', 'Japan', 'Nationality', 6, 1, now(), now(), 'rb');
INSERT INTO `sys_dict` VALUES (8, 1, '新加坡', 'Singapore', 'Nationality', 7, 1, now(), now(), 'xjp');
INSERT INTO `sys_dict` VALUES (9, 0, '性别', 'Sex', 'Sex', 0, 1, now(), now(), 'xb');
INSERT INTO `sys_dict` VALUES (10, 9, '男', 'Man', 'Sex', 1, 1, now(), now(), 'n');
INSERT INTO `sys_dict` VALUES (11, 9, '女', 'Women', 'Sex', 2, 1, now(), now(), 'n');
INSERT INTO `sys_dict` VALUES (12, 0, '图书类型', 'Booktype', 'Booktype', 0, 1, now(), now(), 'tslx');
INSERT INTO `sys_dict` VALUES (13, 12, '小说', 'Novel', 'Booktype', 1, 1, now(), now(), 'xs');
INSERT INTO `sys_dict` VALUES (14, 12, '文学', 'Literature', 'Booktype', 2, 1, now(), now(), 'wx');
INSERT INTO `sys_dict` VALUES (15, 12, '传记', 'Biography', 'Booktype', 3, 1, now(), now(), 'zj');
INSERT INTO `sys_dict` VALUES (16, 12, '艺术', 'Art', 'Booktype', 4, 1, now(), now(), 'ys');
INSERT INTO `sys_dict` VALUES (17, 12, '摄影', 'Photography', 'Booktype', 5, 1, now(), now(), 'sy');
INSERT INTO `sys_dict` VALUES (18, 12, '哲学', 'Philosophy', 'Booktype', 6, 1, now(), now(), 'zx');
INSERT INTO `sys_dict` VALUES (19, 12, '历史', 'History', 'Booktype', 7, 1, now(), now(), 'ls');
INSERT INTO `sys_dict` VALUES (20, 12, '军事', 'Military', 'Booktype', 8, 1, now(), now(), 'js');
INSERT INTO `sys_dict` VALUES (21, 12, '计算机', 'Computer', 'Booktype', 9, 1, now(), now(), 'jsj');

6,创建图书作者表 book_author

-- Table structure for book_author
DROP TABLE IF EXISTS `book_author`;
CREATE TABLE `book_author`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  `pincode` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名简码',
  `sex` tinyint(0) UNSIGNED NOT NULL COMMENT '性别:0->女,1->男',
  `nationality_id` int(0) UNSIGNED NOT NULL COMMENT '国籍 id,见 sys_dict 表',
  `status` tinyint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '启用状态:0->禁用;1->启用',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx_name`(`name`) USING BTREE COMMENT '唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of book_author
INSERT INTO `book_author` VALUES (1, '鲁迅', 'lx', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (2, '沈从文', 'scw', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (3, '张爱玲', 'zal', 0, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (4, '巴金', 'bj', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (5, '钱钟书', 'qzs', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (6, '茅盾', 'md', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (7, '莫言', 'my', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (8, '史铁生', 'sts', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (9, '余秋雨', 'yqy', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (10, '韩寒', 'hh', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (11, '郭敬明', 'gjm', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (12, '易中天', 'yzt', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (14, '余华', 'yh', 1, 2, 1, now(), now());
INSERT INTO `book_author` VALUES (15, '刘震云', 'lzy', 1, 2, 1, now(), now());

7,创建图书条目表 book_item

-- Table structure for book_item
DROP TABLE IF EXISTS `book_item`;
CREATE TABLE `book_item`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '书名',
  `pincode` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '书名简码',
  `type_id` int(0) UNSIGNED NOT NULL COMMENT '书的类型',
  `author_id` int(0) UNSIGNED NOT NULL COMMENT '作者 id',
  `publisher` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '出版社',
  `status` tinyint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '0->禁用;1->启用',
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx`(`name`) USING BTREE COMMENT '唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 27 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of book_item
INSERT INTO `book_item` VALUES (1, '呐喊', 'nh', 14, 1, 'aaa', 1, 'aaaaa', now(), now());
INSERT INTO `book_item` VALUES (2, '彷徨', 'ph', 14, 1, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (3, '围城', 'wc', 13, 5, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (4, '人·兽·鬼', 'rsg', 13, 5, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (5, '丰乳肥臀', 'frft', 13, 7, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (6, '生死疲劳', 'sspl', 13, 7, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (7, '红高粱家族', 'hgljz', 13, 7, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (8, '我与地坛', 'wydt', 14, 8, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (9, '务虚笔记', 'wxbj', 14, 8, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (10, '病隙碎笔', 'bxsb', 14, 8, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (11, '文化苦旅', 'whkl', 14, 9, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (12, '山居笔记', 'sjbj', 14, 9, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (13, '千年一叹', 'qnyt', 14, 9, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (14, '行者无疆', 'xzwj', 14, 9, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (15, '霜冷长河', 'slch', 14, 9, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (16, '借我一生', 'jwys', 14, 9, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (17, '三重门', 'scm', 13, 10, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (18, '零下一度', 'lxyd', 13, 10, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (19, '像少年啦飞驰', 'xsnlfc', 13, 10, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (20, '一座城池', 'yzcc', 13, 10, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (21, '杂的文', 'zdw', 14, 10, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (22, '我所理解的生活', 'wsljdsh', 14, 10, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (23, '活着', 'hz', 13, 14, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (24, '许三观卖血记', 'xsgmxj', 13, 14, NULL, 1, NULL, now(), now());
INSERT INTO `book_item` VALUES (25, '兄弟', 'xd', 13, 14, NULL, 1, NULL, now(), now());

8,创建图书库存表 book_stock

-- Table structure for book_stock
DROP TABLE IF EXISTS `book_stock`;
CREATE TABLE `book_stock`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `book_id` int(0) UNSIGNED NOT NULL COMMENT 'book_item.id',
  `num` int(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT '库存数',
  `status` tinyint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '0->禁用;1->启用',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx_bookid`(`book_id`) USING BTREE COMMENT '唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of book_stock
INSERT INTO `book_stock` VALUES (2, 5, 0, 1, now(), now());
INSERT INTO `book_stock` VALUES (3, 8, 5, 1, now(), now());
INSERT INTO `book_stock` VALUES (4, 9, 0, 1, now(), now());
INSERT INTO `book_stock` VALUES (5, 10, 10, 1, now(), now());
INSERT INTO `book_stock` VALUES (6, 2, 0, 1, now(), now());
INSERT INTO `book_stock` VALUES (7, 3, 0, 1, now(), now());
INSERT INTO `book_stock` VALUES (8, 4, 8, 1, now(), now());
INSERT INTO `book_stock` VALUES (9, 6, 0, 1, now(), now());
INSERT INTO `book_stock` VALUES (10, 7, 0, 1, now(), now());
INSERT INTO `book_stock` VALUES (12, 11, 0, 1, now(), now());
INSERT INTO `book_stock` VALUES (13, 17, 3, 1, now(), now());

9,创建图书借阅表 book_borrow

-- Table structure for book_borrow
DROP TABLE IF EXISTS `book_borrow`;
CREATE TABLE `book_borrow`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `stock_id` int(0) UNSIGNED NOT NULL COMMENT 'book_stock.id',
  `student_id` int(0) UNSIGNED NOT NULL COMMENT '学生 id',
  `student_name` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生姓名',
  `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y' COMMENT '借书状态 Y-> 借书 N->已还书',
  `borrow_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '借书时间',
  `return_time` datetime(0) NULL DEFAULT NULL COMMENT '还书时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- Records of book_borrow
INSERT INTO `book_borrow` VALUES (1, 5, 1, '学生01', 'Y', now(), NULL);
INSERT INTO `book_borrow` VALUES (4, 8, 1, '学生01', 'N', now(), now());
INSERT INTO `book_borrow` VALUES (5, 8, 2, '学生02', 'N', now(), now());
INSERT INTO `book_borrow` VALUES (6, 9, 2, '学生02', 'Y', now(), NULL);
INSERT INTO `book_borrow` VALUES (7, 10, 3, '学生03', 'Y', now(), NULL);

4,项目构建

从 GitHub 上拉去代码到 Idea 中,在配置文件 application.properties 中配置数据库信息。

启动类是 com.codeshellme.bookmanager.BookManagerApplication,运行它就可以启动项目。

5,功能介绍

1,用户首页

在这里插入图片描述

2,登录界面

在这里插入图片描述

3,菜单列表

目前的菜单列表如下:

在这里插入图片描述

分别有:

  • 权限管理:包括菜单管理,角色管理和用户管理
    • 菜单管理:管理整个系统的菜单,每项菜单对应不同的功能
    • 角色管理:管理整个系统的角色,每个角色可配置不同的菜单功能,比如:
      • super 角色拥有系统的最高权限,拥有系统中的所有功能
      • manager 角色主要分配给图书管理员,可以拥有图书管理和系统管理功能,但不能拥有权限管理功能
    • 用户管理:管理整个系统的用户,每个用户只能属于一种角色,拥有所属角色的所有功能
  • 图书管理:主要用于管理图书
    • 图书条目:最基础的图书信息
    • 图书库存:代表图书馆中的所有图书库存,所有能进入库存的图书,都必须先进入图书条目
    • 图书借阅:图书借阅相关功能,只有在库存中的图书才能被借阅
    • 以上三者的范围关系为:图书条目 >= 图书库存 >= 图书借阅
  • 系统管理
    • 字典管理:管理一些基础信息,比如图书都有哪些类型,作者的国籍都有哪些等
    • 作者管理:每本书都有作者,该功能管理了系统中所有的作者信息

4,菜单管理

在这里插入图片描述

5,角色管理

在这里插入图片描述

6,用户管理

在这里插入图片描述

7,图书条目

在这里插入图片描述

8,图书库存

在这里插入图片描述

9,图书借阅

在这里插入图片描述

10,字典管理

在这里插入图片描述

11,作者管理

在这里插入图片描述

6,项目部署

下面介绍两种部署服务的方式:

  • jar 包方式部署
    • 此方式使用 springboot 内置的 tomcat 运行
  • war 包方式部署
    • 此方式使用外部 Tomcat

1,以 jar 包方式部署

用 Idea 打 jar 包非常方便,无需修改任何 pom.xml 配置,先双击 clean,然后双击 package,就可打成 jar 包。

在这里插入图片描述

打包成功后,会在 target 目录下生成一个 book-manager-0.0.1-SNAPSHOT.jar 文件,直接用 java 命令运行它即可启动项目:

> java -jar book-manager-0.0.1-SNAPSHOT.jar

2,以 war 包方式部署

首先需在 pom.xml 中加入打包方式:

<packaging>war</packaging>

然后,启动类 BookManagerApplication 继承 SpringBootServletInitializer,并覆盖 configure 方法:

@SpringBootApplication
public class BookManagerApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(BookManagerApplication.class, args);
    }

    // 继承 SpringBootServletInitializer 实现 configure
    // 以便打 war 包,进行外部服务器部署
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(BookManagerApplication.class);
    }
}

然后,再次使用 maven 打包:

在这里插入图片描述

打包成功后,会在 target 目录下生成一个 book-manager-0.0.1-SNAPSHOT.war 文件,将其重命名为 book-manager.war,放入 tomcatwebapps 目录中。

然后需要配置 Tomcat 的配置文件 server.xml,其中可设置服务器端口号等信息,我们需在 Server>Service>Engine>Host 标签内加入下面配置:

<Context docBase="Tomcat根目录/webapps/book-manager" path="/" reloadable="true"/>

最后启动 Tomcat 即可。

另外,关于 springboot 相关的配置在 Tomcat根目录\webapps\book-manager\WEB-INF\classes\application.properties 文件中,其中包括数据库配置

需要注意的是,该文件中的 server.port 已不起作用(因为现在的服务器是外部 Tomcat,所以端口号要去 Tomcat 的配置文件中进行配置)。