【SaaS - Export项目】08部门Dept的查询、分页、增加、删除(ajax)

2023-10-16 03:59

本文主要是介绍【SaaS - Export项目】08部门Dept的查询、分页、增加、删除(ajax),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 部门管理 - 分析
    • 准备
    • 部门信息CRUD(当前默认对公司id=1的部门进行管理)
      • 1. 查询部门信息分页显示【***】
      • 2. 添加部门信息
      • 3. 通过id删除部门【ajax***】

部门管理 - 分析

1)部门表dept的结构
在这里插入图片描述
2)parent_id的父部门id含义
如果一个部门记录的parent_id为null,没有上级部门。(形成一个树形结构)
反之就是上级部门的id。
3)company_id可以用于查询一个分司有几个部门。

准备

创建部门类

这里要注意:数据库中上级部门存储的是上级部门id,但是我们在这里也直接写成部门对象,方便获取上级部门的信息。

public class Dept {//private String parentId;      //数据库是上级部门的id//特殊(类中有一个类还是自己),上级部门也是Dept类,可以直接获取上级部门信息,封装到类中private Dept parent;            
//部门类
public class Dept {//类的成员变量是小驼峰,第二个单词起首字母大写(aaBbCc)//数据库是下划线,每个单词小写,使用_隔开(aa_bb_cc)private String deptId;private String deptName;//private String parentId;      //数据库是上级部门的id//特殊(类中有一个类还是自己),上级部门也是Dept类private Dept parent;            //在类中,直接用上级部门的类对象(好处:可以直接获取上级部门信息,封装到类中)private Integer state;          //部门启用/通用状态private String companyId;       //企业idprivate String companyName;     //企业名//省略get/set方法
}

部门增删查改是基于公司而言的,这里我们设置一个BaseController模拟,公司id=1的吉首大学,对部门进行管理的时候继承该类,也就是对该登录公司进行部门管理(当前先写为这个默认值)
BaseController

//定义父类BaseController,让子类继承父类的request,session,response,并且注入对象
//子类继承父类,可以自动拥有父类的非私有成员(方法或者变量)
//当前默认登录的公司id为1,名称为吉首大学
public class BaseController {//定义一个可以返回companyId,对部门管理要看公司,这里先设死为1,也就是对id为1的公司的部门进行管理public String getLoginCompanyId(){return "1";}//定义一个可以返回companyNamepublic String getLoginCompanyName(){return "吉首大学";}//在父类中定义成员变量 request,session,response,并且注入对象// 以后控制器方法可以直接使用@Autowiredprotected HttpServletRequest request;//注入session@Autowiredprotected HttpSession session;//注入response@Autowiredprotected HttpServletResponse response;//需要disable inspection}


部门信息CRUD(当前默认对公司id=1的部门进行管理)

1. 查询部门信息分页显示【***】

【注意】:这里每个部门数据库表都有一个对应的上级部门id(如果没有上级部门,也就是顶级部门,那就为Null),但是在部门类Dept中我们封装的是上级Dept部门对象,而不是上级部门的id,这是为了方便的获取上级部门的信息。
所以查询当前部门信息,同时查询副部们的信息封装到当前部门,通过assoication实现

        <!-- 将表中上级部门id(parent_id) 映射为Dept部门类型(通过findById查询整合部门信息封装到Dept部门中)在类Dept私有成员变量private  Dept parent一对一关联查询,一个Dept部门,有一个上级部门--><association column="parent_id" property="parent" javaType="dept" select="findById"></association>

在这里插入图片描述

