feat: 接口开发

This commit is contained in:
chenwenjian 2023-08-15 16:17:11 +08:00
parent 7c83500bea
commit 2e3aa0ee60
64 changed files with 443 additions and 1453 deletions

View File

@ -1,15 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.axzo.nanopart.black-list</groupId>
<artifactId>black-list</artifactId>
<version>${revision}</version>
</parent>
<groupId>cn.axzo.nanopart.black-list.api.impl</groupId>
<artifactId>black-list-api-impl</artifactId>
<packaging>jar</packaging>
<name>black-list-api-impl</name>
</project>

View File

@ -12,4 +12,15 @@
<packaging>jar</packaging>
<name>black-list-api</name>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.framework</groupId>
<artifactId>axzo-common-domain</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,45 @@
package cn.axzo.nanopart.api;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.api.request.BlackAndWhiteListReq;
import cn.axzo.nanopart.api.response.BlackAndWhiteListResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* @author chenwenjian
* @date 2023/8/11 16:28
* @description 黑白名单api
* @modifiedBy
* @version: 1.0
*/
@FeignClient(name = "nanopart", url = "http://nanopart:8080")
public interface BlackAndWhiteListApi {
/**
* 创建黑名单
* @param req
* @return
*/
@PostMapping("api/black-list/create")
ApiResult<Long> create(@RequestBody @Validated BlackAndWhiteListReq req);
/**
* 删除黑名单
* @return
*/
@PostMapping("api/black-list/delete")
ApiResult<Void> delete(@RequestBody @Validated BlackAndWhiteListReq req);
/**
* 查询黑名单
* @return
*/
@PostMapping("api/black-list/query")
ApiResult<List<BlackAndWhiteListResp>> detail(@RequestBody @Validated BlackAndWhiteListReq req);
}

View File

@ -0,0 +1,16 @@
package cn.axzo.nanopart.api.config;
import cn.axzo.nanopart.api.constant.NanopartConstant;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author chenwenjian
* @date 2023/8/11 16:28
* @description
* @modifiedBy
* @version: 1.0
*/
@EnableFeignClients(NanopartConstant.BASIC_FEIGN_PACKAGE)
public class NanopartApiAutoConfiguration {
}

View File

@ -0,0 +1,14 @@
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.black_list.api";
public static final String PHONE_REGEXP = "^1[3456789]\\d{9}$";
}

View File

@ -0,0 +1,26 @@
package cn.axzo.nanopart.api.request;
import cn.axzo.nanopart.api.constant.NanopartConstant;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
/**
* @author chenwenjian
* @date 2023/8/14 17:23
* @description
* @modifiedBy
* @version: 1.0
*/
@Data
public class BlackAndWhiteListInReq {
@NotBlank(message = "模块名称不能为空格")
private String module;
@Pattern(regexp = NanopartConstant.PHONE_REGEXP,message = "手机号格式错误")
private String phone;
}

View File

@ -0,0 +1,21 @@
package cn.axzo.nanopart.api.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.Map;
/**
* @author chenwenjian
* @date 2023/8/11 16:40
* @description
* @modifiedBy
* @version: 1.0
*/
@Data
public class BlackAndWhiteListReq {
@NotBlank(message = "模块名不能为空")
private String module;
private Map<String,Object> param;
}

View File

@ -0,0 +1,36 @@
package cn.axzo.nanopart.api.response;
import lombok.Data;
import java.util.Date;
/**
* @author chenwenjian
* @date 2023/8/11 16:49
* @description
* @modifiedBy
* @version: 1.0
*/
@Data
public class BlackAndWhiteListResp {
private Long id;
/**
* 模块名
*/
private String module;
/**
* 参数
*/
private String param;
private Date createAt;
private Date updateAt;
private Long createBy;
private Long updateBy;
}

View File

@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.axzo.nanopart.black_list.api.config.NanopartApiAutoConfiguration

View File

@ -1,16 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.axzo.nanopart.black-list</groupId>
<artifactId>black-list</artifactId>
<version>${revision}</version>
</parent>
<groupId>cn.axzo.nanopart.black-list.dao</groupId>
<artifactId>black-list-dao</artifactId>
<packaging>jar</packaging>
<name>black-list-dao</name>
</project>

View File

