admin
2021-10-13 052e1d5c47c4e536fde79074d53b0481c7d4f9b6
自动化代码生成优化
1个文件已删除
14个文件已修改
8个文件已添加
906 ■■■■■ 已修改文件
src/main/java/org/yeshi/utils/FileUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/StringUtil.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/GeneraterManager.java 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/GeneraterUtil.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/annotation/admin/DaoQueryCondition.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/params/AdminGeneraterParams.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/params/DaoGeneraterParams.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/params/ServiceGeneraterParams.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/service/QueryVO.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/mongo/MongodbBaseDao.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/mybatis/BaseMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/dao/mongoDBDao.template 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/dao/mybatisDBDao.template 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/dao/mybatisDBXML.ftl 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/generater/service/queryVO.ftl 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/generater/GeneratorTest.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/generater/TestEntity.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/generater/TestEntity2.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/yeshi/utils/FileUtil.java
@@ -91,7 +91,7 @@
    /**
     * 将输入流存为本地文件
     *
     * @param inputStream
     * @param b
     * @param path
     * @return
     * @throws IOException
src/main/java/org/yeshi/utils/StringUtil.java
@@ -328,10 +328,17 @@
    //首字母小写
    public static String firstCharToLower(String st) {
        if (st == null || st.length() < 2)
        if (st == null || st.length() < 1)
            return st;
        return st.substring(0, 1).toLowerCase() + st.substring(1);
    }
    //首字母大写
    public static String firstCharToUpper(String st) {
        if (st == null || st.length() < 1)
            return st;
        return st.substring(0, 1).toUpperCase() + st.substring(1);
    }
}
src/main/java/org/yeshi/utils/generater/GeneraterManager.java
New file
@@ -0,0 +1,323 @@
package org.yeshi.utils.generater;
import com.meizu.push.sdk.server.IFlymePush;
import org.springframework.data.mongodb.core.mapping.Document;
import org.yeshi.utils.FileUtil;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.generater.entity.ClassInfo;
import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
import org.yeshi.utils.generater.mybatis.Table;
import org.yeshi.utils.generater.params.AdminGeneraterParams;
import org.yeshi.utils.generater.params.DaoGeneraterParams;
import org.yeshi.utils.generater.params.ServiceGeneraterParams;
import org.yeshi.utils.generater.vo.ExceptionVO;
import org.yeshi.utils.generater.vo.admin.controller.AdminControllerInfoVO;
import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
import org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO;
import org.yeshi.utils.generater.vo.service.QueryVO;
import org.yeshi.utils.generater.vo.service.ServiceImplInfoVO;
import org.yeshi.utils.generater.vo.service.ServiceInfoVO;
import org.yeshi.utils.mongo.MongodbBaseDao;
import org.yeshi.utils.mybatis.BaseMapper;
import java.io.File;
import java.lang.annotation.Annotation;
/**
 * @author Administrator
 * @title: GeneraterManager
 * @description: 自动化代码生成管理器
 * @date 2021/10/13 14:48
 */
/**
 * Title
 *
 * @Description //TODO
 * @Author hxh
 * @Date 18:11 2021/10/13
 **/
public class GeneraterManager {
    private static GeneraterManager instance;
    private String classRootDir;
    private Class entity;
    public static GeneraterManager getInstance() {
        if (instance == null)
            instance = new GeneraterManager();
        return instance;
    }
    //类的根目录
    public void init(String classRootDir, Class entity) {
        this.classRootDir = classRootDir;
        this.entity = entity;
    }
    //获取文件夹的路径
    private String getDirPath(String packageName) {
        File f = new File(classRootDir);
        if (!f.exists()) {
            f.mkdirs();
        }
        return new File(f.getAbsolutePath(), packageName.replace(".", "/")).getAbsolutePath();
    }
    public void createException(String packageName, Class base) {
        String path = getDirPath(packageName);
        try {
            ExceptionVO vo = new ExceptionVO.Builder().setEntity(entity).setPackageName(packageName).setBase(new ClassInfo(base.getSimpleName(), base.getName())).build();
            String result = GeneraterUtil.createException(vo);
            //保存
            FileUtil.saveAsFileByte(result.getBytes("UTF-8"), path);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * @return org.yeshi.utils.generater.vo.dao.MongoDBDaoVO
     * @author hxh
     * @description 自动生成Dao
     * @date 18:24 2021/10/13
     * @param: packageName
     **/
    public MongoDBDaoVO createDao(String packageName) throws Exception {
        String daoName = entity.getSimpleName() + "Dao";
        String path = getDirPath(packageName);
        MongoDBDaoVO vo = new MongoDBDaoVO.Builder()
                .setBaseDao(new ClassInfo(MongodbBaseDao.class.getSimpleName(), MongodbBaseDao.class.getName()))
                .setDao(new ClassInfo(daoName, packageName + "." + daoName))
                .setEntity(entity).build();
        String result = GeneraterUtil.createMongoDBDao(vo);
        //保存
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(path, daoName).getAbsolutePath());
        return vo;
    }
    /**
     * @return org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO
     * @author hxh
     * @description 自动生成Mapper
     * @date 18:24 2021/10/13
     * @param: packageName
     * @param: mapperDir
     **/
    public MyBatisDBDaoVO createMapper(String packageName, String mapperDir) throws Exception {
        String mapperName = entity.getSimpleName() + "Mapper";
        String path = getDirPath(packageName);
        MyBatisDBDaoVO vo = new MyBatisDBDaoVO.Builder()
                .setBaseMapper(new ClassInfo(BaseMapper.class.getSimpleName(), BaseMapper.class.getName()))
                .setMapper(new ClassInfo(mapperName, packageName + "." + mapperName))
                .setEntity(entity)
                .build();
        String result = GeneraterUtil.createMybatisDBMapper(vo);
        //保存
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(path, mapperName + ".java").getAbsolutePath());
        if (!new File(mapperDir).exists())
            new File(mapperDir).mkdirs();
        result = GeneraterUtil.createMybatisDBMapperXML(vo);
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(mapperDir, mapperName + ".xml").getAbsolutePath());
        return vo;
    }
    /**
     * @return org.yeshi.utils.generater.vo.service.QueryVO
     * @author hxh
     * @description /创建查询Query
     * @date 18:24 2021/10/13
     * @param: packageName
     **/
    public QueryVO createQuery(String packageName) throws Exception {
        //创建Query
        String path = getDirPath(packageName);
        QueryVO queryVO = new QueryVO.Builder().setEntity(entity).setPackageName(packageName).build();
        String result = GeneraterUtil.createQuery(queryVO);
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(path, queryVO.getClassName() + ".java").getAbsolutePath());
        return queryVO;
    }
    /**
     * @return org.yeshi.utils.generater.vo.service.ServiceInfoVO
     * @author hxh
     * @description 自动生成服务
     * @date 18:23 2021/10/13
     * @param: interPackageName
     * @param: implPackageName
     * @param: query
     * @param: dao
     **/
    public ServiceInfoVO createService(String interPackageName, String implPackageName, ClassInfo query, ClassInfo dao) throws Exception {
        //创建service接口
        String serviceName = entity.getSimpleName() + "Service";
        String path = getDirPath(interPackageName);
        ServiceInfoVO vo = new ServiceInfoVO.Builder()
                .setPackageName(interPackageName)
                .setEntity(entity)
                .setQuery(query)
                .setService(new ClassInfo(serviceName, interPackageName + "." + serviceName))
                .build();
        String result = GeneraterUtil.createService(vo);
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(path, serviceName + ".java").getAbsolutePath());
        //创建service实现
        String serviceImplName = entity.getSimpleName() + "ServiceImpl";
        path = getDirPath(implPackageName);
        ServiceImplInfoVO implVO = new ServiceImplInfoVO.Builder()
                .setDao(dao)
                .setPackageName(implPackageName)
                .setEntity(entity)
                .setQuery(query)
                .setService(new ClassInfo(serviceName, interPackageName + "." + serviceName))
                .setDaoQuery(new ClassInfo("DaoQuery", dao.getClazz() + ".DaoQuery"))
                .build();
        result = GeneraterUtil.createServiceImpl(implVO);
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(path, serviceImplName + ".java").getAbsolutePath());
        return vo;
    }
    /**
     * @return void
     * @author hxh
     * @description 自动生成管理模块
     * @date 18:23 2021/10/13
     * @param: controllerPackage
     * @param: htmlDir
     * @param: query
     * @param: service
     **/
    public void createAdmin(String controllerPackage, String htmlDir, ClassInfo query, ClassInfo service) throws Exception {
        String path = getDirPath(controllerPackage);
        String controllerName = entity.getSimpleName() + "AdminController";
        AdminGeneraterInfo generaterInfo = new AdminGeneraterInfo.Builder().setEntityClass(entity).build();
        String htmlNamePrefix = getHtmlNameFromEntityName(entity.getSimpleName());
        AdminControllerInfoVO vo = new AdminControllerInfoVO.Builder().setAdminInfo(generaterInfo).setPackageName(controllerName).setQueryVO(query).setService(service).build();
        //生成controller
        String result = GeneraterUtil.createAdminController(vo);
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(path, controllerName + ".java").getAbsolutePath());
        result = GeneraterUtil.createAdminPageForList(generaterInfo);
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(htmlDir, htmlNamePrefix + "_list.html").getAbsolutePath());
        if (generaterInfo.getAddFormRows() != null && generaterInfo.getAddFormRows().size() > 0) {
            result = GeneraterUtil.createAdminPageForAdd(generaterInfo);
            FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(htmlDir, htmlNamePrefix + "_add.html").getAbsolutePath());
        }
        if (generaterInfo.getUpdateFormRows() != null && generaterInfo.getUpdateFormRows().size() > 0) {
            result = GeneraterUtil.createAdminPageForUpdate(generaterInfo);
            FileUtil.saveAsFileByte(result.getBytes("UTF-8"), new File(htmlDir, htmlNamePrefix + "_update.html").getAbsolutePath());
        }
    }
    /**
     * @return void
     * @author hxh
     * @description 创建整个功能模块
     * @date 18:19 2021/10/13
     * @param: daoParams
     * @param: serviceParams
     * @param: adminParams
     **/
    public void createWholeFunction(DaoGeneraterParams daoParams, ServiceGeneraterParams serviceParams, AdminGeneraterParams adminParams) throws Exception {
        Annotation[] as = entity.getAnnotations();
        int type = -1;
        for (Annotation a : as) {
            if (a instanceof Table) {
                type = 1;
                break;
            } else if (a instanceof Document) {
                type = 2;
                break;
            }
        }
        if (type == -1) {
            throw new Exception("实体未配置mybatis或者mongodb");
        }
        if (daoParams != null) {
            if (type == 1 && StringUtil.isNullOrEmpty(daoParams.getMapperXMLDir())) {
                throw new Exception("mybatis xml文件路径为空");
            }
        }
        //创建dao
        ClassInfo daoClass = null;
        if (daoParams != null) {
            if (type == 1) {
                MyBatisDBDaoVO vo = createMapper(daoParams.getDaoPackage(), daoParams.getMapperXMLDir());
                daoClass = vo.getMapper();
            } else {
                MongoDBDaoVO vo = createDao(daoParams.getDaoPackage());
                daoClass = new ClassInfo(vo.getDaoName(), vo.getPackageName() + "." + vo.getDaoName());
            }
        }
        ClassInfo queryClass = null;
        ClassInfo serviceClass = null;
        if (serviceParams != null) {
            //创建Query
            QueryVO queryVO = createQuery(serviceParams.getQueryPackage());
            queryClass = new ClassInfo(queryVO.getClassName(), queryVO.getPackageName() + "." + queryVO.getClassName());
            //创建service
            ServiceInfoVO serviceInfoVO = createService(serviceParams.getServiceInterPackage(), serviceParams.getServiceImplPackage(), queryClass, daoClass);
            serviceClass = serviceInfoVO.getService();
        }
        //创建Admin模块
        createAdmin(adminParams.getControllerPackage(), adminParams.getHtmlDir(), queryClass, serviceClass);
    }
    /**
     * @return java.lang.String
     * @author hxh
     * @description 通过entity的名称获取html文件的前缀名称
     * @date 18:25 2021/10/13
     * @param: entityName
     **/
    private static String getHtmlNameFromEntityName(String entityName) {
        StringBuffer sb = new StringBuffer();
        StringBuffer buffer = null;
        for (int i = 0; i < entityName.length(); i++) {
            if (entityName.charAt(i) >= 65 && entityName.charAt(i) <= 90) {
                //大写字母
                if (buffer == null)
                    buffer = new StringBuffer();
                buffer.append(entityName.charAt(i));
            } else {
                if (buffer != null) {
                    sb.append("_" + buffer.toString().toLowerCase());
                    buffer = null;
                }
                sb.append(entityName.charAt(i));
            }
        }
        if (buffer != null) {
            sb.append("_" + buffer.toString().toLowerCase());
        }
        if (sb.charAt(0) == '_')
            sb = sb.replace(0, 1, "");
        return sb.toString();
    }
    public static void main(String[] args) {
        System.out.print(getHtmlNameFromEntityName("TTestEEntity"));
    }
}
src/main/java/org/yeshi/utils/generater/GeneraterUtil.java
New file
@@ -0,0 +1,119 @@
package org.yeshi.utils.generater;
import org.yeshi.utils.FreemarkerUtils;
import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
import org.yeshi.utils.generater.vo.ExceptionVO;
import org.yeshi.utils.generater.vo.admin.controller.AdminControllerInfoVO;
import org.yeshi.utils.generater.vo.admin.page.FormAddInfoVO;
import org.yeshi.utils.generater.vo.admin.page.FormUpdateInfoVO;
import org.yeshi.utils.generater.vo.admin.page.ListInfoVO;
import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
import org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO;
import org.yeshi.utils.generater.vo.service.QueryVO;
import org.yeshi.utils.generater.vo.service.ServiceImplInfoVO;
import org.yeshi.utils.generater.vo.service.ServiceInfoVO;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class GeneraterUtil {
    public static String createException(ExceptionVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\exception.template"));
        System.out.println(result);
        return result;
    }
    public static String createMongoDBDao(MongoDBDaoVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\dao\\mongoDBDao.template"));
        System.out.println(result);
        return result;
    }
    public static String createMybatisDBMapper(MyBatisDBDaoVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\dao\\mybatisDBDao.template"));
        System.out.println(result);
        return result;
    }
    public static String createMybatisDBMapperXML(MyBatisDBDaoVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\dao\\mybatisDBXML.ftl"));
        System.out.println(result);
        return result;
    }
    public static String createQuery(QueryVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\service\\queryVO.ftl"));
        System.out.println(result);
        return result;
    }
    public static String createService(ServiceInfoVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\service\\service.template"));
        System.out.println(result);
        return result;
    }
    public static String createServiceImpl(ServiceImplInfoVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\service\\serviceImpl.template"));
        System.out.println(result);
        return result;
    }
    public static String createAdminController(AdminControllerInfoVO vo) throws IOException {
        String result = FreemarkerUtils.generateInputStream(vo, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater\\admin\\adminController.template"));
        System.out.println(result);
        return result;
    }
    private static Map<String, InputStream> getAdminIncludePageMap() {
        //将所有的控件模板加载进去
        String[] template = new String[]{
                "admin/form/checkBox.ftl",
                "admin/form/img.ftl",
                "admin/form/password.ftl",
                "admin/form/radioGroup.ftl",
                "admin/form/select.ftl",
                "admin/form/switch.ftl",
                "admin/form/text.ftl",
                "admin/form/textArea.ftl",
                "admin/add.ftl",
                "admin/update.ftl",
                "admin/list.ftl"
        };
        Map<String, InputStream> map = new HashMap<>();
        for (String st : template) {
            map.put(st, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/" + st));
        }
        return map;
    }
    public static String createAdminPageForUpdate(AdminGeneraterInfo vo) throws IOException {
        Map<String, InputStream> map = getAdminIncludePageMap();
        String result = FreemarkerUtils.generateInputStream(new FormUpdateInfoVO.Builder().setAdminInfo(vo).build(), "admin/update.ftl", map);
        System.out.println(result);
        return result;
    }
    public static String createAdminPageForAdd(AdminGeneraterInfo vo) throws IOException {
        Map<String, InputStream> map = getAdminIncludePageMap();
        String result = FreemarkerUtils.generateInputStream(new FormAddInfoVO.Builder().setAdminInfo(vo).build(), "admin/add.ftl", map);
        System.out.println(result);
        return result;
    }
    public static String createAdminPageForList(AdminGeneraterInfo vo) throws IOException {
        Map<String, InputStream> map = getAdminIncludePageMap();
        String result = FreemarkerUtils.generateInputStream(new ListInfoVO.Builder().setAdminInfo(vo).build(), "admin/list.ftl", map);
        System.out.println(result);
        return result;
    }
}
src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
File was deleted
src/main/java/org/yeshi/utils/generater/annotation/admin/DaoQueryCondition.java
@@ -20,7 +20,7 @@
    //显示类型
    enum QueryType {
        start, end, contains, equal
        start, end, contains, equal, gt, gte, lt, lte
    }
src/main/java/org/yeshi/utils/generater/entity/MybatisColumnData.java
@@ -16,6 +16,11 @@
        this.jdbcType = jdbcType;
    }
    public MybatisColumnData( String property) {
        this.property = property;
    }
    public String getColumn() {
        return column;
    }
src/main/java/org/yeshi/utils/generater/params/AdminGeneraterParams.java
New file
@@ -0,0 +1,33 @@
package org.yeshi.utils.generater.params;
/**
 * @author Administrator
 * @title: DaoParams
 * @description: 管理功能生成参数
 * @date 2021/10/13 17:41
 */
public class AdminGeneraterParams {
    private String controllerPackage;
    private String htmlDir;
    public AdminGeneraterParams(String controllerPackage, String htmlDir) {
        this.controllerPackage = controllerPackage;
        this.htmlDir = htmlDir;
    }
    public String getControllerPackage() {
        return controllerPackage;
    }
    public void setControllerPackage(String controllerPackage) {
        this.controllerPackage = controllerPackage;
    }
    public String getHtmlDir() {
        return htmlDir;
    }
    public void setHtmlDir(String htmlDir) {
        this.htmlDir = htmlDir;
    }
}
src/main/java/org/yeshi/utils/generater/params/DaoGeneraterParams.java
New file
@@ -0,0 +1,33 @@
package org.yeshi.utils.generater.params;
/**
 * @author Administrator
 * @title: DaoParams
 * @description: 生成Dao的参数配置
 * @date 2021/10/13 17:41
 */
public class DaoGeneraterParams {
    private String daoPackage;
    private String mapperXMLDir;
    public DaoGeneraterParams(String daoPackage, String mapperXMLDir) {
        this.daoPackage = daoPackage;
        this.mapperXMLDir = mapperXMLDir;
    }
    public String getDaoPackage() {
        return daoPackage;
    }
    public void setDaoPackage(String daoPackage) {
        this.daoPackage = daoPackage;
    }
    public String getMapperXMLDir() {
        return mapperXMLDir;
    }
    public void setMapperXMLDir(String mapperXMLDir) {
        this.mapperXMLDir = mapperXMLDir;
    }
}
src/main/java/org/yeshi/utils/generater/params/ServiceGeneraterParams.java
New file
@@ -0,0 +1,44 @@
package org.yeshi.utils.generater.params;
/**
 * @author Administrator
 * @title: DaoParams
 * @description: service自动生成参数
 * @date 2021/10/13 17:41
 */
public class ServiceGeneraterParams {
    private String queryPackage;
    private String serviceInterPackage;
    private String serviceImplPackage;
    public ServiceGeneraterParams(String queryPackage, String serviceInterPackage, String serviceImplPackage) {
        this.queryPackage = queryPackage;
        this.serviceInterPackage = serviceInterPackage;
        this.serviceImplPackage = serviceImplPackage;
    }
    public String getQueryPackage() {
        return queryPackage;
    }
    public void setQueryPackage(String queryPackage) {
        this.queryPackage = queryPackage;
    }
    public String getServiceInterPackage() {
        return serviceInterPackage;
    }
    public void setServiceInterPackage(String serviceInterPackage) {
        this.serviceInterPackage = serviceInterPackage;
    }
    public String getServiceImplPackage() {
        return serviceImplPackage;
    }
    public void setServiceImplPackage(String serviceImplPackage) {
        this.serviceImplPackage = serviceImplPackage;
    }
}
src/main/java/org/yeshi/utils/generater/vo/dao/MongoDBDaoVO.java
@@ -2,11 +2,9 @@
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
import org.yeshi.utils.generater.entity.BaseData;
import org.yeshi.utils.generater.entity.ClassInfo;
import org.yeshi.utils.generater.entity.ColumnData;
import org.yeshi.utils.generater.entity.DaoQueryColumnData;
import org.yeshi.utils.generater.entity.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
@@ -99,7 +97,13 @@
                //获取查询条件
                for (Annotation a : as) {
                    if (a instanceof DaoQueryCondition) {
                        daoQueryColumnList.add(new DaoQueryColumnData(columName, columnDataType, ((DaoQueryCondition) a).queryType()));
                        MybatisColumnData columnData=new MybatisColumnData(columName);
                        if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
                            daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columName),columnData, fd.getType().getSimpleName(),  DaoQueryCondition.QueryType.lt));
                            daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columName),columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
                        } else {
                            daoQueryColumnList.add(new DaoQueryColumnData(columName,columnData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType()));
                        }
                        break;
                    }
                }
