diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
index 619a530..1e08ccb 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
@@ -10,9 +10,17 @@
 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
index 0000000..767df41
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
@@ -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);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
index 22f5c1c..d5a81c8 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
@@ -4,7 +4,16 @@
 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);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
index af771de..0baed2e 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
@@ -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 @@
 
 @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);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
index de69392..565ebe6 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
@@ -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
index 0000000..19197d3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/data/NodeData.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface NodeData {
+    String getId();
+
+    String getPid();
+
+    String getName();
+
+    boolean getOpen();
+
+    Integer getChecked();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
index 8c135e8..2f3b83c 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
@@ -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 @@
   @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
index 0000000..0d22f35
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
@@ -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;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
index 889eaca..63044cb 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
@@ -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 @@
   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 @@
     this.uri = uri;
   }
 
-  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/framework/domain/TRoleFunction.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
index a621460..c5e9f05 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
@@ -17,7 +17,7 @@
   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 @@
     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
index 0000000..9d50273
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java
@@ -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;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java b/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
index 16c598a..978819c 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
@@ -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 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 @@
             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);
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
index 4fb7b2b..d7c1faa 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
@@ -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("/index")
-  public String indexView(Model model) {
-    return "system/role/index";
-  }
+    @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";
+    }
+
+    @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;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java b/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
index 55cc2aa..f3b07be 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
@@ -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 @@
 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);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java b/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
index e4b8082..3d47b83 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
@@ -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 @@
 
     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);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
index 41b1460..2e394b1 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
@@ -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 @@
 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 @@
     }
 
     @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 @@
         }
         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("成功");
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
index f78b052..4796efa 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
@@ -1,49 +1,162 @@
 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 RoleDao roleDao;
 
-  @Autowired
-  private ResourceDao resourceDao;
+    @Autowired
+    private ResourceDao resourceDao;
 
-  @Autowired
-  private RoleFunctionDao roleFunctionDao;
+    @Autowired
+    private RoleFunctionDao roleFunctionDao;
 
-  @Override
-  public List<TRole> findAllRoles() {
-    List<TRole> list = roleDao.getAllRoles();
-    if(!StringUtil.isEmpty(list)) return list;
-    return new ArrayList<>(0);
-  }
+    @Autowired
+    private PermissionDao permissionDao;
 
-  @Override
-  public TRole findRoleByRolecode(String rolecode) {
-    return roleDao.findByRoleCode(rolecode);
-  }
+    @Override
+    public List<TRole> findAllRoles() {
+        List<TRole> list = roleDao.getAllRoles();
+        if (!StringUtil.isEmpty(list)) return list;
+        return new ArrayList<>(0);
+    }
 
-  @Override
-  public TResource findResourceByURI(String uri) {
-    return resourceDao.findByUri(uri);
-  }
+    @Override
+    public TRole findRoleByRolecode(String rolecode) {
+        return roleDao.findByRoleCode(rolecode);
+    }
 
-  @Override
-  public TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, String functionid) {
-    return roleFunctionDao.findByRoleIdAndFunctionId(roleid,functionid);
-  }
+    @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;
+    }
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index 24afe10..10f6603 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -199,7 +199,7 @@
     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"
     }
diff --git a/src/main/resources/static/custom/module/admin.js b/src/main/resources/static/custom/module/admin.js
index 344c44d..334e29e 100755
--- a/src/main/resources/static/custom/module/admin.js
+++ b/src/main/resources/static/custom/module/admin.js
@@ -89,24 +89,26 @@
             return layer.open(param);
         },
         
