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 extends Payload>[] 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