六、模塊實現:權限管理模塊(2)

    1. 權限管理模塊
      1. 權限model

在包“com.example.demo.model”中新建一個“Permission”類(如果自己添加model類時,只須定義好屬性,然後利用eclipse的生成getter和setter功能,直接生成代碼),代碼如下:

package com.example.demo.model;

 

import com.baomidou.mybatisplus.annotations.TableId;

import com.baomidou.mybatisplus.annotations.TableName;

 

@TableName("t_sys_permission")//數據庫對應表名

public class Permission {

    @TableId

    private String id;//@TableId表示主鍵,與字段名稱大小寫一致

   

    private String name;//與字段名稱大小寫一致

    private String descripion;//與字段名稱大小寫一致

    private String url;//與字段名稱大小寫一致

    private String pid;//與字段名稱大小寫一致

    private String perms;//與字段名稱大小寫一致

    private Integer type;//與字段名稱大小寫一致

    private String icon;//與字段名稱大小寫一致

    private Integer order_num;//與字段名稱大小寫一致

    public String getId() {

         return id;

    }

    public void setId(String id) {

         this.id = id;

    }

    public String getName() {

         return name;

    }

    public void setName(String name) {

         this.name = name;

    }

    public String getDescripion() {

         return descripion;

    }

    public void setDescripion(String descripion) {

         this.descripion = descripion;

    }

    public String getUrl() {

         return url;

    }

    public void setUrl(String url) {

         this.url = url;

    }

    public String getPid() {

         return pid;

    }

    public void setPid(String pid) {

         this.pid = pid;

    }

    public String getPerms() {

         return perms;

    }

    public void setPerms(String perms) {

         this.perms = perms;

    }

    public Integer getType() {

         return type;

    }

    public void setType(Integer type) {

         this.type = type;

    }

    public String getIcon() {

         return icon;

    }

    public void setIcon(String icon) {

         this.icon = icon;

    }

    public Integer getOrder_num() {

         return order_num;

    }

    public void setOrder_num(Integer order_num) {

         this.order_num = order_num;

    }

 

}

在包“com.example.demo.model”中再新建一個“RolePermission”類(用來操作關聯表),代碼如下:

package com.example.demo.model;

 

import com.baomidou.mybatisplus.annotations.TableId;

import com.baomidou.mybatisplus.annotations.TableName;

 

@TableName("t_sys_permission_role")//數據庫對應表名,關聯表

public class RolePermission {

   

    @TableId

    private String id;//@TableId表示主鍵,與字段名稱大小寫一致    

    private String sys_role_id;//與字段名稱大小寫一致

    private String sys_permission_id;//與字段名稱大小寫一致

    public String getId() {

         return id;

    }

    public void setId(String id) {

         this.id = id;

    }

    public String getSys_role_id() {

         return sys_role_id;

    }

    public void setSys_role_id(String sys_role_id) {

         this.sys_role_id = sys_role_id;

    }

    public String getSys_permission_id() {

         return sys_permission_id;

    }

    public void setSys_permission_id(String sys_permission_id) {

         this.sys_permission_id = sys_permission_id;

    }

   

}

在包“com.example.demo.model”中再新建一個“Role”類(因爲需要用到角色,所以角色model先創建好),代碼如下:

package com.example.demo.model;

 

import com.baomidou.mybatisplus.annotations.TableId;

import com.baomidou.mybatisplus.annotations.TableName;

 

@TableName("t_sys_role")//數據庫對應表名

public class Role {

    @TableId

    private String id;//@TableId表示主鍵,與字段名稱大小寫一致

   

    private String name;//與字段名稱大小寫一致

 

    public String getId() {

         return id;

    }

 

    public void setId(String id) {

         this.id = id;

    }

 

    public String getName() {

         return name;

    }

 

    public void setName(String name) {

         this.name = name;

    }

}

 

      1. 權限vo

在包“com.example.demo.vo”中新建一個“PermissionVO”類(如果自己添加類時,只須定義好屬性,然後利用eclipse的生成getter和setter功能,直接生成代碼),代碼如下:

package com.example.demo.vo;

 

public class PermissionVO{

 

    private String id;

    private String name;

    private String descripion;

    private String url;

    private String pid;

    private String perms;

    private Integer type;

    private String icon;

    private Integer order_num;

    public String getId() {

         return id;

    }

    public void setId(String id) {

         this.id = id;

    }

    public String getName() {

         return name;

    }

    public void setName(String name) {

         this.name = name;

    }

    public String getDescripion() {

         return descripion;

    }

    public void setDescripion(String descripion) {

         this.descripion = descripion;

    }

    public String getUrl() {

         return url;

    }

    public void setUrl(String url) {

         this.url = url;

    }

    public String getPid() {

         return pid;

    }

    public void setPid(String pid) {

         this.pid = pid;

    }

    public String getPerms() {

         return perms;

    }

    public void setPerms(String perms) {

         this.perms = perms;

    }

    public Integer getType() {

         return type;

    }

    public void setType(Integer type) {

         this.type = type;

    }

    public String getIcon() {

         return icon;

    }

    public void setIcon(String icon) {

         this.icon = icon;

    }

    public Integer getOrder_num() {

         return order_num;

    }

    public void setOrder_num(Integer order_num) {

         this.order_num = order_num;

    }

   

}

 

      1. 權限mapper類以及xml文件

在包“com.example.demo.mapper”中新建一個“PermissionMapper”接口,代碼如下:

package com.example.demo.mapper;

 

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;

import com.baomidou.mybatisplus.plugins.pagination.Pagination;

import com.example.demo.model.Permission;

import com.example.demo.vo.PermissionVO;

 

@Mapper

public interface  PermissionMapper  extends BaseMapper<Permission>{

     List<PermissionVO> selectPermissionListPage(Pagination page ,PermissionVO permissionVO);

     List<PermissionVO> selectUserPermissionList(String userid);

}

在“src/main/resources”中的“mapper”文件夾中,新建一個文件,命名爲“PermissionMapper.xml”,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

<!-- 指明當前xml對應的Mapper -->

