feat:修复已知问题,提升系统稳定性

This commit is contained in:
dianjiu
2024-08-30 02:04:33 +08:00
parent e98052a69a
commit e821ba4858
568 changed files with 124666 additions and 13 deletions

View 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>

View File

@@ -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! ლ(´ڡ`ლ)゙ ");
}
}

View File

@@ -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));
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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();
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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();
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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;
}
}

View File

@@ -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("登出成功!");
}
}

View File

@@ -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));
}
}

View File

@@ -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();
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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();
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View 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

View 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

View File

@@ -0,0 +1,5 @@
```shell
sh ./docker_deploy.sh
docker logs -f gateway
```

View File

@@ -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

View File

@@ -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

View File

@@ -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异常

View 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>