feat:合并代码

main
chenhao 2024-11-01 10:17:20 +08:00
commit 13685b08e5
342 changed files with 42435 additions and 23 deletions

1
.github/FUNDING.yml vendored 100644
View File

@ -0,0 +1 @@
custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html

68
.gitignore vendored
View File

@ -1,26 +1,48 @@
# ---> Java
# Compiled class file
*.class
######################################################################
# Build Tools
# Log file
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
*.swp
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
!*/build/*.java
!*/build/*.html
!*/build/*.xml
/ruoyi-ui/

20
LICENSE 100644
View File

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2018 RuoYi
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

12
bin/clean.bat 100644
View File

@ -0,0 +1,12 @@
@echo off
echo.
echo [信息] 清理工程target生成路径。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean
pause

12
bin/package.bat 100644
View File

@ -0,0 +1,12 @@
@echo off
echo.
echo [信息] 打包Web工程生成war/jar包文件。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Dmaven.test.skip=true
pause

14
bin/run.bat 100644
View File

@ -0,0 +1,14 @@
@echo off
echo.
echo [信息] 使用Jar命令运行Web工程。
echo.
cd %~dp0
cd ../ruoyi-admin/target
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
java -jar %JAVA_OPTS% ruoyi-admin.jar
cd bin
pause

Binary file not shown.

101
pms-admin/pom.xml 100644
View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pms</artifactId>
<groupId>tech.unissense</groupId>
<version>3.8.8</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>pms-admin</artifactId>
<description>
web服务入口
</description>
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- swagger3-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<!-- 防止进入swagger页面报类型转换错误排除3.0.0中的引用手动增加1.6.2版本 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.6.2</version>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>tech.unissense</groupId>
<artifactId>pms-framework</artifactId>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>tech.unissense</groupId>
<artifactId>pms-business</artifactId>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>tech.unissense</groupId>
<artifactId>pms-quartz</artifactId>
</dependency>
<!-- 代码生成-->
<dependency>
<groupId>tech.unissense</groupId>
<artifactId>pms-generator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.15</version>
<configuration>
<fork>true</fork> <!-- 如果没有该配置devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>

View File

@ -0,0 +1,30 @@
package tech.unissense.pms;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
*
*
* @author ruoyi
*/
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
public static void main(String[] args)
{
// System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(RuoYiApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +
" .-------. ____ __ \n" +
" | _ _ \\ \\ \\ / / \n" +
" | ( ' ) | \\ _. / ' \n" +
" |(_ o _) / _( )_ .' \n" +
" | (_,_).' __ ___(_ o _)' \n" +
" | |\\ \\ | || |(_,_)' \n" +
" | | \\ `' /| `-' / \n" +
" | | \\ / \\ / \n" +
" ''-' `'-' `-..-' ");
}
}

View File

@ -0,0 +1,18 @@
package tech.unissense.pms;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* web
*
* @author ruoyi
*/
public class RuoYiServletInitializer extends SpringBootServletInitializer
{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
return application.sources(RuoYiApplication.class);
}
}

View File

