功能维护、角色管理
authorqiaowei <jov123@163.com>
Sun, 5 May 2019 09:51:17 +0000 (17:51 +0800)
committerqiaowei <jov123@163.com>
Sun, 5 May 2019 09:51:25 +0000 (17:51 +0800)
28 files changed:
src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java [new file with mode: 0644]
src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
src/main/java/com/supwisdom/dlpay/framework/data/NodeData.java [new file with mode: 0644]
src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java [new file with mode: 0644]
src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java [new file with mode: 0644]
src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
src/main/resources/static/custom/module/admin.js
src/main/resources/templates/system/function/form.html
src/main/resources/templates/system/function/index.html
src/main/resources/templates/system/function/resform.html [new file with mode: 0755]
src/main/resources/templates/system/function/reslist.html [new file with mode: 0755]
src/main/resources/templates/system/function/subform.html [new file with mode: 0755]
src/main/resources/templates/system/operator/index.html
src/main/resources/templates/system/role/form.html [new file with mode: 0755]
src/main/resources/templates/system/role/func.html [new file with mode: 0755]
src/main/resources/templates/system/role/index.html

index 619a530..1e08ccb 100644 (file)
@@ -10,9 +10,17 @@ import org.springframework.stereotype.Repository;
 import java.util.List;
 
 @Repository
