Java项目:SpringBoot+MyBatis送水公司管理系统

news2024/11/24 8:37:30

作者主页:源码空间站2022

 简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

项目介绍

这个项目是一个基于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

运行截图

相关代码

账户控制器

@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
     */
    @RequestMapping("/changePwd")
    public String changePwd() {
        return "changePwd";
    }

    /**
     * 修改密码
     * @param
     * @return
     */
    @RequestMapping(value="/updatePassword",method = RequestMethod.POST)
    public String updatePassword(String oldPassword,String confirmPassword, Model model, HttpSession session) {
        String username = (String) session.getAttribute("currentUser");

        boolean checkOldPwd = accountService.checkOldPassword(username,oldPassword);
        if (!checkOldPwd){
            model.addAttribute("changePwdMsg","原密码错误");
            return "changePwd";
        }
        // 将新密码信息持久化到数据库
        int count = accountService.updateAccount(username,confirmPassword);
        if (count>0){
            model.addAttribute("changePwdMsg","密码修改成功");
            return "changePwd";
        }else {
            model.addAttribute("changePwdMsg","密码修改失败");
            return "changePwd";
        }
    }
}

客户管理控制器

/**
 * TODO: 客户管理的控制器,处理客户管理所有的请求
 *
 * @author caojie
 * @version 1.0
 * @date 2021/10/22 8:29
 */
@Controller
@RequestMapping("/cust")
@Slf4j
public class CustomerController {
    /**
     * 控制器依赖业务逻辑,按照类型自动装配CustomerService对象
     */
    @Autowired
    private CustomerService customerService  ;

    /**
     * 用户点击"客户管理"超链接按钮,显示所有的客户信息
     * 步骤:
     * 1 调用CustomerService对象的listCustomer方法查询所有的客户信息
     * 2 将客户信息渲染到客户列表页面
     * 3 跳转到客户列表页面
     * @param model 在前端和后端之间传递数据的对象
     * @return 客户列表页面
     */
    @RequestMapping("/listCust")
    public String listCustomer(Model model) {
        List<Customer> custList = customerService.listCustomer();
        model.addAttribute("custList",custList);
        return "customerList";
    }
    /**
        点击“客户列表”页面的“添加”按钮,跳转到“添加客户”页面
     */
    @RequestMapping("/preSaveCust")
    public String preSaveCustomer() {
        return "customerSave";
    }

    /**
     * 在“添加客户”页面的表单填写要添加的客户信息,点击“提交”按钮,处理添加客户的请求
     * 步骤:
     * 1 调用CustomerService对象的saveCustomer添加客户信息
     * 2 重定向到客户列表,显示新添加的客户信息
     * @param customer 表单采集的客户对象
     * @return 客户列表,显示添加的新客户信息
     */
    @RequestMapping(value = "/saveCust",method = RequestMethod.POST)
    public String saveCustomer(Customer customer) {

        log.info("customer ==="+ customer);
        int rows = customerService.saveCustomer(customer);
        log.info("save customer rows = "+rows);
        // 添加成功之后重新查询客户列表,显示新添加的客户信息
        return "redirect:/cust/listCust";
    }

    /**
     * 在浏览器上输入要搜索的“客户名称”,点击“搜索按钮”,根据条件搜索满足条件的客户,将客户列表显示到前端页面
     * 步骤:
     * 1 调用CustomerService对象的searchCustomer方法根据客户名称搜索满足条件的客户
     * 2 将客户列表渲染到前端(客户列表)页面
     * 3 跳转到客户列表页面
     * @param custName 客户名称
     * @param model
     * @return 客户列表页面
     */
    @RequestMapping("/searchCust")
    public String searchCustomer(String custName, Model model) {
        log.info("searchCustomer custName = "+custName);
        List<Customer> custList = customerService.searchCustomer(custName);
        model.addAttribute("custList",custList);
        // 把搜索条件回传到前端页面
        model.addAttribute("searchName",custName);
        return "customerList";
    }

