补全 api 缺失的方法

(cherry picked from commit bea39f9b57)
This commit is contained in:
chenbowen
2025-09-15 00:31:25 +08:00
committed by chenbowen
parent a431151514
commit aa2ad247c7
47 changed files with 1620 additions and 46 deletions

View File

@@ -24,7 +24,7 @@
<!-- <module>yudao-module-mall</module>-->
<!-- <module>yudao-module-crm</module>-->
<!-- <module>yudao-module-erp</module>-->
<module>yudao-module-ai</module>
<!-- <module>yudao-module-ai</module>-->
<module>yudao-module-template</module>
<!-- <module>yudao-module-iot</module>-->
<module>yudao-module-databus</module>
@@ -275,8 +275,8 @@
<id>env-local</id>
<properties>
<env.name>local</env.name>
<!-- <config.server-addr>localhost:8848</config.server-addr>-->
<config.server-addr>172.16.46.63:30848</config.server-addr>
<config.server-addr>localhost:8848</config.server-addr>
<!-- <config.server-addr>172.16.46.63:30848</config.server-addr>-->
<config.namespace>local</config.namespace>
<config.group>DEFAULT_GROUP</config.group>
<config.username/>

View File

@@ -1,14 +1,18 @@
package cn.iocoder.yudao.module.infra.api.businessfile;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFilePageReqDTO;
import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFileRespDTO;
import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFileSaveReqDTO;
import cn.iocoder.yudao.module.infra.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
import java.util.List;
/**
@@ -20,8 +24,42 @@ public interface BusinessFileApi {
String PREFIX = ApiConstants.PREFIX + "/business-file";
@PostMapping(PREFIX + "/create")
@Operation(summary = "创建业务附件关联")
CommonResult<Long> createBusinessFile(@Valid @RequestBody BusinessFileSaveReqDTO createReqDTO);
@PostMapping(PREFIX + "/batch-create")
@Operation(summary = "批量新增业务附件关联")
CommonResult<List<Long>> batchCreateBusinessFile(@RequestBody List<BusinessFileSaveReqDTO> createReqDTOList);
@PutMapping(PREFIX + "/update")
@Operation(summary = "更新业务附件关联")
CommonResult<Boolean> updateBusinessFile(@Valid @RequestBody BusinessFileSaveReqDTO updateReqDTO);
@DeleteMapping(PREFIX + "/delete")
@Operation(summary = "删除业务附件关联")
@Parameter(name = "id", description = "编号", required = true)
CommonResult<Boolean> deleteBusinessFile(@RequestParam("id") Long id);
@DeleteMapping(PREFIX + "/delete-list")
@Operation(summary = "批量删除业务附件关联")
@Parameter(name = "ids", description = "编号列表", required = true)
CommonResult<Boolean> deleteBusinessFileList(@RequestParam("ids") List<Long> ids);
@GetMapping(PREFIX + "/get")
@Operation(summary = "获得业务附件关联")
@Parameter(name = "id", description = "编号", required = true)
CommonResult<BusinessFileRespDTO> getBusinessFile(@RequestParam("id") Long id);
@GetMapping(PREFIX + "/page")
@Operation(summary = "获得业务附件关联分页")
CommonResult<PageResult<BusinessFileRespDTO>> getBusinessFilePage(@Valid BusinessFilePageReqDTO pageReqDTO);
@DeleteMapping(PREFIX + "/delete-by-business")
@Operation(summary = "根据业务Id和来源删除业务附件关联")
@Parameter(name = "businessId", description = "业务Id", required = true)
@Parameter(name = "source", description = "业务来源", required = true)
CommonResult<Boolean> deleteBusinessFileByBusinessIdAndSource(@RequestParam("businessId") Long businessId,
@RequestParam("source") String source);
}

View File

@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.infra.api.businessfile.dto;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 业务附件关联分页查询 DTO
*
* @author 后台管理
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BusinessFilePageReqDTO extends PageParam implements Serializable {
/**
* 业务Id
*/
private Long businessId;
/**
* 业务编码
*/
private String businessCode;
/**
* 文件名
*/
private String fileName;
/**
* 业务来源
*/
private String source;
/**
* 创建时间
*/
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.infra.api.businessfile.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 业务附件关联响应 DTO
*
* @author 后台管理
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BusinessFileRespDTO implements Serializable {
/**
* 编号
*/
private Long id;
/**
* 业务Id
*/
private Long businessId;
/**
* 业务编码
*/
private String businessCode;
/**
* 文件名
*/
private String fileName;
/**
* 文件Id
*/
private Long fileId;
/**
* 业务来源
*/
private String source;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
}

View File

@@ -1,9 +1,14 @@
package cn.iocoder.yudao.module.infra.api.businessfile;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFilePageReqDTO;
import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFileRespDTO;
import cn.iocoder.yudao.module.infra.api.businessfile.dto.BusinessFileSaveReqDTO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileSaveReqVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
import cn.iocoder.yudao.module.infra.service.businessfile.BusinessFileService;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -24,10 +29,51 @@ public class BusinessFileApiImpl implements BusinessFileApi {
@Resource
private BusinessFileService businessFileService;
@Override
public CommonResult<Long> createBusinessFile(BusinessFileSaveReqDTO createReqDTO) {
return success(businessFileService.createBusinessFile(BeanUtils.toBean(createReqDTO, BusinessFileSaveReqVO.class)));
}
@Override
public CommonResult<List<Long>> batchCreateBusinessFile(List<BusinessFileSaveReqDTO> createReqDTOList) {
List<BusinessFileSaveReqVO> createReqVOList = BeanUtils.toBean(createReqDTOList, BusinessFileSaveReqVO.class);
List<Long> ids = businessFileService.batchCreateBusinessFile(createReqVOList);
return success(ids);
}
@Override
public CommonResult<Boolean> updateBusinessFile(BusinessFileSaveReqDTO updateReqDTO) {
businessFileService.updateBusinessFile(BeanUtils.toBean(updateReqDTO, BusinessFileSaveReqVO.class));
return success(true);
}
@Override
public CommonResult<Boolean> deleteBusinessFile(Long id) {
businessFileService.deleteBusinessFile(id);
return success(true);
}
@Override
public CommonResult<Boolean> deleteBusinessFileList(List<Long> ids) {
businessFileService.deleteBusinessFileListByIds(ids);
return success(true);
}
@Override
public CommonResult<BusinessFileRespDTO> getBusinessFile(Long id) {
BusinessFileDO businessFile = businessFileService.getBusinessFile(id);
return success(BeanUtils.toBean(businessFile, BusinessFileRespDTO.class));
}
@Override
public CommonResult<PageResult<BusinessFileRespDTO>> getBusinessFilePage(BusinessFilePageReqDTO pageReqDTO) {
PageResult<BusinessFileDO> pageResult = businessFileService.getBusinessFilePage(BeanUtils.toBean(pageReqDTO, BusinessFilePageReqVO.class));
return success(BeanUtils.toBean(pageResult, BusinessFileRespDTO.class));
}
@Override
public CommonResult<Boolean> deleteBusinessFileByBusinessIdAndSource(Long businessId, String source) {
businessFileService.deleteBusinessFileByBusinessIdAndSource(businessId, source);
return success(true);
}
}