-public interface FunctionDao extends JpaRepository<TFunction, String> {
-  @Query("select distinct t from TFunction t,TRoleFunction a, TOperRole b where t.id=a.functionId and a.roleId=b.roleId and b.operid=?1 order by t.orderNum ")
-  List<TFunction> getTFunctionsByOperid(String operid);
+public interface FunctionDao extends JpaRepository<TFunction, Integer> {
+    @Query("select distinct t from TFunction t,TRoleFunction a, TOperRole b where t.id=a.functionId and a.roleId=b.roleId and b.operid=?1 order by t.orderNum ")
+    List<TFunction> getTFunctionsByOperid(String operid);
 
-  Page<TFunction> findAllByNameContaining(String name,Pageable pageable);
+    Page<TFunction> findAllByNameContaining(String name, Pageable pageable);
+
+    TFunction findByName(String name);
+
+    TFunction findByNameAndIdNot(String name, Integer id);
+
+    List<TFunction> findByParentId(Integer parentId);
+
+    List<TFunction> findByIsLeaf(Integer isLeaf);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
new file mode 100644 (file)
index 0000000..767df41
--- /dev/null
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPermission;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface PermissionDao extends JpaRepository<TPermission, String> {
+    List<TPermission> findByRoleFuncId(String roleFuncId);
+
+    TPermission findByRoleFuncIdAndResid(String roleFuncId, Integer resid);
+
+    void deleteByRoleFuncId(String roleFuncId);
+
+    void deleteByRoleId(String roleId);
+}
index 22f5c1c..d5a81c8 100644 (file)
@@ -4,7 +4,16 @@ import com.supwisdom.dlpay.framework.domain.TResource;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
-public interface ResourceDao extends JpaRepository<TResource, String> {
+public interface ResourceDao extends JpaRepository<TResource, Integer> {
     TResource findByUri(String uri);
+
+    List<TResource> findByFunctionId(Integer functionId);
+
+    TResource findByUriAndIdNot(String uri, Integer id);
+
+    void deleteByFunctionId(Integer functionId);
+
 }
index af771de..0baed2e 100644 (file)
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.framework.dao;
 
 import com.supwisdom.dlpay.framework.domain.TRole;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
@@ -9,9 +11,14 @@ import java.util.List;
 
 @Repository
 public interface RoleDao extends JpaRepository<TRole, String> {
-  @Query("from TRole order by createtime asc ")
-  List<TRole> getAllRoles();
+    @Query("from TRole order by createtime asc ")
+    List<TRole> getAllRoles();
 
-  TRole findByRoleCode(String rolecode);
+    TRole findByRoleCode(String rolecode);
 
+    Page<TRole> findAllByRoleNameContaining(String roleName, Pageable pageable);
+
+    TRole findByRoleNameAndRoleIdNot(String roleName, String roleId);
+
+    TRole findByRoleName(String roleName);
 }
index de69392..565ebe6 100644 (file)
@@ -1,11 +1,29 @@
 package com.supwisdom.dlpay.framework.dao;
 
+import com.supwisdom.dlpay.framework.data.NodeData;
 import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface RoleFunctionDao extends JpaRepository<TRoleFunction, String> {
 
-    TRoleFunction findByRoleIdAndFunctionId(String roleId,String functionId);
+    TRoleFunction findByRoleIdAndFunctionId(String roleId, Integer functionId);
+
+    void deleteByFunctionId(Integer functionId);
+
+    List<TRoleFunction> findByRoleId(String roleId);
+
+    @Query(value = " select f.id||'' as id ,f.parentid||'' as pid,f.name,case when rf.id is null then 0 else 1 end as checked from tb_function f " +
+            " left join tb_role_function rf on rf.functionid = f.id and rf.roleid=?1 " +
+            " union all " +
+            " select r.id||'_res' as id,r.function_id||'' as pid,r.name,case when p.id is null then 0 else 1 end as checked from tb_resource  r " +
+            " left join tb_permission p on p.resid = r.id and p.roleid=?1 " , nativeQuery = true)
+    List<NodeData> findByRoleIdNative(String roleId);
+
+    void deleteByRoleId(String roleId);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/data/NodeData.java b/src/main/java/com/supwisdom/dlpay/framework/data/NodeData.java
new file mode 100644 (file)
index 0000000..19197d3
--- /dev/null
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface NodeData {
+    String getId();
+
+    String getPid();
+
+    String getName();
+
+    boolean getOpen();
+
+    Integer getChecked();
+}
index 8c135e8..2f3b83c 100644 (file)
@@ -1,20 +1,18 @@
 package com.supwisdom.dlpay.framework.domain;
 
-import org.hibernate.annotations.GenericGenerator;
-
 import javax.persistence.*;
 
 @Entity
 @Table(name = "TB_FUNCTION")
+@SequenceGenerator(name="SEQ_FUNC",sequenceName="SEQ_FUNC",allocationSize=1)
 public class TFunction {
   @Id
-  @GenericGenerator(name = "idGenerator", strategy = "uuid")
-  @GeneratedValue(generator = "idGenerator")
-  @Column(name="ID", nullable = false, length = 32)
-  private String id;
+  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_FUNC")
+  @Column(name="ID", nullable = false)
+  private Integer id;
 
-  @Column(name="PARENTID", length = 32)
-  private String parentId;
+  @Column(name="PARENTID")
+  private Integer parentId;
 
   @Column(name="NAME", length = 32)
   private String name;
@@ -37,19 +35,19 @@ public class TFunction {
   @Column(name="LASTSAVED", length = 14)
   private String lastsaved;
 
-  public String getId() {
+  public Integer getId() {
     return id;
   }
 
-  public void setId(String id) {
+  public void setId(Integer id) {
     this.id = id;
   }
 
-  public String getParentId() {
+  public Integer getParentId() {
     return parentId;
   }
 
-  public void setParentId(String parentId) {
+  public void setParentId(Integer parentId) {
     this.parentId = parentId;
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
new file mode 100644 (file)
index 0000000..0d22f35
--- /dev/null
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_PERMISSION")
+public class TPermission {
+    @Id
+    @GenericGenerator(name = "idGenerator", strategy = "uuid")
+    @GeneratedValue(generator = "idGenerator")
+    @Column(name = "ID", nullable = false, length = 32)
+    private String id;
+
+    @Column(name = "ROLE_FUNC_ID", length = 32)
+    private String roleFuncId;
+
+    @Column(name = "RESID")
+    private Integer resid;
+
+    @Column(name = "ROLEID")
+    private String roleId;
+
+    public String getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(String roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getRoleFuncId() {
+        return roleFuncId;
+    }
+
+    public void setRoleFuncId(String roleFuncId) {
+        this.roleFuncId = roleFuncId;
+    }
+
+    public Integer getResid() {
+        return resid;
+    }
+
+    public void setResid(Integer resid) {
+        this.resid = resid;
+    }
+}
index 889eaca..63044cb 100644 (file)
@@ -1,16 +1,15 @@
 package com.supwisdom.dlpay.framework.domain;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 
 @Entity
 @Table(name = "TB_RESOURCE")
+@SequenceGenerator(name="SEQ_RES",sequenceName="SEQ_RES",allocationSize=1)
 public class TResource {
   @Id
-  @Column(name = "ID", nullable = false, length = 32)
-  private String id;
+  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_RES")
+  @Column(name = "ID", nullable = false,length = 9)
+  private Integer id;
 
   @Column(name = "CODE", nullable = false, length = 32)
   private String code;
@@ -22,13 +21,13 @@ public class TResource {
   private String uri;
 
   @Column(name = "FUNCTION_ID", nullable = false, length = 32)
-  private String functionId;
+  private Integer functionId;
 
-  public String getId() {
+  public Integer getId() {
     return id;
   }
 
-  public void setId(String id) {
+  public void setId(Integer id) {
     this.id = id;
   }
 
@@ -56,11 +55,11 @@ public class TResource {
     this.uri = uri;
   }
 
-  public String getFunctionId() {
+  public Integer getFunctionId() {
     return functionId;
   }
 
-  public void setFunctionId(String functionId) {
+  public void setFunctionId(Integer functionId) {
     this.functionId = functionId;
   }
 }
index a621460..c5e9f05 100644 (file)
@@ -17,7 +17,7 @@ public class TRoleFunction {
   private String roleId;
 
   @Column(name="FUNCTIONID", nullable = false, length = 32)
-  private String functionId;
+  private Integer functionId;
 
   @Column(name="PERMISSIONS", length = 200)
   private String permissions;
@@ -38,11 +38,11 @@ public class TRoleFunction {
     this.roleId = roleId;
   }
 
-  public String getFunctionId() {
+  public Integer getFunctionId() {
     return functionId;
   }
 
-  public void setFunctionId(String functionId) {
+  public void setFunctionId(Integer functionId) {
     this.functionId = functionId;
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java b/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java
new file mode 100644 (file)
index 0000000..9d50273
--- /dev/null
@@ -0,0 +1,50 @@
+package com.supwisdom.dlpay.system.bean;
+
+
+public class ZTreeNode {
+    private String id;
+    private String pId;
+    private String name;
+    private boolean checked;
+    private boolean open;
+
+    public boolean isOpen() {
+        return open;
+    }
+
+    public void setOpen(boolean open) {
+        this.open = open;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getpId() {
+        return pId;
+    }
+
+    public void setpId(String pId) {
+        this.pId = pId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+}
index 16c598a..978819c 100644 (file)
@@ -1,8 +1,10 @@
 package com.supwisdom.dlpay.system.controller;
 
 
+import com.supwisdom.dlpay.consume.bean.JsonResult;
 import com.supwisdom.dlpay.framework.domain.TFunction;
 import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.domain.TResource;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.framework.util.WebConstant;
@@ -12,9 +14,9 @@ import com.supwisdom.dlpay.system.service.FunctionService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 @Controller
 public class FunctionController {
@@ -45,4 +47,85 @@ public class FunctionController {
             return new PageResult<>(99, "系统查询错误");
         }
     }
+
+    @GetMapping("/function/loadadd")
+    public String loadadd() {
+        return "system/function/form";
+    }
+
+    @PostMapping("/function/add")
+    @ResponseBody
+    public JsonResult add(@RequestBody TFunction function) {
+        if (function != null) {
+            return functionService.saveFunction(function);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+    @PostMapping("/function/delfunc")
+    @ResponseBody
+    public JsonResult delfunc(@RequestParam Integer funcid) {
+        return functionService.deleteFunction(funcid);
+    }
+
+    @GetMapping("/function/checkname")
+    @ResponseBody
+    public JsonResult checkname(@RequestParam String name,
+                                @RequestParam(value = "id", required = false) Integer id) {
+        TFunction function = functionService.getFunctionByNameAndId(name, id);
+        if (function == null) {
+            return JsonResult.ok();
+        } else {
+            return JsonResult.error("功能名称重复");
+        }
+    }
+
+    @GetMapping("/function/loadsubadd")
+    public String loadsubadd(Model model) {
+        List<TFunction> functionList = functionService.getParentFunction();
+        model.addAttribute("list", functionList);
+        return "system/function/subform";
+    }
+
+    @GetMapping("/function/loadres")
+    public String loadres(@RequestParam Integer functionid, Model model) {
+        TFunction function = functionService.getFunctionById(functionid);
+        List<TResource> resources = functionService.getResources(functionid);
+        model.addAttribute("function", function);
+        model.addAttribute("resources", resources);
+        return "system/function/reslist";
+    }
+    @GetMapping("/function/reslist")
+    @ResponseBody
+    public PageResult<TResource> reslist(@RequestParam Integer functionid, Model model) {
+        List<TResource> resources = functionService.getResources(functionid);
+        return new PageResult<TResource>(resources);
+    }
+    @GetMapping("/function/loadresadd")
+    public String loadresadd(Model model) {
+        List<TFunction> functionList = functionService.getLeafFunction();
+        model.addAttribute("list", functionList);
+        return "system/function/resform";
+    }
+
+    @PostMapping("/function/addres")
+    @ResponseBody
+    public JsonResult addres(@RequestBody TResource resource) {
+        if (resource != null) {
+            return functionService.saveRes(resource);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+    @GetMapping("/function/editres")
+    public String loadresadd(@RequestParam Integer resid,Model model) {
+        List<TFunction> functionList = functionService.getLeafFunction();
+        model.addAttribute("list", functionList);
+        return "system/function/resform";
+    }
+    @PostMapping("/function/delres")
+    @ResponseBody
+    public JsonResult delres(@RequestParam Integer resid) {
+        return functionService.deleteResource(resid);
+    }
 }
index 4fb7b2b..d7c1faa 100644 (file)
@@ -1,18 +1,86 @@
 package com.supwisdom.dlpay.system.controller;
 
-
+import com.supwisdom.dlpay.consume.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TFunction;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.system.service.FunctionService;
+import com.supwisdom.dlpay.system.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
 
 @Controller
-@RequestMapping("/role")
 public class RoleController {
+    @Autowired
+    private RoleService roleService;
+    @Autowired
+    private FunctionService functionService;
+
+    @GetMapping("/role/index")
+    public String indexView() {
+        return "system/role/index";
+    }
+
+    @GetMapping("/role/list")
+    @ResponseBody
+    public PageResult<TRole> getDataList(@RequestParam("page") Integer pageNo,
+                                         @RequestParam("limit") Integer pageSize,
+                                         @RequestParam(value = "searchkey", required = false) String searchKey) {
+        try {
+            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+            FunctionSearchBean searchBean = new FunctionSearchBean();
+            searchBean.setPageNo(pageNo);
+            searchBean.setFunctioname(searchKey);
+            searchBean.setPageSize(pageSize);
+            return roleService.getRolesByKey(searchBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new PageResult<>(99, "系统查询错误");
+        }
+    }
+
+    @GetMapping("/role/loadadd")
+    public String loadadd() {
+        return "system/role/form";
+    }
+
+    @PostMapping("/role/add")
+    @ResponseBody
+    public JsonResult add(@RequestBody TRole role) {
+        if (role != null) {
+            return roleService.saveRole(role);
+        } else {
+            return JsonResult.error("添加失败");
+        }
+    }
+
+    @GetMapping("/role/loadfunc")
+    public String loadfunc() {
+        return "system/role/func";
+    }
 
-  @GetMapping("/index")
-  public String indexView(Model model) {
-    return "system/role/index";
-  }
+    @PostMapping("/role/addfunc")
+    @ResponseBody
+    public JsonResult addfunc(@RequestParam String roleId,
+                              @RequestParam String funcs) {
+        return roleService.saveRoleFuncId(roleId, funcs);
+    }
 
+    @GetMapping("/role/func")
+    @ResponseBody
+    public JsonResult func(@RequestParam String roleId) {
+        List<ZTreeNode> nodes = roleService.findByRoleIdNative(roleId);
+        JsonResult result = JsonResult.ok();
+        result.put("node", nodes);
+        return result;
+    }
 }
index 55cc2aa..f3b07be 100644 (file)
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.system.service;
 
+import com.supwisdom.dlpay.consume.bean.JsonResult;
 import com.supwisdom.dlpay.framework.domain.TFunction;
+import com.supwisdom.dlpay.framework.domain.TResource;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
 
@@ -10,7 +12,25 @@ import java.util.Map;
 public interface FunctionService {
   List<TFunction> getFunctionsByOperid(String operid);
 
-  List<Map<String, Object>> getMenuTree(List<TFunction> funcList, String parentId);
+  List<Map<String, Object>> getMenuTree(List<TFunction> funcList, Integer parentId);
 
   PageResult<TFunction> getFunctionsByKey(FunctionSearchBean param);
+
+  TFunction getFunctionByNameAndId(String name,Integer id);
+
+  JsonResult saveFunction(TFunction function);
+
+  TFunction getFunctionById(Integer id);
+
+  JsonResult deleteFunction(Integer funcid);
+
+  List<TFunction> getParentFunction();
+
+  List<TResource> getResources(Integer function);
+
+  List<TFunction> getLeafFunction();
+
+  JsonResult saveRes(TResource resource);
+
+  JsonResult deleteResource(Integer resid);
 }
index e4b8082..3d47b83 100644 (file)
@@ -1,8 +1,13 @@
 package com.supwisdom.dlpay.system.service;
 
+import com.supwisdom.dlpay.consume.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TPermission;
 import com.supwisdom.dlpay.framework.domain.TResource;
 import com.supwisdom.dlpay.framework.domain.TRole;
 import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
 
 import java.util.List;
 
@@ -13,5 +18,19 @@ public interface RoleService {
 
     TResource findResourceByURI(String uri);
 
-    TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, String functionid);
+    TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, Integer functionid);
+
+    PageResult<TRole> getRolesByKey(FunctionSearchBean param);
+
+    JsonResult saveRole(TRole role);
+
+    List<TRoleFunction> getRoleFuncByRoleid(String roleId);
+
+    List<TPermission> findByRoleFuncId(String roleFuncId);
+
+    TPermission findByRoleFuncIdAndResid(String roleFuncId, Integer resid);
+
+    JsonResult saveRoleFuncId(String roleId, String funcs);
+
+    List<ZTreeNode> findByRoleIdNative(String roleId);
 }
index 41b1460..2e394b1 100644 (file)
@@ -1,7 +1,11 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.consume.bean.JsonResult;
 import com.supwisdom.dlpay.framework.dao.FunctionDao;
+import com.supwisdom.dlpay.framework.dao.ResourceDao;
+import com.supwisdom.dlpay.framework.dao.RoleFunctionDao;
 import com.supwisdom.dlpay.framework.domain.TFunction;
+import com.supwisdom.dlpay.framework.domain.TResource;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
@@ -21,6 +25,10 @@ import java.util.Map;
 public class FunctionServiceImpl implements FunctionService {
     @Autowired
     private FunctionDao functionDao;
+    @Autowired
+    private ResourceDao resourceDao;
+    @Autowired
+    private RoleFunctionDao roleFunctionDao;
 
     @Override
     public List<TFunction> getFunctionsByOperid(String operid) {
@@ -30,7 +38,7 @@ public class FunctionServiceImpl implements FunctionService {
     }
 
     @Override
-    public List<Map<String, Object>> getMenuTree(List<TFunction> funcList, String parentId) {
+    public List<Map<String, Object>> getMenuTree(List<TFunction> funcList, Integer parentId) {
         List<Map<String, Object>> list = new ArrayList<>(0);
         for (TFunction func : funcList) {
             if (parentId.equals(func.getParentId())) {
@@ -58,4 +66,76 @@ public class FunctionServiceImpl implements FunctionService {
         }
         return new PageResult<>(functionDao.findAll(pageable));
     }
+
+    @Override
+    public TFunction getFunctionByNameAndId(String name, Integer id) {
+        if (id != null && id != 0) {
+            return functionDao.findByNameAndIdNot(name, id);
+        }
+        return functionDao.findByName(name);
+    }
+
+    @Override
+    public JsonResult saveFunction(TFunction function) {
+        TFunction temp = getFunctionByNameAndId(function.getName(), function.getId());
+        if (temp != null) {
+            return JsonResult.error("功能名称重复");
+        }
+        if (function.getParentId() == null) {
+            function.setParentId(-1);
+        }
+        functionDao.save(function);
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public TFunction getFunctionById(Integer id) {
+        return functionDao.getOne(id);
+    }
+
+    @Override
+    public List<TFunction> getParentFunction() {
+        return functionDao.findByIsLeaf(0);
+    }
+
+    @Override
+    public List<TResource> getResources(Integer function) {
+        return resourceDao.findByFunctionId(function);
+    }
+
+    @Override
+    public List<TFunction> getLeafFunction() {
+        return functionDao.findByIsLeaf(1);
+    }
+
+    @Override
+    public JsonResult saveRes(TResource resource) {
+        if (resource.getId() != null && resource.getId() != 0) {
+            TResource temp = resourceDao.findByUriAndIdNot(resource.getUri(), resource.getId());
+            if (temp != null) {
+                return JsonResult.error("资源路径已存在");
+            }
+        } else {
+            TResource temp = resourceDao.findByUri(resource.getUri());
+            if (temp != null) {
+                return JsonResult.error("资源路径已存在");
+            }
+        }
+        resourceDao.save(resource);
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public JsonResult deleteResource(Integer resid) {
+        resourceDao.deleteById(resid);
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public JsonResult deleteFunction(Integer funcid) {
+        resourceDao.deleteByFunctionId(funcid);
+        roleFunctionDao.deleteByFunctionId(funcid);
+        functionDao.deleteById(funcid);
+        return JsonResult.ok("成功");
+    }
 }
index f78b052..4796efa 100644 (file)
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.consume.bean.JsonResult;
+import com.supwisdom.dlpay.framework.dao.PermissionDao;
 import com.supwisdom.dlpay.framework.dao.ResourceDao;
 import com.supwisdom.dlpay.framework.dao.RoleDao;
 import com.supwisdom.dlpay.framework.dao.RoleFunctionDao;
+import com.supwisdom.dlpay.framework.data.NodeData;
+import com.supwisdom.dlpay.framework.domain.TPermission;
 import com.supwisdom.dlpay.framework.domain.TResource;
 import com.supwisdom.dlpay.framework.domain.TRole;
 import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
 import com.supwisdom.dlpay.system.service.RoleService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
 @Service
 public class RoleServiceImpl implements RoleService {
-  @Autowired
-  private RoleDao roleDao;
-
-  @Autowired
-  private ResourceDao resourceDao;
-
-  @Autowired
-  private RoleFunctionDao roleFunctionDao;
-
-  @Override
-  public List<TRole> findAllRoles() {
-    List<TRole> list = roleDao.getAllRoles();
-    if(!StringUtil.isEmpty(list)) return list;
-    return new ArrayList<>(0);
-  }
-
-  @Override
-  public TRole findRoleByRolecode(String rolecode) {
-    return roleDao.findByRoleCode(rolecode);
-  }
-
-  @Override
-  public TResource findResourceByURI(String uri) {
-    return resourceDao.findByUri(uri);
-  }
-
-  @Override
-  public TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, String functionid) {
-    return roleFunctionDao.findByRoleIdAndFunctionId(roleid,functionid);
-  }
+    @Autowired
+    private RoleDao roleDao;
+
+    @Autowired
+    private ResourceDao resourceDao;
+
+    @Autowired
+    private RoleFunctionDao roleFunctionDao;
+
+    @Autowired
+    private PermissionDao permissionDao;
+
+    @Override
+    public List<TRole> findAllRoles() {
+        List<TRole> list = roleDao.getAllRoles();
+        if (!StringUtil.isEmpty(list)) return list;
+        return new ArrayList<>(0);
+    }
+
+    @Override
+    public TRole findRoleByRolecode(String rolecode) {
+        return roleDao.findByRoleCode(rolecode);
+    }
+
+    @Override
+    public TResource findResourceByURI(String uri) {
+        return resourceDao.findByUri(uri);
+    }
+
+    @Override
+    public TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, Integer functionid) {
+        return roleFunctionDao.findByRoleIdAndFunctionId(roleid, functionid);
+    }
+
+    @Override
+    public PageResult<TRole> getRolesByKey(FunctionSearchBean param) {
+        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+                , Sort.by("createtime"));
+        if (!StringUtil.isEmpty(param.getFunctioname())) {
+            return new PageResult<>(roleDao.findAllByRoleNameContaining(param.getFunctioname(), pageable));
+        }
+        return new PageResult<>(roleDao.findAll(pageable));
+    }
+
+    @Override
+    public JsonResult saveRole(TRole role) {
+        if (!StringUtil.isEmpty(role.getRoleId())) {
+            TRole temp = roleDao.findByRoleNameAndRoleIdNot(role.getRoleName(), role.getRoleId());
+            if (temp != null) {
+                return JsonResult.error("角色名称已存在");
+            }
+            Optional<TRole> opt = roleDao.findById(role.getRoleId());
+            if (opt == null || !opt.isPresent()) {
+                return JsonResult.error("角色已被删除");
+            }
+            temp = opt.get();
+            temp.setRoleName(role.getRoleName());
+            temp.setRoleDesc(role.getRoleDesc());
+            temp.setLastsaved(DateUtil.getNow());
+            roleDao.save(temp);
+        } else {
+            TRole temp = roleDao.findByRoleName(role.getRoleName());
+            if (temp != null) {
+                return JsonResult.error("角色名称已存在");
+            }
+            role.setCreatetime(DateUtil.getNow());
+            role.setEditflag(1);
+            role.setRoleCode("ROLE_ADMIN");
+            roleDao.save(role);
+        }
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public List<TRoleFunction> getRoleFuncByRoleid(String roleId) {
+        return roleFunctionDao.findByRoleId(roleId);
+    }
+
+
+    @Override
+    public List<TPermission> findByRoleFuncId(String roleFuncId) {
+        return permissionDao.findByRoleFuncId(roleFuncId);
+    }
+
+    @Override
+    public TPermission findByRoleFuncIdAndResid(String roleFuncId, Integer resid) {
+        return permissionDao.findByRoleFuncIdAndResid(roleFuncId, resid);
+    }
+
+    @Override
+    public JsonResult saveRoleFuncId(String roleId, String funcs) {
+        Optional<TRole> ret = roleDao.findById(roleId);
+        if (ret == null || !ret.isPresent()) {
+            return JsonResult.error("角色不存在");
+        }
+        roleFunctionDao.deleteByRoleId(roleId);
+        permissionDao.deleteByRoleId(roleId);
+        String[] datas = funcs.split(",");
+        for (String func : datas) {
+            if (func.contains("_res")) {
+                String id = func.replace("_res", "");
+                TPermission permission = new TPermission();
+                permission.setResid(Integer.valueOf(id));
+                permission.setRoleId(roleId);
+                permissionDao.save(permission);
+            } else {
+                TRoleFunction roleFunction = new TRoleFunction();
+                roleFunction.setFunctionId(Integer.valueOf(func));
+                roleFunction.setRoleId(roleId);
+                roleFunctionDao.save(roleFunction);
+            }
+        }
+        return JsonResult.ok("成功");
+    }
+
+    @Override
+    public List<ZTreeNode> findByRoleIdNative(String roleId) {
+        List<NodeData> nodeData = roleFunctionDao.findByRoleIdNative(roleId);
+        List<ZTreeNode> ret = new ArrayList<>();
+        for (NodeData data : nodeData) {
+            ZTreeNode zTreeNode = new ZTreeNode();
+            zTreeNode.setpId(data.getPid());
+            zTreeNode.setId(data.getId());
+            zTreeNode.setName(data.getName());
+            zTreeNode.setChecked(data.getChecked() == 0 ? false : true);
+            zTreeNode.setOpen(true);
+            ret.add(zTreeNode);
+        }
+        return ret;
+    }
 }
index 24afe10..10f6603 100644 (file)
@@ -199,7 +199,7 @@ class WebMainController {
     fun menuView(@AuthenticationPrincipal operUser: UserDetails, model: Model): String {
         model.addAttribute("loginOper", operUser as TOperator)
         val funclist = functionService.getFunctionsByOperid(operUser.operid)
-        model.addAttribute("menus", functionService.getMenuTree(funclist, "-1"))
+        model.addAttribute("menus", functionService.getMenuTree(funclist, -1))
         model.addAttribute("payapiVersion", commonService.getSystemVersion())
         return "index"
     }
index 344c44d..334e29e 100755 (executable)
@@ -89,24 +89,26 @@ layui.define(['layer'], function (exports) {
             return layer.open(param);\r
         },\r
         \r
-        go:function(url,data,success){\r
+        go:function(url,data,success,error){\r
                  $.ajax({\r
                          url: url,\r
                          data: data,\r
                          async: false,\r
                          dataType: 'json',\r
                          type: 'post',\r
-                          success: success\r
+                         success: success,\r
+                  error:error\r
                  })\r
         },\r
-        dgo:function(url,data,success){\r
+        dgo:function(url,data,success,error){\r
          $.ajax({\r
                  url: url,\r
                  data: data,\r
                  async: false,\r
                  dataType: 'json',\r
                  type: 'get',\r
-                  success: success\r
+                 success: success,\r
+              error:error\r
          })\r
       },\r
         // 封装ajax请求,返回数据类型为json\r
index cd67f9f..94ef8cc 100755 (executable)
-<div class="layui-form" lay-filter="layuiadmin-form-role" id="function-form" style="padding: 20px 30px 0 0;">\r
+<!-- operator表单弹窗 -->\r
+<form id="form" lay-filter="form" class="layui-form model-form">\r
+    <input name="id" id="id" type="hidden"/>\r
     <div class="layui-form-item">\r
-        <label class="layui-form-label">角色</label>\r
+        <label class="layui-form-label">功能名称</label>\r
         <div class="layui-input-block">\r
-            <select name="rolename">\r
-                <option value="0">管理员</option>\r
-                <option value="1">超级管理员</option>\r
-                <option value="2">纠错员</option>\r
-                <option value="3">采购员</option>\r
-                <option value="4">推销员</option>\r
-                <option value="5">运营人员</option>\r
-                <option value="6">编辑</option>\r
-            </select>\r
+            <input name="name" placeholder="请输入功能名称" type="text" class="layui-input" maxlength="20"\r
+                   lay-verify="required|name" required/>\r
         </div>\r
     </div>\r
     <div class="layui-form-item">\r
-        <label class="layui-form-label">权限范围</label>\r
+        <label class="layui-form-label">路径</label>\r
         <div class="layui-input-block">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="内容系统">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="社区系统">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="用户">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="角色">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="评论审核">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="发货">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="采购">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="系统设置">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="发邮件">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="发短信">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="审核">\r
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="删库跑路">\r
+            <input name="menuUrl" placeholder="请输入路径,父节点默认为 # " type="text" class="layui-input" maxlength="60" value="#" lay-verify="required" required/>\r
         </div>\r
     </div>\r
     <div class="layui-form-item">\r
-        <label class="layui-form-label">具体描述</label>\r
+        <label class="layui-form-label">节点</label>\r
         <div class="layui-input-block">\r
-            <textarea type="text" name="descr" lay-verify="required" autocomplete="off"\r
-                      class="layui-textarea"></textarea>\r
+            <input type="radio" name="isLeaf" value="0" title="父" checked/>\r
         </div>\r
     </div>\r
-    <div class="layui-form-item layui-hide">\r
-        <button class="layui-btn" lay-submit lay-filter="LAY-user-role-submit" id="LAY-user-role-submit">提交</button>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">序号</label>\r
+        <div class="layui-input-block">\r
+            <input name="orderNum" placeholder="请输入序号" type="text" class="layui-input" />\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">图标</label>\r
+        <div class="layui-input-block">\r
+            <input name="menuIcon" placeholder="请输入图标 例:layui-icon-xx " type="text" class="layui-input" />\r
+        </div>\r
+    </div>\r
+\r
+    <div class="layui-form-item model-form-footer">\r
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>\r
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>\r
     </div>\r
-</div>\r
+</form>\r
+\r
+<script>\r
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {\r
+        var layer = layui.layer;\r
+        var admin = layui.admin;\r
+        var form = layui.form;\r
+        var formSelects = layui.formSelects;\r
+        form.render('radio');\r
+        form.verify({\r
+            "name": function (e) {\r
+                var msg = "";\r
+                $.ajax({\r
+                    type: "GET",\r
+                    url: '/function/checkname',\r
+                    async: false,\r
+                    data: {\r
+                        name: e,\r
+                        id: $("#id").val()\r
+                    },\r
+                    success: function (result) {\r
+                        if (result.code != 200) {\r
+                            msg = result.msg;\r
+                        }\r
+                    },\r
+                    error: function (error) {\r
+                        msg = "请求服务器校验账号失败";\r
+                    }\r
+                });\r
+            }\r
+        });\r
+\r
+        var url = '/function/add';\r
+        // 回显user数据\r
+        var func = admin.getTempData('t_func');\r
+        if (func) {\r
+            $('input[name="id"]').attr('readonly', 'readonly');\r
+            form.val('form', func);\r
+        }\r
+        // 表单提交事件\r
+        form.on('submit(form-submit)', function (data) {\r
+            layer.load(2);\r
+            let token = $("meta[name='_csrf_token']").attr("value");\r
+            debugger\r
+            $.ajax({\r
+                type : "POST",\r
+                dataType : "json",\r
+                url : url,\r
+                headers: {\r
+                    'Accept': 'application/json',\r
+                    'Content-Type': 'application/json',\r
+                    'X-CSRF-TOKEN':token,\r
+                },\r
+                data : JSON.stringify(data.field),\r
+                success : function(result) {\r
+                    layer.closeAll('loading');\r
+                    if (result.code == 200) {\r
+                        layer.msg(result.msg, {icon: 1});\r
+                        admin.finishPopupCenter();\r
+                    } else if (result.code == 401) {\r
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {\r
+                            location.replace('/login');\r
+                        }, 1000);\r
+                        return;\r
+                    } else {\r
+                        console.log('err:' + result.code);\r
+                        layer.msg(result.msg, {icon: 2});\r
+                    }\r
+                },\r
+                error : function() {\r
+                    layer.closeAll('loading');\r
+                    layer.msg("请求服务器失败!", {icon: 2});\r
+                }\r
+            });\r
+            return false;\r
+        });\r
+    });\r
+</script>
\ No newline at end of file
index afcda4c..245090c 100755 (executable)
         <div class="layui-form toolbar">\r
             搜索:\r
             <input id="search-value" class="layui-input search-input" type="text" placeholder="输入功能名称"/>&emsp;\r
-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索</button>\r
-            <button id="btn-add" class="layui-btn icon-btn" data-type="add" ><i class="layui-icon"></i>添加\r
+            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索\r
             </button>\r
+            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加父功能</button>\r
         </div>\r
-        <table class="layui-table" id="table"></table>\r
+        <table class="layui-table" id="table" lay-filter="table"></table>\r
     </div>\r
 </div>\r
 \r
-<!-- 表格操作列 -->\r
-<script type="text/html" id="table-bar">\r
-    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>\r
-    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-set-sm"></i>维护资源</a>\r
-    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>\r
-</script>\r
-\r
 <script>\r
     layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {\r
-        var form = layui.form;\r
-        var table = layui.table;\r
-        var layer = layui.layer;\r
-        var admin = layui.admin;\r
-        var element = layui.element;\r
+        let form = layui.form;\r
+        let table = layui.table;\r
+        let admin = layui.admin;\r
 \r
         form.render('select');\r
 \r
@@ -42,7 +33,7 @@
             page: true,\r
             cols: [\r
                 [\r
-                    {field: 'id', title: '功能ID', fixed: 'left', sort: true},\r
+                    {field: 'id', title: '功能ID', width: 80,fixed: 'left', sort: true},\r
                     {field: 'name', title: '功能名称', sort: true},\r
                     {\r
                         field: 'isLeaf', title: '节点', sort: true, width: 80, align: 'center', templet: function (item) {\r
                         }\r
                     },\r
                     {field: 'menuUrl', title: '路径'},\r
-                    {field: 'orderNum', sort: true, title: '序号'},\r
-                    {field: 'menuIcon', title: '图标',align: 'center', templet: function (item) {\r
-                            return '<i class="layui-icon '+item.menuIcon+'"></i> '\r
+                    {field: 'orderNum', sort: true, width: 80,title: '序号'},\r
+                    {\r
+                        field: 'menuIcon', title: '图标', width: 80,align: 'center', templet: function (item) {\r
+                            return '<i class="layui-icon ' + item.menuIcon + '"></i> '\r
                         }\r
                     },\r
-                    {field:'id',align: 'center', toolbar: '#table-bar', title: '操作', fixed: 'right'}\r
+                    {\r
+                        field: 'id', align: 'center', title: '操作', fixed: 'right', templet: function (item) {\r
+                            if (item.isLeaf == 0) {\r
+                                return ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +\r
+                                    ' <a class="layui-btn layui-btn-normal  layui-btn-xs" lay-event="addsub"><i class="layui-icon layui-icon-set-sm"></i>添加子功能</a> ' +\r
+                                    ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'\r
+                            } else {\r
+                                return ' <a class="layui-btn  layui-btn-xs" lay-event="editsub"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +\r
+                                    ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="addres"><i class="layui-icon layui-icon-set-sm"></i>添加资源</a> ' +\r
+                                    ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="listres"><i class="layui-icon layui-icon-set-sm"></i>维护资源</a> ' +\r
+                                    ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'\r
+                            }\r
+                        }\r
+                    }\r
                 ]\r
             ]\r
         });\r
         // 搜索按钮点击事件\r
         $('#btn-search').click(function () {\r
-            var key = $('#search-value').val();\r
+            let key = $('#search-value').val();\r
             table.reload('table', {where: {searchkey: key}, page: {curr: 1}});\r
         });\r
         $('#btn-add').click(function () {\r
-            layer.open({\r
-                type: 1\r
-                ,title: '添加功能'\r
-                ,content: 'form.html'\r
-                ,maxmin: true\r
-                ,area: ['500px', '450px']\r
-                ,btn: ['确定', '取消']\r
-                ,yes: function(index, layero){\r
-                    var iframeWindow = window['layui-layer-iframe'+ index]\r
-                        ,submitID = 'LAY-user-front-submit'\r
-                        ,submit = layero.find('iframe').contents().find('#'+ submitID);\r
-\r
-                    //监听提交\r
-                    iframeWindow.layui.form.on('submit('+ submitID +')', function(data){\r
-                        var field = data.field; //获取提交的字段\r
-                        //提交 Ajax 成功后,静态更新表格中的数据\r
-                        //$.ajax({});\r
-                        table.reload('table');\r
-                        layer.close(index); //关闭弹层\r
-                    });\r
-\r
-                    submit.trigger('click');\r
+            showModel();\r
+        });\r
+        let showModel = function (data) {\r
+            let title = data ? '编辑父功能' : '添加父功能';\r
+            admin.putTempData('t_func', data);\r
+            admin.popupCenter({\r
+                title: title,\r
+                path: '/function/loadadd',\r
+                finish: function () {\r
+                    table.reload('table', {});\r
                 }\r
             });\r
-        });\r
-        // 显示表单弹窗\r
-        var showEditModel = function (data) {\r
-            var title = data ? '修改用户' : '添加用户';\r
-            admin.putTempData('t_user', data);\r
+        };\r
+        let showModelSub = function (data,parentid) {\r
+            let title = data ? '编辑子功能' : '添加子功能';\r
+            admin.putTempData('parentId', parentid);\r
+            admin.putTempData('t_func', data);\r
             admin.popupCenter({\r
                 title: title,\r
-                path: '/operator/load4add',\r
+                path: '/function/loadsubadd',\r
                 finish: function () {\r
-                    table.reload('oper-table', {});\r
+                    table.reload('table', {});\r
                 }\r
             });\r
         };\r
 \r
+        let showResModel = function (functionid) {\r
+            let title = '维护资源';\r
+            admin.putTempData('functionid', functionid);\r
+            admin.popupCenter({\r
+                title: title,\r
+                area:'70%',\r
+                path: '/function/loadres?functionid='+functionid\r
+            });\r
+        };\r
+        let showAddResModelSub = function (functionid) {\r
+            let title = '添加资源';\r
+            admin.putTempData('functionid', functionid);\r
+            admin.popupCenter({\r
+                title: title,\r
+                path: '/function/loadresadd',\r
+                finish: function () {\r
+                    table.reload('table', {});\r
+                }\r
+            });\r
+        };\r
         // 工具条点击事件\r
-        table.on('tool(user-table)', function (obj) {\r
-            console.log(obj);\r
-            var data = obj.data;\r
-            var layEvent = obj.event;\r
-\r
-            if (layEvent === 'edit') { // 修改\r
-                showEditModel(data);\r
-            } else if (layEvent === 'reset') { // 重置密码\r
-                layer.confirm('确定重置此用户的密码吗?', function (i) {\r
-                    layer.close(i);\r
-                    layer.load(2);\r
-                    admin.go('/system/user/restPsw', {\r
-                        userId: obj.data.userId\r
-                    }, function (data) {\r
-                        console.log(data.code);\r
-                        layer.closeAll('loading');\r
-                        if (data.code == 200) {\r
-                            layer.msg(data.msg, {icon: 1});\r
-                        } else if (data.code == 401) {\r
-                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {\r
-                                location.replace('/login');\r
-                            }, 1000);\r
-                            return;\r
-                        }\r
-                        else {\r
-                            layer.msg(data.msg, {icon: 2});\r
-                        }\r
-                    });\r
-                });\r
+        table.on('tool(table)', function (obj) {\r
+            let data = obj.data;\r
+            let layEvent = obj.event;\r
+            console.log(data);\r
+            if (layEvent === 'edit') {\r
+                showModel(data);\r
+            } else if (layEvent === 'addsub') {\r
+                showModelSub(null,data.id);\r
+            } else if (layEvent === 'editsub') {\r
+                showModelSub(data,data.parentId);\r
+            } else if (layEvent === 'del') {\r
+                showDelete(data);\r
+            } else if(layEvent === 'listres'){\r
+                showResModel(data.id);\r
+            } else if(layEvent === 'addres'){\r
+                showAddResModelSub(data.id);\r
             }\r
         });\r
-\r
-        // 修改user状态\r
-        form.on('switch(user-tpl-state)', function (obj) {\r
-            layer.load(2);\r
-            admin.go('/system/user/updateState', {\r
-                userId: obj.elem.value,\r
-                state: obj.elem.checked ? 0 : 1\r
-            }, function (data) {\r
-                layer.closeAll('loading');\r
-                if (data.code == 200) {\r
-                    layer.msg(data.msg, {icon: 1});\r
-                    //table.reload('table-user', {});\r
-                } else if (data.code == 401) {\r
-                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {\r
-                        location.replace('/login');\r
-                    }, 1000);\r
-                    return;\r
-                } else {\r
-                    layer.msg(data.msg, {icon: 2});\r
-                    $(obj.elem).prop('checked', !obj.elem.checked);\r
-                    form.render('checkbox');\r
-                }\r
+        let showDelete = function (data) {\r
+            layer.confirm('确定删除吗,该功能下的子功能、资源、角色分配的该功能都将被删除?', function (i) {\r
+                layer.close(i);\r
+                layer.load(2);\r
+                let token = $("meta[name='_csrf_token']").attr("value");\r
+                admin.go('/function/delfunc', {\r
+                    funcid: data.id,\r
+                    _csrf:token\r
+                }, function (data) {\r
+                    console.log(data.code);\r
+                    layer.closeAll('loading');\r
+                    if (data.code == 200) {\r
+                        layer.msg(data.msg, {icon: 1});\r
+                    } else if (data.code == 401) {\r
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {\r
+                            location.replace('/login');\r
+                        }, 1000);\r
+                        return;\r
+                    }\r
+                    else {\r
+                        layer.msg(data.msg, {icon: 2});\r
+                    }\r
+                    table.reload('table', {});\r
+                },function(ret){\r
+                    console.log(ret);\r
+                    layer.closeAll('loading');\r
+                    layer.msg('请求失败了,请稍后再试', {icon: 2});\r
+                });\r
             });\r
-        });\r
-\r
+        }\r
     });\r
 </script>\r
diff --git a/src/main/resources/templates/system/function/resform.html b/src/main/resources/templates/system/function/resform.html
new file mode 100755 (executable)
index 0000000..78f7747
--- /dev/null
@@ -0,0 +1,94 @@
+<!-- operator表单弹窗 -->\r
+<form id="resform" lay-filter="resform" class="layui-form model-form">\r
+    <input name="id" id="id" type="hidden"/>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">资源名称</label>\r
+        <div class="layui-input-block">\r
+            <input name="name" placeholder="请输入资源名称" type="text" class="layui-input" maxlength="60"\r
+                   lay-verify="required|name" required/>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">路径</label>\r
+        <div class="layui-input-block">\r
+            <input name="uri" placeholder="请输入资源路径 " type="text" class="layui-input" maxlength="100"\r
+                   lay-verify="required" required/>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">所属功能</label>\r
+        <div class="layui-input-block">\r
+            <select name="functionId" id="functionId" lay-verify="required">\r
+                <option th:each="func : ${list}" th:value="${func.id}">[[${func.name}]]</option>\r
+            </select>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">代码</label>\r
+        <div class="layui-input-block">\r
+            <input name="code" placeholder="请输入代码" type="text" class="layui-input"/>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item model-form-footer">\r
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>\r
+        <button class="layui-btn" lay-filter="resform-submit" lay-submit id="submitbtn">保存</button>\r
+    </div>\r
+</form>\r
+\r
+<script>\r
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {\r
+        var layer = layui.layer;\r
+        var admin = layui.admin;\r
+        var form = layui.form;\r
+        form.render('select');\r
+        form.render('radio');\r
+        var url = '/function/addres';\r
+        // 回显user数据\r
+        var func = admin.getTempData('t_res');\r
+        if (func) {\r
+            $('input[name="id"]').attr('readonly', 'readonly');\r
+            form.val('resform', func);\r
+        }\r
+        let functionid = admin.getTempData("functionid");\r
+        if (functionid) {\r
+            form.val('resform', {"functionId": functionid});\r
+        }\r
+        // 表单提交事件\r
+        form.on('submit(resform-submit)', function (data) {\r
+            layer.load(2);\r
+            let token = $("meta[name='_csrf_token']").attr("value");\r
+            debugger\r
+            $.ajax({\r
+                type: "POST",\r
+                dataType: "json",\r
+                url: url,\r
+                headers: {\r
+                    'Accept': 'application/json',\r
+                    'Content-Type': 'application/json',\r
+                    'X-CSRF-TOKEN': token,\r
+                },\r
+                data: JSON.stringify(data.field),\r
+                success: function (result) {\r
+                    layer.closeAll('loading');\r
+                    if (result.code == 200) {\r
+                        layer.msg(result.msg, {icon: 1});\r
+                        admin.finishPopupCenter();\r
+                    } else if (result.code == 401) {\r
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {\r
+                            location.replace('/login');\r
+                        }, 1000);\r
+                        return;\r
+                    } else {\r
+                        console.log('err:' + result.code);\r
+                        layer.msg(result.msg, {icon: 2});\r
+                    }\r
+                },\r
+                error: function () {\r
+                    layer.closeAll('loading');\r
+                    layer.msg("请求服务器失败!", {icon: 2});\r
+                }\r
+            });\r
+            return false;\r
+        });\r
+    });\r
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/function/reslist.html b/src/main/resources/templates/system/function/reslist.html
new file mode 100755 (executable)
index 0000000..d95cbfe
--- /dev/null
@@ -0,0 +1,90 @@
+<div style="padding:20px;">\r
+    <table class="layui-table" id="restable" lay-filter="restable">\r
+    </table>\r
+    <input type="hidden" id="functionid" th:value="${function.id}">\r
+    <input type="hidden" id="functionname" th:value="${function.name}">\r
+</div>\r
+<script>\r
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {\r
+        let form = layui.form;\r
+        let admin = layui.admin;\r
+        form.render('select');\r
+        let table = layui.table;\r
+        let func = admin.getTempData('functionid');\r
+        table.render({\r
+            elem: '#restable',\r
+            url: '/function/reslist?functionid=' + func,\r
+            cols: [\r
+                [\r
+                    {field: 'id', title: '资源ID', width: 80, fixed: 'left', sort: true},\r
+                    {field: 'name', title: '资源名称', sort: true},\r
+                    {\r
+                        field: 'functionId', title: '所属功能', sort: true, align: 'center', templet: function (item) {\r
+                            return $("#functionname").val();\r
+                        }\r
+                    },\r
+                    {field: 'uri', title: '路径'},\r
+                    {field: 'code', sort: true, width: 80, title: '代码'},\r
+                    {\r
+                        field: 'id', align: 'center', title: '操作',  templet: function (item) {\r
+                            return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'\r
+                        }\r
+                    }\r
+                ]\r
+            ]\r
+        });\r
+        // 工具条点击事件\r
+        table.on('tool(restable)', function (obj) {\r
+            let data = obj.data;\r
+            let layEvent = obj.event;\r
+            console.log(data);\r
+            if (layEvent === 'edit') {\r
+                showAddResModelSub(data);\r
+            } else if (layEvent === 'del') {\r
+                showDelete(data);\r
+            }\r
+        });\r
+        let showAddResModelSub = function (data) {\r
+            let title = '编辑资源';\r
+            admin.putTempData('functionid', $("#functionid").val());\r
+            admin.putTempData('t_data',data);\r
+            admin.popupCenter({\r
+                title: title,\r
+                path: '/function/loadresadd',\r
+                finish: function () {\r
+                    table.reload('table', {});\r
+                }\r
+            });\r
+        };\r
+        let showDelete = function (data) {\r
+            layer.confirm('确定删除吗?', function (i) {\r
+                layer.close(i);\r
+                layer.load(2);\r
+                let token = $("meta[name='_csrf_token']").attr("value");\r
+                admin.go('/function/delres', {\r
+                    resid: data.id,\r
+                    _csrf:token\r
+                }, function (data) {\r
+                    console.log(data.code);\r
+                    layer.closeAll('loading');\r
+                    if (data.code == 200) {\r
+                        layer.msg(data.msg, {icon: 1});\r
+                    } else if (data.code == 401) {\r
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {\r
+                            location.replace('/login');\r
+                        }, 1000);\r
+                        return;\r
+                    }\r
+                    else {\r
+                        layer.msg(data.msg, {icon: 2});\r
+                    }\r
+                    table.reload('restable', {});\r
+                },function(ret){\r
+                    console.log(ret);\r
+                    layer.closeAll('loading');\r
+                    layer.msg('请求失败了,请稍后再试', {icon: 2});\r
+                });\r
+            });\r
+        }\r
+    });\r
+</script>\r
diff --git a/src/main/resources/templates/system/function/subform.html b/src/main/resources/templates/system/function/subform.html
new file mode 100755 (executable)
index 0000000..def716f
--- /dev/null
@@ -0,0 +1,106 @@
+<!-- operator表单弹窗 -->\r
+<form id="form" lay-filter="subform" class="layui-form model-form">\r
+    <input name="id" id="id" type="hidden"/>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">功能名称</label>\r
+        <div class="layui-input-block">\r
+            <input name="name" placeholder="请输入功能名称" type="text" class="layui-input" maxlength="20"\r
+                   lay-verify="required|name" required/>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">路径</label>\r
+        <div class="layui-input-block">\r
+            <input name="menuUrl" placeholder="请输入路径,父节点默认为 # " type="text" class="layui-input" maxlength="60" lay-verify="required" required/>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">父功能</label>\r
+        <div class="layui-input-block">\r
+            <select name="parentId" id="parentId" lay-verify="required">\r
+                <option th:each="func : ${list}" th:value="${func.id}">[[${func.name}]]</option>\r
+            </select>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">节点</label>\r
+        <div class="layui-input-block">\r
+            <input type="radio" name="isLeaf" value="1" title="子" checked/>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">序号</label>\r
+        <div class="layui-input-block">\r
+            <input name="orderNum" placeholder="请输入序号" type="text" class="layui-input" />\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">图标</label>\r
+        <div class="layui-input-block">\r
+            <input name="menuIcon" placeholder="请输入图标 例:layui-icon-xx " type="text" class="layui-input" />\r
+        </div>\r
+    </div>\r
+\r
+    <div class="layui-form-item model-form-footer">\r
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>\r
+        <button class="layui-btn" lay-filter="subform-submit" lay-submit  id="submitbtn">保存</button>\r
+    </div>\r
+</form>\r
+\r
+<script>\r
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {\r
+        var layer = layui.layer;\r
+        var admin = layui.admin;\r
+        var form = layui.form;\r
+        form.render('select');\r
+        form.render('radio');\r
+        var url = '/function/add';\r
+        // 回显user数据\r
+        var func = admin.getTempData('t_func');\r
+        if (func) {\r
+            $('input[name="id"]').attr('readonly', 'readonly');\r
+            form.val('subform', func);\r
+        }\r
+        let parentId = admin.getTempData("parentId");\r
+        if(parentId){\r
+            form.val('form', {"parentId":parentId});\r
+        }\r
+        // 表单提交事件\r
+        form.on('submit(subform-submit)', function (data) {\r
+            layer.load(2);\r
+            let token = $("meta[name='_csrf_token']").attr("value");\r
+            debugger\r
+            $.ajax({\r
+                type : "POST",\r
+                dataType : "json",\r
+                url : url,\r
+                headers: {\r
+                    'Accept': 'application/json',\r
+                    'Content-Type': 'application/json',\r
+                    'X-CSRF-TOKEN':token,\r
+                },\r
+                data : JSON.stringify(data.field),\r
+                success : function(result) {\r
+                    layer.closeAll('loading');\r
+                    if (result.code == 200) {\r
+                        layer.msg(result.msg, {icon: 1});\r
+                        admin.finishPopupCenter();\r
+                    } else if (result.code == 401) {\r
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {\r
+                            location.replace('/login');\r
+                        }, 1000);\r
+                        return;\r
+                    } else {\r
+                        console.log('err:' + result.code);\r
+                        layer.msg(result.msg, {icon: 2});\r
+                    }\r
+                },\r
+                error : function() {\r
+                    layer.closeAll('loading');\r
+                    layer.msg("请求服务器失败!", {icon: 2});\r
+                }\r
+            });\r
+            return false;\r
+        });\r
+    });\r
+</script>
\ No newline at end of file
index 1f6dad4..14861c7 100644 (file)
             });
         };
 
-
         // 工具条点击事件
         table.on('tool(user-table)', function (obj) {
             console.log(obj);
diff --git a/src/main/resources/templates/system/role/form.html b/src/main/resources/templates/system/role/form.html
new file mode 100755 (executable)
index 0000000..0769c8c
--- /dev/null
@@ -0,0 +1,74 @@
+<!-- operator表单弹窗 -->\r
+<form id="form" lay-filter="form" class="layui-form model-form">\r
+    <input name="roleId" id="roleId" type="hidden"/>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">角色名称</label>\r
+        <div class="layui-input-block">\r
+            <input name="roleName" placeholder="请输入角色名称" type="text" class="layui-input" maxlength="20"\r
+                   lay-verify="required|roleName" required/>\r
+        </div>\r
+    </div>\r
+    <div class="layui-form-item">\r
+        <label class="layui-form-label">角色描述</label>\r
+        <div class="layui-input-block">\r
+            <textarea name="roleDesc" placeholder="请输入描述" class="layui-textarea"></textarea>\r
+        </div>\r
+    </div>\r
+\r
+    <div class="layui-form-item model-form-footer">\r
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>\r
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>\r
+    </div>\r
+</form>\r
+\r
+<script>\r
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {\r
+        var layer = layui.layer;\r
+        var admin = layui.admin;\r
+        var form = layui.form;\r
+        var url = '/role/add';\r
+        // 回显user数据\r
+        var func = admin.getTempData('t_func');\r
+        if (func) {\r
+            $('input[name="roleId"]').attr('readonly', 'readonly');\r
+            form.val('form', func);\r
+        }\r
+        // 表单提交事件\r
+        form.on('submit(form-submit)', function (data) {\r
+            layer.load(2);\r
+            let token = $("meta[name='_csrf_token']").attr("value");\r
+            debugger\r
+            $.ajax({\r
+                type : "POST",\r
+                dataType : "json",\r
+                url : url,\r
+                headers: {\r
+                    'Accept': 'application/json',\r
+                    'Content-Type': 'application/json',\r
+                    'X-CSRF-TOKEN':token,\r
+                },\r
+                data : JSON.stringify(data.field),\r
+                success : function(result) {\r
+                    layer.closeAll('loading');\r
+                    if (result.code == 200) {\r
+                        layer.msg(result.msg, {icon: 1});\r
+                        admin.finishPopupCenter();\r
+                    } else if (result.code == 401) {\r
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {\r
+                            location.replace('/login');\r
+                        }, 1000);\r
+                        return;\r
+                    } else {\r
+                        console.log('err:' + result.code);\r
+                        layer.msg(result.msg, {icon: 2});\r
+                    }\r
+                },\r
+                error : function() {\r
+                    layer.closeAll('loading');\r
+                    layer.msg("请求服务器失败!", {icon: 2});\r
+                }\r
+            });\r
+            return false;\r
+        });\r
+    });\r
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/role/func.html b/src/main/resources/templates/system/role/func.html
new file mode 100755 (executable)
index 0000000..d838bb5
--- /dev/null
@@ -0,0 +1,88 @@
+<div style="padding: 0 20px">\r
+    <div class="layui-form-item">\r
+        <ul id="funclist" class="ztree"></ul>\r
+    </div>\r
+    <div class="layui-form-item model-form-footer">\r
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>\r
+        <button class="layui-btn" lay-filter="form-submit" id="submitbtn">保存</button>\r
+    </div>\r
+</div>\r
+<script>\r
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {\r
+        var layer = layui.layer;\r
+        var admin = layui.admin;\r
+        var form = layui.form;\r
+        var func = admin.getTempData('roleId');\r
+        let initTree = function (nodes) {\r
+            let menuSetting = {\r
+                view: {\r
+                    dblClickExpand: true,\r
+                    showLine: true,\r
+                    showIcon: false\r
+                },\r
+                check: {\r
+                    enable: true,\r
+                },\r
+                data: {\r
+                    simpleData: {\r
+                        enable: true\r
+                    }\r
+                }\r
+            };\r
+            $.fn.zTree.init($("#funclist"), menuSetting, nodes);\r
+        }\r
+        admin.dgo('/role/func', {\r
+            roleId: func,\r
+        }, function (data) {\r
+            layer.closeAll('loading');\r
+            if (data.code == 200) {\r
+                initTree(data.node);\r
+            } else if (data.code == 401) {\r
+                layer.msg(data.msg, {icon: 2, time: 1500}, function () {\r
+                    location.replace('/login');\r
+                }, 1000);\r
+                return;\r
+            } else {\r
+                layer.msg(data.msg, {icon: 2});\r
+            }\r
+        }, function (ret) {\r
+            layer.closeAll('loading');\r
+            layer.msg('请求失败了,请稍后再试', {icon: 2});\r
+        });\r
+        $("#submitbtn").on('click', function (e) {\r
+            let ids = [];\r
+            let treeObj = $.fn.zTree.getZTreeObj("funclist");\r
+            let nodes = treeObj.getCheckedNodes(true);\r
+            for (let i = 0; i < nodes.length; i++) {\r
+                ids.push(nodes[i].id);//存功能ID\r
+            }\r
+            if (ids.length < 1) {\r
+                return;\r
+            }\r
+            let idStr = ids.toString();\r
+            let token = $("meta[name='_csrf_token']").attr("value");\r
+            admin.go('/role/addfunc', {\r
+                roleId: func,\r
+                funcs: idStr,\r
+                _csrf: token,\r
+            }, function (data) {\r
+                layer.closeAll('loading');\r
+                if (data.code == 200) {\r
+                    layer.msg(data.msg, {icon: 1});\r
+                    admin.finishPopupCenter();\r
+                } else if (data.code == 401) {\r
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {\r
+                        location.replace('/login');\r
+                    }, 1000);\r
+                    return;\r
+                } else {\r
+                    layer.msg(data.msg, {icon: 2});\r
+                }\r
+            }, function (ret) {\r
+                console.log(ret);\r
+                layer.closeAll('loading');\r
+                layer.msg('请求失败了,请稍后再试', {icon: 2});\r
+            });\r
+        })\r
+    });\r
+</script>
\ No newline at end of file
index df1c415..c96d529 100644 (file)
@@ -7,6 +7,111 @@
         </span>
     </div>
     <div class="layui-card-body">
-        <table class="layui-table" id="user-table" lay-filter="user-table"></table>
+        <div class="layui-form toolbar">
+            搜索:
+            <input id="search-value" class="layui-input search-input" type="text" placeholder="输入角色名称"/>&emsp;
+            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加角色</button>
+        </div>
+        <table class="layui-table" id="roletable" lay-filter="roletable"></table>
     </div>
-</div>
\ No newline at end of file
+</div>
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
+
+        form.render('select');
+
+        // 渲染表格
+        table.render({
+            elem: '#roletable',
+            url: '/role/list',
+            page: true,
+            cols: [
+                [
+                    {field: 'roleName', title: '角色名称', fixed: 'left', sort: true},
+                    {field: 'roleDesc', title: '描述'},
+                    {
+                        field: 'roleId', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            return ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +
+                                ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="addfunc"><i class="layui-icon layui-icon-set-sm"></i>分配功能</a> ' +
+                                ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+                        }
+                    }
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#btn-search').click(function () {
+            let key = $('#search-value').val();
+            table.reload('roletable', {where: {searchkey: key}, page: {curr: 1}});
+        });
+        $('#btn-add').click(function () {
+            showModel();
+        });
+        let showModel = function (data) {
+            let title = data ? '编辑角色' : '添加角色';
+            admin.putTempData('t_func', data);
+            admin.popupCenter({
+                title: title,
+                path: '/role/loadadd',
+                finish: function () {
+                    table.reload('roletable', {});
+                }
+            });
+        };
+        let showFuncModel = function (data) {
+            let title = '分配功能';
+            admin.putTempData('roleId', data.roleId);
+            admin.popupCenter({
+                title: title,
+                path: '/role/loadfunc'
+            });
+        };
+        // 工具条点击事件
+        table.on('tool(roletable)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'edit') {
+                showModel(data);
+            } else if (layEvent === 'addfunc') {
+                showFuncModel(data);
+            } else if (layEvent === 'del') {
+                showDelete(data);
+            }
+        });
+        let showDelete = function (data) {
+            layer.confirm('确定删除吗,该功能下的子功能、资源、角色分配的该功能都将被删除?', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('/role/del', {
+                    funcid: data.id,
+                    _csrf: token
+                }, function (data) {
+                    console.log(data.code);
+                    layer.closeAll('loading');
+                    if (data.code == 200) {
+                        layer.msg(data.msg, {icon: 1});
+                    } else if (data.code == 401) {
+                        layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(data.msg, {icon: 2});
+                    }
+                    table.reload('table', {});
+                }, function (ret) {
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了,请稍后再试', {icon: 2});
+                });
+            });
+        }
+    });
+</script>
\ No newline at end of file