第三阶段实战(五)——部门管理功能设计与实现

部门管理pojo

package com.cy.pj.sys.pojo;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;
/**
 * 部门PO对象
 */
@Data
public class SysDept implements Serializable{
	private static final long serialVersionUID = 8876920804134951849L;
	private Integer id;
	private String name;
	private Integer parentId;
	private Integer sort;
	private String note;
	private Date createdTime;
	private Date modifiedTime;
	private String createdUser;
	private String modifiedUser;
}

部门管理Dao接口

package com.cy.pj.sys.dao;

import com.cy.pj.common.pojo.Node;
import com.cy.pj.sys.pojo.SysDept;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

@Mapper
public interface SysDeptDao {
      /**
               * 查询所有部门以及部门的上级菜单信息
       * @return
       */
	  @Select("select c.*,p.name parentName from sys_depts c left join sys_depts p on c.parentId=p.id")
	  List<Map<String,Object>> findObjects();
	  
	  @Select("select id,name,parentId from sys_depts")
	  List<Node> findZTreeNodes();
	  
	  int updateObject(SysDept entity);
	  int insertObject(SysDept entity);
	  
	  @Select("select count(*) from sys_depts where parentId=#{id}")
	  int getChildCount(Integer id);
	  
	  @Delete("delete from sys_depts where id=#{id}")
	  int deleteObject(Integer id);

	  int findById(@Param("id") Integer id);
}

