Merge pull request #8 from moshowgame/master

merge
This commit is contained in:
gaohang
2020-05-07 19:35:42 +08:00
committed by GitHub
17 changed files with 462 additions and 93 deletions

21
LICENSE.txt Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Moshow K ZHENG(Moshow/郑锴/大狼狗)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -27,6 +27,8 @@
|更新日期|更新内容| |更新日期|更新内容|
|-|-| |-|-|
|20200503|1.优化对特殊字符的处理,对于包含#和$等特殊字符的在模板使用井和¥代替便可escapeString方法会自动处理<br> 2.优化mybatisplus实体类相关(感谢@chunchengmeigui的反馈) 3.修优化对所有类型的判断(感谢@cnlw的反馈) 4.移除swagger-entity该功能已经包含在swagger-ui的下拉选项中 5.升级hutool和lombok版本|
|20200306|1.提交一套layuimini+mybatisplus的模板. 2.修复mybatisplus一些相关问题. |
|20200206|1.新增历史记录功能,自动保存最近生成的对象 2.新增swagger开关选项和修复@Column带name参数(感谢@liuyu-struggle的建议) 3.去除mybatis模板中的方括号[]和修改模板里的类注释样式(感谢@gaohanghang的PR)| |20200206|1.新增历史记录功能,自动保存最近生成的对象 2.新增swagger开关选项和修复@Column带name参数(感谢@liuyu-struggle的建议) 3.去除mybatis模板中的方括号[]和修改模板里的类注释样式(感谢@gaohanghang的PR)|
|20191229|1.修复bejson安全防护策略拦截问题(感谢@liangbintao和@1808083642的反馈) 2.优化字段名含date字符串的处理(感谢@smilexzh的反馈) 3.控制台动态输出项目访问地址(感谢@gaohanghang的提交)| |20191229|1.修复bejson安全防护策略拦截问题(感谢@liangbintao和@1808083642的反馈) 2.优化字段名含date字符串的处理(感谢@smilexzh的反馈) 3.控制台动态输出项目访问地址(感谢@gaohanghang的提交)|
|20191128|1.修复支持string-copy导致的以n结尾的字母不显示问题 2.jpa-entity新增swagger@ApiModel@ApiModelProperty注解和SQL字段@Column注解(感谢@yjq907的建议) | |20191128|1.修复支持string-copy导致的以n结尾的字母不显示问题 2.jpa-entity新增swagger@ApiModel@ApiModelProperty注解和SQL字段@Column注解(感谢@yjq907的建议) |

View File

@@ -15,16 +15,14 @@ import org.springframework.stereotype.Component;
public class ServerConfig implements ApplicationListener<WebServerInitializedEvent> { public class ServerConfig implements ApplicationListener<WebServerInitializedEvent> {
private int serverPort; private int serverPort;
private String serverPath;
public int getPort() {
return this.serverPort;
}
@Override @Override
public void onApplicationEvent(WebServerInitializedEvent event) { public void onApplicationEvent(WebServerInitializedEvent event) {
this.serverPort = event.getWebServer().getPort(); this.serverPort = event.getWebServer().getPort();
//log.info("Get WebServer port {}", serverPort); //新增动态path by zhengkai
log.info("项目启动启动成功!访问地址: http://localhost:{}/generator", serverPort); this.serverPath = event.getApplicationContext().getApplicationName();
log.info("项目启动启动成功!访问地址: http://localhost:{}{}", serverPort,serverPath);
} }
} }

View File

@@ -30,6 +30,8 @@ public class GeneratorServiceImpl implements GeneratorService {
result.put("swagger-ui", freemarkerTool.processString("code-generator/ui/swagger-ui.ftl", params)); result.put("swagger-ui", freemarkerTool.processString("code-generator/ui/swagger-ui.ftl", params));
result.put("element-ui", freemarkerTool.processString("code-generator/ui/element-ui.ftl", params)); result.put("element-ui", freemarkerTool.processString("code-generator/ui/element-ui.ftl", params));
result.put("bootstrap-ui", freemarkerTool.processString("code-generator/ui/bootstrap-ui.ftl", params)); result.put("bootstrap-ui", freemarkerTool.processString("code-generator/ui/bootstrap-ui.ftl", params));
result.put("layui-edit", freemarkerTool.processString("code-generator/ui/layui-edit.ftl", params));
result.put("layui-list", freemarkerTool.processString("code-generator/ui/layui-list.ftl", params));
//mybatis old //mybatis old
result.put("controller", freemarkerTool.processString("code-generator/mybatis/controller.ftl", params)); result.put("controller", freemarkerTool.processString("code-generator/mybatis/controller.ftl", params));
result.put("service", freemarkerTool.processString("code-generator/mybatis/service.ftl", params)); result.put("service", freemarkerTool.processString("code-generator/mybatis/service.ftl", params));
@@ -47,11 +49,11 @@ public class GeneratorServiceImpl implements GeneratorService {
//beetsql //beetsql
result.put("beetlmd", freemarkerTool.processString("code-generator/beetlsql/beetlmd.ftl", params)); result.put("beetlmd", freemarkerTool.processString("code-generator/beetlsql/beetlmd.ftl", params));
result.put("beetlentity", freemarkerTool.processString("code-generator/beetlsql/beetlentity.ftl", params)); result.put("beetlentity", freemarkerTool.processString("code-generator/beetlsql/beetlentity.ftl", params));
result.put("beetlentitydto", freemarkerTool.processString("code-generator/beetlsql/beetlentitydto.ftl", params));
result.put("beetlcontroller", freemarkerTool.processString("code-generator/beetlsql/beetlcontroller.ftl", params)); result.put("beetlcontroller", freemarkerTool.processString("code-generator/beetlsql/beetlcontroller.ftl", params));
//mybatis plus //mybatis plus
result.put("pluscontroller", freemarkerTool.processString("code-generator/mybatis-plus/pluscontroller.ftl", params)); result.put("pluscontroller", freemarkerTool.processString("code-generator/mybatis-plus/pluscontroller.ftl", params));
result.put("plusmapper", freemarkerTool.processString("code-generator/mybatis-plus/plusmapper.ftl", params)); result.put("plusmapper", freemarkerTool.processString("code-generator/mybatis-plus/plusmapper.ftl", params));
result.put("plusentity", freemarkerTool.processString("code-generator/mybatis-plus/plusentity.ftl", params));
//util //util
result.put("util", freemarkerTool.processString("code-generator/util/util.ftl", params)); result.put("util", freemarkerTool.processString("code-generator/util/util.ftl", params));
result.put("json", freemarkerTool.processString("code-generator/util/json.ftl", params)); result.put("json", freemarkerTool.processString("code-generator/util/json.ftl", params));

View File

@@ -37,7 +37,13 @@ public class FreemarkerTool {
template.process(model, result); template.process(model, result);
return result.toString(); return result.toString();
} }
/**
* 传入需要转义的字符串进行转义
* 20200503 zhengkai.blog.csdn.net
* */
public String escapeString(String originStr){
return originStr.replaceAll("","\\#").replaceAll("","\\$");
}
/** /**
* process String * process String
* *
@@ -49,9 +55,10 @@ public class FreemarkerTool {
*/ */
public String processString(String templateName, Map<String, Object> params) public String processString(String templateName, Map<String, Object> params)
throws IOException, TemplateException { throws IOException, TemplateException {
//获取对应的模板
Template template = configuration.getTemplate(templateName); Template template = configuration.getTemplate(templateName);
String htmlText = processTemplateIntoString(template, params); //处理为template并进行转义
String htmlText = escapeString(processTemplateIntoString(template, params));
return htmlText; return htmlText;
} }

View File

@@ -194,20 +194,25 @@ public class TableParseUtil {
String fieldClass = Object.class.getSimpleName(); String fieldClass = Object.class.getSimpleName();
//2018-9-16 zhengk 补充char/clob/blob/json等类型如果类型未知默认为String //2018-9-16 zhengk 补充char/clob/blob/json等类型如果类型未知默认为String
//2018-11-22 lshz0088 处理字段类型的时候不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。 //2018-11-22 lshz0088 处理字段类型的时候不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。
if (columnLine.contains(" int") || columnLine.contains("smallint")) { //2020-05-03 MOSHOW.K.ZHENG 优化对所有类型的处理
if (columnLine.contains(" tinyint") ) {
//20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理
fieldClass=tinyintTransType;
}
else if (columnLine.contains(" int") || columnLine.contains(" smallint")) {
fieldClass = Integer.class.getSimpleName(); fieldClass = Integer.class.getSimpleName();
} else if (columnLine.contains("bigint")) { } else if (columnLine.contains(" bigint")) {
fieldClass = Long.class.getSimpleName(); fieldClass = Long.class.getSimpleName();
} else if (columnLine.contains("float")) { } else if (columnLine.contains(" float")) {
fieldClass = Float.class.getSimpleName(); fieldClass = Float.class.getSimpleName();
} else if (columnLine.contains("double")) { } else if (columnLine.contains(" double")) {
fieldClass = Double.class.getSimpleName(); fieldClass = Double.class.getSimpleName();
} else if (columnLine.contains("time") || columnLine.contains(" date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) { } else if (columnLine.contains(" time") || columnLine.contains(" date") || columnLine.contains(" datetime") || columnLine.contains(" timestamp")) {
fieldClass = Date.class.getSimpleName(); fieldClass = Date.class.getSimpleName();
} else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char") } else if (columnLine.contains(" varchar") || columnLine.contains(" text")|| columnLine.contains(" char")
|| columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) { || columnLine.contains(" clob")||columnLine.contains(" blob")||columnLine.contains(" json")) {
fieldClass = String.class.getSimpleName(); fieldClass = String.class.getSimpleName();
} else if (columnLine.contains("decimal")||columnLine.contains(" number")) { } else if (columnLine.contains(" decimal")||columnLine.contains(" number")) {
//2018-11-22 lshz0088 建议对number类型增加intlongBigDecimal的区分判断 //2018-11-22 lshz0088 建议对number类型增加intlongBigDecimal的区分判断
//如果startKh大于等于0则表示有设置取值范围 //如果startKh大于等于0则表示有设置取值范围
int startKh=columnLine.indexOf("("); int startKh=columnLine.indexOf("(");
@@ -239,12 +244,9 @@ public class TableParseUtil {
}else{ }else{
fieldClass = BigDecimal.class.getSimpleName(); fieldClass = BigDecimal.class.getSimpleName();
} }
} else if (columnLine.contains("boolean")) { } else if (columnLine.contains(" boolean")) {
//20190910 MOSHOW.K.ZHENG 新增对boolean的处理感谢@violinxsc的反馈以及修复tinyint类型字段无法生成boolean类型问题感谢@hahaYhui的反馈 //20190910 MOSHOW.K.ZHENG 新增对boolean的处理感谢@violinxsc的反馈以及修复tinyint类型字段无法生成boolean类型问题感谢@hahaYhui的反馈
fieldClass = Boolean.class.getSimpleName(); fieldClass = Boolean.class.getSimpleName();
} else if (columnLine.contains("tinyint") ) {
//20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理
fieldClass=tinyintTransType;
} else { } else {
fieldClass = String.class.getSimpleName(); fieldClass = String.class.getSimpleName();
} }

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
This is the JRebel configuration file. It maps the running application to your IDE workspace, enabling JRebel reloading for this project.
Refer to https://manuals.jrebel.com/jrebel/standalone/config.html for more information.
-->
<application generated-by="intellij" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com" xsi:schemaLocation="http://www.zeroturnaround.com http://update.zeroturnaround.com/jrebel/rebel-2_1.xsd">
<classpath>
<dir name="E:/workspace/idea with spring/SpringBootCodeGenerator/generator-web/target/classes">
</dir>
</classpath>
</application>

View File

@@ -1 +1 @@
{"version": "20200206"} {"version": "20200306"}

View File

@@ -8,7 +8,8 @@ import java.util.List;
* @author ${authorName} * @author ${authorName}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')} * @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/ */
@Data @Data<#if swagger?exists && swagger==true>
@ApiModel("${classInfo.classComment}")</#if>
public class ${classInfo.className} implements Serializable { public class ${classInfo.className} implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -17,7 +18,8 @@ public class ${classInfo.className} implements Serializable {
<#list classInfo.fieldList as fieldItem > <#list classInfo.fieldList as fieldItem >
/** /**
* ${fieldItem.fieldComment} * ${fieldItem.fieldComment}
*/ */<#if swagger?exists && swagger==true>
@ApiModelProperty("${fieldItem.fieldComment}")</#if>
private ${fieldItem.fieldClass} ${fieldItem.fieldName}; private ${fieldItem.fieldClass} ${fieldItem.fieldName};
</#list> </#list>

View File

@@ -1,27 +0,0 @@
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* @description ${classInfo.classComment}
* @author ${authorName}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
@ApiModel("${classInfo.classComment}")
public class ${classInfo.className}DTO {
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
<#list classInfo.fieldList as fieldItem >
@ApiModelProperty("${fieldItem.fieldComment}")
private ${fieldItem.fieldClass} ${fieldItem.fieldName};
</#list>
public ${classInfo.className}() {
}
</#if>
}

View File

@@ -1,20 +1,28 @@
package ${packageName}.controller; package ${packageName}.controller;
import com.alibaba.fastjson.JSON;
import ${packageName}.entity.${classInfo.className}; import ${packageName}.entity.${classInfo.className};
import ${packageName}.mapper.${classInfo.className}Mapper; import ${packageName}.mapper.${classInfo.className}Mapper;
import ${packageName}.util.ReturnT;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* @description ${classInfo.classComment} * @description ${classInfo.classComment}
* @author ${authorName} * @author ${authorName}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')} * @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("/${classInfo.className?uncap_first}") @RequestMapping("/${classInfo.className?uncap_first}")
public class ${classInfo.className}Controller { public class ${classInfo.className}Controller {
@@ -26,14 +34,20 @@ public class ${classInfo.className}Controller {
* 新增或编辑 * 新增或编辑
*/ */
@PostMapping("/save") @PostMapping("/save")
public Object save(${classInfo.className} ${classInfo.className?uncap_first}){ public Object save(@RequestBody ${classInfo.className} ${classInfo.className?uncap_first}){
${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("id",id)) log.info("${classInfo.className?uncap_first}:"+JSON.toJSONString(${classInfo.className?uncap_first}));
if(${classInfo.className?uncap_first}!=null){ ${classInfo.className} old${classInfo.className} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",${classInfo.className?uncap_first}.get${classInfo.className}Id()));
${classInfo.className?uncap_first}.setModifyDate(new Date());
if(old${classInfo.className}!=null){
${classInfo.className?uncap_first}Mapper.updateById(${classInfo.className?uncap_first}); ${classInfo.className?uncap_first}Mapper.updateById(${classInfo.className?uncap_first});
}else{ }else{
${classInfo.className?uncap_first}Mapper.insert(${classInfo.className?uncap_first}); if(${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_name",${classInfo.className?uncap_first}.get${classInfo.className}Name()))!=null){
return new ReturnT<>(ReturnT.FAIL_CODE,"保存失败,名字重复");
} }
return ${returnUtil}.success(${classInfo.className?uncap_first}); ${classInfo.className?uncap_first}.setCreateDate(new Date());
${classInfo.className?uncap_first}Mapper.insert(${classInfo.className?uncap_first});
}
return new ReturnT<>(ReturnT.SUCCESS_CODE,"保存成功");
} }
/** /**
@@ -41,11 +55,12 @@ public class ${classInfo.className}Controller {
*/ */
@PostMapping("/delete") @PostMapping("/delete")
public Object delete(int id){ public Object delete(int id){
${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("id",id)) ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id));
if(${classInfo.className?uncap_first}!=null){ if(${classInfo.className?uncap_first}!=null){
return ${returnUtil}.success(${classInfo.className?uncap_first}); ${classInfo.className?uncap_first}Mapper.deleteById(id);
return new ReturnT<>(ReturnT.SUCCESS_CODE,"删除成功");
}else{ }else{
return ${returnUtil}.error("没有找到该对象"); return new ReturnT<>(ReturnT.FAIL_CODE,"没有找到该对象");
} }
} }
@@ -54,11 +69,11 @@ public class ${classInfo.className}Controller {
*/ */
@PostMapping("/find") @PostMapping("/find")
public Object find(int id){ public Object find(int id){
${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("id",id)) ${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id));
if(${classInfo.className?uncap_first}!=null){ if(${classInfo.className?uncap_first}!=null){
return ${returnUtil}.success(${classInfo.className?uncap_first}); return new ReturnT<>(${classInfo.className?uncap_first});
}else{ }else{
return ${returnUtil}.error("没有找到该对象"); return new ReturnT<>(ReturnT.FAIL_CODE,"没有找到该对象");
} }
} }
@@ -66,17 +81,33 @@ public class ${classInfo.className}Controller {
* 分页查询 * 分页查询
*/ */
@PostMapping("/list") @PostMapping("/list")
public Object list(${classInfo.className} ${classInfo.className?uncap_first}, public Object list(String searchParams,
@RequestParam(required = false, defaultValue = "0") int pageNumber, @RequestParam(required = false, defaultValue = "0") int page,
@RequestParam(required = false, defaultValue = "10") int pageSize) { @RequestParam(required = false, defaultValue = "10") int limit) {
log.info("page:"+page+"-limit:"+limit+"-json:"+ JSON.toJSONString(searchParams));
//分页构造器 //分页构造器
Page<${classInfo.className}> page = new Page<${classInfo.className}>(pageNumber,pageSize); Page<${classInfo.className}> buildPage = new Page<${classInfo.className}>(page,limit);
//条件构造器 //条件构造器
QueryWrapper<${classInfo.className}> queryWrapperw = new QueryWrapper<${classInfo.className}>(${classInfo.className?uncap_first}); QueryWrapper<${classInfo.className}> queryWrapper = new QueryWrapper<${classInfo.className}>();
if(StringUtils.isNotEmpty(searchParams)&&JSON.isValid(searchParams)) {
${classInfo.className} ${classInfo.className?uncap_first} = JSON.parseObject(searchParams, ${classInfo.className}.class);
queryWrapper.eq(StringUtils.isNoneEmpty(${classInfo.className?uncap_first}.get${classInfo.className}Name()), "${classInfo.className?uncap_first}_name", ${classInfo.className?uncap_first}.get${classInfo.className}Name());
}
//执行分页 //执行分页
IPage<${classInfo.className}> pageList = certPersonMapper.selectPage(page, queryWrapperw); IPage<${classInfo.className}> pageList = ${classInfo.className?uncap_first}Mapper.selectPage(buildPage, queryWrapper);
//返回结果 //返回结果
return ${returnUtil}.success(pageList); return new ReturnT<>(pageList.getRecords(),Integer.parseInt(pageList.getTotal()+""));
}
@GetMapping("/list")
public ModelAndView listPage(){
return new ModelAndView("cms/${classInfo.className?uncap_first}-list");
}
@GetMapping("/edit")
public ModelAndView editPage(int id){
${classInfo.className} ${classInfo.className?uncap_first} = ${classInfo.className?uncap_first}Mapper.selectOne(new QueryWrapper<${classInfo.className}>().eq("${classInfo.className?uncap_first}_id",id));
return new ModelAndView("cms/${classInfo.className?uncap_first}-edit","${classInfo.className?uncap_first}",${classInfo.className?uncap_first});
} }
} }

View File

@@ -0,0 +1,35 @@
package ${packageName}.entity;
import lombok.Data;
import java.util.Date;
import java.util.List;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
/**
* @description ${classInfo.classComment}
* @author ${authorName}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
<#if swagger?exists && swagger==true>@ApiModel("${classInfo.classComment}")</#if>
public class ${classInfo.className} implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
<#list classInfo.fieldList as fieldItem >
/**
* ${fieldItem.fieldComment}
*/<#if swagger?exists && swagger==true>
@ApiModelProperty("${fieldItem.fieldComment}")</#if>
private ${fieldItem.fieldClass} ${fieldItem.fieldName};
</#list>
public ${classInfo.className}() {
}
</#if>
}

View File

@@ -1,15 +1,37 @@
package ${packageName}.mapper; package ${packageName}.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import ${packageName}.entity.${classInfo.className};
/** /**
* @description ${classInfo.classComment} * @description ${classInfo.classComment}
* @author ${authorName} * @author ${authorName}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')} * @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/ */
@Repository @Mapper
public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}> { public interface ${classInfo.className}Mapper extends BaseMapper<${classInfo.className}> {
@Select(
"<script>select t0.* from ${classInfo.tableName} t0 " +
//add here if need left join
"where 1=1" +
<#list classInfo.fieldList as fieldItem >
"<when test='${fieldItem.fieldName}!=null and ${fieldItem.fieldName}!=&apos;&apos; '> and t0.${fieldItem.columnName}=井{${fieldItem.fieldName}}</when> " +
</#list>
//add here if need page limit
//" limit ¥{page},¥{limit} " +
" </script>")
List<${classInfo.className}> pageAll(${classInfo.className} queryParamDTO);
@Select("<script>select count(1) from ${classInfo.tableName} t0 " +
//add here if need left join
"where 1=1" +
<#list classInfo.fieldList as fieldItem >
"<when test='${fieldItem.fieldName}!=null and ${fieldItem.fieldName}!=&apos;&apos; '> and t0.${fieldItem.columnName}=井{${fieldItem.fieldName}}</when> " +
</#list>
" </script>")
int countAll(${classInfo.className} queryParamDTO);
} }

View File

@@ -0,0 +1,78 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layuimini</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="¥{request.contextPath}/static/lib/layui-v2.5.5/css/layui.css" media="all">
<link rel="stylesheet" href="¥{request.contextPath}/static/css/public.css" media="all">
<style>
body {
background-color: #ffffff;
}
</style>
</head>
<body>
<div class="layui-form layuimini-form">
<input type="hidden" name="${classInfo.className?uncap_first}Id" value="" class="layui-input">
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
<#list classInfo.fieldList as fieldItem >
<div class="layui-form-item">
<label class="layui-form-label required">${fieldItem.fieldComment}</label>
<div class="layui-input-block">
<input type="text" name="${fieldItem.fieldName}" lay-verify="required" lay-reqtext="${fieldItem.fieldComment}不能为空" placeholder="请输入${fieldItem.fieldComment}" value="" class="layui-input">
<#--<tip>${fieldItem.fieldComment}</tip>-->
</div>
</div>
</#list>
</#if>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认保存</button>
</div>
</div>
</div>
</div>
<script src="¥{request.contextPath}/static/lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
<script>
layui.use(['form'], function () {
var form = layui.form,
layer = layui.layer,
$ = layui.$;
//监听提交
form.on('submit(saveBtn)', function (data) {
$.ajax({
type: 'POST',
url: "¥{request.contextPath}/${classInfo.className?uncap_first}/save",
data:JSON.stringify(data.field),
dataType: "json",
contentType: "application/json",
success: function (responseData) {
if (responseData.code === 200) {
layer.msg(responseData.msg, function () {
// 关闭弹出层
//layer.close(index);
var iframeIndex = parent.layer.getFrameIndex(window.name);
parent.layer.close(iframeIndex);
parent.searchBtn.click();
});
} else {
layer.msg(responseData.msg, function () {
//window.location = '/index.html';
});
}
}
});
return false;
});
});
</script>
</body>
</html>

View File

@@ -0,0 +1,189 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layuimini</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="¥{request.contextPath}/static/lib/layui-v2.5.5/css/layui.css" media="all">
<link rel="stylesheet" href="¥{request.contextPath}/static/css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">${classInfo.classComment}Id</label>
<div class="layui-input-inline">
<input type="text" name="${classInfo.className?uncap_first}Id" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">${classInfo.classComment}名称</label>
<div class="layui-input-inline">
<input type="text" name="${classInfo.className?uncap_first}Name" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button id="searchBtn" type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button>
</div>
</div>
</form>
</div>
</fieldset>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm data-add-btn"> 添加${classInfo.classComment} </button>
<#-- <button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn"> 删除${classInfo.classComment} </button>-->
</div>
</script>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
</script>
<script type="text/html" id="statusTemplate">
{{# if(d.status = 1){ }}
启用
{{# } else { }}
停用
{{# } }}
</script>
</div>
</div>
<script src="¥{request.contextPath}/static/lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'table'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table,
layuimini = layui.layuimini;
table.render({
elem: '#currentTableId',
method: 'post',
url: '¥{request.contextPath}/${classInfo.className?uncap_first}/list',
toolbar: '#toolbarDemo',
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',
layEvent: 'LAYTABLE_TIPS',
icon: 'layui-icon-tips'
}],
cols: [[
{type: "checkbox", width: 50, fixed: "left"},
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
<#list classInfo.fieldList as fieldItem >
{field: '${fieldItem.fieldName}', width: 150, title: '${fieldItem.fieldComment}', sort: true}, <#if fieldItem_has_next> </#if>
</#list>
</#if>
{title: '操作', minWidth: 50, templet: '#currentTableBar', fixed: "right", align: "center"}
]],
limits: [10, 20, 50 , 100],
limit: 10,
page: true
});
var result;
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
result = JSON.stringify(data.field);
// layer.alert(result, {
// title: '最终的搜索信息'
// });
//执行搜索重载
table.reload('currentTableId', {
page: {
curr: 1
}
, where: {
searchParams: result
}
}, 'data');
return false;
});
var searchBtn = $("#searchBtn");
// 监听添加操作
$(".data-add-btn").on("click", function () {
var index = layer.open({
title: '添加${classInfo.classComment}',
type: 2,
shade: 0.2,
maxmin:true,
shadeClose: true,
area: ['800px', '500px'],
content: '¥{request.contextPath}/${classInfo.className?uncap_first}/edit?id=0',
});
layer.full(index);
return false;
});
// 监听删除操作
$(".data-delete-btn").on("click", function () {
var checkStatus = table.checkStatus('currentTableId')
, data = checkStatus.data;
layer.alert(JSON.stringify(data));
});
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)
});
//监听表格编辑删除等功能按钮
table.on('tool(currentTableFilter)', function (obj) {
var data = obj.data;
if (obj.event === 'edit') {
var index = layer.open({
title: '编辑${classInfo.classComment}',
type: 2,
shade: 0.2,
maxmin:true,
shadeClose: true,
area: ['800px', '500px'],
content: '¥{request.contextPath}/${classInfo.className?uncap_first}/edit?id='+obj.data.${classInfo.className?uncap_first}Id,
});
layer.full(index);
return false;
} else if (obj.event === 'delete') {
layer.confirm('真的删除行么', function (index) {
$.ajax({
type: 'POST',
url: "¥{request.contextPath}/${classInfo.className?uncap_first}/delete",
data:{"id":obj.data.${classInfo.className?uncap_first}Id},
success: function (responseData) {
if (responseData.code === 200) {
layer.msg(responseData.msg, function () {
obj.del();
});
} else {
layer.msg(responseData.msg, function () {
//window.location = '/index.html';
});
}
}
});
layer.close(index);
});
}
});
});
</script>
<script>
</script>
</body>
</html>

View File

@@ -88,7 +88,7 @@
success: function (data) { success: function (data) {
if (data.code === 200) { if (data.code === 200) {
codeData = data.data; codeData = data.data;
genCodeArea.setValue(codeData.entity); genCodeArea.setValue(codeData.beetlentity);
genCodeArea.setSize('auto', 'auto'); genCodeArea.setSize('auto', 'auto');
$.toast("√ 代码生成成功"); $.toast("√ 代码生成成功");
//添加历史记录 //添加历史记录
@@ -231,7 +231,7 @@
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">返回封装</span> <span class="input-group-text">返回封装</span>
</div> </div>
<input type="text" class="form-control" id="returnUtil" name="returnUtil" value="ApiReturnObject"> <input type="text" class="form-control" id="returnUtil" name="returnUtil" value="new ReturnT<>">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">包名路径</span> <span class="input-group-text">包名路径</span>
</div> </div>
@@ -324,12 +324,13 @@ CREATE TABLE 'userinfo' (
</div> </div>
</div> </div>
<div class="btn-group" role="group" aria-label="First group"> <div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="plusentity">entity</button>
<button type="button" class="btn btn-default generator" id="plusmapper">mapper</button> <button type="button" class="btn btn-default generator" id="plusmapper">mapper</button>
<button type="button" class="btn btn-default generator" id="pluscontroller">controller</button> <button type="button" class="btn btn-default generator" id="pluscontroller">controller</button>
</div> </div>
</div> </div>
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <div class="btn-toolbar col-md-7" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group"> <div class="input-group">
<div class="input-group-prepend"> <div class="input-group-prepend">
<div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">UI</div> <div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">UI</div>
@@ -339,6 +340,8 @@ CREATE TABLE 'userinfo' (
<button type="button" class="btn btn-default generator" id="swagger-ui">swagger-ui</button> <button type="button" class="btn btn-default generator" id="swagger-ui">swagger-ui</button>
<button type="button" class="btn btn-default generator" id="element-ui">element-ui</button> <button type="button" class="btn btn-default generator" id="element-ui">element-ui</button>
<button type="button" class="btn btn-default generator" id="bootstrap-ui">bootstrap-ui</button> <button type="button" class="btn btn-default generator" id="bootstrap-ui">bootstrap-ui</button>
<button type="button" class="btn btn-default generator" id="layui-edit">layui-edit</button>
<button type="button" class="btn btn-default generator" id="layui-list">layui-list</button>
</div> </div>
</div> </div>
</div> </div>
@@ -395,16 +398,6 @@ CREATE TABLE 'userinfo' (
</div> </div>
</div> </div>
<div class="row" style="margin-top: 10px;"> <div class="row" style="margin-top: 10px;">
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group">
<div class="input-group-prepend">
<div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">DTO</div>
</div>
</div>
<div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="beetlentitydto">entitydto(lombok+swagger)</button>
</div>
</div>
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group"> <div class="input-group">
<div class="input-group-prepend"> <div class="input-group-prepend">

View File

@@ -79,14 +79,14 @@
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
<version>5.0.6</version> <version>5.3.2</version>
</dependency> </dependency>
<!-- lombok --> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.18.8</version> <version>1.18.12</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->