基于javaweb的SpringBoot送水公司管理系统(java+springboot+html+thymeleaf+mybatis+mysql+maven)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

190023472402

200023472402

210023472402

220023472402

230023472402

240023472402

基于javaweb的SpringBoot送水公司管理系统(java+springboot+html+thymeleaf+mybatis+mysql+maven)

项目介绍

这个项目是一个基于SpringBoot+MyBatis的送水公司管理系统

管理员权限包括: 客户管理 送水工管理 送水历史管理 计算工资 统计送水数量

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;  4.数据库:MySql 5.7版本; 5.是否Maven项目:是;

技术栈

1.后端:SpringBoot+Mybatis+Mysql 2.前端:html+css+javascript

使用说明

  1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中application.yml配置文件中的数据库配置改为自己的配置; 4. 运行项目,在浏览器中输入http://localhost:8091/ 注意:端口不要修改,否则会有异常 管理员账户:admin/admin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 * 1 上传送水工照片
* 1.1 获取上传文件的名称
* 1.2 获取上传文件后缀的索引
* 1.3 根据索引获取上传的文件名后缀,例如:.png
* 1.4 获取上传文件的前缀,例如:15456435635。注意前缀命名使用1970-01-01距离现在的毫秒数
* 1.5 判断上传路径是否存在,如果不存在创建改路径。例如: D:/upLoad/picture/
* 1.6 拼接上传文件的前缀和后缀名称。例如:15456435635.png。然后创建对应的File对象
* 1.7 上传文件
* 1.8 将凭借的上传文件名称设置到Worker对象中
* 2 调用WorkerService对象的saveWorker方法,将送水工信息保存到数据库中
* 3 重定向到客户列表,显示新添加的送水工信息
* @param worker 表单采集的新送水工信息
* @param file 封装了浏览器上传的图片数据
* @return 重定向到客户列表,显示新添加的送水工信息
*/
@RequestMapping(value="/saveWorker",method = RequestMethod.POST)
public String saveWorker(Worker worker, MultipartFile file) {
uploadFile(worker, file);
// 将送水工信息持久化到数据库
workerService.saveWorker(worker);
return "redirect:/worker/workerList";
}

private void uploadFile(Worker worker, MultipartFile file) {
// 条件成立:表示客户上传了文件
if (null != file) {
// 获取上传文件名称。例如:WeChart.png
String fileName = file.getOriginalFilename();
// 获取上传文件的后缀索引号
int suffixIndex = fileName.lastIndexOf(".");
// 根据索引获取后缀。例如:.png
String suffix = StringUtils.substring(fileName, suffixIndex);
// 获取文件前缀(使用当前系统时间的纳秒)
long prefix = System.nanoTime();
// 创建服务器上传路径的File对象
File serverPath = new File(location);
// 条件成立:表示服务器存储上传文件的路径不存在,需要创建
if (!serverPath.exists()) {
serverPath.mkdirs();
}
// 拼接上传的文件。前缀(15456435635)+后缀(.png) 15456435635.png
String uploadFile = prefix + suffix;
// 创建上传的文件在服务器磁盘的真实路径
// 参数1:父路径。例如:D:/upLoad/picture/
// 参数2:上传的文件名。例如: 15456435635.png
File uploadFilePath = new File(serverPath, uploadFile);
// 上传文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    @RequestMapping(value="/updateHis",method=RequestMethod.POST)
public String updateHistory(Integer workerId,Integer custId,History history) {
log.info(" update custId id = "+custId);
log.info(" update worker id = "+workerId);
log.info(" update History = "+history);
Worker worker = new Worker();
worker.setWid(workerId);

Customer customer = new Customer();
customer.setCid(custId);
history.setCustomer(customer);
history.setWorker(worker);
// 修改送水历史,返回受影响行数
int rows = historyService.updateHistory(history);
log.info("update history rows = "+rows);
return "redirect:/history/listHis";
}

/**
* 处理批量删除请求
* @param idList 前端传入的要删除的送水历史id列表
* @return OK 批量删除成功,Fail表示批量删除失败
*/
@RequestMapping(value="/batchDeleteHistory",method = RequestMethod.POST)
@ResponseBody
public String batchDeleteHistory(String idList) {
// 调用业务逻辑层方法进行批量删除
int rows = historyService.batchDeleteHistory(idList);
if (rows > 0) {
return "OK";
} else {
return "Fail";
}
}
}
package com.minzu.controller;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    model.addAttribute("custList",custList);
model.addAttribute("workerList",workerList);
return "historySave";
}

