mybatis-plus3.x 代码生成器请看以下链接
https://blog.csdn.net/qq_33842795/article/details/103682488
maven依赖
spring boot 和 thymeleaf 结合 controller 返回的控制器路径不能以/ 开头
否则运行没问题,发布之后就找不到文件
<mybatisplus-spring-boot-starter.version>1.0.4</mybatisplus-spring-boot-starter.version>
<mybatisplus.version>2.1.0</mybatisplus.version>
<!-- mybatis-plus begin -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>${mybatisplus-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
<!-- 模板引擎 代码生成 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!-- mybatis-plus end -->
myabtis配置类
#MyBatis
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.dcy.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: com.baomidou.springboot.xxx
#逻辑删除配置
#logic-delete-value: 0
#logic-not-delete-value: 1
#自定义填充策略接口实现
#meta-object-handler: com.baomidou.springboot.MyMetaObjectHandler
#自定义SQL注入器
#sql-injector: com.baomidou.springboot.xxx
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
#不加这个查询数据为空时,字段将被隐藏
call-setters-on-nulls: true
@EnableTransactionManagement
@Configuration
@MapperScan("com.dcy.mapper*")
public class MybatisPlusConfig {
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
/*<!-- SQL 执行性能分析,开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 -->*/
//performanceInterceptor.setMaxTime(1000);
/*<!--SQL是否格式化 默认false-->*/
//performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
/**
* mybatis-plus分页插件<br>
* 文档:http://mp.baomidou.com<br>
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setLocalPage(true);// 开启 PageHelper 的支持
return paginationInterceptor;
}
}
代码生成器 这里控制器用的自己写的模板
public class MpGenerator {
/**
* <p>
* MySQL 生成演示
* </p>
*/
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
// 选择 freemarker 引擎,默认 Veloctiy
// mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("E://test//");
gc.setFileOverride(true);
gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(true);// XML columList
//gc.setKotlin(true);//是否生成 kotlin 代码
gc.setAuthor("xxxx");
// 自定义文件命名,注意 %s 会自动填充表实体属性!
// gc.setMapperName("%sDao");
// gc.setXmlName("%sDao");
// gc.setServiceName("MP%sService");
// gc.setServiceImplName("%sServiceDiy");
// gc.setControllerName("%sAction");
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setTypeConvert(new MySqlTypeConvert(){
// 自定义数据库表字段类型转换【可选】
@Override
public DbColumnType processTypeConvert(String fieldType) {
System.out.println("转换类型:" + fieldType);
// 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。
return super.processTypeConvert(fieldType);
}
});
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/nxxsba?characterEncoding=utf8");
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
//strategy.setTablePrefix(new String[] { "tlog_", "tsys_" });// 此处可以修改为您的表前缀
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setInclude(new String[] { "app_certificate" }); // 需要生成的表
// strategy.setExclude(new String[]{"test"}); // 排除生成的表
// 自定义实体父类
// strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
// 自定义实体,公共字段
// strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
// 自定义 mapper 父类
// strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
// 自定义 service 父类
// strategy.setSuperServiceClass("com.baomidou.demo.TestService");
// 自定义 service 实现类父类
// strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
// 自定义 controller 父类
// strategy.setSuperControllerClass("com.baomidou.demo.TestController");
// 【实体】是否生成字段常量(默认 false)
// public static final String ID = "test_id";
strategy.setEntityColumnConstant(true);
// 【实体】是否为构建者模型(默认 false)
// public User setName(String name) {this.name = name; return this;}
//strategy.setEntityBuilderModel(true);
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.dcy");
pc.setController("controller");
pc.setEntity("model");
mpg.setPackageInfo(pc);
// 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】 ${cfg.abc}
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
this.setMap(map);
}
};
// 自定义 xxListIndex.html 生成
List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
focList.add(new FileOutConfig("/templatesMybatis/list.html.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return "E://test//html//" + tableInfo.getEntityName() + "ListIndex.html";
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 自定义 xxAdd.html 生成
focList.add(new FileOutConfig("/templatesMybatis/add.html.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return "E://test//html//" + tableInfo.getEntityName() + "Add.html";
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 自定义 xxUpdate.html生成
focList.add(new FileOutConfig("/templatesMybatis/update.html.vm") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return "E://test//html//" + tableInfo.getEntityName() + "Update.html";
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 关闭默认 xml 生成,调整生成 至 根目录
/*TemplateConfig tc = new TemplateConfig();
tc.setXml(null);
mpg.setTemplate(tc);*/
// 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
// 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
TemplateConfig tc = new TemplateConfig();
tc.setController("/templatesMybatis/controller.java.vm");
tc.setService("/templatesMybatis/service.java.vm");
tc.setServiceImpl("/templatesMybatis/serviceImpl.java.vm");
tc.setEntity("/templatesMybatis/entity.java.vm");
tc.setMapper("/templatesMybatis/mapper.java.vm");
tc.setXml("/templatesMybatis/mapper.xml.vm");
// 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
mpg.setTemplate(tc);
// 执行生成
mpg.execute();
// 打印注入设置【可无】
System.err.println(mpg.getCfg().getMap().get("abc"));
}
}
模板文件 自定义controller模板文件 comtroller.java.vm
package ${package.Controller};
#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end
import com.alibaba.fastjson.JSON;
import com.dcy.constant.Constant;
import com.dcy.model.BootStrapTable;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.${entity};
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author ${author}
* @since ${date}
*/
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("/a#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end
private final Logger logger = LoggerFactory.getLogger(${table.controllerName}.class);
@Autowired
public ${table.serviceName} i${entity}Service;
/**
* 跳转列表页面
* @param request
* @param model
* @return
*/
@RequestMapping(method= RequestMethod.GET,value = {"/${table.entityPath}Index"})
public String index(HttpServletRequest request, Model model) {
return "${table.entityPath}ListIndex";
}
/**
* 分页查询数据
*
* @param bootStrapTable 分页信息
* @param ${table.entityPath} 查询条件
* @return
*/
@ResponseBody
@GetMapping("/get${entity}PageList")
public Map<String, Object> get${entity}List(BootStrapTable<${entity}> bootStrapTable,${entity} ${table.entityPath}) {
Map<String,Object> result = new HashMap<String,Object>();
try {
result = bootStrapTable.setRows(i${entity}Service.selectPage(bootStrapTable,${table.entityPath}));
} catch (Exception e) {
logger.error("get${entity}List -=- {}",e.toString());
result.put(Constant.BOOTSTAP_TABLE_ROWS, new ArrayList<>());
result.put(Constant.BOOTSTRAP_TABLE_TOTAL, 0);
}
return result;
}
/**
* 跳转添加页面
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping(method=RequestMethod.GET,value="/${table.entityPath}Add")
public String ${table.entityPath}Add(HttpServletRequest request,HttpServletResponse response,Model model) {
try {
}catch (Exception ex){
logger.error("${table.entityPath}Add -=- {}",ex.toString());
}
return "${table.entityPath}Add";
}
/**
* 跳转修改页面
* @param request
* @param id 实体ID
* @return
*/
@RequestMapping(method=RequestMethod.GET,value="/${table.entityPath}Update")
public String ${table.entityPath}Update(HttpServletRequest request,Long id) {
try {
${entity} ${table.entityPath} = i${entity}Service.selectById(id);
request.setAttribute("${table.entityPath}",${table.entityPath});
}catch (Exception ex){
logger.error("${table.entityPath}Update -=- {}",ex.toString());
}
return "${table.entityPath}Upd";
}
/**
* 保存和修改公用的
* @param ${table.entityPath} 传递的实体
* @return 0 失败 1 成功
*/
@ResponseBody
@RequestMapping(method=RequestMethod.POST,value="/${table.entityPath}Save")
public int ${table.entityPath}Save(${entity} ${table.entityPath}) {
int count = 0;
try {
count = i${entity}Service.insertOrUpdate(${table.entityPath}) ? 1 : 0;
} catch (Exception e) {
logger.error("${table.entityPath}Save -=- {}",e.toString());
}
return count;
}
/**
* 根据id删除对象
* @param id 实体ID
* @return 0 失败 1 成功
*/
@ResponseBody
@RequestMapping(method= RequestMethod.POST,value="/${table.entityPath}Delete")
public int ${table.entityPath}Delete(Long id){
int count = 0;
try {
count = i${entity}Service.deleteById(id) ? 1 : 0;
}catch (Exception e){
logger.error("${table.entityPath}Delete -=- {}",e.toString());
}
return count;
}
/**
* 批量删除对象
* @param item 实体集合ID
* @return 0 失败 1 成功
*/
@ResponseBody
@RequestMapping(method= RequestMethod.POST,value="/${table.entityPath}BatchDelete")
public int deleteBatchIds(String item){
int count = 0;
try {
List<Long> ids = (List<Long>) JSON.parse(item);
count = i${entity}Service.deleteBatchIds(ids) ? 1 : 0;
}catch (Exception e){
logger.error("${table.entityPath}BatchDelete -=- {}",e.toString());
}
return count;
}
}
entity.java.vm
package ${package.Entity};
#if(${activeRecord})
import java.io.Serializable;
#end
#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
#if(${entityLombokModel})
import com.baomidou.mybatisplus.annotations.Version;
import lombok.Data;
import lombok.experimental.Accessors;
#end
/**
* <p>
* $!{table.comment}
* </p>
*
* @author ${author}
* @since ${date}
*/
#if(${entityLombokModel})
@Data
@Accessors(chain = true)
#end
#if(${table.convert})
@TableName("${table.name}")
#end
#if(${superEntityClass})
public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
#elseif(${activeRecord})
public class ${entity} extends Model<${entity}> {
#else
public class ${entity} implements Serializable {
#end
private static final long serialVersionUID = 1L;
## ---------- BEGIN 字段循环遍历 ----------
#foreach($field in ${table.fields})
#if(${field.keyFlag})
#set($keyPropertyName=${field.propertyName})
#end
#if("$!field.comment" != "")
/**
* ${field.comment}
*/
#end
#if(${field.keyFlag})
## 主键
#if(${field.keyIdentityFlag})
@TableId(value="${field.name}", type= IdType.AUTO)
#elseif(${field.convert})
@TableId("${field.name}")
#end
## 普通字段
#elseif(${field.fill})
## ----- 存在字段填充设置 -----
#if(${field.convert})
@TableField(value = "${field.name}", fill = FieldFill.${field.fill})
#else
@TableField(fill = FieldFill.${field.fill})
#end
#elseif(${field.convert})
@TableField("${field.name}")
#end
## 乐观锁注解
#if(${versionFieldName}==${field.name})
@Version
#end
## 逻辑删除注解
#if(${logicDeleteFieldName}==${field.name})
@TableLogic
#end
private ${field.propertyType} ${field.propertyName};
#end
## ---------- END 字段循环遍历 ----------
#if(!${entityLombokModel})
#foreach($field in ${table.fields})
#if(${field.propertyType.equals("boolean")})
#set($getprefix="is")
#else
#set($getprefix="get")
#end
public ${field.propertyType} ${getprefix}${field.capitalName}() {
return ${field.propertyName};
}
#if(${entityBuilderModel})
public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
#else
public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
#end
this.${field.propertyName} = ${field.propertyName};
#if(${entityBuilderModel})
return this;
#end
}
#end
#end
#if(${entityColumnConstant})
#foreach($field in ${table.fields})
public static final String ${field.name.toUpperCase()} = "${field.name}";
#end
#end
#if(${activeRecord})
@Override
protected Serializable pkVal() {
#if(${keyPropertyName})
return this.${keyPropertyName};
#else
return this.id;
#end
}
#end
#if(!${entityLombokModel})
@Override
public String toString() {
return "${entity}{" +
#foreach($field in ${table.fields})
#if($!{velocityCount}==1)
"${field.propertyName}=" + ${field.propertyName} +
#else
", ${field.propertyName}=" + ${field.propertyName} +
#end
#end
"}";
}
#end
}
mapper.java.vm
package ${package.Mapper};
import ${package.Entity}.${entity};
import ${superMapperClassPackage};
/**
* <p>
* $!{table.comment} Mapper 接口
* </p>
*
* @author ${author}
* @since ${date}
*/
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
}
mapper.xml.vm
<?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="${package.Mapper}.${table.mapperName}">
#if(${enableCache})
<!-- 开启二级缓存 -->
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
#end
#if(${baseResultMap})
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
#foreach($field in ${table.fields})
#if(${field.keyFlag})##生成主键排在第一位
<id column="${field.name}" property="${field.propertyName}" />
#end
#end
#foreach($field in ${table.commonFields})##生成公共字段
<result column="${field.name}" property="${field.propertyName}" />
#end
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
<result column="${field.name}" property="${field.propertyName}" />
#end
#end
</resultMap>
#end
#if(${baseColumnList})
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
#foreach($field in ${table.commonFields})
#if(${field.name} == ${field.propertyName})${field.name}#else${field.name} AS ${field.propertyName}#end,
#end
${table.fieldNames}
</sql>
#end
</mapper>
service.java.vm
package ${package.Service};
import com.baomidou.mybatisplus.plugins.Page;
import ${package.Entity}.${entity};
import ${superServiceClassPackage};
import com.dcy.model.BootStrapTable;
import java.util.List;
/**
* <p>
* $!{table.comment} 服务类
* </p>
*
* @author ${author}
* @since ${date}
*/
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
/**
* 分页查询
* @param bootStrapTable
* @param ${table.entityPath}
* @return
*/
Page<${entity}> selectPage(BootStrapTable<${entity}> bootStrapTable,${entity} ${table.entityPath});
List<AppCertificate> selectList(${entity} ${table.entityPath});
}
serviceImpl.java.vm
package ${package.ServiceImpl};
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.dcy.model.BootStrapTable;
import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.dcy.utils.lang.StringUtils;
import java.util.List;
/**
* <p>
* $!{table.comment} 服务实现类
* </p>
*
* @author ${author}
* @since ${date}
*/
@Service
@Transactional
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {
@Autowired
private ${table.mapperName} ${table.entityPath}Mapper;
@Override
public Page<${entity}> selectPage(BootStrapTable<${entity}> bootStrapTable, ${entity} ${table.entityPath}) {
EntityWrapper<${entity}> entityWrapper = new EntityWrapper<${entity}>();
getEntityWrapper(entityWrapper,${table.entityPath});
return super.selectPage(bootStrapTable.getPagePlus(),entityWrapper);
}
@Override
public List<${entity}> selectList(${entity} ${table.entityPath}) {
EntityWrapper<${entity}> entityWrapper = new EntityWrapper<${entity}>();
getEntityWrapper(entityWrapper,${table.entityPath});
return super.selectList(entityWrapper);
}
/**
* 公共查询条件
* @param entityWrapper
* @return
*/
public EntityWrapper<${entity}> getEntityWrapper(EntityWrapper<${entity}> entityWrapper,${entity} ${table.entityPath}){
//条件拼接
#foreach($field in ${table.fields})
#if(!${field.keyFlag})
if (StringUtils.isNotBlank(${table.entityPath}.${getprefix}${field.capitalName}())){
entityWrapper.like(${entity}.${field.name.toUpperCase()},${table.entityPath}.${getprefix}${field.capitalName}());
}
#end
#end
return entityWrapper;
}
}
html 页面代码生成器 前端页面使用super ui 可自行修改 基本语法一样的
add.html.vm 默认都不能为空,生成之后 自行删减
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head th:replace="common/common_header :: common_header(~{::title},~{},~{})">
<title>添加首页</title>
</head>
<body style="height: 100%">
<section class="content">
<div class="row">
<form class="form-horizontal" id="form-admin-add" onsubmit="return false;">
<div class="col-md-12">
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
<div class="form-group">
<label class="col-sm-2 control-label">${field.comment}</label>
<div class="col-sm-10">
<input id="${field.propertyName}" name="${field.propertyName}" value="" class="form-control"/>
</div>
</div>
#end
#end
<div class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-10">
<button class="btn btn-primary" id="submit" type="submit"><i class="fa fa-save"></i> 保存
</button>
<button type="button" class="btn btn-danger" onclick="layer_close();"><i
class="fa fa-close"></i> 关闭
</button>
</div>
</div>
</div>
</form>
</div>
</section>
</body>
<div th:replace="common/common_foot :: foot"></div>
<script th:src="@{/content/plugins/jquery.validation/jquery.validate.js}"></script>
<script th:src="@{/content/plugins/jquery.validation/validate-methods.js}"></script>
<script th:src="@{/content/common/validation/common.validation.js}"></script>
<script th:inline="javascript">#macro(dian).#end #set($bootstrapTable = '$table')
$(function () {
$(".select2").select2({
placeholder: "请选择",
width: "100%" //设置下拉框的宽度
});
$('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({
checkboxClass: 'icheckbox_square-blue',
radioClass: 'iradio_square-blue',
increaseArea: '20%' // optional
});
$("#form-admin-add").validate({
rules: {
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
${field.propertyName}: {
required: true
}#if(${table.fields.size()} != ${velocityCount}),
#end
#end
#end
},
onkeyup: false,
submitHandler: function (form) {
$.ajax({
url: getRootPath()+"/a/${table.entityPath}/${table.entityPath}Save",
type: "Post",
dataType: "json",
data: $(form).serialize(),
success: function (result) {
if (result > 0) {
opaler();
} else {
opalerNO();
}
//刷新父级页面
parent.$bootstrapTable#dian()bootstrapTable('refresh'); //再刷新DT
}
});
}
});
});
</script>
</html>
update.html.vm
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head th:replace="common/common_header :: common_header(~{::title},~{},~{})">
<title>修改首页</title>
</head>
<body style="height: 100%">
<section class="content">
<div class="row">
<form class="form-horizontal" id="form-admin-update" onsubmit="return false;">
<div class="col-md-12">
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
<div class="form-group">
<label class="col-sm-2 control-label">${field.comment}</label>
<div class="col-sm-10">
<input id="${field.propertyName}" name="${field.propertyName}" th:value="${${table.entityPath}.${field.propertyName}}" class="form-control"/>
</div>
</div>
#end
#end
<div class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-10">
<input id="id" name="id" type="hidden" th:value="${${table.entityPath}.id}" class="form-control"/>
<button class="btn btn-primary" id="submit" type="submit"><i class="fa fa-save"></i> 保存
</button>
<button type="button" class="btn btn-danger" onclick="layer_close();"><i
class="fa fa-close"></i> 关闭
</button>
</div>
</div>
</div>
</form>
</div>
</section>
</body>
<div th:replace="common/common_foot :: foot"></div>
<script th:src="@{/content/plugins/jquery.validation/jquery.validate.js}"></script>
<script th:src="@{/content/plugins/jquery.validation/validate-methods.js}"></script>
<script th:src="@{/content/common/validation/common.validation.js}"></script>
<script th:inline="javascript">#macro(dian).#end #set($bootstrapTable = '$table')
$(function () {
$('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({
checkboxClass: 'icheckbox_square-blue',
radioClass: 'iradio_square-blue',
increaseArea: '20%' // optional
});
$(".select2").select2({
placeholder: "请选择",
width: "100%" //设置下拉框的宽度
});
$("#form-admin-update").validate({
rules: {
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
${field.propertyName}: {
required: true
}#if(${table.fields.size()} != ${velocityCount}),
#end
#end
#end
},
onkeyup: false,
submitHandler: function (form) {
$.ajax({
url: getRootPath()+"/a/${table.entityPath}/${table.entityPath}Save",
type: "Post",
dataType: "json",
data: $(form).serialize(),
success: function (result) {
if (result > 0) {
opaler();
} else {
opalerNO();
}
//刷新父级页面
parent.$bootstrapTable#dian()bootstrapTable('refresh'); //再刷新DT
}
});
}
});
});
</script>
</html>
list.html.vm 表格使用bootstrapTable 插件 权限使用shiro 标签 ,条件查询没有生成 具体业务,自行修改,
表格里面的按钮权限我暂时这么写的 ,如果有大神知道有更好的方式,麻烦给我留言 我修改过来 我也学习下
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head th:replace="common/common_header :: common_header(~{::title},~{},~{})">
<title>首页</title>
</head>
<body>
<section class="content">
<div class="row">
<!-- BEGIN SAMPLE TABLE PORTLET-->
<div class="col-md-12">
<!-- BEGIN SAMPLE TABLE PORTLET-->
<div class="box-body" style="padding-bottom:0px;">
<div class="panel panel-default">
<div class="panel-heading">高级检索</div>
<div class="panel-body">
<form class="form-inline" method="post" id="searchForm" >
<div class="form-group">
<label for="name">角色名</label>
<input type="text" class="form-control" id="name" name="name" placeholder="用户名"/>
<input id="hiddenText" type="text" style="display:none" /><!-- 隐藏的 控制回车提交表单-->
</div>
<button shiro:hasPermission="sys:user:search" type="button" id="btn_query" class="btn btn-success"><i class="fa fa-search"></i> 查询</button>
<button shiro:hasPermission="sys:user:search" type="button" id="btn_reset" class="btn btn-primary"><i class="fa fa-undo"></i> 重置</button>
</form>
</div>
</div>
<div id="toolbar" class="btn-group">
<button shiro:hasPermission="sys:user:add" id="btn_add" type="button" class="btn btn-default">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增
</button>
<button shiro:hasPermission="sys:user:delete" id="btn_delete" type="button" class="btn btn-default" disabled="disabled">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>批量删除
</button>
</div>
<div class="table-scrollable">
<table class="table-striped table-hover table-bordered" id="empUserList">
</table>
</div>
</div>
<!-- END SAMPLE TABLE PORTLET-->
</div>
</div>
</section>
</body>
<script th:inline="javascript">
var permissionButton = [];//权限按钮
</script>
<script th:inline="javascript" shiro:hasPermission="sys:user:update">
permissionButton.push('<a class="btn btn-icon-only" data-type="edit" href="javascript:void(0)" title="修改"><i class="glyphicon glyphicon-edit"></i></a>');
</script>
<script th:inline="javascript" shiro:hasPermission="sys:user:delete">
permissionButton.push('<a class="btn btn-icon-only" data-type="delete" href="javascript:void(0)" title="删除"><i class="glyphicon glyphicon-remove"></i></a>');
</script>
<div th:replace="common/common_foot :: foot"></div>
<script th:src="@{/content/plugins/bootstrap-table/bootstrap-table.js}"></script>
<script th:src="@{/content/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.js}"></script>
<script th:src="@{/content/common/common.server.js}"></script>
<script th:inline="javascript">#macro(dian).#end #set($bootstrapTable = '$table') #macro(tanh)!#end #set($query = '$query') #set($reset = '$reset') #set($remove = '$remove') #set($add = '$add')
var $bootstrapTable = $('#empUserList'),
$query = $('#btn_query'),
$reset = $('#btn_reset'),
$remove = $('#btn_delete'),
$add = $('#btn_add'),
selections = [];//权限按钮
$(function () {
$(".select2").select2();
$bootstrapTable#dian()bootstrapTable({
url: getRootPath()+'/a/${table.entityPath}/get${entity}PageList',
queryParams : queryParams,
classes: "table-striped table-hover table-bordered",
buttonsAlign: "right", //按钮位置
toolbar: "#toolbar",// 指定工具栏
uniqueId: "id", // 每一行的唯一标识
columns: [
{checkbox : true},
#foreach($field in ${table.fields})
#if(!${field.keyFlag})##生成普通字段
{title: '${field.comment}', field: '${field.propertyName}', align: 'center', valign: 'middle', sortable: true},
#end
#end {
title: '操作', field: 'id', align: 'center', valign: 'middle',
formatter: function (value, row, index) {
return permissionButton.join('');
},
events: {
'click [data-type="edit"]': function (e, value, row) {
layer_show("修改", getRootPath() + "/a/${table.entityPath}/${table.entityPath}Update?id=" + value, "800", "600");
},
'click [data-type="delete"]': function (e, value, row) {
$.fn.modalConfirm('确定要删除所选数据?', function () {
$.ajax({
url: getRootPath() + '/a/${table.entityPath}/${table.entityPath}Delete',
type: "Post",
data: {id: value},
dataType: "json",
success: function (result) {
if (result > 0) {
$.fn.modalMsg("操作成功", "success");
} else {
$.fn.modalMsg("操作失败", "error");
}
$remove#dian()prop('disabled', true);
$bootstrapTable#dian()bootstrapTable('refresh'); //从新加载数据
}
});
});
}
}
}
],
onLoadSuccess: function(){ //加载成功时执行
//layer.msg("加载成功");
},
onLoadError: function(){ //加载失败时执行
layer.msg("加载数据失败", {time : 1500, icon : 2});
}
});
// sometimes footer render error.
setTimeout(function () {
$bootstrapTable#dian()bootstrapTable('resetView', {
height:getHeight()
});
}, 300);
$(window).resize(function () {
$bootstrapTable#dian()bootstrapTable('resetView', {
height:getHeight()
});
});
//点击行中的checkbox 和全选的checkbox事件
$bootstrapTable#dian()on('check.bs.table uncheck.bs.table ' +
'check-all.bs.table uncheck-all.bs.table', function () {
$remove#dian()prop('disabled', #tanh()$bootstrapTable#dian()bootstrapTable('getSelections').length);
selections = getIdSelections();
});
$query#dian()click(function () {
$bootstrapTable#dian()bootstrapTable('refresh'); //从新加载数据
});
$reset#dian()click(function () {
$(".form-inline .form-control").val("");
$bootstrapTable#dian()bootstrapTable('refresh'); //从新加载数据
});
$add#dian()click(function () {
layer_show("添加", getRootPath()+"/a/${table.entityPath}/${table.entityPath}Add","800","600");
});
$remove#dian()click(function () {
if (selections.length < 1) {
$.fn.modalAlert('请选择一条或多条数据进行删除!','error');
} else {
//询问框
$.fn.modalConfirm ('确定要删除所选数据?', function () {
$.ajax({
url: getRootPath()+'/a/${table.entityPath}/${table.entityPath}BatchDelete',
type: "Post",
data:{item:JSON.stringify(selections)},
dataType : "json",
success:function(result){
if(result > 0){
$.fn.modalMsg("操作成功","success");
}else {
$.fn.modalMsg("操作失败","error");
}
$remove#dian()prop('disabled', true);
$bootstrapTable#dian()bootstrapTable('refresh'); //从新加载数据
}
});
});
}
});
/* input 获取焦点 才能触发 刷新事件*/
$("input").keydown(function() {
if (event.keyCode == "13") {//keyCode=13是回车键
if ($query#dian()length > 0){
$bootstrapTable#dian()bootstrapTable('refresh'); //从新加载数据
}
}
});
});
/**
* 返回所有的checked选中的值
*/
function getIdSelections() {
return $.map($bootstrapTable#dian()bootstrapTable('getSelections'), function (row) {
return row.id
});
}
/**
* 查询条件与分页数据
* @param params
* @returns {{limit: (*|number), offset, sort, order}}
*/
function queryParams(params) {
var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
limit: params.limit, //页面大小
offset: params.offset, //页码
sort: params.sort, //排序列名
order:params.order //排序方式
//search:params.search, //搜索框参数
};
getSearchFormData($("#searchForm"),temp);
return temp;
}
</script>
</html>