    /**
     * 处理删除请求
     * 步骤:
     * 1 调用CustomerService对象的deleteCustomerById方法根据客户ID删除客户信息
     * 2 打印受影响行数
     * 3 返回客户列表路径,重新执行查询客户列表方法listCustomer,显示删除之后的数据
     * @param cid 前端传入的客户id
     * @return 返回客户列表路径,重新执行查询客户列表方法listCustomer,显示删除之后的数据
     */
    @RequestMapping("/delCust/{cid}")
    public String deleteCustomer(@PathVariable("cid") Integer cid) {
        log.info("delete Customer cid = "+cid);
        int rows = customerService.deleteCustomerById(cid);
        log.info("delte customer rows = "+rows);
        return "redirect:/cust/listCust";
    }

    /**
     * 用户在页面上点击“修改”按钮,完成数据回显
     * 步骤:
     * 1 根据ID查询对应的客户信息
     * 2 将客户信息渲染到“修改客户”页面
     * 3 返回“修改客户”页面
     * @param cid 客户id
     * @param model
     * @return 修改客户
     */
    @RequestMapping("/preUpdateCust/{cid}")
    public String preUpdateCustomer(@PathVariable("cid") Integer cid,Model model) {
        log.info("pre update customer cid = "+cid);
        Customer customer = customerService.getCustomerById(cid);
        model.addAttribute("customer",customer);
        return "customerUpdate";
    }

    /**
     * 在“修改客户”页面点击“提交”按钮,处理“修改客户”的请求
     * 修改成功重新执行查询客户列表,显示修改之后的客户信息
     * @param customer “修改客户”页面采集的客户信息
     * @return 客户列表
     */
    @RequestMapping(value="/updateCust",method = RequestMethod.POST)
    public String updateCustomer(Customer customer) {
        log.info("update Customer "+customer);
        int rows = customerService.updateCustomer(customer);
        log.info("update customer rows = "+rows);
        return "redirect:/cust/listCust";
    }
}

工人控制器

@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";
    }

    /**
     * 点击“添加”按钮,跳转到“添加送水工”页面
     * @return “添加送水工”页面
     */
    @RequestMapping("/preSaveWorker")
    public String preSaveWorker() {
        return "workerSave";
    }

    /**
     * 在“添加送水工”页面点击“提交”按钮,添加送水工信息
     * 步骤:
     * 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);
            // 上传文件
            try {
                file.transferTo(uploadFilePath);
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 将拼接上传的文件设置到Worker对象中
            worker.setWorkerImage(uploadFile);
        }
    }

    /**
     * 点击“修改”按钮,根据送水工id获取对应的送水工信息,将信息渲染到前端页面上
     * 步骤:
     * 1 根据id查询对应的送水工信息
     * 2 将送水工信息渲染到前端页面
     * 3 返回“修改送水工”页面
     * @param wid 送水工id
     * @param model
     * @return “修改送水工”页面
     */
    @RequestMapping("/preUpdateWorker/{wid}")
    public String preUpdateWorker(@PathVariable("wid")Integer wid,Model model) {
        log.info("pre update worker id = "+wid);
        Worker worker = workerService.getWorkerById(wid);
        model.addAttribute("worker",worker);
        return "workerUpdate";
    }

    @RequestMapping(value="/updateWorker",method = RequestMethod.POST)
    public String updateWorker(Worker worker, MultipartFile file) {
        // 条件成立:表示客户上传了文件
        uploadFile(worker, file);
        // 将送水工信息持久化到数据库
        workerService.updateWorker(worker);
        return "redirect:/worker/workerList";
    }

    @RequestMapping(value="/adjustSalary",method = RequestMethod.POST)
    @ResponseBody
    public String adjustWorkerSalary(Integer wid,Integer workerSalary) {
        log.info("adjustWorkerSalary wid = "+wid);
        log.info("adjustWorkerSalary workerSalary = "+wid);
        int rows = workerService.adjustSalary(wid, workerSalary);
        log.info("adjustWorkerSalary rows = "+rows);
        if (rows > 0) {
            return "OK";
        } else {
            return "Fail";
        }
    }
}