  1. export_system_service子工程test下编写测试查询部门分页显示方法

TestDeptService

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:spring/applicationContext-*.xml")
public class TestDeptService {private static final Logger l = LoggerFactory.getLogger(TestDeptService.class);@AutowiredIDeptService deptService;//测试查询公司(通过登录公司的id)的所有部门信息@Testpublic void test01(){//给页面的下拉菜单按公司查找所有的部门String  companyId="1";List<Dept> list = deptService.findAll(companyId);//打印l.info("test02 部门列表list="+list);}//测试分页查询显示(每页3条)指定公司id的部门  参1:当前页  参2:每页数据大小  参3:公司id@Testpublic void test02(){//部门分页显示int curr=1;int pageSize=3;String  companyId="1";//调用分页查找方法  参1:当前第几页  参2:每页多少条 参3:公司idPageInfo<Dept> pi = deptService.findByPage(curr,pageSize,companyId);//日志打印l.info("test01 分页信息pi="+pi);}
}
  1. export_system_service子工程创建service接口和实现类

IDeptService

//部门业务接口
public interface IDeptService {//根据公司id,companyId查找该公司下面的所有的部门List<Dept> findAll(String companyId);//分页查询显示指定公司id的部门  参1:当前页  参2:每页数据大小  参3:公司idPageInfo<Dept> findByPage(int curr, int pageSize, String companyId);
}

DeptServiceServiceImpl

//部门业务实现类
@Service
public class DeptServiceImpl implements IDeptService {//还需要注入dao 根据三层架构  service调用dao@AutowiredIDeptDao deptDao;@Overridepublic List<Dept> findAll(String companyId) {List<Dept> list =  deptDao.findAll(companyId);return list;}@Overridepublic PageInfo<Dept> findByPage(int curr, int pageSize, String companyId) {//调用dao查询所有的记录,并分页显示//select * from dept;//select * from dept limit curr-1,pageSize;    //拦截器增加limit,分页查询显示PageHelper.startPage(curr,pageSize);List<Dept> list =  deptDao.findAll(companyId);return new PageInfo<>(list);}
}
  1. export_dao子工程dao接口及其映射

IDeptDao

public interface IDeptDao {//通过公司id查找所有部门List<Dept> findAll(String companyId);
}

IDeptDao.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" >
<!--namespace: 需要映射的Dao接口类型-->
<mapper namespace="com.xgf.dao.system.dept.IDeptDao"><!-- 数据库,下划线(aa_bb_cc) 类是驼峰(aaBbCc)将查询结果映射到类的成员变量column是数据库的列名   property是类的属性名(映射对应)--><resultMap id="deptMap" type="dept"><id column="dept_id" property="deptId"/><result column="dept_name" property="deptName"/><result column="company_id" property="companyId"/><result column="company_name" property="companyName"/><!-- 将表中上级部门id(parent_id) 映射为Dept部门类型(通过findById查询整合部门信息封装到Dept部门中)在类Dept私有成员变量private  Dept parent一对一关联查询,一个Dept部门,有一个上级部门--><association column="parent_id" property="parent" javaType="dept" select="findById"></association></resultMap><!-- 通过部门id查询部门的信息(为了表中的上级部门id封装到类中为一个部门对象) --><select id="findById" parameterType="string" resultMap="deptMap">select  * from  pe_dept where dept_id = #{dept_id}</select><!-- 查询所有部门信息 --><select id="findAll" parameterType="string" resultMap="deptMap">select * from pe_dept where company_id = #{companyId}</select></mapper>
  1. 测试查询所有部门方法并分页显示,查询成功
    在这里插入图片描述

  2. export_web_manager子工程编写controller

DeptController

@Controller
@RequestMapping("/system/dept")
public class DeptController extends BaseController {@AutowiredIDeptService deptService;//日志记录private static  final Logger l = LoggerFactory.getLogger(DeptController.class);//查询部门信息,并返回部门列表页面,@RequestParam的defaultValue设置默认值@RequestMapping(path="/toList",method ={ RequestMethod.GET, RequestMethod.POST})public String toList(Model model, @RequestParam(defaultValue = "1") Integer curr,@RequestParam(defaultValue = "5")  Integer pageSize){l.info("toList 当前页curr = "+curr);//当前第几页l.info("toList 每页数据量pageSize = "+pageSize);//每页记录数l.info("toList 部门所属公司companyId = "+super.getLoginCompanyId());//指定公司id//查询一个分页PageInfo<Dept> pi = deptService.findByPage(curr, pageSize, super.getLoginCompanyId());l.info("toList pi = "+pi);model.addAttribute("pi",pi);return "system/dept/dept-list";}
}

dept-list.jsp
按钮工具栏(增加、删除、刷新按钮)

<!--工具栏--><div class="pull-left"><div class="form-group form-inline"><div class="btn-group"><button type="button" class="btn btn-default" title="新建" onclick='location.href="${path}/system/dept/toAdd?companyId=1"'><i class="fa fa-file-o"></i> 新建</button><button type="button" class="btn btn-default" title="删除" onclick='deleteById()'><i class="fa fa-trash-o"></i> 删除</button><button type="button" class="btn btn-default" title="刷新" onclick="window.location.reload();"><i class="fa fa-refresh"></i> 刷新</button></div></div></div>

部门table

<!--数据列表--><table id="dataList" class="table table-bordered table-striped table-hover dataTable"><thead><tr><th class="" style="padding-right:0px;"><input type="checkbox" name="selid" onclick="checkAll('id',this)"></th><th class="sorting">序号</th><th class="sorting">编号</th><th class="sorting">上级</th><th class="sorting">名称</th><th class="text-center">操作</th></tr></thead><tbody><c:forEach items="${pi.list}" var="dept"  varStatus="st"><tr><td><input type="checkbox" name="id" value="${dept.deptId }"/></td><td>${st.count }</td><td>${dept.deptId }</td><td>${dept.parent.deptName }</td><td><a href="/system/dept/toUpdate?id=${dept.deptId }">${dept.deptName }</a></td><th class="text-center"><button type="button" class="btn bg-olive btn-xs" onclick='location.href="${path}/system/dept/toUpdate?deptId=${dept.deptId}"'>编辑</button></th></tr></c:forEach></tbody></table>

底部导入重用分页信息(分页工具栏page.jsp

<%-- 底部分页信息 --%><div class="box-footer"><%-- 分页页面重用,将url参数传给分页页面,分页页面通过表单提交${param.pageUrl}获取地址来实现分页 --%><jsp:include page="../../common/page.jsp"><jsp:param value="${path}/system/dept/toList" name="pageUrl"/></jsp:include></div>

2. 添加部门信息

在这里插入图片描述

  1. export_system_service子工程test下编写测试添加部门方法

TestDeptService


//测试增加@Testpublic void test03(){//模拟表单Dept dept = new Dept();dept.setCompanyId("1");dept.setDeptName("最牛13的java部门");dept.setState(1);Dept parent = new Dept();parent.setDeptId("100101101");dept.setParent(parent);//保存到数据库deptService.saveDept(dept);}
  1. export_system_service子工程创建service接口和实现类

IDeptService

	//新建一个部门void saveDept(Dept dept);

DeptServiceServiceImpl

@Overridepublic void saveDept(Dept dept) {//表的id都不是自动生成的,UUID随机生成String id = UUID.randomUUID().toString();dept.setDeptId(id);//调用dao进行保存deptDao.save(dept);}
  1. export_dao子工程dao接口及其映射

IDeptDao

    //保存一个部门void save(Dept dept);

IDeptDao.xml
增加部门的时候,先获取上级部门信息,再通过parent.deptId获取上级部门的id,存入数据库。

<!-- save保存部门 --><insert id="save" parameterType="dept">insert into pe_dept(dept_id      ,dept_name    ,parent_id    ,state        ,company_id   ,company_name)values(#{deptId     },#{deptName   },#{parent.deptId  },#{state       },#{companyId  },#{companyName})</insert>
  1. 测试增加一个部门方法,增加成功
    在这里插入图片描述

  2. export_web_manager子工程编写controller

DeptController

    //跳转增加部门页面@RequestMapping(path="/toAdd",method ={ RequestMethod.GET, RequestMethod.POST})public String toAdd(Model model){//需要为下拉菜单查询出所有的部门,一个部门对应一个选项//根据companyId查询出部门,不做分页l.info("toAdd companyId="+super.getLoginCompanyId());List<Dept> list=deptService.findAll(super.getLoginCompanyId());l.info("toAdd list="+list);model.addAttribute("list",list);return "system/dept/dept-add";}//增加部门@RequestMapping(path="/add",method ={RequestMethod.POST})public String add(Dept dept,String parentId){l.info("add  dept="+dept);l.info("add  parentId="+parentId);//按照登录公司来进行部门管理,先默认公司id是1,对id=1的公司进行部门管理dept.setCompanyId(super.getLoginCompanyId());dept.setCompanyName(super.getLoginCompanyName());Dept parent = new Dept();parent.setDeptId(parentId);dept.setParent(parent);//保存到数据库deptService.saveDept(dept);return "redirect:/system/dept/toList";}

页面dept-add.jsp以表单的形式提交

<form id="editForm" action="${path}/system/dept/add" method="post">


3. 通过id删除部门【ajax***】

删除部门业务分析:
通过id删除指定部门,删除时需要判断当前部门是不是其他部门的上级部门,如果是,删除失败,否则删除成功。(因为部门之间有一个上级部门,就相当于一颗树的结构,如果树有子节点,删除该树就会导致那些子节点就没有父节点,也就是没有上级部门了)

  1. export_system_service子工程test下编写测试删除部门方法

TestDeptService

        //测试查询以当前部门id为直接上级部门的部门数量(不能直接删除的判断)@Testpublic void test05(){//测试删除id=100的部门,该部门有给其他部门作上级部门(应该删除失败)String deptId="100";//根据id删除(service会判断该部门是否有下级部门)int count=deptService.findParentCount(deptId);l.info("test05 查询到deptid="+deptId+"作为直接上级的部门有 " + count + "个");}//通过id删除部门@Testpublic void test06(){//测试删除id=100的部门,该部门有给其他部门作上级部门(应该删除失败)String deptId="100";//根据id删除(service会判断该部门是否有下级部门)boolean result=deptService.deleteDeptById(deptId);l.info("test06 删除结果result="+result);}
  1. export_system_service子工程创建service接口和实现类

IDeptService

   //查找以当前部门作为直接上级部门的部门数量int findParentCount(String deptId);//根据指定的deptId删除部门数据// 当前部门是不是其他部门的上级上级部门(两种情况)//1. 删除部门不是其他部门的上级部门,可以直接删除  2. 删除部门是其他部门的上级部门删除报错boolean deleteDeptById(String deptId);

DeptServiceServiceImpl

    @Overridepublic int findParentCount(String deptId) {int count = deptDao.findParentCount(deptId);return  count;}@Overridepublic boolean deleteDeptById(String deptId) {//先查询该部门的直接下级部门的数量(也就是将该部门作为上级部门的部门数)int count = deptDao.findParentCount(deptId);//根据返回值count判断是否有下级部门if(count==0){//没有给其他部门作上级,执行删除deptDao.deleteById(deptId);return true;    //删除成功}else{return false;   //是其他部门的上级部门,删除失败}}
  1. export_dao子工程dao接口及其映射

IDeptDao

    //统计当前部门作为其他部门的上级的数量,也就是当前部门的直接下级部门的数量(直接下级)//如果当前部门,没有直接下级部门,那么删除就能成功,否则删除失败(不能删除有下级部门的部门)int findParentCount(String deptId);//通过id删除部门void deleteById(String deptId);

IDeptDao.xml

 <!-- 统计当前部门作为其他部门的上级的数量,也就是当前部门的下级部门的数量(直接下级) --><select id="findParentCount" parameterType="string" resultType="int">select count(*) from pe_dept where parent_id=#{deptId}</select><!-- 通过id删除部门 --><delete id="deleteById" parameterType="string">delete from pe_dept where dept_id=#{deptId}</delete>
  1. 测试删除部门(有下级部门删除失败,无下级部门删除成功)
    查询当前部门作为上级部门的部门数
    在这里插入图片描述
    有下级部门的删除失败
    在这里插入图片描述
    没有下级部门的删除成功
    在这里插入图片描述

  2. export_web_manager子工程编写controller

DeptController

// 删除部门(ajax异步提交),如果没有下级部门就删除成功,否则删除失败,location.href="${path}/system/dept/delete?depId="+deptId;@RequestMapping(path = "/delete", method = {RequestMethod.GET,RequestMethod.POST})@ResponseBody   //加上@ResponseBody返回的才是字符串,不然就是返回的页面了public Object delete(String deptId) {l.info("delete deptId=" + deptId);boolean deleteResult = deptService.deleteDeptById(deptId);//ajax异步if(deleteResult == true){//删除成功return Msg.init(200,"部门编号deptId = " + deptId + "的部门删除成功。",null);}else {return Msg.init(-200,"deptId = " + deptId +"的部门存在下级部门,删除失败,请删除该部门的下级部门后再删除",null);}}

dept-list.jsp

<script>function deleteById() {//获取删除的部门idvar deptId = getCheckId()//选择了就有id,就执行if(deptId) {if(confirm("你确认要删除此条记录吗?")) {//location.href="${path}/system/dept/delete?deptId="+deptId;$.ajax({type: "POST",datatype : 'text',url: "${path}/system/dept/delete?deptId="+deptId,cache: false,success: function(msg){if(msg.code == 200){alert("msg = " + msg.message);window.location.href = "${path}/system/dept/toList";    //删除成功刷新部门列表}else {alert("msg = " + msg.message);}}});}}else{alert("请勾选待处理的记录,且每次只能勾选一个")}}
</script>

这篇关于【SaaS - Export项目】08部门Dept的查询、分页、增加、删除(ajax)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218875

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Python按条件批量删除TXT文件行工具

《Python按条件批量删除TXT文件行工具》这篇文章主要为大家详细介绍了Python如何实现按条件批量删除TXT文件中行的工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.简介2.运行效果3.相关源码1.简介一个由python编写android的可根据TXT文件按条件批

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可