admin
2020-12-31 8bed368f976337b1860812d74681dfbc2c770577
常用工具优化
5个文件已修改
17个文件已添加
885 ■■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/GoodsControllerV2.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/JobThreadExecutorServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/RedisManager.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/annotation/RedisCacheUtil.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/FreemarkerUtils.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/HtmlToolUtil.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/SerializeUtil.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/entity/alipay/AlipayUserInfo.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/generater/entity/BaseData.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/generater/entity/ColumnData.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/generater/entity/ExceptionData.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/generater/entity/MongoDBDaoData.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/generater/entity/ServiceData.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/generater/mongo/MongoDaoUtil.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/mq/JobThreadExecutorServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/resources/exception.template 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/resources/mongoDBDao.template 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/resources/service.template 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/resources/serviceImpl.template 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/test/java/com/yeshi/utils/MongoTest.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/utils.iml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/GoodsControllerV2.java
@@ -1781,6 +1781,7 @@
            return;
        }
        //TODO 是否需要返回绑定链接
        boolean auth = PinDuoDuoApiUtil.isAuth(pid, uid + "");
        PDDPromotionUrl convertUrl = PinDuoDuoApiUtil.convert(id, pid + "", uid + "", !auth);
        JSONObject data = new JSONObject();
fanli/src/main/java/com/yeshi/fanli/service/impl/JobThreadExecutorServiceImpl.java
@@ -1,8 +1,5 @@
package com.yeshi.fanli.service.impl;
import com.aliyun.openservices.shade.com.alibaba.rocketmq.common.ThreadFactoryImpl;
import org.yeshi.utils.TimeUtil;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
fanli/src/main/java/com/yeshi/fanli/util/RedisManager.java
@@ -6,6 +6,7 @@
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Component;
import org.yeshi.utils.JsonUtil;
fanli/src/main/java/com/yeshi/fanli/util/annotation/RedisCacheUtil.java
@@ -3,9 +3,11 @@
import java.lang.reflect.Method;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.cache.annotation.CacheEvict;
public class RedisCacheUtil {
    @CacheEvict
    public static void getKey(Method method, MethodSignature methodSignature) {
    }
utils/src/main/java/org/yeshi/utils/FreemarkerUtils.java
New file
@@ -0,0 +1,101 @@
package org.yeshi.utils;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.util.Map;
public class FreemarkerUtils {
    private static String defaultCharacter = "UTF-8";
    private static Configuration cfg;
    private FreemarkerUtils() {
    }
    static {
        cfg = new Configuration(Configuration.getVersion());
        cfg.setDefaultEncoding(defaultCharacter);
        cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
    }
    /**
     * 对模板进行渲染
     *
     * @param data   数据Map
     * @param tplStr 模板
     * @return
     */
    public static String generateString(Object data, String tplStr) {
        String result = null;
        String name = "myStrTpl";
        try {
            StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
            stringTemplateLoader.putTemplate(name, tplStr);
            cfg.setTemplateLoader(stringTemplateLoader);
            Template template = cfg.getTemplate(name, defaultCharacter);
            StringWriter out = new StringWriter();
            template.process(data, out);
            out.flush();
            result = out.toString();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    public static String generateInputStream(Object data, InputStream templateStream) throws IOException {
        String str = IOUtils.toString(templateStream, "UTF-8");
        return generateString(data, str);
    }
    /**
     * 将模板渲染以后保存到文件
     *
     * @param templateFileDir  模板目录
     * @param templateFileName 模板文件名称
     * @param targetFilePath   渲染后文件名称
     * @param data          数据
     * @return
     */
    public static boolean renderingTemplateAndGenerateFile(String templateFileDir,
                                                           String templateFileName, String targetFilePath,Object data) {
        boolean flag = true;
        try {
            // 设置文件所在目录的路径
            cfg.setDirectoryForTemplateLoading(new File(templateFileDir));//模板路径
            // 获取模版
            Template template = cfg.getTemplate(templateFileName);
            // 设置输出文件名,和保存路径
            File outFile = new File(targetFilePath);
            // 将模板和数据模型合并生成文件 重点设置编码集
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
            // 生成文件
            template.process(data, out);
            // 关闭流
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
//            logger.error("生产模板文件失败!",e);
            flag = false;
        }
        return flag;
    }
    public static boolean renderingTemplateAndGenerateFile(InputStream templateInput, String targetFilePath, Object data) throws Exception {
        String result = generateInputStream(data, templateInput);
        if (result != null) {
            FileUtil.saveAsFileByte(result.getBytes("UTF-8"), targetFilePath);
            return true;
        }
        return false;
    }
}
utils/src/main/java/org/yeshi/utils/HtmlToolUtil.java
New file
@@ -0,0 +1,35 @@
package org.yeshi.utils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class HtmlToolUtil {
    //解析SQLYog工具导出的html内容
    public static List<String[]> parseSQLYogExportHtmData(String path, int columns) {
        List<String[]> contentList = new ArrayList<>();
        try {
            Document doc = Jsoup.parse(new File(path), "UTF-8");
            Elements els = doc.getElementsByTag("tr");
            for (int i = 1; i < els.size(); i++) {
                Elements tds = els.get(i).getElementsByTag("td");
                String[] contents = new String[columns];
                for (int j = 0; j < columns; j++) {
                    String content = tds.get(j).html().trim();
                    contents[j] = content;
                }
                contentList.add(contents);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return contentList;
    }
}
utils/src/main/java/org/yeshi/utils/SerializeUtil.java
New file
@@ -0,0 +1,52 @@
package org.yeshi.utils;
import java.io.*;
/**
 * @Description: 序列化反序列化工具
 */
public class SerializeUtil {
    /**
     * 序列化
     */
    public static byte[] serialize(Object obj) {
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            //序列化
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            byte[] byteArray = baos.toByteArray();
            return byteArray;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 反序列化
     *
     * @param bytes
     * @return
     */
    public static Object unSerialize(byte[] bytes) {
        ByteArrayInputStream bais = null;
        try {
            //反序列化为对象
            bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
utils/src/main/java/org/yeshi/utils/entity/alipay/AlipayUserInfo.java
New file
@@ -0,0 +1,62 @@
package org.yeshi.utils.entity.alipay;
import com.google.gson.annotations.SerializedName;
public class AlipayUserInfo {
    @SerializedName("user_id")
    private String userId;
    private String avatar;
    private String province;
    private String city;
    @SerializedName("nick_name")
    private String nickName;
    private String gender;
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getAvatar() {
        return avatar;
    }
    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}
utils/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
New file
@@ -0,0 +1,56 @@
package org.yeshi.utils.generater;
import org.yeshi.utils.FreemarkerUtils;
import org.yeshi.utils.generater.entity.ExceptionData;
import org.yeshi.utils.generater.entity.MongoDBDaoData;
import org.yeshi.utils.generater.entity.ServiceData;
import java.io.File;
public class SpringComponentGenerater {
    /**
     * 创建mongodb的dao
     *
     * @param data
     * @param targetDir
     * @throws Exception
     */
    public static void createMongoDao(MongoDBDaoData data, String targetDir) throws Exception {
        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("mongoDBDao.template"), new File(targetDir, data.getDaoName() + ".java").getAbsolutePath(), data);
    }
    /**
     * 创建服务
     *
     * @param data
     * @param targetDir
     * @throws Exception
     */
    public static void createService(ServiceData data, String targetDir) throws Exception {
        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("service.template"), new File(targetDir, data.getServiceClassName() + ".java").getAbsolutePath(), data);
    }
    /**
     * 创建服务实现
     *
     * @param data
     * @param targetDir
     * @throws Exception
     */
    public static void createServiceImpl(ServiceData data, String targetDir) throws Exception {
        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("serviceImpl.template"), new File(targetDir, data.getServiceClassName() + "Impl.java").getAbsolutePath(), data);
    }
    public static void createException(ExceptionData data, String targetDir) throws Exception {
        FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("exception.template"), new File(targetDir, data.getEntityClassName() + "Exception.java").getAbsolutePath(), data);
    }
}
utils/src/main/java/org/yeshi/utils/generater/entity/BaseData.java
New file
@@ -0,0 +1,22 @@
package org.yeshi.utils.generater.entity;
public class BaseData {
    private String packageName;
    private String entityClass;
    public String getPackageName() {
        return packageName;
    }
    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }
    public String getEntityClass() {
        return entityClass;
    }
    public void setEntityClass(String entityClass) {
        this.entityClass = entityClass;
    }
}
utils/src/main/java/org/yeshi/utils/generater/entity/ColumnData.java
New file
@@ -0,0 +1,32 @@
package org.yeshi.utils.generater.entity;
public class ColumnData {
    private String columnName;
    private String columnMehtod;
    public ColumnData() {
    }
    public ColumnData(String columnName) {
        this.columnName = columnName;
        this.columnMehtod = "get" + (columnName.subSequence(0, 1) + "").toUpperCase() + columnName.subSequence(1, columnName.length()) + "()";
    }
    public String getColumnName() {
        return columnName;
    }
    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }
    public String getColumnMehtod() {
        return columnMehtod;
    }
    public void setColumnMehtod(String columnMehtod) {
        this.columnMehtod = columnMehtod;
    }
}
utils/src/main/java/org/yeshi/utils/generater/entity/ExceptionData.java
New file
@@ -0,0 +1,62 @@
package org.yeshi.utils.generater.entity;
public class ExceptionData extends BaseData {
    private String baseClass;
    private String baseClassName;
    private String entityClassName;
    public static class Builder {
        private Class baseClass;
        private String packageName;
        private Class entityClass;
        public Builder setBaseClass(Class baseClass) {
            this.baseClass = baseClass;
            return this;
        }
        public Builder setPackageName(String packageName) {
            this.packageName = packageName;
            return this;
        }
        public Builder setEntityClass(Class entityClass) {
            this.entityClass = entityClass;
            return this;
        }
        public ExceptionData build() {
            ExceptionData data = new ExceptionData();
            data.setBaseClass(baseClass.getName());
            data.setBaseClassName(baseClass.getSimpleName());
            data.setEntityClass(entityClass.getName());
            data.setEntityClassName(entityClass.getSimpleName());
            data.setPackageName(packageName);
            return data;
        }
    }
    public String getBaseClass() {
        return baseClass;
    }
    public void setBaseClass(String baseClass) {
        this.baseClass = baseClass;
    }
    public String getBaseClassName() {
        return baseClassName;
    }
    public void setBaseClassName(String baseClassName) {
        this.baseClassName = baseClassName;
    }
    public String getEntityClassName() {
        return entityClassName;
    }
    public void setEntityClassName(String entityClassName) {
        this.entityClassName = entityClassName;
    }
}
utils/src/main/java/org/yeshi/utils/generater/entity/MongoDBDaoData.java
New file
@@ -0,0 +1,172 @@
package org.yeshi.utils.generater.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class MongoDBDaoData extends BaseData {
    private String baseDaoClass;
    private String daoName;
    private String baseDaoClassName;
    private String entityClassName;
    private ColumnData identityColumn;
    private List<ColumnData> columnDataList;
    public static class Builder {
        private Class baseDaoClass;
        private Class entityClass;
        private String daoPackageName;
        private String daoName;
        public Builder setBaseDaoClass(Class clazz) {
            this.baseDaoClass = clazz;
            return this;
        }
        public Builder setEntityClass(Class clazz) {
            this.entityClass = clazz;
            return this;
        }
        public Builder setDaoPackageName(String daoPackageName) {
            this.daoPackageName = daoPackageName;
            return this;
        }
        public Builder setDaoName(String daoName) {
            this.daoName = daoName;
            return this;
        }
        public MongoDBDaoData create() {
            if (daoName == null) {
                daoName = entityClass.getSimpleName() + "Dao";
            }
            Field[] fields = entityClass.getDeclaredFields();
            String identityColumnName = null;
            List<String> columNamelist = new ArrayList<>();
            for (Field fd : fields) {
                //private/public 非final,static属性才会参与解析
                if (fd.getModifiers() != 1 && fd.getModifiers() != 2) {
                    continue;
                }
                String columName = fd.getName();
                Annotation[] as = fd.getAnnotations();
                if (columName != null) {
                    for (Annotation a : as) {
                        //主键
                        if (a instanceof Id) {
                            identityColumnName = new String(columName);
                            columName = null;
                            break;
                        }
                    }
                }
                for (Annotation a : as) {
                    //不参与解析
                    if (a instanceof Transient || a instanceof java.beans.Transient) {
                        columName = null;
                        break;
                    }
                }
                if (columName != null) {
                    columNamelist.add(columName);
                }
            }
            List<ColumnData> columnDataList = new ArrayList<>();
            for (String columnName : columNamelist) {
                //更新时间不参与更新
                if (!"updateTime".equalsIgnoreCase(columnName)) {
                    columnDataList.add(new ColumnData(columnName));
                }
            }
            MongoDBDaoData data = new MongoDBDaoData();
            data.setBaseDaoClass(baseDaoClass.getName());
            data.setBaseDaoClassName(baseDaoClass.getSimpleName());
            data.setColumnDataList(columnDataList);
            data.setDaoName(daoName);
            data.setEntityClass(entityClass.getName());
            data.setEntityClassName(entityClass.getSimpleName());
            data.setIdentityColumn(new ColumnData(identityColumnName));
            data.setPackageName(daoPackageName);
            return data;
        }
    }
    public String getBaseDaoClass() {
        return baseDaoClass;
    }
    public void setBaseDaoClass(String baseDaoClass) {
        this.baseDaoClass = baseDaoClass;
    }
    public String getDaoName() {
        return daoName;
    }
    public void setDaoName(String daoName) {
        this.daoName = daoName;
    }
    public String getBaseDaoClassName() {
        return baseDaoClassName;
    }
    public void setBaseDaoClassName(String baseDaoClassName) {
        this.baseDaoClassName = baseDaoClassName;
    }
    public String getEntityClassName() {
        return entityClassName;
    }
    public void setEntityClassName(String entityClassName) {
        this.entityClassName = entityClassName;
    }
    public ColumnData getIdentityColumn() {
        return identityColumn;
    }
    public void setIdentityColumn(ColumnData identityColumn) {
        this.identityColumn = identityColumn;
    }
    public List<ColumnData> getColumnDataList() {
        return columnDataList;
    }
    public void setColumnDataList(List<ColumnData> columnDataList) {
        this.columnDataList = columnDataList;
    }
}
utils/src/main/java/org/yeshi/utils/generater/entity/ServiceData.java
New file
@@ -0,0 +1,94 @@
package org.yeshi.utils.generater.entity;
public class ServiceData extends BaseData {
    private String serviceClassName;
    private String daoClassName;
    private String daoClass;
    private String daoClassCaseName;
    private String serviceClass;
    public static class Builder {
        private Class entityClass;
        private String packageName;
        private Class daoClass;
        private Class serviceClass;
        public Builder setServiceClass(Class serviceClass) {
            this.serviceClass = serviceClass;
            return this;
        }
        public Builder setEntityClass(Class entityClass) {
            this.entityClass = entityClass;
            return this;
        }
        public Builder setPackageName(String packageName) {
            this.packageName = packageName;
            return this;
        }
        public Builder setDaoClass(Class daoClass) {
            this.daoClass = daoClass;
            return this;
        }
        public ServiceData build() {
            ServiceData serviceData = new ServiceData();
            if (daoClass != null) {
                serviceData.setDaoClassCaseName((daoClass.getSimpleName().subSequence(0, 1) + "").toLowerCase() + daoClass.getSimpleName().subSequence(1, daoClass.getSimpleName().length()));
                serviceData.setDaoClassName(daoClass.getSimpleName());
                serviceData.setDaoClass(daoClass.getName());
            }
            if (serviceClass != null) {
                serviceData.setServiceClass(serviceClass.getName());
            }
            serviceData.setServiceClassName(entityClass.getSimpleName() + "Service");
            serviceData.setEntityClass(entityClass.getName());
            serviceData.setPackageName(packageName);
            return serviceData;
        }
    }
    public String getServiceClassName() {
        return serviceClassName;
    }
    public void setServiceClassName(String serviceClassName) {
        this.serviceClassName = serviceClassName;
    }
    public String getDaoClassName() {
        return daoClassName;
    }
    public void setDaoClassName(String daoClassName) {
        this.daoClassName = daoClassName;
    }
    public String getDaoClassCaseName() {
        return daoClassCaseName;
    }
    public void setDaoClassCaseName(String daoClassCaseName) {
        this.daoClassCaseName = daoClassCaseName;
    }
    public String getDaoClass() {
        return daoClass;
    }
    public void setDaoClass(String daoClass) {
        this.daoClass = daoClass;
    }
    public String getServiceClass() {
        return serviceClass;
    }
    public void setServiceClass(String serviceClass) {
        this.serviceClass = serviceClass;
    }
}
utils/src/main/java/org/yeshi/utils/generater/mongo/MongoDaoUtil.java
New file
@@ -0,0 +1,76 @@
package org.yeshi.utils.generater.mongo;
import org.springframework.data.annotation.Transient;
import org.yeshi.utils.entity.wx.WXAPPInfo;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class MongoDaoUtil {
    /**
     * 获取有效的属性
     *
     * @param clz
     * @return
     */
    private static List<Field> getValidField(Class<?> clz) {
        List<Field> list = new ArrayList<>();
        Field[] fields = clz.getDeclaredFields();
        for (Field fd : fields) {
            Annotation[] as = fd.getAnnotations();
            boolean create = true;
            for (Annotation a : as) {
                if (a instanceof Transient || a instanceof java.beans.Transient) {
                    create = false;
                    break;
                }
            }
            if (create) {
                list.add(fd);
            }
        }
        return list;
    }
    public static String createUpdateSelective(Class<?> clz) {
        List<Field> fields = getValidField(clz);
        StringBuilder builder = new StringBuilder();
        builder.append(String.format("public void updateSelective(%s bean) {\r\n", clz.getSimpleName()));
        builder.append("    Query query = new Query();\r\n");
        builder.append("    query.addCriteria(Criteria.where(\"id\").is(bean.getId()));\r\n");
        builder.append("    Update update = new Update();\r\n");
        for (Field f : fields) {
            if ("id".equalsIgnoreCase(f.getName()) || "createTime".equalsIgnoreCase(f.getName()))
                continue;
            if (f.getModifiers() == 25) {//public final static修饰
                continue;
            }
            String getMethod = String.format("bean.get%s()", f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1));
            if (f.getName().equalsIgnoreCase("updateTime")) {
                builder.append(String.format("    update.set(\"%s\", %s);\r\n", f.getName(), "new Date()"));
            } else {
                builder.append(String.format("    if (%s != null) {\r\n", getMethod));
                builder.append(String.format("        update.set(\"%s\", %s);\r\n", f.getName(), f.getName().equalsIgnoreCase("updateTime") ? "new Date()" : getMethod));
                builder.append("    }\r\n");
            }
        }
        builder.append("    update(query, update);\r\n");
        builder.append("}");
        return builder.toString();
    }
    public static void main(String[] args) {
        MongoDaoUtil.createUpdateSelective(WXAPPInfo.class);
    }
}
utils/src/main/java/org/yeshi/utils/mq/JobThreadExecutorServiceImpl.java
New file
@@ -0,0 +1,29 @@
package org.yeshi.utils.mq;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
public class JobThreadExecutorServiceImpl {
    private ScheduledExecutorService scheduledExecutorService;
    public JobThreadExecutorServiceImpl() {
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r);
                thread.setDaemon(true);
                return thread;
            }
        });
    }
    public void run(Runnable runnable) {
        scheduledExecutorService.scheduleAtFixedRate(runnable, 1000 * 1, 1000, TimeUnit.MILLISECONDS);
    }
}
utils/src/main/resources/exception.template
New file
@@ -0,0 +1,13 @@
package ${packageName};
import ${baseClass};
public class ${entityClassName}Exception extends ${baseClassName}{
 public ${entityClassName}Exception(int code, String msg) {
        super(code, msg);
 }
}
utils/src/main/resources/mongoDBDao.template
New file
@@ -0,0 +1,29 @@
package ${packageName};
import ${entityClass};
import ${baseDaoClass};
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import java.util.Date;
@Repository
public class ${daoName} extends ${baseDaoClassName}<${entityClassName}>{
  public void updateSelective(${entityClassName} bean) {
        Query query = new Query();
        Update update=new Update();
        query.addCriteria(Criteria.where("${identityColumn.columnName}").is(bean.${identityColumn.columnMehtod}));
        <#if columnDataList??>
            <#list columnDataList as value>
        if(bean.${value.columnMehtod} != null) {
            update.set("${value.columnName}", bean.${value.columnMehtod});
        }
            </#list>
        </#if>
        update.set("updateTime", new Date());
        update(query, update);
  }
}
utils/src/main/resources/service.template
New file
@@ -0,0 +1,7 @@
package ${packageName};
import ${entityClass};
public interface ${serviceClassName} {
}
utils/src/main/resources/serviceImpl.template
New file
@@ -0,0 +1,16 @@
package ${packageName};
import ${entityClass};
import ${daoClass};
import ${serviceClass};
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
public class ${serviceClassName}Impl implements ${serviceClassName}{
  @Resource
  private ${daoClassName} ${daoClassCaseName};
}
utils/src/test/java/com/yeshi/utils/MongoTest.java
New file
@@ -0,0 +1,8 @@
package com.yeshi.utils;
public class MongoTest {
    public static void main(String[] args) {
    }
}
utils/utils.iml
@@ -18,6 +18,7 @@
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
    <orderEntry type="sourceFolder" forTests="false" />
