提交 547107b4 authored 作者: liupengfei's avatar liupengfei

添加字段更改,分页查询列表

上级 04a1d8c8
......@@ -9,7 +9,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
<version>2.0.6.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
......@@ -87,6 +87,46 @@
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!--阿里的连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
</dependencies>
<build>
......
......@@ -4,10 +4,13 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import tk.mybatis.spring.annotation.MapperScan;
/**
* 启动入口
*/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@SpringBootApplication
@MapperScan(basePackages = {"com.mapper.*"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
......
package com.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* 访问地址
* http://ip:port/swagger-ui.html
最常用的5个注解
@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述
@ApiModel:用对象来接收参数
@ApiModelProperty:用对象接收参数时,描述对象的一个字段
其它若干
@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiClass
@ApiError
@ApiErrors
@ApiParamImplicit
@ApiParamsImplicit
*/
@EnableSwagger2
@Configuration
public class Swagger2Config {
@Value("${server.env}")
private String env;
@Bean
public Docket createRestApi() {
String path = "com.prod";
if ("test".equals(env)) {
path = "com.controller";
}
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(path))
.paths(PathSelectors.any())
.build();
}
//构建 api文档的详细信息函数
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("测试使用 Swagger2 构建RESTful API")
//描述
.description("服务 API 描述")
//创建人
//.contact(new Contact("", "www.baidu.com", "cxinchang@126.com"))
//版本号
.version("4.0")
.build();
}
}
\ No newline at end of file
......@@ -15,4 +15,9 @@ public class URLConstant {
*获取用户姓名的接口url
*/
public static final String URL_USER_GET = "https://oapi.dingtalk.com/user/get";
/**
* 获取部门用户
*/
public static final String URL_USER_SIMPLELIST = "https://oapi.dingtalk.com/user/simplelist";
}
......@@ -66,6 +66,7 @@ public class IndexController {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("userId", userId);
resultMap.put("userName", userName);
// TODO 获取用户权限
ServiceResult serviceResult = ServiceResult.success(resultMap);
return serviceResult;
}
......
package com.controller.customer;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.form.customer.QueryCustomerForm;
import com.model.customer.Customer;
import com.service.customer.CustomerService;
import com.util.CallBack;
import com.util.PageInfo;
import com.util.PageParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@RestController
@RequestMapping("/customer")
@Api(description = "客户管理")
public class CustomerController {
@Autowired
private CustomerService service;
@ApiOperation(value = "保存客户信息", notes = "保存客户信息")
@PostMapping("/save")
public CallBack<?> save(Customer entity){
entity.setCreateTime(new Date());
service.insert(entity);
return CallBack.success();
}
@ApiOperation(value = "查询客户信息", notes = "查询全部客户信息")
@GetMapping("/page")
public CallBack<PageInfo<Customer>> page(PageParam pageParam, QueryCustomerForm form) {
return CallBack.success(service.page(pageParam, form));
}
}
package com.controller.dingding;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -7,6 +9,9 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.config.DingDingParam;
import com.config.URLConstant;
import com.dingtalk.api.DefaultDingTalkClient;
......@@ -16,6 +21,8 @@ import com.dingtalk.api.response.OapiUserSimplelistResponse;
import com.taobao.api.ApiException;
import com.util.AccessTokenUtil;
import com.util.ServiceResult;
import com.vo.dingding.SimpleUserListVo;
import com.vo.dingding.SimpleUserVo;
/**
* 钉钉 用户对接接口
......@@ -33,20 +40,20 @@ public class UserController {
/**
* 获取部门用户
* 获取部门用户,默认获取市场部下所有人员
* @param departmentId 部门id
* @return
* @author lpf
* @date: 2020年3月15日 下午10:12:20
*/
@GetMapping("/simplelist")
public ServiceResult simplelist(Long departmentId) {
public ServiceResult<List<SimpleUserVo>> simplelist(Long departmentId) {
if (departmentId == null) {
departmentId = param.getSalesDepartmentId();
}
// 获取调用接口凭证
String accessToken = AccessTokenUtil.getToken();
DingTalkClient client = new DefaultDingTalkClient(URLConstant.URL_GET_USER_INFO);
DingTalkClient client = new DefaultDingTalkClient(URLConstant.URL_USER_SIMPLELIST);
OapiUserSimplelistRequest request = new OapiUserSimplelistRequest();
request.setHttpMethod("GET");
request.setDepartmentId(departmentId);
......@@ -59,8 +66,9 @@ public class UserController {
return ServiceResult.failure("-2", "获取部门用户调用接口失败:" + e.toString());
}
if (response.isSuccess()) {
// TODO 获取部门用户列表
SimpleUserListVo vo = JSON.parseObject(response.getBody(), SimpleUserListVo.class);
return ServiceResult.success(vo.getUserlist());
}
return ServiceResult.failure("-3", response.toString());
return ServiceResult.failure("-3", response.getBody());
}
}
package com.enums;
public enum BooleanStatusEnum {
/** 是 */
YES("1","是"),
/** 否 */
NO("0","否");
private final String code;
private final String name;
private BooleanStatusEnum(String code, String name) {
this.code = code;
this.name = name;
}
/**
* 判断名称是否有效
* @param name
* @return
* @author lpf
* @date: 2018年6月11日 下午6:30:16
*/
public static boolean isExist(String code) {
BooleanStatusEnum[] enums = BooleanStatusEnum.values();
for (BooleanStatusEnum BooleanStatusEnum : enums) {
if (BooleanStatusEnum.code.equals(code)) {
return true;
}
}
return false;
}
/**
* 根据code 获取名字
* @Title getName
* @param code
* @return String
* @author Conan
* @date 2018年6月19日 上午11:28:16
*/
public static String getName(String code) {
BooleanStatusEnum[] enums = BooleanStatusEnum.values();
for (BooleanStatusEnum BooleanStatusEnum : enums) {
if (BooleanStatusEnum.code.equals(code)) {
return BooleanStatusEnum.name;
}
}
return null;
}
/**
* 根据名字 获取code
* @Title getCode
* @param name
* @return String
* @author Conan
* @date 2018年7月9日 下午2:52:30
*/
public static String getCode(String name) {
BooleanStatusEnum[] enums = BooleanStatusEnum.values();
for (BooleanStatusEnum BooleanStatusEnum : enums) {
if (BooleanStatusEnum.name.equals(name)) {
return BooleanStatusEnum.code;
}
}
return null;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
}
package com.enums;
import java.util.HashMap;
import java.util.stream.Stream;
import com.enums.interfaces.EnumsInterface;
/**
* 0:测试环境
* 1:生产环境
* @author lpf
* @date 2019年3月22日上午10:04:17
*/
public enum EnvironmentEnum implements EnumsInterface<String>{
/** 测试环境 */
TEST("0","测试环境"),
/** 生产环境 */
PRODUCT("1","生产环境");
//状态码
private final String code;
private final String name;
private static final HashMap<String,String> MAP = new HashMap<String,String>();
static {
stream().forEach(e -> {
MAP.put(e.code, e.name);
});
}
/**
* @return
* @author lpf
* @date: 2019年3月18日 下午5:05:16
*/
public static Stream<EnvironmentEnum> stream(){
return Stream.of(values());
}
private EnvironmentEnum(String code, String name) {
this.code = code;
this.name = name;
}
/**
* 判断名称是否有效
* @param name
* @return
* @author lpf
* @date: 2018年6月11日 下午6:30:16
*/
public static boolean isExist(String code) {
return stream().anyMatch(e -> e.code.equals(code));
}
/**
* 通过ID获取中文名称
* @param code
* @return
*/
public static String getName(String code) {
return stream().filter(e -> e.code.equals(code)).findFirst().map(e -> e.name).orElse(null);
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public static HashMap<String, String> getMap() {
return MAP;
}
}
package com.enums;
/**
* 响应编码
* @ClassName ReponseCodeEnum
* @Description:
* @author lpf
* @date 2018年5月9日下午4:27:58
*
*/
public enum ResponseCodeEnum {
/** 200 ,操作成功" */
OK(0,"操作成功"),
/** -1,操作失败" */
FAIL(-1,"操作失败"),
/** 500,服务器异常" */
EXCEPTION(500,"服务器异常"),
/** 600, BaseException */
BASE_EXCEPTION(600, "BaseException"),
/** -2,验证不通过" */
VALIDATE(-2,"验证不通过"),
/** -4 接口调用 参数类型转换异常*/
BIND_EXCEPTION(-4,"参数不合法"),
/** -5 接口调用缺少必填参数 */
MISS_EXCEPTION(-5,"缺少必填参数"),
/** -6 登录过期或未登录 */
NO_LOGIN(-6,"请重新登录");
private final int code;
private final String msg;
private ResponseCodeEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
package com.enums.interfaces;
import java.util.List;
/**
* 枚举类型接口,用于给枚举绑定操作
* @author lpf
* @date 2019年1月4日上午11:59:53
*/
public interface EnumsBindBean<T extends EnumsInterface<?>> {
/**
* 获取绑定的枚举
* @return
* @author lpf
* @date: 2019年1月4日 下午12:41:05
*/
List<T> getEnums();
}
package com.enums.interfaces;
public interface EnumsInterface<T> {
/**
* 获取编码
* @return
* @author lpf
* @date: 2019年1月4日 下午12:01:13
*/
T getCode();
/**
* 获取中文含义
* @return
* @author lpf
* @date: 2019年1月4日 下午12:01:44
*/
T getName();
}
package com.enums.interfaces;
import org.slf4j.Logger;
public interface LoggerFactory {
Logger getLog();
}
package com.enums.interfaces.bean;
import com.enums.interfaces.EnumsBindBean;
import com.enums.interfaces.EnumsInterface;
import lombok.Data;
/**
* 枚举绑定的对象
* @author lpf
* @date 2019年1月7日上午9:11:07
*/
@Data
public class EnumsBindObject<T extends EnumsInterface<?>> {
/** 绑定的对象 在spring容器中的名称 */
private String name;
/** 对象绑定的 枚举 */
private T enumObject;
/** 绑定的对象 */
private EnumsBindBean<T> bindBean;
}
package com.enums.sql;
import java.util.HashMap;
import java.util.stream.Stream;
import com.enums.interfaces.EnumsInterface;
import com.enums.sql.impl.LikeSqlCondition;
import com.enums.sql.impl.ListSqlCondition;
import com.enums.sql.impl.RegexpSqlCondition;
import com.enums.sql.impl.SimpleSqlCondition;
import com.excetion.BaseException;
/**
* sql 条件枚举
* @author lpf
* @date 2019年7月31日下午4:43:10
*/
public enum SqlConditionEnum implements EnumsInterface<String>{
/** equal to 等于 */
EQ("=", "eq", SimpleSqlCondition.getInstance()),
/** less than 小于 */
LT("&lt;", "lt", SimpleSqlCondition.getInstance()),
/** greater than 大于 */
GT("&gt;", "gt", SimpleSqlCondition.getInstance()),
/** less than or equal to 小于等于 */
LE("&lt;=", "le", SimpleSqlCondition.getInstance()),
/** greater than or equal to 大于等于 */
GE("&gt;=", "ge", SimpleSqlCondition.getInstance()),
/** not equal to 不等于 &lt;&gt; */
NE("!=", "ne", SimpleSqlCondition.getInstance()),
/** in */
IN("in", "in", ListSqlCondition.getInstance()),
/** not in */
NIN("not in", "nin", ListSqlCondition.getInstance()),
/** all like */
LIKE("like", "like", LikeSqlCondition.getInstance()),
/** right like */
RIGHT_LIKE("like","rlike", LikeSqlCondition.getInstance()),
/** left like */
LEFT_LIKE("like", "llike", LikeSqlCondition.getInstance()),
/** REGEXP */
REGEXP("REGEXP","regexp", RegexpSqlCondition.getInstance());
/**
* regular: SqlConditionEnum
*/
private static final HashMap<String,SqlConditionEnum> MAP = new HashMap<String,SqlConditionEnum>();
/** 数据库关键字 */
private final String key;
/** 正则匹配内容 */
private final String regular;
private final SqlConditionInterface fun;
private SqlConditionEnum(String key, String regular,SqlConditionInterface fun) {
this.key = key;
this.regular = regular;
this.fun = fun;
}
static {
stream().forEach(e -> {
MAP.put(e.regular, e);
});
}
/**
* @return
* @author lpf
* @date: 2019年3月18日 下午5:05:16
*/
public static Stream<SqlConditionEnum> stream(){
return Stream.of(values());
}
/**
* 根据正则匹配查找枚举
* @param regular
* @return
* @author lpf
* @date: 2019年7月31日 下午5:13:00
*/
public static SqlConditionEnum get(String regular) {
SqlConditionEnum result = MAP.get(regular);
if (result == null) {
throw new BaseException("根据regular获取SqlConditionEnum为空:"+ regular);
}
return result;
}
public String getKey() {
return key;
}
public String getRegular() {
return regular;
}
@Override
public String getCode() {
return regular;
}
@Override
public String getName() {
return key;
}
public SqlConditionInterface getFun() {
return fun;
}
}
package com.enums.sql;
import com.enums.interfaces.EnumsBindBean;
/**
* sql操作 行为接口
* @author lpf
* @date 2019年8月1日下午2:27:39
*/
public interface SqlConditionInterface extends EnumsBindBean<SqlConditionEnum> {
/**
* sql条件缩写转换为 xml判断条件
* eq(m.type, query.type) ->
* <if test = 'NOTBLANK (query.type)'>
* and m.type = #{query.type}
* </if>
* @param en xml中运算符号 SqlConditionEnum.key
* @param column 列名
* @param attr 属性名
* @return
* @author lpf
* @date: 2019年8月1日 下午2:22:19
*/
String apply(SqlConditionEnum en, String column, String attr);
}
package com.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.enums.sql.SqlConditionEnum;
import com.enums.sql.SqlConditionInterface;
import com.mapper.BaseMapper;
public class LikeSqlCondition implements SqlConditionInterface{
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.LIKE,SqlConditionEnum.RIGHT_LIKE,SqlConditionEnum.LEFT_LIKE);
}
/**
* like(m.name,query.name)
* "<if test = '" + NOTBLANK + "(query.name)'> "
" and m.name like concat('%',#{query.name},'%') "
" </if> "
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(java.lang.String, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:01:30
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.NOTBLANK);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" concat(");
if (SqlConditionEnum.LIKE.equals(en) || SqlConditionEnum.LEFT_LIKE.equals(en)) {
sb.append("'%',");
}
sb.append(" #{");
sb.append(attr);
sb.append("}");
if (SqlConditionEnum.LIKE.equals(en) || SqlConditionEnum.RIGHT_LIKE.equals(en)) {
sb.append(",'%'");
}
sb.append(")");
sb.append(" </if>");
return sb.toString();
}
private LikeSqlCondition(){}
public static LikeSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final LikeSqlCondition LAZY = new LikeSqlCondition();
}
}
package com.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.enums.sql.SqlConditionEnum;
import com.enums.sql.SqlConditionInterface;
import com.mapper.BaseMapper;
/**
* 解析list操作
* @author lpf
* @date 2019年8月1日下午2:35:45
*/
public class ListSqlCondition implements SqlConditionInterface{
/**
* in notin
* @see com.zrqx.core.enums.interfaces.EnumsBindBean#getEnums()
* @return
* @author lpf
* @date: 2019年8月1日 下午2:37:16
*/
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.IN, SqlConditionEnum.NIN);
}
/**
* in(m.type, query.type)
* <if test=' LIST_NOT_EMPTY ( query.type )'>
AND query.type in
<foreach item='item' index='index' collection= 'query.type' open='(' separator=',' close=')'>
#{item}
</foreach>
</if>
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(com.zrqx.core.enums.sql.SqlConditionEnum, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:18:58
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.LIST_NOT_EMPTY);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" <foreach item='item' index='index' collection= '");
sb.append(attr);
sb.append("' open='(' separator=',' close=')'> ");
sb.append("#{item}");
sb.append(" </foreach>");
sb.append(" </if>");
return sb.toString();
}
private ListSqlCondition(){}
public static ListSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final ListSqlCondition LAZY = new ListSqlCondition();
}
}
package com.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.enums.sql.SqlConditionEnum;
import com.enums.sql.SqlConditionInterface;
import com.mapper.BaseMapper;
public class RegexpSqlCondition implements SqlConditionInterface{
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.REGEXP);
}
/**
*
* @see com.zrqx.core.enums.sql.SqlConditionInterface#apply(com.zrqx.core.enums.sql.SqlConditionEnum, java.lang.String, java.lang.String)
* @param en
* @param column
* @param attr
* @return
* @author lpf
* @date: 2019年8月1日 下午3:30:48
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.LIST_NOT_EMPTY);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" REPLACE(<foreach item='item' index='index' collection= '");
sb.append(attr);
sb.append("' open='(' separator=',' close=')'> ");
sb.append("^#{item}");
sb.append(" </foreach>,' ','') ");
sb.append(" </if>");
return sb.toString();
}
private RegexpSqlCondition(){}
public static RegexpSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final RegexpSqlCondition LAZY = new RegexpSqlCondition();
}
}
package com.enums.sql.impl;
import java.util.Arrays;
import java.util.List;
import com.enums.sql.SqlConditionEnum;
import com.enums.sql.SqlConditionInterface;
import com.mapper.BaseMapper;
/**
* 简单操作
* @author lpf
* @date 2019年8月1日下午2:35:27
*/
public class SimpleSqlCondition implements SqlConditionInterface{
/**
* = < > <= >= !=
* @see com.zrqx.core.enums.interfaces.EnumsBindBean#getEnums()
* @return
* @author lpf
* @date: 2019年8月1日 下午2:33:27
*/
@Override
public List<SqlConditionEnum> getEnums() {
return Arrays.asList(SqlConditionEnum.EQ,
SqlConditionEnum.LT,
SqlConditionEnum.GT,
SqlConditionEnum.LE,
SqlConditionEnum.GE,
SqlConditionEnum.NE);
}
/**
* sql条件缩写转换为 xml判断条件
* eq(m.type, query.type) ->
* <if test = 'NOTBLANK (query.type)'>
* and m.type = #{query.type}
* </if>
* @param en xml中运算符号 SqlConditionEnum.key
* @param column 列名
* @param attr 属性名
* @return
* @author lpf
* @date: 2019年8月1日 下午2:22:19
*/
@Override
public String apply(SqlConditionEnum en, String column, String attr) {
StringBuffer sb = new StringBuffer(" <if test = '");
sb.append(BaseMapper.NOTBLANK);
sb.append("(");
sb.append(attr);
sb.append(")'>");
sb.append(" and ");
sb.append(column);
sb.append(" ");
sb.append(en.getKey());
sb.append(" #{");
sb.append(attr);
sb.append("} </if>");
return sb.toString();
}
private SimpleSqlCondition(){}
public static SimpleSqlCondition getInstance(){
return DefultStatusImplHolder.LAZY;
}
private static class DefultStatusImplHolder{
private static final SimpleSqlCondition LAZY = new SimpleSqlCondition();
}
}
package com.excetion;
public class BaseException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L;
private int code = 500;
private Object data = null;
// 无参构造方法
public BaseException() {
super();
}
// 有参的构造方法
public BaseException(String message) {
super(message);
}
public BaseException(int code, String message) {
super(message);
this.code = code;
}
public BaseException(int code, String message, Object data) {
super(message);
this.code = code;
this.data = data;
}
// 用指定的详细信息和原因构造一个新的异常
public BaseException(String message, Throwable cause) {
super(message, cause);
}
// 用指定原因构造一个新的异常
public BaseException(Throwable cause) {
super(cause);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
\ No newline at end of file
package com.form.customer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class QueryCustomerForm {
@ApiModelProperty("负责人id")
private String userId;
@ApiModelProperty("用户输入")
private String text;
@ApiModelProperty("是否分配了负责人,0全部,1 未分配,2已分配")
private String hasUser;
@ApiModelProperty("商机,''全部 1 有, 0无")
private String hasBusiness;
@ApiModelProperty("中央级, ''全部 1 是 0 否")
private String central;
@ApiModelProperty("签约 '' 全部 1 是 0 否")
private String signing;
}
package com.mapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface BaseMapper<T> extends Mapper<T>,MySqlMapper<T>,ZrqxMapper<T>{
/** 字符串不能为空 NOTBLANK (your filed) */
String NOTBLANK = "@com.util.StringUtils@isNotBlank";
/** List集合不能为空 LIST_NOT_EMPTY (your filed) */
String LIST_NOT_EMPTY = "@com.util.ArrayUtils@isNotEmpty";
/** 字符串为空 BLANK (your filed) */
String BLANK = "@com.util.StringUtils@isBlank";
}
package com.mapper;
import java.util.List;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import tk.mybatis.mapper.provider.SpecialProvider;
public interface InsertUidListMapper<T> {
@Options(useGeneratedKeys = true, keyProperty = "uid")
@InsertProvider(type = SpecialProvider.class, method = "dynamicSQL")
int insertList(List<T> recordList);
}
\ No newline at end of file
package com.mapper;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
import org.apache.ibatis.session.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.enums.sql.SqlConditionEnum;
public class SqlXMLLanguageDriver extends XMLLanguageDriver{
private static final Logger logger = LoggerFactory.getLogger(SqlXMLLanguageDriver.class);
private static String REGULAR;
static {
logger.info("生成则表达式");
// String regular = "(eq|like|nin|regexp)\\((\\w*\\.?\\w+),\\s*(\\w*\\.?\\w+)\\)";
StringBuffer sb = new StringBuffer("(");
SqlConditionEnum.stream().forEach(s -> {
sb.append(s.getRegular());
sb.append("|");
});
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
sb.append("\\((\\w*\\.?\\w+),\\s*(\\w*\\.?\\w+)\\)");
REGULAR = sb.toString();
logger.info("匹配sql正则" + REGULAR);
}
@Override
public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) {
logger.info("configuration:" + configuration+";script:" + script + ";parameterType:" + parameterType);
logger.info("sql script:" + script);
String afterScript = this.apply(script);
logger.info("fmt script: " + afterScript);
return super.createSqlSource(configuration, afterScript, parameterType);
}
public String apply(String script){
Pattern pattern = Pattern.compile(REGULAR, Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(script);
StringBuffer sb = new StringBuffer();
while (m.find()) {
// 操作
String con = m.group(1);
SqlConditionEnum en = SqlConditionEnum.get(con.toLowerCase());
String column = m.group(2);
String attr = m.group(3);
String str = en.getFun().apply(en, column, attr);
m.appendReplacement(sb, str);
}
m.appendTail(sb);
return sb.toString();
}
}
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2017 abel533@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.mapper;
import java.util.List;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
/**
* 通用Mapper接口,特殊方法,批量插入,支持批量插入的数据库都可以使用,例如mysql,h2等
* @author lizhuo
*
* @param <T>
*/
public interface ZrqxMapper<T>{
/**
* 批量插入,uuid
*
* @param recordList
* @return
*/
@Options(keyProperty = "id")
@InsertProvider(type = ZrqxProvider.class, method = "dynamicSQL")
int insertUuidList(List<T> recordList);
}
\ No newline at end of file
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2017 abel533@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.mapper;
import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;
import java.util.Set;
/**
* SpecialProvider实现类,特殊方法实现类
*
* @author lizhuo
*/
public class ZrqxProvider extends MapperTemplate {
public ZrqxProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}
/**
* 批量插入
*
* @param ms
*/
public String insertUuidList(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
//开始拼sql
StringBuilder sql = new StringBuilder();
//uuid的情况,直接插入bind节点
sql.append(SqlHelper.insertIntoTable(entityClass, tableName(entityClass)));
sql.append(SqlHelper.insertColumns(entityClass, false, false, false));
sql.append(" VALUES ");
sql.append("<foreach collection=\"list\" item=\"record\" separator=\",\" >");
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
//获取全部列
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
//当某个列有主键策略时,不需要考虑他的属性是否为空,因为如果为空,一定会根据主键策略给他生成一个值
for (EntityColumn column : columnList) {
if (!column.isId() && column.isInsertable()) {
sql.append(column.getColumnHolder("record") + ",");
}else if(column.isId()){
sql.append("REPLACE (UUID(), '-', '')" + ",");
}
}
sql.append("</trim>");
sql.append("</foreach>");
return sql.toString();
}
public String insertUseGeneratedKeys(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
//开始拼sql
StringBuilder sql = new StringBuilder();
sql.append(SqlHelper.insertIntoTable(entityClass, tableName(entityClass)));
sql.append(SqlHelper.insertColumns(entityClass, true, false, false));
sql.append(SqlHelper.insertValuesColumns(entityClass, true, false, false));
return sql.toString();
}
}
package com.mapper.customer;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.form.customer.QueryCustomerForm;
import com.mapper.BaseMapper;
import com.model.customer.Customer;
public interface CustomerMapper extends BaseMapper<Customer>{
@Select(" <script> "
+ " select * from crm_customer c where 1=1 "
+ " eq(c.userId, form.userId) "
+ " eq(c.hasBusiness, form.hasBusiness) "
+ " eq(c.central, form.central) "
+ " eq(c.signing, form.signing) "
+ " <if test = 'form.hasUser == \"1\"'> "
+ " and (c.userId is null or c.userId ='' ) "
+ " </if> "
+ " <if test = 'form.hasUser == \"2\"'> "
+ " and c.userId is not null "
+ " </if> "
+ " <if test = '"+ NOTBLANK +" (form.text)'> "
+ " and (c.companyName like concat('%',#{form.text},'%')"
+ " or c.position like concat('%',#{form.text},'%')"
+ " or c.name like concat('%',#{form.text},'%') "
+ " or c.userName like concat('%',#{form.text},'%') "
+ " or c.remark like concat('%',#{form.text},'%') ) "
+ " </if> "
+ "</script>")
List<Customer> list(@Param("form") QueryCustomerForm form);
}
package com.model.customer;
import java.util.Date;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@Table(name = "crm_customer")
public class Customer {
@Id
@GeneratedValue(generator="JDBC")
private Integer id;
@ApiModelProperty("客户单位")
private String companyName;
@ApiModelProperty("部门名称")
private String departmentName;
@ApiModelProperty("客户职位")
private String position;
@ApiModelProperty("客户名称")
private String name;
@ApiModelProperty("客户手机号")
private String phone;
@ApiModelProperty("客户座机")
private String tel;
@ApiModelProperty("负责人id")
private String userId;
@ApiModelProperty("负责人名称")
private String userName;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("创建人id")
private String creater;
@ApiModelProperty("创建人名称")
private String createName;
@ApiModelProperty("修改时间")
private Date updateTime;
@ApiModelProperty("修改人")
private String updater;
@ApiModelProperty("修改人名称")
private String updateName;
@ApiModelProperty("指派时间")
private Date allotTime;
@ApiModelProperty("商机,''全部 1 有, 0无")
private String hasBusiness;
@ApiModelProperty("中央级, ''全部 1 是 0 否")
private String central;
@ApiModelProperty("签约 '' 全部 1 是 0 否")
private String signing;
}
package com.service;
import java.io.Serializable;
import java.util.List;
import java.util.function.Consumer;
import org.apache.ibatis.session.RowBounds;
import com.util.PageInfo;
import com.util.PageParam;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;
public interface BaseService<M, ID extends Serializable> extends NotNullInterface<M, ID> {
/**
* 返回一个where模板
*/
public Criteria createCriteria();
/**
* 返回一个where模板
*/
public Criteria createCriteria(Class<M> entityClass);
/**
* 返回一个模板
*/
public Example createExample();
/**
* 返回一个模板
*/
public Example createExample(Class entityClass);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件删除数据
*
* @return
*/
boolean deleteByCriteria();
/**
* 分页
*/
public PageInfo<M> queryAll(PageParam pageParam);
/**
* 分页查询
*/
public PageInfo<M> query(M entity, PageParam pageParam);
/**
* 分页查询,使用内部模板,条件查询
*/
public PageInfo<M> queryExample(PageParam pageParam,Example example);
/**
* 根据实体属性作为条件进行删除,查询条件使用等号
*
* @param record
* @return
*/
boolean delete(M record);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件删除数据
*
* @return
*/
boolean deleteByExample(Example example);
/**
* 根据主键字段进行删除,方法参数必须包含完整的主键属性
*
* @param key
* @return
*/
boolean deleteByPrimaryKey(Object key);
/**
* 根据主键字段查询总数,方法参数必须包含完整的主键属性,查询条件使用等号
*
* @param key
* @return
*/
boolean existsWithPrimaryKey(Object key);
/**
* 保存一个实体,null的属性也会保存,不会使用数据库默认值
*
* @param record
* @return
*/
boolean insert(M record);
/**
* 批量插入,支持批量插入的数据库可以使用,例如MySQL,H2等,另外该接口限制实体包含`id`属性并且必须为自增列
*
* @param recordList
* @return
*/
boolean insertList(List<M> recordList);
/**
* 批量插入,uuid的list
*
* @param recordList
* @return
*/
boolean insertUuidList(List<M> recordList);
/**
* 保存一个实体,null的属性不会保存,会使用数据库默认值
*
* @param record
* @return
*/
boolean insertSelective(M record);
/**
* 插入数据,限制为实体包含`id`属性并且必须为自增列,实体配置的主键策略无效
*
* @param record
* @return
*/
boolean insertUseGeneratedKeys(M record);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件更新实体`record`包含的全部属性,null值会被更新
*
* @param record
* @return
*/
boolean UpdateByExample(M record,Example example);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件更新实体`record`包含的不是null的属性值
*
* @param record
* @return
*/
boolean UpdateByExampleSelective(M record,Example example);
/**
* 根据主键更新实体全部字段,null值会被更新
*
* @param record
* @return
*/
boolean updateByPrimaryKey(M record);
/**
* 根据主键更新属性不为null的值
*
* @param record
* @return
*/
boolean updateByPrimaryKeySelective(M record);
/**
* 根据实体中的属性值进行查询,查询条件使用等号
*
* @param record
* @return
*/
List<M> select(M record);
/**
* 查询全部结果
*
* @return
*/
List<M> selectAll();
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件进行查询
*
* @return
*/
List<M> selectByExample(Example example);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件和RowBounds进行分页查询
*
* @param rowBounds
* @return
*/
List<M> selectByExampleAndRowBounds(RowBounds rowBounds,Example example);
/**
* 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
*
* @param key
* @return
*/
M selectByPrimaryKey(Object key);
/**
* 根据实体属性和RowBounds进行分页查询
*
* @param record
* @param rowBounds
* @return
*/
List<M> selectByRowBounds(M record, RowBounds rowBounds);
/**
* 根据实体中的属性查询总数,查询条件使用等号
*
* @param record
* @return
*/
int selectCount(M record);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件进行查询总数
*
* @return
*/
int selectCountByExample(Example example);
/**
* 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
*
* @param record
* @return
*/
M selectOne(M record);
/**
* 需要从当前service 调用createCriteria()方法 返回Criteria 对象,在外部封装参数
* 根据内置Criteria条件进行查询
*
* @return
*/
M selectOneByExample(Example example);
boolean batchDelete(List<ID> ids);
/**
* 批量删除,携带附属逻辑,附属逻辑执行完成后才会执行删除主表内容
* @param ids
* @param consumers 附属逻辑 M -> void
* @return
* @author lpf
* @date: 2020年3月11日 下午9:09:25
*/
boolean batchDeleteAndOther(List<ID> ids, @SuppressWarnings("unchecked") Consumer<M>... consumers) ;
/**
* 批量删除,携带附属逻辑
* 跳过异常循环,执行不出现异常的循环,返回去重后的异常信息
* @param ids
* @param consumers
* @return
*/
List<String> batchDeleteContinueException(List<ID> ids, @SuppressWarnings("unchecked") Consumer<M>... consumers);
}
\ No newline at end of file
差异被折叠。
package com.service;
import java.io.Serializable;
import java.util.Optional;
import java.util.function.Consumer;
public interface NotNullInterface<M, ID extends Serializable> {
/**
* 根据id查询不为空的对象
* @param id
* @return
* @author lpf
* @date: 2019年2月18日 下午2:45:21
*/
M notNull(ID id);
/**
* 根据id 查询不为空的对象
* @param id
* @param consumer 更多的筛选条件
* @return
* @author lpf
* @date: 2019年2月18日 下午2:46:20
*/
M notNull(ID id, Consumer<M> consumer);
/**
* selectOne 封装notNull
* @param record
* @return
* @author ycw
* @date: 2019年2月20日 下午3:55:01
*/
M notNull(M record);
/**
* selectOne 封装notNull
* @param consumer
* @return
* @author ycw
* @date: 2019年2月20日 下午4:58:55
*/
M notNull(Consumer<M> consumer);
/**
* 根据id查询可能存在的对象
* @param id
* @return
* @author lpf
* @date: 2019年12月3日 下午3:44:21
*/
Optional<M> ofNullable(ID id);
Optional<M> ofNullable(ID id, Consumer<M> consumer);
Optional<M> ofNullable(M record);
Optional<M> ofNullable(Consumer<M> consumer);
/**
* 当查询结果存在的情况下执行的逻辑
* @param id
* @param result 消费方法
* @author lpf
* @date: 2019年12月3日 下午3:46:56
*/
void ifPresent(ID id, Consumer<M> result);
void ifPresent(ID id, Consumer<M> consumer, Consumer<M> result);
void ifPresent(M record, Consumer<M> result);
void ifPresent(Consumer<M> consumer, Consumer<M> result);
}
package com.service.customer;
import com.form.customer.QueryCustomerForm;
import com.model.customer.Customer;
import com.service.BaseService;
import com.util.PageInfo;
import com.util.PageParam;
public interface CustomerService extends BaseService<Customer, Integer>{
PageInfo<Customer> page(PageParam pageParam, QueryCustomerForm form);
}
package com.service.customer;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.form.customer.QueryCustomerForm;
import com.mapper.BaseMapper;
import com.mapper.customer.CustomerMapper;
import com.model.customer.Customer;
import com.service.BaseServiceImpl;
import com.util.PageInfo;
import com.util.PageParam;
@Service
public class CustomerServiceImpl extends BaseServiceImpl<Customer, Integer> implements CustomerService{
@Autowired
private CustomerMapper mapper;
@Override
public BaseMapper<Customer> getMapper() {
return this.mapper;
}
@Override
public PageInfo<Customer> page(PageParam pageParam, QueryCustomerForm form) {
if (StringUtils.isNotBlank(pageParam.getOrderBy())) {
pageParam.setOrderBy(" createTime desc ");
}
startPage(pageParam);
List<Customer> list = mapper.list(form);
return new PageInfo<>(list);
}
}
package com.util;
import java.util.List;
import java.util.Optional;
public class ArrayUtils {
/**
* 判断list是否为空
* @param list
* @return
* @author lpf
* @date: 2018年11月23日 上午9:24:06
*/
public static boolean empty(List<?> list){
return list == null || list.isEmpty();
}
/**
* 判断list不为空
* @param list
* @return
* @author lpf
* @date: 2018年11月30日 下午2:47:06
*/
public static boolean isNotEmpty(List<?> list){
return !empty(list);
}
/**
* 获取list的首位
* @param list
* @return
* @author lpf
* @date: 2018年11月23日 上午9:27:56
*/
public static <T> Optional<T> first(List<T> list) {
if (empty(list)) {
return Optional.empty();
}
return Optional.ofNullable(list.get(0));
}
/**
* 省份对比
*
* @param array
* @param objectToFind
* @return
* @author Conan
* @date: 2018年10月24日 下午6:02:05
*/
public static boolean contains(String[] array, String objectToFind) {
if (objectToFind == null) {
for (int i = 0; i < array.length; i++) {
if (array[i] == null) {
return true;
}
}
}
String str = (String)objectToFind;
objectToFind = str.substring(0, 2);
for (int i = 0; i < array.length; i++) {
if (array[i].startsWith(objectToFind)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
String[] s = {"新疆維吾爾族自治區","上海","香港"};
String str = "香港特別行政區";
System.out.println(contains(s, str));
}
}
package com.util;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.springframework.beans.BeanInstantiationException;
public class BeanUtils extends org.springframework.beans.BeanUtils{
/**
* 拷贝对象
* @param source 拷贝源
* @param clazz 目标对象类
* @return
* @author lpf
* @date: 2019年2月19日 下午4:57:19
*/
public static <R, VO> VO copy(R source, Class<VO> clazz){
return copy(source, clazz, (r,vo) -> {});
}
/**
* 拷贝对象
* @param source 拷贝源
* @param clazz 目标对象类
* @param consumer (VO) -> void 复制对象后 执行程序
* @return
* @author lpf
* @date: 2019年2月19日 下午4:57:19
*/
public static <R, VO> VO copy(R source, Class<VO> clazz, Consumer<VO> consumer) {
VO vo = copy(source, clazz);
consumer.accept(vo);
return vo;
}
/**
* 拷贝对象
* @param source 拷贝源
* @param clazz 目标对象类
* @param biConSumer (R,VO) -> void 复制对象后 执行程序
* @return
* @author lpf
* @date: 2019年2月19日 下午5:16:23
*/
public static <R, VO> VO copy(R source, Class<VO> clazz, BiConsumer<R, VO> biConsumer) {
VO vo = null;
try {
vo = BeanUtils.instantiate(clazz);
BeanUtils.copyProperties(source, vo);
} catch (BeanInstantiationException e) {
e.printStackTrace();
}
biConsumer.accept(source, vo);
return vo;
}
/**
* 批量复制对象
* @param list
* @param clazz
* @return
* @author lpf
*/
public static <R, VO> List<VO> copyList(List<R> list, Class<VO> clazz) {
return copyList(list, clazz, (r,vo) ->{});
}
/**
* 过滤批量复制对象
* @param list
* @param clazz
* @param BiConsumer (VO) -> void 复制对象后 执行程序
* @param filter
* @return
* @author lpf
*/
@SafeVarargs
public static <R, VO> List<VO> copyList(List<R> list, Class<VO> clazz, Consumer<VO> consumer, Predicate<R>... filter) {
Stream<R> stream = list.stream();
for (Predicate<R> predicate : filter) {
stream = stream.filter(predicate);
}
return stream.map(obj -> {
try {
VO vo = BeanUtils.instantiate(clazz);
BeanUtils.copyProperties(obj, vo);
consumer.accept(vo);
return vo;
} catch (BeanInstantiationException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
}
/**
* 过滤批量复制对象
* @param list
* @param clazz
* @param BiConsumer (R,VO) -> void 复制对象后 执行程序
* @param filter
* @return
* @author lpf
*/
@SafeVarargs
public static <R, VO> List<VO> copyList(List<R> list, Class<VO> clazz, BiConsumer<R, VO> biConsumer, Predicate<R>... filter) {
Stream<R> stream = list.stream();
for (Predicate<R> predicate : filter) {
stream = stream.filter(predicate);
}
return stream.map(obj -> {
try {
VO vo = BeanUtils.instantiate(clazz);
BeanUtils.copyProperties(obj, vo);
biConsumer.accept(obj, vo);
return vo;
} catch (BeanInstantiationException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
}
/**
* 获取包括父类在内的所有属性
* @param clazz
* @return
* @author lpf
* @date: 2018年12月26日 上午9:03:59
*/
public static List<Field> getAllFields(Class<?> clazz) {
List<Field> fieldList = new ArrayList<>();
while (clazz != null) {
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz
.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
return fieldList;
}
/**
* 筛选类的属性
* @param clazz
* @param filters
* @return
* @author lpf
* @date: 2018年12月11日 下午7:29:51
*/
public static <T> Stream<Field> getFieldsByAnnotation(Class<?> clazz,Predicate<Field>... filters){
Stream<Field> stream = getAllFields(clazz).stream()
.map(f -> {
f.setAccessible(true);
return f;
});
for (Predicate<Field> predicate : filters) {
stream = stream.filter(predicate);
}
return stream;
}
}
package com.util;
import java.io.Serializable;
import java.util.Date;
import java.util.function.Consumer;
import java.util.function.Supplier;
import com.alibaba.fastjson.annotation.JSONField;
import com.enums.ResponseCodeEnum;
import com.excetion.BaseException;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel("响应报文")
public class CallBack<T> implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@ApiModelProperty("标志位,标记操作是否成功")
private boolean status = true;
@ApiModelProperty("响应编码")
private int code;
@ApiModelProperty("响应描述")
private String msg;
@ApiModelProperty("响应数据")
@JSONField(name = "data")
private T data;
@ApiModelProperty("响应时间戳")
private Date timestamp = new Date();
private CallBack(int code) {
this.code = code;
}
public CallBack(ResponseCodeEnum en) {
this(en.getCode());
if (!ResponseCodeEnum.OK.equals(en)) {
this.status = false;
}
}
public CallBack(){
}
public static <T> CallBack<T> create(ResponseCodeEnum en,T data, String message){
CallBack<T> back = new CallBack<T>(en);
back.data = data;
back.msg = message;
return back;
}
public static <T> CallBack<T> create(ResponseCodeEnum en,T data){
return create(en, data, null);
}
public static <T> CallBack<T> create(ResponseCodeEnum en){
return create(en,null);
}
public static <T> CallBack<T> createMsg(ResponseCodeEnum en, String message) {
return create(en, null, message);
}
public static <T> CallBack<T> createMsg(ResponseCodeEnum en, String message, T data) {
return create(en, data, message);
}
public static <T> CallBack<T> success() {
return create(ResponseCodeEnum.OK, null);
}
public static <T> CallBack<T> success(T data) {
return create(ResponseCodeEnum.OK,data);
}
public static <T> CallBack<T> success(T data,String message) {
return create(ResponseCodeEnum.OK, data, message);
}
public static <T> CallBack<T> fail(String message) {
return createMsg(ResponseCodeEnum.FAIL, message);
}
public static <T> CallBack<T> fail() {
return fail(null);
}
public static <T> CallBack<T> exception(String message) {
return createMsg(ResponseCodeEnum.EXCEPTION, message);
}
public static <T> CallBack<T> exception() {
return exception(null);
}
public static <T> CallBack<T> baseException(String message){
return createMsg(ResponseCodeEnum.BASE_EXCEPTION, message);
}
public static <T> CallBack<T> baseException(String message, T data) {
return createMsg(ResponseCodeEnum.BASE_EXCEPTION, message, data);
}
public boolean isStatus() {
return this.status;
}
public T getData(){
return this.data;
}
public Date getTimestamp() {
return this.timestamp;
}
public void setStatus(boolean status) {
this.status = status;
}
public void setCode(int code) {
this.code = code;
}
public int getCode() {
return this.code;
}
public String getMsg() {
return this.msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public boolean notEntity() {
return this.isStatus() && this.data == null;
}
public boolean hasEntity(){
return this.isStatus() && this.data != null;
}
public boolean hasError() {
return !this.isStatus() || this.data == null;
}
public boolean ifPresent() {
return this.hasEntity();
}
public void ifPresent(Consumer<T> consumer) {
this.ifPresentThrowBaseException(consumer, null);
}
public void ifPresentThrowBaseException(Consumer<T> consumer, Supplier<BaseException> supplier) {
if (this.hasEntity()) {
consumer.accept(this.data);
} else {
if (supplier != null) {
BaseException exception = supplier.get();
throw exception;
}
}
}
public void setData(T data) {
this.data = data;
}
public static <T> CallBack<T> validate(T data) {
return create(ResponseCodeEnum.VALIDATE,data);
}
public static <T> CallBack<T> validate() {
return fail(null);
}
}
package com.util;
import lombok.Data;
@Data
public class DingTalkResult {
/** 错误编码 */
private String errcode;
/** 错误信息 */
private String errmsg;
}
差异被折叠。
package com.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.github.pagehelper.Page;
import lombok.Data;
@ApiModel(value="PageMap",description="分页分组工具类")
@Data
public class PageMap<K,V> implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("当前页")
private int pageNum;
@ApiModelProperty("每页的数量")
private int pageSize;
@ApiModelProperty("当前页的数量")
private int size;
@ApiModelProperty("当前页面第一个元素在数据库中的行号")
private int startRow;
@ApiModelProperty("当前页面最后一个元素在数据库中的行号")
private int endRow;
@ApiModelProperty("总记录数")
private long total;
@ApiModelProperty("总页数")
private int pages;
@ApiModelProperty("结果集")
private Map<K,V> map;
@ApiModelProperty("前一页")
private int prePage;
@ApiModelProperty("下一页")
private int nextPage;
@ApiModelProperty("是否为第一页")
private boolean isFirstPage = false;
@ApiModelProperty("是否为最后一页")
private boolean isLastPage = false;
@ApiModelProperty("是否有前一页")
private boolean hasPreviousPage = false;
@ApiModelProperty("是否有下一页")
private boolean hasNextPage = false;
@ApiModelProperty("导航页码数")
private int navigatePages;
@ApiModelProperty("所有导航页号")
private int[] navigatepageNums;
@ApiModelProperty("导航条上的第一页")
private int navigateFirstPage;
@ApiModelProperty("导航条上的最后一页")
private int navigateLastPage;
public PageMap(){
}
public PageMap(List<?> list,Map<K,V> result) {
this(list, 8);
this.map = result;
}
/**
* 包装Page对象
*
* @param list page结果
* @param navigatePages 页码数量
*/
public PageMap(List<?> list, int navigatePages) {
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.size = page.size();
this.total = page.getTotal();
//由于结果是>startRow的,所以实际的需要+1
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
//计算实际的endRow(最后一页的时候特殊)
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.size = list.size();
this.total = list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
//计算导航页
calcNavigatepageNums();
//计算前后页,第一页,最后一页
calcPage();
//判断页面边界
judgePageBoudary();
}
}
/**
* 计算导航页
*/
private void calcNavigatepageNums() {
//当总页数小于或等于导航页码数时
if (pages <= navigatePages) {
navigatepageNums = new int[pages];
for (int i = 0; i < pages; i++) {
navigatepageNums[i] = i + 1;
}
} else { //当总页数大于导航页码数时
navigatepageNums = new int[navigatePages];
int startNum = pageNum - navigatePages / 2;
int endNum = pageNum + navigatePages / 2;
if (startNum < 1) {
startNum = 1;
//(最前navigatePages页
for (int i = 0; i < navigatePages; i++) {
navigatepageNums[i] = startNum++;
}
} else if (endNum > pages) {
endNum = pages;
//最后navigatePages页
for (int i = navigatePages - 1; i >= 0; i--) {
navigatepageNums[i] = endNum--;
}
} else {
//所有中间页
for (int i = 0; i < navigatePages; i++) {
navigatepageNums[i] = startNum++;
}
}
}
}
/**
* 计算前后页,第一页,最后一页
*/
private void calcPage() {
if (navigatepageNums != null && navigatepageNums.length > 0) {
navigateFirstPage = navigatepageNums[0];
navigateLastPage = navigatepageNums[navigatepageNums.length - 1];
if (pageNum > 1) {
prePage = pageNum - 1;
}
if (pageNum < pages) {
nextPage = pageNum + 1;
}
}
}
/**
* 判定页面边界
*/
private void judgePageBoudary() {
isFirstPage = pageNum == 1;
isLastPage = pageNum == pages || pages == 0;;
hasPreviousPage = pageNum > 1;
hasNextPage = pageNum < pages;
}
}
\ No newline at end of file
package com.util;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(value="PageParam",description="分页参数")
@Data
public class PageParam {
@ApiModelProperty(value="页码",example="1", required = true)
private Integer pageNum = 1;
@ApiModelProperty(value="每页展示行数",example="10", required = true)
private Integer pageSize = 10;
@ApiModelProperty("排序列")
private String orderBy;
}
\ No newline at end of file
package com.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 字符串的一些公共方法
* @ClassName: StringUtils
* @author
* @date 2014-7-14 上午11:14:00
*
*/
public class StringUtils extends org.apache.commons.lang3.StringUtils{
private final static String[] agent = { "Android", "iPhone", "iPod","iPad", "Windows Phone", "MQQBrowser" };
private final static String[] enletters = {"a","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","t","u","v","w","x","y","z"};
public static boolean isNotBlank(Integer value){
return value != null;
}
/**
* 判断User-Agent 是不是来自于手机
* @param ua
* @return
*/
public static boolean checkAgentIsMobile(String ua) {
boolean flag = false;
if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) {
// 排除 苹果桌面系统
if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) {
for (String item : agent) {
if (ua.contains(item)) {
flag = true;
break;
}
}
}
}
return flag;
}
/**
* 给定指定字符串res,去除字符串首尾的指定字符c
* @Title: trim
* @param res 原字符串
* @param c 要删除的字符,只删除首尾,且不能截取Unicode 大于 'A'的字符
* @return
* @return String 返回类型
* @author
* @date 2014-7-14 上午11:21:21
*/
public static String trim(String res,char c) {
int count = res.toCharArray().length;
int len = res.toCharArray().length;
int st = 0;
int off = 0; /* avoid getfield opcode */
char[] val = res.toCharArray(); /* avoid getfield opcode */
while ((st < len) && (val[off + st] <= c)) {
st++;
}
while ((st < len) && (val[off + len - 1] <= c)) {
len--;
}
return ((st > 0) || (len < count)) ? res.substring(st, len) : res;
}
/**
* 获取setter方法名称
* @Title: getSetterMethodName
* @param key
* @return
* @return String 返回类型
* @author
* @date 2014年7月24日 下午3:43:22
*/
public static String getMethodName(String begin,String key) {
StringBuilder result = new StringBuilder(begin);
result.append(key.substring(0,1).toUpperCase()).append(key.substring(1));
return result.toString();
}
/**
* 获取随机英文字符串
* @param caseType 1大写,其他小写
* @param length 返回字符串长度
* @param hasRepeat 是否包含重复字符 1包含0不包含
* @return
* @author ydm
* @date: 2018年7月11日 上午11:33:25
*/
public static String getRandomEnSign(int caseType,int length,int hasRepeat){
StringBuffer resultBuffer = new StringBuffer();
for(int i = 0 ; i < length ; i ++ ){
int x=1+(int)(Math.random()*enletters.length-1);
if(hasRepeat * 1 == 0){
if(resultBuffer.toString().toLowerCase().indexOf(enletters[x].toLowerCase())>0){
continue;
}
}
resultBuffer.append(caseType*1==1 ? enletters[x].toUpperCase() : enletters[x].toLowerCase());
}
return resultBuffer.toString();
}
public static Object checkNull(Object obj) {
Class<? extends Object> clazz = obj.getClass();
// 获取实体类的所有属性,返回Field数组
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 可访问私有变量
field.setAccessible(true);
// 获取属性类型
String type = field.getGenericType().toString();
// 如果type是类类型,则前面包含"class ",后面跟类名
if ("class java.lang.String".equals(type)) {
// 将属性的首字母大写
String methodName = field.getName().replaceFirst(field.getName().substring(0, 1),
field.getName().substring(0, 1).toUpperCase());
System.out.println(methodName);
try {
Method methodGet = clazz.getMethod("get" + methodName);
// 调用getter方法获取属性值
String str = (String) methodGet.invoke(obj);
if (str==null) {
// Method methodSet = clazz.getMethod("set" +
// methodName, new Class[] { String.class });
// methodSet.invoke(o, new Object[] { "" });
System.out.println(field.getType()); // class java.lang.String
// 如果为null的String类型的属性则重新复制为空字符串
field.set(obj, field.getType().getConstructor(field.getType()).newInstance(""));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return obj;
}
}
package com.vo.dingding;
import java.util.List;
import com.util.DingTalkResult;
import lombok.Data;
@Data
public class SimpleUserListVo extends DingTalkResult{
private List<SimpleUserVo> userlist;
}
package com.vo.dingding;
import lombok.Data;
/**
* 获取部门用户vo
* @author lpf
* @date 2020年3月16日下午12:20:29
*/
@Data
public class SimpleUserVo {
/** 钉钉用户id */
private String userid;
/** 钉钉用户名称 */
private String name;
}
#服务启动端口号。钉钉云ECS目前只开放80和22端口
server.port=8080
server.env=test
#销售部门id
dingding.sales.departmentId=1
dingding.sales.departmentId=26966822
server:
tomcat:
uri-encoding: UTF-8
security:
sessions: always #always设置保存用户状态(内存可能会被占满) stateless设置不保存用户状态
basic:
enabled: false #开启认证
logging:
level:
com.mapper: DEBUG
mybatis:
type-aliases-package: com.model
configuration:
default-scripting-language:
com.mapper.SqlXMLLanguageDriver
mapper:
not-empty: false
i-d-e-n-t-i-t-y: MYSQL
style: normal
b-e-f-o-r-e: true
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
spring:
thymeleaf:
cache: false
encoding: UTF-8
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
http:
multipart:
maxFileSize: 20Mb
maxRequestSize: 20Mb
encoding:
enabled: true
force: true
charset: UTF-8
application:
name: sysuser #服务名称
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: 'jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull'
username: root
password: root
initialize: true
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论