部门管理Mapper.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">
<mapper namespace="com.cy.pj.sys.dao.SysDeptDao">
 <!-- 基于部门id查询部门信息 -->
   <select id="findById"
           resultType="int">
          select *
          from sys_depts
          where id=#{id}        
   </select>
   
   <update id="updateObject" 
       parameterType="com.cy.pj.sys.pojo.SysDept">
         update sys_depts
         set
           name=#{name},
           sort=#{sort},
           note=#{note},
           parentId=#{parentId},
           modifiedUser=#{modifiedUser},
           modifiedTime=now()
        where id=#{id}
    </update>
    
    <insert id="insertObject" 
            parameterType="com.cy.pj.sys.pojo.SysDept">
         insert into sys_depts
         (name,sort,note,parentId,createdTime,modifiedTime,createdUser,modifiedUser)
         values
         (#{name},#{sort},#{note},#{parentId},now(),now(),#{createdUser},#{modifiedUser})
    </insert>
   
</mapper>

部门管理Service接口

package com.cy.pj.sys.service;

import com.cy.pj.common.pojo.Node;
import com.cy.pj.sys.pojo.SysDept;

import java.util.List;
import java.util.Map;


public interface SysDeptService {
	 List<Map<String,Object>> findObjects();
	 List<Node> findZTreeNodes();
	 int saveObject(SysDept entity);
	 int updateObject(SysDept entity);
	 int deleteObject(Integer id);
}

部门管理Service实现类

package com.cy.pj.sys.service.impl;

import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.common.pojo.Node;
import com.cy.pj.sys.dao.SysDeptDao;
import com.cy.pj.sys.pojo.SysDept;
import com.cy.pj.sys.service.SysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;

@Service
public class SysDeptServiceImpl implements SysDeptService {
	@Autowired
	private SysDeptDao sysDeptDao;
	@Override
	public List<Map<String, Object>> findObjects() {
		List<Map<String, Object>> list=
		sysDeptDao.findObjects();
		if(list==null||list.size()==0)
		throw new ServiceException("没有部门信息");
		return list;
	}
	@Override
	public List<Node> findZTreeNodes() {
		List<Node> list=
		sysDeptDao.findZTreeNodes();
		if(list==null||list.size()==0)
		throw new ServiceException("没有部门信息");
		return list;
	}
	@Override
	public int updateObject(SysDept entity) {
		//1.合法验证
		if(entity==null)
		throw new ServiceException("保存对象不能为空");
		if(StringUtils.isEmpty(entity.getName()))
		throw new ServiceException("部门不能为空");
		int rows;
		//2.更新数据
		try{
		rows=sysDeptDao.updateObject(entity);
		}catch(Exception e){
		e.printStackTrace();
		throw new ServiceException("更新失败");
		}
		//3.返回数据
		return rows;
	}
	
	@Override
	public int saveObject(SysDept entity) {
		//1.合法验证
		if(entity==null)
		throw new ServiceException("保存对象不能为空");
		if(StringUtils.isEmpty(entity.getName()))
		throw new ServiceException("部门不能为空");
		//2.保存数据
		int rows=sysDeptDao.insertObject(entity);
		//if(rows==1)
		//throw new ServiceException("save error");
		//3.返回数据
		return rows;
	}
	@Override
	public int deleteObject(Integer id) {
		//1.合法性验证
		if(id==null||id<=0)
		throw new ServiceException("数据不合法,id="+id);
		//2.执行删除操作
		//2.1判定此id对应的菜单是否有子元素
		int childCount=sysDeptDao.getChildCount(id);
		if(childCount>0)
		throw new ServiceException("此元素有子元素,不允许删除");
		//2.2判定此部门是否有用户
		//int userCount=sysUserDao.getUserCountByDeptId(id);
		//if(userCount>0)
		//throw new ServiceException("此部门有员工,不允许对部门进行删除");
		//2.2判定此部门是否已经被用户使用,假如有则拒绝删除
		//2.3执行删除操作
		int rows=sysDeptDao.deleteObject(id);
		if(rows==0)
		throw new ServiceException("此信息可能已经不存在");
		return rows;
	}
}

部门管理Controller控制层

package com.cy.pj.sys.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.cy.pj.common.pojo.JsonResult;
import com.cy.pj.sys.pojo.SysDept;
import com.cy.pj.sys.service.SysDeptService;

@RestController
@RequestMapping("/dept/")
public class SysDeptController {
	@Autowired
	private SysDeptService sysDeptService;
	@RequestMapping("doFindObjects")
	public JsonResult doFindObjects() {
		return new JsonResult(sysDeptService.findObjects());
	}
	@RequestMapping("doFindZTreeNodes")
	public JsonResult doFindZTreeNodes() {
		return new JsonResult(sysDeptService.findZTreeNodes());
	}
	
	@RequestMapping("doUpdateObject")
	public JsonResult doUpdateObject(SysDept entity){
		sysDeptService.updateObject(entity);
	    return new JsonResult("update ok");
	}
	
	@RequestMapping("doSaveObject")
	public JsonResult doSaveObject(SysDept entity){
		sysDeptService.saveObject(entity);
		return new JsonResult("save ok");
	}
	@RequestMapping("doDeleteObject")
	@ResponseBody
	public JsonResult doDeleteObject(Integer id){
		sysDeptService.deleteObject(id);
		return new JsonResult("delete ok");
	}
}

部门管理页面html

列表页面

<div class="row">
	<div class="col-xs-12">
		<div class="box">
			<div class="box-header">
				<h3 class="box-title">部门管理</h3>

				<div class="box-tools">
					<div class="input-group input-group-sm" style="width: 100px;">
						<div class="input-group-btn">
						
							<button type="button" 
							class="btn btn-default btn-delete">删除</button>
							<button type="button" class="btn btn-default btn-add">添加</button>
							<button type="button" class="btn btn-default btn-update">修改</button>
						</div>
					</div>
				</div>
			</div>
			<!-- /.box-header -->
		<div class="box-body table-responsive no-padding">
          <table id="gridTreeTable" class="table table-hover">
        	<thead>
	        <tr>
		      <th data-field="selectItem" data-checkbox="true"></th>
	        </tr>
	     </thead>
         </table>
        </div>
		</div>
		<!-- /.box -->
	</div>
</div>
<script type="text/javascript" src="bower_components/treegrid/jquery.treegrid.extension.js"></script>
<script type="text/javascript" src="bower_components/treegrid/jquery.treegrid.min.js"></script>
<script type="text/javascript" src="bower_components/treegrid/tree.table.js"></script>
<script type="text/javascript">
/**
 * 初始化表格的列
 */
var columns = [
{
	field : 'selectItem',
	radio : true
},
{
	title : 'ID',
	field : 'id',
	visible : false,
	align : 'center',
	valign : 'middle',
	width : '80px'
},
{
	title : '名称',
	field : 'name',
	align : 'center',
	valign : 'middle',
	sortable : true,
	width : '130px'
},
{
	title : '上级机构',
	field : 'parentName',
	align : 'center',
	valign : 'middle',
	sortable : true,
	width : '100px'
},
{
	title : '排序号',
	field : 'sort',
	align : 'center',
	valign : 'middle',
	sortable : true,
	width : '70px'
}
];

$(function(){
	doGetObjects();
	$(".input-group-btn")
	.on("click",".btn-delete",doDeleteObject)
	.on("click",".btn-add,.btn-update",doLoadEditUI);
})
function doLoadEditUI(){
	var title;
	if($(this).hasClass("btn-add")){
		title="添加部门"
	}else if($(this).hasClass("btn-update")){
		title="修改部门"
		//获取选中的记录数据
		var rowData=doGetCheckedItem();
		if(!rowData){
			alert("请选择一个");
			return;
		}
		$("#mainContentId").data("rowData",rowData);
	}
	var url="dept/dept_edit";
	$("#mainContentId").load(url,function(){
		$(".box-title").html(title);
	})
}

function doGetCheckedItem(){
	var tr=
	$("tbody input[type='radio']:checked")
	.parents("tr");
	var rowData=tr.data("rowData");
	console.log(rowData);
	return rowData;
}

function doDeleteObject(){
	//1.url
	var url="dept/doDeleteObject";
	//2.params
	var id=doGetCheckedId();
	if(!id){
		alert("请先选择一条记录");
		return;
	}
	var params={"id":id};
	//3.post
	$.post(url,params,function(result){
		if(result.state==1){
			alert(result.message);
			doGetObjects();
		}else{
			alert(result.message);
		}
	})
}
function doGetCheckedId(){
	//获取选中的记录对象
	var selections=$("#gridTreeTable")
	//这个函数固定写法,记住即可
	//假如要理解这个方法可参考jquery.treegrid.extension.js
	.bootstrapTreeTable("getSelections");
	//判定是否有选中的
	if(selections.length>0){
	 //返回选中记录的id值
	  return selections[0].id;
	}
}
function doGetObjects(){
	//1.构建treeTable对象
	var tableId="gridTreeTable";
	var url="dept/doFindObjects";
	var treeTable=
    new TreeTable(tableId, url, columns)
	//2.初始化treeTable
	treeTable.setExpandColumn(2);//设置可展开的列,默认为1
	treeTable.init();
}
</script>

新增、修改页面

<!-- Horizontal Form -->
 <div class="box box-info">
      <div class="box-header with-border">
        <h3 class="box-title">添加部门</h3>
      </div>
      <!-- /.box-header -->
      <!-- form start -->
      <form class="form-horizontal">
        <div class="box-body">
          <div class="form-group">
            <label for="nameId" class="col-sm-2 control-label">部门名称</label>
            <div class="col-sm-10">
              <input type="text" class="form-control"  id="nameId" placeholder="名称">
            </div>
          </div>
          <div class="form-group">
            <label for="parentId" class="col-sm-2 control-label">上级部门</label>
            <div class="col-sm-10">
              <input type="text" class="form-control load-sys-dept" readonly="readonly" id="parentId" placeholder="上级部门">
            </div>
          </div>
		  <div class="form-group">
				<label for="sortId" class="col-sm-2 control-label">排序号:</label>
				<div class="col-sm-10">
					<input type="text" id="sortId" placeholder="排序号" class="form-control">
				</div>
		 </div>
		   <div class="form-group">
				<label for="noteId" class="col-sm-2 control-label">备注:</label>
				<div class="col-sm-10">
					<input type="text" id="noteId" placeholder="备注" class="form-control">
				</div>
		 </div>
        </div>
        <!-- /.box-body -->
        <div class="box-footer">
          <button type="button" class="btn btn-default btn-cancel">Cancel</button>
          <button type="button" class="btn btn-info pull-right btn-save">Save</button>
        </div>
        <!-- /.box-footer -->
      </form>
      <div class="layui-layer layui-layer-page layui-layer-molv layer-anim" id="treeLayer" type="page" times="2" showtime="0" contype="object"
		style="z-index:59891016; width: 300px; height: 450px; top: 100px; left: 500px; display:none">
		<div class="layui-layer-title" style="cursor: move;">选择部门</div>
		<div class="layui-layer-content" style="height: 358px;">
			<div style="padding: 10px;" class="layui-layer-wrap">
				<ul id="zTreeId" class="ztree"></ul>    <!-- 动态加载树 -->
			</div>
		</div>
		<span class="layui-layer-setwin"> <a class="layui-layer-ico layui-layer-close layui-layer-close1 btn-cancel" ></a></span>
		<div class="layui-layer-btn layui-layer-btn-">
			<a class="layui-layer-btn0 btn-confirm">确定</a>
			<a class="layui-layer-btn1 btn-cancel">取消</a>
	     </div>
   </div>
      
  </div>
  <script type="text/javascript" src="bower_components/ztree/jquery.ztree.all.min.js"></script>
  <script type="text/javascript" src="bower_components/layer/layer.js">
  </script>
 <script type="text/javascript">
  var zTree; 
  //初始化zTree时会用到
  var setting = {
  	data : {
  		simpleData : {
  			enable : true,
  			idKey : "id",  //节点数据中保存唯一标识的属性名称
  			pIdKey : "parentId",  //节点数据中保存其父节点唯一标识的属性名称
  			rootPId : null  //根节点id
  		}//json 格式javascript对象
  	}
  }//json 格式的javascript对象
  
  $(function(){
	  $(".form-horizontal")
	  .on("click",".load-sys-dept",doLoadZtreeNodes)

	  
	  $(".box-footer")
	  .on("click",".btn-cancel",doCancel)
	  .on("click",".btn-save",doSaveOrUpdate);
	  
	  $("#treeLayer")
      .on("click",".btn-confirm",doSetSelectNode)
      .on("click",".btn-cancel",doHideTree)

	  var data=$("#mainContentId").data("rowData");
	  if(data)doInitEditFormData(data);


  });


		function doInitEditFormData(data) {
			$("#nameId").val(data.name);
			$("#sortId").val(data.sort);
			$("#noteId").val(data.note);
			$("#parentId").val(data.parentName);
			$("#parentId").data("parentId", data.parentId);
		}

		function doCancel() {
			$("#mainContentId").load("dept/dept_list", function() {
				$("#mainContentId").removeData();
				$("#parentId").removeData();
			})
		}
		
		function doSaveOrUpdate() {
			//1.获取表单数据
			var params = doGetEditFormData();
			var rowData = $("#mainContentId").data("rowData");
			if (rowData)params.id = rowData.id;
			//2.定义url
			var insertUrl = "dept/doSaveObject";
			var updateUrl = "dept/doUpdateObject";
			var url = rowData ? updateUrl : insertUrl;
			//3.异步提交数据
			$.post(url, params, function(result) {
				if (result.state == 1) {
					alert(result.message);
					doCancel();
				} else {
					alert(result.message);
				}
			});
		}

		function doGetEditFormData() {
			var params = {
				name : $("#nameId").val(),
				sort : $("#sortId").val(),
				note : $("#noteId").val(),
				parentId : $("#parentId").data("parentId")
			}
			return params;
		}

		function doHideTree() {
			$("#treeLayer").css("display", "none");
		}
		//确定按钮
		function doSetSelectNode() {
			//1.获取选中的节点对象
			var nodes = zTree.getSelectedNodes();
			if (nodes.length == 0)
				return;
			var node = nodes[0];
			console.log(node);
			//2.将对象中内容,填充到表单
			$("#parentId").data("parentId", node.id);
			$("#parentId").val(node.name);
			//3.隐藏树对象
			doHideTree();
		}

		function doLoadZtreeNodes() {
			//显示div
			$("#treeLayer").css("display", "block");
			var url = "dept/doFindZTreeNodes";
			//异步加载数据,并初始化数据
			$.getJSON(url, function(result) {
				if (result.state == 1) {
					//使用init函数需要先引入ztree对应的js文件
					zTree = $.fn.zTree
							.init($("#zTreeId"), setting, result.data);
				} else {
					alert(result.message);
				}
			})
		}
	</script>    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值