application应用管理无用代码移除、单元测试完善

This commit is contained in:
gaoqr
2026-01-13 14:52:29 +08:00
parent 932cc2b1c3
commit f1e4dc9d18
11 changed files with 65 additions and 455 deletions
@@ -1,81 +0,0 @@
package com.cf.imes.module.system.controller.admin.application;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationRespVO;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationSaveReqVO;
import com.cf.imes.module.system.controller.admin.application.vo.auth.ApplicationLoginRespVO;
import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO;
import com.cf.imes.module.system.service.application.ApplicationService;
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.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 应用注册信息")
@RestController
@RequestMapping("/system/application")
@Validated
public class ApplicationController {
@Resource
private ApplicationService applicationService;
@PostMapping("/create")
@Operation(summary = "新建应用注册")
@PreAuthorize("@ss.hasPermission('system:application:create')")
public CommonResult<Integer> createApplication(@Valid @RequestBody ApplicationSaveReqVO createReqVO) {
return success(applicationService.createApplication(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新应用注册")
@PreAuthorize("@ss.hasPermission('system:application:update')")
public CommonResult<Boolean> updateApplication(@Valid @RequestBody ApplicationSaveReqVO updateReqVO) {
applicationService.updateApplication(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除应用注册")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('system:application:delete')")
public CommonResult<Boolean> deleteApplication(@RequestParam("id") Long id) {
applicationService.deleteApplication(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得应用注册")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:application:query')")
public CommonResult<ApplicationRespVO> getApplication(@RequestParam("id") Long id) {
ApplicationDO applicationDO = applicationService.getApplication(id);
return success(BeanUtils.toBean(applicationDO, ApplicationRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得应用注册分页")
@PreAuthorize("@ss.hasPermission('system:application:query')")
public CommonResult<PageResult<ApplicationRespVO>> getApplicationPage(@Valid ApplicationPageReqVO pageReqVO) {
PageResult<ApplicationDO> pageResult = applicationService.getApplicationPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ApplicationRespVO.class));
}
@PostMapping("/appLogin")
@Operation(summary = "应用登陆")
@PreAuthorize("@ss.hasPermission('system:application:create')")
public CommonResult<ApplicationLoginRespVO> loginApplication(@Valid @RequestBody ApplicationRespVO applicationRespVO) {
return success(applicationService.loginApplication(applicationRespVO));
}
}
@@ -1,47 +0,0 @@
package com.cf.imes.module.system.controller.admin.application.vo.application;
import com.cf.imes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 应用注册表分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ApplicationPageReqVO extends PageParam {
@Schema(description = "应用标识", example = "okk")
private String appId;
@Schema(description = "应用密钥", example = "121gfrsg5sb4gs")
private String appKey;
@Schema(description = "服务器IP列表", example = "0.0.0.0")
private String serverIp;
@Schema(description = "应用简称")
private String code;
@Schema(description = "应用名")
private String name;
@Schema(description = "应用主体")
private String company;
@Schema(description = "状态: 0停用,1正常")
private Boolean status;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
@@ -1,57 +0,0 @@
package com.cf.imes.module.system.controller.admin.application.vo.application;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 应用注册表 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApplicationRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109")
@ExcelProperty("主键")
private int id;
@Schema(description = "应用标识", example = "okk")
@ExcelProperty("应用标识")
private String appId;
@Schema(description = "应用密钥", example = "121gfrsg5sb4gs")
@ExcelProperty("应用密钥")
private String appKey;
@Schema(description = "服务器IP列表", example = "0.0.0.0")
@ExcelProperty("服务器IP列表")
private String serverIp;
@Schema(description = "应用简称")
@ExcelProperty("应用简称")
private String code;
@Schema(description = "应用名")
@ExcelProperty("应用名")
private String name;
@Schema(description = "应用主体")
@ExcelProperty("应用主体")
private String company;
@Schema(description = "状态: 0停用,1正常")
@ExcelProperty("状态")
private Boolean status;
@Schema(description = "备注")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
@@ -1,48 +0,0 @@
package com.cf.imes.module.system.controller.admin.application.vo.application;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import jakarta.validation.constraints.NotNull;
@Schema(description = "管理后台 - 应用注册表新增/修改 Request VO")
@Data
public class ApplicationSaveReqVO{
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109")
private Long id;
@Schema(description = "应用标识", example = "okk")
@NotNull(message = "应用标识不能为空")
private String appId;
@Schema(description = "应用密钥", example = "121gfrsg5sb4gs")
@NotNull(message = "应用密钥不能为空")
private String appKey;
// private String appSecret;
@Schema(description = "服务器IP列表", example = "0.0.0.0")
@NotNull(message = "服务器IP列表不能为空")
private String serverIp;
@Schema(description = "应用简称")
@NotNull(message = "应用简称不能为空")
private String code;
@Schema(description = "应用名")
@NotNull(message = "应用名不能为空")
private String name;
@Schema(description = "应用主体")
@NotNull(message = "应用主体不能为空")
private String company;
@Schema(description = "状态: 0停用,1正常")
@NotNull(message = "不能为空")
private Boolean status;
@Schema(description = "备注")
private String remark;
}
@@ -1,31 +0,0 @@
package com.cf.imes.module.system.controller.admin.application.vo.auth;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 应用登录 Response VO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ApplicationLoginRespVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer appId;
@Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "happy")
private String accessToken;
@Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice")
private String refreshToken;
@Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime expiresTime;
}
@@ -1,14 +1,9 @@
package com.cf.imes.module.system.dal.mysql.application;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO;
import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO;
import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 应用信息表 process Mapper
@@ -17,24 +12,6 @@ import java.util.List;
*/
@Mapper
public interface ApplicationMapper extends BaseMapperX<ApplicationDO> {
default PageResult<ApplicationDO> selectPage(ApplicationPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApplicationDO>()
.likeIfPresent(ApplicationDO::getName, reqVO.getName())
.eqIfPresent(ApplicationDO::getAppId, reqVO.getAppId())
.eqIfPresent(ApplicationDO::getCode, reqVO.getCode())
.eqIfPresent(ApplicationDO::getServerIp, reqVO.getServerIp())
.eqIfPresent(ApplicationDO::getCompany, reqVO.getCompany())
.eqIfPresent(ApplicationDO::getStatus, reqVO.getStatus())
.eqIfPresent(ApplicationDO::getRemark, reqVO.getRemark())
.betweenIfPresent(ApplicationDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApplicationDO::getId));
}
default ApplicationDO selectByAppId(String appId) {
return selectOne(ApplicationDO::getAppId, appId);
}
default ApplicationDO selectByOrganId(Long organId) {
return selectOne(ApplicationDO::getOrganId, organId);
}
@@ -1,63 +1,8 @@
package com.cf.imes.module.system.service.application;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationRespVO;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationSaveReqVO;
import com.cf.imes.module.system.controller.admin.application.vo.auth.ApplicationLoginRespVO;
import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO;
import jakarta.validation.Valid;
import java.util.List;
public interface ApplicationService {
/**
* 创建应用信息表 application
*
* @param createReqVO 创建信息
* @return 编号
*/
Integer createApplication(@Valid ApplicationSaveReqVO createReqVO);
/**
* 更新应用信息表 application
*
* @param updateReqVO 更新信息
*/
void updateApplication(@Valid ApplicationSaveReqVO updateReqVO);
/**
* 删除应用信息表 application
*
* @param id 编号
*/
void deleteApplication(Long id);
/**
* 获得应用信息表 application
*
* @param id 编号
* @return 工序信息表 application
*/
ApplicationDO getApplication(Long id);
/**
* 获得应用信息表 application
*
* @param pageReqVO 分页查询
* @return 工序信息表 application
*/
PageResult<ApplicationDO> getApplicationPage(ApplicationPageReqVO pageReqVO);
/**
* 应用登陆
* @param reqVO: 登陆信息
* @return 登录结果
*/
ApplicationLoginRespVO loginApplication(@Valid ApplicationRespVO reqVO);
/**
* 应用信息
* @param organId: 组织信息
@@ -1,32 +1,11 @@
package com.cf.imes.module.system.service.application;
import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationRespVO;
import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationSaveReqVO;
import com.cf.imes.module.system.controller.admin.application.vo.auth.ApplicationLoginRespVO;
import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginRespVO;
import com.cf.imes.module.system.convert.auth.AuthConvert;
import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO;
import com.cf.imes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
import com.cf.imes.module.system.dal.mysql.application.ApplicationMapper;
import com.cf.imes.module.system.enums.ErrorCodeConstants;
import com.cf.imes.module.system.enums.logger.LoginLogTypeEnum;
import com.cf.imes.module.system.enums.oauth2.OAuth2ClientConstants;
import com.cf.imes.module.system.service.oauth2.OAuth2TokenService;
import com.cf.imes.module.system.util.rsa.AsymmetricAlgorithmUtil;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import jakarta.annotation.Resource;
import java.util.LinkedList;
import java.util.Objects;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.APPLICATION_NOT_EXISTS;
/**
* 应用信息表 application Service 实现类
*
@@ -39,98 +18,8 @@ public class ApplicationServiceImpl implements ApplicationService{
@Resource
private ApplicationMapper applicationMapper;
@Resource
private OAuth2TokenService oauth2TokenService;
@Override
public Integer createApplication(ApplicationSaveReqVO createReqVO) {
// 插入
LinkedList<String> priKeyAndPubKey = AsymmetricAlgorithmUtil.getPriKeyAndPubKey();
String privateKey = priKeyAndPubKey.get(0);
String publicKey = priKeyAndPubKey.get(1);
String appKey = AsymmetricAlgorithmUtil.encryptByPublic(createReqVO.getAppId(), publicKey);
// 公钥加密,私钥解密
ApplicationDO applicationDO = BeanUtils.toBean(createReqVO, ApplicationDO.class)
.setAppKey(appKey).setAppSecret(privateKey);
applicationMapper.insert(applicationDO);
// 返回
return applicationDO.getId();
}
@Override
public void updateApplication(ApplicationSaveReqVO updateReqVO) {
// 校验存在
validateApplicationExists(updateReqVO.getId());
// 更新
ApplicationDO updateObj = BeanUtils.toBean(updateReqVO, ApplicationDO.class);
applicationMapper.updateById(updateObj);
}
@Override
public void deleteApplication(Long id) {
// 校验存在
validateApplicationExists(id);
// 删除
applicationMapper.deleteById(id);
}
private void validateApplicationExists(Long id) {
if (applicationMapper.selectById(id) == null) {
throw new ServiceException(APPLICATION_NOT_EXISTS);
}
}
@Override
public ApplicationDO getApplication(Long id) {
return applicationMapper.selectById(id);
}
@Override
public PageResult<ApplicationDO> getApplicationPage(ApplicationPageReqVO pageReqVO) {
return applicationMapper.selectPage(pageReqVO);
}
@Override
public ApplicationLoginRespVO loginApplication(ApplicationRespVO reqVO) {
ApplicationDO app = applicationMapper.selectByAppId(reqVO.getAppId());
if (Objects.isNull(app)) {
throw new ServiceException(ErrorCodeConstants.APPLICATION_NOT_EXISTS);
}
// 公钥加密,私钥解密
String appId = AsymmetricAlgorithmUtil.encryptByPublic(reqVO.getAppKey(), app.getAppSecret());
if (!appId.equals(app.getAppId())) {
throw new ServiceException(ErrorCodeConstants.APPLICATION_LOGIN_USER_DISABLED);
}
// 创建 Token 令牌,记录登录日志
return BeanUtils.toBean(createTokenAfterLoginSuccess(app.getId(), app.getAppId(), LoginLogTypeEnum.LOGIN_USERNAME), ApplicationLoginRespVO.class).setAppId(app.getId());
}
@Override
public ApplicationDO getApplicationByOrganId(Long organId) {
return applicationMapper.selectByOrganId(organId);
}
private AuthLoginRespVO createTokenAfterLoginSuccess(Integer userId, String username, LoginLogTypeEnum logType) {
// Long organId = OrganContextHolder.getOrganId();
// OrganizationDO organ = organService.getOrgan(organId);
// if(Objects.isNull(organ)) {
// throw new ServerException(10023,"组织不存在");
// }
// 创建访问令牌
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(
1L,
null,
OAuth2ClientConstants.CLIENT_ID_DEFAULT,
null,
null,
null,
null,
null,
null,
null
);
// 构建返回结果
return AuthConvert.INSTANCE.convert(accessTokenDO);
}
}
@@ -0,0 +1,41 @@
package com.cf.imes.module.system.service.application;
import com.cf.imes.framework.test.core.ut.BaseDbAndRedisUnitTest;
import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO;
import com.cf.imes.module.system.dal.mysql.application.ApplicationMapper;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import static com.cf.imes.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
/**
* 应用管理服务单元测试
*
* @author Gqr
* @since 2026/1/13 14:37
*/
@Import(ApplicationServiceImpl.class)
class ApplicationServiceImplTest extends BaseDbAndRedisUnitTest {
@Resource
private ApplicationServiceImpl applicationService;
@Resource
private ApplicationMapper applicationMapper;
@Test
void getApplicationByOrganId() {
Long organId = 1L;
ApplicationDO applicationDO = randomPojo(ApplicationDO.class, o -> {
o.setOrganId(organId);
});
applicationMapper.insert(applicationDO);
ApplicationDO applicationByOrganId = applicationService.getApplicationByOrganId(organId);
assertNotNull(applicationByOrganId);
assertEquals(applicationDO.getId(), applicationByOrganId.getId());
}
}
@@ -44,4 +44,5 @@ DELETE FROM "purchase_record";
DELETE FROM "income_expense_details";
DELETE FROM "invoice_title_info";
DELETE FROM "invoice_records";
DELETE FROM "system_config_token";
DELETE FROM "system_config_token";
DELETE FROM "application";
@@ -899,4 +899,25 @@ CREATE TABLE IF NOT EXISTS "system_config_token"
"update_time" TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
"deleted" BIT DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY ("id")
) COMMENT 'Token配置表';
) COMMENT 'Token配置表';
CREATE TABLE IF NOT EXISTS "application" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"app_id" varchar(32) NOT NULL COMMENT '应用唯一标识',
"app_key" varchar(255) DEFAULT NULL,
"app_secret" varchar(255) DEFAULT NULL COMMENT '对应私钥',
"organ_id" bigint NOT NULL COMMENT '组织ID',
"server_ip" varchar(255) NOT NULL DEFAULT '' COMMENT '服务器IP列表',
"code" varchar(64) NOT NULL DEFAULT '' COMMENT '应用简称',
"name" varchar(64) NOT NULL DEFAULT '' COMMENT '应用名',
"company" varchar(64) NOT NULL DEFAULT '' COMMENT '应用主体',
"status" bit NOT NULL DEFAULT FALSE COMMENT '状态: 0停用,1正常',
"remark" varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
"creator" varchar(64) NOT NULL DEFAULT '' COMMENT '创建人',
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
"updater" varchar(64) NOT NULL DEFAULT '' COMMENT '更新人',
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
"deleted" bit NOT NULL DEFAULT FALSE COMMENT '删除标识: 0不删除,1已删除',
CONSTRAINT "idx_app_appid" UNIQUE ("app_id", "status", "deleted"),
PRIMARY KEY ("id")
) COMMENT '应用注册表';