From ac40c5e5ec15372f846ceb4f3d4ee95085a69a2d Mon Sep 17 00:00:00 2001 From: LEED Date: Mon, 7 Jul 2025 22:26:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=20=E7=AE=A1=E7=90=86=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E8=A7=92=E8=89=B2=E5=89=8D=E5=90=8E=E7=AB=AF=E5=88=86?= =?UTF-8?q?=E9=85=8D=20=20=E5=8F=8A=E9=80=9A=E9=81=93=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysDeptController.java | 3 + .../controller/system/SysLoginController.java | 9 + .../controller/system/SysMenuController.java | 103 ++++++++- .../common/core/domain/entity/SysMenu.java | 12 +- .../common/core/domain/entity/SysRole.java | 31 ++- .../common/core/domain/model/LoginBody.java | 6 +- .../web/service/SysLoginService.java | 22 +- .../consumer/DeviceStatusConsumer.java | 2 +- .../src/main/resources/application-prod.yml | 7 +- .../main/java/com/xinda/server/Server.java | 4 +- .../com/xinda/server/config/NettyConfig.java | 1 - .../com/xinda/mqtt/server/MqttServer2.java | 137 +++++++++++ .../com/xinda/mqtt/server/MqttServer3.java | 71 ++++++ xinda-server/pom.xml | 3 +- .../java/com/xinda/sip/server/SipLayer.java | 13 +- .../impl/SipDeviceChannelServiceImpl.java | 14 +- .../com/xinda/iot/service/IDeviceService.java | 2 +- .../iot/service/impl/DeviceServiceImpl.java | 61 +++++ .../xinda/system/mapper/SysMenuMapper.java | 21 +- .../xinda/system/mapper/SysRoleMapper.java | 3 + .../system/mapper/SysRoleMenuMapper.java | 9 +- .../xinda/system/service/ISysMenuService.java | 23 +- .../xinda/system/service/ISysRoleService.java | 3 +- .../service/impl/SysMenuServiceImpl.java | 128 ++++++++++- .../service/impl/SysRoleServiceImpl.java | 31 ++- .../resources/mapper/system/SysDeptMapper.xml | 2 +- .../resources/mapper/system/SysMenuMapper.xml | 213 +++++++++++++++--- .../resources/mapper/system/SysRoleMapper.xml | 20 +- .../mapper/system/SysRoleMenuMapper.xml | 26 ++- 29 files changed, 899 insertions(+), 81 deletions(-) create mode 100644 xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer2.java create mode 100644 xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer3.java diff --git a/xinda-admin/src/main/java/com/xinda/web/controller/system/SysDeptController.java b/xinda-admin/src/main/java/com/xinda/web/controller/system/SysDeptController.java index b029f13..344a9f7 100644 --- a/xinda-admin/src/main/java/com/xinda/web/controller/system/SysDeptController.java +++ b/xinda-admin/src/main/java/com/xinda/web/controller/system/SysDeptController.java @@ -168,7 +168,9 @@ public class SysDeptController extends BaseController // List sysMenuList = sysMenuService.selectMenuList(new SysMenu(), 1L, request.getHeader(LANGUAGE)); SysDept sysDept = deptService.selectDeptById(dept.getParentId()); List sysMenuList = sysMenuService.selectMenuList(new SysMenu(), sysDept.getDeptUserId()); + List sysMenuListF = sysMenuService.selectMenuListF(new SysMenu(), sysDept.getDeptUserId()); Long[] menuIdList = sysMenuList.stream().map(SysMenu::getMenuId).toArray(Long[]::new); + Long[] menuIdListF = sysMenuListF.stream().map(SysMenu::getMenuId).toArray(Long[]::new); SysRole sysRole = new SysRole(); sysRole.setRoleName("管理员"); sysRole.setRoleKey("manager"); @@ -176,6 +178,7 @@ public class SysDeptController extends BaseController sysRole.setStatus("0"); sysRole.setDeptId(dept.getDeptId()); sysRole.setMenuIds(menuIdList); + sysRole.setMenuFIds(menuIdListF); sysRoleService.insertRole(sysRole); // 注册机构管理员用户 diff --git a/xinda-admin/src/main/java/com/xinda/web/controller/system/SysLoginController.java b/xinda-admin/src/main/java/com/xinda/web/controller/system/SysLoginController.java index cc91c4c..a1c501c 100644 --- a/xinda-admin/src/main/java/com/xinda/web/controller/system/SysLoginController.java +++ b/xinda-admin/src/main/java/com/xinda/web/controller/system/SysLoginController.java @@ -125,4 +125,13 @@ public class SysLoginController List menus = menuService.selectMenuTreeByUserId(userId, request.getHeader(LANGUAGE)); return AjaxResult.success(menuService.buildMenus(menus)); } + @ApiOperation("获取路由信息") + @GetMapping("getBRouters") + public AjaxResult getBusRouters(HttpServletRequest request) + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuTreeByUserIdF(userId, request.getHeader(LANGUAGE)); + return AjaxResult.success(menuService.buildMenus(menus)); + } + } diff --git a/xinda-admin/src/main/java/com/xinda/web/controller/system/SysMenuController.java b/xinda-admin/src/main/java/com/xinda/web/controller/system/SysMenuController.java index 88731ba..a05ff4b 100644 --- a/xinda-admin/src/main/java/com/xinda/web/controller/system/SysMenuController.java +++ b/xinda-admin/src/main/java/com/xinda/web/controller/system/SysMenuController.java @@ -42,6 +42,17 @@ public class SysMenuController extends BaseController List menus = menuService.selectMenuList(menu, getUserId()); return success(menus); } + /** + * 获取菜单列表 + */ + @ApiOperation("获取菜单列表") + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/listF") + public AjaxResult listF(SysMenu menu) + { + List menus = menuService.selectMenuListF(menu, getUserId()); + return success(menus); + } /** * 根据菜单编号获取详细信息 @@ -54,6 +65,13 @@ public class SysMenuController extends BaseController return success(menuService.selectMenuById(menuId)); } + @ApiOperation("根据菜单编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/F/{menuId}") + public AjaxResult getInfoF(@PathVariable Long menuId) + { + return success(menuService.selectMenuByIdF(menuId)); + } /** * 获取菜单下拉树列表 */ @@ -65,6 +83,14 @@ public class SysMenuController extends BaseController return success(menuService.buildMenuTreeSelect(menus)); } + @ApiOperation("获取菜单下拉树列表") + @GetMapping("/treeselectF") + public AjaxResult treeselectF(SysMenu menu) + { + List menus = menuService.selectMenuListF(menu, getUserId()); + return success(menuService.buildMenuTreeSelect(menus)); + } + /** * 加载对应角色菜单列表树 */ @@ -73,13 +99,23 @@ public class SysMenuController extends BaseController public AjaxResult roleMenuTreeselect(@RequestParam Long roleId, @RequestParam Long deptId) { List menus = menuService.deptRoleMenuTreeselect(deptId, roleId); -// List menus = menuService.selectMenuList(getUserId(), request.getHeader(LANGUAGE)); AjaxResult ajax = AjaxResult.success(); ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); ajax.put("menus", menuService.buildMenuTreeSelect(menus)); return ajax; } + @ApiOperation("加载对应角色菜单列表树") + @GetMapping(value = "/roleMenuTreeselectF") + public AjaxResult roleMenuTreeselectF(@RequestParam Long roleId, @RequestParam Long deptId) + { + List menus = menuService.deptRoleMenuTreeselectF(deptId, roleId); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleIdF(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ajax; + } + /** * 新增菜单 */ @@ -100,10 +136,27 @@ public class SysMenuController extends BaseController menu.setCreateBy(getUsername()); return toAjax(menuService.insertMenu(menu)); } - + @ApiOperation("新增菜单") + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping(value = "/F") + public AjaxResult addF(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUniqueF(menu))) + { + return error(StringUtils.format(MessageUtils.message("menu.add.failed.name.exists"), menu.getMenuName())); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error(StringUtils.format(MessageUtils.message("menu.add.failed.path.not.valid"), menu.getMenuName())); + } + menu.setCreateBy(getUsername()); + return toAjax(menuService.insertMenuF(menu)); + } /** * 修改菜单 */ + @ApiOperation("修改菜单") @PreAuthorize("@ss.hasPermi('system:menu:edit')") @Log(title = "菜单管理", businessType = BusinessType.UPDATE) @@ -126,9 +179,32 @@ public class SysMenuController extends BaseController return toAjax(menuService.updateMenu(menu)); } + @ApiOperation("修改菜单") + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping(value = "/F") + public AjaxResult editF(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUniqueF(menu))) + { + return error(StringUtils.format(MessageUtils.message("menu.update.failed.name.exists"), menu.getMenuName())); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error(StringUtils.format(MessageUtils.message("menu.update.failed.path.not.valid"), menu.getMenuName())); + } + else if (menu.getMenuId().equals(menu.getParentId())) + { + return error(StringUtils.format(MessageUtils.message("menu.update.failed.parent.not.valid"), menu.getMenuName())); + } + menu.setUpdateBy(getUsername()); + return toAjax(menuService.updateMenuF(menu)); + } + /** * 删除菜单 */ + @ApiOperation("删除菜单") @PreAuthorize("@ss.hasPermi('system:menu:remove')") @Log(title = "菜单管理", businessType = BusinessType.DELETE) @@ -145,6 +221,22 @@ public class SysMenuController extends BaseController } return toAjax(menuService.deleteMenuById(menuId)); } + @ApiOperation("删除菜单") + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/F/{menuId}") + public AjaxResult removeF(@PathVariable("menuId") Long menuId) + { + if (menuService.hasChildByMenuId(menuId)) + { + return warn(MessageUtils.message("menu.delete.failed.child.exists")); + } + if (menuService.checkMenuExistRoleF(menuId)) + { + return warn(MessageUtils.message("menu.delete.failed.role.exists")); + } + return toAjax(menuService.deleteMenuByIdF(menuId)); + } /** * 加载对应部门菜单列表树 @@ -156,4 +248,11 @@ public class SysMenuController extends BaseController List menus = menuService.deptMenuTreeselect(deptId); return success(menuService.buildMenuTreeSelect(menus)); } + @ApiOperation("加载对应部门菜单列表树") + @GetMapping(value = "/deptMenuTreeselectF/{deptId}") + public AjaxResult deptMenuTreeselectF(@PathVariable("deptId") Long deptId) + { + List menus = menuService.deptMenuTreeselectF(deptId); + return success(menuService.buildMenuTreeSelect(menus)); + } } diff --git a/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysMenu.java b/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysMenu.java index 110eb94..730bbf3 100644 --- a/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysMenu.java +++ b/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysMenu.java @@ -61,6 +61,8 @@ public class SysMenu extends BaseEntity /** 是否缓存(0缓存 1不缓存) */ @ApiModelProperty("是否缓存(0缓存 1不缓存)") private String isCache; + @ApiModelProperty("是否缓存(0后端 1业务)") + private Integer bg; /** 类型(M目录 C菜单 F按钮) */ @ApiModelProperty("类型(M目录 C菜单 F按钮)") @@ -278,7 +280,15 @@ public class SysMenu extends BaseEntity { this.children = children; } - + + public Integer getBg() { + return bg; + } + + public void setBg(Integer bg) { + this.bg = bg; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysRole.java b/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysRole.java index 7f55eea..c81b58c 100644 --- a/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysRole.java +++ b/xinda-common/src/main/java/com/xinda/common/core/domain/entity/SysRole.java @@ -61,6 +61,9 @@ public class SysRole extends BaseEntity @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") private String status; + private String im; + private String ib; + /** 删除标志(0代表存在 2代表删除) */ @ApiModelProperty("删除标志") private String delFlag; @@ -71,7 +74,9 @@ public class SysRole extends BaseEntity /** 菜单组 */ @ApiModelProperty("菜单组") private Long[] menuIds; - + /** 菜单组 */ + @ApiModelProperty("菜单组") + private Long[] menuFIds; /** 部门组(数据权限) */ @ApiModelProperty("部门组") private Long[] deptIds; @@ -105,6 +110,14 @@ public class SysRole extends BaseEntity */ private Boolean manager; + public Long[] getMenuFIds() { + return menuFIds; + } + + public void setMenuFIds(Long[] menuFIds) { + this.menuFIds = menuFIds; + } + public Boolean getManager() { return manager; } @@ -300,6 +313,22 @@ public class SysRole extends BaseEntity this.permissions = permissions; } + public String getIm() { + return im; + } + + public void setIm(String im) { + this.im = im; + } + + public String getIb() { + return ib; + } + + public void setIb(String ib) { + this.ib = ib; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/xinda-common/src/main/java/com/xinda/common/core/domain/model/LoginBody.java b/xinda-common/src/main/java/com/xinda/common/core/domain/model/LoginBody.java index 552f33a..a505965 100644 --- a/xinda-common/src/main/java/com/xinda/common/core/domain/model/LoginBody.java +++ b/xinda-common/src/main/java/com/xinda/common/core/domain/model/LoginBody.java @@ -31,13 +31,14 @@ public class LoginBody */ private String uuid; + /** * 手机号 */ private String phonenumber; /** - * 登录平台 1-web端;2-移动端;3-小程序 + * 登录平台 0-前端 1-管理端;2-移动端;3-小程序 */ private Integer sourceType; @@ -46,6 +47,9 @@ public class LoginBody */ private String smsCode; + + + public Long getDeptId() { return deptId; } diff --git a/xinda-framework/src/main/java/com/xinda/framework/web/service/SysLoginService.java b/xinda-framework/src/main/java/com/xinda/framework/web/service/SysLoginService.java index 9da0d77..2370560 100644 --- a/xinda-framework/src/main/java/com/xinda/framework/web/service/SysLoginService.java +++ b/xinda-framework/src/main/java/com/xinda/framework/web/service/SysLoginService.java @@ -21,6 +21,7 @@ import com.xinda.framework.manager.factory.AsyncFactory; import com.xinda.framework.security.context.AuthenticationContextHolder; import com.xinda.system.service.ISysConfigService; import com.xinda.system.service.ISysDeptService; +import com.xinda.system.service.ISysRoleService; import com.xinda.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; @@ -62,6 +63,8 @@ public class SysLoginService { @Resource private ISysDeptService sysDeptService; + @Resource + private ISysRoleService sysRoleService; /** * 登录验证 * @@ -175,9 +178,9 @@ public class SysLoginService { public String login(Long deptId,String username, String password, String code, String uuid, Integer sourceType, String language) { boolean captchaEnabled = configService.selectCaptchaEnabled(); // 验证码开关 - if (captchaEnabled) { - validateCaptcha(username, code, uuid); - } +// if (captchaEnabled) { +// validateCaptcha(username, code, uuid); +// } // 用户验证 Authentication authentication = null; try { @@ -205,6 +208,19 @@ public class SysLoginService { if (null != sourceType && 1 == sourceType && null == userDeptId) { throw new ServiceException("web端只允许租户登录!"); } + if (null != sourceType && 1 == sourceType && !SysUser.isAdmin(loginUser.getUserId())) { + int msize = sysRoleService.selectRoleByUserIdAndIm(loginUser.getUserId()).size(); + if(msize==0){ + throw new ServiceException("该用户无管理端权限!"); + } + + }else if(null != sourceType && 0 == sourceType && !SysUser.isAdmin(loginUser.getUserId())){ + int bsize = sysRoleService.selectRoleByUserIdAndIb(loginUser.getUserId()).size(); + if(bsize==0){ + throw new ServiceException("该用户无前端权限!"); + } + } + // if (!"admin".equals(loginUser.getUsername()) && null != sourceType) { // Long deptId = loginUser.getDeptId(); // if (1 == sourceType && null == deptId) { diff --git a/xinda-gateway/xinda-mq/src/main/java/com/xinda/mq/redischannel/consumer/DeviceStatusConsumer.java b/xinda-gateway/xinda-mq/src/main/java/com/xinda/mq/redischannel/consumer/DeviceStatusConsumer.java index 2381b02..876ceb0 100644 --- a/xinda-gateway/xinda-mq/src/main/java/com/xinda/mq/redischannel/consumer/DeviceStatusConsumer.java +++ b/xinda-gateway/xinda-mq/src/main/java/com/xinda/mq/redischannel/consumer/DeviceStatusConsumer.java @@ -97,7 +97,7 @@ public class DeviceStatusConsumer { if (device.getAgenciesId() == null) { //设置删除状态 todo // device.setDelFlag("2"); - deviceService.deleteDeviceByDeviceId(device.getDeviceId()); + deviceService.deleteDeviceById(device.getDeviceId()); } } } diff --git a/xinda-record/src/main/resources/application-prod.yml b/xinda-record/src/main/resources/application-prod.yml index 80e37e5..81ccfb3 100644 --- a/xinda-record/src/main/resources/application-prod.yml +++ b/xinda-record/src/main/resources/application-prod.yml @@ -5,7 +5,8 @@ spring: timeout: 10000 # 以下为单机配置 # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1 - host: 127.0.0.1 +# host: 127.0.0.1 + host: redis # [必须修改] 端口号 port: 6379 # [可选] 数据库 DB @@ -27,8 +28,8 @@ server: # HTTPS配置, 默认不开启 ssl: # 是否开启HTTPS访问 默认关闭 - # enabled: false - enabled: true + enabled: false +# enabled: true # 证书文件路径,您需要使用实际的证书名称替换domain_name.jks。 key-store: classpath:xinda.online.jks # 证书密码 修改为对应密码 diff --git a/xinda-server/iot-server-core/src/main/java/com/xinda/server/Server.java b/xinda-server/iot-server-core/src/main/java/com/xinda/server/Server.java index 93a616f..d92db50 100644 --- a/xinda-server/iot-server-core/src/main/java/com/xinda/server/Server.java +++ b/xinda-server/iot-server-core/src/main/java/com/xinda/server/Server.java @@ -73,5 +73,7 @@ public abstract class Server { log.warn("=>服务:{},在端口:{},已经停止!", config.name, config.port); } - + public void shutdownGracefully() { + stop(); + } } diff --git a/xinda-server/iot-server-core/src/main/java/com/xinda/server/config/NettyConfig.java b/xinda-server/iot-server-core/src/main/java/com/xinda/server/config/NettyConfig.java index ff3078e..45b9a7f 100644 --- a/xinda-server/iot-server-core/src/main/java/com/xinda/server/config/NettyConfig.java +++ b/xinda-server/iot-server-core/src/main/java/com/xinda/server/config/NettyConfig.java @@ -52,7 +52,6 @@ public class NettyConfig { - public NettyConfig(int workerGroup, int businessGroup, int readerIdleTime, diff --git a/xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer2.java b/xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer2.java new file mode 100644 index 0000000..ee3bebd --- /dev/null +++ b/xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer2.java @@ -0,0 +1,137 @@ +//package com.xinda.mqtt.server; +// +// +//import com.xinda.common.constant.XinDaConstant; +//import com.xinda.mqtt.handler.adapter.MqttMessageAdapter; +//import com.xinda.server.Server; +//import groovy.util.logging.Slf4j; +//import io.netty.bootstrap.AbstractBootstrap; +//import io.netty.bootstrap.ServerBootstrap; +//import io.netty.buffer.PooledByteBufAllocator; +//import io.netty.channel.ChannelInitializer; +//import io.netty.channel.ChannelOption; +//import io.netty.channel.ServerChannel; +//import io.netty.channel.epoll.Epoll; +//import io.netty.channel.epoll.EpollEventLoopGroup; +//import io.netty.channel.epoll.EpollServerSocketChannel; +//import io.netty.channel.nio.NioEventLoopGroup; +//import io.netty.channel.socket.nio.NioServerSocketChannel; +//import io.netty.channel.socket.nio.NioSocketChannel; +//import io.netty.handler.codec.mqtt.MqttDecoder; +//import io.netty.handler.codec.mqtt.MqttEncoder; +//import io.netty.handler.logging.LogLevel; +//import io.netty.handler.logging.LoggingHandler; +//import io.netty.handler.timeout.IdleStateHandler; +//import io.netty.util.concurrent.DefaultThreadFactory; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +// +//import java.util.concurrent.LinkedBlockingQueue; +//import java.util.concurrent.ThreadPoolExecutor; +//import java.util.concurrent.TimeUnit; +// +///** +// * MQTT Broker 服务端,基于 Netty 实现。 +// * 负责接收客户端连接、处理 MQTT 协议相关的消息。 +// * 通过优化 Netty 配置提升高并发连接和消息处理性能。 +// * +// * 主要优化点: +// * 1. 增加 worker 线程数,提升并发处理能力。 +// * 2. 增大 backlog,防止高并发连接时丢失请求。 +// * 3. 启用 TCP 参数(如 TCP_NODELAY、SO_REUSEADDR),降低延迟。 +// * 4. 增大收发缓冲区,提升吞吐量。 +// * 5. 使用 PooledByteBufAllocator 提升内存分配效率。 +// * 6. 业务线程池支持突发流量。 +// */ +//@Component +//@Slf4j +//public class MqttServer2 extends Server { +// /** +// * MQTT 消息适配器,负责处理所有 MQTT 协议相关的消息。 +// */ +// @Autowired +// private MqttMessageAdapter messageAdapter; +// +// /** +// * 初始化 Netty 服务端,设置各项性能参数。 +// * +// * @return Netty ServerBootstrap 实例 +// */ +// @Override +// protected AbstractBootstrap initialize() { +// // boss 线程负责接收连接,通常设置为 1 即可 +// int bossThreads = 1; +// // worker 线程负责处理 IO,根据 CPU 核心数设置,提升并发能力 +// int workerThreads = Math.max(4, Runtime.getRuntime().availableProcessors() * 4); +// Class channelClass; +// long startInit = System.currentTimeMillis(); +// // Epoll 优先(仅限 Linux),否则 NIO +// if (Epoll.isAvailable()) { +//// log.info("[性能优化] 使用 EpollEventLoopGroup"); +// bossGroup = new EpollEventLoopGroup(bossThreads, new DefaultThreadFactory(config.name + "-Boss", Thread.MAX_PRIORITY)); +// workerGroup = new EpollEventLoopGroup(workerThreads, new DefaultThreadFactory(config.name + "-Worker", Thread.MAX_PRIORITY)); +// channelClass = EpollServerSocketChannel.class; +// } else { +//// log.info("[性能优化] 使用 NioEventLoopGroup"); +// bossGroup = new NioEventLoopGroup(bossThreads, new DefaultThreadFactory(config.name + "-Boss", Thread.MAX_PRIORITY)); +// workerGroup = new NioEventLoopGroup(workerThreads, new DefaultThreadFactory(config.name + "-Worker", Thread.MAX_PRIORITY)); +// channelClass = NioServerSocketChannel.class; +// } +// +// // 业务线程池,处理耗时操作,避免阻塞 Netty IO 线程 +// if (config.businessCore > 0) { +// int core = Math.max(8, config.businessCore * 2); +// int max = Math.max(16, config.businessCore * 4); +// businessService = new ThreadPoolExecutor( +// core, +// max, // 允许突发时扩展 +// 120L, TimeUnit.SECONDS, // 空闲线程存活时间 +// new LinkedBlockingQueue<>(4096), // 增加队列长度,防止高并发丢任务 +// new DefaultThreadFactory(config.name + "-Business", true, Thread.NORM_PRIORITY), +// new ThreadPoolExecutor.CallerRunsPolicy()); // 队列满时由调用者处理,防止任务丢失 +//// log.info("[性能优化] 业务线程池 core={} max={} queue=4096", core, max); +// } +// long endInit = System.currentTimeMillis(); +//// log.info("[性能日志] Netty 服务端初始化耗时: {} ms", (endInit - startInit)); +// return new ServerBootstrap() +// // 绑定 boss 和 worker 线程组 +// .group(bossGroup, workerGroup) +// // 指定服务端通道类型 +// .channel(channelClass) +// // 设置 Netty 日志级别 +// .handler(new LoggingHandler(LogLevel.INFO)) +// // 设置服务端 accept 队列长度,提升高并发连接能力 +// .option(ChannelOption.SO_BACKLOG, 4096) +// // 启用端口复用,提升端口重启和高并发下的可用性 +// .option(ChannelOption.SO_REUSEADDR, true) +// // 启用 TCP 保活 +// .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE) +// // 禁用 Nagle 算法,降低延迟 +// .childOption(ChannelOption.TCP_NODELAY, true) +// // 增大发送缓冲区 +// .childOption(ChannelOption.SO_SNDBUF, 4 * 1024 * 1024) +// // 增大接收缓冲区 +// .childOption(ChannelOption.SO_RCVBUF, 4 * 1024 * 1024) +// // 使用池化内存分配器,提升内存分配效率 +// .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) +// // 初始化每个新连接的处理 pipeline +// .childHandler(new ChannelInitializer() { +// @Override +// protected void initChannel(NioSocketChannel channel) { +// long startConn = System.nanoTime(); +// // 客户端心跳检测机制,防止空闲连接占用资源 +// channel.pipeline() +// .addFirst(XinDaConstant.SERVER.IDLE +// , new IdleStateHandler(config.readerIdleTime, config.writerIdleTime, config.allIdleTime, TimeUnit.SECONDS)) +// // MQTT 协议解码器,支持最大 2MB 报文 +// .addLast(XinDaConstant.SERVER.DECODER, new MqttDecoder(1024 * 1024 * 2)) +// // MQTT 协议编码器 +// .addLast(XinDaConstant.SERVER.ENCODER, MqttEncoder.INSTANCE) +// // 业务消息适配器,处理所有 MQTT 消息 +// .addLast(messageAdapter); +// long endConn = System.nanoTime(); +//// log.debug("[性能日志] 新连接 pipeline 初始化耗时: {} μs", (endConn - startConn) / 1000); +// } +// }); +// } +//} diff --git a/xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer3.java b/xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer3.java new file mode 100644 index 0000000..8d701ed --- /dev/null +++ b/xinda-server/mqtt-broker/src/main/java/com/xinda/mqtt/server/MqttServer3.java @@ -0,0 +1,71 @@ +package com.xinda.mqtt.server; + + +import com.xinda.common.constant.XinDaConstant; +import com.xinda.mqtt.handler.adapter.MqttMessageAdapter; +import com.xinda.server.Server; +import io.netty.bootstrap.AbstractBootstrap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.mqtt.MqttDecoder; +import io.netty.handler.codec.mqtt.MqttEncoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.util.concurrent.DefaultThreadFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@Component +@Slf4j +public class MqttServer3 extends Server { + + @Autowired + private MqttMessageAdapter messageAdapter; + + @Override + protected AbstractBootstrap initialize() { + bossGroup = new NioEventLoopGroup(1, new DefaultThreadFactory(config.name, Thread.MAX_PRIORITY)); + workerGroup = new NioEventLoopGroup(config.workerCore, new DefaultThreadFactory(config.name, Thread.MAX_PRIORITY)); + + if (config.businessCore > 0) { + businessService = new ThreadPoolExecutor(config.businessCore, config.businessCore, 1L, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new DefaultThreadFactory(config.name, true, Thread.NORM_PRIORITY)); + } + return new ServerBootstrap() + .group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.INFO)) + // 设置服务端 accept 队列长度,提升高并发连接能力 + .option(ChannelOption.SO_BACKLOG, 2048) + // 启用端口复用,提升端口重启和高并发下的可用性 + .option(ChannelOption.SO_REUSEADDR, true) + // 禁用 Nagle 算法,降低延迟 + .childOption(ChannelOption.TCP_NODELAY, true) + .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE) + .childHandler(new ChannelInitializer() { + + @Override + protected void initChannel(NioSocketChannel channel) { + //客户端心跳检测机制 + channel.pipeline() + .addFirst(XinDaConstant.SERVER.IDLE + , new IdleStateHandler(config.readerIdleTime, config.writerIdleTime, config.allIdleTime, TimeUnit.SECONDS)) + .addLast(XinDaConstant.SERVER.DECODER, new MqttDecoder(1024 * 1024 * 2)) + .addLast(XinDaConstant.SERVER.ENCODER, MqttEncoder.INSTANCE) + .addLast(messageAdapter); + } + }); + + + } +} diff --git a/xinda-server/pom.xml b/xinda-server/pom.xml index d594e48..1048b79 100644 --- a/xinda-server/pom.xml +++ b/xinda-server/pom.xml @@ -32,7 +32,8 @@ io.netty netty-all - 4.1.56.Final + 4.1.74.Final + compile diff --git a/xinda-server/sip-server/src/main/java/com/xinda/sip/server/SipLayer.java b/xinda-server/sip-server/src/main/java/com/xinda/sip/server/SipLayer.java index 053a5b4..c09922f 100644 --- a/xinda-server/sip-server/src/main/java/com/xinda/sip/server/SipLayer.java +++ b/xinda-server/sip-server/src/main/java/com/xinda/sip/server/SipLayer.java @@ -82,7 +82,18 @@ public class SipLayer { SipProvider startUdpListener() throws Exception { if (sipConfig.isEnabled()) { log.info("startUdpListener"); - ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "UDP"); +// ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "UDP"); + ListeningPoint udpListeningPoint; + try { + udpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "UDP"); + } catch (Exception e) { + log.error("Bind failed on {}:{}, trying backup IP",sipConfig.getIp(), sipConfig.getPort()); + udpListeningPoint = sipStack.createListeningPoint( + "0.0.0.0", + sipConfig.getPort(), + "UDP" + ); + } SipProvider udpSipProvider = sipStack.createSipProvider(udpListeningPoint); udpSipProvider.addSipListener(gbSIPListener); log.info("Sip Server UDP 启动成功 port {}", sipConfig.getPort()); diff --git a/xinda-server/sip-server/src/main/java/com/xinda/sip/service/impl/SipDeviceChannelServiceImpl.java b/xinda-server/sip-server/src/main/java/com/xinda/sip/service/impl/SipDeviceChannelServiceImpl.java index 4e5a87c..5bf5135 100644 --- a/xinda-server/sip-server/src/main/java/com/xinda/sip/service/impl/SipDeviceChannelServiceImpl.java +++ b/xinda-server/sip-server/src/main/java/com/xinda/sip/service/impl/SipDeviceChannelServiceImpl.java @@ -65,7 +65,7 @@ public class SipDeviceChannelServiceImpl implements ISipDeviceChannelService { if (deviceChannel == null) { Product product = productService.getProductBySerialNumber(deviceId); if (product != null) { - insertSipDeviceChannel(channel); + insertSipDeviceChannelNew(channel); } else { log.error("未注册设备:{}", deviceId); } @@ -196,6 +196,18 @@ public class SipDeviceChannelServiceImpl implements ISipDeviceChannelService { return sipDeviceChannelMapper.insertSipDeviceChannel(sipDeviceChannel); } + public int insertSipDeviceChannelNew(SipDeviceChannel sipDeviceChannel) { + + Product product = productService.getProductBySerialNumber(sipDeviceChannel.getDeviceSipId()); + if (product != null) { + sipDeviceChannel.setTenantName(product.getTenantName()); + sipDeviceChannel.setProductId(product.getProductId()); + sipDeviceChannel.setProductName(product.getProductName()); + } + sipDeviceChannel.setCreateTime(DateUtils.getNowDate()); + return sipDeviceChannelMapper.insertSipDeviceChannel(sipDeviceChannel); + } + /** * 修改监控设备通道信息 * diff --git a/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/IDeviceService.java b/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/IDeviceService.java index 2a12c62..c1c4ffa 100644 --- a/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/IDeviceService.java +++ b/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/IDeviceService.java @@ -202,7 +202,7 @@ public interface IDeviceService * @return 结果 */ public AjaxResult deleteDeviceByDeviceId(Long deviceId) throws SchedulerException; - + public void deleteDeviceById(Long deviceId) ; /** * 生成设备唯一编号 * @return 结果 diff --git a/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/impl/DeviceServiceImpl.java b/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/impl/DeviceServiceImpl.java index e783f5b..739fe95 100644 --- a/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/impl/DeviceServiceImpl.java +++ b/xinda-service/xinda-iot-service/src/main/java/com/xinda/iot/service/impl/DeviceServiceImpl.java @@ -1370,6 +1370,67 @@ public class DeviceServiceImpl implements IDeviceService { return AjaxResult.success(); } + /** + * 删除设备 + * + * @param deviceId 需要删除的设备主键 + * @return 结果 + */ + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDeviceById(Long deviceId){ + //查询设备 + Device device = deviceMapper.selectDeviceByDeviceId(deviceId); + + // 2.3版本更改 设备管理者和设备拥有者为true,普通用户如果不是设备所有者,只能删除设备用户和用户自己的设备关联分组信息 + // 查绑定用户被分享用户配置的场景,需要把场景删掉 + DeviceUser deviceUser = deviceUserMapper.selectDeviceUserByDeviceId(deviceId); + List userIdSceneList = new ArrayList<>(); + if (null != deviceUser) { + userIdSceneList.add(deviceUser.getUserId()); + } + Long[] shareSceneIds = null; + List deviceShares = deviceShareService.selectDeviceShareByDeviceId(deviceId); + if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(deviceShares)) { + List userIdList = deviceShares.stream().map(DeviceShare::getUserId).collect(Collectors.toList()); + userIdSceneList.addAll(userIdList); + } + if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(userIdSceneList)) { + shareSceneIds = sceneDeviceMapper.listSceneIdByDeviceIdAndUserId(device.getSerialNumber(), userIdSceneList); + } + + if (null != shareSceneIds && shareSceneIds.length > 0) { + sceneService.deleteSceneBySceneIds(shareSceneIds); + } + // 删除设备分组。 租户、管理员和设备所有者 + deviceMapper.deleteDeviceGroupByDeviceId(new UserIdDeviceIdModel(null, deviceId)); + // 删除设备用户。 + deviceUserMapper.deleteDeviceUserByDeviceId(new UserIdDeviceIdModel(null, deviceId)); + deviceShareService.deleteDeviceShareByDeviceId(deviceId); + // 删除定时任务 TODO - emq兼容 + // deviceJobService.deleteJobByDeviceIds(new Long[]{deviceId}); + // 批量删除设备监测日志 + logService.deleteDeviceLogByDeviceNumber(device.getSerialNumber()); + // 批量删除设备事件日志 DeviceNumber + eventLogService.deleteEventLogByDeviceNumber(device.getSerialNumber()); + // 批量删除设备功能日志 + functionLogService.deleteFunctionLogByDeviceNumber(device.getSerialNumber()); + // 批量删除设备告警记录 + alertLogService.deleteAlertLogBySerialNumber(device.getSerialNumber()); + // redis中删除设备物模型(状态) + String key = RedisKeyBuilder.buildTSLVCacheKey(device.getProductId(), device.getSerialNumber()); + redisCache.deleteObject(key); + // 删除设备 + deviceMapper.deleteDeviceByDeviceIds(new Long[]{deviceId}); + // redis中删除规则脚本 + String cacheKey = RedisKeyBuilder.buildDeviceMsgCacheKey(device.getSerialNumber()); + redisCache.deleteObject(cacheKey); + // 删除设备 + deviceMapper.deleteDeviceByDeviceIds(new Long[]{deviceId}); + + } + /** * 根据设备编号查询协议编码 diff --git a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysMenuMapper.java b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysMenuMapper.java index af63d8f..a3a0cfc 100644 --- a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysMenuMapper.java +++ b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysMenuMapper.java @@ -18,6 +18,7 @@ public interface SysMenuMapper * @return 菜单列表 */ public List selectMenuList(SysMenu menu); + public List selectMenuListF(SysMenu menu); /** * 根据用户所有权限 @@ -33,7 +34,7 @@ public interface SysMenuMapper * @return 菜单列表 */ public List selectMenuListByUserId(SysMenu menu); - + public List selectMenuListByUserIdF(SysMenu menu); /** * 根据角色ID查询权限 * @@ -56,14 +57,15 @@ public interface SysMenuMapper * @return 菜单列表 */ public List selectMenuTreeAll(@Param("language") String language); - + public List selectMenuTreeAllF(@Param("language") String language); /** * 根据用户ID查询菜单 * * @param userId 用户ID * @return 菜单列表 */ - public List selectMenuTreeByUserId(@Param("userId") Long userId, @Param("language") String language); + public List selectMenuTreeByUserId(@Param("userId") Long userId,@Param("language") String language); + public List selectMenuTreeByUserIdF(@Param("userId") Long userId,@Param("language") String language); /** * 根据角色ID查询菜单树信息 @@ -73,7 +75,7 @@ public interface SysMenuMapper * @return 选中菜单列表 */ public List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); - + public List selectMenuListByRoleIdF(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); /** * 根据菜单ID查询信息 * @@ -81,7 +83,7 @@ public interface SysMenuMapper * @return 菜单信息 */ public SysMenu selectMenuById(@Param("menuId") Long menuId, @Param("language") String language); - + public SysMenu selectMenuByIdF(@Param("menuId") Long menuId, @Param("language") String language); /** * 是否存在菜单子节点 * @@ -89,7 +91,7 @@ public interface SysMenuMapper * @return 结果 */ public int hasChildByMenuId(Long menuId); - + public int hasChildByMenuIdF(Long menuId); /** * 新增菜单信息 * @@ -97,7 +99,7 @@ public interface SysMenuMapper * @return 结果 */ public int insertMenu(SysMenu menu); - + public int insertMenuF(SysMenu menu); /** * 修改菜单信息 * @@ -105,7 +107,7 @@ public interface SysMenuMapper * @return 结果 */ public int updateMenu(SysMenu menu); - + public int updateMenuF(SysMenu menu); /** * 删除菜单管理信息 * @@ -113,7 +115,7 @@ public interface SysMenuMapper * @return 结果 */ public int deleteMenuById(Long menuId); - + public int deleteMenuByIdF(Long menuId); /** * 校验菜单名称是否唯一 * @@ -122,4 +124,5 @@ public interface SysMenuMapper * @return 结果 */ public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); + public SysMenu checkMenuNameUniqueF(@Param("menuName") String menuName, @Param("parentId") Long parentId); } diff --git a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMapper.java b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMapper.java index 7ac9134..db3a2ca 100644 --- a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMapper.java +++ b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMapper.java @@ -27,6 +27,9 @@ public interface SysRoleMapper */ public List selectRolePermissionByUserId(Long userId); + public List selectRoleByUserIdAndIm(Long userId); + public List selectRoleByUserIdAndIb(Long userId); + /** * 查询所有角色 * diff --git a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMenuMapper.java b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMenuMapper.java index 67878aa..dee0510 100644 --- a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMenuMapper.java +++ b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/mapper/SysRoleMenuMapper.java @@ -17,7 +17,7 @@ public interface SysRoleMenuMapper * @return 结果 */ public int checkMenuExistRole(Long menuId); - + public int checkMenuExistRoleF(Long menuId); /** * 通过角色ID删除角色和菜单关联 * @@ -25,7 +25,7 @@ public interface SysRoleMenuMapper * @return 结果 */ public int deleteRoleMenuByRoleId(Long roleId); - + public int deleteRoleMenuByRoleIdF(Long roleId); /** * 批量删除角色菜单关联信息 * @@ -33,7 +33,7 @@ public interface SysRoleMenuMapper * @return 结果 */ public int deleteRoleMenu(Long[] ids); - + public int deleteRoleMenuF(Long[] ids); /** * 批量新增角色菜单信息 * @@ -41,11 +41,12 @@ public interface SysRoleMenuMapper * @return 结果 */ public int batchRoleMenu(List roleMenuList); - + public int batchRoleMenuF(List roleMenuList); /** * 查询角色权限 * @param roleId 角色id * @return java.util.List */ List selectRoleMenuList(Long roleId); + List selectRoleMenuListF(Long roleId); } diff --git a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysMenuService.java b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysMenuService.java index be749d7..eea95bf 100644 --- a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysMenuService.java +++ b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysMenuService.java @@ -20,7 +20,7 @@ public interface ISysMenuService * @return 菜单列表 */ public List selectMenuList(Long userId); - + public List selectMenuListF(Long userId); /** * 根据用户查询系统菜单列表 * @@ -29,6 +29,7 @@ public interface ISysMenuService * @return 菜单列表 */ public List selectMenuList(SysMenu menu, Long userId); + public List selectMenuListF(SysMenu menu, Long userId); /** * 根据用户ID查询权限 @@ -54,7 +55,7 @@ public interface ISysMenuService * @return 菜单列表 */ public List selectMenuTreeByUserId(Long userId, String language); - + public List selectMenuTreeByUserIdF(Long userId, String language); /** * 根据角色ID查询菜单树信息 * @@ -62,7 +63,7 @@ public interface ISysMenuService * @return 选中菜单列表 */ public List selectMenuListByRoleId(Long roleId); - + public List selectMenuListByRoleIdF(Long roleId); /** * 构建前端路由所需要的菜单 * @@ -94,6 +95,7 @@ public interface ISysMenuService * @return 菜单信息 */ public SysMenu selectMenuById(Long menuId); + public SysMenu selectMenuByIdF(Long menuId); /** * 是否存在菜单子节点 @@ -102,7 +104,7 @@ public interface ISysMenuService * @return 结果 true 存在 false 不存在 */ public boolean hasChildByMenuId(Long menuId); - + public boolean hasChildByMenuIdF(Long menuId); /** * 查询菜单是否存在角色 * @@ -110,7 +112,7 @@ public interface ISysMenuService * @return 结果 true 存在 false 不存在 */ public boolean checkMenuExistRole(Long menuId); - + public boolean checkMenuExistRoleF(Long menuId); /** * 新增保存菜单信息 * @@ -118,7 +120,7 @@ public interface ISysMenuService * @return 结果 */ public int insertMenu(SysMenu menu); - + public int insertMenuF(SysMenu menu); /** * 修改保存菜单信息 * @@ -126,7 +128,7 @@ public interface ISysMenuService * @return 结果 */ public int updateMenu(SysMenu menu); - + public int updateMenuF(SysMenu menu); /** * 删除菜单管理信息 * @@ -134,7 +136,7 @@ public interface ISysMenuService * @return 结果 */ public int deleteMenuById(Long menuId); - + public int deleteMenuByIdF(Long menuId); /** * 校验菜单名称是否唯一 * @@ -142,8 +144,9 @@ public interface ISysMenuService * @return 结果 */ public String checkMenuNameUnique(SysMenu menu); - + public String checkMenuNameUniqueF(SysMenu menu); List deptMenuTreeselect(Long deptId); - + List deptMenuTreeselectF(Long deptId); List deptRoleMenuTreeselect(Long deptId, Long roleId); + List deptRoleMenuTreeselectF(Long deptId, Long roleId); } diff --git a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysRoleService.java b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysRoleService.java index 07d2916..06f2abb 100644 --- a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysRoleService.java +++ b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/ISysRoleService.java @@ -170,5 +170,6 @@ public interface ISysRoleService * @return 结果 */ public int insertAuthUsers(Long roleId, Long[] userIds); - + public List selectRoleByUserIdAndIm(Long userId); + public List selectRoleByUserIdAndIb(Long userId); } diff --git a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysMenuServiceImpl.java b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysMenuServiceImpl.java index 02f8f4c..483ead7 100644 --- a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysMenuServiceImpl.java +++ b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysMenuServiceImpl.java @@ -66,6 +66,12 @@ public class SysMenuServiceImpl implements ISysMenuService return selectMenuList(new SysMenu(), userId); } + @Override + public List selectMenuListF(Long userId) + { + return selectMenuListF(new SysMenu(), userId); + } + /** * 查询系统菜单列表 * @@ -73,7 +79,7 @@ public class SysMenuServiceImpl implements ISysMenuService * @return 菜单列表 */ @Override - public List selectMenuList(SysMenu menu, Long userId) + public List selectMenuList(SysMenu menu,Long userId) { menu.setLanguage(SecurityUtils.getLanguage()); List menuList = null; @@ -89,6 +95,23 @@ public class SysMenuServiceImpl implements ISysMenuService } return menuList; } + @Override + public List selectMenuListF(SysMenu menu,Long userId) + { + menu.setLanguage(SecurityUtils.getLanguage()); + List menuList = null; + // 管理员显示所有菜单信息 + if (SysUser.isAdmin(userId)) + { + menuList = menuMapper.selectMenuListF(menu); + } + else + { + menu.getParams().put("userId", userId); + menuList = menuMapper.selectMenuListByUserIdF(menu); + } + return menuList; + } /** * 根据用户ID查询权限 @@ -154,6 +177,21 @@ public class SysMenuServiceImpl implements ISysMenuService return getChildPerms(menus, 0); } + @Override + public List selectMenuTreeByUserIdF(Long userId, String language) + { + List menus = null; + if (SecurityUtils.isAdmin(userId)) + { + menus = menuMapper.selectMenuTreeAllF(language); + } + else + { + menus = menuMapper.selectMenuTreeByUserIdF(userId, language); + } + return getChildPerms(menus, 0); + } + /** * 根据角色ID查询菜单树信息 * @@ -167,6 +205,13 @@ public class SysMenuServiceImpl implements ISysMenuService return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); } + @Override + public List selectMenuListByRoleIdF(Long roleId) + { + SysRole role = roleMapper.selectRoleById(roleId); + return menuMapper.selectMenuListByRoleIdF(roleId, role.isMenuCheckStrictly()); + } + /** * 构建前端路由所需要的菜单 * @@ -278,6 +323,12 @@ public class SysMenuServiceImpl implements ISysMenuService return menuMapper.selectMenuById(menuId, SecurityUtils.getLanguage()); } + @Override + public SysMenu selectMenuByIdF(Long menuId) + { + return menuMapper.selectMenuByIdF(menuId, SecurityUtils.getLanguage()); + } + /** * 是否存在菜单子节点 * @@ -290,7 +341,12 @@ public class SysMenuServiceImpl implements ISysMenuService int result = menuMapper.hasChildByMenuId(menuId); return result > 0; } - + @Override + public boolean hasChildByMenuIdF(Long menuId) + { + int result = menuMapper.hasChildByMenuIdF(menuId); + return result > 0; + } /** * 查询菜单使用数量 * @@ -303,7 +359,12 @@ public class SysMenuServiceImpl implements ISysMenuService int result = roleMenuMapper.checkMenuExistRole(menuId); return result > 0; } - + @Override + public boolean checkMenuExistRoleF(Long menuId) + { + int result = roleMenuMapper.checkMenuExistRoleF(menuId); + return result > 0; + } /** * 新增保存菜单信息 * @@ -315,6 +376,11 @@ public class SysMenuServiceImpl implements ISysMenuService { return menuMapper.insertMenu(menu); } + @Override + public int insertMenuF(SysMenu menu) + { + return menuMapper.insertMenuF(menu); + } /** * 修改保存菜单信息 @@ -327,7 +393,11 @@ public class SysMenuServiceImpl implements ISysMenuService { return menuMapper.updateMenu(menu); } - + @Override + public int updateMenuF(SysMenu menu) + { + return menuMapper.updateMenuF(menu); + } /** * 删除菜单管理信息 * @@ -339,7 +409,11 @@ public class SysMenuServiceImpl implements ISysMenuService { return menuMapper.deleteMenuById(menuId); } - + @Override + public int deleteMenuByIdF(Long menuId) + { + return menuMapper.deleteMenuByIdF(menuId); + } /** * 校验菜单名称是否唯一 * @@ -359,6 +433,19 @@ public class SysMenuServiceImpl implements ISysMenuService return UserConstants.UNIQUE; } + @Override + public String checkMenuNameUniqueF(SysMenu menu) + { + Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); + // 仅匹配菜单表存储的菜单名称,不匹配菜单翻译表存储的对应语言名称 + SysMenu info = menuMapper.checkMenuNameUniqueF(menu.getMenuName(), menu.getParentId()); + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + @Override public List deptMenuTreeselect(Long deptId) { SysDept sysDept = sysDeptMapper.selectDeptById(deptId); @@ -368,6 +455,15 @@ public class SysMenuServiceImpl implements ISysMenuService return this.selectMenuList(sysDept.getDeptUserId()); } + @Override + public List deptMenuTreeselectF(Long deptId) { + SysDept sysDept = sysDeptMapper.selectDeptById(deptId); + if (ObjectUtil.isNull(sysDept) && null == sysDept.getDeptUserId()) { + return new ArrayList<>(); + } + return this.selectMenuListF(sysDept.getDeptUserId()); + } + @Override public List deptRoleMenuTreeselect(Long deptId, Long roleId) { LoginUser loginUser = getLoginUser(); @@ -389,6 +485,27 @@ public class SysMenuServiceImpl implements ISysMenuService return this.selectMenuList(new SysMenu(), sysDept.getDeptUserId()); } + @Override + public List deptRoleMenuTreeselectF(Long deptId, Long roleId) { + LoginUser loginUser = getLoginUser(); + Long userDeptId = loginUser.getDeptId(); + Long deptUserId = loginUser.getUser().getDept().getDeptUserId(); + SysRole sysRole = roleMapper.selectRoleById(roleId); +// List sysUserRoleList = sysUserRoleMapper.selectRoleByUserId(sysDept.getDeptUserId()); +// SysUserRole sysUserRole = sysUserRoleList.stream().filter(s -> roleId.equals(s.getRoleId())).findAny().orElse(null); +// if (ObjectUtil.isNotNull(sysUserRole)) { +// return menuMapper.selectMenuList(new SysMenu()); +// } + if (!deptId.equals(userDeptId) && "manager".equals(sysRole.getRoleKey())) { + return this.selectMenuListF(deptUserId); + } + SysDept sysDept = sysDeptMapper.selectDeptById(deptId); + if (ObjectUtil.isNull(sysDept) && null == sysDept.getDeptUserId()) { + return new ArrayList<>(); + } + return this.selectMenuListF(new SysMenu(), sysDept.getDeptUserId()); + } + /** * 获取路由名称 * @@ -515,6 +632,7 @@ public class SysMenuServiceImpl implements ISysMenuService return returnList; } + /** * 递归列表 * diff --git a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysRoleServiceImpl.java b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysRoleServiceImpl.java index 13c364a..2a6ecec 100644 --- a/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysRoleServiceImpl.java +++ b/xinda-service/xinda-system-service/src/main/java/com/xinda/system/service/impl/SysRoleServiceImpl.java @@ -206,7 +206,7 @@ public class SysRoleServiceImpl implements ISysRoleService * @param roleId 角色ID * @return 角色对象信息 */ - @Cacheable(value = "role", key = "#root.methodName + '_' + #roleId", unless = "#result == null") +// @Cacheable(value = "role", key = "#root.methodName + '_' + #roleId", unless = "#result == null") @Override public SysRole selectRoleById(Long roleId) { @@ -347,6 +347,7 @@ public class SysRoleServiceImpl implements ISysRoleService roleMapper.updateRole(role); // 删除角色与菜单关联 roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); + roleMenuMapper.deleteRoleMenuByRoleIdF(role.getRoleId()); return insertRoleMenu(role); } @@ -390,6 +391,21 @@ public class SysRoleServiceImpl implements ISysRoleService */ public int insertRoleMenu(SysRole role) { + int rowsF = 1; + // 新增用户与角色管理 + List listF = new ArrayList(); + if (role.getMenuFIds() != null && role.getMenuFIds().length > 0){ + for (Long menuId : role.getMenuFIds()) + { + SysRoleMenu rmf = new SysRoleMenu(); + rmf.setRoleId(role.getRoleId()); + rmf.setMenuId(menuId); + listF.add(rmf); + } + roleMenuMapper.batchRoleMenuF(listF); + } + + int rows = 1; // 新增用户与角色管理 List list = new ArrayList(); @@ -404,6 +420,7 @@ public class SysRoleServiceImpl implements ISysRoleService { rows = roleMenuMapper.batchRoleMenu(list); } + return rows; } @@ -444,6 +461,7 @@ public class SysRoleServiceImpl implements ISysRoleService { // 删除角色与菜单关联 roleMenuMapper.deleteRoleMenuByRoleId(roleId); + roleMenuMapper.deleteRoleMenuByRoleIdF(roleId); // 删除角色与部门关联 roleDeptMapper.deleteRoleDeptByRoleId(roleId); return roleMapper.deleteRoleById(roleId); @@ -472,6 +490,7 @@ public class SysRoleServiceImpl implements ISysRoleService } // 删除角色与菜单关联 roleMenuMapper.deleteRoleMenu(roleIds); + roleMenuMapper.deleteRoleMenuF(roleIds); // 删除角色与部门关联 roleDeptMapper.deleteRoleDept(roleIds); return roleMapper.deleteRoleByIds(roleIds); @@ -525,4 +544,14 @@ public class SysRoleServiceImpl implements ISysRoleService } return userRoleMapper.batchUserRole(list); } + + @Override + public List selectRoleByUserIdAndIm(Long userId) { + return roleMapper.selectRoleByUserIdAndIm(userId); + } + + @Override + public List selectRoleByUserIdAndIb(Long userId) { + return roleMapper.selectRoleByUserIdAndIb(userId); + } } diff --git a/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysDeptMapper.xml b/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysDeptMapper.xml index e17d0b1..0a65b27 100644 --- a/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysDeptMapper.xml @@ -208,7 +208,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update sys_dept set del_flag = '2' where dept_id = #{deptId} + delete from sys_dept where dept_id = #{deptId} select distinct m.menu_id, - case - when #{language} = 'zh-CN' then m.menu_name - when #{language} = 'en-US' then t.en_us - else m.menu_name - end as menu_name, - m.parent_id, m.order_num, m.path, m.component, m.query, m.is_frame, m.is_cache, m.menu_type, m.visible, m.status, ifnull(m.perms,'') as perms, m.icon, m.create_time + m. menu_name, + m.parent_id, m.order_num, m.path, m.component, m.query, m.is_frame, m.is_cache, m.menu_type, m.visible, m.status, ifnull(m.perms,'') as perms, m.icon, m.create_time from sys_menu m left join sys_menu_translate t on m.menu_id = t.id @@ -55,34 +55,70 @@ order by m.parent_id, m.order_num + + + select distinct m.menu_id, m.parent_id, - case - when #{language} = 'zh-CN' then m.menu_name - when #{language} = 'en-US' then t.en_us - else m.menu_name - end as menu_name, + m.menu_name, m.path, m.component, m.`query`, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time from sys_menu m left join sys_role_menu rm on m.menu_id = rm.menu_id left join sys_user_role ur on rm.role_id = ur.role_id left join sys_role ro on ur.role_id = ro.role_id left join sys_user u on ur.user_id = u.user_id - left join sys_menu_translate t on m.menu_id = t.id + where u.user_id = #{userId} and m.menu_type in ('M', 'C') and m.status = 0 AND ro.status = 0 + order by m.parent_id, m.order_num + + + @@ -125,12 +169,29 @@ order by m.parent_id, m.order_num + + + + + + + + + + update sys_menu @@ -194,6 +281,29 @@ where menu_id = #{menuId} + + update sys_menu_f + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + `query` = #{query}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + insert into sys_menu( menu_id, @@ -234,8 +344,51 @@ ) + + insert into sys_menu_f( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + `query`, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{query}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + delete from sys_menu where menu_id = #{menuId} + + delete from sys_menu_f where menu_id = #{menuId} + diff --git a/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMapper.xml b/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMapper.xml index 7f163eb..492570b 100644 --- a/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMapper.xml @@ -13,6 +13,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -23,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, - r.status, r.del_flag, r.create_time, r.remark + r.status,r.im,r.ib, r.del_flag, r.create_time, r.remark from sys_role r left join sys_user_role ur on ur.role_id = r.role_id left join sys_user u on u.user_id = ur.user_id @@ -61,6 +63,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE r.del_flag = '0' and ur.user_id = #{userId} + + + + @@ -117,6 +129,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" menu_check_strictly, dept_check_strictly, status, + im, + ib, remark, create_by, create_time @@ -129,6 +143,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{menuCheckStrictly}, #{deptCheckStrictly}, #{status}, + im, + ib, #{remark}, #{createBy}, sysdate() @@ -145,6 +161,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" menu_check_strictly = #{menuCheckStrictly}, dept_check_strictly = #{deptCheckStrictly}, status = #{status}, + im = #{im}, + ib = #{ib}, remark = #{remark}, update_by = #{updateBy}, update_time = sysdate() diff --git a/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMenuMapper.xml index a266d76..b4e08d6 100644 --- a/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMenuMapper.xml +++ b/xinda-service/xinda-system-service/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -13,15 +13,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select count(1) from sys_role_menu where menu_id = #{menuId} + + + delete from sys_role_menu where role_id=#{roleId} + + delete from sys_role_menu_f where role_id=#{roleId} + delete from sys_role_menu where role_id in @@ -29,6 +41,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{roleId} + + delete from sys_role_menu_f where role_id in + + #{roleId} + + insert into sys_role_menu(role_id, menu_id) values @@ -36,5 +54,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" (#{item.roleId},#{item.menuId}) - + + insert into sys_role_menu_f(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + \ No newline at end of file