角色管理
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java
index 292a999..c3fe0d1 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java
@@ -12,4 +12,6 @@
 
   @Query(value = "select distinct rolecode from TB_OPER_ROLE a,TB_ROLE b where a.roleid=b.roleid and a.operid=?1", nativeQuery = true)
   List<String> getRolecodeByOperid(String operid);
+
+  void deleteByRoleId(String roleId);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
index 767df41..af782a8 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
@@ -3,14 +3,9 @@
 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);
+    TPermission findByRoleIdAndResid(String roleId, Integer resid);
 
     void deleteByRoleId(String roleId);
 }
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 0baed2e..9ccc7c9 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
@@ -14,11 +14,13 @@
     @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 findByRoleCodeAndRoleIdNot(String roleCode, String roleId);
+
     TRole findByRoleName(String roleName);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
index 0d22f35..f9a2368 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
@@ -19,7 +19,7 @@
     @Column(name = "RESID")
     private Integer resid;
 
-    @Column(name = "ROLEID")
+    @Column(name = "ROLEID",length = 32)
     private String roleId;
 
     public String getRoleId() {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java b/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
index dfa30c6..db6a4f1 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.framework.security;
 
+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;
@@ -22,7 +23,8 @@
 
     @Override
     public boolean hasPermission(Authentication authentication, Object targetUri, Object permission) {
-        if (targetUri != null && permission != null) {
+        //TODO save logger
+        if (targetUri != null) {
             UserDetails userDetails = (UserDetails) authentication.getPrincipal();
             if (userDetails != null) {
                 Collection<GrantedAuthority> authorities = (Collection<GrantedAuthority>) userDetails.getAuthorities();
@@ -32,9 +34,8 @@
                     if (role != null) {
                         TResource resource = roleService.findResourceByURI(String.valueOf(targetUri));
                         if (resource != null) {
-                            TRoleFunction roleFunction = roleService.findRoleFunctionByRoleIdAndFunctionId(role.getRoleId(), resource.getFunctionId());
-                            if (roleFunction != null && !StringUtil.isEmpty(roleFunction.getPermissions())
-                                    && roleFunction.getPermissions().contains(String.valueOf(permission))) {
+                            TPermission permission1 = roleService.findByRoleIdAndResid(role.getRoleId(),resource.getId());
+                            if (permission1 != null) {
                                 return true;
                             }
                         }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
index fa1318e..85acf8b 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -10,6 +10,7 @@
 import com.supwisdom.dlpay.system.service.RoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
@@ -24,7 +25,7 @@
   private RoleService roleService;
 
   @GetMapping("/index")
-  @PreAuthorize("hasPermission('/operator/index','query')")
+  @PreAuthorize("hasPermission('/operator/index','')")
   public String indexView(Model model) {
     return "system/operator/index";
   }
@@ -37,6 +38,7 @@
                                            @RequestParam(value = "searchvalue", required = false) String searchValue,
                                            Model model) {
     try {
+
       if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
       if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
       OperatorSearchBean searchBean = new OperatorSearchBean();
@@ -57,7 +59,7 @@
   }
 
   @GetMapping("/load4add")
-  @PreAuthorize("hasPermission('/operator/load4add','query')")
+  @PreAuthorize("hasPermission('/operator/load4add','')")
   public String load4addOperator(Model model) {
     model.addAttribute("roles", roleService.findAllRoles());
     return "system/operator/operator";
@@ -79,11 +81,20 @@
                         @RequestParam("opername") String opername, @RequestParam("sex") String sex,
                         @RequestParam("mobile") String mobile, @RequestParam("email") String email,
                         @RequestParam("roleId") String roleId, Model map) {
-    if (true) {
-      return JsonResult.ok("添加成功");
-    } else {
-      return JsonResult.error("添加失败");
+    if (operatorService.checkOpercodeExists(opercode, operid)) {
+      return JsonResult.error("账号重复");
     }
+    TOperator operator = new TOperator();
+    operator.setOpername(opername);
+    operator.setOpercode(opercode);
+    operator.setOperid(operid);
+    operator.setMobile(mobile);
+    operator.setEmail(email);
+    operator.setSex(sex);
+    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+    operator.setOperpwd(encoder.encode("123456"));
+    operatorService.saveOperator(operator,roleId);
+    return JsonResult.ok("添加成功");
   }
 
   @PostMapping("/update")
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 8e82136..bfe0127 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
@@ -83,4 +83,9 @@
         result.put("node", nodes);
         return result;
     }
+    @PostMapping("/role/del")
+    @ResponseBody
+    public JsonResult del(@RequestParam String  roleid) {
+        return roleService.deleteRole(roleid);
+    }
 }
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 0c6aa92..8884b21 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
@@ -5,32 +5,46 @@
 import com.supwisdom.dlpay.framework.domain.TResource;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
 
 public interface FunctionService {
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   List<TFunction> getFunctionsByOperid(String operid);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   List<Map<String, Object>> getMenuTree(List<TFunction> funcList, Integer parentId);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   PageResult<TFunction> getFunctionsByKey(FunctionSearchBean param);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   TFunction getFunctionByNameAndId(String name,Integer id);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult saveFunction(TFunction function);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   TFunction getFunctionById(Integer id);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult deleteFunction(Integer funcid);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   List<TFunction> getParentFunction();
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   List<TResource> getResources(Integer function);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   List<TFunction> getLeafFunction();
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult saveRes(TResource resource);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult deleteResource(Integer resid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java b/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
index 09ab1d4..bbaff0a 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
@@ -3,9 +3,16 @@
 import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 public interface OperatorService {
-  PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean);
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+    PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean);
 
-  boolean checkOpercodeExists(String opercode, String operid);
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+    boolean checkOpercodeExists(String opercode, String operid);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    boolean saveOperator(TOperator operator,String roles);
 }
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 2306dd0..222dd8d 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
@@ -8,29 +8,42 @@
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
 import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
 public interface RoleService {
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     List<TRole> findAllRoles();
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     TRole findRoleByRolecode(String rolecode);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     TResource findResourceByURI(String uri);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, Integer functionid);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TRole> getRolesByKey(FunctionSearchBean param);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult saveRole(TRole role);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     List<TRoleFunction> getRoleFuncByRoleid(String roleId);
 
-    List<TPermission> findByRoleFuncId(String roleFuncId);
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    TPermission findByRoleIdAndResid(String roleFuncId, Integer resid);
 
-    TPermission findByRoleFuncIdAndResid(String roleFuncId, Integer resid);
-
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult saveRoleFuncId(String roleId, String funcs);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     List<ZTreeNode> findByRoleIdNative(String roleId);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult deleteRole(String roleid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
index 7babb62..167e955 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
@@ -1,7 +1,10 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.framework.dao.OperRoleDao;
 import com.supwisdom.dlpay.framework.dao.OperatorDao;
+import com.supwisdom.dlpay.framework.domain.TOperRole;
 import com.supwisdom.dlpay.framework.domain.TOperator;
+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.framework.util.TradeDict;
@@ -24,40 +27,57 @@
 
 @Service
 public class OperatorServiceImpl implements OperatorService {
-  @Autowired
-  private OperatorDao operatorDao;
+    @Autowired
+    private OperatorDao operatorDao;
+    @Autowired
+    private OperRoleDao operRoleDao;
 
-  @Override
-  public PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean) {
-    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "opendate");
-    Page<TOperator> page = operatorDao.findAll(new Specification<TOperator>() {
-      @Override
-      public Predicate toPredicate(Root<TOperator> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
-        List<Predicate> predicates = new ArrayList<>();
-        if (!StringUtil.isEmpty(searchBean.getOpercode())) {
-          predicates.add(criteriaBuilder.equal(root.get("opercode").as(String.class), searchBean.getOpercode().trim()));
-        }
-        if (!StringUtil.isEmpty(searchBean.getOpername())) {
-          predicates.add(criteriaBuilder.like(root.get("opername").as(String.class), "%" + searchBean.getOpername().trim() + "%"));
-        }
-        if (!StringUtil.isEmpty(searchBean.getMobile())) {
-          predicates.add(criteriaBuilder.like(root.get("mobile").as(String.class), "%" + searchBean.getMobile().trim() + "%"));
-        }
-        if (null != searchBean.getDeleteShow() && !searchBean.getDeleteShow()) {
-          predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), TradeDict.STATUS_NORMAL)); //仅显示正常
-        }
-        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
-      }
-    }, pageable);
+    @Override
+    public PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean) {
+        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "opendate");
+        Page<TOperator> page = operatorDao.findAll(new Specification<TOperator>() {
+            @Override
+            public Predicate toPredicate(Root<TOperator> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+                List<Predicate> predicates = new ArrayList<>();
+                if (!StringUtil.isEmpty(searchBean.getOpercode())) {
+                    predicates.add(criteriaBuilder.equal(root.get("opercode").as(String.class), searchBean.getOpercode().trim()));
+                }
+                if (!StringUtil.isEmpty(searchBean.getOpername())) {
+                    predicates.add(criteriaBuilder.like(root.get("opername").as(String.class), "%" + searchBean.getOpername().trim() + "%"));
+                }
+                if (!StringUtil.isEmpty(searchBean.getMobile())) {
+                    predicates.add(criteriaBuilder.like(root.get("mobile").as(String.class), "%" + searchBean.getMobile().trim() + "%"));
+                }
+                if (null != searchBean.getDeleteShow() && !searchBean.getDeleteShow()) {
+                    predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), TradeDict.STATUS_NORMAL)); //仅显示正常
+                }
+                return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+            }
+        }, pageable);
 
-    return new PageResult<>(page);
-  }
+        return new PageResult<>(page);
+    }
 
-  @Override
-  public boolean checkOpercodeExists(String opercode, String operid) {
-    TOperator oper = operatorDao.findByOpercode(opercode.trim());
-    if (null != oper && StringUtil.isEmpty(operid)) return true;
-    if (null != oper && !StringUtil.isEmpty(operid) && !operid.trim().equals(oper.getOperid())) return true;
-    return false;
-  }
+    @Override
+    public boolean checkOpercodeExists(String opercode, String operid) {
+        TOperator oper = operatorDao.findByOpercode(opercode.trim());
+        if (null != oper && StringUtil.isEmpty(operid)) return true;
+        if (null != oper && !StringUtil.isEmpty(operid) && !operid.trim().equals(oper.getOperid())) return true;
+        return false;
+    }
+
+    @Override
+    public boolean saveOperator(TOperator operator,String roles) {
+        String[] roleids= roles.split(",");
+        operator.setOpendate(DateUtil.getNow());
+        operator.setStatus(TradeDict.STATUS_NORMAL);
+        operatorDao.save(operator);
+        for(String role:roleids){
+            TOperRole operRole = new TOperRole();
+            operRole.setOperid(operator.getOperid());
+            operRole.setRoleId(role);
+            operRoleDao.save(operRole);
+        }
+        return true;
+    }
 }
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 7b42236..0e30b2a 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,10 +1,7 @@
 package com.supwisdom.dlpay.system.service.impl;
 
 import com.supwisdom.dlpay.api.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.dao.*;
 import com.supwisdom.dlpay.framework.data.NodeData;
 import com.supwisdom.dlpay.framework.domain.TPermission;
 import com.supwisdom.dlpay.framework.domain.TResource;
