diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/AiAnimalSysApplication.java b/ai-xuebao-admin/src/main/java/net/hzvtc/AiAnimalSysApplication.java new file mode 100644 index 0000000..a949de4 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/AiAnimalSysApplication.java @@ -0,0 +1,27 @@ +package net.hzvtc; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +import javax.annotation.PostConstruct; +import java.util.TimeZone; + +/** + * 启动程序 + * + * @author admin + */ +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +public class AiAnimalSysApplication { + public static void main(String[] args) { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(AiAnimalSysApplication.class, args); + System.out.println("AiXuebaoSys启动成功"); + } + + @PostConstruct + void setDefaultTimezone() { + TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/AiAnimalSysServletInitializer.java b/ai-xuebao-admin/src/main/java/net/hzvtc/AiAnimalSysServletInitializer.java new file mode 100644 index 0000000..8ee6adb --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/AiAnimalSysServletInitializer.java @@ -0,0 +1,16 @@ +package net.hzvtc; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author admin + */ +public class AiAnimalSysServletInitializer extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(AiAnimalSysApplication.class); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/api/controller/SpeciesInfoApiController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/api/controller/SpeciesInfoApiController.java new file mode 100644 index 0000000..336d852 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/api/controller/SpeciesInfoApiController.java @@ -0,0 +1,57 @@ +package net.hzvtc.web.api.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.web.api.service.SpeciesInfoApiService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/web/species/api") +public class SpeciesInfoApiController { + @Autowired + private SpeciesInfoApiService speciesInfoApiService; + + @GetMapping("/currentDateSpeciesStat") + public AjaxResult getCurrentDateBirdStat() { + return AjaxResult.success(speciesInfoApiService.getSpeciesCurrentDateStatList(null)); + } + + @PostMapping("/speciesDailyStat") + public AjaxResult getBirdDailyStatList(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesInfoApiService.getSpeciesStatListByParam(obj)); + } + + @PostMapping("/speciesPeriodStat") + public AjaxResult getBirdPeriodStat(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesInfoApiService.getBirdPeriodStatByParam(obj)); + } + + @PostMapping("/speciesMonthStat") + public AjaxResult getBirdMonthStat(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesInfoApiService.getBirdMonthStatByParam(obj)); + } + + @PostMapping("/speciesYearStat") + public AjaxResult getBirdYearStat(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesInfoApiService.getBirdYearStatByParam(obj)); + } + + @PostMapping("/videoList") + public AjaxResult getBirdVideoListByParam(@RequestBody(required = false) JSONObject obj) { + if (obj == null) { + obj = new JSONObject(); + } + return AjaxResult.success(speciesInfoApiService.getVideoMediaListByParam(obj)); + } + + @GetMapping("/deviceList") + public AjaxResult getDeviceList() { + return AjaxResult.success(speciesInfoApiService.getDeviceInfoListByParam()); + } + + @GetMapping("/todayRecords") + public AjaxResult getTodayRecords() { + return AjaxResult.success(speciesInfoApiService.getTodayRecordList()); + } +} \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/common/CaptchaController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/common/CaptchaController.java new file mode 100644 index 0000000..260ca48 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/common/CaptchaController.java @@ -0,0 +1,86 @@ +package net.hzvtc.web.controller.common; + +import com.wf.captcha.ArithmeticCaptcha; +import com.wf.captcha.SpecCaptcha; +import com.wf.captcha.base.Captcha; +import net.hzvtc.common.config.AiBirdSysConfig; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.redis.RedisCache; +import net.hzvtc.common.utils.uuid.IdUtils; +import net.hzvtc.system.service.SysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +/** + * 验证码操作处理 + * + * @author admin + */ +@RestController +public class CaptchaController { +// @Resource(name = "captchaProducer") +// private Producer captchaProducer; +// +// @Resource(name = "captchaProducerMath") +// private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + @Autowired + private SysConfigService configService; + + /** + * 生成验证码 + */ + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException { + return getImageCode(0); + } + + + @GetMapping("/appCaptchaImage") + public AjaxResult getCodeForApp(HttpServletResponse response) throws IOException { + return getImageCode(1); + } + + private AjaxResult getImageCode(int type) { + AjaxResult ajax = AjaxResult.success(); + boolean captchaOnOff = configService.selectCaptchaOnOff(); + ajax.put("captchaOnOff", captchaOnOff); + if (!captchaOnOff) { + return ajax; + } + + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + Captcha captcha = null; + String captchaType = AiBirdSysConfig.getCaptchaType(); + if ("math".equals(captchaType)) { + captcha = new ArithmeticCaptcha(115, 42); + } else { + captcha = new SpecCaptcha(115, 42); + } + + //创建算术验证码 + + //得到算术验证码的计算值 + String code = captcha.text(); + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);//存入redis +// log.info("验证码:{}",code); + ajax.put("uuid", uuid); + if (type == 0) { + ajax.put("img", captcha.toBase64()); + } else { + ajax.put("img", captcha.toBase64("")); + } + return ajax; + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/common/CommonController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/common/CommonController.java new file mode 100644 index 0000000..d8203ff --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/common/CommonController.java @@ -0,0 +1,110 @@ +package net.hzvtc.web.controller.common; + +import net.hzvtc.common.config.AiBirdSysConfig; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.file.FileUploadUtils; +import net.hzvtc.common.utils.file.FileUtils; +import net.hzvtc.framework.config.ServerConfig; +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.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 通用请求处理 + * + * @author admin + */ +@RestController +public class CommonController { + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @GetMapping("common/download") + public void fileDownload(String fileName, Boolean delete, String downLoadFileName, HttpServletResponse response, HttpServletRequest request) { + try { + if (!FileUtils.checkAllowDownload(fileName)) { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = ""; + if (downLoadFileName != null && !downLoadFileName.isEmpty()) { + realFileName = downLoadFileName + fileName.substring(fileName.indexOf(".")); + } else { + realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf(".")); + } + + String filePath = AiBirdSysConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); +// FileUtils.setAttachmentResponseHeader(response, "test.xlsx"); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) { + FileUtils.deleteFile(filePath); + } + } catch (Exception e) { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求 + */ + @PostMapping("/common/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception { + try { + // 上传文件路径 + String filePath = AiBirdSysConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = AiBirdSysConfig.getFileServerUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("fileName", fileName); + ajax.put("url", url); + return ajax; + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/common/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 = AiBirdSysConfig.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); + } + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/CacheController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/CacheController.java new file mode 100644 index 0000000..d505766 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/CacheController.java @@ -0,0 +1,54 @@ +package net.hzvtc.web.controller.monitor; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.utils.StringUtils; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 缓存监控 + * + * @author admin + */ +@RestController +@RequestMapping("/monitor/cache") +public class CacheController +{ + @Autowired + private RedisTemplate redisTemplate; + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/ServerController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/ServerController.java new file mode 100644 index 0000000..46da68d --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/ServerController.java @@ -0,0 +1,27 @@ +package net.hzvtc.web.controller.monitor; + +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.framework.web.domain.Server; +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; + +/** + * 服务器监控 + * + * @author admin + */ +@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); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysLogininforController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..e388b3f --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysLogininforController.java @@ -0,0 +1,60 @@ +package net.hzvtc.web.controller.monitor; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.domain.SysLogininfor; +import net.hzvtc.system.service.SysLogininforService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 系统访问记录 + * + * @author admin + */ +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController { + @Autowired + private SysLogininforService logininforService; + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor) { + startPage(); + List 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 list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(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 AjaxResult.success(); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysOperlogController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..accff94 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysOperlogController.java @@ -0,0 +1,60 @@ +package net.hzvtc.web.controller.monitor; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.domain.SysOperLog; +import net.hzvtc.system.service.SysOperLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 操作日志记录 + * + * @author admin + */ +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController { + @Autowired + private SysOperLogService operLogService; + + @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog) { + startPage(); + List 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 list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(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 AjaxResult.success(); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysUserOnlineController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..b466c57 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,75 @@ +package net.hzvtc.web.controller.monitor; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.model.LoginUser; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.core.redis.RedisCache; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.domain.SysUserOnline; +import net.hzvtc.system.service.SysUserOnlineService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * 在线用户监控 + * + * @author admin + */ +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController { + @Autowired + private SysUserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) { + Collection keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) { + LoginUser user = redisCache.getCacheObject(key); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + } else if (StringUtils.isNotEmpty(ipaddr)) { + if (StringUtils.equals(ipaddr, user.getIpaddr())) { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + } else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) { + if (StringUtils.equals(userName, user.getUsername())) { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } + } else { + userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 强退用户 + */ + @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) { + redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); + return AjaxResult.success(); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/NoticeFileInfoController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/NoticeFileInfoController.java new file mode 100644 index 0000000..c59a8c2 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/NoticeFileInfoController.java @@ -0,0 +1,29 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.file.FileUploadUtils; +import net.hzvtc.system.domain.NoticeFileInfo; +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; + +@RestController +@RequestMapping("/system/notice/file") +public class NoticeFileInfoController extends BaseController { + @PostMapping("/upload") + public AjaxResult uploadTaskFile(MultipartFile file) { + String baseDir = FileUploadUtils.getDefaultBaseDir() + "/" + "notice" + "/" + SecurityUtils.getDeptId(); + try { + NoticeFileInfo data = new NoticeFileInfo(); + data.setFilePath(FileUploadUtils.upload(baseDir, file)); + data.setFileType(FileUploadUtils.getExtension(file)); + data.setName(FileUploadUtils.getOriginalFileName(file)); + return AjaxResult.success(data); + } catch (Exception ex) { + return AjaxResult.error(ex.getMessage()); + } + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysConfigController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysConfigController.java new file mode 100644 index 0000000..a970f83 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysConfigController.java @@ -0,0 +1,117 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.domain.SysConfig; +import net.hzvtc.system.service.SysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 参数配置 信息操作处理 + * + * @author admin + */ +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController { + @Autowired + private SysConfigService configService; + + /** + * 获取参数配置列表 + */ + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(SysConfig config) { + startPage(); + List 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 list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "参数数据"); + } + + /** + * 根据参数编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) { + return AjaxResult.success(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + */ + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) { + return AjaxResult.success(configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { + return AjaxResult.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 (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { + return AjaxResult.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 AjaxResult.success(); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDeptController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDeptController.java new file mode 100644 index 0000000..769017e --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDeptController.java @@ -0,0 +1,192 @@ +package net.hzvtc.web.controller.system; + +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysDept; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.service.SysDeptService; +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.*; + +import java.util.List; + +/** + * 部门信息 + * + * @author admin + */ + +@RestController +@RequestMapping("/system/dept") +@Slf4j +public class SysDeptController extends BaseController { + @Autowired + private SysDeptService deptService; + + /** + * 获取部门列表 + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDept dept) { + List depts = deptService.selectDeptList(dept); + return AjaxResult.success(depts); + } + + /** + * 查询部门列表(排除节点) + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new SysDept()); + depts.removeIf(d -> d.getDeptId().intValue() == deptId + || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + return AjaxResult.success(depts); + } + + /** + * 根据部门编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) { + deptService.checkDeptDataScope(deptId); + return AjaxResult.success(deptService.selectDeptById(deptId)); + } + + /** + * 获取部门下拉树列表 + */ + @GetMapping("/treeselect/{type}") + public AjaxResult treeselect(@PathVariable Integer type) { + SysDept dept = new SysDept(); +// SysDept data = deptService.selectDeptById(SecurityUtils.getLoginUser().getDeptId()); +// log.info("============={}",SecurityUtils.getLoginUser().getDeptId()); +// if (type == 1) { +// dept.setAncestors(data.getAncestors() + ',' + data.getDeptId()); +// //dept.setParentId(SecurityUtils.getLoginUser().getDeptId()); +// } +// else if (type == 2) { +// dept.setAncestors(data.getAncestors()); +// if (data.getParentId() != 0) { +// dept.setParentId(data.getParentId()); +// } else { +// dept.setParentId(data.getDeptId()); +// } +// } + + List depts = deptService.selectDeptList(dept); + return AjaxResult.success(deptService.buildDeptTreeSelect(depts)); + } + + @GetMapping("/getDeptCountTree") + public AjaxResult getDeptCountTree() { + SysDept dept = new SysDept(); + List list = deptService.selectDeptDeviceCountList(dept); + return AjaxResult.success(deptService.buildDeptTreeSelect(list)); + } + + @GetMapping("/lazyTreeselect") + public AjaxResult lazyTreeselect(@RequestParam(name = "deptId", required = false) Long deptId) { + return AjaxResult.success(deptService.buildLazyDeptTreeSelect(deptId)); + } + + @GetMapping("/compareTreeselect") + public AjaxResult compareTreeselect(Long deptId) { +// if (deptId == null) { +// SysDept sysDept = deptService.selectDeptById(SecurityUtils.getLoginUser().getDeptId()); +// String ancestor = sysDept.getAncestors(); +// if (ancestor == null) { +// deptId = 0L; +// } else { +// String arr[] = ancestor.split(","); +// if (arr.length > 1) { +// deptId = Long.parseLong(arr[arr.length - 2]); +// } else { +// deptId = 0L; +// } +// } +// } + return AjaxResult.success(deptService.buildLazyDeptTreeSelect(deptId)); + } + + + @PostMapping("/updateDeptAncestorPath") + public AjaxResult updateDeptFullPath(Long deptId) { + SysDept sysDept = new SysDept(); + sysDept.setDeptId(deptId); + deptService.updateDeptAncestorPath(sysDept); + return AjaxResult.success(true); + } + + /** + * 加载对应角色部门列表树 + */ + @GetMapping(value = "/roleDeptTreeselect/{roleId}") + public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + List depts = deptService.selectDeptList(new SysDept()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.buildDeptTreeSelect(depts)); + return ajax; + } + + /** + * 新增部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:add')") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) { + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { + return AjaxResult.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 (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { + return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(deptId)) { + return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) { + return AjaxResult.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 AjaxResult.error("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) { + return AjaxResult.error("部门存在用户,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDictDataController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDictDataController.java new file mode 100644 index 0000000..fd6bc11 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDictDataController.java @@ -0,0 +1,111 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysDictData; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.service.SysDictDataService; +import net.hzvtc.system.service.SysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典信息 + * + * @author admin + */ +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController { + @Autowired + private SysDictDataService dictDataService; + + @Autowired + private SysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictData dictData) { + startPage(); + List list = dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, list, "字典数据"); + } + + /** + * 查询字典数据详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) { + return AjaxResult.success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) { + data = new ArrayList(); + } + return AjaxResult.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(); + } + + @GetMapping("/fileVersionList") + public List getVersionList(){ + return dictDataService.getDictDataListForSel("file_upload_version"); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDictTypeController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..c630b46 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysDictTypeController.java @@ -0,0 +1,115 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysDictType; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.service.SysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 数据字典信息 + * + * @author admin + */ +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController { + @Autowired + private SysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictType dictType) { + startPage(); + List 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 list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "字典类型"); + } + + /** + * 查询字典类型详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) { + return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { + return AjaxResult.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 (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { + return AjaxResult.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 AjaxResult.success(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return AjaxResult.success(dictTypes); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysIndexController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysIndexController.java new file mode 100644 index 0000000..a26ac24 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysIndexController.java @@ -0,0 +1,29 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.config.AiBirdSysConfig; +import net.hzvtc.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 首页 + * + * @author admin + */ +@RestController +public class SysIndexController { + /** + * 系统基础配置 + */ + @Autowired + private AiBirdSysConfig adminConfig; + + /** + * 访问首页,提示语 + */ + @RequestMapping("/") + public String index() { + return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", adminConfig.getName(), adminConfig.getVersion()); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysLoginController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysLoginController.java new file mode 100644 index 0000000..6a1f921 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysLoginController.java @@ -0,0 +1,150 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.app.domain.AppUpgrade; +import net.hzvtc.app.service.AppUpgradeService; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysMenu; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.core.domain.model.LoginBody; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.framework.web.service.SysLoginService; +import net.hzvtc.framework.web.service.SysPermissionService; +import net.hzvtc.system.service.SysMenuService; +import net.hzvtc.web.utils.SM2KeyPairHolder; +import net.hzvtc.web.utils.SM2Utils; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.util.encoders.Hex; +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 java.util.List; +import java.util.Set; + +/** + * 登录验证 + * + * @author admin + */ +@RestController +public class SysLoginController { + @Autowired + private SysLoginService loginService; + + @Autowired + private SysMenuService menuService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private AppUpgradeService appUpgradeService; + + @Autowired + private SM2KeyPairHolder keyPairHolder; + + /** + * 登录方法 + * + * @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(), loginBody.getLoginType()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + @PostMapping("/web/api/getToken") + public AjaxResult getToken(@RequestBody LoginBody loginBody) { + loginBody.setLoginType(1); + return login(loginBody); + } + + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("getInfo") + public AjaxResult getInfo() { + SysUser user = SecurityUtils.getLoginUser().getUser(); + // 角色集合 + Set roles = permissionService.getRolePermission(user); + // 权限集合 + Set permissions = permissionService.getMenuPermission(user); + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("permissions", permissions); +// ajax.put("areaIds", SecurityUtils.getLoginUser().getAreaIds()); +// ajax.put("areaList", SecurityUtils.getLoginUser().getAreaList()); +// ajax.put("deviceList", SecurityUtils.getLoginUser().getDeviceList()); + return ajax; + } + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("getRouters") + public AjaxResult getRouters(Integer sysId) { + Long userId = SecurityUtils.getUserId(); + if (sysId == null) { + sysId = 1; + } + List menus = menuService.selectMenuTreeByUserId(userId, sysId); + return AjaxResult.success(menuService.buildMenus(menus)); + } + + @GetMapping({"/appUpdate", "/appUpdateInfo"}) + public AppUpgrade appUpgrade() { + return appUpgradeService.getLastAppUpgradeInfo(); + } + + @GetMapping("/checkUpdate") + public AjaxResult checkUpdate() { + return AjaxResult.success(appUpgradeService.getLastAppUpgradeInfo()); + } + + @PostMapping("/restPassword") + public AjaxResult resetPassword(@RequestBody SysUser param) { + return loginService.resetPasswordByName(param.getUserName()); + } + + /** + * 登录方法 + * + * @param loginBody 登录信息 + * @return 结果 + */ + @PostMapping("/sm2login") + public AjaxResult sm2Login(@RequestBody LoginBody loginBody) { + AjaxResult ajax = AjaxResult.success(); + String usernameHex = loginBody.getUsername(); + String userName = SM2Utils.decrypt(usernameHex, keyPairHolder.getPrivateKey(), keyPairHolder.getPublicKey()); + + String passwordHex = loginBody.getPassword(); + String password = SM2Utils.decrypt(passwordHex, keyPairHolder.getPrivateKey(), keyPairHolder.getPublicKey()); + + String token = loginService.login(userName, password, loginBody.getCode(), loginBody.getUuid(), loginBody.getLoginType()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + @GetMapping("/web/getPublicKey") + public String getPublicKey() { + BCECPublicKey pub = (BCECPublicKey) keyPairHolder.getPublicKey(); + byte[] encoded = pub.getQ().getEncoded(false); // false = uncompressed → 自动加 04 + return Hex.toHexString(encoded); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysMenuController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysMenuController.java new file mode 100644 index 0000000..b2f043f --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysMenuController.java @@ -0,0 +1,118 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysMenu; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.service.SysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单信息 + * + * @author admin + */ +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController { + @Autowired + private SysMenuService menuService; + + /** + * 获取菜单列表 + */ + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) { + List menus = menuService.selectMenuList(menu, getUserId()); + return AjaxResult.success(menus); + } + + /** + * 根据菜单编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) { + return AjaxResult.success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) { + List menus = menuService.selectMenuList(menu, getUserId()); + return AjaxResult.success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}/{sysId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId, @PathVariable("sysId") Integer sysId) { + List menus = menuService.selectMenuList(getUserId(), sysId); + 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 (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { + return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return AjaxResult.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 (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return AjaxResult.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 AjaxResult.error("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return AjaxResult.error("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } +} \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysNoticeController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysNoticeController.java new file mode 100644 index 0000000..00d09a9 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysNoticeController.java @@ -0,0 +1,119 @@ +package net.hzvtc.web.controller.system; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.service.SpeciesAbnormalInfoService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.system.domain.SysNotice; +import net.hzvtc.system.domain.vo.DocStateCountVO; +import net.hzvtc.system.domain.vo.MessageVo; +import net.hzvtc.system.service.SysNoticeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 公告 信息操作处理 + * + * @author admin + */ +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController { + @Autowired + private SysNoticeService noticeService; + @Autowired + private SpeciesAbnormalInfoService abnormalInfoService; + + /** + * 获取通知公告列表 + */ + @PreAuthorize("@ss.hasPermi('system:notice:list')") + @GetMapping("/list") + public TableDataInfo list(SysNotice notice) { + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 根据通知公告编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable(name = "noticeId") Long noticeId) { + return AjaxResult.success(noticeService.selectNoticeById(noticeId)); + } + + @GetMapping(value = "/mobile/{noticeId}") + public AjaxResult getInfoForMobile(@PathVariable(name = "noticeId") Long noticeId) { + return AjaxResult.success(noticeService.getNoticeForMobileById(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)); + } + + @GetMapping("/getDocCountByState") + public AjaxResult getDocCountByState() { +// Long deptId = SecurityUtils.getLoginUser().getDeptId(); + List list = noticeService.getSysNoticeCountGroupByState(null); + return AjaxResult.success(list); + } + + /** + * 修改通知公告 + */ + @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)); + } + + @GetMapping("/msgCatalogueList") + public AjaxResult getMessageForMobile() { + return AjaxResult.success(noticeService.getUnreadMessageCatalogueList()); + } + + @PostMapping("/messageList") + public TableDataInfo getMessageListForMobile(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + Integer pageSize = params.getInteger("pageSize"); + startPage(pageNum, pageSize); + int msgType = params.getInteger("msgType"); + if (msgType == 1) { + String title = params.getString("title"); + List list = noticeService.getMessageInfoList(title); + return getDataTable(list); + } else { + List list = abnormalInfoService.getSpeciesAbnormalInfoListByParam(); + return getDataTable(list); + } + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysPostController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysPostController.java new file mode 100644 index 0000000..290151d --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysPostController.java @@ -0,0 +1,110 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.domain.SysPost; +import net.hzvtc.system.service.SysPostService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 岗位信息操作处理 + * + * @author admin + */ +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController { + @Autowired + private SysPostService postService; + + /** + * 获取岗位列表 + */ + @PreAuthorize("@ss.hasPermi('system:post:list')") + @GetMapping("/list") + public TableDataInfo list(SysPost post) { + startPage(); + List 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 list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "岗位数据"); + } + + /** + * 根据岗位编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) { + return AjaxResult.success(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:add')") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { + return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { + return AjaxResult.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 (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { + return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { + return AjaxResult.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 posts = postService.selectPostAll(); + return AjaxResult.success(posts); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysProfileController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysProfileController.java new file mode 100644 index 0000000..1af442e --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysProfileController.java @@ -0,0 +1,124 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.config.AiBirdSysConfig; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.core.domain.model.LoginUser; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.file.FileUploadUtils; +import net.hzvtc.framework.web.service.TokenService; +import net.hzvtc.system.service.SysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * 个人信息 业务处理 + * + * @author admin + */ +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController { + @Autowired + private SysUserService 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 sysUser = loginUser.getUser(); + user.setUserName(sysUser.getUserName()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUserId(sysUser.getUserId()); + user.setPassword(null); + if (userService.updateUserProfile(user) > 0) { + // 更新缓存用户信息 + sysUser.setNickName(user.getNickName()); + sysUser.setPhonenumber(user.getPhonenumber()); + sysUser.setEmail(user.getEmail()); + sysUser.setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.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 AjaxResult.error("修改密码失败,旧密码错误"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) { + return AjaxResult.error("新密码不能与旧密码相同"); + } + if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) { + // 更新缓存用户密码 + loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + */ + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException { + if (!file.isEmpty()) { + LoginUser loginUser = getLoginUser(); + String avatar = FileUploadUtils.upload(AiBirdSysConfig.getAvatarPath(), file); + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + // 更新缓存用户头像 + loginUser.getUser().setAvatar(avatar); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return AjaxResult.error("上传图片异常,请联系管理员"); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysRegisterController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysRegisterController.java new file mode 100644 index 0000000..0bd14a5 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysRegisterController.java @@ -0,0 +1,35 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.model.RegisterBody; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.framework.web.service.SysRegisterService; +import net.hzvtc.system.service.SysConfigService; +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; + +/** + * 注册验证 + * + * @author admin + */ +@RestController +public class SysRegisterController extends BaseController { + @Autowired + private SysRegisterService registerService; + + @Autowired + private SysConfigService 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); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysRoleController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysRoleController.java new file mode 100644 index 0000000..03e9e12 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysRoleController.java @@ -0,0 +1,225 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysRole; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.core.domain.model.LoginUser; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.framework.web.service.SysPermissionService; +import net.hzvtc.framework.web.service.TokenService; +import net.hzvtc.system.domain.SysUserRole; +import net.hzvtc.system.service.SysRoleService; +import net.hzvtc.system.service.SysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 角色信息 + * + * @author admin + */ +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController { + @Autowired + private SysRoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private SysUserService userService; + + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/list") + public TableDataInfo list(SysRole role) { + startPage(); + List 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 list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(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 AjaxResult.success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:add')") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) { + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { + return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { + return AjaxResult.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 (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { + return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { + return AjaxResult.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())); + if (role.getAreaIds() != null) { + loginUser.setAreaIds(Arrays.stream(role.getAreaIds()).collect(Collectors.toSet())); + } else { + loginUser.setAreaIds(null); + } + tokenService.setLoginUser(loginUser); + } + return AjaxResult.success(); + } + return AjaxResult.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/{sysId}") + public AjaxResult optionselect(@PathVariable(value = "sysId") Integer sysId) { + SysRole sysRole = new SysRole(); + sysRole.setSysId(sysId); + return AjaxResult.success(roleService.selectRoleAll(sysRole)); + } + + /** + * 查询已分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUser user) { + startPage(); + List list = userService.selectAllocatedList(user); + return getDataTable(list); + } + + /** + * 查询未分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUser user) { + startPage(); + List 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)); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysUserController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysUserController.java new file mode 100644 index 0000000..192dc2d --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/system/SysUserController.java @@ -0,0 +1,236 @@ +package net.hzvtc.web.controller.system; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.domain.entity.SysRole; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.service.SysPostService; +import net.hzvtc.system.service.SysRoleService; +import net.hzvtc.system.service.SysUserService; +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.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户信息 + * + * @author admin + */ +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController { + @Autowired + private SysUserService userService; + + @Autowired + private SysRoleService roleService; + + @Autowired + private SysPostService postService; + + /** + * 获取用户列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(SysUser user) { + startPage(); + if (user == null) { + user = new SysUser(); + } + +// if (user.getDeptId()==0) { +// user.setDeptId(SecurityUtils.getLoginUser().getDeptId()); +// } + + List 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 list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil<>(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 util = new ExcelUtil<>(SysUser.class); + List userList = util.importExcel(file.getInputStream()); + String operName = getUsername(); + String message = userService.importUser(userList, updateSupport, operName); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(SysUser.class); + util.importTemplateExcel(response, "用户数据"); + } + + /** + * 根据用户编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = {"/{sysId}", "/{sysId}/{userId}"}) + public AjaxResult getInfo(@PathVariable(value = "sysId", required = false) Integer sysId, @PathVariable(value = "userId", required = false) Long userId) { +// userService.checkUserDataScope(userId); + AjaxResult ajax = AjaxResult.success(); + SysRole sysRole = new SysRole(); + sysRole.setSysId(sysId); + sysRole.setUserId(userId); + List roles = roleService.selectRoleAll(sysRole); + 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 param = new SysUser(); + param.setUserId(userId); + param.setSysId(sysId); + SysUser sysUser = userService.selectUserById(param); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + if (sysUser.getRoles() != null) { + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); + } else { + ajax.put("roleIds", new ArrayList()); + } + } + return ajax; + } + + /** + * 新增用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) { + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) { + return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } +// else if (StringUtils.isNotEmpty(user.getPhonenumber()) +// && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { +// return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); +// } else if (StringUtils.isNotEmpty(user.getEmail()) +// && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { +// return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); +// } + user.setCreateBy(getUsername()); + System.out.println("======1================" + user.getPassword()); + 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()); + if (StringUtils.isNotEmpty(user.getPhonenumber()) + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return AjaxResult.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}/{sysId}") + public AjaxResult authRole(@PathVariable("userId") Long userId, @PathVariable("sysId") Integer sysId) { + AjaxResult ajax = AjaxResult.success(); + SysUser param = new SysUser(); + param.setUserId(userId); + param.setSysId(sysId); + SysUser user = userService.selectUserById(param); + SysRole sysRole = new SysRole(); + + sysRole.setSysId(sysId); + sysRole.setUserId(userId); + List roles = roleService.selectRolesByUserId(sysRole); + 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, Integer sysId, Long[] roleIds) { +// userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, sysId, roleIds); + return success(); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/tool/SwaggerController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/tool/SwaggerController.java new file mode 100644 index 0000000..899e3a8 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/tool/SwaggerController.java @@ -0,0 +1,24 @@ +package net.hzvtc.web.controller.tool; + +import net.hzvtc.common.core.controller.BaseController; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * swagger 接口 + * + * @author admin + */ +@Controller +@RequestMapping("/tool/swagger") +public class SwaggerController extends BaseController +{ + @PreAuthorize("@ss.hasPermi('tool:swagger:view')") + @GetMapping() + public String index() + { + return redirect("/swagger-ui.html"); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/tool/TestController.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/tool/TestController.java new file mode 100644 index 0000000..3574fd5 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/controller/tool/TestController.java @@ -0,0 +1,182 @@ +package net.hzvtc.web.controller.tool; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.utils.StringUtils; +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 io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +/** + * swagger 用户测试方法 + * + * @author admin + */ +@Api("用户信息管理") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public AjaxResult userList() + { + List userList = new ArrayList(users.values()); + return AjaxResult.success(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public AjaxResult getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return AjaxResult.success(users.get(userId)); + } + else + { + return error("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public AjaxResult save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return error("用户ID不能为空"); + } + return AjaxResult.success(users.put(user.getUserId(), user)); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public AjaxResult update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return error("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return error("用户不存在"); + } + users.remove(user.getUserId()); + return AjaxResult.success(users.put(user.getUserId(), user)); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public AjaxResult delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return success(); + } + else + { + return error("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/core/config/SwaggerConfig.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..884f69d --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/core/config/SwaggerConfig.java @@ -0,0 +1,121 @@ +package net.hzvtc.web.core.config; + +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import net.hzvtc.common.config.AiBirdSysConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.ArrayList; +import java.util.List; + +/** + * Swagger2的接口配置 + * + * @author admin + */ +@Configuration +public class SwaggerConfig { + /** + * 系统基础配置 + */ + @Autowired + private AiBirdSysConfig adminConfig; + + /** + * 是否开启swagger + */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** + * 设置请求的统一前缀 + */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("net.hzvtc.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List defaultAuth() { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("标题:AiBirdSys管理系统_接口文档") + // 描述 + .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + // 作者信息 + .contact(new Contact(adminConfig.getName(), null, null)) + // 版本 + .version("版本号:" + adminConfig.getVersion()) + .build(); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/HexUtils.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/HexUtils.java new file mode 100644 index 0000000..ae85d30 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/HexUtils.java @@ -0,0 +1,22 @@ +package net.hzvtc.web.utils; + +public class HexUtils { + + public static String toHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } + + public static byte[] fromHex(String hex) { + int len = hex.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + + Character.digit(hex.charAt(i + 1), 16)); + } + return data; + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/SM2KeyPairHolder.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/SM2KeyPairHolder.java new file mode 100644 index 0000000..1e3b10f --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/SM2KeyPairHolder.java @@ -0,0 +1,35 @@ +package net.hzvtc.web.utils; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.security.*; +import java.security.spec.ECGenParameterSpec; + +@Component +public class SM2KeyPairHolder { + + private KeyPair keyPair; + + static { + Security.addProvider(new BouncyCastleProvider()); + } + + + @PostConstruct + public void init() throws Exception { + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("EC", "BC"); + // 国密标准曲线 + keyPairGen.initialize(new ECGenParameterSpec("sm2p256v1")); + this.keyPair = keyPairGen.generateKeyPair(); + } + + public PublicKey getPublicKey() { + return keyPair.getPublic(); + } + + public PrivateKey getPrivateKey() { + return keyPair.getPrivate(); + } +} diff --git a/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/SM2Utils.java b/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/SM2Utils.java new file mode 100644 index 0000000..fc205c1 --- /dev/null +++ b/ai-xuebao-admin/src/main/java/net/hzvtc/web/utils/SM2Utils.java @@ -0,0 +1,123 @@ +package net.hzvtc.web.utils; + +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.SM2; +import org.bouncycastle.crypto.engines.SM2Engine; +import org.bouncycastle.crypto.params.ECDomainParameters; +import org.bouncycastle.crypto.params.ECPrivateKeyParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.crypto.params.ParametersWithRandom; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.math.ec.ECCurve; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.util.encoders.Hex; + +import java.math.BigInteger; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.SecureRandom; +import java.util.Arrays; + +public class SM2Utils { + + + // 手动定义 SM2 国密曲线参数(p, a, b, n, h, Gx, Gy) + private static final ECDomainParameters SM2_DOMAIN_PARAMS = createSm2DomainParameters(); + + private static ECDomainParameters createSm2DomainParameters() { + // 素数域 p + BigInteger p = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", 16); + // 曲线系数 a + BigInteger a = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", 16); + // 曲线系数 b + BigInteger b = new BigInteger("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", 16); + // 基点 G 的 x 坐标 + BigInteger gx = new BigInteger("32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", 16); + // 基点 G 的 y 坐标 + BigInteger gy = new BigInteger("BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", 16); + // 阶 n + BigInteger n = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", 16); + // 余因子 h = 1 + BigInteger h = BigInteger.ONE; + + // 构造曲线 + ECCurve.Fp curve = new ECCurve.Fp(p, a, b, n, h); + ECPoint g = curve.createPoint(gx, gy); + + return new ECDomainParameters(curve, g, n, h); + } + + // 加密 + public static byte[] encrypt(String hexData, PublicKey publicKey) throws Exception { + byte[] data = HexUtils.fromHex(hexData); + SM2Engine engine = new SM2Engine(); + ECPublicKeyParameters pubKeyParams = new ECPublicKeyParameters( + ((BCECPublicKey) publicKey).getQ(), + SM2_DOMAIN_PARAMS + ); + engine.init(true, new ParametersWithRandom(pubKeyParams, new SecureRandom())); + return engine.processBlock(data, 0, data.length); + } + + public static byte[] decryptC1C2C3(String hexData, PrivateKey privateKey) throws Exception { + byte[] c1c2c3 = HexUtils.fromHex(hexData); + int c1Len = 65; + int c3Len = 32; + int c2Len = c1c2c3.length - c1Len - c3Len; + + byte[] c1 = Arrays.copyOfRange(c1c2c3, 0, c1Len); + byte[] c2 = Arrays.copyOfRange(c1c2c3, c1Len, c1Len + c2Len); + byte[] c3 = Arrays.copyOfRange(c1c2c3, c1Len + c2Len, c1c2c3.length); + + // 重组为 C1C3C2 + byte[] c1c3c2 = new byte[c1c2c3.length]; + System.arraycopy(c1, 0, c1c3c2, 0, c1Len); + System.arraycopy(c3, 0, c1c3c2, c1Len, c3Len); + System.arraycopy(c2, 0, c1c3c2, c1Len + c3Len, c2Len); + String c1c3c2Hex = Hex.toHexString(c1c3c2).toLowerCase(); + return SM2Utils.decrypt(c1c3c2Hex, privateKey); + } + + // 解密 + public static byte[] decrypt(String hexData, PrivateKey privateKey) throws Exception { + byte[] encryptedData = HexUtils.fromHex(hexData); + SM2Engine engine = new SM2Engine(); + ECPrivateKeyParameters privKeyParams = new ECPrivateKeyParameters( + ((BCECPrivateKey) privateKey).getD(), + SM2_DOMAIN_PARAMS + ); + engine.init(false, privKeyParams); + return engine.processBlock(encryptedData, 0, encryptedData.length); + } + + private static String getPrivateKeyString(PrivateKey privateKey) { + BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey; + BigInteger privateKeyD = bcecPrivateKey.getD(); + String privateKeyStr = privateKeyD.toString(16); + return privateKeyStr; + } + + private static String getPublicKeyString(PublicKey publicKey) { + BCECPublicKey pub = (BCECPublicKey) publicKey; + byte[] encoded = pub.getQ().getEncoded(false); // false = uncompressed → 自动加 04 + return Hex.toHexString(encoded); + } + + public static String decrypt(String str, PrivateKey privateKey, PublicKey publicKey) { + try { + System.out.println("str:" + str); + String publicKeyString = getPublicKeyString(publicKey); +// System.out.println("publicKeyString:" + publicKeyString); + String privateKeyString = getPrivateKeyString(privateKey); +// System.out.println("privateKeyString:" + privateKeyString); + SM2 sm2 = new SM2(privateKeyString, publicKeyString); +// SM2 sm2 = new SM2("2cd182b3e68363fea171fe2162aab87f842b74c96c48528e9906ddaf9b848d1e", "04d744e48e4ad75548d005d117d3d75d793fa34ccba58984293d3ca590493de2bb017f6404f5a5a989019ed6847c8bb858e8d07c2b3ac432669f4ccd59e549013c"); +// sm2.setMode(SM2Engine.Mode.C1C3C2); + return sm2.decryptStr(str, KeyType.PrivateKey); + } catch (Exception e) { + throw new RuntimeException("sm2解密失败" + e); + } + } + +} \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/META-INF/spring-devtools.properties b/ai-xuebao-admin/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..2b23f85 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson.*.jar \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application-dev.yml b/ai-xuebao-admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..7d011b6 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-dev.yml @@ -0,0 +1,172 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiAnimal + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2022-2024 + # 实例演示开关 + demoEnabled: false + # 文件路径 + profile: D:/message/bird + birdMediaPath: D:/message/bird + birdImagePath: D:/message/bird + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: D:\project\aibird\project\template\ + dailyReportFileOutPath: D:\project\aibird\project\report\ + cameraSnapshopFilePath: D:\message\bird\images\snapshop\ + observationFilePath: D:\message\bird\observation\ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://semi-ai.tech:9099 + videoBasePath: E:/data5 + videoInferBasePath: E:/data5/labeled +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ai-xuebao-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + # url: jdbc:mysql://localhost:3306/ai-bird-db-server?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: semiAiBird123 + # password: l/e9anIszcsjpFyUvBjbX6t5tOT2lNGm5dXNrfHVAL+2P1F3dZYTcFihaJBXMnplAJ8dhp94K94RUXMpD2i4dw== + # filters: config + # connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + # elastic: + # username: elastic + # password: wofQfEhTZWhq-+CqEbL3 + # username: aibird + # password: aibird123 + #password: Semi_Aibird*123$ + # hosts: 127.0.0.1:9200 + # hosts: semi-ai.tech:20007:9200 + # port: 9200 + # http: https + # apiKey: OU83aHVwQUJiZ3BELUFiOFdaamU6T214YnhJY1dRcWFKMktmcDhKc0I5UQ== + # certName: es_ca.crt +# elastic: +# username: elastic +# password: wofQfEhTZWhq-+CqEbL3 +# hosts: 127.0.0.1:9200 +# http: https +# apiKey: OU83aHVwQUJiZ3BELUFiOFdaamU6T214YnhJY1dRcWFKMktmcDhKc0I5UQ== +# certName: http_ca.crt +# hosts: zkzh.ykz-ai.com:60007 + elastic: + #username: elastic + #password: OjNq8y*ck337qcWXmrg2 + username: elastic + password: jh0um3=KDYYADhqArYC- + hosts: zkzh.ykz-ai.com:60007 + # port: 9200 + http: https + apiKey: R3RkY0I1RUJaYTMtRWdUdEJZM1A6OFg4M1FlMFdRdHFsdjZkQXlMalJJdw== + certName: es_ca_prod_lf.crt + + + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + + kafka: + bootstrapServers: localhost:9092 + topic: + FileProcessRequest: file_process_request_topic + FileProcessVideoResponse: file_process_video_response_topic + FileProcessImageResponse: file_process_image_response_topic + CameraUploadRequest: camera_upload_request_topic + CameraProcessRequest: camera_process_request_topic + CameraProcessFinishResponse: camera_process_finish_response_topic + consumer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringDeserializer + valueDserializer: org.apache.kafka.common.serialization.StringDeserializer + producer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringSerializer + valueDserializer: org.apache.kafka.common.serialization.StringSerializer + +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ8oUYRIPIZi4FNM6OZjV9eNC3jPngmr6T+vOawnvLNwtim3lujZGmlenAd6HnNWzbZN+BOkOep1Wxmu+yVo0q8CAwEAAQ== +# 日志配置 +logging: + level: + net.hzvtc: debug + org.springframework: warn \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application-druid-product.yml b/ai-xuebao-admin/src/main/resources/application-druid-product.yml new file mode 100644 index 0000000..e356cea --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-druid-product.yml @@ -0,0 +1,61 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ai-bird-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: l/e9anIszcsjpFyUvBjbX6t5tOT2lNGm5dXNrfHVAL+2P1F3dZYTcFihaJBXMnplAJ8dhp94K94RUXMpD2i4dw== + filters: config + connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root123 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOmv7xNg5aqMTeQAW48cLTv0B9/IGAGkfMG/cZU27rW9SMNGmDgllAWB50xAaYlkSYJXq1LqWBSWpScpoiHoDkCAwEAAQ== \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application-druid.yml b/ai-xuebao-admin/src/main/resources/application-druid.yml new file mode 100644 index 0000000..699ea56 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-druid.yml @@ -0,0 +1,62 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + # url: jdbc:mysql://localhost:3306/ai-bird-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/ai-bird-db-server?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: dKhqXaMKzKKTbY2/vHq8WxfD/5T8DnZnEwBsSl1rmCGGtRrPuuu51PBHRG0JywJRhSyHI50haZUdZwPVIycG2g== + filters: config + connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ8oUYRIPIZi4FNM6OZjV9eNC3jPngmr6T+vOawnvLNwtim3lujZGmlenAd6HnNWzbZN+BOkOep1Wxmu+yVo0q8CAwEAAQ== diff --git a/ai-xuebao-admin/src/main/resources/application-jxsdb.yml b/ai-xuebao-admin/src/main/resources/application-jxsdb.yml new file mode 100644 index 0000000..58a08d8 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-jxsdb.yml @@ -0,0 +1,118 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiBird + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: false + profile: /data5/file + birdMediaPath: /data5/file/ + birdImagePath: /data5/file/ + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: /data5/file/template/ + dailyReportFileOutPath: /data5/file/excel/ + cameraSnapshopFilePath: /data5/file/images/snapshot/ + observationFilePath: /data5/file/images/observation/ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://semi-ai.tech:9099 + +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ai-bird-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: l/e9anIszcsjpFyUvBjbX6t5tOT2lNGm5dXNrfHVAL+2P1F3dZYTcFihaJBXMnplAJ8dhp94K94RUXMpD2i4dw== + filters: config + connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root123 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: aibird123 + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOmv7xNg5aqMTeQAW48cLTv0B9/IGAGkfMG/cZU27rW9SMNGmDgllAWB50xAaYlkSYJXq1LqWBSWpScpoiHoDkCAwEAAQ== + +# 日志配置 +logging: + level: + net.hzvtc: debug + org.springframework: warn \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application-prod.yml b/ai-xuebao-admin/src/main/resources/application-prod.yml new file mode 100644 index 0000000..3a6c57f --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-prod.yml @@ -0,0 +1,145 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiBird + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: false + profile: /data5/file + birdMediaPath: /data5/file/ + birdImagePath: /data5/file/ + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: /data5/file/template/ + dailyReportFileOutPath: /data5/file/excel/ + cameraSnapshopFilePath: /data5/file/images/snapshot/ + observationFilePath: /data5/file/images/observation/ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://semi-ai.tech:9099 + +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ai-bird-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: l/e9anIszcsjpFyUvBjbX6t5tOT2lNGm5dXNrfHVAL+2P1F3dZYTcFihaJBXMnplAJ8dhp94K94RUXMpD2i4dw== + filters: config + connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root123 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + elastic: + #username: elastic + #password: OjNq8y*ck337qcWXmrg2 + username: aibird + password: Semi_Aibird*123$ + hosts: 127.0.0.1:9200 + # port: 9200 + http: https + apiKey: R3RkY0I1RUJaYTMtRWdUdEJZM1A6OFg4M1FlMFdRdHFsdjZkQXlMalJJdw== + certName: es_ca_server.crt + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + kafka: + bootstrapServers: 172.16.8.253:9092 + topic: + FileProcessRequest: file_process_request_topic + FileProcessVideoResponse: file_process_video_response_topic + FileProcessImageResponse: file_process_image_response_topic + CameraProcessRequest: camera_process_request_topic + CameraProcessResponse: camera_process_response_topic + consumer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringDeserializer + valueDserializer: org.apache.kafka.common.serialization.StringDeserializer + producer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringSerializer + valueDserializer: org.apache.kafka.common.serialization.StringSerializer + + +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOmv7xNg5aqMTeQAW48cLTv0B9/IGAGkfMG/cZU27rW9SMNGmDgllAWB50xAaYlkSYJXq1LqWBSWpScpoiHoDkCAwEAAQ== + +# 日志配置 +logging: + level: + net.hzvtc: debug + org.springframework: warn \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application-prodlf.yml b/ai-xuebao-admin/src/main/resources/application-prodlf.yml new file mode 100644 index 0000000..0977091 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-prodlf.yml @@ -0,0 +1,145 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiBird + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: false + profile: /data5/file + birdMediaPath: /data5/file/ + birdImagePath: /data5/file/ + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: /data5/file/template/ + dailyReportFileOutPath: /data5/file/excel/ + cameraSnapshopFilePath: /data5/file/images/snapshot/ + observationFilePath: /data5/file/images/observation/ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://semi-ai.tech:9099 + +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ai-bird-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: l/e9anIszcsjpFyUvBjbX6t5tOT2lNGm5dXNrfHVAL+2P1F3dZYTcFihaJBXMnplAJ8dhp94K94RUXMpD2i4dw== + filters: config + connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root123 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + elastic: + #username: elastic + #password: OjNq8y*ck337qcWXmrg2 + username: elastic + password: jh0um3=KDYYADhqArYC- + hosts: 127.0.0.1:9200 + # port: 9200 + http: https + apiKey: R3RkY0I1RUJaYTMtRWdUdEJZM1A6OFg4M1FlMFdRdHFsdjZkQXlMalJJdw== + certName: es_ca_prod_lf.crt + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + kafka: + bootstrapServers: 172.16.8.253:9092 + topic: + FileProcessRequest: file_process_request_topic + FileProcessVideoResponse: file_process_video_response_topic + FileProcessImageResponse: file_process_image_response_topic + CameraProcessRequest: camera_process_request_topic + CameraProcessResponse: camera_process_response_topic + consumer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringDeserializer + valueDserializer: org.apache.kafka.common.serialization.StringDeserializer + producer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringSerializer + valueDserializer: org.apache.kafka.common.serialization.StringSerializer + + +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOmv7xNg5aqMTeQAW48cLTv0B9/IGAGkfMG/cZU27rW9SMNGmDgllAWB50xAaYlkSYJXq1LqWBSWpScpoiHoDkCAwEAAQ== + +# 日志配置 +logging: + level: + net.hzvtc: debug + org.springframework: warn \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application-pyh.yml b/ai-xuebao-admin/src/main/resources/application-pyh.yml new file mode 100644 index 0000000..261dd98 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-pyh.yml @@ -0,0 +1,140 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiBird + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: false + profile: /data/file + birdMediaPath: /data/file/ + birdImagePath: /data/file/ + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: /data/file/template/ + dailyReportFileOutPath: /data/file/excel/ + cameraSnapshopFilePath: /data/file/images/snapshot/ + observationFilePath: /data/file/images/observation/ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://223.83.100.204:9099 + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + 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: + net.hzvtc: debug + org.springframework: warn + +# Spring配置 +spring: + # 资源信息 + mvc: + pathmatch: + matching-strategy: ant_path_matcher + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: druid + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + jackson: + default-property-inclusion: non_null + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: Aibird123654 + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 300 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: net.hzvtc.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# 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/* diff --git a/ai-xuebao-admin/src/main/resources/application-shunyi.yml b/ai-xuebao-admin/src/main/resources/application-shunyi.yml new file mode 100644 index 0000000..a9feffe --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-shunyi.yml @@ -0,0 +1,118 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiBird + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: false + profile: /data5/file + birdMediaPath: /data5/file/ + birdImagePath: /data5/file/ + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: /data5/file/template/ + dailyReportFileOutPath: /data5/file/excel/ + cameraSnapshopFilePath: /data5/file/images/snapshot/ + observationFilePath: /data5/file/images/observation/ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://semi-ai.tech:9099 + +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ai-bird-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: l/e9anIszcsjpFyUvBjbX6t5tOT2lNGm5dXNrfHVAL+2P1F3dZYTcFihaJBXMnplAJ8dhp94K94RUXMpD2i4dw== + filters: config + connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root123 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOmv7xNg5aqMTeQAW48cLTv0B9/IGAGkfMG/cZU27rW9SMNGmDgllAWB50xAaYlkSYJXq1LqWBSWpScpoiHoDkCAwEAAQ== + +# 日志配置 +logging: + level: + net.hzvtc: debug + org.springframework: warn \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application-xuebao.yml b/ai-xuebao-admin/src/main/resources/application-xuebao.yml new file mode 100644 index 0000000..3c919c3 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application-xuebao.yml @@ -0,0 +1,147 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiBird + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: false + profile: /storage2/file + birdMediaPath: /storage2/file/ + birdImagePath: /storage2/file/ + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: /storage2/file/template/ + dailyReportFileOutPath: /storage2/file/excel/ + cameraSnapshopFilePath: /storage2/file/images/snapshot/ + observationFilePath: /storage2/file/images/observation/ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://semi-ai.tech:9099 + videoBasePath: /storage2/file/xuebao + videoInferBasePath: /storage2/file/xuebao/labeled + +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://localhost:3306/ai-xuebao-db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: l/e9anIszcsjpFyUvBjbX6t5tOT2lNGm5dXNrfHVAL+2P1F3dZYTcFihaJBXMnplAJ8dhp94K94RUXMpD2i4dw== + filters: config + connection-properties: 'config.decrypt=true;config.decrypt.key=${publickey}' + + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 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: root + login-password: root123 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + elastic: + #username: elastic + #password: OjNq8y*ck337qcWXmrg2 + username: elastic + password: jh0um3=KDYYADhqArYC- + hosts: 127.0.0.1:9200 + # port: 9200 + http: https + apiKey: R3RkY0I1RUJaYTMtRWdUdEJZM1A6OFg4M1FlMFdRdHFsdjZkQXlMalJJdw== + certName: es_ca_prod_lf.crt + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: Aibird123654 + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + kafka: + bootstrapServers: 127.0.0.1:8190 + topic: + FileProcessRequest: file_process_request_topic + FileProcessVideoResponse: file_process_video_response_topic + FileProcessImageResponse: file_process_image_response_topic + CameraUploadRequest: camera_upload_request_topic + CameraProcessRequest: camera_process_request_topic + CameraProcessFinishResponse: camera_process_finish_response_topic + consumer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringDeserializer + valueDserializer: org.apache.kafka.common.serialization.StringDeserializer + producer: + groupId: VideoInferMessage + keyDeserializer: org.apache.kafka.common.serialization.StringSerializer + valueDserializer: org.apache.kafka.common.serialization.StringSerializer + +publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKOmv7xNg5aqMTeQAW48cLTv0B9/IGAGkfMG/cZU27rW9SMNGmDgllAWB50xAaYlkSYJXq1LqWBSWpScpoiHoDkCAwEAAQ== + +# 日志配置 +logging: + level: + net.hzvtc: debug + org.springframework: warn \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/application.bak.yml b/ai-xuebao-admin/src/main/resources/application.bak.yml new file mode 100644 index 0000000..7b86d63 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application.bak.yml @@ -0,0 +1,147 @@ +# 项目相关配置 +hzvtc: + # 名称 + name: AiBird + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2022 + # 实例演示开关 + demoEnabled: true + # 文件路径 示例( Windows配置D:/hzvtc/uploadPath,Linux配置 /home/hzvtc/uploadPath) + profile: D:/message/bird + birdMediaPath: D:/message/bird + birdImagePath: D:/message/bird + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math + dailyReportFilePath: D:\project\aibird\project\template\ + dailyReportFileOutPath: D:\project\aibird\project\report\ + cameraSnapshopFilePath: D:\message\bird\images\snapshop\ + observationFilePath: D:\message\bird\observation\ + observationTokenUrl: http://semi-ai.tech:19101/v1/getAccessToken + observationImgCheckUrl: http://semi-ai.tech:19101/v2/detImg + fileServerUrl: http://semi-ai.tech:9099 +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + 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: + net.hzvtc: debug + org.springframework: warn + +# Spring配置 +spring: + # 资源信息 + # main: + # allow-circular-references: true + mvc: + pathmatch: + matching-strategy: ant_path_matcher + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: druid + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + jackson: + default-property-inclusion: non_null + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + mail: + #host: smtp.yeah.net + #username: dannyxu@yeah.net + #password: TSSTWAQFNYLGPMTT + host: smtp.163.com + username: aisemibird@163.com + password: VDRSLZUDDXGQMGVJ + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + #secret: abcdefghijklmnopqrstuvwxyz + secret: SemiksFKLJISJFKLFKWJFQFIQWIOFJQOFFQGGSDGFFJIQOEUFIEJFIOQWEFHFQOK5FKOIQWUFFEFE423FIQEOFJHUEWHFKASKDLQWJIFSJDJKFHJBIRD + # 令牌有效期(默认30分钟) + expireTime: 300 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: net.hzvtc.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + # helperDialect: mysql + helperDialect: net.hzvtc.framework.datasource.MySqlDialectCustom + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* diff --git a/ai-xuebao-admin/src/main/resources/application.yml b/ai-xuebao-admin/src/main/resources/application.yml new file mode 100644 index 0000000..ad82c5b --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/application.yml @@ -0,0 +1,87 @@ +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# Spring配置 +spring: + # 资源信息 + # main: + # allow-circular-references: true + mvc: + pathmatch: + matching-strategy: ant_path_matcher + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: dev + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + jackson: + default-property-inclusion: non_null + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + #secret: abcdefghijklmnopqrstuvwxyz + secret: SemiksFKLJISJFKLFKWJFQFIQWIOFJQOFFQGGSDGFFJIQOEUFIEJFIOQWEFHFQOK5FKOIQWUFFEFE423FIQEOFJHUEWHFKASKDLQWJIFSJDJKFHJBIRD + # 令牌有效期(默认30分钟) + expireTime: 300 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: net.hzvtc.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + # helperDialect: mysql + helperDialect: net.hzvtc.framework.datasource.MySqlDialectCustom + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* diff --git a/ai-xuebao-admin/src/main/resources/banner.txt b/ai-xuebao-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..7a04880 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Application Version: ${hzvtc.version} +Spring Boot Version: ${spring-boot.version} \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/es_ca_prod_lf.crt b/ai-xuebao-admin/src/main/resources/es_ca_prod_lf.crt new file mode 100644 index 0000000..35319b9 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/es_ca_prod_lf.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIUSmP7bU0KDraxwenDLrLCNeStIJowDQYJKoZIhvcNAQEL +BQAwPDE6MDgGA1UEAxMxRWxhc3RpY3NlYXJjaCBzZWN1cml0eSBhdXRvLWNvbmZp +Z3VyYXRpb24gSFRUUCBDQTAeFw0yNTExMjcwMjUxNTdaFw0yODExMjYwMjUxNTda +MDwxOjA4BgNVBAMTMUVsYXN0aWNzZWFyY2ggc2VjdXJpdHkgYXV0by1jb25maWd1 +cmF0aW9uIEhUVFAgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk +lrA+nYRUuz3/MpGK7jfnJvlVVn4amkvCeEEy0x9t3fDkQ/4yLyjHMy0GhWk3W3RO +60TpZtufpZ7fogAb+QfeQPp5T/Ewm6Zmp/QjP+czT8BforiD0eXcocJmkBIcDI/K +6Vn+ECersIFyXhoxhf8+DrQJdkzgFCwI9nEzzCTP8fE6hALSAaxw/XhS1f+W904a +JaO5q2JyBYOtE6bZcJE8jDzt74Bq0TXoHwdcnSHXMIl2APt2IgE2+XIzXW0CO71i +WtSE/HmiAaxSYVBUaVK3JhsQO2A585MoNYFs9qTEUYEtcFw3XhKf8Rx3XmRLYDkG +vSvvytUfITN1UeQcIcBZwyzIT/MV0dfiZxABwZ/F/UMq+5eq9mPehEFPagOB4Fe1 +opIH6mpcPXF2VvBXFmeEfs6byLjPdKYX0azzGfR+bQlxrvmaUlDOCWquCRBE9Zgz +zwnDRFKmDpOr5tzIU5O23trQLj1jZMFCM0JwbyPY7KWCA4ttbBrpWHlKxaCgek2i +2CQdrbTbs44lbZqKAx5LD/jI/dclAdCZWfo7tqCbIspnIlf0zDBuSxnta1Apcfui +Ed1a6kU9wItQDU31HpD5sUO2nDxBaoq4Rp9DwtWUvJPUelF6jTCQ4ZeIvhBYDJJg +BSEeLLxHsB7jU0V97tKILoYxoTPHF0tybLzfBQl16wIDAQABo1MwUTAdBgNVHQ4E +FgQUuDQsr+I0HrilldvRWnfTwpMqf8IwHwYDVR0jBBgwFoAUuDQsr+I0HrilldvR +WnfTwpMqf8IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAqKdY +n/0KyKEwJEbIzM9vF/NB6pocY0QFNmf8iZ0RycV62EkAmtGxJt8fcMibOOVXoMZx +vDSFU+O7eKrYVPl2yI0XSjW+2Vfnpu3NkymrkrpiWaMTtXagSSqtHu9p39QV0nKF +NJNtrrz31EgfVe+ClhPCc/q5LHAFGE8ebknWiMnSzurbdE2C7I1ol/9gH03OBdq3 +fSC3C0LkA/H4yOhrR0yWPbAKQDpgrQFHHS0BqbDW3LO3qWzr2vS1SJMEnSET6zPR +l7E5AgTLj9CotVivz3grNzbHmqCOri3aTus4Y0b0DosA8rdprg7YcjlfiinKd+nY +qvjWB7TtfstHamuHAwOywBnj4hI1ESAflF1R1IqORL/lZjhjVHUxZIh5gvV/5RWd +4EkixWqc+PxXRIjGkuV5+4eDHZThjw+oly0BpA46IIH0sLcwW+jnr8qS2gNPoXjm +a3lZJF+c8sSUjoqwmvgxFb5Xa18ULjJZR5llOxj99y8NBXUbLzRkihFtMsxOclPm +lQx+8XFS3OVi7moPV7zCLS++PopBv9w0FkuhqcR3i1u97M4oilC345YbVW5Ec2WC +qfARQoTW4b+ZkJxyMFw7p5D+zMep7Ev7TWCQOkA26m6bkM3Z3KYlLwWKenoqMl1w +K/EWMmGmvvEwNyxSeU6cpefqIEOeUaLqgA3vIA0= +-----END CERTIFICATE----- diff --git a/ai-xuebao-admin/src/main/resources/es_ca_server.crt b/ai-xuebao-admin/src/main/resources/es_ca_server.crt new file mode 100644 index 0000000..627524a --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/es_ca_server.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIUSIljr8sHsOSVpGEnulyHwIU1au0wDQYJKoZIhvcNAQEL +BQAwPDE6MDgGA1UEAxMxRWxhc3RpY3NlYXJjaCBzZWN1cml0eSBhdXRvLWNvbmZp +Z3VyYXRpb24gSFRUUCBDQTAeFw0yNDA3MzEwMjQ4MjZaFw0yNzA3MzEwMjQ4MjZa +MDwxOjA4BgNVBAMTMUVsYXN0aWNzZWFyY2ggc2VjdXJpdHkgYXV0by1jb25maWd1 +cmF0aW9uIEhUVFAgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCN +/nnBG0Ljres5Y9b6gjNKauEYZWTAzJCGG7E7no7siwjYnwlnNqiD0kwAcdtICkjv +9uOHXGdfeExh1BQFtaWqbvCA3k8h/lilmXa+fF3xYxvetBUC1clwQl/YtGO02pPg +9vKHIq5q24xzVrMfHyY2xdITvv7fbSXUvQKFJmaGN3+5V8vKQK6KT+YY9ic9LJi1 +MD8e4CPG654XJEDMysogU2MXoW9NFTqCS7K2u49P0VfBnfqeJRQGpKMZrLRGo1zu +bZgOZdWsY1TQ/IOwbsmH2GXw995/u0R+kKpcl3ViWm+2ErUckktVUzh2f4LCPhwZ +C5ds8yhMP/WfDnrWSDwPTTptLLczgxsuYk36M6RFBF+jUd23yZJvJxGXde6zzplc +OQLNtHByUKMCq8EoS691ufJqWMMCHb1H2OQHEPRGxcgtQ1hpjz13GEelnUF3MGlD +DPiNfmRvD4IBojmh21SfuDGPZxIoIrhMt2XaC0eaq+soKJGReer5l6Q9Wh+b5s4U +HJ2yEg57VjW5Dwshad1RnD8WhV4UD1fEthGNGfMQZvNZyezA4dwHp5SthbOYgbHF +QU8ByTRcxNPsx64IIXYa0RqjyBVaD2OL7YJEYsO+PbAsCyVXtr/4h/q7fmkKNX4N +ArAtyvrDVqtYjwmGFix7l8G1GXbJAf9abci4aPGiOQIDAQABo1MwUTAdBgNVHQ4E +FgQUnqBxAJLZymZOICjUmjWXcKfk+v0wHwYDVR0jBBgwFoAUnqBxAJLZymZOICjU +mjWXcKfk+v0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATy/M +7kgdZrg61PgeUrzsqTLwFRV559j7deZ8K+bRofwL5vQJ14w6fuoqipLXxTq3obS3 +dQvO1xx1p2AHn8nu4d29CW8PUzZFD52ZHdU8gxVF5dUCnbF3b15d2CKoivSVSHpl +0R6SwuyhnWeaV2ue0/0H+KBlbB1pl94wNw+eSLCL/m8k68DnI+qY5skLZpfxjcoc +mEG8EckHoO3+JKshj6darBS+I5QmmbBrFzB/AJN9YbrM0OjqEC3u1SYWEPwinv4G +H9rSZC0wP8xjKVGjVub8C4Fkz+StWucotBrD3aadao09Sovrs7GmLFgmObrzuP/N +HPD+tq6sFXfDV0tnKu4EMM+GNsp9wHyASBpasbbYWSy9gjK080kzq7WjfmcBYPU0 +8/nsGH7vBrQvh5XU2zRiuRmHZnpaXpjbmD9LG69yoYI1vNlK6/qrBXVFm2zZ2bRa +UW4B1kY3avj0DvsA2ggYZDeln9pIvt6364tbqZZa9w0KRXzRcKW3zUjmjqTQgtuy +C2KvRF+vQk6BzHG8Szxi8sRLzoNaUsketbB526mjyq0I9+Q/Yjp07iobfZBCcydw +KLfmTthicyQAruDdUXltXSnuEXP8fJXHm1qSERRfOnKWy3tDJCF1u6C/di5HeOKq +dILlQH26K7yRlUcDpQZelnaHdruDmXBREClOMns= +-----END CERTIFICATE----- diff --git a/ai-xuebao-admin/src/main/resources/http_ca.crt b/ai-xuebao-admin/src/main/resources/http_ca.crt new file mode 100644 index 0000000..6113287 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/http_ca.crt @@ -0,0 +1,25 @@ +Bag Attributes + friendlyName: ca + Trusted key usage (Oracle): Any Extended Key Usage (2.5.29.37.0) +subject=CN=Elastic Certificate Tool Autogenerated CA +issuer=CN=Elastic Certificate Tool Autogenerated CA +-----BEGIN CERTIFICATE----- +MIIDSTCCAjGgAwIBAgIUB5MzF6q4j6a2b6koAKMxSu22yfEwDQYJKoZIhvcNAQEL +BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l +cmF0ZWQgQ0EwHhcNMjYwMzIxMTAzNzUxWhcNMzYwMzE4MTAzNzUxWjA0MTIwMAYD +VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIxrLRj41wxzcXRv97/nQLZw +oisEQ6lXSsBpfBid8nMPF7Pw6M7/l73CRpBNt66NLO0djwRUcGXDhWLwEu6IKjkZ +0Jh0ZKwk4M1aKWC055QzJdAyOyhvJsHB1dJ+yPWfjnLoZwJxFVdxOD/v5HHQMy5s +WMc9o2AMdmorxpiw6Ooo7fVEfaRc8ZVHV57a/9KetsXHyh+VWfBRPyibF/4u6eYi +q6tMhgxBEmeZB7prps4RUFNOwMHeQeOBFpjabfAHboHqKaMC41RKPcOrEWtkAjYD +g/Z75k9o9kS/ijWic05Y2AGc1+GzxmlxyJ1Hy20RHyc+69TEKk5rd3x4flcxK5UC +AwEAAaNTMFEwHQYDVR0OBBYEFBSrDkijESS09gXG/9uW1sZXoAbgMB8GA1UdIwQY +MBaAFBSrDkijESS09gXG/9uW1sZXoAbgMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAHFKfdWsqgdIUECtZs1yDS2a5hjFNrRw57p1KxrTMaTiaXZn +kv76jddLPfxWz/YTg8Lohiq+ltqsFfWhXJBo2LHsMvCh2Mxj2zswRcS2O/g0QEMt +Ug5nvBZJkTMlbc63KviRZLGC3s7SmKN6GFHHa+Hn4y+duWbGf85/XS/SeN5IXRpi +iW0qYdYKTF1zb5bOKCOGp9JyqZrQ1DX6dTiB4Vxa/tqRZFZ3V7gLMOLY1Yt58XKR +o6PqKLOIREKbOaE0stlZgIyabkJoC8oTuO5LfHD0Qj3hSMV1Anqwsp7uWYNWjx+U +FnygrvWn7kg342ZW5BugwjeiX7F4PU0109FqWBA= +-----END CERTIFICATE----- diff --git a/ai-xuebao-admin/src/main/resources/i18n/messages.properties b/ai-xuebao-admin/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..2d4d629 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/i18n/messages.properties @@ -0,0 +1,35 @@ +#错误消息 +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}次,帐户锁定10分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +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=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{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}] +no.portal.login=无大屏系统使用权限,请联系管理员添加权限 +no.web.login=无web系统使用权限,请联系管理员添加权限 +no.login.permission=无系统使用权限,请联系管理员添加权限 diff --git a/ai-xuebao-admin/src/main/resources/logback-product.xml b/ai-xuebao-admin/src/main/resources/logback-product.xml new file mode 100644 index 0000000..d0fe7b1 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/logback-product.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/logback-pyh.xml b/ai-xuebao-admin/src/main/resources/logback-pyh.xml new file mode 100644 index 0000000..a362522 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/logback-pyh.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/logback.xml b/ai-xuebao-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..a185242 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ai-xuebao-admin/src/main/resources/mybatis/mybatis-config.xml b/ai-xuebao-admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..ac47c03 --- /dev/null +++ b/ai-xuebao-admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + +