SpringBoot项目——送水管理系统

1、导入坐标

坐标作用
pagehelper-spring-boot-startermybatis分页插件
spring-boot-starter-thymeleafJSP模板引擎
mybatis-spring-boot-startermybatis
spring-boot-starter-webweb
spring-boot-starter-testtest
lombok不需要再写getter、setter或equals方法,只要有一个注解
mybatis-plus-boot-startermybatis plus
druid-spring-boot-starterdruid连接数据库
hutool-allhutool工具类
bootstrap前端
jquery前端
mysql-connector-javamysql

2、配置文件application.yml

# 应用服务 WEB 访问端口
server:port: 8080spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/minzu?useUnicode=true&characterEncoding=utf8username: rootpassword: roottype: com.alibaba.druid.pool.DruidDataSourcedruid:min-idle: 5max-active: 10max-wait: 3000thymeleaf:prefix: classpath:/templates/water/suffix: .html
mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: auto
pagehelper:helper-dialect: mysql

3、登录功能

需要tb_account表
在这里插入图片描述
在pojo实体包下创建Account实体类
使用@TableName("tb_account")注解,用于标识实体类对应的数据库表名
在service层提供登录方法,分为接口和接口实现

@Service
public class AccountServiceImpl implements AccountService {@Autowired//自动注入AccountMapper,AccountMapper继承了BaseMapper<Account>,是mybatisplus接口,有基本的CURDprivate AccountMapper accountMapper;@Overridepublic boolean login(String user, String password) {QueryWrapper<Account> qw = new QueryWrapper<>();qw.eq("user_name",user);//精确查找Account account = accountMapper.selectOne(qw);//从数据库中选择上面查找到的对象if(account == null){return false;}String userPwd = account.getUserPwd();//String s = DigestUtil.md5Hex(password);//System.out.println(s);if(Objects.equals(userPwd,password)){//比较密码return true;}else{return false;}}
}

登录方法的controller

@Controller
public class AccountController {@Autowiredprivate AccountService accountService;@PostMapping("/login")public String login(String userName, String userPwd, Model model, HttpSession session){boolean login = accountService.login(userName,userPwd);//接收前端参数userName和userPwdif(login){session.setAttribute("currentUser",userName);return "waterMainMenu";//用的thymeleaf,配置文件中已经写好路径与.html,直接跳转}else{model.addAttribute("msg","用户名或者密码错误");return "index";}}}

4、主页展示

需要tb_history表
在这里插入图片描述

@RestController
@RequestMapping("main")
public class MainMenuController {@Autowiredprivate HistoryService historyService;@Autowiredprivate WorkerService workerService;@RequestMapping("mainMenu")public List<MainMenu> list(){List<MainMenu> list = new ArrayList<>();Map<Integer,Integer> map = new HashMap<>();historyService.queryHistory().forEach(h -> {//遍历数据库,将对应workerId键放入map中,值为sendWaterCountmap.put(h.getWorkerId(),map.getOrDefault(h.getWorkerId(),0)+h.getSendWaterCount());});workerService.queryWorker().forEach(w ->{//遍历数据库中的所有数据,这些数据最后是需要展示的//MainMenu中只有WorkerName和SendWaterCount属性MainMenu mainMenu = new MainMenu();//设置WorkerNamemainMenu.setWorkerName(w.getWorkerName());//设置SendWaterCountmainMenu.setSendWaterCount(map.get(w.getWid())==null?0:map.get(w.getWid()));list.add((mainMenu));});//将所有拿到的数据排序,只取前12个Collections.sort(list,(o1,o2)->{if(o1.getSendWaterCount()>o2.getSendWaterCount()){return -1;}else if(o1.getSendWaterCount()<o2.getSendWaterCount()){return 1;}else{return 0;}});if(list.size()<12){return list;}List<MainMenu> arrList = new ArrayList<>();for(int i=0;i<12;i++){arrList.add(list.get(i));}return arrList;}}

5、客户管理功能模块

需要tb_customer表
在这里插入图片描述
用的是PageInfo<>(listCust)前端展示页面
业务层

@Service
public class CustomerServiceImpl implements CustomerService {@Autowired//自动注入CustmoerMapper,用于连接操作数据库private CustomerMapper customerMapper;@Override//查询展示所有//返回值是一个PageInfo对象,里面放的是从数据库查询到的每个Customer对象public PageInfo<Customer> list(Customer customer) {QueryWrapper<Customer> qw = new QueryWrapper<>();String custName = customer.getCustName();String custMobile = customer.getCustMobile();if(!StringUtils.isNullOrEmpty(custName)){//custName模糊查询qw.like("cust_name",custName);}if(!StringUtils.isNullOrEmpty(custMobile)){//custMobile精确查询qw.eq("cust_mobile",custMobile);}//selectList查询多条数据,封装成集合返回List<Customer> listCust = customerMapper.selectList(qw);return new PageInfo<>(listCust);}@Override//添加public int addCust(Customer customer) {//调用insert方法return customerMapper.insert(customer);}//删除//前端留的接口数据就是cid@Overridepublic int deleteCust(int id) {QueryWrapper<Customer> qw = new QueryWrapper<>();qw.eq("cid",id);//精确比较cid,拿到对象int delete = customerMapper.delete(qw);//用Mapper中的delete方法从数据中删除上面拿到的qwreturn delete;}
}

Controller

@Controller
@RequestMapping("cust")
//前端留的接口就是cust
public class CustomerController {@Autowiredprivate CustomerService customerService;//Customer页面显示@RequestMapping("listCust")public String list(@RequestParam(required = false,defaultValue = "1",value = "pageNum") Integer pageNum,@RequestParam(required = false,defaultValue = "10",value = "pageSize") Integer pageSize,Model model, Customer customer){if(pageNum<=0 || pageNum.equals("")||pageNum==null){pageNum = 1;}if(pageSize<=0 || pageSize.equals("")||pageSize==null){pageNum = 10;}PageHelper.startPage(pageNum,pageSize);PageInfo<Customer> pageInfo = customerService.list(customer);model.addAttribute("pageInfo",pageInfo);//前端留的pageInforeturn "customerList";}//跳转到添加数据页面,有一个单独的custSave.html页面@RequestMapping("preSaveCust")public String preSave(){return "custSave";}//真正的添加数据页面,保存数据@RequestMapping("saveCust")public String save(Customer customer){int i = customerService.addCust(customer);return "redirect:/cust/listCust";}//删除Customer数据@RequestMapping("delCust/{cid}")public String deleteCust(@PathVariable int cid){int i = customerService.deleteCust(cid);return "redirect:/cust/listCust";}
}

6、送水工管理模块

需要tb_worker表
在这里插入图片描述
业务层

@Service
public class WorkerServiceImpl implements WorkerService {@Autowiredprivate WorkerMapper workerMapper;@Override//查询所有public List<Worker> queryWorker() {return workerMapper.selectList(null);}@Override//查询所有带分页public PageInfo<Worker> list(Worker worker) {String workName = worker.getWorkerName();QueryWrapper<Worker> qw = new QueryWrapper<>();if(!StringUtils.isNullOrEmpty(workName)){qw.like("worker_name",workName);}List<Worker> workers = workerMapper.selectList(qw);return new PageInfo<>(workers);}@Override//添加public int addWorker(Worker worker) {return workerMapper.insert(worker);}@Overridepublic Worker getWorkerById(Integer id) {QueryWrapper<Worker> qw = new QueryWrapper<>();qw.eq("wid",id);Worker worker = workerMapper.selectOne(qw);return worker;}@Override//更新public int updateWorker(Worker worker) {Integer wid = worker.getWid();QueryWrapper<Worker> qw = new QueryWrapper<>();qw.eq("wid",wid);int update = workerMapper.update(worker, qw);return update;}@Override//更新薪资public int updateSalary(Integer wid, String workerSalary) {QueryWrapper<Worker> qw = new QueryWrapper<>();qw.eq("wid",wid);Worker worker = workerMapper.selectOne(qw);worker.setWorkerSalary(workerSalary);int update = workerMapper.update(worker, qw);return update;}
}

Controller

@Controller
@RequestMapping("worker")
public class WorkerController {@Value("${location}")private String location;@Autowiredprivate WorkerService workerService;@RequestMapping("workerList")public String list(@RequestParam(required = false,defaultValue = "1",value = "pageNum") Integer pageNum,@RequestParam(required = false,defaultValue = "10",value = "pageSize") Integer pageSize,Model model, Worker worker){//Model用于存PageInfoif (pageNum<=0||pageNum.equals("")||pageNum==null){pageNum = 1;}if (pageSize<=0||pageSize.equals("")||pageSize==null){pageSize = 10;}PageHelper.startPage(pageNum,pageSize);PageInfo<Worker> list = workerService.list(worker);model.addAttribute("pageInfo",list);return "workerList";}@RequestMapping("preSaveWorker")public String preAdd(){return "workerSave";}@PostMapping("workerSave")public String add(Worker worker, MultipartFile file){transFile(worker,file);workerService.addWorker(worker);return "redirect:/worker/workerList";}private void transFile(Worker worker, MultipartFile file) {String originalFileName = file.getOriginalFilename();int index = originalFileName.lastIndexOf(".");String suffix = originalFileName.substring(index);String prefix = System.nanoTime()+"";String path = prefix+suffix;File file1 = new File(location);if(!file1.exists()){file1.mkdirs();}File file2 = new File(file1,path);try {file.transferTo(file2);} catch (IOException e) {e.printStackTrace();}worker.setWorkerImage(path);}@RequestMapping("preUpdateWorker/{id}")public String preUpdate(@PathVariable Integer id,Model model){Worker worker = workerService.getWorkerById(id);model.addAttribute("worker",worker);return "workerUpdate";}@RequestMapping("updateWorker")public String update(Worker worker,MultipartFile file){transFile(worker,file);int i = workerService.updateWorker(worker);return "redirect:/worker/workerList";}//ajax传参数放在Data里了,不用@PathVariable接收,也不用跳转@PostMapping("addSalary")@ResponseBodypublic String addSalary(Integer wid,String workerSalary){int i = workerService.updateSalary(wid, workerSalary);if(i>0){//返回值根据前端ajax(workerList.html中)写好的参数返回return "OK";}else{return "error";}}
}

7、送水历史管理模块

需要tb_history表
在这里插入图片描述
需要用到一些mybatisPlus没有的方法,需要在mapper下写需要的方法,具体实现在resources/com/example/HistoryMapper.xml

@Repository
public interface HistoryMapper extends BaseMapper<History> {List<History> listHistory(Map<String,Object> map);//除了mybatisPlus自己的一些方法,如果有其他方法,需要自己在下面写//相当于接口,具体实现在resources下的HistoryMapper.xml文件里,写SQL语句//添加int addHis(History history);//批量删除int deleteHis(List<Integer> ids);//根据id获取history对象History getHisById(Integer id);//修改int updateHis(History history);
}

HistoryMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--记住 我的电脑这里只能是http才能出来小鸟-->
<mapper namespace="com.example.mapper.HistoryMapper"><resultMap id="historyMap" type="com.example.pojo.History"><id column="hid" property="hid"/><result column="send_water_time" property="sendWaterTime"/><result column="send_water_count" property="sendWaterCount"/><association property="customer"><id column="cid" property="cid"/><result column="cust_name" property="custName"/></association><association property="worker"><id column="wid" property="wid"/><result column="worker_name" property="workerName"/></association></resultMap><select id="listHistory" resultType="com.example.pojo.History" resultMap="historyMap">select h.hid, w.worker_name, c.cust_name, h.send_water_time, h.send_water_countfrom tb_history h,tb_customer c,tb_worker w<where>AND h.cust_id=c.cid AND h.worker_id=w.wid<if test="workerName != null and workerName!='' ">and w.worker_name like  concat('%',#{workerName},'%')</if><if test="sendWaterTime != null and sendWaterTime !='' ">and h.send_water_time like  concat('%',#{sendWaterTime},'%')</if></where></select><insert id="addHis">insert  into tb_history (cust_id,worker_id,send_water_time,send_water_count)values (#{customer.cid},#{worker.wid},#{sendWaterTime},#{sendWaterCount})</insert><delete id="deleteHis">delete from tb_historywhere hid in<foreach collection="ids" item="hid" open="(" close=")" separator=",">#{hid}</foreach></delete><select id="getHisById" resultType="com.example.pojo.History" resultMap="historyMap">select h.hid, w.worker_name, c.cust_name, h.send_water_time, h.send_water_countfrom tb_history h,tb_customer c,tb_worker w where h.cust_id=c.cid and h.worker_id=w.wid and  hid=#{id}</select><update id="updateHis">update tb_history set cust_id=#{customer.cid},worker_id=#{worker.wid},send_water_time=#{sendWaterTime},send_water_count=#{sendWaterCount}where  hid=#{hid}</update>
</mapper>

然后在业务层完成业务,controller层完成,controller层有一个数据回显的功能模块

    @RequestMapping("preSaveHis")//添加功能需要数据回显,必须是已经存在的worker和customer//数据回显是放在model中的public String preAddHis(Model model){List<Worker> workers = workerService.queryWorker();List<Customer> customer = customerService.querycustomer();//在historySave.html中有变量名,"custList"需要保持一致model.addAttribute("custList",customer);model.addAttribute("workerList",workers);return "historySave";}

8、计算薪资模块

在pojo创建Salary实体类
在mapper下创建SalaryMapper(用@Repository注解)
主要是sql语句
SalaryMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--记住 我的电脑这里只能是http才能出来小鸟-->
<mapper namespace="com.example.mapper.SalaryMapper"><select id="list" resultType="com.example.pojo.Salary">SELECT  w.worker_name,w.worker_salary,w.worker_money,IFNULL(SUM(h.send_water_count),0) as send_water_count,IFNULL(SUM(w.worker_money*h.send_water_count)+w.worker_salary , w.worker_salary) as final_salaryFROMtb_worker w LEFT JOIN tb_history h on w.wid=h.worker_id<where><if test="startDate!=null and startDate!='' and endDate!=null and endDate != '' ">and h.send_water_time between #{startDate} and #{endDate}</if></where>GROUP BY w.widORDER BY final_salary DESC</select><select id="listAll" resultType="com.example.pojo.Salary">SELECT  w.worker_name,w.worker_salary,w.worker_money,IFNULL(SUM(h.send_water_count),0) as send_water_count,IFNULL(SUM(w.worker_money*h.send_water_count)+w.worker_salary , w.worker_salary) as final_salaryFROMtb_worker w LEFT JOIN tb_history h on w.wid=h.worker_idGROUP BY w.widORDER BY final_salary DESC</select><select id="listNull" resultType="com.example.pojo.Salary">SELECT  w.worker_name,w.worker_salary,w.worker_money,IFNULL(SUM(h.send_water_count),0) as send_water_count,IFNULL(SUM(w.worker_money*h.send_water_count)+w.worker_salary , w.worker_salary) as final_salaryFROMtb_worker w LEFT JOIN tb_history h on w.wid=h.worker_idwhere h.worker_id is nullGROUP BY w.widORDER BY final_salary DESC</select>
</mapper>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D问界—什么是blender,与MAYA有什么区别

问题提出&#xff1a;什么是blender&#xff0c;与MAYA有什么区别 Blender 是一个开源的、免费的 3D 建模和动画软件&#xff0c;广泛应用于各种领域。它提供了丰富的功能和工具&#xff0c;适用于从业余爱好者到专业艺术家的不同需求。 1. Blender 的主要用途和功能 属 性描述…

Vue2基础 13:内置指令

内置指令 1 指令梳理2 补充指令2.1 v-text2.2 v-html2.3 v-cloak案例--延迟引入vue造成js阻塞 2.4 v-once案例--点击按钮1并展示初始的值 2.5 v-pre 1 指令梳理 前面几节的基础学习已经用到了部分的指令&#xff0c;先梳理一下。 指令描述v-bind单向绑定解析表达式&#xff0…

高项论文老是过不了!换种方法与思路…

2024年上半年信息系统项目管理师成绩公布后&#xff0c;许多考生的论文成绩都不理想&#xff0c;很多人得了30多分&#xff0c;及格线上的考生大多只有45、46分&#xff0c;而50分以上的考生似乎并不多。以下应该是许多考生的心声&#xff1a; 每次都是论文不及格&#xff0c;…

蚂蚁全媒体总编刘鑫炜谈新媒体时代艺术家如何创建及提升个人品牌

新媒体时代艺术家如何创建及提升个人品牌形象——专访蚂蚁全媒体总编刘鑫炜 图为蚂蚁全媒体总编刘鑫炜 在新媒体风潮席卷全球的今天&#xff0c;传统艺术与新媒体技术的融合越来越紧密。这种变革不仅改变了艺术作品的呈现方式&#xff0c;也给艺术家们提供了更多的可能性。那么…

【SOLID原则前端中的应用】接口隔离原则(Interface Segregation Principle,ISP)- vue3示例

接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;ISP&#xff09;在Vue 3中的应用 接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;ISP&#xff09;规定&#xff0c;客户端不应该被迫依赖于它不使用的方法。 换句话说&#xff0c;…

图形编辑器基于Paper.js教程07:鼠标画直线或移动路径

探索Paper.js: 使用鼠标绘制直线和轨迹 在数字图形设计和Web应用开发中&#xff0c;提供一个直观和互动的界面供用户绘制图形是极为重要的。Paper.js是一款功能强大的JavaScript库&#xff0c;它使得在HTML5 Canvas上绘制矢量图形变得简单快捷。本文将介绍如何使用Paper.js实现…

LT86101UXE 国产原装 HDMI2.0 / DVI中继器方案 分辨率 4Kx2K 用于多显示器 DVI/HDMI电缆扩展模块

1. 描述 Lontium LT86101UXE HDMI2.0 / DVI中继器特性高速中继器符合HDMI2.0/1.4规范,最大6 gbps高速数据率、自适应均衡RX输入和pre-emphasized TX输出支持长电缆应用程序,没有晶体在船上保存BOM成本,内部灵活的PCB TX巷交换路由。 LT86101UXE HDMI2.0/DVI中继器自动检测线缆损…

新时代【机器学习】与【Pycharm】:【随机数据生成】与智能【股票市场分析】

目录 第一步&#xff1a;准备工作 1.1 安装必要的库 小李的理解&#xff1a; 1.2 导入库 小李的理解&#xff1a; 第二步&#xff1a;生成和准备数据 2.1 生成随机股票数据 小李的理解&#xff1a; 2.2 数据探索与可视化 小李的理解&#xff1a; 2.3 数据处理 小李…

可编程直流电源的恒压模式(CV)和恒流模式(CC)

本文介绍可编程直流电源的恒压模式&#xff08;CV&#xff09;和恒流模式&#xff08;CC&#xff09;。 可编程直流电源在硬件开发过程中经常被用到&#xff0c;通常&#xff0c;它有2种模式&#xff0c;恒压模式&#xff08;CV&#xff09;和恒流模式&#xff08;CC&#xff…

桌面记事便签哪款好 好用的桌面记事本app

很多人喜欢在桌面上记事&#xff0c;尤其是经常使用电脑的上班族&#xff0c;这样查看起来更加方便。但在网上众多的记事软件中&#xff0c;哪款才是最好用的呢&#xff1f; 在众多选择中&#xff0c;敬业签以其出色的功能和用户体验脱颖而出&#xff0c;成为很多人记事的首选…

Debezium报错处理系列之第111篇:Can‘t compare binlog filenames with different base names

Debezium报错处理系列之第111篇:Cant compare binlog filenames with different base names 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技…

#数据结构 链表

单向链表 1. 概念 单向链表 单向循环链表 双向链表 双向循环链表 解决&#xff1a;长度固定的问题&#xff0c;插入和删除麻烦的问题 1、逻辑结构&#xff1a; 线性结构 2、存储结构&#xff1a; 链式存储 链表就是将 结点 用链串起来的线性表&#xff0c;链就是 结点 中的…

UE C++ 多镜头设置缩放 平移

一.整体思路 首先需要在 想要控制的躯体Pawn上&#xff0c;生成不同相机对应的SpringArm组件。其次是在Controller上&#xff0c;拿到这个Pawn&#xff0c;并在其中设置输入响应&#xff0c;并定义响应事件。响应事件里有指向Pawn的指针&#xff0c;并把Pawn的缩放平移功能进行…

MySQL的慢sql

什么是慢sql 每执行一次sql&#xff0c;数据库除了会返回执行结果以外&#xff0c;还会返回sql执行耗时&#xff0c;以mysql数据库为例&#xff0c;当我们开启了慢sql监控开关后&#xff0c;默认配置下&#xff0c;当sql的执行时间大于10s&#xff0c;会被记录到慢sql的日志文件…

优选算法之技巧(一):双指针一:移位0与复写0

引用&#xff1a;我们之前学过快排&#xff0c;首先用三元取中&#xff0c;找(key)&#xff0c;然后就用到了双指针的方法来进行交换排序&#xff0c;那我们今天要讲的双指针其实大同小异&#xff0c;无非在数组中就变成了下标。 题一&#xff1a; 给定一个数组 nums&#xf…

LDR6020-VR串流线:开启虚拟现实新纪元的钥匙

随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经从科幻概念逐渐走进我们的生活&#xff0c;成为娱乐、教育、医疗等多个领域的热门话题。而VR串流线&#xff0c;作为这一技术的重要组成部分&#xff0c;正逐步成为连接用户与高质量VR体验的关键桥梁…

移动硬盘坏道深度解析与应对全攻略

一、现象解读&#xff1a;移动硬盘坏道的直观展示 在数字化信息爆炸的今天&#xff0c;移动硬盘作为便捷的数据存储与传输工具&#xff0c;其重要性不言而喻。然而&#xff0c;随着使用时间的推移&#xff0c;不少用户遭遇了移动硬盘出现“坏道”的困扰。坏道&#xff0c;作为…

Spring与Quartz整合

Quartz框架是一个轻量级的任务调度框架&#xff0c;它提供了许多内置的功能&#xff0c;包括&#xff1a;支持作业的调度、集群调度、持久化、任务持久化、任务依赖、优先级、并发控制、失败重试等。同时也支持自定义作业类型和触发器类型。与Spring整合步骤如下&#xff1a; …

scp命令快速上手用法

作用 scp命令可以实现linux和linux&#xff0c;linux和windows之间文件互传 操作 实验准备 windows系统 ip&#xff1a;192.168.172.1 linux系统A ip&#xff1a;192.168.172.181 linux系统B ip&#xff1a;192.168.172.181 实验1&#xff1a;linux系统A推送文件到linxu…

基于springboot+vue+uniapp的贵工程寝室快修小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…