springcloud自動生成腳手架搭建(二)
阿新 • • 發佈:2019-02-19
完成之後的前臺頁面展示:
測試地址 :dota2info.cn/index
1.配置pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring.boot.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>${commons.lang.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons.io.version}</version> </dependency> <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>${commons.configuration.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <dependency> <artifactId>velocity</artifactId> <groupId>org.apache.velocity</groupId> <version>2.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>net.sourceforge.nekohtml</groupId> <artifactId>nekohtml</artifactId> <version>1.9.22</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.gameley</groupId> <artifactId>gameley-common</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.13.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> <version>1.5.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency>
資料庫使用mysql,使用mybatis-plus作為連線資料庫工具
2.配置application.yml3.編寫主要的生成工具類:# Tomcat server: tomcat: max-threads: 10 min-spare-threads: 10 port: 7777 # mysql spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/ag_admin?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: 123456 jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss thymeleaf: mode: LEGACYHTML5 cache: false # Mybatis配置 mybatis: mapperLocations: classpath:mapper/*.xml #mybatis mybatis-plus: mapper-locations: classpath:mapper/*.xml #實體掃描,多個package用逗號或者分號分隔 typeAliasesPackage: com.gameley.generator.entity global-config: #主鍵型別 0:"資料庫ID自增", 1:"使用者輸入ID",2:"全域性唯一ID (數字型別唯一ID)", 3:"全域性唯一ID UUID"; id-type: 0 #欄位策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" field-strategy: 2 #駝峰下劃線轉換 db-column-underline: true #重新整理mapper 除錯神器 refresh-mapper: true #資料庫大寫下劃線轉換 #capital-mode: true #序列介面實現類配置 #key-generator: cn.jeefast.xxx #邏輯刪除配置 logic-delete-value: 0 logic-not-delete-value: 1 #自定義填充策略介面實現 #meta-object-handler: cn.jeefast.xxx #自定義SQL注入器 #sql-injector: cn.jeefast.xxx configuration: map-underscore-to-camel-case: true cache-enabled: false
其餘部分及生成模板詳見:https://gitee.com/lwydyby/springcloud-adplatformpackage com.gameley.generator.utils; import com.baomidou.mybatisplus.plugins.Page; import com.gameley.generator.entity.ColumnEntity; import com.gameley.generator.entity.TableEntity; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.WordUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 程式碼生成器 工具類 * * @author chenshun * @email [email protected] * @date 2016年12月19日 下午11:40:24 */ public class GeneratorUtils { public static List<String> getTemplates() { List<String> templates = new ArrayList<String>(); templates.add("template/index.vue.vm"); templates.add("template/mapper.xml.vm"); templates.add("template/entity.java.vm"); templates.add("template/mapper.java.vm"); templates.add("template/controller.java.vm"); templates.add("template/service.java.vm"); templates.add("template/serviceImpl.java.vm"); return templates; } /** * 生成程式碼 */ public static void generatorCode(Map<String, String> table, List<Map<String, String>> columns, ZipOutputStream zip) { //配置資訊 Configuration config = getConfig(); //表資訊 TableEntity tableEntity = new TableEntity(); tableEntity.setTableName(table.get("tableName")); tableEntity.setComments(table.get("tableComment")); //表名轉換成Java類名 String className = tableToJava(tableEntity.getTableName(), config.getString("tablePrefix")); tableEntity.setClassName(className); tableEntity.setClassname(StringUtils.uncapitalize(className)); //列資訊 List<ColumnEntity> columsList = new ArrayList<>(); for (Map<String, String> column : columns) { ColumnEntity columnEntity = new ColumnEntity(); columnEntity.setColumnName(column.get("columnName")); columnEntity.setDataType(column.get("dataType")); columnEntity.setComments(column.get("columnComment")); columnEntity.setExtra(column.get("extra")); //列名轉換成Java屬性名 String attrName = columnToJava(columnEntity.getColumnName()); columnEntity.setAttrName(attrName); columnEntity.setAttrname(StringUtils.uncapitalize(attrName)); //列的資料型別,轉換成Java型別 String attrType = config.getString(columnEntity.getDataType(), "unknowType"); columnEntity.setAttrType(attrType); //是否主鍵 if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) { tableEntity.setPk(columnEntity); } columsList.add(columnEntity); } tableEntity.setColumns(columsList); //沒主鍵,則第一個欄位為主鍵 if (tableEntity.getPk() == null) { tableEntity.setPk(tableEntity.getColumns().get(0)); } //設定velocity資源載入器 Properties prop = new Properties(); prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); Velocity.init(prop); //封裝模板資料 Map<String, Object> map = new HashMap<>(); map.put("tableName", tableEntity.getTableName()); map.put("comments", tableEntity.getComments()); map.put("pk", tableEntity.getPk()); map.put("className", tableEntity.getClassName()); map.put("classname", tableEntity.getClassname()); map.put("pathName", tableEntity.getClassname().toLowerCase()); map.put("columns", tableEntity.getColumns()); map.put("package", config.getString("package")); map.put("author", config.getString("author")); map.put("email", config.getString("email")); map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN)); map.put("moduleName", config.getString("mainModule")); map.put("secondModuleName", toLowerCaseFirstOne(className)); map.put("enableCache",false); //不開啟二級快取 map.put("baseResultMap",true); VelocityContext context = new VelocityContext(map); //獲取模板列表 List<String> templates = getTemplates(); for (String template : templates) { //渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, "UTF-8"); tpl.merge(context, sw); try { //新增到zip zip.putNextEntry(new ZipEntry(getFileName(template, tableEntity.getClassName(), config.getString("package"), config.getString("mainModule")))); IOUtils.write(sw.toString(), zip, "UTF-8"); IOUtils.closeQuietly(sw); zip.closeEntry(); } catch (IOException e) { throw new RuntimeException("渲染模板失敗,表名:" + tableEntity.getTableName(), e); } } } /** * 列名轉換成Java屬性名 */ public static String columnToJava(String columnName) { return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", ""); } /** * 表名轉換成Java類名 */ public static String tableToJava(String tableName, String tablePrefix) { if (StringUtils.isNotBlank(tablePrefix)) { tableName = tableName.replace(tablePrefix, ""); } return columnToJava(tableName); } /** * 獲取配置資訊 */ public static Configuration getConfig() { try { return new PropertiesConfiguration("generator.properties"); } catch (ConfigurationException e) { throw new RuntimeException("獲取配置檔案失敗,", e); } } /** * 獲取檔名 */ public static String getFileName(String template, String className, String packageName, String moduleName) { String packagePath = "main" + File.separator + "java" + File.separator; String frontPath = "ui" + File.separator; if (StringUtils.isNotBlank(packageName)) { packagePath += packageName.replace(".", File.separator) + File.separator; } if (template.contains("index.vue.vm")) { return frontPath + "views" + File.separator + moduleName + File.separator + toLowerCaseFirstOne(className) + File.separator + "index.vue"; } if (template.contains("service.java.vm")) { return packagePath + "service" + File.separator + className + "Service.java"; } if (template.contains("mapper.java.vm")) { return packagePath + "dao" + File.separator + className + "Dao.java"; } if (template.contains("entity.java.vm")) { return packagePath + "entity" + File.separator + className + ".java"; } if (template.contains("controller.java.vm")) { return packagePath + "controller" + File.separator + className + "Controller.java"; } if (template.contains("serviceImpl.java.vm")) { return packagePath + "service" + File.separator +"impl"+File.separator+ className + "ServiceImpl.java"; } if (template.contains("mapper.xml.vm")) { return "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml"; } return null; } //首字母轉小寫 public static String toLowerCaseFirstOne(String s) { if (Character.isLowerCase(s.charAt(0))) { return s; } else { return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); } } }
---- 2018-01-10------
增加springcloud-bus,以實現自動配置
1.在兩個工程的pom.xml中引入
<!--訊息匯流排-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--config-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.在config的配置中加入
rabbitmq:
host: rabbitmq # 登入 Rabbitmq 後臺管理頁面地址為:http://localhost:15672
port: 5672
username: guest # 預設賬戶
password: guest # 預設密碼
3.在generator增加config配置類 (這裡只做了對資料庫的動態配置)
package com.gameley.generator.config;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
/**
*
* 配置資料庫
* @author wwmxd
* @version 1.2.0
*/
@Slf4j
@Configuration
@RefreshScope
public class DruidConfiguration {
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Bean //宣告其為Bean例項
@Primary //在同樣的DataSource中,首先使用被標註的DataSource
@RefreshScope
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
return datasource;
}
}
4.配置github或者碼雲上的專案管理,增加WebHooks,來主動推送更新
增加的url,例如:
http://{ip}:8888/bus/refresh
如需設定密碼,則在config中增加配置
encrypt:
key: 123456