Commit 0d414f63 by stylefeng

完善代码生成器

parent b0bed438
......@@ -29,6 +29,7 @@ public class ContextConfig {
private Boolean infoJsSwitch = true; //详情页面js
private Boolean daoSwitch = true; //dao
private Boolean serviceSwitch = true; //service
private Boolean entitySwitch = true; //生成实体的开关
public void init() {
if (entityName == null) {
......@@ -172,4 +173,12 @@ public class ContextConfig {
public void setModelMapperPackageName(String modelMapperPackageName) {
this.modelMapperPackageName = modelMapperPackageName;
}
public Boolean getEntitySwitch() {
return entitySwitch;
}
public void setEntitySwitch(Boolean entitySwitch) {
this.entitySwitch = entitySwitch;
}
}
......@@ -58,30 +58,4 @@ public class SimpleTemplateEngine extends GunsTemplateEngine {
generateFile(super.getContextConfig().getTemplatePrefixPath() + "/Controller.java.btl", controllerPath);
System.out.println("生成控制器成功!");
}
@Override
protected void generateDao() {
String daoPath = ToolUtil.format(super.getContextConfig().getProjectPath() + super.getDaoConfig().getDaoPathTemplate(),
ToolUtil.firstLetterToUpper(super.getContextConfig().getBizEnName()));
generateFile(super.getContextConfig().getTemplatePrefixPath() + "/Dao.java.btl", daoPath);
System.out.println("生成Dao成功!");
String mappingPath = ToolUtil.format(super.getContextConfig().getProjectPath() + super.getDaoConfig().getXmlPathTemplate(),
ToolUtil.firstLetterToUpper(super.getContextConfig().getBizEnName()));
generateFile(super.getContextConfig().getTemplatePrefixPath() + "/Mapping.xml.btl", mappingPath);
System.out.println("生成Dao Mapping xml成功!");
}
@Override
protected void generateService() {
String servicePath = ToolUtil.format(super.getContextConfig().getProjectPath() + super.getServiceConfig().getServicePathTemplate(),
ToolUtil.firstLetterToUpper(super.getContextConfig().getBizEnName()));
generateFile(super.getContextConfig().getTemplatePrefixPath() + "/Service.java.btl", servicePath);
System.out.println("生成Service成功!");
String serviceImplPath = ToolUtil.format(super.getContextConfig().getProjectPath() + super.getServiceConfig().getServiceImplPathTemplate(),
ToolUtil.firstLetterToUpper(super.getContextConfig().getBizEnName()));
generateFile(super.getContextConfig().getTemplatePrefixPath() + "/ServiceImpl.java.btl", serviceImplPath);
System.out.println("生成ServiceImpl成功!");
}
}
......@@ -94,13 +94,6 @@ public abstract class GunsTemplateEngine extends AbstractTemplateEngine {
if(super.contextConfig.getInfoJsSwitch()){
generatePageInfoJs();
}
if(super.contextConfig.getDaoSwitch()){
generateDao();
}
if(super.contextConfig.getServiceSwitch()){
generateService();
}
}
protected abstract void generatePageEditHtml();
......@@ -115,8 +108,4 @@ public abstract class GunsTemplateEngine extends AbstractTemplateEngine {
protected abstract void generateController();
protected abstract void generateDao();
protected abstract void generateService();
}
package generator;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.stylefeng.guns.core.template.engine.base.GunsTemplateEngine;
import generator.config.GunsGeneratorConfig;
/**
......@@ -12,8 +13,15 @@ import generator.config.GunsGeneratorConfig;
public class GunsCodeGenerator {
public static void main(String[] args) {
AutoGenerator generator = new GunsGeneratorConfig().getGenerator();
//mp的生成器
GunsGeneratorConfig gunsGeneratorConfig = new GunsGeneratorConfig();
AutoGenerator generator = gunsGeneratorConfig.getGenerator();
generator.execute();
//guns的生成器
GunsTemplateEngine gunsTemplateEngine = gunsGeneratorConfig.getGunsTemplateEngine();
gunsTemplateEngine.start();
}
}
\ No newline at end of file
......@@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.stylefeng.guns.core.template.config.ContextConfig;
import com.stylefeng.guns.core.template.engine.SimpleTemplateEngine;
import com.stylefeng.guns.core.template.engine.base.GunsTemplateEngine;
/**
* 代码生成的抽象配置
......@@ -14,6 +17,10 @@ import com.baomidou.mybatisplus.generator.config.StrategyConfig;
*/
public abstract class AbstractGeneratorConfig {
/**
* mybatis-plus代码生成器配置
*/
GlobalConfig globalConfig = new GlobalConfig();
DataSourceConfig dataSourceConfig = new DataSourceConfig();
......@@ -22,6 +29,11 @@ public abstract class AbstractGeneratorConfig {
PackageConfig packageConfig = new PackageConfig();
/**
* Guns代码生成器配置
*/
ContextConfig contextConfig = new ContextConfig();
protected abstract void globalConfig();
protected abstract void dataSourceConfig();
......@@ -30,18 +42,26 @@ public abstract class AbstractGeneratorConfig {
protected abstract void packageConfig();
protected abstract void contextConfig();
public void init() {
globalConfig();
dataSourceConfig();
strategyConfig();
packageConfig();
contextConfig();
//controller没用掉,生成之后会自动删掉
packageConfig.setController("TTT");
packageConfig.setService("com.stylefeng.guns.modular." + contextConfig.getModuleName() + ".service");
packageConfig.setServiceImpl("com.stylefeng.guns.modular." + contextConfig.getModuleName() + ".service.impl");
}
public AbstractGeneratorConfig(){
public AbstractGeneratorConfig() {
init();
}
public AutoGenerator getGenerator(){
public AutoGenerator getGenerator() {
AutoGenerator autoGenerator = new AutoGenerator();
autoGenerator.setGlobalConfig(globalConfig);
autoGenerator.setDataSource(dataSourceConfig);
......@@ -49,4 +69,10 @@ public abstract class AbstractGeneratorConfig {
autoGenerator.setPackageInfo(packageConfig);
return autoGenerator;
}
public GunsTemplateEngine getGunsTemplateEngine() {
GunsTemplateEngine gunsTemplateEngine = new SimpleTemplateEngine();
gunsTemplateEngine.setContextConfig(contextConfig);
return gunsTemplateEngine;
}
}
......@@ -13,38 +13,57 @@ public class GunsGeneratorConfig extends AbstractGeneratorConfig {
@Override
protected void globalConfig() {
super.globalConfig.setOutputDir("/Users/stylefeng/work/ideaSpace/guns/guns-admin/src/main/java");
super.globalConfig.setFileOverride(true);
super.globalConfig.setEnableCache(false);
super.globalConfig.setBaseResultMap(true);
super.globalConfig.setBaseColumnList(true);
super.globalConfig.setAuthor("stylefeng");
globalConfig.setOutputDir("/Users/stylefeng/work/ideaSpace/guns/guns-admin/src/main/java");
globalConfig.setFileOverride(true);
globalConfig.setEnableCache(false);
globalConfig.setBaseResultMap(true);
globalConfig.setBaseColumnList(true);
globalConfig.setAuthor("stylefeng");
}
@Override
protected void dataSourceConfig() {
super.dataSourceConfig.setDbType(DbType.MYSQL);
super.dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
super.dataSourceConfig.setUsername("root");
super.dataSourceConfig.setPassword("root");
super.dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/guns?characterEncoding=utf8");
dataSourceConfig.setDbType(DbType.MYSQL);
dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("root");
dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/guns?characterEncoding=utf8");
}
@Override
protected void strategyConfig() {
//strategy.setTablePrefix(new String[]{"_"});// 此处可以修改为您的表前缀
super.strategyConfig.setInclude(new String[]{"bill"});
super.strategyConfig.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategyConfig.setInclude(new String[]{"bill"});
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
}
@Override
protected void packageConfig() {
super.packageConfig.setParent(null);
super.packageConfig.setEntity("com.stylefeng.guns.common.persistence.model");
super.packageConfig.setMapper("com.stylefeng.guns.common.persistence.dao");
super.packageConfig.setXml("com.stylefeng.guns.common.persistence.dao.mapping");
super.packageConfig.setService("TTT"); //本项目没用,生成之后删掉
super.packageConfig.setServiceImpl("TTT"); //本项目没用,生成之后删掉
super.packageConfig.setController("TTT"); //本项目没用,生成之后删掉
packageConfig.setParent(null);
packageConfig.setEntity("com.stylefeng.guns.common.persistence.model");
packageConfig.setMapper("com.stylefeng.guns.common.persistence.dao");
packageConfig.setXml("com.stylefeng.guns.common.persistence.dao.mapping");
}
@Override
protected void contextConfig() {
contextConfig.setBizChName("记账管理");
contextConfig.setBizEnName("bill");
contextConfig.setModuleName("system");
contextConfig.setProjectPath("/Users/stylefeng/work/ideaSpace/guns/guns-admin");
contextConfig.setEntityName("Bill");
/**
* 生成器开关
*/
contextConfig.setEntitySwitch(true);
contextConfig.setControllerSwitch(true);
contextConfig.setDaoSwitch(true);
contextConfig.setServiceSwitch(true);
contextConfig.setIndexPageSwitch(true);
contextConfig.setAddPageSwitch(true);
contextConfig.setEditPageSwitch(true);
contextConfig.setJsSwitch(true);
contextConfig.setInfoJsSwitch(true);
}
}
package ${dao.packageName};
/**
* ${context.bizChName}Dao
*
* @author fengshuonan
* @Date ${tool.currentTime()}
*/
public interface ${context.bizEnBigName}Dao {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${dao.packageName}.${context.bizEnBigName}Dao">
</mapper>
\ No newline at end of file
package ${service.packageName};
<% for(import in service.serviceInterfaceImports!){ %>
import ${import};
<% } %>
/**
* ${context.bizChName}Service
*
* @author fengshuonan
* @Date ${tool.currentTime()}
*/
public interface I${context.bizEnBigName}Service extends IService<${context.entityName}>{
}
\ No newline at end of file
package ${service.packageName}.impl;
<% for(import in service.serviceImplImports!){ %>
import ${import};
<% } %>
/**
* ${context.bizChName}Service
*
* @author fengshuonan
* @Date ${tool.currentTime()}
*/
@Service
public class ${context.bizEnBigName}ServiceImpl extends ServiceImpl<${context.entityName}Mapper, ${context.entityName}> implements I${context.bizEnBigName}Service {
}
package ${controller.packageName};
<% for(import in controller.imports!){ %>
import ${import};
<% } %>
/**
* ${context.bizChName}控制器
*
* @author fengshuonan
* @Date ${tool.currentTime()}
*/
@Controller
@RequestMapping("/${context.bizEnName}")
public class ${context.bizEnBigName}Controller extends BaseController {
private String PREFIX = "/${context.moduleName}/${context.bizEnName}/";
/**
* 跳转到${context.bizChName}首页
*/
@RequestMapping("")
public String index() {
return PREFIX + "${context.bizEnName}.html";
}
/**
* 跳转到添加${context.bizChName}
*/
@RequestMapping("/${context.bizEnName}_add")
public String ${context.bizEnName}Add() {
return PREFIX + "${context.bizEnName}_add.html";
}
/**
* 跳转到修改${context.bizChName}
*/
@RequestMapping("/${context.bizEnName}_update/{${context.bizEnName}Id}")
public String ${context.bizEnName}Update(@PathVariable Integer ${context.bizEnName}Id, Model model) {
return PREFIX + "${context.bizEnName}_edit.html";
}
/**
* 获取${context.bizChName}列表
*/
@RequestMapping(value = "/list")
@ResponseBody
public Object list(String condition) {
return null;
}
/**
* 新增${context.bizChName}
*/
@RequestMapping(value = "/add")
@ResponseBody
public Object add() {
return super.SUCCESS_TIP;
}
/**
* 删除${context.bizChName}
*/
@RequestMapping(value = "/delete")
@ResponseBody
public Object delete() {
return SUCCESS_TIP;
}
/**
* 修改${context.bizChName}
*/
@RequestMapping(value = "/update")
@ResponseBody
public Object update() {
return super.SUCCESS_TIP;
}
/**
* ${context.bizChName}详情
*/
@RequestMapping(value = "/detail")
@ResponseBody
public Object detail() {
return null;
}
}
package ${dao.packageName};
/**
* ${context.bizChName}Dao
*
* @author fengshuonan
* @Date ${tool.currentTime()}
*/
public interface ${context.bizEnBigName}Dao {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${dao.packageName}.${context.bizEnBigName}Dao">
</mapper>
\ No newline at end of file
package ${service.packageName};
/**
* ${context.bizChName}Service
*
* @author fengshuonan
* @Date ${tool.currentTime()}
*/
public interface I${context.bizEnBigName}Service {
}
package ${service.packageName}.impl;
<% for(import in service.serviceImplImports!){ %>
import ${import};
<% } %>
/**
* ${context.bizChName}Service
*
* @author fengshuonan
* @Date ${tool.currentTime()}
*/
@Service
public class ${context.bizEnBigName}ServiceImpl implements I${context.bizEnBigName}Service {
}
@layout("/common/_container.html"){
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>${context.bizChName}管理</h5>
</div>
<div class="ibox-content">
<div class="row row-lg">
<div class="col-sm-12">
<div class="row">
<div class="col-sm-3">
<#NameCon id="condition" name="名称" />
</div>
<div class="col-sm-3">
<#button name="搜索" icon="fa-search" clickFun="${context.bizEnBigName}.search()"/>
</div>
</div>
<div class="hidden-xs" id="${context.bizEnBigName}TableToolbar" role="group">
@if(shiro.hasPermission("/${context.bizEnName}/add")){
<#button name="添加" icon="fa-plus" clickFun="${context.bizEnBigName}.openAdd${context.bizEnBigName}()"/>
@}
@if(shiro.hasPermission("/${context.bizEnName}/update")){
<#button name="修改" icon="fa-plus" clickFun="${context.bizEnBigName}.open${context.bizEnBigName}Detail()" space="true"/>
@}
@if(shiro.hasPermission("/${context.bizEnName}/delete")){
<#button name="删除" icon="fa-plus" clickFun="${context.bizEnBigName}.delete()" space="true"/>
@}
</div>
<#table id="${context.bizEnBigName}Table"/>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="\${ctxPath}/static/modular/${context.moduleName}/${context.bizEnName}/${context.bizEnName}.js"></script>
@}
/**
* ${context.bizChName}管理初始化
*/
var ${context.bizEnBigName} = {
id: "${context.bizEnBigName}Table", //表格id
seItem: null, //选中的条目
table: null,
layerIndex: -1
};
/**
* 初始化表格的列
*/
${context.bizEnBigName}.initColumn = function () {
return [
{field: 'selectItem', radio: true},
{title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'}
];
};
/**
* 检查是否选中
*/
${context.bizEnBigName}.check = function () {
var selected = $('#' + this.id).bootstrapTable('getSelections');
if(selected.length == 0){
Feng.info("请先选中表格中的某一记录!");
return false;
}else{
${context.bizEnBigName}.seItem = selected[0];
return true;
}
};
/**
* 点击添加${context.bizChName}
*/
${context.bizEnBigName}.openAdd${context.bizEnBigName} = function () {
var index = layer.open({
type: 2,
title: '添加${context.bizChName}',
area: ['800px', '420px'], //宽高
fix: false, //不固定
maxmin: true,
content: Feng.ctxPath + '/${context.bizEnName}/${context.bizEnName}_add'
});
this.layerIndex = index;
};
/**
* 打开查看${context.bizChName}详情
*/
${context.bizEnBigName}.open${context.bizEnBigName}Detail = function () {
if (this.check()) {
var index = layer.open({
type: 2,
title: '${context.bizChName}详情',
area: ['800px', '420px'], //宽高
fix: false, //不固定
maxmin: true,
content: Feng.ctxPath + '/${context.bizEnName}/${context.bizEnName}_update/' + ${context.bizEnBigName}.seItem.id
});
this.layerIndex = index;
}
};
/**
* 删除${context.bizChName}
*/
${context.bizEnBigName}.delete = function () {
if (this.check()) {
var ajax = new $ax(Feng.ctxPath + "/${context.bizEnName}/delete", function (data) {
Feng.success("删除成功!");
${context.bizEnBigName}.table.refresh();
}, function (data) {
Feng.error("删除失败!" + data.responseJSON.message + "!");
});
ajax.set("${context.bizEnName}Id",this.seItem.id);
ajax.start();
}
};
/**
* 查询${context.bizChName}列表
*/
${context.bizEnBigName}.search = function () {
var queryData = {};
queryData['condition'] = $("#condition").val();
${context.bizEnBigName}.table.refresh({query: queryData});
};
$(function () {
var defaultColunms = ${context.bizEnBigName}.initColumn();
var table = new BSTable(${context.bizEnBigName}.id, "/${context.bizEnName}/list", defaultColunms);
table.setPaginationType("client");
${context.bizEnBigName}.table = table.init();
});
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
<div class="ibox-content">
<div class="form-horizontal">
<input type="hidden" id="id" value="">
<div class="row">
<div class="col-sm-6 b-r">
</div>
<div class="col-sm-6">
</div>
</div>
<div class="row btn-group-m-t">
<div class="col-sm-10">
<#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="${context.bizEnBigName}InfoDlg.addSubmit()"/>
<#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="${context.bizEnBigName}InfoDlg.close()"/>
</div>
</div>
</div>
</div>
</div>
<script src="\${ctxPath}/static/modular/${context.moduleName}/${context.bizEnName}/${context.bizEnName}_info.js"></script>
@}
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
<div class="ibox-content">
<div class="form-horizontal">
<input type="hidden" id="id" value="\${${context.bizEnName}.id}">
<div class="row">
<div class="col-sm-6 b-r">
</div>
<div class="col-sm-6">
</div>
</div>
<div class="row btn-group-m-t">
<div class="col-sm-10">
<#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="${context.bizEnBigName}InfoDlg.editSubmit()"/>
<#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="${context.bizEnBigName}InfoDlg.close()"/>
</div>
</div>
</div>
</div>
</div>
<script src="\${ctxPath}/static/modular/${context.moduleName}/${context.bizEnName}/${context.bizEnName}_info.js"></script>
@}
/**
* 初始化${context.bizChName}详情对话框
*/
var ${context.bizEnBigName}InfoDlg = {
${context.bizEnName}InfoData : {}
};
/**
* 清除数据
*/
${context.bizEnBigName}InfoDlg.clearData = function() {
this.${context.bizEnName}InfoData = {};
}
/**
* 设置对话框中的数据
*
* @param key 数据的名称
* @param val 数据的具体值
*/
${context.bizEnBigName}InfoDlg.set = function(key, val) {
this.${context.bizEnName}InfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
return this;
}
/**
* 设置对话框中的数据
*
* @param key 数据的名称
* @param val 数据的具体值
*/
${context.bizEnBigName}InfoDlg.get = function(key) {
return $("#" + key).val();
}
/**
* 关闭此对话框
*/
${context.bizEnBigName}InfoDlg.close = function() {
parent.layer.close(window.parent.${context.bizEnBigName}.layerIndex);
}
/**
* 收集数据
*/
${context.bizEnBigName}InfoDlg.collectData = function() {
this.set('id');
}
/**
* 提交添加
*/
${context.bizEnBigName}InfoDlg.addSubmit = function() {
this.clearData();
this.collectData();
//提交信息
var ajax = new $ax(Feng.ctxPath + "/${context.bizEnName}/add", function(data){
Feng.success("添加成功!");
window.parent.${context.bizEnBigName}.table.refresh();
${context.bizEnBigName}InfoDlg.close();
},function(data){
Feng.error("添加失败!" + data.responseJSON.message + "!");
});
ajax.set(this.${context.bizEnName}InfoData);
ajax.start();
}
/**
* 提交修改
*/
${context.bizEnBigName}InfoDlg.editSubmit = function() {
this.clearData();
this.collectData();
//提交信息
var ajax = new $ax(Feng.ctxPath + "/${context.bizEnName}/update", function(data){
Feng.success("修改成功!");
window.parent.${context.bizEnBigName}.table.refresh();
${context.bizEnBigName}InfoDlg.close();
},function(data){
Feng.error("修改失败!" + data.responseJSON.message + "!");
});
ajax.set(this.${context.bizEnName}InfoData);
ajax.start();
}
$(function() {
});
package com.stylefeng.guns.template;
import com.stylefeng.guns.core.template.config.ContextConfig;
import com.stylefeng.guns.core.template.engine.SimpleTemplateEngine;
import com.stylefeng.guns.core.template.engine.base.GunsTemplateEngine;
import java.io.IOException;
/**
* 测试Guns模板引擎
*
* @author fengshuonan
* @date 2017-05-09 20:27
*/
public class TemplateGenerator {
public static void main(String[] args) throws IOException {
ContextConfig contextConfig = new ContextConfig();
contextConfig.setBizChName("记账管理");
contextConfig.setBizEnName("bill");
contextConfig.setModuleName("system");
contextConfig.setProjectPath("/Users/stylefeng/work/ideaSpace/guns/guns-admin");
contextConfig.setEntityName("Bill");
//contextConfig.setAddPageSwitch(false);
//contextConfig.setEditPageSwitch(false);
GunsTemplateEngine gunsTemplateEngine = new SimpleTemplateEngine();
gunsTemplateEngine.setContextConfig(contextConfig);
gunsTemplateEngine.start();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment