├── .gitignore ├── README.md ├── coder-protocol ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── sparrow │ └── coding │ ├── DigitalCategory.java │ ├── api │ ├── CodeGenerator.java │ ├── TableConfigRegistry.java │ ├── ValidatorMessageGenerator.java │ ├── ValidatorRegistry.java │ └── backend │ │ └── ClassGenerator.java │ ├── enums │ ├── ClassKey.java │ ├── CodeSource.java │ └── PlaceholderKey.java │ ├── po │ ├── ProjectConfig.java │ └── TableConfig.java │ └── protocol │ ├── CellType.java │ ├── ColumnDef.java │ ├── Condition.java │ ├── ControlType.java │ ├── Entity.java │ ├── HeaderType.java │ ├── TableContext.java │ └── validate │ ├── DigitalValidator.java │ ├── NoneValidator.java │ ├── RegexValidator.java │ ├── StringValidator.java │ └── Validator.java ├── coder ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── sparrow │ │ │ └── coding │ │ │ ├── ApplicationBoot.java │ │ │ ├── ApplicationInitializer.java │ │ │ ├── FrontMain.java │ │ │ ├── JavaMain.java │ │ │ ├── ProjectCopier.java │ │ │ ├── config │ │ │ ├── CoderConfig.java │ │ │ ├── EnvConfig.java │ │ │ ├── ExampleFront.java │ │ │ └── MybatisMethodConfig.java │ │ │ ├── frontend │ │ │ ├── EnvironmentContext.java │ │ │ ├── enums │ │ │ │ └── FrontendPlaceholderKey.java │ │ │ └── validate │ │ │ │ └── valibot │ │ │ │ ├── AbstractValidatorMessageGenerator.java │ │ │ │ ├── ChineseCharactersValidatorMessageGenerator.java │ │ │ │ ├── DigitalValidatorMessageGenerator.java │ │ │ │ ├── EmailValidatorMessageGenerator.java │ │ │ │ ├── IdCardValidatorMessageGenerator.java │ │ │ │ ├── MobileValidatorMessageGenerator.java │ │ │ │ ├── RegexValidatorMessageGenerator.java │ │ │ │ ├── StringValidatorMessageGenerator.java │ │ │ │ └── TelValidatorMessageGenerator.java │ │ │ ├── java │ │ │ ├── CodeGenerator2.java │ │ │ ├── DefaultClassGenerator.java │ │ │ ├── DefaultCodeGenerator.java │ │ │ ├── EnvironmentContext.java │ │ │ ├── MybatisEntityManager.java │ │ │ ├── ScaffoldCopier.java │ │ │ └── enums │ │ │ │ ├── ClassKey.java │ │ │ │ └── PlaceholderKey.java │ │ │ └── support │ │ │ └── utils │ │ │ ├── ConfigUtils.java │ │ │ └── PinyinUtil.java │ └── resources │ │ ├── Licensed.txt │ │ ├── beans.xml │ │ ├── config.properties │ │ ├── jar-with-dependencies.xml │ │ ├── logback.xml │ │ ├── release-assembly.xml │ │ ├── scaffold.properties │ │ ├── sparrow_default.properties │ │ ├── sparrow_generator.dtd │ │ ├── sparrow_generator.xml │ │ ├── system_config.properties │ │ ├── tedu │ │ ├── admin_copier.properties │ │ ├── assemble.txt │ │ ├── batchOperateParam.txt │ │ ├── bo.txt │ │ ├── controller.txt │ │ ├── copier.properties │ │ ├── dao.txt │ │ ├── daoImpl.txt │ │ ├── dataConverter.txt │ │ ├── mybatis.properties │ │ ├── pagerQuery.txt │ │ ├── param.txt │ │ ├── query.txt │ │ ├── repository.txt │ │ ├── repositoryImpl.txt │ │ ├── service.txt │ │ ├── sparrow_copier.properties │ │ └── vo.txt │ │ ├── template-thymeleaf │ │ ├── assemble.txt │ │ ├── batchOperateParam.txt │ │ ├── bo.txt │ │ ├── controller.txt │ │ ├── dao.txt │ │ ├── daoImpl.txt │ │ ├── dataConverter.txt │ │ ├── mybatis.properties │ │ ├── pagerQuery.txt │ │ ├── param.txt │ │ ├── query.txt │ │ ├── repository.txt │ │ ├── repositoryImpl.txt │ │ ├── service.txt │ │ ├── sql │ │ │ ├── attentionUser.sql │ │ │ ├── event.sql │ │ │ └── fansUser.sql │ │ └── vo.txt │ │ └── template │ │ ├── assemble.txt │ │ ├── bo.txt │ │ ├── controller.txt │ │ ├── dao.txt │ │ ├── daoImpl.txt │ │ ├── dataConverter.txt │ │ ├── mybatis.properties │ │ ├── pagerQuery.txt │ │ ├── param.txt │ │ ├── query.txt │ │ ├── repository.txt │ │ ├── repositoryImpl.txt │ │ ├── service.txt │ │ ├── sql │ │ ├── attentionUser.sql │ │ ├── event.sql │ │ └── fansUser.sql │ │ └── vo.txt │ └── test │ └── java │ └── com │ └── sparrow │ └── coding │ ├── CodeGeneratorDemo.java │ ├── FileTest.java │ ├── HelloWorld.java │ ├── InstallCert.java │ ├── MavenInstall.java │ ├── generate │ └── BackendTest.java │ ├── mybatis │ └── MybatisEntityManagerTest.java │ ├── sparrow │ ├── DigitalTest.java │ ├── EmailTest.java │ ├── IdCardTest.java │ └── MobileTest.java │ └── validator │ └── ValidatorTest.java ├── example-po ├── bin │ ├── config.properties │ ├── ddl │ │ └── sparrow_example.sql │ ├── example-front-coder-all.sh │ ├── example-java-coder-all.sh │ ├── sparrow-front-coder.sh │ └── sparrow-java-coder.sh ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── sparrow │ └── example │ └── po │ ├── SparrowExample.java │ └── TableDef.java ├── pom.xml ├── release-note.md └── 整洁架构.png /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | target 3 | .idea 4 | lib 5 | classes 6 | logs 7 | *.jar 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sparrow-coder 麻雀代码生成器 【灵活半自动化代码生成器】 2 | 3 | # 核心功能 4 | ## 基于整洁架构生成核心代码 5 | ![整洁架构](整洁架构.png) 6 | 下载sparrow-example 【默认保存至${user.home}】目录 7 | 8 | 可以在config.properties 文件中修改该目录[config.properties](./example-po/bin/config.properties) 9 | ] 见下文说明 10 | [sparrow-example](https://github.com/sparrowzoo/sparrow-example) 11 | 12 | ## 生成前后端代码 13 | - 支持前后端分离和不分离版本 14 | - 本示例为不分离版本,分离版本由网友自行配置 15 | 16 | ## 编译 17 | 配置成功后执行命令 18 | ``` 19 | mvn clean install -Dmaven.test.skip 20 | ``` 21 | 22 | 23 | ## 环境变量配置说明 24 | SPARROW_CODER_HOME={sparrow-coder/coder/target} 目录下 25 | 26 | {sparrow-coder/coder/target} 为变量 具体为sparrow-coder-all.jar 所在目录,即代码生成器所在目录 27 | ## 配置文件 28 | ``` 29 | vi example-po/bin/config.properties 30 | workspace=修改成自己的工作目录(sparrow-example 工程所在目录) 31 | resource_workspace=修改成自己的工作目录 32 | ``` 33 | 34 | ## java 类生成 35 | 36 | ``` 37 | cd /sparrow-coder/example-po/bin //切到bin 目录 38 | sh sparrow-java-coder.sh --help //帮助菜单 39 | sh sparrow-java-coder.sh --example //生成示例代码 40 | 41 | sh sparrow-java-coder.sh -ct com.sparrow.example.po.SparrowExample //生成数据库表 42 | sh example-java-coder-all.sh //生成所有java 代码 43 | ``` 44 | 45 | ## 前端代码生成 46 | 47 | 48 | ``` 49 | sh sparrow-front-coder.sh --help //帮助菜单 50 | sh sparrow-front-coder.sh --example //生成示例代码 51 | 52 | 生成对应页面脚本示例 53 | sh sparrow-front-coder.sh -mp com.sparrow.coding.config.ExampleFront 54 | sh sparrow-front-coder.sh -cp com.sparrow.coding.config.ExampleFront 55 | sh sparrow-front-coder.sh -cj com.sparrow.coding.config.ExampleFront 56 | sh sparrow-front-coder.sh -lj com.sparrow.coding.config.ExampleFront 57 | sh sparrow-front-coder.sh -mj com.sparrow.coding.config.ExampleFront 58 | sh example-front-code-all.sh //生成所有前端代码 59 | 60 | ``` 61 | 62 | 63 | -------------------------------------------------------------------------------- /coder-protocol/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | com.sparrowzoo 8 | sparrow-bom 9 | 1.0.5-SNAPSHOT 10 | 11 | 12 | 13 | 14 | org.projectlombok 15 | lombok 16 | 17 | 18 | com.sparrowzoo 19 | sparrow 20 | 21 | 22 | 4.0.0 23 | coder-protocol 24 | com.sparrowzoo.coding 25 | 1.0.0-RELEASE 26 | 27 | 8 28 | 8 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/DigitalCategory.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | public enum DigitalCategory { 4 | INTEGER("/^\\d+$/","parseInt(input,10)"), 5 | SIGNED_INTEGER("/^-?\\d+$/","parseInt(input,10)"), 6 | FLOAT("/^-?\\d+\\.\\d+$/","parseFloat(input)"); 7 | private final String regex; 8 | private final String converter; 9 | 10 | DigitalCategory(String regex,String converter) { 11 | this.regex = regex; 12 | this.converter = converter; 13 | } 14 | 15 | public String getRegex() { 16 | return regex; 17 | } 18 | 19 | public String getConverter() { 20 | return converter; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/api/CodeGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.api; 2 | 3 | import java.io.IOException; 4 | 5 | public interface CodeGenerator { 6 | void initRegistry(Long projectId) throws ClassNotFoundException, IOException; 7 | 8 | void generate(String tableName) throws IOException; 9 | 10 | void initScaffold(); 11 | } 12 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/api/TableConfigRegistry.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.api; 2 | 3 | import com.sparrow.coding.po.ProjectConfig; 4 | import com.sparrow.coding.po.TableConfig; 5 | import com.sparrow.coding.protocol.TableContext; 6 | import com.sparrow.container.ConfigReader; 7 | import com.sparrow.container.Container; 8 | import com.sparrow.core.spi.ApplicationContext; 9 | 10 | import javax.inject.Named; 11 | import java.util.ArrayList; 12 | import java.util.HashMap; 13 | import java.util.List; 14 | import java.util.Map; 15 | 16 | /** 17 | * 每次源代码时,只初始化一次 18 | */ 19 | @Named 20 | public class TableConfigRegistry { 21 | private Map registry = new HashMap<>(); 22 | private ProjectConfig project; 23 | 24 | private String workspace; 25 | 26 | private String scaffold; 27 | 28 | public void register(String tableName, TableContext tableContext) { 29 | registry.put(tableName, tableContext); 30 | } 31 | 32 | public TableContext getTableContext(String tableName) { 33 | return registry.get(tableName); 34 | } 35 | 36 | public List getAllTableConfig(Long projectId) { 37 | List tableConfigList = new ArrayList<>(); 38 | for (String tableName : this.registry.keySet()) { 39 | tableConfigList.add(this.registry.get(tableName).getTableConfig()); 40 | } 41 | return tableConfigList; 42 | } 43 | 44 | public void register(ProjectConfig projectConfig) { 45 | this.project = projectConfig; 46 | } 47 | 48 | public String getWorkspace() { 49 | return workspace; 50 | } 51 | 52 | public void setWorkspace(String workspace) { 53 | this.workspace = workspace; 54 | } 55 | 56 | public String getScaffold() { 57 | return scaffold; 58 | } 59 | 60 | public void setScaffold(String scaffold) { 61 | this.scaffold = scaffold; 62 | } 63 | 64 | public ProjectConfig getProjectConfig() { 65 | return this.project; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/api/ValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.api; 2 | 3 | public interface ValidatorMessageGenerator { 4 | String generateConfig(String propertyName, 5 | T validator); 6 | 7 | String generateI18NConfig(T validator); 8 | } 9 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/api/ValidatorRegistry.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.api; 2 | 3 | import com.sparrow.utility.ClassUtility; 4 | 5 | import java.lang.annotation.Annotation; 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | public class ValidatorRegistry { 10 | 11 | /** 12 | * key: namespace 13 | * value: Map 14 | */ 15 | private Map>> registry; 16 | 17 | private ValidatorRegistry() { 18 | registry = new HashMap<>(); 19 | } 20 | 21 | static class Inner { 22 | private static ValidatorRegistry validatorRegistry = new ValidatorRegistry(); 23 | } 24 | 25 | 26 | public void registry(ValidatorMessageGenerator validatorMessageGenerator) { 27 | String packageName = validatorMessageGenerator.getClass().getPackage().getName(); 28 | String namespace = packageName.substring(packageName.lastIndexOf(".") + 1); 29 | String validatorName = ClassUtility.getBeanNameByClass(validatorMessageGenerator.getClass()); 30 | if (!this.registry.containsKey(namespace)) { 31 | this.registry.putIfAbsent(namespace, new HashMap<>()); 32 | } 33 | this.registry.get(namespace).put(validatorName, validatorMessageGenerator); 34 | } 35 | 36 | public ValidatorMessageGenerator getValidatorMessageGenerator(String namespace, 37 | String validatorName) { 38 | return this.registry.get(namespace).get(validatorName); 39 | } 40 | 41 | public Map>> getRegistry() { 42 | return registry; 43 | } 44 | 45 | public static ValidatorRegistry getInstance() { 46 | return Inner.validatorRegistry; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/api/backend/ClassGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.api.backend; 2 | 3 | import com.sparrow.coding.enums.ClassKey; 4 | import com.sparrow.coding.po.ProjectConfig; 5 | import com.sparrow.coding.protocol.TableContext; 6 | 7 | import java.io.IOException; 8 | 9 | public interface ClassGenerator { 10 | 11 | String getPackage(String tableName, ClassKey classKey); 12 | 13 | String getClassName(String tableName, ClassKey classKey); 14 | 15 | String getFullPhysicalPath(String tableName, ClassKey classKey); 16 | 17 | String readConfigContent(String templateFileName); 18 | void generate(String tableName, ClassKey classKey) throws IOException; 19 | } 20 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/enums/ClassKey.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.enums; 2 | 3 | /** 4 | * 生成类的key 5 | *

6 | * 通过 class.{name}找到类名 通过 package.{name}找到包名 通过 module.{module} 找到模块名 7 | *

8 | * 通过该key 的配置找到对应的子模块名,包名及类名 9 | *

10 | * 具体的配置见config.properties 11 | */ 12 | public enum ClassKey { 13 | PO("", "persistence"), 14 | BO("bo.txt", "domain"), 15 | PARAM("param.txt", "protocol"), 16 | QUERY("query.txt", "protocol"), 17 | DTO("dto.txt", "protocol"), 18 | CONTROLLER("controller.txt", "adapter"), 19 | VO("vo.txt", "adapter"), 20 | DAO("dao.txt", "dao.api"), 21 | DAO_MYBATIS("mybatis.properties", "dao.mybatis"), 22 | DAO_IMPL("daoImpl.txt", "dao.sparrow"), 23 | SERVICE("service.txt", "domain"), 24 | ASSEMBLE("assemble.txt", "adapter"), 25 | REPOSITORY("repository.txt", "domain"), 26 | REPOSITORY_IMPL("repositoryImpl.txt", "infrastructure"), 27 | DATA_CONVERTER("dataConverter.txt", "infrastructure"), 28 | PAGER_QUERY("pagerQuery.txt", "dao.api"), 29 | BATCH_OPERATE_PARAM("batchOperateParam.txt", "protocol"); 30 | 31 | private String template; 32 | private String module; 33 | 34 | public String getTemplate() { 35 | return template; 36 | } 37 | 38 | ClassKey(String template, String module) { 39 | this.template = template; 40 | this.module = module; 41 | } 42 | 43 | public String getModule() { 44 | return module; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/enums/CodeSource.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.enums; 2 | 3 | public enum CodeSource { 4 | INNER, 5 | UPLOAD 6 | } 7 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/enums/PlaceholderKey.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.enums; 2 | 3 | public enum PlaceholderKey { 4 | /** 5 | * e.g. @author harry 6 | */ 7 | $author, 8 | 9 | /** 10 | * 代码生成器的家目录 11 | */ 12 | $coder_home, 13 | 14 | /** 15 | * 项目的工作目录 16 | */ 17 | $workspace, 18 | 19 | /** 20 | * 项目名 21 | */ 22 | $project, 23 | /** 24 | * origin table name e.g user_address 25 | */ 26 | $origin_table_name, 27 | 28 | /** 29 | * e.g UserAddress 30 | */ 31 | $persistence_class_name, 32 | 33 | /** 34 | * first case lower table name e.g userAddress 35 | */ 36 | $persistence_object_name, 37 | 38 | /** 39 | * 示例 user-address 40 | */ 41 | $persistence_object_by_horizontal, 42 | 43 | /** 44 | * 示例 user/address 45 | */ 46 | $persistence_object_by_slash, 47 | 48 | /** 49 | * 示例 user.address 50 | */ 51 | $persistence_object_by_dot, 52 | 53 | /** 54 | * 项目 55 | */ 56 | $module_prefix, 57 | 58 | /** 59 | * po: e.g com.sparrow.user.po 60 | */ 61 | $package_po, 62 | 63 | /** 64 | * po: e.g com.sparrow.user.bo 65 | */ 66 | $package_bo, 67 | 68 | /** 69 | * po: e.g com.sparrow.user.param 70 | */ 71 | $package_param, 72 | 73 | /** 74 | * batch operate param package 75 | */ 76 | $package_batch_param, 77 | 78 | /** 79 | * po: e.g com.sparrow.user.query 80 | */ 81 | $package_query, 82 | 83 | /** 84 | * po: e.g com.sparrow.user.dto 85 | */ 86 | $package_dto, 87 | 88 | /** 89 | * po: e.g com.sparrow.user.vo 90 | */ 91 | $package_vo, 92 | 93 | /** 94 | * dao e.g com.sparrow.user.dao 95 | */ 96 | $package_dao, 97 | 98 | $package_pager_query, 99 | 100 | 101 | /** 102 | * dao impl e.g com.sparrow.user.dao.impl 103 | */ 104 | $package_dao_impl, 105 | 106 | /** 107 | * dao e.g com.sparrow.user.repository 108 | */ 109 | $package_repository, 110 | 111 | /** 112 | * dao impl e.g com.sparrow.user.dao.repository.impl 113 | */ 114 | $package_repository_impl, 115 | 116 | $package_data_converter, 117 | 118 | $package_assemble, 119 | 120 | /** 121 | * service e.g com.sparrow.user.service 122 | */ 123 | $package_service, 124 | 125 | /** 126 | * controller e.g com.sparrow.user.controller 127 | */ 128 | $package_controller, 129 | 130 | /** 131 | * User 132 | */ 133 | $class_po, 134 | 135 | /** 136 | * UserDao 137 | */ 138 | $class_dao, 139 | 140 | /** 141 | * UserService 142 | */ 143 | $class_service, 144 | 145 | /** 146 | * Repository 147 | */ 148 | $class_repository, 149 | 150 | /** 151 | * Repository impl 152 | */ 153 | $class_repositoryImpl, 154 | 155 | /** 156 | * UserDaoImpl 157 | */ 158 | $class_impl_dao, 159 | 160 | /** 161 | * UserController 162 | */ 163 | $class_controller, 164 | 165 | /** 166 | * primary property name e.g userId 167 | */ 168 | $primary_property_name, 169 | 170 | /** 171 | * e.g UserId 172 | */ 173 | $upper_primary_property_name, 174 | 175 | $primary_type, 176 | 177 | /** 178 | * userDao 179 | */ 180 | $object_dao, 181 | 182 | /** 183 | * userService 184 | */ 185 | $object_service, 186 | 187 | /** 188 | * current date 2018-11-15 189 | */ 190 | $date, 191 | 192 | /*for mybatis */ 193 | 194 | $result_map, 195 | 196 | $sql_insert, 197 | 198 | $sql_query_one, 199 | 200 | $sql_update, 201 | 202 | $sql_delete, 203 | 204 | $field_list, 205 | 206 | $get_sets 207 | 208 | } 209 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/po/ProjectConfig.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.po; 2 | 3 | import com.sparrow.protocol.dao.PO; 4 | import lombok.Data; 5 | 6 | import javax.persistence.*; 7 | 8 | @Table(name = "t_project_config") 9 | @Data 10 | public class ProjectConfig extends PO { 11 | @Id 12 | @GeneratedValue(strategy = GenerationType.IDENTITY) 13 | @Column(name = "id", columnDefinition = "int") 14 | private Long id; 15 | @Column(name = "name", updatable = false, nullable = false, columnDefinition = "varchar(50) default '' comment '项目名称'") 16 | private String name; 17 | @Column(name = "frontend_name", columnDefinition = "varchar(50) default '' comment '前端项目名称'") 18 | private String frontendName; 19 | @Column(name = "chinese_name", columnDefinition = "varchar(50) default '' comment '项目中文名称'") 20 | private String chineseName; 21 | @Column(name = "description", columnDefinition = "varchar(512) default '' comment '项目描述'") 22 | private String description; 23 | @Column(name = "module_prefix", columnDefinition = "varchar(50) default '' comment '模块前缀'") 24 | private String modulePrefix; 25 | @Column(name = "scan_package", columnDefinition = "varchar(512) default '' comment '扫描的包路径'") 26 | private String scanPackage; 27 | @Column(name = "code_template", columnDefinition = "varchar(50) default 'template' comment '项目模板'") 28 | private String codeTemplate; 29 | @Column(name = "config", columnDefinition = "varchar(512) default '' comment '脚手架配置'") 30 | private String config; 31 | } 32 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/po/TableConfig.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.po; 2 | 3 | import com.sparrow.coding.protocol.ColumnDef; 4 | import com.sparrow.protocol.dao.PO; 5 | import lombok.Data; 6 | 7 | import javax.persistence.*; 8 | import java.util.List; 9 | 10 | @Data 11 | @Table(name = "t_table_config") 12 | public class TableConfig extends PO { 13 | @Id 14 | @GeneratedValue(strategy = GenerationType.IDENTITY) 15 | @Column(name = "id", columnDefinition = "int") 16 | private Long id; 17 | @Column(name = "project_id", updatable = false, nullable = false, columnDefinition = "int comment '项目ID'") 18 | private Long projectId; 19 | @Column(name = "primary_key",updatable = false,nullable = false,columnDefinition = "varchar(32) default '' comment '主键'") 20 | private String primaryKey; 21 | @Column(name = "table_name", updatable = false, nullable = false, unique = true, columnDefinition = "varchar(32) default '' comment '表名'") 22 | private String tableName; 23 | @Column(name = "class_name", updatable = false, nullable = false, unique = true, columnDefinition = "varchar(32) default '' comment '类名'") 24 | private String className; 25 | @Column(name = "description", nullable = false, columnDefinition = "varchar(255) default '' comment '描述'") 26 | private String description; 27 | @Column(name = "checkable", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否可勾选 0-不可 1-可'") 28 | private Boolean checkable; 29 | @Column(name = "row_menu", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否显示行操作 0-不显示 1-显示'") 30 | private Boolean rowMenu; 31 | @Column(name = "column_filter", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否显示列过滤器 0-不显示 1-显示'") 32 | private Boolean columnFilter; 33 | @Column(name = "status_command", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否显示状态命令 0-不显示 1-显示'") 34 | private Boolean statusCommand; 35 | @Column(name = "column_configs", columnDefinition = "text default '' comment '列配置'") 36 | private String columnConfigs; 37 | @Column(name = "source", nullable = false, columnDefinition = "varchar(255) default '' comment '数据源 CLASSPATH,UPLOAD'") 38 | private String source; 39 | @Column(name = "source_code", columnDefinition = "text default '' comment '上传源代码'") 40 | private String sourceCode; 41 | @Transient 42 | private List columnDefs; 43 | } 44 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/CellType.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol; 2 | 3 | public enum CellType { 4 | CHECK_BOX("CheckboxHeader", "check-box.tsx", "选择"), 5 | NORMAL("NormalHeader", "normal.tsx", "标准"), 6 | CURRENCY("CurrencyHeader", "currency.tsx", "货币"), 7 | TREE("TreeHeader", "tree.tsx", "树形"), 8 | 9 | OPERATION("OperationHeader", "operation.tsx", "命令操作"); 10 | private String componentName; 11 | private String fileName; 12 | 13 | private String description; 14 | 15 | public String getComponentName() { 16 | return componentName; 17 | } 18 | 19 | public String getFileName() { 20 | return fileName; 21 | } 22 | 23 | public String getDescription() { 24 | return description; 25 | } 26 | 27 | CellType(String componentName, String fileName, String description) { 28 | this.componentName = componentName; 29 | this.fileName = fileName; 30 | this.description = description; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/ColumnDef.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol; 2 | 3 | import com.sparrow.coding.protocol.validate.Validator; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class ColumnDef { 8 | private String name; 9 | private boolean primaryKey; 10 | private boolean i18n; 11 | private String text; 12 | private String sqlType; 13 | private String javaType; 14 | private boolean showInInsert; 15 | private boolean showInEdit; 16 | private boolean showInList; 17 | private boolean allowNull; 18 | private String placeholder; 19 | private String defaultValue; 20 | private Condition condition; 21 | private String validateType; 22 | private Validator validator; 23 | private Boolean visible; 24 | private HeaderType headerType; 25 | private CellType cellType; 26 | } 27 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/Condition.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Condition { 7 | private boolean show; 8 | private String operator; 9 | private String dictionary; 10 | } 11 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/ControlType.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol; 2 | 3 | public enum ControlType { 4 | LABEL("lbl"), 5 | LINK("lnk"), 6 | INPUT_TEXT("txt"), 7 | INPUT_HIDDEN("hdn"), 8 | INPUT_PASSWORD("txt"), 9 | TEXT_AREA("txt"), 10 | DROPDOWN_LIST("ddl"), 11 | RADIO_LIST("rdl"), 12 | CHECK_BOX_LIST("cbl"), 13 | CODE("txt"), 14 | EDITOR("divEditor"), 15 | DATE("txt"), 16 | DATE_HHMMSS("txt"), 17 | CHECK_BOX("ckb"), 18 | RADIO("rdb"), 19 | SELECT("slt"), 20 | FILE("flb"), 21 | ENABLE_DISABLE(""), 22 | IMAGE("img"); 23 | 24 | 25 | private String prefix; 26 | 27 | ControlType(String prefix) { 28 | this.prefix = prefix; 29 | } 30 | 31 | public String getPrefix() { 32 | return prefix; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/Entity.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Entity { 7 | /** 8 | * 实体类名 9 | */ 10 | private String name; 11 | /** 12 | * tableName 13 | * Map tableMap 14 | * key: tableName 15 | * value: Table JPA对象 16 | */ 17 | private String tableName; 18 | 19 | private String text; 20 | 21 | private String i18n; 22 | } 23 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/HeaderType.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol; 2 | 3 | public enum HeaderType { 4 | CHECK_BOX("CheckboxHeader", "check-box.tsx", "选择"), 5 | NORMAL("NormalHeader", "normal.tsx", "标准"), 6 | NORMAL_SORT("NormalHeader", "normal.tsx", "标准(可排序)"), 7 | NORMAL_FILTER("NormalHeader", "normal.tsx", "标准(可过滤)"), 8 | NORMAL_SORT_FILTER("NormalHeader", "normal.tsx", "标准(可过滤,可排序)"), 9 | EMPTY("EmptyHeader", "empty.tsx", "空白"); 10 | private String componentName; 11 | private String fileName; 12 | private String description; 13 | 14 | public String getComponentName() { 15 | return componentName; 16 | } 17 | 18 | public String getFileName() { 19 | return fileName; 20 | } 21 | 22 | public String getDescription() { 23 | return description; 24 | } 25 | 26 | HeaderType(String componentName, String fileName, String description) { 27 | this.componentName = componentName; 28 | this.fileName = fileName; 29 | this.description = description; 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/TableContext.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol; 2 | 3 | import com.sparrow.coding.po.TableConfig; 4 | import lombok.Data; 5 | 6 | import javax.persistence.EntityManager; 7 | import java.util.Map; 8 | 9 | @Data 10 | public class TableContext { 11 | private String poPackage; 12 | private Map placeHolder; 13 | private TableConfig tableConfig; 14 | } 15 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/validate/DigitalValidator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol.validate; 2 | 3 | import com.sparrow.coding.DigitalCategory; 4 | import com.sparrow.core.Pair; 5 | import lombok.Data; 6 | 7 | import java.lang.annotation.Retention; 8 | import java.lang.annotation.Target; 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | import static java.lang.annotation.ElementType.FIELD; 13 | import static java.lang.annotation.ElementType.METHOD; 14 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 15 | 16 | @Data 17 | public class DigitalValidator implements Validator { 18 | private Boolean i18n; 19 | private String i18nFieldName; 20 | private String emptyMessage; 21 | private Boolean allowEmpty; 22 | private String digitalMessage; 23 | private int minValue; 24 | private String minValueMessage; 25 | private int maxValue; 26 | private String maxValueMessage; 27 | //INT FLOAT 科学计数法 28 | private DigitalCategory category; 29 | private List> i18nConfig=new ArrayList<>(); 30 | } 31 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/validate/NoneValidator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol.validate; 2 | 3 | import com.sparrow.core.Pair; 4 | 5 | import java.util.Collections; 6 | import java.util.List; 7 | 8 | public class NoneValidator implements Validator { 9 | 10 | @Override 11 | public Boolean getI18n() { 12 | return null; 13 | } 14 | 15 | @Override 16 | public void setI18nFieldName(String i18nFieldName) { 17 | 18 | } 19 | 20 | @Override 21 | public String getI18nFieldName() { 22 | return ""; 23 | } 24 | 25 | @Override 26 | public Boolean getAllowEmpty() { 27 | return true; 28 | } 29 | 30 | @Override 31 | public String getEmptyMessage() { 32 | return ""; 33 | } 34 | 35 | @Override 36 | public List> getI18nConfig() { 37 | return Collections.emptyList(); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/validate/RegexValidator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol.validate; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class RegexValidator extends StringValidator { 7 | private String formatMessage; 8 | private String regex; 9 | } 10 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/validate/StringValidator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol.validate; 2 | 3 | import com.sparrow.core.Pair; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | public class StringValidator implements Validator { 10 | private Boolean i18n; 11 | private String i18nFieldName; 12 | private String emptyMessage; 13 | private Boolean allowEmpty; 14 | protected int minLength; 15 | protected int maxLength; 16 | private String minLengthMessage; 17 | private String maxLengthMessage; 18 | private List> i18nConfig; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /coder-protocol/src/main/java/com/sparrow/coding/protocol/validate/Validator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.protocol.validate; 2 | 3 | import com.sparrow.core.Pair; 4 | 5 | import java.util.List; 6 | 7 | public interface Validator { 8 | Boolean getI18n(); 9 | 10 | void setI18nFieldName(String i18nFieldName); 11 | 12 | String getI18nFieldName(); 13 | 14 | Boolean getAllowEmpty(); 15 | 16 | String getEmptyMessage(); 17 | 18 | List> getI18nConfig(); 19 | } 20 | -------------------------------------------------------------------------------- /coder/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | com.sparrowzoo 7 | sparrow-bom 8 | 1.0.5-SNAPSHOT 9 | 10 | 11 | 4.0.0 12 | com.sparrow.coding 13 | coder 14 | 1.0 15 | jar 16 | 17 | 8 18 | 8 19 | 3.0.1 20 | 21 | 22 | 23 | 24 | com.belerweb 25 | pinyin4j 26 | 2.5.0 27 | 28 | 29 | 30 | javax.servlet 31 | javax.servlet-api 32 | compile 33 | 34 | 35 | com.sparrowzoo 36 | sparrow-orm 37 | 38 | 39 | com.sparrowzoo 40 | sparrow-container 41 | 42 | 43 | com.sparrowzoo 44 | sparrow-data-source 45 | 46 | 47 | com.sparrowzoo 48 | sparrow-loader 49 | 50 | 51 | com.sparrowzoo 52 | sparrow-json 53 | 54 | 55 | coder-protocol 56 | com.sparrowzoo.coding 57 | 1.0.0-RELEASE 58 | 59 | 60 | ch.qos.logback 61 | logback-classic 62 | 63 | 64 | 65 | org.springframework.boot 66 | spring-boot-starter-test 67 | test 68 | 69 | 70 | 71 | org.springframework.boot 72 | spring-boot-starter-web 73 | 74 | 75 | 76 | sparrow-coder 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/ApplicationBoot.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.boot.SpringApplication; 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | import org.springframework.boot.context.event.ApplicationStartingEvent; 8 | import org.springframework.context.ApplicationListener; 9 | import org.springframework.context.event.ContextClosedEvent; 10 | import org.springframework.context.event.ContextRefreshedEvent; 11 | 12 | 13 | @SpringBootApplication(scanBasePackages = "com.sparrow.*") 14 | public class ApplicationBoot { 15 | private static Logger log = LoggerFactory.getLogger(ApplicationBoot.class); 16 | public static void main(String[] args) { 17 | SpringApplication springApplication = new SpringApplication(ApplicationBoot.class); 18 | springApplication.addListeners(new ApplicationListener() { 19 | @Override 20 | public void onApplicationEvent(ApplicationStartingEvent event) { 21 | 22 | } 23 | }); 24 | 25 | 26 | springApplication.addListeners(new ApplicationListener() { 27 | @Override 28 | public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { 29 | log.info("application startup at {}", contextRefreshedEvent.getTimestamp()); 30 | try { 31 | log.info("start web socket server"); 32 | } catch (Exception e) { 33 | log.error("start error", e); 34 | } 35 | } 36 | }); 37 | springApplication.addListeners(new ApplicationListener() { 38 | 39 | @Override 40 | public void onApplicationEvent(ContextClosedEvent contextClosedEvent) { 41 | log.info("application closed at at {}", contextClosedEvent.getTimestamp()); 42 | } 43 | }); 44 | springApplication.run(args); 45 | } 46 | } 47 | 48 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/ApplicationInitializer.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | import com.sparrow.container.Container; 4 | import com.sparrow.support.Initializer; 5 | 6 | public class ApplicationInitializer implements Initializer { 7 | @Override 8 | public void init(Container container) { 9 | 10 | } 11 | 12 | @Override 13 | public void destroy(Container container) { 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/FrontMain.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | import com.sparrow.coding.frontend.EnvironmentContext; 4 | import com.sparrow.container.Container; 5 | import com.sparrow.container.ContainerBuilder; 6 | import com.sparrow.core.spi.ApplicationContext; 7 | import com.sparrow.protocol.POJO; 8 | import com.sparrow.utility.StringUtility; 9 | import java.io.IOException; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import javax.xml.parsers.ParserConfigurationException; 13 | import org.xml.sax.SAXException; 14 | 15 | public class FrontMain { 16 | private static void usage() { 17 | System.out.println("使用方法【usage】"); 18 | System.out.println("sparrow-front-coder.sh [OPTION] [args]"); 19 | System.out.println("OPTION:"); 20 | System.out.println("生成管理页: [-mp |-GenerateManagePage] args=pojo"); 21 | System.out.println("生成新建页: [-cp |-GenerateCreatePage] args=pojo"); 22 | System.out.println("生成新建页js: [-cj |-GenerateCreateJs] args=pojo"); 23 | System.out.println("生成国际化提示信息【中文】js: [-lj |-GenerateLanguageJs] args=pojo"); 24 | System.out.println("生成管理页 js: [-mj |-GenerateManageJs] args=pojo"); 25 | } 26 | 27 | public static void innerMain( 28 | String[] args) throws IOException, ClassNotFoundException, ParserConfigurationException, SAXException { 29 | System.out.println("生成类:" + args[1]); 30 | 31 | String sparrowConfig = "default"; 32 | String configPath = args[args.length - 1]; 33 | if (configPath.startsWith("-config=")) { 34 | sparrowConfig = configPath.substring("-config=".length()); 35 | } 36 | Class clazz = (Class) Class.forName(args[1]); 37 | EnvironmentContext environmentContext = new EnvironmentContext(sparrowConfig); 38 | EnvironmentContext.Config config = environmentContext.new Config(clazz); 39 | if ("-mp".equals(args[0]) || "-GenerateManagePage".equals(args[0])) { 40 | config.generateManagePage(); 41 | return; 42 | } 43 | 44 | if ("-cp".equals(args[0]) || "-GenerateCreatePage".equals(args[0])) { 45 | config.generateCreatePage(); 46 | return; 47 | } 48 | 49 | if ("-cj".equals(args[0]) || "-GenerateCreateJs".equals(args[0])) { 50 | config.generateCreateJs(); 51 | return; 52 | } 53 | 54 | if ("-lj".equals(args[0]) || "-GenerateLanguageJs".equals(args[0])) { 55 | config.generateLanguageJs(); 56 | return; 57 | } 58 | 59 | if ("-mj".equals(args[0]) || "-GenerateManageJs".equals(args[0])) { 60 | config.generateManageJs(); 61 | } 62 | } 63 | 64 | public static void main( 65 | String[] args) throws ClassNotFoundException, IOException, ParserConfigurationException, SAXException { 66 | //args = "--example".split(" "); 67 | // args = "-mp com.sparrow.coding.config.ExampleFront".split(" "); 68 | 69 | Container container = ApplicationContext.getContainer(); 70 | container.init(new ContainerBuilder().initController(false) 71 | .initInterceptor(false) 72 | .scanBasePackage("com.sparrow")); 73 | 74 | if (args.length == 0 || "--help".equals(args[0])) { 75 | usage(); 76 | return; 77 | } 78 | 79 | if ("--example".equals(args[0])) { 80 | List argsList = new ArrayList<>(); 81 | argsList.add("-mp com.sparrow.coding.config.ExampleFront"); 82 | argsList.add("-cp com.sparrow.coding.config.ExampleFront"); 83 | argsList.add("-cj com.sparrow.coding.config.ExampleFront"); 84 | argsList.add("-lj com.sparrow.coding.config.ExampleFront"); 85 | argsList.add("-mj com.sparrow.coding.config.ExampleFront"); 86 | 87 | for (String argLine : argsList) { 88 | args = argLine.split(" "); 89 | innerMain(args); 90 | } 91 | return; 92 | } 93 | 94 | if (args.length < 2) { 95 | usage(); 96 | return; 97 | } 98 | innerMain(args); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/ProjectCopier.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | import com.sparrow.utility.FileUtility; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.util.Properties; 10 | 11 | public class ProjectCopier { 12 | private static Logger logger = LoggerFactory.getLogger(ProjectCopier.class); 13 | 14 | private static String workspace; 15 | private static String target; 16 | private static String resourceTarget; 17 | 18 | public static void run(String config) throws IOException { 19 | Properties properties = System.getProperties(); 20 | properties.load(ProjectCopier.class.getResourceAsStream("/tedu/" + config)); 21 | 22 | String userHome = System.getProperty("user.home"); 23 | workspace = properties.getProperty("workspace"); 24 | workspace = workspace.replace("${user.home}", userHome); 25 | 26 | String sources = properties.getProperty("sources"); 27 | String[] sourceProjects = sources.split(","); 28 | target = workspace + properties.getProperty("target"); 29 | resourceTarget = workspace + properties.getProperty("resource_target"); 30 | for (String source : sourceProjects) { 31 | try { 32 | copy(workspace + source); 33 | } catch (Exception e) { 34 | System.out.println(source + " is error"); 35 | } 36 | } 37 | } 38 | 39 | public static void main(String[] args2) throws IOException { 40 | //run("sparrow_copier.properties"); 41 | run("copier.properties"); 42 | //run("admin_copier.properties"); 43 | } 44 | 45 | private static FileUtility.FolderFilter filter = (sourceFile, targetFile) -> { 46 | if (sourceFile.equalsIgnoreCase("target")) { 47 | return true; 48 | } 49 | //main 排除 50 | if (sourceFile.startsWith(".")) { 51 | return true; 52 | } 53 | if (sourceFile.endsWith("-main")) { 54 | return true; 55 | } 56 | return false; 57 | }; 58 | 59 | private static void copy(String source) { 60 | File directory = new File(source); 61 | String[] directoryList = directory.list(); 62 | if (directoryList == null) { 63 | return; 64 | } 65 | for (String childDirectory : directoryList) { 66 | if (filter.filter(childDirectory, target)) { 67 | continue; 68 | } 69 | 70 | if (childDirectory.contains("dao-impl")) { 71 | String mapperSource = source + File.separator + childDirectory + "/src/main/resources"; 72 | File sourceDirectory = new File(mapperSource); 73 | if (sourceDirectory.exists()) { 74 | FileUtility.getInstance().recurseCopy(mapperSource, resourceTarget); 75 | } else { 76 | logger.warn("{} is not exist", mapperSource); 77 | } 78 | continue; 79 | } 80 | 81 | 82 | String sourceDirectoryPath = source + File.separator + childDirectory + "/src/main/java"; 83 | File sourceDirectory = new File(sourceDirectoryPath); 84 | if (sourceDirectory.exists()) { 85 | logger.info("copy {} to {}", sourceDirectoryPath, target); 86 | FileUtility.getInstance().recurseCopy(sourceDirectoryPath, target); 87 | } else { 88 | logger.warn("{} is not exist", sourceDirectoryPath); 89 | } 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/config/CoderConfig.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.config; 2 | 3 | /** 4 | * 代码生成器的配置文件 5 | */ 6 | public class CoderConfig { 7 | /** 8 | * 作者 9 | */ 10 | public static String AUTHOR = "author"; 11 | /** 12 | * 项目名称 13 | */ 14 | public static String PROJECT = "project"; 15 | /** 16 | * 资源文件工作区 17 | */ 18 | public static String RESOURCE_WORKSPACE = "resource_workspace"; 19 | 20 | /** 21 | * 后端代码模板家目录 22 | */ 23 | public static String BACKEND_TEMPLATE_HOME = "backend_template_home"; 24 | 25 | 26 | /** 27 | * 后端代码模板家目录 28 | */ 29 | public static String TABLE_OUTPUT_HOME = "table_output_home"; 30 | 31 | /** 32 | * 前端生成器配置文件路径 33 | */ 34 | public static String FRONTEND_GENERATOR_CONFIG = "frontend_generator_config"; 35 | /** 36 | * 生成的前端模板的扩展名 支持 .jsp .html .vue 等等 37 | */ 38 | public static String EXTENSION = "extension"; 39 | /** 40 | * 项目的工作区 41 | */ 42 | public static String WORKSPACE = "workspace"; 43 | /** 44 | * js 语言文件生成路径 45 | */ 46 | public static String LANGUAGE_JS_PATH = "language_js_path"; 47 | /** 48 | * js 文件生成路径 49 | */ 50 | public static String JS_PATH = "js_path"; 51 | /** 52 | * 前端模板文件生成路径 53 | */ 54 | public static String VIEW_TEMPLATE_PATH = "view_template_path"; 55 | /** 56 | * css 样式文件生成路径 57 | */ 58 | public static String CSS_PATH = "css_path"; 59 | /** 60 | * maven module 的配置前缀 61 | */ 62 | public static String MODULE_PREFIX = "module."; 63 | /** 64 | * java package 的配置前缀 65 | */ 66 | public static String PACKAGE_PREFIX = "package."; 67 | /** 68 | * java 类文件的生成前缀 69 | */ 70 | public static String CLASS_PREFIX = "class."; 71 | /** 72 | * admin后台管理系统的parent 项目 73 | */ 74 | public static String MODULE_PARENT_ADMIN = "parent.admin"; 75 | } 76 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/config/EnvConfig.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.config; 2 | 3 | /** 4 | * 环境变化的key 5 | */ 6 | public class EnvConfig { 7 | /** 8 | * 代码生成器家目录【根目录】 9 | */ 10 | public static final String SPARROW_CODER_HOME = "SPARROW_CODER_HOME"; 11 | } 12 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/config/ExampleFront.java: -------------------------------------------------------------------------------- 1 | //package com.sparrow.coding.config; 2 | // 3 | //import com.sparrow.coding.protocol.ControlType; 4 | //import com.sparrow.coding.protocol.Entity; 5 | //import com.sparrow.coding.protocol.ColumnDef; 6 | //import com.sparrow.coding.protocol.validate.AllowInputCharLengthValidator; 7 | //import com.sparrow.coding.protocol.validate.AllowOptionsValidator; 8 | //import com.sparrow.coding.protocol.validate.ChineseCharactersValidator; 9 | //import com.sparrow.coding.protocol.validate.DigitalValidator; 10 | //import com.sparrow.coding.protocol.validate.EmailValidator; 11 | //import com.sparrow.coding.protocol.validate.EqualValidator; 12 | //import com.sparrow.coding.protocol.validate.IdCardValidator; 13 | //import com.sparrow.coding.protocol.validate.MobileValidator; 14 | //import com.sparrow.coding.protocol.validate.StringValidator; 15 | //import com.sparrow.coding.protocol.validate.TelValidator; 16 | //import com.sparrow.coding.protocol.validate.UserNameRuleValidator; 17 | //import com.sparrow.protocol.FieldOrder; 18 | // 19 | ///** 20 | // * 示例代码 21 | // */ 22 | //@Entity(name = "sparrowExample", text = "用户") 23 | //public class ExampleFront { 24 | // @ColumnDef(text = "用户ID", primaryKey = true, type = ControlType.INPUT_HIDDEN, listType = ControlType.CHECK_BOX, showInList = true) 25 | // @FieldOrder(order = 1) 26 | // private Long id; 27 | // 28 | // @ColumnDef(text = "用户头象", type = ControlType.IMAGE, listType = ControlType.IMAGE) 29 | // @FieldOrder(order = 1.2F) 30 | // private String avatar; 31 | // 32 | // @ColumnDef(text = "用户名", type = ControlType.INPUT_TEXT, validate = UserNameRuleValidator.class, showInList = true, listType = ControlType.LINK) 33 | // @UserNameRuleValidator(prompt = "请输入6-20个字符(字母、数字或下划线)推荐字母+数字组合的用户名。" 34 | // , nullError = "请输入6-20个字符的用户名") 35 | // @FieldOrder(order = 2) 36 | // private String userName; 37 | // 38 | // 39 | // 40 | // @ColumnDef(text = "状态", type = ControlType.ENABLE_DISABLE, validate = AllowOptionsValidator.class, showInList = true) 41 | // @AllowOptionsValidator(options = {"1", "2", "3"}, defaultValue = "1") 42 | // @FieldOrder(order = 4) 43 | // private String status; 44 | // 45 | // @ColumnDef(text = "年龄", type = ControlType.INPUT_TEXT, validate = DigitalValidator.class, showInList = true) 46 | // @DigitalValidator(prompt = "请输入年龄", allowNull = true, 47 | // digitalError = "年龄必须>0并且<100", minValue = 1, maxValue = 100) 48 | // @FieldOrder(order = 5) 49 | // private String age; 50 | // 51 | // @ColumnDef(text = "E-mail", type = ControlType.INPUT_TEXT, validate = EmailValidator.class, showInList = true) 52 | // @EmailValidator(prompt = "请输入邮箱", emailError = "邮箱格式输入错误", minLength = 10, maxLength = 255, lengthError = "邮箱长度必须>=10 并且<255", setError = "邮箱已存在") 53 | // @FieldOrder(order = 6) 54 | // private String email; 55 | // 56 | // @ColumnDef(text = "密码", type = ControlType.INPUT_PASSWORD) 57 | // @StringValidator(prompt = "请输入密码", nullError = "用户密码不允许为空", allowNull = false, minLength = 6, maxLength = 20, lengthError = "密码要求6-20位字符") 58 | // @FieldOrder(order = 6.1f) 59 | // private String password; 60 | // 61 | // @ColumnDef(text = "确认密码", type = ControlType.INPUT_PASSWORD, validate = EqualValidator.class) 62 | // @EqualValidator(prompt = "请输入确认密码", 63 | // otherCtrlId = "txtPassword", 64 | // nullError = "确认密码不能为空", 65 | // noEqualError = "两次密码输入不一致", 66 | // minLength = 6, 67 | // maxLength = 30, 68 | // lengthError = "密码长度必须>=6 并且小于30" 69 | // ) 70 | // @FieldOrder(order = 7) 71 | // private String confirmPassword; 72 | // 73 | // @ColumnDef(text = "身份证号码", type = ControlType.INPUT_TEXT, validate = IdCardValidator.class, showInList = true) 74 | // @IdCardValidator( 75 | // prompt = "请输入身份证号码", 76 | // nullError = "身份证号码不允许为空", 77 | // minLength = 18, 78 | // maxLength = 18, 79 | // idCardError = "身份证号码输入有误", 80 | // lengthError = "请输入18位身份证号码", 81 | // allowNull = true) 82 | // @FieldOrder(order = 9) 83 | // private String idCard; 84 | // 85 | // @ColumnDef(text = "手机号", type = ControlType.INPUT_TEXT, validate = MobileValidator.class) 86 | // @MobileValidator 87 | // @FieldOrder(order = 10) 88 | // private String mobile; 89 | // 90 | // @ColumnDef(text = "电话号码", type = ControlType.INPUT_TEXT, validate = TelValidator.class, showInList = true) 91 | // @TelValidator 92 | // @FieldOrder(order = 11) 93 | // private String tel; 94 | // 95 | // 96 | // 97 | // @ColumnDef(text = "真实姓名", type = ControlType.INPUT_TEXT, validate = ChineseCharactersValidator.class) 98 | // @ChineseCharactersValidator(nullError = "请输入真实姓名",chineseCharactersError = "请输入中文") 99 | // @FieldOrder(order = 13) 100 | // private String name; 101 | // 102 | // @ColumnDef(text = "备注", type = ControlType.TEXT_AREA, validate = AllowInputCharLengthValidator.class) 103 | // @AllowInputCharLengthValidator(maxAllowCharLength = 512, allowCharLengthShowControlId = "spanAllowCharLength") 104 | // @FieldOrder(order = 14) 105 | // private String remark; 106 | //} 107 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/config/MybatisMethodConfig.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.config; 2 | 3 | public class MybatisMethodConfig { 4 | public static String CHANGE_STATUS = "change_status"; 5 | public static String PARAMETER_TYPE = "parameter_type"; 6 | public static String MODIFIED_CONDITION = "modified_condition"; 7 | } 8 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/enums/FrontendPlaceholderKey.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.enums; 2 | 3 | /** 4 | * 前缀配置的placeholder 5 | */ 6 | public enum FrontendPlaceholderKey { 7 | 8 | /** 9 | * 实体对象名称 比如:用户对象名 user 10 | */ 11 | $entity_name, 12 | /** 13 | * 实体对象中文描述 比如 用户 14 | */ 15 | $entity_text, 16 | 17 | /** 18 | * "-"转换实体对象 比如example-front 19 | */ 20 | $entity_by_horizontal, 21 | 22 | /** 23 | * "/"转换实体对象 比如example/front 24 | */ 25 | $entity_by_slash, 26 | 27 | 28 | /** 29 | * 主键 key 30 | */ 31 | $primary_key, 32 | /** 33 | * 实体对象名称 比喻:用户对象名 User 34 | */ 35 | $upper_entity_name, 36 | /** 37 | * 字段的中文描述 比如:用户名 38 | */ 39 | $field_text, 40 | /** 41 | * 比如:userName 42 | */ 43 | $property_name, 44 | /** 45 | * 首字段大写的属性名称 比如:UserName 46 | */ 47 | $upper_property_name, 48 | /** 49 | * 在管理显示的宽度 80px 50 | */ 51 | $width, 52 | /** 53 | * 管理页面的头行html 54 | */ 55 | $manage_header_line, 56 | /** 57 | * 管理页面的数据行html 58 | */ 59 | $manage_data_table, 60 | 61 | /** 62 | * java 工程工作目录 63 | */ 64 | $workspace, 65 | 66 | /** 67 | * 资源文件工程目录 68 | */ 69 | $resource_workspace, 70 | /** 71 | * 项目 72 | */ 73 | $project 74 | } 75 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/AbstractValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.DigitalCategory; 4 | import com.sparrow.coding.api.ValidatorMessageGenerator; 5 | import com.sparrow.coding.api.ValidatorRegistry; 6 | import com.sparrow.coding.protocol.validate.DigitalValidator; 7 | import com.sparrow.coding.protocol.validate.StringValidator; 8 | import com.sparrow.coding.protocol.validate.Validator; 9 | import com.sparrow.container.Container; 10 | import com.sparrow.container.ContainerAware; 11 | import com.sparrow.core.Pair; 12 | import com.sparrow.utility.StringUtility; 13 | import lombok.extern.slf4j.Slf4j; 14 | import org.springframework.beans.factory.InitializingBean; 15 | 16 | import java.util.List; 17 | 18 | @Slf4j 19 | public abstract class AbstractValidatorMessageGenerator implements ValidatorMessageGenerator, InitializingBean, ContainerAware { 20 | private ValidatorRegistry registry = ValidatorRegistry.getInstance(); 21 | 22 | public AbstractValidatorMessageGenerator() { 23 | } 24 | 25 | /** 26 | * 生成示例 27 | *

 28 |      * age: v.pipe(
 29 |      *         v.string(),// 初始字符串输入
 30 |      *         v.transform((input): number | string => {
 31 |      *             //是否为浮点数
 32 |      *             const match = /^-?\d+$/.test(input);
 33 |      *             if (match) {
 34 |      *                 return parseInt(input);
 35 |      *             }
 36 |      *             return input;
 37 |      *         }),
 38 |      *         v.number("请输入数字"), // 确保转换后为数字类型
 39 |      *         v.minValue(1, '年龄不能小于1岁'),
 40 |      *         v.maxValue(100, '年龄不能超过100岁'),
 41 |      *         v.nonEmpty("Please enter your password."),
 42 |      *         v.minLength(8, "Your password must have 8 characters or more.")
 43 |      *     )
 44 |      * 
45 | * 对应AppName:{ 46 | * * @return 47 | */ 48 | protected String pipeline() { 49 | return "v.pipe(\n v.string()"; 50 | } 51 | 52 | protected String getMessage(Validator validator, String i18nKey, String message) { 53 | if (validator.getI18n()) { 54 | List> configList = validator.getI18nConfig(); 55 | configList.add(new Pair<>(i18nKey, message)); 56 | return String.format("translate(\"%1$s.%2$s\")", validator.getI18nFieldName(), i18nKey); 57 | } 58 | return String.format("\"%s\"", message); 59 | } 60 | 61 | protected String nonEmpty(T validator) { 62 | if (!validator.getAllowEmpty()) { 63 | return String.format(",\nv.nonEmpty(%s)", this.getMessage(validator, "empty-message", validator.getEmptyMessage())); 64 | } 65 | return ""; 66 | } 67 | 68 | protected String allowEmpty(String pipeline) { 69 | return String.format("v.union([v.literal(\"\"),%s], (issue) => {" + 70 | " if (issue.issues) {\n" + 71 | " return issue.issues[issue.issues.length - 1].message;\n" + 72 | " }\n" + 73 | " return \"\";\n" + 74 | " })", pipeline); 75 | } 76 | 77 | 78 | protected void finish(StringBuilder sb) { 79 | sb.append(")\n"); 80 | } 81 | 82 | @Override 83 | public void afterPropertiesSet() { 84 | this.registry.registry(this); 85 | } 86 | 87 | @Override 88 | public void aware(Container container, String s) { 89 | this.registry.registry(this); 90 | } 91 | 92 | protected String minLength(StringValidator validator) { 93 | return String.format(",\n v.minLength(%1$s, %2$s)", validator.getMinLength(), this.getMessage(validator, "min-length-message", validator.getMinLengthMessage())); 94 | } 95 | 96 | protected String maxLength(StringValidator validator) { 97 | return String.format(",\nv.maxLength(%1$s, %2$s)", validator.getMaxLength(), this.getMessage(validator, "max-length-message", validator.getMaxLengthMessage())); 98 | } 99 | 100 | 101 | /** 102 | * v.check((val) => {return /^\d+$/.test(val);}, "请输入数字"), 103 | * * @return 104 | */ 105 | protected String check(T validator, String regex, String message) { 106 | return String.format(",\nv.check((val) => {return /%1$s/.test(val);},%2$s)", regex, this.getMessage(validator, "check-message", message)); 107 | } 108 | 109 | protected String transform(DigitalCategory category) { 110 | return String.format(",\nv.transform((input): number | string => {return %s;})", category.getConverter()); 111 | } 112 | 113 | protected String minValue(DigitalValidator validator) { 114 | return String.format(",\nv.minValue(%1$s, %2$s)", validator.getMinValue(), this.getMessage(validator, "min-value-message", validator.getMinValueMessage())); 115 | } 116 | 117 | protected String maxValue(DigitalValidator validator) { 118 | return String.format(",\n v.maxValue(%1$s, %2$s)", validator.getMaxValue(), this.getMessage(validator, "max-value-message", validator.getMaxValueMessage())); 119 | } 120 | 121 | protected abstract String outerGenerateMessage(String propertyName, T validator); 122 | 123 | public String generateConfig(String propertyName, T validator) { 124 | if (validator.getI18n()) { 125 | validator.setI18nFieldName(propertyName); 126 | } 127 | String message = this.outerGenerateMessage(propertyName, validator); 128 | return String.format("%1$s:\n%2$s\n", propertyName, message); 129 | } 130 | 131 | public String generateI18NConfig(T validator) { 132 | if (!validator.getI18n()) { 133 | return ""; 134 | } 135 | StringBuilder sb = new StringBuilder(); 136 | for (Pair pair : validator.getI18nConfig()) { 137 | sb.append(String.format("\"%1$s\":\"%2$s\",\n", pair.getFirst(), pair.getSecond())); 138 | } 139 | return sb.toString(); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/ChineseCharactersValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.RegexValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class ChineseCharactersValidatorMessageGenerator extends RegexValidatorMessageGenerator { 9 | 10 | @Override 11 | public String outerGenerateMessage(String propertyName, RegexValidator validator) { 12 | validator.setRegex("/^[\\u4e00-\\u9fa5]+/"); 13 | return super.outerGenerateMessage(propertyName, validator); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/DigitalValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.DigitalValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class DigitalValidatorMessageGenerator extends AbstractValidatorMessageGenerator { 9 | @Override 10 | public String outerGenerateMessage(String propertyName, DigitalValidator validator) { 11 | StringBuilder pipeline = new StringBuilder(); 12 | pipeline.append(this.pipeline()); 13 | pipeline.append(this.nonEmpty(validator)); 14 | pipeline.append(this.check(validator, validator.getCategory().getRegex(), validator.getDigitalMessage())); 15 | pipeline.append(this.transform(validator.getCategory())); 16 | pipeline.append(this.minValue(validator)); 17 | pipeline.append(this.maxValue(validator)); 18 | this.finish(pipeline); 19 | if (validator.getAllowEmpty()) { 20 | return this.allowEmpty(pipeline.toString()); 21 | } 22 | return pipeline.toString(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/EmailValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.RegexValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class EmailValidatorMessageGenerator extends AbstractValidatorMessageGenerator{ 9 | 10 | @Override 11 | public String outerGenerateMessage(String propertyName, RegexValidator validator){ 12 | StringBuilder pipeline = new StringBuilder(); 13 | pipeline.append(this.pipeline()); 14 | pipeline.append(this.nonEmpty(validator)); 15 | pipeline.append(this.minLength(validator)); 16 | pipeline.append(this.maxLength(validator)); 17 | pipeline.append(String.format(",\nv.email(%s)",this.getMessage(validator,"email-message",validator.getFormatMessage()))); 18 | this.finish(pipeline); 19 | if (validator.getAllowEmpty()) { 20 | return this.allowEmpty(pipeline.toString()); 21 | } 22 | return pipeline.toString(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/IdCardValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.RegexValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class IdCardValidatorMessageGenerator extends RegexValidatorMessageGenerator { 9 | 10 | //https://www.66zan.cn/regexdso/ 11 | @Override 12 | public String outerGenerateMessage(String propertyName, RegexValidator validator) { 13 | validator.setRegex("^(\\d{15}|\\d{17}[\\dXx])$"); 14 | return super.outerGenerateMessage(propertyName, validator); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/MobileValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.RegexValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class MobileValidatorMessageGenerator extends RegexValidatorMessageGenerator { 9 | @Override 10 | public String outerGenerateMessage(String propertyName, RegexValidator validator) { 11 | validator.setRegex("^1\\d{10}$"); 12 | return super.outerGenerateMessage(propertyName, validator); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/RegexValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.RegexValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class RegexValidatorMessageGenerator extends AbstractValidatorMessageGenerator { 9 | 10 | //https://www.66zan.cn/regexdso/ 11 | @Override 12 | public String outerGenerateMessage(String propertyName, RegexValidator validator) { 13 | StringBuilder pipeline = new StringBuilder(); 14 | pipeline.append(this.pipeline()); 15 | pipeline.append(this.nonEmpty(validator)); 16 | pipeline.append(this.check(validator,validator.getRegex(),validator.getFormatMessage())); 17 | this.finish(pipeline); 18 | if (validator.getAllowEmpty()) { 19 | return this.allowEmpty(pipeline.toString()); 20 | } 21 | return pipeline.toString(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/StringValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.StringValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class StringValidatorMessageGenerator extends AbstractValidatorMessageGenerator { 9 | 10 | 11 | @Override 12 | public String outerGenerateMessage(String propertyName, StringValidator validator) { 13 | StringBuilder pipeline = new StringBuilder(); 14 | pipeline.append(this.pipeline()); 15 | pipeline.append(this.nonEmpty(validator)); 16 | pipeline.append(this.minLength(validator)); 17 | pipeline.append(this.maxLength(validator)); 18 | this.finish(pipeline); 19 | if (validator.getAllowEmpty()) { 20 | return this.allowEmpty(pipeline.toString()); 21 | } 22 | return pipeline.toString(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/frontend/validate/valibot/TelValidatorMessageGenerator.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.frontend.validate.valibot; 2 | 3 | import com.sparrow.coding.protocol.validate.RegexValidator; 4 | 5 | import javax.inject.Named; 6 | 7 | @Named 8 | public class TelValidatorMessageGenerator extends RegexValidatorMessageGenerator { 9 | 10 | @Override 11 | public String outerGenerateMessage(String propertyName, RegexValidator validator) { 12 | validator.setRegex("^(\\d{4}-|\\d{3}-)?(\\d{8}|\\d{7})$"); 13 | return super.outerGenerateMessage(propertyName, validator); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/java/CodeGenerator2.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.java; 2 | 3 | import com.sparrow.coding.java.enums.ClassKey; 4 | import com.sparrow.orm.AbstractEntityManagerAdapter; 5 | import com.sparrow.orm.JDBCTemplate; 6 | import com.sparrow.orm.SparrowEntityManager; 7 | import com.sparrow.protocol.constant.Constant; 8 | import com.sparrow.utility.FileUtility; 9 | import com.sparrow.utility.StringUtility; 10 | import java.io.IOException; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | 14 | public class CodeGenerator2 { 15 | private static Logger logger = LoggerFactory.getLogger(CodeGenerator2.class); 16 | private EnvironmentContext environmentContext; 17 | 18 | public CodeGenerator2(String sparrowConfig) throws IOException { 19 | this.environmentContext = new EnvironmentContext(sparrowConfig); 20 | } 21 | 22 | public void param(Class po) throws IOException { 23 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 24 | tableConfig.write(ClassKey.PARAM); 25 | } 26 | 27 | public void query(Class po) throws IOException { 28 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 29 | tableConfig.write(ClassKey.QUERY); 30 | } 31 | 32 | public void assemble(Class po) throws IOException { 33 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 34 | tableConfig.write(ClassKey.ASSEMBLE); 35 | } 36 | 37 | public void converter(Class po) throws IOException { 38 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 39 | tableConfig.write(ClassKey.DATA_CONVERTER); 40 | } 41 | 42 | public void batchOperate(Class po) throws IOException { 43 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 44 | tableConfig.write(ClassKey.BATCH_OPERATE_PARAM); 45 | } 46 | 47 | public void pagerQuery(Class po) throws IOException { 48 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 49 | tableConfig.write(ClassKey.PAGER_QUERY); 50 | } 51 | 52 | public void vo(Class po) throws IOException { 53 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 54 | tableConfig.write(ClassKey.VO); 55 | } 56 | 57 | public void bo(Class po) throws IOException { 58 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 59 | tableConfig.write(ClassKey.BO); 60 | } 61 | 62 | public void dao(Class po) throws IOException { 63 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 64 | tableConfig.write(ClassKey.DAO); 65 | } 66 | 67 | public void daoImpl(Class po) throws IOException { 68 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 69 | tableConfig.write(ClassKey.DAO_IMPL); 70 | } 71 | 72 | public void daoMybatis(Class po) throws IOException { 73 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 74 | tableConfig.writeMybatis(po,environmentContext); 75 | } 76 | 77 | public void service(Class po) throws IOException { 78 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 79 | tableConfig.write(ClassKey.SERVICE); 80 | } 81 | 82 | public void repository(Class po) throws IOException { 83 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 84 | tableConfig.write(ClassKey.REPOSITORY); 85 | } 86 | 87 | public void repositoryImpl(Class po) throws IOException { 88 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 89 | tableConfig.write(ClassKey.REPOSITORY_IMPL); 90 | } 91 | 92 | public void controller(Class po) throws IOException { 93 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 94 | tableConfig.write(ClassKey.CONTROLLER); 95 | } 96 | 97 | public void generaCreateNDDL(String originTableName, Integer n, boolean create) throws IOException { 98 | String originTableFullPath = environmentContext.getTableCreateDDLPath(originTableName); 99 | String originTableContent = FileUtility.getInstance().readFileContent(originTableFullPath); 100 | for (int i = 0; i < n; i++) { 101 | String tempSql = originTableContent.replace(Constant.TABLE_SUFFIX, "_" + i); 102 | this.initTableToDb(create, tempSql); 103 | String destTablePath = environmentContext.getSplitTableCreateDDLPath(originTableName, i); 104 | FileUtility.getInstance().writeFile(destTablePath, tempSql); 105 | System.err.printf("table create ddl write to %s\n", destTablePath); 106 | } 107 | } 108 | 109 | private void initTableToDb(boolean create, String tempSql) { 110 | if (!create) { 111 | return; 112 | } 113 | try { 114 | String[] ddlArray = tempSql.split(";"); 115 | for (String ddl : ddlArray) { 116 | if (!StringUtility.isNullOrEmpty(ddl)) { 117 | JDBCTemplate.getInstance().executeUpdate(ddl); 118 | } 119 | } 120 | } catch (Exception e) { 121 | logger.error("create ddl sql error", e); 122 | } 123 | } 124 | 125 | public void generaCreateDDL(Class po) throws IOException { 126 | EnvironmentContext.Config tableConfig = environmentContext.new Config(po); 127 | AbstractEntityManagerAdapter managerAdapter = new SparrowEntityManager(po); 128 | String tablePath = this.environmentContext.getTableCreateDDLPath(tableConfig.getOriginTableName()); 129 | String sql = managerAdapter.getCreateDDL(); 130 | System.err.println(sql); 131 | FileUtility.getInstance().writeFile(tablePath, sql); 132 | System.err.printf("table create ddl write to %s\n", tablePath); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/java/ScaffoldCopier.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.java; 2 | 3 | import com.sparrow.coding.api.TableConfigRegistry; 4 | import com.sparrow.coding.po.ProjectConfig; 5 | import com.sparrow.io.file.FileNameBuilder; 6 | import com.sparrow.utility.FileUtility; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | 10 | import javax.inject.Named; 11 | import java.io.File; 12 | import java.io.IOException; 13 | 14 | /** 15 | * 1. 递归遍历目录,并复制全部文件 16 | * 1.1 文件IO的API操作 17 | * 1.2 递归算法 18 | * 2. 对应的artifactId 替换为指定的名字 19 | * 3. 依赖他的所有的pom 也需要替换 20 | */ 21 | @Named 22 | public class ScaffoldCopier { 23 | private static Logger logger = LoggerFactory.getLogger(ScaffoldCopier.class); 24 | 25 | static void copy(TableConfigRegistry registry) { 26 | String scaffoldHome =new FileNameBuilder(registry.getWorkspace()).joint(registry.getScaffold()).build(); 27 | File directory = new File(scaffoldHome); 28 | FileUtility.FolderFilter folderFilter = (sourceFile) -> { 29 | //如果是隐藏文件夹,跳过 30 | if (sourceFile.startsWith(".")) { 31 | return true; 32 | } 33 | //如果是target文件夹,跳过 34 | if (sourceFile.contains("target") || sourceFile.equalsIgnoreCase("target")) { 35 | return true; 36 | } 37 | return false; 38 | }; 39 | 40 | String[] directoryList = directory.list(); 41 | if (directoryList == null || directoryList.length == 0) { 42 | logger.error("directory [{}] is empty", scaffoldHome); 43 | return; 44 | } 45 | ProjectConfig projectConfig = registry.getProjectConfig(); 46 | for (String childDirectory : directoryList) { 47 | //过滤掉不需要的文件夹 48 | if (folderFilter.filter(childDirectory)) { 49 | continue; 50 | } 51 | 52 | String sourceDirectoryPath =new FileNameBuilder(scaffoldHome).joint(childDirectory).build(); 53 | FileUtility.getInstance().recurseCopy(sourceDirectoryPath, (sourceFileName) -> { 54 | String targetPath = sourceFileName.replace(scaffoldHome, "").replace("example", projectConfig.getModulePrefix()); 55 | targetPath =new FileNameBuilder(registry.getWorkspace()).joint(String.valueOf(projectConfig.getCreateUserId())) 56 | .joint(registry.getProjectConfig().getName()).joint(targetPath).build() 57 | ; 58 | String content = FileUtility.getInstance().readFileContent(sourceFileName); 59 | content = content.replaceAll("example", projectConfig.getModulePrefix()); 60 | try { 61 | FileUtility.getInstance().writeFile(targetPath, content); 62 | } catch (IOException e) { 63 | throw new RuntimeException(e); 64 | } 65 | }, folderFilter); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/java/enums/ClassKey.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.java.enums; 2 | 3 | /** 4 | * 生成类的key 5 | *

6 | * 通过 class.{name}找到类名 通过 package.{name}找到包名 通过 module.{module} 找到模块名 7 | *

8 | * 通过该key 的配置找到对应的子模块名,包名及类名 9 | *

10 | * 具体的配置见config.properties 11 | */ 12 | public enum ClassKey { 13 | PO("", "persistence"), 14 | BO("bo.txt", "domain"), 15 | PARAM("param.txt", "protocol"), 16 | QUERY("query.txt", "protocol"), 17 | DTO("dto.txt", "protocol"), 18 | CONTROLLER("controller.txt", "adapter"), 19 | VO("vo.txt", "adapter"), 20 | DAO("dao.txt", "dao.api"), 21 | DAO_MYBATIS("mybatis.properties", "dao.mybatis"), 22 | DAO_IMPL("daoImpl.txt", "dao.sparrow"), 23 | SERVICE("service.txt", "domain"), 24 | ASSEMBLE("assemble.txt", "adapter"), 25 | REPOSITORY("repository.txt", "domain"), 26 | REPOSITORY_IMPL("repositoryImpl.txt", "infrastructure"), 27 | DATA_CONVERTER("dataConverter.txt", "infrastructure"), 28 | PAGER_QUERY("pagerQuery.txt", "dao.api"), 29 | BATCH_OPERATE_PARAM("batchOperateParam.txt", "protocol"); 30 | 31 | private String template; 32 | private String module; 33 | 34 | public String getTemplate() { 35 | return template; 36 | } 37 | 38 | ClassKey(String template, String module) { 39 | this.template = template; 40 | this.module = module; 41 | } 42 | 43 | public String getModule() { 44 | return module; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/java/enums/PlaceholderKey.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.java.enums; 2 | 3 | public enum PlaceholderKey { 4 | /** 5 | * e.g. @author harry 6 | */ 7 | $author, 8 | 9 | /** 10 | * 代码生成器的家目录 11 | */ 12 | $coder_home, 13 | 14 | /** 15 | * 项目的工作目录 16 | */ 17 | $workspace, 18 | 19 | /** 20 | * 项目名 21 | */ 22 | $project, 23 | /** 24 | * origin table name e.g user_address 25 | */ 26 | $origin_table_name, 27 | 28 | /** 29 | * e.g UserAddress 30 | */ 31 | $persistence_class_name, 32 | 33 | /** 34 | * first case lower table name e.g userAddress 35 | */ 36 | $persistence_object_name, 37 | 38 | /** 39 | * 示例 user-address 40 | */ 41 | $persistence_object_by_horizontal, 42 | 43 | /** 44 | * 示例 user/address 45 | */ 46 | $persistence_object_by_slash, 47 | 48 | /** 49 | * 示例 user.address 50 | */ 51 | $persistence_object_by_dot, 52 | 53 | /** 54 | * 项目 55 | */ 56 | $module_prefix, 57 | 58 | /** 59 | * po: e.g com.sparrow.user.po 60 | */ 61 | $package_po, 62 | 63 | /** 64 | * po: e.g com.sparrow.user.bo 65 | */ 66 | $package_bo, 67 | 68 | /** 69 | * po: e.g com.sparrow.user.param 70 | */ 71 | $package_param, 72 | 73 | /** 74 | * batch operate param package 75 | */ 76 | $package_batch_param, 77 | 78 | /** 79 | * po: e.g com.sparrow.user.query 80 | */ 81 | $package_query, 82 | 83 | /** 84 | * po: e.g com.sparrow.user.dto 85 | */ 86 | $package_dto, 87 | 88 | /** 89 | * po: e.g com.sparrow.user.vo 90 | */ 91 | $package_vo, 92 | 93 | /** 94 | * dao e.g com.sparrow.user.dao 95 | */ 96 | $package_dao, 97 | 98 | $package_pager_query, 99 | 100 | 101 | /** 102 | * dao impl e.g com.sparrow.user.dao.impl 103 | */ 104 | $package_dao_impl, 105 | 106 | /** 107 | * dao e.g com.sparrow.user.repository 108 | */ 109 | $package_repository, 110 | 111 | /** 112 | * dao impl e.g com.sparrow.user.dao.repository.impl 113 | */ 114 | $package_repository_impl, 115 | 116 | $package_data_converter, 117 | 118 | $package_assemble, 119 | 120 | /** 121 | * service e.g com.sparrow.user.service 122 | */ 123 | $package_service, 124 | 125 | /** 126 | * controller e.g com.sparrow.user.controller 127 | */ 128 | $package_controller, 129 | 130 | /** 131 | * User 132 | */ 133 | $class_po, 134 | 135 | /** 136 | * UserDao 137 | */ 138 | $class_dao, 139 | 140 | /** 141 | * UserService 142 | */ 143 | $class_service, 144 | 145 | /** 146 | * Repository 147 | */ 148 | $class_repository, 149 | 150 | /** 151 | * Repository impl 152 | */ 153 | $class_repositoryImpl, 154 | 155 | /** 156 | * UserDaoImpl 157 | */ 158 | $class_impl_dao, 159 | 160 | /** 161 | * UserController 162 | */ 163 | $class_controller, 164 | 165 | /** 166 | * primary property name e.g userId 167 | */ 168 | $primary_property_name, 169 | 170 | /** 171 | * e.g UserId 172 | */ 173 | $upper_primary_property_name, 174 | 175 | $primary_type, 176 | 177 | /** 178 | * userDao 179 | */ 180 | $object_dao, 181 | 182 | /** 183 | * userService 184 | */ 185 | $object_service, 186 | 187 | /** 188 | * current date 2018-11-15 189 | */ 190 | $date, 191 | 192 | /*for mybatis */ 193 | 194 | $result_map, 195 | 196 | $sql_insert, 197 | 198 | $sql_query_one, 199 | 200 | $sql_update, 201 | 202 | $sql_delete, 203 | 204 | $field_list, 205 | 206 | $get_sets 207 | 208 | } 209 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/support/utils/ConfigUtils.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.support.utils; 2 | 3 | import com.sparrow.utility.StringUtility; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | import java.io.*; 7 | import java.nio.file.Files; 8 | import java.util.Properties; 9 | 10 | @Slf4j 11 | public class ConfigUtils { 12 | public static Properties initPropertyConfig(String configContent) throws IOException { 13 | Properties config = new Properties(); 14 | if (!StringUtility.isNullOrEmpty(configContent)) { 15 | log.info("load config from file: " + configContent); 16 | config.load(new StringReader(configContent)); 17 | return config; 18 | } 19 | InputStream configStream = ConfigUtils.class.getResourceAsStream("/config.properties"); 20 | config.load(configStream); 21 | return config; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /coder/src/main/java/com/sparrow/coding/support/utils/PinyinUtil.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.support.utils; 2 | 3 | import net.sourceforge.pinyin4j.PinyinHelper; 4 | import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; 5 | import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; 6 | import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; 7 | import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; 8 | import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; 9 | 10 | public class PinyinUtil { 11 | /** 12 | * 将汉字转换为全拼 13 | * 14 | * @param src 15 | * @return String 16 | */ 17 | public static String getPinYin(String src) { 18 | char[] tempCharArray = null; 19 | tempCharArray = src.toCharArray(); 20 | String[] tempCahrArray2 = new String[tempCharArray.length]; 21 | // 设置汉字拼音输出的格式 22 | HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat(); 23 | t3.setCaseType(HanyuPinyinCaseType.LOWERCASE); 24 | t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 25 | t3.setVCharType(HanyuPinyinVCharType.WITH_V); 26 | String pinyin = ""; 27 | int charLength = tempCharArray.length; 28 | try { 29 | for (int i = 0; i < charLength; i++) { 30 | // 判断是否为汉字字符 31 | // System.out.println(t1[i]); 32 | if (Character.toString(tempCharArray[i]).matches( 33 | "[\\u4E00-\\u9FA5]+")) { 34 | tempCahrArray2 = PinyinHelper.toHanyuPinyinStringArray( 35 | tempCharArray[i], t3);// 将汉字的几种全拼都存到t2数组中 36 | pinyin += tempCahrArray2[0];// 取出该汉字全拼的第一种读音并连接到字符串t4后 37 | } else { 38 | // 如果不是汉字字符,直接取出字符并连接到字符串t4后 39 | pinyin += Character.toString(tempCharArray[i]); 40 | } 41 | } 42 | } catch (BadHanyuPinyinOutputFormatCombination e) { 43 | // TODO Auto-generated catch block 44 | e.printStackTrace(); 45 | } 46 | return pinyin; 47 | } 48 | 49 | /** 50 | * 提取每个汉字的首字母 51 | * 52 | * @param str 53 | * @return String 54 | */ 55 | public static String getPinYinHeadChar(String str) { 56 | String convert = ""; 57 | for (int j = 0; j < str.length(); j++) { 58 | char word = str.charAt(j); 59 | // 提取汉字的首字母 60 | String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); 61 | if (pinyinArray != null) { 62 | convert += pinyinArray[0].charAt(0); 63 | } else { 64 | convert += word; 65 | } 66 | } 67 | return convert; 68 | } 69 | 70 | /** 71 | * 将字符串转换成ASCII码 72 | * 73 | * @param cnStr 74 | * @return String 75 | */ 76 | public static String getCnASCII(String cnStr) { 77 | StringBuffer strBuf = new StringBuffer(); 78 | // 将字符串转换成字节序列 79 | byte[] bGBK = cnStr.getBytes(); 80 | for (int i = 0; i < bGBK.length; i++) { 81 | // System.out.println(Integer.toHexString(bGBK[i] & 0xff)); 82 | // 将每个字符转换成ASCII码 83 | strBuf.append(Integer.toHexString(bGBK[i] & 0xff) + " "); 84 | } 85 | return strBuf.toString(); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /coder/src/main/resources/Licensed.txt: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one or more 3 | * contributor license agreements. See the NOTICE file distributed with 4 | * this work for additional information regarding copyright ownership. 5 | * The ASF licenses this file to You under the Apache License, Version 2.0 6 | * (the "License"); you may not use this file except in compliance with 7 | * the License. You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ -------------------------------------------------------------------------------- /coder/src/main/resources/beans.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /coder/src/main/resources/config.properties: -------------------------------------------------------------------------------- 1 | module.persistence=$module_prefix-po 2 | module.parent.admin=admin 3 | module.admin.adapter=$module_prefix-admin-adapter 4 | module.admin.dao.api=$module_prefix-admin-dao-api 5 | module.admin.domain=$module_prefix-admin-domain 6 | module.admin.infrastructure=$module_prefix-admin-infrastructure 7 | module.admin.main.boot=$module_prefix-admin-main-spring-boot 8 | module.admin.protocol=$module_prefix-admin-protocol 9 | module.admin.dao.sparrow=$module_prefix-admin-dao-sparrow 10 | module.admin.dao.mybatis=$module_prefix-admin-dao-mybatis 11 | 12 | 13 | 14 | package.po=po 15 | package.bo=admin.domain.bo 16 | package.query=admin.protocol.query 17 | package.param=admin.protocol.param 18 | package.vo=admin.adapter.protocol.vo 19 | package.dao=admin.dao 20 | package.service=admin.domain.service 21 | package.dao_impl=admin.dao.sparrow 22 | package.dao_mybatis=admin.dao.mybatis 23 | package.repository_impl=admin.infrastructure.persistence 24 | package.repository=admin.repository 25 | package.controller=admin.adapter.controller 26 | package.assemble=admin.adapter.assemble 27 | package.data_converter=admin.infrastructure.persistence.data.converter 28 | package.pager_query=admin.dao.query 29 | package.batch_operate_param=admin.protocol.param.batch 30 | 31 | 32 | class.po=$persistence_class_name 33 | class.assemble=$persistence_class_nameAssemble 34 | class.query=$persistence_class_nameQuery 35 | class.bo=$persistence_class_nameBO 36 | class.param=$persistence_class_nameParam 37 | class.vo=$persistence_class_nameVO 38 | class.dao=$persistence_class_nameDAO 39 | class.repository=$persistence_class_nameRepository 40 | class.repository_impl=$persistence_class_nameRepositoryImpl 41 | class.service=$persistence_class_nameService 42 | class.dao_impl=$persistence_class_nameDaoImpl 43 | class.dao_mybatis=$persistence_class_nameMapper 44 | 45 | class.controller=$persistence_class_nameController 46 | class.data_converter=$persistence_class_nameConverter 47 | class.pager_query=$persistence_class_nameDBPagerQuery 48 | class.batch_operate_param=$persistence_class_nameBatchOperateParam 49 | 50 | 51 | -------------------------------------------------------------------------------- /coder/src/main/resources/jar-with-dependencies.xml: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | 26 | 27 | 30 | all 31 | 32 | jar 33 | 34 | false 35 | 36 | 37 | 38 | / 39 | false 40 | 41 | true 42 | compile 43 | 44 | 45 | 46 | 47 | ${project.build.outputDirectory} 48 | / 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /coder/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | [%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %thread %logger{0} %m%n 7 | 8 | 9 | 10 | 11 | ${LOG_HOME}/error.log 12 | 13 | ${LOG_HOME}/error.log.%d{yyyy-MM-dd}-{i}.log 14 | 30 15 | 16 | 17 | %d{yyyy-MM-dd HH:mm:ss.SSS} TRACE_ID %-5level %thread %logger{0} %m%n 18 | 19 | 20 | 21 | ERROR 22 | ACCEPT 23 | DENY 24 | 25 | 26 | 10MB 27 | 28 | 29 | 30 | 31 | ${LOG_HOME}/warn.log 32 | 33 | ${LOG_HOME}/warn.log.%d{yyyy-MM-dd}-{i}.log 34 | 30 35 | 36 | 37 | %d{yyyy-MM-dd HH:mm:ss.SSS} TRACE_ID %-5level %thread %logger{0} %m%n 38 | 39 | 40 | 41 | WARN 42 | ACCEPT 43 | DENY 44 | 45 | 46 | 10MB 47 | 48 | 49 | 50 | 51 | ${LOG_HOME}/info.log 52 | 53 | ${LOG_HOME}/info.log.%d{yyyy-MM-dd}-{i}.log 54 | 30 55 | 56 | 57 | %d{yyyy-MM-dd HH:mm:ss.SSS} TRACE_ID %-5level %thread %logger{0} %m%n 58 | 59 | 60 | 61 | INFO 62 | ACCEPT 63 | DENY 64 | 65 | 66 | 10MB 67 | 68 | 69 | 70 | 71 | 72 | ${LOG_HOME}/debug.log 73 | 74 | ${LOG_HOME}/debug.log.%d{yyyy-MM-dd}-{i}.log 75 | 30 76 | 77 | 78 | %d{yyyy-MM-dd HH:mm:ss.SSS} TRACE_ID %-5level %thread %logger{0} %m%n 79 | 80 | 81 | 82 | DEBUG 83 | ACCEPT 84 | DENY 85 | 86 | 87 | 10MB 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /coder/src/main/resources/release-assembly.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | tar.gz 4 | 5 | false 6 | 7 | 8 | ../example-po/bin 9 | bin 10 | 11 | 12 | src/main/resources/template 13 | template 14 | 15 | 16 | target 17 | / 18 | 19 | sparrow-coder-all.jar 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /coder/src/main/resources/scaffold.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparrowzoo/sparrow-coder/80a64e1317dbb11b8572d519e491b2f4bbeef990/coder/src/main/resources/scaffold.properties -------------------------------------------------------------------------------- /coder/src/main/resources/sparrow_default.properties: -------------------------------------------------------------------------------- 1 | driverClassName=org.gjt.mm.mysql.Driver 2 | username=root 3 | password=11111111 4 | url=jdbc:mysql://127.0.0.1/sparrow?useSSL=false&autoReconnect=true&failOverReadOnly=false&useUnicode=true&characterEncoding=utf-8 5 | poolSize=1 6 | 7 | #mybatis 8 | dao=sparrow 9 | -------------------------------------------------------------------------------- /coder/src/main/resources/sparrow_generator.dtd: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /coder/src/main/resources/system_config.properties: -------------------------------------------------------------------------------- 1 | workspace=/Users/zhanglizhi/workspace 2 | scaffold=/sparrow-example 3 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/admin_copier.properties: -------------------------------------------------------------------------------- 1 | workspace=${user.home}/workspace/tedu/ 2 | target=/tarena-tea-wrap-admin/src/main/java 3 | resource_target=/tarena-tea-wrap-admin/src/main/resources 4 | sources=\ 5 | tarena_tp_attach,\ 6 | tarena_tp_attach/attach-admin,\ 7 | tarena_tp_attach/attach-server,\ 8 | tarena-tp-basic,\ 9 | tarena-tp-basic/basic-admin,\ 10 | cs-mall-order,\ 11 | cs-mall-order/order-admin,\ 12 | cs-mall-goods,\ 13 | cs-mall-goods/simple-goods-admin,\ 14 | cs-mall-goods/simple-goods-server,\ 15 | cs-mall-stock,\ 16 | cs-mall-stock/stock-admin,\ 17 | tarena-tp-tea,\ 18 | tarena-tp-tea/tea-admin,\ 19 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/assemble.txt: -------------------------------------------------------------------------------- 1 | package $package_assemble; 2 | 3 | import $package_bo.$persistence_class_nameBO; 4 | import $package_vo.$persistence_class_nameVO; 5 | import com.tedu.inn.protocol.ListRecordTotalBO; 6 | import com.tedu.inn.protocol.pager.PagerResult; 7 | import com.tedu.inn.protocol.pager.SimplePagerQuery; 8 | import java.util.ArrayList; 9 | import java.util.Collections; 10 | import java.util.List; 11 | import org.apache.commons.collections.CollectionUtils; 12 | import org.springframework.beans.BeanUtils; 13 | import org.springframework.stereotype.Component; 14 | 15 | @Component 16 | public class $persistence_class_nameAssemble { 17 | public $persistence_class_nameVO assembleBO2VO($persistence_class_nameBO bo) { 18 | $persistence_class_nameVO $persistence_object_name = new $persistence_class_nameVO(); 19 | BeanUtils.copyProperties(bo, $persistence_object_name); 20 | return $persistence_object_name; 21 | } 22 | 23 | public List<$persistence_class_nameVO> boListAssembleVOList(List<$persistence_class_nameBO> list) { 24 | if (CollectionUtils.isEmpty(list)) { 25 | return Collections.emptyList(); 26 | } 27 | List<$persistence_class_nameVO> $persistence_object_nameVOList = new ArrayList<>(list.size()); 28 | for ($persistence_class_nameBO $persistence_object_nameBo : list) { 29 | $persistence_class_nameVO $persistence_object_nameVo = this.assembleBO2VO($persistence_object_nameBo); 30 | $persistence_object_nameVOList.add($persistence_object_nameVo); 31 | } 32 | return $persistence_object_nameVOList; 33 | } 34 | 35 | public PagerResult<$persistence_class_nameVO> assemblePagerResult(ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord, 36 | SimplePagerQuery $persistence_object_nameQuery) { 37 | List<$persistence_class_nameVO> $persistence_object_nameVOList = this.boListAssembleVOList($persistence_object_nameListTotalRecord.getList()); 38 | PagerResult<$persistence_class_nameVO> pagerResult = new PagerResult<>($persistence_object_nameQuery); 39 | pagerResult.setObjects($persistence_object_nameVOList); 40 | pagerResult.setTotal($persistence_object_nameListTotalRecord.getTotal()); 41 | return pagerResult; 42 | } 43 | } -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/batchOperateParam.txt: -------------------------------------------------------------------------------- 1 | package $package_batch_param; 2 | 3 | import $package_query.$persistence_class_nameQuery; 4 | 5 | public class $persistence_class_nameBatchOperateParam extends $persistence_class_nameQuery { 6 | private String ids; 7 | 8 | public String getIds() { 9 | return ids; 10 | } 11 | 12 | public void setIds(String ids) { 13 | this.ids = ids; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/bo.txt: -------------------------------------------------------------------------------- 1 | package $package_bo; 2 | 3 | public class $persistence_class_nameBO { 4 | $get_sets 5 | } 6 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/controller.txt: -------------------------------------------------------------------------------- 1 | package $package_controller; 2 | 3 | import $package_assemble.$persistence_class_nameAssemble; 4 | import $package_bo.$persistence_class_nameBO; 5 | import $package_service.$persistence_class_nameService; 6 | import $package_param.$persistence_class_nameParam; 7 | import $package_query.$persistence_class_nameQuery; 8 | import $package_vo.$persistence_class_nameVO; 9 | import com.tedu.inn.protocol.ListRecordTotalBO; 10 | import com.tedu.inn.protocol.exception.BusinessException; 11 | import com.tedu.inn.protocol.pager.PagerResult; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.web.bind.annotation.GetMapping; 14 | import org.springframework.web.bind.annotation.PostMapping; 15 | import org.springframework.web.bind.annotation.RequestMapping; 16 | import org.springframework.web.bind.annotation.ResponseBody; 17 | import org.springframework.web.bind.annotation.RestController; 18 | 19 | @RestController 20 | @RequestMapping("$persistence_object_name") 21 | public class $persistence_class_nameController { 22 | @Autowired 23 | private $persistence_class_nameService $persistence_object_nameService; 24 | 25 | @Autowired 26 | private $persistence_class_nameAssemble $persistence_object_nameAssemble; 27 | 28 | @PostMapping("search") 29 | @ResponseBody 30 | public PagerResult<$persistence_class_nameVO> query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameQuery) { 31 | ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord = this.$persistence_object_nameService.query$persistence_class_name($persistence_object_nameQuery); 32 | return this.$persistence_object_nameAssemble.assemblePagerResult($persistence_object_nameListTotalRecord, $persistence_object_nameQuery); 33 | } 34 | 35 | @PostMapping("save") 36 | @ResponseBody 37 | public Long save$persistence_class_name($persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 38 | return this.$persistence_object_nameService.save$persistence_class_name($persistence_object_nameParam); 39 | } 40 | 41 | @GetMapping("get") 42 | public $persistence_class_nameVO get$persistence_class_name(Long $persistence_object_nameId) throws BusinessException { 43 | $persistence_class_nameBO $persistence_object_nameBo = $persistence_object_nameService.get$persistence_class_name($persistence_object_nameId); 44 | return this.$persistence_object_nameAssemble.assembleBO2VO($persistence_object_nameBo); 45 | } 46 | 47 | @PostMapping("delete") 48 | public Integer delete$persistence_class_name(Long id) throws BusinessException { 49 | return this.$persistence_object_nameService.delete$persistence_class_name(id); 50 | } 51 | 52 | @PostMapping("enable") 53 | public Integer enable$persistence_class_name(String ids) throws BusinessException { 54 | return this.$persistence_object_nameService.enable$persistence_class_name(ids); 55 | } 56 | 57 | @PostMapping("disable") 58 | public Integer disable$persistence_class_name(String ids) throws BusinessException { 59 | return this.$persistence_object_nameService.disable$persistence_class_name(ids); 60 | } 61 | } -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/copier.properties: -------------------------------------------------------------------------------- 1 | workspace=${user.home}/workspace/tedu/ 2 | target=/tarena-tea-wrap-server/src/main/java 3 | resource_target=/tarena-tea-wrap-server/src/main/resources 4 | sources=\ 5 | tarena_tp_attach,\ 6 | tarena_tp_attach/attach-server,\ 7 | tarena-tp-basic,\ 8 | tarena-tp-basic/basic-server,\ 9 | cs-mall-order,\ 10 | cs-mall-order/order-server,\ 11 | cs-mall-goods,\ 12 | cs-mall-goods/simple-goods-server,\ 13 | cs-mall-price,\ 14 | cs-mall-shopping-cart,\ 15 | cs-mall-user,\ 16 | cs-mall-stock,\ 17 | cs-mall-stock/stock-server,\ 18 | tarena-tp-tea,\ 19 | tarena-tp-tea/tea-server,\ 20 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/dao.txt: -------------------------------------------------------------------------------- 1 | 2 | package $package_dao; 3 | 4 | import $package_po.$persistence_class_name; 5 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 6 | import com.tedu.inn.protocol.dao.StatusCriteria; 7 | 8 | import java.util.List; 9 | 10 | public interface $persistence_class_nameDAO { 11 | Long insert($persistence_class_name $persistence_object_name); 12 | 13 | Integer delete(Long $persistence_object_nameId); 14 | 15 | Integer update($persistence_class_name $persistence_object_name); 16 | 17 | $persistence_class_name getEntity(Long $persistence_object_nameId); 18 | 19 | Integer changeStatus(StatusCriteria statusCriteria); 20 | 21 | 22 | List<$persistence_class_name> query$persistence_class_names($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery); 23 | 24 | Long count$persistence_class_name($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery); 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/daoImpl.txt: -------------------------------------------------------------------------------- 1 | package $package_dao_impl; 2 | 3 | import com.sparrow.orm.query.BooleanCriteria; 4 | import com.sparrow.orm.query.Criteria; 5 | import com.sparrow.orm.query.SearchCriteria; 6 | import com.sparrow.orm.template.impl.ORMStrategy; 7 | import com.sparrow.$module_prefix.admin.dao.$persistence_class_nameDAO; 8 | import $package_count_query.Count$persistence_class_nameQuery; 9 | import $package_pager_query.Pager$persistence_class_nameQuery; 10 | import $package_po.$persistence_class_name; 11 | import java.util.List; 12 | import javax.inject.Named; 13 | 14 | @Named 15 | public class $persistence_class_nameDaoImpl extends ORMStrategy<$persistence_class_name, Long> implements $persistence_class_nameDAO { 16 | @Override public List<$persistence_class_name> query$persistence_class_names(Pager$persistence_class_nameQuery pager$persistence_class_nameQuery) { 17 | SearchCriteria searchCriteria = new SearchCriteria(pager$persistence_class_nameQuery.getPager()); 18 | searchCriteria.setWhere(this.generateCriteria(pager$persistence_class_nameQuery)); 19 | return this.getList(searchCriteria); 20 | } 21 | 22 | private BooleanCriteria generateCriteria(Count$persistence_class_nameQuery count$persistence_class_nameQuery) { 23 | Long startTime=null; 24 | if(count$persistence_class_nameQuery.getBeginDate()!=null){ 25 | startTime=count$persistence_class_nameQuery.getBeginDate().getTime(); 26 | } 27 | 28 | Long endTime=null; 29 | if(count$persistence_class_nameQuery.getEndDate()!=null){ 30 | endTime=count$persistence_class_nameQuery.getEndDate().getTime(); 31 | } 32 | 33 | return BooleanCriteria.criteria( 34 | Criteria.field("$persistence_object_name.name").equal(count$persistence_class_nameQuery.getName())) 35 | .and(Criteria.field("$persistence_object_name.createTime").greaterThan(startTime)) 36 | .and(Criteria.field("$persistence_object_name.createTime").lessThan(endTime)); 37 | } 38 | 39 | @Override public Long count$persistence_class_name(Count$persistence_class_nameQuery $persistence_object_namePagerQuery) { 40 | SearchCriteria searchCriteria = new SearchCriteria(); 41 | searchCriteria.setWhere(this.generateCriteria($persistence_object_namePagerQuery)); 42 | return this.getCount(searchCriteria); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/dataConverter.txt: -------------------------------------------------------------------------------- 1 | package $package_data_converter; 2 | 3 | import com.tedu.inn.protocol.dao.StatusCriteria; 4 | import $package_bo.$persistence_class_nameBO; 5 | import $package_po.$persistence_class_name; 6 | import $package_param.$persistence_class_nameParam; 7 | import $package_query.$persistence_class_nameQuery; 8 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 9 | import org.springframework.beans.BeanUtils; 10 | import com.tarena.passport.protocol.LoginUser; 11 | import com.tarena.passport.sdk.context.SecurityContext; 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | import org.springframework.stereotype.Component; 15 | 16 | @Component 17 | public class $persistence_class_nameConverter{ 18 | 19 | public $persistence_class_nameDBPagerQuery toDbPagerQuery($persistence_class_nameQuery $persistence_object_nameQuery) { 20 | if ($persistence_object_nameQuery == null) { 21 | return new $persistence_class_nameDBPagerQuery(); 22 | } 23 | $persistence_class_nameDBPagerQuery $persistence_object_nameDBPagerQuery = new $persistence_class_nameDBPagerQuery(); 24 | BeanUtils.copyProperties($persistence_object_nameQuery, $persistence_object_nameDBPagerQuery); 25 | return $persistence_object_nameDBPagerQuery; 26 | } 27 | 28 | 29 | public $persistence_class_name param2po($persistence_class_nameParam param) { 30 | $persistence_class_name $persistence_object_name = new $persistence_class_name(); 31 | BeanUtils.copyProperties(param, $persistence_object_name); 32 | 33 | LoginUser loginUser=SecurityContext.getLoginToken(); 34 | 35 | $persistence_object_name.setGmtCreate(System.currentTimeMillis()); 36 | $persistence_object_name.setGmtModified($persistence_object_name.getGmtCreate()); 37 | $persistence_object_name.setCreateUserId(loginUser.getUserId()); 38 | $persistence_object_name.setModifiedUserId(loginUser.getUserId()); 39 | $persistence_object_name.setStatus(1); 40 | 41 | $persistence_object_name.setCreateUserName(loginUser.getUserName()); 42 | $persistence_object_name.setModifiedUserName(loginUser.getUserName()); 43 | return $persistence_object_name; 44 | } 45 | 46 | public $persistence_class_nameBO po2bo($persistence_class_name $persistence_object_name) { 47 | $persistence_class_nameBO $persistence_object_nameBO = new $persistence_class_nameBO(); 48 | BeanUtils.copyProperties($persistence_object_name, $persistence_object_nameBO); 49 | return $persistence_object_nameBO; 50 | } 51 | 52 | public List<$persistence_class_nameBO> poList2BoList(List<$persistence_class_name> list) { 53 | List<$persistence_class_nameBO> $persistence_object_nameBos = new ArrayList<>(list.size()); 54 | for ($persistence_class_name $persistence_object_name : list) { 55 | $persistence_object_nameBos.add(this.po2bo($persistence_object_name)); 56 | } 57 | return $persistence_object_nameBos; 58 | } 59 | 60 | public void convertStatus(StatusCriteria statusCriteria){ 61 | LoginUser loginUser = SecurityContext.getLoginToken(); 62 | statusCriteria.setModifiedUserId(loginUser.getUserId()); 63 | statusCriteria.setModifiedUserName(loginUser.getUserName()); 64 | statusCriteria.setGmtModified(System.currentTimeMillis()); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/mybatis.properties: -------------------------------------------------------------------------------- 1 | change_status=true 2 | parameter_type=com.tedu.inn.protocol.dao.StatusCriteria 3 | modified_condition=`modified_user_name`=#{modifiedUserName},\n`modified_user_id`=#{modifiedUserId},\n`gmt_modified`=#{gmtModified} -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/pagerQuery.txt: -------------------------------------------------------------------------------- 1 | package $package_pager_query; 2 | 3 | import java.util.Date; 4 | import com.tedu.inn.protocol.dao.DatabasePagerQuery; 5 | 6 | public class $persistence_class_nameDBPagerQuery extends DatabasePagerQuery { 7 | public $persistence_class_nameDBPagerQuery() { 8 | } 9 | 10 | private String name; 11 | private Date beginDate; 12 | private Date endDate; 13 | 14 | public Date getBeginDate() { 15 | return beginDate; 16 | } 17 | 18 | public void setBeginDate(Date beginDate) { 19 | this.beginDate = beginDate; 20 | } 21 | 22 | public Date getEndDate() { 23 | return endDate; 24 | } 25 | 26 | public void setEndDate(Date endDate) { 27 | this.endDate = endDate; 28 | } 29 | 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | public void setName(String name) { 35 | this.name = name; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/param.txt: -------------------------------------------------------------------------------- 1 | package $package_param; 2 | 3 | public class $persistence_class_nameParam{ 4 | $get_sets 5 | } 6 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/query.txt: -------------------------------------------------------------------------------- 1 | package $package_query; 2 | 3 | import com.tedu.inn.protocol.pager.SimplePagerQuery; 4 | 5 | import java.util.Date; 6 | 7 | public class $persistence_class_nameQuery extends SimplePagerQuery { 8 | private String name; 9 | private Date beginDate; 10 | private Date endDate; 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public void setName(String name) { 17 | this.name = name; 18 | } 19 | 20 | public Date getBeginDate() { 21 | return beginDate; 22 | } 23 | 24 | public void setBeginDate(Date beginDate) { 25 | this.beginDate = beginDate; 26 | } 27 | 28 | public Date getEndDate() { 29 | return endDate; 30 | } 31 | 32 | public void setEndDate(Date endDate) { 33 | this.endDate = endDate; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/repository.txt: -------------------------------------------------------------------------------- 1 | package $package_repository; 2 | import $package_bo.$persistence_class_nameBO; 3 | import $package_param.$persistence_class_nameParam; 4 | import $package_query.$persistence_class_nameQuery; 5 | import java.util.List; 6 | 7 | public interface $persistence_class_nameRepository { 8 | Long save($persistence_class_nameParam $persistence_object_nameParam); 9 | 10 | Integer delete(Long $persistence_object_nameId); 11 | 12 | $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId); 13 | 14 | Long get$persistence_class_nameCount($persistence_class_nameQuery $persistence_object_nameQuery); 15 | 16 | List<$persistence_class_nameBO> query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameBOQuery); 17 | 18 | Integer disable(String bankIds); 19 | 20 | Integer enable(String bankIds); 21 | } 22 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/repositoryImpl.txt: -------------------------------------------------------------------------------- 1 | package $package_repository_impl; 2 | 3 | import $package_dao.$persistence_class_nameDAO; 4 | import com.tedu.inn.protocol.enums.StatusRecord; 5 | import com.tedu.inn.protocol.dao.StatusCriteria; 6 | import $package_data_converter.$persistence_class_nameConverter; 7 | import $package_po.$persistence_class_name; 8 | import $package_bo.$persistence_class_nameBO; 9 | import $package_param.$persistence_class_nameParam; 10 | import $package_repository.$persistence_class_nameRepository; 11 | import $package_query.$persistence_class_nameQuery; 12 | import java.util.List; 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | import org.springframework.stereotype.Component; 15 | 16 | @Component 17 | public class $persistence_class_nameRepositoryImpl implements $persistence_class_nameRepository { 18 | @Autowired 19 | private $persistence_class_nameConverter $persistence_object_nameConverter; 20 | 21 | @Autowired 22 | private $persistence_class_nameDAO $persistence_object_nameDao; 23 | 24 | @Override public Long save($persistence_class_nameParam $persistence_object_nameParam) { 25 | $persistence_class_name $persistence_object_name = this.$persistence_object_nameConverter.param2po($persistence_object_nameParam); 26 | if ($persistence_object_name.get$upper_primary_property_name() != null) { 27 | this.$persistence_object_nameDao.update($persistence_object_name); 28 | return $persistence_object_name.get$upper_primary_property_name(); 29 | } 30 | this.$persistence_object_nameDao.insert($persistence_object_name); 31 | return $persistence_object_name.get$upper_primary_property_name(); 32 | } 33 | 34 | @Override public Integer delete(Long $persistence_object_nameId) { 35 | return this.$persistence_object_nameDao.delete($persistence_object_nameId); 36 | } 37 | 38 | @Override public Integer disable(String $persistence_object_nameIds) { 39 | StatusCriteria statusCriteria = new StatusCriteria($persistence_object_nameIds, StatusRecord.DISABLE.getStatus()); 40 | this.$persistence_object_nameConverter.convertStatus(statusCriteria); 41 | return this.$persistence_object_nameDao.changeStatus(statusCriteria); 42 | } 43 | 44 | @Override public Integer enable(String $persistence_object_nameIds) { 45 | StatusCriteria statusCriteria = new StatusCriteria($persistence_object_nameIds, StatusRecord.ENABLE.getStatus()); 46 | this.$persistence_object_nameConverter.convertStatus(statusCriteria); 47 | return this.$persistence_object_nameDao.changeStatus(statusCriteria); 48 | } 49 | 50 | @Override public $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId) { 51 | $persistence_class_name $persistence_object_name = this.$persistence_object_nameDao.getEntity($persistence_object_nameId); 52 | return this.$persistence_object_nameConverter.po2bo($persistence_object_name); 53 | } 54 | 55 | @Override public List<$persistence_class_nameBO> query$persistence_class_names( 56 | $persistence_class_nameQuery $persistence_object_nameQuery) { 57 | List<$persistence_class_name> $persistence_object_nameList = this.$persistence_object_nameDao.query$persistence_class_names(this.$persistence_object_nameConverter.toDbPagerQuery($persistence_object_nameQuery)); 58 | return this.$persistence_object_nameConverter.poList2BoList($persistence_object_nameList); 59 | } 60 | 61 | @Override public Long get$persistence_class_nameCount($persistence_class_nameQuery $persistence_object_nameQuery) { 62 | return this.$persistence_object_nameDao.count$persistence_class_name(this.$persistence_object_nameConverter.toDbPagerQuery($persistence_object_nameQuery)); 63 | } 64 | } -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/service.txt: -------------------------------------------------------------------------------- 1 | package $package_service; 2 | 3 | import com.tedu.inn.protocol.ListRecordTotalBO; 4 | import com.tedu.inn.protocol.exception.BusinessException; 5 | import $package_bo.$persistence_class_nameBO; 6 | import $package_repository.$persistence_class_nameRepository; 7 | import $package_param.$persistence_class_nameParam; 8 | import $package_query.$persistence_class_nameQuery; 9 | import java.util.List; 10 | import org.springframework.stereotype.Service; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | 13 | @Service 14 | public class $persistence_class_nameService { 15 | @Autowired 16 | private $persistence_class_nameRepository $persistence_object_nameRepository; 17 | 18 | private void validateSave$persistence_class_name( 19 | $persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 20 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameParam.getName()), SecurityAdminError.NAME_IS_EMPTY, $persistence_class_nameSuffix.name); 21 | } 22 | 23 | public Long save$persistence_class_name( 24 | $persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 25 | this.validateSave$persistence_class_name($persistence_object_nameParam); 26 | return this.$persistence_object_nameRepository.save($persistence_object_nameParam); 27 | } 28 | 29 | public Integer delete$persistence_class_name(Long $persistence_object_nameId) throws BusinessException { 30 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameId), SecurityAdminError.$persistence_class_name_ID_IS_EMPTY); 31 | return this.$persistence_object_nameRepository.delete($persistence_object_nameId); 32 | } 33 | 34 | public Integer enable$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 35 | //Asserts.isTrue(StringUtils.isEmpty(bankIds), $persistence_class_nameAdminError.ID_IS_EMPTY); 36 | return this.$persistence_object_nameRepository.enable($persistence_object_nameIds); 37 | } 38 | 39 | public Integer disable$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 40 | //Asserts.isTrue(StringUtils.isEmpty($persistence_object_nameIds), $persistence_class_nameAdminError.ID_IS_EMPTY); 41 | return this.$persistence_object_nameRepository.disable($persistence_object_nameIds); 42 | } 43 | 44 | public ListRecordTotalBO<$persistence_class_nameBO> queryAll$persistence_class_name() { 45 | return query$persistence_class_name(null); 46 | } 47 | 48 | public ListRecordTotalBO<$persistence_class_nameBO> query$persistence_class_name( 49 | $persistence_class_nameQuery $persistence_object_nameQuery) { 50 | Long totalRecord = this.$persistence_object_nameRepository.get$persistence_class_nameCount($persistence_object_nameQuery); 51 | List<$persistence_class_nameBO> $persistence_object_nameBoList = null; 52 | if (totalRecord > 0) { 53 | $persistence_object_nameBoList = this.$persistence_object_nameRepository.query$persistence_class_names($persistence_object_nameQuery); 54 | } 55 | return new ListRecordTotalBO<>($persistence_object_nameBoList, totalRecord); 56 | } 57 | 58 | public $persistence_class_nameBO get$persistence_class_name( 59 | Long $persistence_object_nameId) throws BusinessException { 60 | //Asserts.isTrue($persistence_object_nameId == null, $persistence_class_nameAdminError.IS_EMPTY); 61 | return this.$persistence_object_nameRepository.get$persistence_class_name($persistence_object_nameId); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/sparrow_copier.properties: -------------------------------------------------------------------------------- 1 | workspace=${user.home}/workspace/sparrow/sparrow-zoo/ 2 | target=/sparrow-example-admin/src/main/java 3 | resource_target=/sparrow-example-admin/src/main/resources 4 | sources=\ 5 | sparrow-example/admin 6 | -------------------------------------------------------------------------------- /coder/src/main/resources/tedu/vo.txt: -------------------------------------------------------------------------------- 1 | package $package_vo; 2 | 3 | public class $persistence_class_nameVO { 4 | $get_sets 5 | } 6 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/assemble.txt: -------------------------------------------------------------------------------- 1 | package $package_assemble; 2 | 3 | import com.sparrow.protocol.constant.Constant; 4 | import com.sparrow.protocol.ListRecordTotalBO; 5 | import com.sparrow.protocol.pager.PagerResult; 6 | import com.sparrow.protocol.pager.SimplePager; 7 | import $package_vo.$persistence_class_nameVO; 8 | import $package_bo.$persistence_class_nameBO; 9 | import $package_param.$persistence_class_nameParam; 10 | import com.sparrow.support.assemble.BO2VOAssemble; 11 | import com.sparrow.support.assemble.Param2VOAssemble; 12 | import com.sparrow.support.pager.HtmlPagerResult; 13 | import com.sparrow.utility.BeanUtility; 14 | import com.sparrow.utility.CollectionsUtility; 15 | import com.sparrow.utility.EnumUtility; 16 | import com.sparrow.utility.StringUtility; 17 | import java.util.ArrayList; 18 | import java.util.Collections; 19 | import java.util.List; 20 | import javax.inject.Named; 21 | 22 | @Named 23 | public class $persistence_class_nameAssemble implements BO2VOAssemble<$persistence_class_nameVO, $persistence_class_nameBO>, 24 | Param2VOAssemble<$persistence_class_nameVO,$persistence_class_nameParam> { 25 | 26 | public $persistence_class_nameVO paramAssembleVO($persistence_class_nameParam param){ 27 | $persistence_class_nameVO $persistence_object_name = new $persistence_class_nameVO(); 28 | BeanUtility.copyProperties(param, $persistence_object_name); 29 | return $persistence_object_name; 30 | } 31 | 32 | @Override public $persistence_class_nameVO boAssembleVO($persistence_class_nameBO bo) { 33 | $persistence_class_nameVO $persistence_object_name = new $persistence_class_nameVO(); 34 | BeanUtility.copyProperties(bo, $persistence_object_name); 35 | $persistence_object_name.setStatus(bo.getStatus().name()); 36 | return $persistence_object_name; 37 | } 38 | 39 | @Override public List<$persistence_class_nameVO> boListAssembleVOList(List<$persistence_class_nameBO> list) { 40 | if (CollectionsUtility.isNullOrEmpty(list)) { 41 | return Collections.emptyList(); 42 | } 43 | List<$persistence_class_nameVO> $persistence_object_nameVOList = new ArrayList<>(list.size()); 44 | for ($persistence_class_nameBO $persistence_object_nameBo : list) { 45 | $persistence_class_nameVO $persistence_object_nameVo = new $persistence_class_nameVO(); 46 | BeanUtility.copyProperties($persistence_object_nameBo, $persistence_object_nameVo); 47 | String statusName = EnumUtility.getValue($persistence_object_nameBo.getStatus()); 48 | $persistence_object_nameVo.setStatus(statusName); 49 | $persistence_object_nameVOList.add($persistence_object_nameVo); 50 | } 51 | return $persistence_object_nameVOList; 52 | } 53 | 54 | public HtmlPagerResult<$persistence_class_nameVO> assembleHtmlPager(ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord, 55 | SimplePager $persistence_object_nameQuery) { 56 | List<$persistence_class_nameVO> $persistence_object_nameVOList = this.boListAssembleVOList($persistence_object_nameListTotalRecord.getList()); 57 | PagerResult<$persistence_class_nameVO> pagerResult = new PagerResult<>($persistence_object_nameQuery); 58 | pagerResult.setList($persistence_object_nameVOList); 59 | pagerResult.setRecordTotal($persistence_object_nameListTotalRecord.getTotal()); 60 | return new HtmlPagerResult<>(pagerResult); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/batchOperateParam.txt: -------------------------------------------------------------------------------- 1 | package $package_batch_param; 2 | 3 | import $package_query.$persistence_class_nameQuery; 4 | 5 | public class $persistence_class_nameBatchOperateParam extends $persistence_class_nameQuery { 6 | private String ids; 7 | 8 | public String getIds() { 9 | return ids; 10 | } 11 | 12 | public void setIds(String ids) { 13 | this.ids = ids; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/bo.txt: -------------------------------------------------------------------------------- 1 | package $package_bo; 2 | 3 | import com.sparrow.protocol.BO; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import lombok.Data; 6 | @Data 7 | public class $persistence_class_nameBO implements BO { 8 | $get_sets 9 | } 10 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/controller.txt: -------------------------------------------------------------------------------- 1 | package $package_controller; 2 | 3 | import com.sparrow.protocol.BusinessException; 4 | import com.sparrow.protocol.ListRecordTotalBO; 5 | import com.sparrow.protocol.TreeItem; 6 | import com.sparrow.protocol.pager.SimplePager; 7 | import $package_assemble.$persistence_class_nameAssemble; 8 | import $package_bo.$persistence_class_nameBO; 9 | import $package_param.$persistence_class_nameParam; 10 | import $package_batch_param.$persistence_class_nameBatchOperateParam; 11 | import $package_query.$persistence_class_nameQuery; 12 | import $package_vo.$persistence_class_nameVO; 13 | import $package_service.$persistence_class_nameService; 14 | import com.sparrow.servlet.ServletContainer; 15 | import com.sparrow.spring.starter.ModelAndViewUtils; 16 | import com.sparrow.support.pager.HtmlPagerResult; 17 | import java.util.List; 18 | import javax.inject.Inject; 19 | import org.springframework.web.bind.annotation.GetMapping; 20 | import org.springframework.web.bind.annotation.PostMapping; 21 | import org.springframework.web.bind.annotation.RequestMapping; 22 | import org.springframework.web.bind.annotation.RestController; 23 | import org.springframework.web.servlet.ModelAndView; 24 | 25 | @RestController 26 | @RequestMapping("$persistence_object_by_slash") 27 | public class $persistence_class_nameController { 28 | 29 | @Inject 30 | private $persistence_class_nameService $persistence_object_nameService; 31 | 32 | @Inject 33 | private $persistence_class_nameAssemble $persistence_object_nameAssemble; 34 | 35 | @GetMapping("manage") 36 | public ModelAndView loadAll$persistence_class_names() { 37 | $persistence_class_nameBatchOperateParam batchOperationQuery = ModelAndViewUtils.query(); 38 | if (batchOperationQuery != null) { 39 | return this.query$persistence_class_names(batchOperationQuery); 40 | } 41 | SimplePager simplePager = new SimplePager(); 42 | ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord = this.$persistence_object_nameService.queryAll$persistence_class_name(); 43 | HtmlPagerResult<$persistence_class_nameVO> pager = this.$persistence_object_nameAssemble.assembleHtmlPager($persistence_object_nameListTotalRecord, simplePager); 44 | ModelAndView mv = new ModelAndView("/$persistence_object_by_slash/manage"); 45 | mv.addObject("pager", pager); 46 | return mv; 47 | } 48 | 49 | private ModelAndView query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameQuery) { 50 | ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord = this.$persistence_object_nameService.query$persistence_class_name($persistence_object_nameQuery); 51 | HtmlPagerResult<$persistence_class_nameVO> pager = this.$persistence_object_nameAssemble.assembleHtmlPager($persistence_object_nameListTotalRecord, $persistence_object_nameQuery); 52 | ModelAndView mv = new ModelAndView("/$persistence_object_by_slash/manage"); 53 | mv.addObject("pager", pager); 54 | return mv; 55 | } 56 | 57 | @PostMapping("search.do") 58 | public ModelAndView search($persistence_class_nameQuery $persistence_object_nameQuery) { 59 | return this.query$persistence_class_names($persistence_object_nameQuery); 60 | } 61 | 62 | @PostMapping("save") 63 | public ModelAndView save$persistence_class_name($persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 64 | this.$persistence_object_nameService.save$persistence_class_name($persistence_object_nameParam); 65 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 66 | } 67 | 68 | @GetMapping("edit") 69 | public ModelAndView get$persistence_class_name(Long $persistence_object_nameId) throws BusinessException { 70 | ModelAndView mv = new ModelAndView("/$persistence_object_by_slash/new"); 71 | if ($persistence_object_nameId == null) { 72 | return mv; 73 | } 74 | 75 | $persistence_class_nameBO $persistence_object_nameBo = $persistence_object_nameService.get$persistence_class_name($persistence_object_nameId); 76 | $persistence_class_nameVO $persistence_object_nameVo = this.$persistence_object_nameAssemble.boAssembleVO($persistence_object_nameBo); 77 | mv.addObject("$persistence_object_name", $persistence_object_nameVo); 78 | return mv; 79 | } 80 | 81 | @PostMapping("delete") 82 | public ModelAndView delete$persistence_class_name($persistence_class_nameBatchOperateParam batchOperationQuery) throws BusinessException { 83 | this.$persistence_object_nameService.delete$persistence_class_name(batchOperationQuery.getIds()); 84 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 85 | } 86 | 87 | @PostMapping("enable") 88 | public ModelAndView enable$persistence_class_name($persistence_class_nameBatchOperateParam batchOperationQuery) throws BusinessException { 89 | this.$persistence_object_nameService.enable$persistence_class_name(batchOperationQuery.getIds()); 90 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 91 | } 92 | 93 | @PostMapping("disable") 94 | public ModelAndView disable$persistence_class_name($persistence_class_nameBatchOperateParam batchOperationQuery) throws BusinessException { 95 | this.$persistence_object_nameService.disable$persistence_class_name(batchOperationQuery.getIds()); 96 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/dao.txt: -------------------------------------------------------------------------------- 1 | package $package_dao; 2 | 3 | import com.sparrow.protocol.dao.DaoSupport; 4 | import $package_po.$persistence_class_name; 5 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 6 | import java.util.List; 7 | 8 | public interface $persistence_class_nameDAO extends DaoSupport<$persistence_class_name, Long> { 9 | List<$persistence_class_name> query$persistence_class_names($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery); 10 | 11 | Long count$persistence_class_name($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery); 12 | } 13 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/daoImpl.txt: -------------------------------------------------------------------------------- 1 | package $package_dao_impl; 2 | 3 | import com.sparrow.orm.query.BooleanCriteria; 4 | import com.sparrow.orm.query.Criteria; 5 | import com.sparrow.orm.query.SearchCriteria; 6 | import com.sparrow.orm.template.impl.ORMStrategy; 7 | import $package_dao.$persistence_class_nameDAO; 8 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 9 | import $package_po.$persistence_class_name; 10 | import java.util.List; 11 | import javax.inject.Named; 12 | 13 | @Named 14 | public class $persistence_class_nameDaoImpl extends ORMStrategy<$persistence_class_name, Long> implements $persistence_class_nameDAO { 15 | @Override public List<$persistence_class_name> query$persistence_class_names($persistence_class_nameDBPagerQuery pager$persistence_class_nameQuery) { 16 | SearchCriteria searchCriteria = new SearchCriteria(pager$persistence_class_nameQuery); 17 | searchCriteria.setWhere(this.generateCriteria(pager$persistence_class_nameQuery)); 18 | return this.getList(searchCriteria); 19 | } 20 | 21 | private BooleanCriteria generateCriteria($persistence_class_nameDBPagerQuery count$persistence_class_nameQuery) { 22 | Long startTime=null; 23 | if(count$persistence_class_nameQuery.getBeginDate()!=null){ 24 | startTime=count$persistence_class_nameQuery.getBeginDate().getTime(); 25 | } 26 | 27 | Long endTime=null; 28 | if(count$persistence_class_nameQuery.getEndDate()!=null){ 29 | endTime=count$persistence_class_nameQuery.getEndDate().getTime(); 30 | } 31 | 32 | return BooleanCriteria.criteria( 33 | Criteria.field("$persistence_object_name.name").equal(count$persistence_class_nameQuery.getName())) 34 | .and(Criteria.field("$persistence_object_name.createTime").greaterThan(startTime)) 35 | .and(Criteria.field("$persistence_object_name.createTime").lessThan(endTime)); 36 | } 37 | 38 | @Override public Long count$persistence_class_name($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery) { 39 | SearchCriteria searchCriteria = new SearchCriteria(); 40 | searchCriteria.setWhere(this.generateCriteria($persistence_object_namePagerQuery)); 41 | return this.getCount(searchCriteria); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/dataConverter.txt: -------------------------------------------------------------------------------- 1 | package $package_data_converter; 2 | 3 | import com.sparrow.protocol.dao.StatusCriteria; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import $package_bo.$persistence_class_nameBO; 6 | import $package_po.$persistence_class_name; 7 | import $package_param.$persistence_class_nameParam; 8 | import $package_query.$persistence_class_nameQuery; 9 | import com.sparrow.support.converter.PO2BOConverter; 10 | import com.sparrow.support.converter.Param2POConverter; 11 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 12 | import com.sparrow.utility.BeanUtility; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | import javax.inject.Named; 16 | 17 | @Named 18 | public class $persistence_class_nameConverter implements Param2POConverter<$persistence_class_nameParam, $persistence_class_name>, PO2BOConverter<$persistence_class_nameBO, $persistence_class_name> { 19 | 20 | public $persistence_class_nameDBPagerQuery toDbPagerQuery($persistence_class_nameQuery $persistence_object_nameQuery) { 21 | if ($persistence_object_nameQuery == null) { 22 | return new $persistence_class_nameDBPagerQuery(); 23 | } 24 | $persistence_class_nameDBPagerQuery $persistence_class_nameDBPagerQuery = new $persistence_class_nameDBPagerQuery(); 25 | BeanUtility.copyProperties($persistence_object_nameQuery, $persistence_class_nameDBPagerQuery); 26 | return $persistence_class_nameDBPagerQuery; 27 | } 28 | 29 | @Override public $persistence_class_name param2po($persistence_class_nameParam param) { 30 | $persistence_class_name $persistence_object_name = new $persistence_class_name(); 31 | BeanUtility.copyProperties(param, $persistence_object_name); 32 | 33 | $persistence_object_name.setGmtCreate(System.currentTimeMillis()); 34 | $persistence_object_name.setGmtModified($persistence_object_name.getGmtCreate()); 35 | $persistence_object_name.setCreateUserId(0L); 36 | $persistence_object_name.setModifiedUserId(0L); 37 | $persistence_object_name.setStatus(StatusRecord.ENABLE); 38 | 39 | $persistence_object_name.setCreateUserName(""); 40 | $persistence_object_name.setModifiedUserName(""); 41 | return $persistence_object_name; 42 | } 43 | 44 | @Override public $persistence_class_nameBO po2bo($persistence_class_name $persistence_object_name) { 45 | $persistence_class_nameBO $persistence_object_nameBO = new $persistence_class_nameBO(); 46 | BeanUtility.copyProperties($persistence_object_name, $persistence_object_nameBO); 47 | return $persistence_object_nameBO; 48 | } 49 | 50 | @Override public List<$persistence_class_nameBO> poList2BoList(List<$persistence_class_name> list) { 51 | List<$persistence_class_nameBO> $persistence_object_nameBos = new ArrayList<>(list.size()); 52 | for ($persistence_class_name $persistence_object_name : list) { 53 | $persistence_object_nameBos.add(this.po2bo($persistence_object_name)); 54 | } 55 | return $persistence_object_nameBos; 56 | } 57 | 58 | public void convertStatus(StatusCriteria statusCriteria){ 59 | statusCriteria.setModifiedUserName("harry"); 60 | statusCriteria.setGmtModified(System.currentTimeMillis()); 61 | statusCriteria.setModifiedUserId(1L); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/mybatis.properties: -------------------------------------------------------------------------------- 1 | change_status=false -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/pagerQuery.txt: -------------------------------------------------------------------------------- 1 | package $package_pager_query; 2 | 3 | import com.sparrow.protocol.enums.StatusRecord; 4 | import com.sparrow.protocol.dao.DatabasePagerQuery; 5 | import java.util.Date; 6 | import lombok.Data; 7 | @Data 8 | 9 | public class $persistence_class_nameDBPagerQuery extends DatabasePagerQuery { 10 | public $persistence_class_nameDBPagerQuery() {} 11 | } 12 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/param.txt: -------------------------------------------------------------------------------- 1 | package $package_param; 2 | 3 | import com.sparrow.protocol.Param; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class $persistence_class_nameParam implements Param { 9 | $get_sets 10 | } 11 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/query.txt: -------------------------------------------------------------------------------- 1 | package $package_query; 2 | 3 | import com.sparrow.protocol.pager.SimplePager; 4 | import java.util.Date; 5 | import lombok.Data; 6 | @Data 7 | public class $persistence_class_nameQuery extends SimplePager { 8 | private String name; 9 | private Date beginDate; 10 | private Date endDate; 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public void setName(String name) { 17 | this.name = name; 18 | } 19 | 20 | public Date getBeginDate() { 21 | return beginDate; 22 | } 23 | 24 | public void setBeginDate(Date beginDate) { 25 | this.beginDate = beginDate; 26 | } 27 | 28 | public Date getEndDate() { 29 | return endDate; 30 | } 31 | 32 | public void setEndDate(Date endDate) { 33 | this.endDate = endDate; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/repository.txt: -------------------------------------------------------------------------------- 1 | package $package_repository; 2 | import $package_bo.$persistence_class_nameBO; 3 | import $package_param.$persistence_class_nameParam; 4 | import $package_query.$persistence_class_nameQuery; 5 | import java.util.List; 6 | 7 | 8 | 9 | public interface $persistence_class_nameRepository { 10 | Long save($persistence_class_nameParam $persistence_object_nameParam); 11 | 12 | Integer delete(String $persistence_object_nameIds); 13 | 14 | Integer disable(String $persistence_object_nameIds); 15 | 16 | Integer enable(String $persistence_object_nameIds); 17 | 18 | $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId); 19 | 20 | List<$persistence_class_nameBO> query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameQuery); 21 | 22 | Long get$persistence_class_nameCount($persistence_class_nameQuery $persistence_object_nameQuery); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/repositoryImpl.txt: -------------------------------------------------------------------------------- 1 | package $package_repository_impl; 2 | 3 | import com.sparrow.protocol.dao.StatusCriteria; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import $package_dao.$persistence_class_nameDAO; 6 | import $package_data_converter.$persistence_class_nameConverter; 7 | import $package_po.$persistence_class_name; 8 | import $package_bo.$persistence_class_nameBO; 9 | import $package_param.$persistence_class_nameParam; 10 | import $package_repository.$persistence_class_nameRepository; 11 | import $package_query.$persistence_class_nameQuery; 12 | 13 | import java.util.List; 14 | import javax.inject.Inject; 15 | import javax.inject.Named; 16 | 17 | @Named 18 | public class $persistence_class_nameRepositoryImpl implements $persistence_class_nameRepository { 19 | @Inject 20 | private $persistence_class_nameConverter $persistence_object_nameConverter; 21 | 22 | @Inject 23 | private $persistence_class_nameDAO $persistence_object_nameDao; 24 | 25 | @Override public Long save($persistence_class_nameParam $persistence_object_nameParam) { 26 | $persistence_class_name $persistence_object_name = this.$persistence_object_nameConverter.param2po($persistence_object_nameParam); 27 | if ($persistence_object_name.get$upper_primary_property_name() != null) { 28 | this.$persistence_object_nameDao.update($persistence_object_name); 29 | return $persistence_object_name.get$upper_primary_property_name(); 30 | } 31 | this.$persistence_object_nameDao.insert($persistence_object_name); 32 | return $persistence_object_name.get$upper_primary_property_name(); 33 | } 34 | 35 | @Override public Integer delete(String $persistence_object_nameIds) { 36 | return this.$persistence_object_nameDao.batchDelete($persistence_object_nameIds); 37 | } 38 | 39 | @Override public Integer disable(String $persistence_object_nameIds) { 40 | StatusCriteria statusCriteria = new StatusCriteria($persistence_object_nameIds, StatusRecord.DISABLE); 41 | this.$persistence_object_nameConverter.convertStatus(statusCriteria); 42 | return this.$persistence_object_nameDao.changeStatus(statusCriteria); 43 | } 44 | 45 | @Override public Integer enable(String $persistence_object_nameIds) { 46 | StatusCriteria statusCriteria = new StatusCriteria($persistence_object_nameIds, StatusRecord.ENABLE); 47 | this.$persistence_object_nameConverter.convertStatus(statusCriteria); 48 | 49 | return this.$persistence_object_nameDao.changeStatus(statusCriteria); 50 | } 51 | 52 | @Override public $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId) { 53 | $persistence_class_name $persistence_object_name = this.$persistence_object_nameDao.getEntity($persistence_object_nameId); 54 | return this.$persistence_object_nameConverter.po2bo($persistence_object_name); 55 | } 56 | 57 | @Override public List<$persistence_class_nameBO> query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameQuery) { 58 | List<$persistence_class_name> $persistence_object_nameList = this.$persistence_object_nameDao.query$persistence_class_names(this.$persistence_object_nameConverter.toDbPagerQuery($persistence_object_nameQuery)); 59 | return this.$persistence_object_nameConverter.poList2BoList($persistence_object_nameList); 60 | } 61 | 62 | @Override public Long get$persistence_class_nameCount($persistence_class_nameQuery $persistence_object_nameQuery) { 63 | return this.$persistence_object_nameDao.count$persistence_class_name(this.$persistence_object_nameConverter.toDbPagerQuery($persistence_object_nameQuery)); 64 | } 65 | } -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/service.txt: -------------------------------------------------------------------------------- 1 | package $package_service; 2 | 3 | import com.sparrow.exception.Asserts; 4 | import com.sparrow.protocol.BusinessException; 5 | import com.sparrow.protocol.ListRecordTotalBO; 6 | import $package_bo.$persistence_class_nameBO; 7 | import $package_repository.$persistence_class_nameRepository; 8 | import $package_param.$persistence_class_nameParam; 9 | import $package_query.$persistence_class_nameQuery; 10 | import com.sparrow.utility.StringUtility; 11 | import java.util.List; 12 | import javax.inject.Inject; 13 | import javax.inject.Named; 14 | 15 | @Named 16 | public class $persistence_class_nameService { 17 | @Inject 18 | private $persistence_class_nameRepository $persistence_object_nameRepository; 19 | 20 | private void validateSave$persistence_class_name($persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 21 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameParam.getName()), SecurityAdminError.NAME_IS_EMPTY, $persistence_class_nameSuffix.name); 22 | } 23 | 24 | public Long save$persistence_class_name($persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 25 | this.validateSave$persistence_class_name($persistence_object_nameParam); 26 | return this.$persistence_object_nameRepository.save($persistence_object_nameParam); 27 | } 28 | 29 | public Integer delete$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 30 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameIds), SecurityAdminError.$persistence_class_name_ID_IS_EMPTY); 31 | return this.$persistence_object_nameRepository.delete($persistence_object_nameIds); 32 | } 33 | 34 | public Integer enable$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 35 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameIds), SecurityAdminError.$persistence_class_name_ID_IS_EMPTY); 36 | return this.$persistence_object_nameRepository.enable($persistence_object_nameIds); 37 | } 38 | 39 | public Integer disable$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 40 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameIds), SecurityAdminError.$persistence_class_name_ID_IS_EMPTY); 41 | return this.$persistence_object_nameRepository.disable($persistence_object_nameIds); 42 | } 43 | 44 | public ListRecordTotalBO<$persistence_class_nameBO> queryAll$persistence_class_name() { 45 | return query$persistence_class_name(null); 46 | } 47 | 48 | public ListRecordTotalBO<$persistence_class_nameBO> query$persistence_class_name($persistence_class_nameQuery $persistence_object_nameQuery) { 49 | Long totalRecord = this.$persistence_object_nameRepository.get$persistence_class_nameCount($persistence_object_nameQuery); 50 | List<$persistence_class_nameBO> $persistence_object_nameBoList = null; 51 | if (totalRecord > 0) { 52 | $persistence_object_nameBoList = this.$persistence_object_nameRepository.query$persistence_class_names($persistence_object_nameQuery); 53 | } 54 | return new ListRecordTotalBO<>($persistence_object_nameBoList, totalRecord); 55 | } 56 | 57 | public $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId) throws BusinessException { 58 | //Asserts.isTrue($persistence_object_nameId == null, SecurityAdminError.$persistence_object_name_IS_EMPTY); 59 | return this.$persistence_object_nameRepository.get$persistence_class_name($persistence_object_nameId); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/sql/attentionUser.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `attention_user_%1$s` ( 2 | `relation_id` int(10) NOT NULL AUTO_INCREMENT, 3 | `user_id` int(10) NOT NULL DEFAULT '0', 4 | `attention_id` int(10) NOT NULL DEFAULT '0', 5 | `create_time` timestamp NULL, 6 | `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 7 | `status` tinyint(3) unsigned NOT NULL DEFAULT '0', 8 | PRIMARY KEY (`relation_id`) 9 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 10 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/sql/event.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `event_%s`; 2 | CREATE TABLE `event_%s` ( 3 | `event_id` int(10) UNSIGNED AUTO_INCREMENT COMMENT 'primary key' NOT NULL , 4 | `user_type` varchar(16) DEFAULT '' COMMENT 'user type' NOT NULL, 5 | `user_id` int(10) UNSIGNED COMMENT 'user id' NOT NULL, 6 | `business_type` varchar(64) DEFAULT '' COMMENT 'ip' NOT NULL, 7 | `business_id` int(10) UNSIGNED COMMENT 'business id' NOT NULL, 8 | `times` int(10) DEFAULT 0 COMMENT 'times' NOT NULL, 9 | `channel` varchar(256) DEFAULT '' COMMENT 'channel' NOT NULL, 10 | `ip` char(16) DEFAULT '' COMMENT 'ip' NOT NULL, 11 | `device` varchar(32) DEFAULT '' COMMENT 'device' NOT NULL, 12 | `device_id` varchar(64) DEFAULT '' COMMENT 'device unique id' NOT NULL, 13 | `device_model` varchar(16) DEFAULT '' COMMENT 'device model 5s e.g ...' NOT NULL, 14 | `event` varchar(64) DEFAULT '' COMMENT 'event type' NOT NULL, 15 | `content` varchar(512) DEFAULT '' COMMENT 'content' NOT NULL, 16 | `status` varchar(64) DEFAULT '' COMMENT 'status' NOT NULL, 17 | `website` varchar(256) DEFAULT '' COMMENT 'website home url' NOT NULL, 18 | `app_id` int(11) UNSIGNED DEFAULT 0 COMMENT 'app id' NOT NULL, 19 | `app_version` float(11,2) DEFAULT 0.0 COMMENT 'app version' NOT NULL, 20 | `platform` varchar(16) DEFAULT '' COMMENT 'platform' NOT NULL, 21 | `os` varchar(16) DEFAULT '' COMMENT 'operation system' NOT NULL, 22 | `user_agent` varchar(512) DEFAULT '' COMMENT 'use agent' NOT NULL, 23 | `client_version` varchar(64) DEFAULT '' COMMENT 'client os version' NOT NULL, 24 | `longitude` double DEFAULT 0.0 COMMENT 'longitude' NOT NULL, 25 | `latitude` double DEFAULT 0.0 COMMENT 'latitude' NOT NULL, 26 | `network` varchar(16) DEFAULT '' COMMENT 'network' NOT NULL, 27 | `simulate` tinyint(1) DEFAULT 0 COMMENT 'is simulate' NOT NULL, 28 | `imei` varchar(64) DEFAULT '' COMMENT 'imei' NOT NULL, 29 | `bssid` varchar(64) DEFAULT '' COMMENT 'bssi' NOT NULL, 30 | `ssid` char(64) DEFAULT '' COMMENT 'ssid' NOT NULL, 31 | `idfa` char(64) DEFAULT '' COMMENT 'idfa' NOT NULL, 32 | `start_time` bigint(20) DEFAULT 0 COMMENT 'client start time' NOT NULL, 33 | `resume_time` bigint(20) DEFAULT 0 COMMENT 'client resume time' NOT NULL, 34 | `create_time` bigint(20) DEFAULT 0 NOT NULL, 35 | `update_time` bigint(20) DEFAULT 0 NOT NULL, 36 | PRIMARY KEY (`event_id`) 37 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='event'; 38 | -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/sql/fansUser.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `fans_user_%1$s` ( 2 | `relation_id` int(10) NOT NULL AUTO_INCREMENT, 3 | `user_id` int(10) NOT NULL DEFAULT '0', 4 | `fans_id` int(10) NOT NULL DEFAULT '0', 5 | `create_time` timestamp NULL, 6 | `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 7 | `status` tinyint(3) unsigned NOT NULL DEFAULT '0', 8 | PRIMARY KEY (`relation_id`) 9 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -------------------------------------------------------------------------------- /coder/src/main/resources/template-thymeleaf/vo.txt: -------------------------------------------------------------------------------- 1 | package $package_vo; 2 | 3 | import com.sparrow.protocol.VO; 4 | import lombok.Data; 5 | @Data 6 | public class $persistence_class_nameVO implements VO { 7 | $get_sets 8 | } 9 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/assemble.txt: -------------------------------------------------------------------------------- 1 | package $package_assemble; 2 | 3 | import com.sparrow.protocol.constant.Constant; 4 | import com.sparrow.protocol.ListRecordTotalBO; 5 | import com.sparrow.protocol.pager.PagerResult; 6 | import com.sparrow.protocol.pager.SimplePager; 7 | import $package_vo.$persistence_class_nameVO; 8 | import $package_bo.$persistence_class_nameBO; 9 | import $package_param.$persistence_class_nameParam; 10 | import com.sparrow.support.assemble.BO2VOAssemble; 11 | import com.sparrow.support.assemble.Param2VOAssemble; 12 | import com.sparrow.support.pager.HtmlPagerResult; 13 | import com.sparrow.utility.BeanUtility; 14 | import com.sparrow.utility.CollectionsUtility; 15 | import com.sparrow.utility.EnumUtility; 16 | import com.sparrow.utility.StringUtility; 17 | import java.util.ArrayList; 18 | import java.util.Collections; 19 | import java.util.List; 20 | import javax.inject.Named; 21 | 22 | @Named 23 | public class $persistence_class_nameAssemble implements BO2VOAssemble<$persistence_class_nameVO, $persistence_class_nameBO>, 24 | Param2VOAssemble<$persistence_class_nameVO,$persistence_class_nameParam> { 25 | 26 | public $persistence_class_nameVO paramAssembleVO($persistence_class_nameParam param){ 27 | $persistence_class_nameVO $persistence_object_name = new $persistence_class_nameVO(); 28 | BeanUtility.copyProperties(param, $persistence_object_name); 29 | return $persistence_object_name; 30 | } 31 | 32 | @Override public $persistence_class_nameVO boAssembleVO($persistence_class_nameBO bo) { 33 | $persistence_class_nameVO $persistence_object_name = new $persistence_class_nameVO(); 34 | BeanUtility.copyProperties(bo, $persistence_object_name); 35 | $persistence_object_name.setStatus(bo.getStatus().name()); 36 | return $persistence_object_name; 37 | } 38 | 39 | @Override public List<$persistence_class_nameVO> boListAssembleVOList(List<$persistence_class_nameBO> list) { 40 | if (CollectionsUtility.isNullOrEmpty(list)) { 41 | return Collections.emptyList(); 42 | } 43 | List<$persistence_class_nameVO> $persistence_object_nameVOList = new ArrayList<>(list.size()); 44 | for ($persistence_class_nameBO $persistence_object_nameBo : list) { 45 | $persistence_class_nameVO $persistence_object_nameVo = new $persistence_class_nameVO(); 46 | BeanUtility.copyProperties($persistence_object_nameBo, $persistence_object_nameVo); 47 | String statusName = EnumUtility.getValue($persistence_object_nameBo.getStatus()); 48 | $persistence_object_nameVo.setStatus(statusName); 49 | $persistence_object_nameVOList.add($persistence_object_nameVo); 50 | } 51 | return $persistence_object_nameVOList; 52 | } 53 | 54 | public HtmlPagerResult<$persistence_class_nameVO> assembleHtmlPager(ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord, 55 | SimplePager $persistence_object_nameQuery) { 56 | List<$persistence_class_nameVO> $persistence_object_nameVOList = this.boListAssembleVOList($persistence_object_nameListTotalRecord.getList()); 57 | PagerResult<$persistence_class_nameVO> pagerResult = new PagerResult<>($persistence_object_nameQuery); 58 | pagerResult.setList($persistence_object_nameVOList); 59 | pagerResult.setRecordTotal($persistence_object_nameListTotalRecord.getTotal()); 60 | return new HtmlPagerResult<>(pagerResult); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/bo.txt: -------------------------------------------------------------------------------- 1 | package $package_bo; 2 | 3 | import com.sparrow.protocol.BO; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import lombok.Data; 6 | @Data 7 | public class $persistence_class_nameBO implements BO { 8 | $get_sets 9 | } 10 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/controller.txt: -------------------------------------------------------------------------------- 1 | package $package_controller; 2 | 3 | import com.sparrow.protocol.BusinessException; 4 | import com.sparrow.protocol.ListRecordTotalBO; 5 | import com.sparrow.protocol.TreeItem; 6 | import com.sparrow.protocol.pager.SimplePager; 7 | import $package_assemble.$persistence_class_nameAssemble; 8 | import $package_bo.$persistence_class_nameBO; 9 | import $package_param.$persistence_class_nameParam; 10 | import $package_batch_param.$persistence_class_nameParam; 11 | import $package_query.$persistence_class_nameQuery; 12 | import $package_vo.$persistence_class_nameVO; 13 | import $package_service.$persistence_class_nameService; 14 | import com.sparrow.servlet.ServletContainer; 15 | import com.sparrow.spring.starter.ModelAndViewUtils; 16 | import com.sparrow.support.pager.HtmlPagerResult; 17 | import java.util.List; 18 | import javax.inject.Inject; 19 | import org.springframework.web.bind.annotation.GetMapping; 20 | import org.springframework.web.bind.annotation.PostMapping; 21 | import org.springframework.web.bind.annotation.RequestMapping; 22 | import org.springframework.web.bind.annotation.RestController; 23 | import org.springframework.web.servlet.ModelAndView; 24 | 25 | @RestController 26 | @RequestMapping("$persistence_object_by_slash") 27 | public class $persistence_class_nameController { 28 | 29 | @Inject 30 | private $persistence_class_nameService $persistence_object_nameService; 31 | 32 | @Inject 33 | private $persistence_class_nameAssemble $persistence_object_nameAssemble; 34 | 35 | @GetMapping("manage") 36 | public ModelAndView loadAll$persistence_class_names() { 37 | $persistence_class_nameBatchOperateParam batchOperationQuery = ModelAndViewUtils.query(); 38 | if (batchOperationQuery != null) { 39 | return this.query$persistence_class_names(batchOperationQuery); 40 | } 41 | SimplePager simplePager = new SimplePager(); 42 | ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord = this.$persistence_object_nameService.queryAll$persistence_class_name(); 43 | HtmlPagerResult<$persistence_class_nameVO> pager = this.$persistence_object_nameAssemble.assembleHtmlPager($persistence_object_nameListTotalRecord, simplePager); 44 | ModelAndView mv = new ModelAndView("/$persistence_object_by_slash/manage"); 45 | mv.addObject("pager", pager); 46 | return mv; 47 | } 48 | 49 | private ModelAndView query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameQuery) { 50 | ListRecordTotalBO<$persistence_class_nameBO> $persistence_object_nameListTotalRecord = this.$persistence_object_nameService.query$persistence_class_name($persistence_object_nameQuery); 51 | HtmlPagerResult<$persistence_class_nameVO> pager = this.$persistence_object_nameAssemble.assembleHtmlPager($persistence_object_nameListTotalRecord, $persistence_object_nameQuery); 52 | ModelAndView mv = new ModelAndView("/$persistence_object_by_slash/manage"); 53 | mv.addObject("pager", pager); 54 | return mv; 55 | } 56 | 57 | @PostMapping("search.do") 58 | public ModelAndView search($persistence_class_nameQuery $persistence_object_nameQuery) { 59 | return this.query$persistence_class_names($persistence_object_nameQuery); 60 | } 61 | 62 | @PostMapping("save") 63 | public ModelAndView save$persistence_class_name($persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 64 | this.$persistence_object_nameService.save$persistence_class_name($persistence_object_nameParam); 65 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 66 | } 67 | 68 | @GetMapping("edit") 69 | public ModelAndView get$persistence_class_name(Long $persistence_object_nameId) throws BusinessException { 70 | ModelAndView mv = new ModelAndView("/$persistence_object_by_slash/new"); 71 | if ($persistence_object_nameId == null) { 72 | return mv; 73 | } 74 | 75 | $persistence_class_nameBO $persistence_object_nameBo = $persistence_object_nameService.get$persistence_class_name($persistence_object_nameId); 76 | $persistence_class_nameVO $persistence_object_nameVo = this.$persistence_object_nameAssemble.boAssembleVO($persistence_object_nameBo); 77 | mv.addObject("$persistence_object_name", $persistence_object_nameVo); 78 | return mv; 79 | } 80 | 81 | @PostMapping("delete") 82 | public ModelAndView delete$persistence_class_name($persistence_class_nameBatchOperateParam batchOperationQuery) throws BusinessException { 83 | this.$persistence_object_nameService.delete$persistence_class_name(batchOperationQuery.getIds()); 84 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 85 | } 86 | 87 | @PostMapping("enable") 88 | public ModelAndView enable$persistence_class_name($persistence_class_nameBatchOperateParam batchOperationQuery) throws BusinessException { 89 | this.$persistence_object_nameService.enable$persistence_class_name(batchOperationQuery.getIds()); 90 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 91 | } 92 | 93 | @PostMapping("disable") 94 | public ModelAndView disable$persistence_class_name($persistence_class_nameBatchOperateParam batchOperationQuery) throws BusinessException { 95 | this.$persistence_object_nameService.disable$persistence_class_name(batchOperationQuery.getIds()); 96 | return ModelAndViewUtils.redirect("/$persistence_object_by_slash/manage"); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/dao.txt: -------------------------------------------------------------------------------- 1 | package $package_dao; 2 | 3 | import com.sparrow.protocol.dao.DaoSupport; 4 | import $package_po.$persistence_class_name; 5 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 6 | import java.util.List; 7 | 8 | public interface $persistence_class_nameDAO extends DaoSupport<$persistence_class_name, Long> { 9 | List<$persistence_class_name> query$persistence_class_names($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery); 10 | 11 | Long count$persistence_class_name($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery); 12 | } 13 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/daoImpl.txt: -------------------------------------------------------------------------------- 1 | package $package_dao_impl; 2 | 3 | import com.sparrow.orm.query.BooleanCriteria; 4 | import com.sparrow.orm.query.Criteria; 5 | import com.sparrow.orm.query.SearchCriteria; 6 | import com.sparrow.orm.template.impl.ORMStrategy; 7 | import $package_dao.$persistence_class_nameDAO; 8 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 9 | import $package_po.$persistence_class_name; 10 | import java.util.List; 11 | import javax.inject.Named; 12 | 13 | @Named 14 | public class $persistence_class_nameDaoImpl extends ORMStrategy<$persistence_class_name, Long> implements $persistence_class_nameDAO { 15 | @Override public List<$persistence_class_name> query$persistence_class_names($persistence_class_nameDBPagerQuery pager$persistence_class_nameQuery) { 16 | SearchCriteria searchCriteria = new SearchCriteria(pager$persistence_class_nameQuery); 17 | searchCriteria.setWhere(this.generateCriteria(pager$persistence_class_nameQuery)); 18 | return this.getList(searchCriteria); 19 | } 20 | 21 | private BooleanCriteria generateCriteria($persistence_class_nameDBPagerQuery count$persistence_class_nameQuery) { 22 | Long startTime=null; 23 | if(count$persistence_class_nameQuery.getBeginDate()!=null){ 24 | startTime=count$persistence_class_nameQuery.getBeginDate().getTime(); 25 | } 26 | 27 | Long endTime=null; 28 | if(count$persistence_class_nameQuery.getEndDate()!=null){ 29 | endTime=count$persistence_class_nameQuery.getEndDate().getTime(); 30 | } 31 | 32 | return BooleanCriteria.criteria( 33 | Criteria.field("$persistence_object_name.name").equal(count$persistence_class_nameQuery.getName())) 34 | .and(Criteria.field("$persistence_object_name.createTime").greaterThan(startTime)) 35 | .and(Criteria.field("$persistence_object_name.createTime").lessThan(endTime)); 36 | } 37 | 38 | @Override public Long count$persistence_class_name($persistence_class_nameDBPagerQuery $persistence_object_namePagerQuery) { 39 | SearchCriteria searchCriteria = new SearchCriteria(); 40 | searchCriteria.setWhere(this.generateCriteria($persistence_object_namePagerQuery)); 41 | return this.getCount(searchCriteria); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/dataConverter.txt: -------------------------------------------------------------------------------- 1 | package $package_data_converter; 2 | 3 | import com.sparrow.protocol.dao.StatusCriteria; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import $package_bo.$persistence_class_nameBO; 6 | import $package_po.$persistence_class_name; 7 | import $package_param.$persistence_class_nameParam; 8 | import $package_query.$persistence_class_nameQuery; 9 | import com.sparrow.support.converter.PO2BOConverter; 10 | import com.sparrow.support.converter.Param2POConverter; 11 | import $package_pager_query.$persistence_class_nameDBPagerQuery; 12 | import com.sparrow.utility.BeanUtility; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | import javax.inject.Named; 16 | 17 | @Named 18 | public class $persistence_class_nameConverter implements Param2POConverter<$persistence_class_nameParam, $persistence_class_name>, PO2BOConverter<$persistence_class_nameBO, $persistence_class_name> { 19 | 20 | public $persistence_class_nameDBPagerQuery toDbPagerQuery($persistence_class_nameQuery $persistence_object_nameQuery) { 21 | if ($persistence_object_nameQuery == null) { 22 | return new $persistence_class_nameDBPagerQuery(); 23 | } 24 | $persistence_class_nameDBPagerQuery $persistence_class_nameDBPagerQuery = new $persistence_class_nameDBPagerQuery(); 25 | BeanUtility.copyProperties($persistence_object_nameQuery, $persistence_class_nameDBPagerQuery); 26 | return $persistence_class_nameDBPagerQuery; 27 | } 28 | 29 | @Override public $persistence_class_name param2po($persistence_class_nameParam param) { 30 | $persistence_class_name $persistence_object_name = new $persistence_class_name(); 31 | BeanUtility.copyProperties(param, $persistence_object_name); 32 | 33 | $persistence_object_name.setGmtCreate(System.currentTimeMillis()); 34 | $persistence_object_name.setGmtModified($persistence_object_name.getGmtCreate()); 35 | $persistence_object_name.setCreateUserId(0L); 36 | $persistence_object_name.setModifiedUserId(0L); 37 | $persistence_object_name.setStatus(StatusRecord.ENABLE); 38 | 39 | $persistence_object_name.setCreateUserName(""); 40 | $persistence_object_name.setModifiedUserName(""); 41 | return $persistence_object_name; 42 | } 43 | 44 | @Override public $persistence_class_nameBO po2bo($persistence_class_name $persistence_object_name) { 45 | $persistence_class_nameBO $persistence_object_nameBO = new $persistence_class_nameBO(); 46 | BeanUtility.copyProperties($persistence_object_name, $persistence_object_nameBO); 47 | return $persistence_object_nameBO; 48 | } 49 | 50 | @Override public List<$persistence_class_nameBO> poList2BoList(List<$persistence_class_name> list) { 51 | List<$persistence_class_nameBO> $persistence_object_nameBos = new ArrayList<>(list.size()); 52 | for ($persistence_class_name $persistence_object_name : list) { 53 | $persistence_object_nameBos.add(this.po2bo($persistence_object_name)); 54 | } 55 | return $persistence_object_nameBos; 56 | } 57 | 58 | public void convertStatus(StatusCriteria statusCriteria){ 59 | statusCriteria.setModifiedUserName("harry"); 60 | statusCriteria.setGmtModified(System.currentTimeMillis()); 61 | statusCriteria.setModifiedUserId(1L); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/mybatis.properties: -------------------------------------------------------------------------------- 1 | change_status=false -------------------------------------------------------------------------------- /coder/src/main/resources/template/pagerQuery.txt: -------------------------------------------------------------------------------- 1 | package $package_pager_query; 2 | 3 | import com.sparrow.protocol.enums.StatusRecord; 4 | import com.sparrow.protocol.dao.DatabasePagerQuery; 5 | import java.util.Date; 6 | import lombok.Data; 7 | @Data 8 | 9 | public class $persistence_class_nameDBPagerQuery extends DatabasePagerQuery { 10 | public $persistence_class_nameDBPagerQuery() {} 11 | } 12 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/param.txt: -------------------------------------------------------------------------------- 1 | package $package_param; 2 | 3 | import com.sparrow.protocol.Param; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class $persistence_class_nameParam implements Param { 9 | $get_sets 10 | } 11 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/query.txt: -------------------------------------------------------------------------------- 1 | package $package_query; 2 | 3 | import com.sparrow.protocol.pager.SimplePager; 4 | import java.util.Date; 5 | import lombok.Data; 6 | @Data 7 | public class $persistence_class_nameQuery extends SimplePager { 8 | private String name; 9 | private Date beginDate; 10 | private Date endDate; 11 | 12 | public String getName() { 13 | return name; 14 | } 15 | 16 | public void setName(String name) { 17 | this.name = name; 18 | } 19 | 20 | public Date getBeginDate() { 21 | return beginDate; 22 | } 23 | 24 | public void setBeginDate(Date beginDate) { 25 | this.beginDate = beginDate; 26 | } 27 | 28 | public Date getEndDate() { 29 | return endDate; 30 | } 31 | 32 | public void setEndDate(Date endDate) { 33 | this.endDate = endDate; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/repository.txt: -------------------------------------------------------------------------------- 1 | package $package_repository; 2 | import $package_bo.$persistence_class_nameBO; 3 | import $package_param.$persistence_class_nameParam; 4 | import $package_query.$persistence_class_nameQuery; 5 | import java.util.List; 6 | 7 | 8 | 9 | public interface $persistence_class_nameRepository { 10 | Long save($persistence_class_nameParam $persistence_object_nameParam); 11 | 12 | Integer delete(String $persistence_object_nameIds); 13 | 14 | Integer disable(String $persistence_object_nameIds); 15 | 16 | Integer enable(String $persistence_object_nameIds); 17 | 18 | $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId); 19 | 20 | List<$persistence_class_nameBO> query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameQuery); 21 | 22 | Long get$persistence_class_nameCount($persistence_class_nameQuery $persistence_object_nameQuery); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/repositoryImpl.txt: -------------------------------------------------------------------------------- 1 | package $package_repository_impl; 2 | 3 | import com.sparrow.protocol.dao.StatusCriteria; 4 | import com.sparrow.protocol.enums.StatusRecord; 5 | import $package_dao.$persistence_class_nameDAO; 6 | import $package_data_converter.$persistence_class_nameConverter; 7 | import $package_po.$persistence_class_name; 8 | import $package_bo.$persistence_class_nameBO; 9 | import $package_param.$persistence_class_nameParam; 10 | import $package_repository.$persistence_class_nameRepository; 11 | import $package_query.$persistence_class_nameQuery; 12 | 13 | import java.util.List; 14 | import javax.inject.Inject; 15 | import javax.inject.Named; 16 | 17 | @Named 18 | public class $persistence_class_nameRepositoryImpl implements $persistence_class_nameRepository { 19 | @Inject 20 | private $persistence_class_nameConverter $persistence_object_nameConverter; 21 | 22 | @Inject 23 | private $persistence_class_nameDAO $persistence_object_nameDao; 24 | 25 | @Override public Long save($persistence_class_nameParam $persistence_object_nameParam) { 26 | $persistence_class_name $persistence_object_name = this.$persistence_object_nameConverter.param2po($persistence_object_nameParam); 27 | if ($persistence_object_name.get$upper_primary_property_name() != null) { 28 | this.$persistence_object_nameDao.update($persistence_object_name); 29 | return $persistence_object_name.get$upper_primary_property_name(); 30 | } 31 | this.$persistence_object_nameDao.insert($persistence_object_name); 32 | return $persistence_object_name.get$upper_primary_property_name(); 33 | } 34 | 35 | @Override public Integer delete(String $persistence_object_nameIds) { 36 | return this.$persistence_object_nameDao.batchDelete($persistence_object_nameIds); 37 | } 38 | 39 | @Override public Integer disable(String $persistence_object_nameIds) { 40 | StatusCriteria statusCriteria = new StatusCriteria($persistence_object_nameIds, StatusRecord.DISABLE); 41 | this.$persistence_object_nameConverter.convertStatus(statusCriteria); 42 | return this.$persistence_object_nameDao.changeStatus(statusCriteria); 43 | } 44 | 45 | @Override public Integer enable(String $persistence_object_nameIds) { 46 | StatusCriteria statusCriteria = new StatusCriteria($persistence_object_nameIds, StatusRecord.ENABLE); 47 | this.$persistence_object_nameConverter.convertStatus(statusCriteria); 48 | 49 | return this.$persistence_object_nameDao.changeStatus(statusCriteria); 50 | } 51 | 52 | @Override public $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId) { 53 | $persistence_class_name $persistence_object_name = this.$persistence_object_nameDao.getEntity($persistence_object_nameId); 54 | return this.$persistence_object_nameConverter.po2bo($persistence_object_name); 55 | } 56 | 57 | @Override public List<$persistence_class_nameBO> query$persistence_class_names($persistence_class_nameQuery $persistence_object_nameQuery) { 58 | List<$persistence_class_name> $persistence_object_nameList = this.$persistence_object_nameDao.query$persistence_class_names(this.$persistence_object_nameConverter.toDbPagerQuery($persistence_object_nameQuery)); 59 | return this.$persistence_object_nameConverter.poList2BoList($persistence_object_nameList); 60 | } 61 | 62 | @Override public Long get$persistence_class_nameCount($persistence_class_nameQuery $persistence_object_nameQuery) { 63 | return this.$persistence_object_nameDao.count$persistence_class_name(this.$persistence_object_nameConverter.toDbPagerQuery($persistence_object_nameQuery)); 64 | } 65 | } -------------------------------------------------------------------------------- /coder/src/main/resources/template/service.txt: -------------------------------------------------------------------------------- 1 | package $package_service; 2 | 3 | import com.sparrow.exception.Asserts; 4 | import com.sparrow.protocol.BusinessException; 5 | import com.sparrow.protocol.ListRecordTotalBO; 6 | import $package_bo.$persistence_class_nameBO; 7 | import $package_repository.$persistence_class_nameRepository; 8 | import $package_param.$persistence_class_nameParam; 9 | import $package_query.$persistence_class_nameQuery; 10 | import com.sparrow.utility.StringUtility; 11 | import java.util.List; 12 | import javax.inject.Inject; 13 | import javax.inject.Named; 14 | 15 | @Named 16 | public class $persistence_class_nameService { 17 | @Inject 18 | private $persistence_class_nameRepository $persistence_object_nameRepository; 19 | 20 | private void validateSave$persistence_class_name($persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 21 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameParam.getName()), SecurityAdminError.NAME_IS_EMPTY, $persistence_class_nameSuffix.name); 22 | } 23 | 24 | public Long save$persistence_class_name($persistence_class_nameParam $persistence_object_nameParam) throws BusinessException { 25 | this.validateSave$persistence_class_name($persistence_object_nameParam); 26 | return this.$persistence_object_nameRepository.save($persistence_object_nameParam); 27 | } 28 | 29 | public Integer delete$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 30 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameIds), SecurityAdminError.$persistence_class_name_ID_IS_EMPTY); 31 | return this.$persistence_object_nameRepository.delete($persistence_object_nameIds); 32 | } 33 | 34 | public Integer enable$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 35 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameIds), SecurityAdminError.$persistence_class_name_ID_IS_EMPTY); 36 | return this.$persistence_object_nameRepository.enable($persistence_object_nameIds); 37 | } 38 | 39 | public Integer disable$persistence_class_name(String $persistence_object_nameIds) throws BusinessException { 40 | //Asserts.isTrue(StringUtility.isNullOrEmpty($persistence_object_nameIds), SecurityAdminError.$persistence_class_name_ID_IS_EMPTY); 41 | return this.$persistence_object_nameRepository.disable($persistence_object_nameIds); 42 | } 43 | 44 | public ListRecordTotalBO<$persistence_class_nameBO> queryAll$persistence_class_name() { 45 | return query$persistence_class_name(null); 46 | } 47 | 48 | public ListRecordTotalBO<$persistence_class_nameBO> query$persistence_class_name($persistence_class_nameQuery $persistence_object_nameQuery) { 49 | Long totalRecord = this.$persistence_object_nameRepository.get$persistence_class_nameCount($persistence_object_nameQuery); 50 | List<$persistence_class_nameBO> $persistence_object_nameBoList = null; 51 | if (totalRecord > 0) { 52 | $persistence_object_nameBoList = this.$persistence_object_nameRepository.query$persistence_class_names($persistence_object_nameQuery); 53 | } 54 | return new ListRecordTotalBO<>($persistence_object_nameBoList, totalRecord); 55 | } 56 | 57 | public $persistence_class_nameBO get$persistence_class_name(Long $persistence_object_nameId) throws BusinessException { 58 | //Asserts.isTrue($persistence_object_nameId == null, SecurityAdminError.$persistence_object_name_IS_EMPTY); 59 | return this.$persistence_object_nameRepository.get$persistence_class_name($persistence_object_nameId); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/sql/attentionUser.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `attention_user_%1$s` ( 2 | `relation_id` int(10) NOT NULL AUTO_INCREMENT, 3 | `user_id` int(10) NOT NULL DEFAULT '0', 4 | `attention_id` int(10) NOT NULL DEFAULT '0', 5 | `create_time` timestamp NULL, 6 | `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 7 | `status` tinyint(3) unsigned NOT NULL DEFAULT '0', 8 | PRIMARY KEY (`relation_id`) 9 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 10 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/sql/event.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `event_%s`; 2 | CREATE TABLE `event_%s` ( 3 | `event_id` int(10) UNSIGNED AUTO_INCREMENT COMMENT 'primary key' NOT NULL , 4 | `user_type` varchar(16) DEFAULT '' COMMENT 'user type' NOT NULL, 5 | `user_id` int(10) UNSIGNED COMMENT 'user id' NOT NULL, 6 | `business_type` varchar(64) DEFAULT '' COMMENT 'ip' NOT NULL, 7 | `business_id` int(10) UNSIGNED COMMENT 'business id' NOT NULL, 8 | `times` int(10) DEFAULT 0 COMMENT 'times' NOT NULL, 9 | `channel` varchar(256) DEFAULT '' COMMENT 'channel' NOT NULL, 10 | `ip` char(16) DEFAULT '' COMMENT 'ip' NOT NULL, 11 | `device` varchar(32) DEFAULT '' COMMENT 'device' NOT NULL, 12 | `device_id` varchar(64) DEFAULT '' COMMENT 'device unique id' NOT NULL, 13 | `device_model` varchar(16) DEFAULT '' COMMENT 'device model 5s e.g ...' NOT NULL, 14 | `event` varchar(64) DEFAULT '' COMMENT 'event type' NOT NULL, 15 | `content` varchar(512) DEFAULT '' COMMENT 'content' NOT NULL, 16 | `status` varchar(64) DEFAULT '' COMMENT 'status' NOT NULL, 17 | `website` varchar(256) DEFAULT '' COMMENT 'website home url' NOT NULL, 18 | `app_id` int(11) UNSIGNED DEFAULT 0 COMMENT 'app id' NOT NULL, 19 | `app_version` float(11,2) DEFAULT 0.0 COMMENT 'app version' NOT NULL, 20 | `platform` varchar(16) DEFAULT '' COMMENT 'platform' NOT NULL, 21 | `os` varchar(16) DEFAULT '' COMMENT 'operation system' NOT NULL, 22 | `user_agent` varchar(512) DEFAULT '' COMMENT 'use agent' NOT NULL, 23 | `client_version` varchar(64) DEFAULT '' COMMENT 'client os version' NOT NULL, 24 | `longitude` double DEFAULT 0.0 COMMENT 'longitude' NOT NULL, 25 | `latitude` double DEFAULT 0.0 COMMENT 'latitude' NOT NULL, 26 | `network` varchar(16) DEFAULT '' COMMENT 'network' NOT NULL, 27 | `simulate` tinyint(1) DEFAULT 0 COMMENT 'is simulate' NOT NULL, 28 | `imei` varchar(64) DEFAULT '' COMMENT 'imei' NOT NULL, 29 | `bssid` varchar(64) DEFAULT '' COMMENT 'bssi' NOT NULL, 30 | `ssid` char(64) DEFAULT '' COMMENT 'ssid' NOT NULL, 31 | `idfa` char(64) DEFAULT '' COMMENT 'idfa' NOT NULL, 32 | `start_time` bigint(20) DEFAULT 0 COMMENT 'client start time' NOT NULL, 33 | `resume_time` bigint(20) DEFAULT 0 COMMENT 'client resume time' NOT NULL, 34 | `create_time` bigint(20) DEFAULT 0 NOT NULL, 35 | `update_time` bigint(20) DEFAULT 0 NOT NULL, 36 | PRIMARY KEY (`event_id`) 37 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='event'; 38 | -------------------------------------------------------------------------------- /coder/src/main/resources/template/sql/fansUser.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `fans_user_%1$s` ( 2 | `relation_id` int(10) NOT NULL AUTO_INCREMENT, 3 | `user_id` int(10) NOT NULL DEFAULT '0', 4 | `fans_id` int(10) NOT NULL DEFAULT '0', 5 | `create_time` timestamp NULL, 6 | `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 7 | `status` tinyint(3) unsigned NOT NULL DEFAULT '0', 8 | PRIMARY KEY (`relation_id`) 9 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -------------------------------------------------------------------------------- /coder/src/main/resources/template/vo.txt: -------------------------------------------------------------------------------- 1 | package $package_vo; 2 | 3 | import com.sparrow.protocol.VO; 4 | import lombok.Data; 5 | @Data 6 | public class $persistence_class_nameVO implements VO { 7 | $get_sets 8 | } 9 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/CodeGeneratorDemo.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | public class CodeGeneratorDemo { 4 | public static void main(String[] args) throws Exception { 5 | //args = "--example".split(" "); 6 | args = "-b com.sparrow.coding.protocol.TableDef".split(" "); 7 | //args = "-pq com.sparrow.example.po.SparrowExample -config=/Users/zhanglizhi/workspace/tedu/tarena-tp-basic/basic-po/bin/config.properties".split(" "); 8 | JavaMain.main(args); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/FileTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | import java.io.File; 4 | import java.nio.file.Path; 5 | 6 | public class FileTest { 7 | public static void main(String[] args) { 8 | System.out.println(File.separator); 9 | System.out.println(File.pathSeparator); 10 | System.out.println(System.getProperty("user.home")); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/HelloWorld.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | /** 4 | * java -classpath 5 | * $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path 6 | * com.sparrow.coding.JavaMain $option $2 $3 7 | */ 8 | public class HelloWorld { 9 | public static void main(String[] args) { 10 | System.out.println("Hello World!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/MavenInstall.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding; 2 | 3 | import com.sparrow.protocol.constant.Constant; 4 | import com.sparrow.support.EnvironmentSupport; 5 | import com.sparrow.utility.FileUtility; 6 | import java.io.BufferedReader; 7 | import java.io.File; 8 | import java.io.FilenameFilter; 9 | import java.io.IOException; 10 | import java.io.InputStream; 11 | import java.io.InputStreamReader; 12 | import java.nio.charset.StandardCharsets; 13 | import java.util.StringTokenizer; 14 | import sun.misc.JarFilter; 15 | 16 | public class MavenInstall { 17 | 18 | private static Runtime _runRuntime = Runtime.getRuntime(); 19 | private static String CMD_INSTALL_FILE; 20 | 21 | public static void main(String[] args) { 22 | File file = new File(EnvironmentSupport.getInstance().getWorkspace() + "/Sparrow/jar"); 23 | FilenameFilter filter = new JarFilter(); 24 | File[] jarFiles = file.listFiles(filter); 25 | for (File jar : jarFiles) { 26 | installJarToMaven(jar); 27 | } 28 | } 29 | 30 | private static void installJarToMaven(File file) { 31 | String fileName = file.getName(); 32 | String jarName = FileUtility.getInstance().getFileNameProperty(fileName).getName(); 33 | StringTokenizer strToken = new StringTokenizer(jarName, "-"); 34 | String groupId = null; 35 | String artifactId = null; 36 | String version = null; 37 | if (strToken.hasMoreTokens()) { 38 | groupId = strToken.nextToken(); 39 | if (strToken.hasMoreTokens()) { 40 | artifactId = strToken.nextToken(); 41 | if (strToken.hasMoreTokens()) { 42 | version = strToken.nextToken(); 43 | } 44 | } else { 45 | version = artifactId = groupId; 46 | } 47 | } 48 | System.out.println("Jar [" + jarName + "] will be installed with the groupId=" + groupId + " ," 49 | + "artifactId=" + artifactId + " , version=" + version + "."); 50 | executeInstall(groupId, artifactId, version, file.getPath()); 51 | } 52 | 53 | private static void executeInstall(String groupId, String artifactId, 54 | String version, String path) { 55 | CMD_INSTALL_FILE = createInstallFileCMD(groupId, artifactId, 56 | version, path); 57 | String[] cmdArray = new String[] {"cmd", "/C", CMD_INSTALL_FILE}; 58 | try { 59 | Process process = _runRuntime.exec(cmdArray); 60 | printResult(process); 61 | } catch (IOException e) { 62 | e.printStackTrace(); 63 | } 64 | } 65 | 66 | private static void printResult(Process process) throws IOException { 67 | InputStream is = process.getInputStream(); 68 | BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); 69 | String lineStr; 70 | while ((lineStr = br.readLine()) != null) { 71 | System.out.println(lineStr); 72 | } 73 | } 74 | 75 | private static String createInstallFileCMD(String groupId, 76 | String artifactId, String version, String path) { 77 | StringBuilder sb = new StringBuilder(); 78 | sb.append("mvn install:install-file -DgroupId=").append(groupId) 79 | .append(" -DartifactId=").append(artifactId) 80 | .append(" -Dversion=").append(version) 81 | .append(" -Dpackaging=jar") 82 | .append(" -Dfile=").append(path); 83 | return sb.toString(); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/generate/BackendTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.generate; 2 | 3 | import com.sparrow.coding.DigitalCategory; 4 | import com.sparrow.coding.api.CodeGenerator; 5 | import com.sparrow.coding.api.ValidatorMessageGenerator; 6 | import com.sparrow.coding.api.ValidatorRegistry; 7 | import com.sparrow.coding.java.DefaultCodeGenerator; 8 | import com.sparrow.coding.protocol.validate.DigitalValidator; 9 | import com.sparrow.container.Container; 10 | import com.sparrow.container.ContainerBuilder; 11 | import com.sparrow.core.spi.ApplicationContext; 12 | import org.junit.jupiter.api.Test; 13 | 14 | import java.io.IOException; 15 | 16 | public class BackendTest { 17 | @Test 18 | public void generate() throws IOException, ClassNotFoundException { 19 | Container container = ApplicationContext.getContainer(); 20 | container.init(new ContainerBuilder().initController(false) 21 | .initInterceptor(false) 22 | .scanBasePackage("com.sparrow")); 23 | 24 | CodeGenerator generator = new DefaultCodeGenerator(1L); 25 | generator.initScaffold(); 26 | //generator.generate("t_table_config"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/mybatis/MybatisEntityManagerTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.mybatis; 2 | 3 | import com.sparrow.coding.java.EnvironmentContext; 4 | import com.sparrow.container.Container; 5 | import com.sparrow.container.ContainerBuilder; 6 | import com.sparrow.core.spi.ApplicationContext; 7 | 8 | import java.io.IOException; 9 | 10 | public class MybatisEntityManagerTest { 11 | public static void main(String[] args) throws IOException { 12 | Container container = ApplicationContext.getContainer(); 13 | container.init(new ContainerBuilder().initController(false) 14 | .initInterceptor(false) 15 | .scanBasePackage("com.sparrow")); 16 | EnvironmentContext environmentContext=new EnvironmentContext(null); 17 | // MybatisEntityManager entityManager=new MybatisEntityManager(SparrowExample.class,environmentContext); 18 | // entityManager.init(); 19 | // System.out.println(entityManager.getXml()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/sparrow/DigitalTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.sparrow; 2 | 3 | import com.sparrow.coding.DigitalCategory; 4 | import com.sparrow.coding.api.ValidatorMessageGenerator; 5 | import com.sparrow.coding.api.ValidatorRegistry; 6 | import com.sparrow.coding.protocol.validate.DigitalValidator; 7 | import com.sparrow.container.Container; 8 | import com.sparrow.container.ContainerBuilder; 9 | import com.sparrow.core.spi.ApplicationContext; 10 | import org.junit.jupiter.api.Test; 11 | 12 | public class DigitalTest { 13 | 14 | 15 | @Test 16 | public void digital() { 17 | Container container = ApplicationContext.getContainer(); 18 | container.init(new ContainerBuilder().initController(false) 19 | .initInterceptor(false) 20 | .scanBasePackage("com.sparrow")); 21 | ValidatorMessageGenerator messageGenerator = ValidatorRegistry.getInstance().getValidatorMessageGenerator("valibot", 22 | "digitalValidatorMessageGenerator"); 23 | 24 | DigitalValidator validator = new DigitalValidator(); 25 | validator.setI18n(true); 26 | //validator.setI18nFieldName("age"); 27 | validator.setAllowEmpty(false); 28 | validator.setEmptyMessage("年龄不允许为空"); 29 | validator.setMinValue(5); 30 | validator.setMaxValue(30); 31 | validator.setDigitalMessage("请输入正确的年龄"); 32 | validator.setCategory(DigitalCategory.INTEGER); 33 | validator.setMinValueMessage("年龄不能小于5"); 34 | validator.setMaxValueMessage("年龄不能大于30"); 35 | 36 | String validateMessage = messageGenerator.generateConfig("age", validator); 37 | String i18nValidateMessage = messageGenerator.generateI18NConfig(validator); 38 | System.out.println(i18nValidateMessage); 39 | System.out.println(validateMessage); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/sparrow/EmailTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.sparrow; 2 | 3 | import com.sparrow.coding.api.ValidatorMessageGenerator; 4 | import com.sparrow.coding.api.ValidatorRegistry; 5 | import com.sparrow.coding.protocol.validate.RegexValidator; 6 | import com.sparrow.container.Container; 7 | import com.sparrow.container.ContainerBuilder; 8 | import com.sparrow.core.spi.ApplicationContext; 9 | import org.junit.jupiter.api.Test; 10 | 11 | public class EmailTest { 12 | @Test 13 | public void email() { 14 | Container container = ApplicationContext.getContainer(); 15 | container.init(new ContainerBuilder().initController(false) 16 | .initInterceptor(false) 17 | .scanBasePackage("com.sparrow")); 18 | ValidatorMessageGenerator messageGenerator = ValidatorRegistry.getInstance().getValidatorMessageGenerator("valibot", 19 | "emailValidatorMessageGenerator"); 20 | 21 | RegexValidator validator = new RegexValidator(); 22 | validator.setAllowEmpty(false); 23 | validator.setI18n(false); 24 | validator.setEmptyMessage("邮箱不能为空"); 25 | validator.setMinLength(5); 26 | validator.setMaxLength(30); 27 | validator.setFormatMessage("请输入正确的邮箱格式"); 28 | validator.setMinLengthMessage("邮箱长度必须在5到30之间"); 29 | validator.setMaxLengthMessage("邮箱长度必须在5到30之间"); 30 | 31 | String validateMessage = messageGenerator.generateConfig("email", validator); 32 | System.out.println(validateMessage); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/sparrow/IdCardTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.sparrow; 2 | 3 | import com.sparrow.coding.api.ValidatorMessageGenerator; 4 | import com.sparrow.coding.api.ValidatorRegistry; 5 | import com.sparrow.coding.protocol.validate.RegexValidator; 6 | import com.sparrow.container.Container; 7 | import com.sparrow.container.ContainerBuilder; 8 | import com.sparrow.core.spi.ApplicationContext; 9 | import org.junit.jupiter.api.Test; 10 | 11 | public class IdCardTest { 12 | @Test 13 | public void idCard() { 14 | Container container = ApplicationContext.getContainer(); 15 | container.init(new ContainerBuilder().initController(false) 16 | .initInterceptor(false) 17 | .scanBasePackage("com.sparrow")); 18 | ValidatorMessageGenerator messageGenerator = ValidatorRegistry.getInstance().getValidatorMessageGenerator("valibot", 19 | "idCardValidatorMessageGenerator"); 20 | 21 | RegexValidator validator = new RegexValidator(); 22 | validator.setAllowEmpty(true); 23 | validator.setI18n(false); 24 | validator.setEmptyMessage("身份证不能为空"); 25 | validator.setFormatMessage("请输入正确的身份证格式"); 26 | 27 | String validateMessage = messageGenerator.generateConfig("idCard", validator); 28 | System.out.println(validateMessage); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/sparrow/MobileTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.sparrow; 2 | 3 | import com.sparrow.coding.api.ValidatorMessageGenerator; 4 | import com.sparrow.coding.api.ValidatorRegistry; 5 | import com.sparrow.coding.protocol.validate.RegexValidator; 6 | import com.sparrow.container.Container; 7 | import com.sparrow.container.ContainerBuilder; 8 | import com.sparrow.core.spi.ApplicationContext; 9 | import org.junit.jupiter.api.Test; 10 | 11 | public class MobileTest { 12 | @Test 13 | public void idCard() { 14 | Container container = ApplicationContext.getContainer(); 15 | container.init(new ContainerBuilder().initController(false) 16 | .initInterceptor(false) 17 | .scanBasePackage("com.sparrow")); 18 | ValidatorMessageGenerator messageGenerator = ValidatorRegistry.getInstance().getValidatorMessageGenerator("valibot", 19 | "mobileValidatorMessageGenerator"); 20 | 21 | RegexValidator validator = new RegexValidator(); 22 | validator.setAllowEmpty(false); 23 | validator.setI18n(false); 24 | validator.setEmptyMessage("手机号不能为空"); 25 | validator.setFormatMessage("请输入正确的手机号格式"); 26 | String validateMessage = messageGenerator.generateConfig("mobile", validator); 27 | System.out.println(validateMessage); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /coder/src/test/java/com/sparrow/coding/validator/ValidatorTest.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.coding.validator; 2 | 3 | import com.sparrow.coding.ApplicationBoot; 4 | import com.sparrow.coding.api.ValidatorMessageGenerator; 5 | import com.sparrow.coding.api.ValidatorRegistry; 6 | import com.sparrow.coding.protocol.validate.RegexValidator; 7 | import org.junit.jupiter.api.Test; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | 10 | @SpringBootTest(classes = {ApplicationBoot.class}) 11 | public class ValidatorTest { 12 | @Test 13 | public void test() { 14 | ValidatorMessageGenerator messageGenerator = ValidatorRegistry.getInstance().getValidatorMessageGenerator("valibot", 15 | "emailValidatorMessageGenerator"); 16 | 17 | RegexValidator validator = new RegexValidator(); 18 | validator.setAllowEmpty(true); 19 | validator.setI18n(false); 20 | validator.setEmptyMessage("用户名不能为空"); 21 | validator.setMinLength(5); 22 | validator.setMaxLength(30); 23 | validator.setFormatMessage("请输入正确的邮箱格式"); 24 | validator.setMinLengthMessage("用户名长度必须在5到30之间"); 25 | 26 | String validateMessage = messageGenerator.generateConfig("email", validator); 27 | System.out.println(validateMessage); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /example-po/bin/config.properties: -------------------------------------------------------------------------------- 1 | #SPARROW_CODER_HOME=${user.home}/workspace/sparrow/sparrow-coder/coder/target 2 | 3 | author=harry 4 | workspace=${user.home}/workspace/sparrow 5 | project=sparrow-coder 6 | module.prefix=example 7 | backend_template_home=$coder_home/classes/template 8 | table_output_home=$workspace/$project/example-po/bin 9 | 10 | resource_workspace=${user.home}/workspace/sparrow 11 | frontend_generator_config=/sparrow_generator.xml 12 | language_js_path=$resource_workspace/sparrow-js/source/ext/scripts/system/language/zh_cn 13 | js_path=$resource_workspace/sparrow-js/source/ext/scripts/system 14 | #css_path=$resource_workspace/sparrow-js/source/ext/sparrowzoo/styles/system 15 | view_template_path=$workspace/$project/admin/$module_prefix-admin-main-spring-boot/src/main/resources/templates 16 | extension=.html 17 | 18 | 19 | module.parent.admin=admin 20 | #module.persistence=cms-po 21 | module.admin.adapter=$module_prefix-admin-adapter 22 | module.admin.dao.api=$module_prefix-admin-dao-api 23 | module.admin.domain=$module_prefix-admin-domain 24 | module.admin.infrastructure=$module_prefix-admin-infrastructure 25 | module.admin.main.boot=$module_prefix-admin-main-spring-boot 26 | module.admin.protocol=$module_prefix-admin-protocol 27 | module.admin.dao.sparrow=$module_prefix-admin-dao-sparrow 28 | module.admin.dao.mybatis=$module_prefix-admin-dao-mybatis 29 | 30 | 31 | 32 | package.po=po 33 | package.bo=admin.domain.bo 34 | package.query=admin.protocol.query 35 | package.param=admin.protocol.param 36 | package.vo=admin.adapter.protocol.vo 37 | package.dao=admin.dao 38 | package.service=admin.domain.service 39 | package.dao_impl=admin.dao.sparrow 40 | package.dao_mybatis=admin.dao.mybatis 41 | package.repository_impl=admin.infrastructure.persistence 42 | package.repository=admin.repository 43 | package.controller=admin.adapter.controller 44 | package.assemble=admin.adapter.assemble 45 | package.data_converter=admin.infrastructure.persistence.data.converter 46 | package.pager_query=admin.dao.query 47 | package.batch_operate_param=admin.protocol.param.batch 48 | 49 | 50 | class.po=$persistence_class_name 51 | class.assemble=$persistence_class_nameAssemble 52 | class.query=$persistence_class_nameQuery 53 | class.bo=$persistence_class_nameBO 54 | class.param=$persistence_class_nameParam 55 | class.vo=$persistence_class_nameVO 56 | class.dao=$persistence_class_nameDAO 57 | class.repository=$persistence_class_nameRepository 58 | class.repository_impl=$persistence_class_nameRepositoryImpl 59 | class.service=$persistence_class_nameService 60 | class.dao_impl=$persistence_class_nameDaoImpl 61 | class.dao_mybatis=$persistence_class_nameMapper 62 | 63 | class.controller=$persistence_class_nameController 64 | class.data_converter=$persistence_class_nameConverter 65 | class.pager_query=$persistence_class_nameDBPagerQuery 66 | class.batch_operate_param=$persistence_class_nameBatchOperateParam 67 | 68 | 69 | -------------------------------------------------------------------------------- /example-po/bin/ddl/sparrow_example.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `sparrow_example`; 2 | CREATE TABLE `sparrow_example` ( 3 | `id` int(11) NOT NULL AUTO_INCREMENT, 4 | `avatar` varchar(256) DEFAULT '' COMMENT '头象' , 5 | `user_name` varchar(32) DEFAULT '' COMMENT '用户名' , 6 | `password` varchar(32) DEFAULT '' COMMENT '密码' , 7 | `age` int(10) UNSIGNED DEFAULT 0 COMMENT '年龄' , 8 | `confirm_password` varchar(32) DEFAULT '' COMMENT '确认密码' , 9 | `email` varchar(256) DEFAULT '' COMMENT 'email' , 10 | `id_card` varchar(32) DEFAULT '' COMMENT '身份证' , 11 | `mobile` varchar(16) DEFAULT '' COMMENT '手机号' , 12 | `tel` varchar(16) DEFAULT '' COMMENT '联系电话' , 13 | `name` varchar(16) DEFAULT '' COMMENT '用户姓名' , 14 | `create_user_id` int(11) UNSIGNED DEFAULT 0 COMMENT '创建人ID' NOT NULL, 15 | `gmt_create` bigint(11) DEFAULT 0 COMMENT '创建时间' NOT NULL, 16 | `modified_user_id` int(11) unsigned DEFAULT 0 COMMENT '更新人ID' NOT NULL, 17 | `gmt_modified` bigint(11) DEFAULT 0 COMMENT '更新时间' NOT NULL, 18 | `create_user_name` varchar(64) DEFAULT '' COMMENT '创建人' NOT NULL, 19 | `modified_user_name` varchar(64) DEFAULT '' COMMENT '更新人' NOT NULL, 20 | PRIMARY KEY (`id`) 21 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sparrow_example'; 22 | -------------------------------------------------------------------------------- /example-po/bin/example-front-coder-all.sh: -------------------------------------------------------------------------------- 1 | config_path=$(pwd)/config.properties 2 | echo $config_path 3 | sh ./sparrow-front-coder.sh -all com.sparrow.coding.config.ExampleFront -config=$config_path 4 | -------------------------------------------------------------------------------- /example-po/bin/example-java-coder-all.sh: -------------------------------------------------------------------------------- 1 | config_path=$(pwd)/config.properties 2 | echo $config_path 3 | 4 | if pwd | grep -q -E 'bin$'; then 5 | echo "true" 6 | else 7 | echo "请cd到bin目录下运行" 8 | exit 1 9 | fi 10 | 11 | 12 | sh ./sparrow-java-coder.sh -ct com.sparrow.example.po.TableDef -config=$config_path 13 | -------------------------------------------------------------------------------- /example-po/bin/sparrow-front-coder.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | source /etc/profile 3 | 4 | [ -z "$SPARROW_CODER_HOME" ] && echo "please config environment variable SPARROW_CODER_HOME" && exit 0 5 | sparrow_coder_name=sparrow-coder-all.jar 6 | class_path=$(cd ../target/classes;pwd) 7 | if [ $1 == '--help' ]; then 8 | java -classpath $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path com.sparrow.coding.FrontMain --help 9 | exit 10 | fi 11 | 12 | if [ $1 == '--example' ]; then 13 | java -classpath $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path com.sparrow.coding.FrontMain --example 14 | exit 15 | fi 16 | 17 | options=$1 18 | if [ $1 == '-all' ]; then 19 | options='-mp,-cp,-cj,-lj,-mj' 20 | fi 21 | #将,替换为空格 22 | options_array=(${options//,/ }) 23 | for option in ${options_array[@]} 24 | do 25 | echo java -classpath $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path com.sparrow.coding.FrontMain $option $2 26 | 27 | java -classpath $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path com.sparrow.coding.FrontMain $option $2 28 | done 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /example-po/bin/sparrow-java-coder.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | source /etc/profile 3 | 4 | [ -z "$SPARROW_CODER_HOME" ] && echo "please config environment variable SPARROW_CODER_HOME" && exit 0 5 | sparrow_coder_name=sparrow-coder-all.jar 6 | class_path=$(cd ../target/classes;pwd) 7 | if [ $1 == '--help' ]; then 8 | java -classpath $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path com.sparrow.coding.JavaMain --help 9 | fi 10 | 11 | if [ $1 == '--example' ]; then 12 | java -classpath $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path com.sparrow.coding.JavaMain --example 13 | fi 14 | 15 | options=$1 16 | if [ $1 == '-all' ]; then 17 | options='-b,-p,-q,-v,-cv,-pq,-cq,-bop,-d,-di,-mi,-r,-ri,-s,-c,-a,-ct' 18 | fi 19 | #将,替换为空格 20 | options_array=(${options//,/ }) 21 | for option in ${options_array[@]} 22 | do 23 | java -classpath $SPARROW_CODER_HOME/$sparrow_coder_name:$class_path com.sparrow.coding.JavaMain $option $2 $3 24 | done 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /example-po/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | sparrow-bom 7 | com.sparrowzoo 8 | 1.0.5-SNAPSHOT 9 | 10 | 11 | 4.0.0 12 | example-po 13 | com.sparrowzoo.coder 14 | 1.0.0-RELEASE 15 | 16 | 8 17 | 8 18 | 1.18.36 19 | 20 | 21 | 22 | 23 | com.sparrowzoo 24 | sparrow-protocol-dao 25 | 26 | 27 | org.projectlombok 28 | lombok 29 | ${lombok.version} 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /example-po/src/main/java/com/sparrow/example/po/SparrowExample.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.example.po; 2 | 3 | import com.sparrow.protocol.FieldOrder; 4 | import com.sparrow.protocol.MethodOrder; 5 | import com.sparrow.protocol.dao.PO; 6 | import javax.persistence.Column; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.Table; 11 | 12 | @Table(name = "sparrow_example") 13 | public class SparrowExample extends PO { 14 | 15 | @Id 16 | @GeneratedValue(strategy = GenerationType.IDENTITY) 17 | @Column(name = "id", columnDefinition = "int(11)") 18 | @FieldOrder(order = 0) 19 | private Long id; 20 | 21 | private String avatar; 22 | 23 | private String userName; 24 | 25 | private String password; 26 | 27 | private String age; 28 | 29 | private String email; 30 | 31 | private String confirmPassword; 32 | 33 | private String idCard; 34 | 35 | private String mobile; 36 | 37 | private String tel; 38 | 39 | private String name; 40 | 41 | public Long getId() { 42 | return this.id; 43 | } 44 | 45 | public void setId(Long id) { 46 | this.id = id; 47 | } 48 | 49 | @MethodOrder(order = 1) 50 | @Column(name = "avatar", columnDefinition = "varchar(256) DEFAULT '' COMMENT '头象'", updatable = false) 51 | public String getAvatar() { 52 | return avatar; 53 | } 54 | 55 | public void setAvatar(String avatar) { 56 | this.avatar = avatar; 57 | } 58 | 59 | @MethodOrder(order = 2) 60 | @Column(name = "user_name", columnDefinition = "varchar(32) DEFAULT '' COMMENT '用户名'", updatable = false) 61 | public String getUserName() { 62 | return userName; 63 | } 64 | 65 | public void setUserName(String userName) { 66 | this.userName = userName; 67 | } 68 | 69 | @MethodOrder(order = 3) 70 | @Column(name = "password", columnDefinition = "varchar(32) DEFAULT '' COMMENT '密码'", updatable = false) 71 | public String getPassword() { 72 | return password; 73 | } 74 | 75 | public void setPassword(String password) { 76 | this.password = password; 77 | } 78 | 79 | @MethodOrder(order = 3) 80 | @Column(name = "age", columnDefinition = "int(10) UNSIGNED DEFAULT 0 COMMENT '年龄'", updatable = false) 81 | public String getAge() { 82 | return age; 83 | } 84 | 85 | public void setAge(String age) { 86 | this.age = age; 87 | } 88 | 89 | @MethodOrder(order = 4) 90 | @Column(name = "email", columnDefinition = "varchar(256) DEFAULT '' COMMENT 'email'", updatable = false) 91 | public String getEmail() { 92 | return email; 93 | } 94 | 95 | public void setEmail(String email) { 96 | this.email = email; 97 | } 98 | 99 | @MethodOrder(order = 4) 100 | @Column(name = "confirm_password", columnDefinition = "varchar(32) DEFAULT '' COMMENT '确认密码'", updatable = false) 101 | public String getConfirmPassword() { 102 | return confirmPassword; 103 | } 104 | 105 | public void setConfirmPassword(String confirmPassword) { 106 | this.confirmPassword = confirmPassword; 107 | } 108 | 109 | @MethodOrder(order = 5) 110 | @Column(name = "id_card", columnDefinition = "varchar(32) DEFAULT '' COMMENT '身份证'", updatable = false) 111 | public String getIdCard() { 112 | return idCard; 113 | } 114 | 115 | public void setIdCard(String idCard) { 116 | this.idCard = idCard; 117 | } 118 | 119 | @MethodOrder(order = 5) 120 | @Column(name = "mobile", columnDefinition = "varchar(16) DEFAULT '' COMMENT '手机号'", updatable = false) 121 | public String getMobile() { 122 | return mobile; 123 | } 124 | 125 | public void setMobile(String mobile) { 126 | this.mobile = mobile; 127 | } 128 | 129 | @MethodOrder(order = 5) 130 | @Column(name = "tel", columnDefinition = "varchar(16) DEFAULT '' COMMENT '联系电话'", updatable = false) 131 | public String getTel() { 132 | return tel; 133 | } 134 | 135 | public void setTel(String tel) { 136 | this.tel = tel; 137 | } 138 | 139 | @MethodOrder(order = 5) 140 | @Column(name = "name", columnDefinition = "varchar(16) DEFAULT '' COMMENT '用户姓名'", updatable = false) 141 | public String getName() { 142 | return name; 143 | } 144 | 145 | public void setName(String name) { 146 | this.name = name; 147 | } 148 | 149 | } 150 | -------------------------------------------------------------------------------- /example-po/src/main/java/com/sparrow/example/po/TableDef.java: -------------------------------------------------------------------------------- 1 | package com.sparrow.example.po; 2 | 3 | import com.sparrow.protocol.FieldOrder; 4 | import com.sparrow.protocol.dao.PO; 5 | import lombok.Data; 6 | 7 | import javax.persistence.*; 8 | 9 | @Data 10 | @Table(name = "t_table_config") 11 | public class TableDef extends PO { 12 | @Id 13 | @GeneratedValue(strategy = GenerationType.IDENTITY) 14 | @Column(name = "id", columnDefinition = "int") 15 | @FieldOrder(order = 0) 16 | private Long id; 17 | @Column(name = "table_name", updatable = false, nullable = false, unique = true, columnDefinition = "varchar(32) default '' comment '表名'") 18 | private String tableName; 19 | @Column(name = "class_name", updatable = false, nullable = false, unique = true, columnDefinition = "varchar(32) default '' comment '类名'") 20 | private String className; 21 | @Column(name = "description", nullable = false, columnDefinition = "varchar(255) default '' comment '描述'") 22 | private String description; 23 | @Column(name = "checkable", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否可勾选 0-不可 1-可'") 24 | private Boolean checkable; 25 | @Column(name = "row_menu", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否显示行操作 0-不显示 1-显示'") 26 | private Boolean rowMenu; 27 | @Column(name = "column_filter", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否显示列过滤器 0-不显示 1-显示'") 28 | private Boolean columnFilter; 29 | @Column(name = "status_command", nullable = false, columnDefinition = "tinyint(1) default 0 comment '是否显示状态命令 0-不显示 1-显示'") 30 | private Boolean statusCommand; 31 | @Column(name = "column_configs", columnDefinition = "text default '' comment '列配置'") 32 | private String columnConfigs; 33 | } 34 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | coder 8 | coder-protocol 9 | example-po 10 | 11 | com.sparrowzoo.coder 12 | sparrow-coder 13 | 1.0 14 | pom 15 | -------------------------------------------------------------------------------- /release-note.md: -------------------------------------------------------------------------------- 1 | # 1.0.1-RELEASE 2 | 2023-04-17 3 | - 支持脚手架自动生成 4 | - 支持基于整洁架构代码CURD生成【附sparrow框架前端】 5 | - 支持严格架构到松散架构的复制迁移 6 | - 支持前端代码生成 7 | - 支持linux shell 自动生成脚本 8 | - 相关sparrow 依赖已提交中央仓库,clone 后配置相关环境变量即可编译使用 9 | - 修复部分bug 10 | - 优化部分代码 11 | - 优化部分文档 【新增release note】 12 | - 13 | -------------------------------------------------------------------------------- /整洁架构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparrowzoo/sparrow-coder/80a64e1317dbb11b8572d519e491b2f4bbeef990/整洁架构.png --------------------------------------------------------------------------------