瀏覽代碼

Merge remote-tracking branch 'origin/master'

Administrator 4 年之前
父節點
當前提交
d074dc0628
共有 27 個文件被更改,包括 1322 次插入152 次删除
  1. 15 3
      boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysMenu.java
  2. 8 10
      boman-api/boman-domain/src/main/java/com.boman.domain/RoleEnum.java
  3. 25 11
      boman-api/boman-domain/src/main/java/com.boman.domain/dto/RoleMenuDto.java
  4. 16 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/array/ArrayUtils.java
  5. 18 4
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysMenuController.java
  6. 8 0
      boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysMenuMapper.java
  7. 26 0
      boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysRoleMenuMapper.java
  8. 9 1
      boman-modules/boman-system/src/main/java/com/boman/system/service/ISysMenuService.java
  9. 34 8
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/ISysRoleMenuService.java
  10. 176 33
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysMenuServiceImpl.java
  11. 36 0
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysRoleMenuServiceImpl.java
  12. 11 1
      boman-modules/boman-system/src/main/resources/mapper/system/SysMenuMapper.xml
  13. 15 0
      boman-modules/boman-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
  14. 2 0
      ruoyi-ui/package.json
  15. 83 0
      ruoyi-ui/src/api/modeler.js
  16. 2 2
      ruoyi-ui/src/api/system/menu.js
  17. 9 0
      ruoyi-ui/src/api/system/role.js
  18. 238 0
      ruoyi-ui/src/assets/styles/theme.scss
  19. 1 1
      ruoyi-ui/src/components/FormItemComponent/index.vue
  20. 18 6
      ruoyi-ui/src/components/listModalComponent/index.vue
  21. 321 0
      ruoyi-ui/src/config/props.config.js
  22. 8 2
      ruoyi-ui/src/main.js
  23. 81 0
      ruoyi-ui/src/utils/dateApi.js
  24. 26 23
      ruoyi-ui/src/views/activiti/TemplateManagementNew/index.vue
  25. 21 15
      ruoyi-ui/src/views/activiti/modeler/index.vue
  26. 110 27
      ruoyi-ui/src/views/system/role/fz-index.vue
  27. 5 5
      ruoyi-ui/src/views/system/role/index.vue

+ 15 - 3
boman-api/boman-api-system/src/main/java/com/boman/system/api/domain/SysMenu.java

@@ -9,6 +9,7 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Size;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 菜单权限表 sys_menu
@@ -70,6 +71,9 @@ public class SysMenu extends BaseEntity
 
     /** 子菜单 */
     private List<SysMenu> children = new ArrayList<SysMenu>();
+
+    /** 父级菜单 */
+    private SysMenu parent;
     /**
      * 对应的表名称
      */
@@ -80,16 +84,24 @@ public class SysMenu extends BaseEntity
      * false 此表中有此菜单,但是未选择
      * 0 此表中无此菜单
      */
-    private List<JSONObject> containsHead;
+    private List<Map<String, Object>> containsHead;
 