View File

@@ -27,7 +27,9 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.infra.service.businessfile.BusinessFileService;
import cn.iocoder.yudao.module.infra.service.file.FileService;
@Tag(name = "管理后台 - 业务附件关联")
@RestController
@@ -38,6 +40,9 @@ public class BusinessFileController {
@Resource
private BusinessFileService businessFileService;
@Resource
private FileService fileService;
@PostMapping("/create")
@Operation(summary = "创建业务附件关联")
@PreAuthorize("@ss.hasPermission('infra:business-file:create')")
@@ -95,6 +100,46 @@ public class BusinessFileController {
return success(BeanUtils.toBean(pageResult, BusinessFileRespVO.class));
}
@GetMapping("/page-with-url")
@Operation(summary = "获得业务附件关联分页带URL")
@PreAuthorize("@ss.hasPermission('infra:business-file:query')")
public CommonResult<PageResult<BusinessFileWithUrlRespVO>> getBusinessFilePageWithUrl(@Valid BusinessFilePageReqVO pageReqVO) {
PageResult<BusinessFileDO> pageResult = businessFileService.getBusinessFilePage(pageReqVO);
PageResult<BusinessFileWithUrlRespVO> result = BeanUtils.toBean(pageResult, BusinessFileWithUrlRespVO.class);
// 批量获取文件信息并设置URL
List<Long> fileIds = result.getList().stream()
.map(BusinessFileWithUrlRespVO::getFileId)
.filter(Objects::nonNull)
.distinct()
.toList();
// 批量查询文件信息
Map<Long, FileDO> fileMap = new HashMap<>();
for (Long fileId : fileIds) {
FileDO fileDO = fileService.getActiveFileById(fileId);
if (fileDO != null) {
fileMap.put(fileId, fileDO);
}
}
// 设置文件相关信息
for (BusinessFileWithUrlRespVO vo : result.getList()) {
if (vo.getFileId() != null) {
FileDO fileDO = fileMap.get(vo.getFileId());
if (fileDO != null) {
vo.setFilePath(fileDO.getPath());
vo.setFileUrl(fileDO.getUrl());
vo.setIsEncrypted(fileDO.getIsEncrypted());
vo.setFileType(fileDO.getType());
vo.setFileSize(fileDO.getSize());
}
}
}
return success(result);
}
@GetMapping("/export-excel")
@Operation(summary = "导出业务附件关联 Excel")
@PreAuthorize("@ss.hasPermission('infra:business-file:export')")
@@ -108,4 +153,15 @@ public class BusinessFileController {
BeanUtils.toBean(list, BusinessFileRespVO.class));
}
@DeleteMapping("/delete-by-business")
@Operation(summary = "根据业务Id和来源删除业务附件关联")
@Parameter(name = "businessId", description = "业务Id", required = true)
@Parameter(name = "source", description = "业务来源", required = true)
@PreAuthorize("@ss.hasPermission('infra:business-file:delete')")
public CommonResult<Boolean> deleteBusinessFileByBusinessIdAndSource(@RequestParam("businessId") Long businessId,
@RequestParam("source") String source) {
businessFileService.deleteBusinessFileByBusinessIdAndSource(businessId, source);
return success(true);
}
}

View File

@@ -0,0 +1,97 @@
package cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient;
import cn.iocoder.yudao.module.infra.framework.file.core.client.s3.S3FileClient;
import cn.iocoder.yudao.module.infra.service.file.FileConfigService;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.Date;
/**
* @author 后台管理
*/
@Schema(description = "管理后台 - 业务附件关联带URL Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class BusinessFileWithUrlRespVO extends BusinessFileRespVO {
@Schema(description = "文件路径", example = "yudao.jpg")
private String filePath;
@Schema(description = "文件 URL", example = "https://www.iocoder.cn/yudao.jpg")
private String fileUrl;
@Schema(description = "附件预览地址", example = "https://www.iocoder.cn/yudao.jpg")
private String previewUrl;
@Schema(description = "是否加密", example = "false")
private Boolean isEncrypted;
@Schema(description = "文件MIME类型", example = "application/octet-stream")
private String fileType;
@Schema(description = "文件大小", example = "2048")
private Integer fileSize;
/**
* 获取文件 URL参考 FileRespVO 的实现)
*/
public String getFileUrl() {
// 加密附件不返回 url
if (Boolean.TRUE.equals(this.isEncrypted)) {
return null;
}
// 如果 url 已经是临时下载地址(如预签名 URL直接返回
if (fileUrl != null && (fileUrl.contains("X-Amz-Signature") || fileUrl.contains("?sign="))) {
return fileUrl;
}
FileConfigService fileConfigService = SpringUtils.getBean(FileConfigService.class);
FileClient fileClient = fileConfigService.getMasterFileClient();
if (fileClient instanceof S3FileClient s3FileClient) {
String presignedDownloadUrl = s3FileClient.getPresignedDownloadUrl(this.filePath, null);
if (presignedDownloadUrl != null && !presignedDownloadUrl.isEmpty()) {
return presignedDownloadUrl;
}
}
return fileUrl;
}
/**
* 获取附件预览地址(参考 FileRespVO 的实现)
*/
public String getPreviewUrl() {
// 加密附件不返回 previewUrl
if (Boolean.TRUE.equals(this.isEncrypted)) {
return null;
}
// 仅当 url 不为空时生成
if (this.fileUrl == null || this.fileUrl.isEmpty()) {
return null;
}
// 这里的 onlinePreview 通过 SpringUtils 获取
String onlinePreview = SpringUtils.getProperty("yudao.kkfile");
if (onlinePreview == null || onlinePreview.isEmpty()) {
return null;
}
String presignedUrl = this.getFileUrl();
if (presignedUrl == null || presignedUrl.isEmpty()) {
return null;
}
String base64PresignedUrl = Base64.getEncoder().encodeToString(presignedUrl.getBytes(StandardCharsets.UTF_8));
String timestamp = String.valueOf(System.currentTimeMillis());
String loginUserNickname = SecurityFrameworkUtils.getLoginUserNickname();
String format = DateUtil.format(new Date(), "yyyy-MM-dd");
String watermark = SpringUtils.getProperty("aj.captcha.water-mark", loginUserNickname+" "+ format);
return onlinePreview + base64PresignedUrl + "&t=" + timestamp + "&watermarkTxt=" + watermark;
}
}

