Commit 7e2c685d authored by xiexy's avatar xiexy

Default Changelist

parent fd2b0099
<?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>cftech-platform</artifactId>
<groupId>com.cftech</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cftech-common</artifactId>
<dependencies>
<dependency>
<groupId>com.cftech</groupId>
<artifactId>jave</artifactId>
<version>1.0.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.cftech</groupId>
<artifactId>userdirective-velocity</artifactId>
<version>1.0.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
import com.google.common.html.HtmlEscapers;
import org.apache.commons.lang.StringEscapeUtils;
import org.jsoup.nodes.Document;
import org.owasp.esapi.ESAPI;
import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;
import org.owasp.validator.html.util.HTMLEntityEncoder;
import org.springframework.web.util.HtmlUtils;
import java.io.File;
import java.util.regex.Pattern;
/**
* Created by user on 2018/6/13.
*/
public class Tester {
private static AntiSamy antiSamy = new AntiSamy();
private static Policy ebaypolicy ;
private static Policy simplePolcy ;
private static Policy esapiPolicy;
static {
try {
ebaypolicy = Policy.getInstance(new File("D:\\schafflerws\\cftech-platform\\cftech-common-web\\src\\main\\resources\\antisamy\\antisamy-ebay.xml"));
} catch (PolicyException e) {
e.printStackTrace();
}
try {
simplePolcy = Policy.getInstance(new File("D:\\schafflerws\\cftech-platform\\cftech-common-web\\src\\main\\resources\\antisamy\\antisamy-schaffler-tinymce.xml"));
} catch (PolicyException e) {
e.printStackTrace();
}
try {
esapiPolicy = Policy.getInstance(new File("D:\\schafflerws\\cftech-platform\\cftech-common-web\\src\\main\\resources\\esapi\\antisamy-esapi.xml"));
} catch (PolicyException e) {
e.printStackTrace();
}
}
public static void main(String[]args) throws PolicyException, ScanException {
// String info = antiSamy.scan("== - \\ // javascript:alert(1)<a></a><div title='goods'><ul class='red' style='width:80px;text-decoration:underlines'>123 < > 13 132& '' \" dad : ; ; a ; ; ',daw % # $ sad 啊司法</ul></div><kk href='qqqq'>dadwd</kk>",simplePolcy).getCleanHTML();
// System.out.println(info);
// System.out.println(HtmlUtils.htmlUnescape(info));
// System.out.println( HtmlUtils.htmlEscape(HtmlUtils.htmlUnescape(info)));
// System.out.println(HTMLEntityEncoder.htmlEntityEncode(info));
// Pattern pat = Pattern.compile("^(/assets/|/static/|/mobile/|/a/materialUpload/upload).*");
// System.out.println(pat.matcher("/a/materialUpload/upload?encode=utf-8&cosconfigId=0&categoryId=109").matches());
// String v = ESAPI.encoder().canonicalize("dadad&dasd");
// System.out.println(v);
// String info = antiSamy.scan("{\"title\":\"测试\",\"type\":\"SINGLESEL\",\"max\":\"1\",\"min\":\"1\",\"options\":[{\"label\":\"1\",\"name\":\"¥{sad}我“wa啊完成'pcdaldsda”faf“万达wq;”daw~~''大武当;:;想到的''\\\\\\\"\\\\\\\"?\\\\\\\" \\\\\\\" ' ' ; 345&p13;s ad打算的\"}]}",simplePolcy);
}
}
package com.cftech.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by user on 2018/6/5.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CSRFTokenRef {
}
package com.cftech.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* JWT 校验注解
* Created by Jasper Huang on 2018/6/5.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface JWTValid {
}
package com.cftech.core.config;
import com.cftech.core.util.SystemConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Created by liuling on 16/4/22.
*/
public class MpGlobalConfig {
private static Logger logger = LoggerFactory.getLogger(MpGlobalConfig.class);
public static final boolean TOKEN_REFRESH = Boolean.valueOf(SystemConfig.p.getProperty("list.refreshtoken"));
public static final String JWT_DOMAIN = SystemConfig.p.getProperty("jwt.domain");
public static final int JWT_DURATION = Integer.valueOf(SystemConfig.p.getProperty("jwt.duration"));
public static final boolean SECURITY_SECURE = Boolean.valueOf(SystemConfig.p.getProperty("security.secure"));
//是否使用七牛云,或者腾讯云
public enum CloudFiles {
qiniu, qcloud
}
// 水印位置(无、左上、右上、居中、左下、右下)
public enum WatermarkPosition {
no, topLeft, topRight, center, bottomLeft, bottomRight
}
// 刘总 七牛云的配置
// public static final String QN_ACCESS_KEY = "2vag2flCONbJ02Kjm77mdYc2t1ToPogSRXMNsaiD";
// public static final String QN_SECRET_KEY= "Lk7IohOB7A1wT-YL_RWlMwxeQodSHTvY1D4f9TpS";
// public static final String QN_BACKET_NAME = "neil";
public static final String QN_ACCESS_KEY = SystemConfig.p.getProperty("QN_ACCESS_KEY");
//
public static final String QN_SECRET_KEY = SystemConfig.p.getProperty("QN_SECRET_KEY");
//
public static final String QN_BACKET_NAME = SystemConfig.p.getProperty("QN_BACKET_NAME");
// 默认商品图片(大)文件名称(不包含扩展名)
public static final String BIG_IMAGE_FILE_NAME = "big";
// 默认商品图片(小)文件名称(不包含扩展名)
public static final String SMALL_IMAGE_FILE_NAME = "small";
// 商品缩略图文件名称(不包含扩展名)
public static final String THUMBNAIL_IMAGE_FILE_NAME = "thumbnail";
// 水印图片文件名称(不包含扩展名)
public static final String WATERMARK_IMAGE_FILE_NAME = "watermark";
// 图片文件上传目录
public static final String UPLOAD_IMAGE_DIR = "/Users/liuling/tools/apache-tomcat-8.0.15/data/mp/image/";
// 媒体文件上传目录
public static final String UPLOAD_MEDIA_DIR = "/Users/liuling/tools/apache-tomcat-8.0.15/data/mp/media/";
// 其它文件上传目录
public static final String UPLOAD_FILE_DIR = "/Users/liuling/tools/apache-tomcat-8.0.15/data/mp/file/";
// 缓存目录
public static final String TEMP_PATH = "/Users/liuling/tools/apache-tomcat-8.0.15/data/mp/temp";
public static final Integer IMAGE_UPLOAD_MAXSIZE = 1024*1000*200;
// 文件上传最大值,0表示无限制,单位KB,默认20M,总量控制
public static final Integer UPLOAD_MAXSIZE = 1024*1000*200;
public static final String UPLOAD_TO = "qiniu";
public static RequestMethod getMethod()
{
if(TOKEN_REFRESH)
{
return RequestMethod.POST;
}else
{
return RequestMethod.GET;
}
}
}
package com.cftech.core.feature;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
/**
* @author 作者 lisw:
* @version 创建时间:2016年9月21日 下午7:42:58
* 因apache-fileupload会与springmvc的multipartResolver冲突
* 造成fileupload的List<FileItem>
* ServletFileUpload.parseRequest(request)获取不到值
* 故需要对用到fileupload的URL做特殊处理
* ,凡是带upload的URL不让springmvc的multipartResolver去解析。
*
* springmvc multipartResolver配置不能去掉,否则方法将获取不到前端表单post的参数
*/
public class MyMultipartResolver extends CommonsMultipartResolver {
private String excludeUrls;
private String[] excludeUrlArray;
public String getExcludeUrls() {
return excludeUrls;
}
public void setExcludeUrls(String excludeUrls) {
this.excludeUrls = excludeUrls;
this.excludeUrlArray = excludeUrls.split(",");
}
/**
* Determine the encoding for the given request.
* Can be overridden in subclasses.
* <p>The default implementation checks the request encoding,
* falling back to the default encoding specified for this resolver.
* @param request current HTTP request
* @return the encoding for the request (never {@code null})
* @see javax.servlet.ServletRequest#getCharacterEncoding
* @see #setDefaultEncoding
*/
protected String determineEncoding(HttpServletRequest request) {
String encoding = request.getCharacterEncoding();
if (encoding == null) {
encoding = getDefaultEncoding();
}
return encoding;
}
/**
* 这里是处理Multipart http的方法。如果这个返回值为true,那么Multipart http
* body就会MyMultipartResolver 消耗掉.如果这里返回false
* 那么就会交给后面的自己写的处理函数处理例如刚才ServletFileUpload 所在的函数
*
* @see CommonsMultipartResolver#isMultipart(HttpServletRequest)
*/
@Override
public boolean isMultipart(HttpServletRequest request) {
for (String url : excludeUrlArray) {
// 这里可以自己换判断
if (request.getRequestURI().contains(url)) {
return false;
}
}
return super.isMultipart(request);
}
}
package com.cftech.core.feature.orm.dialect;
/**
* 数据库方言抽象类
*
* @author StarZou
* @since 2014年5月18日 下午1:32:03
**/
public abstract class Dialect {
/**
* 得到分页sql
*
* @param sql
* @param offset
* @param limit
* @return
*/
public abstract String getLimitString(String sql, int offset, int limit);
/**
* 得到总数量 sql
*
* @param sql
* @return
*/
public abstract String getCountString(String sql);
}
package com.cftech.core.feature.orm.dialect;
import org.apache.ibatis.session.Configuration;
/**
* 数据库方言工厂,产生方言对象
*
* @author StarZou
* @since 2014年5月18日 下午1:32:23
**/
public class DialectFactory {
public static String dialectClass = null;
public static Dialect buildDialect(Configuration configuration) {
if (dialectClass == null) {
synchronized (DialectFactory.class) {
if (dialectClass == null) {
dialectClass = configuration.getVariables().getProperty("dialectClass");
}
}
}
Dialect dialect = null;
try {
dialect = (Dialect) Class.forName(dialectClass).newInstance();
} catch (Exception e) {
e.printStackTrace();
System.err.println("请检查 mybatis-config.xml 中 dialectClass 是否配置正确?");
}
return dialect;
}
}
package com.cftech.core.feature.orm.dialect;
/**
* MSSQL 数据库方言
*
* @author StarZou
* @since 2014年5月18日 下午1:32:33
**/
public class MSDialect extends Dialect {
protected static final String SQL_END_DELIMITER = ";";
@Override
public String getLimitString(String sql, int offset, int limit) {
return MSPageHepler.getLimitString(sql, offset, limit);
}
@Override
public String getCountString(String sql) {
return MSPageHepler.getCountString(sql);
}
}
package com.cftech.core.feature.orm.dialect;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author StarZou
* @since 2014年5月18日 下午1:32:42
**/
public class MSPageHepler {
/**
* 得到查询总数的sql
*/
public static String getCountString(String querySelect) {
querySelect = getLineSql(querySelect);
int orderIndex = getLastOrderInsertPoint(querySelect);
int formIndex = getAfterFormInsertPoint(querySelect);
String select = querySelect.substring(0, formIndex);
// 如果SELECT 中包含 DISTINCT 只能在外层包含COUNT
if (select.toLowerCase().indexOf("select distinct") != -1 || querySelect.toLowerCase().indexOf("group by") != -1) {
return new StringBuffer(querySelect.length()).append("select count(1) count from (").append(querySelect.substring(0, orderIndex)).append(" ) t").toString();
} else {
return new StringBuffer(querySelect.length()).append("select count(1) count ").append(querySelect.substring(formIndex, orderIndex)).toString();
}
}
/**
* 得到最后一个Order By的插入点位置
*
* @return 返回最后一个Order By插入点的位置
*/
private static int getLastOrderInsertPoint(String querySelect) {
int orderIndex = querySelect.toLowerCase().lastIndexOf("order by");
if (orderIndex == -1) {
orderIndex = querySelect.length();
}
if (!isBracketCanPartnership(querySelect.substring(orderIndex, querySelect.length()))) {
throw new RuntimeException("My SQL 分页必须要有Order by 语句!");
}
return orderIndex;
}
/**
* 得到分页的SQL
*
* @param offset
* 偏移量
* @param limit
* 位置
* @return 分页SQL
*/
public static String getLimitString(String querySelect, int offset, int limit) {
querySelect = getLineSql(querySelect);
int selectIndex = querySelect.toUpperCase().lastIndexOf("SELECT");
if (selectIndex > -1) {
querySelect = querySelect.substring(0, selectIndex) + "SELECT TOP " + (limit + offset) + querySelect.substring(selectIndex + 6);
}
String sql = "SELECT * FROM(SELECT ROW_NUMBER () OVER (ORDER BY getdate()) rownum,* FROM( " + querySelect + " ) A ) B WHERE B.rownum > " + offset + " AND B.rownum <= "
+ (limit + offset);
return sql;
}
/**
* 将SQL语句变成一条语句,并且每个单词的间隔都是1个空格
*
* @param sql
* SQL语句
* @return 如果sql是NULL返回空,否则返回转化后的SQL
*/
private static String getLineSql(String sql) {
return sql.replaceAll("[\r\n]", " ").replaceAll("\\s{2,}", " ");
}
/**
* 得到SQL第一个正确的FROM的的插入点
*/
private static int getAfterFormInsertPoint(String querySelect) {
String regex = "\\s+FROM\\s+";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(querySelect);
while (matcher.find()) {
int fromStartIndex = matcher.start(0);
String text = querySelect.substring(0, fromStartIndex);
if (isBracketCanPartnership(text)) {
return fromStartIndex;
}
}
return 0;
}
/**
* 判断括号"()"是否匹配,并不会判断排列顺序是否正确
*
* @param text
* 要判断的文本
* @return 如果匹配返回TRUE,否则返回FALSE
*/
private static boolean isBracketCanPartnership(String text) {
if (text == null || (getIndexOfCount(text, '(') != getIndexOfCount(text, ')'))) {
return false;
}
return true;
}
/**
* 得到一个字符在另一个字符串中出现的次数
*
* @param text
* 文本
* @param ch
* 字符
*/
private static int getIndexOfCount(String text, char ch) {
int count = 0;
for (int i = 0; i < text.length(); i++) {
count = (text.charAt(i) == ch) ? count + 1 : count;
}
return count;
}
}
package com.cftech.core.feature.orm.dialect;
/**
* MySQL数据库方言
*
* @author StarZou
* @since 2014年5月18日 下午1:32:52
**/
public class MySql5Dialect extends Dialect {
protected static final String SQL_END_DELIMITER = ";";
@Override
public String getLimitString(String sql, int offset, int limit) {
return MySql5PageHepler.getLimitString(sql, offset, limit);
}
@Override
public String getCountString(String sql) {
return MySql5PageHepler.getCountString(sql);
}
}
package com.cftech.core.feature.orm.dialect;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author StarZou
* @since 2014年5月18日 下午1:33:01
**/
public class MySql5PageHepler {
/**
* 得到查询总数的sql
*/
public static String getCountString(String querySelect) {
querySelect = getLineSql(querySelect);
int orderIndex = getLastOrderInsertPoint(querySelect);
int formIndex = getAfterFormInsertPoint(querySelect);
String select = querySelect.substring(0, formIndex);
// 如果SELECT 中包含 DISTINCT 只能在外层包含COUNT
if (select.toLowerCase().indexOf("select distinct") != -1 || querySelect.toLowerCase().indexOf("group by") != -1) {
return new StringBuffer(querySelect.length()).append("select count(1) count from (").append(querySelect.substring(0, orderIndex)).append(" ) t").toString();
} else {
return new StringBuffer(querySelect.length()).append("select count(1) count ").append(querySelect.substring(formIndex, orderIndex)).toString();
}
}
/**
* 得到最后一个Order By的插入点位置
*
* @return 返回最后一个Order By插入点的位置
*/
private static int getLastOrderInsertPoint(String querySelect) {
int orderIndex = querySelect.toLowerCase().lastIndexOf("order by");
if (orderIndex == -1) {
orderIndex = querySelect.length();
}
if (!isBracketCanPartnership(querySelect.substring(orderIndex, querySelect.length()))) {
throw new RuntimeException("My SQL 分页必须要有Order by 语句!");
}
return orderIndex;
}
/**
* 得到分页的SQL
*
* @param offset
* 偏移量
* @param limit
* 位置
* @return 分页SQL
*/
public static String getLimitString(String querySelect, int offset, int limit) {
querySelect = getLineSql(querySelect);
String sql = querySelect + " limit " + offset + " ," + limit;
return sql;
}
/**
* 将SQL语句变成一条语句,并且每个单词的间隔都是1个空格
*
* @param sql
* SQL语句
* @return 如果sql是NULL返回空,否则返回转化后的SQL
*/
private static String getLineSql(String sql) {
return sql.replaceAll("[\r\n]", " ").replaceAll("\\s{2,}", " ");
}
/**
* 得到SQL第一个正确的FROM的的插入点
*/
private static int getAfterFormInsertPoint(String querySelect) {
String regex = "\\s+FROM\\s+";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(querySelect);
while (matcher.find()) {
int fromStartIndex = matcher.start(0);
String text = querySelect.substring(0, fromStartIndex);
if (isBracketCanPartnership(text)) {
return fromStartIndex;
}
}
return 0;
}
/**
* 判断括号"()"是否匹配,并不会判断排列顺序是否正确
*
* @param text
* 要判断的文本
* @return 如果匹配返回TRUE,否则返回FALSE
*/
private static boolean isBracketCanPartnership(String text) {
if (text == null || (getIndexOfCount(text, '(') != getIndexOfCount(text, ')'))) {
return false;
}
return true;
}
/**
* 得到一个字符在另一个字符串中出现的次数
*
* @param text
* 文本
* @param ch
* 字符
*/
private static int getIndexOfCount(String text, char ch) {
int count = 0;
for (int i = 0; i < text.length(); i++) {
count = (text.charAt(i) == ch) ? count + 1 : count;
}
return count;
}
}
package com.cftech.core.feature.orm.dialect;
/**
* @author StarZou
* @since 2014年5月18日 下午1:33:17
**/
public class OracleDialect extends Dialect {
@Override
public String getLimitString(String sql, int offset, int limit) {
sql = sql.trim();
boolean isForUpdate = false;
if (sql.toLowerCase().endsWith(" for update")) {
sql = sql.substring(0, sql.length() - 11);
isForUpdate = true;
}
StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
pagingSelect.append(sql);
pagingSelect.append(" ) row_ ) where rownum_ > " + offset + " and rownum_ <= " + (offset + limit));
if (isForUpdate) {
pagingSelect.append(" for update");
}
return pagingSelect.toString();
}
@Override
public String getCountString(String sql) {
// TODO Oracle分页查询
return null;
}
}
package com.cftech.core.feature.orm.dialect;
/**
* Postgre 数据库 方言
*
* @since 2014年7月2日 上午10:30:24
**/
public class PostgreDialect extends Dialect {
protected static final String SQL_END_DELIMITER = ";";
@Override
public String getLimitString(String sql, int offset, int limit) {
return PostgrePageHepler.getLimitString(sql, offset, limit);
}
@Override
public String getCountString(String sql) {
return PostgrePageHepler.getCountString(sql);
}
}
package com.cftech.core.feature.orm.dialect;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
@since 2014年7月2日 上午10:30:14
**/
public class PostgrePageHepler {
/**
* 得到查询总数的sql
*/
public static String getCountString(String querySelect) {
querySelect = getLineSql(querySelect);
int orderIndex = getLastOrderInsertPoint(querySelect);
int formIndex = getAfterFormInsertPoint(querySelect);
String select = querySelect.substring(0, formIndex);
// 如果SELECT 中包含 DISTINCT 只能在外层包含COUNT
if (select.toLowerCase().indexOf("select distinct") != -1 || querySelect.toLowerCase().indexOf("group by") != -1) {
return new StringBuffer(querySelect.length()).append("select count(1) count from (").append(querySelect.substring(0, orderIndex)).append(" ) t").toString();
} else {
return new StringBuffer(querySelect.length()).append("select count(1) count ").append(querySelect.substring(formIndex, orderIndex)).toString();
}
}
/**
* 得到最后一个Order By的插入点位置
*
* @return 返回最后一个Order By插入点的位置
*/
private static int getLastOrderInsertPoint(String querySelect) {
int orderIndex = querySelect.toLowerCase().lastIndexOf("order by");
if (orderIndex == -1) {
orderIndex = querySelect.length();
}
if (!isBracketCanPartnership(querySelect.substring(orderIndex, querySelect.length()))) {
throw new RuntimeException("Postgre 分页必须要有Order by 语句!");
}
return orderIndex;
}
/**
* 得到分页的SQL
*
* @param offset
* 偏移量
* @param limit
* 位置
* @return 分页SQL
*/
public static String getLimitString(String querySelect, int offset, int limit) {
querySelect = getLineSql(querySelect);
String sql = querySelect + " LIMIT " + limit + " OFFSET " + offset;
return sql;
}
/**
* 将SQL语句变成一条语句,并且每个单词的间隔都是1个空格
*
* @param sql
* SQL语句
* @return 如果sql是NULL返回空,否则返回转化后的SQL
*/
private static String getLineSql(String sql) {
return sql.replaceAll("[\r\n]", " ").replaceAll("\\s{2,}", " ");
}
/**
* 得到SQL第一个正确的FROM的的插入点
*/
private static int getAfterFormInsertPoint(String querySelect) {
String regex = "\\s+FROM\\s+";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(querySelect);
while (matcher.find()) {
int fromStartIndex = matcher.start(0);
String text = querySelect.substring(0, fromStartIndex);
if (isBracketCanPartnership(text)) {
return fromStartIndex;
}
}
return 0;
}
/**
* 判断括号"()"是否匹配,并不会判断排列顺序是否正确
*
* @param text
* 要判断的文本
* @return 如果匹配返回TRUE,否则返回FALSE
*/
private static boolean isBracketCanPartnership(String text) {
if (text == null || (getIndexOfCount(text, '(') != getIndexOfCount(text, ')'))) {
return false;
}
return true;
}
/**
* 得到一个字符在另一个字符串中出现的次数
*
* @param text
* 文本
* @param ch
* 字符
*/
private static int getIndexOfCount(String text, char ch) {
int count = 0;
for (int i = 0; i < text.length(); i++) {
count = (text.charAt(i) == ch) ? count + 1 : count;
}
return count;
}
}
package com.cftech.core.feature.orm.mybatis;
import org.apache.ibatis.session.RowBounds;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* Mybatis分页参数及查询结果封装. 注意所有序号从1开始.
*
* @param <T>
* Page中记录的类型.
* @author StarZou
* @since 2014年5月18日 下午1:34:32
**/
public class Page<T> extends RowBounds implements Serializable{
// --分页参数 --//
/**
* 页编号 : 第几页
*/
protected int pageNo = 1;
/**
* 页大小 : 每页的数量
*/
protected int pageSize = 15;
/**
* 偏移量 : 第一条数据在表中的位置
*/
protected int offset;
/**
* 限定数 : 每页的数量
*/
protected int limit;
// --结果 --//
/**
* 查询结果
*/
protected List<T> result = new ArrayList<T>();
/**
* 总条数
*/
protected int totalCount;
/**
* 总页数
*/
protected int totalPages;
// --计算 数据库 查询的参数 : LIMIT 3, 3; LIMIT offset, limit; --//
/**
* 计算偏移量
*/
private void calcOffset() {
this.offset = ((pageNo - 1) * pageSize);
}
/**
* 计算限定数
*/
private void calcLimit() {
this.limit = pageSize;
}
// -- 构造函数 --//
public Page() {
this.calcOffset();
this.calcLimit();
}
public Page(int pageNo, int pageSize) {
this.pageNo = pageNo;
this.pageSize = pageSize;
this.calcOffset();
this.calcLimit();
}
// -- 访问查询参数函数 --//
/**
* 获得当前页的页号,序号从1开始,默认为1.
*/
public int getPageNo() {
return pageNo;
}
/**
* 获得每页的记录数量,默认为1.
*/
public int getPageSize() {
return pageSize;
}
/**
* 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.
*/
public int getFirst() {
return ((pageNo - 1) * pageSize) + 1;
}
/**
* 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从0开始.
*/
public int getOffset() {
return offset;
}
public int getLimit() {
return limit;
}
// -- 访问查询结果函数 --//
/**
* 取得页内的记录列表.
*/
public List<T> getResult() {
return result;
}
/**
* 设置页内的记录列表.
*/
public void setResult(final List<T> result) {
this.result = result;
}
/**
* 取得总记录数, 默认值为-1.
*/
public int getTotalCount() {
return totalCount;
}
/**
* 设置总记录数.
*/
public void setTotalCount(final int totalCount) {
this.totalCount = totalCount;
this.totalPages = this.getTotalPages();
}
/**
* 根据pageSize与totalCount计算总页数, 默认值为-1.
*/
public int getTotalPages() {
if (totalCount < 0) {
return -1;
}
int pages = totalCount / pageSize;
return totalCount % pageSize > 0 ? ++pages : pages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
@Override
public String toString() {
return "Page [pageNo=" + pageNo + ", pageSize=" + pageSize
+ ", offset=" + offset + ", limit=" + limit + ", result="
+ result + ", totalCount=" + totalCount + ", totalPages="
+ totalPages + "]";
}
}
package com.cftech.core.feature.orm.mybatis;
import org.apache.ibatis.executor.resultset.FastResultSetHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.apache.ibatis.session.RowBounds;
import java.sql.Statement;
import java.util.Properties;
/**
* @author StarZou
* @since 2014年5月18日 下午1:36:08
**/
@Intercepts({ @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = { Statement.class }) })
public class PaginationResultSetHandlerInterceptor implements Interceptor {
private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
@Override
public Object intercept(Invocation invocation) throws Throwable {
FastResultSetHandler resultSetHandler = (FastResultSetHandler) invocation.getTarget();
MetaObject metaStatementHandler = MetaObject.forObject(resultSetHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
RowBounds rowBounds = (RowBounds) metaStatementHandler.getValue("rowBounds");
Object result = invocation.proceed();
if (rowBounds instanceof Page) {
metaStatementHandler.setValue("rowBounds.result", result);
}
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
package com.cftech.core.feature.orm.mybatis;
import com.cftech.core.feature.orm.dialect.Dialect;
import com.cftech.core.feature.orm.dialect.DialectFactory;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
/**
* @author StarZou
* @since 2014年5月18日 下午1:36:31
**/
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) })
public class PaginationStatementHandlerInterceptor implements Interceptor {
private final static Logger logger = LoggerFactory.getLogger(PaginationStatementHandlerInterceptor.class);
private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
ParameterHandler parameterHandler = statementHandler.getParameterHandler();
BoundSql boundSql = statementHandler.getBoundSql();
MetaObject metaStatementHandler = MetaObject.forObject(statementHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
RowBounds rowBounds = (RowBounds) metaStatementHandler.getValue("delegate.rowBounds");
// 没有分页参数
if (rowBounds == null || rowBounds == RowBounds.DEFAULT) {
return invocation.proceed();
}
Configuration configuration = (Configuration) metaStatementHandler.getValue("delegate.configuration");
Dialect dialect = DialectFactory.buildDialect(configuration);
String originalSql = (String) metaStatementHandler.getValue("delegate.boundSql.sql");
// 获取总记录数
Page<?> page = (Page<?>) rowBounds;
// String countSql = dialect.getCountString(originalSql);
// Connection connection = (Connection) invocation.getArgs()[0];
// int total = getTotal(parameterHandler, connection, countSql);
// page.setTotalCount(total);
// 设置物理分页语句
metaStatementHandler.setValue("delegate.boundSql.sql", dialect.getLimitString(originalSql, page.getOffset(), page.getLimit()));
// 屏蔽mybatis原有分页
metaStatementHandler.setValue("delegate.rowBounds.offset", RowBounds.NO_ROW_OFFSET);
metaStatementHandler.setValue("delegate.rowBounds.limit", RowBounds.NO_ROW_LIMIT);
if (logger.isDebugEnabled()) {
logger.debug("分页SQL : " + boundSql.getSql());
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
/**
* 获取总计录
*
* @param parameterHandler
* @param connection
* @param countSql
* @return
* @throws Exception
*/
private int getTotal(ParameterHandler parameterHandler, Connection connection, String countSql) throws Exception {
// MetaObject metaStatementHandler =
// MetaObject.forObject(parameterHandler);
// Object parameterObject =
// metaStatementHandler.getValue("parameterObject");
// TODO 缓存具有相同SQL语句和参数的总数
PreparedStatement prepareStatement = connection.prepareStatement(countSql);
parameterHandler.setParameters(prepareStatement);
ResultSet rs = prepareStatement.executeQuery();
int count = 0;
if (rs.next()) {
count = rs.getInt(1);
}
rs.close();
prepareStatement.close();
return count;
}
}
package com.cftech.core.generic;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
public interface GenericDao<T> {
/**
* 保存对象
*
* @param t
* @return
*/
Long save(T t);
/**
* 更新对象
*
* @param t
* @return
*/
int update(T t);
/**
* 根据Id查询对象
*
* @param id
* @return
*/
T fetchById(Serializable id);
/**
* 分页查询
*
* @param params
* @return
*/
List<T> fetchSearchByPage(Map<String, Object> params);
/**
* 查询总数
*
* @return
*/
int count(Map<String, Object> params);
/**
* 删除对象
*
* @param id
* @return
*/
int delete(Serializable id);
}
package com.cftech.core.generic;
import lombok.Data;
import java.util.Date;
/**
* @author 作者 lisw:
* @version 创建时间:2016年9月9日 下午3:39:35
* 类说明
*/
@Data
public class GenericEntity {
protected Long id;
/* 删除标识 */
protected boolean delFlag;
/* 状态 */
protected String status;
/* 创建时间 */
protected Date createTime;
/* 更新时间 */
protected Date updateTime;
/* 备注 */
protected String description;
/* 创建人 */
protected Long createBy;
/* 更新人 */
protected Long updateBy;
}
\ No newline at end of file
package com.cftech.core.generic;
import com.cftech.core.feature.orm.mybatis.Page;
import com.cftech.core.sql.Conds;
import com.cftech.core.sql.Sort;
import java.io.Serializable;
import java.util.List;
public interface GenericService<T> {
/**
* 保存对象
*
* @param t
* @return
*/
boolean save(T t);
/**
* 更新对象
*
* @param t
* @return
*/
boolean update(T t);
/**
* 根据主键查询
*
* @param id
* @return
*/
T fetchById(Serializable id);
/**
* 根据条件查询
*
* @param conds
* @return
*/
T fetchSearchByConds(Conds conds);
/**
* 根据查询条件判断是否存在(true 存在 | false 不存在)
*
* @param conds
* @return true|false
*/
boolean existByConds(Conds conds);
/**
* 分页查询
*
* @param conds 条件
* @param sort 排序
* @param page 起始条数
* @param pageSize 分页大小
* @return
*/
List<T> fetchSearchByPage(Conds conds, Sort sort, int page, int pageSize);
/**
* 分页查询,返回封装好的page
*
* @param conds 条件
* @param sort 排序
* @param page 起始条数
* @param pageSize 分页大小
* @return page
*/
Page fetchPageSearch(Conds conds, Sort sort, int page, int pageSize);
/**
* 查询总条数
*
* @param conds 条件
* @return 条数
*/
int count(Conds conds);
/**
* 根据删除对象
*
* @param id
* @return
*/
boolean delete(Serializable id);
}
package com.cftech.core.generic;
import com.cftech.core.feature.orm.mybatis.Page;
import com.cftech.core.sql.Conds;
import com.cftech.core.sql.Sort;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class GenericServiceImpl<T> implements GenericService<T> {
protected abstract GenericDao<T> getGenericMapper();
@Override
public boolean save(T t) {
return getGenericMapper().save(t) == 1;
}
@Override
public boolean update(T t) {
return getGenericMapper().update(t) == 1;
}
@Override
public T fetchById(Serializable id) {
return getGenericMapper().fetchById(id);
}
@Override
public T fetchSearchByConds(Conds conds) {
List<T> list = fetchSearchByPage(conds, null, 0, 1);
return null == list || list.size() == 0 ? null : list.get(0);
}
@Override
public boolean existByConds(Conds conds) {
List<T> list = fetchSearchByPage(conds, null, 0, 1);
return null != list && list.size() > 0;
}
@Override
public List<T> fetchSearchByPage(Conds conds, Sort sort, int page, int pageSize) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("conds", conds);
params.put("offset", page > 0 ? page : 0);
params.put("limit", pageSize > 0 ? pageSize : 0);
params.put("sort", sort);
return getGenericMapper().fetchSearchByPage(params);
}
@Override
public int count(Conds conds) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("conds", conds);
return getGenericMapper().count(params);
}
@Override
public Page fetchPageSearch(Conds conds, Sort sort, int page, int pageSize) {
int count = this.count(conds);
List<T> list = this.fetchSearchByPage(conds, sort, page, pageSize);
return generatePage(page, pageSize, count, list);
}
@Override
public boolean delete(Serializable id) {
T t = fetchById(id);
if (null == t) {
return false;
}
return getGenericMapper().delete(id) == 1;
}
/**
* 生成page对象,并且初始化页数
*
* @param page 当前页数
* @param pageSize 每页显示条数
* @param totalSize 总记录数
* @return page
*/
protected Page generatePage(int pageNo, int pageSize, int totalSize, List<?> data) {
int start = 0;
if (pageNo > 1) {
start = (pageNo - 1) * pageSize;
}
Page page = new Page<>();
page.setResult(data);
page.setTotalCount(totalSize);
return page;
}
/**
* 生成mapper需要的参数
*
* @param conds 条件集合
* @param sort 排序
* @param page 第几行开始
* @param pageSize 每页显示条数
* @return params
*/
protected Map<String, Object> generateParamsMap(Conds conds, Sort sort, int page, int pageSize) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("conds", conds);
params.put("offset", page > 0 ? page : 0);
// params.put("offset", page > 0 ? ((page - 1) * pageSize) : 0);
params.put("limit", pageSize > 0 ? pageSize : 0);
params.put("sort", sort);
return params;
}
}
package com.cftech.core.jwt;
/**
* JWT转换时状态处理
* Created by Jasper Huang on 2018/6/5.
*/
public enum JWTStatus {
ExpiredJwtException(-1,"TOKEN 过期"), UnsupportedJwtException(-2,"不支持的Token"),
MalformedJwtException(-3,"格式不正确"), SignatureException(-4,"签名失败"), IllegalArgumentException(-5,"参数异常"),
CROSSDOMAIN(-6,"跨域请求"),Exception(-9,"未知异常,可能由于OpenId为空"),
OK(0,"TOKEN 检查成功");
private int code;
private String des;
private JWTStatus(int code,String des) {
this.setCode(code);
this.setDes(des);
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
@Override
public String toString() {
return this.code+"_"+this.des;
}
}
package com.cftech.core.mongo;
import lombok.Data;
import java.util.List;
@Data
public class Pager {
private int pageSize = 10;
private int pageNum = 1;
private int pageCount;
private long total;
private List result;
}
package com.cftech.core.mybatis;
import java.io.*;
/**
* Created by lisw on 2016-08-05
*/
public abstract class AbstractGenerator {
/**
* 点
*/
protected final String pointStr = ".";
/**
* semicolon
*/
protected final String semicolon = ";";
/**
* enter
*/
protected final String enter = "\n";
/**
* tab
*/
protected final String tab = "\t";
/**
* 空格键
*/
protected final String blank = " ";
/**
* isBlank
* @param cs
* @return boolean
*/
protected boolean isBlank(final CharSequence cs) {
int strLen;
if (cs == null) {
return true;
}
strLen = cs.length();
if (strLen == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
/**
* isNotBlank
* @param cs
* @return boolean
*/
protected boolean isNotBlank(final CharSequence cs) {
return !isBlank(cs);
}
/**
* isFileExists
* @param filePath
* @return boolean
*/
protected boolean isFileExists(final String filePath) {
return isFileExists(new File(filePath));
}
/**
* isFileExists
* @param file
* @return boolean
*/
protected boolean isFileExists(final File file) {
if (file != null) {
return file.exists();
}
return false;
}
/**
* generateJavaFile
* @param filePath
* @param source
* @return boolean
*/
protected boolean outputJavaFile(String filePath, String source) {
File file = new File(filePath);
if (isFileExists(file)) {
return false;
}
File parentDirectory = file.getParentFile();
if (!parentDirectory.exists()) {
parentDirectory.mkdirs();
}
this.str2File(file, source);
return true;
}
/**
* str 2 file
* @param file
* @param source
*/
private void str2File(File file, String source) {
ByteArrayInputStream stream = new ByteArrayInputStream(source.getBytes());
OutputStream os = null;
try {
os = new FileOutputStream(file);
int bytesRead = 0;
final int buffSize = 8192;
byte[] buffer = new byte[buffSize];
while ((bytesRead = stream.read(buffer, 0, buffSize)) != -1) {
os.write(buffer, 0, bytesRead);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (stream != null) {
stream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.cftech.core.mybatis;
import com.cftech.core.mybatis.mybatis.*;
import com.cftech.core.util.StringUtils;
/**
* Created by lisw on 2016-08-05
*/
public class MybatisCodeTools {
/**
* author name
*/
protected String authorName;
/**
* driverName
*/
private String driverName;
/**
* dsUrl
*/
private String dsUrl;
/**
* dsUserName
*/
private String dsUserName;
/**
* dsPassword
*/
private String dsPassword;
/**
* tableName
*/
private String tableName;
/**
* 表名到实体对象 时需要去掉的前缀
*/
private String classNamePrefix;
/**
* 实体类包名,带有model 或者是 entity
*/
private String packageName;
/**
* mybatis 相关类的基础包名,即 dao service rest 所在包的包名
*/
private String basePackage;
/**
* mapper开启缓存
*/
private Boolean withCache = false;
/**
* generateJavaFile
*/
public void generateJavaFile() {
boolean flag = StringUtils.isNotBlank(driverName);
flag = flag && StringUtils.isNotBlank(dsUrl);
flag = flag && StringUtils.isNotBlank(dsUserName);
flag = flag && StringUtils.isNotBlank(dsPassword);
flag = flag && StringUtils.isNotBlank(tableName);
flag = flag && StringUtils.isNotBlank(packageName);
flag = flag && StringUtils.isNotBlank(basePackage);
flag = flag && StringUtils.isNotBlank(authorName);
if (flag) {
TableRead tableRead = new TableRead();
tableRead.setClassNamePrefix(classNamePrefix);
TableBean tableBean = tableRead.generateEntity(driverName, dsUrl, dsUserName, dsPassword, tableName);
tableBean.setBasePackage(basePackage);
tableBean.setPackageName(packageName);
EntityGenerator entityGenerator = new EntityGenerator();
entityGenerator.setAuthorName(authorName);
entityGenerator.outputJavaCode(tableBean);
MapperGenerator mapperGenerator = new MapperGenerator();
mapperGenerator.setAuthorName(authorName);
mapperGenerator.setWithCache(withCache);
mapperGenerator.outputJavaCode(tableBean);
ServiceGenerator serviceGenerator = new ServiceGenerator();
serviceGenerator.setAuthorName(authorName);
serviceGenerator.outputJavaCode(tableBean);
ControllerGenerator controllerGenrator = new ControllerGenerator();
controllerGenrator.setAuthorName(authorName);
controllerGenrator.outputJavaCode(tableBean);
/*RestControllerGenerator restControllerGenerator = new RestControllerGenerator();
restControllerGenerator.setAuthorName(authorName);
restControllerGenerator.outputJavaCode(tableBean);*/
}
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public void setDsUrl(String dsUrl) {
this.dsUrl = dsUrl;
}
public void setDsUserName(String dsUserName) {
this.dsUserName = dsUserName;
}
public void setDsPassword(String dsPassword) {
this.dsPassword = dsPassword;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public void setClassNamePrefix(String classNamePrefix) {
this.classNamePrefix = classNamePrefix;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
}
package com.cftech.core.mybatis.mybatis;
import com.cftech.core.mybatis.AbstractGenerator;
import com.cftech.core.util.StringUtils;
/**
* Created by lisw on 2016-08-05
*/
public abstract class AbstractMybatisGenerator extends AbstractGenerator {
/**
* 点
*/
protected final String pointStr = ".";
/**
* semicolon
*/
protected final String semicolon = ";";
/**
* enter
*/
protected final String enter = "\r\n";
/**
* tab
*/
protected final String tab = "\t";
/**
* author name
*/
protected String authorName;
/**
* 功能:将输入字符串的首字母改成大写
* @param str
* @return 首字母改成大写的字符串
*/
protected String initcap(String str) {
return StringUtils.capitalize(transLowerCamelCase(str));
}
/**
* 功能:下划线转为驼峰,且去掉相应的关键字
* @param str
* @return 驼峰字符串
*/
protected String transLowerCamelCase(String str) {
String tempStr = str;
if ("private".equals(str)) {
tempStr += "ly";
}
if ("count(*)".equals(str)) {
tempStr = "countAll";
}
return StringUtils.camelName(tempStr);
}
/**
* 功能:获得列的数据类型
* @param sqlType
* @return 数据类型字符串
*/
protected String sqlType2JavaType(String sqlType) {
String columnType = sqlType.toLowerCase();
if (columnType.startsWith("bit")) {
return "Boolean";
} else if (columnType.startsWith("tinyint")) {
return "Byte";
} else if (columnType.startsWith("smallint")) {
return "Short";
} else if (columnType.startsWith("int") || columnType.startsWith("mediumint")) {
return "Integer";
} else if (columnType.startsWith("bigint")) {
return "Long";
} else if (columnType.startsWith("float")) {
return "Float";
} else if (columnType.startsWith("decimal") || columnType.startsWith("numeric") || columnType.startsWith("real") || columnType.startsWith("money")
|| columnType.startsWith("smallmoney") || columnType.startsWith("double")) {
return "Double";
} else if (columnType.startsWith("varchar") || columnType.startsWith("char") || columnType.startsWith("nvarchar") || columnType.startsWith("nchar")
|| columnType.startsWith("text") || columnType.startsWith("longtext")) {
return "String";
} else if (columnType.startsWith("datetime") || columnType.startsWith("date")) {
return "Date";
// } else if (sqlType.toLowerCase().startsWith("image")) {
// return "Blod";
} else if (columnType.startsWith("timestamp")) {
return "Timestamp";
}
return null;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
/**
* outputJavaCode
* @param tableBean
*/
public abstract void outputJavaCode(TableBean tableBean);
}
package com.cftech.core.mybatis.mybatis;
import com.cftech.core.util.DateUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
/**
* Created by lisw on 2016-08-05
*/
public class EntityGenerator extends AbstractMybatisGenerator {
/**
* tableBean
*/
private TableBean tableBean;
/**
* 指定实体生成所在包的路径
*/
private String packageName;
/**
* 是否需要导入包java.util.*
*/
private boolean flagUtil = false;
/**
* 是否需要导入包java.sql.*
*/
private boolean flagSql = false;
/**
* 是否需要导入包java.sql.Timestamp
*/
private boolean flagTimestamp = false;
@Override
public void outputJavaCode(TableBean tableBean) {
if (tableBean != null) {
this.tableBean = tableBean;
this.flagSql = tableBean.isFlagSql();
this.flagTimestamp = tableBean.isFlagTimestamp();
this.flagUtil = tableBean.isFlagUtil();
packageName = tableBean.getPackageName();
final String tableName = tableBean.getTableName();
final String tableComment = tableBean.getTableComment();
final String[] columnNames = tableBean.getColumnNames();
final String[] columnTypes = tableBean.getColumnTypes();
final String entityString = generateEntity(tableName, tableComment, columnNames, columnTypes);
String rootPath = "";
if (StringUtils.isBlank(rootPath)) {
rootPath = System.getProperty("user.dir");
}
if (!rootPath.endsWith("/src/main/java") || !rootPath.endsWith("src/main/java/")) {
if (rootPath.endsWith("/")) {
rootPath += "src/main/java/";
} else {
rootPath += "/src/main/java/";
}
}
String modelPackage = tableBean.getPackageName();
String filePath = rootPath + modelPackage.replace(pointStr, "/") + "/";
String entityName = tableBean.getEntityName();
String daoFilePath = filePath + entityName + ".java";
outputJavaFile(daoFilePath, entityString);
}
}
/**
* 功能:生成实体类主体代码
*
* @param tableName
* @param columnName
* @param columnType
* @return entity string
*/
private String generateEntity(String tableName, String tableComment, String[] columnName, String[] columnType) {
StringBuffer sb = new StringBuffer();
sb.append("package " + this.packageName + ";").append(enter);
// 判断是否导入工具包
if (flagUtil) {
sb.append("import java.sql.Date;").append(enter);
}
if (flagSql) {
sb.append("import java.sql.*;").append(enter);
}
if (flagTimestamp) {
sb.append("import java.sql.Timestamp;").append(enter);
}
sb.append("import java.io.Serializable;").append(enter);
sb.append("import lombok.Data;").append(enter);
sb.append("import lombok.NoArgsConstructor;").append(enter);
sb.append("import UserUtils;");
sb.append(enter);
// 注释部分
sb.append("/**").append(enter);
final String starStr = " * ";
sb.append(starStr + tableName + " 实体类").append(enter);
if (StringUtils.isNotBlank(tableComment)) {
sb.append(starStr).append(tableComment).append(enter);
}
sb.append(" * Created by " + this.authorName + " " + DateUtils.getDate("dd/MM/yyyy") + ".").append(enter);
sb.append(" */ ").append(enter);
String className = tableBean.getEntityName();
// 实体部分
sb.append("@Data").append(enter);
sb.append("public class ").append(className).append(" implements Serializable {").append(enter);
processAllAttrs(sb);// 属性
//processAllMethod(sb);// get set方法
//生成无参构造方法
sb.append(enter);
sb.append("public "+className+"() {");
sb.append(enter+tab);
sb.append("this.delflag = false;");
sb.append("}");
sb.append(enter);
sb.append("}");
// System.out.println(sb.toString());
return sb.toString();
}
/**
* 功能:生成所有属性
*
* @param sb
*/
private void processAllAttrs(StringBuffer sb) {
String[] columnNames = tableBean.getColumnNames();
String[] columnTypes = tableBean.getColumnTypes();
Map<String, String> commentMap = tableBean.getCommentMap();
for (int i = 0; i < columnNames.length; i++) {
String columnName = columnNames[i];
String attributeName = transLowerCamelCase(columnName);
sb.append(tab).append("/**").append(enter);
if (commentMap.containsKey(columnName)) {
sb.append(tab).append(" * ").append(commentMap.get(columnName)).append(enter);
} else {
sb.append(tab).append(" * ").append(attributeName).append(enter);
}
sb.append(tab).append(" */").append(enter);
sb.append(tab).append("private " + sqlType2JavaType(columnTypes[i]) + " " + attributeName + ";").append(enter);
sb.append(enter);
}
}
/**
* 功能:生成所有方法
*
* @param sb
*/
private void processAllMethod(StringBuffer sb) {
String[] columnNames = tableBean.getColumnNames();
String[] columnTypes = tableBean.getColumnTypes();
for (int i = 0; i < columnNames.length; i++) {
String colName = columnNames[i];
String lowerCamelCase = transLowerCamelCase(colName);
sb.append(tab).append("public void set" + initcap(colName) + "(" + sqlType2JavaType(columnTypes[i]) + " " + lowerCamelCase + "){").append(enter);
sb.append(tab).append("this." + lowerCamelCase + " = " + lowerCamelCase + ";").append(enter);
sb.append(tab).append("}").append(enter);
sb.append(enter);
sb.append(tab).append("public " + sqlType2JavaType(columnTypes[i]) + " get" + initcap(colName) + "(){").append(enter);
sb.append(tab).append("\treturn " + lowerCamelCase + ";").append(enter);
sb.append(tab).append("}").append(enter).append(enter);
}
}
}
package com.cftech.core.mybatis.mybatis;
import com.cftech.core.mybatis.MybatisCodeTools;
import com.cftech.core.util.Constants;
/**
* Created by lisw on 2016-08-05
*/
public class MyBatis {
public static void main(String[] args) {
String tableNames = "t_appmenu";//表名、可多个,用逗号分隔
String module = "appmenu"; //模块名 tableNames的所有表必须同时属于此模块
String author = "Neil"; //代码生成Java类时的作者注释
MybatisCodeTools mybatisCodeTools = new MybatisCodeTools();
mybatisCodeTools.setClassNamePrefix("t_");//生成Model时需要去除的前缀
mybatisCodeTools.setAuthorName(author);//作者
mybatisCodeTools.setPackageName("com.cftech.base."+module+".model");//实体类的包名
mybatisCodeTools.setBasePackage("com.cftech.base."+module);//service,dao的包名
mybatisCodeTools.setDriverName("com.mysql.jdbc.Driver");//数据库驱动
mybatisCodeTools.setDsUrl("jdbc:mysql://56988d3d2d34d.sh.cdb.myqcloud.com:7989/cfwechat?useUnicode=true&characterEncoding=utf8"); //数据库连接
mybatisCodeTools.setDsUserName("cdb_outerroot"); //数据库链接用户名
mybatisCodeTools.setDsPassword("Changfu@123456"); //数据库密码
String[] arrays = tableNames.split(Constants.VALUE_SIMPLE_SPLIT_CHAR);
for(String tableName : arrays){
mybatisCodeTools.setTableName(tableName);
mybatisCodeTools.generateJavaFile();
}
}
}
\ No newline at end of file
package com.cftech.core.mybatis.mybatis;
import org.apache.commons.lang3.StringUtils;
/**
* Created by lisw on 2016-08-05
*/
public class RestControllerGenerator extends AbstractMybatisGenerator {
@Override
public void outputJavaCode(TableBean tableBean) {
if (tableBean != null) {
String rootPath = "";
if (StringUtils.isBlank(rootPath)) {
rootPath = System.getProperty("user.dir");
}
if (!rootPath.endsWith("/src/main/java") || !rootPath.endsWith("src/main/java/")) {
if (rootPath.endsWith("/")) {
rootPath += "src/main/java/";
} else {
rootPath += "/src/main/java/";
}
}
String basePackage = tableBean.getBasePackage();
String filePath = rootPath + basePackage.replace(pointStr, "/") + "/";
String entityName = tableBean.getEntityName();
String modelPackage = tableBean.getPackageName();
String restFilePath = filePath + "rest/" + entityName + "RestController.java";
outputJavaFile(restFilePath, generateRestController(basePackage, modelPackage, entityName).toString());
}
}
/**
* generateRestController
*
* @param basePackage
* @param modelPackage
* @param entityName
* @return StringBuffer
*/
public StringBuffer generateRestController(String basePackage, String modelPackage, String entityName) {
StringBuffer sb = new StringBuffer();
String clazzSimpleName = entityName;
String clazzNameLower = clazzSimpleName.substring(0, 1).toLowerCase() + clazzSimpleName.substring(1);
String suffix = "rest";
String restSuffix = "RestController";
sb.append("package ").append(basePackage).append(pointStr).append(suffix).append(semicolon).append(enter);
sb.append(enter);
sb.append("import org.springframework.web.bind.annotation.RequestMapping;").append(enter);
sb.append("import org.springframework.web.bind.annotation.RestController;").append(enter);
sb.append(enter);
sb.append("import com.confucian.framework.web.AbstractRestController;").append(enter);
sb.append(enter);
sb.append("/**").append(enter);
sb.append(" * ").append(clazzNameLower).append(restSuffix).append(enter);
sb.append(" * @author ice").append(enter);
sb.append(" */").append(enter);
sb.append("@RestController").append(enter);
sb.append("@RequestMapping(\"/").append(clazzNameLower).append("\")").append(enter);
sb.append("public class ").append(clazzSimpleName).append(restSuffix);
sb.append(" extends AbstractRestController {").append(enter);
sb.append(enter);
sb.append("}").append(enter);
return sb;
}
}
package com.cftech.core.mybatis.mybatis;
import com.cftech.core.util.DateUtils;
import com.cftech.core.util.StringUtils;
/**
* Created by lisw on 2016-08-05
*/
public class ServiceGenerator extends AbstractMybatisGenerator {
@Override
public void outputJavaCode(TableBean tableBean) {
if (tableBean != null) {
String rootPath = "";
if (StringUtils.isBlank(rootPath)) {
rootPath = System.getProperty("user.dir");
}
if (!rootPath.endsWith("/src/main/java") || !rootPath.endsWith("src/main/java/")) {
if (rootPath.endsWith("/")) {
rootPath += "src/main/java/";
} else {
rootPath += "/src/main/java/";
}
}
String basePackage = tableBean.getBasePackage();
String filePath = rootPath + basePackage.replace(pointStr, "/") + "/";
String entityName = tableBean.getEntityName();
String serviceFilePath = filePath + "service/" + entityName + "Service.java";
String serviceImplFilePath = filePath + "service/impl/" + entityName + "ServiceImpl.java";
String modelPackage = tableBean.getPackageName();
// outputJavaFile(daoFilePath, generateMapper(basePackage, modelPackage, entityName).toString());
outputJavaFile(serviceFilePath, generateService(basePackage, modelPackage, entityName).toString());
outputJavaFile(serviceImplFilePath, generateServiceImpl(basePackage, modelPackage, entityName).toString());
}
}
/**
* generateService
*
* @param basePackage
* @param modelPackage
* @param entityName
* @return StringBuffer
*/
public StringBuffer generateService(String basePackage, String modelPackage, String entityName) {
StringBuffer sb = new StringBuffer();
String clazzSimpleName = entityName;
String clazzNameLower = clazzSimpleName.substring(0, 1).toLowerCase() + clazzSimpleName.substring(1);
String importString = "import ";
String suffix = "service";
String suffixUpper = suffix.substring(0, 1).toUpperCase() + suffix.substring(1);
sb.append("package ").append(basePackage).append(pointStr).append(suffix).append(semicolon).append(enter);
sb.append(enter);
sb.append("import GenericService;").append(enter);
sb.append(importString).append(modelPackage).append(pointStr).append(clazzSimpleName).append(semicolon).append(enter);
sb.append(enter);
sb.append("/**").append(enter);
sb.append(" * ").append(clazzNameLower).append(suffixUpper).append(enter);
// sb.append(" * @author ice").append(enter);
sb.append(" * Created by " + this.authorName + " " + DateUtils.getDate("dd/MM/yyyy") + ".").append(enter);
sb.append(" */").append(enter);
sb.append("public interface ").append(clazzSimpleName).append(suffixUpper);
sb.append(" extends GenericService<").append(clazzSimpleName).append("> {").append(enter);
sb.append(enter);
sb.append("}").append(enter);
return sb;
}
/**
* generateServiceImpl
*
* @param basePackage
* @param modelPackage
* @param entityName
* @return StringBuffer
*/
public StringBuffer generateServiceImpl(String basePackage, String modelPackage, String entityName) {
StringBuffer sb = new StringBuffer();
String clazzSimpleName = entityName;
String clazzNameLower = clazzSimpleName.substring(0, 1).toLowerCase() + clazzSimpleName.substring(1);
String packageSuffix = "service.impl";
String suffix = "service";
String implSuffix = "ServiceImpl";
String suffixUpper = suffix.substring(0, 1).toUpperCase() + suffix.substring(1);
sb.append("package ").append(basePackage).append(pointStr).append(packageSuffix).append(semicolon).append(enter);
sb.append(enter);
sb.append("import org.springframework.beans.factory.annotation.Autowired;").append(enter);
sb.append("import org.springframework.beans.factory.annotation.Qualifier;").append(enter);
sb.append("import org.springframework.stereotype.Service;").append(enter);
sb.append(enter);
sb.append("import GenericDao;").append(enter);
sb.append("import GenericServiceImpl;").append(enter);
String daoSuffix = "dao";
String mapperSuffixUpper = "Mapper";
String importString = "import ";
sb.append(importString).append(basePackage).append(pointStr).append(daoSuffix).append(pointStr);
sb.append(clazzSimpleName).append(mapperSuffixUpper).append(semicolon).append(enter);
sb.append(importString).append(modelPackage).append(pointStr).append(clazzSimpleName).append(semicolon).append(enter);
sb.append(importString).append(basePackage).append(pointStr).append(suffix).append(pointStr).append(clazzSimpleName);
sb.append(suffixUpper).append(semicolon).append(enter);
sb.append(enter);
sb.append("/**").append(enter);
sb.append(" * ").append(clazzNameLower).append(suffixUpper).append(enter);
// sb.append(" * @author ice").append(enter);
sb.append(" * Created by " + this.authorName + " " + DateUtils.getDate("dd/MM/yyyy") + ".").append(enter);
sb.append(" */").append(enter);
sb.append("@Service(\"").append(clazzNameLower).append(suffixUpper).append("\")").append(enter);
sb.append("public class ").append(clazzSimpleName).append(implSuffix);
sb.append(" extends GenericServiceImpl<").append(clazzSimpleName).append("> ");
sb.append("implements ").append(clazzSimpleName).append(suffixUpper).append(" {").append(enter);
sb.append(enter);
sb.append(tab).append("/**").append(enter);
sb.append(tab).append(" * ").append(clazzNameLower).append(mapperSuffixUpper).append(enter);
sb.append(tab).append(" */").append(enter);
sb.append(tab).append("@Autowired").append(enter);
sb.append(tab).append("@Qualifier(\"").append(clazzNameLower).append("Mapper\")").append(enter);
sb.append(tab).append("private ").append(clazzSimpleName).append(mapperSuffixUpper);
sb.append(" ").append(clazzNameLower).append(mapperSuffixUpper).append(semicolon).append(enter);
sb.append(enter);
sb.append(tab).append("@Override").append(enter);
sb.append(tab).append("public GenericDao<").append(clazzSimpleName).append("> getGenericMapper() {").append(enter);
sb.append(tab).append(tab).append("return ").append(clazzNameLower).append(mapperSuffixUpper).append(semicolon).append(enter);
sb.append(tab).append("}").append(enter);
sb.append("}").append(enter);
return sb;
}
}
package com.cftech.core.mybatis.mybatis;
import java.util.Map;
/**
* Created by lisw on 2016-08-05
*/
public class TableBean {
/**
* tableName
*/
private String tableName;
/**
* tableComment
*/
private String tableComment;
/**
* 列名数组
*/
private String[] columnNames; // 列名数组
/**
* 列名类型数组
*/
private String[] columnTypes; // 列名类型数组
/**
* 列名大小数组
*/
private int[] columnSizes; // 列名大小数组
/**
* 实体类名
*/
private String entityName;
/**
* 实体类包名,带有model 或者是 entity
*/
private String packageName;
/**
* 是否需要导入包java.util.*
*/
private boolean flagUtil = false;
/**
* 是否需要导入包java.sql.*
*/
private boolean flagSql = false;
/**
* 是否需要导入包java.sql.Timestamp
*/
private boolean flagTimestamp = false;
/**
* mybatis 相关类的基础包名,即 dao service rest 所在包的包名
*/
private String basePackage;
/**
* 自增字段
*/
private String autoIncrementColumn;
/**
* comment
*/
private Map<String, String> commentMap;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getTableComment() {
return tableComment;
}
public void setTableComment(String tableComment) {
this.tableComment = tableComment;
}
public String[] getColumnNames() {
return columnNames;
}
public void setColumnNames(String[] columnNames) {
this.columnNames = columnNames;
}
public String[] getColumnTypes() {
return columnTypes;
}
public void setColumnTypes(String[] columnTypes) {
this.columnTypes = columnTypes;
}
public int[] getColumnSizes() {
return columnSizes;
}
public void setColumnSizes(int[] columnSizes) {
this.columnSizes = columnSizes;
}
public String getEntityName() {
return entityName;
}
public void setEntityName(String entityName) {
this.entityName = entityName;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public boolean isFlagUtil() {
return flagUtil;
}
public void setFlagUtil(boolean flagUtil) {
this.flagUtil = flagUtil;
}
public boolean isFlagSql() {
return flagSql;
}
public void setFlagSql(boolean flagSql) {
this.flagSql = flagSql;
}
public boolean isFlagTimestamp() {
return flagTimestamp;
}
public void setFlagTimestamp(boolean flagTimestamp) {
this.flagTimestamp = flagTimestamp;
}
public String getBasePackage() {
return basePackage;
}
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
public Map<String, String> getCommentMap() {
return commentMap;
}
public void setCommentMap(Map<String, String> commentMap) {
this.commentMap = commentMap;
}
public String getAutoIncrementColumn() {
return autoIncrementColumn;
}
public void setAutoIncrementColumn(String autoIncrementColumn) {
this.autoIncrementColumn = autoIncrementColumn;
}
// public void print() {
// System.out.println(tableName);
// List<String> listNames = Arrays.asList(columnNames);
// List<String> sortedNames = new ArrayList<>();
// sortedNames.addAll(listNames);
// Collections.sort(sortedNames);
// if (StringUtils.isNotBlank(tableName)) {
// int length = sortedNames.size();
// for (int i = 0; i < length; i++) {
// String name = sortedNames.get(i);
// System.out.print(name);
// System.out.print("\t");
// int index = listNames.indexOf(name);
// System.out.println(columnTypes[index].toLowerCase().toString());
// }
// }
// }
}
package com.cftech.core.mybatis.mybatis;
import com.cftech.core.util.Constants;
import com.cftech.core.util.StringUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by lisw on 2016-08-05
*/
public class TableRead {
/**
* 表名到实体对象 时需要去掉的前缀
*/
protected String classNamePrefix;
/**
* generateEntity
* @param driverName
* @param dsUrl
* @param dsUserName
* @param dsPassword
* @param tableName
* @return tableBean
*/
public TableBean generateEntity(String driverName, String dsUrl, String dsUserName, String dsPassword, String tableName) {
// flagTimestamp = false;
TableBean tableBean = new TableBean();
// 创建连接
Connection con = null;
// 查要生成实体类的表
String sql = "select * from " + tableName + " limit 1";
PreparedStatement preparedStatement = null;
try {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
return null;
}
List<String> columnNames = new ArrayList<>();
List<String> columnTypes = new ArrayList<>();
List<Integer> columnSizes = new ArrayList<>();
Map<String, String> commentMap = new HashMap<>();
con = DriverManager.getConnection(dsUrl, dsUserName, dsPassword);
preparedStatement = con.prepareStatement(sql);
ResultSetMetaData rsmd = preparedStatement.getMetaData();
int size = rsmd.getColumnCount(); // 统计列
// 读取comment
ResultSet resultSet = null;
{
// 参考自:http://my.oschina.net/Thinkeryjgfn/blog/169384
DatabaseMetaData metaData = con.getMetaData();
String schema = dsUrl;
if (schema.contains("?")) {
schema = schema.substring(0, dsUrl.indexOf("?"));
}
schema = schema.substring(schema.lastIndexOf("/") + 1);
resultSet = metaData.getColumns(con.getCatalog(), schema, tableName, null);
if (StringUtils.contains(driverName, "mysql")) {// com.mysql.jdbc.Driver
String commentSql = "select * from information_schema.tables where table_name='" + tableName + "' and table_schema='" + schema + "'";
Statement stmt = con.createStatement();
ResultSet executeQuery = stmt.executeQuery(commentSql);
while (executeQuery.next()) {
final String tableComment = executeQuery.getString("TABLE_COMMENT");
tableBean.setTableComment(tableComment);
break;
}
}
}
for (int i = 0; i < size; i++) {
int next = i + 1;
String columnName = rsmd.getColumnName(next);
columnNames.add(columnName);
boolean autoIncrement = rsmd.isAutoIncrement(next);
if (autoIncrement) {
tableBean.setAutoIncrementColumn(columnName);
}
String columnType = rsmd.getColumnTypeName(next).toLowerCase();
columnTypes.add(columnType);
int datasize = rsmd.getColumnDisplaySize(next);
columnSizes.add(datasize);
if (columnType.startsWith("datetime") || columnType.startsWith("date")) {
tableBean.setFlagUtil(true);
}
if (columnType.startsWith("image") || columnType.startsWith("text")) {
tableBean.setFlagSql(true);
}
if (columnType.startsWith("timestamp")) {
tableBean.setFlagTimestamp(true);
}
if (resultSet != null) {
resultSet.next();
String comment = resultSet.getString("REMARKS");
if (StringUtils.isNotBlank(comment)) {
commentMap.put(columnName, comment);
}
}
}
tableBean.setColumnNames(columnNames.toArray(new String[columnNames.size()]));
tableBean.setColumnTypes(columnTypes.toArray(new String[columnTypes.size()]));
tableBean.setTableName(tableName);
tableBean.setEntityName(transClassName(tableName));
tableBean.setCommentMap(commentMap);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return tableBean;
}
/**
* transClassName
* @param tableName
* @return className
*/
private String transClassName(String tableName) {
String tempTableName = tableName;
if (!classNamePrefix.contains(Constants.VALUE_SIMPLE_SPLIT_CHAR)) {
tempTableName = tableName.replace(classNamePrefix, "");
return StringUtils.capitalize(StringUtils.camelName(tempTableName));
} else {
String[] split = classNamePrefix.split(",");
for (String prefix : split) {
if (tableName.toLowerCase().startsWith(prefix)) {
tempTableName = tableName.replace(prefix, "");
return StringUtils.capitalize(StringUtils.camelName(tempTableName));
}
}
}
return StringUtils.capitalize(StringUtils.camelName(tempTableName));
}
public void setClassNamePrefix(String classNamePrefix) {
this.classNamePrefix = classNamePrefix;
}
}
This diff is collapsed.
package com.cftech.core.poi;
public enum ExcelType {
EXCEL2003,
/**
* 2007或更高
*/
EXCEL2007;
}
package com.cftech.core.poi;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Excel导出项配置
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface ExportConfig {
/**
* 表头显示名
* @return 默认为字段名
*/
String value() default "field";
/**
* 单元格宽度
* @return 默认300
*/
short width() default 300;
/**
* 是否导出数据(如果不导出数据,Ĭ将以“******”填充单元格)
* @return 默认true
*/
boolean isExportData() default true;
/**
* 是否显示, 0 都显示,1导出时显示,2导入时显示
* @return
*/
int showLevel() default 0;
/**
* 日期格式化, 空就不格式化,否则按定义的格式化,譬如 yyyy-MM-dd
* 只用于导出
* @return
*/
String dateFormat() default "";
}
package com.cftech.core.poi;
import java.util.List;
/**
* Excel数据读取回调
* @author wuwz
*/
public interface OnReadDataHandler {
/**
* 处理当前行数据
* @param rowData 当前行数据,以rowData.get(cellIndex)的方式获取,如果cell的值为ExceklKit._emptyCellValue,则表示该单元格为空。
*/
void handler(List<String> rowData);
}
package com.cftech.core.poi;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
/**
* 导出Excel设置接口。
*/
public interface OnSettingHanlder {
/**
* 设置表头样式
* @param wb 当前Wordbook对象
* @return 处理后的样式
*/
CellStyle getHeadCellStyle(Workbook wb);
/**
* 设置内容部分的单元格样式
* @param wb 当前Wordbook对象
* @return 处理后的样式
*/
CellStyle getBodyCellStyle(Workbook wb);
/**
* 设置导出的文件名(无需处理后缀)
* @param sheetName sheetName
* @return 处理后的文件名
*/
String getExportFileName(String sheetName);
}
/**
* File Name:RedisCacheConfig.java
*
* Copyright Defonds Corporation 2015
* All Rights Reserved
*
*/
package com.cftech.core.redis;
import com.cftech.core.util.DESUtil;
import com.cftech.core.util.SystemConfig;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Protocol;
import java.lang.reflect.Method;
/**
* @version
* @EnableCaching 启用cache注解功能
*/
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport{
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = -1;
private static String PASS= "";
private static int port=6379;
static
{
try {
PASS = DESUtil.decrypt( SystemConfig.r.getProperty("spring.redis.password"),DESUtil.KEY);
port=Integer.valueOf(SystemConfig.r.getProperty("spring.redis.port"));
} catch (Exception e) {
e.printStackTrace();
}
}
@Bean
public JedisPoolConfig getJedisPoolConfig()
{
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setMaxTotal(150);
return config;
}
@Bean
public JedisPool jedisPool(JedisPoolConfig jedisPoolConfig)
{
JedisPool jedisPool = new JedisPool(jedisPoolConfig, SystemConfig.r.getProperty("spring.redis.host"),port,
Protocol.DEFAULT_TIMEOUT, PASS);
return jedisPool;
}
@Bean
public JedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
JedisConnectionFactory factory = new JedisConnectionFactory();
//factory.setHostName("120.195.144.73");//汤沟正式
factory.setHostName(SystemConfig.r.getProperty("spring.redis.host"));
//factory.setHostName("115.159.84.126");//畅服
//factory.setHostName("127.0.0.1");
factory.setPort(port);
factory.setUsePool(true);
factory.setPassword(PASS);
factory.setPoolConfig(jedisPoolConfig);
return factory;
// List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
// JedisShardInfo shardMasterOne = new JedisShardInfo("123.206.215.74", 6379,"主机器1");
// shardMasterOne.setPassword(PASS);
// shards.add(shardMasterOne);
//
// JedisShardInfo shardMasterSecond = new JedisShardInfo("115.159.84.126", 6379,"主机器2");
// shardMasterSecond.setPassword(PASS);
// shards.add(shardMasterSecond);
// JedisPoolConfig config = new JedisPoolConfig();
// config.setMaxIdle(MAX_IDLE);
// config.setMaxWaitMillis(MAX_WAIT);
// config.setMaxTotal(20);
// Set<String> set =new HashSet<String>();
// set.add("192.168.220.129:26379");
// set.add("192.168.220.129:26378");
// RedisSentinelConfiguration rsc = new RedisSentinelConfiguration("mymaster",set);//哨兵模式 ,测试环境用分布式
// return new JedisConnectionFactory(shardMasterOne);
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
// Number of seconds before expiration. Defaults to unlimited (0)
cacheManager.setDefaultExpiration(3600*24);//3000); // Sets the default expire time (in seconds)默认一天时间
// Map<String,Long> expires = new HashMap<String, Long>();//自定义Redis缓存的自定义过期时间
// expires.put("AccountCache",1000L);
// cacheManager.setExpires(expires);
return cacheManager;
}
@Override
public KeyGenerator keyGenerator() { return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
}
};}
// @Bean
// public KeyGenerator customKeyGenerator() {
// return new KeyGenerator() {
// @Override
// public Object generate(Object o, Method method, Object... objects) {
// StringBuilder sb = new StringBuilder();
// sb.append(o.getClass().getName());
// sb.append(method.getName());
// for (Object obj : objects) {
// sb.append(obj.toString());
// }
// return sb.toString();
// }
// };
// }
}
package com.cftech.core.schafflerentity;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* Created by user on 2018/6/25.
*/
@Data
public class VisitEntity {
private String itemNo; //ITEM NO
private String lastName;//姓
private String firstName;//名
private String gender;//性别
private String company;//公司
private String job;//职位
private String email;//email
private String mobile;//手机
private String regiLasetName;//注册姓
private String regiFirstName;//注册名
private String regiMobile;//注册手机
private List<String> hightLightedCols;
private Map<String,String> needHosp;//住宿安排
private String noneedHosp;//不需要住宿
private String nosmoking;//无烟房
private String pickUpFlightNo;//接机航班号
private String arriveDate;//到达日期
private String arriveTime;//到达时间
private String arriveStation;//到达站点
private String departFlightNo;//出发航班号
private String departDate;//出发日期
private String departTime;//出发时间
private String departStation;//出发站点
private String selfDriving;//自驾
private String selfPickDriving;//自驾
private Map<String,String> planTour;//工厂参观
private Map<String,String> testDrive;//试乘试驾
private Map<String,String> caterIng;//餐饮
private String remark;//备注
private String inviteCode;
}
package com.cftech.core.scope;
/**
* Created by lisw on 2016-08-05
*/
public enum CondType {
EQUAL, GREATEQUAL, GREATTHAN, LESSEQUAL, LESSTHAN, BETWEEN, ISNULL, NOTNULL, LIKE, IN, OR, NOTEQUAL;
public static CondType ordinalByName(String name) {
if (null == name) return null;
CondType[] types = values();
for (int i = 0, len = types.length; i < len; i++) {
CondType type = types[i];
if (type.name().equalsIgnoreCase(name)) { return type; }
}
return null;
}
}
package com.cftech.core.scope;
/**
* Created by lisw on 2016-08-05
*/
public enum LikeType {
RIGHT, LEFT, NORMAL;
public static LikeType ordinalByName(String name) {
if (null == name) return null;
LikeType[] types = values();
for (int i = 0, len = types.length; i < len; i++) {
LikeType type = types[i];
if (type.name().equalsIgnoreCase(name)) { return type; }
}
return null;
}
}
package com.cftech.core.scope;
/**
* Created by lisw on 2016-08-05
*/
public enum LinkType {
AND, OR;
public static LinkType ordinalByName(String name) {
if (null == name) return null;
LinkType[] types = values();
for (int i = 0, len = types.length; i < len; i++) {
LinkType type = types[i];
if (type.name().equalsIgnoreCase(name)) { return type; }
}
return null;
}
}
package com.cftech.core.scope;
/**
* Created by lisw on 2016-08-05
*/
public enum OrderType {
DESC, ASC;
public static OrderType ordinalByName(String name) {
if (null == name) return null;
OrderType[] types = values();
for (int i = 0, len = types.length; i < len; i++) {
OrderType type = types[i];
if (type.name().equalsIgnoreCase(name)) { return type; }
}
return null;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 之间
* @author: lisw
* @date: 2016-8-05 下午1:25:14
*/
public class BetweenCond extends Cond {
private String param;
private Object startValue;
private Object endValue;
public BetweenCond(LinkType linkType, String param, Object startValue, Object endValue) {
super(CondType.BETWEEN, linkType);
this.param = param;
this.startValue = startValue;
this.endValue = endValue;
}
public String getParam() {
return param;
}
public Object getStartValue() {
return startValue;
}
public Object getEndValue() {
return endValue;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 条件
* @author: lisw
* @date: 2016-8-05 下午1:20:00
* @version: V1.0
*/
public class Cond {
private CondType condType;
private LinkType linkType;
public Cond(CondType condType, LinkType linkType) {
this.condType = condType;
this.linkType = linkType;
}
public String getCondType() {
return condType.name();
}
public String getLinkType() {
return linkType.name();
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.LikeType;
import com.cftech.core.scope.LinkType;
import java.util.ArrayList;
import java.util.List;
/**
* @Description: 条件集合
* @author: lisw
* @date: 2016-08-05 上午11:48:36
*/
public class Conds {
List<Cond> conds = new ArrayList<Cond>();
// Codec mySQLCodec = new MySQLCodec(MySQLCodec.Mode.STANDARD);
/**
* and连接 等于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds equal(String param, Object value) {
if (null == value) return this;
conds.add(new EqualCond(LinkType.AND, param, value));
return this;
}
/**
* and连接 不等于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds notEqual(String param, Object value) {
if (null == value) return this;
conds.add(new NotEqualCond(LinkType.AND, param, value));
return this;
}
/**
* or连接 等于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds equalOr(String param, Object value) {
if (null == value) return this;
conds.add(new EqualCond(LinkType.OR, param, value));
return this;
}
/**
* and连接 大于等于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds greatEqual(String param, Object value) {
if (null == value) return this;
conds.add(new GreatEqualCond(LinkType.AND, param, value));
return this;
}
/**
* or连接 大于等于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds greatEqualOr(String param, Object value) {
if (null == value) return this;
conds.add(new GreatEqualCond(LinkType.OR, param, value));
return this;
}
/**
* and连接 大于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds greatThan(String param, Object value) {
if (null == value) return this;
conds.add(new GreatThanCond(LinkType.AND, param, value));
return this;
}
/**
* or连接 大于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds greatThanOr(String param, Object value) {
if (null == value) return this;
conds.add(new GreatThanCond(LinkType.OR, param, value));
return this;
}
/**
* and连接 小于等于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds lessEqual(String param, Object value) {
if (null == value) return this;
conds.add(new LessEqualCond(LinkType.AND, param, value));
return this;
}
/**
* or连接 小于等于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds lessEqualOr(String param, Object value) {
if (null == value) return this;
conds.add(new LessEqualCond(LinkType.OR, param, value));
return this;
}
/**
* and连接 小于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds lessThan(String param, Object value) {
if (null == value) return this;
conds.add(new LessThanCond(LinkType.AND, param, value));
return this;
}
/**
* or连接 小于
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds lessThanOr(String param, Object value) {
if (null == value) return this;
conds.add(new LessThanCond(LinkType.OR, param, value));
return this;
}
/**
* and连接 之间
*
* @param param 字段
* @param startValue 开始值
* @param endValue 结束值
* @return 条件集
*/
public Conds between(String param, Object startValue, Object endValue) {
if (null != startValue && null != endValue) {
conds.add(new BetweenCond(LinkType.AND, param, startValue, endValue));
} else if (null != startValue && null == endValue) {
conds.add(new GreatEqualCond(LinkType.AND, param, startValue));
} else if (null == startValue && null != endValue) {
conds.add(new LessEqualCond(LinkType.AND, param, endValue));
}
return this;
}
/**
* or连接 之间
*
* @param param 字段
* @param startValue 开始值
* @param endValue 结束值
* @return 条件集
*/
public Conds betweenOr(String param, Object startValue, Object endValue) {
if (null != startValue && null != endValue) {
conds.add(new BetweenCond(LinkType.OR, param, startValue, endValue));
} else if (null != startValue && null == endValue) {
conds.add(new GreatEqualCond(LinkType.OR, param, startValue));
} else if (null == startValue && null != endValue) {
conds.add(new LessEqualCond(LinkType.OR, param, endValue));
}
return this;
}
/**
* and连接 空
*
* @param param 字段
* @return 条件集
*/
public Conds isNull(String param) {
conds.add(new IsNullCond(LinkType.AND, param));
return this;
}
/**
* or连接 空
*
* @param param 字段
* @return 条件集
*/
public Conds isNullOr(String param) {
conds.add(new IsNullCond(LinkType.OR, param));
return this;
}
/**
* and连接 空
*
* @param param 字段
* @return 条件集
*/
public Conds notNull(String param) {
conds.add(new NotNullCond(LinkType.AND, param));
return this;
}
/**
* or连接 空
*
* @param param 字段
* @return 条件集
*/
public Conds notNullOr(String param) {
conds.add(new NotNullCond(LinkType.OR, param));
return this;
}
/**
* and连接 模糊
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds like(String param, String value) {
if (null == value) return this;
conds.add(new LikeCond(LinkType.AND, param, LikeType.NORMAL, value));
return this;
}
/**
* or连接 模糊
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds likeOr(String param, String value) {
if (null == value) return this;
conds.add(new LikeCond(LinkType.OR, param, LikeType.NORMAL, value));
return this;
}
/**
* and连接 左查询
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds leftLike(String param, String value) {
if (null == value) return this;
conds.add(new LikeCond(LinkType.AND, param, LikeType.LEFT, value));
return this;
}
/**
* or连接 左查询
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds leftLikeOr(String param, String value) {
if (null == value) return this;
conds.add(new LikeCond(LinkType.OR, param, LikeType.LEFT, value));
return this;
}
/**
* and连接 右查询
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds rightLike(String param, String value) {
if (null == value) return this;
conds.add(new LikeCond(LinkType.AND, param, LikeType.RIGHT, value));
return this;
}
/**
* or连接 右查询
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds rightLikeOr(String param, String value) {
if (null == value) return this;
conds.add(new LikeCond(LinkType.OR, param, LikeType.RIGHT, value));
return this;
}
/**
* and连接 包含
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds in(String param, Object[] value) {
if (null == value) return this;
conds.add(1 == value.length ? new EqualCond(LinkType.AND, param, value[0]) : new InCond(LinkType.AND,
param, value));
return this;
}
/**
* or连接 包含
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds inOr(String param, Object[] value) {
if (null == value) return this;
conds.add(1 == value.length ? new EqualCond(LinkType.OR, param, value[0]) : new InCond(LinkType.OR, param,
value));
return this;
}
/**
* and连接 多个or组合
*
* @param param 字段
* @param value 值
* @return 条件集
*/
public Conds orCond(String param, List<Cond> value) {
if (null == value)
return this;
conds.add(new OrCond(LinkType.AND, param, value));
return this;
}
public List<Cond> getConds() {
return conds;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 等于
* @author: lisw
* @date: 2016-8-05 上午11:56:01
*/
public class EqualCond extends Cond {
private String param;
private Object value;
public EqualCond(LinkType linkType, String param, Object value) {
super(CondType.EQUAL, linkType);
this.param = param;
this.value = value;
}
public String getParam() {
return param;
}
public Object getValue() {
return value;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 大于等于
* @author: lisw
* @date: 2016-8-05 下午1:18:25
*/
public class GreatEqualCond extends Cond {
private String param;
private Object value;
public GreatEqualCond(LinkType linkType, String param, Object value) {
super(CondType.GREATEQUAL, linkType);
this.param = param;
this.value = value;
}
public String getParam() {
return param;
}
public Object getValue() {
return value;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 大于
* @author: lisw
* @date: 2016-8-05 下午1:18:48
*/
public class GreatThanCond extends Cond {
private String param;
private Object value;
public GreatThanCond(LinkType linkType, String param, Object value) {
super(CondType.GREATTHAN, linkType);
this.param = param;
this.value = value;
}
public String getParam() {
return param;
}
public Object getValue() {
return value;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 等于
* @author: lisw
* @date: 2016-8-05 上午11:56:01
*/
public class InCond extends Cond {
private String param;
private Object[] value;
public InCond(LinkType linkType, String param, Object[] value) {
super(CondType.IN, linkType);
this.param = param;
this.value = value;
}
public String getParam() {
return param;
}
public Object getValue() {
return value;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 空
* @author: lisw
* @date: 2016-8-05 上午11:55:41
*/
public class IsNullCond extends Cond {
private String param;
public IsNullCond(LinkType linkType, String param) {
super(CondType.ISNULL, linkType);
this.param = param;
}
public String getParam() {
return param;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 小于等于
* @author: lisw
* @date: 2016-8-05 下午1:35:28
*/
public class LessEqualCond extends Cond {
private String param;
private Object value;
public LessEqualCond(LinkType linkType, String param, Object value) {
super(CondType.LESSEQUAL, linkType);
this.param = param;
this.value = value;
}
public String getParam() {
return param;
}
public Object getValue() {
return value;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 小于
* @author: lisw
* @date: 2016-8-05 下午1:17:56
*/
public class LessThanCond extends Cond {
private String param;
private Object value;
public LessThanCond(LinkType linkType, String param, Object value) {
super(CondType.LESSTHAN, linkType);
this.param = param;
this.value = value;
}
public String getParam() {
return param;
}
public Object getValue() {
return value;
}
}
package com.cftech.core.sql;
import com.cftech.core.scope.CondType;
import com.cftech.core.scope.LikeType;
import com.cftech.core.scope.LinkType;
/**
* @Description: 模糊
* @author: lisw
* @date: 2016-8-05 上午11:56:19
*/
public class LikeCond extends Cond {
private String param;
private String value;
public LikeCond(LinkType linkType, String param, LikeType likeType, String value) {
super(CondType.LIKE, linkType);
this.param = param;
switch (likeType) {
case LEFT:
this.value = new StringBuilder("%").append(value).toString();
break;
case RIGHT:
this.value = new StringBuilder(value).append("%").toString();
break;
case NORMAL:
this.value = new StringBuilder("%").append(value).append("%").toString();
break;
default:
this.value = value;
break;
}
}
public String getParam() {
return param;
}
public String getValue() {
return value;
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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