各位好呀,本次介绍项目是基于SpringBoot开发的一个校园二手书管理系统,有部分功能由本人完成(如:前端样式、精准查询、模糊查询、导出Execel),本篇文章,着重聚焦技术要点,提前告知修改项目需要的前置知识!

使用技术

由Maven构建的项目,技术栈是由SpringBoot+Mybatis+Thymeleaf组成,其中项目引入了一些中间件,如PageHelper(分页插件)、Lombok(数据层配置)、easyexcel(导出execel形式数据)

  • Lombok是什么?

使用Lombok提供的注解,可以快速生成类的getter、setter和构造方法等等,当变量发生改变时,也不再需要修改对这些方法进行修改,Lombok会搞定这件事。

比如以下代码的 @AllArgsConstructor注解就是生成类的全参构造方法, @Data注解作用是给类的成员变量添加getter和setter方法

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {private int id;private String name;private String publisher;private String code;private String author;private double price;private int newDeg;private int uId;private String uname;private int state;private String sname;private Date publishTime;}

系统功能

1.用户登录(含验证码)

2.二手书管理

3.订单管理

4.撤销订单管理

5.院系管理

6.专业管理

7.用户信息管理

功能简读

  • 精准查询和模糊查询的区别?

拿订单查询功能为例,精准查询将会在数据库里匹配用户输入的所有字符,在sql语句里相当于where column = ? 模糊查询使用的是mysql的关键字like来对所有搜索条件进行模糊查询,但是下拉列表选中条件还是以精准匹配进行查询

下面找出对应的OrderMapper.xml文件

<!-- 订单精准查询--><select id="selectAccuracyOrder" resultType="order">select o.id as id,o.id_buy as id_buy,u.nickname as nickname,u.tel as tel,u.address as address,o.book_id as book_id,b.name as name,b.publisher as publisher,b.code as code,b.author as author,b.price asprice,b.newDeg as newDeg,b.uId as uId,o.time as time,o.state as state,s.name as snamefrom orders o inner joinuser u on o.id_buy = u.id inner joinstate s on o.state = s.id inner joinbook b on o.book_id = b.id<where><if test="oid!=null">and o.id = #{oid}</if><if test="username!=null">and u.nickname = #{username}</if><if test="status!=null">and o.state = #{status}</if></where></select>
 <!-- 订单模糊查询--><select id="selectLikeOrder" resultType="order">select o.id as id,o.id_buy as id_buy,u.nickname as nickname,u.tel as tel,u.address as address,o.book_id as book_id,b.name as name,b.publisher as publisher,b.code as code,b.author as author,b.price asprice,b.newDeg as newDeg,b.uId as uId,o.time as time,o.state as state,s.name as snamefrom orders o inner joinuser u on o.id_buy = u.id inner joinstate s on o.state = s.id inner joinbook b on o.book_id = b.id<where><if test="oid!=null">and o.id = #{oid}</if><if test="username!=null">and u.nickname like concat('%',#{username},'%')</if><if test="status!=null">and o.state = #{status}</if></where></select>
  • 以Execel文件形式导出数据如何实现?

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,由阿里巴巴提供,学习链接:EasyEcel官网
注意:在这个项目中,所有的导出Excel功能默认是导出当前检索的所有页数据

第一步:导入easyexcel坐标

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version>
</dependency>

第二步:设置单元格的列名以及样式(以导出用户数据为例)

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER) //水平居中
public class UserExcelData {@ExcelProperty("编号")private Integer id;@ExcelProperty("用户名")private String username;@ExcelProperty("姓名")private String name;@ExcelProperty("院系")@ColumnWidth(20)private String depart;@ExcelProperty("专业")@ColumnWidth(20)private String major;@ExcelProperty("年级")@ColumnWidth(10)private Integer grade;
}

其中@ExcelProperty注解代表导出该成员变量的值对应列名,@ContentStyle是设置表格样式
第三步:定义js导出事件并编写后端接口

前端核心代码:

<!-- form搜索输入框 -->
<form th:action="@{/user/query}" method="post" id="queryform"><div class="content_right_content"><span><input name="btnType" id="btnType" value="1" th:value="${btnType}" hidden><input name="pageNum" id="pageNum" value="1" hidden>用户名:<input type="text" placeholder="请输入用户名" name="username" th:value="${username}">&nbsp;&nbsp;姓名:<input type="text" placeholder="请输入姓名" name="name" th:value="${name}">&nbsp;&nbsp;&nbsp;学院:<select name="depart_id"><option value="0">全部</option><option th:value="${depart.id}" th:each="depart:${departList}"th:selected="${select_depid} == ${depart.id}"th:text="${depart.name}"></option></select>&nbsp;&nbsp;专业:<select name="major_id"><option value="0">全部</option><option th:value="${major.id}" th:each="major:${majorList}"th:selected="${select_majorid} == ${major.id}"th:text="${major.name}"></option></select>&nbsp;&nbsp;<button class="btn btn-success btn-sm" onclick="queryTypeSumbit(1)">精确查询</button><button class="btn btn-success btn-sm" onclick="queryTypeSumbit(2)">模糊查询</button></span></div>
</form><a class="btn btn-primary" style="color: white;position: absolute;left: 0" value="1" onclick="exportSumbit()">导出全部数据</a>

前端js处理事件

function exportSumbit() {var myform = document.getElementById("queryform");myform.setAttribute("action", "/user/export");myform.submit();
}

主要工作:获取表单DOM,自动提交到后端控制器(Controller),控制器接受到请求就会根据搜索条件查询全部的数据,然后将这些数据以excel文件形式返回给前端