src/main/java/org/yeshi/utils/generater/vo/dao/MyBatisDBDaoVO.java
@@ -2,6 +2,7 @@
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
import org.yeshi.utils.generater.entity.*;
import org.yeshi.utils.generater.mybatis.Column;
@@ -119,6 +120,7 @@
                    //主键
                    if (a instanceof Id) {
                        identity = columData;
                        identity.setType(fd.getType().getName());
                        valid = false;
                        break;
                    }
@@ -134,7 +136,12 @@
                //获取查询条件
                for (Annotation a : as) {
                    if (a instanceof DaoQueryCondition) {
                        if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) {
                            daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt));
                            daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columData.getProperty()), columData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte));
                        } else {
                        daoQueryColumnList.add(new DaoQueryColumnData(columData.getProperty(), columData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType()));
                        }
                        break;
                    }
                }
src/main/java/org/yeshi/utils/generater/vo/service/QueryVO.java
New file
@@ -0,0 +1,57 @@
package org.yeshi.utils.generater.vo.service;
import org.yeshi.utils.generater.entity.BaseData;
import org.yeshi.utils.generater.util.EntityUtil;
import java.lang.reflect.Field;
public class QueryVO extends BaseData {
    private String className;
    public static class Builder {
        private Class entity;
        private String packageName;
        public Builder setEntity(Class entity) {
            this.entity = entity;
            return this;
        }
        public Builder setPackageName(String packageName) {
            this.packageName = packageName;
            return this;
        }
        private void validParams() throws Exception {
            if (entity == null) {
                throw new Exception("entity不能为空");
            }
            if (packageName == null) {
                throw new Exception("packageName不能为空");
            }
        }
        public QueryVO build() throws Exception {
            validParams();
            Field identifyId = EntityUtil.getIdentifyId(entity);
            if (identifyId == null) {
                throw new Exception("尚未找到主键属性");
            }
            QueryVO vo = new QueryVO();
            vo.setPackageName(packageName);
            vo.setClassName(entity.getSimpleName() + "Query");
            return vo;
        }
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
}
src/main/java/org/yeshi/utils/generater/vo/service/ServiceInfoVO.java
@@ -11,7 +11,6 @@
public class ServiceInfoVO extends BaseData {
    private ClassInfo service;
    private ClassInfo dao;
    //方法列表
    private List<ServiceMetodInfoVO> metodInfoList;
    private ClassInfo query;
@@ -20,7 +19,6 @@
    public static class Builder {
        private Class entity;
        private String packageName;
        private ClassInfo dao;
        private ClassInfo service;
        private ClassInfo query;
@@ -32,11 +30,6 @@
        public Builder setPackageName(String packageName) {
            this.packageName = packageName;
            return this;
        }
        public Builder setDao(ClassInfo dao) {
            this.dao = dao;
            return this;
        }
@@ -82,9 +75,6 @@
            if (packageName == null) {
                throw new Exception("packageName不能为空");
            }
            if (dao == null) {
                throw new Exception("dao不能为空");
            }
            if (service == null) {
                throw new Exception("service不能为空");
            }
@@ -102,7 +92,6 @@
                throw new Exception("尚未找到主键属性");
            }
            ServiceInfoVO serviceData = new ServiceInfoVO();
            serviceData.setDao(dao);
            serviceData.setService(service);
            serviceData.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName()));
            serviceData.setPackageName(packageName);
