From 8756c26b9832c4560071fa6f414cb68b6870a127 Mon Sep 17 00:00:00 2001 From: wangpeng Date: Wed, 24 Jan 2024 09:52:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/RoleController.java | 143 ++++++++++- .../controller/system/RouteController.java | 134 ++++++++++ src/main/java/com/zcloud/entity/PageData.java | 11 +- src/main/java/com/zcloud/entity/Result.java | 146 +++++++++++ .../com/zcloud/entity/system/MenuRouter.java | 124 +++++++++ .../java/com/zcloud/entity/system/Route.java | 167 ++++++++++++ .../mapper/dsno2/system/RouteMapper.java | 68 +++++ .../zcloud/service/system/RouteService.java | 86 +++++++ .../service/system/impl/RouteServiceImpl.java | 237 ++++++++++++++++++ .../com/zcloud/util/BaseResultInterface.java | 18 ++ .../java/com/zcloud/util/CodeMessageEnum.java | 190 ++++++++++++++ .../mybatis/dsno2/system/RouteMapper.xml | 191 ++++++++++++++ 12 files changed, 1504 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/zcloud/controller/system/RouteController.java create mode 100644 src/main/java/com/zcloud/entity/Result.java create mode 100644 src/main/java/com/zcloud/entity/system/MenuRouter.java create mode 100644 src/main/java/com/zcloud/entity/system/Route.java create mode 100644 src/main/java/com/zcloud/mapper/dsno2/system/RouteMapper.java create mode 100644 src/main/java/com/zcloud/service/system/RouteService.java create mode 100644 src/main/java/com/zcloud/service/system/impl/RouteServiceImpl.java create mode 100644 src/main/java/com/zcloud/util/BaseResultInterface.java create mode 100644 src/main/java/com/zcloud/util/CodeMessageEnum.java create mode 100644 src/main/resources/mybatis/dsno2/system/RouteMapper.xml diff --git a/src/main/java/com/zcloud/controller/system/RoleController.java b/src/main/java/com/zcloud/controller/system/RoleController.java index 86016f1..0f2c21a 100644 --- a/src/main/java/com/zcloud/controller/system/RoleController.java +++ b/src/main/java/com/zcloud/controller/system/RoleController.java @@ -7,9 +7,12 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import com.zcloud.entity.Result; +import com.zcloud.service.system.*; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -19,10 +22,6 @@ import com.zcloud.entity.Page; import com.zcloud.entity.PageData; import com.zcloud.entity.system.Menu; import com.zcloud.entity.system.Role; -import com.zcloud.service.system.FHlogService; -import com.zcloud.service.system.MenuService; -import com.zcloud.service.system.RoleService; -import com.zcloud.service.system.UsersService; import com.zcloud.util.DateUtil; import com.zcloud.util.Jurisdiction; import com.zcloud.util.RightsHelper; @@ -48,6 +47,9 @@ public class RoleController extends BaseController { @Autowired private FHlogService FHLOG; + @Autowired + private RouteService routeService; + /** 进入权限首页 * @param * @return @@ -411,4 +413,137 @@ public class RoleController extends BaseController { return map; } + /** + * 显示菜单列表ztree(菜单授权菜单) + * @return + */ + @RequestMapping(value="/routeqx") +// @RequiresPermissions("role:list") + @ResponseBody + public Result routeqx()throws Exception{ + Result result = new Result(); + String errInfo = "success"; + PageData pd = new PageData(); + pd = this.getPageData(); + Role role = roleService.getRoleById(pd.getString("ROLE_ID")); //根据角色ID获取角色对象 + String roleRights = role.getRIGHTS(); //取出本角色菜单权限 + pd.put("ROUTE_ID", "0"); + pd.put("removePath", "1"); + List routeList = routeService.treeAll(pd); + routeList = this.readRoute(routeList,roleRights); + result.put("routeList", routeList); + result.put("result", errInfo); + return result; + } + + + /**请求角色按钮授权页面(增删改查) + * @param ROLE_ID: 角色ID + * @param msg: 区分增删改查 + * @return + * @throws Exception + */ + @RequestMapping(value="/routeqxButton") + @RequiresPermissions("role:list") + @ResponseBody + public Object routeqxButton()throws Exception{ + PageData map = new PageData(); + PageData pd = new PageData(); + pd = this.getPageData(); + Role role = roleService.getRoleById(pd.getString("ROLE_ID")); //根据角色ID获取角色对象 + String roleRights = ""; + if("add_qx".equals(pd.getString("msg"))){ + roleRights = role.getADD_QX(); //新增权限 + }else if("del_qx".equals(pd.getString("msg"))){ + roleRights = role.getDEL_QX(); //删除权限 + }else if("edit_qx".equals(pd.getString("msg"))){ + roleRights = role.getEDIT_QX(); //修改权限 + }else if("cha_qx".equals(pd.getString("msg"))){ + roleRights = role.getCHA_QX(); //查看权限 + } + pd.put("ROUTE_ID", "0"); + pd.put("removePath", "1"); + List routeList = routeService.treeAll(pd); + routeList = this.readRoute(routeList,roleRights); + map.put("routeList", routeList); + map.put("result", "success"); + return map; + } + + /** + * 保存角色按钮权限 + * @throws Exception + */ + @RequestMapping(value="/saveRouteqxButton") + @RequiresPermissions("role:edit") + @ResponseBody + public Object saveRouteqxButton()throws Exception{ + Map map = new HashMap(); + PageData pd = new PageData(); + pd = this.getPageData(); + if(Tools.notEmpty(pd.getString("routeIds"))){ + BigInteger rights = RightsHelper.sumRights(Tools.str2StrArray(pd.getString("routeIds"))); + pd.put("value",rights.toString()); + }else{ + pd.put("value",""); + } + pd.put("ROLE_ID", pd.getString("ROLE_ID")); + roleService.saveB4Button(pd.getString("msg"),pd); + map.put("result", "success"); + FHLOG.save(Jurisdiction.getUsername(), "给角色ID:"+pd.getString("ROLE_ID")+" 授权了增删改查按钮权限操作"); //记录日志 + return map; + } + + /**根据角色权限处理权限状态(递归处理)(vue3 新路由处理方法) + * @param routeList:传入的总路由(菜单) + * @param roleRights:加密的权限字符串 + * @return + */ + public List readRoute(List routeList,String roleRights){ + for(int i=0;i) routeList.get(i).get("children"), roleRights); //是:继续排查其子菜单 + } + } + return routeList; + } + + /**保存角色菜单权限 + * @param ROLE_ID 角色ID + * @param menuIds 菜单ID集合 + * @param out + * @throws Exception + */ + @RequestMapping(value="/saveRouteqx") +// @RequiresPermissions("role:edit") + @ResponseBody + public Object saveRouteqx()throws Exception{ + Map map = new HashMap(); + PageData pd = new PageData(); + pd = this.getPageData(); + String ROLE_ID = pd.getString("ROLE_ID"); + String routeIds = pd.getString("routeIds"); + if(null != routeIds && !"".equals(routeIds.trim())){ + BigInteger rights = RightsHelper.sumRights(Tools.str2StrArray(routeIds));//用菜单ID做权处理 + Role role = roleService.getRoleById(ROLE_ID); //通过id获取角色对象 + role.setRIGHTS(rights.toString()); + roleService.updateRoleRights(role); //更新当前角色菜单权限 + pd.put("rights",rights.toString()); + }else{ + Role role = new Role(); + role.setRIGHTS(""); + role.setROLE_ID(ROLE_ID); + roleService.updateRoleRights(role); //更新当前角色菜单权限(没有任何勾选) + pd.put("rights",""); + } + pd.put("ROLE_ID", ROLE_ID); + if(!"1".equals(ROLE_ID)){ //当修改admin权限时,不修改其它角色权限 + roleService.setAllRights(pd); //更新此角色所有子角色的菜单权限 + } + map.put("result", "success"); + FHLOG.save(Jurisdiction.getUsername(), "给角色ID:"+ROLE_ID+" 授权了菜单权限操作"); //记录日志 + return map; + } + } diff --git a/src/main/java/com/zcloud/controller/system/RouteController.java b/src/main/java/com/zcloud/controller/system/RouteController.java new file mode 100644 index 0000000..b7b89be --- /dev/null +++ b/src/main/java/com/zcloud/controller/system/RouteController.java @@ -0,0 +1,134 @@ +package com.zcloud.controller.system; + +import com.alibaba.fastjson.JSONObject; +import com.zcloud.controller.base.BaseController; +import com.zcloud.entity.PageData; +import com.zcloud.entity.Result; +import com.zcloud.service.system.FHlogService; +import com.zcloud.service.system.RouteService; +import com.zcloud.util.Jurisdiction; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.Map; + +/** + * 说明:菜单管理处理类 + * 作者:luoxiaobao + * 官网:www.qdkjchina.com + */ +@Controller +@RequestMapping("/route") +public class RouteController extends BaseController { + + @Autowired + private RouteService routeService; + @Autowired + private FHlogService FHLOG; + + /** + * @Description: 菜单列表 + * @Author: dearLin + * @Date: 2023/6/9/009 9:28 + * @Param: [java.lang.String] [ROUTE_ID] + * @Return: java.lang.Object + */ + @RequestMapping(value = "/treeAll") + @ResponseBody + public Result routeTreeAll() throws Exception { + Result result = new Result(); + PageData pd = new PageData(); + pd = this.getPageData(); + pd.put("ROUTE_ID", "0"); + List menuList = routeService.treeAll(pd); + result.put("menuList", menuList); + return result; + } + + + /** + * @Description: 菜单新增 + * @Author: dearLin + * @Date: 2023/6/9/009 10:19 + * @Param: [java.util.Map] [data] + * @Return: com.zcloud.entity.R + */ + @RequestMapping(value = "/add") +// @RequiresPermissions("route:add") + @ResponseBody + public Result routeAdd() throws Exception { + PageData pd = new PageData(); + pd = this.getPageData(); + pd.put("ROUTE_ID", String.valueOf(Integer.parseInt(routeService.findMaxId(pd).get("MID").toString()) + 1)); + pd.put("ROUTE_ICON", ""); //默认无路由图标 + routeService.add(pd); //新增路由 + FHLOG.save(Jurisdiction.getUsername(), "新增路由:" + ((JSONObject) JSONObject.parse(pd.getString("META"))).getString("title")); //记录日志 + return Result.ok(); + } + + + /** + * @Description: 菜单修改 + * @Author: dearLin + * @Date: 2023/6/9/009 10:19 + * @Param: [java.util.Map] [data] + * @Return: com.zcloud.entity.R + */ + @RequestMapping(value = "/edit") +// @RequiresPermissions("route:edit") + @ResponseBody + public Result routeEdit() throws Exception { + PageData pd = new PageData(); + pd = this.getPageData(); + routeService.edit(pd); + FHLOG.save(Jurisdiction.getUsername(), "修改路由:" + ((JSONObject) JSONObject.parse(pd.getString("META"))).getString("title")); //记录日志 + return Result.ok(); + } + + + @RequestMapping(value = "/delete") +// @RequiresPermissions("route:del") + @ResponseBody + public Result routeDelete() throws Exception { + PageData pd = new PageData(); + pd = this.getPageData(); + String ROUTE_ID = pd.getString("ROUTE_ID"); + if (routeService.listSubRouteByParentId(ROUTE_ID).size() > 0) {//判断是否有子路由,是:不允许删除 + return Result.error("请先删除子路由"); + } else { + routeService.delete(ROUTE_ID); + FHLOG.save(Jurisdiction.getUsername(), "删除的路由ID为:" + ROUTE_ID); //记录日志 + } + return Result.ok(); + } + + /** + * 新增菜单 + * + * @param + * @return + */ + @RequestMapping(value = "/icon") +// @RequiresPermissions("route:edit") + @ResponseBody + public Object icon() throws Exception { + Result result = new Result(); + String errInfo = "success"; + PageData pd = new PageData(); + pd = this.getPageData(); + PageData route = routeService.findById(pd); + JSONObject metaJson = JSONObject.parseObject(route.getString("META")); + metaJson.put("icon", pd.getString("ICON")); + route.put("META", metaJson.toJSONString()); + routeService.edit(route); + result.put("result", errInfo); + return result; + } + +} diff --git a/src/main/java/com/zcloud/entity/PageData.java b/src/main/java/com/zcloud/entity/PageData.java index b456f41..48b0a63 100644 --- a/src/main/java/com/zcloud/entity/PageData.java +++ b/src/main/java/com/zcloud/entity/PageData.java @@ -2,18 +2,14 @@ package com.zcloud.entity; import java.io.BufferedReader; import java.io.Reader; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +import java.util.*; import javax.servlet.http.HttpServletRequest; import com.alibaba.druid.proxy.jdbc.ClobProxyImpl; /** - * 说明:参数封装Map + * 说明:参数封装Map * 作者:luoxiaobao * 官网:www.qdkjchina.com */ @@ -69,7 +65,8 @@ public class PageData extends HashMap implements Map { + /** + * 序列ID + */ + private static final long serialVersionUID = 1L; + + /** + * R的无参构造, 初始化信息 + */ + public Result() { + put("code", 0); + put("msg", "success"); + put("result", "success"); + } + + /** + * error1: 返回默认error + * + * @return 返回默认error + */ + public static Result error() { + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常, 请联系管理员"); + } + + /** + * error2 + * + * @param msg 错误信息 + * @return 返回自定义信息的error + */ + public static Result error(String msg) { + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg); + } + + public static Result error(CodeMessageEnum codeMessageEnum, String uri) { + return error(codeMessageEnum.getCode(), codeMessageEnum.getMessage(), uri); + } + + /** + * 原先R的code和msg被覆盖 + * + * @param code 错误码 + * @param msg 错误信息 + * @return 自定义的错误码和错误信息 + */ + public static Result error(int code, String msg) { + Result r = new Result(); + r.put("code", code); + r.put("result", "error"); + r.put("msg", msg); + return r; + } + + public static Result error(String code, String msg) { + Result r = new Result(); + r.put("code", code); + r.put("result", "error"); + r.put("msg", msg); + return r; + } + + public static Result error(String code, String msg, String uri) { + Result r = new Result(); + r.put("code", code); + r.put("result", "error"); + r.put("msg", msg); + r.put("uri", uri); + return r; + } + + /** + * ok1 + * 加入了msg + * + * @param msg + * @return + */ + public static Result ok(String msg) { + Result r = new Result(); + r.put("msg", msg); + return r; + } + + /** + * ok2: 加入了map + * + * @param map + * @return + */ + public static Result ok(Map map) { + Result r = new Result(); + r.putAll(map); + return r; + } + + /** + * ok3: 直接返回"0", "success" + * + * @return + */ + public static Result ok() { + return new Result(); + } + + /** + * 放入自定义的key和value, 然后返回 + * + * @param key + * @param value + * @return + */ + @Override + public Result put(String key, Object value) { + super.put(key, value); + return this; + } + + /** + * 得到这个对象的code + * + * @return + */ + public Integer getCode() { + return (Integer) this.get("code"); + } +} + + + diff --git a/src/main/java/com/zcloud/entity/system/MenuRouter.java b/src/main/java/com/zcloud/entity/system/MenuRouter.java new file mode 100644 index 0000000..82dc14e --- /dev/null +++ b/src/main/java/com/zcloud/entity/system/MenuRouter.java @@ -0,0 +1,124 @@ +package com.zcloud.entity.system; + +import java.io.Serializable; + +/** + * 说明:菜单实体类(路由信息) + * 作者:luoxiaobao + * 官网:www.qdkjchina.com + */ +public class MenuRouter implements Serializable { + + private static final long serialVersionUID = 1L; + + private String MENU_ROUTER_ID; //主键ID + private String MENU_ID; //菜单ID + private String activeMenu; // 当前路由选中状态是哪个导航(isSubMenu:false时需要填写,设置isSubMenu:false路由的path) + private String parentMenu; // 属于哪一个父级路由(当多个路由共用一个组件时需要填写,给组件里各个路由跳转时使用,以便正确选择当前菜单) + private String isMenu; // 不显示当前菜单 + private String isLogin; // 不需要登录可以访问 + private String breadcrumb; // 当前页不显示在面包屑中 + private String isBreadcrumb; // 当前页不显示面包屑 + private String isSubMenu; // 当前菜单不显示子菜单 + private String title; // 显示在菜单和面包屑中名称(必填) + private String icon; // 图标 + + + private String target; + + public String getMENU_ROUTER_ID() { + return MENU_ROUTER_ID; + } + + public void setMENU_ROUTER_ID(String MENU_ROUTER_ID) { + this.MENU_ROUTER_ID = MENU_ROUTER_ID; + } + + public String getMENU_ID() { + return MENU_ID; + } + + public void setMENU_ID(String MENU_ID) { + this.MENU_ID = MENU_ID; + } + + public String getActiveMenu() { + return activeMenu; + } + + public void setActiveMenu(String activeMenu) { + this.activeMenu = activeMenu; + } + + public String getParentMenu() { + return parentMenu; + } + + public void setParentMenu(String parentMenu) { + this.parentMenu = parentMenu; + } + + public String getIsMenu() { + return isMenu; + } + + public void setIsMenu(String isMenu) { + this.isMenu = isMenu; + } + + public String getIsLogin() { + return isLogin; + } + + public void setIsLogin(String isLogin) { + this.isLogin = isLogin; + } + + public String getBreadcrumb() { + return breadcrumb; + } + + public void setBreadcrumb(String breadcrumb) { + this.breadcrumb = breadcrumb; + } + + public String getIsBreadcrumb() { + return isBreadcrumb; + } + + public void setIsBreadcrumb(String isBreadcrumb) { + this.isBreadcrumb = isBreadcrumb; + } + + public String getIsSubMenu() { + return isSubMenu; + } + + public void setIsSubMenu(String isSubMenu) { + this.isSubMenu = isSubMenu; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } +} diff --git a/src/main/java/com/zcloud/entity/system/Route.java b/src/main/java/com/zcloud/entity/system/Route.java new file mode 100644 index 0000000..22e1d59 --- /dev/null +++ b/src/main/java/com/zcloud/entity/system/Route.java @@ -0,0 +1,167 @@ +package com.zcloud.entity.system; + +import java.io.Serializable; +import java.util.List; + +/** + * 说明:路由(菜单)实体类 + * 作者:luoxiaobao + * 官网:www.qdkjchina.com + */ +public class Route implements Serializable { + private String ROUTE_ID; //菜单ID + private String PARENT_ID; // 上级菜单ID + private String PARENT_IDS; // 上级菜单串 + private String PATH; // 路由地址 + private String REDIRECT; // 路由重定向地址 + private String COMPONENT; // 文件位置(非子节点均填children) + private String META; // 菜单扩展字段(json格式) + private String ROUTE_ORDER; // 菜单排序 + private String ROUTE_ICON; // 菜单图标 + private String ROUTE_STATE; // + private String SHIRO_KEY; // + private String SHOW_MODEL; // + private String ROUTE_TYPE; // + private String ROUTE_NAME; + + + private String target; + private List subMenu; + private boolean hasMenu = false; + + public String getROUTE_ID() { + return ROUTE_ID; + } + + public void setROUTE_ID(String ROUTE_ID) { + this.ROUTE_ID = ROUTE_ID; + } + + public String getPARENT_ID() { + return PARENT_ID; + } + + public void setPARENT_ID(String PARENT_ID) { + this.PARENT_ID = PARENT_ID; + } + + public String getPARENT_IDS() { + return PARENT_IDS; + } + + public void setPARENT_IDS(String PARENT_IDS) { + this.PARENT_IDS = PARENT_IDS; + } + + public String getPATH() { + return PATH; + } + + public void setPATH(String PATH) { + this.PATH = PATH; + } + + public String getREDIRECT() { + return REDIRECT; + } + + public void setREDIRECT(String REDIRECT) { + this.REDIRECT = REDIRECT; + } + + public String getCOMPONENT() { + return COMPONENT; + } + + public void setCOMPONENT(String COMPONENT) { + this.COMPONENT = COMPONENT; + } + + public String getMETA() { + return META; + } + + public void setMETA(String META) { + this.META = META; + } + + public String getROUTE_ORDER() { + return ROUTE_ORDER; + } + + public void setROUTE_ORDER(String ROUTE_ORDER) { + this.ROUTE_ORDER = ROUTE_ORDER; + } + + public String getROUTE_ICON() { + return ROUTE_ICON; + } + + public void setROUTE_ICON(String ROUTE_ICON) { + this.ROUTE_ICON = ROUTE_ICON; + } + + public String getROUTE_STATE() { + return ROUTE_STATE; + } + + public void setROUTE_STATE(String ROUTE_STATE) { + this.ROUTE_STATE = ROUTE_STATE; + } + + public String getSHIRO_KEY() { + return SHIRO_KEY; + } + + public void setSHIRO_KEY(String SHIRO_KEY) { + this.SHIRO_KEY = SHIRO_KEY; + } + + public String getSHOW_MODEL() { + return SHOW_MODEL; + } + + public void setSHOW_MODEL(String SHOW_MODEL) { + this.SHOW_MODEL = SHOW_MODEL; + } + + public String getROUTE_TYPE() { + return ROUTE_TYPE; + } + + public void setROUTE_TYPE(String ROUTE_TYPE) { + this.ROUTE_TYPE = ROUTE_TYPE; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public List getSubMenu() { + return subMenu; + } + + public void setSubMenu(List subMenu) { + this.subMenu = subMenu; + } + + public boolean isHasMenu() { + return hasMenu; + } + + public void setHasMenu(boolean hasMenu) { + this.hasMenu = hasMenu; + } + + public String getROUTE_NAME() { + return ROUTE_NAME; + } + + public void setROUTE_NAME(String ROUTE_NAME) { + this.ROUTE_NAME = ROUTE_NAME; + } +} diff --git a/src/main/java/com/zcloud/mapper/dsno2/system/RouteMapper.java b/src/main/java/com/zcloud/mapper/dsno2/system/RouteMapper.java new file mode 100644 index 0000000..e694de8 --- /dev/null +++ b/src/main/java/com/zcloud/mapper/dsno2/system/RouteMapper.java @@ -0,0 +1,68 @@ +package com.zcloud.mapper.dsno2.system; + +import com.zcloud.entity.PageData; +import com.zcloud.entity.system.Route; + +import java.util.List; + +/** + * 说明:菜单Mapper + * 作者:luoxiaobao + * 官网:www.qdkjchina.com + */ +public interface RouteMapper { + + /**新增菜单 + * @param pd + */ + void add(PageData pd); + + /**保存修改菜单 + * @param pd + */ + void edit(PageData pd); + + /** + * 通过菜单ID获取数据 + * @param pd + * @return + */ + PageData findById(PageData pd); + + /**获取最大的菜单ID + * @param pd + * @return + */ + PageData findMaxId(PageData pd); + + /**通过ID获取其子一级菜单 + * @param parentId + * @return + */ + List listSubRouteByParentId(String parentId); + + /**通过ID获取其子一级菜单 + * @param parentId + * @return + */ + List listRouteByParentId(String parentId); + + /**删除菜单 + * @param ROUTE_ID + */ + void delete(String ROUTE_ID); + + /**保存菜单图标 + * @param pd + * @return + */ + void editicon(PageData pd); + + /**获取所有菜单 + * @param pd + * @return + */ + List listAll(PageData pd); + + +} diff --git a/src/main/java/com/zcloud/service/system/RouteService.java b/src/main/java/com/zcloud/service/system/RouteService.java new file mode 100644 index 0000000..c4ded87 --- /dev/null +++ b/src/main/java/com/zcloud/service/system/RouteService.java @@ -0,0 +1,86 @@ +package com.zcloud.service.system; + +import com.zcloud.entity.PageData; +import com.zcloud.entity.system.Route; + +import java.util.List; + +/** + * 说明:路由服务接口 + * 作者:luoxiaobao + * 官网:www.qdkjchina.com + */ +public interface RouteService { + + /**新增路由 + * @param pd + * @throws Exception + */ + public void add(PageData pd) throws Exception; + + /**保存修改路由 + * @param pd + * @throws Exception + */ + public void edit(PageData pd) throws Exception; + + /**获取最大的路由ID + * @param pd + * @return + * @throws Exception + */ + public PageData findMaxId(PageData pd) throws Exception; + + /**通过ID获取其子一级路由 + * @param parentId + * @return + * @throws Exception + */ + public List listSubRouteByParentId(String parentId)throws Exception; + + /**通过ID获取其子一级路由 + * @param parentId + * @return + * @throws Exception + */ + public List listRouteByParentId(String parentId)throws Exception; + + /**获取所有路由并填充每个路由的子路由列表(系统路由列表) + * @param pd + * @return + * @throws Exception + */ + public PageData findById(PageData pd) throws Exception; + + /**删除路由 + * @param ROUTE_ID + * @throws Exception + */ + public void delete(String ROUTE_ID) throws Exception; + + /**保存路由图标 + * @param pd + * @throws Exception + */ + public void editicon(PageData pd) throws Exception; + + /**获取所有路由 + * @param pd + * @return + */ + List treeAll(PageData pd) throws Exception; + + /**获取所有路由(集合) + * @param pd + * @return + */ + List listAll(PageData pd) throws Exception; + + /**获取所有菜单并填充每个菜单的子菜单列表(系统菜单列表) + * @param MENU_ID + * @return + * @throws Exception + */ + List listAllMenuJur(String MENU_ID) throws Exception; + +} diff --git a/src/main/java/com/zcloud/service/system/impl/RouteServiceImpl.java b/src/main/java/com/zcloud/service/system/impl/RouteServiceImpl.java new file mode 100644 index 0000000..16777ee --- /dev/null +++ b/src/main/java/com/zcloud/service/system/impl/RouteServiceImpl.java @@ -0,0 +1,237 @@ +package com.zcloud.service.system.impl; + +import com.alibaba.fastjson.JSONObject; +import com.zcloud.entity.PageData; +import com.zcloud.entity.system.Route; +import com.zcloud.mapper.dsno2.system.RouteMapper; +import com.zcloud.service.system.RouteService; +import com.zcloud.util.Tools; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * 说明:菜单服务接口实现类 + * 作者:luoxiaobao + * 官网:www.qdkjchina.com + */ +@Service +@Transactional //开启事物 +public class RouteServiceImpl implements RouteService { + + @Autowired + private RouteMapper routeMapper; + + /** + * 新增菜单 + * + * @param pd + * @throws Exception + */ + // @CacheEvict(value="routecache", allEntries=true) + public void add(PageData pd) throws Exception { + routeMapper.add(pd); + } + + /** + * 保存修改菜单 + * + * @param pd + * @throws Exception + */ +// @CacheEvict(value="routecache", allEntries=true) + public void edit(PageData pd) throws Exception { + routeMapper.edit(pd); + } + + /** + * 通过菜单ID获取数据 + * + * @param pd + * @return + * @throws Exception + */ + public PageData findById(PageData pd) throws Exception { + return routeMapper.findById(pd); + } + + /** + * 获取最大的菜单ID + * + * @param pd + * @return + * @throws Exception + */ + public PageData findMaxId(PageData pd) throws Exception { + return routeMapper.findMaxId(pd); + } + + /** + * 通过ID获取其子一级菜单 + * + * @param parentId + * @return + * @throws Exception + */ + @Override +// @Cacheable(key = "'route-'+#parentId", value = "routecache") + public List listSubRouteByParentId(String parentId) throws Exception { + return routeMapper.listSubRouteByParentId(parentId); + } + + /** + * 通过ID获取其子一级菜单 + * + * @param parentId + * @return + * @throws Exception + */ + @Override +// @Cacheable(key = "'route-'+#parentId", value = "routecache") + public List listRouteByParentId(String parentId) throws Exception { + return routeMapper.listRouteByParentId(parentId); + } + + /** + * 删除菜单 + * + * @param ROUTE_ID + * @throws Exception + */ +// @CacheEvict(value="routecache", allEntries=true) + public void delete(String ROUTE_ID) throws Exception { + routeMapper.delete(ROUTE_ID); + } + + /** + * 保存菜单图标 + * + * @param pd + * @throws Exception + */ + @CacheEvict(value = "routecache", allEntries = true) + public void editicon(PageData pd) throws Exception { + routeMapper.editicon(pd); + } + + @Override + public List treeAll(PageData router) throws Exception { + List routeList = this.listRouteByParentId(router.get("ROUTE_ID").toString()); + if ("1".equals(router.getString("removePath"))) { + routeList.removeIf((item) -> Tools.isEmpty(item.getString("path"))); //去掉path为空的项 + } + for (PageData route : routeList) { + if ("0".equals(route.getString("ROUTE_ID"))) { + route.put("PARENT_NAME", "(无)"); + } else { + JSONObject meta = JSONObject.parseObject(route.getString("meta")); + route.put("PARENT_NAME", meta.getString("title")); + } + route.put("meta", JSONObject.parse(route.getString("meta"))); + if ("1".equals(router.getString("removePath"))) { + route.put("removePath", router.getString("removePath")); + } + route.put("children", this.treeAll(route)); + } + return routeList; + } + + +// @Override +// public List treeAll(PageData pd) throws Exception { +// List list = new ArrayList(); +// List routeList = routeMapper.listAll(pd); +// Map map = new HashMap(); +// for (PageData r : routeList) { +// r.put("meta", JSONObject.parse(r.getString("meta"))); +// map.put(r.getString("ROUTE_ID"), r); +// } +// +// Iterator> it = map.entrySet().iterator(); +// while (it.hasNext()) { +// Map.Entry entry = it.next(); +// PageData root = entry.getValue(); +// if ("0".equals(root.getString("PARENT_ID"))) { +// root.put("PARENT_NAME", "(无)"); +// list.add(entry.getValue()); +// it.remove();//使用迭代器的remove()方法删除元素 +// } +// } +// TreeAppendChildren(map, list); +// return list; +// } + + @Override + public List listAll(PageData pd) throws Exception { + return routeMapper.listAll(pd); + } + + + /** + * 获取所有菜单并填充每个菜单的子菜单列表(系统菜单列表)(递归处理) + * + * @param MENU_ID + * @return + * @throws Exception + */ + @Override + public List listAllMenuJur(String MENU_ID) throws Exception { + List routeList = this.listSubRouteByParentId(MENU_ID); + for (Route route : routeList) { + route.setSubMenu(this.listAllMenuJur(route.getROUTE_ID())); + route.setTarget("treeFrame"); + } + return routeList; + } + + + private void TreeAppendChildren(Map map, List list) { + if (!map.isEmpty()) { + for (PageData parent : list) { + List children = new ArrayList(); + Iterator> it = map.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + PageData child = entry.getValue(); + if (parent.getString("ROUTE_ID").equals(child.getString("PARENT_ID"))) { + child.put("PARENT_NAME", ((JSONObject) parent.get("meta")).getString("title")); + children.add(child); + it.remove();//使用迭代器的remove()方法删除元素 + } + } + if (children.size() > 0) { + parent.put("children", children); + TreeAppendChildren(map, children); + } + } + } + } + +// private void TreeAppendChildren(Map map, List list) { +// if (!map.isEmpty()) { +// for (PageData parent : list) { +// List children = new ArrayList(); +// Iterator> it = map.entrySet().iterator(); +// while (it.hasNext()) { +// Map.Entry entry = it.next(); +// PageData child = entry.getValue(); +// if (parent.getString("ROUTE_ID").equals(child.getString("PARENT_ID"))) { +// child.put("PARENT_NAME", ((JSONObject) parent.get("meta")).getString("title")); +// children.add(child); +// it.remove();//使用迭代器的remove()方法删除元素 +// } +// } +// if (children.size() > 0) { +// parent.put("children", children); +// TreeAppendChildren(map, children); +// } +// } +// } +// } +} diff --git a/src/main/java/com/zcloud/util/BaseResultInterface.java b/src/main/java/com/zcloud/util/BaseResultInterface.java new file mode 100644 index 0000000..cff9df8 --- /dev/null +++ b/src/main/java/com/zcloud/util/BaseResultInterface.java @@ -0,0 +1,18 @@ +package com.zcloud.util; + +/** + * 说明:TODO + * 作者:wangxuan + * 官网:www.zcloudchina.com + */ +/** + * @desc 对象返回到前端以及异常抛出的接口类 + */ +public interface BaseResultInterface { + + + String getCode(); + + + String getMessage(); +} diff --git a/src/main/java/com/zcloud/util/CodeMessageEnum.java b/src/main/java/com/zcloud/util/CodeMessageEnum.java new file mode 100644 index 0000000..9ebdff2 --- /dev/null +++ b/src/main/java/com/zcloud/util/CodeMessageEnum.java @@ -0,0 +1,190 @@ +package com.zcloud.util; + +/** + * 说明:TODO + * 作者:wangxuan + * 官网:www.zcloudchina.com + */ +public enum CodeMessageEnum implements BaseResultInterface { + + /** ********* 0000成功 *************** */ + SUCCESS("0000", "成功!"), + SUCCESS_LOGIN("0001", "用户登录成功"), + SUCCESS_LOGOUT("0002", "用户退出成功"), + + /* 默认失败 */ + COMMON_FAIL("999", "失败"), + + /** ********* 1xxx系统错误 *************** */ + SERVER_BUSY("1001", "服务器正忙,请稍后再试!"), + INTERNAL_SERVER_ERROR("1002", "服务器内部错误"), + NOT_FOUND("1003", "未找到该资源!"), + REQUEST_METHOD_ERROR("1004", "接口请求方法异常"), + SQL_SYNTAX_ERROR_EXCEPTION("1005", "SQL语法错误异常"), + NULL_POINT_ERROR_EXCEPTION("1006", "空指针异常信息"), + INNER_FRAME_EXCEPTION("1007", "内部框架执行异常"), + PARSE_TOKEN_EXCEPTION("1008", "解析token异常"), + TOKEN_NOT_EXIST("1009", "token不存在"), + TOKEN_SIGNATURE_EXCEPTION("1010", "token签名异常"), + TOKEN_EXPIRE("1011", "token过期,请重新登录"), + IMG_TYPE_NOT_CONFIG("1012", "请配置图片类型"), + NOT_CONFIG_FILE_DIR("1013", "请配置文件路径"), + UPLOAD_FILE_ERROR("1014", "文件上传失败"), + FILE_NOT_EXIST("1015", "文件不存在"), + FILE_HAS_DELETED("1016", "文件已被删除"), + DRIVER_CLASS_NOT_FOUND("1017", "数据库的连接驱动正在加载中..."), + TRY_CONNECT_DATABASE_ERROR("1018", "尝试连接数据库失败"), + CLOSE_CONNECT_DATABASE_ERROR("1019", "关闭数据库连接失败"), + DATABASE_NAME_NOT_EXIST("1020", "数据库名称不存在"), + CLOSE_DATASOURCE_ERROR("1021", "释放数据库资源异常"), + DRUID_DATASOURCE_ERROR("1022", "数据源创建中..."), + CREATE_DATABASE_ERROR("1023", "创建数据库失败"), + CREATE_TABLE_ERROR("1024", "创建表失败"), + UPDATE_TABLE_FIELD_ERROR("1025", "更新表字段失败"), + DELETE_TABLE_FIELD_ERROR("1026", "删除表字段失败"), + QUERY_ROLE_ERROR("1027", "查询角色失败"), + UPDATE_GROUP_ERROR("1028", "更新接口组失败"), + DELETE_GROUP_ERROR("1029", "删除接口组失败"), + SAVE_INTERFACE_ERROR("1030", "保存接口信息失败"), + + /** + * ******2xxx参数错误 ********************* + */ + BODY_NOT_MATCH("2001", "请求的数据格式不符"), + SIGNATURE_NOT_MATCH("2002", "请求的数字签名不匹配!"), + REQUEST_PATH_NOT_MATCH("2003", "当前请求路径没有权限!"), + NOT_UPLOAD_FILE_NAME_ERROR("2004", "上传的文件名不存在,请重新上传"), + NOT_SUPPORT_IMG_TYPE("2005", "图片格式不正确,请重新上传"), + NOT_SUPPORT_USERNAME_TYPE("2006", "excel用户名不能为空"), + NOT_SUPPORT_ROLE_TYPE("2007", "角色不存在"), + NOT_SUPPORT_DEPT_TYPE("2008", "部门不存在"), + SQL_INJECT_NOT_ALLOWED("2009", "参数中存在数据库关键字,请修改"), + TABLE_FIELD_NOT_EXIST("2010", "表字段不存在"), + + /** *********** 3xxx用户错误 ******************* */ + USER_NOT_LOGIN("3001", "用户未登录"), + USER_ACCOUNT_EXPIRED("3002", "账号已过期"), + USER_CREDENTIALS_ERROR("3003", "用户名或密码错误"), + USER_CREDENTIALS_EXPIRED("3004", "密码过期"), + USER_ACCOUNT_NOT_BIND_ENTERPRISE("3005", "当前账号未绑定企业"), + USER_ACCOUNT_LOCKED("3006", "账号被锁定"), + USER_ACCOUNT_NOT_EXIST("3007", "账号不存在"), + USER_ACCOUNT_ALREADY_EXIST("3008", "账号已存在"), + USER_ACCOUNT_USE_BY_OTHERS("3009", "账号下线"), + USER_NO_PERMISSION("3010", "当前账号没有此权限"), + USERNAME_NOT_BLANK("3011", "用户不能为空"), + USER_LOGIN_ERROR("3012", "用户登录失败"), + USER_LOGOUT_ERROR("3013", "用户退出失败"), + USER_ACCOUNT_USE_BY_OTHERS_ERROR("3014", "账号下线异常"), + USER_ACCESS_DENIED("3015", "权限认证失败"), + USERNAME_EXIST_ERROR("3016", "用户名重名"), + + ROLE_NAME_ALREADY_EXIST("3101", "角色已存在"), + + /** ********** 4xxx业务错误 *********************** */ + ENTERPRISE_NOT_EXIST("4001", "当前企业不存在"), + APP_KEY_EXIST("4002", "应用key已存在"), + APP_NOT_EXIST("4003", "应用不存在"), + APP_PAGE_NAME_EXIST("4004", "当前页面名称已存在"), + APP_PAGE_KEY_EXIST("4005", "当前页面key已存在"), + APP_PAGE_NOT_EXIST("4006", "当前页面不存在,或已删除"), + APP_PAGE_TYPE_ERROR("4007", "页面类型有误"), + APP_PAGE_HOME_IS_NOT_EXIST("4008", "请设置首页"), + CAN_NOT_DELETE_HOME_PAGE("4009", "请勿删除首页"), + DELETE_PAGE_ERROR("4010", "删除页面失败"), + CONFIG_CUSTOM_ERROR("4011", "配置自定义页面失败"), + APP_PAGE_PARENT_NOT_EXIST("4012", "当前页面的父级页面不存在,或已删除"), + DATASOURCE_NAME_EXIST("4013", "当前数据源名称已经存在,请修改后重试"), + DATASOURCE_NOT_EXIST("4014", "当前数据源不存在"), + DATASOURCE_HAS_DELETED("4015", "当前数据源已删除"), + MODEL_NOT_EXIST("4016", "当前模型不存在"), + MODEL_HAS_DELETED("4017", "当前模型已删除"), + MODEL_NAME_HAS_EXIST("4018", "当前模型名称已存在"), + DATASOURCE_NOT_CONFIG("4019", "数据源配置为空,请联系管理员"), + DATASOURCE_NOT_CONFIG_DIALECT("4020", "未配置数据源的类型"), + DATASOURCE_NOT_CONFIG_DRIVER_CLASS_NAME("4021", "未配置数据源的驱动"), + DEPT_USER_EXIST("4022", "部门下存在用户"), + NOT_CONFIG_PAGE_BUTTON_TYPE("4023", "未配置按钮雷星"), + MODEL_PAGE_RELATION_MODEL("4024", "已关联当前模型页面"), + MODEL_PAGE_NOT_EXIST("4025", "模型页面不存在或已被删除"), + MODEL_HAS_RELATION_MODEL_PAGE("4026", "当前模型已关联模型页面,不允许删除"), + FORM_NOT_EXIST("4027", "模型表单不存在"), + READ_FILE_ERROR("4028", "读取模型页面的模板文件失败"), + MODEL_PAGE_CONTENT_NULL("4029", "未配置模型页面的模板文件"), + NOT_CONFIG_QUERY_SQL("4030", "未配置查询语句"), + APP_PAGE_BUTTON_OPTION_VALUE_ERROR("4031", "未配置接口"), + DELETE_COLUMN_ERROR("4032", "删除当前失败"), + INSERT_DATA_ERROR("4033", "新建数据失败"), + EDIT_DATA_ERROR("4034", "编辑数据失败"), + DATASOURCE_HAS_MODELS("4035", "当前数据源存在模型,不允许删除"), + NOT_CONFIG_FORM_API("4036", "未配置模型表单页的接口信息"), + PLEASE_WRITE_AT_LEAST_DATA("4037", "请至少填写一行数据"), + AMIS_PAGE_ERROR("4038", "分页参数异常"), + QUERY_APP_PAGE_QUERY_FIELD_ERROR("4039", "查询搜素参数异常"), + REQUEST_PARAM_NOT_IN_APP_PAGE_QUERY_FIELD("4040", "请求参数不在查询数据表中"), + STYLE_LANGUAGE_ON_CSS("4041", "自定义css中的样式语言不能为空"), + APP_CONFIG_TYPE_NOT_EXIST("4042", "不支持当前应用设置的类型"), + APP_CONFIG_NOT_EXIST_OR_DELETED("4043", "当前设置不存在或已被删除"), + APP_HAS_CONFIG_ON_THIS_TYPE("4044", "当前应用设置的类型已存在,请更新"), + NOT_SUPPORT_COMPONENT_FRAME("4045", "不支持当前组件框架"), + NOT_SUPPORT_COMPONENT_TYPE("4046", "不支持当前组件类型"), + CURRENT_APP_KEY_EXIST("4047", "当前应用的组件key已存在"), + CREATE_CUSTOM_COMPONENT_ERROR("4048", "新增自定义组件失败"), + APP_CUSTOM_COMPONENT_NOT_EXIST("4049", "当前组件不存在或已被删除"), + UPDATE_CUSTOM_COMPONENT_ERROR("4050", "更新自定义组件失败"), + DELETED_CUSTOM_COMPONENT_ERROR("4051", "删除自定义组件失败"), + INSERT_COMPONENT_DEPENDENCE_ERROR("4052", "新增自定义组件依赖项失败"), + DELETE_COMPONENT_DEPENDENCE_ERROR("4053", "删除自定义组件依赖项失败"), + CURRENT_COMPONENT_DEPENDENCE_NOT_EXIST("4054", "当前自定义组件依赖项不存在或已被删除"), + CURRENT_APP_NAME_EXIST("4055", "当前应用的组件名称已存在"), + NOT_SUPPORT_DATASOURCE_FROM("4056", "不支持当前的数据库来源"), + JDBC_CONFIG_ERROR("4057", "平台内置的数据源配置有误"), + NOT_SUPPORT_MODEL_TYPE("4058", "不支持当前的页面模板"), + NOT_SUPPORT_CUSTOM_PAGE("4059", "暂不支持自定义页面"), + FORM_PAGE_ON_DEVELOPING("4060", "自定义页面的该功能正在开发中..."), + APP_PAGE_QUERY_FIELD_NOT_EXIST("4061", "当前查询条件不存在,或已被删除"), + APP_PAGE_BUTTON_NOT_EXIST("4062", "当前页面按钮不存在,或已被删除"), + TABLE_KEY_MORE_THEN_ONE("4063", "主键超过一个"), + TABLE_KEY_LESS_THEN_ONE("4064", "主键必须存在"), + TABLE_KEY_MUST_BE_INT("4065", "主键必须为整数类型"), + TABLE_FIELD_MUST_EXIST("4066", "必须存在表字段"), + CURRENT_MODEL_PAGE_HAS_CONVERSION_CUSTOM_PAGE("4067", "当前模型页面已转成自定义页面"), + NOT_SUPPORT_RELEASE_STATUS("4068", "发布版本状态有误"), + APP_FORM_BUTTON_NOT_EXIST("4067", "当前表单按钮不存在,或已被删除"), + DATASOURCE_KEY_EXIST_ERROR("4068","数据源key已存在") + ; + + CodeMessageEnum(String code, String message) { + this.code = code; + this.message = message; + } + + /** 返回到前端的code值 */ + private String code; + + /** 返回到前端的code对应的message值 */ + private String message; + + @Override + public String getCode() { + return this.code; + } + + @Override + public String getMessage() { + return this.message; + } + +// public static CodeVo getJsonObjectByCode(String code) { +// CodeVo codeVo = new CodeVo(); +// if (Tools.isEmpty(code)) { +// return codeVo; +// } +// for (CodeMessageEnum enumObj : CodeMessageEnum.values()) { +// if (enumObj.getCode().equals(code)) { +// return new CodeVo(code, enumObj.message); +// } +// } +// return codeVo; +// } +} diff --git a/src/main/resources/mybatis/dsno2/system/RouteMapper.xml b/src/main/resources/mybatis/dsno2/system/RouteMapper.xml new file mode 100644 index 0000000..6ea0e6e --- /dev/null +++ b/src/main/resources/mybatis/dsno2/system/RouteMapper.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + SYS_ROUTE + + + + + ROUTE_ID, + PARENT_ID, + PARENT_IDS, + PATH, + REDIRECT, + COMPONENT, + META, + ROUTE_ORDER, + ROUTE_ICON, + ROUTE_STATE, + SHIRO_KEY, + SHOW_MODEL, + ROUTE_TYPE, + ROUTE_NAME + + + + + #{ROUTE_ID}, + #{PARENT_ID}, + #{PARENT_IDS}, + #{PATH}, + #{REDIRECT}, + #{COMPONENT}, + #{META}, + #{ROUTE_ORDER}, + #{ROUTE_ICON}, + #{ROUTE_STATE}, + #{SHIRO_KEY}, + #{SHOW_MODEL}, + #{ROUTE_TYPE}, + #{ROUTE_NAME} + + + + + insert into + + ( + + ) values ( + + ) + + + + + update + + set + PARENT_ID = #{PARENT_ID}, + PARENT_IDS = #{PARENT_IDS}, + PATH = #{PATH}, + REDIRECT = #{REDIRECT}, + COMPONENT = #{COMPONENT}, + META = #{META}, + ROUTE_ORDER = #{ROUTE_ORDER}, + ROUTE_ICON = #{ROUTE_ICON}, + ROUTE_STATE = #{ROUTE_STATE}, + SHIRO_KEY = #{SHIRO_KEY}, + SHOW_MODEL = #{SHOW_MODEL}, + ROUTE_TYPE = #{ROUTE_TYPE}, + ROUTE_NAME = #{ROUTE_NAME} + where + ROUTE_ID=#{ROUTE_ID} + + + + + + + + + + + + + + + delete from + + where ROUTE_ID=#{ROUTE_ID} + + + + + update + + set + ROUTE_ICON = #{ICON} + where + ROUTE_ID=#{ROUTE_ID} + + + + + + + + + + +