[add] 新增无人机模块后端项目
[refactor] 重构后端项目
This commit is contained in:
		| @ -0,0 +1,21 @@ | ||||
| package com.ruoyi; | ||||
|  | ||||
|  | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; | ||||
| import org.springframework.scheduling.annotation.EnableAsync; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * 启动程序 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) | ||||
| @EnableAsync | ||||
| public class RuoYiApplication { | ||||
|     public static void main(String[] args) { | ||||
|         SpringApplication.run(RuoYiApplication.class, args); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,18 @@ | ||||
| package com.ruoyi; | ||||
|  | ||||
| import org.springframework.boot.builder.SpringApplicationBuilder; | ||||
| import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; | ||||
|  | ||||
| /** | ||||
|  * web容器中进行部署 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| public class RuoYiServletInitializer extends SpringBootServletInitializer | ||||
| { | ||||
|     @Override | ||||
|     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) | ||||
|     { | ||||
|         return application.sources(RuoYiApplication.class); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,94 @@ | ||||
| package com.ruoyi.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 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.ruoyi.common.config.RuoYiConfig; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.redis.RedisCache; | ||||
| import com.ruoyi.common.utils.sign.Base64; | ||||
| import com.ruoyi.common.utils.uuid.IdUtils; | ||||
| import com.ruoyi.system.service.ISysConfigService; | ||||
|  | ||||
| /** | ||||
|  * 验证码操作处理 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| public class CaptchaController | ||||
| { | ||||
|     @Resource(name = "captchaProducer") | ||||
|     private Producer captchaProducer; | ||||
|  | ||||
|     @Resource(name = "captchaProducerMath") | ||||
|     private Producer captchaProducerMath; | ||||
|  | ||||
|     @Autowired | ||||
|     private RedisCache redisCache; | ||||
|      | ||||
|     @Autowired | ||||
|     private ISysConfigService configService; | ||||
|     /** | ||||
|      * 生成验证码 | ||||
|      */ | ||||
|     @GetMapping("/captchaImage") | ||||
|     public AjaxResult getCode(HttpServletResponse response) 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()); | ||||
|         } | ||||
|  | ||||
|         ajax.put("uuid", uuid); | ||||
|         ajax.put("img", Base64.encode(os.toByteArray())); | ||||
|         return ajax; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,163 @@ | ||||
| package com.ruoyi.web.controller.common; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| 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.ruoyi.common.config.RuoYiConfig; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.common.utils.file.FileUploadUtils; | ||||
| import com.ruoyi.common.utils.file.FileUtils; | ||||
| import com.ruoyi.framework.config.ServerConfig; | ||||
|  | ||||
| /** | ||||
|  * 通用请求处理 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @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 是否删除 | ||||
|      */ | ||||
|     @GetMapping("/download") | ||||
|     public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (!FileUtils.checkAllowDownload(fileName)) | ||||
|             { | ||||
|                 throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", 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); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 通用上传请求(单个) | ||||
|      */ | ||||
|     @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()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 通用上传请求(多个) | ||||
|      */ | ||||
|     @PostMapping("/uploads") | ||||
|     public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             // 上传文件路径 | ||||
|             String filePath = RuoYiConfig.getUploadPath(); | ||||
|             List<String> urls = new ArrayList<String>(); | ||||
|             List<String> fileNames = new ArrayList<String>(); | ||||
|             List<String> newFileNames = new ArrayList<String>(); | ||||
|             List<String> originalFilenames = new ArrayList<String>(); | ||||
|             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") | ||||
|     public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) | ||||
|             throws Exception | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (!FileUtils.checkAllowDownload(resource)) | ||||
|             { | ||||
|                 throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,121 @@ | ||||
| package com.ruoyi.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 java.util.TreeSet; | ||||
| 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.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.system.domain.SysCache; | ||||
|  | ||||
| /** | ||||
|  * 缓存监控 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/monitor/cache") | ||||
| public class CacheController | ||||
| { | ||||
|     @Autowired | ||||
|     private RedisTemplate<String, String> redisTemplate; | ||||
|  | ||||
|     private final static List<SysCache> caches = new ArrayList<SysCache>(); | ||||
|     { | ||||
|         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, "密码错误次数")); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @GetMapping() | ||||
|     public AjaxResult getInfo() throws Exception | ||||
|     { | ||||
|         Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info()); | ||||
|         Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats")); | ||||
|         Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize()); | ||||
|  | ||||
|         Map<String, Object> result = new HashMap<>(3); | ||||
|         result.put("info", info); | ||||
|         result.put("dbSize", dbSize); | ||||
|  | ||||
|         List<Map<String, String>> pieList = new ArrayList<>(); | ||||
|         commandStats.stringPropertyNames().forEach(key -> { | ||||
|             Map<String, String> 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); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @GetMapping("/getNames") | ||||
|     public AjaxResult cache() | ||||
|     { | ||||
|         return AjaxResult.success(caches); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @GetMapping("/getKeys/{cacheName}") | ||||
|     public AjaxResult getCacheKeys(@PathVariable String cacheName) | ||||
|     { | ||||
|         Set<String> cacheKeys = redisTemplate.keys(cacheName + "*"); | ||||
|         return AjaxResult.success(new TreeSet<>(cacheKeys)); | ||||
|     } | ||||
|  | ||||
|     // @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); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @DeleteMapping("/clearCacheName/{cacheName}") | ||||
|     public AjaxResult clearCacheName(@PathVariable String cacheName) | ||||
|     { | ||||
|         Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*"); | ||||
|         redisTemplate.delete(cacheKeys); | ||||
|         return AjaxResult.success(); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @DeleteMapping("/clearCacheKey/{cacheKey}") | ||||
|     public AjaxResult clearCacheKey(@PathVariable String cacheKey) | ||||
|     { | ||||
|         redisTemplate.delete(cacheKey); | ||||
|         return AjaxResult.success(); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @DeleteMapping("/clearCacheAll") | ||||
|     public AjaxResult clearCacheAll() | ||||
|     { | ||||
|         Collection<String> cacheKeys = redisTemplate.keys("*"); | ||||
|         redisTemplate.delete(cacheKeys); | ||||
|         return AjaxResult.success(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| package com.ruoyi.web.controller.monitor; | ||||
|  | ||||
| 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.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.framework.web.domain.Server; | ||||
|  | ||||
| /** | ||||
|  * 服务器监控 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/monitor/server") | ||||
| public class ServerController | ||||
| { | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:server:list')") | ||||
|     @GetMapping() | ||||
|     public AjaxResult getInfo() throws Exception | ||||
|     { | ||||
|         Server server = new Server(); | ||||
|         server.copyTo(); | ||||
|         return AjaxResult.success(server); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,82 @@ | ||||
| package com.ruoyi.web.controller.monitor; | ||||
|  | ||||
| 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.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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.framework.web.service.SysPasswordService; | ||||
| import com.ruoyi.system.domain.SysLogininfor; | ||||
| import com.ruoyi.system.service.ISysLogininforService; | ||||
|  | ||||
| /** | ||||
|  * 系统访问记录 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/monitor/logininfor") | ||||
| public class SysLogininforController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysLogininforService logininforService; | ||||
|  | ||||
|     @Autowired | ||||
|     private SysPasswordService passwordService; | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysLogininfor logininfor) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "登录日志", businessType = BusinessType.EXPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") | ||||
|     @PostMapping("/export") | ||||
|     public void export(HttpServletResponse response, SysLogininfor logininfor) | ||||
|     { | ||||
|         List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); | ||||
|         ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class); | ||||
|         util.exportExcel(response, list, "登录日志"); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") | ||||
|     @Log(title = "登录日志", businessType = BusinessType.DELETE) | ||||
|     @DeleteMapping("/{infoIds}") | ||||
|     public AjaxResult remove(@PathVariable Long[] infoIds) | ||||
|     { | ||||
|         return toAjax(logininforService.deleteLogininforByIds(infoIds)); | ||||
|     } | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") | ||||
|     @Log(title = "登录日志", businessType = BusinessType.CLEAN) | ||||
|     @DeleteMapping("/clean") | ||||
|     public AjaxResult clean() | ||||
|     { | ||||
|         logininforService.cleanLogininfor(); | ||||
|         return success(); | ||||
|     } | ||||
|  | ||||
|     // @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(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,69 @@ | ||||
| package com.ruoyi.web.controller.monitor; | ||||
|  | ||||
| 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.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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.system.domain.SysOperLog; | ||||
| import com.ruoyi.system.service.ISysOperLogService; | ||||
|  | ||||
| /** | ||||
|  * 操作日志记录 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/monitor/operlog") | ||||
| public class SysOperlogController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysOperLogService operLogService; | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysOperLog operLog) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysOperLog> list = operLogService.selectOperLogList(operLog); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "操作日志", businessType = BusinessType.EXPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") | ||||
|     @PostMapping("/export") | ||||
|     public void export(HttpServletResponse response, SysOperLog operLog) | ||||
|     { | ||||
|         List<SysOperLog> list = operLogService.selectOperLogList(operLog); | ||||
|         ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); | ||||
|         util.exportExcel(response, list, "操作日志"); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "操作日志", businessType = BusinessType.DELETE) | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") | ||||
|     @DeleteMapping("/{operIds}") | ||||
|     public AjaxResult remove(@PathVariable Long[] operIds) | ||||
|     { | ||||
|         return toAjax(operLogService.deleteOperLogByIds(operIds)); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "操作日志", businessType = BusinessType.CLEAN) | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") | ||||
|     @DeleteMapping("/clean") | ||||
|     public AjaxResult clean() | ||||
|     { | ||||
|         operLogService.cleanOperLog(); | ||||
|         return success(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,83 @@ | ||||
| package com.ruoyi.web.controller.monitor; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.model.LoginUser; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.core.redis.RedisCache; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.system.domain.SysUserOnline; | ||||
| import com.ruoyi.system.service.ISysUserOnlineService; | ||||
|  | ||||
| /** | ||||
|  * 在线用户监控 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/monitor/online") | ||||
| public class SysUserOnlineController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysUserOnlineService userOnlineService; | ||||
|  | ||||
|     @Autowired | ||||
|     private RedisCache redisCache; | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('monitor:online:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(String ipaddr, String userName) | ||||
|     { | ||||
|         Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); | ||||
|         List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>(); | ||||
|         for (String key : keys) | ||||
|         { | ||||
|             LoginUser user = redisCache.getCacheObject(key); | ||||
|             if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) | ||||
|             { | ||||
|                 userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); | ||||
|             } | ||||
|             else if (StringUtils.isNotEmpty(ipaddr)) | ||||
|             { | ||||
|                 userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); | ||||
|             } | ||||
|             else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) | ||||
|             { | ||||
|                 userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); | ||||
|             } | ||||
|         } | ||||
|         Collections.reverse(userOnlineList); | ||||
|         userOnlineList.removeAll(Collections.singleton(null)); | ||||
|         return getDataTable(userOnlineList); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 强退用户 | ||||
|      */ | ||||
|     // @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(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,133 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.system.domain.SysConfig; | ||||
| import com.ruoyi.system.service.ISysConfigService; | ||||
|  | ||||
| /** | ||||
|  * 参数配置 信息操作处理 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/config") | ||||
| public class SysConfigController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysConfigService configService; | ||||
|  | ||||
|     /** | ||||
|      * 获取参数配置列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:config:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysConfig config) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysConfig> list = configService.selectConfigList(config); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "参数管理", businessType = BusinessType.EXPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('system:config:export')") | ||||
|     @PostMapping("/export") | ||||
|     public void export(HttpServletResponse response, SysConfig config) | ||||
|     { | ||||
|         List<SysConfig> list = configService.selectConfigList(config); | ||||
|         ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class); | ||||
|         util.exportExcel(response, list, "参数数据"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据参数编号获取详细信息 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:config:query')") | ||||
|     @GetMapping(value = "/{configId}") | ||||
|     public AjaxResult getInfo(@PathVariable Long configId) | ||||
|     { | ||||
|         return success(configService.selectConfigById(configId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据参数键名查询参数值 | ||||
|      */ | ||||
|     @GetMapping(value = "/configKey/{configKey}") | ||||
|     public AjaxResult getConfigKey(@PathVariable String configKey) | ||||
|     { | ||||
|         return success(configService.selectConfigByKey(configKey)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增参数配置 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:config:add')") | ||||
|     @Log(title = "参数管理", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@Validated @RequestBody SysConfig config) | ||||
|     { | ||||
|         if (!configService.checkConfigKeyUnique(config)) | ||||
|         { | ||||
|             return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); | ||||
|         } | ||||
|         config.setCreateBy(getUsername()); | ||||
|         return toAjax(configService.insertConfig(config)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改参数配置 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:config:edit')") | ||||
|     @Log(title = "参数管理", businessType = BusinessType.UPDATE) | ||||
|     @PutMapping | ||||
|     public AjaxResult edit(@Validated @RequestBody SysConfig config) | ||||
|     { | ||||
|         if (!configService.checkConfigKeyUnique(config)) | ||||
|         { | ||||
|             return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); | ||||
|         } | ||||
|         config.setUpdateBy(getUsername()); | ||||
|         return toAjax(configService.updateConfig(config)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除参数配置 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:config:remove')") | ||||
|     @Log(title = "参数管理", businessType = BusinessType.DELETE) | ||||
|     @DeleteMapping("/{configIds}") | ||||
|     public AjaxResult remove(@PathVariable Long[] configIds) | ||||
|     { | ||||
|         configService.deleteConfigByIds(configIds); | ||||
|         return success(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 刷新参数缓存 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:config:remove')") | ||||
|     @Log(title = "参数管理", businessType = BusinessType.CLEAN) | ||||
|     @DeleteMapping("/refreshCache") | ||||
|     public AjaxResult refreshCache() | ||||
|     { | ||||
|         configService.resetConfigCache(); | ||||
|         return success(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,132 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| import java.util.List; | ||||
| 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 com.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.constant.UserConstants; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysDept; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.system.service.ISysDeptService; | ||||
|  | ||||
| /** | ||||
|  * 部门信息 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/dept") | ||||
| public class SysDeptController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysDeptService deptService; | ||||
|  | ||||
|     /** | ||||
|      * 获取部门列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dept:list')") | ||||
|     @GetMapping("/list") | ||||
|     public AjaxResult list(SysDept dept) | ||||
|     { | ||||
|         List<SysDept> depts = deptService.selectDeptList(dept); | ||||
|         return success(depts); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 查询部门列表(排除节点) | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dept:list')") | ||||
|     @GetMapping("/list/exclude/{deptId}") | ||||
|     public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) | ||||
|     { | ||||
|         List<SysDept> depts = deptService.selectDeptList(new SysDept()); | ||||
|         depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); | ||||
|         return success(depts); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据部门编号获取详细信息 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dept:query')") | ||||
|     @GetMapping(value = "/{deptId}") | ||||
|     public AjaxResult getInfo(@PathVariable Long deptId) | ||||
|     { | ||||
|         deptService.checkDeptDataScope(deptId); | ||||
|         return success(deptService.selectDeptById(deptId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增部门 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dept:add')") | ||||
|     @Log(title = "部门管理", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@Validated @RequestBody SysDept dept) | ||||
|     { | ||||
|         if (!deptService.checkDeptNameUnique(dept)) | ||||
|         { | ||||
|             return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); | ||||
|         } | ||||
|         dept.setCreateBy(getUsername()); | ||||
|         return toAjax(deptService.insertDept(dept)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改部门 | ||||
|      */ | ||||
|     // @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 (!deptService.checkDeptNameUnique(dept)) | ||||
|         { | ||||
|             return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); | ||||
|         } | ||||
|         else if (dept.getParentId().equals(deptId)) | ||||
|         { | ||||
|             return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); | ||||
|         } | ||||
|         else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) | ||||
|         { | ||||
|             return error("该部门包含未停用的子部门!"); | ||||
|         } | ||||
|         dept.setUpdateBy(getUsername()); | ||||
|         return toAjax(deptService.updateDept(dept)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除部门 | ||||
|      */ | ||||
|     // @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("存在下级部门,不允许删除"); | ||||
|         } | ||||
|         if (deptService.checkDeptExistUser(deptId)) | ||||
|         { | ||||
|             return warn("部门存在用户,不允许删除"); | ||||
|         } | ||||
|         deptService.checkDeptDataScope(deptId); | ||||
|         return toAjax(deptService.deleteDeptById(deptId)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,121 @@ | ||||
| package com.ruoyi.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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysDictData; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.system.service.ISysDictDataService; | ||||
| import com.ruoyi.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<SysDictData> 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<SysDictData> list = dictDataService.selectDictDataList(dictData); | ||||
|         ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(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<SysDictData> data = dictTypeService.selectDictDataByType(dictType); | ||||
|         if (StringUtils.isNull(data)) | ||||
|         { | ||||
|             data = new ArrayList<SysDictData>(); | ||||
|         } | ||||
|         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(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,131 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysDictType; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.system.service.ISysDictTypeService; | ||||
|  | ||||
| /** | ||||
|  * 数据字典信息 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/dict/type") | ||||
| public class SysDictTypeController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysDictTypeService dictTypeService; | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dict:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysDictType dictType) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "字典类型", businessType = BusinessType.EXPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dict:export')") | ||||
|     @PostMapping("/export") | ||||
|     public void export(HttpServletResponse response, SysDictType dictType) | ||||
|     { | ||||
|         List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); | ||||
|         ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class); | ||||
|         util.exportExcel(response, list, "字典类型"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 查询字典类型详细 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dict:query')") | ||||
|     @GetMapping(value = "/{dictId}") | ||||
|     public AjaxResult getInfo(@PathVariable Long dictId) | ||||
|     { | ||||
|         return success(dictTypeService.selectDictTypeById(dictId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增字典类型 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dict:add')") | ||||
|     @Log(title = "字典类型", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@Validated @RequestBody SysDictType dict) | ||||
|     { | ||||
|         if (!dictTypeService.checkDictTypeUnique(dict)) | ||||
|         { | ||||
|             return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); | ||||
|         } | ||||
|         dict.setCreateBy(getUsername()); | ||||
|         return toAjax(dictTypeService.insertDictType(dict)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改字典类型 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dict:edit')") | ||||
|     @Log(title = "字典类型", businessType = BusinessType.UPDATE) | ||||
|     @PutMapping | ||||
|     public AjaxResult edit(@Validated @RequestBody SysDictType dict) | ||||
|     { | ||||
|         if (!dictTypeService.checkDictTypeUnique(dict)) | ||||
|         { | ||||
|             return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); | ||||
|         } | ||||
|         dict.setUpdateBy(getUsername()); | ||||
|         return toAjax(dictTypeService.updateDictType(dict)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除字典类型 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dict:remove')") | ||||
|     @Log(title = "字典类型", businessType = BusinessType.DELETE) | ||||
|     @DeleteMapping("/{dictIds}") | ||||
|     public AjaxResult remove(@PathVariable Long[] dictIds) | ||||
|     { | ||||
|         dictTypeService.deleteDictTypeByIds(dictIds); | ||||
|         return success(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 刷新字典缓存 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:dict:remove')") | ||||
|     @Log(title = "字典类型", businessType = BusinessType.CLEAN) | ||||
|     @DeleteMapping("/refreshCache") | ||||
|     public AjaxResult refreshCache() | ||||
|     { | ||||
|         dictTypeService.resetDictCache(); | ||||
|         return success(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取字典选择框列表 | ||||
|      */ | ||||
|     @GetMapping("/optionselect") | ||||
|     public AjaxResult optionselect() | ||||
|     { | ||||
|         List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll(); | ||||
|         return success(dictTypes); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,29 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import com.ruoyi.common.config.RuoYiConfig; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
|  | ||||
| /** | ||||
|  * 首页 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| public class SysIndexController | ||||
| { | ||||
|     /** 系统基础配置 */ | ||||
|     @Autowired | ||||
|     private RuoYiConfig ruoyiConfig; | ||||
|  | ||||
|     /** | ||||
|      * 访问首页,提示语 | ||||
|      */ | ||||
|     @RequestMapping("/") | ||||
|     public String index() | ||||
|     { | ||||
|         return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,86 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| 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.RequestBody; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysMenu; | ||||
| import com.ruoyi.common.core.domain.entity.SysUser; | ||||
| import com.ruoyi.common.core.domain.model.LoginBody; | ||||
| import com.ruoyi.common.utils.SecurityUtils; | ||||
| import com.ruoyi.framework.web.service.SysLoginService; | ||||
| import com.ruoyi.framework.web.service.SysPermissionService; | ||||
| import com.ruoyi.system.service.ISysMenuService; | ||||
|  | ||||
| /** | ||||
|  * 登录验证 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| public class SysLoginController | ||||
| { | ||||
|     @Autowired | ||||
|     private SysLoginService loginService; | ||||
|  | ||||
|     @Autowired | ||||
|     private ISysMenuService menuService; | ||||
|  | ||||
|     @Autowired | ||||
|     private SysPermissionService permissionService; | ||||
|  | ||||
|     /** | ||||
|      * 登录方法 | ||||
|      *  | ||||
|      * @param loginBody 登录信息 | ||||
|      * @return 结果 | ||||
|      */ | ||||
|     @PostMapping("/login") | ||||
|     public AjaxResult login(@RequestBody LoginBody loginBody) | ||||
|     { | ||||
|         AjaxResult ajax = AjaxResult.success(); | ||||
|         // 生成令牌 | ||||
|         String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), | ||||
|                 loginBody.getUuid()); | ||||
|         ajax.put(Constants.TOKEN, token); | ||||
|         return ajax; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取用户信息 | ||||
|      *  | ||||
|      * @return 用户信息 | ||||
|      */ | ||||
|     @GetMapping("getInfo") | ||||
|     public AjaxResult getInfo() | ||||
|     { | ||||
|         SysUser user = SecurityUtils.getLoginUser().getUser(); | ||||
|         // 角色集合 | ||||
|         Set<String> roles = permissionService.getRolePermission(user); | ||||
|         // 权限集合 | ||||
|         Set<String> permissions = permissionService.getMenuPermission(user); | ||||
|         AjaxResult ajax = AjaxResult.success(); | ||||
|         ajax.put("user", user); | ||||
|         ajax.put("roles", roles); | ||||
|         ajax.put("permissions", permissions); | ||||
|         return ajax; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取路由信息 | ||||
|      *  | ||||
|      * @return 路由信息 | ||||
|      */ | ||||
|     @GetMapping("getRouters") | ||||
|     public AjaxResult getRouters() | ||||
|     { | ||||
|         Long userId = SecurityUtils.getUserId(); | ||||
|         List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId); | ||||
|         return AjaxResult.success(menuService.buildMenus(menus)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,142 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| import java.util.List; | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.constant.UserConstants; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysMenu; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.system.service.ISysMenuService; | ||||
|  | ||||
| /** | ||||
|  * 菜单信息 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/menu") | ||||
| public class SysMenuController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysMenuService menuService; | ||||
|  | ||||
|     /** | ||||
|      * 获取菜单列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:menu:list')") | ||||
|     @GetMapping("/list") | ||||
|     public AjaxResult list(SysMenu menu) | ||||
|     { | ||||
|         List<SysMenu> menus = menuService.selectMenuList(menu, getUserId()); | ||||
|         return success(menus); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据菜单编号获取详细信息 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:menu:query')") | ||||
|     @GetMapping(value = "/{menuId}") | ||||
|     public AjaxResult getInfo(@PathVariable Long menuId) | ||||
|     { | ||||
|         return success(menuService.selectMenuById(menuId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取菜单下拉树列表 | ||||
|      */ | ||||
|     @GetMapping("/treeselect") | ||||
|     public AjaxResult treeselect(SysMenu menu) | ||||
|     { | ||||
|         List<SysMenu> menus = menuService.selectMenuList(menu, getUserId()); | ||||
|         return success(menuService.buildMenuTreeSelect(menus)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 加载对应角色菜单列表树 | ||||
|      */ | ||||
|     @GetMapping(value = "/roleMenuTreeselect/{roleId}") | ||||
|     public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) | ||||
|     { | ||||
|         List<SysMenu> menus = menuService.selectMenuList(getUserId()); | ||||
|         AjaxResult ajax = AjaxResult.success(); | ||||
|         ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); | ||||
|         ajax.put("menus", menuService.buildMenuTreeSelect(menus)); | ||||
|         return ajax; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增菜单 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:menu:add')") | ||||
|     @Log(title = "菜单管理", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@Validated @RequestBody SysMenu menu) | ||||
|     { | ||||
|         if (!menuService.checkMenuNameUnique(menu)) | ||||
|         { | ||||
|             return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); | ||||
|         } | ||||
|         else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) | ||||
|         { | ||||
|             return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); | ||||
|         } | ||||
|         menu.setCreateBy(getUsername()); | ||||
|         return toAjax(menuService.insertMenu(menu)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改菜单 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:menu:edit')") | ||||
|     @Log(title = "菜单管理", businessType = BusinessType.UPDATE) | ||||
|     @PutMapping | ||||
|     public AjaxResult edit(@Validated @RequestBody SysMenu menu) | ||||
|     { | ||||
|         if (!menuService.checkMenuNameUnique(menu)) | ||||
|         { | ||||
|             return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); | ||||
|         } | ||||
|         else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) | ||||
|         { | ||||
|             return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); | ||||
|         } | ||||
|         else if (menu.getMenuId().equals(menu.getParentId())) | ||||
|         { | ||||
|             return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); | ||||
|         } | ||||
|         menu.setUpdateBy(getUsername()); | ||||
|         return toAjax(menuService.updateMenu(menu)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除菜单 | ||||
|      */ | ||||
|     // @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("存在子菜单,不允许删除"); | ||||
|         } | ||||
|         if (menuService.checkMenuExistRole(menuId)) | ||||
|         { | ||||
|             return warn("菜单已分配,不允许删除"); | ||||
|         } | ||||
|         return toAjax(menuService.deleteMenuById(menuId)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,91 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| import java.util.List; | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.system.domain.SysNotice; | ||||
| import com.ruoyi.system.service.ISysNoticeService; | ||||
|  | ||||
| /** | ||||
|  * 公告 信息操作处理 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/notice") | ||||
| public class SysNoticeController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysNoticeService noticeService; | ||||
|  | ||||
|     /** | ||||
|      * 获取通知公告列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:notice:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysNotice notice) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysNotice> list = noticeService.selectNoticeList(notice); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据通知公告编号获取详细信息 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:notice:query')") | ||||
|     @GetMapping(value = "/{noticeId}") | ||||
|     public AjaxResult getInfo(@PathVariable Long noticeId) | ||||
|     { | ||||
|         return success(noticeService.selectNoticeById(noticeId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增通知公告 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改通知公告 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除通知公告 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:notice:remove')") | ||||
|     @Log(title = "通知公告", businessType = BusinessType.DELETE) | ||||
|     @DeleteMapping("/{noticeIds}") | ||||
|     public AjaxResult remove(@PathVariable Long[] noticeIds) | ||||
|     { | ||||
|         return toAjax(noticeService.deleteNoticeByIds(noticeIds)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,129 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.system.domain.SysPost; | ||||
| import com.ruoyi.system.service.ISysPostService; | ||||
|  | ||||
| /** | ||||
|  * 岗位信息操作处理 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/post") | ||||
| public class SysPostController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysPostService postService; | ||||
|  | ||||
|     /** | ||||
|      * 获取岗位列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:post:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysPost post) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysPost> list = postService.selectPostList(post); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|      | ||||
|     @Log(title = "岗位管理", businessType = BusinessType.EXPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('system:post:export')") | ||||
|     @PostMapping("/export") | ||||
|     public void export(HttpServletResponse response, SysPost post) | ||||
|     { | ||||
|         List<SysPost> list = postService.selectPostList(post); | ||||
|         ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class); | ||||
|         util.exportExcel(response, list, "岗位数据"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据岗位编号获取详细信息 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:post:query')") | ||||
|     @GetMapping(value = "/{postId}") | ||||
|     public AjaxResult getInfo(@PathVariable Long postId) | ||||
|     { | ||||
|         return success(postService.selectPostById(postId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增岗位 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:post:add')") | ||||
|     @Log(title = "岗位管理", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@Validated @RequestBody SysPost post) | ||||
|     { | ||||
|         if (!postService.checkPostNameUnique(post)) | ||||
|         { | ||||
|             return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); | ||||
|         } | ||||
|         else if (!postService.checkPostCodeUnique(post)) | ||||
|         { | ||||
|             return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); | ||||
|         } | ||||
|         post.setCreateBy(getUsername()); | ||||
|         return toAjax(postService.insertPost(post)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改岗位 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:post:edit')") | ||||
|     @Log(title = "岗位管理", businessType = BusinessType.UPDATE) | ||||
|     @PutMapping | ||||
|     public AjaxResult edit(@Validated @RequestBody SysPost post) | ||||
|     { | ||||
|         if (!postService.checkPostNameUnique(post)) | ||||
|         { | ||||
|             return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); | ||||
|         } | ||||
|         else if (!postService.checkPostCodeUnique(post)) | ||||
|         { | ||||
|             return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); | ||||
|         } | ||||
|         post.setUpdateBy(getUsername()); | ||||
|         return toAjax(postService.updatePost(post)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除岗位 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:post:remove')") | ||||
|     @Log(title = "岗位管理", businessType = BusinessType.DELETE) | ||||
|     @DeleteMapping("/{postIds}") | ||||
|     public AjaxResult remove(@PathVariable Long[] postIds) | ||||
|     { | ||||
|         return toAjax(postService.deletePostByIds(postIds)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取岗位选择框列表 | ||||
|      */ | ||||
|     @GetMapping("/optionselect") | ||||
|     public AjaxResult optionselect() | ||||
|     { | ||||
|         List<SysPost> posts = postService.selectPostAll(); | ||||
|         return success(posts); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,137 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| 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.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 com.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.config.RuoYiConfig; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysUser; | ||||
| import com.ruoyi.common.core.domain.model.LoginUser; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.SecurityUtils; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.common.utils.file.FileUploadUtils; | ||||
| import com.ruoyi.common.utils.file.MimeTypeUtils; | ||||
| import com.ruoyi.framework.web.service.TokenService; | ||||
| import com.ruoyi.system.service.ISysUserService; | ||||
|  | ||||
| /** | ||||
|  * 个人信息 业务处理 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/user/profile") | ||||
| public class SysProfileController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private ISysUserService userService; | ||||
|  | ||||
|     @Autowired | ||||
|     private TokenService tokenService; | ||||
|  | ||||
|     /** | ||||
|      * 个人信息 | ||||
|      */ | ||||
|     @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())); | ||||
|         return ajax; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改用户 | ||||
|      */ | ||||
|     @Log(title = "个人信息", businessType = BusinessType.UPDATE) | ||||
|     @PutMapping | ||||
|     public AjaxResult updateProfile(@RequestBody SysUser user) | ||||
|     { | ||||
|         LoginUser loginUser = getLoginUser(); | ||||
|         SysUser currentUser = loginUser.getUser(); | ||||
|         currentUser.setNickName(user.getNickName()); | ||||
|         currentUser.setEmail(user.getEmail()); | ||||
|         currentUser.setPhonenumber(user.getPhonenumber()); | ||||
|         currentUser.setSex(user.getSex()); | ||||
|         if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser)) | ||||
|         { | ||||
|             return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在"); | ||||
|         } | ||||
|         if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser)) | ||||
|         { | ||||
|             return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在"); | ||||
|         } | ||||
|         if (userService.updateUserProfile(currentUser) > 0) | ||||
|         { | ||||
|             // 更新缓存用户信息 | ||||
|             tokenService.setLoginUser(loginUser); | ||||
|             return success(); | ||||
|         } | ||||
|         return error("修改个人信息异常,请联系管理员"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 重置密码 | ||||
|      */ | ||||
|     @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("修改密码失败,旧密码错误"); | ||||
|         } | ||||
|         if (SecurityUtils.matchesPassword(newPassword, password)) | ||||
|         { | ||||
|             return error("新密码不能与旧密码相同"); | ||||
|         } | ||||
|         newPassword = SecurityUtils.encryptPassword(newPassword); | ||||
|         if (userService.resetUserPwd(userName, newPassword) > 0) | ||||
|         { | ||||
|             // 更新缓存用户密码 | ||||
|             loginUser.getUser().setPassword(newPassword); | ||||
|             tokenService.setLoginUser(loginUser); | ||||
|             return success(); | ||||
|         } | ||||
|         return error("修改密码异常,请联系管理员"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 头像上传 | ||||
|      */ | ||||
|     @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("上传图片异常,请联系管理员"); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,38 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| 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.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.model.RegisterBody; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.framework.web.service.SysRegisterService; | ||||
| import com.ruoyi.system.service.ISysConfigService; | ||||
|  | ||||
| /** | ||||
|  * 注册验证 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @RestController | ||||
| public class SysRegisterController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private SysRegisterService registerService; | ||||
|  | ||||
|     @Autowired | ||||
|     private ISysConfigService configService; | ||||
|  | ||||
|     @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); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,262 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysDept; | ||||
| import com.ruoyi.common.core.domain.entity.SysRole; | ||||
| import com.ruoyi.common.core.domain.entity.SysUser; | ||||
| import com.ruoyi.common.core.domain.model.LoginUser; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.framework.web.service.SysPermissionService; | ||||
| import com.ruoyi.framework.web.service.TokenService; | ||||
| import com.ruoyi.system.domain.SysUserRole; | ||||
| import com.ruoyi.system.service.ISysDeptService; | ||||
| import com.ruoyi.system.service.ISysRoleService; | ||||
| import com.ruoyi.system.service.ISysUserService; | ||||
|  | ||||
| /** | ||||
|  * 角色信息 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @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; | ||||
|  | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysRole role) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysRole> list = roleService.selectRoleList(role); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "角色管理", businessType = BusinessType.EXPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:export')") | ||||
|     @PostMapping("/export") | ||||
|     public void export(HttpServletResponse response, SysRole role) | ||||
|     { | ||||
|         List<SysRole> list = roleService.selectRoleList(role); | ||||
|         ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class); | ||||
|         util.exportExcel(response, list, "角色数据"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据角色编号获取详细信息 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:query')") | ||||
|     @GetMapping(value = "/{roleId}") | ||||
|     public AjaxResult getInfo(@PathVariable Long roleId) | ||||
|     { | ||||
|         roleService.checkRoleDataScope(roleId); | ||||
|         return success(roleService.selectRoleById(roleId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增角色 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:add')") | ||||
|     @Log(title = "角色管理", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@Validated @RequestBody SysRole role) | ||||
|     { | ||||
|         if (!roleService.checkRoleNameUnique(role)) | ||||
|         { | ||||
|             return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); | ||||
|         } | ||||
|         else if (!roleService.checkRoleKeyUnique(role)) | ||||
|         { | ||||
|             return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); | ||||
|         } | ||||
|         role.setCreateBy(getUsername()); | ||||
|         return toAjax(roleService.insertRole(role)); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改保存角色 | ||||
|      */ | ||||
|     // @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 (!roleService.checkRoleNameUnique(role)) | ||||
|         { | ||||
|             return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); | ||||
|         } | ||||
|         else if (!roleService.checkRoleKeyUnique(role)) | ||||
|         { | ||||
|             return error("修改角色'" + 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("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改保存数据权限 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 状态修改 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除角色 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:remove')") | ||||
|     @Log(title = "角色管理", businessType = BusinessType.DELETE) | ||||
|     @DeleteMapping("/{roleIds}") | ||||
|     public AjaxResult remove(@PathVariable Long[] roleIds) | ||||
|     { | ||||
|         return toAjax(roleService.deleteRoleByIds(roleIds)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取角色选择框列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:query')") | ||||
|     @GetMapping("/optionselect") | ||||
|     public AjaxResult optionselect() | ||||
|     { | ||||
|         return success(roleService.selectRoleAll()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 查询已分配用户角色列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:list')") | ||||
|     @GetMapping("/authUser/allocatedList") | ||||
|     public TableDataInfo allocatedList(SysUser user) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysUser> list = userService.selectAllocatedList(user); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 查询未分配用户角色列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:role:list')") | ||||
|     @GetMapping("/authUser/unallocatedList") | ||||
|     public TableDataInfo unallocatedList(SysUser user) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysUser> list = userService.selectUnallocatedList(user); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 取消授权用户 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 批量取消授权用户 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 批量选择用户授权 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取对应角色部门树列表 | ||||
|      */ | ||||
|     // @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; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,256 @@ | ||||
| package com.ruoyi.web.controller.system; | ||||
|  | ||||
| import java.util.List; | ||||
| import java.util.stream.Collectors; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| 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.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.entity.SysDept; | ||||
| import com.ruoyi.common.core.domain.entity.SysRole; | ||||
| import com.ruoyi.common.core.domain.entity.SysUser; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.common.utils.SecurityUtils; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.system.service.ISysDeptService; | ||||
| import com.ruoyi.system.service.ISysPostService; | ||||
| import com.ruoyi.system.service.ISysRoleService; | ||||
| import com.ruoyi.system.service.ISysUserService; | ||||
|  | ||||
| /** | ||||
|  * 用户信息 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| @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; | ||||
|  | ||||
|     /** | ||||
|      * 获取用户列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:user:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(SysUser user) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<SysUser> list = userService.selectUserList(user); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "用户管理", businessType = BusinessType.EXPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('system:user:export')") | ||||
|     @PostMapping("/export") | ||||
|     public void export(HttpServletResponse response, SysUser user) | ||||
|     { | ||||
|         List<SysUser> list = userService.selectUserList(user); | ||||
|         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); | ||||
|         util.exportExcel(response, list, "用户数据"); | ||||
|     } | ||||
|  | ||||
|     @Log(title = "用户管理", businessType = BusinessType.IMPORT) | ||||
|     // @PreAuthorize("@ss.hasPermi('system:user:import')") | ||||
|     @PostMapping("/importData") | ||||
|     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception | ||||
|     { | ||||
|         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); | ||||
|         List<SysUser> userList = util.importExcel(file.getInputStream()); | ||||
|         String operName = getUsername(); | ||||
|         String message = userService.importUser(userList, updateSupport, operName); | ||||
|         return success(message); | ||||
|     } | ||||
|  | ||||
|     @PostMapping("/importTemplate") | ||||
|     public void importTemplate(HttpServletResponse response) | ||||
|     { | ||||
|         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); | ||||
|         util.importTemplateExcel(response, "用户数据"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据用户编号获取详细信息 | ||||
|      */ | ||||
|     // @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<SysRole> 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)); | ||||
|             ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); | ||||
|         } | ||||
|         return ajax; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 新增用户 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:user:add')") | ||||
|     @Log(title = "用户管理", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@Validated @RequestBody SysUser user) | ||||
|     { | ||||
|         deptService.checkDeptDataScope(user.getDeptId()); | ||||
|         roleService.checkRoleDataScope(user.getRoleIds()); | ||||
|         if (!userService.checkUserNameUnique(user)) | ||||
|         { | ||||
|             return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); | ||||
|         } | ||||
|         else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) | ||||
|         { | ||||
|             return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); | ||||
|         } | ||||
|         else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) | ||||
|         { | ||||
|             return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); | ||||
|         } | ||||
|         user.setCreateBy(getUsername()); | ||||
|         user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); | ||||
|         return toAjax(userService.insertUser(user)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 修改用户 | ||||
|      */ | ||||
|     // @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()); | ||||
|         deptService.checkDeptDataScope(user.getDeptId()); | ||||
|         roleService.checkRoleDataScope(user.getRoleIds()); | ||||
|         if (!userService.checkUserNameUnique(user)) | ||||
|         { | ||||
|             return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); | ||||
|         } | ||||
|         else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) | ||||
|         { | ||||
|             return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); | ||||
|         } | ||||
|         else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) | ||||
|         { | ||||
|             return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); | ||||
|         } | ||||
|         user.setUpdateBy(getUsername()); | ||||
|         return toAjax(userService.updateUser(user)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 删除用户 | ||||
|      */ | ||||
|     // @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("当前用户不能删除"); | ||||
|         } | ||||
|         return toAjax(userService.deleteUserByIds(userIds)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 重置密码 | ||||
|      */ | ||||
|     // @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.setUpdateBy(getUsername()); | ||||
|         return toAjax(userService.resetPwd(user)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 状态修改 | ||||
|      */ | ||||
|     // @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)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据用户编号获取授权角色 | ||||
|      */ | ||||
|     // @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<SysRole> 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; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 用户授权角色 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:user:edit')") | ||||
|     @Log(title = "用户管理", businessType = BusinessType.GRANT) | ||||
|     @PutMapping("/authRole") | ||||
|     public AjaxResult insertAuthRole(Long userId, Long[] roleIds) | ||||
|     { | ||||
|         userService.checkUserDataScope(userId); | ||||
|         roleService.checkRoleDataScope(roleIds); | ||||
|         userService.insertUserAuth(userId, roleIds); | ||||
|         return success(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取部门树列表 | ||||
|      */ | ||||
|     // @PreAuthorize("@ss.hasPermi('system:user:list')") | ||||
|     @GetMapping("/deptTree") | ||||
|     public AjaxResult deptTree(SysDept dept) | ||||
|     { | ||||
|         return success(deptService.selectDeptTreeList(dept)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,54 @@ | ||||
| package com.ruoyi.web.core.config; | ||||
|  | ||||
| import io.swagger.annotations.ApiOperation; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import springfox.documentation.RequestHandler; | ||||
| import springfox.documentation.builders.ApiInfoBuilder; | ||||
| import springfox.documentation.builders.PathSelectors; | ||||
| import springfox.documentation.builders.RequestHandlerSelectors; | ||||
| import springfox.documentation.service.ApiInfo; | ||||
| import springfox.documentation.spi.DocumentationType; | ||||
| import springfox.documentation.spring.web.plugins.Docket; | ||||
| import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.function.Predicate; | ||||
|  | ||||
| /** | ||||
|  * @auther 周志雄 | ||||
|  * @date 2024/6/26 14:52 | ||||
|  */ | ||||
|  | ||||
| @Configuration | ||||
| @EnableSwagger2WebMvc | ||||
| public class SwaggerConfig { | ||||
|  | ||||
|     @Bean(value = "defaultApi2") | ||||
|     public Docket defaultApi2() { | ||||
|         return new Docket(DocumentationType.SWAGGER_2) | ||||
|                 .apiInfo(apiInfo()) | ||||
|                 .select() | ||||
|                 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) | ||||
|                 .paths(PathSelectors.any()) | ||||
|                 .build(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     private ApiInfo apiInfo() { | ||||
|         return new ApiInfoBuilder() | ||||
|                 .title("无人机管理API") | ||||
|                 .description("无人机管理相关接口") | ||||
|                 .version("1.0") | ||||
|                 .build(); | ||||
|     } | ||||
|  | ||||
|     private Predicate<RequestHandler> customRequestHandlerSelector(String... basePackages) { | ||||
|         List<Predicate<RequestHandler>> predicates = new ArrayList<>(); | ||||
|         for (String basePackage : basePackages) { | ||||
|             predicates.add(RequestHandlerSelectors.basePackage(basePackage.trim())); | ||||
|         } | ||||
|         return predicates.stream().reduce(Predicate::or).orElse(x -> false); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1 @@ | ||||
| restart.include.json=/com.alibaba.fastjson2.*.jar | ||||
							
								
								
									
										74
									
								
								drone/ruoyi-admin/src/main/resources/application-druid.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								drone/ruoyi-admin/src/main/resources/application-druid.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,74 @@ | ||||
| # 数据源配置 | ||||
| spring: | ||||
|   datasource: | ||||
|     type: com.alibaba.druid.pool.DruidDataSource | ||||
|     driverClassName: com.mysql.cj.jdbc.Driver | ||||
|     druid: | ||||
|       # 主库数据源 | ||||
| #      master: | ||||
| #        url: jdbc:mysql://120.46.149.189:3306/drone?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | ||||
| #        username: drone | ||||
| #        password: JXL@zzx79 | ||||
|       master: | ||||
|         url: jdbc:mysql://192.168.110.126:3306/drone?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | ||||
|         username: root | ||||
|         password: 123456 | ||||
|       # 从库数据源 | ||||
|       slave: | ||||
|         # 从数据源开关/默认关闭 | ||||
|         enabled: false | ||||
|         url: | ||||
|         username: | ||||
|         password: | ||||
|       # 初始连接数 | ||||
|       initialSize: 5 | ||||
|       # 最小连接池数量 | ||||
|       minIdle: 10 | ||||
|       # 最大连接池数量 | ||||
|       maxActive: 200 | ||||
|       # 配置获取连接等待超时的时间 | ||||
|       maxWait: 60000 | ||||
|       # 配置连接超时时间 | ||||
|       connectTimeout: 30000 | ||||
|       # 配置网络超时时间 | ||||
|       socketTimeout: 60000 | ||||
|       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | ||||
|       timeBetweenEvictionRunsMillis: 60000 | ||||
|       # 配置一个连接在池中最小生存的时间,单位是毫秒 | ||||
|       minEvictableIdleTimeMillis: 300000 | ||||
|       # 配置一个连接在池中最大生存的时间,单位是毫秒 | ||||
|       maxEvictableIdleTimeMillis: 900000 | ||||
|       # 配置检测连接是否有效 | ||||
|       validationQuery: SELECT 1 FROM DUAL | ||||
|       testWhileIdle: true | ||||
|       testOnBorrow: false | ||||
|       testOnReturn: false | ||||
|       webStatFilter: | ||||
|         enabled: true | ||||
|       statViewServlet: | ||||
|         enabled: true | ||||
|         # 设置白名单,不填则允许所有访问 | ||||
|         allow: | ||||
|         url-pattern: /druid/* | ||||
|         # 控制台管理用户名和密码 | ||||
|         login-username: ruoyi | ||||
|         login-password: 123456 | ||||
|       filter: | ||||
|         stat: | ||||
|           enabled: true | ||||
|           # 慢SQL记录 | ||||
|           log-slow-sql: true | ||||
|           slow-sql-millis: 1000 | ||||
|           merge-sql: true | ||||
|         wall: | ||||
|           config: | ||||
|             multi-statement-allow: true | ||||
|  | ||||
| minio: | ||||
|   endpoint: "http://zmkg.cqet.top:9999" | ||||
|   access-key: "admin" | ||||
|   secret-key: "12345678" | ||||
|   role-arn: "arn:aws:s3:::drone-?/*" | ||||
|   role-session-name: "anysession" | ||||
|   region: "cn-chengdu" | ||||
|   duration-seconds: 3600 | ||||
							
								
								
									
										61
									
								
								drone/ruoyi-admin/src/main/resources/application-prod.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								drone/ruoyi-admin/src/main/resources/application-prod.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| # 数据源配置 | ||||
| spring: | ||||
|   datasource: | ||||
|     type: com.alibaba.druid.pool.DruidDataSource | ||||
|     driverClassName: com.mysql.cj.jdbc.Driver | ||||
|     druid: | ||||
|       # 主库数据源 | ||||
|       master: | ||||
|         url: jdbc:mysql://192.168.110.199:3306/drone?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | ||||
|         username: drone | ||||
|         password: WDDAELfaZaNZNYtP | ||||
|       # 从库数据源 | ||||
|       slave: | ||||
|         # 从数据源开关/默认关闭 | ||||
|         enabled: false | ||||
|         url: | ||||
|         username: | ||||
|         password: | ||||
|       # 初始连接数 | ||||
|       initialSize: 5 | ||||
|       # 最小连接池数量 | ||||
|       minIdle: 10 | ||||
|       # 最大连接池数量 | ||||
|       maxActive: 2000 | ||||
|       # 配置获取连接等待超时的时间 | ||||
|       maxWait: 60000 | ||||
|       # 配置连接超时时间 | ||||
|       connectTimeout: 30000 | ||||
|       # 配置网络超时时间 | ||||
|       socketTimeout: 60000 | ||||
|       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | ||||
|       timeBetweenEvictionRunsMillis: 60000 | ||||
|       # 配置一个连接在池中最小生存的时间,单位是毫秒 | ||||
|       minEvictableIdleTimeMillis: 300000 | ||||
|       # 配置一个连接在池中最大生存的时间,单位是毫秒 | ||||
|       maxEvictableIdleTimeMillis: 900000 | ||||
|       # 配置检测连接是否有效 | ||||
|       validationQuery: SELECT 1 FROM DUAL | ||||
|       testWhileIdle: true | ||||
|       testOnBorrow: false | ||||
|       testOnReturn: false | ||||
|       webStatFilter: | ||||
|         enabled: true | ||||
|       statViewServlet: | ||||
|         enabled: true | ||||
|         # 设置白名单,不填则允许所有访问 | ||||
|         allow: | ||||
|         url-pattern: /druid/* | ||||
|         # 控制台管理用户名和密码 | ||||
|         login-username: ruoyi | ||||
|         login-password: 123456 | ||||
|       filter: | ||||
|         stat: | ||||
|           enabled: true | ||||
|           # 慢SQL记录 | ||||
|           log-slow-sql: true | ||||
|           slow-sql-millis: 1000 | ||||
|           merge-sql: true | ||||
|         wall: | ||||
|           config: | ||||
|             multi-statement-allow: true | ||||
							
								
								
									
										187
									
								
								drone/ruoyi-admin/src/main/resources/application.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								drone/ruoyi-admin/src/main/resources/application.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | ||||
| # 项目相关配置 | ||||
| ruoyi: | ||||
|   # 名称 | ||||
|   name: RuoYi | ||||
|   # 版本 | ||||
|   version: 3.8.8 | ||||
|   # 版权年份 | ||||
|   copyrightYear: 2024 | ||||
|   # 文件路径 | ||||
|   profile: D:/ruoyi/uploadPath | ||||
|   # 获取ip地址开关 | ||||
|   addressEnabled: false | ||||
|   # 验证码类型 math 数字计算 char 字符验证 | ||||
|   captchaType: math | ||||
|  | ||||
| # 开发环境配置 | ||||
| server: | ||||
|   host: 192.168.110.126 | ||||
|   # 服务器的HTTP端口,默认为8080 | ||||
|   port: 9136 | ||||
|   servlet: | ||||
|     # 应用的访问路径 | ||||
|     context-path: / | ||||
|   tomcat: | ||||
|     # tomcat的URI编码 | ||||
|     uri-encoding: UTF-8 | ||||
|     # 连接数满后的排队数,默认为100 | ||||
|     accept-count: 1000 | ||||
|     threads: | ||||
|       # tomcat最大线程数,默认为200 | ||||
|       max: 800 | ||||
|       # Tomcat启动初始化的线程数,默认值10 | ||||
|       min-spare: 100 | ||||
|  | ||||
| # 日志配置 | ||||
| logging: | ||||
|   level: | ||||
|     com.ruoyi: info | ||||
|     org.springframework: warn | ||||
|  | ||||
| # 用户配置 | ||||
| user: | ||||
|   password: | ||||
|     # 密码最大错误次数 | ||||
|     maxRetryCount: 5 | ||||
|     # 密码锁定时间(默认10分钟) | ||||
|     lockTime: 10 | ||||
|  | ||||
| # Spring配置 | ||||
| spring: | ||||
|   # 资源信息 | ||||
|   messages: | ||||
|     # 国际化资源文件路径 | ||||
|     basename: i18n/messages | ||||
|   profiles: | ||||
|     active: druid | ||||
|   # 文件上传 | ||||
|   servlet: | ||||
|     multipart: | ||||
|       # 单个文件大小 | ||||
|       max-file-size: 10MB | ||||
|       # 设置总上传的文件大小 | ||||
|       max-request-size: 20MB | ||||
|   # 服务模块 | ||||
|   devtools: | ||||
|     restart: | ||||
|       # 热部署开关 | ||||
|       enabled: true | ||||
|   # redis 配置 | ||||
|   redis: | ||||
|     # 地址 | ||||
|     host: 192.168.110.126 | ||||
|     # 端口,默认为6379 | ||||
|     port: 6379 | ||||
|     # 数据库索引 | ||||
|     database: 2 | ||||
|     # 密码 | ||||
|     password: 123456 | ||||
|     # 连接超时时间 | ||||
|     timeout: 10s | ||||
|     lettuce: | ||||
|       pool: | ||||
|         # 连接池中的最小空闲连接 | ||||
|         min-idle: 0 | ||||
|         # 连接池中的最大空闲连接 | ||||
|         max-idle: 8 | ||||
|         # 连接池的最大数据库连接数 | ||||
|         max-active: 8 | ||||
|         # #连接池最大阻塞等待时间(使用负值表示没有限制) | ||||
|         max-wait: -1ms | ||||
| # token配置 | ||||
| token: | ||||
|   # 令牌自定义标识 | ||||
|   header: Authorization | ||||
|   # 令牌密钥 | ||||
|   secret: abcdefghijklmnopqrstuvwxyz | ||||
|   # 令牌有效期(默认30分钟) | ||||
|   expireTime: 30 | ||||
|  | ||||
| # MyBatis配置 | ||||
| mybatis: | ||||
|   # 搜索指定包别名 | ||||
|   typeAliasesPackage: com.ruoyi.**.domain | ||||
|   # 配置mapper的扫描,找到所有的mapper.xml映射文件 | ||||
|   mapperLocations: classpath*:mapper/**/*Mapper.xml | ||||
|   # 加载全局的配置文件 | ||||
|   configLocation: classpath:mybatis/mybatis-config.xml | ||||
|   configuration: | ||||
|     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl | ||||
|  | ||||
| # PageHelper分页插件 | ||||
| pagehelper: | ||||
|   helperDialect: mysql | ||||
|   supportMethodsArguments: true | ||||
|   params: count=countSql | ||||
|  | ||||
| # Swagger配置 | ||||
| swagger: | ||||
|   # 是否开启swagger | ||||
|   enabled: true | ||||
|   # 请求前缀 | ||||
|   pathMapping: /dev-api | ||||
|  | ||||
| # 防止XSS攻击 | ||||
| xss: | ||||
|   # 过滤开关 | ||||
|   enabled: true | ||||
|   # 排除链接(多个用逗号分隔) | ||||
|   excludes: /system/notice | ||||
|   # 匹配链接 | ||||
|   urlPatterns: /system/*,/monitor/*,/tool/* | ||||
|  | ||||
| mqtt: | ||||
|   broker: tcp://zmkg.cqet.top:9995 | ||||
|   username: cory18600000000 | ||||
|   password: cory18600000000 | ||||
|   topics: | ||||
|     # 设备 > 云平台 | ||||
|     - thing/product/+/osd # 设备定频上报的属性 | ||||
|     - thing/product/+/state # 设备事件性上报的属性 | ||||
|     - thing/product/+/services_reply # 设备对服务的回复和处理结果 | ||||
|     - thing/product/+/events # 设备向云平台发送需要关注和处理的事件 | ||||
|     - thing/product/+/requests # 设备向云平台发送请求以获取一些信息 | ||||
|     - sys/product/+/status # 设备上下线、更新拓扑 | ||||
|     - thing/product/+/property/set_reply # 设备属性设置的响应 | ||||
|     - thing/product/+/drc/up # DRC协议上行 | ||||
|  | ||||
| # 指令飞行的时候需要的参数 | ||||
| cmd: | ||||
|   username: cmduser | ||||
|   password: cmdpassword | ||||
|   host: jl.yj-3d.com:1883 | ||||
|  | ||||
|   mvc: | ||||
|     static-path-pattern: /static/** | ||||
|   resources: | ||||
|     static-locations: classpath:/static/ | ||||
|  | ||||
| # 内外本地部署的时候需要的配置更新内容 | ||||
| deploy: | ||||
|   appid: | ||||
|   appKey: | ||||
|   appLicense: | ||||
|   ntpServerHost: | ||||
|   ntpServerPort: | ||||
|  | ||||
| #minio: | ||||
| #  endpoint: "http://zmkg.cqet.top:9999" | ||||
| #  access-key: "admin" | ||||
| #  secret-key: "12345678" | ||||
| #  role-arn: "arn:aws:s3:::drone-?/*" | ||||
| #  role-session-name: "anysession" | ||||
| #  region: "cn-chengdu" | ||||
| #  duration-seconds: 3600 | ||||
|  | ||||
| minio: | ||||
|   endpoint: "http://192.168.110.126:9000" | ||||
|   access-key: "root" | ||||
|   secret-key: "root123456" | ||||
|   role-arn: "arn:aws:s3:::drone-?/*" | ||||
|   role-session-name: "anysession" | ||||
|   region: "cn-chengdu" | ||||
|   duration-seconds: 3600 | ||||
|  | ||||
|  | ||||
| ai: | ||||
|   url: http://192.168.110.23:8001/start_video | ||||
							
								
								
									
										14
									
								
								drone/ruoyi-admin/src/main/resources/banner.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								drone/ruoyi-admin/src/main/resources/banner.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
|       ┏┓   ┏┓ | ||||
|      ┏┛┻━━━┛┻┓ | ||||
|      ┃   ━   ┃          版权信息: | ||||
|      ████━████          公司信息: 重庆远界大数据研究院 | ||||
|      ┃       ┃          作者信息: 周志雄(zzxjxl9599@163.com) | ||||
|      ┃   ┻   ┃          作者博客: http://zzxjxl.online | ||||
|      ┗━┓   ┏━┛ | ||||
|        ┃   ┃            版本信息: | ||||
|        ┃    ┗━━━┓       OS-Version: ${os.name} | ||||
|        ┃        ┣┓      JDK-Version: ${java.version} | ||||
|        ┃        ┏┛      SpringBoot-Version: ${spring-boot.version} | ||||
|        ┗┓┓┏━┳┓┏┛ | ||||
|         ┃┫┫ ┃┫┫         神兽保佑  永不宕机  永无BUG | ||||
|         ┗┻┛ ┗┻┛ | ||||
| @ -0,0 +1,38 @@ | ||||
| #错误消息 | ||||
| not.null=* 必须填写 | ||||
| user.jcaptcha.error=验证码错误 | ||||
| user.jcaptcha.expire=验证码已失效 | ||||
| user.not.exists=用户不存在/密码错误 | ||||
| user.password.not.match=用户不存在/密码错误 | ||||
| user.password.retry.limit.count=密码输入错误{0}次 | ||||
| user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 | ||||
| user.password.delete=对不起,您的账号已被删除 | ||||
| user.blocked=用户已封禁,请联系管理员 | ||||
| role.blocked=角色已封禁,请联系管理员 | ||||
| login.blocked=很遗憾,访问IP已被列入系统黑名单 | ||||
| user.logout.success=退出成功 | ||||
|  | ||||
| length.not.valid=长度必须在{min}到{max}个字符之间 | ||||
|  | ||||
| user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 | ||||
| user.password.not.valid=* 5-50个字符 | ||||
|   | ||||
| user.email.not.valid=邮箱格式错误 | ||||
| user.mobile.phone.number.not.valid=手机号格式错误 | ||||
| user.login.success=登录成功 | ||||
| user.register.success=注册成功 | ||||
| user.notfound=请重新登录 | ||||
| user.forcelogout=管理员强制退出,请重新登录 | ||||
| user.unknown.error=未知错误,请重新登录 | ||||
|  | ||||
| ##文件上传消息 | ||||
| upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB! | ||||
| upload.filename.exceed.length=上传的文件名最长{0}个字符 | ||||
|  | ||||
| ##权限 | ||||
| no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] | ||||
| no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] | ||||
| no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] | ||||
| no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] | ||||
| no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] | ||||
| no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] | ||||
							
								
								
									
										82
									
								
								drone/ruoyi-admin/src/main/resources/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								drone/ruoyi-admin/src/main/resources/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | ||||
| class ImageStore { | ||||
|     constructor(dbName = 'imageDatabase', storeName = 'images') { | ||||
|         this.dbName = dbName; | ||||
|         this.storeName = storeName; | ||||
|         this.db = null; | ||||
|     } | ||||
|  | ||||
|     // 初始化IndexedDB数据库 | ||||
|     async initDB() { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             const request = window.indexedDB.open(this.dbName, 1); | ||||
|  | ||||
|             request.onupgradeneeded = (event) => { | ||||
|                 const db = event.target.result; | ||||
|                 if (!db.objectStoreNames.contains(this.storeName)) { | ||||
|                     db.createObjectStore(this.storeName, { keyPath: 'url' }); | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             request.onsuccess = (event) => { | ||||
|                 this.db = event.target.result; | ||||
|                 resolve(this.db); | ||||
|             }; | ||||
|  | ||||
|             request.onerror = (event) => { | ||||
|                 console.error("Error opening IndexedDB:", event); | ||||
|                 reject(event); | ||||
|             }; | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     // 存储Base64图片 | ||||
|     async storeImage(url, base64Data) { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             if (!this.db) { | ||||
|                 await this.initDB(); | ||||
|             } | ||||
|  | ||||
|             const transaction = this.db.transaction([this.storeName], 'readwrite'); | ||||
|             const store = transaction.objectStore(this.storeName); | ||||
|  | ||||
|             const request = store.put({ url, base64Data }); | ||||
|  | ||||
|             request.onsuccess = () => { | ||||
|                 resolve(true); | ||||
|             }; | ||||
|  | ||||
|             request.onerror = (event) => { | ||||
|                 console.error("Error storing image:", event); | ||||
|                 reject(event); | ||||
|             }; | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     // 根据URL获取Base64图片 | ||||
|     async getImage(url) { | ||||
|         return new Promise(async (resolve, reject) => { | ||||
|             if (!this.db) { | ||||
|                 await this.initDB(); | ||||
|             } | ||||
|  | ||||
|             const transaction = this.db.transaction([this.storeName], 'readonly'); | ||||
|             const store = transaction.objectStore(this.storeName); | ||||
|  | ||||
|             const request = store.get(url); | ||||
|  | ||||
|             request.onsuccess = (event) => { | ||||
|                 const result = event.target.result; | ||||
|                 if (result) { | ||||
|                     resolve(result.base64Data); | ||||
|                 } else { | ||||
|                     resolve(null);  // 如果没有找到图片,返回null | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             request.onerror = (event) => { | ||||
|                 console.error("Error retrieving image:", event); | ||||
|                 reject(event); | ||||
|             }; | ||||
|         }); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										144
									
								
								drone/ruoyi-admin/src/main/resources/logback-spring.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								drone/ruoyi-admin/src/main/resources/logback-spring.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,144 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <configuration scan="true" scanPeriod="60 seconds" debug="false"> | ||||
|  | ||||
|     <!-- 关闭自身的启动日志 --> | ||||
|     <statusListener class="ch.qos.logback.core.status.NopStatusListener"/> | ||||
|  | ||||
|     <!-- 随便起个名字 --> | ||||
|     <contextName>logback</contextName> | ||||
|  | ||||
|     <!-- 项目名 --> | ||||
|     <property name="PROJECT_NAME" value="service_cms"/> | ||||
|  | ||||
|     <!-- 日志文件输出的位置 --> | ||||
|     <property name="log.path" value="D://日志//无人机"/> | ||||
|  | ||||
|     <!-- 控制台日志的彩色日志 --> | ||||
|     <property name="CONSOLE_LOG_PATTERN" | ||||
|               value="%boldCyan(%date{yyyy-MM-dd HH:mm:ss}) |%boldYellow(%-5level) |%boldBlue(%thread) |%boldMagenta(%file:%line) |%boldRed(%logger) |%boldGreen(%msg%n)"/> | ||||
|  | ||||
|     <!-- 文件日志格式 --> | ||||
|     <property name="FILE_LOG_PATTERN" | ||||
|               value="%date{yyyy-MM-dd HH:mm:ss} |%-5level |%thread |%file:%line |%logger |%msg%n"/> | ||||
|  | ||||
|     <!-- 日志的编码方式 --> | ||||
|     <property name="ENCODING" | ||||
|               value="UTF-8"/> | ||||
|  | ||||
|     <!-- 输出到控制台 --> | ||||
|     <!-- appender:日志记录器,name随便写,要见名知意,class=ConsoleAppender代表输出到控制台 --> | ||||
|     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> | ||||
|         <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> | ||||
|             <!-- 日志级别,DEBUG及其以上的都会输出到控制台 --> | ||||
|             <level>DEBUG</level> | ||||
|         </filter> | ||||
|         <encoder> | ||||
|             <!-- 日志格式 --> | ||||
|             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> | ||||
|             <!-- 日志字符集 --> | ||||
|             <charset>${ENCODING}</charset> | ||||
|         </encoder> | ||||
|     </appender> | ||||
|  | ||||
|     <!-- 记录INFO的日志文件,只接收在INFO级别以上的到这个文件,RollingFileAppender:滚动日志 --> | ||||
|     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | ||||
|         <!-- 日志过滤器:此日志文件只记录INFO级别的,不会接受ERROR这些 --> | ||||
|         <filter class="ch.qos.logback.classic.filter.LevelFilter"> | ||||
|             <level>INFO</level> | ||||
|             <onMatch>ACCEPT</onMatch> | ||||
|             <onMismatch>DENY</onMismatch> | ||||
|         </filter> | ||||
|         <!-- 正在记录的日志文件的路径及文件名 --> | ||||
|         <file>${log.path}/${PROJECT_NAME}/log_info.log</file> | ||||
|         <encoder> | ||||
|             <pattern>${FILE_LOG_PATTERN}</pattern> | ||||
|             <charset>${ENCODING}</charset> | ||||
|         </encoder> | ||||
|         <!-- 日志记录器的滚动策略,按日期记录 --> | ||||
|         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | ||||
|             <!-- 每天日志归档路径以及格式,也就是前面的日志会放进这个位置 --> | ||||
|             <fileNamePattern>${log.path}/${PROJECT_NAME}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | ||||
|  | ||||
|             <!-- 当每一天生成的数量都超过100MB了,就算不满足日期,也新生成一个日志文件 --> | ||||
|             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | ||||
|                 <maxFileSize>100MB</maxFileSize> | ||||
|             </timeBasedFileNamingAndTriggeringPolicy> | ||||
|  | ||||
|             <!-- 日志文件保留天数,因为文件过多,目录太大,读取也很慢 --> | ||||
|             <maxHistory>15</maxHistory> | ||||
|         </rollingPolicy> | ||||
|     </appender> | ||||
|  | ||||
|     <!-- 记录WARN的日志文件,只接收在INFO级别以上的到这个文件,RollingFileAppender:滚动日志 --> | ||||
|     <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | ||||
|         <!-- 日志过滤器:此日志文件只记录WARN级别的 --> | ||||
|         <filter class="ch.qos.logback.classic.filter.LevelFilter"> | ||||
|             <level>WARN</level> | ||||
|             <onMatch>ACCEPT</onMatch> | ||||
|             <onMismatch>DENY</onMismatch> | ||||
|         </filter> | ||||
|         <!-- 正在记录的日志文件的路径及文件名 --> | ||||
|         <file>${log.path}/${PROJECT_NAME}/log_warn.log</file> | ||||
|         <encoder> | ||||
|             <pattern>${FILE_LOG_PATTERN}</pattern> | ||||
|             <charset>${ENCODING}</charset> <!-- 此处设置字符集 --> | ||||
|         </encoder> | ||||
|         <!-- 日志记录器的滚动策略,按日期,按大小记录 --> | ||||
|         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | ||||
|             <fileNamePattern>${log.path}/${PROJECT_NAME}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | ||||
|             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | ||||
|                 <maxFileSize>100MB</maxFileSize> | ||||
|             </timeBasedFileNamingAndTriggeringPolicy> | ||||
|             <!-- 日志文件保留天数 --> | ||||
|             <maxHistory>15</maxHistory> | ||||
|         </rollingPolicy> | ||||
|     </appender> | ||||
|  | ||||
|     <!-- 记录ERROR的日志文件,只接收在INFO级别以上的到这个文件,RollingFileAppender:滚动日志 --> | ||||
|     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> | ||||
|         <!-- 日志过滤器:此日志文件只记录ERROR级别的 --> | ||||
|         <filter class="ch.qos.logback.classic.filter.LevelFilter"> | ||||
|             <level>ERROR</level> | ||||
|             <onMatch>ACCEPT</onMatch> | ||||
|             <onMismatch>DENY</onMismatch> | ||||
|         </filter> | ||||
|         <!-- 正在记录的日志文件的路径及文件名 --> | ||||
|         <file>${log.path}/${PROJECT_NAME}/log_error.log</file> | ||||
|         <encoder> | ||||
|             <pattern>${FILE_LOG_PATTERN}</pattern> | ||||
|             <charset>${ENCODING}</charset> <!-- 此处设置字符集 --> | ||||
|         </encoder> | ||||
|         <!-- 日志记录器的滚动策略,按日期,按大小记录 --> | ||||
|         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | ||||
|             <fileNamePattern>${log.path}/${PROJECT_NAME}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> | ||||
|             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> | ||||
|                 <maxFileSize>100MB</maxFileSize> | ||||
|             </timeBasedFileNamingAndTriggeringPolicy> | ||||
|             <!-- 日志文件保留天数 --> | ||||
|             <maxHistory>15</maxHistory> | ||||
|         </rollingPolicy> | ||||
|     </appender> | ||||
|  | ||||
|     <!-- 在开发环境使用这个配置 --> | ||||
|     <springProfile name="druid"> | ||||
|         <!-- 可以灵活设置此处,从而控制日志的输出,我这里是只输出INFO及其以上的日志信息 --> | ||||
| <!--        <root level="INFO">--> | ||||
| <!--            <appender-ref ref="CONSOLE"/>--> | ||||
| <!--            <appender-ref ref="INFO_FILE"/>--> | ||||
| <!--            <appender-ref ref="WARN_FILE"/>--> | ||||
| <!--            <appender-ref ref="ERROR_FILE"/>--> | ||||
| <!--        </root>--> | ||||
|         <root level="ERROR"> | ||||
|             <appender-ref ref="CONSOLE"/> | ||||
|             <appender-ref ref="ERROR_FILE"/> | ||||
|         </root> | ||||
|     </springProfile> | ||||
|  | ||||
|     <!-- 在生产环境使用这个配置 --> | ||||
|     <springProfile name="pro"> | ||||
|         <root level="ERROR"> | ||||
|             <appender-ref ref="ERROR_FILE"/> | ||||
|         </root> | ||||
|     </springProfile> | ||||
|  | ||||
| </configuration> | ||||
| @ -0,0 +1,20 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" ?> | ||||
| <!DOCTYPE configuration | ||||
| PUBLIC "-//mybatis.org//DTD Config 3.0//EN" | ||||
| "http://mybatis.org/dtd/mybatis-3-config.dtd"> | ||||
| <configuration> | ||||
|     <!-- 全局参数 --> | ||||
|     <settings> | ||||
|         <!-- 使全局的映射器启用或禁用缓存 --> | ||||
|         <setting name="cacheEnabled"             value="true"   /> | ||||
|         <!-- 允许JDBC 支持自动生成主键 --> | ||||
|         <setting name="useGeneratedKeys"         value="true"   /> | ||||
|         <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 --> | ||||
|         <setting name="defaultExecutorType"      value="SIMPLE" /> | ||||
| 		<!-- 指定 MyBatis 所用日志的具体实现 --> | ||||
|         <setting name="logImpl"                  value="SLF4J"  /> | ||||
|         <!-- 使用驼峰命名法转换字段 --> | ||||
| 		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> --> | ||||
| 	</settings> | ||||
| 	 | ||||
| </configuration> | ||||
		Reference in New Issue
	
	Block a user