如果也想学习本系统,下面领取。回复:099springboot 

 

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

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

相关文章

79页智慧应急指挥平台1 6 N体系建设方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 行业专网解决…

ARM_SMMU_下

SMMU驱动代码分析 本文主要分析linux kernel中SMMUv3的代码(drivers/iommu/arm-smmu-v3.c) linux kernel版本是linux 5.7, 体系结构是aarch64 SMMU的作用是把CPU提交给设备的VA地址&#xff0c;直接作为设备发出的地址&#xff0c;变成正确的物理地址&#xff0c;访问到物理内…

五、传输层(一)传输层的功能

目录 1.1传输层的主要功能 1.2传输层的寻址与端口 1.2.1端口的作用 1.2.2端口号 1.2.3套接字 1.3无连接服务与面向连接服务 1.1传输层的主要功能 物理层、数据链路层和网络层共同解决了主机通过异构网络互联起来所面临的问题&#xff0c;实现了主机到主机的通信。然而在…

【iOS】CAlayer的认识与使用

什么是CALayer CALayer是UIView里的一个图层&#xff0c;其主要功能是负责显示视图与动画。CALayer和UIView 功能是一致的、 不过因为其 更加底层 所以 CALayer 有一些接口、 UIView 里面没有。 CALayer与UIView UIView&#xff1a;用于管理视图的容器。每次创建UIView对象时…

当我阳了之后是如何用Python来自动买药的

人生苦短&#xff0c;我用Python序言准备工作代码实战序言 哈喽兄弟们&#xff0c;我是郑再阳&#xff0c;马上要成杨过了&#xff01; 读者&#xff1a;在下羊了个羊&#xff01; 最近总是听说哪里哪里阳了&#xff0c;哪个公司又团灭了&#xff0c;emmm~ 于是乎看了几天后…

【exgcd】扩展欧几里得

主要介绍扩展欧几里的和总结一些常用性质 首先介绍裴蜀定理 对于任意整数a,b,存在一对整数x,y 满足 axbygcd(a,b) 即存在x0,y0使得ax0by0gcd(a,b) 扩展欧几里得可以求出x0,y0 从而当axbyc 可以求出其通解 设dgcd(a,b) 显然当c%d!0时无整数解 通解可以表示为 x(c/d)x0k…

Java项目:springboot访客管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 springboot搭建的访客管理系统&#xff0c;针对高端基地做严格把控来访人员信息管理&#xff0c;用户后端可以设置多个管理员帐号&#xff0c;给…

力扣(LeetCode)207. 课程表(C++)

拓扑排序 根据示例看出&#xff0c;课程表是否存在环&#xff0c;是问题的关键。这题的环&#xff0c;和数组、链表的环不一样&#xff0c;不好判&#xff0c;要转化成图判拓扑序列。 考虑向右和向左的方向&#xff0c;拓扑序列的所有边可以指向同一方向。 无环图进行重排序…

论文阅读Measuring Regularity of Individual Travel Patterns

这是一篇发表在IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS上的论文&#xff0c;论文主要描述了一种刻画出行规律性的方法。 1.论文概述 论文主要描述了一种刻画出行规律性的方法。首先&#xff0c;论文给出了对出行活动序列&#xff08;travel event&#xff…

因果推断3--DRNet(个人笔记)

目录 Learning Counterfactual Representations for Estimating Individual Dose-Response Curves 1介绍 2相关工作 3方法 4实验 5结果和讨论 6结论 7理解 论文标题 Learning Counterfactual Representations for Estimating Individual Dose-Response Curves 收录会…

深度学习-AlexNet(第一个深度卷积网络)

文章目录简介数据集模型搭建模型训练模型测试前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 AlexNet是第一个深度卷积网络模型&#xff0c;赢得了2012年ImageNet图像分类竞赛的冠军…

Java项目:springboot销售团队后台管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该项目为后管系统&#xff0c;主要功能包括&#xff1a; 看板、业务机会管理、客户管理、联系人管理、我的日报、团队日报、主数据管理&#x…

【Linux】进程间通信之共享内存

目录&#x1f308;前言&#x1f338;1、System V共享内存&#x1f361;1.1、概念&#x1f362;1.2、原理&#x1f33a;2、共享内存相关函数和指令&#x1f361;2.1、shmget函数&#xff08;创建&#xff09;&#x1f362;2.2、shmctl函数&#xff08;控制&#xff09;&#x1f…

TCP 的重传机制、选择确认、缓存与流量控制、连接管理、拥塞控制(计算机网络-运输层)

目录 TCP 的重传机制 TCP 的选择确认 TCP 的缓存与流量控制 TCP 的连接管理 TCP的拥塞控制 TCP 的重传机制 TCP 每发送一个报文段就设置一个超时计时器&#xff1b; TCP 使用指数加权移动平均算法计算 RTT 及其偏差的估计值&#xff0c;并据此计算超时重传时间&#xff1b…

8 NP完全性理论

8 NP完全性理论 p问题 NP问题 NP完全问题 NPC(complete ) NP难问题NP-hard p问题 是一类能够用**(确定的)算法**在多项式时间内求解的可判定问题 ●这种问题类型也称为多项式类型 NP问题 是一类能够用不确定算法在多项式时间内求解的可判定问题 在确定性计算模型下多项式时…

程序员高手解决问题,都是从正确的提问开始

回顾各大技术网站、社区、问答&#xff0c;我们发现&#xff1a;真正的程序员高手都极度擅长提问。 好的提问不但能得到建设性的解决方案&#xff0c;更加能激发人们的好奇心、创造力和学习的动力。 毫不夸张地说&#xff0c;会提问的程序员一开口就赢了&#xff01; 所以今…

HashMap源码剖析(下)——java集合

系列文章目录 文章目录系列文章目录前言一、 回顾总结二、HashMap数据插入流程JDK1.8 HashMap的put方法源码如下:2.1 扩容机制2.2 链表树化2.3 红黑树转链三、查找总结四、删除五、遍历前言 既上一节内容 本节内容是&#xff0c;HashMap还有基本的数据功能&#xff1b;存储、删…

(三)GNSS定位中的定位系统和误差源

翻看了一下记录&#xff0c;离上一次GNSS内容的更新已经过去9个月了。时间过的太快&#xff0c;硕士生涯已经过去一半&#xff0c;有遗憾也有收获&#xff0c;过去的9个月经历了各种喜怒哀乐以及迷茫。永远相信美好的事情即将发生&#xff0c;GO LONG CHINA&#xff01; 今天写…

魅族大会公布未来多项规划!全场景门店、旗舰新品明年将落地

如果说中国手机行业中哪个品牌的粉丝忠诚度最高&#xff0c;那恐怕魅族说第二&#xff0c;也没几家敢说第一。这些年来&#xff0c;虽然魅族手机经历风风雨雨&#xff0c;但依然有着非常庞大的粉丝基础。前不久刚刚结束的魅友大会2022大会现场人潮涌动&#xff0c;随着天南海北…

Linux系统下的常用查找指令及用法

find指令&#xff1a;将从指定目录向下递归地遍历其各个子目录&#xff0c;将满足条件的文件或者目录显示在终端&#xff0c; 语法&#xff1a;find[搜索范围][选项] 方式作用-name<查询方式>按照指定的文件名查找模式查找文件-user<用户名>查找属于指定用户名所有…