# 酒店管理系统开发文档 ## 一、技术栈 ### 1.数据库:mysql5.7 ### 2.jdk1.8 ### 3.maven+gitee管理项目 ### 4.后台模板layuimini+ssm框架 ## 二、数据库设计 ### 1.部门表 ![image-20220416135554136](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220416135554136.png) ### 2.员工表 ![image-20220416135538343](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220416135538343.png) ## 三、环境搭建 ### 1.配置spring ### 2.配置springMvc ### 3.配置mybatis ### 4.配置数据源 ## 四、项目开发 ### 1.相关资料导入 ​ 导入layuimini相关代码,我们把所有关于后台数据都放入到WEB-INF文件夹下面 但是我们直接访问是访问不了的 所有我们在控制层写一个方法进入到该文件夹 ​ 因为是后台 所以我们文件都放入到admin文件夹下面 ```java //专门用来控制 负责跳转后台页面的 @Controller @RequestMapping("/admin") public class SystemController { //去到登录页面 @RequestMapping("/login.html") public String login(){ return "login"; } } ``` ### 2.实现用户登录功能 #### (1)编写实体类 ```java private Integer id; private String username; private String password; private String name; private String sex; private Integer deptId; private Date hireDate;//入职时间 private String salt;//密码加密值 private Date createDate; private Integer createBy; private Integer modifyBy;//修改人 private Date modifyDate; private String remark;//备注 ``` #### (2)编写mapper相关接口 ```java public Employee findNameLogin(String username);//按用户名查询 ``` #### (3)编写mapper接口mysql语句 ```xml ``` #### (4)编写service接口方法 ```java //用户登录 public Employee userLogin(String username,String password); ``` #### (5)实现service接口方法 ```java @Service public class EmployeeServiceImpl implements EmployeeService { @Autowired private EmployeeMapper employeeMapper; @Override //用户登录 public Employee userLogin(String username,String password) { Employee employee = employeeMapper.findNameLogin(username); if(employee!=null){ //与用户输入密码进行比较 if(employee.getPassword().equals(password)){//登录成功 return employee; } } return null; } } ``` #### (6)编写controller实现 ```java @Controller @RequestMapping("/employee") public class EmployeeController { @Autowired private EmployeeService employeeService; @RequestMapping("/login") @ResponseBody public String login(String username, String password,String code, HttpSession session){ System.out.println(username); System.out.println(password); Map map = new HashMap<>(); Employee employee = employeeService.userLogin(username,password); if(employee!=null){ //保存用户登录信息 session.setAttribute("user",employee); map.put("success",true); } else if(employee==null){ map.put("success",false); map.put("msg","用户名或者密码错误"); } else if(!code.equals("xSzG")){ map.put("msg","验证码错误"); } return JSON.toJSONString(map); } } ``` #### (7)修改login.jsp页面相关代码 ```jsp
``` #### (8)浏览器乱码问题解决 ​ 当我们把java对象转换为json格式返回到浏览器上时 可能会错写乱码问题 所以我们此时去springMVC中进行配置: ​ 第一步:把java对象转换为JSON格式 我们要导入相应的坐标 ```xml com.alibaba fastjson 1.2.73 ``` ​ 第二步:在配置 ```xml text/plain;charset=UTF-8 text/html;charset=UTF-8 application/json;charset=UTF-8 application/x-www-form-urlencoded;charset=UTF-8 application/json;charset=UTF-8 application/x-www-form-urlencoded;charset=UTF-8 ``` ### 3.实现注册功能 #### (1)编写mapper相关接口 ```java //保存用户信息 public int saveUser(Employee employee); ``` #### (2)表现实现mapper接口Mysql语句 ```xml insert into employee_table(id,username,password,name,sex,deptId,hireDate) values (#{id},#{username},#{password},#{name},#{sex},#{deptId},#{hireDate}) ``` #### (3)编写service接口方法 ```java //保存用户 public int saveUser(Employee employee); ``` #### (4)实现service接口方法 ```java public int saveUser(Employee employee) { return employeeMapper.saveUser(employee); } ``` #### (5)编写controller实现 ```java @RequestMapping("/register") @ResponseBody public String register( String username, String password, String names, String sex,Integer depId){ Map map = new HashMap<>(); Employee employees = new Employee(); employees.setId(null); employees.setUsername(username); employees.setPassword(password); employees.setName(names); employees.setSex(sex); employees.setDeptId(depId); employees.setHireDate(new Date()); Employee employee = employeeService.userLogin(username,password); int n = employeeService.saveUser(employees); if(employee!=null){ //保存用户登录信息 //用户名已经存在 map.put("success", false); map.put("msg", "用户名已经存在"); } else{ if(n>0){ map.put("success", true); map.put("msg","注册成功"); } } return JSON.toJSONString(map); } ``` #### (6)修改registe.jsp页面相关代码 ```jsp
``` ### 4.实现首页功能 #### (1)修改首页的相关内容 ​ 导入layuimini的index.html页面进行修改 #### (2)退出登录 ​ 在控制层编写访问退出登录访问路径 ```java //退出登录 @RequestMapping("/logout.html") public String logout(HttpSession session){ //清空session session.removeAttribute("user"); return "redirect:/admin/login.html"; } ``` ```jsp
``` ```js $('.login-out').on("click", function () { layer.confirm('确定要退出吗?', {icon: 3, title:'提示'}, function(index){ location.href="${pageContext.request.contextPath}/admin/logout.html" layer.close(index); }); }); ``` #### (3)使用拦截器 拦截除登录页面之外的其他页面 ​ 拦截器拦截是放在WEB-INF下面页面 ​ 为了安全 我们只有登录成功之后 才能访问其他页面 所以 我们使用拦截器 ​ 第一步:编写拦截器方法: ```java public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判断session是否为空 if((request.getSession().getAttribute("user")==null)){ //如果没有登录,则去到登录页面 response.sendRedirect(request.getContextPath()+"/admin/login.html"); return false;//验证失败,进行拦截 } //验证通过 return true; } } ``` ​ 第二步:去springMvc中进行拦截器配置: ```xml ``` #### (4)过滤器使用 如果我们要拦截在webapp下面页面 我们使用过滤器 如果没有登录 是不可以访问后台页面的 所以第一步我们新建一个过滤器类: ```java //自定义过滤器 public class LoginFilter implements Filter { //初始化方法 @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化处理 System.out.println("过滤器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request= (HttpServletRequest) servletRequest; HttpServletResponse response= (HttpServletResponse) servletResponse; HttpSession session=request.getSession(); if(session.getAttribute("user")==null){ //非法请求,直接跳转到登陆界面 //如果没有登录,则去到登录页面 response.sendRedirect(request.getContextPath()+"/admin/login.html"); }else{ //正常登录,放行 filterChain.doFilter(request,response); } } @Override public void destroy() { //释放资源 System.out.println("过滤器销毁"); } } ``` 第二步去web.xml中进行过滤器配置: ```xml LoginFilter comxyp.filter.LoginFilter LoginFilter /jsp/* ``` ### 5.菜单设计 #### (1)菜单表设计 参照layuimini开发手册 ```sql CREATE TABLE `system_menu` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `pid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '父ID', `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称', `icon` varchar(100) NOT NULL DEFAULT '' COMMENT '菜单图标', `href` varchar(100) NOT NULL DEFAULT '' COMMENT '链接', `target` varchar(20) NOT NULL DEFAULT '_self' COMMENT '链接打开方式', `sort` int(11) DEFAULT '0' COMMENT '菜单排序', `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)', `remark` varchar(255) DEFAULT NULL COMMENT '备注信息', `create_at` timestamp NULL DEFAULT NULL COMMENT '创建时间', `update_at` timestamp NULL DEFAULT NULL COMMENT '更新时间', `delete_at` timestamp NULL DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`), KEY `title` (`title`), KEY `href` (`href`) ) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='系统菜单表'; ``` #### (2)参照java示列 java动态生成初始化数据(spring框架) ​ 设计数据库: ![image-20220416135502349](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220416135502349.png) #### (3)编写菜单实体类 ```java private Integer id; private Integer pid; private String title; private String href; private Integer spread; private String target; private String icon; ``` #### (4)编写mapper接口 ```java List findAll();//查询所有菜单列表 ``` #### (5)编写mapper.xml对应相关mysql语句 ```java ``` #### (6)编写service层接口 ```java List findAll();//查询所有菜单列表 ``` #### (7)实现service层接口 ```java @Service public class MenuServiceImpl implements MenuService { @Autowired private MenuMapper mapper; @Override public List findAll() { return mapper.findAll(); } ``` #### (8)编写controller功能 ​ 分析:原来我们使用加载菜单信息是api中init.json中数据 现在我们用数据库显示构建出来; ```json { "homeInfo": { "title": "首页", "href": "${pageContext.request.contextPath}/static/layui/page/welcome-1.html?t=1" }, "logoInfo": { "title": "LAYUI MINI", "image": "${pageContext.request.contextPath}/static/layui/images/logo.png", "href": "" }, "menuInfo": [ { "title": "常规管理", "icon": "fa fa-address-book", "href": "", "target": "_self", "child": [ { "title": "主页模板", "href": "", "icon": "fa fa-home", "target": "_self", "child": [ { "title": "主页一", "href": "page/welcome-1.html", "icon": "fa fa-tachometer", "target": "_self" }, { "title": "主页二", "href": "page/welcome-2.html", "icon": "fa fa-tachometer", "target": "_self" }, { "title": "主页三", "href": "page/welcome-3.html", "icon": "fa fa-tachometer", "target": "_self" } ] }, { "title": "菜单管理", "href": "page/menu.html", "icon": "fa fa-window-maximize", "target": "_self" }, { "title": "系统设置", "href": "page/setting.html", "icon": "fa fa-gears", "target": "_self" }, { "title": "表格示例", "href": "page/table.html", "icon": "fa fa-file-text", "target": "_self" }, { "title": "表单示例", "href": "", "icon": "fa fa-calendar", "target": "_self", "child": [ { "title": "普通表单", "href": "page/form.html", "icon": "fa fa-list-alt", "target": "_self" }, { "title": "分步表单", "href": "page/form-step.html", "icon": "fa fa-navicon", "target": "_self" } ] }, { "title": "登录模板", "href": "", "icon": "fa fa-flag-o", "target": "_self", "child": [ { "title": "登录-1", "href": "page/login-1.html", "icon": "fa fa-stumbleupon-circle", "target": "_blank" }, { "title": "登录-2", "href": "page/login-2.html", "icon": "fa fa-viacoin", "target": "_blank" }, { "title": "登录-3", "href": "page/login-3.html", "icon": "fa fa-tags", "target": "_blank" } ] }, { "title": "异常页面", "href": "", "icon": "fa fa-home", "target": "_self", "child": [ { "title": "404页面", "href": "page/404.html", "icon": "fa fa-hourglass-end", "target": "_self" } ] }, { "title": "其它界面", "href": "", "icon": "fa fa-snowflake-o", "target": "", "child": [ { "title": "按钮示例", "href": "page/button.html", "icon": "fa fa-snowflake-o", "target": "_self" }, { "title": "弹出层", "href": "page/layer.html", "icon": "fa fa-shield", "target": "_self" } ] } ] }, { "title": "组件管理", "icon": "fa fa-lemon-o", "href": "", "target": "_self", "child": [ { "title": "图标列表", "href": "page/icon.html", "icon": "fa fa-dot-circle-o", "target": "_self" }, { "title": "图标选择", "href": "page/icon-picker.html", "icon": "fa fa-adn", "target": "_self" }, { "title": "颜色选择", "href": "page/color-select.html", "icon": "fa fa-dashboard", "target": "_self" }, { "title": "下拉选择", "href": "page/table-select.html", "icon": "fa fa-angle-double-down", "target": "_self" }, { "title": "文件上传", "href": "page/upload.html", "icon": "fa fa-arrow-up", "target": "_self" }, { "title": "富文本编辑器", "href": "page/editor.html", "icon": "fa fa-edit", "target": "_self" }, { "title": "省市县区选择器", "href": "page/area.html", "icon": "fa fa-rocket", "target": "_self" } ] }, { "title": "其它管理", "icon": "fa fa-slideshare", "href": "", "target": "_self", "child": [ { "title": "多级菜单", "href": "", "icon": "fa fa-meetup", "target": "", "child": [ { "title": "按钮1", "href": "page/button.html?v=1", "icon": "fa fa-calendar", "target": "_self", "child": [ { "title": "按钮2", "href": "page/button.html?v=2", "icon": "fa fa-snowflake-o", "target": "_self", "child": [ { "title": "按钮3", "href": "page/button.html?v=3", "icon": "fa fa-snowflake-o", "target": "_self" }, { "title": "表单4", "href": "page/form.html?v=1", "icon": "fa fa-calendar", "target": "_self" } ] } ] } ] }, { "title": "失效菜单", "href": "page/error.html", "icon": "fa fa-superpowers", "target": "_self" } ] } ] } ``` 第一步:我们需要编写一个菜单节点的工具类 里面放置的是子菜单的信息: ```java private Integer id;//菜单编号 private Integer pid;//父级菜单编号 private String title;//菜单名称 private String href;//链接地址 private Integer spread;//是否展开 private String target;//打开方式 private String icon;//图标 private List child;//子菜单集合列表 ``` 第二步 编写controller层 ```java @Controller @RequestMapping("/admin/menu") public class MenuController { @Autowired private MenuService menuService; //加载首页左侧菜单栏 对应着api接口中init.json中的格式 @RequestMapping("/loadMenuList") @ResponseBody public String loadMenuList(){ //创建map集合保存菜单信息 Map map = new LinkedHashMap<>(); //创建map集合保存 homeInfo信息 Map homeInfo = new LinkedHashMap<>(); //创建map集合保存 logoInfo信息 Map logoInfo = new LinkedHashMap<>(); //查询所有菜单 List list = menuService.findAll(); //创建集合保存菜单关系 List menuNodeList = new ArrayList<>(); //循环遍历菜单列表 目的是创建菜单之间的层级关系 for(Menu m:list){ //创建菜单节点对象 MenuNode menuNode = new MenuNode(); menuNode.setHref(m.getHref());//链接地址 menuNode.setIcon(m.getIcon());//菜单图标 menuNode.setId(m.getId());//菜单编号 menuNode.setPid(m.getPid());//父级编号 menuNode.setSpread(m.getSpread());//是否展开 menuNode.setTitle(m.getTitle());//菜单标题 menuNode.setTarget(m.getTarget());//打开方式 //将对象添加到集合中 menuNodeList.add(menuNode); } //保存homeInfo中信息 homeInfo.put("title","首页"); homeInfo.put("href","/admin/home.jsp"); //保存logoInfo 中信息 logoInfo.put("title","酒店管理系统");//系统标题 logoInfo.put("image","/static/layui/images/logo.png");//logo图标 logoInfo.put("href","/admin/home.html");//首页地址 //将菜单信息添加到MenuInfo集合中 map.put("menuInfo", TreeUtil.toTree(menuNodeList,0)); map.put("homeInfo",homeInfo); map.put("logoInfo",logoInfo); //将信息以json格式返回 return JSON.toJSONString(map); } } ``` 构建父级菜单与子菜单之间关系 我们使用layuimini给我们提供的一个工具类: ```java //构建菜单层级关系 public class TreeUtil { /** * 构建菜单层级关系 * @param treeList 菜单列表 * @param pid 父级菜单编号,0表示父级菜单 (一级菜单) * @return */ public static List toTree(List treeList, Integer pid) { List retList = new ArrayList(); for (MenuNode parent : treeList) { //如果当前父级菜单编号与循环的菜单列表中的父级菜单编号一致 if (pid == parent.getPid()) { retList.add(findChildren(parent, treeList)); } } return retList; } private static MenuNode findChildren(MenuNode parent, List treeList) { for (MenuNode child : treeList) { if (parent.getId() == child.getPid()) { if (parent.getChild() == null) { parent.setChild(new ArrayList()); } parent.getChild().add(findChildren(child, treeList)); } } return parent; } } ``` #### (9)去首页修改端口默认地址 ```js iniUrl: "${pageContext.request.contextPath}/admin/menu/loadMenuList", // 初始化接口 ``` ### 6.实现部门管理功能 #### (1)设计数据库 ![image-20220416140303824](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220416140303824.png) #### (2)修改部门管理页面 ​ 我们使用layuimini中table.html页面 #### (3)去controller中写好访问管理页面地址 ```java //进入部门管理页面 @RequestMapping("/ToDeptManage") public String ToDeptManage(){ return "dept/deptManage"; } ``` #### (4)编写部门管理实体类 ```java private Integer id; private String deptName; private String address; private Date createtime; private String remark; ``` 因为我们要实现分页显示 所以我们单独写一个分页类 对哪一个分页 就继承谁: ```java //实现分页 public class Vo extends Dept{ private Integer page;//当前页码 private Integer limit;//每页显示数量 ``` ##### 4.1导入分页插件坐标 ```xml com.github.pagehelper pagehelper 5.0.0 ``` ##### 4.2去mybatis中进行配置 ```xml ``` #### (5)编写mapper接口 ```java //部门相关接口 public interface DeptMapper { List findAll(Vo vo); } ``` #### (6)实现mapper接口方法mysql语句 ```java ``` #### (7)编写service层接口 ```java public interface DeptService { List findAll(Vo vo); } ``` #### (8)实现接口 ```java @Service public class DeptServiceImpl implements DeptService { @Autowired private DeptMapper deptMapper; @Override public List findAll(Vo vo) { return deptMapper.findAll(vo); } } ``` #### (9)编写controller层功能 ##### 9.1因为我们使用的是layuimini 所以它要求我们返回数据有要求 提供了一个工具类: ```java package comxyp.utils; /** * layui 数据表格类 */ public class DataGridViewResult { private Integer code=0;//执行状态码 private String msg="";//提示信息 private Long count=0L;//数量 private Object data;//数据 public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Long getCount() { return count; } public void setCount(Long count) { this.count = count; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } /** * 创建数据表格对象 * @param count 数据总数量 * @param data 数据集合列表 */ public DataGridViewResult(Long count, Object data) { super(); this.count = count; this.data = data; } public DataGridViewResult(Object data) { super(); this.data = data; } public DataGridViewResult() { } } ``` ##### 9.2编写controller ```java //部门管理查询显示 @Controller @RequestMapping("/dept") public class DeptController { @Autowired private DeptService deptService; @RequestMapping("/deptList") public DataGridViewResult deptList(Vo vo){ //设置分页信息 PageHelper.startPage(vo.getPage(),vo.getLimit()); //调用分页查询的方法 List list = deptService.findAll(vo); //创建分页对象 PageInfo pageInfo = new PageInfo<>(list); //返回数据 return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList()); } } ``` ### 7.部门添加 #### (1)修改部门列表页面中添加事件 ​ 修改相关代码 ```js //监听头部工具栏事件 //toolbar是头部工具栏事件 //currentTableFilter是表格lay-filter过滤器的值 table.on("toolbar(currentTableFilter)",function (obj) { switch (obj.event) { case "add"://添加按钮 openAddWindow();//打开添加窗口 break; } }); var url;//提交地址 var mainIndex;//打开窗口的索引 /** * 打开添加窗口 */ function openAddWindow() { mainIndex = layer.open({ type: 1,//打开类型 title: "添加部门",//窗口标题 area: ["800px", "400px"],//窗口宽高 content: $("#addOrUpdateWindow"),//引用的内容窗口 success: function () { //清空表单数据 $("#dataFrm")[0].reset(); //添加的提交请求 url = "${pageContext.request.contextPath}/dept/addDept"; } }); } //监听表单提交事件 form.on("submit(doSubmit)",function (data) { $.post(url,data.field,function(result){ if(result.success){ //刷新数据表格 tableList.reload(); //关闭窗口 layer.close(mainIndex); } //提示信息 layer.msg(result.msg); },"json"); //禁止页面刷新 return false; }); }); ``` #### (2)编写mapper接口 ```java //添加部门 int addDept(Dept dept); ``` #### (3)编写mapper.xml中mysql语句 ```java insert into dept_table(deptname,address,remark) values (#{deptname},#{address},#{remark}) ``` #### (3)编写service接口 ```java //添加部门 int addDept(Dept dept); ``` #### (4)实现接口 ```java public int addDept(Dept dept) { return deptMapper.addDept(dept); } ``` #### (5)编写controller功能 ```java @RequestMapping("/addDept") @ResponseBody public String addDept(Dept dept){ Map map = new HashMap<>(); int n= deptService.addDept(dept); if(n>0){ map.put("success",true); map.put("msg","添加成功"); } else{ map.put("success", false); map.put("msg", "添加失败"); } return JSON.toJSONString(map); } ``` ### 8.部门修改 #### (1)修改页面 ##### 8.1添加隐藏域 为某一条修改 ```jsp <%-- 隐藏域 --%> ``` ##### 8.2监听行事件 获取某一行的数据 ```js //监听行工具栏事件 table.on("tool(currentTableFilter)",function (obj) { console.log(obj); switch (obj.event) { case "edit"://编辑按钮 openUpdateWindow(obj.data);//打开修改窗口 break; case "delete"://删除按钮 deleteById(obj.data); break; } }); ``` ##### 8.3打开修改窗口 ```js /** * 打开修改窗口 * @param data 当前行的数据 */ function openUpdateWindow(data) { mainIndex = layer.open({ type: 1,//打开类型 title: "修改部门",//窗口标题 area: ["800px", "400px"],//窗口宽高 content: $("#addOrUpdateWindow"),//引用的内容窗口 success: function () { //表单数据回显 form.val("dataFrm",data);//参数1:lay-filter值 参数2:回显的数据 //修改的提交请求 url = "${pageContext.request.contextPath}/dept/updateDept"; } }); } ``` #### (2)编写mapper接口 ```java //部门修改 int updateDept(Dept dept); ``` #### (3)编写mapper.xml中mysql语句 ```xml update dept_table deptename = #{deptname}, address = #{address}, remark = #{remark} where id=#{id} ``` #### (3)编写service接口 ```java //部门修改 int updateDept(Dept dept); ``` #### (4)实现接口 ```java public int updateDept(Dept dept) { return deptMapper.updateDept(dept); } ``` #### (5)编写controller功能 ```java @RequestMapping("/updateDept") @ResponseBody public String updateDept(Dept dept){ Map map = new HashMap<>(); int n= deptService.updateDept(dept); if(n>0){ map.put("success",true); map.put("msg","添加成功"); } else{ map.put("success", false); map.put("msg", "添加失败"); } return JSON.toJSONString(map); } ``` ### 9.部门删除 在删除之前 我们要判断该部门下是否有员工 所以先进行判断检查 ##### 9.1编写员工mapper接口 按员工编号查询 ```java /** * 根据部门编号查询员工数量 * @param deptId * @return */ int getEmployeeCountByDeptId(Integer deptId); ``` ##### 9.2 编写相关mysql语句和service接口 ```java ``` ```java public int getEmployeeCountByDeptId(Integer deptId) { return employeeMapper.getEmployeeCountByDeptId(deptId); } } ``` ##### 9.3编写controller层功能 ```java @RequestMapping("/checkDeptHasEmployee") @ResponseBody public String checkDeptHasEmployee(Integer id){ Map map = new HashMap(); //调用根据部门编号查询员工数量的方法 if(employeeService.getEmployeeCountByDeptId(id)>0){ map.put("exist",true);//存在 map.put("msg","该部门存在员工信息,无法删除"); }else{ map.put("exist",false);//不存在 } return JSON.toJSONString(map); } ``` #### (1)修改页面 ```js /** * 删除部门 * @param data 当前行数据 */ function deleteById(data) { //判断当前部门下是否存在员工 $.get("${pageContext.request.contextPath}/dept/checkDeptHasEmployee",{"id":data.id},function(result){ if(result.exist){ //提示用户无法删除 layer.msg(result.msg); }else{ //提示用户是否删除该部门 layer.confirm("确定要删吗", {icon: 3, title:'提示'}, function(index){ //发送ajax请求进行删除 $.post("${pageContext.request.contextPath}/dept/deleteById",{"id":data.id},function(result){ if(result.success){ //刷新数据表格 tableIns.reload(); } //提示 layer.msg(result.msg); },"json"); layer.close(index); }); } },"json"); } ``` #### (2)编写mapper接口 ```java //删除 int deleteById(Integer id); ``` #### (3)编写mapper.xml中mysql语句 ```xml delete from dept_table where id=#{id} ``` #### (3)编写service接口 ```java //删除 int deleteById(Integer id); ``` #### (4)实现接口 ```java public int deleteById(Integer id) { return deptMapper.deleteById(id); } ``` #### (5)编写controller功能 ```java /** * 删除部门 * @param id * @return */ @RequestMapping("/deleteById") @ResponseBody public String deleteById(Integer id){ Map map = new HashMap(); //调用删除部门的方法 if(deptService.deleteById(id)>0){ map.put("success",true);//成功 map.put("msg","删除成功"); }else{ map.put("success",false);//失败 map.put("msg","删除失败"); } return JSON.toJSONString(map); } ```