-        go:function(url,data,success){
+        go:function(url,data,success,error){
         	  $.ajax({
         		  url: url,
         		  data: data,
         		  async: false,
         		  dataType: 'json',
         		  type: 'post',
-        		   success: success
+        		  success: success,
+                  error:error
         	  })
         },
-        dgo:function(url,data,success){
+        dgo:function(url,data,success,error){
       	  $.ajax({
       		  url: url,
       		  data: data,
       		  async: false,
       		  dataType: 'json',
       		  type: 'get',
-      		   success: success
+      		  success: success,
+              error:error
       	  })
       },
         // 封装ajax请求，返回数据类型为json
diff --git a/src/main/resources/templates/system/function/form.html b/src/main/resources/templates/system/function/form.html
index cd67f9f..94ef8cc 100755
--- a/src/main/resources/templates/system/function/form.html
+++ b/src/main/resources/templates/system/function/form.html
@@ -1,43 +1,117 @@
-<div class="layui-form" lay-filter="layuiadmin-form-role" id="function-form" style="padding: 20px 30px 0 0;">
+<!-- operator表单弹窗 -->
+<form id="form" lay-filter="form" class="layui-form model-form">
+    <input name="id" id="id" type="hidden"/>
     <div class="layui-form-item">
-        <label class="layui-form-label">角色</label>
+        <label class="layui-form-label">功能名称</label>
         <div class="layui-input-block">
-            <select name="rolename">
-                <option value="0">管理员</option>
-                <option value="1">超级管理员</option>
-                <option value="2">纠错员</option>
-                <option value="3">采购员</option>
-                <option value="4">推销员</option>
-                <option value="5">运营人员</option>
-                <option value="6">编辑</option>
-            </select>
+            <input name="name" placeholder="请输入功能名称" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|name" required/>
         </div>
     </div>
     <div class="layui-form-item">
-        <label class="layui-form-label">权限范围</label>
+        <label class="layui-form-label">路径</label>
         <div class="layui-input-block">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="内容系统">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="社区系统">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="用户">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="角色">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="评论审核">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="发货">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="采购">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="系统设置">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="发邮件">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="发短信">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="审核">
-            <input type="checkbox" name="limits[]" lay-skin="primary" title="删库跑路">
+            <input name="menuUrl" placeholder="请输入路径，父节点默认为 # " type="text" class="layui-input" maxlength="60" value="#" lay-verify="required" required/>
         </div>
     </div>
     <div class="layui-form-item">
-        <label class="layui-form-label">具体描述</label>
+        <label class="layui-form-label">节点</label>
         <div class="layui-input-block">
-            <textarea type="text" name="descr" lay-verify="required" autocomplete="off"
-                      class="layui-textarea"></textarea>
+            <input type="radio" name="isLeaf" value="0" title="父" checked/>
         </div>
     </div>
-    <div class="layui-form-item layui-hide">
-        <button class="layui-btn" lay-submit lay-filter="LAY-user-role-submit" id="LAY-user-role-submit">提交</button>
+    <div class="layui-form-item">
+        <label class="layui-form-label">序号</label>
+        <div class="layui-input-block">
+            <input name="orderNum" placeholder="请输入序号" type="text" class="layui-input" />
+        </div>
     </div>
-</div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">图标</label>
+        <div class="layui-input-block">
+            <input name="menuIcon" placeholder="请输入图标 例:layui-icon-xx " type="text" class="layui-input" />
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var formSelects = layui.formSelects;
+        form.render('radio');
+        form.verify({
+            "name": function (e) {
+                var msg = "";
+                $.ajax({
+                    type: "GET",
+                    url: '/function/checkname',
+                    async: false,
+                    data: {
+                        name: e,
+                        id: $("#id").val()
+                    },
+                    success: function (result) {
+                        if (result.code != 200) {
+                            msg = result.msg;
+                        }
+                    },
+                    error: function (error) {
+                        msg = "请求服务器校验账号失败";
+                    }
+                });
+            }
+        });
+
+        var url = '/function/add';
+        // 回显user数据
+        var func = admin.getTempData('t_func');
+        if (func) {
+            $('input[name="id"]').attr('readonly', 'readonly');
+            form.val('form', func);
+        }
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data : JSON.stringify(data.field),
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/function/index.html b/src/main/resources/templates/system/function/index.html
index afcda4c..245090c 100755
--- a/src/main/resources/templates/system/function/index.html
+++ b/src/main/resources/templates/system/function/index.html
@@ -10,28 +10,19 @@
         <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 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="table"></table>
+        <table class="layui-table" id="table" lay-filter="table"></table>
     </div>
 </div>
 
-<!-- 表格操作列 -->
-<script type="text/html" id="table-bar">
-    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>
-    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><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>
-</script>
-
 <script>
     layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
-        var form = layui.form;
-        var table = layui.table;
-        var layer = layui.layer;
-        var admin = layui.admin;
-        var element = layui.element;
+        let form = layui.form;
+        let table = layui.table;
+        let admin = layui.admin;
 
         form.render('select');
 
@@ -42,7 +33,7 @@
             page: true,
             cols: [
                 [
-                    {field: 'id', title: '功能ID', fixed: 'left', sort: true},
+                    {field: 'id', title: '功能ID', width: 80,fixed: 'left', sort: true},
                     {field: 'name', title: '功能名称', sort: true},
                     {
                         field: 'isLeaf', title: '节点', sort: true, width: 80, align: 'center', templet: function (item) {
@@ -56,115 +47,129 @@
                         }
                     },
                     {field: 'menuUrl', title: '路径'},
-                    {field: 'orderNum', sort: true, title: '序号'},
-                    {field: 'menuIcon', title: '图标',align: 'center', templet: function (item) {
-                            return '<i class="layui-icon '+item.menuIcon+'"></i> '
+                    {field: 'orderNum', sort: true, width: 80,title: '序号'},
+                    {
+                        field: 'menuIcon', title: '图标', width: 80,align: 'center', templet: function (item) {
+                            return '<i class="layui-icon ' + item.menuIcon + '"></i> '
                         }
                     },
-                    {field:'id',align: 'center', toolbar: '#table-bar', title: '操作', fixed: 'right'}
+                    {
+                        field: 'id', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                            if (item.isLeaf == 0) {
+                                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-normal  layui-btn-xs" lay-event="addsub"><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>'
+                            } else {
+                                return ' <a class="layui-btn  layui-btn-xs" lay-event="editsub"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +
+                                    ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="addres"><i class="layui-icon layui-icon-set-sm"></i>添加资源</a> ' +
+                                    ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="listres"><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 () {
-            var key = $('#search-value').val();
+            let key = $('#search-value').val();
             table.reload('table', {where: {searchkey: key}, page: {curr: 1}});
         });
         $('#btn-add').click(function () {
-            layer.open({
-                type: 1
-                ,title: '添加功能'
-                ,content: 'form.html'
-                ,maxmin: true
-                ,area: ['500px', '450px']
-                ,btn: ['确定', '取消']
-                ,yes: function(index, layero){
-                    var iframeWindow = window['layui-layer-iframe'+ index]
-                        ,submitID = 'LAY-user-front-submit'
-                        ,submit = layero.find('iframe').contents().find('#'+ submitID);
-
-                    //监听提交
-                    iframeWindow.layui.form.on('submit('+ submitID +')', function(data){
-                        var field = data.field; //获取提交的字段
-                        //提交 Ajax 成功后，静态更新表格中的数据
-                        //$.ajax({});
-                        table.reload('table');
-                        layer.close(index); //关闭弹层
-                    });
-
-                    submit.trigger('click');
-                }
-            });
+            showModel();
         });
-        // 显示表单弹窗
-        var showEditModel = function (data) {
-            var title = data ? '修改用户' : '添加用户';
-            admin.putTempData('t_user', data);
+        let showModel = function (data) {
+            let title = data ? '编辑父功能' : '添加父功能';
+            admin.putTempData('t_func', data);
             admin.popupCenter({
                 title: title,
-                path: '/operator/load4add',
+                path: '/function/loadadd',
                 finish: function () {
-                    table.reload('oper-table', {});
+                    table.reload('table', {});
+                }
+            });
+        };
+        let showModelSub = function (data,parentid) {
+            let title = data ? '编辑子功能' : '添加子功能';
+            admin.putTempData('parentId', parentid);
+            admin.putTempData('t_func', data);
+            admin.popupCenter({
+                title: title,
+                path: '/function/loadsubadd',
+                finish: function () {
+                    table.reload('table', {});
                 }
             });
         };
 
-        // 工具条点击事件
-        table.on('tool(user-table)', function (obj) {
-            console.log(obj);
-            var data = obj.data;
-            var layEvent = obj.event;
-
-            if (layEvent === 'edit') { // 修改
-                showEditModel(data);
-            } else if (layEvent === 'reset') { // 重置密码
-                layer.confirm('确定重置此用户的密码吗？', function (i) {
-                    layer.close(i);
-                    layer.load(2);
-                    admin.go('/system/user/restPsw', {
-                        userId: obj.data.userId
-                    }, 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});
-                        }
-                    });
-                });
-            }
-        });
-
-        // 修改user状态
-        form.on('switch(user-tpl-state)', function (obj) {
-            layer.load(2);
-            admin.go('/system/user/updateState', {
-                userId: obj.elem.value,
-                state: obj.elem.checked ? 0 : 1
-            }, function (data) {
-                layer.closeAll('loading');
-                if (data.code == 200) {
-                    layer.msg(data.msg, {icon: 1});
-                    //table.reload('table-user', {});
-                } 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});
-                    $(obj.elem).prop('checked', !obj.elem.checked);
-                    form.render('checkbox');
+        let showResModel = function (functionid) {
+            let title = '维护资源';
+            admin.putTempData('functionid', functionid);
+            admin.popupCenter({
+                title: title,
+                area:'70%',
+                path: '/function/loadres?functionid='+functionid
+            });
+        };
+        let showAddResModelSub = function (functionid) {
+            let title = '添加资源';
+            admin.putTempData('functionid', functionid);
+            admin.popupCenter({
+                title: title,
+                path: '/function/loadresadd',
+                finish: function () {
+                    table.reload('table', {});
                 }
             });
+        };
+        // 工具条点击事件
+        table.on('tool(table)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'edit') {
+                showModel(data);
+            } else if (layEvent === 'addsub') {
+                showModelSub(null,data.id);
+            } else if (layEvent === 'editsub') {
+                showModelSub(data,data.parentId);
+            } else if (layEvent === 'del') {
+                showDelete(data);
+            } else if(layEvent === 'listres'){
+                showResModel(data.id);
+            } else if(layEvent === 'addres'){
+                showAddResModelSub(data.id);
+            }
         });
-
+        let showDelete = function (data) {
+            layer.confirm('确定删除吗，该功能下的子功能、资源、角色分配的该功能都将被删除？', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('/function/delfunc', {
+                    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>
diff --git a/src/main/resources/templates/system/function/resform.html b/src/main/resources/templates/system/function/resform.html
new file mode 100755
index 0000000..78f7747
--- /dev/null
+++ b/src/main/resources/templates/system/function/resform.html
@@ -0,0 +1,94 @@
+<!-- operator表单弹窗 -->
+<form id="resform" lay-filter="resform" class="layui-form model-form">
+    <input name="id" id="id" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">资源名称</label>
+        <div class="layui-input-block">
+            <input name="name" placeholder="请输入资源名称" type="text" class="layui-input" maxlength="60"
+                   lay-verify="required|name" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">路径</label>
+        <div class="layui-input-block">
+            <input name="uri" placeholder="请输入资源路径 " type="text" class="layui-input" maxlength="100"
+                   lay-verify="required" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">所属功能</label>
+        <div class="layui-input-block">
+            <select name="functionId" id="functionId" lay-verify="required">
+                <option th:each="func : ${list}" th:value="${func.id}">[[${func.name}]]</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">代码</label>
+        <div class="layui-input-block">
+            <input name="code" placeholder="请输入代码" type="text" class="layui-input"/>
+        </div>
+    </div>
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="resform-submit" lay-submit id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        form.render('select');
+        form.render('radio');
+        var url = '/function/addres';
+        // 回显user数据
+        var func = admin.getTempData('t_res');
+        if (func) {
+            $('input[name="id"]').attr('readonly', 'readonly');
+            form.val('resform', func);
+        }
+        let functionid = admin.getTempData("functionid");
+        if (functionid) {
+            form.val('resform', {"functionId": functionid});
+        }
+        // 表单提交事件
+        form.on('submit(resform-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                data: JSON.stringify(data.field),
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error: function () {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</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
index 0000000..d95cbfe
--- /dev/null
+++ b/src/main/resources/templates/system/function/reslist.html
@@ -0,0 +1,90 @@
+<div style="padding:20px;">
+    <table class="layui-table" id="restable" lay-filter="restable">
+    </table>
+    <input type="hidden" id="functionid" th:value="${function.id}">
+    <input type="hidden" id="functionname" th:value="${function.name}">
+</div>
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        let form = layui.form;
+        let admin = layui.admin;
+        form.render('select');
+        let table = layui.table;
+        let func = admin.getTempData('functionid');
+        table.render({
+            elem: '#restable',
+            url: '/function/reslist?functionid=' + func,
+            cols: [
+                [
+                    {field: 'id', title: '资源ID', width: 80, fixed: 'left', sort: true},
+                    {field: 'name', title: '资源名称', sort: true},
+                    {
+                        field: 'functionId', title: '所属功能', sort: true, align: 'center', templet: function (item) {
+                            return $("#functionname").val();
+                        }
+                    },
+                    {field: 'uri', title: '路径'},
+                    {field: 'code', sort: true, width: 80, title: '代码'},
+                    {
+                        field: 'id', align: 'center', title: '操作',  templet: function (item) {
+                            return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+                        }
+                    }
+                ]
+            ]
+        });
+        // 工具条点击事件
+        table.on('tool(restable)', function (obj) {
+            let data = obj.data;
+            let layEvent = obj.event;
+            console.log(data);
+            if (layEvent === 'edit') {
+                showAddResModelSub(data);
+            } else if (layEvent === 'del') {
+                showDelete(data);
+            }
+        });
+        let showAddResModelSub = function (data) {
+            let title = '编辑资源';
+            admin.putTempData('functionid', $("#functionid").val());
+            admin.putTempData('t_data',data);
+            admin.popupCenter({
+                title: title,
+                path: '/function/loadresadd',
+                finish: function () {
+                    table.reload('table', {});
+                }
+            });
+        };
+        let showDelete = function (data) {
+            layer.confirm('确定删除吗？', function (i) {
+                layer.close(i);
+                layer.load(2);
+                let token = $("meta[name='_csrf_token']").attr("value");
+                admin.go('/function/delres', {
+                    resid: 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('restable', {});
+                },function(ret){
+                    console.log(ret);
+                    layer.closeAll('loading');
+                    layer.msg('请求失败了，请稍后再试', {icon: 2});
+                });
+            });
+        }
+    });
+</script>
diff --git a/src/main/resources/templates/system/function/subform.html b/src/main/resources/templates/system/function/subform.html
new file mode 100755
index 0000000..def716f
--- /dev/null
+++ b/src/main/resources/templates/system/function/subform.html
@@ -0,0 +1,106 @@
+<!-- operator表单弹窗 -->
+<form id="form" lay-filter="subform" class="layui-form model-form">
+    <input name="id" id="id" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">功能名称</label>
+        <div class="layui-input-block">
+            <input name="name" placeholder="请输入功能名称" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|name" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">路径</label>
+        <div class="layui-input-block">
+            <input name="menuUrl" placeholder="请输入路径，父节点默认为 # " type="text" class="layui-input" maxlength="60" lay-verify="required" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">父功能</label>
+        <div class="layui-input-block">
+            <select name="parentId" id="parentId" lay-verify="required">
+                <option th:each="func : ${list}" th:value="${func.id}">[[${func.name}]]</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">节点</label>
+        <div class="layui-input-block">
+            <input type="radio" name="isLeaf" value="1" title="子" checked/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">序号</label>
+        <div class="layui-input-block">
+            <input name="orderNum" placeholder="请输入序号" type="text" class="layui-input" />
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">图标</label>
+        <div class="layui-input-block">
+            <input name="menuIcon" placeholder="请输入图标 例:layui-icon-xx " type="text" class="layui-input" />
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="subform-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        form.render('select');
+        form.render('radio');
+        var url = '/function/add';
+        // 回显user数据
+        var func = admin.getTempData('t_func');
+        if (func) {
+            $('input[name="id"]').attr('readonly', 'readonly');
+            form.val('subform', func);
+        }
+        let parentId = admin.getTempData("parentId");
+        if(parentId){
+            form.val('form', {"parentId":parentId});
+        }
+        // 表单提交事件
+        form.on('submit(subform-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data : JSON.stringify(data.field),
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/operator/index.html b/src/main/resources/templates/system/operator/index.html
index 1f6dad4..14861c7 100644
--- a/src/main/resources/templates/system/operator/index.html
+++ b/src/main/resources/templates/system/operator/index.html
@@ -110,7 +110,6 @@
             });
         };
 
-
         // 工具条点击事件
         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
index 0000000..0769c8c
--- /dev/null
+++ b/src/main/resources/templates/system/role/form.html
@@ -0,0 +1,74 @@
+<!-- operator表单弹窗 -->
+<form id="form" lay-filter="form" class="layui-form model-form">
+    <input name="roleId" id="roleId" type="hidden"/>
+    <div class="layui-form-item">
+        <label class="layui-form-label">角色名称</label>
+        <div class="layui-input-block">
+            <input name="roleName" placeholder="请输入角色名称" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|roleName" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">角色描述</label>
+        <div class="layui-input-block">
+            <textarea name="roleDesc" placeholder="请输入描述" class="layui-textarea"></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var url = '/role/add';
+        // 回显user数据
+        var func = admin.getTempData('t_func');
+        if (func) {
+            $('input[name="roleId"]').attr('readonly', 'readonly');
+            form.val('form', func);
+        }
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            debugger
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data : JSON.stringify(data.field),
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</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
index 0000000..d838bb5
--- /dev/null
+++ b/src/main/resources/templates/system/role/func.html
@@ -0,0 +1,88 @@
+<div style="padding: 0 20px">
+    <div class="layui-form-item">
+        <ul id="funclist" class="ztree"></ul>
+    </div>
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" id="submitbtn">保存</button>
+    </div>
+</div>
+<script>
+    layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        var func = admin.getTempData('roleId');
+        let initTree = function (nodes) {
+            let menuSetting = {
+                view: {
+                    dblClickExpand: true,
+                    showLine: true,
+                    showIcon: false
+                },
+                check: {
+                    enable: true,
+                },
+                data: {
+                    simpleData: {
+                        enable: true
+                    }
+                }
+            };
+            $.fn.zTree.init($("#funclist"), menuSetting, nodes);
+        }
+        admin.dgo('/role/func', {
+            roleId: func,
+        }, function (data) {
+            layer.closeAll('loading');
+            if (data.code == 200) {
+                initTree(data.node);
+            } 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});
+            }
+        }, function (ret) {
+            layer.closeAll('loading');
+            layer.msg('请求失败了，请稍后再试', {icon: 2});
+        });
+        $("#submitbtn").on('click', function (e) {
+            let ids = [];
+            let treeObj = $.fn.zTree.getZTreeObj("funclist");
+            let nodes = treeObj.getCheckedNodes(true);
+            for (let i = 0; i < nodes.length; i++) {
+                ids.push(nodes[i].id);//存功能ID
+            }
+            if (ids.length < 1) {
+                return;
+            }
+            let idStr = ids.toString();
+            let token = $("meta[name='_csrf_token']").attr("value");
+            admin.go('/role/addfunc', {
+                roleId: func,
+                funcs: idStr,
+                _csrf: token,
+            }, function (data) {
+                layer.closeAll('loading');
+                if (data.code == 200) {
+                    layer.msg(data.msg, {icon: 1});
+                    admin.finishPopupCenter();
+                } 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});
+                }
+            }, function (ret) {
+                console.log(ret);
+                layer.closeAll('loading');
+                layer.msg('请求失败了，请稍后再试', {icon: 2});
+            });
+        })
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/role/index.html b/src/main/resources/templates/system/role/index.html
index df1c415..c96d529 100644
--- a/src/main/resources/templates/system/role/index.html
+++ b/src/main/resources/templates/system/role/index.html
@@ -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
