From 99d9406936ddd39e19b97f261c0eef64b6090e34 Mon Sep 17 00:00:00 2001 From: rqian <1206436827@qq.com> Date: Fri, 17 Apr 2026 12:39:29 +0800 Subject: [PATCH] #init --- .../com/maibu/FastBeeServletInitializer.java | 18 + .../controller/common/CaptchaController.java | 101 ++++++ .../controller/common/CommonController.java | 199 +++++++++++ .../controller/monitor/CacheController.java | 131 +++++++ .../controller/monitor/ServerController.java | 31 ++ .../monitor/SysLogininforController.java | 100 ++++++ .../monitor/SysOperlogController.java | 77 +++++ .../monitor/SysUserOnlineController.java | 98 ++++++ .../system/SysClientController.java | 109 ++++++ .../system/SysConfigController.java | 146 ++++++++ .../controller/system/SysDeptController.java | 292 ++++++++++++++++ .../system/SysDictDataController.java | 122 +++++++ .../system/SysDictTypeController.java | 146 ++++++++ .../controller/system/SysIndexController.java | 30 ++ .../controller/system/SysLoginController.java | 280 +++++++++++++++ .../controller/system/SysMenuController.java | 159 +++++++++ .../system/SysNoticeController.java | 100 ++++++ .../controller/system/SysPostController.java | 143 ++++++++ .../system/SysProfileController.java | 166 +++++++++ .../system/SysRegisterController.java | 42 +++ .../controller/system/SysRoleController.java | 300 ++++++++++++++++ .../system/SysTranslateController.java | 77 +++++ .../controller/system/SysUserController.java | 319 ++++++++++++++++++ .../controller/tool/SwaggerController.java | 24 ++ .../web/controller/tool/TestController.java | 185 ++++++++++ .../web/controller/tool/TestController2.java | 218 ++++++++++++ .../maibu/web/core/config/SwaggerConfig.java | 125 +++++++ 27 files changed, 3738 insertions(+) create mode 100644 maibu-admin/src/main/java/com/maibu/FastBeeServletInitializer.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/common/CaptchaController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/common/CommonController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/monitor/CacheController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/monitor/ServerController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysLogininforController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysOperlogController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysUserOnlineController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysClientController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysConfigController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeptController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictDataController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictTypeController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysIndexController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysLoginController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysMenuController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysNoticeController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysPostController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysProfileController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysRegisterController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysRoleController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysTranslateController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/system/SysUserController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/tool/SwaggerController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController2.java create mode 100644 maibu-admin/src/main/java/com/maibu/web/core/config/SwaggerConfig.java diff --git a/maibu-admin/src/main/java/com/maibu/FastBeeServletInitializer.java b/maibu-admin/src/main/java/com/maibu/FastBeeServletInitializer.java new file mode 100644 index 0000000..76586e5 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/FastBeeServletInitializer.java @@ -0,0 +1,18 @@ +package com.fastbee; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author ruoyi + */ +public class FastBeeServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(FastBeeApplication.class); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/common/CaptchaController.java b/maibu-admin/src/main/java/com/maibu/web/controller/common/CaptchaController.java new file mode 100644 index 0000000..78c00b6 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/common/CaptchaController.java @@ -0,0 +1,101 @@ +package com.fastbee.web.controller.common; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import com.google.code.kaptcha.Producer; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.utils.sign.Base64; +import com.fastbee.common.utils.uuid.IdUtils; +import com.fastbee.system.service.ISysConfigService; + +/** + * 验证码操作处理 + * + * @author ruoyi + */ +@Api(tags = "验证码操作") +@RestController +public class CaptchaController +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService configService; + /** + * 生成验证码 + */ + @ApiOperation("获取验证码") + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response,Boolean showCode) throws IOException + { + AjaxResult ajax = AjaxResult.success(); + boolean captchaEnabled = configService.selectCaptchaEnabled(); + ajax.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) + { + return ajax; + } + + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 生成验证码 + String captchaType = RuoYiConfig.getCaptchaType(); + if ("math".equals(captchaType)) + { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } + else if ("char".equals(captchaType)) + { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try + { + ImageIO.write(image, "jpg", os); + } + catch (IOException e) + { + return AjaxResult.error(e.getMessage()); + } + if (Boolean.TRUE.equals(showCode)) { + ajax.put("resultCode", code); + } + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/common/CommonController.java b/maibu-admin/src/main/java/com/maibu/web/controller/common/CommonController.java new file mode 100644 index 0000000..a66d3b5 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/common/CommonController.java @@ -0,0 +1,199 @@ +package com.fastbee.web.controller.common; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.file.QRCodeUtils; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.file.FileUploadUtils; +import com.fastbee.common.utils.file.FileUtils; +import com.fastbee.framework.config.ServerConfig; + +/** + * 通用请求处理 + * + * @author ruoyi + */ +@Api(tags = "通用请求处理") +@RestController +@RequestMapping("/common") +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + private static final String FILE_DELIMETER = ","; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @ApiOperation("文件下载") + @GetMapping("/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.checkAllowDownload(fileName)) + { + throw new Exception(StringUtils.format(MessageUtils.message("download.filename.not.valid"), fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求(单个) + */ + @ApiOperation("单个文件上传") + @PostMapping("/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + ajax.put("originalFilename", file.getOriginalFilename()); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @ApiOperation("多个文件上传") + @PostMapping("/uploads") + public AjaxResult uploadFiles(List files) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + for (MultipartFile file : files) + { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(file.getOriginalFilename()); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/download/resource") + @ApiOperation("本地资源通用下载") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + if (!FileUtils.checkAllowDownload(resource)) + { + throw new Exception(StringUtils.format(MessageUtils.message("download.resource.not.valid"), resource)); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + /** + * 生成二维码 + * @param url url + + * */ + @GetMapping(value = "/createQrCode") + @ApiOperation("根据url生成二维码") + public void getCode(String url, HttpServletResponse response) throws IOException { + // 设置响应流信息 + response.setContentType("image/jpg"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + + OutputStream stream = response.getOutputStream(); + + //获取一个二维码图片 + BitMatrix bitMatrix = QRCodeUtils.createCode(url); + //以流的形式输出到前端 + MatrixToImageWriter.writeToStream(bitMatrix , "jpg" , stream); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/monitor/CacheController.java b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/CacheController.java new file mode 100644 index 0000000..2962d53 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/CacheController.java @@ -0,0 +1,131 @@ +package com.fastbee.web.controller.monitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.domain.SysCache; + +/** + * 缓存监控 + * + * @author ruoyi + */ +@Api(tags = "缓存监控") +@RestController +@RequestMapping("/monitor/cache") +public class CacheController +{ + @Autowired + private RedisTemplate redisTemplate; + + private final static List caches = new ArrayList(); + { + caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); + caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息")); + caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典")); + caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码")); + caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交")); + caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理")); + caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数")); + } + + @ApiOperation("获取缓存信息") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } + + @ApiOperation("缓存列表") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getNames") + public AjaxResult cache() + { + return AjaxResult.success(caches); + } + + @ApiOperation("键名列表") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getKeys/{cacheName}") + public AjaxResult getCacheKeys(@PathVariable String cacheName) + { + Set cacheKeys = redisTemplate.keys(cacheName + "*"); + return AjaxResult.success(cacheKeys); + } + + @ApiOperation("缓存内容") + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getValue/{cacheName}/{cacheKey}") + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) + { + String cacheValue = redisTemplate.opsForValue().get(cacheKey); + SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); + return AjaxResult.success(sysCache); + } + + @ApiOperation("清理缓存名称") + @PreAuthorize("@ss.hasPermi('monitor:cache:remove')") + @DeleteMapping("/clearCacheName/{cacheName}") + public AjaxResult clearCacheName(@PathVariable String cacheName) + { + Collection cacheKeys = redisTemplate.keys(cacheName + "*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } + + @ApiOperation("清理缓存键名") + @PreAuthorize("@ss.hasPermi('monitor:cache:remove')") + @DeleteMapping("/clearCacheKey/{cacheKey}") + public AjaxResult clearCacheKey(@PathVariable String cacheKey) + { + redisTemplate.delete(cacheKey); + return AjaxResult.success(); + } + + @ApiOperation("清理所有缓存内容") + @PreAuthorize("@ss.hasPermi('monitor:cache:remove')") + @DeleteMapping("/clearCacheAll") + public AjaxResult clearCacheAll() + { + Collection cacheKeys = redisTemplate.keys("*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/monitor/ServerController.java b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/ServerController.java new file mode 100644 index 0000000..27510ed --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/ServerController.java @@ -0,0 +1,31 @@ +package com.fastbee.web.controller.monitor; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.framework.web.domain.Server; + +/** + * 服务器监控 + * + * @author ruoyi + */ +@Api(tags = "服务器监控") +@RestController +@RequestMapping("/monitor/server") +public class ServerController +{ + @ApiOperation("获取服务器信息") + @PreAuthorize("@ss.hasPermi('monitor:server:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Server server = new Server(); + server.copyTo(); + return AjaxResult.success(server); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysLogininforController.java b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..3679fd9 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysLogininforController.java @@ -0,0 +1,100 @@ +package com.fastbee.web.controller.monitor; + +import java.util.HashMap; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.framework.web.service.SysPasswordService; +import com.fastbee.system.domain.SysLogininfor; +import com.fastbee.system.service.ISysLogininforService; + +/** + * 系统访问记录 + * + * @author ruoyi + */ +@Api(tags = "日志管理:登录日志") +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController +{ + @Autowired + private ISysLogininforService logininforService; + + @Autowired + private SysPasswordService passwordService; + + @ApiOperation("获取列表登录信息") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor) + { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @ApiOperation("导出登录日志列表") + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysLogininfor logininfor) + { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + util.exportExcel(response, list, "登录日志"); + } + + @ApiOperation("批量删除登录日志") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) + { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @ApiOperation("清空登录日志信息") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return success(); + } + + @ApiOperation("账户解锁") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public AjaxResult unlock(@PathVariable("userName") String userName) + { + passwordService.clearLoginRecordCache(userName); + return success(); + } + + @ApiOperation("获取一周内每天用户统计") + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/userCount") + public AjaxResult userCount() + { + return toAjax(logininforService.getUserCount()); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysOperlogController.java b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..d6ad714 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysOperlogController.java @@ -0,0 +1,77 @@ +package com.fastbee.web.controller.monitor; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.domain.SysOperLog; +import com.fastbee.system.service.ISysOperLogService; + +/** + * 操作日志记录 + * + * @author ruoyi + */ +@Api(tags = "日志管理:操作日志") +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController +{ + @Autowired + private ISysOperLogService operLogService; + + @ApiOperation("获取操作日志列表") + @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog) + { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @ApiOperation("导出操作日志") + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysOperLog operLog) + { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + util.exportExcel(response, list, "操作日志"); + } + + @ApiOperation("批量删除操作日志") + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) + { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @ApiOperation("清空操作日志") + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return success(); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysUserOnlineController.java b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..68d132d --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,98 @@ +package com.fastbee.web.controller.monitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.CacheConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.core.redis.RedisCache; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.domain.SysUserOnline; +import com.fastbee.system.service.ISysUserOnlineService; + +/** + * 在线用户监控 + * + * @author ruoyi + */ +@Api(tags = "在线用户监控") +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController +{ + @Autowired + private ISysUserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @ApiOperation("获取在线用户列表") + @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) + { + Collection keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) + { + LoginUser user = redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) + { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) + { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + } + else if (StringUtils.isNotEmpty(ipaddr)) + { + if (StringUtils.equals(ipaddr, user.getIpaddr())) + { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + } + else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) + { + if (StringUtils.equals(userName, user.getUsername())) + { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } + } + else + { + userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 强退用户 + */ + @ApiOperation("强制退出在线用户") + @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) + { + redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); + return success(); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysClientController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysClientController.java new file mode 100644 index 0000000..7f9b65f --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysClientController.java @@ -0,0 +1,109 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.framework.web.service.TokenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.system.domain.SysClient; +import com.fastbee.system.service.ISysClientService; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.common.core.page.TableDataInfo; + +import static com.fastbee.common.utils.SecurityUtils.getLoginUser; + +/** + * 系统授权Controller + * + * @author zhuangpeng.li + * @date 2024-07-26 + */ +@RestController +@RequestMapping("/system/sysclient") +@Api(tags = "系统授权") +public class SysClientController extends BaseController { + @Autowired + private ISysClientService sysClientService; + @Autowired + private TokenService tokenService; + + /** + * 查询系统授权列表 + */ + @PreAuthorize("@ss.hasPermi('system:sysclient:list')") + @GetMapping("/list") + @ApiOperation("查询系统授权列表") + public TableDataInfo list(SysClient sysClient) { + startPage(); + List list = sysClientService.selectSysClientList(sysClient); + return getDataTable(list); + } + + /** + * 导出系统授权列表 + */ + @ApiOperation("导出系统授权列表") + @PreAuthorize("@ss.hasPermi('system:sysclient:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysClient sysClient) { + List list = sysClientService.selectSysClientList(sysClient); + ExcelUtil util = new ExcelUtil(SysClient.class); + util.exportExcel(response, list, "系统授权数据"); + } + + /** + * 获取系统授权详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:sysclient:query')") + @GetMapping(value = "/{id}") + @ApiOperation("获取系统授权详细信息") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(sysClientService.selectSysClientById(id)); + } + + /** + * 新增系统授权 + */ + @PreAuthorize("@ss.hasPermi('system:sysclient:add')") + @PostMapping + @ApiOperation("新增系统授权") + public AjaxResult add(@RequestBody SysClient sysClient) { + SysUser user = getLoginUser().getUser(); + return toAjax(tokenService.addToken(user, sysClient)); + } + + /** + * 修改系统授权 + */ + @PreAuthorize("@ss.hasPermi('system:sysclient:edit')") + @PutMapping + @ApiOperation("修改系统授权") + public AjaxResult edit(@RequestBody SysClient sysClient) { + SysUser user = getLoginUser().getUser(); + return toAjax(tokenService.updateToken(user, sysClient)); + } + + /** + * 删除系统授权 + */ + @PreAuthorize("@ss.hasPermi('system:sysclient:remove')") + @DeleteMapping("/{ids}") + @ApiOperation("删除系统授权") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(sysClientService.deleteSysClientByIds(ids)); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysConfigController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysConfigController.java new file mode 100644 index 0000000..0cdb51b --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysConfigController.java @@ -0,0 +1,146 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.domain.SysConfig; +import com.fastbee.system.service.ISysConfigService; + +/** + * 参数配置 信息操作处理 + * + * @author ruoyi + */ +@Api(tags = "参数设置") +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController +{ + @Autowired + private ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @ApiOperation("获取参数配置列表") + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(SysConfig config) + { + startPage(); + List list = configService.selectConfigList(config); + return getDataTable(list); + } + + @ApiOperation("导出参数配置列表") + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:config:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysConfig config) + { + List list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "参数数据"); + } + + /** + * 根据参数编号获取详细信息 + */ + @ApiOperation("根据参数编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) + { + return success(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + */ + @ApiOperation("根据参数键名查询参数值") + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) + { + return success(configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @ApiOperation("新增参数配置") + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) + { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) + { + return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setCreateBy(getUsername()); + return toAjax(configService.insertConfig(config)); + } + + /** + * 修改参数配置 + */ + @ApiOperation("修改参数配置") + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysConfig config) + { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) + { + return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setUpdateBy(getUsername()); + return toAjax(configService.updateConfig(config)); + } + + /** + * 删除参数配置 + */ + @ApiOperation("批量删除参数配置") + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) + { + configService.deleteConfigByIds(configIds); + return success(); + } + + /** + * 刷新参数缓存 + */ + @ApiOperation("刷新参数缓存") + @PreAuthorize("@ss.hasPermi('system:config:refresh')") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + configService.resetConfigCache(); + return success(); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeptController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeptController.java new file mode 100644 index 0000000..e43422a --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDeptController.java @@ -0,0 +1,292 @@ +package com.fastbee.web.controller.system; + +import cn.hutool.core.util.ObjectUtil; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.*; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.exception.ServiceException; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.iot.mapper.DeviceMapper; +import com.fastbee.iot.model.RegisterUserInput; +import com.fastbee.iot.model.RegisterUserOutput; +import com.fastbee.iot.service.IToolService; +import com.fastbee.system.domain.SysRoleDept; +import com.fastbee.system.domain.SysRoleMenu; +import com.fastbee.system.domain.SysUserRole; +import com.fastbee.system.domain.vo.SysDeptTypeVO; +import com.fastbee.system.mapper.SysRoleDeptMapper; +import com.fastbee.system.mapper.SysRoleMenuMapper; +import com.fastbee.system.mapper.SysUserRoleMapper; +import com.fastbee.common.utils.MessageUtils; + +import com.fastbee.system.service.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; + +import static com.fastbee.common.constant.Constants.LANGUAGE; + +/** + * 机构信息 + * + * @author ruoyi + */ +@Api(tags = "机构管理") +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController +{ + @Autowired + private ISysDeptService deptService; + + @Resource + private IToolService toolService; + + @Resource + private ISysUserService sysUserService; + + @Resource + private SysRoleDeptMapper sysRoleDeptMapper; + + @Resource + private ISysDictDataService sysDictDataService; + + @Resource + private ISysRoleService sysRoleService; + + @Resource + private ISysMenuService sysMenuService; + + @Resource + private DeviceMapper deviceMapper; + + /** + * 获取机构列表 + */ + @ApiOperation("获取机构列表") + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return success(depts); + } + + /** + * 查询机构列表(排除节点) + */ + @ApiOperation("查询机构列表(排除节点)") + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) + { + List depts = deptService.selectDeptList(new SysDept()); + depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + return success(depts); + } + + /** + * 根据机构编号获取详细信息 + */ + @ApiOperation("根据机构编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:dept:query')") + @Transactional(rollbackFor = Exception.class) + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) + { + deptService.checkDeptDataScope(deptId); + SysDept sysDept = deptService.selectDeptById(deptId); + if (null != sysDept && null != sysDept.getDeptUserId()) { + SysUser sysUser = sysUserService.selectUserById(sysDept.getDeptUserId()); + sysDept.setUserName(sysUser.getUserName()); + sysDept.setPhone(sysUser.getPhonenumber()); + } + return success(sysDept); + } + + /** + * 新增机构 + */ + @ApiOperation("新增机构") + @PreAuthorize("@ss.hasPermi('system:dept:add')") + @Log(title = "机构管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(HttpServletRequest request, @Validated @RequestBody SysDept dept) + { + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) + { + return error(StringUtils.format(MessageUtils.message("dept.add.failed.name.exists"), dept.getDeptName())); + } + dept.setCreateBy(getUsername()); + // 校验系统账号信息 + if (StringUtils.isNotEmpty(dept.getUserName())) { + SysUser sysUser = sysUserService.selectUserByUserName(dept.getUserName()); + if (ObjectUtil.isNotNull(sysUser)) { + throw new ServiceException(MessageUtils.message("user.username.exists")); + } + if (!dept.getPassword().equals(dept.getConfirmPassword())) { + throw new ServiceException(MessageUtils.message("user.password.differ")); + } + } + int result = deptService.insertDept(dept); + // 新增机构关联系统账号 + if (result > 0) { + // 添加管理员角色,给所有权限 + // 查询所有权限 +// List sysMenuList = sysMenuService.selectMenuList(new SysMenu(), 1L, request.getHeader(LANGUAGE)); + SysDept sysDept = deptService.selectDeptById(dept.getParentId()); + List sysMenuList = sysMenuService.selectMenuList(new SysMenu(), sysDept.getDeptUserId()); + Long[] menuIdList = sysMenuList.stream().map(SysMenu::getMenuId).toArray(Long[]::new); + SysRole sysRole = new SysRole(); + sysRole.setRoleName("管理员"); + sysRole.setRoleKey("manager"); + sysRole.setRoleSort(1); + sysRole.setStatus("0"); + sysRole.setDeptId(dept.getDeptId()); + sysRole.setMenuIds(menuIdList); + sysRoleService.insertRole(sysRole); + + // 注册机构管理员用户 + RegisterUserInput registerUserInput = new RegisterUserInput(); + registerUserInput.setUsername(dept.getUserName()); + registerUserInput.setPassword(dept.getPassword()); + registerUserInput.setPhonenumber(dept.getPhone()); + registerUserInput.setDeptId(dept.getDeptId()); + registerUserInput.setRoleIds(new Long[]{sysRole.getRoleId()}); + RegisterUserOutput registerUserOutput = toolService.registerNoCaptcha(registerUserInput); + if (StringUtils.isNotEmpty(registerUserOutput.getMsg())) { + deptService.deleteDeptById(dept.getDeptId()); + sysRoleService.deleteRoleById(sysRole.getRoleId()); + return AjaxResult.error(registerUserOutput.getMsg()); + } + // 更新机构管理员角色绑定信息 + deptService.updateDeptUserId(dept.getDeptId(), registerUserOutput.getSysUserId()); + } + return toAjax(result); + } + + /** + * 修改机构 + */ + @ApiOperation("修改机构") + @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @Log(title = "机构管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) + { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) + { + return error(StringUtils.format(MessageUtils.message("dept.update.failed.name.exists"), dept.getDeptName())); + } + else if (dept.getParentId().equals(deptId)) + { + return error(StringUtils.format(MessageUtils.message("dept.update.failed.parent.not.valid"), dept.getDeptName())); + } + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) + { + return error(MessageUtils.message("dept.update.failed.child.not.valid")); + } + dept.setUpdateBy(getUsername()); + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除机构 + */ + @ApiOperation("根据机构编号删除机构") + @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @Log(title = "机构管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable Long deptId) + { + if (deptService.hasChildByDeptId(deptId)) + { + return warn(MessageUtils.message("dept.delete.failed.child.exists")); + } +// if (deptService.checkDeptExistUser(deptId)) +// { +// return warn(MessageUtils.message("dept.delete.failed.user.exists")); +// } + deptService.checkDeptDataScope(deptId); + // 删除机构绑定角色和用户 + List roleIdList = sysRoleDeptMapper.selectByDeptId(deptId); + if (!org.springframework.util.CollectionUtils.isEmpty(roleIdList)) { + sysRoleService.deleteRoleByIds(roleIdList.toArray(new Long[roleIdList.size()])); + sysUserService.deleteUserByDeptID(deptId); + } + return toAjax(deptService.deleteDeptById(deptId)); + } + + /** + * 获取机构类型 + * @param deptType 父级类型 + * @return com.fastbee.common.core.domain.AjaxResult + */ + @GetMapping("/getDeptType") + public AjaxResult getDeptType(HttpServletRequest request, Integer deptType, Boolean showOwner) { + SysDictData sysDictData = new SysDictData(); + sysDictData.setDictType("department_type"); + List sysDictDataList = sysDictDataService.selectDictDataList(sysDictData); + if (CollectionUtils.isEmpty(sysDictDataList)) { + return success(); + } + List result = new ArrayList<>(); + for (SysDictData dictData : sysDictDataList) { + SysDeptTypeVO sysDeptTypeVO = new SysDeptTypeVO(); + sysDeptTypeVO.setDeptType(Integer.valueOf(dictData.getDictValue())); + sysDeptTypeVO.setDeptTypeName(dictData.getDictLabel()); + sysDeptTypeVO.setAncestors(dictData.getRemark()); + result.add(sysDeptTypeVO); + } + if (null == deptType) { + return success(result); + } + SysDeptTypeVO sysDeptTypeVO = result.stream().filter(d -> deptType.equals(d.getDeptType())).findFirst().orElse(null); + if (ObjectUtil.isNull(sysDeptTypeVO)) { + return success(new ArrayList<>()); + } + String ancestors = sysDeptTypeVO.getAncestors(); + result = result.stream().filter(d -> ancestors.contains(d.getDeptType().toString())).collect(Collectors.toList()); + if (showOwner) { + List newResult = new ArrayList<>(); + newResult.add(sysDeptTypeVO); + newResult.addAll(result); + return success(newResult); + } + return success(result); + } + + /** + * 获取机构角色 + * @param deptId 机构id + * @return com.fastbee.common.core.domain.AjaxResult + */ + @GetMapping("/getRole") + public AjaxResult getRole(Long deptId) { + AjaxResult success = AjaxResult.success(); + List sysRoleList = deptService.getRole(deptId); + success.put("roles", sysRoleList); + success.put("roleIds", sysRoleList.stream().map(SysRole::getRoleId).collect(Collectors.toList())); + return success; + } + +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictDataController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictDataController.java new file mode 100644 index 0000000..a79cd1b --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictDataController.java @@ -0,0 +1,122 @@ +package com.fastbee.web.controller.system; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDictData; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.service.ISysDictDataService; +import com.fastbee.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ + +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController +{ + @Autowired + private ISysDictDataService dictDataService; + + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictData dictData) + { + startPage(); + List list = dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) + { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil<>(SysDictData.class); + util.exportExcel(response, list, "字典数据"); + } + + /** + * 查询字典数据详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) + { + return success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) + { + List data = dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) + { + data = new ArrayList<>(); + } + return success(data); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictData dict) + { + dict.setCreateBy(getUsername()); + return toAjax(dictDataService.insertDictData(dict)); + } + + /** + * 修改保存字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictData dict) + { + dict.setUpdateBy(getUsername()); + return toAjax(dictDataService.updateDictData(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) + { + dictDataService.deleteDictDataByIds(dictCodes); + return success(); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictTypeController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..0a4de5e --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysDictTypeController.java @@ -0,0 +1,146 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDictType; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author ruoyi + */ +@Api(tags = "字典管理") +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController +{ + @Autowired + private ISysDictTypeService dictTypeService; + + @ApiOperation("获取字典分页列表") + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictType dictType) + { + startPage(); + List list = dictTypeService.selectDictTypeList(dictType); + return getDataTable(list); + } + + @ApiOperation("导出字典列表") + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictType dictType) + { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "字典类型"); + } + + /** + * 查询字典类型详细 + */ + @ApiOperation("查询字典类型详细") + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) + { + return success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @ApiOperation("新增字典类型") + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) + { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) + { + return error(StringUtils.format(MessageUtils.message("dict.add.failed.type.exists"), dict.getDictName())); + } + dict.setCreateBy(getUsername()); + return toAjax(dictTypeService.insertDictType(dict)); + } + + /** + * 修改字典类型 + */ + @ApiOperation("新增字典类型") + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictType dict) + { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) + { + return error(StringUtils.format(MessageUtils.message("dict.update.failed.type.exists"), dict.getDictName())); + } + dict.setUpdateBy(getUsername()); + return toAjax(dictTypeService.updateDictType(dict)); + } + + /** + * 删除字典类型 + */ + @ApiOperation("删除字典类型") + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) + { + dictTypeService.deleteDictTypeByIds(dictIds); + return success(); + } + + /** + * 刷新字典缓存 + */ + @ApiOperation("刷新字典缓存") + @PreAuthorize("@ss.hasPermi('system:dict:refresh')") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + dictTypeService.resetDictCache(); + return success(); + } + + /** + * 获取字典选择框列表 + */ + @ApiOperation("获取字典选择框列表") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List dictTypes = dictTypeService.selectDictTypeAll(); + return success(dictTypes); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysIndexController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysIndexController.java new file mode 100644 index 0000000..d662c8d --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysIndexController.java @@ -0,0 +1,30 @@ +package com.fastbee.web.controller.system; + +import com.fastbee.common.utils.MessageUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.utils.StringUtils; + +/** + * 首页 + * + * @author ruoyi + */ +@RestController +public class SysIndexController +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** + * 访问首页,提示语 + */ + @RequestMapping("/") + public String index() + { + return StringUtils.format(MessageUtils.message("index.welcome.message"), ruoyiConfig.getName(), ruoyiConfig.getVersion()); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysLoginController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysLoginController.java new file mode 100644 index 0000000..39635eb --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysLoginController.java @@ -0,0 +1,280 @@ +package com.fastbee.web.controller.system; + +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.Constants; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysMenu; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginBody; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.enums.SourceType; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.dto.NettyDevice; +import com.fastbee.enums.ConnectorStatus; +import com.fastbee.framework.web.domain.dto.LoginResultDto; +import com.fastbee.framework.web.service.SysLoginService; +import com.fastbee.framework.web.service.SysPermissionService; +import com.fastbee.manager.DeviceSessionManager; +import com.fastbee.system.domain.AppPreferences; +import com.fastbee.system.mapper.SysLoginConfigMapper; +import com.fastbee.system.service.IAppPreferencesService; +import com.fastbee.system.service.ISysMenuService; +import com.fastbee.system.service.ISysUserClientService; +import com.fastbee.system.service.ISysUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Set; + +import static com.fastbee.common.constant.Constants.LANGUAGE; + +/** + * 登录验证 + * + * @author ruoyi + */ +@Api(tags = "登录验证") +@RestController +public class SysLoginController { + @Autowired + private SysLoginService loginService; + + @Autowired + private ISysMenuService menuService; + + @Autowired + private SysPermissionService permissionService; + @Value("${server.broker.enabled}") + private Boolean enabled; + @Resource + private IAppPreferencesService appPreferencesService; + + @Autowired + private ISysUserClientService sysUserClientService; + + @Autowired + private SysLoginConfigMapper sysLoginConfigMapper; + + @Autowired + private ISysUserService userService; + + @Autowired + private DeviceSessionManager sessionManager; + + +// /** +// * 登录方法 +// * +// * @param loginBody 登录信息 +// * @return 结果 +// */ +// @ApiOperation("用户登录") +// @PostMapping("login") +// @Log(title = "用户登录", businessType = BusinessType.OTHER) +// public AjaxResult login(HttpServletRequest request, @RequestBody LoginBody loginBody) { +// System.out.println("用户登录"); +// Integer sourceType = loginBody.getSourceType(); +// if (sourceType == null) { +// return AjaxResult.error("登录来源为空!"); +// } +// +// String username; +// String password; +// if (sourceType == 5) { +// LoginResultDto dto = loginService.threePlatformOpenIdVerify(loginBody); +// if (!dto.isSuccess() || dto.isSkipLogin()) { +// return new AjaxResult(dto.getResultCode(), dto.getMsg()); +// } +// username = dto.getUserName(); +// password = dto.getPassword(); +// } else { +// if (StringUtils.isEmpty(loginBody.getUsername()) || StringUtils.isEmpty(loginBody.getPassword())) { +// return AjaxResult.error("参数错误!"); +// } +// // 使用Redis保存当前登录用户信息 +// String code = SourceType.switchCode(sourceType); +// username = loginBody.getUsername(); +// password = loginBody.getPassword(); +// String loginUserKey = username + ":" + code; // 使用用户ID作为缓存键的一部分 +// NettyDevice nettyDevice = sessionManager.getDevice(loginUserKey); +// if (nettyDevice != null && ConnectorStatus.ACTIVE.equals(nettyDevice.getConnectorStatus())) { +// return AjaxResult.error("已达登录上限!"); +// } +// } +// +// AjaxResult ajax = AjaxResult.success(); +// // 生成令牌 +// String token = loginService.login(username, password, loginBody.getCode(), +// loginBody.getUuid(), loginBody.getSourceType(), request.getHeader(LANGUAGE)); +// String[] split = token.split("===="); +// ajax.put(Constants.TOKEN, split[1]); +// ajax.put("userId", split[0]); +// ajax.put("username", username); +// +// SysUser sysUser = userService.selectUserByUserName(username); +// sysUser.setSessionId(split[1]); +// userService.updateUserProfile(sysUser); +// return ajax; +// } + + + /** + * 登录方法 + * + * @param loginBody 登录信息 + * @return 结果 + */ + @ApiOperation("用户登录") + @PostMapping("login") + @Log(title = "用户登录", businessType = BusinessType.OTHER) + public AjaxResult login(HttpServletRequest request, @RequestBody LoginBody loginBody) { + System.out.println("用户登录"); + Integer sourceType = loginBody.getSourceType(); + Integer loginPlatForm = loginBody.getLoginPlatForm(); + if (sourceType == null) { + return AjaxResult.error("登录来源为空!"); + } + String username = null; + String password = null; + Integer aiChatNum = null; + String nickName = null; + + //loginPlatForm == null 走默认账号密码登录 + if (loginPlatForm != null) { + if (loginPlatForm == 1) { + //账号密码登录 + if (StringUtils.isEmpty(loginBody.getUsername()) || StringUtils.isEmpty(loginBody.getPassword())) { + return AjaxResult.error("参数错误!"); + } + // 使用Redis保存当前登录用户信息 + String code = SourceType.switchCode(sourceType); + username = loginBody.getUsername(); + password = loginBody.getPassword(); + String loginUserKey = username + ":" + code; // 使用用户ID作为缓存键的一部分 + NettyDevice nettyDevice = sessionManager.getDevice(loginUserKey); + if (sourceType != 1) { + if (nettyDevice != null && ConnectorStatus.ACTIVE.equals(nettyDevice.getConnectorStatus())) { + return AjaxResult.error("已达登录上限!"); + } + } + SysUser sysUser = userService.selectUserByUserName(username); + if (sysUser != null) { + aiChatNum = sysUser.getAiChatNum(); + nickName = sysUser.getNickName(); + } + } else if (loginPlatForm == 2) { + //公众号 + LoginResultDto dto = loginService.threePlatformOpenIdVerify(loginBody); + if (!dto.isSuccess() || dto.isSkipLogin()) { + return new AjaxResult(dto.getResultCode(), dto.getMsg()); + } + username = dto.getUserName(); + password = dto.getPassword(); + aiChatNum = dto.getAiChatNum(); + nickName = dto.getNickName(); + } else if (loginPlatForm == 3) { + //手机号 + LoginResultDto dto = loginService.phoneNumberLoginVerify(loginBody); + if (!dto.isSuccess() || dto.isSkipLogin()) { + return new AjaxResult(dto.getResultCode(), dto.getMsg()); + } + username = dto.getUserName(); + password = dto.getPassword(); + aiChatNum = dto.getAiChatNum(); + nickName = dto.getNickName(); + } else if (loginPlatForm == 4) { + //微信登录 + } + } else { + if (StringUtils.isEmpty(loginBody.getUsername()) || StringUtils.isEmpty(loginBody.getPassword())) { + return AjaxResult.error("参数错误!"); + } + // 使用Redis保存当前登录用户信息 + String code = SourceType.switchCode(sourceType); + username = loginBody.getUsername(); + password = loginBody.getPassword(); + String loginUserKey = username + ":" + code; // 使用用户ID作为缓存键的一部分 + NettyDevice nettyDevice = sessionManager.getDevice(loginUserKey); + if (sourceType != 1) { + if (nettyDevice != null && ConnectorStatus.ACTIVE.equals(nettyDevice.getConnectorStatus())) { + return AjaxResult.error("已达登录上限!"); + } + } + SysUser sysUser = userService.selectUserByUserName(username); + if (sysUser != null) { + aiChatNum = sysUser.getAiChatNum(); + nickName = sysUser.getNickName(); + } + } + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + String token = loginService.login(username, password, loginBody.getCode(), + loginBody.getUuid(), loginBody.getSourceType(), request.getHeader(LANGUAGE)); + String[] split = token.split("===="); + + SysUser sysUser = userService.selectUserByUserName(username); + ajax.put(Constants.TOKEN, split[1]); + ajax.put("userId", split[0]); + ajax.put("username", username); + ajax.put("aiChatNum", aiChatNum); + ajax.put("nickName", nickName); + if (sysUser != null) { + aiChatNum = sysUser.getAiChatNum(); + sysUser.setSessionId(split[1]); + sysUser.setDisplayPassword(password); + userService.updateUserProfile(sysUser); + } + ajax.put("aiChatNum", aiChatNum); + return ajax; + } + + + /** + * + * + * 获取用户信息 + * + * @return 用户信息 + */ + @ApiOperation("获取用户信息") + @GetMapping("getInfo") + public AjaxResult getInfo() { + SysUser user = SecurityUtils.getLoginUser().getUser(); + // 角色集合 + Set roles = permissionService.getRolePermission(user); + // 权限集合 + Set permissions = permissionService.getMenuPermission(user); + AppPreferences appPreferences = appPreferencesService.selectAppPreferencesByUserId(user.getUserId()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + ajax.put("mqtt", enabled); + ajax.put("language", appPreferences.getLanguage()); + return ajax; + } + + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @ApiOperation("获取路由信息") + @GetMapping("getRouters") + public AjaxResult getRouters(HttpServletRequest request) { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuTreeByUserId(userId, request.getHeader(LANGUAGE)); + return AjaxResult.success(menuService.buildMenus(menus)); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysMenuController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysMenuController.java new file mode 100644 index 0000000..d44bad3 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysMenuController.java @@ -0,0 +1,159 @@ +package com.fastbee.web.controller.system; + +import java.util.List; + +import com.fastbee.common.utils.MessageUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysMenu; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.system.service.ISysMenuService; + +/** + * 菜单信息 + * + * @author ruoyi + */ +@Api(tags = "菜单管理") +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController +{ + @Autowired + private ISysMenuService menuService; + + /** + * 获取菜单列表 + */ + @ApiOperation("获取菜单列表") + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menus); + } + + /** + * 根据菜单编号获取详细信息 + */ + @ApiOperation("根据菜单编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) + { + return success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @ApiOperation("获取菜单下拉树列表") + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + */ + @ApiOperation("加载对应角色菜单列表树") + @GetMapping(value = "/roleMenuTreeselect") + 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("新增菜单") + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(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.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @ApiOperation("修改菜单") + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) + { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(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.updateMenu(menu)); + } + + /** + * 删除菜单 + */ + @ApiOperation("删除菜单") + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") Long menuId) + { + if (menuService.hasChildByMenuId(menuId)) + { + return warn(MessageUtils.message("menu.delete.failed.child.exists")); + } + if (menuService.checkMenuExistRole(menuId)) + { + return warn(MessageUtils.message("menu.delete.failed.role.exists")); + } + return toAjax(menuService.deleteMenuById(menuId)); + } + + /** + * 加载对应部门菜单列表树 + */ + @ApiOperation("加载对应部门菜单列表树") + @GetMapping(value = "/deptMenuTreeselect/{deptId}") + public AjaxResult deptMenuTreeselect(@PathVariable("deptId") Long deptId) + { + List menus = menuService.deptMenuTreeselect(deptId); + return success(menuService.buildMenuTreeSelect(menus)); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysNoticeController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysNoticeController.java new file mode 100644 index 0000000..da21a91 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysNoticeController.java @@ -0,0 +1,100 @@ +package com.fastbee.web.controller.system; + +import java.util.List; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.system.domain.SysNotice; +import com.fastbee.system.service.ISysNoticeService; + +/** + * 公告 信息操作处理 + * + * @author ruoyi + */ +@Api(tags = "通知公告") +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController +{ + @Autowired + private ISysNoticeService noticeService; + + /** + * 获取通知公告列表 + */ + @ApiOperation("获取通知公告列表") + @PreAuthorize("@ss.hasPermi('system:notice:list')") + @GetMapping("/list") + public TableDataInfo list(SysNotice notice) + { + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 根据通知公告编号获取详细信息 + */ + @ApiOperation("根据通知公告编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable Long noticeId) + { + return success(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @ApiOperation("新增通知公告") + @PreAuthorize("@ss.hasPermi('system:notice:add')") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysNotice notice) + { + notice.setCreateBy(getUsername()); + return toAjax(noticeService.insertNotice(notice)); + } + + /** + * 修改通知公告 + */ + @ApiOperation("修改通知公告") + @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysNotice notice) + { + notice.setUpdateBy(getUsername()); + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + */ + @ApiOperation("删除通知公告") + @PreAuthorize("@ss.hasPermi('system:notice:remove')") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable Long[] noticeIds) + { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysPostController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysPostController.java new file mode 100644 index 0000000..2d69a8e --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysPostController.java @@ -0,0 +1,143 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.domain.SysPost; +import com.fastbee.system.service.ISysPostService; + +/** + * 岗位信息操作处理 + * + * @author ruoyi + */ +@Api(tags = "岗位管理") +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController +{ + @Autowired + private ISysPostService postService; + + /** + * 获取岗位列表 + */ + @ApiOperation("获取岗位列表") + @PreAuthorize("@ss.hasPermi('system:post:list')") + @GetMapping("/list") + public TableDataInfo list(SysPost post) + { + startPage(); + List list = postService.selectPostList(post); + return getDataTable(list); + } + + @ApiOperation("导出岗位列表") + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:post:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysPost post) + { + List list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "岗位数据"); + } + + /** + * 根据岗位编号获取详细信息 + */ + @ApiOperation("根据岗位编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) + { + return success(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @ApiOperation("新增岗位") + @PreAuthorize("@ss.hasPermi('system:post:add')") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) + { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) + { + return error(StringUtils.format(MessageUtils.message("post.add.failed.name.exists"), post.getPostName())); + } + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) + { + return error(StringUtils.format(MessageUtils.message("post.add.failed.code.exists"), post.getPostName())); + } + post.setCreateBy(getUsername()); + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @ApiOperation("修改岗位") + @PreAuthorize("@ss.hasPermi('system:post:edit')") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysPost post) + { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) + { + return error(StringUtils.format(MessageUtils.message("post.update.failed.name.exists"), post.getPostName())); + } + else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) + { + return error(StringUtils.format(MessageUtils.message("post.update.failed.code.exists"), post.getPostName())); + } + post.setUpdateBy(getUsername()); + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + */ + @ApiOperation("删除岗位") + @PreAuthorize("@ss.hasPermi('system:post:remove')") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable Long[] postIds) + { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + */ + @ApiOperation("获取岗位选择框列表") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List posts = postService.selectPostAll(); + return success(posts); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysProfileController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysProfileController.java new file mode 100644 index 0000000..346c423 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysProfileController.java @@ -0,0 +1,166 @@ +package com.fastbee.web.controller.system; + +import com.fastbee.common.annotation.Log; +import com.fastbee.common.config.RuoYiConfig; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.enums.SocialPlatformType; +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.file.FileUploadUtils; +import com.fastbee.common.utils.file.MimeTypeUtils; +import com.fastbee.framework.web.service.TokenService; +import com.fastbee.iot.domain.UserSocialProfile; +import com.fastbee.iot.service.IUserSocialProfileService; +import com.fastbee.system.service.ISysUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +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.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 个人信息 业务处理 + * + * @author ruoyi + */ +@Api(tags = "个人中心") +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private TokenService tokenService; + + @Autowired + private IUserSocialProfileService iUserSocialProfileService; + + /** + * 个人信息 + */ + @ApiOperation("获取个人信息") + @GetMapping + public AjaxResult profile() + { + LoginUser loginUser = getLoginUser(); + SysUser user = loginUser.getUser(); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); + ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + List socialProfileList = iUserSocialProfileService.selectUserSocialProfile(loginUser.getUserId()); + UserSocialProfile userSocialProfile = socialProfileList.stream().filter(s -> SocialPlatformType.listWechatPlatform.contains(s.getSourceClient()) && "1".equals(s.getStatus())).findFirst().orElse(null); + ajax.put("socialGroup", socialProfileList); + ajax.put("wxBind", userSocialProfile != null); + return ajax; + } + + /** + * 修改用户 + */ + @ApiOperation("修改个人信息") + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) + { + LoginUser loginUser = getLoginUser(); + SysUser sysUser = loginUser.getUser(); + user.setUserName(sysUser.getUserName()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.update.failed.phone.exists"), user.getUserName())); + } + if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.update.failed.email.exists"), user.getUserName())); + } + user.setUserId(sysUser.getUserId()); + user.setPassword(null); + user.setAvatar(null); + user.setDeptId(sysUser.getDeptId()); + if (userService.updateUserProfile(user) > 0) + { + // 更新缓存用户信息 + sysUser.setNickName(user.getNickName()); + sysUser.setPhonenumber(user.getPhonenumber()); + sysUser.setEmail(user.getEmail()); + sysUser.setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return success(); + } + return error(MessageUtils.message("user.update.failed")); + } + + /** + * 重置密码 + */ + @ApiOperation("重置密码") + @PreAuthorize("@ss.hasPermi('systerm:user:updatePwd')") + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) + { + LoginUser loginUser = getLoginUser(); + String userName = loginUser.getUsername(); + String password = loginUser.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) + { + return error(MessageUtils.message("user.update.failed.password.wrong")); + } + if (SecurityUtils.matchesPassword(newPassword, password)) + { + return error(MessageUtils.message("user.update.failed.password.same")); + } + if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) + { + // 更新缓存用户密码 + loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return success(); + } + return error(MessageUtils.message("user.update.password.failed")); + } + + /** + * 头像上传 + */ + @ApiOperation("头像上传") + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception + { + if (!file.isEmpty()) + { + LoginUser loginUser = getLoginUser(); + String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + // 更新缓存用户头像 + loginUser.getUser().setAvatar(avatar); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return error(MessageUtils.message("user.upload.avatar.failed")); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysRegisterController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysRegisterController.java new file mode 100644 index 0000000..2bb1c58 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysRegisterController.java @@ -0,0 +1,42 @@ +package com.fastbee.web.controller.system; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.model.RegisterBody; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.framework.web.service.SysRegisterService; +import com.fastbee.system.service.ISysConfigService; + +/** + * 注册验证 + * + * @author ruoyi + */ +@Api(tags = "注册账号") +@RestController +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @ApiOperation("注册账号") + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) + { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) + { + return error("当前系统没有开启注册功能!"); + } + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysRoleController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysRoleController.java new file mode 100644 index 0000000..513c651 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysRoleController.java @@ -0,0 +1,300 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.constant.HttpStatus; +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.collection.CollectionUtils; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDept; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.domain.model.LoginUser; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.framework.web.service.SysPermissionService; +import com.fastbee.framework.web.service.TokenService; +import com.fastbee.system.domain.SysUserRole; +import com.fastbee.system.service.ISysDeptService; +import com.fastbee.system.service.ISysRoleService; +import com.fastbee.system.service.ISysUserService; + +/** + * 角色信息 + * + * @author ruoyi + */ +@Api(tags = "角色管理") +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysDeptService deptService; + + @ApiOperation("获取角色分页列表") + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/list") + public TableDataInfo list(SysRole role, Integer pageNum, Integer pageSize) + { +// startPage(); + List list = roleService.selectRoleList(role); + TableDataInfo tableDataInfo = new TableDataInfo(); + tableDataInfo.setCode(HttpStatus.SUCCESS); + tableDataInfo.setMsg(MessageUtils.message("query.success")); + if (org.apache.commons.collections4.CollectionUtils.isEmpty(list)) { + tableDataInfo.setRows(list); + tableDataInfo.setTotal(0); + } else { + List list1 = CollectionUtils.startPage(list, pageNum, pageSize); + tableDataInfo.setRows(list1); + tableDataInfo.setTotal(new PageInfo(list).getTotal()); + } + return tableDataInfo; + } + + @ApiOperation("导出角色列表") + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:role:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysRole role) + { + List list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(SysRole.class); + util.exportExcel(response, list, "角色数据"); + } + + /** + * 根据角色编号获取详细信息 + */ + @ApiOperation("根据角色编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable Long roleId) + { + roleService.checkRoleDataScope(roleId); + return success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @ApiOperation("新增角色") + @PreAuthorize("@ss.hasPermi('system:role:add')") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) + { +// if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) +// { +// return error(StringUtils.format(MessageUtils.message("role.add.failed.name.exists"), role.getRoleName())); +// } +// else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) +// { +// return error(StringUtils.format(MessageUtils.message("role.add.failed.key.exists"), role.getRoleName())); +// } + if ("manager".equals(role.getRoleKey())) { + return error(MessageUtils.message("role.add.manager.failed")); + } + role.setCreateBy(getUsername()); + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @ApiOperation("修改角色") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); +// if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) +// { +// return error(StringUtils.format(MessageUtils.message("role.update.failed.name.exists"), role.getRoleName())); +// } +// else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) +// { +// return error(StringUtils.format(MessageUtils.message("role.update.failed.key.exists"), role.getRoleName())); +// } + role.setUpdateBy(getUsername()); + + if (roleService.updateRole(role) > 0) + { + // 更新缓存用户权限 + LoginUser loginUser = getLoginUser(); + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) + { + loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); + loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); + tokenService.setLoginUser(loginUser); + } + return success(); + } + return error(StringUtils.format(MessageUtils.message("role.update.failed"), role.getRoleName())); + } + + /** + * 修改保存数据权限 + */ + @ApiOperation("修改保存数据权限") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @ApiOperation("修改角色状态") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + role.setUpdateBy(getUsername()); + return toAjax(roleService.updateRoleStatus(role)); + } + + /** + * 删除角色 + */ + @ApiOperation("删除角色") + @PreAuthorize("@ss.hasPermi('system:role:remove')") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) + { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @ApiOperation("获取角色选择框列表") + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + return success(roleService.selectRoleAll()); + } + + /** + * 查询已分配用户角色列表 + */ + @ApiOperation("查询已分配用户角色列表") + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUser user) + { + startPage(); + List list = userService.selectAllocatedList(user); + return getDataTable(list); + } + + /** + * 查询未分配用户角色列表 + */ + @ApiOperation("查询未分配用户角色列表") + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUser user) + { + startPage(); + List list = userService.selectUnallocatedList(user); + return getDataTable(list); + } + + /** + * 取消授权用户 + */ + @ApiOperation("取消授权用户") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) + { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + */ + @ApiOperation("批量取消授权用户") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) + { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + */ + @ApiOperation("批量选择用户授权") + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) + { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + */ + @ApiOperation("获取对应角色部门树列表") + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/deptTree/{roleId}") + public AjaxResult deptTree(@PathVariable("roleId") Long roleId) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); + return ajax; + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysTranslateController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysTranslateController.java new file mode 100644 index 0000000..85364f6 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysTranslateController.java @@ -0,0 +1,77 @@ +package com.fastbee.web.controller.system; + +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysTranslate; +import com.fastbee.common.utils.MessageUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.service.ISysTranslateService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 翻译表管理 + * + * @author ruoyi + */ +@Api(tags = "翻译表管理") +@RestController +@RequestMapping("/system/translate") +public class SysTranslateController extends BaseController +{ + @Autowired + private ISysTranslateService sysTranslateService; + + /** + * 导入翻译列表 + */ + @ApiOperation("导入翻译列表") + @PreAuthorize("@ss.hasPermi('system:translate:import')") + @PostMapping("/import") + public AjaxResult importSysTranslate(MultipartFile file, String type, Long productId) throws Exception { + if (null == file) { + return error(MessageUtils.message("import.failed.file.null")); + } + if (StringUtils.isEmpty(type)) { + return error(); + } + ExcelUtil util = new ExcelUtil<>(SysTranslate.class); + List list = util.importExcel(file.getInputStream()); + if (CollectionUtils.isEmpty(list)) { + return error(MessageUtils.message("import.failed.data.null")); + } + sysTranslateService.importSysTranslate(list, type, productId); + return success(MessageUtils.message("import.success")); + } + + /** + * 导出翻译列表 + */ + @ApiOperation("导出翻译列表") + @PreAuthorize("@ss.hasPermi('system:translate:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysTranslate sysTranslate, String type, @RequestParam(name = "isSource", required = false, defaultValue = "0") Boolean isSource) + { + if (StringUtils.isEmpty(type)) { + return; + } + List list; + if (isSource) { + list = sysTranslateService.selectSourceList(type, sysTranslate.getProductId()); + } else { + list = sysTranslateService.selectSysTranslateList(sysTranslate, type); + } + ExcelUtil util = new ExcelUtil<>(SysTranslate.class); + util.exportExcel(response, list, "翻译列表"); + } + +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/system/SysUserController.java b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysUserController.java new file mode 100644 index 0000000..48cf189 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/system/SysUserController.java @@ -0,0 +1,319 @@ +package com.fastbee.web.controller.system; + +import java.util.List; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import com.fastbee.common.utils.MessageUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.fastbee.common.annotation.Log; +import com.fastbee.common.constant.UserConstants; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.AjaxResult; +import com.fastbee.common.core.domain.entity.SysDept; +import com.fastbee.common.core.domain.entity.SysRole; +import com.fastbee.common.core.domain.entity.SysUser; +import com.fastbee.common.core.page.TableDataInfo; +import com.fastbee.common.enums.BusinessType; +import com.fastbee.common.utils.SecurityUtils; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.system.service.ISysDeptService; +import com.fastbee.system.service.ISysPostService; +import com.fastbee.system.service.ISysRoleService; +import com.fastbee.system.service.ISysUserService; + +/** + * 用户信息 + * + * @author ruoyi + */ +@Api(tags = "用户管理") +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysDeptService deptService; + + @Autowired + private ISysPostService postService; + + /** + * 获取用户列表 + */ + @ApiOperation("获取用户分页列表") + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(SysUser user) + { + startPage(); + if (null == user.getDeptId()) { + user.setDeptId(getLoginUser().getDeptId()); + } + List list = userService.selectUserList(user); + return getDataTable(list); + } + + @ApiOperation("导出用户列表") + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:user:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUser user) + { + if (null == user.getDeptId()) { + user.setDeptId(getLoginUser().getDeptId()); + } + List list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(SysUser.class); + util.exportExcel(response, list, "用户数据"); + } + + @ApiOperation("批量导入用户") + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil(SysUser.class); + List userList = util.importExcel(file.getInputStream()); + String operName = getUsername(); + String message = userService.importUser(userList, updateSupport, operName); + return success(message); + } + + + @ApiOperation("下载用户导入模板") + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) + { + ExcelUtil util = new ExcelUtil(SysUser.class); + util.importTemplateExcel(response, "用户数据"); + } + + /** + * 根据用户编号获取详细信息 + */ + @ApiOperation("根据用户编号获取详细信息") + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = { "/", "/{userId}" }) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) + { + userService.checkUserDataScope(userId); + AjaxResult ajax = AjaxResult.success(); +// List roles = roleService.selectRoleAll(); +// ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("posts", postService.selectPostAll()); + if (StringUtils.isNotNull(userId)) + { + SysUser sysUser = userService.selectUserById(userId); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + SysRole sysRole = new SysRole(); + sysRole.setDeptId(sysUser.getDeptId()); + sysRole.setShowChild(false); + List sysRoleList = roleService.selectRoleList(sysRole); + ajax.put("roles", sysRoleList); + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); + } + return ajax; + } + + /** + * 新增用户 + */ + @ApiOperation("新增用户") + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) + { + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.add.failed.name.exists"), user.getUserName())); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.add.failed.phone.exists"), user.getUserName())); + } + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.add.failed.email.exists"), user.getUserName())); + } + user.setCreateBy(getUsername()); + user.setAiChatNum(-1); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setDisplayPassword(user.getPassword()); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @ApiOperation("修改用户") + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.update.failed.name.exists"), user.getUserName())); + } + else if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.update.failed.phone.exists"), user.getUserName())); + } + else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) + { + return error(StringUtils.format(MessageUtils.message("user.update.failed.email.exists"), user.getUserName())); + } + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + */ + @ApiOperation("删除用户") + @PreAuthorize("@ss.hasPermi('system:user:remove')") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) + { + if (ArrayUtils.contains(userIds, getUserId())) + { + return error(MessageUtils.message("user.delete.failed")); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @ApiOperation("重置用户密码") + @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setDisplayPassword(user.getPassword()); + user.setUpdateBy(getUsername()); + return toAjax(userService.resetPwd(user)); + } + + /** + * 状态修改 + */ + @ApiOperation("修改用户状态") + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysUser user) + { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUserStatus(user)); + } + + /** + * 根据用户编号获取授权角色 + */ + @ApiOperation("根据用户编号获取授权角色") + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping("/authRole/{userId}") + public AjaxResult authRole(@PathVariable("userId") Long userId) + { + AjaxResult ajax = AjaxResult.success(); + SysUser user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + ajax.put("user", user); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + return ajax; + } + + /** + * 用户授权角色 + */ + @ApiOperation("为用户授权角色") + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public AjaxResult insertAuthRole(Long userId, Long[] roleIds) + { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return success(); + } + + /** + * 获取部门树列表 + */ + @ApiOperation("获取部门树列表") + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/deptTree") + public AjaxResult deptTree(SysDept dept) + { + return success(deptService.selectDeptTreeList(dept)); + } + + /** + * 获取终端用户列表 + * @param user 用户信息 + * @return com.fastbee.common.core.page.TableDataInfo + */ + @ApiOperation("获取用户分页列表") + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/listTerminal") + public TableDataInfo listTerminal(SysUser user) + { + startPage(); + List list = userService.listTerminal(user); + return getDataTable(list); + } + + + /** + * 根据机构id获取当前用户列表 + */ + @ApiOperation("根据机构id获取当前用户列表") + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/getByDeptId") + public TableDataInfo getByDeptId() + { + startPage(); + List list = userService.selectByDeptId(); + return getDataTable(list); + } + +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/tool/SwaggerController.java b/maibu-admin/src/main/java/com/maibu/web/controller/tool/SwaggerController.java new file mode 100644 index 0000000..94f0e3e --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/tool/SwaggerController.java @@ -0,0 +1,24 @@ +package com.fastbee.web.controller.tool; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.fastbee.common.core.controller.BaseController; + +/** + * swagger 接口 + * + * @author ruoyi + */ +@Controller +@RequestMapping("/tool/swagger") +public class SwaggerController extends BaseController +{ + @PreAuthorize("@ss.hasPermi('tool:swagger:view')") + @GetMapping() + public String index() + { + return redirect("/swagger-ui.html"); + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController.java b/maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController.java new file mode 100644 index 0000000..f05f972 --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController.java @@ -0,0 +1,185 @@ +package com.fastbee.web.controller.tool; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.fastbee.common.core.controller.BaseController; +import com.fastbee.common.core.domain.R; +import com.fastbee.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +import javax.annotation.Resource; + +/** + * swagger 用户测试方法 + * + * @author ruoyi + */ +@Api("swagger 用户测试方法") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public R> userList() + { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return R.ok(users.get(userId)); + } + else + { + return R.fail("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return R.fail("用户不存在"); + } + users.remove(user.getUserId()); + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return R.ok(); + } + else + { + return R.fail("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController2.java b/maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController2.java new file mode 100644 index 0000000..4369bde --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/controller/tool/TestController2.java @@ -0,0 +1,218 @@ +package com.fastbee.web.controller.tool; + +import com.alibaba.fastjson2.JSON; +import com.fastbee.iot.domain.DeviceJob; +import com.fastbee.iot.domain.DeviceLog; +import com.fastbee.iot.mapper.DeviceJobMapper; +import com.fastbee.iot.mapper.DeviceLogMapper; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import com.fastbee.common.annotation.Anonymous; +import com.fastbee.common.core.domain.ImportExcelVO; +import com.fastbee.common.core.domain.OutputExcelVO; +import com.fastbee.common.utils.StringUtils; +import com.fastbee.common.utils.poi.ExcelUtil; +import com.fastbee.iot.domain.AlertLog; +import com.fastbee.iot.mapper.AlertLogMapper; +import com.fastbee.iot.mapper.DeviceMapper; +import com.fastbee.iot.model.DeviceRelateAlertLogVO; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + + +/** + * 测试类 + * @author fastb + * @date 2023-09-13 11:42 + */ +@Anonymous +@RestController +@RequestMapping("/test2") +public class TestController2 { + + @Resource + private AlertLogMapper alertLogMapper; + @Resource + private DeviceMapper deviceMapper; + + @Resource + private DeviceJobMapper deviceJobMapper; + @Resource + private DeviceLogMapper deviceLogMapper; + + @GetMapping("/add") + public void add() + { + Set deviceNumbers = new HashSet<>(); + deviceNumbers.add("D1PGLPG58K88"); + deviceNumbers.add("D1F0L7P84D8Z"); + deviceNumbers.add("D1F0L7P84D8Z_2"); + List deviceRelateAlertLogVOList = deviceMapper.selectDeviceBySerialNumbers(deviceNumbers); + Map deviceRelateAlertLogVOMap = deviceRelateAlertLogVOList.stream().collect(Collectors.toMap(DeviceRelateAlertLogVO::getSerialNumber, Function.identity())); + + ArrayList alertLogList = new ArrayList<>(); + for (String deviceNumber : deviceNumbers) { + AlertLog alertLog = new AlertLog(); + alertLog.setSerialNumber(deviceNumber); + alertLog.setAlertName("温度告警测试"); + alertLog.setAlertLevel(1L); + alertLog.setStatus(1); + alertLog.setProductId(1L); + alertLog.setDetail("111"); + alertLog.setCreateTime(new Date()); + // 添加设备关联信息 + if (deviceRelateAlertLogVOMap.containsKey(deviceNumber)) { + DeviceRelateAlertLogVO deviceRelateAlertLogVO = deviceRelateAlertLogVOMap.get(deviceNumber); + alertLog.setDeviceName(deviceRelateAlertLogVO.getDeviceName()); + alertLog.setUserId(deviceRelateAlertLogVO.getUserId()); + } + alertLogList.add(alertLog); + } + + // 批量插入告警日志 + alertLogMapper.insertAlertLogBatch(alertLogList); + } + + @PostMapping("/handleExcel") + public String handleExcel(@RequestParam("file") MultipartFile file) throws Exception + { + if (null == file) { + return "导入失败,请先上传文件!"; + } + ExcelUtil util = new ExcelUtil<>(ImportExcelVO.class); + List importExcelVOList = util.importExcel(file.getInputStream()); + if (CollectionUtils.isEmpty(importExcelVOList)) { + return "导入失败,模板数据不能为空!"; + } + System.out.println(importExcelVOList.size()); + List oneCityName = new ArrayList<>(); + List twoCityName = new ArrayList<>(); + List threeCityName = new ArrayList<>(); + + List oneCityList = new ArrayList<>(); + Map> twoCityMap = new HashMap<>(2); + Map> threeCityMap = new HashMap<>(2); + + for (ImportExcelVO vo : importExcelVOList) { + String city = vo.getCity(); + List cityNameList = StringUtils.str2List(city, "/", true, true); + int size = cityNameList.size(); + if (1 == size) { + String name = cityNameList.get(0); + if (!oneCityName.contains(name)) { + oneCityName.add(name); + OutputExcelVO outputExcelVO = new OutputExcelVO(); + outputExcelVO.setName(name); + outputExcelVO.setCode(vo.getCode()); + outputExcelVO.setLat(vo.getLat()); + outputExcelVO.setLon(vo.getLon()); + oneCityList.add(outputExcelVO); + twoCityMap.put(name, new ArrayList<>()); + } + } else if (2 == size) { + String oneName = cityNameList.get(0); + if (!oneCityName.contains(oneName)) { + oneCityName.add(oneName); + OutputExcelVO outputExcelVO = new OutputExcelVO(); + outputExcelVO.setName(oneName); + oneCityList.add(outputExcelVO); + twoCityMap.put(oneName, new ArrayList<>()); + } + String twoName = cityNameList.get(1); + OutputExcelVO outputExcelVO = new OutputExcelVO(); + outputExcelVO.setName(twoName); + outputExcelVO.setCode(vo.getCode()); + outputExcelVO.setLat(vo.getLat()); + outputExcelVO.setLon(vo.getLon()); + if (!twoCityName.contains(twoName)) { + twoCityName.add(twoName); + List twoList = twoCityMap.get(oneName); + twoList.add(outputExcelVO); + twoCityMap.put(oneName, twoList); + threeCityMap.put(twoName, new ArrayList<>()); + } + } else if (3 == size) { + String oneName = cityNameList.get(0); + if (!oneCityName.contains(oneName)) { + oneCityName.add(oneName); + OutputExcelVO outputExcelVO = new OutputExcelVO(); + outputExcelVO.setName(oneName); + oneCityList.add(outputExcelVO); + twoCityMap.put(oneName, new ArrayList<>()); + } + String twoName = cityNameList.get(1); + if (!twoCityName.contains(twoName)) { + twoCityName.add(twoName); + OutputExcelVO outputExcelVO = new OutputExcelVO(); + outputExcelVO.setName(twoName); + List twoList = twoCityMap.get(oneName); + twoList.add(outputExcelVO); + twoCityMap.put(oneName, twoList); + threeCityMap.put(twoName, new ArrayList<>()); + } + String threeName = cityNameList.get(2); + if (!threeCityName.contains(threeName)) { + threeCityName.add(threeName); + OutputExcelVO outputExcelVO = new OutputExcelVO(); + outputExcelVO.setName(threeName); + outputExcelVO.setCode(vo.getCode()); + outputExcelVO.setLat(vo.getLat()); + outputExcelVO.setLon(vo.getLon()); + List twoList = threeCityMap.get(twoName); + twoList.add(outputExcelVO); + threeCityMap.put(twoName, twoList); + } + } + } + int total = 0; + total = total + oneCityList.size(); + for (OutputExcelVO outputExcelVO : oneCityList) { + List voList = twoCityMap.get(outputExcelVO.getName()); + if (CollectionUtils.isNotEmpty(voList)) { + total = total + voList.size(); + outputExcelVO.setChildren(voList); + for (OutputExcelVO excelVO : voList) { + List voList1 = threeCityMap.get(excelVO.getName()); + if (CollectionUtils.isNotEmpty(voList1)) { + total = total + voList1.size(); + excelVO.setChildren(voList1); + } + } + } + } + System.out.println(total); + return JSON.toJSONString(oneCityList); + } + + /** + * 计算场景运算型变量的值 + * @param id + * @return java.lang.String + */ + @GetMapping("/getJobList") + public String getJobList() { + Long[] ids = {1L, 2L}; + List deviceJobList = deviceJobMapper.selectListByJobTypeAndDatasourceIds(ids, 3); + return JSON.toJSONString(deviceJobList); + } + + @GetMapping("/getStatsValue") + public String getStatsValue() { + DeviceLog deviceLog = new DeviceLog(); + deviceLog.setLogType(1); + deviceLog.setIdentity("k1"); + deviceLog.setSerialNumber("D10I741UL2P3_1"); + deviceLog.setBeginTime("2024-05-17 00:00:00"); + deviceLog.setEndTime("2024-05-17 23:59:59"); +// deviceLog.setOperation(5); + List list = deviceLogMapper.selectStatsValue(deviceLog); + return JSON.toJSONString(list); + } + +} diff --git a/maibu-admin/src/main/java/com/maibu/web/core/config/SwaggerConfig.java b/maibu-admin/src/main/java/com/maibu/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..ab6bb7b --- /dev/null +++ b/maibu-admin/src/main/java/com/maibu/web/core/config/SwaggerConfig.java @@ -0,0 +1,125 @@ +package com.fastbee.web.core.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.fastbee.common.config.RuoYiConfig; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2的接口配置 + * + * @author ruoyi + */ +@Configuration +public class SwaggerConfig +{ + /** 系统基础配置 */ + @Autowired + private RuoYiConfig ruoyiConfig; + + /** 是否开启swagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** 设置请求的统一前缀 */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("com.fastbee.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() + { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("FastBee物联网平台接口文档") + // 描述 + .description("描述:FastBee物联网平台") + // 作者信息 + .contact(new Contact(ruoyiConfig.getName(), null, null)) + // 版本 + .version("版本号:" + ruoyiConfig.getVersion()) + .build(); + } +}