@@ -39,6 +36,9 @@
 
     @Autowired
     private PermissionDao permissionDao;
+    @Autowired
+    private OperRoleDao operRoleDao;
+
 
     @Override
     public List<TRole> findAllRoles() {
@@ -79,6 +79,10 @@
             if (temp != null) {
                 return JsonResult.error("角色名称已存在");
             }
+            temp = roleDao.findByRoleCodeAndRoleIdNot(role.getRoleCode(), role.getRoleId());
+            if (temp != null) {
+                return JsonResult.error("角色代码已存在");
+            }
             Optional<TRole> opt = roleDao.findById(role.getRoleId());
             if (opt == null || !opt.isPresent()) {
                 return JsonResult.error("角色已被删除");
@@ -86,6 +90,7 @@
             temp = opt.get();
             temp.setRoleName(role.getRoleName());
             temp.setRoleDesc(role.getRoleDesc());
+            temp.setRoleCode(role.getRoleCode());
             temp.setLastsaved(DateUtil.getNow());
             roleDao.save(temp);
         } else {
@@ -93,9 +98,13 @@
             if (temp != null) {
                 return JsonResult.error("角色名称已存在");
             }
+            temp = roleDao.findByRoleCode(role.getRoleCode());
+            if (temp != null) {
+                return JsonResult.error("角色代码已存在");
+            }
             role.setCreatetime(DateUtil.getNow());
             role.setEditflag(1);
-            role.setRoleCode("ROLE_ADMIN");
+            role.setRoleCode(role.getRoleCode());
             roleDao.save(role);
         }
         return JsonResult.ok("成功");
@@ -108,13 +117,8 @@
 
 
     @Override
-    public List<TPermission> findByRoleFuncId(String roleFuncId) {
-        return permissionDao.findByRoleFuncId(roleFuncId);
-    }
-
-    @Override
-    public TPermission findByRoleFuncIdAndResid(String roleFuncId, Integer resid) {
-        return permissionDao.findByRoleFuncIdAndResid(roleFuncId, resid);
+    public TPermission findByRoleIdAndResid(String roleFuncId, Integer resid) {
+        return permissionDao.findByRoleIdAndResid(roleFuncId, resid);
     }
 
     @Override
@@ -158,4 +162,20 @@
         }
         return ret;
     }