-    public List<JSONObject> getContainsHead() {
+    public List<Map<String, Object>> getContainsHead() {
         return containsHead;
     }
 
-    public void setContainsHead(List<JSONObject> containsHead) {
+    public void setContainsHead(List<Map<String, Object>> containsHead) {
         this.containsHead = containsHead;
     }
 
+    public SysMenu getParent() {
+        return parent;
+    }
+
+    public void setParent(SysMenu parent) {
+        this.parent = parent;
+    }
+
     public String getSysTableName() {
         return sysTableName;
     }

+ 8 - 10
boman-api/boman-domain/src/main/java/com.boman.domain/RoleEnum.java

@@ -1,7 +1,5 @@
 package com.boman.domain;
 
-import com.alibaba.fastjson.JSONObject;
-
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -99,16 +97,16 @@ public enum RoleEnum {
         return result;
     }
 
-    /**
-     * 功能描述: 拿到所有的roles eg: A、M.....
-     *
-     * @return java.util.List<java.lang.String>
-     */
-    public static List<JSONObject> initData() {
+   /**
+    * 功能描述: 拿到所有的roles eg: A、M.....
+    *
+    * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
+    */
+    public static List<Map<String, Object>> initData() {
         List<String> roles = roles();
-        List<JSONObject> result = new ArrayList<>(roles.size());
+        List<Map<String, Object>> result = new ArrayList<>(roles.size());
         for (String role : roles) {
-            JSONObject jsonObject = new JSONObject(2);
+            Map<String, Object> jsonObject = new HashMap<>(2);
             jsonObject.put("name", role);
             jsonObject.put("type", "0");
             result.add(jsonObject);

+ 25 - 11
boman-api/boman-domain/src/main/java/com.boman.domain/dto/RoleMenuDto.java

@@ -1,19 +1,12 @@
 package com.boman.domain.dto;
 
 
-
-import lombok.Data;
-
 import java.util.List;
 
-import static com.boman.common.core.utils.obj.ObjectUtils.requireNonNull;
-import static com.boman.domain.constant.FormDataConstant.COLON;
-
 /**
  * @author shiqian
  * @date 2021年05月06日 17:25
  **/
-@Data
 public class RoleMenuDto {
 
     private Long menuId;
@@ -29,8 +22,7 @@ public class RoleMenuDto {
      */
     public static String getBtnFromPerms(String perms) {
         // sys_user:A
-        requireNonNull(perms, "权限标识为空");
-        String[] split = perms.split(COLON);
+        String[] split = perms.split(":");
         assert split.length == 2;
         // A
         return split[1];
@@ -44,11 +36,33 @@ public class RoleMenuDto {
      */
     public static String getTableNameFromPerms(String perms) {
         // sys_user:A
-        requireNonNull(perms, "权限标识为空");
-        String[] split = perms.split(COLON);
+        String[] split = perms.split(":");
         assert split.length == 2;
         // sys_user
         return split[0];
     }
 
+    public Long getMenuId() {
+        return menuId;
+    }
+
+    public void setMenuId(Long menuId) {
+        this.menuId = menuId;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+
+    public List<String> getHead() {
+        return head;
+    }
+
+    public void setHead(List<String> head) {
+        this.head = head;
+    }
 }

+ 16 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/array/ArrayUtils.java

@@ -1,6 +1,10 @@
 package com.boman.common.core.utils.array;
 
+import org.apache.commons.compress.utils.Lists;
+
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 /**
  * @author shiqian
@@ -28,4 +32,16 @@ public class ArrayUtils extends org.apache.commons.lang3.ArrayUtils {
     public static boolean equalsEmptyArray(String value) {
         return "[]".equals(value);
     }
+
+    /**
+     * 功能描述: 切割转list
+     *
+     * @param input  input
+     * @param symbol 分隔符
+     * @return java.util.List<java.lang.String>
+     */
+    public static List<String> split(String input, String symbol) {
+        String[] split = input.split(symbol);
+        return new ArrayList<>(Arrays.asList(split));
+    }
 }

+ 18 - 4
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysMenuController.java

@@ -100,6 +100,18 @@ public class SysMenuController extends BaseController
         return ajax;
     }
 
+   /**
+    * 功能描述: 根据roleId查找的叶子结点去匹配所对应的菜单树
+    *
+    * @param roleId roleId
+    * @return com.boman.common.core.web.domain.AjaxResult
+    */
+    @GetMapping(value = "/listTreeByRoleId/{roleId}")
+    public AjaxResult listTreeByRoleId(@PathVariable("roleId") Long roleId) {
+        return AjaxResult.success(menuService.listTreeByRoleId(roleId));
+    }
+
+
     /**
      * 功能描述: 根据菜单id,找到此菜单以及子菜单下所有的叶子节点
      *
@@ -110,15 +122,17 @@ public class SysMenuController extends BaseController
     public AjaxResult allLeafNodeById(@PathVariable("menuId") Long menuId) {
         return AjaxResult.success(menuService.allLeafNodeById(menuId));
     }
+
     /**
-     * 功能描述: 根据菜单id,找到此菜单以及子菜单下所有的叶子节点, 同时匹配叶子结点对应的头部的规则
+     * 功能描述: 根据menuId和roleId,找到此菜单以及子菜单下所有的叶子节点, 同时匹配叶子结点对应的头部的规则
      *
      * @param menuId menuId
+     * @param roleId roleId
      * @return com.boman.common.core.web.domain.AjaxResult
      */
-    @GetMapping(value = "/listMenus/{menuId}")
-    public AjaxResult listMenus(@PathVariable("menuId") Long menuId) {
-        return AjaxResult.success(menuService.listMenus(menuId));
+    @GetMapping(value = "/listMenus/roleId/{roleId}/menuId/{menuId}")
+    public AjaxResult listMenus(@PathVariable("roleId") Long roleId, @PathVariable("menuId") Long menuId) {
+        return AjaxResult.success(menuService.listMenus(roleId, menuId));
     }
 
     /**

+ 8 - 0
boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysMenuMapper.java

@@ -122,4 +122,12 @@ public interface SysMenuMapper
      * @return 结果
      */
     public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId);
+
+    /**
+     * 功能描述: 根据roleId查找的叶子结点去匹配所对应的菜单树
+     *
+     * @param roleId roleId
+     * @return java.util.List<com.boman.system.api.domain.SysMenu>
+     */
+    List<SysMenu> listTreeByRoleId(@Param("roleId") Long roleId);
 }

+ 26 - 0
boman-modules/boman-system/src/main/java/com/boman/system/mapper/SysRoleMenuMapper.java

@@ -51,4 +51,30 @@ public interface SysRoleMenuMapper
      * @return 结果
      */
     int batchRoleMenu(@Param("roleMenuList") List<SysRoleMenu> roleMenuList);
+
+    /**
+     * 功能描述: 根据roleId和menuId查找
+     *
+     * @param roleId roleId
+     * @param menuId menuId
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    SysRoleMenu listByRoleIdMenuId(@Param("roleId") Long roleId, @Param("menuId") Long menuId);
+
+    /**
+     * 功能描述: 根据roleId和menuId查找
+     *
+     * @param roleId roleId
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    List<SysRoleMenu> listByRoleId(Long roleId);
+
+    /**
+     * 功能描述: 根据roleId和menuIdList查找
+     *
+     * @param roleId     roleId
+     * @param menuIdList menuIdList
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    List<SysRoleMenu> listByRoleIdMenuIdList(@Param("roleId") Long roleId, @Param("menuIdList") List<Long> menuIdList);
 }

+ 9 - 1
boman-modules/boman-system/src/main/java/com/boman/system/service/ISysMenuService.java

@@ -174,5 +174,13 @@ public interface ISysMenuService
      */
     public String checkMenuNameUnique(SysMenu menu);
 
-    Map<String, Object> listMenus(Long menuId);
+    Map<String, Object> listMenus(Long roleId, Long menuId);
+
+    /**
+     * 功能描述: 根据roleId查找的叶子结点去匹配所对应的菜单树
+     *
+     * @param roleId roleId
+     * @return java.lang.String
+     */
+    List<SysMenu>  listTreeByRoleId(Long roleId);
 }

+ 34 - 8
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/ISysRoleMenuService.java

@@ -12,18 +12,18 @@ import java.util.List;
  */
 public interface ISysRoleMenuService {
 
-   /**
-    * 功能描述: 批量保存roleMenu
-    *
-    * @param dtos dtos
-    * @return int
-    */
+    /**
+     * 功能描述: 批量保存roleMenu
+     *
+     * @param dtos dtos
+     * @return int
+     */
     int saveList(List<RoleMenuDto> dtos);
 
     /**
      * 功能描述: 根据roleIdList删除
      *
-     * @param roleIdList  roleIdList
+     * @param roleIdList roleIdList
      * @return int
      */
     int deleteByRoleIdList(List<Long> roleIdList);
@@ -31,10 +31,36 @@ public interface ISysRoleMenuService {
     /**
      * 功能描述: 批量保存roleMenuList
      *
-     * @param roleMenuList  roleMenuList
+     * @param roleMenuList roleMenuList
      * @return int
      */
     int batchRoleMenu(List<SysRoleMenu> roleMenuList);
 
+    /**
+     * 功能描述: 根据roleId和menuId查找
+     *
+     * @param roleId roleId
+     * @param menuId menuId
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    SysRoleMenu listByRoleIdMenuId(Long roleId, Long menuId);
+
+    /**
+     * 功能描述: 根据roleId和menuIdList查找
+     *
+     * @param roleId     roleId
+     * @param menuIdList menuIdList
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    List<SysRoleMenu>  listByRoleIdMenuIdList(Long roleId, List<Long> menuIdList);
+
+    /**
+     * 功能描述: 根据roleId和menuId查找
+     *
+     * @param roleId roleId
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    List<SysRoleMenu> listByRoleId(Long roleId);
+
 
 }

+ 176 - 33
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysMenuServiceImpl.java

@@ -1,9 +1,10 @@
 package com.boman.system.service.impl;
 
-import java.util.*;
-import java.util.stream.Collectors;
-
-import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.constant.UserConstants;
+import com.boman.common.core.utils.SecurityUtils;
+import com.boman.common.core.utils.StringUtils;
+import com.boman.common.core.utils.array.ArrayUtils;
+import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.common.core.web.domain.AjaxResult;
 import com.boman.common.redis.RedisKey;
 import com.boman.common.redis.service.RedisService;
@@ -12,15 +13,9 @@ import com.boman.domain.RoleEnum;
 import com.boman.domain.constant.GlobalBtn;
 import com.boman.domain.dto.RoleMenuDto;
 import com.boman.system.api.domain.SysMenu;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.boman.common.core.constant.UserConstants;
-import com.boman.common.core.utils.SecurityUtils;
-import com.boman.common.core.utils.StringUtils;
 import com.boman.system.api.domain.SysRole;
 import com.boman.system.api.domain.SysUser;
+import com.boman.system.domain.SysRoleMenu;
 import com.boman.system.domain.vo.MetaVo;
 import com.boman.system.domain.vo.RouterVo;
 import com.boman.system.domain.vo.TreeSelect;
@@ -28,11 +23,17 @@ import com.boman.system.mapper.SysMenuMapper;
 import com.boman.system.mapper.SysRoleMapper;
 import com.boman.system.mapper.SysRoleMenuMapper;
 import com.boman.system.service.ISysMenuService;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.commons.lang3.BooleanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
-import static com.boman.domain.constant.FormDataConstant.COLON;
 
 /**
  * 菜单 业务层处理
@@ -53,6 +54,8 @@ public class SysMenuServiceImpl implements ISysMenuService {
     private SysRoleMenuMapper roleMenuMapper;
     @Resource
     private RedisService redisService;
+    @Resource
+    private ISysRoleMenuService roleMenuService;
 
     /**
      * 根据用户查询系统菜单列表
@@ -132,13 +135,27 @@ public class SysMenuServiceImpl implements ISysMenuService {
      */
     @Override
     public List<SysMenu> allLeafNodeById(Long menuId) {
+        List<SysMenu> tempList = Lists.newArrayListWithCapacity(16);
         SysMenu menu = selectMenuById(menuId);
         List<SysMenu> menus = menuMapper.selectMenuList(new SysMenu());
-        List<SysMenu> tempList = Lists.newArrayListWithCapacity(16);
-        recursionList(menus, menu, tempList);
-        // 把父亲去掉
-        if (tempList.size() > 1) {
-            tempList.remove(0);
+        List<SysMenu> sysMenus = recChildList(menus, menu, tempList);
+        return ObjectUtils.filter(sysMenus, menu1 -> SysMenu.BUTTON.equals(menu1.getMenuType()));
+    }
+
+    private List<SysMenu> recChildList(List<SysMenu> menus, SysMenu menu, List<SysMenu> tempList) {
+        int child = 0;
+        // 得到子节点列表
+        List<SysMenu> childList = getChildList(menus, menu);
+        for (SysMenu tChild : childList) {
+            if (hasChild(menus, tChild)) {
+                recChildList(menus, tChild, tempList);
+            } else {
+                child++;
+            }
+        }
+
+        if (child == childList.size() && childList.size() != 0) {
+            tempList.addAll(childList);
         }
 
         return tempList;
@@ -539,11 +556,11 @@ public class SysMenuServiceImpl implements ISysMenuService {
     }
 
     @Override
-    public Map<String, Object> listMenus(Long menuId) {
+    public Map<String, Object> listMenus(Long roleId, Long menuId) {
         SysMenu menu = selectMenuById(menuId);
-        List<SysMenu> menus = menuMapper.selectMenuList(new SysMenu());
+        List<SysMenu> allMenu = menuMapper.selectMenuList(new SysMenu());
         List<SysMenu> tempList = Lists.newArrayListWithCapacity(16);
-        recursionList(menus, menu, tempList);
+        recursionList(allMenu, menu, tempList);
         // 把父亲去掉
         if (tempList.size() > 1) {
             tempList.remove(0);
@@ -557,29 +574,155 @@ public class SysMenuServiceImpl implements ISysMenuService {
             return result;
         }
 
+        // 找到当前menuId对应的所有的叶子结点
+        List<SysMenu> leafNodes = allLeafNodeById(menuId);
+        List<Long> menuIdList = map(leafNodes, SysMenu::getId);
+        List<SysRoleMenu> roleMenuList = roleMenuService.listByRoleIdMenuIdList(roleId, menuIdList);
+        if (isEmpty(roleMenuList)) {
+            result.put("sysMenus", tempList);
+            return result;
+        }
+
+        List<Long> roleMenuIdList = map(roleMenuList, SysRoleMenu::getMenuId);
+        List<String> allBtnList = RoleEnum.roles();
+
         for (SysMenu sysMenu : tempList) {
-            List<JSONObject> containsHead = RoleEnum.initData();
-            List<SysMenu> childList = getChildList(menus, sysMenu);
-            for (SysMenu childMenu : childList) {
-                String btn = RoleMenuDto.getBtnFromPerms(childMenu.getPerms());
-                String tableName = RoleMenuDto.getTableNameFromPerms(childMenu.getPerms());
-                GenTable genTable = redisService.getCacheObject(RedisKey.TABLE_INFO + tableName);
-                String menuRole = genTable.getMenuRole();
-                if (menuRole.contains(btn)) {
-                    switchBtn(containsHead, btn, true);
-                } else {
-                    switchBtn(containsHead, btn, false);
+            List<Map<String, Object>> containsHead = RoleEnum.initData();
+            List<SysMenu> childList = getChildList(allMenu, sysMenu);
+            if (isEmpty(childList)) {
+                continue;
+            }
+
+            List<String> btnList = getBtnFromMenu(roleMenuIdList, childList);
+
+            String tableName = RoleMenuDto.getTableNameFromPerms(childList.get(0).getPerms());
+            GenTable genTable = redisService.getCacheObject(RedisKey.TABLE_INFO + tableName);
+            if (isEmpty(genTable)) {
+                continue;
+            }
+
+            List<String> menuRoleList = ArrayUtils.split(genTable.getMenuRole(), "");
+
+            for (String allBtn : allBtnList) {
+                boolean one = btnList.contains(allBtn);
+                boolean another = menuRoleList.contains(allBtn);
+                if (BooleanUtils.isTrue(one) && BooleanUtils.isTrue(another)) {
+                    switchBtn(containsHead, allBtn, true);
+                }
+
+                if (BooleanUtils.isFalse(one) && BooleanUtils.isTrue(another)) {
+                    switchBtn(containsHead, allBtn, false);
+                }
+
+                if (BooleanUtils.isFalse(one) && BooleanUtils.isFalse(another)) {
+                    switchBtn(containsHead, allBtn, "0");
                 }
             }
 
             sysMenu.setContainsHead(containsHead);
         }
+
         result.put("sysMenus", tempList);
         return result;
     }
 
-    private void switchBtn(List<JSONObject> containsHead, String btn, Object value) {
-        JSONObject jsonObject = new JSONObject(2);
+    /**
+     * 功能描述: roleMenuIdList包含childList中的id的全部取出来
+     *
+     * @param roleMenuIdList roleMenuIdList
+     * @param childList      childList
+     * @return java.util.List<java.lang.String>
+     */
+    private List<String> getBtnFromMenu(List<Long> roleMenuIdList, List<SysMenu> childList) {
+        List<String> btnList = Lists.newArrayList();
+        for (SysMenu childMenu : childList) {
+            if (roleMenuIdList.contains(childMenu.getId())) {
+                String btn = RoleMenuDto.getBtnFromPerms(childMenu.getPerms());
+                btnList.add(btn);
+            }
+        }
+        return btnList;
+    }
+
+    /**
+     * 功能描述: 根据roleId查找的叶子结点去匹配所对应的菜单树
+     *
+     * @param roleId roleId
+     * @return java.lang.String
+     */
+    @Override
+    public List<SysMenu> listTreeByRoleId(Long roleId) {
+        List<SysMenu> roleMenus = menuMapper.listTreeByRoleId(roleId);
+        List<SysMenu> allMenus = selectMenuListAll(new SysMenu());
+
+        List<Long> roleMenuIdList = map(roleMenus, SysMenu::getId);
+        List<SysMenu> parentMenus = Lists.newArrayListWithCapacity(16);
+
+        // 把roleMenus对应的所有的爹parentMenus找到
+        recGetParent(allMenus, roleMenus, parentMenus);
+
+        // 递归,把孩子放进父亲的怀抱
+        for (SysMenu parentMenu : parentMenus) {
+            recursionFn(parentMenus, parentMenu);
+        }
+
+        // 把不在roleMenus中的去除掉
+        return filter(parentMenus, menu -> isNotEmpty(menu.getChildren()));
+    }
+
+    /**
+     * 功能描述: 找到sonMenus对应的所有的父类,结果存放于result中
+     *
+     * @param allMenus allMenus
+     * @param sonMenus sonMenus
+     * @param result   没有按照规则排序只是把父类全部存放于result中
+     */
+    private void recGetParent(List<SysMenu> allMenus, List<SysMenu> roleMenus, List<SysMenu> result) {
+        for (SysMenu sonMenu : roleMenus) {
+            for (SysMenu parentMenu : allMenus) {
+                if (sonMenu.getParentId().equals(parentMenu.getId())) {
+                    if (isNotEmpty(result)) {
+                        List<Long> idList = map(result, SysMenu::getId);
+                        if (!idList.contains(parentMenu.getId())) {
+                            result.add(parentMenu);
+                        }
+                    } else {
+                        result.add(parentMenu);
+                    }
+
+                    // 顶级目录
+                    if (parentMenu.getId() != 1) {
+                        List<SysMenu> list = Collections.singletonList(parentMenu);
+                        recGetParent(allMenus, list, result);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    private void recBuildTree(List<SysMenu> roleMenus, SysMenu parent) {
+        List<SysMenu> childList = getChildList(roleMenus, parent);
+
+        parent.setChildren(childList);
+        for (SysMenu tChild : childList) {
+            if (hasChild(roleMenus, tChild)) {
+                recursionFn(roleMenus, tChild);
+            }
+        }
+    }
+
+    // 得到子节点列表
+//    List<SysMenu> childList = getChildList(list, t);
+//        t.setChildren(childList);
+//        for (SysMenu tChild : childList) {
+//        if (hasChild(list, tChild)) {
+//            recursionFn(list, tChild);
+//        }
+//    }
+
+    private void switchBtn(List<Map<String, Object>> containsHead, String btn, Object value) {
+        Map<String, Object> jsonObject = new HashMap<>(2);
         jsonObject.put("name", btn);
         jsonObject.put("type", value);
         switch (btn) {

+ 36 - 0
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysRoleMenuServiceImpl.java

@@ -122,4 +122,40 @@ public class SysRoleMenuServiceImpl implements ISysRoleMenuService{
 
         return result;
     }
+
+    /**
+     * 功能描述: 根据roleId和menuId查找
+     *
+     * @param roleId roleId
+     * @param menuId menuId
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    @Override
+    public SysRoleMenu listByRoleIdMenuId(Long roleId, Long menuId) {
+
+        return mapper.listByRoleIdMenuId(roleId, menuId);
+    }
+
+    /**
+     * 功能描述: 根据roleId和menuIdList查找
+     *
+     * @param roleId     roleId
+     * @param menuIdList menuIdList
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    @Override
+    public List<SysRoleMenu> listByRoleIdMenuIdList(Long roleId, List<Long> menuIdList) {
+        return mapper.listByRoleIdMenuIdList(roleId, menuIdList);
+    }
+
+    /**
+     * 功能描述: 根据roleId和menuId查找
+     *
+     * @param roleId roleId
+     * @return java.util.List<com.boman.system.domain.SysRoleMenu>
+     */
+    @Override
+    public List<SysRoleMenu> listByRoleId(Long roleId) {
+        return mapper.listByRoleId(roleId);
+    }
 }

+ 11 - 1
boman-modules/boman-system/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -130,7 +130,17 @@
 		<include refid="selectMenuVo"/>
 		where menu_name=#{menuName} and parent_id = #{parentId} limit 1
 	</select>
-	
+
+	<select id="listTreeByRoleId"  resultMap="SysMenuResult">
+		SELECT
+			m.*
+		FROM
+			sys_menu m
+				LEFT JOIN sys_role_menu rm ON m.id = rm.menu_id
+		WHERE
+			rm.role_id = #{roleId}
+	</select>
+
 	<update id="updateMenu" parameterType="SysMenu">
 		update sys_menu
 		<set>

+ 15 - 0
boman-modules/boman-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml

@@ -14,6 +14,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	    select count(1) from sys_role_menu where menu_id = #{menuId}
 	</select>
 
+	<select id="listByRoleIdMenuId" resultMap="SysRoleMenuResult">
+		select * from sys_role_menu where menu_id = #{menuId} and role_id = #{roleId}
+	</select>
+
+	<select id="listByRoleId" resultMap="SysRoleMenuResult">
+		select * from sys_role_menu where role_id = #{roleId}
+	</select>
+
+	<select id="listByRoleIdMenuIdList" resultMap="SysRoleMenuResult">
+		select * from sys_role_menu where role_id = #{roleId} and menu_id in
+		<foreach collection="menuIdList" item="menuId" open="(" separator="," close=")">
+			#{menuId}
+		</foreach>
+	</select>
+
 	<delete id="deleteRoleMenuByRoleId" parameterType="Long">
 		delete from sys_role_menu where role_id=#{roleId}
 	</delete>

+ 2 - 0
ruoyi-ui/package.json

@@ -49,6 +49,8 @@
     "js-beautify": "1.13.0",
     "js-cookie": "2.2.1",
     "jsencrypt": "3.0.0-rc.1",
+    "less": "^4.1.1",
+    "less-loader": "^4.1.0",
     "nprogress": "0.2.0",
     "quill": "1.3.7",
     "screenfull": "5.0.2",

+ 83 - 0
ruoyi-ui/src/api/modeler.js

@@ -11,3 +11,86 @@ export const getSearch = (data) => {
     data
   })
 }
+export const setMigrate = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/migrate',
+    method: 'post',
+    data
+  })
+}
+// 发布流程
+export const setPublish = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/publish',
+    method: 'post',
+    data
+  })
+}
+//停用流程
+export const setUnpublish = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/unpublish',
+    method: 'post',
+    data
+  })
+}
+//复制流程
+export const setCopy = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/copy',
+    method: 'post',
+    data
+  })
+}
+export const getLoad = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/load',
+    method: 'post',
+    data
+  })
+}
+export const getDuplicate = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/duplicate',
+    method: 'post',
+    data
+  })
+}
+export const getCommit = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/commit',
+    method: 'post',
+    data
+  })
+}
+export const getPublish = (data) => {
+  return request({
+    headers: {
+      'accountName': 'guest'
+    },
+    url: '/jflow/p/cs/module/publish',
+    method: 'post',
+    data
+  })
+}

