From 1af1045e6cc4b3d136466bb075808bce412c3bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=9D=E8=B0=A6?= Date: Thu, 29 Feb 2024 12:17:56 +0000 Subject: [PATCH] =?UTF-8?q?Feature/req=201855=20=E5=AE=98=E7=BD=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + config/.gitignore | 39 ++++++ config/README.md | 1 + config/RELEASE.md | 2 + config/config-api/pom.xml | 21 +++ .../java/cn/axzo/nanopart/api/ConfigApi.java | 43 ++++++ .../nanopart/api/annotation/JsonString.java | 23 +++ .../config/NanopartApiAutoConfiguration.java | 9 ++ .../api/constant/NanopartConstant.java | 13 ++ .../api/constant/enums/BizTypeEnum.java | 23 +++ .../cn/axzo/nanopart/api/dto/ConfigDto.java | 17 +++ .../nanopart/api/dto/CreateConfigDto.java | 18 +++ .../nanopart/api/request/CreateConfigReq.java | 43 ++++++ .../nanopart/api/response/ConfigResp.java | 28 ++++ .../api/validator/JsonStringValidator.java | 24 ++++ .../main/resources/META-INF/spring.factories | 2 + config/config-server/pom.xml | 70 ++++++++++ .../server/controller/ConfigController.java | 40 ++++++ .../nanopart/server/dao/entity/Config.java | 38 +++++ .../server/dao/mapper/ConfigMapper.java | 13 ++ .../server/service/ConfigService.java | 33 +++++ .../service/impl/ConfigServiceImpl.java | 69 +++++++++ .../axzo/maven/archetype/server/AppTest.java | 14 ++ config/pom.xml | 101 ++++++++++++++ job/.gitignore | 39 ++++++ job/README.md | 1 + job/RELEASE.md | 2 + job/job-api/pom.xml | 33 +++++ .../java/cn/axzo/nanopart/api/JobApi.java | 64 +++++++++ .../config/NanopartApiAutoConfiguration.java | 9 ++ .../api/constant/NanopartConstant.java | 13 ++ .../api/constant/enums/JobStatusEnum.java | 27 ++++ .../api/constant/enums/JobTypeEnum.java | 27 ++++ .../nanopart/api/request/CreateJobReq.java | 53 +++++++ .../nanopart/api/request/ListJobsReq.java | 31 ++++ .../nanopart/api/request/UpdateJobReq.java | 46 ++++++ .../nanopart/api/response/JobDetailResp.java | 40 ++++++ .../axzo/nanopart/api/response/JobResp.java | 60 ++++++++ .../main/resources/META-INF/spring.factories | 2 + job/job-server/pom.xml | 69 +++++++++ .../server/controller/JobController.java | 59 ++++++++ .../controller/JobExternalController.java | 41 ++++++ .../axzo/nanopart/server/dao/entity/Job.java | 79 +++++++++++ .../nanopart/server/dao/mapper/JobMapper.java | 13 ++ .../nanopart/server/dto/CreateJobDto.java | 41 ++++++ .../axzo/nanopart/server/dto/ListJobsDto.java | 30 ++++ .../nanopart/server/dto/UpdateJobDto.java | 46 ++++++ .../nanopart/server/service/JobService.java | 74 ++++++++++ .../server/service/impl/JobServiceImpl.java | 132 ++++++++++++++++++ .../axzo/maven/archetype/server/AppTest.java | 14 ++ job/pom.xml | 102 ++++++++++++++ nanopart-server/pom.xml | 24 ++++ .../src/main/resources/application.yml | 1 + pom.xml | 2 + 54 files changed, 1859 insertions(+) create mode 100644 config/.gitignore create mode 100644 config/README.md create mode 100644 config/RELEASE.md create mode 100644 config/config-api/pom.xml create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/ConfigApi.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/annotation/JsonString.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BizTypeEnum.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/dto/ConfigDto.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/dto/CreateConfigDto.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/request/CreateConfigReq.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/response/ConfigResp.java create mode 100644 config/config-api/src/main/java/cn/axzo/nanopart/api/validator/JsonStringValidator.java create mode 100644 config/config-api/src/main/resources/META-INF/spring.factories create mode 100644 config/config-server/pom.xml create mode 100644 config/config-server/src/main/java/cn/axzo/nanopart/server/controller/ConfigController.java create mode 100644 config/config-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Config.java create mode 100644 config/config-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/ConfigMapper.java create mode 100644 config/config-server/src/main/java/cn/axzo/nanopart/server/service/ConfigService.java create mode 100644 config/config-server/src/main/java/cn/axzo/nanopart/server/service/impl/ConfigServiceImpl.java create mode 100644 config/config-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java create mode 100644 config/pom.xml create mode 100644 job/.gitignore create mode 100644 job/README.md create mode 100644 job/RELEASE.md create mode 100644 job/job-api/pom.xml create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/JobApi.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobStatusEnum.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobTypeEnum.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/request/CreateJobReq.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/request/ListJobsReq.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/request/UpdateJobReq.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobDetailResp.java create mode 100644 job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobResp.java create mode 100644 job/job-api/src/main/resources/META-INF/spring.factories create mode 100644 job/job-server/pom.xml create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobController.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobExternalController.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Job.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/JobMapper.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/dto/CreateJobDto.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/dto/ListJobsDto.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/dto/UpdateJobDto.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/service/JobService.java create mode 100644 job/job-server/src/main/java/cn/axzo/nanopart/server/service/impl/JobServiceImpl.java create mode 100644 job/job-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java create mode 100644 job/pom.xml diff --git a/.gitignore b/.gitignore index a66b8e2f..28b85449 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ target/ .settings .springBeans .sts4-cache +.DS_Store ### IntelliJ IDEA ### .idea diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 00000000..a66b8e2f --- /dev/null +++ b/config/.gitignore @@ -0,0 +1,39 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +application-local.yml +*.log + +rebel.xml +.flattened-pom.xml \ No newline at end of file diff --git a/config/README.md b/config/README.md new file mode 100644 index 00000000..5fe9c670 --- /dev/null +++ b/config/README.md @@ -0,0 +1 @@ +# 项目介绍 \ No newline at end of file diff --git a/config/RELEASE.md b/config/RELEASE.md new file mode 100644 index 00000000..a033ae0c --- /dev/null +++ b/config/RELEASE.md @@ -0,0 +1,2 @@ +# 发布记录 + diff --git a/config/config-api/pom.xml b/config/config-api/pom.xml new file mode 100644 index 00000000..41815ad0 --- /dev/null +++ b/config/config-api/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + + cn.axzo.nanopart + config + ${revision} + ../pom.xml + + + config-api + jar + config-api + + + + cn.axzo.framework + axzo-consumer-spring-cloud-starter + + + diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/ConfigApi.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/ConfigApi.java new file mode 100644 index 00000000..f1aeb2bb --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/ConfigApi.java @@ -0,0 +1,43 @@ +package cn.axzo.nanopart.api; + +import cn.axzo.framework.web.http.ApiResponse; +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import cn.axzo.nanopart.api.request.CreateConfigReq; +import cn.axzo.nanopart.api.response.ConfigResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import cn.axzo.framework.domain.web.result.ApiResult; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@FeignClient(name = "nanopart", url = "http://nanopart:8080") +public interface ConfigApi { + + /** + * 创建或者更新配置 + * + * @param req 创建参数 + * @author wangsiqian + * @since 2024-02-19 + */ + @PostMapping("/api/v1/configs") + ApiResult createOrUpdateConfig(@Validated @RequestBody CreateConfigReq req); + + /** + * 通过 bizCode 和 bizType 获取配置 + * + * @param bizCode 业务码 + * @param bizType 业务类型 + * @return 配置 + * @author wangsiqian + * @since 2024-02-19 + */ + @GetMapping("/api/v1/configs") + ApiResult getConfigByBizCode(@RequestParam String bizCode, @RequestParam BizTypeEnum bizType); +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/annotation/JsonString.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/annotation/JsonString.java new file mode 100644 index 00000000..2c39a9c2 --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/annotation/JsonString.java @@ -0,0 +1,23 @@ +package cn.axzo.nanopart.api.annotation; + +import cn.axzo.nanopart.api.validator.JsonStringValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Constraint(validatedBy = JsonStringValidator.class) +public @interface JsonString { + String message() default "无效的 JSON 字符串"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java new file mode 100644 index 00000000..816d5e34 --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java @@ -0,0 +1,9 @@ +package cn.axzo.nanopart.api.config; + +import cn.axzo.nanopart.api.constant.NanopartConstant; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@EnableFeignClients(NanopartConstant.BASIC_FEIGN_PACKAGE) +public class NanopartApiAutoConfiguration { + +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java new file mode 100644 index 00000000..24a48010 --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java @@ -0,0 +1,13 @@ +package cn.axzo.nanopart.api.constant; + +/** + * @author: chenwenjian + * @date: 2023/8/14 9:38 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +public class NanopartConstant { + + public static final String BASIC_FEIGN_PACKAGE = "cn.axzo.nanopart.api"; +} \ No newline at end of file diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BizTypeEnum.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BizTypeEnum.java new file mode 100644 index 00000000..af0d7a5b --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/constant/enums/BizTypeEnum.java @@ -0,0 +1,23 @@ +package cn.axzo.nanopart.api.constant.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Getter +@AllArgsConstructor +public enum BizTypeEnum { + /** + * 前端 + */ + + FRONT(0, "前端"); + + @EnumValue + private final Integer value; + private final String description; +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/dto/ConfigDto.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/dto/ConfigDto.java new file mode 100644 index 00000000..11bd53fd --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/dto/ConfigDto.java @@ -0,0 +1,17 @@ +package cn.axzo.nanopart.api.dto; + +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import lombok.Data; + +import java.util.Map; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class ConfigDto { + private String bizCode; + private BizTypeEnum bizType; + private Map content; +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/dto/CreateConfigDto.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/dto/CreateConfigDto.java new file mode 100644 index 00000000..be7b819c --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/dto/CreateConfigDto.java @@ -0,0 +1,18 @@ +package cn.axzo.nanopart.api.dto; + +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import lombok.Data; + +import java.util.Map; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class CreateConfigDto { + private BizTypeEnum bizType; + private String bizCode; + private Map content; + private Long createBy; +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/request/CreateConfigReq.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/request/CreateConfigReq.java new file mode 100644 index 00000000..82337128 --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/request/CreateConfigReq.java @@ -0,0 +1,43 @@ +package cn.axzo.nanopart.api.request; + +import cn.axzo.nanopart.api.annotation.JsonString; +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class CreateConfigReq { + + /** + * 业务类型 + */ + @NotNull(message = "业务类型不能为空") + private BizTypeEnum bizType; + + /** + * 业务码 + */ + @NotBlank(message = "业务码不能为空") + @Length(max = 20, message = "业务码长度不能超过20") + private String bizCode; + + /** + * 配置内容 + */ + @NotNull(message = "配置内容不能为空") + private Map content; + + /** + * 创建人 + */ + @NotNull(message = "创建人不能为空") + private Long createBy; +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/response/ConfigResp.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/response/ConfigResp.java new file mode 100644 index 00000000..44ba181d --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/response/ConfigResp.java @@ -0,0 +1,28 @@ +package cn.axzo.nanopart.api.response; + +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import lombok.Data; + +import java.util.Map; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class ConfigResp { + /** + * 业务码 + */ + private String bizCode; + + /** + * 业务类型 + */ + private BizTypeEnum bizType; + + /** + * 配置内容 + */ + private Map content; +} diff --git a/config/config-api/src/main/java/cn/axzo/nanopart/api/validator/JsonStringValidator.java b/config/config-api/src/main/java/cn/axzo/nanopart/api/validator/JsonStringValidator.java new file mode 100644 index 00000000..25fb7ecd --- /dev/null +++ b/config/config-api/src/main/java/cn/axzo/nanopart/api/validator/JsonStringValidator.java @@ -0,0 +1,24 @@ +package cn.axzo.nanopart.api.validator; + +import cn.axzo.framework.core.util.StringUtil; +import cn.axzo.nanopart.api.annotation.JsonString; +import cn.hutool.json.JSONUtil; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ + +public class JsonStringValidator implements ConstraintValidator { + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (StringUtil.isEmpty(value)) { + return true; + } + + return JSONUtil.isTypeJSON(value); + } +} diff --git a/config/config-api/src/main/resources/META-INF/spring.factories b/config/config-api/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..bf796ec6 --- /dev/null +++ b/config/config-api/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +cn.axzo.nanopart.api.config.NanopartApiAutoConfiguration \ No newline at end of file diff --git a/config/config-server/pom.xml b/config/config-server/pom.xml new file mode 100644 index 00000000..2b7c3bd2 --- /dev/null +++ b/config/config-server/pom.xml @@ -0,0 +1,70 @@ + + + + cn.axzo.nanopart + config + ${revision} + ../pom.xml + + + 4.0.0 + + config-server + jar + + config-server + + + + cn.axzo.framework + axzo-web-spring-boot-starter + + + cn.axzo.framework + axzo-spring-cloud-starter + + + cn.axzo.framework + axzo-consumer-spring-cloud-starter + + + cn.axzo.framework + axzo-processor-spring-boot-starter + + + + cn.axzo.framework + axzo-mybatisplus-spring-boot-starter + + + + cn.axzo.framework + axzo-swagger-yapi-spring-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + cn.hutool + hutool-all + + + + cn.axzo.basics + basics-common + + + + cn.axzo.framework + axzo-logger-spring-boot-starter + + + + cn.axzo.nanopart + config-api + 2.0.0-SNAPSHOT + + + diff --git a/config/config-server/src/main/java/cn/axzo/nanopart/server/controller/ConfigController.java b/config/config-server/src/main/java/cn/axzo/nanopart/server/controller/ConfigController.java new file mode 100644 index 00000000..bac24d0e --- /dev/null +++ b/config/config-server/src/main/java/cn/axzo/nanopart/server/controller/ConfigController.java @@ -0,0 +1,40 @@ +package cn.axzo.nanopart.server.controller; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.ConfigApi; +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import cn.axzo.nanopart.api.dto.ConfigDto; +import cn.axzo.nanopart.api.dto.CreateConfigDto; +import cn.axzo.nanopart.api.request.CreateConfigReq; +import cn.axzo.nanopart.api.response.ConfigResp; +import cn.axzo.nanopart.server.service.ConfigService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +/** + * @author wangsiqian + * @since 2024/02/19 10:00 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class ConfigController implements ConfigApi { + private final ConfigService configService; + + /** + * 创建或者更新配置 + */ + @Override + public ApiResult createOrUpdateConfig(CreateConfigReq req) { + configService.createOrUpdateConfig(BeanMapper.copyBean(req, CreateConfigDto::new)); + return ApiResult.ok(); + } + + @Override + public ApiResult getConfigByBizCode(String bizCode, BizTypeEnum bizType) { + ConfigDto configDto = configService.getConfigByBizCode(bizCode, bizType); + return ApiResult.ok(BeanMapper.copyBean(configDto, ConfigResp::new)); + } +} diff --git a/config/config-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Config.java b/config/config-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Config.java new file mode 100644 index 00000000..76592b50 --- /dev/null +++ b/config/config-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Config.java @@ -0,0 +1,38 @@ +package cn.axzo.nanopart.server.dao.entity; + +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; + +import java.util.Date; +import java.util.Map; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +@TableName(value = "nanopart_config", autoResultMap = true) +public class Config { + @TableId(type = IdType.AUTO) + private Long id; + + private BizTypeEnum bizType; + private String bizCode; + + @TableField(typeHandler = FastjsonTypeHandler.class) + private Map content; + + private Boolean isDelete; + private Date createAt; + private Date updateAt; + + private Long createBy; + private Long updateBy; +} diff --git a/config/config-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/ConfigMapper.java b/config/config-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/ConfigMapper.java new file mode 100644 index 00000000..007aac87 --- /dev/null +++ b/config/config-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/ConfigMapper.java @@ -0,0 +1,13 @@ +package cn.axzo.nanopart.server.dao.mapper; + +import cn.axzo.nanopart.server.dao.entity.Config; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Mapper +public interface ConfigMapper extends BaseMapper { +} diff --git a/config/config-server/src/main/java/cn/axzo/nanopart/server/service/ConfigService.java b/config/config-server/src/main/java/cn/axzo/nanopart/server/service/ConfigService.java new file mode 100644 index 00000000..17a882f5 --- /dev/null +++ b/config/config-server/src/main/java/cn/axzo/nanopart/server/service/ConfigService.java @@ -0,0 +1,33 @@ +package cn.axzo.nanopart.server.service; + + +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import cn.axzo.nanopart.api.dto.ConfigDto; +import cn.axzo.nanopart.api.dto.CreateConfigDto; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +public interface ConfigService { + /** + * 创建或者更新配置 + * + * @param dto 创建参数 + * @author wangsiqian + * @since 2024-02-19 + */ + void createOrUpdateConfig(CreateConfigDto dto); + + + /** + * 通过 bizCode 获取配置 + * + * @param bizCode 业务码 + * @param bizType 业务类型 + * @return 配置 + * @author wangsiqian + * @since 2024-02-19 + */ + ConfigDto getConfigByBizCode(String bizCode, BizTypeEnum bizType); +} diff --git a/config/config-server/src/main/java/cn/axzo/nanopart/server/service/impl/ConfigServiceImpl.java b/config/config-server/src/main/java/cn/axzo/nanopart/server/service/impl/ConfigServiceImpl.java new file mode 100644 index 00000000..9a39cb34 --- /dev/null +++ b/config/config-server/src/main/java/cn/axzo/nanopart/server/service/impl/ConfigServiceImpl.java @@ -0,0 +1,69 @@ +package cn.axzo.nanopart.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.nanopart.api.constant.enums.BizTypeEnum; +import cn.axzo.nanopart.api.dto.ConfigDto; +import cn.axzo.nanopart.api.dto.CreateConfigDto; +import cn.axzo.nanopart.server.dao.entity.Config; +import cn.axzo.nanopart.server.dao.mapper.ConfigMapper; +import cn.axzo.nanopart.server.service.ConfigService; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ConfigServiceImpl extends ServiceImpl implements ConfigService { + private final ConfigMapper configMapper; + + @Override + public void createOrUpdateConfig(CreateConfigDto dto) { + Config config = configMapper.selectOne( + Wrappers.lambdaQuery() + .eq(Config::getBizCode, dto.getBizCode()) + .eq(Config::getBizType, dto.getBizType()) + ); + + if (config == null) { + config = BeanMapper.copyBean(dto, Config::new); + config.setCreateAt(new Date()); + config.setUpdateAt(new Date()); + } else { + config.setBizCode(dto.getBizCode()); + config.setBizType(dto.getBizType()); + config.setContent(dto.getContent()); + config.setUpdateBy(dto.getCreateBy()); + config.setIsDelete(false); + config.setUpdateAt(new Date()); + } + + saveOrUpdate(config); + } + + @Override + public ConfigDto getConfigByBizCode(String bizCode, BizTypeEnum bizType) { + Config config = configMapper.selectOne( + Wrappers.lambdaQuery() + .eq(Config::getBizCode, bizCode) + .eq(Config::getBizType, bizType) + .eq(Config::getIsDelete, false) + ); + if (config == null) { + throw new ServiceException("未找到该配置"); + } + + return BeanMapper.copyBean(config, ConfigDto::new); + } +} diff --git a/config/config-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java b/config/config-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java new file mode 100644 index 00000000..f5b53190 --- /dev/null +++ b/config/config-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java @@ -0,0 +1,14 @@ +package cn.axzo.maven.archetype.server; + +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Unit test for simple App. + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class AppTest { + +} diff --git a/config/pom.xml b/config/pom.xml new file mode 100644 index 00000000..c3b82269 --- /dev/null +++ b/config/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + cn.axzo.nanopart + nanopart + ${revision} + ../pom.xml + + + cn.axzo.nanopart + config + pom + config + + + 2.0.0-SNAPSHOT + 2.0.0-SNAPSHOT + 1.18.22 + 1.4.2.Final + + + + + + + cn.axzo.infra + axzo-bom + ${axzo-bom.version} + pom + import + + + cn.axzo.infra + axzo-dependencies + ${axzo-dependencies.version} + pom + import + + + + + + + + + org.projectlombok + lombok + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + junit + junit + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + + + + + + axzo + axzo repository + https://nexus.axzo.cn/repository/axzo/ + + + + config-server + config-api + + diff --git a/job/.gitignore b/job/.gitignore new file mode 100644 index 00000000..a66b8e2f --- /dev/null +++ b/job/.gitignore @@ -0,0 +1,39 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +application-local.yml +*.log + +rebel.xml +.flattened-pom.xml \ No newline at end of file diff --git a/job/README.md b/job/README.md new file mode 100644 index 00000000..5fe9c670 --- /dev/null +++ b/job/README.md @@ -0,0 +1 @@ +# 项目介绍 \ No newline at end of file diff --git a/job/RELEASE.md b/job/RELEASE.md new file mode 100644 index 00000000..a033ae0c --- /dev/null +++ b/job/RELEASE.md @@ -0,0 +1,2 @@ +# 发布记录 + diff --git a/job/job-api/pom.xml b/job/job-api/pom.xml new file mode 100644 index 00000000..2e63e4dd --- /dev/null +++ b/job/job-api/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + job + cn.axzo.nanopart + ${revision} + ../pom.xml + + + job-api + jar + job-api + + + + org.springframework.cloud + spring-cloud-openfeign-core + + + cn.axzo.framework + axzo-common-domain + + + + cn.axzo.basics + basics-common + + + + diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/JobApi.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/JobApi.java new file mode 100644 index 00000000..691bee87 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/JobApi.java @@ -0,0 +1,64 @@ +package cn.axzo.nanopart.api; + +import cn.axzo.framework.domain.web.result.ApiPageResult; +import cn.axzo.nanopart.api.request.CreateJobReq; +import cn.axzo.nanopart.api.request.ListJobsReq; +import cn.axzo.nanopart.api.request.UpdateJobReq; +import cn.axzo.nanopart.api.response.JobDetailResp; +import cn.axzo.nanopart.api.response.JobResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.SpringQueryMap; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import cn.axzo.framework.domain.web.result.ApiResult; + +import javax.validation.Valid; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@FeignClient(name = "nanopart", url = "http://nanopart:8080") +public interface JobApi { + + /** + * 获取职位列表 + * + * @param req 请求参数 + * @author wangsiqian + * @since 2024-02-19 + */ + @GetMapping("/api/v1/jobs") + ApiPageResult listJobs(@Valid @ModelAttribute @SpringQueryMap ListJobsReq req); + + /** + * 通过职位id查询 + * + * @param id 职位id + * @return 任务详情 + * @author wangsiqian + * @since 2024-02-19 + */ + @GetMapping("/api/v1/jobs/{id}") + ApiResult getJobById(@PathVariable("id") Long id); + + /** + * 创建 job + * + * @param req 请求参数 + * @author wangsiqian + * @since 2024-02-19 + */ + @PostMapping("/api/v1/jobs") + ApiResult createJob(@Validated @RequestBody CreateJobReq req); + + /** + * 更新 job + * + * @param req 请求参数 + * @author wangsiqian + * @since 2024-02-19 + */ + @PostMapping("/api/v1/jobs/{id}") + ApiResult updateJobById(@PathVariable("id") Long id, @Validated @RequestBody UpdateJobReq req); +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java new file mode 100644 index 00000000..816d5e34 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/config/NanopartApiAutoConfiguration.java @@ -0,0 +1,9 @@ +package cn.axzo.nanopart.api.config; + +import cn.axzo.nanopart.api.constant.NanopartConstant; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@EnableFeignClients(NanopartConstant.BASIC_FEIGN_PACKAGE) +public class NanopartApiAutoConfiguration { + +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java new file mode 100644 index 00000000..24a48010 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/NanopartConstant.java @@ -0,0 +1,13 @@ +package cn.axzo.nanopart.api.constant; + +/** + * @author: chenwenjian + * @date: 2023/8/14 9:38 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +public class NanopartConstant { + + public static final String BASIC_FEIGN_PACKAGE = "cn.axzo.nanopart.api"; +} \ No newline at end of file diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobStatusEnum.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobStatusEnum.java new file mode 100644 index 00000000..1f2ffde7 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobStatusEnum.java @@ -0,0 +1,27 @@ +package cn.axzo.nanopart.api.constant.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Getter +@AllArgsConstructor +public enum JobStatusEnum { + /** + * 已发布 + */ + ENABLED(0, "已发布"), + + /** + * 已下线 + */ + DISABLED(1, "已下线"); + + @EnumValue + private final Integer value; + private final String description; +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobTypeEnum.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobTypeEnum.java new file mode 100644 index 00000000..e8b40583 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/constant/enums/JobTypeEnum.java @@ -0,0 +1,27 @@ +package cn.axzo.nanopart.api.constant.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Getter +@AllArgsConstructor +public enum JobTypeEnum { + /** + * 社招 + */ + SOCIAL(0, "社招"), + + /** + * 校招 + */ + SCHOOL(1, "校园招聘"); + + @EnumValue + private final Integer value; + private final String description; +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/request/CreateJobReq.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/request/CreateJobReq.java new file mode 100644 index 00000000..dd78dc8f --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/request/CreateJobReq.java @@ -0,0 +1,53 @@ +package cn.axzo.nanopart.api.request; + +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class CreateJobReq { + /** + * 职位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @Length(max = 30, message = "岗位名称不能超过30个字符") + private String title; + + /** + * 职位类型 + */ + @NotNull(message = "岗位类型不能为空") + private JobTypeEnum jobType; + + /** + * 职位描述 + */ + @NotBlank(message = "岗位描述不能为空") + private String description; + + /** + * 岗位要求 + */ + @NotBlank(message = "岗位要求不能为空") + private String requirement; + + /** + * 创建人 + */ + @NotNull(message = "创建人不能为空") + private Long createBy; + + /** + * 创建人姓名 + */ + @NotBlank(message = "创建人姓名不能为空") + @Length(max = 30, message = "不能超过30个字符") + private String createByName; +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/request/ListJobsReq.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/request/ListJobsReq.java new file mode 100644 index 00000000..ba77d231 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/request/ListJobsReq.java @@ -0,0 +1,31 @@ +package cn.axzo.nanopart.api.request; + +import cn.axzo.core.domain.PageRequest; +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ListJobsReq extends PageRequest { + /** + * 职位名称 + */ + private String title; + + /** + * 职位状态 + */ + private JobStatusEnum jobStatus; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/request/UpdateJobReq.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/request/UpdateJobReq.java new file mode 100644 index 00000000..ee28a428 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/request/UpdateJobReq.java @@ -0,0 +1,46 @@ +package cn.axzo.nanopart.api.request; + +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class UpdateJobReq { + @NotBlank(message = "更新人不能为空") + @Length(max = 30, message = "不能超过30个字符") + private String updateBy; + + /** + * 职位名称 + */ + @Length(max = 30, message = "岗位名称不能超过30个字符") + private String title; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; + + /** + * 职位描述 + */ + private String description; + + /** + * 岗位要求 + */ + private String requirement; + + /** + * 职位状态 + */ + private JobStatusEnum jobStatus; +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobDetailResp.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobDetailResp.java new file mode 100644 index 00000000..7ab50b45 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobDetailResp.java @@ -0,0 +1,40 @@ +package cn.axzo.nanopart.api.response; + +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; + +import java.util.Date; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class JobDetailResp { + /** + * id + */ + private Long id; + + + /** + * 职位名称 + */ + private String title; + + /** + * 职位描述 + */ + private String description; + + /** + * 岗位要求 + */ + private String requirement; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; +} diff --git a/job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobResp.java b/job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobResp.java new file mode 100644 index 00000000..ee4a7e03 --- /dev/null +++ b/job/job-api/src/main/java/cn/axzo/nanopart/api/response/JobResp.java @@ -0,0 +1,60 @@ +package cn.axzo.nanopart.api.response; + +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; + +import java.util.Date; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class JobResp { + /** + * id + */ + private Long id; + + /** + * 职位名称 + */ + private String title; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; + + /** + * 职位状态 + */ + private JobStatusEnum jobStatus; + + /** + * 更新人员 + */ + private String updateBy; + + /** + * 职位描述 + */ + private String description; + + /** + * 岗位要求 + */ + private String requirement; + + /** + * 更新时间 + */ + private Date updateAt; + + /** + * 发布时间 + */ + private Date createAt; + +} diff --git a/job/job-api/src/main/resources/META-INF/spring.factories b/job/job-api/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..bf796ec6 --- /dev/null +++ b/job/job-api/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +cn.axzo.nanopart.api.config.NanopartApiAutoConfiguration \ No newline at end of file diff --git a/job/job-server/pom.xml b/job/job-server/pom.xml new file mode 100644 index 00000000..d0a767e6 --- /dev/null +++ b/job/job-server/pom.xml @@ -0,0 +1,69 @@ + + + + cn.axzo.nanopart + job + ${revision} + ../pom.xml + + 4.0.0 + + job-server + jar + + job-server + + + + cn.axzo.framework + axzo-web-spring-boot-starter + + + cn.axzo.framework + axzo-spring-cloud-starter + + + cn.axzo.framework + axzo-consumer-spring-cloud-starter + + + cn.axzo.framework + axzo-processor-spring-boot-starter + + + + cn.axzo.framework + axzo-mybatisplus-spring-boot-starter + + + + cn.axzo.framework + axzo-swagger-yapi-spring-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + cn.hutool + hutool-all + + + + cn.axzo.basics + basics-common + + + + cn.axzo.framework + axzo-logger-spring-boot-starter + + + + cn.axzo.nanopart + job-api + 2.0.0-SNAPSHOT + + + diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobController.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobController.java new file mode 100644 index 00000000..a10f82ad --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobController.java @@ -0,0 +1,59 @@ +package cn.axzo.nanopart.server.controller; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.framework.domain.web.result.ApiPageResult; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.JobApi; +import cn.axzo.nanopart.api.request.CreateJobReq; +import cn.axzo.nanopart.api.request.ListJobsReq; +import cn.axzo.nanopart.api.request.UpdateJobReq; +import cn.axzo.nanopart.api.response.JobDetailResp; +import cn.axzo.nanopart.api.response.JobResp; +import cn.axzo.nanopart.server.dto.CreateJobDto; +import cn.axzo.nanopart.server.dto.ListJobsDto; +import cn.axzo.nanopart.server.dto.UpdateJobDto; +import cn.axzo.nanopart.server.service.JobService; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author wangsiqian + * @since 2024/02/19 10:00 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class JobController implements JobApi { + private final JobService jobService; + + @Override + public ApiPageResult listJobs(ListJobsReq req) { + Page pageResult = jobService.listJobs(BeanMapper.copyBean(req, ListJobsDto::new)); + return ApiPageResult.ok(pageResult); + } + + @Override + public ApiResult getJobById(Long id) { + return ApiResult.ok(jobService.getJobById(id)); + } + + @Override + public ApiResult createJob(CreateJobReq req) { + CreateJobDto dto = BeanMapper.copyBean(req, CreateJobDto::new); + jobService.createJob(dto); + return ApiResult.ok(); + } + + @Override + public ApiResult updateJobById(Long id, UpdateJobReq req) { + UpdateJobDto dto = BeanMapper.copyBean(req, UpdateJobDto::new); + dto.setId(id); + jobService.updateJobById(dto); + return ApiResult.ok(); + } +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobExternalController.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobExternalController.java new file mode 100644 index 00000000..e2049951 --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/controller/JobExternalController.java @@ -0,0 +1,41 @@ +package cn.axzo.nanopart.server.controller; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.nanopart.api.response.JobDetailResp; +import cn.axzo.nanopart.api.response.JobResp; +import cn.axzo.nanopart.server.dto.ListJobsDto; +import cn.axzo.nanopart.server.service.JobService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author wangsiqian + * @since 2024/02/21 + */ +@Slf4j +@RestController +@RequestMapping("/webApi/jobs") +@RequiredArgsConstructor +public class JobExternalController { + private final JobService jobService; + + /** + * 官网获取职位列表 + */ + @GetMapping("/all") + public ApiResult> listJobsForUser() { + return ApiResult.ok(jobService.listAllJobs()); + } + + /** + * 官网获取职位详情 + */ + @GetMapping("/detail") + public ApiResult getJobById(@RequestParam("id") Long id) { + return ApiResult.ok(jobService.getJobByIdForUser(id)); + } +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Job.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Job.java new file mode 100644 index 00000000..4c7f67d2 --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/dao/entity/Job.java @@ -0,0 +1,79 @@ +package cn.axzo.nanopart.server.dao.entity; + +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.util.Date; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +@TableName(value = "nanopart_job", autoResultMap = true) +public class Job { + /** + * 主键ID + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 职位名称 + */ + private String title; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; + + /** + * 职位状态 + */ + private JobStatusEnum jobStatus; + + /** + * 职位描述 + */ + private String description; + + /** + * 岗位要求 + */ + private String requirement; + + /** + * 是否删除 + */ + private Boolean isDelete; + + /** + * 更新人员 + */ + private String updateBy; + + /** + * 更新人员名字 + */ + private String createByName; + + /** + * 更新人员 + */ + private Long createBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateAt; + + /** + * 发布时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createAt; +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/JobMapper.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/JobMapper.java new file mode 100644 index 00000000..b67b2c84 --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/dao/mapper/JobMapper.java @@ -0,0 +1,13 @@ +package cn.axzo.nanopart.server.dao.mapper; + +import cn.axzo.nanopart.server.dao.entity.Job; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Mapper +public interface JobMapper extends BaseMapper { +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/CreateJobDto.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/CreateJobDto.java new file mode 100644 index 00000000..74bc47f3 --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/CreateJobDto.java @@ -0,0 +1,41 @@ +package cn.axzo.nanopart.server.dto; + +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class CreateJobDto { + /** + * 职位名称 + */ + private String title; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; + + /** + * 职位描述 + */ + private String description; + + /** + * 岗位要求 + */ + private String requirement; + + /** + * 更新人 + */ + private Long createBy; + + /** + * 更新人姓名 + */ + private String createByName; +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/ListJobsDto.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/ListJobsDto.java new file mode 100644 index 00000000..87410296 --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/ListJobsDto.java @@ -0,0 +1,30 @@ +package cn.axzo.nanopart.server.dto; + +import cn.axzo.core.domain.PageRequest; +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ListJobsDto extends PageRequest { + /** + * 职位名称 + */ + private String title; + + /** + * 职位状态 + */ + private JobStatusEnum jobStatus; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/UpdateJobDto.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/UpdateJobDto.java new file mode 100644 index 00000000..b30567eb --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/dto/UpdateJobDto.java @@ -0,0 +1,46 @@ +package cn.axzo.nanopart.server.dto; + +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.constant.enums.JobTypeEnum; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Data +public class UpdateJobDto { + /** + * 职位名称 + */ + private String title; + + /** + * 职位类型 + */ + private JobTypeEnum jobType; + + /** + * 职位描述 + */ + private String description; + + /** + * 岗位要求 + */ + private String requirement; + + /** + * 职位状态 + */ + private JobStatusEnum jobStatus; + + + private Long id; + + /** + * 更新人 + */ + private String updateBy; +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/service/JobService.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/service/JobService.java new file mode 100644 index 00000000..706ab61f --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/service/JobService.java @@ -0,0 +1,74 @@ +package cn.axzo.nanopart.server.service; + + +import cn.axzo.nanopart.api.response.JobDetailResp; +import cn.axzo.nanopart.api.response.JobResp; +import cn.axzo.nanopart.server.dto.CreateJobDto; +import cn.axzo.nanopart.server.dto.ListJobsDto; +import cn.axzo.nanopart.server.dto.UpdateJobDto; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import java.util.List; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +public interface JobService { + /** + * 获取所有job + * + * @param dto 参数 + * @return 所有job + * @author wangsiqian + * @since 2024-02-21 + */ + List listAllJobs(); + + /** + * 获取职位列表 + * + * @param dto 请求参数 + * @author wangsiqian + * @since 2024-02-19 + */ + Page listJobs(ListJobsDto dto); + + /** + * 通过职位id查询 + * + * @param id 职位id + * @return 任务详情 + * @author wangsiqian + * @since 2024-02-19 + */ + JobDetailResp getJobByIdForUser(Long id); + + /** + * 通过职位id查询 + * + * @param id 职位id + * @return 任务详情 + * @author wangsiqian + * @since 2024-02-19 + */ + JobDetailResp getJobById(Long id); + + /** + * 创建 job + * + * @param dto 请求参数 + * @author wangsiqian + * @since 2024-02-19 + */ + void createJob(CreateJobDto dto); + + /** + * 更新 job + * + * @param dto 请求参数 + * @author wangsiqian + * @since 2024-02-19 + */ + void updateJobById(UpdateJobDto dto); +} diff --git a/job/job-server/src/main/java/cn/axzo/nanopart/server/service/impl/JobServiceImpl.java b/job/job-server/src/main/java/cn/axzo/nanopart/server/service/impl/JobServiceImpl.java new file mode 100644 index 00000000..bbd062a2 --- /dev/null +++ b/job/job-server/src/main/java/cn/axzo/nanopart/server/service/impl/JobServiceImpl.java @@ -0,0 +1,132 @@ +package cn.axzo.nanopart.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.nanopart.api.constant.enums.JobStatusEnum; +import cn.axzo.nanopart.api.response.JobDetailResp; +import cn.axzo.nanopart.api.response.JobResp; +import cn.axzo.nanopart.server.dao.entity.Job; +import cn.axzo.nanopart.server.dao.mapper.JobMapper; +import cn.axzo.nanopart.server.dto.CreateJobDto; +import cn.axzo.nanopart.server.dto.ListJobsDto; +import cn.axzo.nanopart.server.dto.UpdateJobDto; +import cn.axzo.nanopart.server.service.JobService; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author wangsiqian + * @since 2024/02/19 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class JobServiceImpl implements JobService { + private final JobMapper jobMapper; + + @Override + public List listAllJobs() { + List jobs = jobMapper.selectList(Wrappers.lambdaQuery() + .eq(Job::getJobStatus, JobStatusEnum.ENABLED) + .eq(Job::getIsDelete, false) + .orderByDesc(Job::getUpdateAt)); + return BeanMapper.copyList(jobs, JobResp::new); + } + + @Override + public Page listJobs(ListJobsDto dto) { + Page page = new Page<>(dto.getPage(), dto.getPageSize()); + LambdaQueryWrapper wrapper = + Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(dto.getTitle()), Job::getTitle, dto.getTitle()) + .eq(Job::getIsDelete, false) + .eq(dto.getJobType() != null, Job::getJobType, dto.getJobType()) + .eq(dto.getJobStatus() != null, Job::getJobStatus, dto.getJobStatus()) + .orderByDesc(Job::getUpdateAt); + + Page jobPage = jobMapper.selectPage(page, wrapper); + + Page result = BeanMapper.copyBean(jobPage, Page::new); + result.setRecords(BeanMapper.copyList(jobPage.getRecords(), JobResp::new)); + return result; + } + + @Override + public JobDetailResp getJobByIdForUser(Long id) { + Job job = jobMapper.selectOne(Wrappers.lambdaQuery() + .eq(Job::getId, id) + .eq(Job::getIsDelete, false) + .eq(Job::getJobStatus, JobStatusEnum.ENABLED) + ); + if (job == null) { + throw new ServiceException("未找到该职位或已被删除"); + } + + return BeanMapper.copyBean(job, JobDetailResp::new); + } + + @Override + public JobDetailResp getJobById(Long id) { + Job job = jobMapper.selectById(id); + if (job == null || BooleanUtil.isTrue(job.getIsDelete())) { + throw new ServiceException("未找到该职位或已被删除"); + } + + return BeanMapper.copyBean(job, JobDetailResp::new); + } + + @Override + public void createJob(CreateJobDto dto) { + Job job = BeanMapper.copyBean(dto, Job::new); + job.setUpdateBy(dto.getCreateByName()); + job.setUpdateAt(new Date()); + job.setCreateAt(new Date()); + + jobMapper.insert(job); + + } + + @Override + public void updateJobById(UpdateJobDto dto) { + if (dto.getJobType() == null + && dto.getJobStatus() == null + && StrUtil.isBlank(dto.getDescription()) + && StrUtil.isBlank(dto.getRequirement()) + && StrUtil.isBlank(dto.getTitle())) { + return; + } + + Job job = jobMapper.selectById(dto.getId()); + if (job == null || BooleanUtil.isTrue(job.getIsDelete())) { + throw new ServiceException("未找到该职位或已被删除"); + } + + LambdaUpdateWrapper wrapper = + Wrappers.lambdaUpdate() + .eq(Job::getId, job.getId()) + .set(Job::getUpdateAt, new Date()) + .set(Job::getUpdateBy, dto.getUpdateBy()) + .set(StrUtil.isNotBlank(dto.getTitle()), Job::getTitle, dto.getTitle()) + .set( + StrUtil.isNotBlank(dto.getRequirement()), + Job::getRequirement, + dto.getRequirement()) + .set( + StrUtil.isNotBlank(dto.getDescription()), + Job::getDescription, + dto.getDescription()) + .set(dto.getJobType() != null, Job::getJobType, dto.getJobType()) + .set(dto.getJobStatus() != null, Job::getJobStatus, dto.getJobStatus()); + jobMapper.update(null, wrapper); + } +} diff --git a/job/job-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java b/job/job-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java new file mode 100644 index 00000000..f5b53190 --- /dev/null +++ b/job/job-server/src/test/java/cn/axzo/maven/archetype/server/AppTest.java @@ -0,0 +1,14 @@ +package cn.axzo.maven.archetype.server; + +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Unit test for simple App. + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class AppTest { + +} diff --git a/job/pom.xml b/job/pom.xml new file mode 100644 index 00000000..f953966e --- /dev/null +++ b/job/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + + + cn.axzo.nanopart + nanopart + ${revision} + ../pom.xml + + + cn.axzo.nanopart + job + pom + job + + + 2.0.0-SNAPSHOT + 2.0.0-SNAPSHOT + 1.18.22 + 1.4.2.Final + + + + + + + cn.axzo.infra + axzo-bom + ${axzo-bom.version} + pom + import + + + cn.axzo.infra + axzo-dependencies + ${axzo-dependencies.version} + pom + import + + + + + + + + + org.projectlombok + lombok + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + junit + junit + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + ${lombok.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + + + + + + + axzo + axzo repository + https://nexus.axzo.cn/repository/axzo/ + + + + job-server + job-api + + diff --git a/nanopart-server/pom.xml b/nanopart-server/pom.xml index 802b59c2..2b2f9b27 100644 --- a/nanopart-server/pom.xml +++ b/nanopart-server/pom.xml @@ -67,6 +67,30 @@ 2.0.0-SNAPSHOT + + cn.axzo.nanopart + config-api + 2.0.0-SNAPSHOT + + + + cn.axzo.nanopart + config-server + 2.0.0-SNAPSHOT + + + + cn.axzo.nanopart + job-api + 2.0.0-SNAPSHOT + + + + cn.axzo.nanopart + job-server + 2.0.0-SNAPSHOT + + cn.axzo.nanopart black-list-service diff --git a/nanopart-server/src/main/resources/application.yml b/nanopart-server/src/main/resources/application.yml index 8347350f..60c2692f 100644 --- a/nanopart-server/src/main/resources/application.yml +++ b/nanopart-server/src/main/resources/application.yml @@ -21,6 +21,7 @@ mybatis-plus: logic-delete-value: id #逻辑已删除值(默认为 1) logic-not-delete-value: 0 #逻辑未删除值(默认为 0) logic-delete-field: isDelete #逻辑删除字段 + type-enums-package: cn.axzo.nanopart.api.constant.enums logging: level: diff --git a/pom.xml b/pom.xml index 38182ced..964c6818 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,8 @@ black-list nanopart-server + config + job