# SpringBoot+MySQL+HTML图书管理系统设计与实现(附源码下载地址)
**Repository Path**: pankw01/booksManageBoot
## Basic Information
- **Project Name**: SpringBoot+MySQL+HTML图书管理系统设计与实现(附源码下载地址)
- **Description**: 本系统实现了图书管理、借阅管理、用户管理、公告管理、个人中心等功能,界面友好、操作容易、维护简单,同时具备数据的完整性和安全性,符合高校图书管理系统的要求
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2023-09-25
- **Last Updated**: 2023-09-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Java项目精选:[https://gitee.com/cyouagain/graduation](https://gitee.com/cyouagain/graduation)
源码下载:微信搜索公众号【`IT学长`】,回复关键词“`20220927`”下载图书管理系统(booksManageBoot)源码
## 01 系统概述
图书管理系统有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、成本低等,这些优点能够极大地提高图书管理的效率。因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统是非常必要的。
本系统实现了图书管理、借阅管理、用户管理、公告管理、个人中心等功能,界面友好、操作容易、维护简单,同时具备数据的完整性和安全性,符合高校图书管理系统的要求。

## 02 开发工具及技术选型
- 数据表现层:Html+JavaScript+CSS+JavaEx+JQuery
- 业务逻辑层:Java+Spring+SpringMVC
- 数据持久层:MySQL+MyBatis
- 开发工具:IDEA / Eclipse
## 03 运行环境
```
JDK1.8 + Maven3 + MySQL5.7
```
## 04 用户分析
本系统主要用于高校图书管理,使用人群为系统管理员、普通读者。
- 系统管理员:管理整个系统的各项功能,如:公告信息、图书信息、用户信息更新维护。
- 普通读者:借阅图书、归还图书、阅览公告信息、查询编辑个人信息等。
## 05 功能分析
**系统管理员:**
1. 首页
- 名片方式展示系统管理员拥有的权限
2. 图书管理
- 图书列表:显示已上架的图书信息,可对已上架图书进行搜索、修改、删除操作
- 图书上架:录入图书信息,输入图书名称、作者、图书分类,页数,定价等数据进行图书录入
3. 借阅管理
- 借阅图书:根据图书名称、作者名称,图书分类等搜索、查看、借阅图书
- 归还图书:对已经借阅的图书进行归还操作
4. 用户管理
- 用户列表:显示已注册的用户,可以对已注册的用户信息进行搜索、修改、删除操作
- 用户添加:录入用户的昵称、用户名、密码、生日、电话、邮箱等信息添加新用户
5. 公告管理
- 公告列表:显示已发布的公告信息,可以对已发布的公告进行搜索、修改、删除等操作
- 公告发布:输入公告标题,发布时间,公告内容等要素发布公告
6. 个人管理
- 个人信息详情:查看个人信息
- 个人信息修改:修改个人信息

**普通读者:**
1. 首页
- 名片方式展示普通读者拥有的权限
2. 借阅管理
- 借阅图书:根据图书名称、作者名称,图书分类等搜索、查看、借阅图书
- 归还图书:对已借阅的图书进行归还操作
3. 公告管理
- 公告列表:查看已发布的公告信息
4. 个人管理
- 个人信息详情:查看个人信息
- 个人信息修改:修改个人信息

## 06 数据库设计
**users:** 存储用户信息
| 字段名称 | 类型 | 是否为null | 是否主键 | 说明 |
|--|--|--|--|--|
| id | int | 否 | 是 | ID主键|
| address | varchar | 是 | 否 | 地址 |
| avatar | varchar | 是 | 否 | 头像 |
| birthday | datetime | 是 | 否 | 生日 |
| email | varchar | 是 | 否 | 邮箱 |
| is_admin | int | 是 | 否 | 是否为管理员(0 管理员 1 普通用户) |
| nickname | varchar | 是 | 否 | 昵称 |
| password | varchar | 是 | 否 | 密码 |
| size | int | 是 | 否 | 可借数量 |
| tel | varchar | 是 | 否 | 电话 |
| username | varchar | 是 | 否 | 用户名 |
**book:** 存储图书信息
| 字段名称 | 类型 | 是否为null | 是否主键 | 说明 |
|--|--|--|--|--|
| id | int| 否 | 是 | ID主键 |
| author | varchar| 是|否 | 图书作者 |
| isbn | varchar| 是 | 否| 图书ISBN编码 |
| name | varchar| 是 |否 | 图书名称 |
| pages | int| 是 | 否| 图书页数 |
| price | double| 是 | 否| 单价 |
| publish | varchar| 是 |否 | 出版社 |
| publish_time| datetime| 是 |否 | 出版时间 |
| size | int| 是 |否 | 库存 |
| translate | varchar| 是 |否 | 翻译 |
| type | varchar| 是 |否 | 分类 |
**borrow:** 存储借阅信息
| 字段名称 | 类型 | 是否为null | 是否主键 | 说明 |
|--|--|--|--|--|
| id | int | 否 | 是 |ID主键 |
| book_id | int | 是 | 否 |图书ID |
| create_time | datetime | 是 | 否 |借阅时间 |
| update_time | datetime | 是 | 否 |实际归还时间 |
| user_id | int | 是 | 否 |用户ID |
| end_time | datetime | 是 | 否 |归还时间 |
| ret | int | 是 | 否 |是否归还(0 已归还 1 未归还) |
**notice:** 存储公告信息
| 字段名称 | 类型 | 是否为null | 是否主键 | 说明 |
|--|--|--|--|--|
| id | int| 否 | 是 |ID主键|
| title | varchar| 是 | 否 |标题|
| date | datetime | 是 | 否 |发布时间|
| content | text| 是 | 否 |内容|
## 07 接口示例
由于后台接口较多,没办法在此逐个列举,详情请阅读“`图书管理系统设计与实现(SpringBoot+Mysql+HTML)`”源码包中 `图书管理后台Swagger UI.html` 文件。
**注:“图书管理系统设计与实现(SpringBoot+Mysql+HTML)”源码包在本文`第10章节`下载**

### 7.1 图书管理--添加图书
**接口描述**:
**接口地址**:`/booksManageBoot/book/add`
**请求方式**:`POST`
**consumes**:`["application/json"]`
**produces**:`["*/*"]`
**请求示例**:
```json
{
"author": "",
"id": 0,
"isbn": "",
"name": "",
"pages": 0,
"price": 0,
"publish": "",
"publishTime": "",
"size": 0,
"translate": "",
"type": ""
}
```
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ---- | -------- | -------- | ------ |
| book | book | body | true | Book | Book |
**schema属性说明**
**Book**
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| ----------- | ------------ | ---- | -------- | ----------------- | ------ |
| author | 图书作者 | body | false | string | |
| id | ID主键 | body | false | integer(int32) | |
| isbn | 图书ISBN编码 | body | false | string | |
| name | 图书名称 | body | false | string | |
| pages | 图书页数 | body | false | integer(int32) | |
| price | 单价 | body | false | number(double) | |
| publish | 出版社 | body | false | string | |
| publishTime | 出版时间 | body | false | string(date-time) | |
| size | 库存 | body | false | integer(int32) | |
| translate | 翻译 | body | false | string | |
| type | 分类 | body | false | string | |
**响应示例**:
```json
{
"code": 0,
"data": {},
"msg": ""
}
```
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | -------------- | -------------- |
| code | 响应码 | integer(int32) | integer(int32) |
| data | 响应数据 | object | |
| msg | 响应信息 | string | |
**响应状态**:
| 状态码 | 说明 | schema |
| ------ | ------------ | ------ |
| 200 | OK | R |
| 201 | Created | |
| 401 | Unauthorized | |
| 403 | Forbidden | |
| 404 | Not Found | |
### 7.2 借阅管理--借阅图书
**接口描述**:
**接口地址**:`/booksManageBoot/borrow/add`
**请求方式**:`POST`
**consumes**:`["application/json"]`
**produces**:`["*/*"]`
**请求示例**:
```json
{
"bookId": 0,
"createTime": "",
"endTime": "",
"id": 0,
"ret": 0,
"updateTime": "",
"userId": 0
}
```
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ---- | -------- | -------- | ------ |
| borrow | borrow | body | true | Borrow | Borrow |
**schema属性说明**
**Borrow**
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| ---------- | ----------------------------- | ---- | -------- | ----------------- | ------ |
| bookId | 图书ID | body | false | integer(int32) | |
| createTime | 借阅时间 | body | false | string(date-time) | |
| endTime | 归还时间 | body | false | string(date-time) | |
| id | ID主键 | body | false | integer(int32) | |
| ret | 是否归还(0 已归还 1 未归还) | body | false | integer(int32) | |
| updateTime | 实际归还时间 | body | false | string(date-time) | |
| userId | 用户ID | body | false | integer(int32) | |
**响应示例**:
```json
{
"code": 0,
"data": {},
"msg": ""
}
```
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | -------------- | -------------- |
| code | 响应码 | integer(int32) | integer(int32) |
| data | 响应数据 | object | |
| msg | 响应信息 | string | |
**响应状态**:
| 状态码 | 说明 | schema |
| ------ | ------------ | ------ |
| 200 | OK | R |
| 201 | Created | |
| 401 | Unauthorized | |
| 403 | Forbidden | |
| 404 | Not Found | |
### 7.3 用户管理--用户列表
**接口描述**:
**接口地址**:`/booksManageBoot/user/list`
**请求方式**:`POST`
**consumes**:`["application/json"]`
**produces**:`["*/*"]`
**请求示例**:
```json
{
"currPage": 0,
"keyword": "",
"pageSize": 0
}
```
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ---- | -------- | -------- | ------ |
| pageIn | pageIn | body | true | PageIn | PageIn |
**schema属性说明**
**PageIn**
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | ---------- | ---- | -------- | -------------- | ------ |
| currPage | 当前页 | body | false | integer(int32) | |
| keyword | 搜索关键字 | body | false | string | |
| pageSize | 每页数量 | body | false | integer(int32) | |
**响应示例**:
```json
{
"code": 0,
"data": {},
"msg": ""
}
```
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | -------------- | -------------- |
| code | 响应码 | integer(int32) | integer(int32) |
| data | 响应数据 | object | |
| msg | 响应信息 | string | |
**响应状态**:
| 状态码 | 说明 | schema |
| ------ | ------------ | ------ |
| 200 | OK | R |
| 201 | Created | |
| 401 | Unauthorized | |
| 403 | Forbidden | |
| 404 | Not Found | |
### 7.4 公告管理--编辑公告
**接口描述**:
**接口地址**:`/booksManageBoot/notice/update`
**请求方式**:`POST`
**consumes**:`["application/json"]`
**produces**:`["*/*"]`
**请求示例**:
```json
{
"content": "",
"date": "",
"id": 0,
"title": ""
}
```
**请求参数**:
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ---- | -------- | -------- | ------ |
| notice | notice | body | true | Notice | Notice |
**schema属性说明**
**Notice**
| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema |
| -------- | -------- | ---- | -------- | ----------------- | ------ |
| content | 公告内容 | body | false | string | |
| date | 发布时间 | body | false | string(date-time) | |
| id | ID主键 | body | false | integer(int32) | |
| title | 公告标题 | body | false | string | |
**响应示例**:
```json
{
"code": 0,
"data": {},
"msg": ""
}
```
**响应参数**:
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | -------------- | -------------- |
| code | 响应码 | integer(int32) | integer(int32) |
| data | 响应数据 | object | |
| msg | 响应信息 | string | |
**响应状态**:
| 状态码 | 说明 | schema |
| ------ | ------------ | ------ |
| 200 | OK | R |
| 201 | Created | |
| 401 | Unauthorized | |
| 403 | Forbidden | |
| 404 | Not Found | |
## 08 项目工程结构及说明
下载本项目源码并导入到开发工具后(下图为导入到IDEA中的目录结构),项目的目录结构如下图所示:

|包名| 说明 |
|--|--|
| com.cya.config | 存放基础配置类,如:拦截器配置类、管理后台Swagger配置类、Spring Security安全配置类等 |
| com.cya.controller | 用于存放接收请求的Controller类,前后端交互的“桥梁” |
| com.cya.service | 存放业务逻辑层代码 |
| com.cya.dao | 存放数据持久层代码 |
| com.cya.entity | 存放实体类 |
| com.cya.util | 存放工具类 |
| com.cya.interceptor | 登录拦截器 |
| resources/mapper | mybatis mapper文件 |
| resources/staitc| 存放静态文件,如:JavaScript、CSS、img |
| resources/templates| 存放html文件 |
| application.yml | SpringBoot框架配置文件,如:项目启动端口、项目路径、数据库配置等 |
| ManagerApplication.java| 项目启动类 |
## 09 部分功能展示及源码
### 9.1 首页

**部分代码:**
```html
图书管理系统-首页
```
### 9.2 图书管理
**图书上架:**

**图书修改:**

**部分源码:**
```java
package com.book.manager.controller;
import com.book.manager.entity.Book;
import com.book.manager.service.BookService;
import com.book.manager.service.BorrowService;
import com.book.manager.util.R;
import com.book.manager.util.http.CodeEnum;
import com.book.manager.util.ro.PageIn;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
/**
* @Description 用户管理
* @Date 2022/9/4 16:35
* @Author by 公众号【IT学长】
*/
@Api(tags = "图书管理")
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@Autowired
private BorrowService borrowService;
@ApiOperation("图书搜索列表")
@PostMapping("/list")
public R getBookList(@RequestBody PageIn pageIn) {
if (pageIn == null) {
return R.fail(CodeEnum.PARAM_ERROR);
}
return R.success(CodeEnum.SUCCESS,bookService.getBookList(pageIn));
}
@ApiOperation("添加图书")
@PostMapping("/add")
public R addBook(@RequestBody Book book) {
return R.success(CodeEnum.SUCCESS,bookService.addBook(book));
}
@ApiOperation("编辑图书")
@PostMapping("/update")
public R modifyBook(@RequestBody Book book) {
return R.success(CodeEnum.SUCCESS,bookService.updateBook(book));
}
@ApiOperation("图书详情")
@GetMapping("/detail")
public R bookDetail(Integer id) {
return R.success(CodeEnum.SUCCESS,bookService.findBookById(id));
}
@ApiOperation("图书详情 根据ISBN获取")
@GetMapping("/detailByIsbn")
public R bookDetailByIsbn(String isbn) {
return R.success(CodeEnum.SUCCESS,bookService.findBookByIsbn(isbn));
}
@ApiOperation("删除图书")
@GetMapping("/delete")
public R delBook(Integer id) {
bookService.deleteBook(id);
borrowService.deleteBorrowByBookId(id);
return R.success(CodeEnum.SUCCESS);
}
}
```
### 9.3 借阅管理
**借阅图书:**


**归还图书:**

**部分源码:**
```java
package com.book.manager.service;
import cn.hutool.core.bean.BeanUtil;
import com.book.manager.dao.BookMapper;
import com.book.manager.dao.BorrowMapper;
import com.book.manager.dao.UsersMapper;
import com.book.manager.entity.Book;
import com.book.manager.entity.Borrow;
import com.book.manager.entity.Users;
import com.book.manager.repos.BookRepository;
import com.book.manager.repos.BorrowRepository;
import com.book.manager.util.consts.Constants;
import com.book.manager.util.vo.BookOut;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Optional;
/**
* @Description 借阅管理
* @Date 2022/9/4 16:35
* @Author by 公众号【IT学长】
*/
@Service
public class BorrowService {
@Autowired
private BorrowRepository borrowRepository;
@Autowired
private BorrowMapper borrowMapper;
@Autowired
private BookService bookService;
@Autowired
private UserService userService;
/**
* 添加
*/
@Transactional
public Integer addBorrow(Borrow borrow) {
Book book = bookService.findBook(borrow.getBookId());
Users users = userService.findUserById(borrow.getUserId());
// 查询是否已经借阅过该图书
Borrow bor = findBorrowByUserIdAndBookId(users.getId(),book.getId());
if (bor!=null) {
Integer ret = bor.getRet();
if (ret!=null) {
// 已借阅, 未归还 不可再借
if (ret == Constants.NO) {
return Constants.BOOK_BORROWED;
}
}
}
// 库存数量减一
int size = book.getSize();
if (size>0) {
size--;
book.setSize(size);
bookService.updateBook(book);
}else {
return Constants.BOOK_SIZE_NOT_ENOUGH;
}
// 用户可借数量减一
int userSize = users.getSize();
if (userSize>0) {
userSize --;
users.setSize(userSize);
userService.updateUser(users);
}else {
return Constants.USER_SIZE_NOT_ENOUGH;
}
// 添加借阅信息, 借阅默认为未归还状态
borrow.setRet(Constants.NO);
borrowRepository.saveAndFlush(borrow);
// 一切正常
return Constants.OK;
}
/**
* user id查询所有借阅信息
*/
public List findAllBorrowByUserId(Integer userId) {
return borrowRepository.findBorrowByUserId(userId);
}
/**
* user id查询所有 已借阅信息
*/
public List findBorrowsByUserIdAndRet(Integer userId, Integer ret) {
return borrowRepository.findBorrowsByUserIdAndRet(userId,ret);
}
/**
* 详情
*/
public Borrow findById(Integer id) {
Optional optional = borrowRepository.findById(id);
if (optional.isPresent()) {
return optional.get();
}
return null;
}
/**
* 编辑
*/
public boolean updateBorrow(Borrow borrow) {
return borrowMapper.updateBorrow(borrow)>0;
}
/**
* 编辑
*/
public Borrow updateBorrowByRepo(Borrow borrow) {
return borrowRepository.saveAndFlush(borrow);
}
/**
* 根据ID删除
*/
public void deleteBorrow(Integer id) {
borrowRepository.deleteById(id);
}
/**
* 根据book_id删除
*/
public void deleteBorrowByBookId(Integer bookId) {
borrowMapper.deleteBorrowByBookId(bookId);
}
/**
* 查询用户某一条借阅信息
* @param userId 用户id
* @param bookId 图书id
*/
public Borrow findBorrowByUserIdAndBookId(int userId,int bookId) {
return borrowMapper.findBorrowByUserIdAndBookId(userId,bookId);
}
/**
* 归还书籍,
* @param userId 用户Id
* @param bookId 书籍id
*/
@Transactional(rollbackFor = Exception.class)
public void retBook(int userId,int bookId) {
// 用户可借数量加1
Users user = userService.findUserById(userId);
Integer size = user.getSize();
size++;
user.setSize(size);
userService.updateUser(user);
// 书籍库存加1
Book book = bookService.findBook(bookId);
Integer bookSize = book.getSize();
bookSize++;
book.setSize(bookSize);
bookService.updateBook(book);
// 借阅记录改为已归还,删除记录
Borrow borrow = this.findBorrowByUserIdAndBookId(userId, bookId);
this.deleteBorrow(borrow.getId());
}
}
```
### 9.4 用户管理
**用户列表:**

**用户添加:**

**部分源码:**
```xml
update users
avatar = #{avatar},
nickname = #{nickname},
username = #{username},
password = #{password},
birthday = #{birthday},
is_admin = #{isAdmin},
tel = #{tel},
email = #{email},
address = #{address},
`size` = #{size},
where id = #{id}
```
### 9.5 公告管理
**公告列表:**

**公告详情:**

**部分源码:**
```java
package com.book.manager.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.book.manager.entity.Notice;
import com.book.manager.entity.Users;
import com.book.manager.service.NoticeService;
import com.book.manager.util.R;
import com.book.manager.util.consts.Constants;
import com.book.manager.util.consts.ConvertUtil;
import com.book.manager.util.http.CodeEnum;
import com.book.manager.util.vo.NoticeOut;
import com.book.manager.util.vo.PageOut;
import com.book.manager.util.vo.UserOut;
import com.book.manager.util.ro.PageIn;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Description 公告管理
* @Date 2022/9/4 16:35
* @Author by 公众号【IT学长】
*/
@Api(tags = "公告管理")
@RestController
@RequestMapping("/notice")
public class NoticeController {
@Autowired
private NoticeService noticeService;
@ApiOperation("公告列表")
@PostMapping("/list")
public R getNotices(@RequestBody PageIn pageIn) {
if (pageIn == null) {
return R.fail(CodeEnum.PARAM_ERROR);
}
// 封装分页出参对象
PageInfo noticeList = noticeService.getNoticeList(pageIn);
PageOut pageOut = new PageOut();
pageOut.setCurrPage(noticeList.getPageNum());
pageOut.setPageSize(noticeList.getPageSize());
pageOut.setTotal((int) noticeList.getTotal());
List outs = new ArrayList<>();
for (Notice notice : noticeList.getList()) {
NoticeOut out = new NoticeOut();
BeanUtils.copyProperties(notice,out);
out.setDate1(DateUtil.format(notice.getDate(),Constants.DATE_FORMAT));
outs.add(out);
}
pageOut.setList(outs);
return R.success(CodeEnum.SUCCESS,pageOut);
}
@ApiOperation("添加公告")
@PostMapping("/addNoticer")
public R addNoticer(@RequestBody Notice notice) {
if (notice == null) {
return R.fail(CodeEnum.PARAM_ERROR);
}
return R.success(CodeEnum.SUCCESS,noticeService.addNotice(notice));
}
@ApiOperation("编辑公告")
@PostMapping("/update")
public R modifyNotice(@RequestBody Notice notice) {
return R.success(CodeEnum.SUCCESS,noticeService.updateNotice(notice));
}
@ApiOperation("公告详情")
@GetMapping("/detail")
public R noticeDetail(Integer id) {
Notice notice = noticeService.findNoticeById(id);
if (notice!=null) {
NoticeOut out = new NoticeOut();
BeanUtils.copyProperties(notice,out);
out.setDate1(DateUtil.format(notice.getDate(),Constants.DATE_FORMAT));
return R.success(CodeEnum.SUCCESS,out);
}
return R.fail(CodeEnum.NOT_FOUND);
}
@ApiOperation("删除公告")
@GetMapping("/delete")
public R delNotice(Integer id) {
noticeService.deleteNotice(id);
return R.success(CodeEnum.SUCCESS);
}
}
```
### 9.6 个人中心
**个人信息详情:**

**部分源码:**
```html
图书管理系统-查询个人信息
```
## 10 完整源码下载
微信搜索公众号【`IT学长`】,回复关键词“`20220927`”下载图书管理系统(booksManageBoot)源码。
## 11 运行教程
详细运行步骤及常见问题解答请看“`图书管理系统设计与实现(SpringBoot+Mysql+HTML)`”源码包中 `README.md` 文件。
通过`第10章节`下载源码包并解压后如下图所示:

本期内容就到这里,感谢你的阅读。
## 12 相关说明
1. 制作不易,记得点赞+收藏+转发
3. 本人技术有限,若有错误欢迎指正
4. 本系统和文章均属于【IT学长】原创,转载请注明出处