feat:修复已知问题,提升系统稳定性
This commit is contained in:
132
remi-sys/remi-sys-web/pom.xml
Normal file
132
remi-sys/remi-sys-web/pom.xml
Normal file
@@ -0,0 +1,132 @@
|
||||
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>remi-sys-web</artifactId>
|
||||
<name>remi-sys-web</name>
|
||||
<description>remi-sys-web</description>
|
||||
|
||||
<parent>
|
||||
<groupId>ai.remi.cloud</groupId>
|
||||
<artifactId>remi-sys</artifactId>
|
||||
<version>3.1.0</version>
|
||||
</parent>
|
||||
|
||||
<!-- 打包上传到私服, 需要和配置文件中的server节点配合使用 -->
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>maven-releases</id>
|
||||
<name>release</name>
|
||||
<url>https://repository.njydsz.com/repository/maven-releases/</url>
|
||||
</repository>
|
||||
<snapshotRepository>
|
||||
<id>maven-snapshots</id>
|
||||
<name>snapshot</name>
|
||||
<url>https://repository.njydsz.com/repository/maven-snapshots/</url>
|
||||
</snapshotRepository>
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
<!--spring-boot-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--spring-cloud-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-bootstrap</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--Nacos-注册中心-->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--Nacos-配置中心-->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--健康监控-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--负载均衡-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--防刷限流-->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--remi-comm-web-->
|
||||
<dependency>
|
||||
<groupId>ai.remi.comm</groupId>
|
||||
<artifactId>remi-comm-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--remi-comm-log-->
|
||||
<dependency>
|
||||
<groupId>ai.remi.comm</groupId>
|
||||
<artifactId>remi-comm-log</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--remi-ids-server-->
|
||||
<dependency>
|
||||
<groupId>ai.remi.cloud</groupId>
|
||||
<artifactId>remi-sys-server</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--remi-ids-job-->
|
||||
<dependency>
|
||||
<groupId>ai.remi.cloud</groupId>
|
||||
<artifactId>remi-sys-job</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--remi-ids-api-->
|
||||
<dependency>
|
||||
<groupId>ai.remi.cloud</groupId>
|
||||
<artifactId>remi-sys-api</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<!--<resources>-->
|
||||
<!-- <resource>-->
|
||||
<!-- <directory>src/main/java</directory>-->
|
||||
<!-- <includes>-->
|
||||
<!-- <include>**/*.xml</include>-->
|
||||
<!-- <include>**/*.properties</include>-->
|
||||
<!-- <include>**/*.yml</include>-->
|
||||
<!-- </includes>-->
|
||||
<!-- </resource>-->
|
||||
<!-- <resource>-->
|
||||
<!-- <directory>src/main/resources</directory>-->
|
||||
<!-- </resource>-->
|
||||
<!--</resources>-->
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,29 @@
|
||||
package ai.remi.sys.web;
|
||||
|
||||
import ai.remi.comm.feign.annotation.EnableRemiFeignClients;
|
||||
import ai.remi.comm.log.annotation.EnableLogRecord;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.context.annotation.EnableMBeanExport;
|
||||
import org.springframework.jmx.support.RegistrationPolicy;
|
||||
|
||||
/**
|
||||
* 系统服务启动程序
|
||||
*/
|
||||
@EnableLogRecord
|
||||
@EnableDiscoveryClient
|
||||
@EnableRemiFeignClients
|
||||
@SpringBootApplication(scanBasePackages = "ai.remi")
|
||||
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
|
||||
public class Application {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
SpringApplication.run(Application.class, args);
|
||||
|
||||
System.out.println("(♥◠‿◠)ノ゙ Remi SYS Web Startup Completed! ლ(´ڡ`ლ)゙ ");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,187 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.id.SnowflakeUtils;
|
||||
import ai.remi.sys.domain.converter.AppConverter;
|
||||
import ai.remi.sys.domain.converter.ConfigConverter;
|
||||
import ai.remi.sys.domain.dto.post.AppPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.AppPutDTO;
|
||||
import ai.remi.sys.domain.entity.App;
|
||||
import ai.remi.sys.domain.entity.Config;
|
||||
import ai.remi.sys.domain.query.AppQuery;
|
||||
import ai.remi.sys.domain.vo.AppVO;
|
||||
import ai.remi.sys.domain.vo.ConfigVO;
|
||||
import ai.remi.sys.server.service.AppService;
|
||||
import ai.remi.sys.server.service.ConfigService;
|
||||
import ai.remi.sys.server.util.AppUtils;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 应用表Application(App)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "应用管理")
|
||||
@RequestMapping("app")
|
||||
public class AppController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private AppService appService;
|
||||
@Resource
|
||||
private ConfigService configService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<AppVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
App app = appService.getById(id);
|
||||
//处理格式转换
|
||||
AppVO appVO = AppConverter.INSTANT.entityToVO(app);
|
||||
List<Config> list = configService.list(Wrappers.<Config>lambdaQuery().eq(Config::getBindId, id));
|
||||
appVO.setAppConfigs(BeanCopyUtils.coverList(list, ConfigVO.class));
|
||||
return ResultBean.success(appVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param appQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<AppVO>> list(@RequestBody AppQuery appQuery) {
|
||||
//处理格式转换
|
||||
App app = AppConverter.INSTANT.queryToEntity(appQuery);
|
||||
//执行分页查询
|
||||
List<App> listResult = appService.list(new QueryWrapper<>(app));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, AppVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param appQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<AppVO>> page(PageQuery pageQuery, AppQuery appQuery) {
|
||||
//处理分页条件
|
||||
Page<App> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
App app = AppConverter.INSTANT.queryToEntity(appQuery);
|
||||
//执行分页查询
|
||||
Page<App> pageResult = appService.page(page, new QueryWrapper<>(app));
|
||||
PagerBean<AppVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), AppVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param appDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增应用配置", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated AppPostDTO appDTO) {
|
||||
//处理格式转换
|
||||
App app = AppConverter.INSTANT.postDtoToEntity(appDTO);
|
||||
//应用ID
|
||||
String appId = SnowflakeUtils.getInstance().nextIdStr();
|
||||
app.setId(appId);
|
||||
//应用编码
|
||||
String appCode = AppUtils.getAppCode();
|
||||
app.setAppCode(appCode);
|
||||
//应用标识
|
||||
String appKey = AppUtils.getAppKey();
|
||||
app.setAppKey(appKey);
|
||||
//应用密钥
|
||||
String appSecret = AppUtils.getAppSecret(appKey);
|
||||
app.setAppSecret(appSecret);
|
||||
//保存应用数据
|
||||
appService.save(app);
|
||||
//更新应用全局配置
|
||||
Optional.ofNullable(appDTO.getAppConfigs())
|
||||
.map(List::stream)
|
||||
.ifPresent(stream -> stream.forEach(item -> {
|
||||
Config config = ConfigConverter.INSTANT.postDtoToEntity(item);
|
||||
configService.saveOrUpdate(config, Wrappers.<Config>lambdaUpdate().eq(Config::getConfCode, item.getConfCode())
|
||||
.eq(Config::getBindId, appId)
|
||||
.eq(Config::getBindCode, appCode));
|
||||
}));
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param appDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改应用配置", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated AppPutDTO appDTO) {
|
||||
//处理格式转换
|
||||
App app = AppConverter.INSTANT.putDtoToEntity(appDTO);
|
||||
//执行数据更新
|
||||
appService.updateById(app);
|
||||
//更新应用全局配置
|
||||
Optional.ofNullable(appDTO.getAppConfigs())
|
||||
.map(List::stream)
|
||||
.ifPresent(stream -> stream.forEach(item -> {
|
||||
Config config = ConfigConverter.INSTANT.postDtoToEntity(item);
|
||||
configService.saveOrUpdate(config, Wrappers.<Config>lambdaUpdate().eq(Config::getConfCode, item.getConfCode())
|
||||
.eq(Config::getBindId, appDTO.getId())
|
||||
.eq(Config::getBindCode, appDTO.getAppCode()));
|
||||
}));
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除应用数据", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(appService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.github.xiaoymin.knife4j.annotations.ApiSort;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.tree.TreeBuild;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.collection.CollectionUtils;
|
||||
import ai.remi.comm.util.string.StringUtils;
|
||||
import ai.remi.sys.domain.converter.AppGroupConverter;
|
||||
import ai.remi.sys.domain.dto.post.AppGroupPostDTO;
|
||||
import ai.remi.sys.domain.entity.AppGroup;
|
||||
import ai.remi.sys.domain.entity.Group;
|
||||
import ai.remi.sys.domain.query.AppGroupQuery;
|
||||
import ai.remi.sys.domain.tree.GroupTree;
|
||||
import ai.remi.sys.domain.vo.AppGroupVO;
|
||||
import ai.remi.sys.server.service.AppGroupService;
|
||||
import ai.remi.sys.server.service.GroupService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 应用组织(AppGroup)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@ApiSort(value = 1)
|
||||
@Tag(name = "应用组织")
|
||||
@RequestMapping("appGroup")
|
||||
public class AppGroupController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private AppGroupService appGroupService;
|
||||
@Resource
|
||||
private GroupService groupService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<AppGroupVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
AppGroup appGroup = appGroupService.getById(id);
|
||||
//处理格式转换
|
||||
AppGroupVO appGroupVO = AppGroupConverter.INSTANT.entityToVO(appGroup);
|
||||
return ResultBean.success(appGroupVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param appGroupQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/tree")
|
||||
@Operation(summary = "查询树结构")
|
||||
public ResultBean<List<GroupTree>> tree(@RequestBody AppGroupQuery appGroupQuery) {
|
||||
//先查询应用下的组织
|
||||
List<AppGroup> appGroups = appGroupService.list(Wrappers.<AppGroup>lambdaQuery().eq(StringUtils.isNoneBlank(appGroupQuery.getAppId()), AppGroup::getAppId, appGroupQuery.getAppId()).eq(StringUtils.isNoneBlank(appGroupQuery.getAppCode()), AppGroup::getAppCode, appGroupQuery.getAppCode()));
|
||||
// 使用Stream流获取每个人的年龄并收集到一个列表中
|
||||
List<String> groupIds = appGroups.stream().map(AppGroup::getGroupId).collect(Collectors.toList());
|
||||
//
|
||||
List<Group> listResult = groupService.getBaseMapper().selectList(Wrappers.<Group>lambdaQuery()
|
||||
.in(CollectionUtils.isNotEmpty(appGroups), Group::getId, groupIds)
|
||||
.last("ORDER BY ISNULL( sort ) ASC,sort ASC"));
|
||||
// 原查询结果转换树形结构
|
||||
List<GroupTree> groupTrees = BeanCopyUtils.coverList(listResult, GroupTree.class);
|
||||
if (CollectionUtils.isNotEmpty(groupTrees)) {
|
||||
String rootId = "0";
|
||||
// 创建树形结构并返回
|
||||
TreeBuild treeBuild = new TreeBuild(rootId, groupTrees);
|
||||
List buildTree = treeBuild.buildTree();
|
||||
return ResultBean.success(buildTree);
|
||||
}
|
||||
return ResultBean.success(groupTrees);
|
||||
}
|
||||
|
||||
/**
|
||||
* 给应用批量配置菜单
|
||||
*
|
||||
* @param appGroups 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/addOrUpdate")
|
||||
@Operation(summary = "给应用批量配置业务组织")
|
||||
@LogRecord(content = "给应用批量配置业务组织", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> addOrUpdate(@RequestBody @Validated List<AppGroupPostDTO> appGroups) {
|
||||
//先删除后新增
|
||||
appGroupService.remove(Wrappers.<AppGroup>lambdaQuery().eq(AppGroup::getAppId, appGroups.get(0).getAppId()));
|
||||
//appGroupService
|
||||
appGroupService.saveBatch(BeanCopyUtils.copyListProperties(appGroups, AppGroup.class));
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.tree.TreeBuild;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.collection.CollectionUtils;
|
||||
import ai.remi.comm.util.string.StringUtils;
|
||||
import ai.remi.sys.domain.converter.AppMenuConverter;
|
||||
import ai.remi.sys.domain.dto.post.AppMenuPostDTO;
|
||||
import ai.remi.sys.domain.entity.App;
|
||||
import ai.remi.sys.domain.entity.AppMenu;
|
||||
import ai.remi.sys.domain.query.AppMenuQuery;
|
||||
import ai.remi.sys.domain.tree.MenuTree;
|
||||
import ai.remi.sys.domain.vo.AppMenuVO;
|
||||
import ai.remi.sys.infra.mapper.MenuMapper;
|
||||
import ai.remi.sys.server.service.AppMenuService;
|
||||
import ai.remi.sys.server.service.AppService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 应用菜单(AppMenu)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "应用菜单")
|
||||
@RequestMapping("appMenu")
|
||||
public class AppMenuController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private AppMenuService appMenuService;
|
||||
@Resource
|
||||
private AppService appService;
|
||||
@Resource
|
||||
private MenuMapper menuMapper;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<AppMenuVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
AppMenu appMenu = appMenuService.getById(id);
|
||||
//处理格式转换
|
||||
AppMenuVO appMenuVO = AppMenuConverter.INSTANT.entityToVO(appMenu);
|
||||
return ResultBean.success(appMenuVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param appMenuQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/tree")
|
||||
@Operation(summary = "查询树结构")
|
||||
public ResultBean<List<AppMenuVO>> tree(@RequestBody AppMenuQuery appMenuQuery) {
|
||||
List<AppMenuVO> appMenuVOS = new ArrayList<>();
|
||||
List<App> apps = appService.list(Wrappers.<App>lambdaQuery().eq(StringUtils.isNoneBlank(appMenuQuery.getAppId()), App::getId, appMenuQuery.getAppId()).eq(StringUtils.isNoneBlank(appMenuQuery.getAppCode()), App::getAppCode, appMenuQuery.getAppCode()).eq(App::getStatus, 1));
|
||||
for (App app : apps) {
|
||||
List<MenuTree> menuTrees = menuMapper.selectMenuByAppId(app.getId(), 1);
|
||||
//查询条件为空,默认查询根结点为0的一级部门
|
||||
if (CollectionUtils.isNotEmpty(menuTrees)) {
|
||||
String rootId = "0";
|
||||
// 创建树形结构并返回
|
||||
TreeBuild treeBuild = new TreeBuild(rootId, menuTrees);
|
||||
appMenuVOS.add(AppMenuVO.builder().appId(app.getId()).appCode(app.getAppCode()).appName(app.getAppName()).appNameEn(app.getAppNameEn()).menuTree(treeBuild.buildTree()).build());
|
||||
}
|
||||
}
|
||||
return ResultBean.success(appMenuVOS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 给应用批量配置菜单
|
||||
*
|
||||
* @param appMenuDTOs 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/addOrUpdate")
|
||||
@Operation(summary = "给应用批量配置菜单")
|
||||
@LogRecord(content = "给应用批量配置菜单", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> addOrUpdate(@RequestBody @Validated List<AppMenuPostDTO> appMenuDTOs) {
|
||||
//先删除后新增
|
||||
appMenuService.remove(Wrappers.<AppMenu>lambdaQuery().eq(AppMenu::getAppId, appMenuDTOs.get(0).getAppId()));
|
||||
//执行数据保存
|
||||
appMenuService.saveBatch(BeanCopyUtils.copyListProperties(appMenuDTOs, AppMenu.class));
|
||||
return ResultBean.success();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.AppPublishConverter;
|
||||
import ai.remi.sys.domain.dto.post.AppPublishPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.AppPublishPutDTO;
|
||||
import ai.remi.sys.domain.entity.AppPublish;
|
||||
import ai.remi.sys.domain.query.AppPublishQuery;
|
||||
import ai.remi.sys.domain.vo.AppPublishVO;
|
||||
import ai.remi.sys.server.service.AppPublishService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 应用发布表(AppPublish)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "应用发布")
|
||||
@RequestMapping("appPublish")
|
||||
public class AppPublishController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private AppPublishService appPublishService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<AppPublishVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
AppPublish appPublish = appPublishService.getById(id);
|
||||
//处理格式转换
|
||||
AppPublishVO appPublishVO = AppPublishConverter.INSTANT.entityToVO(appPublish);
|
||||
return ResultBean.success(appPublishVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param appPublishQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<AppPublishVO>> list(@RequestBody AppPublishQuery appPublishQuery) {
|
||||
//处理格式转换
|
||||
AppPublish appPublish = AppPublishConverter.INSTANT.queryToEntity(appPublishQuery);
|
||||
//执行分页查询
|
||||
List<AppPublish> listResult = appPublishService.list(new QueryWrapper<>(appPublish));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, AppPublishVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param appPublishQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<AppPublishVO>> page(PageQuery pageQuery, AppPublishQuery appPublishQuery) {
|
||||
//处理分页条件
|
||||
Page<AppPublish> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
AppPublish appPublish = AppPublishConverter.INSTANT.queryToEntity(appPublishQuery);
|
||||
//执行分页查询
|
||||
Page<AppPublish> pageResult = appPublishService.page(page, new QueryWrapper<>(appPublish));
|
||||
PagerBean<AppPublishVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), AppPublishVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param appPublishDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated AppPublishPostDTO appPublishDTO) {
|
||||
//处理格式转换
|
||||
AppPublish appPublish = AppPublishConverter.INSTANT.postDtoToEntity(appPublishDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(appPublishService.save(appPublish));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param appPublishDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated AppPublishPutDTO appPublishDTO) {
|
||||
//处理格式转换
|
||||
AppPublish appPublish = AppPublishConverter.INSTANT.putDtoToEntity(appPublishDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(appPublishService.updateById(appPublish));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(appPublishService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.AreaConverter;
|
||||
import ai.remi.sys.domain.dto.post.AreaPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.AreaPutDTO;
|
||||
import ai.remi.sys.domain.entity.Area;
|
||||
import ai.remi.sys.domain.query.AreaQuery;
|
||||
import ai.remi.sys.domain.vo.AreaVO;
|
||||
import ai.remi.sys.server.service.AreaService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 省市县表(Area)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "区域管理")
|
||||
@RequestMapping("area")
|
||||
public class AreaController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private AreaService areaService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<AreaVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Area area = areaService.getById(id);
|
||||
//处理格式转换
|
||||
AreaVO areaVO = AreaConverter.INSTANT.entityToVO(area);
|
||||
return ResultBean.success(areaVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param areaQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<AreaVO>> list(@RequestBody AreaQuery areaQuery) {
|
||||
//处理格式转换
|
||||
Area area = AreaConverter.INSTANT.queryToEntity(areaQuery);
|
||||
//执行分页查询
|
||||
List<Area> listResult = areaService.list(new QueryWrapper<>(area));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, AreaVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param areaQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<AreaVO>> page(PageQuery pageQuery, AreaQuery areaQuery) {
|
||||
//处理分页条件
|
||||
Page<Area> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Area area = AreaConverter.INSTANT.queryToEntity(areaQuery);
|
||||
//执行分页查询
|
||||
Page<Area> pageResult = areaService.page(page, new QueryWrapper<>(area));
|
||||
PagerBean<AreaVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), AreaVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param areaDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "录入省市县信息", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated AreaPostDTO areaDTO) {
|
||||
//处理格式转换
|
||||
Area area = AreaConverter.INSTANT.postDtoToEntity(areaDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(areaService.save(area));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param areaDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "更新省市县信息", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated AreaPutDTO areaDTO) {
|
||||
//处理格式转换
|
||||
Area area = AreaConverter.INSTANT.putDtoToEntity(areaDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(areaService.updateById(area));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除省市县信息", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(areaService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.github.xiaoymin.knife4j.annotations.ApiSort;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.minio.domian.BucketS3;
|
||||
import ai.remi.comm.minio.service.MinIOService;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.BucketConverter;
|
||||
import ai.remi.sys.domain.dto.post.BucketPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.BucketPutDTO;
|
||||
import ai.remi.sys.domain.entity.Bucket;
|
||||
import ai.remi.sys.domain.query.BucketQuery;
|
||||
import ai.remi.sys.domain.vo.BucketVO;
|
||||
import ai.remi.sys.server.service.BucketService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 存储桶管理(Bucket)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@ApiSort(value = 1)
|
||||
@Tag(name = "存储桶管理")
|
||||
@RequestMapping("bucket")
|
||||
public class BucketController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private BucketService bucketService;
|
||||
|
||||
@Resource
|
||||
MinIOService minIOService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<BucketVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) throws Exception {
|
||||
Bucket bucket = bucketService.getById(id);
|
||||
//处理格式转换
|
||||
BucketVO bucketVO = BucketConverter.INSTANT.entityToVO(bucket);
|
||||
return ResultBean.success(bucketVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param bucketQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<BucketVO>> list(@RequestBody BucketQuery bucketQuery) {
|
||||
//处理格式转换
|
||||
Bucket bucket = BucketConverter.INSTANT.queryToEntity(bucketQuery);
|
||||
//执行分页查询
|
||||
List<Bucket> listResult = bucketService.list(new QueryWrapper<>(bucket));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, BucketVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param bucketDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "创建存储桶", businessType = BusinessType.INSERT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated BucketPostDTO bucketDTO) throws Exception {
|
||||
//处理格式转换
|
||||
Bucket bucket = BucketConverter.INSTANT.postDtoToEntity(bucketDTO);
|
||||
//执行数据保存
|
||||
minIOService.createBucket(BeanCopyUtils.copyPropertiesThird(bucket, BucketS3.class));
|
||||
bucketService.save(bucket);
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param bucketDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改存储桶", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated BucketPutDTO bucketDTO) {
|
||||
//处理格式转换
|
||||
Bucket bucket = BucketConverter.INSTANT.putDtoToEntity(bucketDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(bucketService.updateById(bucket));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除存储桶", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) throws Exception {
|
||||
for (String id : ids) {
|
||||
Bucket bucket = bucketService.getById(id);
|
||||
minIOService.deleteBucket(bucket.getBucketCode());
|
||||
bucketService.removeById(id);
|
||||
}
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.tree.TreeBuild;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.collection.CollectionUtils;
|
||||
import ai.remi.comm.util.string.StringUtils;
|
||||
import ai.remi.sys.domain.converter.CompanyConverter;
|
||||
import ai.remi.sys.domain.dto.post.CompanyPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.CompanyPutDTO;
|
||||
import ai.remi.sys.domain.entity.Company;
|
||||
import ai.remi.sys.domain.entity.CompanyDept;
|
||||
import ai.remi.sys.domain.query.CompanyQuery;
|
||||
import ai.remi.sys.domain.tree.CompanyTree;
|
||||
import ai.remi.sys.domain.vo.CompanyVO;
|
||||
import ai.remi.sys.server.service.CompanyDeptService;
|
||||
import ai.remi.sys.server.service.CompanyService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 公司表(Company)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "公司管理")
|
||||
@RequestMapping("company")
|
||||
public class CompanyController {
|
||||
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private CompanyService companyService;
|
||||
|
||||
@Resource
|
||||
private CompanyDeptService companyDeptService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<CompanyVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Company company = companyService.getById(id);
|
||||
//处理格式转换
|
||||
CompanyVO companyVO = CompanyConverter.INSTANT.entityToVO(company);
|
||||
return ResultBean.success(companyVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param companyQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/tree")
|
||||
@Operation(summary = "查询树结构")
|
||||
public ResultBean<List<CompanyTree>> tree(@RequestBody CompanyQuery companyQuery) {
|
||||
Company company = CompanyConverter.INSTANT.queryToEntity(companyQuery);
|
||||
List<Company> listResult = companyService.getBaseMapper().selectList(Wrappers.<Company>lambdaQuery()
|
||||
.like(StringUtils.isNotEmpty(company.getCompanyName()), Company::getCompanyName, company.getCompanyName())
|
||||
.last("ORDER BY ISNULL( sort ) ASC,sort ASC"));
|
||||
// 原查询结果转换树形结构
|
||||
List<CompanyTree> companyTrees = BeanCopyUtils.coverList(listResult, CompanyTree.class);
|
||||
// TODO 后续从全局变量中取出租户信息,判断集团租户和公司租户是否是同一个值,如果是说明当前登陆的集团账户,此时公司根结点ID为0,否则公司根结点ID为当前用户登陆的公司ID
|
||||
if (CollectionUtils.isNotEmpty(companyTrees)) {
|
||||
String rootId = "0";
|
||||
//String companyTenantId = AuthInfoUtils.getCompanyTenantId();
|
||||
//String deptTenantId = AuthInfoUtils.getDeptTenantId();
|
||||
//if (companyTenantId.equals(deptTenantId)) {
|
||||
// rootId = "0";
|
||||
//} else {
|
||||
// rootId = deptTenantId;
|
||||
//}
|
||||
// 创建树形结构并返回
|
||||
TreeBuild treeBuild = new TreeBuild(rootId, companyTrees);
|
||||
List buildTree = treeBuild.buildTree();
|
||||
return ResultBean.success(buildTree);
|
||||
}
|
||||
return ResultBean.success(companyTrees);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param companyQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<CompanyVO>> list(@RequestBody CompanyQuery companyQuery) {
|
||||
//处理格式转换
|
||||
Company company = CompanyConverter.INSTANT.queryToEntity(companyQuery);
|
||||
//执行分页查询
|
||||
List<Company> listResult = companyService.list(new QueryWrapper<>(company));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, CompanyVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param companyDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增公司数据", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated CompanyPostDTO companyDTO) {
|
||||
//处理格式转换
|
||||
Company company = CompanyConverter.INSTANT.postDtoToEntity(companyDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(companyService.save(company));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param companyDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "更新公司数据", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated CompanyPutDTO companyDTO) {
|
||||
//处理格式转换
|
||||
Company company = CompanyConverter.INSTANT.putDtoToEntity(companyDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(companyService.updateById(company));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除公司数据", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
for (String id : ids) {
|
||||
Company company = companyService.getOne(Wrappers.<Company>lambdaQuery().eq(Company::getParentId, id).last("limit 1"));
|
||||
CompanyDept companyDept = companyDeptService.getOne(Wrappers.<CompanyDept>lambdaQuery().eq(CompanyDept::getCompanyId, id).last("limit 1"));
|
||||
//当前公司下有子子公司或部门未移除
|
||||
AssertUtils.isTrue(Objects.nonNull(company) || Objects.nonNull(companyDept), MessageUtils.getMessage("delete.company.error"));
|
||||
}
|
||||
//删除公司信息
|
||||
return ResultBean.success(companyService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.github.xiaoymin.knife4j.annotations.ApiSort;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.auth.AuthInfoUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.ConfigConverter;
|
||||
import ai.remi.sys.domain.dto.post.ConfigPostDTO;
|
||||
import ai.remi.sys.domain.entity.Config;
|
||||
import ai.remi.sys.domain.query.ConfigQuery;
|
||||
import ai.remi.sys.domain.vo.ConfigVO;
|
||||
import ai.remi.sys.server.service.ConfigService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 全局配置(Config)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@ApiSort(value = 1)
|
||||
@Tag(name = "全局配置")
|
||||
@RequestMapping("config")
|
||||
public class ConfigController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private ConfigService configService;
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param configQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<ConfigVO>> list(@RequestBody ConfigQuery configQuery) {
|
||||
//处理格式转换
|
||||
Config config = ConfigConverter.INSTANT.queryToEntity(configQuery);
|
||||
//执行分页查询
|
||||
List<Config> listResult = configService.list(new QueryWrapper<>(config));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, ConfigVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/getAppConfigs")
|
||||
@Operation(summary = "查询应用全局配置")
|
||||
public ResultBean<List<ConfigVO>> getAppConfigs(@RequestParam("appId") String appId, @RequestParam("confType") Integer confType) {
|
||||
//处理格式转换
|
||||
Config config = Config.builder().bindId(appId).confType(confType).build();
|
||||
//执行分页查询
|
||||
List<Config> listResult = configService.list(new QueryWrapper<>(config));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, ConfigVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/getUserConfigs")
|
||||
@Operation(summary = "查询用户全局配置")
|
||||
public ResultBean<List<ConfigVO>> getUserConfigs() {
|
||||
String uniqueId = AuthInfoUtils.getUniqueId();
|
||||
//处理格式转换
|
||||
Config config = Config.builder().bindId(uniqueId).confType(1).build();
|
||||
//执行分页查询
|
||||
List<Config> listResult = configService.list(new QueryWrapper<>(config));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, ConfigVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存配置
|
||||
*
|
||||
* @param configPosts 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/operate")
|
||||
@Operation(summary = "保存配置")
|
||||
@LogRecord(content = "保存全局配置", businessType = BusinessType.UPDATE)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated List<ConfigPostDTO> configPosts) {
|
||||
for (ConfigPostDTO configPost : configPosts) {
|
||||
//处理格式转换
|
||||
Config config = ConfigConverter.INSTANT.postDtoToEntity(configPost);
|
||||
configService.saveOrUpdate(config, Wrappers.<Config>lambdaUpdate().eq(Config::getConfCode, configPost.getConfCode())
|
||||
.eq(StringUtils.isNotBlank(configPost.getBindId()), Config::getBindId, configPost.getBindId())
|
||||
.eq(StringUtils.isNotBlank(configPost.getBindCode()), Config::getBindCode, configPost.getBindCode()));
|
||||
}
|
||||
return ResultBean.success("保存成功");
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param configQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<ConfigVO>> page(PageQuery pageQuery, ConfigQuery configQuery) {
|
||||
//处理分页条件
|
||||
Page<Config> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Config config = ConfigConverter.INSTANT.queryToEntity(configQuery);
|
||||
//执行分页查询
|
||||
Page<Config> pageResult = configService.page(page, new QueryWrapper<>(config));
|
||||
PagerBean<ConfigVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), ConfigVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "批量删除")
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(configService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.converter.CordRoleConverter;
|
||||
import ai.remi.sys.domain.dto.post.CordRolePostDTO;
|
||||
import ai.remi.sys.domain.entity.Company;
|
||||
import ai.remi.sys.domain.entity.CordRole;
|
||||
import ai.remi.sys.domain.entity.Dept;
|
||||
import ai.remi.sys.domain.query.CordRoleQuery;
|
||||
import ai.remi.sys.domain.vo.CordRoleVO;
|
||||
import ai.remi.sys.server.service.CompanyService;
|
||||
import ai.remi.sys.server.service.CordRoleService;
|
||||
import ai.remi.sys.server.service.DeptService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 组织角色表(CordRole)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "组织角色")
|
||||
@RequestMapping("cordRole")
|
||||
public class CordRoleController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private CordRoleService cordRoleService;
|
||||
@Resource
|
||||
private CompanyService companyService;
|
||||
@Resource
|
||||
private DeptService deptService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<CordRoleVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
CordRole cordRole = cordRoleService.getById(id);
|
||||
//处理格式转换
|
||||
CordRoleVO cordRoleVO = CordRoleConverter.INSTANT.entityToVO(cordRole);
|
||||
return ResultBean.success(cordRoleVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param cordRoleQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<CordRoleVO>> list(@RequestBody CordRoleQuery cordRoleQuery) {
|
||||
//处理格式转换
|
||||
CordRole cordRole = CordRoleConverter.INSTANT.queryToEntity(cordRoleQuery);
|
||||
//执行分页查询
|
||||
List<CordRole> listResult = cordRoleService.list(new QueryWrapper<>(cordRole));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, CordRoleVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param cordRoleQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<CordRoleVO>> page(PageQuery pageQuery, CordRoleQuery cordRoleQuery) {
|
||||
//处理分页条件
|
||||
Page<CordRole> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
CordRole cordRole = CordRoleConverter.INSTANT.queryToEntity(cordRoleQuery);
|
||||
//执行分页查询
|
||||
Page<CordRole> pageResult = cordRoleService.page(page, new QueryWrapper<>(cordRole));
|
||||
List<CordRoleVO> cordRoleVOS = BeanCopyUtils.coverList(pageResult.getRecords(), CordRoleVO.class);
|
||||
for (CordRoleVO cordRoleVO : cordRoleVOS) {
|
||||
if (cordRoleVO.getCordType() == 1) {
|
||||
Company company = companyService.getById(cordRoleVO.getCordId());
|
||||
cordRoleVO.setCompanyName(company.getCompanyName());
|
||||
cordRoleVO.setCompanyNameEn(company.getCompanyNameEn());
|
||||
}
|
||||
if (cordRoleVO.getCordType() == 2) {
|
||||
Dept dept = deptService.getById(cordRoleVO.getCordId());
|
||||
cordRoleVO.setDeptName(dept.getDeptName());
|
||||
cordRoleVO.setDeptNameEn(dept.getDeptNameEn());
|
||||
}
|
||||
}
|
||||
PagerBean<CordRoleVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), cordRoleVOS);
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param cordRoleDTOs 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "给组织角色批量分配组织(公司/部门)", businessType = BusinessType.GRANT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated List<CordRolePostDTO> cordRoleDTOs) {
|
||||
for (CordRolePostDTO cordRoleDTO : cordRoleDTOs) {
|
||||
//处理格式转换
|
||||
CordRole cordRole = CordRoleConverter.INSTANT.postDtoToEntity(cordRoleDTO);
|
||||
CordRole one = cordRoleService.getOne(Wrappers.<CordRole>lambdaQuery().eq(CordRole::getRoleId, cordRoleDTO.getRoleId()).eq(CordRole::getCordId, cordRoleDTO.getCordId()).last("limit 1"));
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(one), MessageUtils.getMessage("add.roleCord.error",new Object[]{cordRoleDTO.getCordCode()}));
|
||||
cordRoleService.save(cordRole);
|
||||
}
|
||||
//执行数据保存
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "批量删除组织角色已分配的组织(公司/部门)", businessType = BusinessType.GRANT)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(cordRoleService.removeByIds(ids));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.tree.TreeBuild;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.collection.CollectionUtils;
|
||||
import ai.remi.comm.util.id.SnowflakeUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.converter.DeptConverter;
|
||||
import ai.remi.sys.domain.dto.post.DeptPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.DeptPutDTO;
|
||||
import ai.remi.sys.domain.entity.CompanyDept;
|
||||
import ai.remi.sys.domain.entity.Dept;
|
||||
import ai.remi.sys.domain.entity.DeptUser;
|
||||
import ai.remi.sys.domain.entity.User;
|
||||
import ai.remi.sys.domain.query.DeptQuery;
|
||||
import ai.remi.sys.domain.tree.DeptTree;
|
||||
import ai.remi.sys.domain.vo.DeptVO;
|
||||
import ai.remi.sys.infra.mapper.DeptMapper;
|
||||
import ai.remi.sys.server.service.CompanyDeptService;
|
||||
import ai.remi.sys.server.service.DeptService;
|
||||
import ai.remi.sys.server.service.DeptUserService;
|
||||
import ai.remi.sys.server.service.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 部门表(Dept)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "部门管理")
|
||||
@RequestMapping("dept")
|
||||
public class DeptController {
|
||||
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private DeptService deptService;
|
||||
|
||||
@Resource
|
||||
private UserService userService;
|
||||
|
||||
@Resource
|
||||
private DeptMapper deptMapper;
|
||||
|
||||
@Resource
|
||||
private CompanyDeptService companyDeptService;
|
||||
|
||||
@Resource
|
||||
private DeptUserService deptUserService;
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<DeptVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
DeptVO deptVO = deptMapper.selectOneById(id);
|
||||
//组装部门领导信息
|
||||
User user = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getId, deptVO.getDeptHeadId()));
|
||||
if (Objects.nonNull(user)) {
|
||||
deptVO.setDeptHeadName(user.getUserName());
|
||||
deptVO.setDeptHeadNameEn(user.getUserNameEn());
|
||||
}
|
||||
return ResultBean.success(deptVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param deptQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/tree")
|
||||
@Operation(summary = "查询树结构")
|
||||
public ResultBean<List<DeptTree>> tree(@RequestBody DeptQuery deptQuery) {
|
||||
List<DeptTree> deptTrees = deptMapper.selectDeptByCompanyId(deptQuery.getCompanyId(), deptQuery.getStatus());
|
||||
for (DeptTree deptTree : deptTrees) {
|
||||
//组装部门领导信息
|
||||
User user = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getId, deptTree.getDeptHeadId()).last("limit 1"));
|
||||
if (Objects.nonNull(user)) {
|
||||
deptTree.setDeptHeadName(user.getUserName());
|
||||
deptTree.setDeptHeadNameEn(user.getUserNameEn());
|
||||
}
|
||||
}
|
||||
//查询条件为空,默认查询根结点为0的一级部门
|
||||
if (CollectionUtils.isNotEmpty(deptTrees)) {
|
||||
String rootId = "0";
|
||||
// 创建树形结构并返回
|
||||
TreeBuild treeBuild = new TreeBuild(rootId, deptTrees);
|
||||
return ResultBean.success(treeBuild.buildTree());
|
||||
}
|
||||
return ResultBean.success(deptTrees);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param deptDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "添加部门数据", businessType = BusinessType.INSERT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated DeptPostDTO deptDTO) {
|
||||
//处理格式转换
|
||||
Dept dept = DeptConverter.INSTANT.postDtoToEntity(deptDTO);
|
||||
dept.setId(SnowflakeUtils.getInstance().nextIdStr());
|
||||
//保存公司部门中间表
|
||||
CompanyDept one = companyDeptService.getOne(Wrappers.lambdaQuery(CompanyDept.class).eq(CompanyDept::getCompanyId, deptDTO.getCompanyId()).eq(CompanyDept::getDeptCode, deptDTO.getDeptCode()).last("limit 1"));
|
||||
//公司下已存在相同部门
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(one), MessageUtils.getMessage("add.dept.error"));
|
||||
CompanyDept companyDept = CompanyDept.builder()
|
||||
.companyId(deptDTO.getCompanyId()).companyCode(deptDTO.getCompanyCode())
|
||||
.deptId(dept.getId()).deptCode(dept.getDeptCode()).build();
|
||||
companyDeptService.save(companyDept);
|
||||
//执行数据保存
|
||||
return ResultBean.success(deptService.save(dept));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param deptDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "更新部门数据", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated DeptPutDTO deptDTO) {
|
||||
//处理格式转换
|
||||
Dept dept = DeptConverter.INSTANT.putDtoToEntity(deptDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(deptService.updateById(dept));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除部门数据", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
for (String id : ids) {
|
||||
Dept dept = deptService.getOne(Wrappers.<Dept>lambdaQuery().eq(Dept::getParentId, id).last("limit 1"));
|
||||
DeptUser userDept = deptUserService.getOne(Wrappers.<DeptUser>lambdaQuery().eq(DeptUser::getDeptId, id).last("limit 1"));
|
||||
//当前部门下有子部门或员工未移除
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(dept) || ObjectUtils.isEmpty(userDept), MessageUtils.getMessage("delete.dept.error"));
|
||||
//删除公司部门中间表
|
||||
LambdaQueryWrapper<CompanyDept> queryWrapper = Wrappers.lambdaQuery(CompanyDept.class).eq(CompanyDept::getDeptId, id);
|
||||
companyDeptService.remove(queryWrapper);
|
||||
}
|
||||
//删除部门信息
|
||||
return ResultBean.success(deptService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.DictConverter;
|
||||
import ai.remi.sys.domain.dto.post.DictPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.DictPutDTO;
|
||||
import ai.remi.sys.domain.entity.Dict;
|
||||
import ai.remi.sys.domain.query.DictQuery;
|
||||
import ai.remi.sys.domain.vo.DictVO;
|
||||
import ai.remi.sys.server.service.DictService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 字典主表(Dict)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "字典管理")
|
||||
@RequestMapping("dict")
|
||||
public class DictController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private DictService dictService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<DictVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Dict dict = dictService.getById(id);
|
||||
//处理格式转换
|
||||
DictVO dictVO = DictConverter.INSTANT.entityToVO(dict);
|
||||
return ResultBean.success(dictVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param dictQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<DictVO>> list(@RequestBody DictQuery dictQuery) {
|
||||
//处理格式转换
|
||||
Dict dict = DictConverter.INSTANT.queryToEntity(dictQuery);
|
||||
//执行分页查询
|
||||
List<Dict> listResult = dictService.list(new QueryWrapper<>(dict));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, DictVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param dictQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<DictVO>> page(PageQuery pageQuery, DictQuery dictQuery) {
|
||||
//处理分页条件
|
||||
Page<Dict> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Dict dict = DictConverter.INSTANT.queryToEntity(dictQuery);
|
||||
//执行分页查询
|
||||
Page<Dict> pageResult = dictService.page(page, new QueryWrapper<>(dict));
|
||||
PagerBean<DictVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), DictVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param dictDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增字典数据", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated DictPostDTO dictDTO) {
|
||||
//处理格式转换
|
||||
Dict dict = DictConverter.INSTANT.postDtoToEntity(dictDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(dictService.save(dict));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param dictDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改字典数据", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated DictPutDTO dictDTO) {
|
||||
//处理格式转换
|
||||
Dict dict = DictConverter.INSTANT.putDtoToEntity(dictDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(dictService.updateById(dict));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除字典树", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(dictService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.DictItemConverter;
|
||||
import ai.remi.sys.domain.dto.post.DictItemPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.DictItemPutDTO;
|
||||
import ai.remi.sys.domain.entity.DictItem;
|
||||
import ai.remi.sys.domain.query.DictItemQuery;
|
||||
import ai.remi.sys.domain.vo.DictItemVO;
|
||||
import ai.remi.sys.server.service.DictItemService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 字典项表(DictItem)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "字典项值")
|
||||
@RequestMapping("dictItem")
|
||||
public class DictItemController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private DictItemService dictItemService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<DictItemVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
DictItem dictItem = dictItemService.getById(id);
|
||||
//处理格式转换
|
||||
DictItemVO dictItemVO = DictItemConverter.INSTANT.entityToVO(dictItem);
|
||||
return ResultBean.success(dictItemVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param dictItemQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<DictItemVO>> list(@RequestBody DictItemQuery dictItemQuery) {
|
||||
//处理格式转换
|
||||
DictItem dictItem = DictItemConverter.INSTANT.queryToEntity(dictItemQuery);
|
||||
//执行分页查询
|
||||
List<DictItem> listResult = dictItemService.list(new QueryWrapper<>(dictItem));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, DictItemVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param dictItemQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<DictItemVO>> page(PageQuery pageQuery, DictItemQuery dictItemQuery) {
|
||||
//处理分页条件
|
||||
Page<DictItem> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
DictItem dictItem = DictItemConverter.INSTANT.queryToEntity(dictItemQuery);
|
||||
//执行分页查询
|
||||
Page<DictItem> pageResult = dictItemService.page(page, new QueryWrapper<>(dictItem));
|
||||
PagerBean<DictItemVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), DictItemVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param dictItemDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增字典项值", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated DictItemPostDTO dictItemDTO) {
|
||||
//处理格式转换
|
||||
DictItem dictItem = DictItemConverter.INSTANT.postDtoToEntity(dictItemDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(dictItemService.save(dictItem));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param dictItemDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改字典项值", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated DictItemPutDTO dictItemDTO) {
|
||||
//处理格式转换
|
||||
DictItem dictItem = DictItemConverter.INSTANT.putDtoToEntity(dictItemDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(dictItemService.updateById(dictItem));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除字典项值", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(dictItemService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.github.xiaoymin.knife4j.annotations.ApiSort;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.minio.service.MinIOService;
|
||||
import ai.remi.comm.util.auth.AuthInfoUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.file.FileTypeUtils;
|
||||
import ai.remi.comm.util.file.FileUtils;
|
||||
import ai.remi.comm.util.string.StringUtils;
|
||||
import ai.remi.sys.domain.converter.FileConverter;
|
||||
import ai.remi.sys.domain.entity.Bucket;
|
||||
import ai.remi.sys.domain.entity.File;
|
||||
import ai.remi.sys.domain.query.FileQuery;
|
||||
import ai.remi.sys.domain.vo.FileVO;
|
||||
import ai.remi.sys.server.service.BucketService;
|
||||
import ai.remi.sys.server.service.FileService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.io.InputStream;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 文件管理(File)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@ApiSort(value = 1)
|
||||
@Tag(name = "文件管理")
|
||||
@RequestMapping("file")
|
||||
public class FileController {
|
||||
|
||||
@Resource
|
||||
private BucketService bucketService;
|
||||
|
||||
@Resource
|
||||
private FileService fileService;
|
||||
|
||||
@Resource
|
||||
MinIOService minIOService;
|
||||
|
||||
@Value("${minio.bucketName}")
|
||||
private String bucketName;
|
||||
|
||||
@PostMapping("/upload")
|
||||
@Operation(summary = "上传文件", description = "上传文件")
|
||||
@LogRecord(content = "上传一个文件", businessType = BusinessType.UPLOAD)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<FileVO> upload(@RequestParam(name = "bucketCode", required = false) String bucketCode,
|
||||
@RequestParam(name = "directory", required = false) String directory,
|
||||
@RequestParam(name = "multipartFile") MultipartFile multipartFile) throws Exception {
|
||||
// 租户信息
|
||||
String companyTenantId = AuthInfoUtils.getCompanyTenantId();
|
||||
String deptTenantId = AuthInfoUtils.getDeptTenantId();
|
||||
// 原文件名
|
||||
String original = multipartFile.getOriginalFilename();
|
||||
// 文件类型
|
||||
String fileType = FileTypeUtils.getExtension(multipartFile);
|
||||
// 文件编码
|
||||
String fileCode = String.valueOf(System.currentTimeMillis());
|
||||
// 文件目录
|
||||
directory = StringUtils.isNotBlank(directory) ? directory : companyTenantId + "/" + deptTenantId + "/";
|
||||
// 文件名称
|
||||
String fileName = fileCode + "." + fileType;
|
||||
// 存储桶
|
||||
bucketCode = StringUtils.isNotBlank(bucketCode) ? bucketCode : bucketName;
|
||||
// 判断Bucket是否存在
|
||||
if (minIOService.bucketExists(bucketCode)) {
|
||||
// 文件上传
|
||||
minIOService.uploadFile(bucketCode, directory + fileName,
|
||||
multipartFile.getInputStream());
|
||||
}
|
||||
// 文件入库
|
||||
Bucket bucket = bucketService.getOne(Wrappers.<Bucket>lambdaQuery().eq(Bucket::getBucketCode, bucketCode).last("limit 1"));
|
||||
File fileInfo = File.builder().bucketCode(bucketCode).bucketName(bucket.getBucketName()).deptTenantId(deptTenantId).companyTenantId(companyTenantId)
|
||||
.fileCode(fileCode).fileType(fileType).fileSize(FileUtils.formatSize(multipartFile.getSize())).filePath(directory).fileName(fileName).original(original).status(1).build();
|
||||
fileService.save(fileInfo);
|
||||
return ResultBean.success("上传成功", FileConverter.INSTANT.entityToVO(fileInfo));
|
||||
}
|
||||
|
||||
@GetMapping("/download")
|
||||
@Operation(summary = "下载文件", description = "下载文件")
|
||||
@LogRecord(content = "下载一个文件", businessType = BusinessType.DOWNLOAD)
|
||||
public void downloadFile(@RequestParam(name = "bucketCode", required = false) String bucketCode,
|
||||
@RequestParam(name = "directory", required = false) String directory,
|
||||
@RequestParam(value = "fileName") String fileName, HttpServletResponse response) throws Exception {
|
||||
// 租户信息
|
||||
String companyTenantId = AuthInfoUtils.getCompanyTenantId();
|
||||
String deptTenantId = AuthInfoUtils.getDeptTenantId();
|
||||
// 文件目录
|
||||
directory = StringUtils.isNotBlank(directory) ? directory : companyTenantId + "/" + deptTenantId + "/";
|
||||
// 存储桶
|
||||
bucketCode = StringUtils.isNotBlank(bucketCode) ? bucketCode : bucketName;
|
||||
// 下载文件
|
||||
InputStream stream = minIOService.download(bucketCode, directory + fileName);
|
||||
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
|
||||
response.setHeader("Content-Disposition",
|
||||
"attachment;filename=" + URLEncoder.encode(fileName.substring(fileName.lastIndexOf("/") + 1), "UTF-8"));
|
||||
response.setContentType("application/octet-stream");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
IOUtils.copy(stream, response.getOutputStream());
|
||||
}
|
||||
|
||||
@GetMapping("/preview")
|
||||
@Operation(summary = "预览文件", description = "预览文件")
|
||||
public ResultBean getPreviewFileUrl(@RequestParam(name = "bucketCode", required = false) String bucketCode,
|
||||
@RequestParam(name = "directory", required = false) String directory,
|
||||
@RequestParam(name = "fileName") String fileName) throws Exception {
|
||||
// 租户信息
|
||||
String companyTenantId = AuthInfoUtils.getCompanyTenantId();
|
||||
String deptTenantId = AuthInfoUtils.getDeptTenantId();
|
||||
// 文件目录
|
||||
directory = StringUtils.isNotBlank(directory) ? directory : companyTenantId + "/" + deptTenantId + "/";
|
||||
// 存储桶
|
||||
bucketCode = StringUtils.isNotBlank(bucketCode) ? bucketCode : bucketName;
|
||||
// 分享文件
|
||||
return ResultBean.success("预览成功!",minIOService.getPresignedObjectUrl(bucketCode, directory + fileName));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条", description = "查询单条")
|
||||
public ResultBean<FileVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
File file = fileService.getById(id);
|
||||
//处理格式转换
|
||||
FileVO fileVO = FileConverter.INSTANT.entityToVO(file);
|
||||
return ResultBean.success(fileVO);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param fileQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询", description = "分页查询")
|
||||
public ResultBean<PagerBean<FileVO>> page(PageQuery pageQuery, FileQuery fileQuery) {
|
||||
//处理分页条件
|
||||
Page<File> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
File file = FileConverter.INSTANT.queryToEntity(fileQuery);
|
||||
//执行分页查询
|
||||
Page<File> pageResult = fileService.page(page, new QueryWrapper<>(file));
|
||||
PagerBean<FileVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), FileVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "批量删除", description = "批量删除")
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) throws Exception {
|
||||
for (String id : ids) {
|
||||
File file = fileService.getById(id);
|
||||
minIOService.deleteObject(file.getBucketCode(), file.getCompanyTenantId() + "/" + file.getDeptTenantId() + "/" + file.getFileName());
|
||||
fileService.removeById(id);
|
||||
}
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.GradeConverter;
|
||||
import ai.remi.sys.domain.dto.post.GradePostDTO;
|
||||
import ai.remi.sys.domain.dto.put.GradePutDTO;
|
||||
import ai.remi.sys.domain.entity.Grade;
|
||||
import ai.remi.sys.domain.query.GradeQuery;
|
||||
import ai.remi.sys.domain.vo.GradeVO;
|
||||
import ai.remi.sys.server.service.GradeService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 职系表(Grade)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "职系管理")
|
||||
@RequestMapping("grade")
|
||||
public class GradeController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private GradeService gradeService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<GradeVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Grade grade = gradeService.getById(id);
|
||||
//处理格式转换
|
||||
GradeVO gradeVO = GradeConverter.INSTANT.entityToVO(grade);
|
||||
return ResultBean.success(gradeVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param gradeQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<GradeVO>> list(@RequestBody GradeQuery gradeQuery) {
|
||||
//处理格式转换
|
||||
Grade grade = GradeConverter.INSTANT.queryToEntity(gradeQuery);
|
||||
//执行分页查询
|
||||
List<Grade> listResult = gradeService.list(new QueryWrapper<>(grade));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, GradeVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param gradeQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<GradeVO>> page(PageQuery pageQuery, GradeQuery gradeQuery) {
|
||||
//处理分页条件
|
||||
Page<Grade> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Grade grade = GradeConverter.INSTANT.queryToEntity(gradeQuery);
|
||||
//执行分页查询
|
||||
Page<Grade> pageResult = gradeService.page(page, new QueryWrapper<>(grade));
|
||||
PagerBean<GradeVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), GradeVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param gradeDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增职系信息", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated GradePostDTO gradeDTO) {
|
||||
//处理格式转换
|
||||
Grade grade = GradeConverter.INSTANT.postDtoToEntity(gradeDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(gradeService.save(grade));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param gradeDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改职系信息", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated GradePutDTO gradeDTO) {
|
||||
//处理格式转换
|
||||
Grade grade = GradeConverter.INSTANT.putDtoToEntity(gradeDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(gradeService.updateById(grade));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除职系信息", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(gradeService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.domain.tree.TreeBuild;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.collection.CollectionUtils;
|
||||
import ai.remi.comm.util.string.StringUtils;
|
||||
import ai.remi.sys.domain.converter.GroupConverter;
|
||||
import ai.remi.sys.domain.dto.post.GroupPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.GroupPutDTO;
|
||||
import ai.remi.sys.domain.entity.Group;
|
||||
import ai.remi.sys.domain.query.GroupQuery;
|
||||
import ai.remi.sys.domain.tree.GroupTree;
|
||||
import ai.remi.sys.domain.vo.GroupVO;
|
||||
import ai.remi.sys.server.service.GroupService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 业务组织(Group)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "业务组织")
|
||||
@RequestMapping("group")
|
||||
public class GroupController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private GroupService groupService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<GroupVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Group group = groupService.getById(id);
|
||||
//处理格式转换
|
||||
GroupVO groupVO = GroupConverter.INSTANT.entityToVO(group);
|
||||
return ResultBean.success(groupVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param groupQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<GroupVO>> list(@RequestBody GroupQuery groupQuery) {
|
||||
//处理格式转换
|
||||
Group group = GroupConverter.INSTANT.queryToEntity(groupQuery);
|
||||
//执行分页查询
|
||||
List<Group> listResult = groupService.list(new QueryWrapper<>(group));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, GroupVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param groupQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<GroupVO>> page(PageQuery pageQuery, GroupQuery groupQuery) {
|
||||
//处理分页条件
|
||||
Page<Group> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Group group = GroupConverter.INSTANT.queryToEntity(groupQuery);
|
||||
//执行分页查询
|
||||
Page<Group> pageResult = groupService.page(page, new QueryWrapper<>(group));
|
||||
PagerBean<GroupVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), GroupVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param groupQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/tree")
|
||||
@Operation(summary = "查询树结构")
|
||||
public ResultBean<List<GroupTree>> tree(@RequestBody GroupQuery groupQuery) {
|
||||
Group group = GroupConverter.INSTANT.queryToEntity(groupQuery);
|
||||
List<Group> listResult = groupService.getBaseMapper().selectList(Wrappers.<Group>lambdaQuery()
|
||||
.like(StringUtils.isNotEmpty(group.getGroupName()), Group::getGroupName, group.getGroupName())
|
||||
.last("ORDER BY ISNULL( sort ) ASC,sort ASC"));
|
||||
// 原查询结果转换树形结构
|
||||
List<GroupTree> groupTrees = BeanCopyUtils.coverList(listResult, GroupTree.class);
|
||||
if (CollectionUtils.isNotEmpty(groupTrees)) {
|
||||
String rootId = "0";
|
||||
// 创建树形结构并返回
|
||||
TreeBuild treeBuild = new TreeBuild(rootId, groupTrees);
|
||||
List buildTree = treeBuild.buildTree();
|
||||
return ResultBean.success(buildTree);
|
||||
}
|
||||
return ResultBean.success(groupTrees);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param groupDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增用户组", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated GroupPostDTO groupDTO) {
|
||||
//处理格式转换
|
||||
Group group = GroupConverter.INSTANT.postDtoToEntity(groupDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(groupService.save(group));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param groupDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改用户组", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated GroupPutDTO groupDTO) {
|
||||
//处理格式转换
|
||||
Group group = GroupConverter.INSTANT.putDtoToEntity(groupDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(groupService.updateById(group));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除用户组", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(groupService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.converter.GroupRoleConverter;
|
||||
import ai.remi.sys.domain.dto.post.GroupRolePostDTO;
|
||||
import ai.remi.sys.domain.entity.Group;
|
||||
import ai.remi.sys.domain.entity.GroupRole;
|
||||
import ai.remi.sys.domain.query.GroupRoleQuery;
|
||||
import ai.remi.sys.domain.vo.GroupRoleVO;
|
||||
import ai.remi.sys.server.service.GroupRoleService;
|
||||
import ai.remi.sys.server.service.GroupService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 用户组角色表(GroupRole)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "用户组角色")
|
||||
@RequestMapping("groupRole")
|
||||
public class GroupRoleController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private GroupRoleService groupRoleService;
|
||||
@Resource
|
||||
private GroupService groupService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<GroupRoleVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
GroupRole groupRole = groupRoleService.getById(id);
|
||||
//处理格式转换
|
||||
GroupRoleVO groupRoleVO = GroupRoleConverter.INSTANT.entityToVO(groupRole);
|
||||
return ResultBean.success(groupRoleVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param groupRoleQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<GroupRoleVO>> list(@RequestBody GroupRoleQuery groupRoleQuery) {
|
||||
//处理格式转换
|
||||
GroupRole groupRole = GroupRoleConverter.INSTANT.queryToEntity(groupRoleQuery);
|
||||
//执行分页查询
|
||||
List<GroupRole> listResult = groupRoleService.list(new QueryWrapper<>(groupRole));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, GroupRoleVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param groupRoleQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<GroupRoleVO>> page(PageQuery pageQuery, GroupRoleQuery groupRoleQuery) {
|
||||
//处理分页条件
|
||||
Page<GroupRole> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
GroupRole groupRole = GroupRoleConverter.INSTANT.queryToEntity(groupRoleQuery);
|
||||
//执行分页查询
|
||||
Page<GroupRole> pageResult = groupRoleService.page(page, new QueryWrapper<>(groupRole));
|
||||
List<GroupRoleVO> groupRoleVOS = BeanCopyUtils.coverList(pageResult.getRecords(), GroupRoleVO.class);
|
||||
for (GroupRoleVO groupRoleVO : groupRoleVOS) {
|
||||
Group group = groupService.getById(groupRoleVO.getGroupId());
|
||||
groupRoleVO.setGroupName(group.getGroupName());
|
||||
groupRoleVO.setGroupNameEn(group.getGroupNameEn());
|
||||
groupRoleVO.setGroupRemark(group.getGroupRemark());
|
||||
groupRoleVO.setGroupRemarkEn(group.getGroupRemarkEn());
|
||||
}
|
||||
PagerBean<GroupRoleVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), groupRoleVOS);
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param groupRoleDTOs 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "给用户组角色批量分配用户组", businessType = BusinessType.GRANT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated List<GroupRolePostDTO> groupRoleDTOs) {
|
||||
for (GroupRolePostDTO groupRoleDTO : groupRoleDTOs) {
|
||||
//处理格式转换
|
||||
GroupRole groupRole = GroupRoleConverter.INSTANT.postDtoToEntity(groupRoleDTO);
|
||||
GroupRole one = groupRoleService.getOne(Wrappers.<GroupRole>lambdaQuery().eq(GroupRole::getRoleId, groupRoleDTO.getRoleId()).eq(GroupRole::getGroupId, groupRoleDTO.getGroupId()).last("limit 1"));
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(one), MessageUtils.getMessage("add.roleGroup.error", new Object[]{groupRoleDTO.getGroupCode()}));
|
||||
groupRoleService.save(groupRole);
|
||||
}
|
||||
//执行数据保存
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "批量删除用户组角色已分配的用户组", businessType = BusinessType.GRANT)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(groupRoleService.removeByIds(ids));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.converter.GroupUserConverter;
|
||||
import ai.remi.sys.domain.dto.post.GroupUserPostDTO;
|
||||
import ai.remi.sys.domain.entity.User;
|
||||
import ai.remi.sys.domain.entity.GroupUser;
|
||||
import ai.remi.sys.domain.query.GroupUserQuery;
|
||||
import ai.remi.sys.domain.vo.GroupUserVO;
|
||||
import ai.remi.sys.server.service.GroupUserService;
|
||||
import ai.remi.sys.server.service.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 组织用户(GroupUser)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "组织用户")
|
||||
@RequestMapping("groupUser")
|
||||
public class GroupUserController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private GroupUserService groupUserService;
|
||||
@Resource
|
||||
private UserService userService;
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param groupUserQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<GroupUserVO>> page(PageQuery pageQuery, GroupUserQuery groupUserQuery) {
|
||||
//处理分页条件
|
||||
Page<GroupUser> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
GroupUser groupUser = GroupUserConverter.INSTANT.queryToEntity(groupUserQuery);
|
||||
//执行分页查询
|
||||
Page<GroupUser> pageResult = groupUserService.page(page, new QueryWrapper<>(groupUser));
|
||||
List<GroupUserVO> groupUserVOS = BeanCopyUtils.coverList(pageResult.getRecords(), GroupUserVO.class);
|
||||
// 组装用户详细信息
|
||||
for (GroupUserVO groupUserVO : groupUserVOS) {
|
||||
User one = userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getId, groupUserVO.getUserId()).last("limit 1"));
|
||||
if (Objects.nonNull(one)) {
|
||||
groupUserVO.setUserName(one.getUserName());
|
||||
groupUserVO.setUserNameEn(one.getUserNameEn());
|
||||
groupUserVO.setSex(one.getSex());
|
||||
}
|
||||
}
|
||||
PagerBean<GroupUserVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), groupUserVOS);
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param groupUserDTOs 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "给用户组批量分配用户", businessType = BusinessType.GRANT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated List<GroupUserPostDTO> groupUserDTOs) {
|
||||
for (GroupUserPostDTO groupUserDTO : groupUserDTOs) {
|
||||
//处理格式转换
|
||||
GroupUser groupUser = GroupUserConverter.INSTANT.postDtoToEntity(groupUserDTO);
|
||||
GroupUser one = groupUserService.getOne(Wrappers.<GroupUser>lambdaQuery().eq(GroupUser::getGroupId, groupUser.getGroupId()).eq(GroupUser::getUserId, groupUser.getUserId()).last("limit 1"));
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(one), MessageUtils.getMessage("add.groupUser.error",new Object[]{groupUserDTO.getUserCode()}));
|
||||
groupUserService.save(groupUser);
|
||||
}
|
||||
//执行数据保存
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "批量删除用户组已分配的用户", businessType = BusinessType.GRANT)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(groupUserService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,208 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.LogRecordConverter;
|
||||
import ai.remi.sys.domain.dto.post.LogRecordPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.LogRecordPutDTO;
|
||||
import ai.remi.sys.domain.entity.LogRecord;
|
||||
import ai.remi.sys.domain.query.LogRecordQuery;
|
||||
import ai.remi.sys.domain.vo.LogRecordVO;
|
||||
import ai.remi.sys.infra.mapper.UserMapper;
|
||||
import ai.remi.sys.server.service.LogRecordService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 日志记录表(LogRecord)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "日志记录")
|
||||
@RequestMapping("logRecord")
|
||||
public class LogRecordController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private LogRecordService logRecordService;
|
||||
@Resource
|
||||
private UserMapper userMapper;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<LogRecordVO> get(@RequestParam String id) {
|
||||
LogRecord logRecord = logRecordService.getById(id);
|
||||
//处理格式转换
|
||||
LogRecordVO logRecordVO = LogRecordConverter.INSTANT.entityToVO(logRecord);
|
||||
return ResultBean.success(logRecordVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param logRecordQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<LogRecordVO>> list(@RequestBody LogRecordQuery logRecordQuery) {
|
||||
//处理格式转换
|
||||
LogRecord logRecord = LogRecordConverter.INSTANT.queryToEntity(logRecordQuery);
|
||||
//执行分页查询
|
||||
List<LogRecord> listResult = logRecordService.list(new QueryWrapper<>(logRecord));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, LogRecordVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询登录日志
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param logRecordQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/pageLogin")
|
||||
@Operation(summary = "分页查询登录日志")
|
||||
public ResultBean<PagerBean<LogRecordVO>> pageLogin(PageQuery pageQuery, LogRecordQuery logRecordQuery) {
|
||||
//处理分页条件
|
||||
Page<LogRecord> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
LogRecord logRecord = LogRecordConverter.INSTANT.queryToEntity(logRecordQuery);
|
||||
//执行分页查询
|
||||
LambdaQueryWrapper<LogRecord> queryWrapper = Wrappers.<LogRecord>lambdaQuery().in(LogRecord::getBusinessType, List.of(9, 10, 11)).orderByDesc(LogRecord::getCreatedAt);
|
||||
Page<LogRecord> pageResult = logRecordService.page(page, queryWrapper);
|
||||
PagerBean<LogRecordVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), LogRecordVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询操作日志
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param logRecordQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/pageOperate")
|
||||
@Operation(summary = "分页查询操作日志")
|
||||
public ResultBean<PagerBean<LogRecordVO>> pageOperate(PageQuery pageQuery, LogRecordQuery logRecordQuery) {
|
||||
//处理分页条件
|
||||
Page<LogRecord> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
LogRecord logRecord = LogRecordConverter.INSTANT.queryToEntity(logRecordQuery);
|
||||
//执行分页查询
|
||||
LambdaQueryWrapper<LogRecord> queryWrapper = Wrappers.<LogRecord>lambdaQuery().in(LogRecord::getBusinessType, List.of(1, 2, 3, 4, 5, 6, 7, 8, 12, 13, 14, 15, 99)).orderByDesc(LogRecord::getCreatedAt);
|
||||
Page<LogRecord> pageResult = logRecordService.page(page, queryWrapper);
|
||||
PagerBean<LogRecordVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), LogRecordVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询异常日志
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param logRecordQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/pageException")
|
||||
@Operation(summary = "分页查询异常日志")
|
||||
public ResultBean<PagerBean<LogRecordVO>> pageException(PageQuery pageQuery, LogRecordQuery logRecordQuery) {
|
||||
//处理分页条件
|
||||
Page<LogRecord> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
LogRecord logRecord = LogRecordConverter.INSTANT.queryToEntity(logRecordQuery);
|
||||
//执行分页查询
|
||||
LambdaQueryWrapper<LogRecord> queryWrapper = Wrappers.<LogRecord>lambdaQuery().isNotNull(LogRecord::getErrorInfo).orderByDesc(LogRecord::getCreatedAt);
|
||||
Page<LogRecord> pageResult = logRecordService.page(page, queryWrapper);
|
||||
PagerBean<LogRecordVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), LogRecordVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param logRecordQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
//@PostMapping(value = "/page")
|
||||
//@Operation(summary = "分页查询")
|
||||
//public ResultBean<PagerBean<LogRecordVO>> page(PageQuery pageQuery, LogRecordQuery logRecordQuery) {
|
||||
// //处理分页条件
|
||||
// Page<LogRecord> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
// //处理格式转换
|
||||
// LogRecord logRecord = LogRecordConverter.INSTANT.queryToEntity(logRecordQuery);
|
||||
// //执行分页查询
|
||||
// Page<LogRecord> pageResult = logRecordService.page(page, new QueryWrapper<>(logRecord));
|
||||
// PagerBean<LogRecordVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
// pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), LogRecordVO.class));
|
||||
// return ResultBean.success(pageBean);
|
||||
//}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param logRecordDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated LogRecordPostDTO logRecordDTO) {
|
||||
// 处理格式转换
|
||||
LogRecord logRecord = LogRecordConverter.INSTANT.postDtoToEntity(logRecordDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(logRecordService.save(logRecord));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param logRecordDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated LogRecordPutDTO logRecordDTO) {
|
||||
//处理格式转换
|
||||
LogRecord logRecord = LogRecordConverter.INSTANT.putDtoToEntity(logRecordDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(logRecordService.updateById(logRecord));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(logRecordService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.redis.service.RedisService;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.id.UUIDUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.comm.util.string.StringUtils;
|
||||
import ai.remi.sys.domain.constant.Oauth2Constant;
|
||||
import ai.remi.sys.domain.constant.SsoConstant;
|
||||
import ai.remi.sys.domain.converter.AccessTokenConverter;
|
||||
import ai.remi.sys.domain.converter.OauthCodeConverter;
|
||||
import ai.remi.sys.domain.dto.post.LoginPostDTO;
|
||||
import ai.remi.sys.domain.dto.post.OauthCodePostDTO;
|
||||
import ai.remi.sys.domain.entity.AccessToken;
|
||||
import ai.remi.sys.domain.entity.OauthCode;
|
||||
import ai.remi.sys.domain.entity.User;
|
||||
import ai.remi.sys.domain.enums.RedisKeyEnum;
|
||||
import ai.remi.sys.domain.vo.AccessTokenVO;
|
||||
import ai.remi.sys.domain.vo.OauthCodeVO;
|
||||
import ai.remi.sys.server.service.AccessTokenService;
|
||||
import ai.remi.sys.server.service.OauthCodeService;
|
||||
import ai.remi.sys.server.service.RefreshTokenService;
|
||||
import ai.remi.sys.server.service.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
/**
|
||||
* 单点登录管理
|
||||
*/
|
||||
@RestController
|
||||
@Tag(name = "登录接口")
|
||||
@RequestMapping(SsoConstant.LOGIN_PATH)
|
||||
public class LoginController {
|
||||
|
||||
@Resource
|
||||
private RedisService redisService;
|
||||
|
||||
@Resource
|
||||
private OauthCodeService codeService;
|
||||
|
||||
@Resource
|
||||
private AccessTokenService accessTokenService;
|
||||
|
||||
@Resource
|
||||
private RefreshTokenService refreshTokenService;
|
||||
|
||||
@Resource
|
||||
private UserService userService;
|
||||
|
||||
/**
|
||||
* 登录页
|
||||
*
|
||||
* @param redirectUrl
|
||||
* @param appKey
|
||||
* @param state
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/ticket")
|
||||
@Operation(summary = "根据Ticket登录")
|
||||
@LogRecord(content = "通过Ticket登录系统", businessType = BusinessType.LOGIN)
|
||||
public ResultBean<OauthCodeVO> ticketLogin(
|
||||
@RequestParam(value = SsoConstant.REDIRECT_URL) String redirectUrl,
|
||||
@RequestParam(value = Oauth2Constant.APP_KEY) String appKey,
|
||||
@RequestParam(value = Oauth2Constant.CLIENT_TICKET) String ticket,
|
||||
@RequestParam(value = Oauth2Constant.CLIENT_STATE) String state) throws Exception {
|
||||
// 校验凭证
|
||||
AssertUtils.isNotNull(redisService.sGet(RedisKeyEnum.TICKET.getKey(ticket)), "check.ticket.error");
|
||||
// 已存在登录凭证,则直接生成授权码
|
||||
OauthCodePostDTO oauthCodePost = OauthCodePostDTO.builder().appKey(appKey).redirectUrl(redirectUrl).state(state).build();
|
||||
return ResultBean.success(generateCodeAndRedirect(ticket, oauthCodePost));
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录提交
|
||||
*
|
||||
* @param redirectUrl
|
||||
* @param appKey
|
||||
* @param loginPostDTO
|
||||
* @return
|
||||
* @throws UnsupportedEncodingException
|
||||
*/
|
||||
@PostMapping("/other")
|
||||
@Operation(summary = "根据账号密码登录")
|
||||
@LogRecord(content = "三方系统根据账号密码登录", businessType = BusinessType.LOGIN)
|
||||
public ResultBean<OauthCodeVO> otherLogin(
|
||||
@RequestParam(value = SsoConstant.REDIRECT_URL) String redirectUrl,
|
||||
@RequestParam(value = Oauth2Constant.APP_KEY) String appKey,
|
||||
@RequestParam(value = Oauth2Constant.CLIENT_STATE) String state,
|
||||
LoginPostDTO loginPostDTO) throws Exception {
|
||||
|
||||
// 校验账号、密码
|
||||
User user = userService.login(loginPostDTO.getLoginName(), loginPostDTO.getPassword());
|
||||
AssertUtils.isTrue(!ObjectUtils.isEmpty(user), MessageUtils.getMessage("check.login.error"));
|
||||
|
||||
// 校验通过,则直接生成授权码
|
||||
OauthCodePostDTO oauthCodePost = OauthCodePostDTO.builder().userId(user.getId()).userCode(user.getUserCode()).appKey(appKey).redirectUrl(redirectUrl).state(state).build();
|
||||
return ResultBean.success(generateCodeAndRedirect("", oauthCodePost));
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录提交
|
||||
*
|
||||
* @param redirectUrl
|
||||
* @param appKey
|
||||
* @param loginPostDTO
|
||||
* @return
|
||||
* @throws UnsupportedEncodingException
|
||||
*/
|
||||
@PostMapping("/local")
|
||||
@Operation(summary = "根据账号密码登录")
|
||||
@LogRecord(content = "本地系统根据账号密码登录", businessType = BusinessType.LOGIN)
|
||||
public ResultBean<AccessTokenVO> localLogin(
|
||||
@RequestParam(value = SsoConstant.REDIRECT_URL) String redirectUrl,
|
||||
@RequestParam(value = Oauth2Constant.APP_KEY) String appKey,
|
||||
@RequestParam(value = Oauth2Constant.CLIENT_STATE) String state,
|
||||
LoginPostDTO loginPostDTO) throws Exception {
|
||||
|
||||
// 校验账号、密码
|
||||
User user = userService.login(loginPostDTO.getLoginName(), loginPostDTO.getPassword());
|
||||
AssertUtils.isTrue(!ObjectUtils.isEmpty(user), MessageUtils.getMessage("check.login.error"));
|
||||
|
||||
// 校验通过,则直接生成授权码
|
||||
OauthCodePostDTO oauthCodePost = OauthCodePostDTO.builder().userId(user.getId()).userCode(user.getUserCode()).appKey(appKey).redirectUrl(redirectUrl).state(state).build();
|
||||
OauthCodeVO oauthCodeVO = generateCodeAndRedirect("", oauthCodePost);
|
||||
|
||||
// 保存鉴权Token
|
||||
AccessToken accessToken = accessTokenService.create(appKey, BeanCopyUtils.copyPropertiesThird(oauthCodeVO,OauthCode.class));
|
||||
|
||||
// 保存刷新Token
|
||||
refreshTokenService.create(accessToken);
|
||||
|
||||
// code 有效则兑换token
|
||||
codeService.remove(oauthCodeVO.getAuthCode());
|
||||
|
||||
// 返回token
|
||||
AccessTokenVO accessTokenVO = AccessTokenConverter.INSTANT.entityToVO(accessToken);
|
||||
accessTokenVO.setTicket(oauthCodeVO.getTicket());
|
||||
return ResultBean.success(accessTokenVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建授权码,跳转到redirectUri
|
||||
*
|
||||
* @param oauthCodePost
|
||||
* @return
|
||||
* @throws UnsupportedEncodingException
|
||||
*/
|
||||
private OauthCodeVO generateCodeAndRedirect(String ticket, OauthCodePostDTO oauthCodePost) {
|
||||
// 生成登录凭证
|
||||
if (StringUtils.isBlank(ticket)) {
|
||||
ticket = "TK-" + UUIDUtils.simpleUuid();
|
||||
redisService.sSet(RedisKeyEnum.TICKET.getKey(ticket), ticket);
|
||||
redisService.expire(RedisKeyEnum.TICKET.getKey(ticket), 3 * 60 * 60);
|
||||
}
|
||||
// 创建授权码
|
||||
oauthCodePost.setTicket(ticket);
|
||||
OauthCode oauthCode = codeService.create(oauthCodePost);
|
||||
OauthCodeVO oauthCodeVO = OauthCodeConverter.INSTANT.entityToVO(oauthCode);
|
||||
oauthCodeVO.setTicket(ticket);
|
||||
return oauthCodeVO;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.redis.service.RedisService;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.constant.Oauth2Constant;
|
||||
import ai.remi.sys.domain.constant.SsoConstant;
|
||||
import ai.remi.sys.domain.enums.RedisKeyEnum;
|
||||
import ai.remi.sys.server.service.AccessTokenService;
|
||||
import ai.remi.sys.server.service.RefreshTokenService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 单点退出
|
||||
*/
|
||||
@RestController
|
||||
@Tag(name = "登出接口")
|
||||
@RequestMapping(SsoConstant.LOGOUT_PATH)
|
||||
public class LogoutController {
|
||||
|
||||
@Resource
|
||||
private RedisService redisService;
|
||||
|
||||
@Resource
|
||||
private AccessTokenService accessTokenService;
|
||||
@Resource
|
||||
private RefreshTokenService refreshTokenService;
|
||||
|
||||
/**
|
||||
* 退出
|
||||
*
|
||||
* @param redirectUrl
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "根据Ticket登出")
|
||||
@RequestMapping(method = RequestMethod.GET)
|
||||
@LogRecord(content = "通过Ticket登出系统", businessType = BusinessType.LOGOUT)
|
||||
public ResultBean<String> logout(
|
||||
@RequestParam(value = SsoConstant.REDIRECT_URL) String redirectUrl,
|
||||
@RequestParam(value = Oauth2Constant.CLIENT_TICKET) String ticket,
|
||||
@RequestParam(value = Oauth2Constant.CLIENT_STATE) String state) {
|
||||
// 删除所有的鉴权token
|
||||
Set<Object> tokens = redisService.sGet(RedisKeyEnum.TICKET.getKey(ticket));
|
||||
for (Object token : tokens) {
|
||||
if (ObjectUtils.isNotNull(token) && String.valueOf(token).startsWith("TK-")) {
|
||||
continue;
|
||||
}
|
||||
if (ObjectUtils.isNotNull(token) && String.valueOf(token).startsWith("AT-")) {
|
||||
accessTokenService.remove(String.valueOf(token));
|
||||
}
|
||||
if (ObjectUtils.isNotNull(token) && String.valueOf(token).startsWith("RT-")) {
|
||||
refreshTokenService.remove(String.valueOf(token));
|
||||
}
|
||||
}
|
||||
//删除登录凭证
|
||||
redisService.del(RedisKeyEnum.TICKET.getKey(ticket));
|
||||
return ResultBean.success("登出成功!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.tree.TreeBuild;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.collection.CollectionUtils;
|
||||
import ai.remi.comm.util.id.SnowflakeUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.converter.MenuConverter;
|
||||
import ai.remi.sys.domain.dto.post.MenuPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.MenuPutDTO;
|
||||
import ai.remi.sys.domain.entity.AppMenu;
|
||||
import ai.remi.sys.domain.entity.Menu;
|
||||
import ai.remi.sys.domain.query.MenuQuery;
|
||||
import ai.remi.sys.domain.tree.MenuTree;
|
||||
import ai.remi.sys.domain.vo.MenuVO;
|
||||
import ai.remi.sys.infra.mapper.MenuMapper;
|
||||
import ai.remi.sys.server.service.AppMenuService;
|
||||
import ai.remi.sys.server.service.MenuService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 菜单表(Menu)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "菜单管理")
|
||||
@RequestMapping("menu")
|
||||
public class MenuController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private AppMenuService appMenuService;
|
||||
|
||||
@Resource
|
||||
private MenuService menuService;
|
||||
|
||||
@Resource
|
||||
private MenuMapper menuMapper;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<MenuVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
MenuVO menuVO = menuMapper.selectOneById(id);
|
||||
return ResultBean.success(menuVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param menuQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/tree")
|
||||
@Operation(summary = "查询树结构")
|
||||
public ResultBean<List<MenuTree>> tree(@RequestBody MenuQuery menuQuery) {
|
||||
List<MenuTree> menuTrees = menuMapper.selectMenuByAppId(menuQuery.getAppId(), menuQuery.getStatus());
|
||||
//查询条件为空,默认查询根结点为0的一级部门
|
||||
if (CollectionUtils.isNotEmpty(menuTrees)) {
|
||||
String rootId = "0";
|
||||
// 创建树形结构并返回
|
||||
TreeBuild treeBuild = new TreeBuild(rootId, menuTrees);
|
||||
return ResultBean.success(treeBuild.buildTree());
|
||||
}
|
||||
return ResultBean.success(menuTrees);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param menuDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增菜单数据", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated MenuPostDTO menuDTO) {
|
||||
//处理格式转换
|
||||
Menu menu = MenuConverter.INSTANT.postDtoToEntity(menuDTO);
|
||||
menu.setId(SnowflakeUtils.getInstance().nextIdStr());
|
||||
//保存应用菜单中间表
|
||||
AppMenu one = appMenuService.getOne(Wrappers.lambdaQuery(AppMenu.class).eq(AppMenu::getAppId, menuDTO.getAppId()).eq(AppMenu::getMenuCode, menuDTO.getMenuCode()).last("limit 1"));
|
||||
//应用下已存在相同菜单
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(one), MessageUtils.getMessage("add.menu.error"));
|
||||
AppMenu appMenu = AppMenu.builder()
|
||||
.appId(menuDTO.getAppId()).appCode(menuDTO.getAppCode())
|
||||
.menuId(menu.getId()).menuCode(menu.getMenuCode()).build();
|
||||
appMenuService.save(appMenu);
|
||||
//执行数据保存
|
||||
return ResultBean.success(menuService.save(menu));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param menuDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改菜单数据", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated MenuPutDTO menuDTO) {
|
||||
//处理格式转换
|
||||
Menu menu = MenuConverter.INSTANT.putDtoToEntity(menuDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(menuService.updateById(menu));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除菜单数据", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
for (String id : ids) {
|
||||
//删除应用菜单中间表
|
||||
appMenuService.remove(Wrappers.<AppMenu>lambdaQuery().eq(AppMenu::getMenuId, id));
|
||||
}
|
||||
return ResultBean.success(menuService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.redis.service.RedisService;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.sys.domain.constant.Oauth2Constant;
|
||||
import ai.remi.sys.domain.constant.SsoConstant;
|
||||
import ai.remi.sys.domain.converter.AccessTokenConverter;
|
||||
import ai.remi.sys.domain.entity.AccessToken;
|
||||
import ai.remi.sys.domain.entity.OauthCode;
|
||||
import ai.remi.sys.domain.enums.Oauth2TypeEnum;
|
||||
import ai.remi.sys.domain.vo.AccessTokenVO;
|
||||
import ai.remi.sys.server.service.AccessTokenService;
|
||||
import ai.remi.sys.server.service.OauthCodeService;
|
||||
import ai.remi.sys.server.service.RefreshTokenService;
|
||||
import ai.remi.sys.server.util.AppUtils;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.Parameters;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* @author LiMengwei
|
||||
* @email limengwei@dianjiu.cc
|
||||
* @desc 授权码表(OauthCode)控制层
|
||||
*/
|
||||
@Validated
|
||||
@Controller
|
||||
@Tag(name = "授权令牌")
|
||||
@RequestMapping(SsoConstant.AUTH_PATH)
|
||||
public class Oauth2Controller {
|
||||
|
||||
@Resource
|
||||
private RedisService redisService;
|
||||
|
||||
@Resource
|
||||
private OauthCodeService authCodeService;
|
||||
|
||||
@Resource
|
||||
private AccessTokenService accessTokenService;
|
||||
|
||||
@Resource
|
||||
private RefreshTokenService refreshTokenService;
|
||||
|
||||
/**
|
||||
* 通过authCode获取accessToken
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Validated
|
||||
@ResponseBody
|
||||
@GetMapping("/accessToken")
|
||||
@Operation(summary = "通过authCode获取鉴权令牌")
|
||||
@Parameters({
|
||||
@Parameter(name = Oauth2Constant.AUTH_TYPE, description = "授权类型", required = true),
|
||||
@Parameter(name = Oauth2Constant.AUTH_CODE, description = "授权码", required = true),
|
||||
@Parameter(name = Oauth2Constant.APP_KEY, description = "应用的appKey", required = true),
|
||||
@Parameter(name = Oauth2Constant.APP_SECRET, description = "应用的appSecret", required = true)
|
||||
})
|
||||
@LogRecord(content = "通过authCode获取鉴权令牌", businessType = BusinessType.GRANT)
|
||||
public ResultBean<AccessTokenVO> getTokenByAuthCode(@RequestParam(value = Oauth2Constant.AUTH_TYPE) String authType,
|
||||
@RequestParam(value = Oauth2Constant.AUTH_CODE) String authCode,
|
||||
@RequestParam(value = Oauth2Constant.APP_KEY) String appKey,
|
||||
@RequestParam(value = Oauth2Constant.APP_SECRET) String appSecret) throws Exception {
|
||||
// 校验授权码方式
|
||||
AssertUtils.isTrue(Oauth2TypeEnum.AUTHORIZATION_CODE.getValue().equals(authType), MessageUtils.getMessage("only.support.code.error"));
|
||||
|
||||
// 校验应用
|
||||
Boolean validate = AppUtils.validate(appKey, appSecret);
|
||||
AssertUtils.isTrue(validate, MessageUtils.getMessage("check.app.secret.error"));
|
||||
|
||||
// 校验授权码
|
||||
OauthCode oauthCode = authCodeService.get(authCode);
|
||||
// code有误或已过期
|
||||
AssertUtils.isNotNull(oauthCode, MessageUtils.getMessage("check.auth.code.error"));
|
||||
// code 有效则兑换token
|
||||
authCodeService.remove(authCode);
|
||||
|
||||
// 校验凭证
|
||||
AssertUtils.isNotNull(redisService.get(oauthCode.getTicket()), "check.ticket.error");
|
||||
|
||||
// 保存鉴权Token
|
||||
AccessToken accessToken = accessTokenService.create(appKey, oauthCode);
|
||||
|
||||
// 保存刷新Token
|
||||
refreshTokenService.create(accessToken);
|
||||
|
||||
// 返回token
|
||||
return ResultBean.success(AccessTokenConverter.INSTANT.entityToVO(accessToken));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过authCode获取accessToken
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Validated
|
||||
@ResponseBody
|
||||
@GetMapping("/refreshToken")
|
||||
@Operation(summary = "通过refreshToken获取鉴权令牌")
|
||||
@Parameters({
|
||||
@Parameter(name = Oauth2Constant.APP_KEY, description = "应用的appKey", required = true),
|
||||
@Parameter(name = Oauth2Constant.APP_SECRET, description = "应用的appSecret", required = true),
|
||||
@Parameter(name = Oauth2Constant.REFRESH_TOKEN, description = "刷新token", required = true)
|
||||
})
|
||||
@LogRecord(content = "通过refreshToken获取鉴权令牌", businessType = BusinessType.GRANT)
|
||||
public ResultBean<AccessTokenVO> getTokenByRefreshToken(@RequestParam(value = Oauth2Constant.APP_KEY) String appKey,
|
||||
@RequestParam(value = Oauth2Constant.APP_SECRET) String appSecret,
|
||||
@RequestParam(value = Oauth2Constant.REFRESH_TOKEN) String refreshToken) {
|
||||
// 校验应用
|
||||
//if (!appManager.exists(appId)) {
|
||||
// return Result.createError("非法应用");
|
||||
//}
|
||||
|
||||
// 校验刷新Token时效
|
||||
//TokenContent atContent = tokenManager.get(refreshToken);
|
||||
//if (atContent == null) {
|
||||
// return Result.createError("refreshToken有误或已过期");
|
||||
//}
|
||||
|
||||
// 删除原有token
|
||||
//accessTokenManager.remove(refreshToken);
|
||||
|
||||
// 创建新token
|
||||
//TokenContent tc = tokenManager.create(atContent);
|
||||
|
||||
// 刷新服务端凭证时效
|
||||
//ticketGrantingTicketManager.refresh(tc.getTgt());
|
||||
|
||||
// 返回新token
|
||||
//return Result.createSuccess(new Token(tc.getAccessToken(), tokenManager.getAccessTokenTimeout(), tc.getRefreshToken(),
|
||||
// tokenManager.getRefreshTokenTimeout(), tc.getUserinfo()));
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验鉴权令牌
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Validated
|
||||
@GetMapping("/checkToken")
|
||||
@Operation(summary = "校验鉴权令牌")
|
||||
@LogRecord(content = "校验鉴权令牌的有效性", businessType = BusinessType.GRANT)
|
||||
public ResultBean<Boolean> checkToken(@RequestParam(value = Oauth2Constant.APP_KEY) String appKey,
|
||||
@RequestParam(value = Oauth2Constant.ACCESS_TOKEN) String accessToken) {
|
||||
|
||||
return ResultBean.success();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.PositionConverter;
|
||||
import ai.remi.sys.domain.dto.post.PositionPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.PositionPutDTO;
|
||||
import ai.remi.sys.domain.entity.Position;
|
||||
import ai.remi.sys.domain.query.PositionQuery;
|
||||
import ai.remi.sys.domain.vo.PositionVO;
|
||||
import ai.remi.sys.server.service.PositionService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 职位表(Position)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "职位管理")
|
||||
@RequestMapping("position")
|
||||
public class PositionController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private PositionService positionService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<PositionVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Position position = positionService.getById(id);
|
||||
//处理格式转换
|
||||
PositionVO positionVO = PositionConverter.INSTANT.entityToVO(position);
|
||||
return ResultBean.success(positionVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param positionQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<PositionVO>> list(@RequestBody PositionQuery positionQuery) {
|
||||
//处理格式转换
|
||||
Position position = PositionConverter.INSTANT.queryToEntity(positionQuery);
|
||||
//执行分页查询
|
||||
List<Position> listResult = positionService.list(new QueryWrapper<>(position));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, PositionVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param positionQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<PositionVO>> page(PageQuery pageQuery, PositionQuery positionQuery) {
|
||||
//处理分页条件
|
||||
Page<Position> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Position position = PositionConverter.INSTANT.queryToEntity(positionQuery);
|
||||
//执行分页查询
|
||||
Page<Position> pageResult = positionService.page(page, new QueryWrapper<>(position));
|
||||
PagerBean<PositionVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), PositionVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param positionDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增职位信息", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated PositionPostDTO positionDTO) {
|
||||
//处理格式转换
|
||||
Position position = PositionConverter.INSTANT.postDtoToEntity(positionDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(positionService.save(position));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param positionDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改职位信息", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated PositionPutDTO positionDTO) {
|
||||
//处理格式转换
|
||||
Position position = PositionConverter.INSTANT.putDtoToEntity(positionDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(positionService.updateById(position));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除职位信息", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(positionService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.converter.PostRoleConverter;
|
||||
import ai.remi.sys.domain.dto.post.PostRolePostDTO;
|
||||
import ai.remi.sys.domain.entity.PostRole;
|
||||
import ai.remi.sys.domain.entity.Position;
|
||||
import ai.remi.sys.domain.query.PostRoleQuery;
|
||||
import ai.remi.sys.domain.vo.PostRoleVO;
|
||||
import ai.remi.sys.server.service.PositionService;
|
||||
import ai.remi.sys.server.service.PostRoleService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 职位角色表(PostRole)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "业务角色")
|
||||
@RequestMapping("postRole")
|
||||
public class PostRoleController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private PostRoleService postRoleService;
|
||||
@Resource
|
||||
private PositionService positionService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<PostRoleVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
PostRole postRole = postRoleService.getById(id);
|
||||
//处理格式转换
|
||||
PostRoleVO postRoleVO = PostRoleConverter.INSTANT.entityToVO(postRole);
|
||||
return ResultBean.success(postRoleVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param postRoleQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<PostRoleVO>> list(@RequestBody PostRoleQuery postRoleQuery) {
|
||||
//处理格式转换
|
||||
PostRole postRole = PostRoleConverter.INSTANT.queryToEntity(postRoleQuery);
|
||||
//执行分页查询
|
||||
List<PostRole> listResult = postRoleService.list(new QueryWrapper<>(postRole));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, PostRoleVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param postRoleQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<PostRoleVO>> page(PageQuery pageQuery, PostRoleQuery postRoleQuery) {
|
||||
//处理分页条件
|
||||
Page<PostRole> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
PostRole postRole = PostRoleConverter.INSTANT.queryToEntity(postRoleQuery);
|
||||
//执行分页查询
|
||||
Page<PostRole> pageResult = postRoleService.page(page, new QueryWrapper<>(postRole));
|
||||
List<PostRoleVO> postRoleVOS = BeanCopyUtils.coverList(pageResult.getRecords(), PostRoleVO.class);
|
||||
for (PostRoleVO postRoleVO : postRoleVOS) {
|
||||
Position position = positionService.getById(postRoleVO.getPostId());
|
||||
postRoleVO.setPositionName(position.getPositionName());
|
||||
postRoleVO.setPositionNameEn(position.getPositionNameEn());
|
||||
}
|
||||
PagerBean<PostRoleVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), postRoleVOS);
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param postRoleDTOs 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "给业务角色批量分配职位", businessType = BusinessType.GRANT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated List<PostRolePostDTO> postRoleDTOs) {
|
||||
for (PostRolePostDTO postRoleDTO : postRoleDTOs) {
|
||||
//处理格式转换
|
||||
PostRole postRole = PostRoleConverter.INSTANT.postDtoToEntity(postRoleDTO);
|
||||
PostRole one = postRoleService.getOne(Wrappers.<PostRole>lambdaQuery().eq(PostRole::getRoleId, postRoleDTO.getRoleId()).eq(PostRole::getPostId, postRoleDTO.getPostId()).last("limit 1"));
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(one), MessageUtils.getMessage("add.rolePost.error", new Object[]{postRoleDTO.getPostCode()}));
|
||||
postRoleService.save(postRole);
|
||||
}
|
||||
//执行数据保存
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "批量删除业务角色已分配的职位", businessType = BusinessType.GRANT)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(postRoleService.removeByIds(ids));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.RankConverter;
|
||||
import ai.remi.sys.domain.dto.post.RankPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.RankPutDTO;
|
||||
import ai.remi.sys.domain.entity.Rank;
|
||||
import ai.remi.sys.domain.query.RankQuery;
|
||||
import ai.remi.sys.domain.vo.RankVO;
|
||||
import ai.remi.sys.server.service.RankService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 职级表(Rank)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "职级管理")
|
||||
@RequestMapping("rank")
|
||||
public class RankController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private RankService rankService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<RankVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Rank rank = rankService.getById(id);
|
||||
//处理格式转换
|
||||
RankVO rankVO = RankConverter.INSTANT.entityToVO(rank);
|
||||
return ResultBean.success(rankVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param rankQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<RankVO>> list(@RequestBody RankQuery rankQuery) {
|
||||
//处理格式转换
|
||||
Rank rank = RankConverter.INSTANT.queryToEntity(rankQuery);
|
||||
//执行分页查询
|
||||
List<Rank> listResult = rankService.list(new QueryWrapper<>(rank));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, RankVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param rankQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<RankVO>> page(PageQuery pageQuery, RankQuery rankQuery) {
|
||||
//处理分页条件
|
||||
Page<Rank> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Rank rank = RankConverter.INSTANT.queryToEntity(rankQuery);
|
||||
//执行分页查询
|
||||
Page<Rank> pageResult = rankService.page(page, new QueryWrapper<>(rank));
|
||||
PagerBean<RankVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), RankVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param rankDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增职级信息", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated RankPostDTO rankDTO) {
|
||||
//处理格式转换
|
||||
Rank rank = RankConverter.INSTANT.postDtoToEntity(rankDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(rankService.save(rank));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param rankDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "修改职级信息", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated RankPutDTO rankDTO) {
|
||||
//处理格式转换
|
||||
Rank rank = RankConverter.INSTANT.putDtoToEntity(rankDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(rankService.updateById(rank));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除职级信息", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(rankService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.RestrictIpConverter;
|
||||
import ai.remi.sys.domain.dto.post.RestrictIpPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.RestrictIpPutDTO;
|
||||
import ai.remi.sys.domain.entity.RestrictIp;
|
||||
import ai.remi.sys.domain.query.RestrictIpQuery;
|
||||
import ai.remi.sys.domain.vo.RestrictIpVO;
|
||||
import ai.remi.sys.server.service.RestrictIpService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 黑白名单表(RestrictIp)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "黑白名单")
|
||||
@RequestMapping("restrictIp")
|
||||
public class RestrictIpController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private RestrictIpService restrictIpService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<RestrictIpVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
RestrictIp restrictIp = restrictIpService.getById(id);
|
||||
//处理格式转换
|
||||
RestrictIpVO restrictIpVO = RestrictIpConverter.INSTANT.entityToVO(restrictIp);
|
||||
return ResultBean.success(restrictIpVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param restrictIpQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<RestrictIpVO>> list(@RequestBody RestrictIpQuery restrictIpQuery) {
|
||||
//处理格式转换
|
||||
RestrictIp restrictIp = RestrictIpConverter.INSTANT.queryToEntity(restrictIpQuery);
|
||||
//执行分页查询
|
||||
List<RestrictIp> listResult = restrictIpService.list(new QueryWrapper<>(restrictIp));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, RestrictIpVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param restrictIpQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<RestrictIpVO>> page(PageQuery pageQuery, RestrictIpQuery restrictIpQuery) {
|
||||
//处理分页条件
|
||||
Page<RestrictIp> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
RestrictIp restrictIp = RestrictIpConverter.INSTANT.queryToEntity(restrictIpQuery);
|
||||
//执行分页查询
|
||||
Page<RestrictIp> pageResult = restrictIpService.page(page, new QueryWrapper<>(restrictIp));
|
||||
PagerBean<RestrictIpVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), RestrictIpVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param restrictIpDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "录入黑白名单", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated RestrictIpPostDTO restrictIpDTO) {
|
||||
//处理格式转换
|
||||
RestrictIp restrictIp = RestrictIpConverter.INSTANT.postDtoToEntity(restrictIpDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(restrictIpService.save(restrictIp));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param restrictIpDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "更新黑白名单", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated RestrictIpPutDTO restrictIpDTO) {
|
||||
//处理格式转换
|
||||
RestrictIp restrictIp = RestrictIpConverter.INSTANT.putDtoToEntity(restrictIpDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(restrictIpService.updateById(restrictIp));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除黑白名单", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(restrictIpService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.RoleConverter;
|
||||
import ai.remi.sys.domain.dto.post.RolePostDTO;
|
||||
import ai.remi.sys.domain.dto.put.RolePutDTO;
|
||||
import ai.remi.sys.domain.entity.Role;
|
||||
import ai.remi.sys.domain.query.RoleQuery;
|
||||
import ai.remi.sys.domain.vo.RoleVO;
|
||||
import ai.remi.sys.server.service.RoleService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 角色表(Role)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "基础角色")
|
||||
@RequestMapping("role")
|
||||
public class RoleController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private RoleService roleService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<RoleVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
Role role = roleService.getById(id);
|
||||
//处理格式转换
|
||||
RoleVO roleVO = RoleConverter.INSTANT.entityToVO(role);
|
||||
return ResultBean.success(roleVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param roleQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<RoleVO>> list(@RequestBody RoleQuery roleQuery) {
|
||||
//处理格式转换
|
||||
Role role = RoleConverter.INSTANT.queryToEntity(roleQuery);
|
||||
//执行分页查询
|
||||
List<Role> listResult = roleService.list(new QueryWrapper<>(role));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, RoleVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param roleQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<RoleVO>> page(PageQuery pageQuery, RoleQuery roleQuery) {
|
||||
//处理分页条件
|
||||
Page<Role> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
Role role = RoleConverter.INSTANT.queryToEntity(roleQuery);
|
||||
//执行分页查询
|
||||
Page<Role> pageResult = roleService.page(page, new QueryWrapper<>(role));
|
||||
PagerBean<RoleVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), RoleVO.class));
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param roleDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "新增角色信息", businessType = BusinessType.INSERT)
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated RolePostDTO roleDTO) {
|
||||
//处理格式转换
|
||||
Role role = RoleConverter.INSTANT.postDtoToEntity(roleDTO);
|
||||
//执行数据保存
|
||||
return ResultBean.success(roleService.save(role));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param roleDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "更新角色信息", businessType = BusinessType.UPDATE)
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated RolePutDTO roleDTO) {
|
||||
//处理格式转换
|
||||
Role role = RoleConverter.INSTANT.putDtoToEntity(roleDTO);
|
||||
//执行数据更新
|
||||
return ResultBean.success(roleService.updateById(role));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除角色信息", businessType = BusinessType.DELETE)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(roleService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.sys.domain.converter.RoleMenuConverter;
|
||||
import ai.remi.sys.domain.dto.post.RoleMenuPostDTO;
|
||||
import ai.remi.sys.domain.entity.Menu;
|
||||
import ai.remi.sys.domain.entity.RoleMenu;
|
||||
import ai.remi.sys.domain.query.RoleMenuQuery;
|
||||
import ai.remi.sys.domain.vo.RoleMenuVO;
|
||||
import ai.remi.sys.server.service.MenuService;
|
||||
import ai.remi.sys.server.service.RoleMenuService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 角色菜单表(RoleMenu)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "菜单权限")
|
||||
@RequestMapping("roleMenu")
|
||||
public class RoleMenuController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private RoleMenuService roleMenuService;
|
||||
|
||||
@Resource
|
||||
private MenuService menuService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<RoleMenuVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
RoleMenu roleMenu = roleMenuService.getById(id);
|
||||
//处理格式转换
|
||||
RoleMenuVO roleMenuVO = RoleMenuConverter.INSTANT.entityToVO(roleMenu);
|
||||
return ResultBean.success(roleMenuVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param roleMenuQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<RoleMenuVO>> list(@RequestBody RoleMenuQuery roleMenuQuery) {
|
||||
//处理格式转换
|
||||
RoleMenu roleMenu = RoleMenuConverter.INSTANT.queryToEntity(roleMenuQuery);
|
||||
//执行分页查询
|
||||
List<RoleMenu> listResult = roleMenuService.list(new QueryWrapper<>(roleMenu));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, RoleMenuVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param roleMenuQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<RoleMenuVO>> page(PageQuery pageQuery, RoleMenuQuery roleMenuQuery) {
|
||||
//处理分页条件
|
||||
Page<RoleMenu> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
RoleMenu roleMenu = RoleMenuConverter.INSTANT.queryToEntity(roleMenuQuery);
|
||||
//执行分页查询
|
||||
Page<RoleMenu> pageResult = roleMenuService.page(page, new QueryWrapper<>(roleMenu));
|
||||
List<RoleMenuVO> roleMenuVOS = BeanCopyUtils.coverList(pageResult.getRecords(), RoleMenuVO.class);
|
||||
for (RoleMenuVO roleMenuVO : roleMenuVOS) {
|
||||
Menu menu = menuService.getById(roleMenuVO.getMenuId());
|
||||
roleMenuVO.setMenuName(menu.getMenuName());
|
||||
roleMenuVO.setMenuNameEn(menu.getMenuNameEn());
|
||||
roleMenuVO.setMenuType(menu.getMenuType());
|
||||
}
|
||||
PagerBean<RoleMenuVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), roleMenuVOS);
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 给角色批量授权菜单
|
||||
*
|
||||
* @param roleMenuDTOs 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/addOrUpdate")
|
||||
@Operation(summary = "给角色批量授权菜单")
|
||||
@LogRecord(content = "给角色批量授权菜单", businessType = BusinessType.GRANT)
|
||||
public ResultBean<Boolean> addOrUpdate(@RequestBody @Validated List<RoleMenuPostDTO> roleMenuDTOs) {
|
||||
//先删除后新增
|
||||
roleMenuService.remove(Wrappers.<RoleMenu>lambdaQuery().eq(RoleMenu::getRoleId, roleMenuDTOs.get(0).getRoleId()));
|
||||
//执行数据保存
|
||||
roleMenuService.saveBatch(BeanCopyUtils.copyListProperties(roleMenuDTOs, RoleMenu.class));
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,208 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.redis.service.RedisService;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.collection.CollectionUtils;
|
||||
import ai.remi.comm.util.id.SnowflakeUtils;
|
||||
import ai.remi.sys.domain.converter.UserConverter;
|
||||
import ai.remi.sys.domain.dto.post.UserPostDTO;
|
||||
import ai.remi.sys.domain.dto.put.UserPutDTO;
|
||||
import ai.remi.sys.domain.entity.DeptUser;
|
||||
import ai.remi.sys.domain.entity.User;
|
||||
import ai.remi.sys.domain.entity.UserPost;
|
||||
import ai.remi.sys.domain.enums.RedisKeyEnum;
|
||||
import ai.remi.sys.domain.query.UserQuery;
|
||||
import ai.remi.sys.domain.vo.UserVO;
|
||||
import ai.remi.sys.infra.mapper.UserMapper;
|
||||
import ai.remi.sys.server.service.DeptUserService;
|
||||
import ai.remi.sys.server.service.UserPostService;
|
||||
import ai.remi.sys.server.service.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 用户表(User)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "用户管理")
|
||||
@RequestMapping("user")
|
||||
public class UserController {
|
||||
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private RedisService redisService;
|
||||
@Resource
|
||||
private UserService userService;
|
||||
@Resource
|
||||
private UserMapper userMapper;
|
||||
@Resource
|
||||
private DeptUserService deptUserService;
|
||||
@Resource
|
||||
private UserPostService userPostService;
|
||||
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "通过userId获取用户信息")
|
||||
public ResultBean<UserVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
UserVO userVO = userService.getUserById(id);
|
||||
return ResultBean.success(userVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param token 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("token/{token}")
|
||||
@Operation(summary = "通过Token获取用户信息")
|
||||
public ResultBean<UserVO> getUserByToken(@PathVariable @Validated @NotBlank(message = "Token不能为空") String token) throws Exception {
|
||||
Map<Object, Object> hmget = redisService.hmget(RedisKeyEnum.USER_INFO.getKey(token));
|
||||
AssertUtils.isTrue(CollectionUtils.isNotEmpty(hmget), MessageUtils.getMessage("check.userinfo.token.error"));
|
||||
return ResultBean.success(BeanUtil.toBean(hmget, UserVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param userQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<UserVO>> list(@RequestBody UserQuery userQuery) {
|
||||
//执行分页查询
|
||||
List<UserVO> listResult = userMapper.selectListByUser(userQuery);
|
||||
return ResultBean.success(listResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param userQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<UserVO>> page(PageQuery pageQuery, UserQuery userQuery) {
|
||||
//查询总条数
|
||||
Long total = userMapper.selectCountByUser(userQuery);
|
||||
//执行分页查询
|
||||
List<UserVO> userVOS = userMapper.selectPageByUser(pageQuery.getPageNum() - 1, pageQuery.getPageSize(), userQuery);
|
||||
PagerBean<UserVO> pageBean = new PagerBean<>(total, Long.valueOf(pageQuery.getPageNum()), Long.valueOf(pageQuery.getPageSize()), userVOS);
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param userDTO 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "录入用户信息", businessType = BusinessType.INSERT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated UserPostDTO userDTO) {
|
||||
//处理格式转换
|
||||
User user = UserConverter.INSTANT.postDtoToEntity(userDTO);
|
||||
user.setId(SnowflakeUtils.getInstance().nextIdStr());
|
||||
//保存部门用户中间表
|
||||
DeptUser deptUser = DeptUser.builder()
|
||||
.deptId(userDTO.getDeptId())
|
||||
.deptCode(userDTO.getDeptCode())
|
||||
.userId(user.getId()).userCode(user.getUserCode()).build();
|
||||
deptUserService.save(deptUser);
|
||||
// 保存用户职位职级(即岗位)
|
||||
UserPost userPost = UserPost.builder()
|
||||
.positionId(userDTO.getPositionId()).positionCode(userDTO.getPositionCode())
|
||||
.rankId(userDTO.getRankId()).rankCode(userDTO.getRankCode())
|
||||
.userId(user.getId()).userCode(user.getUserCode()).build();
|
||||
userPostService.save(userPost);
|
||||
//执行用户信息保存
|
||||
return ResultBean.success(userService.save(user));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据
|
||||
*
|
||||
* @param userDTO 实体对象
|
||||
* @return 修改结果
|
||||
*/
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "修改数据")
|
||||
@LogRecord(content = "更新用户信息", businessType = BusinessType.UPDATE)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> update(@RequestBody @Validated UserPutDTO userDTO) {
|
||||
//处理格式转换
|
||||
User user = UserConverter.INSTANT.putDtoToEntity(userDTO);
|
||||
//保存公司部门中间表
|
||||
DeptUser deptUser = DeptUser.builder()
|
||||
.deptId(userDTO.getDeptId())
|
||||
.deptCode(userDTO.getDeptCode())
|
||||
.userId(user.getId()).userCode(user.getUserCode()).build();
|
||||
deptUserService.saveOrUpdate(deptUser, Wrappers.<DeptUser>lambdaUpdate().eq(DeptUser::getUserId, userDTO.getId()));
|
||||
// 保存用户职位职级(即岗位)
|
||||
UserPost userPost = UserPost.builder()
|
||||
.positionId(userDTO.getPositionId()).positionCode(userDTO.getPositionCode())
|
||||
.rankId(userDTO.getRankId()).rankCode(userDTO.getRankCode())
|
||||
.userId(user.getId()).userCode(user.getUserCode()).build();
|
||||
userPostService.saveOrUpdate(userPost, Wrappers.<UserPost>lambdaUpdate().eq(UserPost::getUserId, userDTO.getId()));
|
||||
//执行数据更新
|
||||
return ResultBean.success(userService.updateById(user));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "删除用户信息", businessType = BusinessType.DELETE)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
for (String id : ids) {
|
||||
// 删除部门用户中间表
|
||||
LambdaQueryWrapper<DeptUser> deptUserQuery = Wrappers.lambdaQuery(DeptUser.class).eq(DeptUser::getUserId, id);
|
||||
deptUserService.remove(deptUserQuery);
|
||||
// 删除用户岗位中间表
|
||||
LambdaQueryWrapper<UserPost> userPostQuery = Wrappers.lambdaQuery(UserPost.class).eq(UserPost::getUserId, id);
|
||||
userPostService.remove(userPostQuery);
|
||||
}
|
||||
return ResultBean.success(userService.removeByIds(ids));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
package ai.remi.sys.web.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import ai.remi.comm.core.result.PagerBean;
|
||||
import ai.remi.comm.core.result.ResultBean;
|
||||
import ai.remi.comm.domain.query.PageQuery;
|
||||
import ai.remi.comm.exception.util.MessageUtils;
|
||||
import ai.remi.comm.log.annotation.LogRecord;
|
||||
import ai.remi.comm.log.enums.BusinessType;
|
||||
import ai.remi.comm.util.asserts.AssertUtils;
|
||||
import ai.remi.comm.util.bean.BeanCopyUtils;
|
||||
import ai.remi.comm.util.object.ObjectUtils;
|
||||
import ai.remi.sys.domain.converter.UserRoleConverter;
|
||||
import ai.remi.sys.domain.dto.post.UserRolePostDTO;
|
||||
import ai.remi.sys.domain.entity.User;
|
||||
import ai.remi.sys.domain.entity.UserRole;
|
||||
import ai.remi.sys.domain.query.UserRoleQuery;
|
||||
import ai.remi.sys.domain.vo.UserRoleVO;
|
||||
import ai.remi.sys.server.service.UserRoleService;
|
||||
import ai.remi.sys.server.service.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author DianJiu
|
||||
* @email dianjiuxyz@gmail.com
|
||||
* @desc 用户角色表(UserRole)控制层
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@Tag(name = "用户角色")
|
||||
@RequestMapping("userRole")
|
||||
public class UserRoleController {
|
||||
/**
|
||||
* 服务对象
|
||||
*/
|
||||
@Resource
|
||||
private UserRoleService userRoleService;
|
||||
@Resource
|
||||
private UserService userService;
|
||||
|
||||
/**
|
||||
* 通过主键查询单条数据
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 单条数据
|
||||
*/
|
||||
@GetMapping("{id}")
|
||||
@Operation(summary = "查询单条")
|
||||
public ResultBean<UserRoleVO> get(@PathVariable @Validated @NotBlank(message = "ID不能为空") String id) {
|
||||
UserRole userRole = userRoleService.getById(id);
|
||||
//处理格式转换
|
||||
UserRoleVO userRoleVO = UserRoleConverter.INSTANT.entityToVO(userRole);
|
||||
return ResultBean.success(userRoleVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过实体不为空的属性作为筛选条件查询对象列表
|
||||
*
|
||||
* @param userRoleQuery 实例对象
|
||||
* @return 对象列表
|
||||
*/
|
||||
@PostMapping(value = "/list")
|
||||
@Operation(summary = "查询所有")
|
||||
public ResultBean<List<UserRoleVO>> list(@RequestBody UserRoleQuery userRoleQuery) {
|
||||
//处理格式转换
|
||||
UserRole userRole = UserRoleConverter.INSTANT.queryToEntity(userRoleQuery);
|
||||
//执行分页查询
|
||||
List<UserRole> listResult = userRoleService.list(new QueryWrapper<>(userRole));
|
||||
return ResultBean.success(BeanCopyUtils.coverList(listResult, UserRoleVO.class));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询所有数据
|
||||
*
|
||||
* @param pageQuery 分页对象
|
||||
* @param userRoleQuery 查询实体
|
||||
* @return 分页对象
|
||||
*/
|
||||
@PostMapping(value = "/page")
|
||||
@Operation(summary = "分页查询")
|
||||
public ResultBean<PagerBean<UserRoleVO>> page(PageQuery pageQuery, UserRoleQuery userRoleQuery) {
|
||||
//处理分页条件
|
||||
Page<UserRole> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
|
||||
//处理格式转换
|
||||
UserRole userRole = UserRoleConverter.INSTANT.queryToEntity(userRoleQuery);
|
||||
//执行分页查询
|
||||
Page<UserRole> pageResult = userRoleService.page(page, new QueryWrapper<>(userRole));
|
||||
List<UserRoleVO> userRoleVOS = BeanCopyUtils.coverList(pageResult.getRecords(), UserRoleVO.class);
|
||||
for (UserRoleVO userRoleVO : userRoleVOS) {
|
||||
User user = userService.getById(userRoleVO.getUserId());
|
||||
userRoleVO.setUserName(user.getUserName());
|
||||
userRoleVO.setUserNameEn(user.getUserNameEn());
|
||||
}
|
||||
PagerBean<UserRoleVO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),
|
||||
pageResult.getSize(), userRoleVOS);
|
||||
return ResultBean.success(pageBean);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param userRoleDTOs 实体对象
|
||||
* @return 新增结果
|
||||
*/
|
||||
@PostMapping("/add")
|
||||
@Operation(summary = "新增数据")
|
||||
@LogRecord(content = "给基础角色批量分配用户", businessType = BusinessType.GRANT)
|
||||
@Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
|
||||
public ResultBean<Boolean> insert(@RequestBody @Validated List<UserRolePostDTO> userRoleDTOs) {
|
||||
for (UserRolePostDTO userRoleDTO : userRoleDTOs) {
|
||||
//处理格式转换
|
||||
UserRole userRole = UserRoleConverter.INSTANT.postDtoToEntity(userRoleDTO);
|
||||
UserRole one = userRoleService.getOne(Wrappers.<UserRole>lambdaQuery().eq(UserRole::getRoleId, userRoleDTO.getRoleId()).eq(UserRole::getUserId, userRoleDTO.getUserId()).last("limit 1"));
|
||||
AssertUtils.isTrue(ObjectUtils.isEmpty(one), MessageUtils.getMessage("add.roleUser.error",new Object[]{userRoleDTO.getUserCode()}));
|
||||
userRoleService.save(userRole);
|
||||
}
|
||||
//执行数据保存
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param ids 主键结合
|
||||
* @return 删除结果
|
||||
*/
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除数据")
|
||||
@LogRecord(content = "批量删除基础角色已分配的用户", businessType = BusinessType.GRANT)
|
||||
public ResultBean<Boolean> delete(@RequestParam("ids") List<String> ids) {
|
||||
return ResultBean.success(userRoleService.removeByIds(ids));
|
||||
}
|
||||
}
|
||||
|
||||
52
remi-sys/remi-sys-web/src/main/resources/bootstrap.yml
Normal file
52
remi-sys/remi-sys-web/src/main/resources/bootstrap.yml
Normal file
@@ -0,0 +1,52 @@
|
||||
# 服务端口号
|
||||
server:
|
||||
port: 1010
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: remi-sys-web
|
||||
profiles:
|
||||
active: dev
|
||||
#active: sit
|
||||
cloud:
|
||||
# nacos
|
||||
nacos:
|
||||
# 注册中心
|
||||
username: nacos
|
||||
password: nacos
|
||||
discovery:
|
||||
# 配置中心的地址
|
||||
server-addr: ${NACOS_HOST:192.168.31.18}:${NACOS_PORT:8848}
|
||||
#server-addr: ${NACOS_HOST:192.168.31.201}:${NACOS_PORT:8848}
|
||||
#命名空间
|
||||
namespace: ${SERVICE_NAME_SPACE_NAME:dev}
|
||||
#namespace: ${SERVICE_NAME_SPACE_NAME:sit}
|
||||
# 配置文件的环境
|
||||
group: ${SERVICE_DISCOVERY_GROUP_NAME:dev}
|
||||
#group: ${SERVICE_DISCOVERY_GROUP_NAME:sit}
|
||||
# 配置中心
|
||||
config:
|
||||
# 配置中心的地址
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
#命名空间
|
||||
namespace: ${spring.cloud.nacos.discovery.namespace}
|
||||
# 配置文件prefix
|
||||
prefix: ${spring.application.name}
|
||||
# 配置文件的环境
|
||||
group: ${spring.cloud.nacos.discovery.group}
|
||||
# 配置文件的格式
|
||||
file-extension: yaml
|
||||
# 配置的编码
|
||||
encode: UTF-8
|
||||
# 是否开启监听和自动刷新
|
||||
refresh-enabled: true
|
||||
# 共享配置
|
||||
shared-configs:
|
||||
# Data Id 的默认完整格式为: ${prefix}-${spring.profile.active}.${file-extension}。
|
||||
- dataId: remi-cloud-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||
group: ${spring.cloud.nacos.discovery.group}
|
||||
#是否自动刷新
|
||||
refresh: true
|
||||
|
||||
|
||||
|
||||
24
remi-sys/remi-sys-web/src/main/resources/docker/Dockerfile
Normal file
24
remi-sys/remi-sys-web/src/main/resources/docker/Dockerfile
Normal file
@@ -0,0 +1,24 @@
|
||||
# Docker image for springboot application
|
||||
# VERSION 0.0.1
|
||||
# Author: DianJiu
|
||||
# 指定基础镜像,这是分阶段构建的前期阶段
|
||||
FROM harbor.njydsz.com/library/jdk:17 as builder
|
||||
# 维护者
|
||||
MAINTAINER Remi <remi@yundingshuzi.com>
|
||||
#VOLUME:挂载目录
|
||||
VOLUME /temp
|
||||
|
||||
#ADD 将app.jar文件将拷贝到容器中,默认拷贝到根路径下
|
||||
#也可以直接写成ADD app.jar /app.jar 或者 ADD app.jar /
|
||||
ADD remi-sys-web-3.1.0.jar remi-sys-web.jar
|
||||
|
||||
#修改app.jar这个文件的访问时间和修改时间为当前时间,而不会修改文件的内容。
|
||||
RUN bash -c "touch /remi-sys-web.jar"
|
||||
|
||||
#ENTRYPOINT 应用启动命令 参数设定
|
||||
#由于tomcat的session id的生成主要通过java.security.SecureRandom生成随机数来实现,导致启动过程很慢
|
||||
#通过-Djava.security.egd=file:/dev/./urandom参数可以加快随机数产生过程
|
||||
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/remi-sys-web.jar"]
|
||||
|
||||
#EXPOSE 容器暴露端口
|
||||
EXPOSE 1010
|
||||
@@ -0,0 +1,5 @@
|
||||
```shell
|
||||
sh ./docker_deploy.sh
|
||||
|
||||
docker logs -f gateway
|
||||
```
|
||||
@@ -0,0 +1,16 @@
|
||||
#先删除原有的镜像
|
||||
docker stop sit-remi-sys-web
|
||||
docker rm -f sit-remi-sys-web
|
||||
docker images | grep sit-remi-sys-web | awk '{print $3}' | xargs docker rmi -f
|
||||
docker build -t sit-remi-sys-web .
|
||||
docker images | grep sit-remi-sys-web
|
||||
#把新镜像推送到私服
|
||||
docker login -uadmin -pYdsz1020 harbor.njydsz.com
|
||||
docker tag sit-remi-sys-web harbor.njydsz.com/remi/sit-remi-sys-web:3.1.0
|
||||
docker tag sit-remi-sys-web harbor.njydsz.com/remi/sit-remi-sys-web:latest
|
||||
docker push harbor.njydsz.com/remi/sit-remi-sys-web:3.1.0
|
||||
docker push harbor.njydsz.com/remi/sit-remi-sys-web:latest
|
||||
#启动最新的镜像服务
|
||||
docker run --restart=always -t -dit -p 1010:1010 --name sit-remi-sys-web sit-remi-sys-web
|
||||
docker ps -a
|
||||
docker logs -f sit-remi-sys-web
|
||||
@@ -0,0 +1,33 @@
|
||||
#****************************????****************************
|
||||
business.error=Operate failed
|
||||
illegal.argument=Illegal argument
|
||||
not.logged.in=not logged in or token is invalid
|
||||
#****************************????****************************
|
||||
system.error=System error
|
||||
assert.error=Verify error
|
||||
add.dept.error=The same department already exists?
|
||||
delete.dept.error=There are sub-dept or user under the current dept that have not been removed?
|
||||
delete.company.error=There are sub-company or dept under the current company that have not been removed?
|
||||
only.support.code.error=Only the authorization code method is supported
|
||||
check.app.secret.error=Verify the appSecret is exceptional
|
||||
check.auth.code.error=The code is incorrect or out of date
|
||||
check.userinfo.token.error=The Token is incorrect or out of date
|
||||
check.ticket.error=No ticket exist, please log in again
|
||||
app.code.error=Generate an AppCode that collides more than 10 times, please regenerate it
|
||||
add.menu.error=The same menu already exists?
|
||||
add.groupUser.error=The same user {0} already exists?
|
||||
add.roleUser.error=The same user {0} already exists?
|
||||
add.roleCord.error=The same cord {0} already exists?
|
||||
add.rolePost.error=The same post {0} already exists?
|
||||
add.roleGroup.error=The same group {0} already exists?
|
||||
check.login.error=The username or password is wrong, please check and try again!
|
||||
#****************************????****************************
|
||||
other.system.error=Other system error
|
||||
call.feign.error=Call feign error
|
||||
call.sql.error=Call sql error
|
||||
call.redis.error=Call redis error
|
||||
call.minio.error=Call minio error
|
||||
call.nacos.error=call nacos error
|
||||
call.job.error=Call job error
|
||||
call.mq.error=Call mq error
|
||||
call.es.error=Call es error
|
||||
@@ -0,0 +1,34 @@
|
||||
#****************************操作异常****************************
|
||||
business.error=操作失败
|
||||
illegal.argument=非法参数
|
||||
not.logged.in=未登录或Token失效
|
||||
|
||||
#****************************系统异常****************************
|
||||
system.error=系统异常
|
||||
assert.error=校验失败
|
||||
add.dept.error=当前公司下已存在相同部门,请检查部门名称和部门编码!
|
||||
delete.dept.error=当前部门下有子部门或员工未移除,不允许直接被删除!
|
||||
delete.company.error=当前公司下有子子公司或部门未移除,不允许直接被删除!
|
||||
only.support.code.error=仅支持授权码方式
|
||||
check.app.secret.error=校验appSecret异常
|
||||
check.auth.code.error=code有误或已过期
|
||||
check.userinfo.token.error=token有误或已过期
|
||||
check.ticket.error=不存在凭证,请重新登陆
|
||||
app.code.error=尝试生成AppCode发生碰撞超过10次,请重新生成!
|
||||
add.menu.error=当前应用下已存在相同菜单,请检查菜单名称和菜单编码!
|
||||
add.groupUser.error=当前用户组下已存在该用户,请检查用户:{0}!
|
||||
add.roleUser.error=当前角色下已存在该用户,请检查用户:{0}!
|
||||
add.roleCord.error=当前角色下已存在该组织,请检查组织:{0}!
|
||||
add.rolePost.error=当前角色下已存在该岗位,请检查岗位:{0}!
|
||||
add.roleGroup.error=当前角色下已存在该用户组,请检查用户组:{0}!
|
||||
check.login.error=用户名或密码错误,请检查后重试!
|
||||
#****************************三方异常****************************
|
||||
other.system.error=三方系统异常
|
||||
call.feign.error=调用Feign异常
|
||||
call.sql.error=调用数据库异常
|
||||
call.redis.error=调用Redis异常
|
||||
call.minio.error=调用MinIO异常
|
||||
call.nacos.error=调用Nacos异常
|
||||
call.job.error=调用Job异常
|
||||
call.mq.error=调用MQ异常
|
||||
call.es.error=调用ES异常
|
||||
152
remi-sys/remi-sys-web/src/main/resources/logback-spring.xml
Normal file
152
remi-sys/remi-sys-web/src/main/resources/logback-spring.xml
Normal file
@@ -0,0 +1,152 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为INFO,则低于INFO级别的信息都不会输出 -->
|
||||
<!-- scan:默认值为true,当此属性设置为true时,配置文件如果发生改变,将会被重新加载 -->
|
||||
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
|
||||
<!-- debug:默认值为false。当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。 -->
|
||||
<contextName>logback</contextName>
|
||||
|
||||
<!--application.yml 传递参数,不能使用logback 自带的<property>标签 -->
|
||||
<springProperty scope="context" name="logDir" source="logback.logDir"/>
|
||||
<springProperty scope="context" name="appName" source="spring.application.name"/>
|
||||
|
||||
<!-- 彩色日志格式 -->
|
||||
<property name="CONSOLE_LOG_PATTERN"
|
||||
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
|
||||
<!-- 彩色日志依赖的渲染类 -->
|
||||
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
|
||||
<conversionRule conversionWord="wex"
|
||||
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
|
||||
<conversionRule conversionWord="wEx"
|
||||
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
|
||||
|
||||
<!--输出到控制台-->
|
||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<level>debug</level>
|
||||
</filter>
|
||||
<encoder>
|
||||
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- debug日志输出文件 -->
|
||||
<appender name="debug_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${logDir}/debug.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天对日志归档 -->
|
||||
<fileNamePattern>${logDir}/debug-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>500MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file : %line] - %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>DEBUG</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- info日志输出文件 -->
|
||||
<appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${logDir}/info.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天对日志归档 -->
|
||||
<fileNamePattern>${logDir}/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>500MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file : %line] - %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>INFO</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- warn日志输出文件 -->
|
||||
<appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${logDir}/warn.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天对日志归档 -->
|
||||
<fileNamePattern>${logDir}/warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>500MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file : %line] - %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>WARN</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- error日志输出文件 -->
|
||||
<appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${logDir}/error.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天对日志归档 -->
|
||||
<fileNamePattern>${logDir}/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>500MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file : %line] - %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>ERROR</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!--全量日志-->
|
||||
<appender name="detail_file" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
|
||||
<File>${logDir}/${appName}.log</File>
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger [%file : %line] - %msg%n</pattern>
|
||||
</encoder>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${logDir}/${appName}-%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
</rollingPolicy>
|
||||
</appender>
|
||||
|
||||
|
||||
<!--开发环境:打印控制台-->
|
||||
<springProfile name="dev">
|
||||
<logger name="ai.remi" level="debug"/>
|
||||
</springProfile>
|
||||
<springProfile name="!dev">
|
||||
<logger name="ai.remi" level="info"/>
|
||||
</springProfile>
|
||||
|
||||
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
|
||||
<root>
|
||||
<level value="info"/>
|
||||
<appender-ref ref="console"/>
|
||||
<appender-ref ref="debug_file"/>
|
||||
<appender-ref ref="info_file"/>
|
||||
<appender-ref ref="warn_file"/>
|
||||
<appender-ref ref="error_file"/>
|
||||
<appender-ref ref="detail_file"/>
|
||||
</root>
|
||||
</configuration>
|
||||
Reference in New Issue
Block a user