diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/MenuController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/MenuController.java index 882448b..7807026 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/MenuController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/MenuController.java @@ -17,24 +17,17 @@ package org.nl.modules.system.rest; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.map.MapUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.PageUtil; import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.logging.annotation.Log; import org.nl.modules.system.domain.Menu; import org.nl.modules.system.service.MenuService; import org.nl.modules.system.service.dto.MenuDto; -import org.nl.modules.system.service.dto.MenuQueryCriteria; -import org.nl.modules.system.service.mapstruct.MenuMapper; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -60,7 +53,7 @@ public class MenuController { @GetMapping(value = "/build") @ApiOperation("根据用户获取菜单") public ResponseEntity buildMenus() { - List menuDtoList = menuService.findByUser(SecurityUtils.getCurrentUserId()); + List menuDtoList = menuService.findByUser(String.valueOf(SecurityUtils.getCurrentUserId())); List menuDtos = menuService.buildTree(menuDtoList); return new ResponseEntity<>(menuService.buildMenus(menuDtos),HttpStatus.OK); } @@ -68,7 +61,7 @@ public class MenuController { @ApiOperation("返回全部的菜单") @GetMapping(value = "/lazy") @SaCheckPermission(value = {"menu:list", "roles:list"}, mode = SaMode.AND) - public ResponseEntity query(@RequestParam Long pid) { + public ResponseEntity query(@RequestParam String pid) { return new ResponseEntity<>(menuService.getMenus(pid), HttpStatus.OK); } @@ -92,12 +85,12 @@ public class MenuController { @ApiOperation("根据菜单ID返回所有子节点ID,包含自身ID") @GetMapping(value = "/child") @SaCheckPermission(value = {"menu:list", "roles:list"}, mode = SaMode.AND) - public ResponseEntity child(@RequestParam Long id) { + public ResponseEntity child(@RequestParam String id) { Set menuSet = new HashSet<>(); List menuList = menuService.getMenus(id); menuSet.add(menuService.findById(id)); menuSet = menuService.getChildMenus(menuList, menuSet); - Set ids = menuSet.stream().map(MenuDto::getMenu_id).collect(Collectors.toSet()); + Set ids = menuSet.stream().map(MenuDto::getMenu_id).collect(Collectors.toSet()); return new ResponseEntity<>(ids, HttpStatus.OK); } @@ -113,10 +106,10 @@ public class MenuController { @ApiOperation("查询菜单:根据ID获取同级与上级数据") @PostMapping("/superior") @SaCheckPermission("menu:list") - public ResponseEntity getSuperior(@RequestBody List ids) { + public ResponseEntity getSuperior(@RequestBody List ids) { Set menuDtos = new LinkedHashSet<>(); if (CollectionUtil.isNotEmpty(ids)) { - for (Long id : ids) { + for (String id : ids) { MenuDto menuDto = menuService.findById(id); menuDtos.addAll(menuService.getSuperior(menuDto, new ArrayList<>())); } @@ -147,12 +140,12 @@ public class MenuController { @ApiOperation("删除菜单") @DeleteMapping @SaCheckPermission("menu:del") - public ResponseEntity delete(@RequestBody Set ids) { + public ResponseEntity delete(@RequestBody Set ids) { Set menuSet = new HashSet<>(); - for (Long id : ids) { - /* List menuList = menuService.getMenus(id);*/ + for (String id : ids) { + List menuList = menuService.getMenus(id); menuSet.add(menuService.findById(id)); - /*menuSet = menuService.getChildMenus(menuMapper.toEntity(menuList), menuSet);*/ + menuSet = menuService.getChildMenus(menuList, menuSet); } menuService.delete(menuSet); return new ResponseEntity<>(HttpStatus.OK); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/RoleController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/RoleController.java index bb01975..e9ea75c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/RoleController.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/rest/RoleController.java @@ -19,8 +19,6 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.Dict; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -62,7 +60,7 @@ public class RoleController { @ApiOperation("获取单个role") @GetMapping(value = "/{id}") @SaCheckPermission("roles:list") - public ResponseEntity query(@PathVariable Long id) { + public ResponseEntity query(@PathVariable Long id){ return new ResponseEntity<>(roleService.findById(id), HttpStatus.OK); } @@ -76,30 +74,33 @@ public class RoleController { @ApiOperation("返回全部的角色") @GetMapping(value = "/all") @SaCheckPermission(value = {"roles:list", "user:add", "user:edit"}, mode = SaMode.AND) - public ResponseEntity query() { - return new ResponseEntity<>(roleService.queryAll(), HttpStatus.OK); + public ResponseEntity query(){ + return new ResponseEntity<>(roleService.queryAll(),HttpStatus.OK); } @ApiOperation("查询角色") @GetMapping @SaCheckPermission("roles:list") - public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { - JSONObject param = JSONObject.parseObject(JSON.toJSONString(whereJson)); - return new ResponseEntity<>(roleService.queryAll(param, page), HttpStatus.OK); + public ResponseEntity query(Map criteria, Pageable pageable){ + return new ResponseEntity<>(roleService.queryAll(criteria,pageable),HttpStatus.OK); } @ApiOperation("获取用户级别") @GetMapping(value = "/level") - public ResponseEntity getLevel() { - return new ResponseEntity<>(2, HttpStatus.OK); + public ResponseEntity getLevel(){ + return new ResponseEntity<>(Dict.create().set("level", getLevels(null)),HttpStatus.OK); } @Log("新增角色") @ApiOperation("新增角色") @PostMapping @SaCheckPermission("roles:add") - public ResponseEntity create(@Validated @RequestBody JSONObject form) { - roleService.create(form); + public ResponseEntity create(@Validated @RequestBody Role resources){ + if (resources.getId() != null) { + throw new BadRequestException("A new "+ ENTITY_NAME +" cannot already have an ID"); + } + getLevels(resources.getLevel()); +// roleService.create(resources); return new ResponseEntity<>(HttpStatus.CREATED); } @@ -107,7 +108,7 @@ public class RoleController { @ApiOperation("修改角色") @PutMapping @SaCheckPermission("roles:edit") - public ResponseEntity update(@Validated(Role.Update.class) @RequestBody Role resources) { + public ResponseEntity update(@Validated(Role.Update.class) @RequestBody Role resources){ getLevels(resources.getLevel()); roleService.update(resources); return new ResponseEntity<>(HttpStatus.NO_CONTENT); @@ -117,10 +118,10 @@ public class RoleController { @ApiOperation("修改角色菜单") @PutMapping(value = "/menu") @SaCheckPermission("roles:edit") - public ResponseEntity updateMenu(@RequestBody Role resources) { + public ResponseEntity updateMenu(@RequestBody Role resources){ RoleDto role = roleService.findById(resources.getId()); getLevels(role.getLevel()); - roleService.updateMenu(resources, role); + roleService.updateMenu(resources,role); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } @@ -128,27 +129,26 @@ public class RoleController { @ApiOperation("删除角色") @DeleteMapping @SaCheckPermission("roles:del") - public ResponseEntity delete(@RequestBody Set ids) { + public ResponseEntity delete(@RequestBody Set ids){ for (Long id : ids) { RoleDto role = roleService.findById(id); getLevels(role.getLevel()); } // 验证是否被用户关联 - roleService.verification(ids); +// roleService.verification(ids); roleService.delete(ids); return new ResponseEntity<>(HttpStatus.OK); } /** * 获取用户的角色级别 - * * @return / */ - private int getLevels(Integer level) { + private int getLevels(Integer level){ List levels = roleService.findByUsersId(StpUtil.getLoginIdAsLong()).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()); int min = Collections.min(levels); - if (level != null) { - if (level < min) { + if(level != null){ + if(level < min){ throw new BadRequestException("权限不足,你的角色级别:" + min + ",低于操作的角色级别:" + level); } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/MenuService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/MenuService.java index 603ca84..9100f8f 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/MenuService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/MenuService.java @@ -71,7 +71,7 @@ public interface MenuService { * @param id / * @return / */ - MenuDto findById(long id); + MenuDto findById(String id); /** * 创建 @@ -126,7 +126,7 @@ public interface MenuService { * @param pid / * @return / */ - List getMenus(Long pid); + List getMenus(String pid); /** * 根据ID获取同级与上级数据 @@ -143,5 +143,5 @@ public interface MenuService { * @param currentUserId / * @return / */ - List findByUser(Long currentUserId); + List findByUser(String currentUserId); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/RoleService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/RoleService.java index 9704156..43f0b6d 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/RoleService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/RoleService.java @@ -91,7 +91,7 @@ public interface RoleService { * 解绑菜单 * @param id / */ - void untiedMenu(Long id); + void untiedMenu(String id); /** * 待条件分页查询 @@ -134,7 +134,7 @@ public interface RoleService { * 验证是否被用户关联 * @param ids / */ - void verification(Set ids); + void verification(Set ids); /** * 根据菜单Id查询 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/dto/MenuDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/dto/MenuDto.java index 3bc4f8f..3b56a57 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/dto/MenuDto.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/dto/MenuDto.java @@ -32,7 +32,7 @@ import java.util.Objects; @Setter public class MenuDto extends BaseDTO implements Serializable { - private Long menu_id; + private String menu_id; private List children; @@ -48,7 +48,7 @@ public class MenuDto extends BaseDTO implements Serializable { private String component; - private Long pid; + private String pid; private Integer sub_count; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/MenuServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/MenuServiceImpl.java index 1f9294a..7371cc1 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/MenuServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/MenuServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; +import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.*; import org.nl.modules.system.domain.Menu; import org.nl.modules.system.domain.Role; @@ -48,8 +49,8 @@ public class MenuServiceImpl implements MenuService { JSONArray res = new JSONArray(); for (int i = 0; i < content.size(); i++) { JSONObject obj = content.getJSONObject(i); - obj.put("menu_id", obj.getLong("menu_id")); - obj.put("pid", obj.getLong("pid")); + obj.put("menu_id", obj.getString("menu_id")); + obj.put("pid", obj.getString("pid")); //构建前端需要的数据结构树 Integer sub_count = obj.getInteger("sub_count"); @@ -108,14 +109,14 @@ public class MenuServiceImpl implements MenuService { @Override public MenuDto menuJsonToMenuDto(JSONObject json) { MenuDto menuDto = new MenuDto(); - menuDto.setMenu_id(json.getLong("menu_id")); + menuDto.setMenu_id(json.getString("menu_id")); menuDto.setType(json.getInteger("type")); menuDto.setPermission(json.getString("permission")); menuDto.setTitle(json.getString("title")); menuDto.setMenu_sort(json.getInteger("menu_sort")); menuDto.setPath(json.getString("path")); menuDto.setComponent(json.getString("component")); - menuDto.setPid(json.getLong("pid")); + menuDto.setPid(json.getString("pid")); menuDto.setSub_count(json.getInteger("sub_count")); menuDto.setI_frame("1".equals(json.getString("i_frame"))); menuDto.setCache("1".equals(json.getString("cache"))); @@ -138,7 +139,7 @@ public class MenuServiceImpl implements MenuService { @Override // @Cacheable(key = "'id:' + #p0") - public MenuDto findById(long id) { + public MenuDto findById(String id) { WQLObject menuTab = WQLObject.getWQLObject("sys_menu"); JSONObject json = menuTab.query("menu_id = '" + id + "'").uniqueResult(0); return this.menuJsonToMenuDto(json); @@ -152,48 +153,12 @@ public class MenuServiceImpl implements MenuService { */ @Override // @Cacheable(key = "'user:' + #p0") - public List findByUser(Long currentUserId) { + public List findByUser(String currentUserId) { JSONArray arr = WQL.getWO("QSYS_MENU01").addParam("flag", "4").addParam("user_id", String.valueOf(currentUserId)).process().getResultJSONArray(0); List list = new ArrayList<>(); for (int i = 0; i < arr.size(); i++) { JSONObject json = arr.getJSONObject(i); - - MenuDto dto = new MenuDto(); - dto.setMenu_id(json.getLong("menu_id")); - dto.setType(json.getInteger("type")); - dto.setPermission(json.getString("permission")); - dto.setTitle(json.getString("title")); - dto.setPath(json.getString("path")); - dto.setComponent_name(json.getString("name")); - dto.setComponent(json.getString("component")); - dto.setIcon(json.getString("icon")); - dto.setMenu_sort(json.getInteger("menu_sort")); - dto.setSub_count(json.getInteger("sub_count")); - dto.setPid(json.getLong("pid")); - - - String cache = json.getString("cache"); - String iFrame = json.getString("i_frame"); - String hidden = json.getString("hidden"); - if (StrUtil.equals(cache, "1")) { - dto.setCache(true); - } else { - dto.setCache(false); - } - - if (StrUtil.equals(iFrame, "1")) { - dto.setI_frame(true); - } else { - dto.setI_frame(false); - } - if (StrUtil.equals(hidden, "1")) { - dto.setHidden(true); - } else { - dto.setHidden(false); - } - - - list.add(dto); + list.add(this.menuJsonToMenuDto(json)); } return list; } @@ -210,10 +175,22 @@ public class MenuServiceImpl implements MenuService { form.put("update_id", SecurityUtils.getCurrentUserId()); form.put("update_name", SecurityUtils.getCurrentNickName()); form.put("update_time", DateUtil.now()); + + //根节点数据库存为null + if ("0".equals(form.getString("pid"))){ + form.remove("pid"); + } + + //外链外联菜单 + if("1".equals(form.getString("i_frame"))){ + String http = "http://", https = "https://"; + if (!(form.getString("path").toLowerCase().startsWith(http)||form.getString("path").toLowerCase().startsWith(https))) { + throw new BadRequestException("外链必须以http://或者https://开头"); + } + } + menuTab.insert(form); - //TODO 更新子节点数量 - - + updateSubCnt(menu_id); } @Override @@ -249,12 +226,12 @@ public class MenuServiceImpl implements MenuService { } @Override - public List getMenus(Long pid) { + public List getMenus(String pid) { // 菜单表【sys_menu】 WQLObject menuTab = WQLObject.getWQLObject("sys_menu"); JSONArray menus; if (pid != null && !pid.equals(0L)) { - menus = menuTab.query("pid = '" + pid + "'").getResultJSONArray(0); + menus = menuTab.query("menu_id = '" + pid + "'").getResultJSONArray(0); } else { menus = menuTab.query("(pid =0 or pid is null)").getResultJSONArray(0); } @@ -280,7 +257,7 @@ public class MenuServiceImpl implements MenuService { return menus; } //pid 不为null - JSONArray arr = menuTab.query("pid = '"+menuDto.getPid()+"'").getResultJSONArray(0); + JSONArray arr = menuTab.query("pid = '" + menuDto.getPid() + "'").getResultJSONArray(0); for (int i = 0; i < arr.size(); i++) { JSONObject json = arr.getJSONObject(i); menus.add(this.menuJsonToMenuDto(json)); @@ -291,7 +268,7 @@ public class MenuServiceImpl implements MenuService { @Override public List buildTree(List menuDtos) { List trees = new ArrayList<>(); - Set ids = new HashSet<>(); + Set ids = new HashSet<>(); for (MenuDto menuDTO : menuDtos) { if (menuDTO.getPid() == null) { trees.add(menuDTO); @@ -365,7 +342,7 @@ public class MenuServiceImpl implements MenuService { return list; } - private void updateSubCnt(Long menuId) { + private void updateSubCnt(String menuId) { if (menuId != null) { WQLObject menuTab = WQLObject.getWQLObject("sys_menu"); JSONArray arr = menuTab.query("pid = '" + menuId + "'").getResultJSONArray(0); @@ -380,14 +357,14 @@ public class MenuServiceImpl implements MenuService { * * @param id 菜单ID */ - public void delCaches(Long id) { - List users = userRepository.findByMenuId(id); + public void delCaches(String id) { + /* List users = userRepository.findByMenuId(id); redisUtils.del("menu::id:" + id); redisUtils.delByKeys("menu::user:", users.stream().map(User::getId).collect(Collectors.toSet())); // 清除 Role 缓存 - List roles = roleService.findInMenuId(new ArrayList() {{ + List roles = roleService.findInMenuId(new ArrayList() {{ add(id); }}); - redisUtils.delByKeys("role::id:", roles.stream().map(Role::getId).collect(Collectors.toSet())); + redisUtils.delByKeys("role::id:", roles.stream().map(Role::getId).collect(Collectors.toSet()));*/ } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/RoleServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/RoleServiceImpl.java index ac1fd46..2726677 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/RoleServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/modules/system/service/impl/RoleServiceImpl.java @@ -141,11 +141,16 @@ public class RoleServiceImpl implements RoleService { } @Override + public void untiedMenu(String id) { + + } + +/* @Override @Transactional(rollbackFor = Exception.class) public void untiedMenu(Long menuId) { // 更新菜单 roleRepository.untiedMenu(menuId); - } + }*/ @Override @Transactional(rollbackFor = Exception.class) @@ -203,10 +208,10 @@ public class RoleServiceImpl implements RoleService { } @Override - public void verification(Set ids) { - if (userRepository.countByRoles(ids) > 0) { + public void verification(Set ids) { + /*if (userRepository.countByRoles(ids) > 0) { throw new BadRequestException("所选角色存在用户关联,请解除关联再试!"); - } + }*/ } @Override diff --git a/nladmin-ui/src/views/system/menu/index.vue b/nladmin-ui/src/views/system/menu/index.vue index 65ed64a..1f53013 100644 --- a/nladmin-ui/src/views/system/menu/index.vue +++ b/nladmin-ui/src/views/system/menu/index.vue @@ -141,6 +141,7 @@ v-loading="crud.loading" lazy :load="getMenus" + :auto-load-root-options="false" :data="crud.data" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" row-key="menu_id" @@ -151,6 +152,7 @@ > + @@ -242,7 +244,7 @@ export default { name: 'Menu', components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker }, cruds() { - return CRUD({ title: '菜单', url: 'api/menus', crudMethod: { ...crudMenu }}) + return CRUD({ title: '菜单', idField: 'menu_id', url: 'api/menus', crudMethod: { ...crudMenu }}) }, mixins: [presenter(), header(), form(defaultForm), crud()], data() { @@ -274,12 +276,12 @@ export default { // 新增与编辑前做的操作 [CRUD.HOOK.afterToCU](crud, form) { this.menus = [] - if (form.menu_id) { - if (form.pid === null) { + if (form.menu_id) { // 修改 + if (form.pid === null) { // 一级菜单,一级的父级菜单的pid为0. form.pid = 0 } this.getSupDepts(form.menu_id) - } else { + } else { // 新增 this.menus.push({ menu_id: 0, title: '顶级类目', children: null }) } },