@@ -30,6 +31,15 @@
    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" />
    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.2" level="project" />
    <orderEntry type="library" name="Maven: ch.ethz.ganymed:ganymed-ssh2:build210" level="project" />
    <orderEntry type="library" name="Maven: com.alipay.sdk:alipay-easysdk:2.1.0" level="project" />
    <orderEntry type="library" name="Maven: com.alipay.sdk:easysdk-kernel:1.0.4" level="project" />
    <orderEntry type="library" name="Maven: com.aliyun:tea:1.0.7" level="project" />
    <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.4" level="project" />
    <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.23" level="project" />
    <orderEntry type="library" name="Maven: com.qcloud:cmq-http-client:1.0.7" level="project" />
    <orderEntry type="library" name="Maven: org.slf4j:slf4j-log4j12:1.7.26" level="project" />
    <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.7.0" level="project" />
    <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.12.0" level="project" />
    <orderEntry type="library" name="Maven: net.sf.ehcache:ehcache-core:2.6.11" level="project" />
    <orderEntry type="library" name="Maven: net.sf.ehcache:ehcache-web:2.0.4" level="project" />
    <orderEntry type="library" name="Maven: org.springframework:spring-context:4.3.0.RELEASE" level="project" />
@@ -48,7 +58,6 @@
    <orderEntry type="library" name="Maven: aspectj:aspectjrt:1.5.3" level="project" />
    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.5.4" level="project" />
    <orderEntry type="library" name="Maven: cglib:cglib-nodep:3.2.4" level="project" />
    <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.23" level="project" />
    <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:servlet-api:2.5" level="project" />
    <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet.jsp:jsp-api:2.2" level="project" />
    <orderEntry type="library" name="Maven: cglib:cglib:2.2.2" level="project" />
@@ -93,7 +102,6 @@
    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.0" level="project" />
    <orderEntry type="library" name="Maven: com.github.jai-imageio:jai-imageio-core:1.3.0" level="project" />
    <orderEntry type="library" name="Maven: com.qcloud:cos_api:5.2.4" level="project" />
    <orderEntry type="library" name="Maven: org.slf4j:slf4j-log4j12:1.7.21" level="project" />
    <orderEntry type="library" name="Maven: joda-time:joda-time:2.9.6" level="project" />
    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.5" level="project" />
    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0" level="project" />