<mapper namespace="com.example.demo.mapper.PermissionMapper">

    <!-- 多表查詢,Select as後面的名稱必須與UserVO屬性名大小寫一致  -->

    <select id="selectPermissionListPage" parameterType="com.example.demo.vo.PermissionVO" resultType="com.example.demo.vo.PermissionVO">

        SELECT

            p.id as id,

            p.name as name,

            p.descripion as descripion,

            p.url as url,

            p.pid as pid,

            p.perms as perms,

            p.type as type,

            p.icon as icon,

            p.order_num as order_num

        FROM

            t_sys_permission p

        WHERE 1=1

        <if test="name != null">

            and p.name like  concat('%',#{name},'%')

        </if>

        <if test="url != null">

            and p.url like  concat('%',#{url},'%')

        </if>

    </select>

    <select id="selectUserPermissionList" parameterType="String" resultType="com.example.demo.vo.PermissionVO">

        SELECT

             pr.sys_permission_id as id

         FROM

             t_sys_user u

         INNER JOIN t_sys_role_user ru ON u.id = ru.sys_user_id

         INNER JOIN t_sys_permission_role pr ON ru.sys_role_id = pr.sys_role_id

        WHERE       

            u.id = #{userid}

    </select>

   

</mapper>

這裏的xml文件除了擴展分頁查詢,還擴展了一個連接查詢,查詢出用戶擁有的全部權限(菜單)。

在包“com.example.demo.mapper”中再新建一個“RolePermissionMapper”接口,代碼如下:

package com.example.demo.mapper;

 

import org.apache.ibatis.annotations.Mapper;

 

import com.baomidou.mybatisplus.mapper.BaseMapper;

import com.example.demo.model.RolePermission;

 

@Mapper

public interface RolePermissionMapper extends BaseMapper<RolePermission>{

 

}

該接口只繼承了通用mapper,不做擴展。

      1. 權限service

在包“com.example.demo.service”中新建一個“PermissionService”類,代碼如下:

package com.example.demo.service;

 

import java.util.ArrayList;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

import org.springframework.util.StringUtils;

import com.baomidou.mybatisplus.mapper.EntityWrapper;

import com.baomidou.mybatisplus.plugins.Page;

import com.example.demo.mapper.PermissionMapper;

import com.example.demo.mapper.RolePermissionMapper;

import com.example.demo.model.Permission;

import com.example.demo.model.Role;

import com.example.demo.model.RolePermission;

import com.example.demo.util.Convert;

import com.example.demo.util.SnowflakeIdWorker;

import com.example.demo.vo.DataTableResult;

import com.example.demo.vo.Menu;

import com.example.demo.vo.MenuList;

import com.example.demo.vo.PermissionVO;

 

@Service

public class PermissionService {

 

    @Autowired

    private PermissionMapper permissionMapper;// 注入mapper進行數據操作

 

    @Autowired

    private RolePermissionMapper rolePermissionMapper;// 注入mapper進行數據操作

 

    // 對於執行數據修改的方法加上事務處理

    @Transactional

    public int delete(String ids) {

         // ids,逗號隔開的主鍵

         List<String> listid = Convert.toListStrArray(ids);

         return permissionMapper.deleteBatchIds(listid);

    }

 

    public Permission selectById(String id) {

         // permissionMapper.selectOne(permission),selectOne可以按照其他字段來查詢一條記錄

         return permissionMapper.selectById(id);

    }

 

    // 對於執行數據修改的方法加上事務處理

    @Transactional

    public int updateById(Permission permission) {

         return permissionMapper.updateById(permission);

    }

 

    // 對於執行數據修改的方法加上事務處理

    @Transactional

    public int insert(Permission permission) {

         // 添加雪花主鍵id

         permission.setId(SnowflakeIdWorker.getUUID());

         int n = permissionMapper.insert(permission);

//           n=1/0; //事務測試

         return n;

    }

 

    /**

     * 採用集成的查詢方法

     *

     * @param username

     * @return

     */

    public List<Permission> selectList() {

         EntityWrapper<Permission> wrapper = new EntityWrapper<Permission>();

//      wrapper.like("username", username);

         return permissionMapper.selectList(wrapper);

    }

 

    /**

     * 返回角色所有權限

     *

     * @param role

     * @return

     */

    public List<RolePermission> selectRolePermission(Role role) {

         EntityWrapper<RolePermission> wrapper = new EntityWrapper<RolePermission>();

         wrapper.eq("sys_role_id", role.getId());// 可以多個條件

         return rolePermissionMapper.selectList(wrapper);

    }

 

    // 對於執行數據修改的方法加上事務處理

    @Transactional

    public void author(Role role, String ids) {

         // 1.清除原有分配

         EntityWrapper<RolePermission> wrapper = new EntityWrapper<RolePermission>();

         wrapper.eq("sys_role_id", role.getId());// 可以多個條件

         rolePermissionMapper.delete(wrapper);

         // 2.重新插入權限

         if (!StringUtils.isEmpty(ids)) {

             List<String> listrid = Convert.toListStrArray(ids);

             SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);

             for (String pid : listrid) {

                  RolePermission rp = new RolePermission();

                  rp.setId(String.valueOf(idWorker.nextId()));

                  rp.setSys_role_id(role.getId());

                  rp.setSys_permission_id(pid);

                  rolePermissionMapper.insert(rp);

             }

         }

    }

 

    /**

     * 分頁查詢

     *

     * @param permission

     * @return

     */

    public DataTableResult selectPermissionListPage(PermissionVO permissionVO, int start, int length, String orderField,

             String orderDir) {

         Page<PermissionVO> page = null;

         // 排序

         if (!StringUtils.isEmpty(orderDir) && !StringUtils.isEmpty(orderField)) {

             if (orderDir.equals("asc")) {

                  page = new Page<>(start / length + 1, length, orderField, true);// 當前頁,每頁總條數 構造 page 對象

             } else {

                  page = new Page<>(start / length + 1, length, orderField, false);// 當前頁,每頁總條數 構造 page 對象

             }

 

         } else {

             page = new Page<>(start / length + 1, length, "id", false);// 默認id降序

         }

         page.setRecords(permissionMapper.selectPermissionListPage(page, permissionVO));

 

         DataTableResult result = new DataTableResult();

        result.setRecordsTotal(page.getTotal());

         result.setRecordsFiltered(page.getTotal());

         result.setData(page.getRecords());

         return result;

    }

   

    public List<Permission> getRootMenu() {

         EntityWrapper<Permission> wrapper = new EntityWrapper<Permission>();

        wrapper.eq("pid", 0);

         return permissionMapper.selectList(wrapper);

    }

    public List<Permission> getSubMenu(String pid) {

         EntityWrapper<Permission> wrapper = new EntityWrapper<Permission>();

         wrapper.eq("pid", pid);

         return permissionMapper.selectList(wrapper);

    }

    public List<MenuList> getUserMenu(String userid){

         List<MenuList> menulist = new ArrayList<MenuList>();

         //1.查詢用戶的菜單id

         List<PermissionVO> userPermissionList = permissionMapper.selectUserPermissionList(userid);

         //2.構造菜單結構

         List<Permission> rootMenuList = getRootMenu();

         for(Permission p:rootMenuList) {

             //判斷是否有權限

             boolean flag = false;

             for(PermissionVO pv:userPermissionList) {

                  if(pv.getId().equals(p.getId())) {

                      flag = true;

                      break;

                  }

             }

             if(flag) {

                  //構造菜單

                  Menu menu=new Menu();

                  menu.setMenuIcon(p.getIcon());

                  menu.setMenuText(p.getName());

                  menu.setMenuUrl(p.getUrl());

                  //有權限,獲取下級菜單

                  List<Permission> subMenuList = getSubMenu(p.getId());

                  List<Menu> menulistsub = new ArrayList<Menu>();//構造下級菜單

                  for(Permission p2:subMenuList) {

                      //判斷是否有權限

                      boolean flag2 = false;

                      for(PermissionVO pv2:userPermissionList) {

                          if(pv2.getId().equals(p2.getId())) {

                               flag2 = true;

                               break;

                          }

                      }

                      if(flag2) {

                          //有權限

                          //構造二級菜單

                          Menu menu2=new Menu();

                          menu2.setMenuIcon(p2.getIcon());

                          menu2.setMenuText(p2.getName());

                          menu2.setMenuUrl(p2.getUrl());

                          menulistsub.add(menu2);

                      }

                  }

                  MenuList mList =new MenuList();

                  mList.setMenu(menu);

                  mList.setSubmenus(menulistsub);

                  menulist.add(mList);

             }

         }

         return menulist;

    }

 

}

這個service是比較複雜的,除了基本的增刪改查和分頁查詢之外,還擴展了角色的授權和菜單的構造,這兩部分有點難,注意理解代碼。

      1. 權限controller

在包“com.example.demo.controller”中新建一個“PermissionController”類,代碼如下:

package com.example.demo.controller;

 

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.util.StringUtils;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.model.Permission;

import com.example.demo.model.Role;

import com.example.demo.model.RolePermission;

import com.example.demo.service.PermissionService;

import com.example.demo.vo.DataTableResult;

import com.example.demo.vo.Json;

import com.example.demo.vo.PermissionVO;

import com.example.demo.vo.ZTreeNode;

 

@Controller

@RequestMapping("/PermissionController")

public class PermissionController {

 

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

   

    private String prefix = "admin/permission";// 頁面的路徑

 

    @Autowired

    private PermissionService permissionService;// 注入業務層的service

 

    // 未加入@ResponseBody用來返回數據給頁面

    @RequestMapping("view")

    public String view(Model model) {

         return prefix + "/view";

    }

 

    // @ResponseBody,直接通過js異步返回數據給頁面

    @RequestMapping("list")

    @ResponseBody

    public DataTableResult list(HttpServletRequest request, PermissionVO permissionVO) {

         // DataTableResult返回給datatables控件的數據格式

         DataTableResult result = new DataTableResult();

         // 獲取分頁參數

         int start = Integer.parseInt(request.getParameter("start"));

         int length = Integer.parseInt(request.getParameter("length"));

         // 獲取排序字段

         String orderIdx = request.getParameter("order[0][column]");

         // 獲取排序字段名

         String orderField = request.getParameter("columns[" + orderIdx + "][name]");

         // 獲取排序方式,降序desc或者升序asc

         String orderDir = request.getParameter("order[0][dir]");

         result = permissionService.selectPermissionListPage(permissionVO, start, length, orderField, orderDir);

//       result.setDraw(permissionVO.getDraw());

         return result;

    }

 

    // @ResponseBody,直接通過js異步返回數據給頁面

    @RequestMapping("insert")

    @ResponseBody

    public Json insert(Permission permission) {

         Json j = new Json();

         if (permissionService.insert(permission) > 0) {

             j.setSuccess(true);

             j.setMsg("添加成功!");

         } else {

             j.setSuccess(false);

             j.setMsg("添加失敗!");

         }

         return j;

    }

 

    // @ResponseBody,直接通過js異步返回數據給頁面

    @RequestMapping("update")

    @ResponseBody

    public Json updateById(Permission permission) {

         Json j = new Json();

         if (permissionService.updateById(permission) > 0) {

             j.setSuccess(true);

             j.setMsg("修改成功!");

         } else {

             j.setSuccess(false);

             j.setMsg("修改失敗!");

         }

         return j;

    }

 

    // @ResponseBody,直接通過js異步返回數據給頁面

    @RequestMapping("select")

    @ResponseBody

    public Json selectById(Permission permission) {

         Json j = new Json();

         j.setSuccess(true);

         j.setObj(permissionService.selectById(permission.getId()));

         return j;

    }

 

    // @ResponseBody,直接通過js異步返回數據給頁面

    @RequestMapping("delete")

    @ResponseBody

    public Json delete(HttpServletRequest request) {

         Json j = new Json();

         String ids = request.getParameter("ids");

         if (!StringUtils.isEmpty(ids)) {

             j.setSuccess(true);

             j.setObj("成功刪除" + permissionService.delete(ids) + "條記錄");

         } else {

             j.setSuccess(false);

             j.setMsg("沒有需要刪除的記錄!");

         }

         return j;

    }

 

    /**

     * 獲取樹形結構

     **/

    @RequestMapping("tree")

    @ResponseBody

    public List<ZTreeNode> getTreeList(HttpServletRequest request, Role role) {

         List<Permission> permissionList = permissionService.selectList();

         List<RolePermission> rolePermissionsList = permissionService.selectRolePermission(role);

         List<ZTreeNode> list = new ArrayList<ZTreeNode>();

         for (Permission p : permissionList) {

             ZTreeNode zt = new ZTreeNode();

             zt.setId(p.getId());

             zt.setName(p.getName());

             zt.setOpen(true);

             zt.setpId(p.getPid());

             if (p.getPid().equals("0"))

                  zt.setIsParent(true);

             else

                  zt.setIsParent(false);

             zt.setMsg(p.getDescripion() + "");

             // 查詢是否已經分配了權限,有的打勾

             for (RolePermission rp : rolePermissionsList) {

                  if (rp.getSys_permission_id().equals(p.getId())) {

                      zt.setChecked(true);

                      break;

                  }

             }

             list.add(zt);

         }

         return list;

    }

 

    // @ResponseBody,直接通過js異步返回數據給頁面

    @RequestMapping("author")

    @ResponseBody

    public Json author(HttpServletRequest request, Role role) {

         Json j = new Json();

         String ids = request.getParameter("ids");

         if (!StringUtils.isEmpty(role.getId())) {

             permissionService.author(role, ids);

             j.setSuccess(true);

             j.setObj("分配權限成功!");

         } else {

             j.setSuccess(false);

             j.setMsg("角色id爲空!");

         }

         return j;

    }

 

}

這個controller用到了樹形結構數據ZTreeNode,把數據組裝成樹形結構需要的格式返回給前端,author方法利用前端樹形結構返回的選中id值(以逗號隔開進行拼接)進行角色的權限分配。

      1. 權限管理界面

添加權限管理界面,在“admin”文件夾中新建一個文件夾“permission”,在“permission”文件夾-> 右鍵->new->file,輸入“view.html”(這裏的路徑主要是由controller的轉發方法決定,保持一致即可),代碼如下:

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta name="renderer" content="webkit">

<title>權限管理</title>

<meta name="keywords" content="">

<meta name="description" content="">

 

<!--[if lt IE 9]>

    <meta http-equiv="refresh" content="0;ie.html" />

    <![endif]-->

 

<link rel="shortcut icon" href="favicon.ico">

<link th:href="@{/static/css/bootstrap.min.css?v=3.3.6}"

    rel="stylesheet">

<link th:href="@{/static/css/font-awesome.min.css?v=4.4.0}"

    rel="stylesheet">

<link th:href="@{/static/css/animate.css}" rel="stylesheet">

<link th:href="@{/static/css/style.css?v=4.1.0}" rel="stylesheet">

<!-- Data Tables -->

<link

    th:href="@{/static/css/plugins/dataTables/dataTables.bootstrap.css}"

    rel="stylesheet">

<!-- toastr -->

<link th:href="@{/static/css/plugins/toastr/toastr.min.css}" rel="stylesheet">  

</head>

 

<body class="gray-bg">

    <div class="wrapper wrapper-content animated fadeInRight">

        <div class="row">

            <div class="col-sm-12">

                <div class="ibox float-e-margins">

                    <div class="ibox-title">

                        <h5>權限管理</h5>

                        <div class="ibox-tools">

                            <a class="collapse-link">

                                <i class="fa fa-chevron-up"></i>

                            </a>

                            <a class="dropdown-toggle" data-toggle="dropdown" href="table_data_tables.html#">

                                <i class="fa fa-wrench"></i>

                            </a>

                            <ul class="dropdown-menu dropdown-user">

                                <li><a href="table_data_tables.html#">選項1</a>

                                </li>

                                <li><a href="table_data_tables.html#">選項2</a>

                                </li>

                            </ul>

                            <a class="close-link">

                                <i class="fa fa-times"></i>

                            </a>

                        </div>

                    </div>

                    <div class="ibox-content">

                        <div class="form-horizontal">

                            <div class="form-group">

                                            <div class="col-sm-4">

                                                <button id="btn_add" class="btn btn-primary btn-sm" ><i class="fa fa-plus"></i>&nbsp;添加</button>

                                                <button id="btn_del" class="btn btn-danger btn-sm m-l-sm" ><i class="fa fa-remove"></i>&nbsp;刪除</button>

                                                <button id="btn_export" class="btn btn-primary btn-sm m-l-sm" onclick="$('#table').tableExport({type:'excel',escape:'false',tableName:'導出表格',ignoreColumn:[0]});"><i class="fa fa-file-excel-o"></i>&nbsp;導出</button>

                                            </div>

                                            <label class="col-sm-1 control-label">搜索:</label>

                                            <div class="col-sm-2">

                                                <select id="searchfield" class="form-control">

                                                     <!-- value爲查找字段名稱 -->

                                                     <option value="name">名稱</option>

                                                     <option value="url">URL</option>

                                                </select>

                                               

                                            </div>

                                            <div class="col-sm-3">

                                                <input id="keyword" type="search" class="form-control" placeholder="關鍵字" />

                                            </div>

                                            <div class="col-sm-2">

                                                <button id="btn_search" class="btn btn-primary btn-sm m-l-sm" ><i class="fa fa-search"></i>&nbsp;搜索</button>

                                            </div>

                                           

                                 </div>

                          </div>

                        <table class="table table-striped table-bordered table-hover" id="table">

                            <thead>

                                       <tr>

                                            <th style="padding-left: 10px;">

                                                <input type="checkbox" id="cb_selectAll" class="input-lg" style="width:20px;height:20px;"/>

                                            </th>

                                            <th>id</th>

                                            <th>name</th>

                                            <th>url</th>

                                            <th>pid</th>

                                            <th>icon</th>

                                            <th>order_num</th>

                                            <th>操作</th>

                                       </tr>

                               </thead>

                        </table>

 

                    </div>

                </div>

            </div>

        </div>

       

    </div>

 

 <!-- 模態窗口 -->  

<div class="modal fade" data-backdrop="static" id="modal" tabindex="-1" role="dialog" aria-hidden="true">

    <div class="modal-dialog modal-lg">

         <div class="modal-content">

             <div class="modal-header">

                  <button type="button" class="close" data-dismiss="modal">

                      <span aria-hidden="true">&times;</span><span class="sr-only">Close</span>

                  </button>

                  <h2 class="modal-title" id="modaltitle"></h2>

             </div>

             <div class="modal-body">

                  <div class="row">

                      <!-- 表單佈局 -->

                      <form id="form">

                               <div class="col-md-12">

                                   <div class="form-group">

                                       <label class="col-sm-3 control-label"><font color="#FF0000">*</font>權限名稱:</label>

                                       <div class="col-sm-9">

                                           <!-- 保存修改的主鍵值 -->

                                           <input type="hidden" name="id" id="id">

                                            <input class="form-control" type="text" name="name" id="name"

                                                placeholder="請輸入權限名稱" >

                                            <span class="help-block m-b-none"></span>

                                       </div>

                                   </div>

                               </div>

                              

                               <div class="col-md-12">

                                   <div class="form-group">

                                       <label class="col-sm-3 control-label">url</label>

                                       <div class="col-sm-9">

                                            <input class="form-control" type="text" name="url" id="url"

                                                placeholder="請輸入url" >

                                            <span class="help-block m-b-none"></span>

                                       </div>

                                   </div>

                               </div>

                              

                               <div class="col-md-12">

                                   <div class="form-group">

                                       <label class="col-sm-3 control-label"><font color="#FF0000">*</font>pid(0爲根節點)</label>

                                       <div class="col-sm-9">

                                            <input class="form-control" type="text" name="pid" id="pid"

                                                placeholder="請輸入pid" >

                                            <span class="help-block m-b-none"></span>

                                       </div>

                                   </div>

                               </div>

                              

                               <div class="col-md-12">

                                   <div class="form-group">

                                       <label class="col-sm-3 control-label">icon</label>

                                       <div class="col-sm-9">

                                            <input class="form-control" type="text" name="icon" id="icon"

                                                placeholder="請輸入icon" >

                                            <span class="help-block m-b-none"></span>

                                       </div>

                                   </div>

                               </div>

                              

                               <div class="col-md-12">

                                   <div class="form-group">

                                       <label class="col-sm-3 control-label">order_num</label>

                                       <div class="col-sm-9">

                                            <input class="form-control" type="number" name="order_num" id="order_num"

                                                placeholder="請輸入order_num" >

                                            <span class="help-block m-b-none"></span>

                                       </div>

                                   </div>

                               </div>

                           

                      </form>

                      <!-- 表單佈局結束 -->

                  </div>

             </div>

             <div class="modal-footer">

                  <button type="button" class="btn btn-white"

                      data-dismiss="modal">關閉</button>

                  <button type="button" class="btn btn-primary" id="btn_save">保存</button>

             </div>

         </div>

    </div>

</div>

<!-- 模態窗口結束 -->

 

    <!-- 全局js -->

    <script th:src="@{/static/js/jquery.min.js?v=2.1.4}"></script>

    <script th:src="@{/static/js/bootstrap.min.js?v=3.3.6}"></script>

    <script th:src="@{/static/js/plugins/layer/layer.min.js}"></script>

 

    <!-- 自定義js -->

    <script th:src="@{/static/js/content.js}"></script>

 

    <!-- Data Tables -->

    <script th:src="@{/static/js/plugins/dataTables/jquery.dataTables.js}"></script>

    <script

         th:src="@{/static/js/plugins/dataTables/dataTables.bootstrap.js}"></script>

    <!-- tableexport -->

    <!--   前端直接導出excel有一定的缺陷,使用後臺導出功能更強大

        後臺導出:阿里巴巴項目組提供了easyexcel工具類,github地址:https://github.com/alibaba/easyexcel -->

    <script th:src="@{/static/js/plugins/tableexport/tableExport.js}"></script>

    <script th:src="@{/static/js/plugins/tableexport/jquery.base64.js}"></script>

   

   

    <!-- Toastr script -->

    <script th:src="@{/static/js/plugins/toastr/toastr.min.js}"></script>

    <!-- jQuery Validation plugin javascript-->

    <script th:src="@{/static/js/plugins/validate/jquery.validate.min.js}"></script>

    <script th:src="@{/static/js/plugins/validate/messages_zh.min.js}"></script>

   

    <!-- Page-Level Scripts -->

    <script>

   

    //表格行中的按鈕點擊事件

    function edit(id){

    //異步獲取數據

    $.ajax({

         type: "get",

         data: {

            id:id,//第一個id爲參數名,第二個爲參數值

         },

         url: "/PermissionController/select",//後臺處理地址

         success: function (data) {

            //console.log(data);

            if(data.success){

                 //設置數據

                 $("#id").val(data.obj.id);//修改數據必須有主鍵值

                 

             $("#name").val(data.obj.name);

             $("#url").val(data.obj.url);

             $("#pid").val(data.obj.pid);

             $("#icon").val(data.obj.icon);

             $("#order_num").val(data.obj.order_num);

            

             $("#modaltitle").text("修改權限");

             $("#modal").modal("show");

            }else{

                 toastr.error(data.msg, '錯誤!');

            }

         }

    }); // end ajax

   

    }//end edit

   

        $(document).ready(function () {

        var datatable= $('#table').DataTable({

              "processing": true,

                "serverSide": true,

                "ajax": {

                   url: "/PermissionController/list",

                   type:"post",

                   data: function (d) {

                     //把字段名和關鍵詞發送給controller進行查詢,自動映射到vo模型的相應屬性中

                     d[$('#searchfield').val()]=$('#keyword').val()

                   }

                },  

                "language": {

                     "lengthMenu": "每頁 _MENU_ ",

                     "info": " _START_ _END_,共 _TOTAL_ 記錄",

                     "zeroRecords": "沒有找到記錄",

                     "infoEmpty": "暫無記錄",

                     "infoFiltered": "( _MAX_ 條記錄過濾)",

                     "paginate": {

                         "previous": "上一頁",

                         "next": "下一頁",

 

                     },

                     "processing": "正在加載..."

                 },

                 "autoWidth": false,

                 "pageLength": 5,

                 "lengthChange": false,

                 "searching": false,

                 "columns": [

 

                      {"data":"id","orderable": false,

                          "render": function ( data, type, full, meta ) {

                                   return '<input type="checkbox" value="'+data+'" class="input-lg" style="width:20px;height:20px;" />';

                               }

                      },

                      {"data":"id","name":"id"},

                      {"data":"name","name":"name"},

                      {"data":"url","name":"url"},

                      {"data":"pid","name":"pid"},

                      {"data":"icon","name":"icon"},

                      {"data":"order_num","name":"order_num"},

                      //有排序功能必須指定name爲字段名稱

                      {"data":"id","orderable": false,

                          "render": function ( data, type, full, meta ) {

                                   return '<button id="btn_edit" class="btn btn-primary btn-sm" οnclick="edit(\''+data+'\')"><i class="fa fa-edit"></i>&nbsp;查看修改</button>';

                               }

                      },

                  ],

                  "order": [

                     [1, 'desc']

                  ]//默認排序

        });

       

        $("#btn_search").click(function(){

              datatable.ajax.reload();//根據關鍵詞重新加載數據

        });

       

        //全選

        $("#cb_selectAll").click(function(){

              if ($("#cb_selectAll").get(0).checked) {

                    $("#table tbody :checkbox").prop("checked", true);

                }else{

                   $("#table tbody :checkbox").prop("checked", false);

                }              

        });

       

        //toastr選項

        toastr.options = {

           "positionClass": "toast-bottom-center",

        }

       

        //刪除

        $("#btn_del").click(function(){

              //獲取選中的複選框

              var checkboxlist=$("#table tbody :checked");

              if(checkboxlist.length>0){

                  if(!confirm("您確定刪除數據嗎?"))

                    {

                       return;

                    }

              }else{

                  toastr.error("請選擇要刪除的記錄。", '錯誤!');

                  return;

              }

              var ids="";

              $.each(checkboxlist, function(n, cb) { 

                  ids+=cb.value+","

                });

              if(ids.length>0){

                ids=ids.substring(0,ids.length-1);

              }

              //異步刪除數據

              $.ajax({

                  type: "post",

                  data: {

                     ids:ids,//第一個ids爲參數名,第二個爲參數值

                  },

                  url: "/PermissionController/delete",//後臺處理地址

                  success: function (data) {

                     if(data.success){

                          toastr.success(data.msg, '刪除成功!');

                          datatable.ajax.reload(null, false);//刷新當前頁

                     }else{

                          toastr.error(data.msg, '錯誤!');

                     }

                  }

              });

        });//end btn_del

       

        $("#btn_add").click(function(){

              //清空數據

              $("#name").val("");

         $("#url").val("");

         $("#pid").val("");

         $("#icon").val("");

         $("#order_num").val("");

              //validator.resetForm();//重置驗證

              $("#modaltitle").text("添加權限");

              $("#modal").modal("show");

        });//end add

       

       

       

        //不用改,以下爲修改jQuery Validation插件兼容Bootstrap的方法,沒有直接寫在插件中是爲了便於插件升級

            $.validator.setDefaults({

                highlight: function (element) {

                    $(element).closest('.form-group').removeClass('has-success').addClass('has-error');

                },

                success: function (element) {

                    element.closest('.form-group').removeClass('has-error').addClass('has-success');

                },

                errorElement: "span",

                errorPlacement: function (error, element) {

                    if (element.is(":radio") || element.is(":checkbox")) {

                        error.appendTo(element.parent().parent().parent());

                    } else {

                        error.appendTo(element.parent());

                    }

                },

                errorClass: "help-block m-b-none",

                validClass: "help-block m-b-none"

            });

        //end setDefaults

           

            // validate form setting

            var icon = "<i class='fa fa-times-circle'></i> ";

            validator=$("#form").validate({

                rules: {

                    name: {

                        required: true,

                        minlength: 1

                    },

                    pid: {

                        required: true,

                    },

                },

                messages: {

                    name: {

                        required: icon + "請輸入您的權限名",

                        minlength: icon + "權限名必須1個字符以上"

                    },

                    pid: {

                        required: icon + "請輸入pid",

                    },

                }

            });//end validate

           

            $("#btn_save").click(function(){

              if($("#form").valid()){

                  //save

                  if($("#modaltitle").text()=="添加權限"){

                       //add

                       //異步添加數據

                       $.ajax({

                            type: "post",

                            data: {

                                name:$("#name").val(),

                                url:$("#url").val(),

                                pid:$("#pid").val(),

                                icon:$("#icon").val(),

                                order_num:$("#order_num").val(),

                            },

                            url: "/PermissionController/insert",//後臺處理地址

                            success: function (data) {

                               if(data.success){

                                   toastr.success(data.msg, '添加成功!');

                                   $("#modal").modal('hide');

                                   datatable.ajax.reload(null, false);//刷新當前頁

                               }else{

                                   toastr.error(data.msg, '錯誤!');

                               }

                            }

                       });  // end ajax

                  }else{

                       //update

                       //異步修改數據

                       $.ajax({

                            type: "post",

                            data: {

                                id:$("#id").val(),//主鍵,從隱藏input獲取到

                                name:$("#name").val(),

                                url:$("#url").val(),

                                pid:$("#pid").val(),

                                icon:$("#icon").val(),

                                order_num:$("#order_num").val(),

                            },

                            url: "/PermissionController/update",//後臺處理地址

                            success: function (data) {

                               if(data.success){

                                   toastr.success(data.msg, '修改成功!');

                                   $("#modal").modal('hide');

                                   datatable.ajax.reload(null, false);//刷新當前頁

                               }else{

                                   toastr.error(data.msg, '錯誤!');

                               }

                            }

                       });  // end ajax

                  }                

                 

              }            

        });//end btn_save

       

 

        });//end ready

 

    </script>

 

</body>

 

</html>

    點擊權限管理菜單的效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章