+
+    @Override
+    public JsonResult deleteRole(String roleid) {
+        Optional<TRole> ret = roleDao.findById(roleid);
+        if (ret == null || !ret.isPresent()) {
+            return JsonResult.error("角色不存在");
+        }
+        if(ret.get().getEditflag()!=1){
+            return JsonResult.error("该角色不能删除");
+        }
+        permissionDao.deleteByRoleId(roleid);
+        roleFunctionDao.deleteByRoleId(roleid);
+        operRoleDao.deleteByRoleId(roleid);
+        roleDao.deleteById(roleid);
+        return JsonResult.ok("成功");
+    }
 }
diff --git a/src/main/resources/templates/system/operator/operator.html b/src/main/resources/templates/system/operator/operator.html
index c43995c..6676bf4 100644
--- a/src/main/resources/templates/system/operator/operator.html
+++ b/src/main/resources/templates/system/operator/operator.html
@@ -118,8 +118,6 @@
             var token_name = $("meta[name='_csrf_token']").attr("content");
             var token = $("meta[name='_csrf_token']").attr("value");
             data.field[token_name] = token;
-            console.log(data);
-            debugger
             $.ajax({
                 type : "POST",
                 dataType : "json",
diff --git a/src/main/resources/templates/system/role/form.html b/src/main/resources/templates/system/role/form.html
index 0769c8c..f8714f3 100755
--- a/src/main/resources/templates/system/role/form.html
+++ b/src/main/resources/templates/system/role/form.html
@@ -9,6 +9,13 @@
         </div>

     </div>

     <div class="layui-form-item">

+        <label class="layui-form-label">角色代码</label>

+        <div class="layui-input-block">

+            <input name="roleCode" placeholder="请输入角色代码" type="text" class="layui-input" maxlength="20"

+                   lay-verify="required|roleCode" 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>

@@ -37,7 +44,6 @@
         form.on('submit(form-submit)', function (data) {

             layer.load(2);

             let token = $("meta[name='_csrf_token']").attr("value");

-            debugger

             $.ajax({

                 type : "POST",

                 dataType : "json",

diff --git a/src/main/resources/templates/system/role/index.html b/src/main/resources/templates/system/role/index.html
index c96d529..2d3f167 100644
--- a/src/main/resources/templates/system/role/index.html
+++ b/src/main/resources/templates/system/role/index.html
@@ -32,13 +32,17 @@
             page: true,
             cols: [
                 [
-                    {field: 'roleName', title: '角色名称', fixed: 'left', sort: true},
+                    {field: 'roleName', title: '角色名称', width: 160,fixed: 'left', sort: true},
+                    {field: 'roleCode', title: '角色代码', width: 160,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>'
+                            let html =  ' <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> ';
+                            if(item.editflag===1){
+                                html +='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                            }
+                            return html;
                         }
                     }
                 ]
@@ -85,12 +89,12 @@
             }
         });
         let showDelete = function (data) {
-            layer.confirm('确定删除吗,该功能下的子功能、资源、角色分配的该功能都将被删除?', function (i) {
+            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,
+                    roleid: data.roleId,
                     _csrf: token
                 }, function (data) {
                     console.log(data.code);
@@ -105,7 +109,7 @@
                     } else {
                         layer.msg(data.msg, {icon: 2});
                     }
-                    table.reload('table', {});
+                    table.reload('roletable', {});
                 }, function (ret) {
                     console.log(ret);
                     layer.closeAll('loading');