【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

相关文章

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于