后端控制器:

 /*导出Execel*/@RequestMapping("/user/export")@ResponseBodypublic String exportExcel(@RequestParam(value = "username", required = false) String username,@RequestParam(value = "name", required = false) String name,@RequestParam(value = "depart_id", required = false) Integer depart_id,@RequestParam(value = "major_id", required = false) Integer major_id,@RequestParam(value = "btnType", defaultValue = "1") Integer btnType,@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "12") Integer pageSize,HttpServletResponse response) throws IOException {List<User> users = null;if (btnType == 1) {//精准查询users = userService.accuracyQueryUser(StringUtils.isEmpty(username) ? null : username, StringUtils.isEmpty(name) ? null : name,depart_id == null || depart_id == 0 ? null : depart_id, major_id == null || major_id == 0 ? null : major_id);} else if (btnType == 2) {//模糊查询(对用户名和姓名模糊查询)users = userService.likeQueryUser(StringUtils.isEmpty(username) ? null : username, StringUtils.isEmpty(name) ? null : name,depart_id == null || depart_id == 0 ? null : depart_id, major_id == null || major_id == 0 ? null : major_id);}System.out.println("users size : " + users.size());List<UserExcelData> list = new ArrayList<>();for (User user : users) {list.add(new UserExcelData(user.getId(), user.getNickname(), user.getName(), user.getDepartName(), user.getMajorName(), user.getGrade()));}//设置响应头信息response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("用户信息", "Utf-8");response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + fileName + ".xlsx");//获得输出流ServletOutputStream outputStream = response.getOutputStream();//工作簿对象ExcelWriterBuilder writerBuilder = EasyExcel.write(outputStream, UserExcelData.class);//工作表对象ExcelWriterSheetBuilder sheet = writerBuilder.sheet();//导出Excelsheet.doWrite(list);outputStream.close();return "";}

效果展示:

小结:使用EasyExcel进行数据的导出不依赖于前端控件,还是在于后端改变响应头信息将真正数据反馈到前端

源码获取方式

wx《源码小客栈》,回复"校园"或"二手书"获取完整说明文章,

源码从菜单栏 "源码" -> "Java"中获取

SpringBoot校园二手书管理系统相关推荐

  1. 基于SSM的校园二手书管理系统 基于java的二手平台代码 二手商城系统下载

    基于SSM的校园二手书管理系统 基于java的二手平台代码 二手商城系统下载 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SSM(Spring+ ...

  2. springboot乐校园二手书交易管理系统

    037-springboot乐校园二手书交易管理系统演示录像 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7 ...

  3. SpringBoot+Mysql校园二手书在线交易平台

    基于Springboot的二手书在线交易平台,主要实现的功能有: 后台管理员功能: 求购管理,收购管理,学生管理,评论管理,建议管理,新闻公告,网站设置,订单管理,图书管理. 1.求购管理实现了查看前 ...

  4. java计算机毕业设计校园二手书交易系统源码+系统+数据库+lw文档+mybatis+运行部署

    java计算机毕业设计校园二手书交易系统源码+系统+数据库+lw文档+mybatis+运行部署 java计算机毕业设计校园二手书交易系统源码+系统+数据库+lw文档+mybatis+运行部署 本源码技 ...

  5. java毕业设计校园二手书交易平台源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计校园二手书交易平台源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计校园二手书交易平台源码+lw文档+mybatis+系统+mysql数据库+调试 开发软件 ...

  6. python+vue+elementui校园二手书交易信息网站django

    实现了首页.个人中心.用户管理.卖家用户管理.图书分类管理.二手图书管理.求购图书管理.求购回复管理.留言反馈.系统管理.订单管理等内容进行管理,本系统具有良好的兼容性和适应性,为用户提供更多的乐校园 ...

  7. 校园二手书pro(微信小程序运营版)

    开发此程序的初衷仅为解决校园二手书问题,灵感的起源来自辅导员的需求,知识无价,希望每本书都能实现最大的价值,找到下一个更好的归宿. 寒假四个月里研究的小程序,出现一些bug应该很正常,如有发现,请及时 ...

  8. 校园二手书(微信小程序)

    开发此程序的初衷仅为解决校园二手书问题,灵感的起源来自辅导员的需求,知识无价,希望每本书都能实现最大的价值,找到下一个更好的归宿. 寒假四个月里研究的小程序,出现一些bug应该很正常,如有发现,请及时 ...

  9. JAVA计算机毕业设计校园二手书交易平台(附源码、数据库)

    JAVA计算机毕业设计校园二手书交易平台(附源码.数据库) 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe ...

最新文章

  1. 多传感器融合之滤波(二)EKF
  2. 【spring】第二个springmvc helloworld 以及 spring模糊路径
  3. 第02章 PyTorch基础知识
  4. 几种Linux包管理系统的命令对照
  5. 皮一皮:师太请自重...
  6. IT旅途——程序员面试经验分享
  7. 未来,仅凭几个前端工程师,就能 hold 住一家企业吗?
  8. jsp中get请求与post请求编码统一问题(1.0)
  9. python调用pyd文件_如何将.pyd文件作为python模块导入?
  10. Python——OpenCV形态学处理(膨胀与腐蚀)
  11. 单应矩阵计算旋转角和平移量
  12. 急需你的意见:句子迷图文日签投票
  13. Systemverilog中@和wait区别
  14. vue--子传父、父传子
  15. c++中的 for_each 函数
  16. 用Ruby替代Java做rest接口的单元测试!
  17. 51信用卡不止于想象力?
  18. vivo新系统鸿蒙,截胡华为鸿蒙系统!vivo霸气官宣新系统将登场:天生极致流畅...
  19. 追踪电脑或手机(已知目标IP或mac)进行物理定位
  20. 新的一年如何给自己制定一个年度计划

热门文章

  1. 连锁美容院的优势在哪里?
  2. 《自私的基因》 解读分享
  3. 石头剪子布的研究价值
  4. iOS----BAT网易笔试amp;面试题amp;参考答案
  5. matlab 数据白化,“matlab对Excel表格数据预处理“急求FastICA 的源程序 matlab,包括数据的预处理(中心化和白化),注释详细点,谢谢!...
  6. 美国提倡的天才教育是什么?据称有 25% 的天才,怎么发现和培养的?
  7. 单词发音软件测试自学,一定要告诉孩子:每天30分钟,用这三个方法学英语,想不考好都难!...
  8. 牛客15034 德玛西亚万岁(状压dp)
  9. 2022最新求职指南(全面易懂)
  10. 《越光宝盒》中的经典台词