+ 2 - 2
ruoyi-ui/src/api/system/menu.js

@@ -40,9 +40,9 @@ export function treeMenuNotAddLeafNode(roleId) {
   })
 }
 // 获取权限
-export function allLeafNodeById(id) {
+export function listMenus(id) {
   return request({
-    url: '/system/menu/allLeafNodeById/' + id,
+    url: '/system/menu/listMenus/' + id,
     method: 'get'
   })
 }

+ 9 - 0
ruoyi-ui/src/api/system/role.js

@@ -16,6 +16,15 @@ export function getRole(id) {
     method: 'get'
   })
 }
+
+// 保存
+export function setMenu(data) {
+  return request({
+    url: '/boman-system/role/menu',
+    method: 'post',
+    data: data
+  })
+}
 
 // 新增角色
 export function addRole(data) {

+ 238 - 0
ruoyi-ui/src/assets/styles/theme.scss

@@ -0,0 +1,238 @@
+@import '../../../node_modules/burgeon-ui/src/styles/index.scss';
+
+
+//接收主题参数,设置变量
+  // Prefix
+
+  // Color
+  @primary-color          : rgba(91, 133, 228, 1);
+  @info-color             : #2db7f5;
+  @success-color          : #19be6b;
+  @processing-color       : @primary-color;
+  @warning-color          : #ff9900;
+  @error-color            : #ed4014;
+  @normal-color           : #e6ebf1;
+  @link-color             : #2D8cF0;  //a链接
+  @link-hover-color       : tint(@link-color, 20%);
+  @link-active-color      : shade(@link-color, 5%);
+  @selected-color         : fade(@primary-color, 90%);
+  @tooltip-color          : #fff;
+  @subsidiary-color       : #808695;
+  @rate-star-color        : #f5a623;
+
+  // Base
+  @body-background        : #fff;
+  @font-family            : "Microsoft YaHei",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
+  @code-family            : Consolas,Menlo,Courier,monospace;
+  @title-color            : #666;
+  @text-color             : rgba(87, 87, 87, 1);
+  @font-size-base         : 12px;
+  @font-size-small        : 12px;
+  @font-size-large        : 16px;
+  @line-height-base       : 1;
+  @line-height-computed   : floor((@font-size-base * @line-height-base));
+  @border-radius-base     : 6px;
+  @border-radius-small    : 4px;
+  @cursor-disabled        : not-allowed;
+  @modal-radius-base      : 6px;
+  @modal-pos-radius-base      : 6px;
+  @modal-mask-background: rgba(0, 0, 0, 0.3);
+
+
+  @table-height-base: 27px;  //表行高
+  @table-th-height-base: 27px;//表头行高
+  @table-padding-base:8px;  //cell的padding值
+
+
+
+  // Border 配置
+  @border-color-base      : #dcdee2;  // outside
+  @border-color-split     : #e8eaec;  // inside
+  @border-width-base      : 1px;            // width of the border for a component
+  @border-style-base      : solid;          // style of a components border
+
+  // Background color
+  @background-color-base        : #f7f7f7;  // 全局背景色
+  @background-color-select-hover: @input-disabled-bg;  //默认选中背景颜色
+  @tooltip-bg                   : rgba(70, 76, 91, .9);
+  @head-bg                      : #f9fafc;
+  @table-thead-bg               : #f5f6fa;//表头背景色
+  @table-td-stripe-bg           : #f8f8f9;//斑马线颜色
+  @table-td-hover-bg            : rgba(235, 247, 255, 1);//hover颜色
+  @table-td-highlight-bg        : rgba(235, 247, 255, 1);//选中色
+  @menu-dark-title              : rgba(60, 63, 71, 1);
+  @menu-dark-active-bg          : rgba(47, 48, 52, 1);
+  @menu-dark-subsidiary-color   : rgba(255,255,255);  //菜单主题为menu时的文字颜色
+  @menu-dark-group-title-color  : rgba(255,255,255,.36);
+  @date-picker-cell-hover-bg    : #e1f0fe;
+
+  // Shadow
+  @shadow-color           : rgba(0, 0, 0, .2);
+  @shadow-base            : @shadow-down;
+  @shadow-card            : 0 1px 1px 0 rgba(0,0,0,.1);
+  @shadow-up              : 0 -1px 6px @shadow-color;
+  @shadow-down            : 0 1px 6px @shadow-color;
+  @shadow-left            : -1px 0 6px @shadow-color;
+  @shadow-right           : 1px 0 6px @shadow-color;
+
+  // Button
+  @btn-font-weight        : normal;
+  @btn-padding-base       : 8px 21px;
+  @btn-padding-large      : 6px 15px 6px 15px;
+  @btn-padding-small      : 1px 7px 2px;
+  @btn-padding-base-icon  : 5px 15px 6px;
+  @btn-padding-large-icon : 6px 15px 6px 15px;
+  @btn-padding-small-icon : 1px 7px 2px;
+  @btn-font-size          : 12px;
+  @btn-font-size-large    : 14px;
+  @btn-border-radius      : 4px;
+  @btn-border-radius-small: 3px;
+  @btn-group-border       : shade(@primary-color, 5%);
+
+
+  //按钮禁用样式
+  @btn-disable-color      : #D8D8D8;
+  @btn-disable-bg         : #F4F4F4;
+  @btn-disable-border     : #D8D8D8;
+
+  @btn-default-color      : @text-color;
+  @btn-default-bg         : #fff;
+  @btn-default-border     : @border-color-base;
+
+  //fc default button
+  @btn-fcdefault-color: @primary-color;
+  @btn-fcdefault-bg         : #fff;
+  @btn-fcdefault-border     : @primary-color;
+  @btn-fcdefault-disabled     : #D8D8D8 ;
+  @btn-fcdefault-disabled-bg     : #F4F4F4 ;
+  @btn-fcdefault-disabled-color:#D8D8D8;
+  @btn-fcdefault-width:50px;
+
+  //pos default button
+  @btn-posdefault-color: #fff;
+  @btn-posdefault-bg         : @primary-color;
+  @btn-posdefault-border     : @btn-posdefault-bg  ;
+  @btn-posdefault-hover-bg     : @primary-color;
+  @btn-posdefault-disabled     : #D8D8D8 ;
+  @btn-posdefault-disabled-bg     : #F4F4F4;
+  @btn-posdefault-disabled-color:#D8D8D8;
+
+  @btn-primary-color      : #fff;
+  @btn-primary-bg         : @primary-color;
+
+  @btn-ghost-color        : @text-color;
+  @btn-ghost-bg           : #fff;
+  @btn-ghost-border       : @border-color-base;
+
+  @btn-circle-size        : 28px;  //分页按钮大小
+  @btn-circle-size-large  : 36px;
+  @btn-circle-size-small  : 24px;
+
+  // Layout and grid
+  @grid-columns                : 24;
+  @grid-gutter-width           : 0;
+  @layout-body-background      : #f5f7f9;
+  @layout-header-background    : #515a6e;
+  @layout-header-height        : 64px;
+  @layout-header-padding       : 0 50px;
+  @layout-footer-padding       : 24px 50px;
+  @layout-footer-background    : @layout-body-background;
+  @layout-sider-background     : @layout-header-background;
+  @layout-trigger-height       : 48px;
+  @layout-trigger-color        : #fff;
+  @layout-zero-trigger-width   : 36px;
+  @layout-zero-trigger-height  : 42px;
+
+  // Legend   关闭按钮icon颜色
+  @legend-color           : #999;
+
+  // Input
+  @input-height-base           : 32px;
+  @input-height-large          : 36px;
+  @input-height-small          : 24px;
+
+  @input-padding-horizontal    : 10px;  //输入框左右padding
+  @input-padding-vertical-base : 5px; //输入框上下padding
+  @input-padding-vertical-small: 1px;
+  @input-padding-vertical-large: 6px;
+
+
+  @input-placeholder-color     : #aaa;
+  @input-color                 : @text-color;
+  @input-disabled-color        : @text-color;
+  @input-border-radius         : 2px;
+  @input-border-color          : rgba(216, 216, 216, 1);
+  @input-bg                    : #fff;
+  @input-group-bg              : #f8f8f9;
+
+  @input-hover-border-color    : rgba(15, 142, 233, 1);
+  @input-focus-border-color    : rgba(15, 142, 233, 1);
+  @input-disabled-bg           : rgba(244, 244, 244, 1);
+
+  // Tag
+  @tag-font-size          : 12px;
+
+  // Media queries breakpoints
+  // Extra small screen / phone
+  @screen-xs              : 480px;
+  @screen-xs-min          : @screen-xs;
+  @screen-xs-max          : (@screen-xs-min - 1);
+
+  // Small screen / tablet
+  @screen-sm              : 768px;
+  @screen-sm-min          : @screen-sm;
+  @screen-sm-max          : (@screen-sm-min - 1);
+
+  // Medium screen / desktop
+  @screen-md              : 992px;
+  @screen-md-min          : @screen-md;
+  @screen-md-max          : (@screen-md-min - 1);
+
+  // Large screen / wide desktop
+  @screen-lg              : 1200px;
+  @screen-lg-min          : @screen-lg;
+  @screen-lg-max          : (@screen-lg-min - 1);
+
+  // Z-index
+  @zindex-spin            : 8;
+  @zindex-affix           : 10;
+  @zindex-back-top        : 10;
+  @zindex-select          : 900;
+  @zindex-modal           : 1000;
+  @zindex-drawer          : 1000;
+  @zindex-message         : 1010;
+  @zindex-notification    : 1010;
+  @zindex-tooltip         : 1060;
+  @zindex-transfer        : 1060;
+  @zindex-loading-bar     : 2000;
+  @zindex-spin-fullscreen : 2010;
+
+  // Animation
+  @animation-time         : .3s;
+  @transition-time        : .2s;
+  @ease-in-out            : ease-in-out;
+
+  // Slider
+  @slider-color              : tint(@primary-color, 20%);
+  @slider-height             : 4px;
+  @slider-margin             : 16px 0;
+  @slider-button-wrap-size   : 18px;
+  @slider-button-wrap-offset : -4px;
+  @slider-disabled-color     : #ccc;
+
+  // Avatar
+  @avatar-size-base: 32px;
+  @avatar-size-lg: 40px;
+  @avatar-size-sm: 24px;
+  @avatar-font-size-base: 18px;
+  @avatar-font-size-lg: 24px;
+  @avatar-font-size-sm: 14px;
+  @avatar-bg: #ccc;
+  @avatar-color: #fff;
+  @avatar-border-radius: @border-radius-small;
+
+  // Anchor
+  @anchor-border-width: 2px;
+
+  //icon 字体大小
+  @icon-font:16px;

+ 1 - 1
ruoyi-ui/src/components/FormItemComponent/index.vue

@@ -61,7 +61,6 @@ export default {
         // 计算显示行数
         list[current].component = Vue.extend(list[current].component);
         temp.push(list[current]);
-        console.log(temp,998)
         return temp;
       }, []);
     },
@@ -93,6 +92,7 @@ export default {
   },
   created() {
     this.currentFormList = this.formItemLists.concat([]);
+    console.log(this.formItemLists,999999999)
   },
   methods: {
     inputChange(value, items, type) {

+ 18 - 6
ruoyi-ui/src/components/listModalComponent/index.vue

@@ -36,6 +36,11 @@
 <script>
 import {DispatchEvent} from '@/utils/dispatchEvent.js'
 import {  mapMutations } from 'vuex';
+import {
+    setPublish,
+    setUnpublish,
+    setCopy,
+  } from '@/api/modeler.js'
 export default {
   name:'listModalComponent',
   props:{
@@ -103,7 +108,7 @@ export default {
     },
     releaseProcess () {  //发布流程
       this.$refs.poptip.handleClose()
-      this.$network.post('/p/cs/module/publish', {id:this.items.id}).then((res) => {
+      setPublish({id:this.items.id}).then((res) => {
         if(typeof this.items.event.queryLists === 'function'){
           this.items.event.queryLists()
         }
@@ -112,7 +117,7 @@ export default {
     editingProcess () { //编辑流程
       this.$refs.poptip.handleClose()
       this.changeKeepAliveArray(['TemplateManagementLists'])
-      this.$router.push({ path: `/TemplateManagementNew/${this.items.id}` })
+      this.$router.push({ path: `/tool/activiti/TemplateManagementNew/${this.items.id}` })
       this.currentChange({
         path:'/TemplateManagementLists'
       });
@@ -127,7 +132,7 @@ export default {
     },
     stopProcess () {  //停用流程
       this.$refs.poptip.handleClose()
-      this.$network.post('/p/cs/module/unpublish', {id:this.items.id}).then((res) => {
+      setUnpublish({id:this.items.id}).then((res) => {
         if(typeof this.items.event.queryLists === 'function'){
           this.items.event.queryLists()
         }
@@ -135,20 +140,27 @@ export default {
     },
     copyProcess () {  //复制流程
       this.$refs.poptip.handleClose()
-      this.$network.post('/p/cs/module/copy', {id:this.items.id}).then((res) => {
-        if(res.data.resultCode === 0){
+      setCopy({id:this.items.id}).then((res) => {
+        if(res.resultCode === 0){
           this.changeKeepAliveArray(['TemplateManagementLists'])
           this.$router.push({ path: `/TemplateManagementNew/${res.data.data.id}` })
           this.currentChange({
             path:'/TemplateManagementLists'
           });
+        }else{
+          this.$Modal.fcError({
+            title:'错误',
+            content:res.resultMsg,
+            onOk: () => {
+            }
+          })
         }
       })
     },
     previewProcess () { //预览流程
       this.$refs.poptip.handleClose()
       this.changeKeepAliveArray(['TemplateManagementLists'])
-      this.$router.push({ path: `/TemplateManagementNew/${this.items.id}/1` })
+      this.$router.push({ path: `/tool/activiti/TemplateManagementNew/${this.items.id}/1` })
       this.currentChange({
         path:'/TemplateManagementLists'
       });

+ 321 - 0
ruoyi-ui/src/config/props.config.js

@@ -0,0 +1,321 @@
+// 输入框
+const input = {
+  // item 类型
+  type: 'input', // 必填!
+  // label名称
+  title: '', // 必填!
+  // 字段名称
+  field: '', // 必填!
+  // input值
+  value: '',
+  props: {
+    // 输入框类型,可选值为 text、password、textarea、url、email、date
+    type: 'text', // 必填!
+    // 是否显示清空按钮
+    clearable: false,
+    // 设置输入框为禁用状态
+    disabled: false,
+    // 设置输入框为只读
+    readonly: false,
+    // 文本域默认行数,仅在 textarea 类型下有效
+    rows: 4,
+    // 自适应内容高度,仅在 textarea 类型下有效,可传入对象,如 { minRows: 2, maxRows: 6 }
+    autosize: false,
+    // 将用户的输入转换为 Number 类型。在有正则的时候:1)该输入框为空的时候,值为空字符串。2)input方法不可用。
+    number: false,
+    // 自动获取焦点
+    autofocus: false,
+    // 原生的自动完成功能,可选值为 off 和 on
+    autocomplete: 'off',
+    // 占位文本
+    placeholder: '请输入',
+    // 输入框尺寸,可选值为large、small、default或者不设置
+    size: 'default',
+    // 最大输入长度
+    maxlength: null,
+    // 输入框尾部图标,仅在 text 类型下有效
+    icon: null,
+    // 输入框头部图标
+    prefix: null,
+    // 输入框尾部图标
+    suffix: null,
+    // 给表单元素设置 id,详见 Form 用法。
+    'element-id': null,
+    // 原生的 spellcheck 属性
+    spellcheck: false,
+    // 原生的 wrap 属性,可选值为 hard 和 soft,仅在 textarea 下生效
+    wrap: 'soft',
+    // 正则表达式
+    regx: null
+  },
+  event: {
+    // 按下回车键时触发
+    enter: (event, $this) => {},
+    // 设置 icon 属性后,点击图标时触发
+    click: (event, $this) => {},
+    // 数据改变时触发
+    change: (event, $this) => {},
+    // 输入框聚焦时触发
+    focus: (event, $this) => {},
+    // 输入框失去焦点时触发
+    blur: (event, $this) => {},
+    // 原生的 keyup 事件
+    keyup: (event, $this) => {},
+    // 原生的 keydown 事件
+    keydown: (event, $this) => {},
+    // 原生的 keypress 事件
+    keypress: (event, $this) => {},
+    // 开启 search 时可用,点击搜索或按下回车键时触发
+    search: (event, $this) => {},
+    // 添加正则后,校验出错的时候触发
+    regxCheck: (value, $this, errorValue) => {}
+  },
+};
+// 下拉框
+const select = {
+  type: 'select', // 必填!
+  // label名称
+  title: '', // 必填!
+  // 字段名称
+  field: '', // 必填!
+  // input值
+  value: '',
+  // 可选参数
+  options: [
+    // { value: '104', label: '生态蔬菜', disabled: false },
+    // { value: '105', label: '新鲜水果', disabled: false },
+  ],
+  props: {
+    // 是否支持多选
+    multiple: false,
+    // 多选情况下的样式控制,只在multiple为true有效
+    multipleType: false,
+    // 是否禁用
+    disabled: false,
+    // 是否可以清空选项,只在单选时有效
+    clearable: true,
+    // 选择框大小,可选值为large、small、default或者不填
+    size: 'default',
+    // 选择框默认文字
+    placeholder: '请选择',
+    // 当下拉列表为空时显示的内容
+    'not-found-text': '无匹配数据',
+    // 在返回选项时,是否将 label 和 value 一并返回,默认只返回 value
+    'label-in-value': false,
+    // 弹窗的展开方向,可选值为 bottom 和 top
+    placement: 'bottom',
+    // 是否将弹层放置于 body 内,在 Tabs、带有 fixed 的 Table 列内使用时,建议添加此属性,它将不受父级样式影响,从而达到更好的效果
+    transfer: true,
+  }
+};
+// Switch
+const Switch = {
+  type: 'Switch', // 必填!
+  // label名称
+  title: '', // 必填!
+  // 字段名称
+  field: '', // 必填!
+  // input值
+  value: false,
+  props: {
+    
+  }
+};
+// 单选框
+const radiobox = {
+  type: 'radiobox', // 必填!
+  // label名称
+  title: '', // 必填!
+  // 字段名称
+  field: '', // 必填!
+  // input值
+  value: false,
+  // 可选参数
+  props: {
+    // 多选框组的尺寸,可选值为 large、small、default 或者不设置
+    size: 'default',
+    // 是否禁用当前项
+    disabled: false
+  }
+};
+// 复选框
+const checkbox = {
+  type: 'checkbox', // 必填!
+  // label名称
+  title: '', // 必填!
+  // 字段名称
+  field: '', // 必填!
+  // input值
+  value: false,
+  // 可选参数
+  props: {
+    // 多选框组的尺寸,可选值为 large、small、default 或者不设置
+    size: 'default',
+    // 是否禁用当前项
+    disabled: false,
+    // 支持checkout样式为radio样式
+    circle: false
+  },
+  event: {
+    change: (event, $this) => {},
+  }
+};
+// 日期选择
+const DatePicker = {
+  type: 'DatePicker', // 必填!
+  field: '', // 必填!
+  title: '活动日期', // 必填!
+  // input值, type为daterange,datetimerange value为数组 [start_value,end_value]
+  value: '',
+  props: {
+    // 显示类型,可选值为 date、daterange、datetime、datetimerange、year、month
+    type: 'datetimerange', // 必填!
+    // 展示的日期格式
+    format: 'yyyy-MM-dd HH:mm',
+    // 日期选择器出现的位置,可选值为toptop-starttop-endbottombottom-startbottom-endleftleft-startleft-endrightright-startright-end
+    placement: 'bottom-start',
+    // 占位文本
+    placeholder: '请选择获得时间',
+    // 选择器额外配置,比如不可选日期与快捷选项
+    options: {
+      disabledDate (date) {
+          return date && date.valueOf() > Date.now();
+      }
+    },
+    // 手动控制日期选择器的显示状态,true 为显示,false 为收起。使用该属性后,选择器不会主动关闭。建议配合 slot 及 confirm 和相关事件一起使用
+    open: null,
+    // 是否显示底部控制栏,开启后,选择完日期,选择器不会主动关闭,需用户确认后才可关闭
+    confirm: false,
+    // 尺寸,可选值为large、small、default或者不设置
+    size: 'default',
+    // 是否禁用选择器
+    disabled: false,
+    // 是否显示清除按钮
+    clearable: true,
+    // 完全只读,开启后不会弹出选择器
+    readonly: false,
+    // 文本框是否可以输入
+    editable: false,
+    // 是否将弹层放置于 body 内,在 Tabs、带有 fixed 的 Table 列内使用时,建议添加此属性,它将不受父级样式影响,从而达到更好的效果
+    transfer: true
+  }
+};
+
+// 下拉框
+const DropDownSelectFilter = {
+  type: 'DropDownSelectFilter', // 必填!
+  field: '', // 必填!
+  title: '', // 必填!
+  value: '',
+  props: {
+    placeholder:'请选择',
+    // 是否是单选,可选值为 true、false
+    single: true,
+    // 下拉气泡表格里数据
+    data: {},
+    // 数据总条数
+    totalRowCount: 0,
+    // 每页条数
+    pageSize: 10,
+    // 模糊搜索的数据
+    AutoData: [],
+    // 模糊搜索要显示的列
+    columns: [],
+    // 无数据的时候提示
+    dataEmptyMessage: '暂无数据',
+    // 下拉多选 默认选中数据
+    defaultSelected: [],
+    // 是否将弹层放置于 body 内
+    transfer: true,
+    columnsKey:[]
+  }
+};
+//下拉和输入框混合
+
+const selectInput = {
+  // item 类型
+  type: 'selectInput', // 必填!
+  // label名称
+  title: '', // 必填!
+  // 字段名称
+  field: '', // 必填!
+  // input值
+  value: '',
+  slotfiled:'',//卡槽对应的键
+  slotValue:'', 
+  props: {
+    // 输入框类型,可选值为 text、password、textarea、url、email、date
+    type: 'text', // 必填!
+    // 是否显示清空按钮
+    clearable: false,
+    // 设置输入框为禁用状态
+    disabled: false,
+    // 设置输入框为只读
+    readonly: false,
+    // 文本域默认行数,仅在 textarea 类型下有效
+    rows: 4,
+    // 自适应内容高度,仅在 textarea 类型下有效,可传入对象,如 { minRows: 2, maxRows: 6 }
+    autosize: false,
+    // 将用户的输入转换为 Number 类型。在有正则的时候:1)该输入框为空的时候,值为空字符串。2)input方法不可用。
+    number: false,
+    // 自动获取焦点
+    autofocus: false,
+    // 原生的自动完成功能,可选值为 off 和 on
+    autocomplete: 'off',
+    // 占位文本
+    placeholder: '请输入',
+    // 输入框尺寸,可选值为large、small、default或者不设置
+    size: 'default',
+    // 最大输入长度
+    maxlength: null,
+    // 输入框尾部图标,仅在 text 类型下有效
+    icon: null,
+    // 输入框头部图标
+    prefix: null,
+    // 输入框尾部图标
+    suffix: null,
+    // 给表单元素设置 id,详见 Form 用法。
+    'element-id': null,
+    // 原生的 spellcheck 属性
+    spellcheck: false,
+    // 原生的 wrap 属性,可选值为 hard 和 soft,仅在 textarea 下生效
+    wrap: 'soft',
+    // 正则表达式
+    regx: null
+  },
+  event: {
+    // 按下回车键时触发
+    enter: (event, $this) => {},
+    // 设置 icon 属性后,点击图标时触发
+    click: (event, $this) => {},
+    // 数据改变时触发
+    change: (event, $this) => {},
+    // 输入框聚焦时触发
+    focus: (event, $this) => {},
+    // 输入框失去焦点时触发
+    blur: (event, $this) => {},
+    // 原生的 keyup 事件
+    keyup: (event, $this) => {},
+    // 原生的 keydown 事件
+    keydown: (event, $this) => {},
+    // 原生的 keypress 事件
+    keypress: (event, $this) => {},
+    // 开启 search 时可用,点击搜索或按下回车键时触发
+    search: (event, $this) => {},
+    // 添加正则后,校验出错的时候触发
+    regxCheck: (value, $this, errorValue) => {}
+  },
+};
+
+
+const dataProp = {
+  DatePicker,
+  checkbox,
+  radiobox,
+  Switch,
+  select,
+  input,
+  selectInput,
+  DropDownSelectFilter
+};
+export default dataProp;

+ 8 - 2
ruoyi-ui/src/main.js

@@ -1,6 +1,10 @@
 import Vue from 'vue'
 
-import Cookies from 'js-cookie'
+import Cookies from 'js-cookie'
+
+// import '@/assets/styles/theme.scss';
+import less from 'less'
+Vue.use(less)
 
 import Element from 'element-ui'
 import './assets/styles/element-variables.scss'
@@ -12,7 +16,9 @@ import App from './App'
 import store from './store'
 import router from './router'
 import permission from './directive/permission'
-import { download } from '@/utils/request'
+import { download } from '@/utils/request'
+
+import '@/utils/dateApi'
 
 
 import './assets/icons' // icon

+ 81 - 0
ruoyi-ui/src/utils/dateApi.js

@@ -0,0 +1,81 @@
+
+/**
+ * 返回yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd格式的日期字符串
+ * 如:"2016-09-22T08:37:43.438Z" --> "2016-09-22 08:37:43"
+ * 传参格式: yyyy-MM-dd hh:mm:ss yyyy-MM-dd
+ */
+Date.prototype.format = function(fmt) { 
+  var o = { 
+     "M+" : this.getMonth()+1,                 //月份 
+     "d+" : this.getDate(),                    //日 
+     "h+" : this.getHours(),                   //小时 
+     "m+" : this.getMinutes(),                 //分 
+     "s+" : this.getSeconds(),                 //秒 
+     "q+" : Math.floor((this.getMonth()+3)/3), //季度 
+     "S"  : this.getMilliseconds()             //毫秒 
+ }; 
+ if(/(y+)/.test(fmt)) {
+         fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)); 
+ }
+  for(var k in o) {
+     if(new RegExp("("+ k +")").test(fmt)){
+          fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
+      }
+  }
+ return fmt; 
+}  
+ 
+/**
+ * 返回一个加上days天的新Date
+ */
+Date.prototype.plusDays = function plusDays(days) {
+  return new Date(this.getTime() + days * 60 * 60 * 24 * 1000);
+};
+ 
+/**
+ * 返回一个减去days天的新Date
+ */
+Date.prototype.minusDays = function minusDays(days) {
+  return new Date(this.getTime() - days * 60 * 60 * 24 * 1000);
+};
+ 
+/**
+ * 返回一个加上若干个月的新Date
+ * 注1:Date(2-28).plusMonth(1)=Date(3-28)。如果需要变成3-31,需要另外的函数来处理。
+ * 注2:Date(1-31).plusMonth(1)=Date(2-28)或Date(2-29)
+ */
+Date.prototype.plusMonths = function plusMonths(num) {
+  const newDate = new Date(this);
+  newDate.setMonth(this.getMonth() + num); // setMonth()会自动除以12
+  // 注意:此时,月数可能会自动进位,比如:1-31加上num=1的情况,会变成3-3(非闰年)或3-2(闰年),即2-31自动转换为下个月的某一天。
+  const currentMonth = this.getMonth() + this.getFullYear() * 12; // 获得月的绝对值
+  const diff = (newDate.getMonth() + newDate.getFullYear() * 12) - currentMonth; // 计算新旧两个月绝对值的差
+
+  if (diff !== num) { // 如果月绝对值的差和加上的月数不一样,说明月进位了,此时需要退一个月
+    // setDate(0)表示变成上个月的最后一天
+    newDate.setDate(0);
+  }
+  return newDate;
+};
+ 
+/**
+ * 返回下个月的第一天的Date对象
+ */
+Date.prototype.getStartOfNextMonth = function getStartOfNextMonth() {
+  const newDate = new Date(this);
+  newDate.setDate(15); // 确保月数不会进位
+  newDate.setMonth(this.getMonth() + 1);
+  newDate.setDate(1);
+  return newDate;
+}; 
+ 
+/**
+ * 返回下个月的最后一天的Date对象
+ */
+Date.prototype.getEndOfNextMonth = function getEndOfNextMonth() {
+  const newDate = new Date(this);
+  newDate.setDate(15); // 确保月数不会进位
+  newDate.setMonth(this.getMonth() + 2); // 加两个月
+  newDate.setDate(0); // 再退回上个月的最后一天
+  return newDate;
+};

+ 26 - 23
ruoyi-ui/src/views/activiti/TemplateManagementNew/index.vue

@@ -1,12 +1,10 @@
 <template>
   <div class="TemplateManagementNew">
-    <Breadcrumb separator=">" class="breadcrumb">
+  <!--  <Breadcrumb separator=">" class="breadcrumb">
         <BreadcrumbItem to="/TemplateManagementLists">模版管理</BreadcrumbItem>
         <BreadcrumbItem>{{$route.params.id != '-1'?'编辑模版':'新建模版'}}</BreadcrumbItem>
 
-    </Breadcrumb>
-
-
+    </Breadcrumb> -->
     <!-- 预览状态 -->
     <div class="content" v-if="this.readOnly">
       <div class="tips" v-if="currentSteps === 2">
@@ -80,6 +78,12 @@ import FlowChartComponent from '@/components/FlowChartComponent'
 import FlowSuccess from '@/components/FlowSuccess'
 import {  mapMutations } from 'vuex';
 import { setTimeout } from 'timers';
+import {
+    getLoad,
+    getCommit,
+    getDuplicate,
+    getPublish
+  } from '@/api/modeler.js'
 export default {
   name:'TemplateManagementNew',
   components:{ParameterConfiguration,FlowChartComponent,FlowSuccess},
@@ -197,22 +201,22 @@ export default {
   methods:{
     ...mapMutations(['currentChange']),
     getModuleInfo (id) {
-      this.$network.post('/p/cs/module/load', {id:id}).then((res) => {
-        if(res.data.resultCode === 0){
-          res.data.data.businessType = [{
-            ID:res.data.data.businessType,
-            Label:res.data.data.businessTypeName,
-            val:res.data.data.businessTypeText
+      getLoad({id:id}).then((res) => {
+        if(res.resultCode === 0){
+          res.data.businessType = [{
+            ID:res.data.businessType,
+            Label:res.data.businessTypeName,
+            val:res.data.businessTypeText
           }]
 
-          res.data.data.businessNumber = [{
-            ID:String(res.data.data.businessKeyId),
-            Label:res.data.data.businessKey,
-            val:res.data.data.businessKeyName
+          res.data.businessNumber = [{
+            ID:String(res.data.businessKeyId),
+            Label:res.data.businessKey,
+            val:res.data.businessKeyName
           }]
-          this.data = res.data.data
-          this.data.guiStyle = JSON.parse(res.data.data.guiStyle)
-          this.data.moduleId = res.data.data.id
+          this.data = res.data
+          this.data.guiStyle = JSON.parse(res.data.guiStyle)
+          this.data.moduleId = res.data.id
 
           this.$nextTick(() => {
             if(this.readOnly){
@@ -279,16 +283,15 @@ export default {
           ID:this.data.moduleId,
           NAME:this.data.name
         }
-        this.$network.post('/p/cs/module/duplicate',jsonObject).then(res => {
-            if(res.data.resultCode !== 0){
+        getDuplicate(jsonObject).then(res => {
+            if(res.resultCode !== 0){
               this.$Modal.fcWarning({
                 title:'警告',
-                content:res.data.resultMsg,
+                content:res.resultMsg,
                 mask:true
               })
               reject()
             }
-
             resolve(res)
         })
       })
@@ -336,7 +339,7 @@ export default {
           removeNode: this.data.removeNode,
           removePath: this.data.removePath
         }
-        this.$network.post('/p/cs/module/commit',jsonObject).then(res => {
+        getCommit(jsonObject).then(res => {
             if(res.data.resultCode === 0){
               // this.data = {
               //   guiStyle:{
@@ -459,7 +462,7 @@ export default {
     },
     confirmAndPublish () {  //保存并发布
       this.confirm(true).then(res => {
-        this.$network.post('/p/cs/module/publish', {id:res.data.data.id}).then((response) => {
+        getPublish({id:res.data.data.id}).then((response) => {
           if(response.data.resultCode === 0){
             this.$router.push('/TemplateManagementLists')
             this.currentChange({

+ 21 - 15
ruoyi-ui/src/views/activiti/modeler/index.vue

@@ -6,19 +6,19 @@
           <el-button type="primary" plain size="mini" @click="searchData.page = 1;queryLists()">查询</el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="warning" plain :disabled="listsStatus === 1" size="mini" @click="addTemplate" v-hasPermi="['tool:gen:code']">新建模板</el-button>
+          <el-button type="warning" plain :disabled="listsStatus === 1" size="mini" @click="addTemplate">新建模板</el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="primary" plain :disabled="listsStatus === 1" size="mini" @click="templateMigration" v-if="listsStatus === 0" v-hasPermi="['tool:gen:code']">模版迁移</el-button>
+          <el-button type="primary" plain size="mini" @click="templateMigration" v-if="listsStatus === 0">模版迁移</el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="primary" plain :disabled="listsStatus === 1" size="mini" @click="removeMigration" v-if="listsStatus === 1" v-hasPermi="['tool:gen:code']">取消迁移</el-button>
+          <el-button type="primary" plain size="mini" @click="removeMigration" v-if="listsStatus === 1">取消迁移</el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="primary" plain :disabled="listsStatus === 1" size="mini" @click="perform" v-if="listsStatus === 1" v-hasPermi="['tool:gen:code']">执行</el-button>
+          <el-button type="primary" plain size="mini" @click="perform" v-if="listsStatus === 1">执行</el-button>
         </el-col>
         <el-col :span="1.5">
-          <el-button type="primary" plain :disabled="listsStatus === 1" size="mini" @click="performAll" v-if="listsStatus === 1" v-hasPermi="['tool:gen:code']">执行全部</el-button>
+          <el-button type="primary" plain size="mini" @click="performAll" v-if="listsStatus === 1">执行全部</el-button>
         </el-col>
         </el-row>
       <Alert show-icon closable v-if="listsStatus === 1">依次单击模板可进行多选模板</Alert>
@@ -83,7 +83,8 @@ import ItemComponent from '@/components/ItemComponent';
 import StandardTable from '@/components/StandardTable';
 import listModalComponent from '@/components/listModalComponent'
 import {
-    getSearch
+    getSearch,
+    setMigrate
   } from '@/api/modeler.js'
 
 // import router from '../config/router.config'
@@ -230,10 +231,10 @@ export default {
       delete obj.createTime
       delete obj.status
       getSearch(obj).then((res) => {
-        if(res.data.resultCode !== 0){
+        if(res.resultCode !== 0){
           return
         }
-        let data = res.data.data
+        let data = res.data
         this.total = data.total
 
         this.listsConfig = data.records.reduce((arr,item) => {
@@ -257,7 +258,7 @@ export default {
     },
     addTemplate () {  //新建模版
       this.changeKeepAliveArray(['TemplateManagementLists'])
-      this.$router.push({ path: '/TemplateManagementNew/-1' })
+      this.$router.push({ path: '/tool/activiti/TemplateManagementNew/-1' })
       this.currentChange({
         path:'/TemplateManagementLists'
       });
@@ -324,12 +325,11 @@ export default {
       }
 
       obj.url = this.serverUrl
-      this.$network.post('/p/cs/module/migrate', obj)
-        .then((res) => {
-          if(res.data.resultCode === 0){
+      setMigrate(obj).then((res) => {
+          if(res.resultCode === 0){
             this.$Modal.fcSuccess({
               title:'成功',
-              content:res.data.resultMsg,
+              content:res.resultMsg,
               onOk: () => {
                 this.queryLists()
                 this.listsStatus = 0
@@ -339,9 +339,14 @@ export default {
             })
 
           }else{
-            this.performloading = false
+            this.$Modal.fcError({
+              title:'错误',
+              content:res.resultMsg,
+              onOk: () => {
+                this.performloading = false
+              }
+            })
           }
-
         })
     }
   },
@@ -352,6 +357,7 @@ export default {
       this.searchData.status = [status]
       this.formLists[1].item.value = [status]
       this.formLists = this.formLists.concat([])
+      console.log(this.formLists,8888888)
     }
     this.queryLists()
   },

+ 110 - 27
ruoyi-ui/src/views/system/role/fz-index.vue

@@ -17,7 +17,7 @@
           </el-col>
           <el-col :span="1.5">
             <el-button type="primary" style="background-color: #3C8DBC;color: #fff;border: none;" plain icon="el-icon-my-export"
-              @click="handleAdd" v-hasPermi="['system:role:edit']">保存</el-button>
+              @click="handleMenu" v-hasPermi="['system:role:edit']">保存</el-button>
           </el-col>
         </el-row>
       </el-col>
@@ -33,8 +33,11 @@
           </div>
         </div>
         <div class="searList">
-          <div class="searItem" v-loading.fullscreen.lock="fullscreenLoading" v-for="item in roleList" @click="searBtnFn(item)" :class="{'active': item.id == roleId}">
-            {{item.roleName}}
+          <div class="searItem searItemLeft" element-loading-text="拼命加载中" v-loading.fullscreen.lock="fullscreenLoading" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.4)" v-for="item in roleList" @click="searBtnFn(item)" :class="{'active': item.id == roleId}" :key="item.id">
+            <span>
+              {{item.roleName}}
+            </span>
+            <i class="el-icon-delete" @click.stop="handleDelete(item)" v-if="item.id == roleId"></i>
           </div>
         </div>
         <pagination sty v-show="total>0" :total="total" layout="prev, pager, next" :page.sync="queryParams.pageNum"
@@ -53,23 +56,46 @@
                 <div class="searName">
                   功能
                 </div>
-                <div class="searItem" v-for="item in 8">
-                  <el-checkbox :label="'新增'+item"></el-checkbox>
+                <div class="searItem" v-for="item in menusList.heads">
+                  {{item.name}}
                 </div>
               </div>
-              <div class="searCont" v-for="items in 12" @click="searIndex = item" :class="{'active': searIndex == item}">
+              <div class="searCont" v-if="menusList.sysMenus.length" v-for="items in menusList.sysMenus" @click="searIndex = items.id" :class="{'active': searIndex == items.id}" :key="items.id">
                 <div class="searName">
-                  功能功能{{items}}
+                  {{items.menuName}}
                 </div>
-                <div class="searItem" v-for="item in 8">
-                  <el-checkbox></el-checkbox>
+                <div class="searItem" v-for="(itemChild,indexChild) in items.containsHead" :key="indexChild">
+                  <el-checkbox @change="checkChange" :disabled="itemChild.type==='0'" v-model="itemChild.type"></el-checkbox>
                 </div>
               </div>
             </div>
           </el-col>
         </div>
       </el-col>
-    </el-row>
+    </el-row>
+
+
+    <!-- 添加或修改角色配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        </el-form-item>
+        <el-form-item label="权限字符" prop="roleKey">
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+        </el-form-item>
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -82,11 +108,12 @@
     updateRole,
     exportRole,
     dataScope,
+    setMenu,
     changeRoleStatus
   } from "@/api/system/role";
   import {
     treeselect as menuTreeselect,
-    allLeafNodeById,
+    listMenus,
     treeMenuNotAddLeafNode
   } from "@/api/system/menu";
   import {
@@ -95,9 +122,11 @@
   } from "@/api/system/dept";
 
   export default {
-    name: "Role",
+    name: "Role",
+    inject: ['reload'],
     data() {
       return {
+        modifyStatus: false,
         fullscreenLoading: false,
         searIndex: '',
         data: [],
@@ -105,7 +134,8 @@
           children: 'children',
           label: 'label'
         },
-        indexs: 3,
+        indexs: 3,
+        menusList: '',
         // 遮罩层
         loading: true,
         // 选中数组
@@ -198,14 +228,57 @@
       });
     },
     methods: {
+      checkChange() {
+        this.modifyStatus = true
+      },
+      handleMenu() {
+        if(!this.modifyStatus){
+          this.msgInfo('没有修改的内容!')
+          return
+        }
+        let data = []
+        for(let item of this.menusList.sysMenus){
+          let obj = {}
+          obj.roleId = this.roleId
+          obj.menuId = item.id
+          obj.head = []
+          for(let itemChild of item.containsHead){
+            if(itemChild.type === true){
+              obj.head.push(itemChild.name)
+            }
+          }
+          data.push(obj)
+        }
+        setMenu(JSON.stringify(data)).then(res => {
+          this.msgSuccess('保存成功')
+          this.modifyStatus = false
+        })
+      },
       qxList(e) {
-        allLeafNodeById(e.id).then(res => {
-          console.log(res)
+        const _this = this
+        console.log(this.modifyStatus)
+        if(this.modifyStatus){
+          this.$confirm('当前页面存在未保存内容,是否保存后切换?', "提醒", {
+            confirmButtonText: "留下",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+
+          }).catch(function() {
+            _this.modifyStatus = false
+            _this.qxList(e)
+          });
+          return
+        }
+        listMenus(e.id).then(res => {
+          let data = res.data
+          this.menusList = data
         })
       },
       refreshFn() {
-        this.getList()
-        this.deptOptions = []
+        // this.getList()
+        this.reload()
+        // this.deptOptions = []
       },
       searBtnFn(item) {
         this.roleId = item.id
@@ -408,14 +481,14 @@
         this.$refs["form"].validate(valid => {
           if (valid) {
             if (this.form.id != undefined) {
-              this.form.menuIds = this.getMenuAllCheckedKeys();
+              // this.form.menuIds = this.getMenuAllCheckedKeys();
               updateRole(this.form).then(response => {
                 this.msgSuccess("修改成功");
                 this.open = false;
                 this.getList();
               });
             } else {
-              this.form.menuIds = this.getMenuAllCheckedKeys();
+              // this.form.menuIds = this.getMenuAllCheckedKeys();
               addRole(this.form).then(response => {
                 this.msgSuccess("新增成功");
                 this.open = false;
@@ -442,11 +515,13 @@
         this.$confirm('是否确认删除角色编号为"' + ids + '"的数据项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
-          type: "warning"
+          type: "warning",
+
         }).then(function() {
           return delRole(ids);
         }).then(() => {
-          this.getList();
+          this.getList();
+          this.deptOptions = []
           this.msgSuccess("删除成功");
         })
       },
@@ -459,7 +534,12 @@
     }
   };
 </script>
-<style lang="scss" scoped>
+<style lang="scss" scoped>
+  .searItemLeft{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
   .roleContrBox {
     background-color: #fff;
     border-radius: 6px;
@@ -494,12 +574,13 @@
         .searName {
           color: #343434;
           font-size: 12px;
-          width: 156px;
+          width: 116px;
         }
 
         .searItem {
           flex: 1;
-          font-size: 12px;
+          font-size: 12px;
+          text-align: center;
         }
       }
 
@@ -514,12 +595,13 @@
         .searName {
           color: #343434;
           font-size: 12px;
-          width: 156px;
+          width: 116px;
         }
 
         .searItem {
           flex: 1;
-          font-size: 12px;
+          font-size: 12px;
+          text-align: center;
         }
 
         &:hover {
@@ -591,7 +673,8 @@
         line-height: 30px;
         font-size: 12px;
         color: #343434;
-        cursor: pointer;
+        cursor: pointer;
+        text-align: center;
       }
 
       .active {

+ 5 - 5
ruoyi-ui/src/views/system/role/index.vue

@@ -462,7 +462,7 @@ export default {
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.roleId)
+      this.ids = selection.map(item => item.id)
       this.single = selection.length!=1
       this.multiple = !selection.length
     },
@@ -499,14 +499,14 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
-      this.getMenuTreeselect();
+      // this.getMenuTreeselect();
       this.open = true;
       this.title = "添加角色";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
-      const roleId = row.roleId || this.ids
+      const roleId = row.id || this.ids
       const roleMenu = this.getRoleMenuTreeselect(roleId);
       getRole(roleId).then(response => {
         this.form = response.data;
@@ -580,7 +580,7 @@ export default {
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      const roleIds = row.roleId || this.ids;
+      const roleIds = row.id || this.ids;
       this.$confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?', "警告", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
@@ -607,4 +607,4 @@ export default {
     }
   }
 };
-</script>
+</script>