中国国家图书馆管理系统项目(模板)
中国国家图书馆管理系统项目介绍
项目背景
中国国家图书馆公司(狗头)委托我开发一个一个专门的中国国家图书馆,出售外星人电子产品以及周边,实现了以下功能。
本项目尚未搭载了服务器,网址给定:
链接: 外星人官方网站.
项目功能
- 登录
- 注册
- 后台系统
- 前端展示
- 用户系统
- 租借记录
- 充值消费
项目技术
- 项目框架:springboot
- 数据库框架:mybaits
- 前端技术:JS、JQuery、Ajax
项目模块
持久层:依据业务要求规划相关的SQL语句,以及进行配置
业务层:核心功能控制、业务操作以及异常处理
控制层:接受请求,处理响应
前端开发:JS、JQuery、Ajax
单元测试:junit
项目要求
- JDK8
- maven3.6.1
- 数据库mysql5.1
- idea
中国国家图书馆管理系统项目开发流程
第一节 登录
1. 持久层
- 创建基本用户类
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
/**
* id int not null primary key auto_increment,
* username varchar(12), --用户名
* password varchar(12) -- 密码
*/
private int id;
private String username;
private String password;
private Double money;
}
- mapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="logincheck" parameterType="user" resultType="user">
select *
from `ssm-library`.user
<where>
<if test="username != null and username != ''">
and `username` = #{username}
</if>
<if test="password != null and password != ''">
AND `password` = #{password}
</if>
</where>
</select>
<select id="checkUserName" parameterType="String" resultType="String">
select *
from `ssm-library`.user
<where>
<if test="username != null and username != ''">
AND `username` = #{username}
</if>
</where>
</select>
</mapper>
2. 业务层
- 登录功能的service接口和实现
public interface UserService {
//登录验证
User logincheck(User user);
//注册
void register(User user);
//检查是否用户存在
String checkUserName(String username);
List<User> getAllUser();
User getUserByName(String name);
//条件查询
List<User> conditionQuery(User user);
}
- impl
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User logincheck(User user) {
return userMapper.logincheck(user);
}
@Override
public void register(User user) {
userMapper.register(user);
}
@Override
public String checkUserName(String username) {
return userMapper.checkUserName(username);
}
@Override
public List<User> getAllUser() {
return userMapper.getAllUser();
}
@Override
public User getUserByName(String name) {
return userMapper.getUserByName(name);
}
@Override
public List<User> conditionQuery(User user) {
return userMapper.conditionQuery(user);
}
}
3. 控制层
//登录验证
@RequestMapping("/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Model model, HttpServletRequest request, User user) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
redisTemplate.opsForValue().set(username, password);
redisTemplate.opsForValue().set("username", username);
//这里使用token整合shiro实现权限-认证
HttpSession session = request.getSession();
session.setAttribute("UserSession", username);
try {
subject.login(token);
model.addAttribute("username", username);
if (("admin").equals(username)) {
return "redirect:/admin/list";
} else {
return "redirect:/user/list";
}
} catch (UnknownAccountException e) {
model.addAttribute("msg", "用户名错误");
return "index";
} catch (IncorrectCredentialsException e) {
model.addAttribute("msg", "密码错误");
return "index";
}
}
4. 前端页面
- 导入jsp依赖
<!-- 引入 jsp,-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
- 前端页面核心
<p text="${msg}" style="color: limegreen"></p>
<form class="form-signin" action="<%=request.getContextPath()%>/login">
<img class="mb-4" src="<%=request.getContextPath()%>/resource/images/三井寿.jpg" alt="" width="100" height="150">
<h1 class="h3 mb-3 font-weight-normal">请登录</h1>
<label for="username" class="sr-only">账号</label>
<input type="text" name="username" id="username" class="form-control" placeholder="账号" required="" autofocus="">
<label for="password" class="sr-only">密码</label>
<input type="password" name="password" id="password" class="form-control" placeholder="密码" required="">
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> 记住我
</label>
</div>
<%-- <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>--%>
<%-- <a href="register.jsp" class="btn btn-lg btn-primary btn-block" type="submit">注册</a>--%>
<a href="register" type="submit" class="btn btn-primary btn-lg">注册</a>
<button type="submit" class="btn btn-primary btn-lg">登录</button>
<p class="mt-5 mb-3 text-muted">© 2021</p>
</form>
第二节 注册
1. 持久层
@Component
@Mapper
public interface UserMapper {
//登录验证
User logincheck(User user);
//注册
void register(User user);
//检查是否用户存在
String checkUserName(String username);
List<User> getAllUser();
User getUserByName(String name);
//条件查询
List<User> conditionQuery(User user);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<insert id="register" parameterType="user">
insert into `ssm-library`.user(username, password)
value (#{username},#{password})
</insert>
<select id="getUserByName" parameterType="String" resultType="user">
select * from `ssm-library`.user where username=#{username}
</select>
<select id="getAllUser" resultType="user">
select * from `ssm-library`.user
</select>
<!--根据条件查询-->
<select id="conditionQuery" resultType="user" parameterType="user">
select * from `ssm-library`.user
<where>
<if test="name != null and name != ''">
username = #{username}
</if>
<if test="author != null and author != ''">
and password=#{password}
</if>
</where>
</select>
</mapper>
2. 业务层
public interface UserService {
//登录验证
User logincheck(User user);
//注册
void register(User user);
//检查是否用户存在
String checkUserName(String username);
List<User> getAllUser();
User getUserByName(String name);
//条件查询
List<User> conditionQuery(User user);
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User logincheck(User user) {
return userMapper.logincheck(user);
}
@Override
public void register(User user) {
userMapper.register(user);
}
@Override
public String checkUserName(String username) {
return userMapper.checkUserName(username);
}
@Override
public List<User> getAllUser() {
return userMapper.getAllUser();
}
@Override
public User getUserByName(String name) {
return userMapper.getUserByName(name);
}
@Override
public List<User> conditionQuery(User user) {
return userMapper.conditionQuery(user);
}
// @Override
// public List<Book> conditionQuery(Book book) {
// return bookMapper.conditionQuery(book);
// }
}
3. 控制层
//注册
@RequestMapping("/registering")
public String register(@RequestParam String username, @RequestParam String password, Model model) {
User user = new User();
String s = userService.checkUserName(username);
if (s == null) {
user.setUsername(username);
user.setPassword(password);
userService.register(user);
return "redirect:/user/list";
} else {
model.addAttribute("fail", "该用户存在");
System.out.println("该用户存在");
return "register";
}
}
4. 前端页面
<body class="text-center" style="background: url(/resource/images/spyder.jpg)">
<form class="form-signin" action="${pageContext.request.contextPath}/registering">
<img class="mb-4" src="<%=request.getContextPath()%>/resource/images/123.jpg" alt="" width="100" height="150">
<h1 class="h3 mb-3 font-weight-normal">请登录</h1>
<label for="username" class="sr-only">账号</label>
<input type="text" name="username" id="username" class="form-control" placeholder="账号" required="" autofocus="">
<label for="password" class="sr-only">密码</label>
<input type="password" name="password" id="password" class="form-control" placeholder="密码" required="">
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> 记住我
</label>
</div>
<button type="submit" class="btn btn-primary btn-lg">注册</button>
<a href="index" class="btn btn-primary btn-lg">登录</a>
<p class="mt-5 mb-3 text-muted">© 2021</p>
</form>
这里可以用Ajax去升级,以防代码的冗余;
第三节 后台系统
- 用户管理:User的增删改查
- 图书管理:图书的增删改查
1. 持久层
- mapper接口
@Mapper
public interface BookMapper {
/**
* * bookId int not null primary key auto_increment, --图书id
* * name varchar(50), --图书名
* * author varchar(50), --图书作者
* * press varchar(50), --图书出版社
* * price double(6, 2 --图书单价
*
* @param book
* @return
*/
// 增
int addBook(Book book);
// 删
int deleteBook(int bookId);
// 根据name查一个
List<Book> queryBookByName(String BookName);
// 改
int updateBook(Book book);
// 查所有
List<Book> queryAllBook();
// 根据id查一个
Book queryBookById(int bookId);
//条件查询
List<Book> conditionQuery(Book book);
//模糊查询
List<Book> ListQuery(String value);
//the number of Book
// 增
int addBookNum(String BookName);
// 删
int deleteBookNum(String BookName);
// 改
int updateBookNum(String BookName);
}
- 持久层xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.BookMapper">
<!-- `name`, `author`, `press`, `price`-->
<!--增-->
<insert id="addBook" parameterType="book">
insert into `ssm-library`.book(name, author, press, price)
values (#{name}, #{author}, #{press}, #{price})
</insert>
<!--删-->
<delete id="deleteBook" parameterType="int">
delete
from `ssm-library`.book
where bookId = #{bookId}
</delete>
<!--改-->
<update id="updateBook" parameterType="book">
update `ssm-library`.book
set name=#{name},
author=#{author},
press=#{press},
price=#{price}
where bookId = #{bookId}
</update>
<!--查所有-->
<select id="queryAllBook" resultType="book">
select *
from `ssm-library`.book
</select>
<!--根据id查一个-->
<select id="queryBookById" resultType="book" parameterType="int">
select *
from `ssm-library`.book
where bookId = #{bookId}
</select>
<!--根据name查一个-->
<select id="queryBookByName" resultType="book" parameterType="String">
select *
from `ssm-library`.book
where name = #{BookName}
</select>
<!--根据条件查询-->
<select id="conditionQuery" resultType="Book" parameterType="Book">
select * from `ssm-library`.book
<where>
<if test="name != null and name != ''">
name = #{name}
</if>
<if test="author != null and author != ''">
and author=#{author}
</if>
<if test="press != null and press != ''">
and press=#{press}
</if>
</where>
</select>
<select id="ListQuery" resultType="Book">
select * from `ssm-library`.book where NAME like '%#{value}%'
</select>
<!-- 增减图书的数量-->
<!-- 如何选择合适的sql语句进行修改-->
<!--删-->
<delete id="addBookNum" parameterType="int">
delete
from `ssm-library`.book
where NAME = #{BookName}
</delete>
</mapper>
2. 业务层
public interface BookService {
// 增
int addBook(Book book);
// 删
int deleteBook(int bookId);
// 改
int updateBook(Book book);
// 查所有
List<Book> queryAllBook();
// 根据id查一个
Book queryBookById(int bookId);
// 根据name查一个
List<Book> queryBookByName(String BookName);
//条件查询
List<Book> conditionQuery(Book book);
//模糊查询
List<Book> ListQuery(String value);
//the number of Book
// 增
int addBookNum(String BookName);
// 删
int deleteBookNum(String BookName);
// 改
int updateBookNum(String BookName);
}
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper bookMapper;
@Override
public int addBook(Book book) {
return bookMapper.addBook(book);
}
@Override
public int deleteBook(int bookId) {
return bookMapper.deleteBook(bookId);
}
@Override
public int updateBook(Book book) {
return bookMapper.updateBook(book);
}
@Override
public List<Book> queryAllBook() {
return bookMapper.queryAllBook();
}
@Override
public Book queryBookById(int bookId) {
return bookMapper.queryBookById(bookId);
}
@Override
public List<Book> queryBookByName(String BookName) {
return bookMapper.queryBookByName(BookName);
}
@Override
public List<Book> conditionQuery(Book book) {
return bookMapper.conditionQuery(book);
}
@Override
public List<Book> ListQuery(String value) {
return bookMapper.ListQuery(value);
}
@Override
public int addBookNum(String BookName) {
return bookMapper.addBookNum(BookName);
}
@Override
public int deleteBookNum(String BookName) {
return bookMapper.deleteBookNum(BookName);
}
@Override
public int updateBookNum(String BookName) {
return bookMapper.updateBookNum(BookName);
}
}
3. 控制层
@Controller
public class AdminController {
@Autowired
private BookService bookServiceImpl;
@Autowired
private UserService userService;
//查询所有user并分页显示
@GetMapping("/users/list")
public String queryAllUser(
@RequestParam(value = "page", defaultValue = "1") Integer page,
Model model) {
//获取指定页数据,每页显示5条数据
PageHelper.startPage(page, 5);
//紧跟的第一个select方法被分页
List<User> users = userService.getAllUser();
System.out.println(users);
model.addAttribute("users", users);
//使用PageInfo包装数据 navigatePages表示导航标签的数量
PageInfo pageInfo = new PageInfo(users, 5);
model.addAttribute("pageInfo", pageInfo);
return "admin/Usermanager";
}
@GetMapping("/admin/delete/{bookId}")
public String deletebook(@PathVariable("bookId") int bookId) {
int i = bookServiceImpl.deleteBook(bookId);
return "redirect:/admin/list";
}
@RequestMapping("/register")
public String register() {
return "register"; // redirect 重定向/跳转
}
@GetMapping("/admin/toadd")
public String toaddbook() {
return "admin/add"; // redirect 重定向/跳转
}
@PostMapping("/admin/add")
public String addbook(Book book) {
int i = bookServiceImpl.addBook(book);
return "redirect:/admin/list"; // redirect 重定向/跳转
}
@GetMapping("/queryBookById/{bookId}")
public String querybookById(@PathVariable("bookId") int bookId, Model model) {
Book book = bookServiceImpl.queryBookById(bookId);
model.addAttribute("book", book);
return "user/update"; //转发(默认为)
}
@PostMapping("/user/update")
public String queryBookById(Book book) {
System.out.println(book);
int i = bookServiceImpl.updateBook(book);
return "redirect:/user/list";
}
@GetMapping("/user/delete/{bookId}")
public String deletebook(@PathVariable("bookId") int bookId) {
int i = bookServiceImpl.deleteBook(bookId);
return "redirect:/user/list";
}
@GetMapping("/conditionQuery")
public String conditionQuery(Book book, Model model) {
List<Book> books = bookServiceImpl.conditionQuery(book);
model.addAttribute("books", books);
return "user/list";
}
}
4. 前端页面
![在这里插入图片描述](https://img-blog.csdnimg.cn/225fc78f04b545769186e3fc796bf5ab.png
<div>
<p> 个人账户余额: ${user.money} 用户名: ${user.username} </p>
<a style="float: right;margin: 5px;" class="btn btn-primary"></a>
<a style="float: right;margin: 5px;" class="btn btn-primary"
href="${pageContext.request.contextPath}/logout">注销</a>
<a href="/user/torecharge" class="btn btn-info">充值界面</a>
<a href="/single_user/list" class="btn btn-info">个人藏书室</a>
</div>
<div>
<form style="float: left;margin: 5px;" class="form-inline"
action="${pageContext.request.contextPath}/conditionQuery" method="get">
<div class="form-group">
<label for="name">图书名</label>
<input type="text" name="name" class="form-control" id="name">
</div>
<div class="form-group">
<label for="author">图书作者</label>
<input type="text" name="author" class="form-control" id="author">
</div>
<div class="form-group">
<label for="press">图书出版社</label>
<input type="text" name="press" class="form-control" id="press">
</div>
<button type="submit" class="btn btn-info">查询</button>
</form>
</div>
<table class="table table-striped">
<tr>
<th>序号</th>
<th>图书名</th>
<th>图书作者</th>
<th>图书出版社</th>
<th>图书单价</th>
<th> 操作</th>
</tr>
<c:forEach items="${books}" var="book" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${book.name}</td>
<td>${book.author}</td>
<td>${book.press}</td>
<td>${book.price}</td>
<td>${book.bootNum}</td>
<td>
<%-- 这个方法需要修改--%>
<a href="${pageContext.request.contextPath}/single_user/purchase/${book.name}"
class="btn btn-success">付费购买(下载)</a>
<a href="${pageContext.request.contextPath}/single_user/queryBookByName/${book.name}"
class="btn btn-success" style="color: royalblue">试读借阅</a>
<%-- <a href="${pageContext.request.contextPath}/queryBookById/${book.bookId}" class="btn btn-success">归还</a>--%>
</td>
</tr>
</c:forEach>
</table>
<%--分页导航标签--%>
<div class="row">
<div class="col-md-6">
第${pageInfo.pageNum}页,共${pageInfo.pages}页,共${pageInfo.total}条记录
</div>
<div class="col-md-6 offset-md-4">
<nav aria-label="Page navigation example">
<ul class="pagination pagination-sm">
<li class="page-item"><a class="page-link"
href="${pageContext.request.contextPath}/user/list?page=1">首页</a></li>
<c:if test="${pageInfo.hasPreviousPage}">
<li class="page-item"><a class="page-link"
href="${pageContext.request.contextPath}/user/list?page=${pageInfo.pageNum-1}">上一页</a>
</li>
</c:if>
<c:forEach items="${pageInfo.navigatepageNums}" var="page">
<c:if test="${page==pageInfo.pageNum}">
<li class="page-item active"><a class="page-link" href="#">${page}</a></li>
</c:if>
<c:if test="${page!=pageInfo.pageNum}">
<li class="page-item"><a class="page-link"
href="${pageContext.request.contextPath}/user/list?page=${page}">${page}</a>
</li>
</c:if>
</c:forEach>
<c:if test="${pageInfo.hasNextPage}">
<li class="page-item"><a class="page-link"
href="${pageContext.request.contextPath}/user/list?page=${pageInfo.pageNum+1}">下一页</a>
</li>
</c:if>
<li class="page-item"><a class="page-link"
href="${pageContext.request.contextPath}/user/list?page=${pageInfo.pages}">末页</a>
</li>
</ul>
</nav>
</div>
</div>