@ -12,4 +12,26 @@
<packaging>jar</packaging>
<name>black-list-service</name>
<dependencies>
<!--mybatis-plus-->
<dependency>
<groupId>cn.axzo.framework</groupId>
<artifactId>axzo-mybatisplus-spring-boot-starter</artifactId>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.nanopart</groupId>
<artifactId>black-list-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.basics</groupId>
<artifactId>basics-common</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,40 @@
package cn.axzo.nanopart.server.controller;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.api.BlackAndWhiteListApi;
import cn.axzo.nanopart.api.request.BlackAndWhiteListReq;
import cn.axzo.nanopart.api.response.BlackAndWhiteListResp;
import cn.axzo.nanopart.server.service.BlackAndWhiteListService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author chenwenjian
* @date 2023/8/11 17:59
* @description
* @modifiedBy
* @version: 1.0`
*/
@RestController
@RequiredArgsConstructor
public class BlackAndWhiteListController implements BlackAndWhiteListApi {
private final BlackAndWhiteListService blackAndWhiteListService;
@Override
public ApiResult<Long> create(BlackAndWhiteListReq req) {
return blackAndWhiteListService.create(req);
}
@Override
public ApiResult<Void> delete(BlackAndWhiteListReq req) {
return blackAndWhiteListService.delete(req);
}
@Override
public ApiResult<List<BlackAndWhiteListResp>> detail(BlackAndWhiteListReq req) {
return blackAndWhiteListService.detail(req);
}
}

View File

@ -0,0 +1,38 @@
package cn.axzo.nanopart.server.dao.entity;
import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;
import java.util.Map;
/**
* @author chenwenjian
* @date 2023/8/11 15:19
* @description 黑白名单表对应实体
* @modifiedBy
* @version: 1.0
*/
@Data
@TableName(value = "saas_black_white_list",autoResultMap = true)
public class SaasBlackWhiteList extends BaseEntity<SaasBlackWhiteList> {
/**
* 模块名
*/
private String module;
/**
* 参数
*/
@TableField(value = "param",typeHandler = JacksonTypeHandler.class)
private Map<String,Object> param;
private Long createBy;
private Long updateBy;
}

View File

@ -0,0 +1,16 @@
package cn.axzo.nanopart.server.dao.mapper;
import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author chenwenjian
* @date 2023/8/11 16:17
* @description 黑白名单Mapper
* @modifiedBy
* @version: 1.0
*/
@Mapper
public interface BlackAndWhiteListMapper extends BaseMapper<SaasBlackWhiteList> {
}

View File

@ -0,0 +1,56 @@
package cn.axzo.nanopart.server.dao.repository;
import cn.axzo.nanopart.api.request.BlackAndWhiteListReq;
import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList;
import cn.axzo.nanopart.server.dao.mapper.BlackAndWhiteListMapper;
import cn.azxo.framework.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
* @author chenwenjian
* @date 2023/8/11 16:23
* @description 黑白名单数据库访问层
* @modifiedBy
* @version: 1.0
*/
@Repository
@RequiredArgsConstructor
public class BlackAndWhiteListRepository extends ServiceImpl<BlackAndWhiteListMapper, SaasBlackWhiteList> {
private final BlackAndWhiteListMapper blackAndWhiteListMapper;
public void delete(BlackAndWhiteListReq req) {
lambdaUpdate().eq(StringUtils.isNotBlank(req.getModule()),SaasBlackWhiteList::getModule,req.getModule())
.eq(SaasBlackWhiteList::getParam,req.getParam())
.set(SaasBlackWhiteList::getIsDelete,1)
.update();
}
public List<SaasBlackWhiteList> detail(BlackAndWhiteListReq req) {
QueryWrapper<SaasBlackWhiteList> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(req.getModule()),"module",req.getModule());
buildQueryWrapper(queryWrapper, req.getParam(), "");
List<SaasBlackWhiteList> blackWhiteLists = blackAndWhiteListMapper.selectList(queryWrapper);
return blackWhiteLists;
}
private void buildQueryWrapper(QueryWrapper<SaasBlackWhiteList> queryWrapper, Map<String, Object> params, String prefix) {
params.entrySet().stream().forEach(entry -> {
String key = entry.getKey();
Object value = entry.getValue();
String fullKey = prefix.isEmpty() ? key : prefix + "." + key;
if (value instanceof Map) {
buildQueryWrapper(queryWrapper, (Map<String, Object>) value, fullKey);
} else {
queryWrapper.eq("param->>'$." + fullKey + "'", value);
}
});
}
}

View File

@ -0,0 +1,25 @@
package cn.axzo.nanopart.server.service;//package cn.axzo.nanopart.black_list.service;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.api.request.BlackAndWhiteListReq;
import cn.axzo.nanopart.api.response.BlackAndWhiteListResp;
import java.util.List;
/**
* @author chenwenjian
* @date 2023/8/11 17:00
* @description
* @modifiedBy
* @version: 1.0
*/
public interface BlackAndWhiteListService {
ApiResult<Long> create(BlackAndWhiteListReq req);
ApiResult<Void> delete(BlackAndWhiteListReq req);
ApiResult<List<BlackAndWhiteListResp>> detail(BlackAndWhiteListReq req);
}

View File

@ -0,0 +1,53 @@
package cn.axzo.nanopart.server.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.api.request.BlackAndWhiteListReq;
import cn.axzo.nanopart.api.response.BlackAndWhiteListResp;
import cn.axzo.nanopart.server.dao.entity.SaasBlackWhiteList;
import cn.axzo.nanopart.server.dao.repository.BlackAndWhiteListRepository;
import cn.axzo.nanopart.server.service.BlackAndWhiteListService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author chenwenjian
* @date 2023/8/11 17:04
* @description 黑白名单service层
* @modifiedBy
* @version: 1.0
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class BlackAndWhiteListServiceImpl implements BlackAndWhiteListService {
private final BlackAndWhiteListRepository blackAndWhiteListRepository;
@Override
public ApiResult<Long> create(BlackAndWhiteListReq req) {
SaasBlackWhiteList blackWhiteList = BeanMapper.copyBean(req, SaasBlackWhiteList.class);
blackAndWhiteListRepository.save(blackWhiteList);
return ApiResult.ok(blackWhiteList.getId());
}
@Override
public ApiResult<Void> delete(BlackAndWhiteListReq req) {
blackAndWhiteListRepository.delete(req);
return ApiResult.ok();
}
@Override
public ApiResult<List<BlackAndWhiteListResp>> detail(BlackAndWhiteListReq req) {
List<SaasBlackWhiteList> saasBlackWhiteLists = blackAndWhiteListRepository.detail(req);
List<BlackAndWhiteListResp> blackAndWhiteListResps = BeanMapper.copyList(saasBlackWhiteLists, BlackAndWhiteListResp.class, (saasBlackWhiteList, blackAndWhiteListResp) -> {
JSONObject jsonObject = new JSONObject(saasBlackWhiteList.getParam());
blackAndWhiteListResp.setParam(jsonObject.toString());
});
return ApiResult.ok(blackAndWhiteListResps);
}
}

View File

@ -19,4 +19,11 @@
<module>black-list-service</module>
</modules>
<!-- <dependencies>-->
<!-- <dependency>-->
<!-- <groupId>cn.axzo.infra</groupId>-->
<!-- <artifactId>axzo-bom</artifactId>-->
<!-- <version>2.0.0-SNAPSHOT</version>-->
<!-- </dependency>-->
<!-- </dependencies>-->
</project>

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>nanopart</artifactId>
<groupId>cn.axzo.nanopart</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>nanopart-api</artifactId>
<packaging>jar</packaging>
<name>nanopart-api</name>
<dependencies>
<dependency>
<groupId>cn.axzo.framework</groupId>
<artifactId>axzo-consumer-spring-cloud-starter</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,57 +0,0 @@
package cn.axzo.nanopart.client;
import cn.axzo.framework.domain.page.PageQO;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.framework.domain.web.ApiException;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.client.feign.MicroArchetypeApi;
import cn.axzo.nanopart.client.model.NewUserReq;
import cn.axzo.nanopart.client.model.QueryUserReq;
import cn.axzo.nanopart.client.model.UpdateUserReq;
import cn.axzo.nanopart.client.model.UserRes;
import cn.azxo.framework.common.model.CommonResponse;
import lombok.RequiredArgsConstructor;
import javax.validation.Valid;
/**
* @Author: liyong.tian
* @Date: 2022/9/17
* @Description:
*/
@RequiredArgsConstructor
public class MicroArchetypeClient {
private final MicroArchetypeApi api;
/**
* 老项目迁移使用
*/
public UserRes createUser(@Valid NewUserReq req) {
CommonResponse<UserRes> apiResult = api.createUser(req);
if (apiResult.getCode() == 200) {
return apiResult.getData();
}
throw new RuntimeException(apiResult.getMsg());
}
/**
* 新项目使用
*/
public UserRes updateUser(Long id, @Valid UpdateUserReq req) {
ApiResult<UserRes> apiResult = api.updateUser(id, req);
if (apiResult.isSuccess()) {
return apiResult.getData();
}
throw new ApiException(apiResult.getRespCode());
}
public PageResp<UserRes> fetchUsers(QueryUserReq req, PageQO page) {
ApiPageResult<UserRes> apiPageResult = api.fetchUsers(req.toQueryMap(), page);
if (apiPageResult.isSuccess()) {
return apiPageResult.toPage();
}
throw new ApiException(apiPageResult.getRespCode());
}
}

View File

@ -1,30 +0,0 @@
package cn.axzo.nanopart.client.config;
import cn.axzo.nanopart.client.feign.MicroArchetypeApi;
import cn.axzo.nanopart.client.MicroArchetypeClient;
import cn.axzo.nanopart.client.feign.MicroArchetypeFallbackFactory;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: liyong.tian
* @Date: 2022/9/17
* @Description:
*/
@EnableFeignClients(basePackages = {"cn.axzo.nanopart.client"})
@Configuration
public class MicroArchetypeClientAutoConfiguration {
@Bean
public MicroArchetypeFallbackFactory microArchetypeFallbackFactory() {
return new MicroArchetypeFallbackFactory();
}
@Bean
public MicroArchetypeClient microArchetypeClient(MicroArchetypeApi microArchetypeApi) {
return new MicroArchetypeClient(microArchetypeApi);
}
}

View File

@ -1,34 +0,0 @@
package cn.axzo.nanopart.client.feign;
import cn.axzo.framework.context.client.QueryMap;
import cn.axzo.framework.domain.page.PageQO;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.client.model.NewUserReq;
import cn.axzo.nanopart.client.model.UpdateUserReq;
import cn.axzo.nanopart.client.model.UserRes;
import cn.azxo.framework.common.model.CommonResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
/**
* @Author: liyong.tian
* @Date: 2022/9/17
* @Description:
*/
@FeignClient(name = "nanopart", url = "http://localhost:8899", fallbackFactory = MicroArchetypeFallbackFactory.class)
public interface MicroArchetypeApi {
@PostMapping(value = "/api/v1/users", consumes = APPLICATION_JSON_VALUE)
CommonResponse<UserRes> createUser(@RequestBody NewUserReq req);
@PutMapping(value = "/api/v2/users/{id}", consumes = APPLICATION_JSON_VALUE)
ApiResult<UserRes> updateUser(@PathVariable("id") Long id, @RequestBody UpdateUserReq req);
@GetMapping(value = "/api/v2/users")
ApiPageResult<UserRes> fetchUsers(@RequestParam Map<String, Object> query, PageQO page);
}

View File

@ -1,53 +0,0 @@
package cn.axzo.nanopart.client.feign;
import cn.axzo.framework.client.feign.FeignFallback;
import cn.axzo.framework.domain.page.PageQO;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.framework.jackson.utility.JSON;
import cn.axzo.nanopart.client.model.NewUserReq;
import cn.axzo.nanopart.client.model.UpdateUserReq;
import cn.axzo.nanopart.client.model.UserRes;
import cn.azxo.framework.common.model.CommonResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
/**
* @Author: liyong.tian
* @Date: 2022/9/17
* @Description:
*/
@Slf4j
@RequiredArgsConstructor
public class MicroArchetypeApiFallback implements MicroArchetypeApi {
private final FeignFallback fallback;
/**
* 老项目迁移使用
* @param req
* @return
*/
@Override
public CommonResponse<UserRes> createUser(NewUserReq req) {
log.error("[nanopart-api] createUser fallback", fallback.getCause());
return CommonResponse.error("创建用户失败");
}
/**
* 新项目推荐使用
*/
@Override
public ApiResult<UserRes> updateUser(Long id, UpdateUserReq req) {
log.error("[nanopart-api] updateUser fallback", fallback.getCause());
return fallback.resp();
}
@Override
public ApiPageResult<UserRes> fetchUsers(Map<String, Object> query, PageQO page) {
log.error("[nanopart-api] fetchUsers fallback", fallback.getCause());
return fallback.pageResp();
}
}

View File

@ -1,19 +0,0 @@
package cn.axzo.nanopart.client.feign;
import cn.axzo.framework.client.feign.FeignFallback;
import cn.axzo.framework.domain.web.code.IRespCode;
import cn.axzo.framework.domain.web.code.RespCode;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class MicroArchetypeFallbackFactory implements FallbackFactory<MicroArchetypeApiFallback> {
// TODO: 2022/11/3 100-调整为具体的项目编号XXX-调整为项目名
private final IRespCode respCode = new RespCode("100" + "91001", "XXX服务不可用");
@Override
public MicroArchetypeApiFallback create(Throwable cause) {
return new MicroArchetypeApiFallback(new FeignFallback(cause, respCode));
}
}

View File

@ -1,29 +0,0 @@
package cn.axzo.nanopart.client.model;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @Author: liyong.tian
* @Date: 2022/9/2
* @Description:
*/
@Data
public class NewUserReq {
@NotBlank(message = "名称不能为空")
private String name;
@NotNull
private Integer sex;
private Integer age;
private String phone;
private String email;
private String address;
}

View File

@ -1,22 +0,0 @@
package cn.axzo.nanopart.client.model;
import cn.axzo.framework.context.client.IQueryMap;
import cn.axzo.framework.context.client.QueryMap;
import lombok.Data;
@Data
public class QueryUserReq implements IQueryMap {
private Long id;
private String name;
private String phone;
private String email;
@Override
public void append(QueryMap.Builder builder) {
builder.put("id", id).put("name", name).put("phone", phone).put("email", email);
}
}

View File

@ -1,19 +0,0 @@
package cn.axzo.nanopart.client.model;
import lombok.Data;
@Data
public class UpdateUserReq {
private String name;
private Integer sex;
private Integer age;
private String phone;
private String email;
private String address;
}

View File

@ -1,21 +0,0 @@
package cn.axzo.nanopart.client.model;
import lombok.Data;
@Data
public class UserRes {
private Long id;
private String name;
private Integer sex;
private Integer age;
private String phone;
private String email;
private String address;
}

View File

@ -1,2 +0,0 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.axzo.nanopart.client.config.MicroArchetypeClientAutoConfiguration

View File

@ -1,14 +0,0 @@
package cn.axzo.maven.archetype.client;
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 {
}

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>nanopart</artifactId>
<groupId>cn.axzo.nanopart</groupId>
<artifactId>nanopart</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nanopart-server</artifactId>
<packaging>jar</packaging>
@ -50,5 +50,11 @@
<groupId>cn.axzo.framework</groupId>
<artifactId>axzo-logger-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.nanopart</groupId>
<artifactId>black-list</artifactId>
<version>2.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@ -1,4 +1,4 @@
package cn.axzo.nanopart.server;
package cn.axzo.nanopart;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan(value = {"cn.axzo.**.mapper"})
@SpringBootApplication
public class NanopartApplication {
public static void main(String[] args) {
SpringApplication.run(NanopartApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(NanopartApplication.class, args);
}
}

View File

@ -1,27 +0,0 @@
package cn.axzo.nanopart.server.common.enums;
import cn.axzo.framework.domain.web.code.IProjectRespCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description: 响应码规范一共8位取值范围0~93位项目编号(首位不能为0)+2位模块编号+3位自定义编号
*/
@Getter
@AllArgsConstructor
public enum ErrorCode implements IProjectRespCode {
USER_NOT_EXISTS("01001", "用户不存在id=%s"),
USER_PHONE_EMAIL_IS_NULL("01002", "电话和邮箱不能都为空");
private String code;
private String message;
@Override
public String getProjectCode() {
// 根据不同项目进行项目编码调整可联系框架组获取项目编号(首位不能为0)
return "100";
}
}

View File

@ -1,88 +0,0 @@
package cn.axzo.nanopart.server.common.enums;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
public enum ResultCode {
/**
* 成功 [GET]
*/
SUCCESS(200),
/**
* [POST/PUT/PATCH] 用户新建或修改数据成功
*/
CREATED(201),
/**
* [*] 标识一个请求已经进入后台排队 (异步任务)
*/
ACCEPTED(202),
/**
* [DELETE]: 用户删除数据成功
*/
NO_CONTENT(204),
/**
* [POST/PUT/PATCH] 用户发出的请求有错误, 服务器没有进行新建或修改数据的操作, 该操作是幂等的.
*/
FAIL(400),
/**
* [*] 标识没有权限 (令牌用户名密码错误)
*/
UNAUTHORIZED(401),
/**
* [*] 标识用户得到授权(与401错误相对), 但是访问是被禁止的
*/
FORBIDDEN(403),
/**
* [*] 用户发出的请求针对的是不存在的记录, 服务器没有进行操作
*/
NOT_FOUND(404),
/**
* [GET] 用户请求的格式不可得 (比如用户请求JSON格式, 但是只有XML格式)
*/
NOT_ACCEPTABLE(406),
/**
* [GET] 用户请求的资源被永久删除, 且不会再得到
*/
GONE(410),
/**
* [POST/PUT/PATCH] 当创建一个对象时, 发生一个验证错误646
*/
UNPROCESSABLE_ENTITY(422),
/**
* 服务器内部错误
*/
INTERNAL_SERVER_ERROR(9999),
/**
* 通用业务异常
*/
SERVICE_EXCEPTION_ERROR(9998),
/**
* ####业务的响应码####
* 按业务依次划分 :
* 一共6位, 第6位是业务代码 第1-5位响应码, 按业务不同码不同
* #100000 全局级别
*/
/**
* 100001 当前用户被强制下线
*/
CUSTOM_100001(100001),
/**
* 确认弹窗响应码
*/
CUSTOM_100002(100002);
public int code;
ResultCode(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.common.util;

View File

@ -1,259 +0,0 @@
package cn.axzo.nanopart.server.config.filter;
import cn.azxo.framework.common.constatns.Constants;
import cn.azxo.framework.common.utils.LogUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.google.common.base.Strings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import org.springframework.web.util.WebUtils;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* @Author: liyong.tian
* @Date: 2022/12/6 14:48
* @Description: Http接口日志记录
*/
@Slf4j
@Component
public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered {
private static final String X_REQUEST_ID = "x-request-id";
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE - 10;
}
@Override
@Trace(operationName = "HttpTraceLogFilter")
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = uri.substring(contextPath.length());
//swagger 跳过
if (url.contains("api-docs") || url.contains("swagger") || url.contains("checkDeath")) {
filterChain.doFilter(request, response);
return;
}
//静态资源 跳过
if (url.contains(".")) {
filterChain.doFilter(request, response);
return;
}
if (!(request instanceof ContentCachingRequestWrapper)) {
request = new ContentCachingRequestWrapper(request);
}
if (!(response instanceof ContentCachingResponseWrapper)) {
response = new ContentCachingResponseWrapper(response);
}
String requestId = request.getHeader(X_REQUEST_ID);
if (Strings.isNullOrEmpty(requestId)) {
MDC.put(X_REQUEST_ID, getTraceId());
} else {
MDC.put(X_REQUEST_ID, requestId);
}
String ctxLogId = request.getHeader(Constants.CTX_LOG_ID_MDC);
if (Strings.isNullOrEmpty(ctxLogId)) {
MDC.put(Constants.CTX_LOG_ID_MDC, getTraceId());
} else {
MDC.put(Constants.CTX_LOG_ID_MDC, ctxLogId);
}
// 获取请求参数
String parameter = null;
String requestContentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
if (requestContentType != null) {
if (requestContentType.startsWith(MediaType.APPLICATION_JSON_VALUE)) {
//Json
WrappedHttpServletRequest requestWrapper = new WrappedHttpServletRequest(request);
parameter = getRequestBody(requestWrapper);
request = requestWrapper;
} else if (requestContentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
//普通表单提交
parameter = JSON.toJSONString(request.getParameterMap());
} else if (requestContentType.startsWith(MediaType.MULTIPART_FORM_DATA_VALUE)) {
//文件表单提交
parameter = JSON.toJSONString("文件类型");
}
} else if (url.startsWith("/api")) {
if ("GET".equals(request.getMethod())) {
parameter = JSON.toJSONString(request.getParameterMap());
} else if ("POST".equals(request.getMethod())) {
WrappedHttpServletRequest requestWrapper = new WrappedHttpServletRequest(request);
parameter = getRequestBody(requestWrapper);
request = requestWrapper;
}
} else if ("GET".equals(request.getMethod())) {
parameter = JSON.toJSONString(request.getParameterMap());
}
long requestTime = System.currentTimeMillis();
try {
filterChain.doFilter(request, response);
} finally {
response.setHeader(Constants.CTX_LOG_ID_MDC, MDC.get(Constants.CTX_LOG_ID_MDC));
response.setHeader(X_REQUEST_ID, MDC.get(Constants.CTX_LOG_ID_MDC));
long latency = System.currentTimeMillis() - requestTime;
String responseBody = null;
int responseStatus = response.getStatus();
String responseContentType = response.getContentType();
//Json
if (responseContentType != null && responseContentType
.startsWith(MediaType.APPLICATION_JSON_VALUE)) {
responseBody = getResponseBody(response);
}
//记录日志
HttpTraceLog traceLog = new HttpTraceLog();
traceLog.setRequestContentType(requestContentType);
traceLog.setPath(url);
traceLog.setMethod(request.getMethod());
traceLog.setTimeTaken(latency);
traceLog.setParameter(parameter);
traceLog.setResponseContentType(responseContentType);
traceLog.setStatus(responseStatus);
traceLog.setResponseBody(responseBody);
traceLog.setRequestHeaders(getRequestHeader(request));
if (traceLog.getResponseCode() != null && traceLog.getResponseCode().equals(9999)) {
LogUtil.error(LogUtil.ErrorLevel.P0, LogUtil.ErrorType.ERROR_BUSINESS, JSON.toJSONString(traceLog));
} else if (traceLog.getResponseCode() != null && traceLog.getResponseCode().equals(9998)) {
log.warn(JSON.toJSONString(traceLog));
} else {
log.info(JSON.toJSONString(traceLog));
}
updateResponse(response);
// 清理链路id
MDC.clear();
}
}
private String getTraceId() {
String contextTraceId = TraceContext.traceId();
return Strings.isNullOrEmpty(contextTraceId)
? UUID.randomUUID().toString().replaceAll("-", "") : contextTraceId;
}
private String getRequestBody(WrappedHttpServletRequest request) throws IOException {
// 获取请求参数
return request.getRequestParams();
}
@Trace(operationName = "HttpTraceLogFilter#getResponseBody")
private String getResponseBody(HttpServletResponse response) {
String responseBody = null;
ContentCachingResponseWrapper wrapper = WebUtils
.getNativeResponse(response, ContentCachingResponseWrapper.class);
if (wrapper != null) {
responseBody = new String(wrapper.getContentAsByteArray(), StandardCharsets.UTF_8);
}
return responseBody;
}
public Map<String, String> getRequestHeader(HttpServletRequest request) {
Map<String, String> ret = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
ret.put(headerName, request.getHeader(headerName));
}
return ret;
}
@Trace(operationName = "HttpTraceLogFilter#updateResponse")
private void updateResponse(HttpServletResponse response) throws IOException {
ContentCachingResponseWrapper responseWrapper = WebUtils
.getNativeResponse(response, ContentCachingResponseWrapper.class);
Objects.requireNonNull(responseWrapper).copyBodyToResponse();
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
private static class HttpTraceLog {
/**
* 路径
*/
private String path;
/**
* 参数
*/
@JSONField(jsonDirect = true)
private String parameter;
private String requestContentType;
private String responseContentType;
private String method;
private Long timeTaken;
private Integer status;
/**
* 业务Code
*/
private Integer responseCode;//业务返回码
/**
* 响应参数
*/
@JSONField(jsonDirect = true)
private String responseBody;
@JSONField(jsonDirect = true)
private Map<String, String> requestHeaders;
public String getParameter() {
if (parameter == null) {
return parameter;
} else {
return parameter.replaceAll("\n", "").replaceAll("\t", "").replaceAll("\r", "");
}
}
public String getResponseBody() {
if (responseBody == null) {
return responseBody;
} else {
return responseBody.replaceAll("\n", "").replaceAll("\t", "").replaceAll("\r", "");
}
}
public void setResponseBody(String responseBody) {
if (StringUtils.isBlank(responseBody)) {
return;
}
this.responseBody = responseBody;
JSONObject responseJson = null;
try {
responseJson = JSONObject.parseObject(responseBody);
this.responseCode = responseJson.getInteger("code");
} catch (JSONException e) {
log.debug("ResponseBody非JSON返回", e);
}
}
}
}

View File

@ -1,91 +0,0 @@
package cn.axzo.nanopart.server.config.filter;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
/**
* @Author: liyong.tian
* @Date: 2022/12/6 14:56
* @Description:
*/
public class WrappedHttpServletRequest extends HttpServletRequestWrapper {
private byte[] bytes;
private WrappedServletInputStream wrappedServletInputStream;
public WrappedHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
// 读取输入流里的请求参数并保存到bytes里
bytes = IOUtils.toByteArray(request.getInputStream());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
this.wrappedServletInputStream = new WrappedServletInputStream(byteArrayInputStream);
// 很重要把post参数重新写入请求流
reWriteInputStream();
}
/**
* 把参数重新写进请求里
*/
public void reWriteInputStream() {
wrappedServletInputStream
.setStream(new ByteArrayInputStream(bytes != null ? bytes : new byte[0]));
}
@Override
public ServletInputStream getInputStream() throws IOException {
return wrappedServletInputStream;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(wrappedServletInputStream));
}
/**
* 获取post参数可以自己再转为相应格式
*/
public String getRequestParams() throws IOException {
return new String(bytes, this.getCharacterEncoding());
}
private class WrappedServletInputStream extends ServletInputStream {
private InputStream stream;
public WrappedServletInputStream(InputStream stream) {
this.stream = stream;
}
public void setStream(InputStream stream) {
this.stream = stream;
}
@Override
public int read() throws IOException {
return stream.read();
}
@Override
public boolean isFinished() {
return true;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
}
}
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.config;

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.consumer;

View File

@ -1,22 +0,0 @@
package cn.axzo.nanopart.server.controller;
import cn.axzo.framework.web.http.ApiResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: liyong.tian
* @Date: 2022/11/25 18:00
* @Description: 健康检查接口
*/
@RestController
public class HealthCheckController {
/**
* 探活
*/
@GetMapping("/checkDeath")
public ApiResponse<String> checkDeath() {
return ApiResponse.ok("ok");
}
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.controller.app;

View File

@ -1,76 +0,0 @@
package cn.axzo.nanopart.server.controller.web;
import cn.axzo.nanopart.server.service.user.UserService;
import cn.axzo.nanopart.server.service.dto.request.user.NewUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UpdateUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO;
import cn.axzo.nanopart.server.service.dto.response.user.UserVO;
import cn.azxo.framework.common.model.CommonPageResponse;
import cn.azxo.framework.common.model.CommonResponse;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @Author: liyong.tian
* @Date: 2022/9/2
* @Description:
*/
@Slf4j
@Api(tags = "web-用户信息接口")
@ApiSupport(author = "田立勇")
@RequestMapping("/api/v1")
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@ApiOperation(value = "创建用户")
@PostMapping("/users")
public CommonResponse<UserVO> createUser(@Valid @RequestBody NewUserDTO dto) {
log.info("REST request to save user : {}", dto);
// 校验入参
dto.valid();
UserVO result = userService.create(dto);
return CommonResponse.success(result);
}
@ApiOperation(value = "修改用户")
@PutMapping("/users/{id}")
public CommonResponse<UserVO> updateUser(@ApiParam("用户ID") @PathVariable Long id,
@Valid @RequestBody UpdateUserDTO dto) {
log.info("REST request to update user : {}", dto);
// 校验入参
dto.valid();
UserVO result = userService.update(id, dto);
return CommonResponse.success(result);
}
@ApiOperation("获取用户列表")
@GetMapping("/users")
public CommonResponse<CommonPageResponse<UserVO>> getUsers(@Valid UserQO userQO) {
CommonPageResponse<UserVO> results = userService.queryByPage(userQO);
return CommonResponse.success(results);
}
@ApiOperation("获取用户详情")
@GetMapping("/users/{id}")
public CommonResponse getUser(@ApiParam("用户ID") @PathVariable Long id) {
UserVO result = userService.getOne(id);
return CommonResponse.success(result);
}
@ApiOperation("删除用户")
@DeleteMapping("/users/{id}")
public CommonResponse deleteUser(@ApiParam("用户ID") @PathVariable Long id) {
userService.delete(id);
return CommonResponse.success();
}
}

View File

@ -1,78 +0,0 @@
package cn.axzo.nanopart.server.controller.web;
import cn.axzo.framework.domain.page.PageQO;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.framework.web.http.ApiResponse;
import cn.axzo.framework.web.http.ApiPageResponse;
import cn.axzo.nanopart.server.service.dto.request.user.NewUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UpdateUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO1;
import cn.axzo.nanopart.server.service.dto.response.user.UserVO;
import cn.axzo.nanopart.server.service.user.UserService;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @Author: liyong.tian
* @Date: 2022/10/28
* @Description: 新项目搭建推荐方式
*/
@Slf4j
@Api(tags = "web-用户信息接口")
@ApiSupport(author = "田立勇")
@RequestMapping("/api/v2")
@RestController
@RequiredArgsConstructor
public class UserResource {
private final UserService userService;
@ApiOperation(value = "创建用户")
@PostMapping("/users")
public ApiResponse<UserVO> createUser(@Valid @RequestBody NewUserDTO dto) {
log.info("REST request to save user : {}", dto);
// 校验入参
dto.valid();
UserVO result = userService.create(dto);
return ApiResponse.ok(result);
}
@ApiOperation(value = "修改用户")
@PutMapping("/users/{id}")
public ApiResponse<UserVO> updateUser(@ApiParam("用户ID") @PathVariable Long id,
@Valid @RequestBody UpdateUserDTO dto) {
log.info("REST request to update user : {}", dto);
// 校验入参
dto.valid();
UserVO result = userService.update(id, dto);
return ApiResponse.ok(result);
}
@ApiOperation("获取用户列表")
@GetMapping("/users")
public ApiPageResponse<UserVO> getUsers(@ModelAttribute UserQO1 userQo, PageQO page) {
PageResp<UserVO> results = userService.find(userQo, page);
return ApiPageResponse.ok(results);
}
@ApiOperation("获取用户详情")
@GetMapping("/users/{id}")
public ApiResponse<UserVO> getUser(@ApiParam("用户ID") @PathVariable Long id) {
UserVO result = userService.getOne(id);
return ApiResponse.ok(result);
}
@ApiOperation("删除用户")
@DeleteMapping("/users/{id}")
public ApiResponse deleteUser(@ApiParam("用户ID") @PathVariable Long id) {
userService.delete(id);
return ApiResponse.ok();
}
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.job;

View File

@ -1,55 +0,0 @@
package cn.axzo.nanopart.server.repository;
import cn.axzo.framework.domain.page.PageQO;
import cn.axzo.nanopart.server.repository.mapper.UserMapper;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO1;
import cn.axzo.nanopart.server.repository.entity.user.User;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
@Repository
@RequiredArgsConstructor
public class UserDao extends ServiceImpl<UserMapper, User> {
private final UserMapper userMapper;
public User findById(Long id) {
return userMapper.selectById(id);
}
public void delete(Long id) {
userMapper.deleteById(id);
}
public IPage<User> queryByPage(UserQO userQO) {
return userMapper.selectPage(userQO.toPage(),
Wrappers.lambdaQuery(User.class)
.eq(userQO.getId() != null, User::getId, userQO.getId())
.like(StringUtils.isNotBlank(userQO.getName()), User::getName, userQO.getName())
.like(StringUtils.isNotBlank(userQO.getPhone()), User::getPhone, userQO.getPhone())
.like(StringUtils.isNotBlank(userQO.getEmail()), User::getEmail, userQO.getEmail())
.orderByDesc(User::getCreateAt)
);
}
public IPage<User> find(UserQO1 userQO, PageQO page) {
return userMapper.selectPage(page.toPage(),
Wrappers.lambdaQuery(User.class)
.eq(userQO.getId() != null, User::getId, userQO.getId())
.like(StringUtils.isNotBlank(userQO.getName()), User::getName, userQO.getName())
.like(StringUtils.isNotBlank(userQO.getPhone()), User::getPhone, userQO.getPhone())
.like(StringUtils.isNotBlank(userQO.getEmail()), User::getEmail, userQO.getEmail())
.orderByDesc(User::getCreateAt)
);
}
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.repository.entity;

View File

@ -1,27 +0,0 @@
package cn.axzo.nanopart.server.repository.entity.user;
import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
@Data
@TableName("b_user")
public class User extends BaseEntity<User> {
private String name;
private Integer sex;
private Integer age;
private String phone;
private String email;
private String address;
}

View File

@ -1,14 +0,0 @@
package cn.axzo.nanopart.server.repository.mapper;
import cn.axzo.nanopart.server.repository.entity.user.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -1,15 +0,0 @@
package cn.axzo.nanopart.server.service.converter;
import java.util.List;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
public interface EntityConverter<V, E>{
V toVo(E var);
List<V> toVo(List<E> var);
}

View File

@ -1,26 +0,0 @@
package cn.axzo.nanopart.server.service.converter;
import cn.axzo.nanopart.server.service.dto.request.user.NewUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UpdateUserDTO;
import cn.axzo.nanopart.server.service.dto.response.user.UserVO;
import cn.axzo.nanopart.server.repository.entity.user.User;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import static org.mapstruct.NullValueCheckStrategy.ALWAYS;
/**
* @Author: liyong.tian
* @Date: 2022/9/2
* @Description:
*/
@Mapper(
componentModel = "spring",
nullValueCheckStrategy = ALWAYS
)
public interface UserConverter extends EntityConverter<UserVO, User> {
User toEntity(NewUserDTO dto);
void updateEntity(UpdateUserDTO dto, @MappingTarget User user);
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.service.dto.request;

View File

@ -1,44 +0,0 @@
package cn.axzo.nanopart.server.service.dto.request.user;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @Author: liyong.tian
* @Date: 2022/9/2
* @Description:
*/
@Data
public class NewUserDTO {
@ApiModelProperty(value = "名称", position = 1)
@NotBlank(message = "名称不能为空")
private String name;
@ApiModelProperty(value = "性别", position = 2)
@NotNull
private Integer sex;
@ApiModelProperty(value = "年龄", position = 3)
private Integer age;
@ApiModelProperty(value = "电话", position = 4)
private String phone;
@ApiModelProperty(value = "邮箱", position = 5)
private String email;
@ApiModelProperty(value = "地址", position = 6)
private String address;
public void valid() {
// 电话和邮箱不能都为空
if (StringUtils.isEmpty(phone) && StringUtils.isEmpty(email)) {
throw new RuntimeException("电话和邮箱不能都为空");
}
}
}

View File

@ -1,47 +0,0 @@
package cn.axzo.nanopart.server.service.dto.request.user;
import cn.axzo.framework.domain.web.ApiException;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import static cn.axzo.nanopart.server.common.enums.ErrorCode.USER_PHONE_EMAIL_IS_NULL;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
@Data
public class UpdateUserDTO {
@ApiModelProperty(value = "名称", position = 1)
@NotBlank(message = "名称不能为空")
private String name;
@ApiModelProperty(value = "性别", position = 2)
@NotNull
private Integer sex;
@ApiModelProperty(value = "年龄", position = 3)
private Integer age;
@ApiModelProperty(value = "电话", position = 4)
private String phone;
@ApiModelProperty(value = "邮箱", position = 5)
private String email;
@ApiModelProperty(value = "地址", position = 6)
private String address;
public void valid() {
// 电话和邮箱不能都为空
if (StringUtils.isEmpty(phone) && StringUtils.isEmpty(email)) {
throw new ApiException(USER_PHONE_EMAIL_IS_NULL);
}
}
}

View File

@ -1,26 +0,0 @@
package cn.axzo.nanopart.server.service.dto.request.user;
import cn.axzo.framework.domain.page.PageQO;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
@Data
public class UserQO extends PageQO {
@ApiParam("主键")
private Long id;
@ApiParam("姓名")
private String name;
@ApiParam("手机")
private String phone;
@ApiParam("邮箱")
private String email;
}

View File

@ -1,26 +0,0 @@
package cn.axzo.nanopart.server.service.dto.request.user;
import cn.axzo.framework.domain.page.PageQO;
import io.swagger.annotations.ApiParam;
import lombok.Data;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
@Data
public class UserQO1 {
@ApiParam("主键")
private Long id;
@ApiParam("姓名")
private String name;
@ApiParam("手机")
private String phone;
@ApiParam("邮箱")
private String email;
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.service.dto.response;

View File

@ -1,34 +0,0 @@
package cn.axzo.nanopart.server.service.dto.response.user;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author: liyong.tian
* @Date: 2022/9/2
* @Description:
*/
@Data
public class UserVO {
@ApiModelProperty(value = "id", position = 1)
private Long id;
@ApiModelProperty(value = "名称", position = 2)
private String name;
@ApiModelProperty(value = "性别", position = 3)
private Integer sex;
@ApiModelProperty(value = "年龄", position = 4)
private Integer age;
@ApiModelProperty(value = "电话", position = 5)
private String phone;
@ApiModelProperty(value = "邮箱", position = 6)
private String email;
@ApiModelProperty(value = "地址", position = 7)
private String address;
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.service.event;

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.service.manager;

View File

@ -1,29 +0,0 @@
package cn.axzo.nanopart.server.service.user;
import cn.axzo.framework.domain.page.PageQO;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.nanopart.server.service.dto.request.user.NewUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UpdateUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO1;
import cn.axzo.nanopart.server.service.dto.response.user.UserVO;
import cn.azxo.framework.common.model.CommonPageResponse;
/**
* @Author: liyong.tian
* @Date: 2022/9/2
* @Description:
*/
public interface UserService {
UserVO create(NewUserDTO dto);
UserVO update(Long id, UpdateUserDTO dto);
UserVO getOne(Long id);
void delete(Long id);
CommonPageResponse<UserVO> queryByPage(UserQO userQO);
PageResp<UserVO> find(UserQO1 userQo, PageQO page);
}

View File

@ -1,82 +0,0 @@
package cn.axzo.nanopart.server.service.user.impl;
import cn.axzo.framework.domain.page.PageQO;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.framework.domain.web.ApiException;
import cn.axzo.nanopart.server.common.enums.ErrorCode;
import cn.axzo.nanopart.server.service.dto.request.user.NewUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UpdateUserDTO;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO;
import cn.axzo.nanopart.server.service.dto.request.user.UserQO1;
import cn.axzo.nanopart.server.service.dto.response.user.UserVO;
import cn.axzo.nanopart.server.repository.entity.user.User;
import cn.axzo.nanopart.server.repository.UserDao;
import cn.axzo.nanopart.server.service.user.UserService;
import cn.axzo.nanopart.server.service.converter.UserConverter;
import cn.azxo.framework.common.model.CommonPageResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author: liyong.tian
* @Date: 2022/9/2
* @Description:
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserConverter userConverter;
private final UserDao userDao;
@Override
public UserVO create(NewUserDTO dto) {
User user = userConverter.toEntity(dto);
userDao.save(user);
return userConverter.toVo(user);
}
@Override
public UserVO update(Long id, UpdateUserDTO dto) {
User user = userDao.findById(id);
if (user == null) {
throw new ApiException(ErrorCode.USER_NOT_EXISTS, id);
}
userConverter.updateEntity(dto, user);
return userConverter.toVo(user);
}
@Override
public UserVO getOne(Long id) {
User user = userDao.findById(id);
return userConverter.toVo(user);
}
@Override
public void delete(Long id) {
userDao.delete(id);
}
@Override
public CommonPageResponse<UserVO> queryByPage(UserQO userQo) {
IPage<User> page = userDao.queryByPage(userQo);
List<User> userList = page.getRecords();
if (CollectionUtils.isEmpty(userList)) {
return CommonPageResponse.zero(userQo.getPage(), userQo.getPageSize());
}
return new CommonPageResponse<>(page.getCurrent(), page.getSize(), page.getTotal(), userConverter.toVo(page.getRecords()));
}
@Override
public PageResp<UserVO> find(UserQO1 userQo, PageQO page) {
IPage<User> userPage = userDao.find(userQo, page);
return PageResp.list(userPage, userConverter.toVo(userPage.getRecords()));
}
}

View File

@ -1 +0,0 @@
package cn.axzo.nanopart.server.service.validator;

View File

@ -1,14 +0,0 @@
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 {
}

View File

@ -25,8 +25,8 @@
</properties>
<modules>
<module>nanopart-server</module>
<module>black-list</module>
<module>nanopart-server</module>
</modules>
<dependencyManagement>