@ -0,0 +1,152 @@
package tech.unissense.pms.web.controller.business.project;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import tech.unissense.pms.business.project.dto.ProjectQueryDto;
import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
import tech.unissense.pms.business.projectteam.service.IProjectTeamService;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.uuid.IdUtils;
import tech.unissense.pms.business.project.domain.Project;
import tech.unissense.pms.business.project.service.IProjectService;
import java.util.List;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/business/project")
public class ProjectController extends BaseController {
@Autowired
private IProjectService service;
@Autowired
private IProjectTeamService teamService;
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list")
public TableDataInfo list(Project project) {
startPage();
List<Project> projectList = service.permissisonList(project);
return getDataTable(projectList);
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/add")
@Log(title = "项目管理", businessType = BusinessType.INSERT)
public AjaxResult addData(@RequestBody Project project) {
service.insert(project);
return success(project);
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/updateCheck")
public AjaxResult updateCheck(@RequestBody Project project) {
return AjaxResult.success(service.updateCheck(project));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PutMapping("/update")
@Log(title = "项目管理", businessType = BusinessType.UPDATE)
public AjaxResult updateDate(@RequestBody Project project) {
service.update(project);
return success();
}
/**
*
*
* @return
*/
@GetMapping("/getCode")
public AjaxResult getCode() {
return AjaxResult.success("", IdUtils.fastUUID());
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "项目人员管理", businessType = BusinessType.DELETE)
@DeleteMapping("/team/{teamId}")
public AjaxResult teamRemove(@PathVariable Integer teamId) {
return toAjax(teamService.deleteById(teamId));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "项目人员管理", businessType = BusinessType.UPDATE)
@PostMapping("/team")
public AjaxResult personnelChanges(@RequestBody ProjectTeam team) {
return success(teamService.personnelChanges(team));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "项目管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{projectId}")
public AjaxResult remove(@PathVariable Integer projectId) {
return toAjax(service.deleteById(projectId));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@GetMapping("/{projectId}")
public AjaxResult getTeamInfo(@PathVariable Integer projectId) {
return success(service.getTeamInfo(projectId));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@GetMapping("/info/{projectId}")
public AjaxResult getProject(@PathVariable Integer projectId) {
return success(service.queryById(projectId));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@PostMapping("/executionInfo")
public AjaxResult executionInfo(@RequestBody WorkLogger workLogger) {
return success(service.executionInfo(workLogger));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@PostMapping("/workInfo")
public AjaxResult workInfo(@RequestBody ProjectQueryDto dto) {
return success(service.workInfo(dto));
}
}

View File

@ -0,0 +1,101 @@
package tech.unissense.pms.web.controller.business.work;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import tech.unissense.pms.business.project.domain.Project;
import tech.unissense.pms.business.project.service.IProjectService;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import tech.unissense.pms.business.work.logger.service.IWorkLoggerService;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.enums.BusinessType;
import java.util.List;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/business/work/hour")
public class WorkHourController extends BaseController {
@Autowired
private IWorkLoggerService service;
@Autowired
private IProjectService projectService;
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/add")
@Log(title = "工作日志", businessType = BusinessType.INSERT)
public AjaxResult addData(@RequestBody WorkLogger workLogger) {
service.insert(workLogger);
return success();
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@DeleteMapping("/{id}")
@Log(title = "工作日志", businessType = BusinessType.INSERT)
public AjaxResult deleteData(@PathVariable Integer id) {
service.deleteById(id);
return success();
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PutMapping("/update")
@Log(title = "工作日志", businessType = BusinessType.UPDATE)
public AjaxResult updateData(@RequestBody WorkLogger workLogger) {
service.update(workLogger);
return success();
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/getInfo")
public AjaxResult getInfo(@RequestBody WorkLogger workLogger) {
return success(service.getInfo(workLogger));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/remaining")
public AjaxResult remaining(@RequestBody WorkLogger workLogger) {
return AjaxResult.success(null,service.getRemaining(workLogger));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/calendar")
public AjaxResult calendar(@RequestBody WorkLogger workLogger) {
return success(service.calendar(workLogger));
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/project/{userId}")
public AjaxResult project(@PathVariable String userId ) {
List<Project> projects = projectService.listProjectByUser(userId);
return success(service.projectStatics(projects, userId));
}
}

View File

@ -0,0 +1,94 @@
package tech.unissense.pms.web.controller.common;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.code.kaptcha.Producer;
import tech.unissense.pms.common.config.RuoYiConfig;
import tech.unissense.pms.common.constant.CacheConstants;
import tech.unissense.pms.common.constant.Constants;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.redis.RedisCache;
import tech.unissense.pms.common.utils.sign.Base64;
import tech.unissense.pms.common.utils.uuid.IdUtils;
import tech.unissense.pms.system.service.ISysConfigService;
/**
*
*
* @author ruoyi
*/
@RestController
public class CaptchaController
{
@Resource(name = "captchaProducer")
private Producer captchaProducer;
@Resource(name = "captchaProducerMath")
private Producer captchaProducerMath;
@Autowired
private RedisCache redisCache;
@Autowired
private ISysConfigService configService;
/**
*
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
AjaxResult ajax = AjaxResult.success();
boolean captchaEnabled = configService.selectCaptchaEnabled();
ajax.put("captchaEnabled", captchaEnabled);
if (!captchaEnabled)
{
return ajax;
}
// 保存验证码信息
String uuid = IdUtils.simpleUUID();
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
String capStr = null, code = null;
BufferedImage image = null;
// 生成验证码
String captchaType = RuoYiConfig.getCaptchaType();
if ("math".equals(captchaType))
{
String capText = captchaProducerMath.createText();
capStr = capText.substring(0, capText.lastIndexOf("@"));
code = capText.substring(capText.lastIndexOf("@") + 1);
image = captchaProducerMath.createImage(capStr);
}
else if ("char".equals(captchaType))
{
capStr = code = captchaProducer.createText();
image = captchaProducer.createImage(capStr);
}
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
// 转换流信息写出
FastByteArrayOutputStream os = new FastByteArrayOutputStream();
try
{
ImageIO.write(image, "jpg", os);
}
catch (IOException e)
{
return AjaxResult.error(e.getMessage());
}
ajax.put("uuid", uuid);
ajax.put("img", Base64.encode(os.toByteArray()));
return ajax;
}
}

View File

@ -0,0 +1,163 @@
package tech.unissense.pms.web.controller.common;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import tech.unissense.pms.common.config.RuoYiConfig;
import tech.unissense.pms.common.constant.Constants;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.common.utils.file.FileUploadUtils;
import tech.unissense.pms.common.utils.file.FileUtils;
import tech.unissense.pms.framework.config.ServerConfig;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/common")
public class CommonController
{
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@Autowired
private ServerConfig serverConfig;
private static final String FILE_DELIMETER = ",";
/**
*
*
* @param fileName
* @param delete
*/
@GetMapping("/download")
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
{
try
{
if (!FileUtils.checkAllowDownload(fileName))
{
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
}
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
String filePath = RuoYiConfig.getDownloadPath() + fileName;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, realFileName);
FileUtils.writeBytes(filePath, response.getOutputStream());
if (delete)
{
FileUtils.deleteFile(filePath);
}
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
}
/**
*
*/
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
try
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("url", url);
ajax.put("fileName", fileName);
ajax.put("newFileName", FileUtils.getName(fileName));
ajax.put("originalFilename", file.getOriginalFilename());
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
/**
*
*/
@PostMapping("/uploads")
public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
{
try
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
List<String> urls = new ArrayList<String>();
List<String> fileNames = new ArrayList<String>();
List<String> newFileNames = new ArrayList<String>();
List<String> originalFilenames = new ArrayList<String>();
for (MultipartFile file : files)
{
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
urls.add(url);
fileNames.add(fileName);
newFileNames.add(FileUtils.getName(fileName));
originalFilenames.add(file.getOriginalFilename());
}
AjaxResult ajax = AjaxResult.success();
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
/**
*
*/
@GetMapping("/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
try
{
if (!FileUtils.checkAllowDownload(resource))
{
throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
}
// 本地资源路径
String localPath = RuoYiConfig.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
}
}

View File

@ -0,0 +1,121 @@
package tech.unissense.pms.web.controller.monitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.constant.CacheConstants;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.system.domain.SysCache;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/cache")
public class CacheController
{
@Autowired
private RedisTemplate<String, String> redisTemplate;
private final static List<SysCache> caches = new ArrayList<SysCache>();
{
caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping()
public AjaxResult getInfo() throws Exception
{
Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
Map<String, Object> result = new HashMap<>(3);
result.put("info", info);
result.put("dbSize", dbSize);
List<Map<String, String>> pieList = new ArrayList<>();
commandStats.stringPropertyNames().forEach(key -> {
Map<String, String> data = new HashMap<>(2);
String property = commandStats.getProperty(key);
data.put("name", StringUtils.removeStart(key, "cmdstat_"));
data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
pieList.add(data);
});
result.put("commandStats", pieList);
return AjaxResult.success(result);
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping("/getNames")
public AjaxResult cache()
{
return AjaxResult.success(caches);
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping("/getKeys/{cacheName}")
public AjaxResult getCacheKeys(@PathVariable String cacheName)
{
Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
return AjaxResult.success(new TreeSet<>(cacheKeys));
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping("/getValue/{cacheName}/{cacheKey}")
public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
{
String cacheValue = redisTemplate.opsForValue().get(cacheKey);
SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
return AjaxResult.success(sysCache);
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@DeleteMapping("/clearCacheName/{cacheName}")
public AjaxResult clearCacheName(@PathVariable String cacheName)
{
Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
redisTemplate.delete(cacheKeys);
return AjaxResult.success();
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@DeleteMapping("/clearCacheKey/{cacheKey}")
public AjaxResult clearCacheKey(@PathVariable String cacheKey)
{
redisTemplate.delete(cacheKey);
return AjaxResult.success();
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@DeleteMapping("/clearCacheAll")
public AjaxResult clearCacheAll()
{
Collection<String> cacheKeys = redisTemplate.keys("*");
redisTemplate.delete(cacheKeys);
return AjaxResult.success();
}
}

View File

@ -0,0 +1,27 @@
package tech.unissense.pms.web.controller.monitor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.framework.web.domain.Server;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/server")
public class ServerController
{
@PreAuthorize("@ss.hasPermi('monitor:server:list')")
@GetMapping()
public AjaxResult getInfo() throws Exception
{
Server server = new Server();
server.copyTo();
return AjaxResult.success(server);
}
}

View File

@ -0,0 +1,82 @@
package tech.unissense.pms.web.controller.monitor;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.framework.web.service.SysPasswordService;
import tech.unissense.pms.system.domain.SysLogininfor;
import tech.unissense.pms.system.service.ISysLogininforService;
/**
* 访
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/logininfor")
public class SysLogininforController extends BaseController
{
@Autowired
private ISysLogininforService logininforService;
@Autowired
private SysPasswordService passwordService;
@PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
@GetMapping("/list")
public TableDataInfo list(SysLogininfor logininfor)
{
startPage();
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
return getDataTable(list);
}
@Log(title = "登录日志", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysLogininfor logininfor)
{
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
util.exportExcel(response, list, "登录日志");
}
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
@Log(title = "登录日志", businessType = BusinessType.DELETE)
@DeleteMapping("/{infoIds}")
public AjaxResult remove(@PathVariable Long[] infoIds)
{
return toAjax(logininforService.deleteLogininforByIds(infoIds));
}
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
@Log(title = "登录日志", businessType = BusinessType.CLEAN)
@DeleteMapping("/clean")
public AjaxResult clean()
{
logininforService.cleanLogininfor();
return success();
}
@PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')")
@Log(title = "账户解锁", businessType = BusinessType.OTHER)
@GetMapping("/unlock/{userName}")
public AjaxResult unlock(@PathVariable("userName") String userName)
{
passwordService.clearLoginRecordCache(userName);
return success();
}
}

View File

@ -0,0 +1,69 @@
package tech.unissense.pms.web.controller.monitor;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.system.domain.SysOperLog;
import tech.unissense.pms.system.service.ISysOperLogService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/operlog")
public class SysOperlogController extends BaseController
{
@Autowired
private ISysOperLogService operLogService;
@PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
@GetMapping("/list")
public TableDataInfo list(SysOperLog operLog)
{
startPage();
List<SysOperLog> list = operLogService.selectOperLogList(operLog);
return getDataTable(list);
}
@Log(title = "操作日志", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysOperLog operLog)
{
List<SysOperLog> list = operLogService.selectOperLogList(operLog);
ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
util.exportExcel(response, list, "操作日志");
}
@Log(title = "操作日志", businessType = BusinessType.DELETE)
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/{operIds}")
public AjaxResult remove(@PathVariable Long[] operIds)
{
return toAjax(operLogService.deleteOperLogByIds(operIds));
}
@Log(title = "操作日志", businessType = BusinessType.CLEAN)
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/clean")
public AjaxResult clean()
{
operLogService.cleanOperLog();
return success();
}
}

View File

@ -0,0 +1,83 @@
package tech.unissense.pms.web.controller.monitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.constant.CacheConstants;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.model.LoginUser;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.core.redis.RedisCache;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.system.domain.SysUserOnline;
import tech.unissense.pms.system.service.ISysUserOnlineService;
/**
* 线
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/online")
public class SysUserOnlineController extends BaseController
{
@Autowired
private ISysUserOnlineService userOnlineService;
@Autowired
private RedisCache redisCache;
@PreAuthorize("@ss.hasPermi('monitor:online:list')")
@GetMapping("/list")
public TableDataInfo list(String ipaddr, String userName)
{
Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
for (String key : keys)
{
LoginUser user = redisCache.getCacheObject(key);
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
{
userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
}
else if (StringUtils.isNotEmpty(ipaddr))
{
userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
}
else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
{
userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
}
else
{
userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
}
}
Collections.reverse(userOnlineList);
userOnlineList.removeAll(Collections.singleton(null));
return getDataTable(userOnlineList);
}
/**
* 退
*/
@PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
@Log(title = "在线用户", businessType = BusinessType.FORCE)
@DeleteMapping("/{tokenId}")
public AjaxResult forceLogout(@PathVariable String tokenId)
{
redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
return success();
}
}

View File

@ -0,0 +1,133 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.system.domain.SysConfig;
import tech.unissense.pms.system.service.ISysConfigService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/config")
public class SysConfigController extends BaseController
{
@Autowired
private ISysConfigService configService;
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:config:list')")
@GetMapping("/list")
public TableDataInfo list(SysConfig config)
{
startPage();
List<SysConfig> list = configService.selectConfigList(config);
return getDataTable(list);
}
@Log(title = "参数管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:config:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysConfig config)
{
List<SysConfig> list = configService.selectConfigList(config);
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
util.exportExcel(response, list, "参数数据");
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:config:query')")
@GetMapping(value = "/{configId}")
public AjaxResult getInfo(@PathVariable Long configId)
{
return success(configService.selectConfigById(configId));
}
/**
*
*/
@GetMapping(value = "/configKey/{configKey}")
public AjaxResult getConfigKey(@PathVariable String configKey)
{
return success(configService.selectConfigByKey(configKey));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:config:add')")
@Log(title = "参数管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysConfig config)
{
if (!configService.checkConfigKeyUnique(config))
{
return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
config.setCreateBy(getUsername());
return toAjax(configService.insertConfig(config));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:config:edit')")
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysConfig config)
{
if (!configService.checkConfigKeyUnique(config))
{
return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
config.setUpdateBy(getUsername());
return toAjax(configService.updateConfig(config));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:config:remove')")
@Log(title = "参数管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{configIds}")
public AjaxResult remove(@PathVariable Long[] configIds)
{
configService.deleteConfigByIds(configIds);
return success();
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:config:remove')")
@Log(title = "参数管理", businessType = BusinessType.CLEAN)
@DeleteMapping("/refreshCache")
public AjaxResult refreshCache()
{
configService.resetConfigCache();
return success();
}
}

View File

@ -0,0 +1,132 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.constant.UserConstants;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysDept;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.system.service.ISysDeptService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/dept")
public class SysDeptController extends BaseController
{
@Autowired
private ISysDeptService deptService;
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list")
public AjaxResult list(SysDept dept)
{
List<SysDept> depts = deptService.selectDeptList(dept);
return success(depts);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list/exclude/{deptId}")
public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
{
List<SysDept> depts = deptService.selectDeptList(new SysDept());
depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
return success(depts);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dept:query')")
@GetMapping(value = "/{deptId}")
public AjaxResult getInfo(@PathVariable Long deptId)
{
deptService.checkDeptDataScope(deptId);
return success(deptService.selectDeptById(deptId));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dept:add')")
@Log(title = "部门管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysDept dept)
{
if (!deptService.checkDeptNameUnique(dept))
{
return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
}
dept.setCreateBy(getUsername());
return toAjax(deptService.insertDept(dept));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dept:edit')")
@Log(title = "部门管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysDept dept)
{
Long deptId = dept.getDeptId();
deptService.checkDeptDataScope(deptId);
if (!deptService.checkDeptNameUnique(dept))
{
return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
}
else if (dept.getParentId().equals(deptId))
{
return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
}
else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
{
return error("该部门包含未停用的子部门!");
}
dept.setUpdateBy(getUsername());
return toAjax(deptService.updateDept(dept));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "部门管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{deptId}")
public AjaxResult remove(@PathVariable Long deptId)
{
if (deptService.hasChildByDeptId(deptId))
{
return warn("存在下级部门,不允许删除");
}
if (deptService.checkDeptExistUser(deptId))
{
return warn("部门存在用户,不允许删除");
}
deptService.checkDeptDataScope(deptId);
return toAjax(deptService.deleteDeptById(deptId));
}
}

View File

@ -0,0 +1,121 @@
package tech.unissense.pms.web.controller.system;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysDictData;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.system.service.ISysDictDataService;
import tech.unissense.pms.system.service.ISysDictTypeService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/dict/data")
public class SysDictDataController extends BaseController
{
@Autowired
private ISysDictDataService dictDataService;
@Autowired
private ISysDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list")
public TableDataInfo list(SysDictData dictData)
{
startPage();
List<SysDictData> list = dictDataService.selectDictDataList(dictData);
return getDataTable(list);
}
@Log(title = "字典数据", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysDictData dictData)
{
List<SysDictData> list = dictDataService.selectDictDataList(dictData);
ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
util.exportExcel(response, list, "字典数据");
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictCode}")
public AjaxResult getInfo(@PathVariable Long dictCode)
{
return success(dictDataService.selectDictDataById(dictCode));
}
/**
*
*/
@GetMapping(value = "/type/{dictType}")
public AjaxResult dictType(@PathVariable String dictType)
{
List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
if (StringUtils.isNull(data))
{
data = new ArrayList<SysDictData>();
}
return success(data);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典数据", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysDictData dict)
{
dict.setCreateBy(getUsername());
return toAjax(dictDataService.insertDictData(dict));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典数据", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictData dict)
{
dict.setUpdateBy(getUsername());
return toAjax(dictDataService.updateDictData(dict));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictCodes}")
public AjaxResult remove(@PathVariable Long[] dictCodes)
{
dictDataService.deleteDictDataByIds(dictCodes);
return success();
}
}

View File

@ -0,0 +1,131 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysDictType;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.system.service.ISysDictTypeService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/dict/type")
public class SysDictTypeController extends BaseController
{
@Autowired
private ISysDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list")
public TableDataInfo list(SysDictType dictType)
{
startPage();
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
return getDataTable(list);
}
@Log(title = "字典类型", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysDictType dictType)
{
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
util.exportExcel(response, list, "字典类型");
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictId}")
public AjaxResult getInfo(@PathVariable Long dictId)
{
return success(dictTypeService.selectDictTypeById(dictId));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典类型", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysDictType dict)
{
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
dict.setCreateBy(getUsername());
return toAjax(dictTypeService.insertDictType(dict));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典类型", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictType dict)
{
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
dict.setUpdateBy(getUsername());
return toAjax(dictTypeService.updateDictType(dict));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictIds}")
public AjaxResult remove(@PathVariable Long[] dictIds)
{
dictTypeService.deleteDictTypeByIds(dictIds);
return success();
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.CLEAN)
@DeleteMapping("/refreshCache")
public AjaxResult refreshCache()
{
dictTypeService.resetDictCache();
return success();
}
/**
*
*/
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
return success(dictTypes);
}
}

View File

@ -0,0 +1,29 @@
package tech.unissense.pms.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.config.RuoYiConfig;
import tech.unissense.pms.common.utils.StringUtils;
/**
*
*
* @author ruoyi
*/
@RestController
public class SysIndexController
{
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
/**
* 访
*/
@RequestMapping("/")
public String index()
{
return StringUtils.format("欢迎使用{}后台管理框架当前版本v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
}
}

View File

@ -0,0 +1,86 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.constant.Constants;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysMenu;
import tech.unissense.pms.common.core.domain.entity.SysUser;
import tech.unissense.pms.common.core.domain.model.LoginBody;
import tech.unissense.pms.common.utils.SecurityUtils;
import tech.unissense.pms.framework.web.service.SysLoginService;
import tech.unissense.pms.framework.web.service.SysPermissionService;
import tech.unissense.pms.system.service.ISysMenuService;
/**
*
*
* @author ruoyi
*/
@RestController
public class SysLoginController
{
@Autowired
private SysLoginService loginService;
@Autowired
private ISysMenuService menuService;
@Autowired
private SysPermissionService permissionService;
/**
*
*
* @param loginBody
* @return
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
}
/**
*
*
* @return
*/
@GetMapping("getInfo")
public AjaxResult getInfo()
{
SysUser user = SecurityUtils.getLoginUser().getUser();
// 角色集合
Set<String> roles = permissionService.getRolePermission(user);
// 权限集合
Set<String> permissions = permissionService.getMenuPermission(user);
AjaxResult ajax = AjaxResult.success();
ajax.put("user", user);
ajax.put("roles", roles);
ajax.put("permissions", permissions);
return ajax;
}
/**
*
*
* @return
*/
@GetMapping("getRouters")
public AjaxResult getRouters()
{
Long userId = SecurityUtils.getUserId();
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus));
}
}

View File

@ -0,0 +1,142 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.constant.UserConstants;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysMenu;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.system.service.ISysMenuService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/menu")
public class SysMenuController extends BaseController
{
@Autowired
private ISysMenuService menuService;
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:menu:list')")
@GetMapping("/list")
public AjaxResult list(SysMenu menu)
{
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
return success(menus);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:menu:query')")
@GetMapping(value = "/{menuId}")
public AjaxResult getInfo(@PathVariable Long menuId)
{
return success(menuService.selectMenuById(menuId));
}
/**
*
*/
@GetMapping("/treeselect")
public AjaxResult treeselect(SysMenu menu)
{
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
return success(menuService.buildMenuTreeSelect(menus));
}
/**
*
*/
@GetMapping(value = "/roleMenuTreeselect/{roleId}")
public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
{
List<SysMenu> menus = menuService.selectMenuList(getUserId());
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
ajax.put("menus", menuService.buildMenuTreeSelect(menus));
return ajax;
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:menu:add')")
@Log(title = "菜单管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysMenu menu)
{
if (!menuService.checkMenuNameUnique(menu))
{
return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
}
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
{
return error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
}
menu.setCreateBy(getUsername());
return toAjax(menuService.insertMenu(menu));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:menu:edit')")
@Log(title = "菜单管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysMenu menu)
{
if (!menuService.checkMenuNameUnique(menu))
{
return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
}
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
{
return error("修改菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
}
else if (menu.getMenuId().equals(menu.getParentId()))
{
return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
}
menu.setUpdateBy(getUsername());
return toAjax(menuService.updateMenu(menu));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:menu:remove')")
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{menuId}")
public AjaxResult remove(@PathVariable("menuId") Long menuId)
{
if (menuService.hasChildByMenuId(menuId))
{
return warn("存在子菜单,不允许删除");
}
if (menuService.checkMenuExistRole(menuId))
{
return warn("菜单已分配,不允许删除");
}
return toAjax(menuService.deleteMenuById(menuId));
}
}

View File

@ -0,0 +1,91 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.system.domain.SysNotice;
import tech.unissense.pms.system.service.ISysNoticeService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/notice")
public class SysNoticeController extends BaseController
{
@Autowired
private ISysNoticeService noticeService;
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:notice:list')")
@GetMapping("/list")
public TableDataInfo list(SysNotice notice)
{
startPage();
List<SysNotice> list = noticeService.selectNoticeList(notice);
return getDataTable(list);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:notice:query')")
@GetMapping(value = "/{noticeId}")
public AjaxResult getInfo(@PathVariable Long noticeId)
{
return success(noticeService.selectNoticeById(noticeId));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:notice:add')")
@Log(title = "通知公告", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysNotice notice)
{
notice.setCreateBy(getUsername());
return toAjax(noticeService.insertNotice(notice));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:notice:edit')")
@Log(title = "通知公告", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysNotice notice)
{
notice.setUpdateBy(getUsername());
return toAjax(noticeService.updateNotice(notice));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:notice:remove')")
@Log(title = "通知公告", businessType = BusinessType.DELETE)
@DeleteMapping("/{noticeIds}")
public AjaxResult remove(@PathVariable Long[] noticeIds)
{
return toAjax(noticeService.deleteNoticeByIds(noticeIds));
}
}

View File

@ -0,0 +1,129 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.system.domain.SysPost;
import tech.unissense.pms.system.service.ISysPostService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/post")
public class SysPostController extends BaseController
{
@Autowired
private ISysPostService postService;
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:post:list')")
@GetMapping("/list")
public TableDataInfo list(SysPost post)
{
startPage();
List<SysPost> list = postService.selectPostList(post);
return getDataTable(list);
}
@Log(title = "岗位管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:post:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysPost post)
{
List<SysPost> list = postService.selectPostList(post);
ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
util.exportExcel(response, list, "岗位数据");
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:post:query')")
@GetMapping(value = "/{postId}")
public AjaxResult getInfo(@PathVariable Long postId)
{
return success(postService.selectPostById(postId));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:post:add')")
@Log(title = "岗位管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysPost post)
{
if (!postService.checkPostNameUnique(post))
{
return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
}
else if (!postService.checkPostCodeUnique(post))
{
return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
}
post.setCreateBy(getUsername());
return toAjax(postService.insertPost(post));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:post:edit')")
@Log(title = "岗位管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysPost post)
{
if (!postService.checkPostNameUnique(post))
{
return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
}
else if (!postService.checkPostCodeUnique(post))
{
return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
}
post.setUpdateBy(getUsername());
return toAjax(postService.updatePost(post));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:post:remove')")
@Log(title = "岗位管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{postIds}")
public AjaxResult remove(@PathVariable Long[] postIds)
{
return toAjax(postService.deletePostByIds(postIds));
}
/**
*
*/
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
List<SysPost> posts = postService.selectPostAll();
return success(posts);
}
}

View File

@ -0,0 +1,137 @@
package tech.unissense.pms.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.config.RuoYiConfig;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysUser;
import tech.unissense.pms.common.core.domain.model.LoginUser;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.SecurityUtils;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.common.utils.file.FileUploadUtils;
import tech.unissense.pms.common.utils.file.MimeTypeUtils;
import tech.unissense.pms.framework.web.service.TokenService;
import tech.unissense.pms.system.service.ISysUserService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/user/profile")
public class SysProfileController extends BaseController
{
@Autowired
private ISysUserService userService;
@Autowired
private TokenService tokenService;
/**
*
*/
@GetMapping
public AjaxResult profile()
{
LoginUser loginUser = getLoginUser();
SysUser user = loginUser.getUser();
AjaxResult ajax = AjaxResult.success(user);
ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
return ajax;
}
/**
*
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult updateProfile(@RequestBody SysUser user)
{
LoginUser loginUser = getLoginUser();
SysUser currentUser = loginUser.getUser();
currentUser.setNickName(user.getNickName());
currentUser.setEmail(user.getEmail());
currentUser.setPhonenumber(user.getPhonenumber());
currentUser.setSex(user.getSex());
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
{
return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在");
}
if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
{
return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在");
}
if (userService.updateUserProfile(currentUser) > 0)
{
// 更新缓存用户信息
tokenService.setLoginUser(loginUser);
return success();
}
return error("修改个人信息异常,请联系管理员");
}
/**
*
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/updatePwd")
public AjaxResult updatePwd(String oldPassword, String newPassword)
{
LoginUser loginUser = getLoginUser();
String userName = loginUser.getUsername();
String password = loginUser.getPassword();
if (!SecurityUtils.matchesPassword(oldPassword, password))
{
return error("修改密码失败,旧密码错误");
}
if (SecurityUtils.matchesPassword(newPassword, password))
{
return error("新密码不能与旧密码相同");
}
newPassword = SecurityUtils.encryptPassword(newPassword);
if (userService.resetUserPwd(userName, newPassword) > 0)
{
// 更新缓存用户密码
loginUser.getUser().setPassword(newPassword);
tokenService.setLoginUser(loginUser);
return success();
}
return error("修改密码异常,请联系管理员");
}
/**
*
*/
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
@PostMapping("/avatar")
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
{
if (!file.isEmpty())
{
LoginUser loginUser = getLoginUser();
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
{
AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", avatar);
// 更新缓存用户头像
loginUser.getUser().setAvatar(avatar);
tokenService.setLoginUser(loginUser);
return ajax;
}
}
return error("上传图片异常,请联系管理员");
}
}

View File

@ -0,0 +1,38 @@
package tech.unissense.pms.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.model.RegisterBody;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.framework.web.service.SysRegisterService;
import tech.unissense.pms.system.service.ISysConfigService;
/**
*
*
* @author ruoyi
*/
@RestController
public class SysRegisterController extends BaseController
{
@Autowired
private SysRegisterService registerService;
@Autowired
private ISysConfigService configService;
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
{
return error("当前系统没有开启注册功能!");
}
String msg = registerService.register(user);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
}

View File

@ -0,0 +1,262 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysDept;
import tech.unissense.pms.common.core.domain.entity.SysRole;
import tech.unissense.pms.common.core.domain.entity.SysUser;
import tech.unissense.pms.common.core.domain.model.LoginUser;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.framework.web.service.SysPermissionService;
import tech.unissense.pms.framework.web.service.TokenService;
import tech.unissense.pms.system.domain.SysUserRole;
import tech.unissense.pms.system.service.ISysDeptService;
import tech.unissense.pms.system.service.ISysRoleService;
import tech.unissense.pms.system.service.ISysUserService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/role")
public class SysRoleController extends BaseController
{
@Autowired
private ISysRoleService roleService;
@Autowired
private TokenService tokenService;
@Autowired
private SysPermissionService permissionService;
@Autowired
private ISysUserService userService;
@Autowired
private ISysDeptService deptService;
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/list")
public TableDataInfo list(SysRole role)
{
startPage();
List<SysRole> list = roleService.selectRoleList(role);
return getDataTable(list);
}
@Log(title = "角色管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:role:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysRole role)
{
List<SysRole> list = roleService.selectRoleList(role);
ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
util.exportExcel(response, list, "角色数据");
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping(value = "/{roleId}")
public AjaxResult getInfo(@PathVariable Long roleId)
{
roleService.checkRoleDataScope(roleId);
return success(roleService.selectRoleById(roleId));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:add')")
@Log(title = "角色管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysRole role)
{
if (!roleService.checkRoleNameUnique(role))
{
return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
}
else if (!roleService.checkRoleKeyUnique(role))
{
return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
role.setCreateBy(getUsername());
return toAjax(roleService.insertRole(role));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
if (!roleService.checkRoleNameUnique(role))
{
return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
}
else if (!roleService.checkRoleKeyUnique(role))
{
return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
role.setUpdateBy(getUsername());
if (roleService.updateRole(role) > 0)
{
// 更新缓存用户权限
LoginUser loginUser = getLoginUser();
if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
{
loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
tokenService.setLoginUser(loginUser);
}
return success();
}
return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping("/dataScope")
public AjaxResult dataScope(@RequestBody SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
return toAjax(roleService.authDataScope(role));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
role.setUpdateBy(getUsername());
return toAjax(roleService.updateRoleStatus(role));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:remove')")
@Log(title = "角色管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{roleIds}")
public AjaxResult remove(@PathVariable Long[] roleIds)
{
return toAjax(roleService.deleteRoleByIds(roleIds));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
return success(roleService.selectRoleAll());
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/allocatedList")
public TableDataInfo allocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectAllocatedList(user);
return getDataTable(list);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/unallocatedList")
public TableDataInfo unallocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectUnallocatedList(user);
return getDataTable(list);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancel")
public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
{
return toAjax(roleService.deleteAuthUser(userRole));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancelAll")
public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
{
return toAjax(roleService.deleteAuthUsers(roleId, userIds));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/selectAll")
public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
{
roleService.checkRoleDataScope(roleId);
return toAjax(roleService.insertAuthUsers(roleId, userIds));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping(value = "/deptTree/{roleId}")
public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
{
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
return ajax;
}
}

View File

@ -0,0 +1,256 @@
package tech.unissense.pms.web.controller.system;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import tech.unissense.pms.common.annotation.Log;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.entity.SysDept;
import tech.unissense.pms.common.core.domain.entity.SysRole;
import tech.unissense.pms.common.core.domain.entity.SysUser;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.utils.SecurityUtils;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.common.utils.poi.ExcelUtil;
import tech.unissense.pms.system.service.ISysDeptService;
import tech.unissense.pms.system.service.ISysPostService;
import tech.unissense.pms.system.service.ISysRoleService;
import tech.unissense.pms.system.service.ISysUserService;
/**
*
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController
{
@Autowired
private ISysUserService userService;
@Autowired
private ISysRoleService roleService;
@Autowired
private ISysDeptService deptService;
@Autowired
private ISysPostService postService;
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
public TableDataInfo list(SysUser user)
{
startPage();
List<SysUser> list = userService.selectUserList(user);
return getDataTable(list);
}
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:user:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysUser user)
{
List<SysUser> list = userService.selectUserList(user);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
util.exportExcel(response, list, "用户数据");
}
@Log(title = "用户管理", businessType = BusinessType.IMPORT)
@PreAuthorize("@ss.hasPermi('system:user:import')")
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
List<SysUser> userList = util.importExcel(file.getInputStream());
String operName = getUsername();
String message = userService.importUser(userList, updateSupport, operName);
return success(message);
}
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response)
{
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
util.importTemplateExcel(response, "用户数据");
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping(value = { "/", "/{userId}" })
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
{
userService.checkUserDataScope(userId);
AjaxResult ajax = AjaxResult.success();
List<SysRole> roles = roleService.selectRoleAll();
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
ajax.put("posts", postService.selectPostAll());
if (StringUtils.isNotNull(userId))
{
SysUser sysUser = userService.selectUserById(userId);
ajax.put(AjaxResult.DATA_TAG, sysUser);
ajax.put("postIds", postService.selectPostListByUserId(userId));
ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
}
return ajax;
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:add')")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysUser user)
{
deptService.checkDeptDataScope(user.getDeptId());
roleService.checkRoleDataScope(user.getRoleIds());
if (!userService.checkUserNameUnique(user))
{
return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
}
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
{
return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
{
return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setCreateBy(getUsername());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
return toAjax(userService.insertUser(user));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
deptService.checkDeptDataScope(user.getDeptId());
roleService.checkRoleDataScope(user.getRoleIds());
if (!userService.checkUserNameUnique(user))
{
return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
}
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
{
return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
{
return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setUpdateBy(getUsername());
return toAjax(userService.updateUser(user));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:remove')")
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
public AjaxResult remove(@PathVariable Long[] userIds)
{
if (ArrayUtils.contains(userIds, getUserId()))
{
return error("当前用户不能删除");
}
return toAjax(userService.deleteUserByIds(userIds));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/resetPwd")
public AjaxResult resetPwd(@RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
user.setUpdateBy(getUsername());
return toAjax(userService.resetPwd(user));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setUpdateBy(getUsername());
return toAjax(userService.updateUserStatus(user));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping("/authRole/{userId}")
public AjaxResult authRole(@PathVariable("userId") Long userId)
{
AjaxResult ajax = AjaxResult.success();
SysUser user = userService.selectUserById(userId);
List<SysRole> roles = roleService.selectRolesByUserId(userId);
ajax.put("user", user);
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
return ajax;
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole")
public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
{
userService.checkUserDataScope(userId);
roleService.checkRoleDataScope(roleIds);
userService.insertUserAuth(userId, roleIds);
return success();
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/deptTree")
public AjaxResult deptTree(SysDept dept)
{
return success(deptService.selectDeptTreeList(dept));
}
}

View File

@ -0,0 +1,183 @@
package tech.unissense.pms.web.controller.tool;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.unissense.pms.common.core.controller.BaseController;
import tech.unissense.pms.common.core.domain.R;
import tech.unissense.pms.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
/**
* swagger
*
* @author ruoyi
*/
@Api("用户信息管理")
@RestController
@RequestMapping("/test/user")
public class TestController extends BaseController
{
private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
{
users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
}
@ApiOperation("获取用户列表")
@GetMapping("/list")
public R<List<UserEntity>> userList()
{
List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
return R.ok(userList);
}
@ApiOperation("获取用户详细")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@GetMapping("/{userId}")
public R<UserEntity> getUser(@PathVariable Integer userId)
{
if (!users.isEmpty() && users.containsKey(userId))
{
return R.ok(users.get(userId));
}
else
{
return R.fail("用户不存在");
}
}
@ApiOperation("新增用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class),
@ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class),
@ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class)
})
@PostMapping("/save")
public R<String> save(UserEntity user)
{
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
{
return R.fail("用户ID不能为空");
}
users.put(user.getUserId(), user);
return R.ok();
}
@ApiOperation("更新用户")
@PutMapping("/update")
public R<String> update(@RequestBody UserEntity user)
{
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
{
return R.fail("用户ID不能为空");
}
if (users.isEmpty() || !users.containsKey(user.getUserId()))
{
return R.fail("用户不存在");
}
users.remove(user.getUserId());
users.put(user.getUserId(), user);
return R.ok();
}
@ApiOperation("删除用户信息")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@DeleteMapping("/{userId}")
public R<String> delete(@PathVariable Integer userId)
{
if (!users.isEmpty() && users.containsKey(userId))
{
users.remove(userId);
return R.ok();
}
else
{
return R.fail("用户不存在");
}
}
}
@ApiModel(value = "UserEntity", description = "用户实体")
class UserEntity
{
@ApiModelProperty("用户ID")
private Integer userId;
@ApiModelProperty("用户名称")
private String username;
@ApiModelProperty("用户密码")
private String password;
@ApiModelProperty("用户手机")
private String mobile;
public UserEntity()
{
}
public UserEntity(Integer userId, String username, String password, String mobile)
{
this.userId = userId;
this.username = username;
this.password = password;
this.mobile = mobile;
}
public Integer getUserId()
{
return userId;
}
public void setUserId(Integer userId)
{
this.userId = userId;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getMobile()
{
return mobile;
}
public void setMobile(String mobile)
{
this.mobile = mobile;
}
}

View File

@ -0,0 +1,125 @@
package tech.unissense.pms.web.core.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import tech.unissense.pms.common.config.RuoYiConfig;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Swagger2
*
* @author ruoyi
*/
@Configuration
public class SwaggerConfig
{
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
/** 是否开启swagger */
@Value("${swagger.enabled}")
private boolean enabled;
/** 设置请求的统一前缀 */
@Value("${swagger.pathMapping}")
private String pathMapping;
/**
* API
*/
@Bean
public Docket createRestApi()
{
return new Docket(DocumentationType.OAS_30)
// 是否启用Swagger
.enable(enabled)
// 用来创建该API的基本信息展示在文档的页面中自定义展示的信息
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
// 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
/* 设置安全模式swagger可以设置访问token */
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.pathMapping(pathMapping);
}
/**
* tokenAuthorization
*/
private List<SecurityScheme> securitySchemes()
{
List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
return apiKeyList;
}
/**
*
*/
private List<SecurityContext> securityContexts()
{
List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
.securityReferences(defaultAuth())
.operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.build());
return securityContexts;
}
/**
*
*/
private List<SecurityReference> defaultAuth()
{
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
/**
*
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题若依管理系统_接口文档")
// 描述
.description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
// 作者信息
.contact(new Contact(ruoyiConfig.getName(), null, null))
// 版本
.version("版本号:" + ruoyiConfig.getVersion())
.build();
}
}

View File

@ -0,0 +1 @@
restart.include.json=/com.alibaba.fastjson2.*.jar

View File

@ -0,0 +1,61 @@
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://192.168.124.202:3306/unis_pms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: unissense
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true

View File

@ -0,0 +1,84 @@
server:
port: 8181
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://192.168.124.202:3306/unis_pms_pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: unissense
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
redis:
# 地址
host: 192.168.124.103
# 端口默认为6379
port: 6379
# 数据库索引
database: 14
# 密码
password: zghz@123
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms

View File

@ -0,0 +1,132 @@
# 项目相关配置
ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.8.8
# 版权年份
copyrightYear: 2024
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: D:/ruoyi/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
captchaType: math
# 开发环境配置
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:
tech.unissense: debug
org.springframework: warn
# 用户配置
user:
password:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间默认10分钟
lockTime: 10
# Spring配置
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
profiles:
active: dev
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
# redis 配置
redis:
# 地址
host: 192.168.124.103
# 端口默认为6379
port: 6379
# 数据库索引
database: 13
# 密码
password: zghz@123
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# token配置
token:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期默认30分钟
expireTime: 30
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: tech.unissense.**.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/*

View File

@ -0,0 +1,24 @@
Application Version: ${ruoyi.version}
Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,38 @@
#错误消息
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
login.blocked=很遗憾访问IP已被列入系统黑名单
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成且必须以非数字开头
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="/home/ruoyi/logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="tech.unissense" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pms</artifactId>
<groupId>tech.unissense</groupId>
<version>3.8.8</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>pms-business</artifactId>
<description>
business业务模块
</description>
<dependencies>
<!-- 通用工具-->
<dependency>
<groupId>tech.unissense</groupId>
<artifactId>pms-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,82 @@
package tech.unissense.pms.business.project.domain;
import lombok.Data;
import tech.unissense.pms.common.core.domain.BaseEntity;
import java.util.Date;
/**
* (Project)
*
* @author ch
* @since 2024-10-08 17:22:38
*/
@Data
public class Project extends BaseEntity {
private static final long serialVersionUID = -57644380048647254L;
/**
* id
*/
private Integer projectId;
/**
* id
*/
private Integer tenantId;
/**
*
*/
private String projectName;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectLeader;
/**
*
*/
private String projectLeaderName;
/**
*
*/
private Date startDate;
/**
*
*/
private Date endDate;
/**
*
*/
private Integer budgetDate;
/**
* 0 -; 1-
*/
private String state;
/**
* 0- 1- 2-
*/
private String dataState;
/**
* 0- 1- 2-
*/
private String projectState;
/**
*
*/
private String updateByName;
/**
*
*/
private String createByName;
/**
*
*/
private Integer teamNum;
private Long queryUserId;
}

View File

@ -0,0 +1,25 @@
package tech.unissense.pms.business.project.dto;
import lombok.Data;
import java.util.Date;
/**
* @author : ch
* @version : 1.0
* @ClassName : ProjectQueryDto
* @Description :
* @DATE : Created in 14:51 2024/10/10
* <pre> Copyright: Copyright(c)2024 </pre>
* <pre> Company : </pre>
* Modification History:
* Date Author Version Discription
* --------------------------------------------------------------------------
* 2024/10/10 ch 1.0 Why & What is modified: <> *
*/
@Data
public class ProjectQueryDto {
private Integer projectId;
private Date startDate;
private Date endDate;
}

View File

@ -0,0 +1,90 @@
package tech.unissense.pms.business.project.mapper;
import tech.unissense.pms.business.project.domain.Project;
import org.apache.ibatis.annotations.Param;
import tech.unissense.pms.common.core.domain.entity.SysRole;
import java.util.Date;
import java.util.List;
/**
* (Project)访
*
* @author ch
* @since 2024-10-08 11:46:59
*/
public interface ProjectMapper {
/**
* ID
*
* @param projectId
* @return
*/
Project queryById(Integer projectId);
/**
*
*
* @param project
* @param pageable
* @return
*/
List<Project> list(Project project);
/**
*
*
* @param project
* @return
*/
long count(Project project);
/**
*
*
* @param project
* @return
*/
int insert(Project project);
/**
* MyBatisforeach
*
* @param entities List<Project>
* @return
*/
int insertBatch(@Param("entities") List<Project> entities);
/**
* MyBatisforeach
*
* @param entities List<Project>
* @return
* @throws org.springframework.jdbc.BadSqlGrammarException ListSQL
*/
int insertOrUpdateBatch(@Param("entities") List<Project> entities);
/**
*
*
* @param project
* @return
*/
int update(Project project);
/**
*
*
* @param projectId
* @return
*/
int deleteById(Integer projectId);
int logicalDeleteById(Integer projectId);
Project checkProjectUnique(Project project);
String selectProjectCode(Date date);
}

View File

@ -0,0 +1,71 @@
package tech.unissense.pms.business.project.service;
import tech.unissense.pms.business.project.domain.Project;
import tech.unissense.pms.business.project.dto.ProjectQueryDto;
import tech.unissense.pms.business.project.vo.ProjectExecutionVo;
import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo;
import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import java.util.List;
/**
* (Project)
*
* @author ch
* @since 2024-10-08 11:47:00
*/
public interface IProjectService {
/**
* ID
*
* @param projectId
* @return
*/
Project queryById(Integer projectId);
/**
*
*
* @param project
* @param pageRequest
* @return
*/
List<Project> permissisonList(Project project);
/**
*
*
* @param project
* @return
*/
Project insert(Project project);
/**
*
*
* @param project
* @return
*/
Project update(Project project);
/**
*
*
* @param projectId
* @return
*/
boolean deleteById(Integer projectId);
List<Project> listProjectByUser(String createBy);
List<TeamStaticsVo> getTeamInfo(Integer projectId);
List<ProjectExecutionVo> executionInfo(WorkLogger workLogger);
ProjectWorkInfoVo workInfo(ProjectQueryDto project);
Boolean updateCheck(Project project);
}

View File

@ -0,0 +1,350 @@
package tech.unissense.pms.business.project.service.impl;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tech.unissense.pms.business.project.domain.Project;
import tech.unissense.pms.business.project.dto.ProjectQueryDto;
import tech.unissense.pms.business.project.mapper.ProjectMapper;
import tech.unissense.pms.business.project.service.IProjectService;
import tech.unissense.pms.business.project.vo.ProjectExecutionVo;
import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo;
import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
import tech.unissense.pms.business.projectteam.service.IProjectTeamService;
import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import tech.unissense.pms.business.work.logger.service.IWorkLoggerService;
import tech.unissense.pms.business.work.logger.vo.StaticsHourVo;
import tech.unissense.pms.common.core.domain.entity.SysUser;
import tech.unissense.pms.common.core.redis.RedisCache;
import tech.unissense.pms.common.exception.ServiceException;
import tech.unissense.pms.common.utils.DateUtils;
import tech.unissense.pms.common.utils.SecurityUtils;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.common.utils.bean.BeanUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* (Project)
*
* @author ch
* @since 2024-10-08 11:47:01
*/
@Slf4j
@Service("projectService")
public class ProjectServiceImpl implements IProjectService {
@Resource
private ProjectMapper projectMapper;
@Autowired
private IProjectTeamService teamService;
@Autowired
private IWorkLoggerService workLoggerService;
private static final ConcurrentHashMap<String, AtomicInteger> DAILY_SEQUENCE_MAP = new ConcurrentHashMap<>();
@Autowired
private RedisCache redisCache;
/**
* ID
*
* @param projectId
* @return
*/
@Override
public Project queryById(Integer projectId) {
return this.projectMapper.queryById(projectId);
}
/**
*
*
* @param project
* @return
*/
public List<Project> permissisonList(Project project) {
dataPermissions(project);
List<Project> list = this.projectMapper.list(project);
Date nowDate = DateUtils.getNowDate();
list.forEach(item -> {
if (item.getStartDate() == null || item.getEndDate() == null) {
return;
}
if (nowDate.before(item.getStartDate())) {
item.setDataState("0");
} else if (nowDate.after(item.getStartDate()) && nowDate.before(item.getEndDate())) {
item.setDataState("1");
} else if (nowDate.after(item.getEndDate())) {
item.setDataState("2");
}
});
return list;
}
private void dataPermissions(Project project) {
SysUser user = SecurityUtils.getLoginUser().getUser();
StringBuilder sql = new StringBuilder();
if (user.isAdmin()) {
return;
}
if (CollUtil.isEmpty(user.getRoles())) {
sql.append(" and 1=2");
project.getParams().put("dataScope", sql);
return;
}
if (user.getRoles().stream()
.anyMatch(item -> "企业管理员".equals(item.getRoleName()) || "公司领导".equals(item.getRoleName()))) {
} else if (user.getRoles().stream().anyMatch(item -> "项目经理".equals(item.getRoleName()))) {
sql.append(
"and (t1.project_id in (select project_id from pms_project_team where user_id={} ) or t1.project_leader={} or t1.create_by={})");
project.getParams().put("dataScope",
StringUtils.format(sql.toString(), user.getUserId(), user.getUserId(), user.getUserId()));
} else {
sql.append("and (t1.project_id in (select project_id from pms_project_team where user_id={} ))");
project.getParams().put("dataScope", StringUtils.format(sql.toString(), user.getUserId()));
}
}
public String checkProjectUnique(Project project) {
Integer projectId = StringUtils.isNull(project.getProjectId()) ? -1 : project.getProjectId();
Project info = projectMapper.checkProjectUnique(project);
if (StringUtils.isNotNull(info) && !projectId.equals(info.getProjectId())) {
return project.getProjectName().equals(info.getProjectName()) ? "项目名称已存在" : "项目编号已存在";
}
return "";
}
/**
*
*
* @param project
* @return
*/
@Override
public Project insert(Project project) {
String errorMsg = checkProjectUnique(project);
if (StringUtils.isNotEmpty(errorMsg)) {
throw new ServiceException(errorMsg);
}
if (StringUtils.isEmpty(project.getState())) {
project.setState("0");
}
if (StringUtils.isEmpty(project.getProjectCode())) {
// PM+年月日+四位编码
LocalDate currentDate = LocalDate.now();
String dateStr = currentDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
// 使用computeIfAbsent来初始化或获取当天的AtomicInteger
AtomicInteger sequence = DAILY_SEQUENCE_MAP.compute(dateStr, (key, existingValue) -> {
if (existingValue == null) {
// 清除旧的日期数据
DAILY_SEQUENCE_MAP.clear();
String existProjectCode = projectMapper.selectProjectCode(DateUtils.toDate(currentDate));
int initValue = 1;
try {
initValue = StringUtils.isNotEmpty(existProjectCode)
? Integer.parseInt(existProjectCode.substring(existProjectCode.length() - 4)) + 1
: 1;
} catch (NumberFormatException e) {
log.error("项目编码格式化错误,项目编码为:{}", existProjectCode);
}
return new AtomicInteger(initValue);
} else {
return existingValue.incrementAndGet() > 9999 ? new AtomicInteger(1) : existingValue;
}
});
// 格式化为四位编码
String sequenceStr = String.format("%04d", sequence.get());
// 生成项目编码
String projectCode = "PM" + dateStr + sequenceStr;
project.setProjectCode(projectCode);
}
// 新增项目
this.projectMapper.insert(project);
// project.getProjectTeamList().forEach(item ->
// item.setProjectId(project.getProjectId()));
// // 新增项目人员
// teamService.insertBatch(project.getProjectTeamList());
return project;
}
/**
*
*
* @param project
* @return
*/
@Override
public Project update(Project project) {
String errorMsg = checkProjectUnique(project);
if (StringUtils.isNotEmpty(errorMsg)) {
throw new ServiceException(errorMsg);
}
this.projectMapper.update(project);
return this.queryById(project.getProjectId());
}
/**
*
*
* @param projectId
* @return
*/
@Override
public boolean deleteById(Integer projectId) {
return this.projectMapper.logicalDeleteById(projectId) > 0;
}
@Override
public List<Project> listProjectByUser(String createBy) {
Project project = new Project();
project.setQueryUserId(Long.valueOf(createBy));
return this.permissisonList(project);
}
@Override
public List<TeamStaticsVo> getTeamInfo(Integer projectId) {
ProjectTeam projectTeam = new ProjectTeam();
projectTeam.setProjectId(projectId);
List<ProjectTeam> projectTeamList = teamService.list(projectTeam);
Project project = projectMapper.queryById(projectId);
// 获取每个成员的工时统计并转换为Map
Map<String, BigDecimal> workHourVo = workLoggerService.personStatics(project).stream()
.collect(Collectors.toMap(StaticsHourVo::getName, StaticsHourVo::getWorkTime, (v1, v2) -> v1));
// 返回每个成员的工时信息
return projectTeamList.stream().map(item -> {
String userIdStr = String.valueOf(item.getUserId());
BigDecimal workTime = workHourVo.getOrDefault(userIdStr, BigDecimal.ZERO);
TeamStaticsVo teamStaticsVo = new TeamStaticsVo();
teamStaticsVo.setTeamId(item.getTeamId());
teamStaticsVo.setUserName(item.getUserName());
teamStaticsVo.setUserId(item.getUserId());
teamStaticsVo.setPostId(item.getPostId());
teamStaticsVo.setWorkTime(workTime);
return teamStaticsVo;
}).collect(Collectors.toList());
}
@Override
public List<ProjectExecutionVo> executionInfo(WorkLogger workLogger) {
Project projectQueryDto = new Project();
if (workLogger.getUserId() != null) {
projectQueryDto.setQueryUserId(Long.valueOf(workLogger.getUserId()));
}
List<Project> projects = this.permissisonList(projectQueryDto);
List<Integer> projectIdList = projects.stream()
.map(Project::getProjectId)
.collect(Collectors.toList());
ProjectTeam projectTeam = new ProjectTeam();
projectTeam.setProjectIdList(projectIdList);
Set<String> teamSet = teamService.list(projectTeam).stream()
.map(item -> item.getProjectId() + "_" + item.getUserId())
.collect(Collectors.toSet());
workLogger.setProjectIdList(projectIdList);
Map<String, BigDecimal> workTimeMap = workLoggerService.list(workLogger).stream()
.filter(item -> teamSet.contains(item.getProjectId() + "_" + item.getUserId()))
.collect(Collectors.toMap(
item -> item.getProjectId() + "_"
+ DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()),
item -> new BigDecimal(item.getWorkTime()),
BigDecimal::add));
LocalDate startDate = workLogger.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = workLogger.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
return projects.stream().map(project -> {
List<BigDecimal> tempList = Stream.iterate(startDate, date -> date.plusDays(1))
.limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
.map(localDate -> {
if (localDate.isAfter(
project.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) ||
localDate.isBefore(project.getStartDate().toInstant().atZone(ZoneId.systemDefault())
.toLocalDate())) {
return BigDecimal.ZERO;
}
return workTimeMap.getOrDefault(project.getProjectId() + "_" + localDate, BigDecimal.ZERO);
})
.collect(Collectors.toList());
ProjectExecutionVo vo = new ProjectExecutionVo();
BeanUtils.copyBeanProp(vo, project);
vo.setDetailList(tempList);
vo.setAllWorkTime(tempList.stream().reduce(BigDecimal.ZERO, BigDecimal::add));
return vo;
}).collect(Collectors.toList());
}
@Override
public ProjectWorkInfoVo workInfo(ProjectQueryDto projectQueryDto) {
Project project = projectMapper.queryById(projectQueryDto.getProjectId());
WorkLogger workLogger = new WorkLogger();
workLogger.setProjectId(projectQueryDto.getProjectId());
workLogger.setStartDate(project.getStartDate());
workLogger.setEndDate(project.getEndDate());
List<WorkLogger> workLoggerList = workLoggerService.listUser(workLogger);
ProjectTeam projectTeam = new ProjectTeam();
projectTeam.setProjectId(projectQueryDto.getProjectId());
Set<Integer> projectTeamSet = teamService.list(projectTeam).stream().map(ProjectTeam::getUserId)
.collect(Collectors.toSet());
// 使用流按日期分组并对每个日期的工人按用户ID去重保留最后一次记录
Map<String, List<WorkLogger>> workersByDateMap = workLoggerList.stream()
.filter(item -> projectTeamSet.contains(item.getUserId()))
.collect(Collectors.groupingBy(
logger -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, logger.getLoggerDate()),
Collectors.collectingAndThen(
Collectors.toMap(
WorkLogger::getUserId,
logger -> logger,
(existing,
replacement) -> existing.getCreateTime()
.after(replacement.getCreateTime()) ? existing : replacement),
map -> new ArrayList<>(map.values()))));
LocalDate startDate = projectQueryDto.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = projectQueryDto.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 生成从开始日期到结束日期的工人列表
List<List<WorkLogger>> detailList = Stream.iterate(startDate, date -> date.plusDays(1))
.limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
.map(localDate -> workersByDateMap.getOrDefault(localDate.toString(), Collections.emptyList()))
.collect(Collectors.toList());
ProjectWorkInfoVo vo = new ProjectWorkInfoVo();
BeanUtils.copyBeanProp(vo, project);
vo.setDetailList(detailList);
return vo;
}
@Override
public Boolean updateCheck(Project project) {
WorkLogger workLogger = new WorkLogger();
workLogger.setProjectId(project.getProjectId());
List<WorkLogger> list = workLoggerService.list(workLogger);
if (list.stream().anyMatch(item -> item.getLoggerDate().before(project.getStartDate())
|| item.getLoggerDate().after(project.getEndDate()))) {
return false;
}
return true;
}
}

View File

@ -0,0 +1,29 @@
package tech.unissense.pms.business.project.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author : ch
* @version : 1.0
* @ClassName : ProjectExecutionVo
* @Description :
* @DATE : Created in 11:20 2024/10/10
* <pre> Copyright: Copyright(c)2024 </pre>
* <pre> Company : </pre>
* Modification History:
* Date Author Version Discription
* --------------------------------------------------------------------------
* 2024/10/10 ch 1.0 Why & What is modified: <> *
*/
@Data
public class ProjectExecutionVo {
private Integer projectId;
private String projectName;
private String projectState;
private Integer budgetDate;
private BigDecimal allWorkTime;
private List<BigDecimal> detailList;
}

View File

@ -0,0 +1,31 @@
package tech.unissense.pms.business.project.vo;
import lombok.Data;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @author : ch
* @version : 1.0
* @ClassName : ProjectExecutionVo
* @Description : vo
* @DATE : Created in 11:20 2024/10/10
* <pre> Copyright: Copyright(c)2024 </pre>
* <pre> Company : </pre>
* Modification History:
* Date Author Version Discription
* --------------------------------------------------------------------------
* 2024/10/10 ch 1.0 Why & What is modified: <> *
*/
@Data
public class ProjectWorkInfoVo {
private Integer projectId;
private String projectName;
private Integer budgetDate;
private Date startDate;
private Date endDate;
private List<List<WorkLogger>> detailList;
}

View File

@ -0,0 +1,39 @@
package tech.unissense.pms.business.projectteam.domain;
import lombok.Data;
import tech.unissense.pms.common.core.domain.BaseEntity;
import java.util.Date;
import java.util.List;
/**
* (ProjectTeam)
*
* @author ch
* @since 2024-10-08 14:27:22
*/
@Data
public class ProjectTeam extends BaseEntity {
private static final long serialVersionUID = 914719977909116089L;
/**
* id
*/
private Integer projectId;
private List<Integer> projectIdList;
/**
* id
*/
private Integer teamId;
/**
* id
*/
private Integer userId;
private String userName;
/**
*
*/
private String postId;
}

View File

@ -0,0 +1,83 @@
package tech.unissense.pms.business.projectteam.mapper;
import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* (ProjectTeam)访
*
* @author ch
* @since 2024-10-08 14:27:22
*/
public interface ProjectTeamMapper {
/**
* ID
*
* @param teamId
* @return
*/
ProjectTeam queryById(Integer teamId);
/**
*
*
* @param projectTeam
* @param pageable
* @return
*/
List<ProjectTeam> list(ProjectTeam projectTeam);
/**
*
*
* @param projectTeam
* @return
*/
long count(ProjectTeam projectTeam);
/**
*
*
* @param projectTeam
* @return
*/
int insert(ProjectTeam projectTeam);
/**
* MyBatisforeach
*
* @param entities List<ProjectTeam>
* @return
*/
int insertBatch(@Param("entities") List<ProjectTeam> entities);
/**
* MyBatisforeach
*
* @param entities List<ProjectTeam>
* @return
* @throws org.springframework.jdbc.BadSqlGrammarException ListSQL
*/
int insertOrUpdateBatch(@Param("entities") List<ProjectTeam> entities);
/**
*
*
* @param projectTeam
* @return
*/
int update(ProjectTeam projectTeam);
/**
*
*
* @param teamId
* @return
*/
int deleteById(Integer teamId);
}

View File

@ -0,0 +1,59 @@
package tech.unissense.pms.business.projectteam.service;
import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
import java.util.List;
/**
* (ProjectTeam)
*
* @author ch
* @since 2024-10-08 14:27:23
*/
public interface IProjectTeamService {
/**
* ID
*
* @param teamId
* @return
*/
ProjectTeam queryById(Integer teamId);
/**
*
*
* @param projectTeam
* @param pageRequest
* @return
*/
List<ProjectTeam> list(ProjectTeam projectTeam);
/**
*
*
* @param projectTeam
* @return
*/
ProjectTeam insert(ProjectTeam projectTeam);
/**
*
*
* @param projectTeam
* @return
*/
ProjectTeam update(ProjectTeam projectTeam);
/**
*
*
* @param teamId
* @return
*/
boolean deleteById(Integer teamId);
void insertBatch(List<ProjectTeam> projectTeamList);
ProjectTeam personnelChanges(ProjectTeam teamList);
}

View File

@ -0,0 +1,97 @@
package tech.unissense.pms.business.projectteam.service.impl;
import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
import tech.unissense.pms.business.projectteam.mapper.ProjectTeamMapper;
import tech.unissense.pms.business.projectteam.service.IProjectTeamService;
import org.springframework.stereotype.Service;
import tech.unissense.pms.common.utils.DateUtils;
import tech.unissense.pms.common.utils.SecurityUtils;
import java.util.List;
import javax.annotation.Resource;
/**
* (ProjectTeam)
*
* @author ch
* @since 2024-10-08 14:27:23
*/
@Service("projectTeamService")
public class ProjectTeamServiceImpl implements IProjectTeamService {
@Resource
private ProjectTeamMapper projectTeamMapper;
/**
* ID
*
* @param teamId
* @return
*/
@Override
public ProjectTeam queryById(Integer teamId) {
return this.projectTeamMapper.queryById(teamId);
}
/**
*
*
* @param projectTeam
* @param pageRequest
* @return
*/
@Override
public List<ProjectTeam> list(ProjectTeam projectTeam) {
return this.projectTeamMapper.list(projectTeam);
}
/**
*
*
* @param projectTeam
* @return
*/
@Override
public ProjectTeam insert(ProjectTeam projectTeam) {
this.projectTeamMapper.insert(projectTeam);
return projectTeam;
}
/**
*
*
* @param projectTeam
* @return
*/
@Override
public ProjectTeam update(ProjectTeam projectTeam) {
this.projectTeamMapper.update(projectTeam);
return this.queryById(projectTeam.getTeamId());
}
/**
*
*
* @param teamId
* @return
*/
@Override
public boolean deleteById(Integer teamId) {
return this.projectTeamMapper.deleteById(teamId) > 0;
}
@Override
public void insertBatch(List<ProjectTeam> projectTeamList) {
this.projectTeamMapper.insertBatch(projectTeamList);
}
@Override
public ProjectTeam personnelChanges(ProjectTeam team) {
if (team.getTeamId()!=null){
projectTeamMapper.update(team);
}else {
projectTeamMapper.insert(team);
}
return team;
}
}

View File

@ -0,0 +1,27 @@
package tech.unissense.pms.business.projectteam.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author : ch
* @version : 1.0
* @ClassName : TeamStaticsVo
* @Description :
* @DATE : Created in 15:25 2024/10/9
* <pre> Copyright: Copyright(c)2024 </pre>
* <pre> Company : </pre>
* Modification History:
* Date Author Version Discription
* --------------------------------------------------------------------------
* 2024/10/9 ch 1.0 Why & What is modified: <> *
*/
@Data
public class TeamStaticsVo {
private Integer teamId;
private String userName;
private Integer userId;
private String postId;
private BigDecimal workTime;
}

View File

@ -0,0 +1,56 @@
package tech.unissense.pms.business.work.logger.domain;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import lombok.Data;
import tech.unissense.pms.common.core.domain.BaseEntity;
/**
* (WorkLogger)
*
* @author ch
* @since 2024-10-09 09:51:45
*/
@Data
public class WorkLogger extends BaseEntity {
private static final long serialVersionUID = -94126267083500772L;
/**
* id
*/
private Integer loggerId;
/**
*
*/
private Date loggerDate;
/**
* id
*/
private Integer projectId;
/**
* id
*/
private Integer userId;
private String userName;
/**
*
*/
private String workTime;
/**
*
*/
private String workContent;
/**
* 0 -; 1-
*/
private String state;
private Date startDate;
private Date endDate;
private List<Integer> projectIdList;
}

View File

@ -0,0 +1,86 @@
package tech.unissense.pms.business.work.logger.mapper;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* (WorkLogger)访
*
* @author ch
* @since 2024-10-09 09:51:44
*/
public interface WorkLoggerMapper {
/**
* ID
*
* @param id
* @return
*/
WorkLogger queryById(Integer id);
/**
*
*
* @param workLogger
* @param pageable
* @return
*/
List<WorkLogger> list(WorkLogger workLogger);
/**
*
*
* @param workLogger
* @return
*/
long count(WorkLogger workLogger);
/**
*
*
* @param workLogger
* @return
*/
int insert(WorkLogger workLogger);
/**
* MyBatisforeach
*
* @param entities List<WorkLogger>
* @return
*/
int insertBatch(@Param("entities") List<WorkLogger> entities);
/**
* MyBatisforeach
*
* @param entities List<WorkLogger>
* @return
* @throws org.springframework.jdbc.BadSqlGrammarException ListSQL
*/
int insertOrUpdateBatch(@Param("entities") List<WorkLogger> entities);
/**
*
*
* @param workLogger
* @return
*/
int update(WorkLogger workLogger);
/**
*
*
* @param id
* @return
*/
int deleteById(Integer id);
List<WorkLogger> calendar(WorkLogger workLogger);
List<WorkLogger> listUser(WorkLogger workLogger);
}

View File

@ -0,0 +1,71 @@
package tech.unissense.pms.business.work.logger.service;
import tech.unissense.pms.business.project.domain.Project;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import tech.unissense.pms.business.work.logger.vo.CalendarVo;
import tech.unissense.pms.business.work.logger.vo.StaticsHourVo;
import java.util.List;
/**
* (WorkLogger)
*
* @author ch
* @since 2024-10-09 09:51:46
*/
public interface IWorkLoggerService {
/**
* ID
*
* @param id
* @return
*/
WorkLogger queryById(Integer id);
/**
*
*
* @param workLogger
* @param pageRequest
* @return
*/
List<WorkLogger> list(WorkLogger workLogger);
/**
*
*
* @param workLogger
* @return
*/
WorkLogger insert(WorkLogger workLogger);
/**
*
*
* @param workLogger
* @return
*/
WorkLogger update(WorkLogger workLogger);
/**
*
*
* @param id
* @return
*/
boolean deleteById(Integer id);
WorkLogger getInfo(WorkLogger workLogger);
List<CalendarVo> calendar(WorkLogger workLogger);
List<StaticsHourVo> projectStatics(List<Project> projects, String workHour);
List<StaticsHourVo> personStatics(Project project);
List<WorkLogger> listUser(WorkLogger workLogger);
String getRemaining(WorkLogger workLogger);
}

View File

@ -0,0 +1,252 @@
package tech.unissense.pms.business.work.logger.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import org.springframework.stereotype.Service;
import tech.unissense.pms.business.project.domain.Project;
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import tech.unissense.pms.business.work.logger.mapper.WorkLoggerMapper;
import tech.unissense.pms.business.work.logger.service.IWorkLoggerService;
import tech.unissense.pms.business.work.logger.vo.CalendarVo;
import tech.unissense.pms.business.work.logger.vo.StaticsHourVo;
import tech.unissense.pms.common.utils.DateUtils;
import tech.unissense.pms.common.utils.SecurityUtils;
import java.util.Objects;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* (WorkLogger)
*
* @author ch
* @since 2024-10-09 09:51:46
*/
@Service("workHourService")
public class WorkLoggerServiceImpl implements IWorkLoggerService {
@Resource
private WorkLoggerMapper workLoggerMapper;
/**
* ID
*
* @param id
* @return
*/
@Override
public WorkLogger queryById(Integer id) {
return this.workLoggerMapper.queryById(id);
}
/**
*
*
* @param workLogger
* @param pageRequest
* @return
*/
@Override
public List<WorkLogger> list(WorkLogger workLogger) {
return this.workLoggerMapper.list(workLogger);
}
/**
*
*
* @param workLogger
* @return
*/
@Override
public WorkLogger insert(WorkLogger workLogger) {
this.workLoggerMapper.insert(workLogger);
return workLogger;
}
/**
*
*
* @param workLogger
* @return
*/
@Override
public WorkLogger update(WorkLogger workLogger) {
this.workLoggerMapper.update(workLogger);
return this.queryById(workLogger.getLoggerId());
}
/**
*
*
* @param id
* @return
*/
@Override
public boolean deleteById(Integer id) {
return this.workLoggerMapper.deleteById(id) > 0;
}
@Override
public WorkLogger getInfo(WorkLogger workLogger) {
List<WorkLogger> list = this.workLoggerMapper.list(workLogger);
return CollUtil.isNotEmpty(list) ? list.get(0) : null;
}
@Override
public List<CalendarVo> calendar(WorkLogger workLogger) {
List<WorkLogger> calendar = workLoggerMapper.calendar(workLogger);
Map<String, WorkLogger> calendarMap = calendar.stream().collect(Collectors.toMap(
item -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()), Function.identity(), (v1, v2) -> v1));
LocalDate startDate = workLogger.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = workLogger.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
List<CalendarVo> result = new ArrayList<>();
for (LocalDate localDate = startDate; !localDate.isAfter(endDate); localDate = localDate.plusDays(1)) {
CalendarVo calendarVo = new CalendarVo();
String key = localDate.toString();
WorkLogger temp = calendarMap.get(key);
calendarVo.setDate(DateUtils.toDate(localDate));
calendarVo.setState(temp != null ? temp.getState() : "-1");
result.add(calendarVo);
}
return result;
}
@Override
public List<StaticsHourVo> projectStatics(List<Project> projects, String userId) {
if (CollUtil.isEmpty(projects) || userId == null) {
return ListUtil.empty();
}
// 提取项目ID列表
List<Integer> projectIds = projects.stream()
.map(Project::getProjectId)
.filter(Objects::nonNull) // 检查ProjectId是否为null
.collect(Collectors.toList());
if (projectIds.isEmpty()) {
return ListUtil.empty();
}
// 创建一个Map用于快速查找项目的开始和结束日期
Map<Integer, Project> projectMap = projects.stream()
.filter(project -> project.getProjectId() != null) // 确保ProjectId不为null
.collect(Collectors.toMap(Project::getProjectId, project -> project));
// 创建WorkHour对象并设置查询条件
WorkLogger workLogger = new WorkLogger();
workLogger.setProjectIdList(projectIds);
workLogger.setCreateBy(userId);
// 查询与项目ID和用户ID相关的工时记录
List<WorkLogger> list = workLoggerMapper.list(workLogger);
if (list == null) {
return ListUtil.empty();
}
// 按项目ID汇总工时
Map<Integer, BigDecimal> workHourMap = list.stream().filter(item -> {
if (item == null || item.getProjectId() == null || item.getLoggerDate() == null) {
return false;
}
Project project = projectMap.get(item.getProjectId());
if (project == null || project.getStartDate() == null || project.getEndDate() == null) {
return false;
}
return !item.getLoggerDate().before(project.getStartDate()) && !item.getLoggerDate().after(project.getEndDate());
})
.collect(Collectors.toMap(
WorkLogger::getProjectId,
item -> new BigDecimal(item.getWorkTime()),
BigDecimal::add
));
return generateStaticsHourVoList(projects, workHourMap, Project::getProjectId, Project::getProjectName);
}
@Override
public List<StaticsHourVo> personStatics(Project project) {
// 创建WorkHour对象并设置查询条件
WorkLogger workLogger = new WorkLogger();
workLogger.setProjectId(project.getProjectId());
workLogger.setStartDate(project.getStartDate());
workLogger.setEndDate(project.getEndDate());
// 查询与项目ID相关的工时记录
List<WorkLogger> workLoggers = workLoggerMapper.list(workLogger);
// 按创建者用户ID汇总工时
Map<String, BigDecimal> personWorkHourMap = workLoggers.stream()
.collect(Collectors.toMap(
WorkLogger::getCreateBy,
item->new BigDecimal(item.getWorkTime()),
BigDecimal::add
));
// 生成StaticsHourVo列表
return generateStaticsHourVoList(personWorkHourMap);
}
@Override
public List<WorkLogger> listUser(WorkLogger workLogger) {
return workLoggerMapper.listUser(workLogger);
}
@Override
public String getRemaining(WorkLogger workLogger) {
// 获取当前登录用户的ID
Long userId = SecurityUtils.getLoginUser().getUserId();
// 设置用户ID和当天的零点时间
workLogger.setUserId(userId.intValue());
if (workLogger.getLoggerDate()==null) {
workLogger.setLoggerDate(DateUtils.getNowDate());
}
workLogger.setLoggerDate(DateUtils.toDate(workLogger.getLoggerDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()));
// 查询工作日志列表
List<WorkLogger> list = workLoggerMapper.list(workLogger);
// 计算workTime之和
BigDecimal totalWorkTime = list.stream()
.map(item->new BigDecimal(item.getWorkTime())) // 假设WorkLogger有getWorkTime方法返回BigDecimal
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 返回总和的字符串表示
return BigDecimal.ONE.subtract(totalWorkTime).toString();
}
// 泛型方法,用于生成统计工时的列表,适用于项目统计
private <T> List<StaticsHourVo> generateStaticsHourVoList(List<T> items, Map<Integer, BigDecimal> workDayMap,
Function<T, Integer> idExtractor, Function<T, String> nameExtractor) {
return items.stream()
// 对每个项目项创建一个StaticsHourVo对象
.map(item -> createStaticsHourVo(nameExtractor.apply(item), workDayMap.getOrDefault(idExtractor.apply(item), BigDecimal.ZERO)
,idExtractor.apply(item)))
.collect(Collectors.toList());
}
// 用于生成统计工时的列表,适用于个人统计
private List<StaticsHourVo> generateStaticsHourVoList(Map<String, BigDecimal> workDayMap) {
return workDayMap.entrySet().stream()
// 对每个用户创建一个StaticsHourVo对象
.map(entry -> createStaticsHourVo(entry.getKey(), entry.getValue(),null))
.collect(Collectors.toList());
}
// 创建StaticsHourVo对象计算工时并格式化为字符串
private StaticsHourVo createStaticsHourVo(String name, BigDecimal workTime,Integer projectId) {
StaticsHourVo vo = new StaticsHourVo();
vo.setProjectId(projectId);
vo.setName(name);
// 将总工时除以8表示为工作日并保留两位小数
vo.setWorkTime(workTime);
return vo;
}
}

View File

@ -0,0 +1,25 @@
package tech.unissense.pms.business.work.logger.vo;
import lombok.Data;
import java.util.Date;
/**
* @author : ch
* @version : 1.0
* @ClassName : CalendarVo
* @Description :
* @DATE : Created in 11:40 2024/10/9
* <pre> Copyright: Copyright(c)2024 </pre>
* <pre> Company : </pre>
* Modification History:
* Date Author Version Discription
* --------------------------------------------------------------------------
* 2024/10/9 ch 1.0 Why & What is modified: <> *
*/
@Data
public class CalendarVo {
private Date date;
private String state;
}

View File

@ -0,0 +1,26 @@
package tech.unissense.pms.business.work.logger.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author : ch
* @version : 1.0
* @ClassName : CalendarVo
* @Description :
* @DATE : Created in 11:40 2024/10/9
* <pre> Copyright: Copyright(c)2024 </pre>
* <pre> Company : </pre>
* Modification History:
* Date Author Version Discription
* --------------------------------------------------------------------------
* 2024/10/9 ch 1.0 Why & What is modified: <> *
*/
@Data
public class StaticsHourVo {
private Integer projectId;
private String name;
private BigDecimal workTime;
}

View File

@ -0,0 +1,312 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="tech.unissense.pms.business.project.mapper.ProjectMapper">
<resultMap type="tech.unissense.pms.business.project.domain.Project" id="ProjectMap">
<result property="projectId" column="project_id" jdbcType="INTEGER"/>
<result property="tenantId" column="tenant_id" jdbcType="INTEGER"/>
<result property="projectName" column="project_name" jdbcType="VARCHAR"/>
<result property="projectCode" column="project_code" jdbcType="VARCHAR"/>
<result property="projectLeader" column="project_leader" jdbcType="VARCHAR"/>
<result property="projectLeaderName" column="project_leader_name" jdbcType="VARCHAR"/>
<result property="startDate" column="start_date" jdbcType="TIMESTAMP"/>
<result property="endDate" column="end_date" jdbcType="TIMESTAMP"/>
<result property="budgetDate" column="budget_date" jdbcType="INTEGER"/>
<result property="state" column="state" jdbcType="VARCHAR"/>
<result property="dataState" column="data_state" jdbcType="VARCHAR"/>
<result property="projectState" column="project_state" jdbcType="VARCHAR"/>
<result property="createBy" column="create_by" jdbcType="INTEGER"/>
<result property="updateBy" column="update_by" jdbcType="INTEGER"/>
<result property="updateByName" column="update_by_name" jdbcType="VARCHAR"/>
<result property="createByName" column="create_by_name" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="teamNum" column="team_num" jdbcType="INTEGER"/>
</resultMap>
<sql id="base_query">
select project_id,
tenant_id,
project_name,
project_code,
project_leader,
start_date,
end_date,
budget_date,
state,
project_state,
create_by,
update_by,
update_time,
create_time
from pms_project
</sql>
<!--查询单个-->
<select id="queryById" resultMap="ProjectMap">
select t1.project_id,
t1.tenant_id,
t1.project_name,
t1.project_code,
t1.project_leader,
t1.start_date,
t1.end_date,
t1.budget_date,
t1.state,
t1.project_state,
t1.data_state,
t1.create_by,
t1.update_by,
t1.update_time,
t1.create_time,
t2.nick_name project_leader_name
from pms_project t1 left join sys_user t2 on t1.project_leader=t2.user_id
where project_id = #{projectId}
</select>
<!--查询指定行数据-->
<select id="list" resultMap="ProjectMap">
select
t1.project_id, t1.tenant_id, t1.project_name, t1.project_code, t1.project_leader,t4.nick_name project_leader_name, t1.start_date, t1.end_date, t1.budget_date, t1.state,
t1.project_state, t1.data_state, t1.create_by, t1.update_by, t1.update_time, t1.create_time,t2.team_num,t3.nick_name create_by_name
from pms_project t1 left join (select count(1) team_num,project_id from pms_project_team group by project_id) t2 on t1.project_id=t2.project_id
left join sys_user t3 on t1.create_by=t3.user_id
left join sys_user t4 on t1.project_leader=t4.user_id
where state=0
<if test="projectId != null">
and t1.project_id = #{projectId}
</if>
<if test="tenantId != null">
and t1.tenant_id = #{tenantId}
</if>
<if test="projectName != null and projectName != ''">
and t1.project_name like concat('%',#{projectName},'%')
</if>
<if test="projectCode != null and projectCode != ''">
and t1.project_code = #{projectCode}
</if>
<if test="projectLeader != null and projectLeader != ''">
and t1.project_leader = #{projectLeader}
</if>
<if test="startDate != null">
and t1.start_date = #{startDate}
</if>
<if test="endDate != null">
and t1.end_date = #{endDate}
</if>
<if test="budgetDate != null">
and t1.budget_date = #{budgetDate}
</if>
<if test="state != null and state != ''">
and t1.state = #{state}
</if>
<if test="projectState != null and projectState != ''">
<!-- and t1.project_state = #{projectState} -->
<choose>
<when test="projectState=='0'.toString()">
and t1.start_date <![CDATA[ > ]]> sysdate()
</when>
<when test="projectState=='1'.toString()">
and sysdate() between t1.start_date and t1.end_date
</when>
<when test="projectState=='2'.toString()">
and t1.end_date <![CDATA[ < ]]> sysdate()
</when>
</choose>
</if>
<if test="createBy != null">
and t1.create_by = #{createBy}
</if>
<if test="updateBy != null">
and t1.update_by = #{updateBy}
</if>
<if test="updateTime != null">
and t1.update_time = #{updateTime}
</if>
<if test="createTime != null">
and t1.create_time = #{createTime}
</if>
<if test="queryUserId != null">
and (t1.project_id in (select project_id from pms_project_team where user_id=#{queryUserId} ))
</if>
${params.dataScope}
order by start_date desc
</select>
<!--统计总行数-->
<select id="count" resultType="java.lang.Long">
select count(1)
from pms_project
<where>
<if test="projectId != null">
and project_id = #{projectId}
</if>
<if test="tenantId != null">
and tenant_id = #{tenantId}
</if>
<if test="projectName != null and projectName != ''">
and project_name = #{projectName}
</if>
<if test="projectCode != null and projectCode != ''">
and project_code = #{projectCode}
</if>
<if test="projectLeader != null and projectLeader != ''">
and project_leader = #{projectLeader}
</if>
<if test="startDate != null">
and start_date = #{startDate}
</if>
<if test="endDate != null">
and end_date = #{endDate}
</if>
<if test="budgetDate != null">
and budget_date = #{budgetDate}
</if>
<if test="state != null and state != ''">
and state = #{state}
</if>
<if test="projectState != null and projectState != ''">
and project_state = #{projectState}
</if>
<if test="createBy != null">
and create_by = #{createBy}
</if>
<if test="updateBy != null">
and update_by = #{updateBy}
</if>
<if test="updateTime != null">
and update_time = #{updateTime}
</if>
<if test="createTime != null">
and create_time = #{createTime}
</if>
</where>
</select>
<select id="checkProjectUnique" resultMap="ProjectMap">
<include refid="base_query"/>
where (project_name=#{projectName} or project_code=#{projectCode}) and state=0 limit 1
</select>
<select id="selectProjectCode" resultType="java.lang.String">
SELECT project_code
FROM pms_project
WHERE project_code LIKE CONCAT('PM', DATE_FORMAT(#{date}, '%Y%m%d'), '%')
ORDER BY project_code DESC
LIMIT 1
</select>
<!--新增所有列-->
<insert id="insert" keyProperty="projectId" useGeneratedKeys="true">
insert into pms_project(tenant_id, project_name, project_code, project_leader, start_date, end_date,
budget_date, state, project_state, data_state, create_by, update_by,
update_time, create_time)
values (#{tenantId}, #{projectName}, #{projectCode}, #{projectLeader}, #{startDate}, #{endDate}, #{budgetDate},
#{state}, #{projectState},#{dataState}, #{createBy}, #{updateBy}, #{updateTime},
#{createTime})
</insert>
<insert id="insertBatch" keyProperty="projectId" useGeneratedKeys="true">
insert into pms_project(tenant_id, project_name, project_code, project_leader, start_date, end_date,
budget_date, state, project_state, create_by, update_by, update_time,
create_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.tenantId}, #{entity.projectName}, #{entity.projectCode}, #{entity.projectLeader},
#{entity.startDate}, #{entity.endDate}, #{entity.budgetDate}, #{entity.state}, #{entity.projectState},
#{entity.createBy}, #{entity.updateBy},
#{entity.updateTime}, #{entity.createTime})
</foreach>
</insert>
<insert id="insertOrUpdateBatch" keyProperty="projectId" useGeneratedKeys="true">
insert into pms_project(tenant_id, project_name, project_code, project_leader, start_date, end_date,
budget_date, state, project_state, create_by, update_by, update_time,
create_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.tenantId}, #{entity.projectName}, #{entity.projectCode}, #{entity.projectLeader},
#{entity.startDate}, #{entity.endDate}, #{entity.budgetDate}, #{entity.state}, #{entity.projectState},
#{entity.createBy}, #{entity.updateBy},
#{entity.updateTime}, #{entity.createTime})
</foreach>
on duplicate key update
tenant_id = values(tenant_id),
project_name = values(project_name),
project_code = values(project_code),
project_leader = values(project_leader),
start_date = values(start_date),
end_date = values(end_date),
budget_date = values(budget_date),
state = values(state),
project_state = values(project_state),
create_by = values(create_by),
update_by = values(update_by),
update_time = values(update_time),
create_time = values(create_time)
</insert>
<!--通过主键修改数据-->
<update id="update">
update pms_project
<set>
<if test="tenantId != null">
tenant_id = #{tenantId},
</if>
<if test="projectName != null and projectName != ''">
project_name = #{projectName},
</if>
<if test="projectCode != null and projectCode != ''">
project_code = #{projectCode},
</if>
<if test="projectLeader != null and projectLeader != ''">
project_leader = #{projectLeader},
</if>
<if test="startDate != null">
start_date = #{startDate},
</if>
<if test="endDate != null">
end_date = #{endDate},
</if>
<if test="budgetDate != null">
budget_date = #{budgetDate},
</if>
<if test="state != null and state != ''">
state = #{state},
</if>
<if test="dataState != null and dataState != ''">
data_state = #{dataState},
</if>
<if test="projectState != null and projectState != ''">
project_state = #{projectState},
</if>
<if test="createBy != null">
create_by = #{createBy},
</if>
<if test="updateBy != null">
update_by = #{updateBy},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
</set>
where project_id = #{projectId}
</update>
<update id="logicalDeleteById">
update pms_project
set state = 1
where project_id = #{projectId}
</update>
<!--通过主键删除-->
<delete id="deleteById">
delete
from pms_project
where project_id = #{projectId}
</delete>
</mapper>

View File

@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="tech.unissense.pms.business.projectteam.mapper.ProjectTeamMapper">
<resultMap type="tech.unissense.pms.business.projectteam.domain.ProjectTeam" id="ProjectTeamMap">
<result property="projectId" column="project_id" jdbcType="INTEGER"/>
<result property="teamId" column="team_id" jdbcType="INTEGER"/>
<result property="userId" column="user_id" jdbcType="INTEGER"/>
<result property="userName" column="user_name" jdbcType="INTEGER"/>
<result property="postId" column="post_id" jdbcType="VARCHAR"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="base_query">
select project_id,
team_id,
user_id,
post_id,
create_by,
update_by,
update_time,
create_time
from pms_project_team
</sql>
<!--查询单个-->
<select id="queryById" resultMap="ProjectTeamMap">
select project_id,
team_id,
user_id,
post_id,
create_by,
update_by,
update_time,
create_time
from pms_project_team
where team_id = #{teamId}
</select>
<!--查询指定行数据-->
<select id="list" resultMap="ProjectTeamMap">
select
t1.project_id, t1.team_id, t1.user_id, t1.post_id, t1.create_by, t1.update_by, t1.update_time, t1.create_time,
t2.nick_name as user_name
from pms_project_team t1
left join sys_user t2 on t1.user_id=t2.user_id
<where>
<if test="projectId != null">
and t1.project_id = #{projectId}
</if>
<if test="projectIdList != null and projectIdList.size>0">
and t1.project_id in
<foreach collection="projectIdList" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="teamId != null">
and t1.team_id = #{teamId}
</if>
<if test="userId != null">
and t1.user_id = #{userId}
</if>
<if test="postId != null and postId != ''">
and t1.post_id = #{postId}
</if>
<if test="createBy != null and createBy != ''">
and t1.create_by = #{createBy}
</if>
<if test="updateBy != null and updateBy != ''">
and t1.update_by = #{updateBy}
</if>
<if test="updateTime != null">
and t1.update_time = #{updateTime}
</if>
<if test="createTime != null">
and t1.create_time = #{createTime}
</if>
</where>
order by t1.create_time desc
</select>
<!--统计总行数-->
<select id="count" resultType="java.lang.Long">
select count(1)
from pms_project_team
<where>
<if test="projectId != null">
and project_id = #{projectId}
</if>
<if test="teamId != null">
and team_id = #{teamId}
</if>
<if test="userId != null">
and user_id = #{userId}
</if>
<if test="postId != null and postId != ''">
and post_id = #{postId}
</if>
<if test="createBy != null and createBy != ''">
and create_by = #{createBy}
</if>
<if test="updateBy != null and updateBy != ''">
and update_by = #{updateBy}
</if>
<if test="updateTime != null">
and update_time = #{updateTime}
</if>
<if test="createTime != null">
and create_time = #{createTime}
</if>
</where>
</select>
<!--新增所有列-->
<insert id="insert" keyProperty="teamId" useGeneratedKeys="true">
insert into pms_project_team(project_id, user_id, post_id, create_by, update_by, update_time, create_time)
values (#{projectId}, #{userId}, #{postId}, #{createBy}, #{updateBy}, #{updateTime}, #{createTime})
</insert>
<insert id="insertBatch" keyProperty="teamId" useGeneratedKeys="true">
insert into pms_project_team(project_id, user_id, post_id, create_by, update_by, update_time, create_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.projectId}, #{entity.userId}, #{entity.postId}, #{entity.createBy}, #{entity.updateBy},
#{entity.updateTime}, #{entity.createTime})
</foreach>
</insert>
<insert id="insertOrUpdateBatch" keyProperty="teamId" useGeneratedKeys="true">
insert into pms_project_team(project_id, user_id, post_id, create_by, update_by, update_time, create_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.projectId}, #{entity.userId}, #{entity.postId}, #{entity.createBy}, #{entity.updateBy},
#{entity.updateTime}, #{entity.createTime})
</foreach>
on duplicate key update
project_id = values(project_id),
user_id = values(user_id),
post_id = values(post_id),
update_by = values(update_by),
update_time = values(update_time),
</insert>
<!--通过主键修改数据-->
<update id="update">
update pms_project_team
<set>
<if test="projectId != null">
project_id = #{projectId},
</if>
<if test="userId != null">
user_id = #{userId},
</if>
<if test="postId != null and postId != ''">
post_id = #{postId},
</if>
<if test="createBy != null and createBy != ''">
create_by = #{createBy},
</if>
<if test="updateBy != null and updateBy != ''">
update_by = #{updateBy},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
</set>
where team_id = #{teamId}
</update>
<!--通过主键删除-->
<delete id="deleteById">
delete
from pms_project_team
where team_id = #{teamId}
</delete>
</mapper>

View File

@ -0,0 +1,303 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="tech.unissense.pms.business.work.logger.mapper.WorkLoggerMapper">
<resultMap type="tech.unissense.pms.business.work.logger.domain.WorkLogger" id="WorkLoggerMap">
<result property="loggerId" column="logger_id" jdbcType="INTEGER"/>
<result property="loggerDate" column="logger_date" jdbcType="TIMESTAMP"/>
<result property="projectId" column="project_id" jdbcType="INTEGER"/>
<result property="userId" column="user_id" jdbcType="INTEGER"/>
<result property="userName" column="user_name" jdbcType="VARCHAR"/>
<result property="workTime" column="work_time" jdbcType="VARCHAR"/>
<result property="workContent" column="work_content" jdbcType="VARCHAR"/>
<result property="state" column="state" jdbcType="VARCHAR"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="base_query">
select logger_id,
logger_date,
project_id,
user_id,
work_time,
work_content,
state,
create_by,
update_by,
update_time,
create_time
from pms_work_logger
</sql>
<!--查询单个-->
<select id="queryById" resultMap="WorkLoggerMap">
select logger_id,
logger_date,
project_id,
user_id,
work_time,
work_content,
state,
create_by,
update_by,
update_time,
create_time
from pms_work_logger
where logger_id = #{loggerId}
</select>
<!--查询指定行数据-->
<select id="list" resultMap="WorkLoggerMap">
select
t1.logger_id, t1.logger_date, t1.project_id, t1.user_id, t1.work_time, t1.work_content, t1.state, t1.create_by, t1.update_by, t1.update_time,
t1.create_time,t2.nick_name user_name
from pms_work_logger t1 left join sys_user t2 on t1.user_id=t2.user_id
<where>
<if test="loggerId != null">
and t1.logger_id = #{loggerId}
</if>
<if test="loggerDate != null">
and t1.logger_date = #{loggerDate}
</if>
<if test="startDate != null or endDate!=null">
<choose>
<when test="startDate != null ">
and t1.logger_date <![CDATA[>=]]> #{startDate}
</when>
<when test="endDate != null">
and t1.logger_date <![CDATA[<=]]> #{endDate}
</when>
<otherwise>
and t1.logger_date between #{startDate} and #{endDate}
</otherwise>
</choose>
</if>
<if test="projectId != null">
and t1.project_id = #{projectId}
</if>
<if test="projectIdList != null and projectIdList.size>0">
and t1.project_id in
<foreach collection="projectIdList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="userId != null">
and t1.user_id = #{userId}
</if>
<if test="workTime != null">
and t1.work_time = #{workTime}
</if>
<if test="workContent != null and workContent != ''">
and t1.work_content = #{workContent}
</if>
<if test="state != null and state != ''">
and t1.state = #{state}
</if>
<if test="createBy != null and createBy != ''">
and t1.create_by = #{createBy}
</if>
<if test="updateBy != null and updateBy != ''">
and t1.update_by = #{updateBy}
</if>
<if test="updateTime != null">
and t1.update_time = #{updateTime}
</if>
<if test="createTime != null">
and t1.create_time = #{createTime}
</if>
</where>
</select>
<!--统计总行数-->
<select id="count" resultType="java.lang.Long">
select count(1)
from pms_work_logger
<where>
<if test="loggerId != null">
and logger_id = #{loggerId}
</if>
<if test="loggerDate != null">
and logger_date = #{loggerDate}
</if>
<if test="projectId != null">
and project_id = #{projectId}
</if>
<if test="userId != null">
and user_id = #{userId}
</if>
<if test="workTime != null">
and work_time = #{workTime}
</if>
<if test="workContent != null and workContent != ''">
and work_content = #{workContent}
</if>
<if test="state != null and state != ''">
and state = #{state}
</if>
<if test="createBy != null and createBy != ''">
and create_by = #{createBy}
</if>
<if test="updateBy != null and updateBy != ''">
and update_by = #{updateBy}
</if>
<if test="updateTime != null">
and update_time = #{updateTime}
</if>
<if test="createTime != null">
and create_time = #{createTime}
</if>
</where>
</select>
<!--新增所有列-->
<insert id="insert" keyProperty="loggerId" useGeneratedKeys="true">
insert into pms_work_logger(logger_date, project_id, user_id, work_time, work_content, state, create_by,
update_by, update_time, create_time)
values (#{loggerDate}, #{projectId}, #{userId}, #{workTime}, #{workContent}, #{state}, #{createBy}, #{updateBy},
#{updateTime}, #{createTime})
</insert>
<insert id="insertBatch" keyProperty="loggerId" useGeneratedKeys="true">
insert into pms_work_logger(logger_date, project_id, user_id, work_time, work_content, state, create_by,
update_by, update_time, create_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.loggerDate}, #{entity.projectId}, #{entity.userId}, #{entity.workTime}, #{entity.workContent},
#{entity.state}, #{entity.createBy}, #{entity.updateBy}, #{entity.updateTime}, #{entity.createTime})
</foreach>
</insert>
<insert id="insertOrUpdateBatch" keyProperty="loggerId" useGeneratedKeys="true">
insert into pms_work_logger(logger_date, project_id, user_id, work_time, work_content, state, create_by,
update_by, update_time, create_time)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.loggerDate}, #{entity.projectId}, #{entity.userId}, #{entity.workTime}, #{entity.workContent},
#{entity.state}, #{entity.createBy}, #{entity.updateBy}, #{entity.updateTime}, #{entity.createTime})
</foreach>
on duplicate key update
logger_date = values(logger_date),
project_id = values(project_id),
user_id = values(user_id),
work_time = values(work_time),
work_content = values(work_content),
state = values(state),
create_by = values(create_by),
update_by = values(update_by),
update_time = values(update_time),
create_time = values(create_time)
</insert>
<select id="calendar" resultMap="WorkLoggerMap">
<include refid="base_query" />
where project_id = #{projectId}
and logger_date between #{startDate} and #{endDate}
and user_id=#{userId}
</select>
<select id="listUser" resultMap="WorkLoggerMap">
select
t1.logger_date, t1.user_id, t1.work_time,
t1.create_time,t2.nick_name user_name
from pms_work_logger t1 left join sys_user t2 on t1.user_id=t2.user_id
<where>
<if test="loggerId != null">
and t1.logger_id = #{loggerId}
</if>
<if test="loggerDate != null">
and t1.logger_date = #{loggerDate}
</if>
<if test="startDate != null or endDate!=null">
<choose>
<when test="startDate != null ">
and t1.logger_date <![CDATA[>=]]> #{startDate}
</when>
<when test="endDate != null">
and t1.logger_date <![CDATA[<=]]> #{endDate}
</when>
<otherwise>
and t1.logger_date between #{startDate} and #{endDate}
</otherwise>
</choose>
</if>
<if test="projectId != null">
and t1.project_id = #{projectId}
</if>
<if test="projectIdList != null and projectIdList.size>0">
and t1.project_id in
<foreach collection="projectIdList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="userId != null">
and t1.user_id = #{userId}
</if>
<if test="workTime != null">
and t1.work_time = #{workTime}
</if>
<if test="workContent != null and workContent != ''">
and t1.work_content = #{workContent}
</if>
<if test="state != null and state != ''">
and t1.state = #{state}
</if>
<if test="createBy != null and createBy != ''">
and t1.create_by = #{createBy}
</if>
<if test="updateBy != null and updateBy != ''">
and t1.update_by = #{updateBy}
</if>
<if test="updateTime != null">
and t1.update_time = #{updateTime}
</if>
<if test="createTime != null">
and t1.create_time = #{createTime}
</if>
</where>
</select>
<!--通过主键修改数据-->
<update id="update">
update pms_work_logger
<set>
<if test="loggerDate != null">
logger_date = #{loggerDate},
</if>
<if test="projectId != null">
project_id = #{projectId},
</if>
<if test="userId != null">
user_id = #{userId},
</if>
<if test="workTime != null">
work_time = #{workTime},
</if>
<if test="workContent != null and workContent != ''">
work_content = #{workContent},
</if>
<if test="state != null and state != ''">
state = #{state},
</if>
<if test="createBy != null and createBy != ''">
create_by = #{createBy},
</if>
<if test="updateBy != null and updateBy != ''">
update_by = #{updateBy},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
</set>
where logger_id = #{loggerId}
</update>
<!--通过主键删除-->
<delete id="deleteById">
delete
from pms_work_logger
where logger_id = #{loggerId}
</delete>
</mapper>

124
pms-common/pom.xml 100644
View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pms</artifactId>
<groupId>tech.unissense</groupId>
<version>3.8.8</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>pms-common</artifactId>
<description>
common通用工具
</description>
<dependencies>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- SpringWeb模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- spring security 安全认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<!-- 自定义验证注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--常用工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- JSON工具类 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<!-- io常用工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
<!-- Jaxb -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- pool 对象池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 解析客户端操作系统、浏览器等 -->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
</dependency>
<!-- servlet包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,19 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 访
*
* @author ruoyi
*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous
{
}

View File

@ -0,0 +1,33 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
*
* @author ruoyi
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope
{
/**
*
*/
public String deptAlias() default "";
/**
*
*/
public String userAlias() default "";
/**
* @ss
*/
public String permission() default "";
}

View File

@ -0,0 +1,28 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import tech.unissense.pms.common.enums.DataSourceType;
/**
*
*
*
*
* @author ruoyi
*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource
{
/**
*
*/
public DataSourceType value() default DataSourceType.MASTER;
}

View File

@ -0,0 +1,192 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import tech.unissense.pms.common.utils.poi.ExcelHandlerAdapter;
/**
* Excel
*
* @author ruoyi
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
/**
* excel
*/
public int sort() default Integer.MAX_VALUE;
/**
* Excel.
*/
public String name() default "";
/**
* , : yyyy-MM-dd
*/
public String dateFormat() default "";
/**
* type (: sys_user_sex)
*/
public String dictType() default "";
/**
* (: 0=,1=,2=)
*/
public String readConverterExp() default "";
/**
*
*/
public String separator() default ",";
/**
* BigDecimal :-1(BigDecimal)
*/
public int scale() default -1;
/**
* BigDecimal :BigDecimal.ROUND_HALF_EVEN
*/
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/**
* excel
*/
public double height() default 14;
/**
* excel
*/
public double width() default 16;
/**
* ,% 90 90%
*/
public String suffix() default "";
/**
* ,
*/
public String defaultValue() default "";
/**
*
*/
public String prompt() default "";
/**
* .
*/
public String[] combo() default {};
/**
* combo,,dictType.
*/
public boolean comboReadDict() default false;
/**
* ,:list)
*/
public boolean needMerge() default false;
/**
* ,:,.
*/
public boolean isExport() default true;
/**
* ,,
*/
public String targetAttr() default "";
/**
* ,
*/
public boolean isStatistics() default false;
/**
* 0 1 2
*/
public ColumnType cellType() default ColumnType.STRING;
/**
*
*/
public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
/**
*
*/
public IndexedColors headerColor() default IndexedColors.WHITE;
/**
*
*/
public IndexedColors backgroundColor() default IndexedColors.WHITE;
/**
*
*/
public IndexedColors color() default IndexedColors.BLACK;
/**
*
*/
public HorizontalAlignment align() default HorizontalAlignment.CENTER;
/**
*
*/
public Class<?> handler() default ExcelHandlerAdapter.class;
/**
*
*/
public String[] args() default {};
/**
* 012
*/
Type type() default Type.ALL;
public enum Type
{
ALL(0), EXPORT(1), IMPORT(2);
private final int value;
Type(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
public enum ColumnType
{
NUMERIC(0), STRING(1), IMAGE(2), TEXT(3);
private final int value;
ColumnType(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
}

View File

@ -0,0 +1,18 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Excel
*
* @author ruoyi
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Excels
{
public Excel[] value();
}

View File

@ -0,0 +1,51 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import tech.unissense.pms.common.enums.BusinessType;
import tech.unissense.pms.common.enums.OperatorType;
/**
*
*
* @author ruoyi
*
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log
{
/**
*
*/
public String title() default "";
/**
*
*/
public BusinessType businessType() default BusinessType.OTHER;
/**
*
*/
public OperatorType operatorType() default OperatorType.MANAGE;
/**
*
*/
public boolean isSaveRequestData() default true;
/**
*
*/
public boolean isSaveResponseData() default true;
/**
*
*/
public String[] excludeParamNames() default {};
}

View File

@ -0,0 +1,40 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import tech.unissense.pms.common.constant.CacheConstants;
import tech.unissense.pms.common.enums.LimitType;
/**
*
*
* @author ruoyi
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter
{
/**
* key
*/
public String key() default CacheConstants.RATE_LIMIT_KEY;
/**
* ,
*/
public int time() default 60;
/**
*
*/
public int count() default 100;
/**
*
*/
public LimitType limitType() default LimitType.DEFAULT;
}

View File

@ -0,0 +1,31 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
*
* @author ruoyi
*
*/
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit
{
/**
* (ms)
*/
public int interval() default 5000;
/**
*
*/
public String message() default "不允许重复提交,请稍候再试";
}

View File

@ -0,0 +1,24 @@
package tech.unissense.pms.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import tech.unissense.pms.common.config.serializer.SensitiveJsonSerializer;
import tech.unissense.pms.common.enums.DesensitizedType;
/**
*
*
* @author ruoyi
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive
{
DesensitizedType desensitizedType();
}

View File

@ -0,0 +1,122 @@
package tech.unissense.pms.common.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
*
*
* @author ruoyi
*/
@Component
@ConfigurationProperties(prefix = "ruoyi")
public class RuoYiConfig
{
/** 项目名称 */
private String name;
/** 版本 */
private String version;
/** 版权年份 */
private String copyrightYear;
/** 上传路径 */
private static String profile;
/** 获取地址开关 */
private static boolean addressEnabled;
/** 验证码类型 */
private static String captchaType;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getVersion()
{
return version;
}
public void setVersion(String version)
{
this.version = version;
}
public String getCopyrightYear()
{
return copyrightYear;
}
public void setCopyrightYear(String copyrightYear)
{
this.copyrightYear = copyrightYear;
}
public static String getProfile()
{
return profile;
}
public void setProfile(String profile)
{
RuoYiConfig.profile = profile;
}
public static boolean isAddressEnabled()
{
return addressEnabled;
}
public void setAddressEnabled(boolean addressEnabled)
{
RuoYiConfig.addressEnabled = addressEnabled;
}
public static String getCaptchaType() {
return captchaType;
}
public void setCaptchaType(String captchaType) {
RuoYiConfig.captchaType = captchaType;
}
/**
*
*/
public static String getImportPath()
{
return getProfile() + "/import";
}
/**
*
*/
public static String getAvatarPath()
{
return getProfile() + "/avatar";
}
/**
*
*/
public static String getDownloadPath()
{
return getProfile() + "/download/";
}
/**
*
*/
public static String getUploadPath()
{
return getProfile() + "/upload";
}
}

View File

@ -0,0 +1,67 @@
package tech.unissense.pms.common.config.serializer;
import java.io.IOException;
import java.util.Objects;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import tech.unissense.pms.common.annotation.Sensitive;
import tech.unissense.pms.common.core.domain.model.LoginUser;
import tech.unissense.pms.common.enums.DesensitizedType;
import tech.unissense.pms.common.utils.SecurityUtils;
/**
*
*
* @author ruoyi
*/
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer
{
private DesensitizedType desensitizedType;
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException
{
if (desensitization())
{
gen.writeString(desensitizedType.desensitizer().apply(value));
}
else
{
gen.writeString(value);
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
throws JsonMappingException
{
Sensitive annotation = property.getAnnotation(Sensitive.class);
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass()))
{
this.desensitizedType = annotation.desensitizedType();
return this;
}
return prov.findValueSerializer(property.getType(), property);
}
/**
*
*/
private boolean desensitization()
{
try
{
LoginUser securityUser = SecurityUtils.getLoginUser();
// 管理员不脱敏
return !securityUser.getUser().isAdmin();
}
catch (Exception e)
{
return true;
}
}
}

View File

@ -0,0 +1,44 @@
package tech.unissense.pms.common.constant;
/**
* key
*
* @author ruoyi
*/
public class CacheConstants
{
/**
* redis key
*/
public static final String LOGIN_TOKEN_KEY = "login_tokens:";
/**
* redis key
*/
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
/**
* cache key
*/
public static final String SYS_CONFIG_KEY = "sys_config:";
/**
* cache key
*/
public static final String SYS_DICT_KEY = "sys_dict:";
/**
* redis key
*/
public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
/**
* redis key
*/
public static final String RATE_LIMIT_KEY = "rate_limit:";
/**
* redis key
*/
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
}

View File

@ -0,0 +1,176 @@
package tech.unissense.pms.common.constant;
import java.util.Locale;
import io.jsonwebtoken.Claims;
/**
*
*
* @author ruoyi
*/
public class Constants
{
/**
* UTF-8
*/
public static final String UTF8 = "UTF-8";
/**
* GBK
*/
public static final String GBK = "GBK";
/**
*
*/
public static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE;
/**
* www
*/
public static final String WWW = "www.";
/**
* http
*/
public static final String HTTP = "http://";
/**
* https
*/
public static final String HTTPS = "https://";
/**
*
*/
public static final String SUCCESS = "0";
/**
*
*/
public static final String FAIL = "1";
/**
*
*/
public static final String LOGIN_SUCCESS = "Success";
/**
*
*/
public static final String LOGOUT = "Logout";
/**
*
*/
public static final String REGISTER = "Register";
/**
*
*/
public static final String LOGIN_FAIL = "Error";
/**
*
*/
public static final String ALL_PERMISSION = "*:*:*";
/**
*
*/
public static final String SUPER_ADMIN = "admin";
/**
*
*/
public static final String ROLE_DELIMETER = ",";
/**
*
*/
public static final String PERMISSION_DELIMETER = ",";
/**
*
*/
public static final Integer CAPTCHA_EXPIRATION = 2;
/**
*
*/
public static final String TOKEN = "token";
/**
*
*/
public static final String TOKEN_PREFIX = "Bearer ";
/**
*
*/
public static final String LOGIN_USER_KEY = "login_user_key";
/**
* ID
*/
public static final String JWT_USERID = "userid";
/**
*
*/
public static final String JWT_USERNAME = Claims.SUBJECT;
/**
*
*/
public static final String JWT_AVATAR = "avatar";
/**
*
*/
public static final String JWT_CREATED = "created";
/**
*
*/
public static final String JWT_AUTHORITIES = "authorities";
/**
*
*/
public static final String RESOURCE_PREFIX = "/profile";
/**
* RMI
*/
public static final String LOOKUP_RMI = "rmi:";
/**
* LDAP
*/
public static final String LOOKUP_LDAP = "ldap:";
/**
* LDAPS
*/
public static final String LOOKUP_LDAPS = "ldaps:";
/**
* json
*/
public static final String[] JSON_WHITELIST_STR = { "org.springframework", "tech.unissense" };
/**
* 访
*/
public static final String[] JOB_WHITELIST_STR = { "tech.unissense.quartz.task" };
/**
*
*/
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework", "org.apache", "tech.unissense.common.utils.file", "tech.unissense.common.config", "tech.unissense.generator" };
public static final String TENANT_ID="tenant_id";
}

View File

@ -0,0 +1,117 @@
package tech.unissense.pms.common.constant;
/**
*
*
* @author ruoyi
*/
public class GenConstants
{
/** 单表(增删改查) */
public static final String TPL_CRUD = "crud";
/** 树表(增删改查) */
public static final String TPL_TREE = "tree";
/** 主子表(增删改查) */
public static final String TPL_SUB = "sub";
/** 树编码字段 */
public static final String TREE_CODE = "treeCode";
/** 树父编码字段 */
public static final String TREE_PARENT_CODE = "treeParentCode";
/** 树名称字段 */
public static final String TREE_NAME = "treeName";
/** 上级菜单ID字段 */
public static final String PARENT_MENU_ID = "parentMenuId";
/** 上级菜单名称字段 */
public static final String PARENT_MENU_NAME = "parentMenuName";
/** 数据库字符串类型 */
public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" };
/** 数据库文本类型 */
public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" };
/** 数据库时间类型 */
public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
/** 数据库数字类型 */
public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
"bit", "bigint", "float", "double", "decimal" };
/** 页面不需要编辑字段 */
public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
/** 页面不需要显示的列表字段 */
public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
"update_time" };
/** 页面不需要查询字段 */
public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
"update_time", "remark" };
/** Entity基类字段 */
public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
/** Tree基类字段 */
public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" };
/** 文本框 */
public static final String HTML_INPUT = "input";
/** 文本域 */
public static final String HTML_TEXTAREA = "textarea";
/** 下拉框 */
public static final String HTML_SELECT = "select";
/** 单选框 */
public static final String HTML_RADIO = "radio";
/** 复选框 */
public static final String HTML_CHECKBOX = "checkbox";
/** 日期控件 */
public static final String HTML_DATETIME = "datetime";
/** 图片上传控件 */
public static final String HTML_IMAGE_UPLOAD = "imageUpload";
/** 文件上传控件 */
public static final String HTML_FILE_UPLOAD = "fileUpload";
/** 富文本控件 */
public static final String HTML_EDITOR = "editor";
/** 字符串类型 */
public static final String TYPE_STRING = "String";
/** 整型 */
public static final String TYPE_INTEGER = "Integer";
/** 长整型 */
public static final String TYPE_LONG = "Long";
/** 浮点型 */
public static final String TYPE_DOUBLE = "Double";
/** 高精度计算类型 */
public static final String TYPE_BIGDECIMAL = "BigDecimal";
/** 时间类型 */
public static final String TYPE_DATE = "Date";
/** 模糊查询 */
public static final String QUERY_LIKE = "LIKE";
/** 相等查询 */
public static final String QUERY_EQ = "EQ";
/** 需要 */
public static final String REQUIRE = "1";
}

View File

@ -0,0 +1,94 @@
package tech.unissense.pms.common.constant;
/**
*
*
* @author ruoyi
*/
public class HttpStatus
{
/**
*
*/
public static final int SUCCESS = 200;
/**
*
*/
public static final int CREATED = 201;
/**
*
*/
public static final int ACCEPTED = 202;
/**
*
*/
public static final int NO_CONTENT = 204;
/**
*
*/
public static final int MOVED_PERM = 301;
/**
*
*/
public static final int SEE_OTHER = 303;
/**
*
*/
public static final int NOT_MODIFIED = 304;
/**
*
*/
public static final int BAD_REQUEST = 400;
/**
*
*/
public static final int UNAUTHORIZED = 401;
/**
* 访
*/
public static final int FORBIDDEN = 403;
/**
*
*/
public static final int NOT_FOUND = 404;
/**
* http
*/
public static final int BAD_METHOD = 405;
/**
*
*/
public static final int CONFLICT = 409;
/**
*
*/
public static final int UNSUPPORTED_TYPE = 415;
/**
*
*/
public static final int ERROR = 500;
/**
*
*/
public static final int NOT_IMPLEMENTED = 501;
/**
*
*/
public static final int WARN = 601;
}

View File

@ -0,0 +1,50 @@
package tech.unissense.pms.common.constant;
/**
*
*
* @author ruoyi
*/
public class ScheduleConstants
{
public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
/** 执行目标key */
public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
/** 默认 */
public static final String MISFIRE_DEFAULT = "0";
/** 立即触发执行 */
public static final String MISFIRE_IGNORE_MISFIRES = "1";
/** 触发一次执行 */
public static final String MISFIRE_FIRE_AND_PROCEED = "2";
/** 不触发立即执行 */
public static final String MISFIRE_DO_NOTHING = "3";
public enum Status
{
/**
*
*/
NORMAL("0"),
/**
*
*/
PAUSE("1");
private String value;
private Status(String value)
{
this.value = value;
}
public String getValue()
{
return value;
}
}
}

View File

@ -0,0 +1,81 @@
package tech.unissense.pms.common.constant;
/**
*
*
* @author ruoyi
*/
public class UserConstants
{
/**
*
*/
public static final String SYS_USER = "SYS_USER";
/** 正常状态 */
public static final String NORMAL = "0";
/** 异常状态 */
public static final String EXCEPTION = "1";
/** 用户封禁状态 */
public static final String USER_DISABLE = "1";
/** 角色正常状态 */
public static final String ROLE_NORMAL = "0";
/** 角色封禁状态 */
public static final String ROLE_DISABLE = "1";
/** 部门正常状态 */
public static final String DEPT_NORMAL = "0";
/** 部门停用状态 */
public static final String DEPT_DISABLE = "1";
/** 字典正常状态 */
public static final String DICT_NORMAL = "0";
/** 是否为系统默认(是) */
public static final String YES = "Y";
/** 是否菜单外链(是) */
public static final String YES_FRAME = "0";
/** 是否菜单外链(否) */
public static final String NO_FRAME = "1";
/** 菜单类型(目录) */
public static final String TYPE_DIR = "M";
/** 菜单类型(菜单) */
public static final String TYPE_MENU = "C";
/** 菜单类型(按钮) */
public static final String TYPE_BUTTON = "F";
/** Layout组件标识 */
public final static String LAYOUT = "Layout";
/** ParentView组件标识 */
public final static String PARENT_VIEW = "ParentView";
/** InnerLink组件标识 */
public final static String INNER_LINK = "InnerLink";
/** 校验是否唯一的返回标识 */
public final static boolean UNIQUE = true;
public final static boolean NOT_UNIQUE = false;
/**
*
*/
public static final int USERNAME_MIN_LENGTH = 2;
public static final int USERNAME_MAX_LENGTH = 20;
/**
*
*/
public static final int PASSWORD_MIN_LENGTH = 5;
public static final int PASSWORD_MAX_LENGTH = 20;
}

View File

@ -0,0 +1,202 @@
package tech.unissense.pms.common.core.controller;
import java.beans.PropertyEditorSupport;
import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import tech.unissense.pms.common.constant.HttpStatus;
import tech.unissense.pms.common.core.domain.AjaxResult;
import tech.unissense.pms.common.core.domain.model.LoginUser;
import tech.unissense.pms.common.core.page.PageDomain;
import tech.unissense.pms.common.core.page.TableDataInfo;
import tech.unissense.pms.common.core.page.TableSupport;
import tech.unissense.pms.common.utils.DateUtils;
import tech.unissense.pms.common.utils.PageUtils;
import tech.unissense.pms.common.utils.SecurityUtils;
import tech.unissense.pms.common.utils.StringUtils;
import tech.unissense.pms.common.utils.sql.SqlUtil;
/**
* web
*
* @author ruoyi
*/
public class BaseController
{
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* Date
*/
@InitBinder
public void initBinder(WebDataBinder binder)
{
// Date 类型转换
binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
{
@Override
public void setAsText(String text)
{
setValue(DateUtils.parseDate(text));
}
});
}
/**
*
*/
protected void startPage()
{
PageUtils.startPage();
}
/**
*
*/
protected void startOrderBy()
{
PageDomain pageDomain = TableSupport.buildPageRequest();
if (StringUtils.isNotEmpty(pageDomain.getOrderBy()))
{
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.orderBy(orderBy);
}
}
/**
* 线
*/
protected void clearPage()
{
PageUtils.clearPage();
}
/**
*
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
protected TableDataInfo getDataTable(List<?> list)
{
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(list);
rspData.setTotal(new PageInfo(list).getTotal());
return rspData;
}
/**
*
*/
public AjaxResult success()
{
return AjaxResult.success();
}
/**
*
*/
public AjaxResult error()
{
return AjaxResult.error();
}
/**
*
*/
public AjaxResult success(String message)
{
return AjaxResult.success(message);
}
/**
*
*/
public AjaxResult success(Object data)
{
return AjaxResult.success(data);
}
/**
*
*/
public AjaxResult error(String message)
{
return AjaxResult.error(message);
}
/**
*
*/
public AjaxResult warn(String message)
{
return AjaxResult.warn(message);
}
/**
*
*
* @param rows
* @return
*/
protected AjaxResult toAjax(int rows)
{
return rows > 0 ? AjaxResult.success() : AjaxResult.error();
}
/**
*
*
* @param result
* @return
*/
protected AjaxResult toAjax(boolean result)
{
return result ? success() : error();
}
/**
*
*/
public String redirect(String url)
{
return StringUtils.format("redirect:{}", url);
}
/**
*
*/
public LoginUser getLoginUser()
{
return SecurityUtils.getLoginUser();
}
/**
* id
*/
public Long getUserId()
{
return getLoginUser().getUserId();
}
/**
* id
*/
public Long getDeptId()
{
return getLoginUser().getDeptId();
}
/**
*
*/
public String getUsername()
{
return getLoginUser().getUsername();
}
}

View File

@ -0,0 +1,216 @@
package tech.unissense.pms.common.core.domain;
import java.util.HashMap;
import java.util.Objects;
import tech.unissense.pms.common.constant.HttpStatus;
import tech.unissense.pms.common.utils.StringUtils;
/**
*
*
* @author ruoyi
*/
public class AjaxResult extends HashMap<String, Object>
{
private static final long serialVersionUID = 1L;
/** 状态码 */
public static final String CODE_TAG = "code";
/** 返回内容 */
public static final String MSG_TAG = "msg";
/** 数据对象 */
public static final String DATA_TAG = "data";
/**
* AjaxResult 使
*/
public AjaxResult()
{
}
/**
* AjaxResult
*
* @param code
* @param msg
*/
public AjaxResult(int code, String msg)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
}
/**
* AjaxResult
*
* @param code
* @param msg
* @param data
*/
public AjaxResult(int code, String msg, Object data)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
if (StringUtils.isNotNull(data))
{
super.put(DATA_TAG, data);
}
}
/**
*
*
* @return
*/
public static AjaxResult success()
{
return AjaxResult.success("操作成功");
}
/**
*
*
* @return
*/
public static AjaxResult success(Object data)
{
return AjaxResult.success("操作成功", data);
}
/**
*
*
* @param msg
* @return
*/
public static AjaxResult success(String msg)
{
return AjaxResult.success(msg, null);
}
/**
*
*
* @param msg
* @param data
* @return
*/
public static AjaxResult success(String msg, Object data)
{
return new AjaxResult(HttpStatus.SUCCESS, msg, data);
}
/**
*
*
* @param msg
* @return
*/
public static AjaxResult warn(String msg)
{
return AjaxResult.warn(msg, null);
}
/**
*
*
* @param msg
* @param data
* @return
*/
public static AjaxResult warn(String msg, Object data)
{
return new AjaxResult(HttpStatus.WARN, msg, data);
}
/**
*
*
* @return
*/
public static AjaxResult error()
{
return AjaxResult.error("操作失败");
}
/**
*
*
* @param msg
* @return
*/
public static AjaxResult error(String msg)
{
return AjaxResult.error(msg, null);
}
/**
*
*
* @param msg
* @param data
* @return
*/
public static AjaxResult error(String msg, Object data)
{
return new AjaxResult(HttpStatus.ERROR, msg, data);
}
/**
*
*
* @param code
* @param msg
* @return
*/
public static AjaxResult error(int code, String msg)
{
return new AjaxResult(code, msg, null);
}
/**
*
*
* @return
*/
public boolean isSuccess()
{
return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG));
}
/**
*
*
* @return
*/
public boolean isWarn()
{
return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG));
}
/**
*
*
* @return
*/
public boolean isError()
{
return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG));
}
/**
* 便
*
* @param key
* @param value
* @return
*/
@Override
public AjaxResult put(String key, Object value)
{
super.put(key, value);
return this;
}
}

View File

@ -0,0 +1,118 @@
package tech.unissense.pms.common.core.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
/**
* Entity
*
* @author ruoyi
*/
public class BaseEntity implements Serializable
{
private static final long serialVersionUID = 1L;
/** 搜索值 */
@JsonIgnore
private String searchValue;
/** 创建者 */
private String createBy;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 更新者 */
private String updateBy;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/** 备注 */
private String remark;
/** 请求参数 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Map<String, Object> params;
public String getSearchValue()
{
return searchValue;
}
public void setSearchValue(String searchValue)
{
this.searchValue = searchValue;
}
public String getCreateBy()
{
return createBy;
}
public void setCreateBy(String createBy)
{
this.createBy = createBy;
}
public Date getCreateTime()
{
return createTime;
}
public void setCreateTime(Date createTime)
{
this.createTime = createTime;
}
public String getUpdateBy()
{
return updateBy;
}
public void setUpdateBy(String updateBy)
{
this.updateBy = updateBy;
}
public Date getUpdateTime()
{
return updateTime;
}
public void setUpdateTime(Date updateTime)
{
this.updateTime = updateTime;
}
public String getRemark()
{
return remark;
}
public void setRemark(String remark)
{
this.remark = remark;
}
public Map<String, Object> getParams()
{
if (params == null)
{
params = new HashMap<>();
}
return params;
}
public void setParams(Map<String, Object> params)
{
this.params = params;
}
}

View File

@ -0,0 +1,115 @@
package tech.unissense.pms.common.core.domain;
import java.io.Serializable;
import tech.unissense.pms.common.constant.HttpStatus;
/**
*
*
* @author ruoyi
*/
public class R<T> implements Serializable
{
private static final long serialVersionUID = 1L;
/** 成功 */
public static final int SUCCESS = HttpStatus.SUCCESS;
/** 失败 */
public static final int FAIL = HttpStatus.ERROR;
private int code;
private String msg;
private T data;
public static <T> R<T> ok()
{
return restResult(null, SUCCESS, "操作成功");
}
public static <T> R<T> ok(T data)
{
return restResult(data, SUCCESS, "操作成功");
}
public static <T> R<T> ok(T data, String msg)
{
return restResult(data, SUCCESS, msg);
}
public static <T> R<T> fail()
{
return restResult(null, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg)
{
return restResult(null, FAIL, msg);
}
public static <T> R<T> fail(T data)
{
return restResult(data, FAIL, "操作失败");
}
public static <T> R<T> fail(T data, String msg)
{
return restResult(data, FAIL, msg);
}
public static <T> R<T> fail(int code, String msg)
{
return restResult(null, code, msg);
}
private static <T> R<T> restResult(T data, int code, String msg)
{
R<T> apiResult = new R<>();
apiResult.setCode(code);
apiResult.setData(data);
apiResult.setMsg(msg);
return apiResult;
}
public int getCode()
{
return code;
}
public void setCode(int code)
{
this.code = code;
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this.msg = msg;
}
public T getData()
{
return data;
}
public void setData(T data)
{
this.data = data;
}
public static <T> Boolean isError(R<T> ret)
{
return !isSuccess(ret);
}
public static <T> Boolean isSuccess(R<T> ret)
{
return R.SUCCESS == ret.getCode();
}
}

View File

@ -0,0 +1,79 @@
package tech.unissense.pms.common.core.domain;
import java.util.ArrayList;
import java.util.List;
/**
* Tree
*
* @author ruoyi
*/
public class TreeEntity extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 父菜单名称 */
private String parentName;
/** 父菜单ID */
private Long parentId;
/** 显示顺序 */
private Integer orderNum;
/** 祖级列表 */
private String ancestors;
/** 子部门 */
private List<?> children = new ArrayList<>();
public String getParentName()
{
return parentName;
}
public void setParentName(String parentName)
{
this.parentName = parentName;
}
public Long getParentId()
{
return parentId;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
public Integer getOrderNum()
{
return orderNum;
}
public void setOrderNum(Integer orderNum)
{
this.orderNum = orderNum;
}
public String getAncestors()
{
return ancestors;
}
public void setAncestors(String ancestors)
{
this.ancestors = ancestors;
}
public List<?> getChildren()
{
return children;
}
public void setChildren(List<?> children)
{
this.children = children;
}
}

View File

@ -0,0 +1,77 @@
package tech.unissense.pms.common.core.domain;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import com.fasterxml.jackson.annotation.JsonInclude;
import tech.unissense.pms.common.core.domain.entity.SysDept;
import tech.unissense.pms.common.core.domain.entity.SysMenu;
/**
* Treeselect
*
* @author ruoyi
*/
public class TreeSelect implements Serializable
{
private static final long serialVersionUID = 1L;
/** 节点ID */
private Long id;
/** 节点名称 */
private String label;
/** 子节点 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TreeSelect> children;
public TreeSelect()
{
}
public TreeSelect(SysDept dept)
{
this.id = dept.getDeptId();
this.label = dept.getDeptName();
this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public TreeSelect(SysMenu menu)
{
this.id = menu.getMenuId();
this.label = menu.getMenuName();
this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getLabel()
{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
public List<TreeSelect> getChildren()
{
return children;
}
public void setChildren(List<TreeSelect> children)
{
this.children = children;
}
}

View File

@ -0,0 +1,203 @@
package tech.unissense.pms.common.core.domain.entity;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import tech.unissense.pms.common.core.domain.BaseEntity;
/**
* sys_dept
*
* @author ruoyi
*/
public class SysDept extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 部门ID */
private Long deptId;
/** 父部门ID */
private Long parentId;
/** 祖级列表 */
private String ancestors;
/** 部门名称 */
private String deptName;
/** 显示顺序 */
private Integer orderNum;
/** 负责人 */
private String leader;
/** 联系电话 */
private String phone;
/** 邮箱 */
private String email;
/** 部门状态:0正常,1停用 */
private String status;
/** 删除标志0代表存在 2代表删除 */
private String delFlag;
/** 父部门名称 */
private String parentName;
/** 子部门 */
private List<SysDept> children = new ArrayList<SysDept>();
public Long getDeptId()
{
return deptId;
}
public void setDeptId(Long deptId)
{
this.deptId = deptId;
}
public Long getParentId()
{
return parentId;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
public String getAncestors()
{
return ancestors;
}
public void setAncestors(String ancestors)
{
this.ancestors = ancestors;
}
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
public String getDeptName()
{
return deptName;
}
public void setDeptName(String deptName)
{
this.deptName = deptName;
}
@NotNull(message = "显示顺序不能为空")
public Integer getOrderNum()
{
return orderNum;
}
public void setOrderNum(Integer orderNum)
{
this.orderNum = orderNum;
}
public String getLeader()
{
return leader;
}
public void setLeader(String leader)
{
this.leader = leader;
}
@Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
public String getPhone()
{
return phone;
}
public void setPhone(String phone)
{
this.phone = phone;
}
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
public String getDelFlag()
{
return delFlag;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getParentName()
{
return parentName;
}
public void setParentName(String parentName)
{
this.parentName = parentName;
}
public List<SysDept> getChildren()
{
return children;
}
public void setChildren(List<SysDept> children)
{
this.children = children;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("deptId", getDeptId())
.append("parentId", getParentId())
.append("ancestors", getAncestors())
.append("deptName", getDeptName())
.append("orderNum", getOrderNum())
.append("leader", getLeader())
.append("phone", getPhone())
.append("email", getEmail())
.append("status", getStatus())
.append("delFlag", getDelFlag())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -0,0 +1,176 @@
package tech.unissense.pms.common.core.domain.entity;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import tech.unissense.pms.common.annotation.Excel;
import tech.unissense.pms.common.annotation.Excel.ColumnType;
import tech.unissense.pms.common.constant.UserConstants;
import tech.unissense.pms.common.core.domain.BaseEntity;
/**
* sys_dict_data
*
* @author ruoyi
*/
public class SysDictData extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 字典编码 */
@Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
private Long dictCode;
/** 字典排序 */
@Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
private Long dictSort;
/** 字典标签 */
@Excel(name = "字典标签")
private String dictLabel;
/** 字典键值 */
@Excel(name = "字典键值")
private String dictValue;
/** 字典类型 */
@Excel(name = "字典类型")
private String dictType;
/** 样式属性(其他样式扩展) */
private String cssClass;
/** 表格字典样式 */
private String listClass;
/** 是否默认Y是 N否 */
@Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
private String isDefault;
/** 状态0正常 1停用 */
@Excel(name = "状态", readConverterExp = "0=正常,1=停用")
private String status;
public Long getDictCode()
{
return dictCode;
}
public void setDictCode(Long dictCode)
{
this.dictCode = dictCode;
}
public Long getDictSort()
{
return dictSort;
}
public void setDictSort(Long dictSort)
{
this.dictSort = dictSort;
}
@NotBlank(message = "字典标签不能为空")
@Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
public String getDictLabel()
{
return dictLabel;
}
public void setDictLabel(String dictLabel)
{
this.dictLabel = dictLabel;
}
@NotBlank(message = "字典键值不能为空")
@Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
public String getDictValue()
{
return dictValue;
}
public void setDictValue(String dictValue)
{
this.dictValue = dictValue;
}
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
public String getDictType()
{
return dictType;
}
public void setDictType(String dictType)
{
this.dictType = dictType;
}
@Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
public String getCssClass()
{
return cssClass;
}
public void setCssClass(String cssClass)
{
this.cssClass = cssClass;
}
public String getListClass()
{
return listClass;
}
public void setListClass(String listClass)
{
this.listClass = listClass;
}
public boolean getDefault()
{
return UserConstants.YES.equals(this.isDefault);
}
public String getIsDefault()
{
return isDefault;
}
public void setIsDefault(String isDefault)
{
this.isDefault = isDefault;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("dictCode", getDictCode())
.append("dictSort", getDictSort())
.append("dictLabel", getDictLabel())
.append("dictValue", getDictValue())
.append("dictType", getDictType())
.append("cssClass", getCssClass())
.append("listClass", getListClass())
.append("isDefault", getIsDefault())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

View File

@ -0,0 +1,96 @@
package tech.unissense.pms.common.core.domain.entity;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import tech.unissense.pms.common.annotation.Excel;
import tech.unissense.pms.common.annotation.Excel.ColumnType;
import tech.unissense.pms.common.core.domain.BaseEntity;
/**
* sys_dict_type
*
* @author ruoyi
*/
public class SysDictType extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 字典主键 */
@Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
private Long dictId;
/** 字典名称 */
@Excel(name = "字典名称")
private String dictName;
/** 字典类型 */
@Excel(name = "字典类型")
private String dictType;
/** 状态0正常 1停用 */
@Excel(name = "状态", readConverterExp = "0=正常,1=停用")
private String status;
public Long getDictId()
{
return dictId;
}
public void setDictId(Long dictId)
{
this.dictId = dictId;
}
@NotBlank(message = "字典名称不能为空")
@Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
public String getDictName()
{
return dictName;
}
public void setDictName(String dictName)
{
this.dictName = dictName;
}
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
@Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
public String getDictType()
{
return dictType;
}
public void setDictType(String dictType)
{
this.dictType = dictType;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("dictId", getDictId())
.append("dictName", getDictName())
.append("dictType", getDictType())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

View File

@ -0,0 +1,274 @@
package tech.unissense.pms.common.core.domain.entity;
import java.util.ArrayList;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import tech.unissense.pms.common.core.domain.BaseEntity;
/**
* sys_menu
*
* @author ruoyi
*/
public class SysMenu extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 菜单ID */
private Long menuId;
/** 菜单名称 */
private String menuName;
/** 父菜单名称 */
private String parentName;
/** 父菜单ID */
private Long parentId;
/** 显示顺序 */
private Integer orderNum;
/** 路由地址 */
private String path;
/** 组件路径 */
private String component;
/** 路由参数 */
private String query;
/** 路由名称默认和路由地址相同的驼峰格式注意因为vue3版本的router会删除名称相同路由为避免名字的冲突特殊情况可以自定义 */
private String routeName;
/** 是否为外链0是 1否 */
private String isFrame;
/** 是否缓存0缓存 1不缓存 */
private String isCache;
/** 类型M目录 C菜单 F按钮 */
private String menuType;
/** 显示状态0显示 1隐藏 */
private String visible;
/** 菜单状态0正常 1停用 */
private String status;
/** 权限字符串 */
private String perms;
/** 菜单图标 */
private String icon;
/** 子菜单 */
private List<SysMenu> children = new ArrayList<SysMenu>();
public Long getMenuId()
{
return menuId;
}
public void setMenuId(Long menuId)
{
this.menuId = menuId;
}
@NotBlank(message = "菜单名称不能为空")
@Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
public String getMenuName()
{
return menuName;
}
public void setMenuName(String menuName)
{
this.menuName = menuName;
}
public String getParentName()
{
return parentName;
}
public void setParentName(String parentName)
{
this.parentName = parentName;
}
public Long getParentId()
{
return parentId;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
@NotNull(message = "显示顺序不能为空")
public Integer getOrderNum()
{
return orderNum;
}
public void setOrderNum(Integer orderNum)
{
this.orderNum = orderNum;
}
@Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
public String getPath()
{
return path;
}
public void setPath(String path)
{
this.path = path;
}
@Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
public String getComponent()
{
return component;
}
public void setComponent(String component)
{
this.component = component;
}
public String getQuery()
{
return query;
}
public void setQuery(String query)
{
this.query = query;
}
public String getRouteName()
{
return routeName;
}
public void setRouteName(String routeName)
{
this.routeName = routeName;
}
public String getIsFrame()
{
return isFrame;
}
public void setIsFrame(String isFrame)
{
this.isFrame = isFrame;
}
public String getIsCache()
{
return isCache;
}
public void setIsCache(String isCache)
{
this.isCache = isCache;
}
@NotBlank(message = "菜单类型不能为空")
public String getMenuType()
{
return menuType;
}
public void setMenuType(String menuType)
{
this.menuType = menuType;
}
public String getVisible()
{
return visible;
}
public void setVisible(String visible)
{
this.visible = visible;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
@Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
public String getPerms()
{
return perms;
}
public void setPerms(String perms)
{
this.perms = perms;
}
public String getIcon()
{
return icon;
}
public void setIcon(String icon)
{
this.icon = icon;
}
public List<SysMenu> getChildren()
{
return children;
}
public void setChildren(List<SysMenu> children)
{
this.children = children;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("menuId", getMenuId())
.append("menuName", getMenuName())
.append("parentId", getParentId())
.append("orderNum", getOrderNum())
.append("path", getPath())
.append("component", getComponent())
.append("query", getQuery())
.append("routeName", getRouteName())
.append("isFrame", getIsFrame())
.append("IsCache", getIsCache())
.append("menuType", getMenuType())
.append("visible", getVisible())
.append("status ", getStatus())
.append("perms", getPerms())
.append("icon", getIcon())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

View File

@ -0,0 +1,241 @@
package tech.unissense.pms.common.core.domain.entity;
import java.util.Set;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import tech.unissense.pms.common.annotation.Excel;
import tech.unissense.pms.common.annotation.Excel.ColumnType;
import tech.unissense.pms.common.core.domain.BaseEntity;
/**
* sys_role
*
* @author ruoyi
*/
public class SysRole extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 角色ID */
@Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
private Long roleId;
/** 角色名称 */
@Excel(name = "角色名称")
private String roleName;
/** 角色权限 */
@Excel(name = "角色权限")
private String roleKey;
/** 角色排序 */
@Excel(name = "角色排序")
private Integer roleSort;
/** 数据范围1所有数据权限2自定义数据权限3本部门数据权限4本部门及以下数据权限5仅本人数据权限 */
@Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
private String dataScope;
/** 菜单树选择项是否关联显示( 0父子不互相关联显示 1父子互相关联显示 */
private boolean menuCheckStrictly;
/** 部门树选择项是否关联显示0父子不互相关联显示 1父子互相关联显示 */
private boolean deptCheckStrictly;
/** 角色状态0正常 1停用 */
@Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
private String status;
/** 删除标志0代表存在 2代表删除 */
private String delFlag;
/** 用户是否存在此角色标识 默认不存在 */
private boolean flag = false;
/** 菜单组 */
private Long[] menuIds;
/** 部门组(数据权限) */
private Long[] deptIds;
/** 角色菜单权限 */
private Set<String> permissions;
public SysRole()
{
}
public SysRole(Long roleId)
{
this.roleId = roleId;
}
public Long getRoleId()
{
return roleId;
}
public void setRoleId(Long roleId)
{
this.roleId = roleId;
}
public boolean isAdmin()
{
return isAdmin(this.roleId);
}
public static boolean isAdmin(Long roleId)
{
return roleId != null && 1L == roleId;
}
@NotBlank(message = "角色名称不能为空")
@Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
public String getRoleName()
{
return roleName;
}
public void setRoleName(String roleName)
{
this.roleName = roleName;
}
@NotBlank(message = "权限字符不能为空")
@Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
public String getRoleKey()
{
return roleKey;
}
public void setRoleKey(String roleKey)
{
this.roleKey = roleKey;
}
@NotNull(message = "显示顺序不能为空")
public Integer getRoleSort()
{
return roleSort;
}
public void setRoleSort(Integer roleSort)
{
this.roleSort = roleSort;
}
public String getDataScope()
{
return dataScope;
}
public void setDataScope(String dataScope)
{
this.dataScope = dataScope;
}
public boolean isMenuCheckStrictly()
{
return menuCheckStrictly;
}
public void setMenuCheckStrictly(boolean menuCheckStrictly)
{
this.menuCheckStrictly = menuCheckStrictly;
}
public boolean isDeptCheckStrictly()
{
return deptCheckStrictly;
}
public void setDeptCheckStrictly(boolean deptCheckStrictly)
{
this.deptCheckStrictly = deptCheckStrictly;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
public String getDelFlag()
{
return delFlag;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public boolean isFlag()
{
return flag;
}
public void setFlag(boolean flag)
{
this.flag = flag;
}
public Long[] getMenuIds()
{
return menuIds;
}
public void setMenuIds(Long[] menuIds)
{
this.menuIds = menuIds;
}
public Long[] getDeptIds()
{
return deptIds;
}
public void setDeptIds(Long[] deptIds)
{
this.deptIds = deptIds;
}
public Set<String> getPermissions()
{
return permissions;
}
public void setPermissions(Set<String> permissions)
{
this.permissions = permissions;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("roleId", getRoleId())
.append("roleName", getRoleName())
.append("roleKey", getRoleKey())
.append("roleSort", getRoleSort())
.append("dataScope", getDataScope())
.append("menuCheckStrictly", isMenuCheckStrictly())
.append("deptCheckStrictly", isDeptCheckStrictly())
.append("status", getStatus())
.append("delFlag", getDelFlag())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

View File

@ -0,0 +1,333 @@
package tech.unissense.pms.common.core.domain.entity;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import tech.unissense.pms.common.annotation.Excel;
import tech.unissense.pms.common.annotation.Excel.ColumnType;
import tech.unissense.pms.common.annotation.Excel.Type;
import tech.unissense.pms.common.annotation.Excels;
import tech.unissense.pms.common.core.domain.BaseEntity;
import tech.unissense.pms.common.xss.Xss;
/**
* sys_user
*
* @author ruoyi
*/
public class SysUser extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 用户ID */
@Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号")
private Long userId;
/** 部门ID */
@Excel(name = "部门编号", type = Type.IMPORT)
private Long deptId;
/** 用户账号 */
@Excel(name = "登录名称")
private String userName;
/** 用户昵称 */
@Excel(name = "用户名称")
private String nickName;
/** 用户邮箱 */
@Excel(name = "用户邮箱")
private String email;
/** 手机号码 */
@Excel(name = "手机号码", cellType = ColumnType.TEXT)
private String phonenumber;
/** 用户性别 */
@Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
private String sex;
/** 用户头像 */
private String avatar;
/** 密码 */
private String password;
/** 帐号状态0正常 1停用 */
@Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
private String status;
/** 删除标志0代表存在 2代表删除 */
private String delFlag;
/** 最后登录IP */
@Excel(name = "最后登录IP", type = Type.EXPORT)
private String loginIp;
/** 最后登录时间 */
@Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
private Date loginDate;
private Integer tenantId;
/** 部门对象 */
@Excels({
@Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
@Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
})
private SysDept dept;
/** 角色对象 */
private List<SysRole> roles;
/** 角色组 */
private Long[] roleIds;
/** 岗位组 */
private Long[] postIds;
/** 角色ID */
private Long roleId;
public SysUser()
{
}
public Integer getTenantId() {
return tenantId;
}
public void setTenantId(Integer tenantId) {
this.tenantId = tenantId;
}
public SysUser(Long userId)
{
this.userId = userId;
}
public Long getUserId()
{
return userId;
}
public void setUserId(Long userId)
{
this.userId = userId;
}
public boolean isAdmin()
{
return isAdmin(this.userId);
}
public static boolean isAdmin(Long userId)
{
return userId != null && 1L == userId;
}
public Long getDeptId()
{
return deptId;
}
public void setDeptId(Long deptId)
{
this.deptId = deptId;
}
@Xss(message = "用户昵称不能包含脚本字符")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
public String getNickName()
{
return nickName;
}
public void setNickName(String nickName)
{
this.nickName = nickName;
}
@Xss(message = "用户账号不能包含脚本字符")
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
@Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
public String getPhonenumber()
{
return phonenumber;
}
public void setPhonenumber(String phonenumber)
{
this.phonenumber = phonenumber;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
public String getAvatar()
{
return avatar;
}
public void setAvatar(String avatar)
{
this.avatar = avatar;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
public String getDelFlag()
{
return delFlag;
}
public void setDelFlag(String delFlag)
{
this.delFlag = delFlag;
}
public String getLoginIp()
{
return loginIp;
}
public void setLoginIp(String loginIp)
{
this.loginIp = loginIp;
}
public Date getLoginDate()
{
return loginDate;
}
public void setLoginDate(Date loginDate)
{
this.loginDate = loginDate;
}
public SysDept getDept()
{
return dept;
}
public void setDept(SysDept dept)
{
this.dept = dept;
}
public List<SysRole> getRoles()
{
return roles;
}
public void setRoles(List<SysRole> roles)
{
this.roles = roles;
}
public Long[] getRoleIds()
{
return roleIds;
}
public void setRoleIds(Long[] roleIds)
{
this.roleIds = roleIds;
}
public Long[] getPostIds()
{
return postIds;
}
public void setPostIds(Long[] postIds)
{
this.postIds = postIds;
}
public Long getRoleId()
{
return roleId;
}
public void setRoleId(Long roleId)
{
this.roleId = roleId;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("userId", getUserId())
.append("deptId", getDeptId())
.append("userName", getUserName())
.append("nickName", getNickName())
.append("email", getEmail())
.append("phonenumber", getPhonenumber())
.append("sex", getSex())
.append("avatar", getAvatar())
.append("password", getPassword())
.append("status", getStatus())
.append("delFlag", getDelFlag())
.append("loginIp", getLoginIp())
.append("loginDate", getLoginDate())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.append("dept", getDept())
.toString();
}
}

View File

@ -0,0 +1,69 @@
package tech.unissense.pms.common.core.domain.model;
/**
*
*
* @author ruoyi
*/
public class LoginBody
{
/**
*
*/
private String username;
/**
*
*/
private String password;
/**
*
*/
private String code;
/**
*
*/
private String uuid;
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 getCode()
{
return code;
}
public void setCode(String code)
{
this.code = code;
}
public String getUuid()
{
return uuid;
}
public void setUuid(String uuid)
{
this.uuid = uuid;
}
}

View File

@ -0,0 +1,278 @@
package tech.unissense.pms.common.core.domain.model;
import com.alibaba.fastjson2.annotation.JSONField;
import tech.unissense.pms.common.core.domain.entity.SysUser;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.Set;
/**
*
*
* @author ruoyi
*/
public class LoginUser implements UserDetails
{
private static final long serialVersionUID = 1L;
/**
* ID
*/
private Long userId;
/**
* ID
*/
private Long deptId;
/**
* ID
*/
private Long tenantId;
/**
*
*/
private String token;
/**
*
*/
private Long loginTime;
/**
*
*/
private Long expireTime;
/**
* IP
*/
private String ipaddr;
/**
*
*/
private String loginLocation;
/**
*
*/
private String browser;
/**
*
*/
private String os;
/**
*
*/
private Set<String> permissions;
/**
*
*/
private SysUser user;
public Long getTenantId() {
return tenantId;
}
public void setTenantId(Long tenantId) {
this.tenantId = tenantId;
}
public LoginUser()
{
}
public LoginUser(SysUser user, Set<String> permissions)
{
this.user = user;
this.permissions = permissions;
}
public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
{
this.userId = userId;
this.deptId = deptId;
this.user = user;
this.permissions = permissions;
}
public Long getUserId()
{
return userId;
}
public void setUserId(Long userId)
{
this.userId = userId;
}
public Long getDeptId()
{
return deptId;
}
public void setDeptId(Long deptId)
{
this.deptId = deptId;
}
public String getToken()
{
return token;
}
public void setToken(String token)
{
this.token = token;
}
@JSONField(serialize = false)
@Override
public String getPassword()
{
return user.getPassword();
}
@Override
public String getUsername()
{
return user.getUserName();
}
/**
* ,
*/
@JSONField(serialize = false)
@Override
public boolean isAccountNonExpired()
{
return true;
}
/**
* ,
*
* @return
*/
@JSONField(serialize = false)
@Override
public boolean isAccountNonLocked()
{
return true;
}
/**
* (),
*
* @return
*/
@JSONField(serialize = false)
@Override
public boolean isCredentialsNonExpired()
{
return true;
}
/**
* ,
*
* @return
*/
@JSONField(serialize = false)
@Override
public boolean isEnabled()
{
return true;
}
public Long getLoginTime()
{
return loginTime;
}
public void setLoginTime(Long loginTime)
{
this.loginTime = loginTime;
}
public String getIpaddr()
{
return ipaddr;
}
public void setIpaddr(String ipaddr)
{
this.ipaddr = ipaddr;
}
public String getLoginLocation()
{
return loginLocation;
}
public void setLoginLocation(String loginLocation)
{
this.loginLocation = loginLocation;
}
public String getBrowser()
{
return browser;
}
public void setBrowser(String browser)
{
this.browser = browser;
}
public String getOs()
{
return os;
}
public void setOs(String os)
{
this.os = os;
}
public Long getExpireTime()
{
return expireTime;
}
public void setExpireTime(Long expireTime)
{
this.expireTime = expireTime;
}
public Set<String> getPermissions()
{
return permissions;
}
public void setPermissions(Set<String> permissions)
{
this.permissions = permissions;
}
public SysUser getUser()
{
return user;
}
public void setUser(SysUser user)
{
this.user = user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities()
{
return null;
}
}

View File

@ -0,0 +1,11 @@
package tech.unissense.pms.common.core.domain.model;
/**
*
*
* @author ruoyi
*/
public class RegisterBody extends LoginBody
{
}

View File

@ -0,0 +1,101 @@
package tech.unissense.pms.common.core.page;
import tech.unissense.pms.common.utils.StringUtils;
/**
*
*
* @author ruoyi
*/
public class PageDomain
{
/** 当前记录起始索引 */
private Integer pageNum;
/** 每页显示记录数 */
private Integer pageSize;
/** 排序列 */
private String orderByColumn;
/** 排序的方向desc或者asc */
private String isAsc = "asc";
/** 分页参数合理化 */
private Boolean reasonable = true;
public String getOrderBy()
{
if (StringUtils.isEmpty(orderByColumn))
{
return "";
}
return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
}
public Integer getPageNum()
{
return pageNum;
}
public void setPageNum(Integer pageNum)
{
this.pageNum = pageNum;
}
public Integer getPageSize()
{
return pageSize;
}
public void setPageSize(Integer pageSize)
{
this.pageSize = pageSize;
}
public String getOrderByColumn()
{
return orderByColumn;
}
public void setOrderByColumn(String orderByColumn)
{
this.orderByColumn = orderByColumn;
}
public String getIsAsc()
{
return isAsc;
}
public void setIsAsc(String isAsc)
{
if (StringUtils.isNotEmpty(isAsc))
{
// 兼容前端排序类型
if ("ascending".equals(isAsc))
{
isAsc = "asc";
}
else if ("descending".equals(isAsc))
{
isAsc = "desc";
}
this.isAsc = isAsc;
}
}
public Boolean getReasonable()
{
if (StringUtils.isNull(reasonable))
{
return Boolean.TRUE;
}
return reasonable;
}
public void setReasonable(Boolean reasonable)
{
this.reasonable = reasonable;
}
}

View File

@ -0,0 +1,85 @@
package tech.unissense.pms.common.core.page;
import java.io.Serializable;
import java.util.List;
/**
*
*
* @author ruoyi
*/
public class TableDataInfo implements Serializable
{
private static final long serialVersionUID = 1L;
/** 总记录数 */
private long total;
/** 列表数据 */
private List<?> rows;
/** 消息状态码 */
private int code;
/** 消息内容 */
private String msg;
/**
*
*/
public TableDataInfo()
{
}
/**
*
*
* @param list
* @param total
*/
public TableDataInfo(List<?> list, int total)
{
this.rows = list;
this.total = total;
}
public long getTotal()
{
return total;
}
public void setTotal(long total)
{
this.total = total;
}
public List<?> getRows()
{
return rows;
}
public void setRows(List<?> rows)
{
this.rows = rows;
}
public int getCode()
{
return code;
}
public void setCode(int code)
{
this.code = code;
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this.msg = msg;
}
}

View File

@ -0,0 +1,78 @@
package tech.unissense.pms.common.core.page;
import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.io.IOUtils;
import tech.unissense.pms.common.core.text.Convert;
import tech.unissense.pms.common.utils.ServletUtils;
import tech.unissense.pms.common.utils.StringUtils;
import java.io.IOException;
/**
*
*
* @author ruoyi
*/
public class TableSupport
{
/**
*
*/
public static final String PAGE_NUM = "pageNum";
/**
*
*/
public static final String PAGE_SIZE = "pageSize";
/**
*
*/
public static final String ORDER_BY_COLUMN = "orderByColumn";
/**
* "desc" "asc".
*/
public static final String IS_ASC = "isAsc";
/**
*
*/
public static final String REASONABLE = "reasonable";
/**
*
*/
public static PageDomain getPageDomain()
{
String body = null;
try {
body = new String(IOUtils.toByteArray((ServletUtils.getRequest().getInputStream()))).replaceAll("\t|\n|\r", "");
} catch (IOException e) {
e.printStackTrace();
}
JSONObject paramMap = StringUtils.isNotBlank(body)?JSONObject.parseObject(body):new JSONObject();
Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE);
Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM);
if(paramMap.getIntValue(PAGE_NUM) > 0){
pageNum = paramMap.getIntValue(PAGE_NUM);
}
if(paramMap.getIntValue(PAGE_SIZE) > 0){
pageSize = paramMap.getIntValue(PAGE_SIZE);
}
PageDomain pageDomain = new PageDomain();
pageDomain.setPageNum(pageNum);
pageDomain.setPageSize(pageSize);
pageDomain.setOrderByColumn(StringUtils.isNotBlank(paramMap.getString(ORDER_BY_COLUMN))?paramMap.getString(ORDER_BY_COLUMN):ServletUtils.getParameter(ORDER_BY_COLUMN));
pageDomain.setIsAsc(StringUtils.isNotBlank(paramMap.getString(IS_ASC))?paramMap.getString(IS_ASC):ServletUtils.getParameter(IS_ASC));
pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
return pageDomain;
}
public static PageDomain buildPageRequest()
{
return getPageDomain();
}
}

Some files were not shown because too many files have changed in this diff Show More