@@ -166,14 +155,6 @@
    public void setService(ClassInfo service) {
        this.service = service;
    }
    public ClassInfo getDao() {
        return dao;
    }
    public void setDao(ClassInfo dao) {
        this.dao = dao;
    }
    public List<ServiceMetodInfoVO> getMetodInfoList() {
src/main/java/org/yeshi/utils/mongo/MongodbBaseDao.java
New file
@@ -0,0 +1,106 @@
package org.yeshi.utils.mongo;
import org.springframework.data.mongodb.core.MongoTemplate;
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 javax.annotation.Resource;
import java.lang.reflect.ParameterizedType;
import java.util.List;
/**
 * @author Administrator
 * @title: MongodbBaseDao
 * @description: base dao
 * @date 2021/10/13 15:03
 */
public class MongodbBaseDao<T> {
    @Resource
    protected MongoTemplate mongoTemplate;
    /**
     * 插入数据
     *
     * @param bean
     * @return
     */
    public T save(T bean) {
        mongoTemplate.save(bean);
        return bean;
    }
    /**
     * 根据主键更新数据
     *
     * @param query
     * @param update
     */
    public void update(Query query, Update update) {
        mongoTemplate.upsert(query, update, this.getEntityClass());
    }
    /**
     * 查询一个数据
     *
     * @param query
     * @return
     */
    public T findOne(Query query) {
        return (T) mongoTemplate.findOne(query, this.getEntityClass());
    }
    /**
     * 查询多个数据
     *
     * @param query
     * @return
     */
    public List<T> findList(Query query) {
        return mongoTemplate.find(query, this.getEntityClass());
    }
    /**
     * 统计数量
     *
     * @param query
     * @return
     */
    public long count(Query query) {
        return mongoTemplate.count(query, this.getEntityClass());
    }
    /**
     * 主键查询
     *
     * @param id
     * @return
     */
    public T get(Object id) {
        return (T) mongoTemplate.findById(id, this.getEntityClass());
    }
    /**
     * 通过主键删除
     *
     * @param id
     */
    public void delete(Object id) {
        Query query = Query.query(Criteria.where("id").is(id));
        mongoTemplate.remove(query, getEntityClass());
    }
    public void delete(Query query) {
        mongoTemplate.remove(query, getEntityClass());
    }
    @SuppressWarnings("unchecked")
    protected Class<T> getEntityClass() {
        Class<T> tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
                .getActualTypeArguments()[0];
        return tClass;
    }
}
src/main/java/org/yeshi/utils/mybatis/BaseMapper.java
New file
@@ -0,0 +1,23 @@
package org.yeshi.utils.mybatis;
/**
 * @author Administrator
 * @title: BaseMapper
 * @projectName utils
 * @description: 基础Mapper
 * @date 2021/10/1315:02
 */
public interface BaseMapper<T> {
    int deleteByPrimaryKey(Long id);
    int insert(T record);
    int insertSelective(T record);
    T selectByPrimaryKey(Long id);
    int updateByPrimaryKeySelective(T record);
    int updateByPrimaryKey(T record);
}
src/main/resources/generater/dao/mongoDBDao.template
@@ -48,22 +48,21 @@
  private Query getQuery(DaoQuery daoQuery){
            List<Criteria> andList=new ArrayList<>();
             <#list daoQueryColumnDataList as value>
                 <#if (value.type!"") == "Date">
                 if(daoQuery.min${value.columnName?cap_first}!=null){
                      andList.add(Criteria.where("${value.columnName}").gte(daoQuery.min${value.columnName?cap_first}));
                 }
                 if(daoQuery.max${value.columnName?cap_first}!=null){
                      andList.add(Criteria.where("${value.columnName}").lt(daoQuery.max${value.columnName?cap_first}));
                 }
                 <#else>
                 if(daoQuery.${value.columnName}!=null){
                   <#if (value.queryType!"") == "equal">
                      andList.add(Criteria.where("${value.columnName}").is(daoQuery.${value.columnName}));
            andList.add(Criteria.where("${value.columnData.property}").is(daoQuery.${value.columnName}));
            <#elseif (value.queryType!"") == "gt">
            andList.add(Criteria.where("${value.columnData.property}").gt(daoQuery.${value.columnName}));
            <#elseif (value.queryType!"") == "gte">
            andList.add(Criteria.where("${value.columnData.property}").gte(daoQuery.${value.columnName}));
            <#elseif (value.queryType!"") == "lt">
            andList.add(Criteria.where("${value.columnData.property}").lt(daoQuery.${value.columnName}));
            <#elseif (value.queryType!"") == "lte">
            andList.add(Criteria.where("${value.columnData.property}").lte(daoQuery.${value.columnName}));
                   <#else>
                        andList.add(Criteria.where("${value.columnName}").regex(daoQuery.${value.columnName}));
            andList.add(Criteria.where("${value.columnData.property}").regex(daoQuery.${value.columnName}));
                   </#if>
                 }
                 </#if>
            </#list>
            Query query=new Query();
            Criteria[]  ands=new Criteria[andList.size()];
@@ -77,12 +76,7 @@
  public static class DaoQuery{
     <#if daoQueryColumnDataList??>
       <#list daoQueryColumnDataList as value>
        <#if (value.type!"") == "Date">
        public ${value.type} min${value.columnName?cap_first};
        public ${value.type} max${value.columnName?cap_first};
        <#else>
        public ${value.type} ${value.columnName};
         </#if>
       </#list>
     </#if>
        public int start;
src/main/resources/generater/dao/mybatisDBDao.template
@@ -18,12 +18,7 @@
  public static class DaoQuery{
     <#if queryList??>
       <#list queryList as value>
        <#if (value.type!"") == "Date">
        public ${value.type} min${value.columnName?cap_first};
        public ${value.type} max${value.columnName?cap_first};
        <#else>
        public ${value.type} ${value.columnName};
         </#if>
       </#list>
     </#if>
        public long start;
src/main/resources/generater/dao/mybatisDBXML.ftl
@@ -17,32 +17,32 @@
    </sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap"
            parameterType="java.lang.Long">
            parameterType="${identify.type}">
        select
        <include refid="Base_Column_List"/>
        from ${table} where ${identify.column} = <#noparse>#{</#noparse>id, jdbcType=${identify.jdbcType}}
    </select>
    <select id="selectByPrimaryKeyForUpdate" resultMap="BaseResultMap"
            parameterType="java.lang.Long">
            parameterType="${identify.type}">
        select
        <include refid="Base_Column_List"/>
        from ${table} where ${identify.column} = <#noparse>#{</#noparse>id,jdbcType=${identify.jdbcType}} for update
    </select>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <delete id="deleteByPrimaryKey" parameterType="${identify.type}">
        delete from
        ${table} where ${identify.column} = <#noparse>#{</#noparse>id,jdbcType=${identify.jdbcType}}
    </delete>
    <insert id="insert"
            parameterType="${entity.class}"
            parameterType="${entity.clazz}"
            useGeneratedKeys="true" keyProperty="${identify.property}">
        insert into
        ${table}
        <trim prefix="(" suffix=")" suffixOverrides=",">
        <#list columnList as column>
            ${column.column}},
            ${column.column},
        </#list>
        </trim>
@@ -56,7 +56,7 @@
    </insert>
    <insert id="insertSelective"
            parameterType="${entity.class}"
            parameterType="${entity.clazz}"
            useGeneratedKeys="true" keyProperty="${identify.property}">
        insert into ${table}
        <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -74,7 +74,7 @@
        </trim>
    </insert>
    <update id="updateByPrimaryKey"
            parameterType="${entity.class}">
            parameterType="${entity.clazz}">
        update ${table}
        <set>
            <if test="${identify.property} != null">${identify.column} = <#noparse>#{</#noparse>${identify.property},jdbcType=${identify.jdbcType}},</if>
@@ -85,7 +85,7 @@
        where ${identify.column} = <#noparse>#{</#noparse>${identify.property},jdbcType=${identify.jdbcType}}
    </update>
    <update id="updateByPrimaryKeySelective"
            parameterType="${entity.class}">
            parameterType="${entity.clazz}">
        update ${table}
        <set>
              <#list columnList as column>
@@ -110,6 +110,18 @@
             <#if query.queryType=="contains">
                and ${query.columnData.column} = '%<#noparse>#{</#noparse>query.${query.columnName}}%'
             </#if>
              <#if query.queryType=="gt">
                and ${query.columnData.column} > <#noparse>#{</#noparse>query.${query.columnName}}
              </#if>
              <#if query.queryType=="gte">
                and ${query.columnData.column} >= <#noparse>#{</#noparse>query.${query.columnName}}
              </#if>
              <#if query.queryType=="lt">
                and ${query.columnData.column} <![CDATA[<]]> <#noparse>#{</#noparse>query.${query.columnName}}
              </#if>
              <#if query.queryType=="lte">
                and ${query.columnData.column} <![CDATA[<=]]> <#noparse>#{</#noparse>query.${query.columnName}}
              </#if>
        </if>
        </#list>
    </sql>
src/main/resources/generater/service/queryVO.ftl
@@ -1,7 +1,6 @@
package ${packageName};
public class ${className} {
    //搜索关键词
    private String kw;
src/test/java/com/generater/GeneratorTest.java
@@ -3,11 +3,13 @@
import org.springframework.data.annotation.Id;
import org.yeshi.utils.FileUtil;
import org.yeshi.utils.FreemarkerUtils;
import org.yeshi.utils.generater.SpringComponentGenerater;
import org.yeshi.utils.generater.GeneraterManager;
import org.yeshi.utils.generater.GeneraterUtil;
import org.yeshi.utils.generater.entity.ClassInfo;
import org.yeshi.utils.generater.entity.admin.AdminGeneraterInfo;
import org.yeshi.utils.generater.mybatis.Column;
import org.yeshi.utils.generater.mybatis.Table;
import org.yeshi.utils.generater.params.DaoGeneraterParams;
import org.yeshi.utils.generater.vo.ExceptionVO;
import org.yeshi.utils.generater.vo.dao.MongoDBDaoVO;
import org.yeshi.utils.generater.vo.dao.MyBatisDBDaoVO;
@@ -47,7 +49,7 @@
        //
//        boolean match = Pattern.matches("^(https://){1}.*(\\.m3u8)$", "https://n1.szjal.cn/20210805/qnDXhXBa/index.m3u8123");
//        System.out.println(match);
        generateMybatisDao();
        generater();
    }
    private static void generateAdminPage() throws Exception {
@@ -69,7 +71,7 @@
        Map<String, InputStream> map = new HashMap<>();
        for (String st : template) {
            map.put(st, SpringComponentGenerater.class.getClassLoader().getResourceAsStream("generater/" + st));
            map.put(st, GeneraterUtil.class.getClassLoader().getResourceAsStream("generater/" + st));
        }
        String result = FreemarkerUtils.generateInputStream(new FormUpdateInfoVO.Builder().setAdminInfo(info).build(), "admin/update.ftl", map);
        FileUtil.saveAsFileByte(result.getBytes("UTF-8"), "C:\\Users\\Administrator\\Documents\\HBuilderProjects\\LayuiTest\\form.html");
@@ -81,7 +83,7 @@
        ClassInfo dao = new ClassInfo("TestDao", "com.test.dao.TestDao");
        ClassInfo query = new ClassInfo("TestQuery", "com.test.query.TestQuery");
        ClassInfo service = new ClassInfo("TestService", "com.test.service.TestService");
        ServiceInfoVO serviceInfoVO = new ServiceInfoVO.Builder().setDao(dao).setEntity(Entity.class).setPackageName("com.test.service").setQuery(query).setService(service).build();
        ServiceInfoVO serviceInfoVO = new ServiceInfoVO.Builder().setEntity(Entity.class).setPackageName("com.test.service").setQuery(query).setService(service).build();
        String result = FreemarkerUtils.generateInputStream(serviceInfoVO, GeneratorTest.class.getClassLoader().getResourceAsStream("generater\\service\\service.template"));
        System.out.println(result);
    }
@@ -144,6 +146,11 @@
        System.out.println(result);
    }
    private static void generater() throws Exception {
        GeneraterManager.getInstance().init("D:\\workspace\\server\\utils\\src\\test\\java", TestEntity.class);
        GeneraterManager.getInstance().createWholeFunction(new DaoGeneraterParams("com.generater.temp.dao", null), null, null);
    }
    @Table("tb_test")
    public static class Entity {
src/test/java/com/generater/TestEntity.java
@@ -1,6 +1,7 @@
package com.generater;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.yeshi.utils.generater.annotation.admin.AdminController;
import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition;
import org.yeshi.utils.generater.annotation.admin.Show;
@@ -10,12 +11,15 @@
import org.yeshi.utils.generater.annotation.admin.form.Text;
import org.yeshi.utils.generater.entity.admin.FormVerifyType;
import java.util.Date;
/**
 * @author Administrator
 * @title: TestEntity
 * @description: 测试entity
 * @date 2021/9/23 14:22
 */
@Document(collection = "test")
@AdminController(mapping = "admin/api/test", title = "测试", searchForm = TestEntity.SearchForm.class,jsonp = true)
public class TestEntity {
    @Id
@@ -44,6 +48,9 @@
    @Show(order = 4, title = "省")
    @Select(values = {"cq:重庆","js:江苏"}, title = "省", apiParams = {"page:1", "pageSize:10", "id:\"test\""})
    private String province;
    @DaoQueryCondition
    private Date createTime;
    public String getId() {
@@ -94,6 +101,13 @@
        this.province = province;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public class SearchForm {
src/test/java/com/generater/TestEntity2.java
@@ -13,6 +13,8 @@
import org.yeshi.utils.generater.mybatis.Column;
import org.yeshi.utils.generater.mybatis.Table;
import java.util.Date;
/**
 * @author Administrator
 * @title: TestEntity
@@ -50,6 +52,11 @@
    @Show(order = 4, title = "省")
    @Select(values = {"cq:重庆","js:江苏"}, title = "省", apiParams = {"page:1", "pageSize:10", "id:\"test\""})
    private String province;
    @DaoQueryCondition
    private Date createTime;
    public String getId() {
        return id;
@@ -99,6 +106,14 @@
        this.province = province;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public class SearchForm {
        @Text(title = "开始日期", inputType = Text.Type.DATE)