/**
* 在“添加送水历史页面”点击“提交”按钮,将送水历史信息持久化(insert插入)到数据库中,然后返回“送水历史列表”,重新
* 查询送水历史列表显示新添加的数据
* 步骤:
* 1 将客户ID和送水工ID注入到History对象
* 2 调用HistoryService对象的saveHistory方法将表单采集的数据持久化到数据库
* 3 重新“查询送水历史信息”,显示新添加的数据
* @param workerId 表单采集的送水工编号
* @param custId 表单采集的客户编号
* @param history 表单采集的送水历史信息
* @return 重定向到送水历史列表路径
*/
@RequestMapping(value = "/saveHis",method = RequestMethod.POST)
public String saveHistory(Integer workerId,Integer custId,History history) {
log.info("workerId = "+workerId);
log.info("custId = "+custId);
log.info("history = "+history);
Worker worker = new Worker();
worker.setWid(workerId);

Customer customer = new Customer();
customer.setCid(custId);
// History注入送水功和客户信息
history.setWorker(worker);
history.setCustomer(customer);
// 持久化History对象
// rows 返回执行insert 语句受影响行数
int rows = historyService.saveHistory(history);
log.info("save History rows = "+rows);
return "redirect:/history/listHis";
}


/**
* 点击“送水历史管理”查询所有的送水历史信息
* 返回“送水历史列表”页面
* @param model
*/
@RequestMapping("/listHis")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


/**
* TODO
*
* @version 1.0
*/
@Controller
@RequestMapping("/worker")
@Slf4j
public class WorkerController {

@Autowired
private WorkerService workerService;

/**
* 读取yml配置文件的路径
*/
@Value("${location}")
private String location;

/**
* 用户点击侧边栏的“客户管理”,处理该请求,将所有的客户信息渲染到“客户列表”页面,最后返回“客户列表”页面
* @param model
* @return 返回“客户列表”页面
*/
@RequestMapping("/workerList")
public String listWorker(Model model) {
List<Worker> workerList = workerService.listWorker();
model.addAttribute("workerList",workerList);
return "workerList";
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    }

/**
* 点击“提交”按钮修改送水历史信息,修改完毕重定向执行“送水历史列表”,显示已修改的“送水历史信息”
* 步骤:
* 1 将送水工ID和客户ID注入到History对象
* 2 调用HistoryService对象的updateHistory方法完成修改
* 3 修改完毕重定向执行“送水历史列表”
* @param workerId 送水历史对应的送水工ID
* @param custId 送水历史对应的客户ID
* @param history 送水历史信息
* @return 重定向执行“送水历史列表”
*/
@RequestMapping(value="/updateHis",method=RequestMethod.POST)
public String updateHistory(Integer workerId,Integer custId,History history) {
log.info(" update custId id = "+custId);
log.info(" update worker id = "+workerId);
log.info(" update History = "+history);
Worker worker = new Worker();
worker.setWid(workerId);

Customer customer = new Customer();
customer.setCid(custId);
history.setCustomer(customer);
history.setWorker(worker);
// 修改送水历史,返回受影响行数
int rows = historyService.updateHistory(history);
log.info("update history rows = "+rows);
return "redirect:/history/listHis";
}

/**
* 处理批量删除请求
* @param idList 前端传入的要删除的送水历史id列表
* @return OK 批量删除成功,Fail表示批量删除失败
*/
@RequestMapping(value="/batchDeleteHistory",method = RequestMethod.POST)
@ResponseBody
public String batchDeleteHistory(String idList) {
// 调用业务逻辑层方法进行批量删除
int rows = historyService.batchDeleteHistory(idList);
if (rows > 0) {
return "OK";
} else {
return "Fail";
}
}
}
package com.minzu.controller;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 * @version 1.0
*/
@Controller
@Slf4j
public class AccountController {

/**
* Controller控制器依赖于业务逻辑层,将AccountService自动装配到控制器(AccountController对象)
*/
@Autowired
private AccountService accountService;

/**
* 该方法用来处理前端浏览器的登录请求,登录成功跳转到"送水工管理系统"主页面,登录失败返回index.html页面
* 步骤:
* 1 调用业务逻辑对象(AccountService)的login方法判断登录是否成功
* 2 登录成功跳转到"送水工管理系统"主页面
* 3 登录失败返回index.html页面,并给出提示"用户名或者密码错误"
* @param userName 浏览器表单采集的用户名
* @param userPwd 浏览器表单采集的密码
* @param model 用来在视图层和控制层之间传递数据的对象
* @return 登录成功跳转到"送水工管理系统"主页面,登录失败返回index.html页面
*/
@RequestMapping(value="/login",method = RequestMethod.POST)
public String login(String userName, String userPwd, Model model, HttpSession session) {
boolean result = accountService.login(userName, userPwd);
// 条件成立:登录成功,否则登录失败
if(result) {
//登陆成功,将表单输入的用户名传递到前端页面
session.setAttribute("currentUser",userName);
// 登录成功跳转到主页面
return "waterMainMenu";
} else {
model.addAttribute("loginFail","用户名或者密码错误");
return "index";
}
}

/***
* 退出系统
* @return
*/
@RequestMapping("/logout")
public String logout() {
return "index";
}

/***
* 跳转到修改密码页面
* @return


项目链接:
https://javayms.github.io?id=141122542008200sd
https://javayms.pages.dev?id=141122542008200sd