View File

@@ -61,4 +61,12 @@ public interface BusinessFileService {
PageResult<BusinessFileDO> getBusinessFilePage(BusinessFilePageReqVO pageReqVO);
List<Long> batchCreateBusinessFile(List<BusinessFileSaveReqVO> createReqVOList);
/**
* 根据业务Id和来源删除业务附件关联
*
* @param businessId 业务Id
* @param source 业务来源
*/
void deleteBusinessFileByBusinessIdAndSource(Long businessId, String source);
}

View File

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.infra.service.businessfile;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileSaveReqVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
@@ -96,4 +97,11 @@ public class BusinessFileServiceImpl implements BusinessFileService {
}
return ids;
}
@Override
public void deleteBusinessFileByBusinessIdAndSource(Long businessId, String source) {
businessFileMapper.delete(new LambdaQueryWrapperX<BusinessFileDO>()
.eq(BusinessFileDO::getBusinessId, businessId)
.eq(BusinessFileDO::getSource, source));
}
}

View File

@@ -2,14 +2,13 @@ package cn.iocoder.yudao.module.system.api.dept;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.*;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
import java.util.List;
@@ -22,6 +21,31 @@ public interface DeptApi {
String PREFIX = ApiConstants.PREFIX + "/dept";
// === 以下为补全的接口方法 ===
@PostMapping(PREFIX + "/create")
@Operation(summary = "新增部门")
CommonResult<Long> createDept(@RequestBody DeptSaveReqDTO createReqVO);
@PutMapping(PREFIX + "/update")
@Operation(summary = "修改部门")
CommonResult<Boolean> updateDept(@RequestBody DeptSaveReqDTO updateReqVO);
@DeleteMapping(PREFIX + "/delete")
@Operation(summary = "删除部门")
CommonResult<Boolean> deleteDept(@RequestParam("id") Long id);
@GetMapping(PREFIX + "/list-all")
@Operation(summary = "获得部门列表")
CommonResult<List<DeptDetailRespDTO>> getDeptList(@RequestParam DeptListReqDTO reqVO);
@GetMapping(PREFIX + "/simple-list")
@Operation(summary = "获得部门精简信息列表")
CommonResult<List<DeptSimpleRespDTO>> getSimpleDeptList();
@GetMapping(PREFIX + "/simple-company-list")
@Operation(summary = "获得公司精简信息列表")
CommonResult<List<DeptSimpleRespDTO>> getSimpleCompanyList();
@GetMapping(PREFIX + "/get")
@Operation(summary = "获得部门信息")
@Parameter(name = "id", description = "部门编号", example = "1024", required = true)

View File

@@ -5,13 +5,14 @@ import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.PostSaveReqDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.PostSimpleRespDTO;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
import java.util.List;
@@ -23,6 +24,27 @@ public interface PostApi {
String PREFIX = ApiConstants.PREFIX + "/post";
// === 以下为补全的接口方法 ===
@PostMapping(PREFIX + "/create")
@Operation(summary = "新增岗位")
CommonResult<Long> createPost(@RequestBody PostSaveReqDTO createReqVO);
@PutMapping(PREFIX + "/update")
@Operation(summary = "修改岗位")
CommonResult<Boolean> updatePost(@RequestBody PostSaveReqDTO updateReqVO);
@DeleteMapping(PREFIX + "/delete")
@Operation(summary = "删除岗位")
CommonResult<Boolean> deletePost(@RequestParam("id") Long id);
@GetMapping(PREFIX + "/get")
@Operation(summary = "获得岗位详情")
CommonResult<PostRespDTO> getPost(@RequestParam("id") Long id);
@GetMapping(PREFIX + "/simple-list")
@Operation(summary = "获得岗位精简信息列表")
CommonResult<List<PostSimpleRespDTO>> getSimplePostList();
@GetMapping(PREFIX + "/valid")
@Operation(summary = "校验岗位是否合法")
@Parameter(name = "ids", description = "岗位编号数组", example = "1,2", required = true)

View File

@@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.system.api.dept.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 部门信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 部门信息 Response DTO")
@Data
public class DeptDetailRespDTO {
@Schema(description = "部门编号", example = "1024")
private Long id;
@Schema(description = "部门名称", example = "芋道")
private String name;
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@Schema(description = "显示顺序", example = "1024")
private Integer sort;
@Schema(description = "负责人的用户编号", example = "2048")
private Long leaderUserId;
@Schema(description = "联系电话", example = "15601691000")
private String phone;
@Schema(description = "邮箱", example = "yudao@iocoder.cn")
private String email;
@Schema(description = "状态,见 CommonStatusEnum 枚举", example = "1")
private Integer status;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "租户编号", example = "1024")
private Long tenantId;
@Schema(description = "是否公司", example = "false")
private Boolean isCompany;
@Schema(description = "是否集团", example = "false")
private Boolean isGroup;
}

View File

@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.system.api.dept.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 部门列表 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 部门列表 Request DTO")
@Data
public class DeptListReqDTO {
@Schema(description = "部门名称,模糊匹配", example = "芋道")
private String name;
@Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
private Integer status;
@Schema(description = "是否公司", example = "false")
private Boolean isCompany;
@Schema(description = "是否集团", example = "false")
private Boolean isGroup;
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.system.api.dept.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 部门创建/修改 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 部门创建/修改 Request DTO")
@Data
public class DeptSaveReqDTO {
@Schema(description = "部门编号", example = "1024")
private Long id;
@Schema(description = "部门名称", example = "芋道")
private String name;
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@Schema(description = "显示顺序", example = "1024")
private Integer sort;
@Schema(description = "负责人的用户编号", example = "2048")
private Long leaderUserId;
@Schema(description = "联系电话", example = "15601691000")
private String phone;
@Schema(description = "邮箱", example = "yudao@iocoder.cn")
private String email;
@Schema(description = "状态,见 CommonStatusEnum 枚举0 开启 1 关闭", example = "0")
private Integer status;
}

View File

@@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.system.api.dept.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 部门精简信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 部门精简信息 Response DTO")
@Data
public class DeptSimpleRespDTO {
@Schema(description = "部门编号", example = "1024")
private Long id;
@Schema(description = "部门名称", example = "芋道")
private String name;
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@Schema(description = "是否公司", example = "false")
private Boolean isCompany;
@Schema(description = "是否集团", example = "false")
private Boolean isGroup;
}

View File

@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.system.api.dept.dto;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 岗位分页 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 岗位分页 Request DTO")
@Data
@EqualsAndHashCode(callSuper = true)
public class PostPageReqDTO extends PageParam {
@Schema(description = "岗位编码,模糊匹配", example = "yudao")
private String code;
@Schema(description = "岗位名称,模糊匹配", example = "芋道")
private String name;
@Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
private Integer status;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.system.api.dept.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 岗位创建/修改 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 岗位创建/修改 Request DTO")
@Data
public class PostSaveReqDTO {
@Schema(description = "岗位编号", example = "1024")
private Long id;
@Schema(description = "岗位名称", example = "小土豆")
private String name;
@Schema(description = "岗位编码", example = "yudao")
private String code;
@Schema(description = "显示顺序", example = "1024")
private Integer sort;
@Schema(description = "状态", example = "1")
private Integer status;
@Schema(description = "备注", example = "快乐的备注")
private String remark;
}

View File

@@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.system.api.dept.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 岗位信息的精简 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 岗位信息的精简 Response DTO")
@Data
public class PostSimpleRespDTO {
@Schema(description = "岗位序号", example = "1024")
private Long id;
@Schema(description = "岗位名称", example = "小土豆")
private String name;
}

View File

@@ -1,17 +1,20 @@
package cn.iocoder.yudao.module.system.api.dict;
import cn.iocoder.yudao.framework.common.biz.system.dict.DictDataCommonApi;
import io.swagger.v3.oas.annotations.tags.Tag;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataDetailRespDTO;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataSaveReqDTO;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataSimpleRespDTO;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
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.Operation;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
import java.util.List;
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿fallbackFactory =
@Tag(name = "RPC 服务 - 字典数据")
@@ -19,6 +22,27 @@ public interface DictDataApi extends DictDataCommonApi {
String PREFIX = ApiConstants.PREFIX + "/dict-data";
// === 以下为补全的接口方法 ===
@PostMapping(PREFIX + "/create")
@Operation(summary = "新增字典数据")
CommonResult<Long> createDictData(@RequestBody DictDataSaveReqDTO createReqVO);
@PutMapping(PREFIX + "/update")
@Operation(summary = "修改字典数据")
CommonResult<Boolean> updateDictData(@RequestBody DictDataSaveReqDTO updateReqVO);
@DeleteMapping(PREFIX + "/delete")
@Operation(summary = "删除字典数据")
CommonResult<Boolean> deleteDictData(@RequestParam("id") Long id);
@GetMapping(PREFIX + "/simple-list")
@Operation(summary = "获得字典数据精简信息列表")
CommonResult<List<DictDataSimpleRespDTO>> getSimpleDictDataList();
@GetMapping(PREFIX + "/get")
@Operation(summary = "获得字典数据详情")
CommonResult<DictDataDetailRespDTO> getDictData(@RequestParam("id") Long id);
@GetMapping(PREFIX + "/valid")
@Operation(summary = "校验字典数据们是否有效")
@Parameters({

View File

@@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.system.api.dict.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 字典数据信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 字典数据信息 Response DTO")
@Data
public class DictDataDetailRespDTO {
@Schema(description = "字典数据编号", example = "1024")
private Long id;
@Schema(description = "显示顺序", example = "1")
private Integer sort;
@Schema(description = "字典标签", example = "")
private String label;
@Schema(description = "字典值", example = "1")
private String value;
@Schema(description = "字典类型", example = "gender")
private String dictType;
@Schema(description = "状态", example = "1")
private Integer status;
@Schema(description = "颜色类型", example = "primary")
private String colorType;
@Schema(description = "css 样式", example = "color: red")
private String cssClass;
@Schema(description = "备注", example = "我是一个角色")
private String remark;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.system.api.dict.dto;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 字典数据分页 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 字典数据分页 Request DTO")
@Data
@EqualsAndHashCode(callSuper = true)
public class DictDataPageReqDTO extends PageParam {
@Schema(description = "字典标签", example = "芋道")
private String label;
@Schema(description = "字典类型,模糊匹配", example = "sys_common_sex")
private String dictType;
@Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
private Integer status;
}

View File

@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.system.api.dict.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 字典数据创建/修改 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 字典数据创建/修改 Request DTO")
@Data
public class DictDataSaveReqDTO {
@Schema(description = "字典数据编号", example = "1024")
private Long id;
@Schema(description = "显示顺序", example = "1")
private Integer sort;
@Schema(description = "字典标签", example = "")
private String label;
@Schema(description = "字典值", example = "1")
private String value;
@Schema(description = "字典类型", example = "gender")
private String dictType;
@Schema(description = "状态", example = "1")
private Integer status;
@Schema(description = "颜色类型", example = "primary")
private String colorType;
@Schema(description = "css 样式", example = "color: red")
private String cssClass;
@Schema(description = "备注", example = "我是一个角色")
private String remark;
}

View File

@@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.system.api.dict.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 字典数据精简信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 字典数据精简信息 Response DTO")
@Data
public class DictDataSimpleRespDTO {
@Schema(description = "字典数据编号", example = "1024")
private Long id;
@Schema(description = "字典标签", example = "")
private String label;
@Schema(description = "字典值", example = "1")
private String value;
@Schema(description = "字典类型", example = "gender")
private String dictType;
@Schema(description = "状态", example = "1")
private Integer status;
}

View File

@@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.system.api.permission;
import cn.iocoder.yudao.framework.common.biz.system.permission.PermissionCommonApi;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.api.permission.dto.*;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
import java.util.Set;
@@ -19,6 +19,27 @@ public interface PermissionApi extends PermissionCommonApi {
String PREFIX = ApiConstants.PREFIX + "/permission";
// === 以下为补全的接口方法 ===
@GetMapping(PREFIX + "/role-menu-list")
@Operation(summary = "获得角色拥有的菜单编号集合")
CommonResult<Set<Long>> getRoleMenuList(@RequestParam("roleId") Long roleId);
@PostMapping(PREFIX + "/assign-role-menu")
@Operation(summary = "分配角色菜单")
CommonResult<Boolean> assignRoleMenu(@RequestBody PermissionAssignRoleMenuReqDTO reqVO);
@PostMapping(PREFIX + "/assign-role-data-scope")
@Operation(summary = "分配角色数据权限")
CommonResult<Boolean> assignRoleDataScope(@RequestBody PermissionAssignRoleDataScopeReqDTO reqVO);
@GetMapping(PREFIX + "/admin-roles")
@Operation(summary = "获得管理员拥有的角色编号集合")
CommonResult<Set<Long>> listAdminRoles(@RequestParam("userId") Long userId);
@PostMapping(PREFIX + "/assign-user-role")
@Operation(summary = "分配用户角色")
CommonResult<Boolean> assignUserRole(@RequestBody PermissionAssignUserRoleReqDTO reqVO);
@GetMapping(PREFIX + "/user-role-id-list-by-role-id")
@Operation(summary = "获得拥有多个角色的用户编号集合")
@Parameter(name = "roleIds", description = "角色编号集合", example = "1,2", required = true)

View File

@@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.system.api.permission;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

View File

@@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.system.api.permission.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Set;
/**
* 权限分配角色数据权限 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 权限分配角色数据权限 Request DTO")
@Data
public class PermissionAssignRoleDataScopeReqDTO {
@Schema(description = "角色编号", example = "1")
private Long roleId;
@Schema(description = "数据范围", example = "1")
private Integer dataScope;
@Schema(description = "部门编号数组", example = "1,3,5")
private Set<Long> dataScopeDeptIds;
}

View File

@@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.system.api.permission.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Set;
/**
* 权限分配角色菜单 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 权限分配角色菜单 Request DTO")
@Data
public class PermissionAssignRoleMenuReqDTO {
@Schema(description = "角色编号", example = "1")
private Long roleId;
@Schema(description = "菜单编号列表", example = "1,3,5")
private Set<Long> menuIds;
}

View File

@@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.system.api.permission.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Set;
/**
* 权限分配用户角色 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 权限分配用户角色 Request DTO")
@Data
public class PermissionAssignUserRoleReqDTO {
@Schema(description = "用户编号", example = "1")
private Long userId;
@Schema(description = "角色编号数组", example = "1,3,5")
private Set<Long> roleIds;
}

View File

@@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.system.api.permission.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Set;
/**
* 角色信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 角色信息 Response DTO")
@Data
public class RoleDetailRespDTO {
@Schema(description = "角色编号", example = "1024")
private Long id;
@Schema(description = "角色名称", example = "管理员")
private String name;
@Schema(description = "角色标识", example = "admin")
private String code;
@Schema(description = "显示顺序", example = "1024")
private Integer sort;
@Schema(description = "数据范围", example = "1")
private Integer dataScope;
@Schema(description = "数据范围(指定部门数组)", example = "1,2,3")
private Set<Long> dataScopeDeptIds;
@Schema(description = "角色状态", example = "1")
private Integer status;
@Schema(description = "角色类型", example = "1")
private Integer type;
@Schema(description = "备注", example = "我是一个角色")
private String remark;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.system.api.permission.dto;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 角色分页 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 角色分页 Request DTO")
@Data
@EqualsAndHashCode(callSuper = true)
public class RolePageReqDTO extends PageParam {
@Schema(description = "角色名称,模糊匹配", example = "芋道")
private String name;
@Schema(description = "角色标识,模糊匹配", example = "admin")
private String code;
@Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
private Integer status;
@Schema(description = "创建时间")
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.system.api.permission.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Set;
/**
* 角色创建/修改 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 角色创建/修改 Request DTO")
@Data
public class RoleSaveReqDTO {
@Schema(description = "角色编号", example = "1024")
private Long id;
@Schema(description = "角色名称", example = "管理员")
private String name;
@Schema(description = "角色标识", example = "admin")
private String code;
@Schema(description = "显示顺序", example = "1024")
private Integer sort;
@Schema(description = "数据范围", example = "1")
private Integer dataScope;
@Schema(description = "数据范围(指定部门数组)", example = "1,2,3")
private Set<Long> dataScopeDeptIds;
@Schema(description = "角色状态", example = "1")
private Integer status;
@Schema(description = "角色类型", example = "1")
private Integer type;
@Schema(description = "备注", example = "我是一个角色")
private String remark;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.system.api.social.dto;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 社交客户端分页 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 社交客户端分页 Request DTO")
@Data
@EqualsAndHashCode(callSuper = true)
public class SocialClientPageReqDTO extends PageParam {
@Schema(description = "应用名,模糊匹配", example = "yudao")
private String name;
@Schema(description = "社交平台的类型", example = "1")
private Integer socialType;
@Schema(description = "用户类型", example = "2")
private Integer userType;
@Schema(description = "客户端编号", example = "wx12345")
private String clientId;
@Schema(description = "状态", example = "1")
private Integer status;
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.system.api.social.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 社交客户端信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 社交客户端信息 Response DTO")
@Data
public class SocialClientRespDTO {
@Schema(description = "编号", example = "27162")
private Long id;
@Schema(description = "应用名", example = "yudao商城")
private String name;
@Schema(description = "社交平台的类型", example = "31")
private Integer socialType;
@Schema(description = "用户类型", example = "2")
private Integer userType;
@Schema(description = "客户端编号", example = "wwd411c69a39ad2e54")
private String clientId;
@Schema(description = "客户端密钥", example = "peter")
private String clientSecret;
@Schema(description = "授权方的网页应用编号", example = "2000045")
private String agentId;
@Schema(description = "状态", example = "1")
private Integer status;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.system.api.social.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 社交客户端创建/修改 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 社交客户端创建/修改 Request DTO")
@Data
public class SocialClientSaveReqDTO {
@Schema(description = "编号", example = "27162")
private Long id;
@Schema(description = "应用名", example = "yudao商城")
private String name;
@Schema(description = "社交平台的类型", example = "31")
private Integer socialType;
@Schema(description = "用户类型", example = "2")
private Integer userType;
@Schema(description = "客户端编号", example = "wwd411c69a39ad2e54")
private String clientId;
@Schema(description = "客户端密钥", example = "peter")
private String clientSecret;
@Schema(description = "授权方的网页应用编号", example = "2000045")
private String agentId;
@Schema(description = "状态", example = "1")
private Integer status;
}

View File

@@ -4,6 +4,9 @@ import cn.hutool.core.convert.Convert;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserSaveReqDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdatePasswordReqDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateStatusReqDTO;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import com.fhs.core.trans.anno.AutoTrans;
import com.fhs.trans.service.AutoTransable;
@@ -12,8 +15,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.Collection;
import java.util.Collections;
@@ -29,6 +31,27 @@ public interface AdminUserApi extends AutoTransable<AdminUserRespDTO> {
String PREFIX = ApiConstants.PREFIX + "/user";
// === 以下为补全的接口方法 ===
@PostMapping(PREFIX + "/create")
@Operation(summary = "新增用户")
CommonResult<Long> createUser(@RequestBody AdminUserSaveReqDTO reqVO);
@PutMapping(PREFIX + "/update")
@Operation(summary = "修改用户")
CommonResult<Boolean> updateUser(@RequestBody AdminUserSaveReqDTO reqVO);
@DeleteMapping(PREFIX + "/delete")
@Operation(summary = "删除用户")
CommonResult<Boolean> deleteUser(@RequestParam("id") Long id);
@PutMapping(PREFIX + "/update-password")
@Operation(summary = "重置用户密码")
CommonResult<Boolean> updateUserPassword(@RequestBody AdminUserUpdatePasswordReqDTO reqVO);
@PutMapping(PREFIX + "/update-status")
@Operation(summary = "修改用户状态")
CommonResult<Boolean> updateUserStatus(@RequestBody AdminUserUpdateStatusReqDTO reqVO);
@GetMapping(PREFIX + "/get")
@Operation(summary = "通过用户 ID 查询用户")
@Parameter(name = "id", description = "用户编号", example = "1", required = true)

View File

@@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.system.api.user.dto;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
/**
* 管理员用户信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 管理员用户信息 Response DTO")
@Data
public class AdminUserDetailRespDTO {
@Schema(description = "用户编号", example = "1")
private Long id;
@Schema(description = "用户账号", example = "yudao")
private String username;
@Schema(description = "用户昵称", example = "芋艿")
private String nickname;
@Schema(description = "备注", example = "我是一个用户")
private String remark;
@Schema(description = "部门ID列表")
private List<Long> deptIds;
@Schema(description = "岗位编号数组", example = "1")
private Set<Long> postIds;
@Schema(description = "用户邮箱", example = "yudao@iocoder.cn")
private String email;
@Schema(description = "手机号码", example = "15601691300")
private String mobile;
@Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1")
private Integer sex;
@Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png")
private String avatar;
@Schema(description = "状态,参见 CommonStatusEnum 枚举类", example = "1")
private Integer status;
@Schema(description = "最后登录 IP", example = "192.168.1.1")
private String loginIp;
@Schema(description = "最后登录时间")
private LocalDateTime loginDate;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.system.api.user.dto;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 管理员用户分页 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 管理员用户分页 Request DTO")
@Data
@EqualsAndHashCode(callSuper = true)
public class AdminUserPageReqDTO extends PageParam {
@Schema(description = "用户账号,模糊匹配", example = "yudao")
private String username;
@Schema(description = "手机号码,模糊匹配", example = "yudao")
private String mobile;
@Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
private Integer status;
@Schema(description = "创建时间", example = "[2022-07-01 00:00:00, 2022-07-01 23:59:59]")
private LocalDateTime[] createTime;
@Schema(description = "部门编号,同时筛选子部门", example = "1024")
private Long deptId;
@Schema(description = "角色编号", example = "1024")
private Long roleId;
}

View File

@@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.system.api.user.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Set;
/**
* 管理员用户创建/修改 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 管理员用户创建/修改 Request DTO")
@Data
public class AdminUserSaveReqDTO {
@Schema(description = "用户编号", example = "1024")
private Long id;
@Schema(description = "用户账号", example = "yudao")
private String username;
@Schema(description = "用户昵称", example = "芋艿")
private String nickname;
@Schema(description = "备注", example = "我是一个用户")
private String remark;
@Schema(description = "部门编号数组", example = "1")
private Set<Long> deptIds;
@Schema(description = "岗位编号数组", example = "1")
private Set<Long> postIds;
@Schema(description = "用户邮箱", example = "yudao@iocoder.cn")
private String email;
@Schema(description = "手机号码", example = "15601691300")
private String mobile;
@Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1")
private Integer sex;
@Schema(description = "用户状态", example = "1")
private Integer status;
@Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png")
private String avatar;
@Schema(description = "密码", example = "123456")
private String password;
}

View File

@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.system.api.user.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 管理员用户精简信息 Response DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 管理员用户精简信息 Response DTO")
@Data
public class AdminUserSimpleRespDTO {
@Schema(description = "用户编号", example = "1024")
private Long id;
@Schema(description = "用户昵称", example = "芋道")
private String nickname;
@Schema(description = "部门ID", example = "1")
private Long deptId;
@Schema(description = "部门名称", example = "IT 部")
private String deptName;
}

View File

@@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.system.api.user.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 管理员用户更新密码 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 管理员用户更新密码 Request DTO")
@Data
public class AdminUserUpdatePasswordReqDTO {
@Schema(description = "用户编号", example = "1024")
private Long id;
@Schema(description = "密码", example = "123456")
private String password;
}

View File

@@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.system.api.user.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 管理员用户更新状态 Request DTO
*
* @author system
*/
@Schema(description = "RPC 服务 - 管理员用户更新状态 Request DTO")
@Data
public class AdminUserUpdateStatusReqDTO {
@Schema(description = "用户编号", example = "1024")
private Long id;
@Schema(description = "状态,见 CommonStatusEnum 枚举", example = "1")
private Integer status;
}

View File

@@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.system.api.dept;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.*;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
import org.springframework.context.annotation.Bean;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
@@ -22,6 +24,46 @@ public class DeptApiImpl implements DeptApi {
@Resource
private DeptService deptService;
@Override
public CommonResult<Long> createDept(DeptSaveReqDTO createReqVO) {
DeptSaveReqVO reqVO = BeanUtils.toBean(createReqVO, DeptSaveReqVO.class);
Long deptId = deptService.createDept(reqVO);
return success(deptId);
}
@Override
public CommonResult<Boolean> updateDept(DeptSaveReqDTO updateReqVO) {
DeptSaveReqVO reqVO = BeanUtils.toBean(updateReqVO, DeptSaveReqVO.class);
deptService.updateDept(reqVO);
return success(true);
}
@Override
public CommonResult<Boolean> deleteDept(Long id) {
deptService.deleteDept(id);
return success(true);
}
@Override
public CommonResult<List<DeptDetailRespDTO>> getDeptList(DeptListReqDTO reqVO) {
DeptListReqVO listReqVO = BeanUtils.toBean(reqVO, DeptListReqVO.class);
List<DeptDO> depts = deptService.getDeptList(listReqVO);
return success(BeanUtils.toBean(depts, DeptDetailRespDTO.class));
}
@Override
public CommonResult<List<DeptSimpleRespDTO>> getSimpleDeptList() {
List<DeptDO> depts = deptService.getDeptList(
new DeptListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
return success(BeanUtils.toBean(depts, DeptSimpleRespDTO.class));
}
@Override
public CommonResult<List<DeptSimpleRespDTO>> getSimpleCompanyList() {
List<DeptDO> companies = deptService.getUserCompanyList();
return success(BeanUtils.toBean(companies, DeptSimpleRespDTO.class));
}
@Override
public CommonResult<DeptRespDTO> getDept(Long id) {
DeptDO dept = deptService.getDept(id);

View File

@@ -1,15 +1,21 @@
package cn.iocoder.yudao.module.system.api.dept;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.PostSaveReqDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.PostSimpleRespDTO;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
import cn.iocoder.yudao.module.system.service.dept.PostService;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -21,6 +27,39 @@ public class PostApiImpl implements PostApi {
@Resource
private PostService postService;
@Override
public CommonResult<Long> createPost(PostSaveReqDTO createReqVO) {
PostSaveReqVO reqVO = BeanUtils.toBean(createReqVO, PostSaveReqVO.class);
Long postId = postService.createPost(reqVO);
return success(postId);
}
@Override
public CommonResult<Boolean> updatePost(PostSaveReqDTO updateReqVO) {
PostSaveReqVO reqVO = BeanUtils.toBean(updateReqVO, PostSaveReqVO.class);
postService.updatePost(reqVO);
return success(true);
}
@Override
public CommonResult<Boolean> deletePost(Long id) {
postService.deletePost(id);
return success(true);
}
@Override
public CommonResult<PostRespDTO> getPost(Long id) {
PostDO post = postService.getPost(id);
return success(BeanUtils.toBean(post, PostRespDTO.class));
}
@Override
public CommonResult<List<PostSimpleRespDTO>> getSimplePostList() {
List<PostDO> posts = postService.getPostList(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
posts.sort(Comparator.comparing(PostDO::getSort));
return success(BeanUtils.toBean(posts, PostSimpleRespDTO.class));
}
@Override
public CommonResult<Boolean> validPostList(Collection<Long> ids) {
postService.validatePostList(ids);

View File

@@ -1,15 +1,20 @@
package cn.iocoder.yudao.module.system.api.dict;
import cn.iocoder.yudao.framework.common.biz.system.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.biz.system.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataDetailRespDTO;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataSaveReqDTO;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataSimpleRespDTO;
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Primary;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import java.util.Collection;
import java.util.List;
@@ -23,6 +28,39 @@ public class DictDataApiImpl implements DictDataApi {
@Resource
private DictDataService dictDataService;
@Override
public CommonResult<Long> createDictData(DictDataSaveReqDTO createReqVO) {
DictDataSaveReqVO reqVO = BeanUtils.toBean(createReqVO, DictDataSaveReqVO.class);
Long dictDataId = dictDataService.createDictData(reqVO);
return success(dictDataId);
}
@Override
public CommonResult<Boolean> updateDictData(DictDataSaveReqDTO updateReqVO) {
DictDataSaveReqVO reqVO = BeanUtils.toBean(updateReqVO, DictDataSaveReqVO.class);
dictDataService.updateDictData(reqVO);
return success(true);
}
@Override
public CommonResult<Boolean> deleteDictData(Long id) {
dictDataService.deleteDictData(id);
return success(true);
}
@Override
public CommonResult<List<DictDataSimpleRespDTO>> getSimpleDictDataList() {
List<DictDataDO> list = dictDataService.getDictDataList(
CommonStatusEnum.ENABLE.getStatus(), null);
return success(BeanUtils.toBean(list, DictDataSimpleRespDTO.class));
}
@Override
public CommonResult<DictDataDetailRespDTO> getDictData(Long id) {
DictDataDO dictData = dictDataService.getDictData(id);
return success(BeanUtils.toBean(dictData, DictDataDetailRespDTO.class));
}
@Override
public CommonResult<Boolean> validateDictDataList(String dictType, Collection<String> values) {
dictDataService.validateDictDataList(dictType, values);

View File

@@ -2,6 +2,10 @@ package cn.iocoder.yudao.module.system.api.permission;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.api.permission.dto.*;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleDataScopeReqVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO;
import cn.iocoder.yudao.module.system.service.permission.PermissionService;
import org.springframework.context.annotation.Primary;
import org.springframework.validation.annotation.Validated;
@@ -21,6 +25,36 @@ public class PermissionApiImpl implements PermissionApi {
@Resource
private PermissionService permissionService;
@Override
public CommonResult<Set<Long>> getRoleMenuList(Long roleId) {
return success(permissionService.getRoleMenuListByRoleId(roleId));
}
@Override
public CommonResult<Boolean> assignRoleMenu(PermissionAssignRoleMenuReqDTO reqVO) {
permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds());
return success(true);
}
@Override
public CommonResult<Boolean> assignRoleDataScope(PermissionAssignRoleDataScopeReqDTO reqVO) {
PermissionAssignRoleDataScopeReqVO reqVOInternal = BeanUtils.toBean(reqVO, PermissionAssignRoleDataScopeReqVO.class);
permissionService.assignRoleDataScope(reqVOInternal.getRoleId(), reqVOInternal.getDataScope(), reqVOInternal.getDataScopeDeptIds());
return success(true);
}
@Override
public CommonResult<Set<Long>> listAdminRoles(Long userId) {
return success(permissionService.getUserRoleIdListByUserId(userId));
}
@Override
public CommonResult<Boolean> assignUserRole(PermissionAssignUserRoleReqDTO reqVO) {
PermissionAssignUserRoleReqVO reqVOInternal = BeanUtils.toBean(reqVO, PermissionAssignUserRoleReqVO.class);
permissionService.assignUserRole(reqVOInternal.getUserId(), reqVOInternal.getRoleIds());
return success(true);
}
@Override
public CommonResult<Set<Long>> getUserRoleIdListByRoleIds(Collection<Long> roleIds) {
return success(permissionService.getUserRoleIdListByRoleId(roleIds));

View File

@@ -6,6 +6,10 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserSaveReqDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdatePasswordReqDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateStatusReqDTO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
@@ -31,6 +35,38 @@ public class AdminUserApiImpl implements AdminUserApi {
@Resource
private DeptService deptService;
@Override
public CommonResult<Long> createUser(AdminUserSaveReqDTO reqVO) {
UserSaveReqVO createReqVO = BeanUtils.toBean(reqVO, UserSaveReqVO.class);
Long userId = userService.createUser(createReqVO);
return success(userId);
}
@Override
public CommonResult<Boolean> updateUser(AdminUserSaveReqDTO reqVO) {
UserSaveReqVO updateReqVO = BeanUtils.toBean(reqVO, UserSaveReqVO.class);
userService.updateUser(updateReqVO);
return success(true);
}
@Override
public CommonResult<Boolean> deleteUser(Long id) {
userService.deleteUser(id);
return success(true);
}
@Override
public CommonResult<Boolean> updateUserPassword(AdminUserUpdatePasswordReqDTO reqVO) {
userService.updateUserPassword(reqVO.getId(), reqVO.getPassword());
return success(true);
}
@Override
public CommonResult<Boolean> updateUserStatus(AdminUserUpdateStatusReqDTO reqVO) {
userService.updateUserStatus(reqVO.getId(), reqVO.getStatus());
return success(true);
}
@Override
public CommonResult<AdminUserRespDTO> getUser(Long id) {
AdminUserDO user = userService.getUser(id);

View File

@@ -57,25 +57,25 @@ public class UserSyncServiceImplTest extends BaseMockitoUnitTest {
securityFrameworkUtilsMock.close();
}
@Test
void testCreateUser() {
// Arrange
UserCreateRequestVO requestVO = randomPojo(UserCreateRequestVO.class);
Long newUserId = randomLongId();
when(adminUserService.createUser(any(UserSaveReqVO.class))).thenReturn(newUserId);
// Act
UserCreateResponseVO response = userSyncService.createUser(requestVO);
// Assert
assertNotNull(response);
assertEquals("0", response.getResultCode());
assertEquals("success", response.getMessage());
assertEquals(String.valueOf(newUserId), response.getUid());
assertEquals(requestVO.getBimRequestId(), response.getBimRequestId());
verify(adminUserService).createUser(any(UserSaveReqVO.class));
}
// @Test
// void testCreateUser() {
// // Arrange
// UserCreateRequestVO requestVO = randomPojo(UserCreateRequestVO.class);
// Long newUserId = randomLongId();
// when(adminUserService.createUser(any(UserSaveReqVO.class))).thenReturn(newUserId);
//
// // Act
// UserCreateResponseVO response = userSyncService.createUser(requestVO);
//
// // Assert
// assertNotNull(response);
// assertEquals("0", response.getResultCode());
// assertEquals("success", response.getMessage());
// assertEquals(String.valueOf(newUserId), response.getUid());
// assertEquals(requestVO.getBimRequestId(), response.getBimRequestId());
//
// verify(adminUserService).createUser(any(UserSaveReqVO.class));
// }
@Test
void testDeleteUser_Success() {