天津院项目 start

parents
Pipeline #162 failed with stages
# Created by .ignore support plugin (hsz.mobi)
### Example user template template
### Example user template
# IntelliJ project files
.idea
.idea/*
*.iml
out
gen
/rebel.xml
/logs/*
/target
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
<?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">
<parent>
<artifactId>tianjin-cement</artifactId>
<groupId>cn.wise.sc.tjcement</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cement-business</artifactId>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.1</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<version>5.1.45</version>-->
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>cn.wise.sc.tjcement</groupId>
<artifactId>common-swagger</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<!--<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.3.0</version>
</dependency>-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
<!-- <resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>-->
</build>
</project>
\ No newline at end of file
package cn.wise.sc.cement.business;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import java.util.TimeZone;
/**
* 启动类
*
* @author zhutianwei
*
*/
@SpringBootApplication
@MapperScan("cn.wise.sc.cement.business.mapper")
public class TJCementApplication {
public static void main(String[] args) {
// 系统默认的时区
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(TJCementApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
package cn.wise.sc.cement.business.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Configuration
public class DateConfig {
/** 默认日期时间格式 */
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/** 默认日期格式 */
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
/** 默认时间格式 */
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
/**
* LocalDate转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalDate> localDateConverter() {
return new Converter<String, LocalDate>() {
@Override
public LocalDate convert(String source) {
return LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT));
}
};
}
/**
* LocalDateTime转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new Converter<String, LocalDateTime>() {
@Override
public LocalDateTime convert(String source) {
return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT));
}
};
}
/**
* LocalTime转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalTime> localTimeConverter() {
return new Converter<String, LocalTime>() {
@Override
public LocalTime convert(String source) {
return LocalTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT));
}
};
}
/**
* Date转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, Date> dateConverter() {
return new Converter<String, Date>() {
@Override
public Date convert(String source) {
SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
try {
return format.parse(source);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
};
}
/**
* Json序列化和反序列化转换器,用于转换Post请求体中的json以及将我们的对象序列化为返回响应的json
*/
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
//ObjectMapper忽略多余字段
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//LocalDateTime系列序列化和反序列化模块,继承自jsr310,我们在这里修改了日期格式
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addSerializer(LocalDate.class,new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
javaTimeModule.addSerializer(LocalTime.class,new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDate.class,new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
javaTimeModule.addDeserializer(LocalTime.class,new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//Date序列化和反序列化
javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
String formattedDate = formatter.format(date);
jsonGenerator.writeString(formattedDate);
}
});
javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
String date = jsonParser.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
});
// 注册新的模块到objectMapper
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
}
\ No newline at end of file
package cn.wise.sc.cement.business.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.nio.charset.Charset;
/**
* @date :Created in 2019-03-21 10:21
* @description:用途:
*/
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
private ObjectMapper objectMapper = new ObjectMapper();
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private Class<T> clazz;
static {
//解决fastJson autoType is not support错误
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
public FastJsonRedisSerializer(Class<T> clazz) {
super();
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return new byte[0];
}
return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null || bytes.length <= 0) {
return null;
}
String str = new String(bytes, DEFAULT_CHARSET);
return JSON.parseObject(str, clazz);
}
public void setObjectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
protected JavaType getJavaType(Class<?> clazz) {
return TypeFactory.defaultInstance().constructType(clazz);
}
}
package cn.wise.sc.cement.business.config;
import cn.wise.sc.cement.business.exception.BusinessException;
import cn.wise.sc.cement.business.wrapper.WrapMapper;
import cn.wise.sc.cement.business.wrapper.Wrapper;
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@ControllerAdvice
@RestController
public class GlobalDefaultExceptionHandler extends AbstractErrorController {
@ExceptionHandler(value = RuntimeException.class)
@ResponseBody
public Wrapper defaultErrorHandler(HttpServletResponse response, BusinessException e) {
response.setStatus(e.getStatusCode().value());
return WrapMapper.error(e.getMessage());
}
public GlobalDefaultExceptionHandler(ErrorAttributes errorAttributes) {
super(errorAttributes);
}
private static final String ERROR_PATH = "/error";
@Override
public String getErrorPath() {
return ERROR_PATH;
}
@RequestMapping(value = ERROR_PATH)
public Wrapper error(HttpServletRequest request) {
WebRequest webRequest = new ServletWebRequest(request);
Throwable e = getError(webRequest);
if (e == null) {
Map<String, Object> attributes = getErrorAttributes(request, false);
Object timestamp = attributes.get("timestamp");
Object status = attributes.get("status");
String error = attributes.get("error").toString();
String message = attributes.get("message").toString();
Object path = attributes.get("path");
//todo 上线后更改为error
return WrapMapper.wrap(Integer.parseInt(status.toString()), message);
}else {
return WrapMapper.error(e.getMessage());
}
}
private Throwable getError(WebRequest webRequest) {
return (Throwable) this.getAttribute(webRequest, "javax.servlet.error.exception");
}
private Object getAttribute(RequestAttributes requestAttributes, String name) {
return requestAttributes.getAttribute(name, 0);
}
}
\ No newline at end of file
package cn.wise.sc.cement.business.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class MapStringTypeHandler<T> extends BaseTypeHandler<Map<String, T>> {
private Class<T> clazz;
//private static final TypeReference<HashMap<String, String>> mapStrStrTypeRef = new TypeReference<HashMap<String, String>>(){};
private final TypeReference<HashMap<String, T>> typeRef = new TypeReference<HashMap<String, T>>() {
};
public MapStringTypeHandler(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map<String, T> parameter, JdbcType jdbcType) throws SQLException {
String json = JSON.toJSONString(parameter);
ps.setString(i, json);
}
@Override
public Map<String, T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return parseJson(rs.getString(columnName));
}
@Override
public Map<String, T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return parseJson(rs.getString(columnIndex));
}
@Override
public Map<String, T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return parseJson(cs.getString(columnIndex));
}
private Map<String, T> parseJson(String json) {
if (String.class == clazz || Integer.class == clazz || Boolean.class == clazz) {
return JSON.parseObject(json, typeRef);
}
Map<String, T> result = new HashMap<>();
JSON.parseObject(json).forEach((k, v) -> result.put(k, JSON.parseObject(JSON.toJSONString(v), clazz)));
return result;
}
}
\ No newline at end of file
package cn.wise.sc.cement.business.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author miemie
* @since 2018-08-10
*/
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
// 开启 count 的 join 优化,只针对 left join !!!
return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true));
}
}
package cn.wise.sc.cement.business.config;
import com.alibaba.fastjson.parser.ParserConfig;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
/**
* @description:用途: @EnableCaching 开启声明式缓存支持. 之后就可以使用 @Cacheable/@CachePut/@CacheEvict 注解缓存数据.
*/
@Configuration
@EnableCaching
public class RedisCacheConfig {
private RedisConnectionFactory redisConnectionFactory;
public RedisCacheConfig(RedisConnectionFactory redisConnectionFactory) {
this.redisConnectionFactory = redisConnectionFactory;
}
// @Bean
// public Jedis jedis() {
// JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// jedisPoolConfig.setMaxTotal(80);
// jedisPoolConfig.setMinIdle(20);
// jedisPoolConfig.setMaxIdle(80);
// JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
// return jedisPool.getResource();
// }
/**
* 覆盖默认的配置
*
* @return RedisTemplate
*/
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
// 设置value的序列化规则和key的序列化规则
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
template.setDefaultSerializer(fastJsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
/**
* 解决注解方式存放到redis中的值是乱码的情况
*
* @param factory
* @return CacheManager
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
// 配置注解方式的序列化
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
RedisCacheConfiguration redisCacheConfiguration =
config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer))
//配置注解默认的过期时间
.entryTtl(Duration.ofDays(1));
// 加入白名单 https://github.com/alibaba/fastjson/wiki/enable_autotype
ParserConfig.getGlobalInstance().addAccept("cn.wise");
return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
}
}
package cn.wise.sc.cement.business.config;
import cn.wise.sc.cement.business.util.GlobalHolder;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 上下文初始化
* 以及跨域的支持
*/
public class RequestInterceptor extends HandlerInterceptorAdapter {
/**
* 拦截request和response并放到上下文中
* @param request 要拦截的request
* @param response 要拦截的response
* @param handler spring 机制传递过来的
* @return 不中断,继续执行,返回为true
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//request 和response存到 上下文中
GlobalHolder.setHttpResponse(response);
GlobalHolder.setHttpRequest(request);
return super.preHandle(request, response, handler);
}
/**
* 处理完成 从上下文中移除 request 和respseon
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
GlobalHolder.remove();
super.afterCompletion(request, response, handler, ex);
}
}
package cn.wise.sc.cement.business.config;
import cn.wise.sc.cement.business.filter.SwaggerInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.MappedInterceptor;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class Swagger2Configuration {
//api接口包扫描路径
public static final String SWAGGER_SCAN_BASE_PACKAGE = "cn.wise.sc.consume";
public static final String VERSION = "1.0.0";
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
.paths(PathSelectors.any()) // 可以根据url路径设置哪些请求加入文档,忽略哪些请求
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("came") //设置文档的标题
.description("came接口服务 API 接口文档") // 设置文档的描述
.version(VERSION) // 设置文档的版本信息-> 1.0.0 Version information
.termsOfServiceUrl("http://www.wisenergy.cn") // 设置文档的License信息->1.3 License information
.build();
}
@Value("${swagger.basic.username}")
private String username;
@Value("${swagger.basic.password}")
private String password;
/* 必须在此处配置拦截器,要不然拦不到swagger的静态资源 */
@Bean
@ConditionalOnProperty(name = "swagger.basic.enable", havingValue = "true")
public MappedInterceptor getMappedInterceptor() {
return new MappedInterceptor(new String[]{"/swagger-ui.html", "/webjars/**"}, new SwaggerInterceptor(username, password));
}
}
\ No newline at end of file
package cn.wise.sc.cement.business.config;
/**
* top地址相关配置
*
* @author openapi@dingtalk
* @date 2020/2/4
*/
public class UrlConstant {
private static final String HOST = "https://oapi.dingtalk.com";
/**
* 钉钉网关 gettoken 地址
*/
public static final String URL_GET_TOKEN = HOST + "/gettoken";
/**
* 获取 jsapi_ticket 地址
*/
public static final String URL_GET_JSTICKET = HOST + "/get_jsapi_ticket";
/**
* 获取用户在企业内 userId 的接口URL
*/
public static final String URL_GET_USER_INFO = HOST + "/user/getuserinfo";
/**
* 获取用户姓名的接口URL
*/
public static final String URL_USER_GET = HOST + "/user/get";
/**
* 获取部门列表接口URL
*/
public static final String URL_DEPARTMENT_LIST = HOST + "/department/list";
/**
* 获取部门用户接口URL
*/
public static final String URL_USER_SIMPLELIST = HOST + "/user/simplelist";
}
package cn.wise.sc.cement.business.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 加载自定义的 拦截器
*/
@Configuration
public class WebInterceptorConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/**");
}
}
package cn.wise.sc.cement.business.config.lock;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
public interface DistributedLocker {
RLock lock(String lockKey);
RLock lock(String lockKey, int timeout);
RLock lock(String lockKey, TimeUnit unit, int timeout);
boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime);
void unlock(String lockKey);
void unlock(RLock lock);
<T> T executeLock(String key, Function<String, T> consumer, String t);
<T> void executeLock(String lockKey, Consumer<T> consumer, T t);
}
\ No newline at end of file
package cn.wise.sc.cement.business.config.lock;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
public class RedissLockUtil {
private static DistributedLocker redissLock;
public static void setLocker(DistributedLocker locker) {
redissLock = locker;
}
public static RLock lock(String lockKey) {
return redissLock.lock(lockKey);
}
public static <T> T readWriteLock(String lockKey, Function<String,T> function) {
return redissLock.executeLock(lockKey,function,null);
}
public static <T> void playersLock(String lockKey, Consumer<T> consumer,T t){
redissLock.executeLock(lockKey,consumer,null);
}
public static void unlock(String lockKey) {
redissLock.unlock(lockKey);
}
public static void unlock(RLock lock) {
redissLock.unlock(lock);
}
public static RLock lock(String lockKey, int timeout) {
return redissLock.lock(lockKey, timeout);
}
public static RLock lock(String lockKey, TimeUnit unit , int timeout) {
return redissLock.lock(lockKey, unit, timeout);
}
public static boolean tryLock(String lockKey, int waitTime, int leaseTime) {
return redissLock.tryLock(lockKey, TimeUnit.SECONDS, waitTime, leaseTime);
}
public static boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
return redissLock.tryLock(lockKey, unit, waitTime, leaseTime);
}
}
\ No newline at end of file
package cn.wise.sc.cement.business.config.lock;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
@Slf4j
public class RedissonDistributedLocker implements DistributedLocker {
private RedissonClient redissonClient;
@Override
public RLock lock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
return lock;
}
@Override
public RLock lock(String lockKey, int leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(leaseTime, TimeUnit.SECONDS);
return lock;
}
@Override
public RLock lock(String lockKey, TimeUnit unit, int timeout) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(timeout, unit);
return lock;
}
@Override
public boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, unit);
} catch (InterruptedException e) {
return false;
}
}
public static void realeaseLock(RLock fairLock) {
fairLock.unlock();
}
@Override
public void unlock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.unlock();
}
@Override
public void unlock(RLock lock) {
lock.unlock();
}
@Override
public <T> T executeLock(String key, Function<String, T> function, String t) {
RLock lock = redissonClient.getLock(key);
boolean locked = false;
try {
lock.lock();
return (T) function.apply(t);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return null;
}
@Override
public <T> void executeLock(String lockKey, Consumer<T> consumer, T t) {
RLock lock = redissonClient.getLock(lockKey);
boolean locked = false;
try {
while (true) {
locked = lock.tryLock();
if (locked) break;
}
if (locked) {
consumer.accept(t);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (locked) {
lock.unlock();
}
}
}
public void setRedissonClient(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
}
\ No newline at end of file
package cn.wise.sc.cement.business.controller;
import cn.wise.sc.cement.business.entity.SysCoupon;
import cn.wise.sc.cement.business.mapper.SysCouponMapper;
import cn.wise.sc.cement.business.model.PageTableRequest;
import cn.wise.sc.cement.business.service.ISysCouponService;
import cn.wise.sc.cement.business.wrapper.WrapMapper;
import cn.wise.sc.cement.business.wrapper.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Api(tags = "优惠券管理")
@RestController
@RequestMapping("/business/sys-coupon")
public class SysCouponController {
private static final Logger log = LoggerFactory.getLogger("SysCouponController");
@Resource
private SysCouponMapper couponMapper;
@Autowired
private ISysCouponService couponService;
@ApiOperation(value = "优惠券列表(Wrapper实现)")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "current", value = "当前页数(从1开始)", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "size", value = "当前每页显示数", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "couponName", value = "企业名称", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "status", value = "状态:0禁用, 1启用", paramType = "query", dataType = "Integer")
})
@GetMapping("getList")
public Wrapper getList(PageTableRequest request, String couponName, Integer status) {
try {
QueryWrapper<SysCoupon> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(couponName)) {
wrapper.like("coupon_name", couponName);
}
if (status != null) {
wrapper.eq("status", status);
}
wrapper.orderByDesc("create_time");
IPage<SysCoupon> page = new Page<>(request.getCurrent(), request.getSize());
page = couponMapper.selectPage(page, wrapper);
return WrapMapper.wrap(200, "成功", page);
} catch (Exception e) {
log.debug("优惠券列表{}", e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "添加优惠券")
@PostMapping("save")
public Wrapper save(@RequestBody SysCoupon coupon){
try {
coupon.setStatus(1);
coupon.setIsDelete(1);
coupon.setCreateTime(LocalDateTime.now());
couponService.save(coupon);
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
log.debug("添加优惠券{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "修改优惠券")
@PostMapping("update")
public Wrapper update(@RequestBody SysCoupon coupon){
try {
SysCoupon c = couponService.getById(coupon.getId());
if(c == null){
return WrapMapper.wrap(400,"信息错误");
}
couponService.updateById(coupon);
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
log.debug("修改优惠券{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "优惠券详情")
@GetMapping("{id}")
public Wrapper getById(@PathVariable Long id){
try {
SysCoupon c = couponService.getById(id);
if(c == null){
return WrapMapper.wrap(400,"信息错误");
}
return WrapMapper.wrap(200,"成功",c);
}catch (Exception e){
log.debug("优惠券详情{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "删除优惠券")
@DeleteMapping("/{id}")
public Wrapper delete(@PathVariable Long id) {
try {
SysCoupon c = couponService.getById(id);
if (c == null ) {
return WrapMapper.wrap(400,"优惠券不存在");
}
couponService.removeById(id);
return WrapMapper.wrap(200,"成功");
}catch (Exception e) {
log.debug("删除优惠券{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "领取优惠券")
@DeleteMapping("/receive/{id}")
public Wrapper receive(@PathVariable Long id) {
try {
SysCoupon c = couponService.getById(id);
if (c == null ) {
return WrapMapper.wrap(400,"优惠券不存在");
}
c.setIsReceive(1);
couponService.updateById(c);
return WrapMapper.wrap(200,"成功");
}catch (Exception e) {
log.debug("领取优惠券{}",e);
}
return WrapMapper.error("失败");
}
}
package cn.wise.sc.cement.business.controller;
import cn.wise.sc.cement.business.entity.SysEnterprise;
import cn.wise.sc.cement.business.mapper.SysEnterpriseMapper;
import cn.wise.sc.cement.business.model.PageTableRequest;
import cn.wise.sc.cement.business.service.ISysEnterpriseService;
import cn.wise.sc.cement.business.util.RedisUtil;
import cn.wise.sc.cement.business.wrapper.WrapMapper;
import cn.wise.sc.cement.business.wrapper.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Api(tags = "企业管理")
@RestController
@RequestMapping("/business/sys-enterprise")
public class SysEnterpriseController {
private static final Logger log = LoggerFactory.getLogger("SysEnterpriseController");
@Autowired
RedisUtil redisUtil;
@Autowired
private ISysEnterpriseService enterpriseService;
@Resource
private SysEnterpriseMapper enterpriseMapper;
public String redisExample() {
redisUtil.setString("token", new Object(), 2000);
return "sucess";
}
@ApiOperation(value = "企业列表(Wrapper实现)")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "current", value = "当前页数(从1开始)", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "size", value = "当前每页显示数", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "enterpriseName", value = "企业名称", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "status", value = "状态:0禁用, 1启用", paramType = "query", dataType = "Integer")
})
@GetMapping("getList")
public Wrapper getList(PageTableRequest request, String enterpriseName, Integer status) {
try {
QueryWrapper<SysEnterprise> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(enterpriseName)) {
wrapper.like("enterprise_name", enterpriseName);
}
if (status != null) {
wrapper.eq("status", status);
}
wrapper.orderByDesc("create_time");
IPage<SysEnterprise> page = new Page<>(request.getCurrent(), request.getSize());
page = enterpriseMapper.selectPage(page, wrapper);
return WrapMapper.wrap(200, "成功", page);
} catch (Exception e) {
log.debug("企业列表{}", e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "添加企业")
@PostMapping("save")
public Wrapper save(@RequestBody SysEnterprise enterprise){
try {
enterprise.setStatus(1);
enterprise.setIsDelete(1);
enterprise.setCreateTime(LocalDateTime.now());
enterpriseService.save(enterprise);
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
log.debug("添加企业{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "修改企业")
@PostMapping("update")
public Wrapper update(@RequestBody SysEnterprise enterprise){
try {
SysEnterprise e = enterpriseService.getById(enterprise.getId());
if(e == null){
return WrapMapper.wrap(400,"信息错误");
}
enterpriseService.updateById(enterprise);
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
log.debug("修改企业{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "企业详情")
@GetMapping("{id}")
public Wrapper getById(@PathVariable Long id){
try {
SysEnterprise e = enterpriseService.getById(id);
if(e == null){
return WrapMapper.wrap(400,"信息错误");
}
return WrapMapper.wrap(200,"成功",e);
}catch (Exception e){
log.debug("企业详情{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "删除企业")
@DeleteMapping("/{id}")
public Wrapper delete(@PathVariable Long id) {
try {
SysEnterprise e = enterpriseService.getById(id);
if (e == null ) {
return WrapMapper.wrap(400,"企业不存在");
}
enterpriseService.removeById(id);
return WrapMapper.wrap(200,"成功");
}catch (Exception e) {
log.debug("删除企业{}",e);
}
return WrapMapper.error("失败");
}
//****************************************************************************************************
/*@ApiOperation(value = "企业列表(自定义sql实现)")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "current", value = "当前页数(从1开始)", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "size", value = "当前每页显示数", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "enterpriseName", value = "企业名称", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "status", value = "状态:0禁用, 1启用", paramType = "query", dataType = "Integer")
})
@GetMapping("getList1")
public Wrapper getList1(PageTableRequest request, String enterpriseName, Integer status){
try {
Page<SysEnterprise> page = new Page<>(request.getCurrent(), request.getSize());
Map<String, Object> map = new HashMap<>();
map.put("enterpriseName", enterpriseName);
map.put("status", status);
List<SysEnterprise> enterpriseList = enterpriseService.getPage(map);
page.setRecords(enterpriseList).setTotal(enterpriseList.size());
return WrapMapper.wrap(200,"成功",page);
}catch (Exception e){
log.debug("企业列表{}",e);
}
return WrapMapper.error("失败");
}*/
}
package cn.wise.sc.cement.business.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDate;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysCoupon implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 优惠券名称
*/
private String couponName;
/**
* 企业表id
*/
private Double enterpriseId;
/**
* 优惠金额
*/
private BigDecimal couponMoney;
/**
* 使用范围
*/
private String useScope;
/**
* 活动开始时间
*/
private LocalDate startDate;
/**
* 活动结束时间
*/
private LocalDate endDate;
/**
* 是否领取:0未领取,1已领取
*/
private Integer isReceive;
/**
* 状态(0禁用,1启用)
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 是否删除(0删除,1存在)
*/
private Integer isDelete;
/**
* 备注
*/
private String remark;
}
package cn.wise.sc.cement.business.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysEnterprise implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 企业名称
*/
@ApiModelProperty("xxx")
private String enterpriseName;
/**
* 企业成立年限
*/
@ApiModelProperty("xxx")
private Double years;
/**
* 注册资金
*/
@ApiModelProperty("xxx")
private BigDecimal registerCapital;
/**
* 经营范围
*/
@ApiModelProperty("xxx")
private String businessScope;
/**
* 经营产品或者服务
*/
private String product;
/**
* 希望入驻的模块(会员、商圈、物业、出行)
*/
private String modular;
/**
* 联系人姓名
*/
private String contacts;
/**
* 联系人电话
*/
private String phone;
/**
* 联系人邮箱
*/
private String email;
/**
* 200字以内推荐理由
*/
private String recommendReason;
/**
* 租户logo
*/
private String logo;
/**
* 状态(0禁用,1启用)
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 租户地址
*/
private String address;
/**
* 是否删除(0删除,1存在)
*/
private Integer isDelete;
private String remark;
/**
* 企业app企业ID
*/
private String coridc;
}
package cn.wise.sc.cement.business.enumation;
import com.alibaba.fastjson.annotation.JSONType;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author neo.shu
* @since 2020/4/22 17:40
*/
@JSONType(serializeEnumAsJavaBean = true)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@AllArgsConstructor
@Getter
public enum ProjectRole {
PM("PM","项目经理", true),
PD("PD","产品设计", false),
UD("UD","UI设计", false),
FD("FD","前端开发", false),
BD("BD","后端开发", false),
TD("TD","测试经理", false),
QA("QA","质量管理", true),
;
@EnumValue
private String dbName;
private String label;
private boolean isManage;
public int getValue() {
return this.ordinal();
}
}
package cn.wise.sc.cement.business.exception;
/**
* 根据业务定制的具体异常类
* @author shulidong
* @since 2019/2/19/0019 16:45
*/
public class BizException extends BusinessException {
public BizException(String message) {
super(message);
}
}
package cn.wise.sc.cement.business.exception;
import org.springframework.http.HttpStatus;
/**
* @author shulidong
* @since 2019/2/19/0019 16:48
**/
public abstract class BusinessException extends RuntimeException {
protected HttpStatus statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
private String errorCode;
public HttpStatus getStatusCode() {
return statusCode;
}
public void setStatusCode(HttpStatus statusCode) {
this.statusCode = statusCode;
}
public BusinessException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public BusinessException(String message, Throwable e) {
super(message,e);
}
public BusinessException(String message) {
super(message);
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
}
package cn.wise.sc.cement.business.exception;
/**
* redis 操作异常
*/
public class RedisHandleException extends RuntimeException{
public RedisHandleException(String msg) {
super(msg);
}
public RedisHandleException(String message, Throwable throwable) {
super(message, throwable);
}
public RedisHandleException(Throwable throwable) {
super(throwable);
}
}
package cn.wise.sc.cement.business.filter;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import sun.misc.BASE64Decoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SwaggerInterceptor extends HandlerInterceptorAdapter {
private String username;
private String password;
public SwaggerInterceptor(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String authorization = request.getHeader("Authorization");
boolean isAuthSuccess = httpBasicAuth(authorization);
if (!isAuthSuccess) {
response.setCharacterEncoding("utf-8");
response.setStatus(401);
// response.setStatus(401,"Unauthorized");
response.setHeader("WWW-authenticate", "Basic realm=\"Realm\"");
try (PrintWriter writer = response.getWriter()) {
writer.print("Forbidden, unauthorized user");
}
}
return isAuthSuccess;
}
public boolean httpBasicAuth(String authorization) throws IOException {
if (authorization != null && authorization.split(" ").length == 2) {
String userAndPass = new String(new BASE64Decoder().decodeBuffer(authorization.split(" ")[1]));
String username = userAndPass.split(":").length == 2 ? userAndPass.split(":")[0] : null;
String password = userAndPass.split(":").length == 2 ? userAndPass.split(":")[1] : null;
if (this.username.equals(username) && this.password.equals(password)) {
return true;
}
}
return false;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String uri = request.getRequestURI();
AntPathMatcher pathMatcher = new AntPathMatcher();
if (!pathMatcher.match("/swagger-ui.html", uri) && !pathMatcher.match("/webjars/**", uri)) {
response.setStatus(404);
return;
}
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath:/META-INF/resources" + uri);
if (resources != null && resources.length > 0) {
FileCopyUtils.copy(resources[0].getInputStream(), response.getOutputStream());
} else {
response.setStatus(404);
}
}
}
package cn.wise.sc.cement.business.mapper;
import cn.wise.sc.cement.business.entity.SysCoupon;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-06-17
*/
public interface SysCouponMapper extends BaseMapper<SysCoupon> {
}
package cn.wise.sc.cement.business.mapper;
import cn.wise.sc.cement.business.entity.SysEnterprise;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-06-17
*/
public interface SysEnterpriseMapper extends BaseMapper<SysEnterprise> {
List<SysEnterprise> getPage(@Param("map") Map<String,Object> map);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.cement.business.mapper.SysCouponMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.cement.business.mapper.SysEnterpriseMapper">
<sql id="where">
<where>
<if test="map.enterpriseName != null and map.enterpriseName != ''">
and t.enterprise_name like concat('%', #{map.enterpriseName}, '%')
</if>
<if test="map.status != null">
and t.status = #{map.status}
</if>
</where>
</sql>
<select id="getPage" resultType="cn.wise.sc.cement.business.entity.SysEnterprise">
select t.* from sys_enterprise t
<include refid="where" />
order by t.create_time desc
</select>
</mapper>
package cn.wise.sc.cement.business.model;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* 分页查询参数
*
* @author zhutianwei
*
* 说明: 页码start 每页返回数量 length 其他筛选字段按照对象传入 sql:limit start*length length
* 时间筛选 beginTime endTime
* 排序 orderBy 例如order by payTime desc
*
*/
public class PageTableRequest implements Serializable {
private static final long serialVersionUID = 7328071045193618467L;
@ApiModelProperty("当前页数(从1开始)")
private Long current;
@ApiModelProperty("当前每页显示数")
private Long size;
public Long getCurrent() {
return current;
}
public void setCurrent(Long current) {
this.current = current;
}
public Long getSize() {
return size;
}
public void setSize(Long size) {
this.size = size;
}
}
/**
* @author neo.shu
* @since 2020/6/12 13:48
*/
package cn.wise.sc.cement.business;
\ No newline at end of file
package cn.wise.sc.cement.business.service;
import cn.wise.sc.cement.business.entity.SysCoupon;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author ztw
* @since 2020-06-17
*/
public interface ISysCouponService extends IService<SysCoupon> {
}
package cn.wise.sc.cement.business.service;
import cn.wise.sc.cement.business.entity.SysEnterprise;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* <p>
* 服务类
* </p>
*
* @author ztw
* @since 2020-06-17
*/
public interface ISysEnterpriseService extends IService<SysEnterprise> {
List<SysEnterprise> getPage(Map<String,Object> map);
}
package cn.wise.sc.cement.business.service.impl;
import cn.wise.sc.cement.business.entity.SysCoupon;
import cn.wise.sc.cement.business.mapper.SysCouponMapper;
import cn.wise.sc.cement.business.service.ISysCouponService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Service
public class SysCouponServiceImpl extends ServiceImpl<SysCouponMapper, SysCoupon> implements ISysCouponService {
}
package cn.wise.sc.cement.business.service.impl;
import cn.wise.sc.cement.business.entity.SysEnterprise;
import cn.wise.sc.cement.business.mapper.SysEnterpriseMapper;
import cn.wise.sc.cement.business.service.ISysEnterpriseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* <p>
* 服务实现类
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Service
public class SysEnterpriseServiceImpl extends ServiceImpl<SysEnterpriseMapper, SysEnterprise> implements ISysEnterpriseService {
private static final Logger log = LoggerFactory.getLogger("SysEnterpriseServiceImpl");
@Resource
private SysEnterpriseMapper enterpriseMapper;
@Override
public List<SysEnterprise> getPage(Map<String,Object> map) {
List<SysEnterprise> enterprise = enterpriseMapper.getPage(map);
log.debug("企业列表{}");
return enterprise;
}
}
package cn.wise.sc.cement.business.util;
import java.time.LocalDateTime;
import java.time.temporal.WeekFields;
/**
* @author neo.shu
* @since 2020/4/5 22:26
*/
public class DateUtil {
/**
* 获取自然周数
* @param localDateTime
* @return
*/
public static int getWeek(LocalDateTime localDateTime) {
WeekFields weekFields = WeekFields.ISO;
return localDateTime.get(weekFields.weekOfWeekBasedYear());
}
}
package cn.wise.sc.cement.business.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.util.TextUtils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 使用磁盘文件模拟accessToken和jsTicket的数据持久化
* 正式项目请是写入到Mysql等持久化存储
*
* @author openapi@dingtalk
* @date 2020/2/4
*/
public class FileUtil {
private static final String FILEPATH = "Permanent_Data";
/**
* 将json写入文件
*
* @param json 需要写入的json对象
* @param fileName 文件名称
*/
public synchronized static void write2File(Object json, String fileName) {
BufferedWriter writer = null;
File filePath = new File(FILEPATH);
JSONObject eJson = null;
if (!filePath.exists() && !filePath.isDirectory()) {
filePath.mkdirs();
}
File file = new File(FILEPATH + File.separator + fileName + ".xml");
System.out.println("path:" + file.getPath() + " abs path:" + file.getAbsolutePath());
if (!file.exists()) {
try {
file.createNewFile();
} catch (Exception e) {
System.out.println("createNewFile,出现异常:");
e.printStackTrace();
}
} else {
eJson = read2JSON(fileName);
}
try {
writer = new BufferedWriter(new FileWriter(file));
if (eJson == null) {
writer.write(json.toString());
} else {
Object[] array = ((JSONObject)json).keySet().toArray();
for (Object o : array) {
eJson.put(o.toString(), ((JSONObject)json).get(o.toString()));
}
writer.write(eJson.toString());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读文件到json
*
* @param fileName 文件名称
* @return 文件内容Json对象
*/
public static JSONObject read2JSON(String fileName) {
File file = new File(FILEPATH + File.separator + fileName + ".xml");
if (!file.exists()) {
return null;
}
BufferedReader reader = null;
String laststr = "";
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
laststr += tempString;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return (JSONObject)JSON.parse(laststr);
}
/**
* 通过key值获取文件中的value
*
* @param fileName 文件名称
* @param key key值
* @return key对应的value
*/
public static Object getValue(String fileName, String key) {
JSONObject eJSON = null;
eJSON = read2JSON(fileName);
if (null != eJSON && eJSON.containsKey(key)) {
@SuppressWarnings("unchecked")
Map<String, Object> values = JSON.parseObject(eJSON.toString(), Map.class);
return values.get(key);
} else {
return null;
}
}
public static HashMap<Long, Long> toHashMap(JSONObject js) {
if (js == null) {
return null;
}
HashMap<Long, Long> data = new HashMap<Long, Long>();
// 将json字符串转换成jsonObject
Set<String> set = js.keySet();
// 遍历jsonObject数据,添加到Map对象
for (String s : set) {
String key = String.valueOf(s);
Long keyLong = Long.valueOf(key);
String value = js.getString(key);
Long valueLong;
if (TextUtils.isEmpty(value)) {
valueLong = js.getLong(key);
} else {
valueLong = Long.valueOf(value);
}
data.put(keyLong, valueLong);
}
return data;
}
}
package cn.wise.sc.cement.business.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用ThreadLocal来存储resquest
*/
public class GlobalHolder {
private static ThreadLocal<HttpServletRequest> requestThreadLocalHolder = new ThreadLocal<HttpServletRequest>();
private static ThreadLocal<HttpServletResponse> responseThreadLocalHolder = new ThreadLocal<HttpServletResponse>();
public static void setHttpRequest(HttpServletRequest request){
requestThreadLocalHolder.set(request);
}
public static void setHttpResponse(HttpServletResponse response){
responseThreadLocalHolder.set(response);
}
public static void remove(){
requestThreadLocalHolder.remove();
responseThreadLocalHolder.remove();
}
public static HttpServletResponse getHttpResponse(){
return responseThreadLocalHolder.get();
}
public static HttpServletRequest getHttpRequest(){
return requestThreadLocalHolder.get();
}
public static String corpId(){
HttpServletRequest request = requestThreadLocalHolder.get();
//前台传递值
return request.getHeader("corpId");
}
}
package cn.wise.sc.cement.business.util;
import cn.wise.sc.cement.business.exception.RedisHandleException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @description:用途: redis 缓存集合
*/
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
//---------------------- common --------------------------
/**
* 指定缓存失效时间
*
* @param key key值
* @param time 缓存时间
*/
public void expire(String key, long time) {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
} else {
throw new RedisHandleException("设置的时间不能为0或者小于0!!");
}
}
/**
* 判断key是否存在
*
* @param key 传入ke值
* @return true 存在 false 不存在
*/
public Boolean existsKey(String key) {
return redisTemplate.hasKey(key);
}
/**
* 判断key存储的值类型
*
* @param key key值
* @return DataType[string、list、set、zset、hash]
*/
public DataType typeKey(String key) {
return redisTemplate.type(key);
}
/**
* 删除指定的一个数据
*
* @param key key值
* @return true 删除成功,否则返回异常信息
*/
public Boolean deleteKey(String key) {
try {
return redisTemplate.delete(key);
} catch (Exception ex) {
throw new RedisHandleException("删除失败!", ex);
}
}
/**
* 删除多个数据
*
* @param keys key的集合
* @return true删除成功,false删除失败
*/
public Boolean deleteKey(Collection<String> keys) {
return redisTemplate.delete(keys) != 0;
}
//-------------------- String ----------------------------
/**
* 普通缓存放入
*
* @param key 键值
* @param value 值
* @return true成功 要么异常
*/
public Boolean setString(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception ex) {
throw new RedisHandleException("插入缓存失败!", ex);
}
}
/**
* 普通缓存获取
*
* @param key 键
* @return 值
*/
public Object getString(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 设置缓存存在时间
*
* @param key key值
* @param value value值
* @param time 时间 秒为单位
* @return 成功返回true,失败返回异常信息
*/
public boolean setString(String key, Object value, long time) {
try {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
return true;
} catch (Exception ex) {
throw new RedisHandleException("插入缓存失败!", ex);
}
}
//----------------------------- list ------------------------------
/**
* 将list放入缓存
*
* @param key key的值
* @param value 放入缓存的数据
* @return true 代表成功,否则返回异常信息
*/
public Boolean setList(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception ex) {
throw new RedisHandleException("插入List缓存失败!", ex);
}
}
/**
* 将Object数据放入List缓存,并设置时间
*
* @param key key值
* @param value 数据的值
* @param time 缓存的时间
* @return true插入成功,否则返回异常信息
*/
public Boolean setList(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForList().rightPush(key, value);
expire(key, time);
return true;
}
return false;
} catch (Exception ex) {
throw new RedisHandleException("插入List缓存失败!", ex);
}
}
/**
* 将list集合放入List缓存,并设置时间
*
* @param key key值
* @param value 数据的值
* @param time 缓存的时间
* @return true插入成功,否则返回异常信息
*/
public Boolean setListAll(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForList().rightPushAll(key, value);
this.expire(key, time);
return true;
}
return false;
} catch (Exception ex) {
throw new RedisHandleException("插入List缓存失败!", ex);
}
}
/**
* 根据索引获取缓存List中的内容
*
* @param key key的值
* @param start 索引开始
* @param end 索引结束 0 到 -1代表所有值
* @return 返回数据
*/
public List<Object> getList(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception ex) {
throw new RedisHandleException("获取缓存List中的内容失败了!", ex);
}
}
/**
* 删除List缓存中多个list数据
*
* @param key key值
* @param count 移除多少个
* @param value 可以传null 或者传入存入的Value的值
* @return 返回删除了多少个
*/
public long deleteListIndex(String key, long count, Object value) {
try {
return redisTemplate.opsForList().remove(key, count, value);
} catch (Exception ex) {
throw new RedisHandleException("删除List中的内容失败了!", ex);
}
}
/**
* 获取List缓存的数据
*
* @param key key值
* @return 返回长度
*/
public long getListSize(String key) {
try {
return redisTemplate.opsForList().size(key);
} catch (Exception ex) {
throw new RedisHandleException("获取List长度失败", ex);
}
}
}
package cn.wise.sc.cement.business.wrapper;
import cn.wise.sc.cement.business.wrapper.page.PageUtil;
/**
* The class Page wrap mapper.
*
* @author paascloud.net@gmail.com
*/
public class PageWrapMapper {
/**
* Instantiates a new page wrap mapper.
*/
private PageWrapMapper() {
}
private static <E> PageWrapper<E> wrap(int code, String message, E o, PageUtil pageUtil) {
return new PageWrapper<E>(code, message, o, pageUtil);
}
/**
* Wrap data with default code=200.
*
* @param <E> the type parameter
* @param o the o
* @param pageUtil the page util
*
* @return the page wrapper
*/
public static <E> PageWrapper<E> wrap(E o, PageUtil pageUtil) {
return wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o, pageUtil);
}
/**
* Wrap.
*
* @param <E> the type parameter
* @param code the code
* @param message the message
*
* @return the page wrapper
*/
public static <E> PageWrapper<E> wrap(int code, String message) {
return wrap(code, message, null, null);
}
/**
* Wrap.
*
* @param <E> the type parameter
* @param code the code
*
* @return the page wrapper
*/
public static <E> PageWrapper<E> wrap(int code) {
return wrap(code, null, null, null);
}
/**
* Wrap.
*
* @param <E> the type parameter
* @param e the e
*
* @return the page wrapper
*/
public static <E> PageWrapper<E> wrap(Exception e) {
return new PageWrapper<E>(Wrapper.ERROR_CODE, e.getMessage(), null, null);
}
/**
* Un wrapper.
*
* @param <E> the type parameter
* @param wrapper the wrapper
*
* @return the e
*/
public static <E> E unWrap(PageWrapper<E> wrapper) {
return wrapper.getData();
}
/**
* Wrap ERROR. code=100
*
* @param <E> the type parameter
*
* @return the page wrapper
*/
public static <E> PageWrapper<E> illegalArgument() {
return wrap(Wrapper.ILLEGAL_ARGUMENT_CODE_, Wrapper.ILLEGAL_ARGUMENT_MESSAGE, null, null);
}
/**
* Wrap ERROR. code=500
*
* @param <E> the type parameter
*
* @return the page wrapper
*/
public static <E> PageWrapper<E> error() {
return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE, null, null);
}
/**
* Wrap SUCCESS. code=200
*
* @param <E> the type parameter
*
* @return the page wrapper
*/
public static <E> PageWrapper<E> ok() {
return new PageWrapper<E>();
}
}
package cn.wise.sc.cement.business.wrapper;
import cn.wise.sc.cement.business.wrapper.page.PageUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* The class Page wrapper.
*
* @param <T> the type parameter @author paascloud.net@gmail.com
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class PageWrapper<T> extends Wrapper<T> {
private static final long serialVersionUID = 666985064788933395L;
private PageUtil pageUtil;
/**
* Instantiates a new Page wrapper.
*/
PageWrapper() {
super();
}
/**
* Instantiates a new Page wrapper.
*
* @param code the code
* @param message the message
*/
public PageWrapper(int code, String message) {
super(code, message);
}
/**
* Instantiates a new pageWrapper default code=200
*
* @param result the result
* @param pageUtil the page util
*/
public PageWrapper(T result, PageUtil pageUtil) {
super();
this.setData(result);
this.setPageUtil(pageUtil);
}
/**
* Instantiates a new Page wrapper.
*
* @param code the code
* @param message the message
* @param result the result
* @param pageUtil the page util
*/
PageWrapper(int code, String message, T result, PageUtil pageUtil) {
super(code, message, result);
this.pageUtil = pageUtil;
}
/**
* Sets the 分页数据 , 返回自身的引用.
*
* @param pageUtil the page util
*
* @return the page wrapper
*/
public PageWrapper<T> pageUtil(PageUtil pageUtil) {
this.setPageUtil(pageUtil);
return this;
}
/**
* Sets the 结果数据 , 返回自身的引用.
*
* @param result the result
*
* @return the page wrapper
*/
@Override
public PageWrapper<T> data(T result) {
super.setData(result);
return this;
}
}
package cn.wise.sc.cement.business.wrapper;
import org.apache.commons.lang3.StringUtils;
/**
* The class Wrap mapper.
*/
public class WrapMapper {
/**
* Instantiates a new wrap mapper.
*/
private WrapMapper() {
}
/**
* Wrap.
*
* @param <E> the element type
* @param code the code
* @param message the message
* @param o the o
*
* @return the wrapper
*/
public static <E> Wrapper<E> wrap(int code, String message, E o) {
return new Wrapper<>(code, message, o);
}
/**
* Wrap.
*
* @param <E> the element type
* @param code the code
* @param message the message
*
* @return the wrapper
*/
public static <E> Wrapper<E> wrap(int code, String message) {
return wrap(code, message, null);
}
/**
* Wrap.
*
* @param <E> the element type
* @param code the code
*
* @return the wrapper
*/
public static <E> Wrapper<E> wrap(int code) {
return wrap(code, null);
}
/**
* Wrap.
*
* @param <E> the element type
* @param e the e
*
* @return the wrapper
*/
public static <E> Wrapper<E> wrap(Exception e) {
return new Wrapper<>(Wrapper.ERROR_CODE, e.getMessage());
}
/**
* Un wrapper.
*
* @param <E> the element type
* @param wrapper the wrapper
*
* @return the e
*/
public static <E> E unWrap(Wrapper<E> wrapper) {
return wrapper.getData();
}
/**
* Wrap ERROR. code=100
*
* @param <E> the element type
*
* @return the wrapper
*/
public static <E> Wrapper<E> illegalArgument() {
return wrap(Wrapper.ILLEGAL_ARGUMENT_CODE_, Wrapper.ILLEGAL_ARGUMENT_MESSAGE);
}
/**
* Wrap ERROR. code=500
*
* @param <E> the element type
*
* @return the wrapper
*/
public static <E> Wrapper<E> error() {
return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE);
}
/**
* Error wrapper.
*
* @param <E> the type parameter
* @param message the message
*
* @return the wrapper
*/
public static <E> Wrapper<E> error(String message) {
return wrap(Wrapper.ERROR_CODE, StringUtils.isBlank(message) ? Wrapper.ERROR_MESSAGE : message);
}
/**
* Wrap SUCCESS. code=200
*
* @param <E> the element type
*
* @return the wrapper
*/
public static <E> Wrapper<E> ok() {
return new Wrapper<>();
}
/**
* Ok wrapper.
*
* @param <E> the type parameter
* @param o the o
*
* @return the wrapper
*/
public static <E> Wrapper<E> ok(E o) {
return new Wrapper<>(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o);
}
}
package cn.wise.sc.cement.business.wrapper;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import java.io.Serializable;
/**
* The class Wrapper.
*/
@Data
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Wrapper<T> implements Serializable {
/**
* 序列化标识
*/
/**
* 成功码.
*/
public static final int SUCCESS_CODE = 200;
/**
* 成功信息.
*/
public static final String SUCCESS_MESSAGE = "操作成功";
/**
* 错误码.
*/
public static final int ERROR_CODE = 500;
/**
* 错误信息.
*/
public static final String ERROR_MESSAGE = "内部异常";
/**
* 错误码:参数非法
*/
public static final int ILLEGAL_ARGUMENT_CODE_ = 100;
/**
* 错误信息:参数非法
*/
public static final String ILLEGAL_ARGUMENT_MESSAGE = "参数非法";
private static final long serialVersionUID = 3271183695751869867L;
/**
* 编号.
*/
private int code;
/**
* 信息.
*/
private String message;
/**
* 结果数据
*/
private T data;
/**
* Instantiates a new wrapper. default code=200
*/
Wrapper() {
this(SUCCESS_CODE, SUCCESS_MESSAGE);
}
/**
* Instantiates a new wrapper.
*
* @param code the code
* @param message the message
*/
Wrapper(int code, String message) {
this(code, message, null);
}
/**
* Instantiates a new wrapper.
*
* @param code the code
* @param message the message
* @param result the result
*/
Wrapper(int code, String message, T result) {
super();
this.code(code).message(message).data(result);
}
/**
* Sets the 编号 , 返回自身的引用.
*
* @param code the new 编号
*
* @return the wrapper
*/
private Wrapper<T> code(int code) {
this.setCode(code);
return this;
}
/**
* Sets the 信息 , 返回自身的引用.
*
* @param message the new 信息
*
* @return the wrapper
*/
private Wrapper<T> message(String message) {
this.setMessage(message);
return this;
}
/**
* Sets the 结果数据 , 返回自身的引用.
*
* @param data the new 结果数据
*
* @return the wrapper
*/
public Wrapper<T> data(T data) {
this.setData(data);
return this;
}
/**
* 判断是否成功: 依据 Wrapper.SUCCESS_CODE == this.code
*
* @return code =200,true;否则 false.
*/
@JsonIgnore
public boolean success() {
return Wrapper.SUCCESS_CODE == this.code;
}
/**
* 判断是否成功: 依据 Wrapper.SUCCESS_CODE != this.code
*
* @return code !=200,true;否则 false.
*/
@JsonIgnore
public boolean error() {
return !success();
}
}
package cn.wise.sc.cement.business.wrapper.page;
import lombok.Data;
/**
* 分页请求包装类
*/
@Data
public class PageUtil {
/**
* The cur page.当前页
*/
private int currentPage = 1;
/**
* The next page.下一页
*/
private int nextPage;
/**
* The pre page. 上一页
*/
private int prePage;
/**
* The total row. 总条数
*/
private int totalRow;
/**
* The page size.每页条数
*/
private int pageSize = 10;
/**
* The total page.总页数
*/
private int totalPage;
/**
* The start. 开始条数
*/
private int start;
/**
* The buttons.
*/
private int[] buttons;
/**
* 当前页条数
*/
private int curPageSize;
/**
* Instantiates a new page util.
*/
public PageUtil() {
}
/**
* Instantiates a new page util.
*
* @param currentPage the current page
*/
public PageUtil(int currentPage) {
this.currentPage = currentPage;
}
/**
* Instantiates a new page util.
*
* @param currentPage the current page
* @param pageSize the page size
*/
public PageUtil(int currentPage, int pageSize) {
this.currentPage = currentPage;
this.pageSize = pageSize;
}
}
package cn.wise.sc.cement.business.wrapper.page;
import lombok.Data;
import java.io.Serializable;
/**
*/
@Data
public class Query implements Serializable {
private static final long serialVersionUID = 8933019121780323520L;
/**
* 当前页
*/
private int pageNum = 1;
/**
* 每页的数量
*/
private int pageSize = 20;
}
package cn.wise.sc.cement.tcdri.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@RestController
@RequestMapping("/tcdri/client")
public class ClientController {
}
package cn.wise.sc.cement.tcdri.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@RestController
@RequestMapping("/tcdri/project")
public class ProjectController {
}
package cn.wise.sc.cement.tcdri.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@RestController
@RequestMapping("/tcdri/user")
public class UserController {
}
package cn.wise.sc.cement.tcdri.entity;
import cn.wise.sc.cement.tcdri.model.BaseEntity;
import cn.wise.sc.cement.tcdri.model.query.ClientQuery;
import cn.wise.sc.cement.tcdri.model.vo.ClientVo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.beans.BeanUtils;
/**
* <p>
* 委托单位
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Client extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
public static Client crate(final ClientQuery clientQuery) {
Client newClient = new Client();
BeanUtils.copyProperties(clientQuery, newClient);
newClient.setStatus(true);
return newClient;
}
@Override
public ClientVo toVo() {
ClientVo clientVo = new ClientVo();
BeanUtils.copyProperties(this, clientVo, "status");
clientVo.setStatus(this.getStatus() ? "启用" : "禁用");
return clientVo;
}
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 单位名
*/
private String name;
/**
* 负责人
*/
private String principal;
/**
* 负责人电话
*/
private String principalPhone;
/**
* 所在地区:xx省xx县xx
*/
private String region;
/**
* 状态 0:禁用 1:激活
*/
private Boolean status;
}
package cn.wise.sc.cement.tcdri.entity;
import cn.wise.sc.cement.tcdri.model.BaseEntity;
import cn.wise.sc.cement.tcdri.model.query.ProjectQuery;
import cn.wise.sc.cement.tcdri.model.vo.ProjectVo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.beans.BeanUtils;
/**
* <p>
* 委托项目
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Project extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
public static Project crate(ProjectQuery query) {
Project newObj = new Project();
BeanUtils.copyProperties(query, newObj);
newObj.setStatus(true);
return newObj;
}
@Override
public ProjectVo toVo() {
ProjectVo projectVo = new ProjectVo();
BeanUtils.copyProperties(this, projectVo, "status", "client_id");
projectVo.setStatus(this.getStatus() ? "启用" : "禁用");
return projectVo;
}
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 项目名
*/
private String name;
/**
* 项目编号:客户自己填的
*/
private String code;
/**
* 客户id
*/
private Integer clientId;
/**
* 状态0:禁用 1:启用
*/
private Boolean status;
}
package cn.wise.sc.cement.tcdri.entity;
import cn.wise.sc.cement.tcdri.model.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 人员
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User extends BaseEntity implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 用户账号
*/
private String username;
/**
* 真实姓名
*/
private String name;
/**
* 性别0女1男
*/
private Boolean sex;
/**
* 部门id
*/
private Integer departmentId;
/**
* 职务id
*/
private Integer positionId;
/**
* 微信号
*/
private String wxId;
/**
* 职称
*/
private String qualifications;
/**
* 状态
*/
private Boolean status;
/**
* 当前工作年限
*/
private Double workYear;
/**
* 手机号
*/
private String phone;
/**
* 专业
*/
private String major;
/**
* 邮箱
*/
private String email;
/**
* 从事本专业开始时间
*/
private Date majorStart;
/**
*
*/
private Double majorYear;
}
package cn.wise.sc.cement.tcdri.exception;
import cn.hutool.core.util.StrUtil;
import java.util.Collection;
/**
* @description: 断言接口 公共断言方法放这里
* @author: qh
* @create: 2020-05-15 15:32
**/
public interface Assert {
/**
* 创建异常
*
* @param args
* @return
*/
BaseException newException(Object... args);
/**
* 创建异常
*
* @param t
* @param args
* @return
*/
BaseException newException(Throwable t, Object... args);
/**
* 断言对象 obj 非空。如果对象 obj 为空,则抛出异常
*
* @param obj 待判断对象
*/
default void assertNotNull(Object obj) {
if (obj == null) {
throw newException(obj);
}
}
default void assertNotEmpty(String str) {
if (StrUtil.isEmpty(str)) {
throw newException(str);
}
}
/**
* 断言对象obj非空。如果对象为空,则抛出异常
* 异常信息message支持传递参数方式,避免在判断之前进行字符串拼接操作
*
* @param obj 待判断对象
* @param args message占位符对应的参数列表
*/
default void assertNotNull(Object obj, Object... args) {
if (obj == null) {
throw newException(args);
}
}
/**
* 断言是个异常 直接抛出这个异常
*
* @param e
*/
default void assertIsException(Throwable e) {
if (e != null) {
throw newException(e, null);
}
}
/**
* 断言 字符串参数不能为空
*
* @param params 字符串参数
*/
default void assertNotEmpty(String... params) {
for (String str : params) {
if (StrUtil.isEmpty(str)) {
throw newException(params);
}
}
}
/**
* 断言 集合不为空和长度不为0
*
* @param list
*/
default void assertCollectionNotILLEGAL(Collection list) {
if (list == null || list.size() == 0) {
throw newException(list);
}
}
/**
* 断言数值参数 不为0和空
*
* @param obj 待判断的参数
*/
default void assertNotDefaultOrNull(Object obj) {
double tmp;
try {
tmp = (double) obj;
} catch (ClassCastException e) {
throw newException(obj);
}
if ((obj == null) || (tmp == 0D)) {
throw newException(obj);
}
}
}
package cn.wise.sc.cement.tcdri.exception;
/**
* @description: 基础异常
* @author: qh
* @create: 2020-05-15 15:27
**/
public class BaseException extends RuntimeException {
protected static final long serialVersionUID = 1L;
private int code;
private String message;
private Object[] args;
public BaseException(IResponseEnum responseEnum, Object[] args, String message) {
super(responseEnum.getMessage());
this.code = responseEnum.getCode();
this.message = message;
this.args = args;
}
public BaseException(IResponseEnum responseEnum, Object[] args, String message, Throwable cause) {
super(message, cause);
this.code = responseEnum.getCode();
this.message = message;
this.args = args;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
package cn.wise.sc.cement.tcdri.exception;
/**
* @description: 业务方面的异常
* @author: qh
* @create: 2020-05-15 15:28
**/
public class BusinessException extends BaseException {
private static final long serialVersionUID = 1L;
public BusinessException(IResponseEnum responseEnum, Object[] args, String message) {
super(responseEnum, args, message);
}
public BusinessException(IResponseEnum responseEnum, Object[] args, String message, Throwable cause) {
super(responseEnum, args, message, cause);
}
}
package cn.wise.sc.cement.tcdri.exception;
import java.text.MessageFormat;
import java.util.Date;
/**
* @description: 业务异常与断言结合的接口 适配器
* @author: qh
* @create: 2020-05-15 15:36
**/
public interface BusinessExceptionAssert extends IResponseEnum, Assert {
@Override
default BaseException newException(Object... args) {
String msg = MessageFormat.format(this.getMessage(), args);
return new BusinessException(this, args, msg);
}
@Override
default BaseException newException(Throwable t, Object... args) {
String msg = MessageFormat.format(this.getMessage(), args);
return new BusinessException(this, args, msg, t);
}
/**
* 断言对象 时间段合法
*
* @param start 开始时间
* @param end 结束时间
*/
default void assertTimeVail(Long start, Long end) {
if (end == null || start == null) {
throw newException(start, end);
}
if (end == 0 && start == 0) {
throw newException(start, end);
}
if (start > end) {
throw newException(start, end);
}
if (start < 0 || end < 0) {
throw newException(start, end);
}
}
/**
* 断言对象 时间段合法
*
* @param startDate 开始时间
* @param endDate 结束时间
*/
default void assertTimeVail(Date startDate, Date endDate) {
Long start = startDate.getTime();
Long end = endDate.getTime();
assertTimeVail(start,end);
}
}
package cn.wise.sc.cement.tcdri.exception;
import lombok.Getter;
/**
* @description: 最终业务异常实现
* @author: qh
* @create: 2020-05-15 15:37
*/
@Getter
public enum BusinessExceptionEnum implements BusinessExceptionAssert {
/**
* Bad licence type
*/
BAD_LICENCE_TYPE(7001, "字段不能为空!"),
/**
* Licence not found
*/
LICENCE_NOT_FOUND(7002, "Licence not found."),
/**
* 成功
*/
SUCCESS(200, "Success."),
BAD_TIME(400, "时间段无效! 开始时间>结束时间&&不能为NUll"),
COLLECTION_NOT_ILLEGAL(400, "参数集合无效!"),
CACHE_NOT_FOUND(7002, "缓存未找到!"),
OPEN_TS_DB_CONNECTION_ERROR(7003, "请求OpenTSDB失败"),
/**
* 业务异常
*/
BUSINESS_ERROR(400, "Business not pass.");
BusinessExceptionEnum(int code, String message) {
this.code = code;
this.message = message;
}
/**
* 返回码
*/
private int code;
/**
* 返回消息
*/
private String message;
}
package cn.wise.sc.cement.tcdri.exception;
/**
* @description: 代码错误
* @author: qh
* @create: 2020-07-09 16:07
**/
public class CodeException extends BaseException{
private static final long serialVersionUID = 1L;
public CodeException(IResponseEnum responseEnum, Object[] args, String message) {
super(responseEnum, args, message);
}
public CodeException(IResponseEnum responseEnum, Object[] args, String message, Throwable cause) {
super(responseEnum, args, message, cause);
}
}
package cn.wise.sc.cement.tcdri.exception;
import java.text.MessageFormat;
/**
* @description: 代码逻辑错误断言接口
* @author: qh
* @create: 2020-07-09 16:05
**/
public interface CodeExceptionAssert extends Assert, IResponseEnum {
@Override
default BaseException newException(Object... args) {
String msg = MessageFormat.format(this.getMessage(), args);
return new BusinessException(this, args, msg);
}
@Override
default BaseException newException(Throwable t, Object... args) {
String msg = MessageFormat.format(this.getMessage(), args);
return new BusinessException(this, args, msg, t);
}
}
package cn.wise.sc.cement.tcdri.exception;
import lombok.Getter;
/**
* @description: 代码逻辑错误枚举
* @author: qh
* @create: 2020-07-09 16:09
**/
@Getter
public enum CodeExceptionEnum implements CodeExceptionAssert{
OBJECT_NOT_EMPTY(6001, "{0} is NULL!"),
STRING_NOT_EMPTY(6001,"{0} is Empty!");
CodeExceptionEnum(int code, String message) {
this.code = code;
this.message = message;
}
/**
* 返回码
*/
private int code;
/**
* 返回消息
*/
private String message;
}
package cn.wise.sc.cement.tcdri.exception;
/**
* @description: 公共属性接口 提供公共属性
* @author: qh
* @create: 2020-05-15 15:28
**/
public interface IResponseEnum {
int getCode();
String getMessage();
}
package cn.wise.sc.cement.tcdri.mapper;
import cn.wise.sc.cement.tcdri.entity.Client;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-08-07
*/
public interface ClientMapper extends BaseMapper<Client> {
}
package cn.wise.sc.cement.tcdri.mapper;
import cn.wise.sc.cement.tcdri.entity.Project;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-08-07
*/
public interface ProjectMapper extends BaseMapper<Project> {
}
package cn.wise.sc.cement.tcdri.mapper;
import cn.wise.sc.cement.tcdri.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-08-07
*/
public interface UserMapper extends BaseMapper<User> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.cement.tcdri.mapper.ClientMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.cement.tcdri.mapper.ProjectMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.cement.tcdri.mapper.UserMapper">
</mapper>
package cn.wise.sc.cement.tcdri.model;
import cn.hutool.core.lang.func.Func;
import cn.wise.sc.cement.tcdri.model.vo.BaseVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* 封装公共的接口
*
* @param <T> service对象
* @param <M> 实体对象
* @author 秦虎
*/
@Slf4j
public class BaseController<T extends IService<M>, M extends BaseEntity> {
T iService;
public BaseController(T iService) {
this.iService = iService;
}
@PostMapping("/list")
public BaseResponse<List<M>> list(@RequestBody WrapperQuery wrapperQuery) {
QueryWrapper queryWrapper = PageWrapperQueryMyBatisResolver.getQueryWrapper(wrapperQuery);
try {
List<M> list = iService.list(queryWrapper);
return BaseResponse.okData(list);
} catch (Exception ex) {
log.error("查询操作失败 ===== " + iService.toString() + ".list() ====== 异常: {}", ex.getMessage());
return BaseResponse.errorMsg("查询失败");
}
}
@PostMapping("/page")
public BaseResponse<IPage<M>> page(@RequestBody WrapperQuery pageQuery) {
QueryWrapper queryWrapper = PageWrapperQueryMyBatisResolver.getQueryWrapper(pageQuery);
IPage<M> page = new Page(pageQuery.getPageQuery().getPageNo(), pageQuery.getPageQuery().getPageSize());
try {
page = iService.page(page, queryWrapper);
return BaseResponse.okData(page);
} catch (Exception ex) {
log.error("查询操作失败 ===== " + iService.toString() + ".page() ====== 异常: {}", ex.getMessage());
return BaseResponse.errorMsg("分页查询失败");
}
}
@GetMapping("/{id}")
public BaseResponse<BaseVo> getById(@PathVariable("id") long id) {
try {
M model = iService.getById(id);
return BaseResponse.okData(model.toVo());
} catch (Exception ex) {
log.error("查询操作失败 ===== " + iService.toString() + ".create() ====== 异常: {}", ex.getMessage());
return BaseResponse.errorMsg("获取详情信息失败");
}
}
@PostMapping
public BaseResponse<BaseVo> create(@RequestBody M model) {
try {
iService.save(model);
return BaseResponse.okData(model.toVo());
} catch (Exception ex) {
log.error("查询操作失败 ===== " + iService.toString() + ".create() ====== 异常: {}", ex.getMessage());
return BaseResponse.errorMsg("添加失败");
}
}
@PutMapping
public BaseResponse<Boolean> update(@RequestBody M model) {
try {
boolean update = iService.updateById(model);
return BaseResponse.okData(update);
} catch (Exception ex) {
log.error("查询操作失败 ===== " + iService.toString() + ".create() ====== 异常: {}", ex.getMessage());
return BaseResponse.errorMsg("更新记录失败");
}
}
@DeleteMapping("/{id}")
public BaseResponse<Boolean> delById(@PathVariable("id") long id) {
try {
boolean removeById = iService.removeById(id);
return BaseResponse.okData(removeById);
} catch (Exception ex) {
log.error("查询操作失败 ===== " + iService.toString() + ".create() ====== 异常: {}", ex.getMessage());
return BaseResponse.errorMsg("获取详情信息失败");
}
}
}
package cn.wise.sc.cement.tcdri.model;
import cn.wise.sc.cement.tcdri.model.vo.BaseVo;
/**
* @description:
* @author: qh
* @create: 2020-08-07 15:58
**/
public abstract class BaseEntity {
public BaseVo toVo(){
return new BaseVo();
}
}
package cn.wise.sc.cement.tcdri.model;
import cn.wise.sc.cement.tcdri.exception.BusinessExceptionEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @description: 统一返回参数实体
* @author: qh
* @create: 2020-05-18 10:49
**/
@Data
@AllArgsConstructor
public class BaseResponse<T> {
/**
* 响应状态码
*/
private int code;
/**
* 响应数据
*/
private T data;
/**
* 响应提示信息
*/
private String msg;
BaseResponse() {
}
/**
* 200,带提示信息
*
* @param msg 提示信息
* @param <T> 响应数据
* @return BaseResponse
*/
public static <T> BaseResponse<T> okMsg(String msg) {
BaseResponse<T> baseResponse = new BaseResponse<>();
baseResponse.setMsg(msg);
baseResponse.setCode(BusinessExceptionEnum.SUCCESS.getCode());
baseResponse.setData(null);
return baseResponse;
}
/**
* 200,带默认提示信息
*
* @param <T> 响应数据
* @return BaseResponse
*/
public static <T> BaseResponse<T> okData(T t) {
BaseResponse<T> baseResponse = new BaseResponse<>();
baseResponse.setMsg("操作成功!");
baseResponse.setCode(BusinessExceptionEnum.SUCCESS.getCode());
baseResponse.setData(t);
return baseResponse;
}
/**
* 200,带默认提示信息和响应数据
*
* @param t 响应数据
* @param msg 提示信息
* @param <T> 响应数据类型
* @return BaseResponse
*/
public static <T> BaseResponse<T> okDataMsg(T t, String msg) {
BaseResponse<T> baseResponse = new BaseResponse<>();
baseResponse.setMsg(msg);
baseResponse.setCode(BusinessExceptionEnum.SUCCESS.getCode());
baseResponse.setData(t);
return baseResponse;
}
/**
* 400,带提示信息
*
* @param msg 提示信息
* @param <T> 响应数据类型
* @return BaseResponse
*/
public static <T> BaseResponse<T> errorMsg(String msg) {
BaseResponse<T> baseResponse = new BaseResponse<>();
baseResponse.setMsg(msg);
baseResponse.setCode(BusinessExceptionEnum.BUSINESS_ERROR.getCode());
baseResponse.setData(null);
return baseResponse;
}
}
package cn.wise.sc.cement.tcdri.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @description: 分页查询页大小的Query对象
* @author: qinhu
* @create: 2019-11-05 15:40
**/
@Data
@ApiModel
public class PageQuery implements Serializable {
private static final long serialVersionUID = 3979320797076183357L;
@ApiModelProperty(value = "当前所在页码")
private Integer pageNo = 0;
@ApiModelProperty(value = "每页显示数量")
private Integer pageSize = 10;
}
package cn.wise.sc.cement.tcdri.model;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
/**
* @description: 分页条件查询 mybatis解析
* @author: qh
* @create: 2020-01-08 22:11
**/
public class PageWrapperQueryMyBatisResolver {
public static WrapperQuery create() {
return new WrapperQuery();
}
/**
* 组装查询条件
*
* @param query
* @return
*/
public static QueryWrapper getQueryWrapper(WrapperQuery query) {
QueryWrapper queryWrapper = Wrappers.query();
//拼装等于条件
if (query.getEq() != null) {
for (String key : query.getEq().keySet()) {
queryWrapper.eq(key, query.getEq().get(key));
}
}
//拼装小于条件
if (query.getLt() != null) {
for (String key : query.getLt().keySet()) {
queryWrapper.lt(key, query.getLt().get(key));
}
}
//拼装小于等于条件
if (query.getLe() != null) {
for (String key : query.getLe().keySet()) {
queryWrapper.le(key, query.getLe().get(key));
}
}
//拼装大于于条件
if (query.getGt() != null) {
for (String key : query.getGt().keySet()) {
queryWrapper.gt(key, query.getGt().get(key));
}
}
//拼装大于等于条件
if (query.getGe() != null) {
for (String key : query.getGe().keySet()) {
queryWrapper.ge(key, query.getGe().get(key));
}
}
//in条件
if (query.getIn() != null) {
for (String key : query.getIn().keySet()) {
queryWrapper.in(key, query.getIn().get(key));
}
}
//拼装like条件
if (query.getLike() != null) {
for (String key : query.getLike().keySet()) {
queryWrapper.like(key, query.getLike().get(key));
}
}
if (query.getOr() != null) {
for (String key : query.getOr().keySet()) {
queryWrapper.or(true).eq(key, query.getLike().get(key));
}
}
if (StrUtil.isNotEmpty(query.getSql())) {
queryWrapper.last(query.getSql());
}
return queryWrapper;
}
}
package cn.wise.sc.cement.tcdri.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* @description: 分页条件查询
* @author: qh
* @create: 2019-12-16 15:26
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WrapperQuery {
/**
* 分页
*/
private PageQuery pageQuery;
/**
* 等于
*/
private Map<String,Object> eq;
/**
* 小于
*/
private Map<String,Object> lt;
/**
* 小于等于
*/
private Map<String,Object> le;
/**
* 大于
*/
private Map<String,Object> gt;
/**
* 大于等于
*/
private Map<String,Object> ge;
/**
* like
*/
private Map<String,Object> like;
/**
* 或者
*/
private Map<String,Object> or;
/**
* sql条件
*/
private String sql;
/**
* in条件
*/
private Map<String, List<Long>> in;
}
package cn.wise.sc.cement.tcdri.model.query;
/**
* @description:
* @author: qh
* @create: 2020-08-07 16:12
**/
public class BaseQuery {
}
package cn.wise.sc.cement.tcdri.model.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import javax.validation.constraints.NotEmpty;
/**
* @description: 委托方请求
* @author: qh
* @create: 2020-08-07 14:58
**/
@Data
@RequiredArgsConstructor
@NoArgsConstructor
@ApiModel("委托单位请求")
public class ClientQuery {
private Integer id;
@ApiModelProperty(name = "name", value = "委托单位名")
@NotEmpty(message = "委托单位不能为空!")
@NonNull
private String name;
@ApiModelProperty(name = "principal", value = "委托单位联系人")
@NotEmpty(message = "单位联系人不能为空!")
@NonNull
private String principal;
@ApiModelProperty(name = "principalPhone", value = "委托单位联系人电话")
@NotEmpty(message = "单位联系人电话不能为空!")
@NonNull
private String principalPhone;
@ApiModelProperty(name = "region", value = "委托单位所在地区")
@NotEmpty(message = "委托单位所在地区不能为空!")
@NonNull
private String region;
}
package cn.wise.sc.cement.tcdri.model.query;
import lombok.Data;
/**
* @description:
* @author: qh
* @create: 2020-08-07 15:42
**/
@Data
public class ProjectQuery {
private Integer id;
private String name;
private String code;
private Integer clientId;
}
package cn.wise.sc.cement.tcdri.model.vo;
/**
* @description:
* @author: qh
* @create: 2020-08-07 15:59
**/
public class BaseVo {
}
package cn.wise.sc.cement.tcdri.model.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @description: 委托单位Vo
* @author: qh
* @create: 2020-08-07 15:09
**/
@Data
public class ClientVo extends BaseVo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
/**
* 单位名
*/
private String name;
/**
* 负责人
*/
private String principal;
/**
* 负责人电话
*/
private String principalPhone;
/**
* 所在地区:xx省xx县xx
*/
private String region;
/**
* 状态 0:禁用 1:激活
*/
private String status;
/**
* 项目名字
*/
private List<String> projects;
}
package cn.wise.sc.cement.tcdri.model.vo;
import lombok.Data;
import java.io.Serializable;
/**
* @description: 项目vo
* @author: qh
* @create: 2020-08-07 15:41
**/
@Data
public class ProjectVo extends BaseVo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
/**
* 项目名
*/
private String name;
/**
* 项目编号:客户自己填的
*/
private String code;
/**
* 委托单位名
*/
private String clientName;
/**
* 状态
*/
private String status;
}
package cn.wise.sc.cement.tcdri.service;
import cn.wise.sc.cement.tcdri.entity.Client;
import cn.wise.sc.cement.tcdri.model.BaseResponse;
import cn.wise.sc.cement.tcdri.model.PageQuery;
import cn.wise.sc.cement.tcdri.model.query.ClientQuery;
import cn.wise.sc.cement.tcdri.model.vo.ClientVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author ztw
* @since 2020-08-07
*/
public interface IClientService extends IService<Client> {
/**
* 获取分页
* @param pageQuery 分页
* @param status 状态
* @param region 所在地区
* @param principal 负责人名字
* @return IPage<ClientVo>
*/
BaseResponse<IPage<ClientVo>> getPage(PageQuery pageQuery, Integer status, String region, String principal);
/**
* 获取所有启动的单位信息
*
* @return List
*/
BaseResponse<List<ClientVo>> getList();
/**
* 新增委托单位
*
* @param clientQuery query
* @return ClientVo
*/
BaseResponse<ClientVo> create(final ClientQuery clientQuery);
/**
* 更新委托单位
*
* @param clientQuery query
* @return ClientVo
*/
BaseResponse<ClientVo> update(final ClientQuery clientQuery);
/**
* 启用禁用
*
* @param status 状态
* @param id id
* @return Boolean
*/
BaseResponse<Boolean> status(Integer status, Integer id);
}
package cn.wise.sc.cement.tcdri.service;
import cn.wise.sc.cement.tcdri.entity.Project;
import cn.wise.sc.cement.tcdri.model.BaseResponse;
import cn.wise.sc.cement.tcdri.model.PageQuery;
import cn.wise.sc.cement.tcdri.model.query.ProjectQuery;
import cn.wise.sc.cement.tcdri.model.vo.ProjectVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author ztw
* @since 2020-08-07
*/
public interface IProjectService extends IService<Project> {
/**
* 获取分页
*
* @param pageQuery 分页
* @param status 状态
* @param clientId 委托方单位id
* @return IPage<ProjectVo>
*/
BaseResponse<IPage<ProjectVo>> getPage(PageQuery pageQuery, Integer status, Integer clientId);
/**
* 获取所有启动的单位信息
*
* @return List
*/
BaseResponse<List<ProjectVo>> getList();
/**
* 新增项目
*
* @param query query
* @return ProjectVo
*/
BaseResponse<ProjectVo> create(ProjectQuery query);
/**
* 编辑
*
* @param query query
* @return ProjectVo
*/
BaseResponse<ProjectVo> update(ProjectQuery query);
/**
* 启用禁用
*
* @param status 状态
* @param id id
* @return Boolean
*/
BaseResponse<Boolean> status(Integer status, Integer id);
}
package cn.wise.sc.cement.tcdri.service;
import cn.wise.sc.cement.tcdri.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author ztw
* @since 2020-08-07
*/
public interface IUserService extends IService<User> {
}
package cn.wise.sc.cement.tcdri.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.wise.sc.cement.tcdri.entity.Client;
import cn.wise.sc.cement.tcdri.entity.Project;
import cn.wise.sc.cement.tcdri.exception.BusinessExceptionEnum;
import cn.wise.sc.cement.tcdri.mapper.ClientMapper;
import cn.wise.sc.cement.tcdri.model.BaseResponse;
import cn.wise.sc.cement.tcdri.model.PageQuery;
import cn.wise.sc.cement.tcdri.model.query.ClientQuery;
import cn.wise.sc.cement.tcdri.model.vo.ClientVo;
import cn.wise.sc.cement.tcdri.service.IClientService;
import cn.wise.sc.cement.tcdri.service.IProjectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 服务实现类
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@Service
public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> implements IClientService {
final
IProjectService iProjectService;
public ClientServiceImpl(IProjectService iProjectService) {
this.iProjectService = iProjectService;
}
@Override
public BaseResponse<IPage<ClientVo>> getPage(PageQuery pageQuery, Integer status, String region, String principal) {
QueryWrapper<Client> qw = new QueryWrapper<>();
qw.orderByDesc("id");
if (status != null) {
qw.eq("status", status);
}
if (StrUtil.isNotBlank(region)) {
qw.like("region", region);
}
if (StrUtil.isNotBlank(principal)) {
qw.like("principal", principal);
}
IPage<Client> page = new Page<>(pageQuery.getPageNo(), pageQuery.getPageSize());
this.page(page);
IPage<ClientVo> rts = new Page<>(pageQuery.getPageNo(), pageQuery.getPageSize());
//关联项目名
List<Client> records = page.getRecords();
if (records == null) {
return BaseResponse.okData(rts);
}
List<Integer> clientIds = records.stream().map(Client::getId).collect(Collectors.toList());
BusinessExceptionEnum.COLLECTION_NOT_ILLEGAL.assertCollectionNotILLEGAL(clientIds);
QueryWrapper<Project> qwProject = new QueryWrapper<>();
qwProject.in("client_id",clientIds);
List<Project> projects = iProjectService.list(qwProject);
List<ClientVo> rtsRe = new ArrayList<>(page.getRecords().size());
for (Client client : page.getRecords()) {
ClientVo clientVo = client.toVo();
List<String> projectNames = new ArrayList<>();
projects.forEach(arg->{
if (arg.getClientId().intValue() == client.getId()){
projectNames.add(arg.getName());
}
});
clientVo.setProjects(projectNames);
rtsRe.add(clientVo);
}
rts.setRecords(rtsRe);
return BaseResponse.okData(rts);
}
@Override
public BaseResponse<List<ClientVo>> getList() {
QueryWrapper<Client> qw = new QueryWrapper<>();
qw.eq("status", 1);
List<Client> list = this.list(qw);
List<ClientVo> rts = new ArrayList<>(list.size());
list.forEach(arg -> {
ClientVo clientVo = new ClientVo();
clientVo.setId(arg.getId());
clientVo.setName(arg.getName());
rts.add(clientVo);
});
return BaseResponse.okData(rts);
}
@Override
public BaseResponse<ClientVo> create(final ClientQuery clientQuery) {
//判断名字是否重复
if (clientIsExisting(clientQuery.getName())) {
return BaseResponse.errorMsg("当前单位名已存在!");
}
Client crate = Client.crate(clientQuery);
this.save(crate);
return BaseResponse.okData(crate.toVo());
}
@Override
public BaseResponse<ClientVo> update(final ClientQuery clientQuery) {
//判断名字是否重复
if (clientIsExisting(clientQuery.getName())) {
return BaseResponse.errorMsg("当前单位名已存在!");
}
Client update = Client.crate(clientQuery);
update.setId(clientQuery.getId());
this.updateById(update);
return BaseResponse.okData(update.toVo());
}
@Override
public BaseResponse<Boolean> status(Integer status, Integer id) {
BusinessExceptionEnum.BAD_LICENCE_TYPE.assertNotNull(status);
BusinessExceptionEnum.BAD_LICENCE_TYPE.assertNotNull(id);
Client update = new Client();
update.setId(id);
update.setStatus(status == 1);
return BaseResponse.okData(this.updateById(update));
}
/**
* 判断单位是否重复
*
* @param name 单位名
* @return bool
*/
private boolean clientIsExisting(String name) {
BusinessExceptionEnum.BAD_LICENCE_TYPE.assertNotNull(name);
//判断名字是否重复
QueryWrapper<Client> qw = new QueryWrapper<>();
qw.eq("name", name);
qw.eq("status", 1);
int count = this.count(qw);
return count > 0;
}
}
package cn.wise.sc.cement.tcdri.service.impl;
import cn.wise.sc.cement.tcdri.entity.Client;
import cn.wise.sc.cement.tcdri.entity.Project;
import cn.wise.sc.cement.tcdri.exception.BusinessExceptionEnum;
import cn.wise.sc.cement.tcdri.mapper.ProjectMapper;
import cn.wise.sc.cement.tcdri.model.BaseResponse;
import cn.wise.sc.cement.tcdri.model.PageQuery;
import cn.wise.sc.cement.tcdri.model.query.ProjectQuery;
import cn.wise.sc.cement.tcdri.model.vo.ProjectVo;
import cn.wise.sc.cement.tcdri.service.IClientService;
import cn.wise.sc.cement.tcdri.service.IProjectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 服务实现类
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@Service
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements IProjectService {
final
IClientService iClientService;
public ProjectServiceImpl(IClientService iClientService) {
this.iClientService = iClientService;
}
@Override
public BaseResponse<IPage<ProjectVo>> getPage(final PageQuery pageQuery,
final Integer status,
final Integer clientId) {
QueryWrapper<Project> qw = new QueryWrapper<>();
qw.orderByDesc("id");
if (status != null) {
qw.eq("status", status);
}
if (clientId != null && clientId > 0) {
qw.like("client_id", clientId);
}
IPage<Project> page = new Page<>(pageQuery.getPageNo(), pageQuery.getPageSize());
this.page(page);
//Client_id的委托单位列表
List<Project> records = page.getRecords();
List<Integer> clientIds = records.stream().map(Project::getClientId).collect(Collectors.toList());
QueryWrapper<Client> qwClient = new QueryWrapper<>();
qwClient.in("client_id", clientIds);
List<Client> clients = iClientService.list(qwClient);
BusinessExceptionEnum.COLLECTION_NOT_ILLEGAL.assertCollectionNotILLEGAL(clients);
IPage<ProjectVo> rts = new Page<>(pageQuery.getPageNo(), pageQuery.getPageSize());
List<ProjectVo> rtsRe = new ArrayList<>(page.getRecords().size());
for (Project project : page.getRecords()) {
ProjectVo projectVo = project.toVo();
//Client_id转ClientName
clients.forEach(arg -> {
if (arg.getId().intValue() == project.getClientId()) {
projectVo.setClientName(arg.getName());
}
});
rtsRe.add(projectVo);
}
rts.setRecords(rtsRe);
return BaseResponse.okData(rts);
}
@Override
public BaseResponse<List<ProjectVo>> getList() {
QueryWrapper<Project> qw = new QueryWrapper<>();
qw.eq("status", 1);
List<Project> list = this.list(qw);
List<ProjectVo> rts = new ArrayList<>(list.size());
list.forEach(arg -> {
ProjectVo modelVo = new ProjectVo();
modelVo.setId(arg.getId());
modelVo.setName(arg.getName());
rts.add(modelVo);
});
return BaseResponse.okData(rts);
}
@Override
public BaseResponse<ProjectVo> create(ProjectQuery query) {
if (projectIsExisting(query.getCode(), query.getClientId())) {
return BaseResponse.errorMsg("项目编号已存在!");
}
Project crate = Project.crate(query);
this.save(crate);
return BaseResponse.okData(crate.toVo());
}
@Override
public BaseResponse<ProjectVo> update(ProjectQuery query) {
//判断名字是否重复
if (projectIsExisting(query.getName(), query.getClientId())) {
return BaseResponse.errorMsg("项目编号已存在!");
}
Project update = Project.crate(query);
update.setId(query.getId());
this.updateById(update);
return BaseResponse.okData(update.toVo());
}
@Override
public BaseResponse<Boolean> status(Integer status, Integer id) {
BusinessExceptionEnum.BAD_LICENCE_TYPE.assertNotNull(status);
BusinessExceptionEnum.BAD_LICENCE_TYPE.assertNotNull(id);
Project update = new Project();
update.setId(id);
update.setStatus(status == 1);
return BaseResponse.okData(this.updateById(update));
}
private boolean projectIsExisting(String code, Integer clientId) {
BusinessExceptionEnum.BAD_LICENCE_TYPE.assertNotNull(code);
//判断名字是否重复
QueryWrapper<Project> qw = new QueryWrapper<>();
qw.eq("code", code);
qw.eq("status", 1);
int count = this.count(qw);
//判断单位是否存在可用
if (clientId != null) {
QueryWrapper<Client> isExistingClient = new QueryWrapper<>();
isExistingClient.eq("status", 1);
isExistingClient.eq("id", clientId);
count += iClientService.count(isExistingClient);
}
return count > 0;
}
}
package cn.wise.sc.cement.tcdri.service.impl;
import cn.wise.sc.cement.tcdri.entity.User;
import cn.wise.sc.cement.tcdri.mapper.UserMapper;
import cn.wise.sc.cement.tcdri.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author ztw
* @since 2020-08-07
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
server:
port: 7005
spring:
application: tianjin-cement
profiles:
active: dev
datasource:
#admin!@#123
url: jdbc:mysql://192.168.110.85:3306/sinoma_tcdri?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: admin!@#123
driverClassName: com.mysql.jdbc.Driver
hikari:
minimum-idle: 3
maximum-pool-size: 10
max-lifetime: 30000 #不能小于30秒,否则默认回到1800秒
connection-test-query: SELECT 1
redis:
port: 6379
host: localhost
# password: Wise_@123456
# 设置swagger用户名密码
swagger:
basic:
enable: false
username: admin
password: admin
mybatis-plus:
# 启动时是否检查MyBatis XML文件是否存在
check-config-location: true
type-aliases-package: cn.wise.sc.cement.business.entity.**
mapper-locations: classpath:/cn/wise/sc/cement/business/mapper/xml/*Mapper.xml
\ No newline at end of file
This diff is collapsed.
<?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">
<parent>
<artifactId>cement-common</artifactId>
<groupId>cn.wise.sc.tjcement</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common-swagger</artifactId>
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package cn.wise.sc.cement.common.swagger;
/**
* @Auther: yangjing
* @Date: 2020/3/29 12:17
* @ClassName: PACKAGE_NAME
* @Description: TODO
*/
public class PackageInfo {
}
package cn.wise.sc.cement.common.swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @Auther: yangjing
* @Date: 2020/3/29 12:17
* @ClassName: PACKAGE_NAME
* @Description: TODO
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurerAdapter {
@Bean
public Docket createRestApi() {// 创建API基本信息
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("cn.wise.sc.consume"))// 扫描该包下的所有需要在Swagger中展示的API,@ApiIgnore注解标注的除外
.paths(PathSelectors.any())//egex("/api/.*") 拦截的接口路径
.build();
}
private ApiInfo apiInfo() {// 创建API的基本信息,这些信息会在Swagger UI中进行显示
return new ApiInfoBuilder()
.title("swagger-api")// API 标题
.description("系统接口测试对接api")// API描述
.contact("杨**")// 联系人
// .license("Apache License Version 2.0")// 开源协议
.version("1.0")// 版本号
.build();
}
/**
* 重定向静态资源的路径,千万不要注释 不然 你们在访问api的时候会404的
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/");
// //下面是图片的虚拟路径配置
// registry.addResourceHandler(fileVirtualPath+"**").
// addResourceLocations("file:"+fileRealPath);
}
}
<?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">
<parent>
<artifactId>tianjin-cement</artifactId>
<groupId>cn.wise.sc.tjcement</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cement-common</artifactId>
<packaging>pom</packaging>
<modules>
<module>common-swagger</module>
</modules>
</project>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment