refactor: 重构代码生成器(100%)

v1.4.1
Carina 4 years ago
parent 7bffb3fd73
commit f580b86af3

File diff suppressed because one or more lines are too long

@ -15,6 +15,8 @@
*/ */
package org.opsli.common.utils; package org.opsli.common.utils;
import lombok.extern.slf4j.Slf4j;
import java.io.*; import java.io.*;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
@ -30,6 +32,7 @@ import java.util.zip.ZipOutputStream;
* @author Parker * @author Parker
* @date 2020-01-07 * @date 2020-01-07
*/ */
@Slf4j
public class ZipUtils { public class ZipUtils {
/** /**
* *

@ -101,6 +101,7 @@ public abstract class CrudServiceImpl<M extends BaseMapper<T>, T extends BaseEnt
model.setUpdateTime(null); model.setUpdateTime(null);
} }
model.setId(null);
T entity = transformM2T(model); T entity = transformM2T(model);
boolean ret = super.save(entity); boolean ret = super.save(entity);
if(ret){ if(ret){

@ -33,9 +33,6 @@ public class GenBuilderModel extends ApiWrapper {
/** 归属表ID */ /** 归属表ID */
private String tableId; private String tableId;
/** 表类型 */
private String tableType;
/** 包名 */ /** 包名 */
private String packageName; private String packageName;

@ -19,6 +19,7 @@ package org.opsli.modulars.generator.template.api;
import org.opsli.api.base.result.ResultVo; import org.opsli.api.base.result.ResultVo;
import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateCopyModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateModel;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@ -102,6 +103,14 @@ public interface GenTemplateRestApi {
@PostMapping("/updateAndDetail") @PostMapping("/updateAndDetail")
ResultVo<?> updateAndDetail(@RequestBody GenTemplateAndDetailModel model); ResultVo<?> updateAndDetail(@RequestBody GenTemplateAndDetailModel model);
/**
*
* @param model
* @return ResultVo
*/
@PostMapping("/copy")
ResultVo<?> copy(@RequestBody GenTemplateCopyModel model);
/** /**
* *
* @param id ID * @param id ID

@ -55,6 +55,9 @@ public class GenTemplateDetail extends BaseEntity {
/** 文件内容 */ /** 文件内容 */
private String fileContent; private String fileContent;
/** 是否忽略文件名 */
private String ignoreFileName;
// ======================================== // ========================================

@ -23,6 +23,7 @@ import org.opsli.core.base.service.interfaces.CrudServiceInterface;
import org.opsli.modulars.generator.template.entity.GenTemplate; import org.opsli.modulars.generator.template.entity.GenTemplate;
import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateCopyModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateModel;
@ -48,5 +49,10 @@ public interface IGenTemplateService extends CrudServiceInterface<GenTemplate, G
*/ */
GenTemplateModel updateAndDetail(GenTemplateAndDetailModel model); GenTemplateModel updateAndDetail(GenTemplateAndDetailModel model);
/**
*
* @param model
* @return model
*/
GenTemplateModel copy(GenTemplateCopyModel model);
} }

@ -20,6 +20,7 @@ package org.opsli.modulars.generator.template.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.opsli.common.constants.MyBatisConstants; import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.exception.ServiceException; import org.opsli.common.exception.ServiceException;
import org.opsli.common.utils.WrapperUtil; import org.opsli.common.utils.WrapperUtil;
@ -32,8 +33,11 @@ import org.opsli.modulars.generator.template.mapper.GenTemplateMapper;
import org.opsli.modulars.generator.template.service.IGenTemplateDetailService; import org.opsli.modulars.generator.template.service.IGenTemplateDetailService;
import org.opsli.modulars.generator.template.service.IGenTemplateService; import org.opsli.modulars.generator.template.service.IGenTemplateService;
import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateCopyModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateDetailModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateDetailModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateModel;
import org.opsli.plugins.generator.exception.GeneratorException;
import org.opsli.plugins.generator.msg.GeneratorMsg;
import org.opsli.plugins.generator.utils.GenTemplateUtil; import org.opsli.plugins.generator.utils.GenTemplateUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -65,6 +69,13 @@ public class GenTemplateServiceImpl extends CrudServiceImpl<GenTemplateMapper, G
return null; return null;
} }
// 唯一验证
Integer count = this.uniqueVerificationByTemplateName(model);
if(count != null && count > 0){
// 重复
throw new GeneratorException(GeneratorMsg.EXCEPTION_TEMPLATE_NAME_REPEAT);
}
GenTemplateModel insertModel = super.insert( GenTemplateModel insertModel = super.insert(
WrapperUtil.transformInstance(model, GenTemplateModel.class)); WrapperUtil.transformInstance(model, GenTemplateModel.class));
@ -90,6 +101,13 @@ public class GenTemplateServiceImpl extends CrudServiceImpl<GenTemplateMapper, G
return null; return null;
} }
// 唯一验证
Integer count = this.uniqueVerificationByTemplateName(model);
if(count != null && count > 0){
// 重复
throw new GeneratorException(GeneratorMsg.EXCEPTION_TEMPLATE_NAME_REPEAT);
}
GenTemplateModel updateModel = super.update( GenTemplateModel updateModel = super.update(
WrapperUtil.transformInstance(model, GenTemplateModel.class)); WrapperUtil.transformInstance(model, GenTemplateModel.class));
@ -115,6 +133,50 @@ public class GenTemplateServiceImpl extends CrudServiceImpl<GenTemplateMapper, G
return updateModel; return updateModel;
} }
@Transactional(rollbackFor = Exception.class)
@Override
public GenTemplateModel copy(GenTemplateCopyModel model) {
if(model == null){
return null;
}
GenTemplateModel genTemplateModel = this.get(model.getId());
model.setId(null);
// 唯一验证
Integer count = this.uniqueVerificationByTemplateName(
WrapperUtil.transformInstance(model, GenTemplateAndDetailModel.class));
if(count != null && count > 0){
// 重复
throw new GeneratorException(GeneratorMsg.EXCEPTION_TEMPLATE_NAME_REPEAT);
}
if(genTemplateModel == null){
// 暂无该模板
throw new GeneratorException(GeneratorMsg.EXCEPTION_TEMPLATE_COPY_NULL);
}
// 设置模板名称
genTemplateModel.setTempName(model.getTempName());
// 获得子类模板
List<GenTemplateDetailModel> genTemplateDetailModelList =
iGenTemplateDetailService.findListByParent(genTemplateModel.getId());
GenTemplateModel insertModel = super.insert(
WrapperUtil.transformInstance(genTemplateModel, GenTemplateModel.class));
if(insertModel != null){
// 保存模型明细
for (GenTemplateDetailModel templateDetailModel : genTemplateDetailModelList) {
templateDetailModel.setParentId(insertModel.getId());
iGenTemplateDetailService.insert(templateDetailModel);
}
}
return insertModel;
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean delete(String id) { public boolean delete(String id) {
@ -125,7 +187,7 @@ public class GenTemplateServiceImpl extends CrudServiceImpl<GenTemplateMapper, G
iGenTemplateDetailService.delByParent(id); iGenTemplateDetailService.delByParent(id);
return this.delete(id); return super.delete(id);
} }
@Override @Override
@ -145,6 +207,28 @@ public class GenTemplateServiceImpl extends CrudServiceImpl<GenTemplateMapper, G
return super.deleteAll(ids); return super.deleteAll(ids);
} }
/**
*
* @param model model
* @return Integer
*/
@Transactional(readOnly = true)
public Integer uniqueVerificationByTemplateName(GenTemplateAndDetailModel model){
if(model == null){
return null;
}
QueryWrapper<GenTemplate> wrapper = new QueryWrapper<>();
// code 唯一
wrapper.eq("temp_name", model.getTempName());
// 重复校验排除自身
if(StringUtils.isNotEmpty(model.getId())){
wrapper.notIn(MyBatisConstants.FIELD_ID, model.getId());
}
return super.count(wrapper);
}
// ==================== // ====================

@ -33,6 +33,7 @@ import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder; import org.opsli.core.persistence.querybuilder.WebQueryBuilder;
import org.opsli.modulars.generator.template.api.GenTemplateRestApi; import org.opsli.modulars.generator.template.api.GenTemplateRestApi;
import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateAndDetailModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateCopyModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateModel; import org.opsli.modulars.generator.template.wrapper.GenTemplateModel;
import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -105,6 +106,9 @@ public class GenTemplateRestController extends BaseRestController<GenTemplate, G
@EnableLog @EnableLog
@Override @Override
public ResultVo<?> insert(GenTemplateModel model) { public ResultVo<?> insert(GenTemplateModel model) {
// 演示模式 不允许操作
super.demoError();
// 调用新增方法 // 调用新增方法
IService.insert(model); IService.insert(model);
return ResultVo.success("新增代码模板成功"); return ResultVo.success("新增代码模板成功");
@ -120,6 +124,9 @@ public class GenTemplateRestController extends BaseRestController<GenTemplate, G
@EnableLog @EnableLog
@Override @Override
public ResultVo<?> insertAndDetail(GenTemplateAndDetailModel model) { public ResultVo<?> insertAndDetail(GenTemplateAndDetailModel model) {
// 演示模式 不允许操作
super.demoError();
// 调用新增方法 // 调用新增方法
IService.insertAndDetail(model); IService.insertAndDetail(model);
return ResultVo.success("新增代码模板成功"); return ResultVo.success("新增代码模板成功");
@ -135,6 +142,9 @@ public class GenTemplateRestController extends BaseRestController<GenTemplate, G
@EnableLog @EnableLog
@Override @Override
public ResultVo<?> update(GenTemplateModel model) { public ResultVo<?> update(GenTemplateModel model) {
// 演示模式 不允许操作
super.demoError();
// 调用修改方法 // 调用修改方法
IService.update(model); IService.update(model);
return ResultVo.success("修改代码模板成功"); return ResultVo.success("修改代码模板成功");
@ -150,11 +160,29 @@ public class GenTemplateRestController extends BaseRestController<GenTemplate, G
@EnableLog @EnableLog
@Override @Override
public ResultVo<?> updateAndDetail(GenTemplateAndDetailModel model) { public ResultVo<?> updateAndDetail(GenTemplateAndDetailModel model) {
// 演示模式 不允许操作
super.demoError();
// 调用修改方法 // 调用修改方法
IService.updateAndDetail(model); IService.updateAndDetail(model);
return ResultVo.success("修改代码模板成功"); return ResultVo.success("修改代码模板成功");
} }
/**
*
* @param model
* @return ResultVo
*/
@ApiOperation(value = "新增代码模板数据", notes = "新增代码模板数据")
@RequiresPermissions("generator_template_copy")
@EnableLog
@Override
public ResultVo<?> copy(GenTemplateCopyModel model) {
// 调用复制方法
IService.copy(model);
return ResultVo.success("复制代码模板成功");
}
/** /**
* *
* @param id ID * @param id ID
@ -165,6 +193,9 @@ public class GenTemplateRestController extends BaseRestController<GenTemplate, G
@EnableLog @EnableLog
@Override @Override
public ResultVo<?> del(String id){ public ResultVo<?> del(String id){
// 演示模式 不允许操作
super.demoError();
IService.delete(id); IService.delete(id);
return ResultVo.success("删除代码模板成功"); return ResultVo.success("删除代码模板成功");
} }
@ -179,6 +210,9 @@ public class GenTemplateRestController extends BaseRestController<GenTemplate, G
@EnableLog @EnableLog
@Override @Override
public ResultVo<?> delAll(String ids){ public ResultVo<?> delAll(String ids){
// 演示模式 不允许操作
super.demoError();
String[] idArray = Convert.toStrArray(ids); String[] idArray = Convert.toStrArray(ids);
IService.deleteAll(idArray); IService.deleteAll(idArray);
return ResultVo.success("批量删除代码模板成功"); return ResultVo.success("批量删除代码模板成功");

@ -0,0 +1,53 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.modulars.generator.template.wrapper;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.api.base.warpper.ApiWrapper;
import org.opsli.common.annotation.validator.Validator;
import org.opsli.common.annotation.validator.ValidatorLenMax;
import org.opsli.common.enums.ValidatorType;
import org.opsli.plugins.excel.annotation.ExcelInfo;
/**
* Model
*
* @author
* @date 2021-05-27 14:33:49
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GenTemplateCopyModel extends ApiWrapper {
/** 模板名称 */
@ApiModelProperty(value = "模板名称")
@ExcelProperty(value = "模板名称", order = 1)
@ExcelInfo
@Validator({
ValidatorType.IS_GENERAL_WITH_CHINESE,
ValidatorType.IS_NOT_NULL
})
@ValidatorLenMax(100)
private String tempName;
}

@ -96,4 +96,14 @@ public class GenTemplateDetailModel extends ApiWrapper {
@ValidatorLenMax(20000) @ValidatorLenMax(20000)
private String fileContent; private String fileContent;
/** 是否忽略文件名 */
@ApiModelProperty(value = "文件名")
@ExcelProperty(value = "文件名", order = 6)
@ExcelInfo
@Validator({
ValidatorType.IS_NOT_NULL
})
@ValidatorLenMax(1)
private String ignoreFileName;
} }

@ -0,0 +1,58 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.plugins.generator.enums;
/**
*
*
* @author Mybatis-plus
* @date 2020-09-22 11:17
*/
public enum CodeType {
/** 代码类型 */
BACKEND("0", "后端"),
FRONTEND("1", "前端"),
;
private final String type;
private final String desc;
public static CodeType getCodeType(String type) {
CodeType[] var = values();
for (CodeType codeType : var) {
if (codeType.type.equalsIgnoreCase(type)) {
return codeType;
}
}
return BACKEND;
}
public String getType() {
return this.type;
}
public String getDesc() {
return this.desc;
}
// ================
CodeType(final String type, final String desc) {
this.type = type;
this.desc = desc;
}
}

@ -0,0 +1,34 @@
package org.opsli.plugins.generator.factory;
/**
*
*
* @author Parker
* @date 20216119:10:36
*/
public final class GeneratorFactory {
public static String getJavaHeadAnnotation(){
return "/**\n"+
" * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com\n"+
" * <p>\n"+
" * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n"+
" * use this file except in compliance with the License. You may obtain a copy of\n"+
" * the License at\n"+
" * <p>\n"+
" * http://www.apache.org/licenses/LICENSE-2.0\n"+
" * <p>\n"+
" * Unless required by applicable law or agreed to in writing, software\n"+
" * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n"+
" * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n"+
" * License for the specific language governing permissions and limitations under\n"+
" * the License.\n"+
" */\n";
}
// ========================
public GeneratorFactory(){}
}

@ -58,6 +58,13 @@ public enum GeneratorMsg implements BaseMsg {
EXCEPTION_CREATE_MENU_CODE_NULL(50143,"生成菜单失败,请先生成代码"), EXCEPTION_CREATE_MENU_CODE_NULL(50143,"生成菜单失败,请先生成代码"),
EXCEPTION_CREATE_MENU_PARENT_NULL(50144,"上级菜单不可为空"), EXCEPTION_CREATE_MENU_PARENT_NULL(50144,"上级菜单不可为空"),
/**
*
*/
EXCEPTION_TEMPLATE_NAME_REPEAT(50150,"模板名称重复"),
EXCEPTION_TEMPLATE_COPY_NULL(50151,"暂无该模板"),
/** /**
* *
*/ */

@ -17,24 +17,28 @@ package org.opsli.plugins.generator.strategy.create;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import com.baomidou.mybatisplus.generator.AutoGenerator; import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.generator.config.GlobalConfig; import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jfinal.kit.Kv;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.opsli.api.ApiFlag; import org.opsli.api.ApiFlag;
import org.opsli.common.enums.ValidatorType; import org.opsli.common.enums.DictType;
import org.opsli.common.utils.Props; import org.opsli.common.utils.Props;
import org.opsli.common.utils.ZipUtils; import org.opsli.common.utils.ZipUtils;
import org.opsli.plugins.generator.strategy.create.backend.JavaCodeBuilder;
import org.opsli.plugins.generator.strategy.create.foreend.VueCodeBuilder;
import org.opsli.plugins.generator.strategy.create.readme.ReadMeBuilder;
import org.opsli.plugins.generator.utils.GeneratorHandleUtil;
import org.opsli.modulars.generator.logs.wrapper.GenBuilderModel; import org.opsli.modulars.generator.logs.wrapper.GenBuilderModel;
import org.opsli.modulars.generator.template.wrapper.GenTemplateDetailModel;
import org.opsli.plugins.generator.enums.CodeType;
import org.opsli.plugins.generator.factory.GeneratorFactory;
import org.opsli.plugins.generator.utils.EnjoyUtil;
import org.opsli.plugins.generator.utils.GenTemplateUtil;
import org.opsli.plugins.generator.utils.GeneratorHandleUtil;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -50,16 +54,21 @@ public enum CodeBuilder {
/** 实例对象 */ /** 实例对象 */
INSTANCE; INSTANCE;
/** 排除字段 */ /** Java文件后缀 */
private static final List<String> EXCLUDE_FIELDS; public static final String JAVA_SUFFIX = "java";
/** 文件名前缀 */
public static final String API_PATH;
public static final String FILE_NAME = "OPSLI-CodeCreate"; public static final String FILE_NAME = "OPSLI-CodeCreate";
/** 文件夹前缀 */
private static final String FOLDER_PREFIX = "/";
/** 文件夹点前缀 */
private static final String POINT_PREFIX = ".";
/** 基础路径前缀 */
public static final String BASE_PATH = "/代码生成-"; public static final String BASE_PATH = "/代码生成-";
public static final String BACKEND_PATH = "/后端";
public static final String FOREEND_PATH = "/前端";
/** 排除字段 */
private static final List<String> EXCLUDE_FIELDS;
/** API 地址 */
public static final String API_PATH;
static { static {
Props props = new Props("generator.yaml"); Props props = new Props("generator.yaml");
EXCLUDE_FIELDS = props.getList("opsli.exclude-fields"); EXCLUDE_FIELDS = props.getList("opsli.exclude-fields");
@ -74,58 +83,154 @@ public enum CodeBuilder {
return; return;
} }
String dataStr = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss"); String dateStr = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");
// 处理表数据 // 处理表数据
GenBuilderModel genBuilderModel = GeneratorHandleUtil.handleData(builderModel, EXCLUDE_FIELDS); GenBuilderModel genBuilderModel = GeneratorHandleUtil.handleData(builderModel, EXCLUDE_FIELDS);
if(genBuilderModel == null){
return;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
OutputStream out = this.getOutputStream(response, dataStr); OutputStream out = this.getOutputStream(response, dateStr);
try { try {
if(out != null){ if(out != null){
List<Map<String, String>> fileList = new ArrayList<>(); List<GenTemplateDetailModel> templateDetailList =
// 处理后端代码 ==================== GenTemplateUtil.getTemplateDetailList(genBuilderModel.getTemplateId());
// entity
fileList.add(JavaCodeBuilder.INSTANCE.createEntity(genBuilderModel, dataStr)); List<Map<String, String>> fileList =
// mapper Lists.newArrayListWithCapacity(templateDetailList.size());
fileList.add(JavaCodeBuilder.INSTANCE.createMapper(genBuilderModel, dataStr));
// mapper xml // 循环处理代码模板
fileList.add(JavaCodeBuilder.INSTANCE.createMapperXML(genBuilderModel, dataStr)); for (GenTemplateDetailModel templateDetailModel : templateDetailList) {
// service fileList.add(
fileList.add(JavaCodeBuilder.INSTANCE.createService(genBuilderModel, dataStr)); this.createCode(genBuilderModel, templateDetailModel, dateStr)
// service impl );
fileList.add(JavaCodeBuilder.INSTANCE.createServiceImpl(genBuilderModel, dataStr)); }
// web
fileList.add(JavaCodeBuilder.INSTANCE.createWeb(genBuilderModel, dataStr));
// model
fileList.add(JavaCodeBuilder.INSTANCE.createModel(genBuilderModel, dataStr));
// api
fileList.add(JavaCodeBuilder.INSTANCE.createRestApi(genBuilderModel, dataStr));
// 处理前端代码 ====================
// index
fileList.add(VueCodeBuilder.INSTANCE.createIndex(genBuilderModel, dataStr));
// edit
fileList.add(VueCodeBuilder.INSTANCE.createEdit(genBuilderModel, dataStr));
// import
fileList.add(VueCodeBuilder.INSTANCE.createImport(genBuilderModel, dataStr));
// 前api
fileList.add(VueCodeBuilder.INSTANCE.createApi(genBuilderModel, dataStr));
// 处理 ReadMe
fileList.add(ReadMeBuilder.INSTANCE.createReadMe(genBuilderModel, dataStr));
// 生成zip文件 // 生成zip文件
ZipUtils.toZip(fileList, baos); ZipUtils.toZip(fileList, byteArrayOutputStream);
// 输出流文件 // 输出流文件
IoUtil.write(out,true, baos.toByteArray()); IoUtil.write(out,true, byteArrayOutputStream.toByteArray());
} }
}catch (Exception e){ }catch (Exception e){
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
} }
/**
* MapperXML
* @param builderModel Build
* @param templateModel
* @param dataStr
* @return Map
*/
private Map<String,String> createCode(final GenBuilderModel builderModel,
final GenTemplateDetailModel templateModel, final String dataStr){
if(builderModel == null){
return MapUtil.empty();
}
// 获得分类名称
CodeType codeType = CodeType.getCodeType(templateModel.getType());
String typeName = codeType.getDesc();
// 包名
String packageName = builderModel.getPackageName();
// 模块名
String moduleName = builderModel.getModuleName();
// 子模块名
String subModuleName = builderModel.getSubModuleName();
// 基础路径
String basePath = CodeBuilder.BASE_PATH + dataStr + FOLDER_PREFIX + typeName;
// Path路径
String path = templateModel.getPath();
if(StrUtil.isNotEmpty(path)){
path = StrUtil.replace(path, "${packageName}", packageName);
path = StrUtil.replace(path, "${moduleName}", moduleName);
path = StrUtil.replace(path, "${subModuleName}", subModuleName);
// 处理路径 前后加 [/]
path = this.handlePath(path);
}
// 代码
String codeStr = EnjoyUtil.renderByStr(templateModel.getFileContent(),
this.createKv(builderModel)
);
// 获得模板文件名称
String templateFileName = templateModel.getFileName();
String[] templateFileNameArr = StrUtil.split(templateFileName, ".");
// 模板文件前缀
String templateFilePrefix = templateFileNameArr[0];
// 模板文件后缀
String templateFileSuffix = templateFileNameArr[templateFileNameArr.length-1];
// 判断是否是Java 文件
if(JAVA_SUFFIX.equals(templateFileNameArr[templateFileNameArr.length-1])){
codeStr = GeneratorFactory.getJavaHeadAnnotation() + codeStr;
}
// 生成文件名
String fileName = builderModel.getModel().getTableHumpName();
if(DictType.NO_YES_NO.getValue().equals(templateModel.getIgnoreFileName()) ||
StrUtil.isEmpty(templateModel.getIgnoreFileName())
){
if(templateFileNameArr.length > 1){
// 判断是否忽略模板文件名
fileName += templateFilePrefix;
}
}
fileName += StrUtil.prependIfMissing(templateFileSuffix, POINT_PREFIX);
Map<String,String> entityMap = Maps.newHashMapWithExpectedSize(3);
entityMap.put(ZipUtils.FILE_PATH, basePath + path);
entityMap.put(ZipUtils.FILE_NAME, fileName);
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Kv
* @param builderModel Build
* @return Kv
*/
private Kv createKv(GenBuilderModel builderModel){
return Kv.by("data", builderModel)
.set("currTime", DateUtil.now())
.set("apiPath", API_PATH);
}
/**
* Path
* @param path
* @return String
*/
protected String handlePath(String path) {
if(StrUtil.isEmpty(path)){
return path;
}
// . 转换为 [/]
path = StrUtil.replace(path, POINT_PREFIX, FOLDER_PREFIX);
// 如果 第一位不是 / 则加 /
path = StrUtil.prependIfMissing(path, FOLDER_PREFIX);
// 如果最后一位 是 / 则减 /
path = StrUtil.appendIfMissing(path, FOLDER_PREFIX);
// 去除 [//]
return StrUtil.replace(path, "//", FOLDER_PREFIX);
}
/** /**
* WriterOutputStream * WriterOutputStream
@ -141,13 +246,4 @@ public enum CodeBuilder {
return null; return null;
} }
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
}
} }

@ -1,334 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.plugins.generator.strategy.create.backend;
import cn.hutool.core.date.DateUtil;
import com.jfinal.kit.Kv;
import org.apache.commons.lang3.StringUtils;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.common.utils.ZipUtils;
import org.opsli.plugins.generator.strategy.create.CodeBuilder;
import org.opsli.plugins.generator.utils.EnjoyUtil;
import org.opsli.modulars.generator.logs.wrapper.GenBuilderModel;
import java.util.HashMap;
import java.util.Map;
/**
* Java
*
* @author parker
* @date 2020-09-13 19:36
*/
public enum JavaCodeBuilder {
/** 实例对象 */
INSTANCE;
/**
* Entity
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createEntity(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/entity/TemplateEntity.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append("entity").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("entity").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
builderModel.getModel().getTableHumpName()+".java");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Mapper
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createMapper(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/mapper/TemplateMapper.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append("mapper").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("mapper").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
builderModel.getModel().getTableHumpName()+"Mapper.java");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* MapperXML
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createMapperXML(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/mapper/xml/TemplateMapperXML.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append("mapper")
.append("/").append("xml").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("mapper")
.append("/").append("xml").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
builderModel.getModel().getTableHumpName()+"Mapper.xml");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Service
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createService(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/service/TemplateService.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append("service").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("service").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
"I"+builderModel.getModel().getTableHumpName()+"Service.java");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Service Impl
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createServiceImpl(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/service/impl/TemplateServiceImpl.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append("service")
.append("/").append("impl").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("service")
.append("/").append("impl").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
builderModel.getModel().getTableHumpName()+"ServiceImpl.java");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Web
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createWeb(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/web/TemplateRestController.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append("web").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(builderModel.getPackageName().replaceAll("\\.","/"))
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("web").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
builderModel.getModel().getTableHumpName()+"RestController.java");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Model
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createModel(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/model/TemplateModel.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(CodeBuilder.API_PATH.replaceAll("\\.","/"))
.append("/").append("wrapper")
.append("/").append(builderModel.getModuleName()).append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(CodeBuilder.API_PATH.replaceAll("\\.","/"))
.append("/").append("wrapper")
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName()).append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
builderModel.getModel().getTableHumpName()+"Model.java");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* RestApi
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createRestApi(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/backend/api/TemplateRestApi.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(CodeBuilder.API_PATH.replaceAll("\\.","/"))
.append("/").append("web")
.append("/").append(builderModel.getModuleName()).append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.BACKEND_PATH)
.append("/").append(CodeBuilder.API_PATH.replaceAll("\\.","/"))
.append("/").append("web")
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName()).append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME,
builderModel.getModel().getTableHumpName()+"RestApi.java");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Kv
* @param builderModel Build
* @return Kv
*/
private Kv createKv(GenBuilderModel builderModel){
return Kv.by("data", builderModel)
.set("currTime", DateUtil.now())
.set("apiPath", CodeBuilder.API_PATH);
}
}

@ -1,201 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.plugins.generator.strategy.create.foreend;
import cn.hutool.core.date.DateUtil;
import com.jfinal.kit.Kv;
import org.apache.commons.lang3.StringUtils;
import org.opsli.common.utils.Props;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.common.utils.ZipUtils;
import org.opsli.plugins.generator.strategy.create.CodeBuilder;
import org.opsli.plugins.generator.utils.EnjoyUtil;
import org.opsli.modulars.generator.logs.wrapper.GenBuilderModel;
import java.util.*;
/**
* Vue
*
* @author parker
* @date 2020-09-13 19:36
*/
public enum VueCodeBuilder {
/** 实例对象 */
INSTANCE;
/** 验证方法前缀 */
private static final String VALIDATE_PREFIX = "validate_";
/** 虚拟根路径 */
private static final String BASE_API_PATH;
static {
Props props = new Props("application.yaml");
BASE_API_PATH = props.getStr("server.servlet.api.path.global-prefix","/api/v1");
}
/**
* Index
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createIndex(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/foreend/index/TemplateIndex.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue")
.append("/").append("views").append("/").append("modules")
.append("/").append(builderModel.getModuleName()).append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue")
.append("/").append("views").append("/").append("modules")
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName()).append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME, "index.vue");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Edit
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createEdit(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/foreend/components/TemplateEdit.html",
this.createKv(builderModel));
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue")
.append("/").append("views").append("/").append("modules")
.append("/").append(builderModel.getModuleName())
.append("/").append("components").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue")
.append("/").append("views").append("/").append("modules")
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("components").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME, builderModel.getModel().getTableHumpName()+"ManagementEdit.vue");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Import
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createImport(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/foreend/components/TemplateImport.html",
this.createKv(builderModel)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue")
.append("/").append("views").append("/").append("modules")
.append("/").append(builderModel.getModuleName())
.append("/").append("components").append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue")
.append("/").append("views").append("/").append("modules")
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName())
.append("/").append("components").append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME, builderModel.getModel().getTableHumpName()+"ManagementImport.vue");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Api
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createApi(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/foreend/api/TemplateApi.html",
this.createKv(builderModel)
.set("apiPath", BASE_API_PATH)
);
StringBuilder path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue").append("/").append("api")
.append("/").append(builderModel.getModuleName()).append("/");
if(StringUtils.isNotBlank(builderModel.getSubModuleName())){
path = new StringBuilder();
path.append(CodeBuilder.BASE_PATH).append(dataStr).append(CodeBuilder.FOREEND_PATH)
.append("/").append("vue").append("/").append("api")
.append("/").append(builderModel.getModuleName())
.append("/").append(builderModel.getSubModuleName()).append("/");
}
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, path.toString());
entityMap.put(ZipUtils.FILE_NAME, builderModel.getModel().getTableHumpName()+"Management.js");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Kv
* @param builderModel Build
* @return Kv
*/
private Kv createKv(GenBuilderModel builderModel){
return Kv.by("data", builderModel)
.set("currTime", DateUtil.now());
}
}

@ -1,72 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.plugins.generator.strategy.create.readme;
import cn.hutool.core.date.DateUtil;
import com.jfinal.kit.Kv;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.common.utils.ZipUtils;
import org.opsli.plugins.generator.strategy.create.CodeBuilder;
import org.opsli.plugins.generator.utils.EnjoyUtil;
import org.opsli.modulars.generator.logs.wrapper.GenBuilderModel;
import java.util.HashMap;
import java.util.Map;
/**
* ReadMe
*
* @author parker
* @date 2020-09-13 19:36
*/
public enum ReadMeBuilder {
/** 实例对象 */
INSTANCE;
/**
* ReadMe
* @param builderModelTmp Build
* @param dataStr
* @return Map
*/
public Map<String,String> createReadMe(GenBuilderModel builderModelTmp, String dataStr){
GenBuilderModel builderModel =
WrapperUtil.transformInstance(builderModelTmp, GenBuilderModel.class, true);
String codeStr = EnjoyUtil.render("/readme/TemplateReadMe.html",
this.createKv(builderModel)
);
Map<String,String> entityMap = new HashMap<>();
entityMap.put(ZipUtils.FILE_PATH, CodeBuilder.BASE_PATH + dataStr + "/");
entityMap.put(ZipUtils.FILE_NAME, "README.md");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/**
* Kv
* @param builderModel Build
* @return Kv
*/
private Kv createKv(GenBuilderModel builderModel){
return Kv.by("data", builderModel)
.set("currTime", DateUtil.now());
}
}

@ -70,6 +70,21 @@ public final class EnjoyUtil {
.renderToString(kv); .renderToString(kv);
} }
/**
*
* @param template
* @param kv
* @return String
*/
public static String renderByStr(final String template, Kv kv) {
return Engine.use()
// 开启预热模式
.setDevMode(true)
.getTemplateByString(template)
.renderToString(kv);
}
private EnjoyUtil(){} private EnjoyUtil(){}
} }

@ -1,142 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#if(data.subModuleName != null && data.subModuleName != "")
package #(apiPath).web.#(data.moduleName+"."+data.subModuleName);
#else
package #(apiPath).web.#(data.moduleName);
#end
import #(apiPath).base.result.ResultVo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
#if(data.subModuleName != null && data.subModuleName != "")
import #(apiPath).wrapper.#(data.moduleName+"."+data.subModuleName).#(data.model.tableHumpName)Model;
#else
import #(apiPath).wrapper.#(data.moduleName).#(data.model.tableHumpName)Model;
#end
/**
* #(data.codeTitle) Api
*
* API @GetMapping @PostMapping
* Mapping Controller
*
*
*
* @author #(data.authorName)
* @date #(currTime)
*/
public interface #(data.model.tableHumpName)RestApi {
/** 标题 */
String TITLE = "#(data.codeTitle)";
/** 子标题 */
String SUB_TITLE = "#(data.codeTitleBrief)";
/**
* #(data.codeTitle)
* @param model
* @return ResultVo
*/
@GetMapping("/get")
ResultVo<#(data.model.tableHumpName)Model> get(#(data.model.tableHumpName)Model model);
/**
* #(data.codeTitle)
* @param pageNo
* @param pageSize
* @param request request
* @return ResultVo
*/
@GetMapping("/findPage")
ResultVo<?> findPage(
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest request
);
/**
* #(data.codeTitle)
* @param model
* @return ResultVo
*/
@PostMapping("/insert")
ResultVo<?> insert(@RequestBody #(data.model.tableHumpName)Model model);
/**
* #(data.codeTitle)
* @param model
* @return ResultVo
*/
@PostMapping("/update")
ResultVo<?> update(@RequestBody #(data.model.tableHumpName)Model model);
/**
* #(data.codeTitle)
* @param id ID
* @return ResultVo
*/
@PostMapping("/del")
ResultVo<?> del(String id);
/**
* #(data.codeTitle)
* @param ids ID
* @return ResultVo
*/
@PostMapping("/delAll")
ResultVo<?> delAll(String ids);
/**
* #(data.codeTitle) Excel
*
* Token
*
* 使2
*
* socketJava
* response javascript alert
*
* @param request request
* @param response response
*/
@GetMapping("/exportExcel")
void exportExcel(HttpServletRequest request, HttpServletResponse response);
/**
* #(data.codeTitle) Excel
* @param request request
* @return ResultVo
*/
@PostMapping("/importExcel")
ResultVo<?> importExcel(MultipartHttpServletRequest request);
/**
* #(data.codeTitle) Excel
* @param response response
* @return ResultVo
*/
@GetMapping("/importExcel/template")
void importTemplate(HttpServletResponse response);
}

@ -1,70 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#if(data.subModuleName != null && data.subModuleName != "")
package #(data.packageName+"."+data.moduleName+"."+data.subModuleName).entity;
#else
package #(data.packageName+"."+data.moduleName).entity;
#end
#for(pkg : data.model.entityPkgList)
import #(pkg);
#end
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.opsli.core.base.entity.BaseEntity;
/**
* #(data.codeTitle) Entity
*
* @author #(data.authorName)
* @date #(currTime)
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class #(data.model.tableHumpName) extends BaseEntity {
#for(column : data.model.columnList)
###
#if(column.fieldHumpName != "deleted" && column.fieldHumpName != "tenantId")
/** #(column.fieldComments) */
#if(!column.izNotNull)
@TableField(updateStrategy = FieldStrategy.IGNORED)
#end
private #(column.javaType) #(column.fieldHumpName);
#end
#end
// ========================================
###
#for(column : data.model.columnList)
#if(column.fieldHumpName == "deleted")
/** 逻辑删除字段 */
@TableLogic
private Integer deleted;
#else if(column.fieldHumpName == "tenantId")
/** 多租户字段 */
private String tenantId;
#end
#end
}

@ -1,40 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#if(data.subModuleName != null && data.subModuleName != "")
package #(data.packageName+"."+data.moduleName+"."+data.subModuleName).mapper;
#else
package #(data.packageName+"."+data.moduleName).mapper;
#end
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
#if(data.subModuleName != null && data.subModuleName != "")
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).entity.#(data.model.tableHumpName);
#else
import #(data.packageName+"."+data.moduleName).entity.#(data.model.tableHumpName);
#end
/**
* #(data.codeTitle) Mapper
*
* @author #(data.authorName)
* @date #(currTime)
*/
@Mapper
public interface #(data.model.tableHumpName)Mapper extends BaseMapper<#(data.model.tableHumpName)> {
}

@ -1,10 +0,0 @@
<?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">
#if(data.subModuleName != null && data.subModuleName != "")
<mapper namespace="#(data.packageName+'.'+data.moduleName+'.'+data.subModuleName).mapper.#(data.model.tableHumpName)Mapper">
#else
<mapper namespace="#(data.packageName+'.'+data.moduleName).mapper.#(data.model.tableHumpName)Mapper">
#end
</mapper>

@ -1,89 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#if(data.subModuleName != null && data.subModuleName != "")
package #(apiPath).wrapper.#(data.moduleName+"."+data.subModuleName);
#else
package #(apiPath).wrapper.#(data.moduleName);
#end
#for(pkg : data.model.entityPkgList)
import #(pkg);
#end
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import #(apiPath).base.warpper.ApiWrapper;
import org.opsli.common.annotation.validator.Validator;
import org.opsli.common.annotation.validator.ValidatorLenMax;
import org.opsli.common.annotation.validator.ValidatorLenMin;
import org.opsli.common.enums.ValidatorType;
import org.opsli.plugins.excel.annotation.ExcelInfo;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
/**
* #(data.codeTitle) Model
*
* @author #(data.authorName)
* @date #(currTime)
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class #(data.model.tableHumpName)Model extends ApiWrapper {
#for(column : data.model.columnList)
###
#if(column.fieldHumpName != "deleted" && column.fieldHumpName != "tenantId")
/** #(column.fieldComments) */
@ApiModelProperty(value = "#(column.fieldComments)")
@ExcelProperty(value = "#(column.fieldComments)", order = #(column.sort))
#if(column.dictTypeCode != null && column.dictTypeCode != "")
@ExcelInfo( dictType = "#(column.dictTypeCode)" )
#else
@ExcelInfo
#end
#if(column.validateTypeAndCommaList != null && column.validateTypeAndCommaList.size() > 0)
@Validator({
#for(typeAndComma : column.validateTypeAndCommaList)
ValidatorType.#(typeAndComma)
#end
})
#end
#if(column.fieldLength != null && column.fieldLength > 0)
#if(column.fieldPrecision != null && column.fieldPrecision > 0)
@ValidatorLenMax(#(column.fieldLength+column.fieldPrecision))
#else
@ValidatorLenMax(#(column.fieldLength))
#end
#end
###
#if(column.javaType == "Date")
#if(column.showType == "4")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
#else
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
#end
#end
private #(column.javaType) #(column.fieldHumpName);
#end
#end
}

@ -1,41 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#if(data.subModuleName != null && data.subModuleName != "")
package #(data.packageName+"."+data.moduleName+"."+data.subModuleName).service;
#else
package #(data.packageName+"."+data.moduleName).service;
#end
import org.opsli.core.base.service.interfaces.CrudServiceInterface;
#if(data.subModuleName != null && data.subModuleName != "")
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).entity.#(data.model.tableHumpName);
import #(apiPath).wrapper.#(data.moduleName+"."+data.subModuleName).#(data.model.tableHumpName)Model;
#else
import #(data.packageName+"."+data.moduleName).entity.#(data.model.tableHumpName);
import #(apiPath).wrapper.#(data.moduleName).#(data.model.tableHumpName)Model;
#end
/**
* #(data.codeTitle) Service
*
* @author #(data.authorName)
* @date #(currTime)
*/
public interface I#(data.model.tableHumpName)Service extends CrudServiceInterface<#(data.model.tableHumpName), #(data.model.tableHumpName)Model> {
}

@ -1,54 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#if(data.subModuleName != null && data.subModuleName != "")
package #(data.packageName+"."+data.moduleName+"."+data.subModuleName).service.impl;
#else
package #(data.packageName+"."+data.moduleName).service.impl;
#end
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.opsli.core.base.service.impl.CrudServiceImpl;
#if(data.subModuleName != null && data.subModuleName != "")
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).entity.#(data.model.tableHumpName);
import #(apiPath).wrapper.#(data.moduleName+"."+data.subModuleName).#(data.model.tableHumpName)Model;
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).service.I#(data.model.tableHumpName)Service;
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).mapper.#(data.model.tableHumpName)Mapper;
#else
import #(data.packageName+"."+data.moduleName).entity.#(data.model.tableHumpName);
import #(apiPath).wrapper.#(data.moduleName).#(data.model.tableHumpName)Model;
import #(data.packageName+"."+data.moduleName).service.I#(data.model.tableHumpName)Service;
import #(data.packageName+"."+data.moduleName).mapper.#(data.model.tableHumpName)Mapper;
#end
/**
* #(data.codeTitle) Service Impl
*
* @author #(data.authorName)
* @date #(currTime)
*/
@Service
public class #(data.model.tableHumpName)ServiceImpl extends CrudServiceImpl<#(data.model.tableHumpName)Mapper, #(data.model.tableHumpName), #(data.model.tableHumpName)Model>
implements I#(data.model.tableHumpName)Service {
@Autowired(required = false)
private #(data.model.tableHumpName)Mapper mapper;
}

@ -1,256 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#if(data.subModuleName != null && data.subModuleName != "")
package #(data.packageName+"."+data.moduleName+"."+data.subModuleName).web;
#else
package #(data.packageName+"."+data.moduleName).web;
#end
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.convert.Convert;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import #(apiPath).base.result.ResultVo;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
#if(data.subModuleName != null && data.subModuleName != "")
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).entity.#(data.model.tableHumpName);
import #(apiPath).wrapper.#(data.moduleName+"."+data.subModuleName).#(data.model.tableHumpName)Model;
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).service.I#(data.model.tableHumpName)Service;
import #(apiPath).web.#(data.moduleName+"."+data.subModuleName).#(data.model.tableHumpName)RestApi;
#else
import #(data.packageName+"."+data.moduleName).entity.#(data.model.tableHumpName);
import #(apiPath).wrapper.#(data.moduleName).#(data.model.tableHumpName)Model;
import #(data.packageName+"."+data.moduleName).service.I#(data.model.tableHumpName)Service;
import #(apiPath).web.#(data.moduleName).#(data.model.tableHumpName)RestApi;
#end
/**
* #(data.codeTitle) Controller
*
* @author #(data.authorName)
* @date #(currTime)
*/
@Api(tags = #(data.model.tableHumpName)RestApi.TITLE)
@Slf4j
#if(data.subModuleName != null && data.subModuleName != "")
@ApiRestController("/#(data.moduleName)/#(data.subModuleName)")
#else
@ApiRestController("/#(data.moduleName)")
#end
public class #(data.model.tableHumpName)RestController extends BaseRestController<#(data.model.tableHumpName), #(data.model.tableHumpName)Model, I#(data.model.tableHumpName)Service>
implements #(data.model.tableHumpName)RestApi {
/**
* #(data.codeTitleBrief)
* @param model
* @return ResultVo
*/
@ApiOperation(value = "获得单条#(data.codeTitleBrief)", notes = "获得单条#(data.codeTitleBrief) - ID")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_select")
#else
@RequiresPermissions("#(data.moduleName.toLowerCase())_select")
#end
@Override
public ResultVo<#(data.model.tableHumpName)Model> get(#(data.model.tableHumpName)Model model) {
// 如果系统内部调用 则直接查数据库
if(model != null && model.getIzApi() != null && model.getIzApi()){
model = IService.get(model);
}
return ResultVo.success(model);
}
/**
* #(data.codeTitleBrief)
* @param pageNo
* @param pageSize
* @param request request
* @return ResultVo
*/
@ApiOperation(value = "获得分页数据", notes = "获得分页数据 - 查询构造器")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_select")
#else
@RequiresPermissions("#(data.moduleName.toLowerCase())_select")
#end
@Override
public ResultVo<?> findPage(Integer pageNo, Integer pageSize, HttpServletRequest request) {
QueryBuilder<#(data.model.tableHumpName)> queryBuilder = new WebQueryBuilder<>(entityClazz, request.getParameterMap());
Page<#(data.model.tableHumpName), #(data.model.tableHumpName)Model> page = new Page<>(pageNo, pageSize);
page.setQueryWrapper(queryBuilder.build());
page = IService.findPage(page);
return ResultVo.success(page.getPageData());
}
/**
* #(data.codeTitleBrief)
* @param model
* @return ResultVo
*/
@ApiOperation(value = "新增#(data.codeTitleBrief)数据", notes = "新增#(data.codeTitleBrief)数据")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_insert")
#else
@RequiresPermissions("#(data.moduleName.toLowerCase())_insert")
#end
@EnableLog
@Override
public ResultVo<?> insert(#(data.model.tableHumpName)Model model) {
// 调用新增方法
IService.insert(model);
return ResultVo.success("新增#(data.codeTitleBrief)成功");
}
/**
* #(data.codeTitleBrief)
* @param model
* @return ResultVo
*/
@ApiOperation(value = "修改#(data.codeTitleBrief)数据", notes = "修改#(data.codeTitleBrief)数据")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_update")
#else
@RequiresPermissions("#(data.moduleName.toLowerCase())_update")
#end
@EnableLog
@Override
public ResultVo<?> update(#(data.model.tableHumpName)Model model) {
// 调用修改方法
IService.update(model);
return ResultVo.success("修改#(data.codeTitleBrief)成功");
}
/**
* #(data.codeTitleBrief)
* @param id ID
* @return ResultVo
*/
@ApiOperation(value = "删除#(data.codeTitleBrief)数据", notes = "删除#(data.codeTitleBrief)数据")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_update")
#else
@RequiresPermissions("#(data.moduleName.toLowerCase())_update")
#end
@EnableLog
@Override
public ResultVo<?> del(String id){
IService.delete(id);
return ResultVo.success("删除#(data.codeTitleBrief)成功");
}
/**
* #(data.codeTitleBrief)
* @param ids ID
* @return ResultVo
*/
@ApiOperation(value = "批量删除#(data.codeTitleBrief)数据", notes = "批量删除#(data.codeTitleBrief)数据")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_update")
#else
@RequiresPermissions("#(data.moduleName.toLowerCase())_update")
#end
@EnableLog
@Override
public ResultVo<?> delAll(String ids){
String[] idArray = Convert.toStrArray(ids);
IService.deleteAll(idArray);
return ResultVo.success("批量删除#(data.codeTitleBrief)成功");
}
/**
* #(data.codeTitleBrief) Excel
* RequiresPermissionsCus
*
* Token
*
* 使2
*
* socketJava
* response javascript alert
*
* @param request request
* @param response response
*/
@ApiOperation(value = "导出Excel", notes = "导出Excel")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissionsCus("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_export")
#else
@RequiresPermissionsCus("#(data.moduleName.toLowerCase())_export")
#end
@EnableLog
@Override
public void exportExcel(HttpServletRequest request, HttpServletResponse response) {
// 当前方法
Method method = ReflectUtil.getMethodByName(this.getClass(), "exportExcel");
QueryBuilder<#(data.model.tableHumpName)> queryBuilder = new WebQueryBuilder<>(entityClazz, request.getParameterMap());
super.excelExport(#(data.model.tableHumpName)RestApi.SUB_TITLE, queryBuilder.build(), response, method);
}
/**
* #(data.codeTitleBrief) Excel
* RequiresPermissions Shiro
* @param request request
* @return ResultVo
*/
@ApiOperation(value = "导入Excel", notes = "导入Excel")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_import")
#else
@RequiresPermissions("#(data.moduleName.toLowerCase())_import")
#end
@EnableLog
@Override
public ResultVo<?> importExcel(MultipartHttpServletRequest request) {
return super.importExcel(request);
}
/**
* #(data.codeTitleBrief) Excel
* RequiresPermissionsCus
* @param response response
*/
@ApiOperation(value = "导出Excel模版", notes = "导出Excel模版")
#if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissionsCus("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_import")
#else
@RequiresPermissionsCus("#(data.moduleName.toLowerCase())_import")
#end
@Override
public void importTemplate(HttpServletResponse response) {
// 当前方法
Method method = ReflectUtil.getMethodByName(this.getClass(), "importTemplate");
super.importTemplate(#(data.model.tableHumpName)RestApi.SUB_TITLE, response, method);
}
}

@ -1,118 +0,0 @@
import request from "@/utils/request";
import {downloadFileByData} from "@/utils/download";
export function getList(data) {
return request({
#if(data.subModuleName != null && data.subModuleName != "")
url: "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/findPage",
#else
url: "#(apiPath)/#(data.moduleName)/findPage",
#end
method: "get",
params: data,
});
}
export function doInsert(data) {
return request({
#if(data.subModuleName != null && data.subModuleName != "")
url: "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/insert",
#else
url: "#(apiPath)/#(data.moduleName)/insert",
#end
method: "post",
data,
});
}
export function doUpdate(data) {
return request({
#if(data.subModuleName != null && data.subModuleName != "")
url: "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/update",
#else
url: "#(apiPath)/#(data.moduleName)/update",
#end
method: "post",
data,
});
}
export function doDelete(data) {
return request({
#if(data.subModuleName != null && data.subModuleName != "")
url: "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/del",
#else
url: "#(apiPath)/#(data.moduleName)/del",
#end
method: "post",
params: data,
});
}
export function doDeleteAll(data) {
return request({
#if(data.subModuleName != null && data.subModuleName != "")
url: "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/delAll",
#else
url: "#(apiPath)/#(data.moduleName)/delAll",
#end
method: "post",
params: data,
});
}
/**
* Excel
* @param data
* @returns file
*/
export function doExportExcel(data) {
#if(data.subModuleName != null && data.subModuleName != "")
let requestURL = "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/exportExcel";
#else
let requestURL = "#(apiPath)/#(data.moduleName)/exportExcel";
#end
// 下载文件
downloadFileByData(requestURL, data);
}
/**
*
* @returns file
*/
export function doDownloadTemplate() {
let data = {};
#if(data.subModuleName != null && data.subModuleName != "")
let requestURL = "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/importExcel/template";
#else
let requestURL = "#(apiPath)/#(data.moduleName)/importExcel/template";
#end
// 下载文件
downloadFileByData(requestURL, data);
}
/**
* Excel
* @returns file
*/
export function doImportExcel(data) {
return request({
#if(data.subModuleName != null && data.subModuleName != "")
url: "#(apiPath)/#(data.moduleName)/#(data.subModuleName)/importExcel",
#else
url: "#(apiPath)/#(data.moduleName)/importExcel",
#end
method: "post",
// 最长超时时间 3 分钟
timeout: 180000,
headers: {
"Content-Type": "multipart/form-data"
},
data,
});
}

@ -1,187 +0,0 @@
<template>
<el-dialog
:title="title"
:visible.sync="dialogFormVisible"
:close-on-click-modal="false"
width="800px"
@close="close"
>
<el-form ref="form" :model="form" :rules="rules" label-width="105px">
<el-row :gutter="10" >
#for(column : data.model.formList)
###
#if(column.showType == "0")
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
<el-form-item label="#(column.fieldComments)" prop="#(column.fieldHumpName)">
<el-input v-model="form.#(column.fieldHumpName)" autocomplete="off"></el-input>
</el-form-item>
</el-col>
###
#else if(column.showType == "1")
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
<el-form-item label="#(column.fieldComments)" prop="#(column.fieldHumpName)">
<el-input type="textarea" v-model="form.#(column.fieldHumpName)" autocomplete="off"></el-input>
</el-form-item>
</el-col>
###
#else if(column.showType == "2")
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
<el-form-item label="#(column.fieldComments)" prop="#(column.fieldHumpName)">
<el-select v-model="form.#(column.fieldHumpName)" clearable
placeholder="请选择" style="width: 100%">
<el-option
v-for="item in dict.#(column.dictTypeCode)"
:key="item.dictValue"
:label="item.dictName"
:value="item.dictValue"
></el-option>
</el-select>
</el-form-item>
</el-col>
###
#else if(column.showType == "3")
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
<el-form-item label="#(column.fieldComments)" prop="#(column.fieldHumpName)">
<el-date-picker
v-model="form.#(column.fieldHumpName)"
type="datetime"
placeholder="选择#(column.fieldComments)"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
###
#else if(column.showType == "4")
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
<el-form-item label="#(column.fieldComments)" prop="#(column.fieldHumpName)">
<el-date-picker
v-model="form.#(column.fieldHumpName)"
type="date"
placeholder="选择#(column.fieldComments)"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
#end
#end
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="close"> </el-button>
<el-button type="primary" @click="save"> </el-button>
</div>
</el-dialog>
</template>
<script>
#if(data.subModuleName != null && data.subModuleName != "")
import { doInsert, doUpdate } from "@/api/#(data.moduleName)/#(data.subModuleName)/#(data.model.tableHumpName)Management";
#else
import { doInsert, doUpdate } from "@/api/#(data.moduleName)/#(data.model.tableHumpName)Management";
#end
import { isNull } from "@/utils/validate";
import { formateDate } from "@/utils/format";
import { validatorRule } from "@/utils/validateRlue";
export default {
name: "#(data.model.tableHumpName)ManagementEdit",
data() {
return {
form: {
// 设置默认值
version: 0
},
dict: {},
rules: {
#for(columnList : data.model.formList)
#for(column : columnList)
#if(column.validateTypeList != null && column.validateTypeList.size() > 0)
#(column.fieldHumpName): [
#for(typeNotComma : column.validateTypeList)
#if(typeNotComma == "IS_NOT_NULL")
{ required: true, trigger: "blur", message: "#(column.fieldComments)非空" },
#end
#end
#for(typeNotComma : column.validateTypeList)
#if(typeNotComma != "IS_NOT_NULL")
{ required: false, trigger: "blur", validator: validatorRule.#(typeNotComma) },
#end
#end
],
#end
#end
#end
},
title: "",
dialogFormVisible: false,
};
},
created() {
},
mounted() {
// 加载字典值
#for(column : data.model.columnList)
#if(column.dictTypeCode != null && column.dictTypeCode != "")
this.dict.#(column.dictTypeCode) = this.$getDictList("#(column.dictTypeCode)");
#end
#end
},
methods: {
showEdit(row) {
if (!row) {
this.title = "添加";
} else {
this.title = "编辑";
this.form = Object.assign({}, row);
}
this.dialogFormVisible = true;
},
close() {
this.dialogFormVisible = false;
this.$refs["form"].resetFields();
this.form = this.$options.data().form;
},
save() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
// 处理数据
this.handlerFormData(this.form);
// 修改
if (!isNull(this.form.id)) {
const { success, msg } = await doUpdate(this.form);
if(success){
this.$baseMessage(msg, "success");
}
} else {
const { success, msg } = await doInsert(this.form);
if(success){
this.$baseMessage(msg, "success");
}
}
await this.$emit("fetchData");
this.close();
} else {
return false;
}
});
},
// 处理 form数据
handlerFormData(formData){
if(!isNull(formData)){
for(let key in formData){
// 对于时间类进行处理
if("[object Date]" === Object.prototype.toString.call(formData[key])){
formData[key] = formateDate(formData[key], 'yyyy-MM-dd hh:mm:ss');
}
}
}
},
},
};
</script>

@ -1,183 +0,0 @@
<template>
<el-dialog
:title="title"
:visible.sync="dialogFormVisible"
:close-on-click-modal="false"
width="800px"
class="import-excel"
@close="close"
>
<el-upload
ref="excelImport"
drag
accept=".xls,.xlsx"
style="width: 100%"
:action="importExcelUrl"
:multiple="false"
:before-upload="beforeUpload"
:http-request="handleImport"
:on-success="onSuccess"
:on-error="onError"
:on-progress="onProcess"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text"><em></em></div>
<div class="el-upload__tip" slot="tip">xls/xlsx5MB</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="downloadExcelTemplate"></el-button>
<el-button @click="close"> </el-button>
</div>
</el-dialog>
</template>
<script>
#if(data.subModuleName != null && data.subModuleName != "")
import { doDownloadTemplate, doImportExcel } from "@/api/#(data.moduleName)/#(data.subModuleName)/#(data.model.tableHumpName)Management";
#else
import { doDownloadTemplate, doImportExcel } from "@/api/#(data.moduleName)/#(data.model.tableHumpName)Management";
#end
import {isNull} from "@/utils/validate";
import {random} from "@/utils";
export default {
name: "#(data.model.tableHumpName)ManagementImport",
data() {
return {
title: "导入Excel",
importExcelUrl: '',
dialogFormVisible: false,
loadProgress: 0, // 动态显示进度条
progressFlag: false, // 关闭进度条,
progressMap: {}
};
},
created() {},
mounted() {},
methods: {
show() {
this.dialogFormVisible = true;
},
close() {
this.dialogFormVisible = false;
this.$refs["excelImport"].clearFiles();
},
// 下载模版
downloadExcelTemplate() {
doDownloadTemplate();
},
// 上传成功
onSuccess(response, file, fileList){
this.successProcess(file.uid);
this.$emit("fetchData");
},
// 上传失败
onError(err, file, fileList){
this.errorProcess(file.uid);
},
// 进度条
onProcess(event, file, fileList) {
file.status = 'uploading';
file.percentage = 0;
this.progressMap[file.uid] = {
file: file,
}
this.autoLoadingProcess(file.uid);
},
// 导入文件限制验证
beforeUpload(file) {
let testMsg = file.name.substring(file.name.lastIndexOf('.')+1)
const extension = testMsg === 'xls'
const extension2 = testMsg === 'xlsx'
const isLt2M = file.size / 1024 / 1024 < 5
if(!extension && !extension2) {
this.$baseMessage(' xlsxlsx!', "warning");
}
if(!isLt2M) {
this.$baseMessage(' 5MB!', "warning");
}
return (extension || extension2) && isLt2M
},
// 自定义导入
handleImport(params){
if(!isNull(params)){
let blobObject = new Blob([params.file]);
let formData = new window.FormData()
formData.append("file", blobObject);
const ret = doImportExcel(formData);
ret.then((v) => {
const {success,msg,data} = v;
if(success){
this.$baseMessage(msg, "success");
// 成功
params.onSuccess();
}else{
// 文件进度 100%
this.errorProcess(params.file.uid);
// 失败
params.onError();
}
}).catch( (e) =>{
// 失败
params.onError();
});
// 上传进度
params.onProgress();
}else{
params.onError();
}
},
// ==============
successProcess(fileUid) {
let tmp = this.progressMap[fileUid];
if(tmp !== null && tmp !== undefined){
try {
window.clearTimeout(tmp.timer);
}catch (e){}
tmp.file.status = 'success';
tmp.file.percentage = 100;
delete this.progressMap[fileUid];
}
},
errorProcess(fileUid) {
let tmp = this.progressMap[fileUid];
if(tmp !== null && tmp !== undefined){
try {
window.clearTimeout(tmp.timer);
}catch (e){}
tmp.file.status = 'fail';
delete this.progressMap[fileUid];
}
},
autoLoadingProcess(fileUid) {
const that = this;
let tmp = this.progressMap[fileUid];
if(tmp !== null && tmp !== undefined){
if(tmp.file.percentage >= 99) {
try {
window.clearTimeout(tmp.timer);
}catch (e){}
}else {
// 如果大于 99 则 停止
if(tmp.file.percentage + random(1, 12) > 99){
tmp.file.percentage = 99;
}else{
// 进度随机增长 1 - 12
tmp.file.percentage += random(1, 12);
}
// 递归增加百分比 递归时间为 随机 1-5秒
tmp.timer = window.setTimeout(function (){
that.autoLoadingProcess(fileUid);
}, random(1000, 5000));
}
}
},
},
};
</script>

@ -1,543 +0,0 @@
<template>
<div class="tenantManagement-container">
<el-collapse-transition>
<div class="more-query" v-show="this.moreQueryFlag">
<!-- -->
<vab-query-form>
<vab-query-form-left-panel :span="24">
<el-form :inline="true" :model="queryForm" @submit.native.prevent>
#for(column : data.model.moreQueryList)
###
#if(column.showType == "2")
<el-form-item>
<el-select v-model="queryForm.#(column.fieldHumpName+'_'+column.queryType)" placeholder="请选择#(column.fieldComments)" clearable style="width: 100%">
<el-option
v-for="item in dict.#(column.dictTypeCode)"
:key="item.dictValue"
:label="item.dictName"
:value="item.dictValue"
></el-option>
</el-select>
</el-form-item>
#else if(column.showType == "3")
###
<el-form-item>
<el-date-picker
v-model="#(column.fieldHumpName)DatePicker"
type="datetimerange"
:picker-options="pickerOptions"
range-separator="至"
start-placeholder="开始#(column.fieldComments)"
end-placeholder="结束#(column.fieldComments)"
align="right">
</el-date-picker>
</el-form-item>
#else if(column.showType == "4")
###
<el-form-item>
<el-date-picker
v-model="#(column.fieldHumpName)DatePicker"
type="daterange"
align="right"
range-separator="至"
start-placeholder="开始#(column.fieldComments)"
end-placeholder="结束#(column.fieldComments)"
></el-date-picker>
</el-form-item>
#else
#if(column.queryType == "EQ" || column.queryType == "LIKE")
<el-form-item>
<el-input
v-model.trim="queryForm.#(column.fieldHumpName)_#(column.queryType)"
placeholder="请输入#(column.fieldComments)"
clearable
/>
</el-form-item>
#else if(column.queryType == "RANGE")
<el-col :span="12" >
<el-form-item style="text-align: center">
<el-input
v-model.trim="queryForm.#(column.fieldHumpName)_BEGIN"
placeholder="#(column.fieldComments)开始"
clearable
style="float: left;width: calc(50% - 6px)"
/>
<div style="float:left;width: 12px">-</div>
<el-input
v-model.trim="queryForm.#(column.fieldHumpName)_END"
placeholder="#(column.fieldComments)结束"
clearable
style="float: right;width: calc(50% - 6px)"
/>
</el-form-item>
</el-col>
#end
#end
#end
</el-form>
</vab-query-form-left-panel>
</vab-query-form>
<el-divider></el-divider>
</div>
</el-collapse-transition>
<!-- -->
<vab-query-form>
<vab-query-form-left-panel :span="10">
<el-button
#if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_insert')"
#else
v-if="$perms('#(data.moduleName.toLowerCase())_insert')"
#end
icon="el-icon-plus"
type="primary"
@click="handleInsert"
> </el-button>
<el-button
#if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_import')"
#else
v-if="$perms('#(data.moduleName.toLowerCase())_import')"
#end
icon="el-icon-upload2"
type="warning"
@click="handleImportExcel"
> </el-button>
<el-button
#if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_export')"
#else
v-if="$perms('#(data.moduleName.toLowerCase())_export')"
#end
icon="el-icon-download"
type="warning"
@click="handleExportExcel"
> </el-button>
<el-button
#if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_delete')"
#else
v-if="$perms('#(data.moduleName.toLowerCase())_delete')"
#end
:disabled="!selectRows.length > 0"
icon="el-icon-delete"
type="danger"
@click="handleDelete"
> </el-button>
</vab-query-form-left-panel>
<vab-query-form-right-panel :span="14">
<el-form :inline="true" :model="queryForm" @submit.native.prevent>
### 2
#for(column : data.model.briefQueryList)
###
#if(column.showType == "2")
<el-form-item>
<el-select v-model="queryForm.#(column.fieldHumpName+'_'+column.queryType)" placeholder="请选择#(column.fieldComments)" clearable style="width: 100%">
<el-option
v-for="item in dict.#(column.dictTypeCode)"
:key="item.dictValue"
:label="item.dictName"
:value="item.dictValue"
></el-option>
</el-select>
</el-form-item>
#else if(column.showType == "3")
###
<el-form-item>
<el-date-picker
v-model="#(column.fieldHumpName)DatePicker"
type="datetimerange"
:picker-options="pickerOptions"
range-separator="至"
start-placeholder="开始#(column.fieldComments)"
end-placeholder="结束#(column.fieldComments)"
align="right">
</el-date-picker>
</el-form-item>
#else if(column.showType == "4")
###
<el-form-item>
<el-date-picker
v-model="#(column.fieldHumpName)DatePicker"
type="daterange"
align="right"
range-separator="至"
start-placeholder="开始#(column.fieldComments)"
end-placeholder="结束#(column.fieldComments)"
></el-date-picker>
</el-form-item>
#else
#if(column.queryType == "EQ" || column.queryType == "LIKE")
<el-form-item>
<el-input
v-model.trim="queryForm.#(column.fieldHumpName)_#(column.queryType)"
placeholder="请输入#(column.fieldComments)"
clearable
/>
</el-form-item>
#else if(column.queryType == "RANGE")
<el-col :span="12" >
<el-form-item style="text-align: center">
<el-input
v-model.trim="queryForm.#(column.fieldHumpName)_BEGIN"
placeholder="#(column.fieldComments)开始"
clearable
style="float: left;width: calc(50% - 6px)"
/>
<div style="float:left;width: 12px">-</div>
<el-input
v-model.trim="queryForm.#(column.fieldHumpName)_END"
placeholder="#(column.fieldComments)结束"
clearable
style="float: right;width: calc(50% - 6px)"
/>
</el-form-item>
</el-col>
#end
#end
#end
<el-form-item>
<el-button icon="el-icon-search" type="primary" @click="queryData">
</el-button>
#if(data.model.moreQueryList != null && data.model.moreQueryList.size() > 0)
<el-button icon="el-icon-search" @click="moreQuery">
</el-button>
#end
</el-form-item>
</el-form>
</vab-query-form-right-panel>
</vab-query-form>
<el-table
v-loading="listLoading"
:data="list"
:element-loading-text="elementLoadingText"
@selection-change="setSelectRows"
>
<el-table-column show-overflow-tooltip type="selection"></el-table-column>
<el-table-column show-overflow-tooltip label="序号" width="95">
<template slot-scope="scope">
{{(queryForm.pageNo - 1) * queryForm.pageSize + scope.$index + 1}}
</template>
</el-table-column>
#for(column : data.model.columnList)
###
#if(column.showType == "2" && column.izShowList == "1")
<el-table-column
show-overflow-tooltip
prop="#(column.fieldHumpName)"
label="#(column.fieldComments)"
>
<template slot-scope="scope">
<span>
{{ $getDictNameByValue('#(column.dictTypeCode)', scope.row.#(column.fieldHumpName)) }}
</span>
</template>
</el-table-column>
#else
#if(column.izShowList == "1")
<el-table-column
show-overflow-tooltip
prop="#(column.fieldHumpName)"
label="#(column.fieldComments)"
></el-table-column>
#end
#end
#end
<el-table-column
show-overflow-tooltip
label="操作"
width="200"
#if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_update') || $perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_delete')"
#else
v-if="$perms('#(data.moduleName.toLowerCase())_update') || $perms('#(data.moduleName.toLowerCase())_delete')"
#end
>
<template v-slot="scope">
<el-button
#if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_update')"
#else
v-if="$perms('#(data.moduleName.toLowerCase())_update')"
#end
type="text"
@click="handleUpdate(scope.row)"
> </el-button>
<el-button
#if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_delete')"
#else
v-if="$perms('#(data.moduleName.toLowerCase())_delete')"
#end
type="text"
@click="handleDelete(scope.row)"
> </el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
:current-page="queryForm.pageNo"
:page-size="queryForm.pageSize"
:layout="layout"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
></el-pagination>
<edit ref="edit" @fetchData="fetchData"></edit>
<import ref="import" @fetchData="fetchData" ></import>
</div>
</template>
<script>
#if(data.subModuleName != null && data.subModuleName != "")
import { getList, doDelete, doDeleteAll, doExportExcel } from "@/api/#(data.moduleName)/#(data.subModuleName)/#(data.model.tableHumpName)Management";
#else
import { getList, doDelete, doDeleteAll, doExportExcel } from "@/api/#(data.moduleName)/#(data.model.tableHumpName)Management";
#end
import Edit from "./components/#(data.model.tableHumpName)ManagementEdit";
import Import from "./components/#(data.model.tableHumpName)ManagementImport";
import { vueButtonClickBan } from "@/utils";
import { isNotNull } from "@/utils/valiargs";
import { formateDate } from "@/utils/format";
export default {
name: "#(data.model.tableHumpName)Management",
components: { Edit, Import },
data() {
return {
list: null,
listLoading: true,
layout: "total, prev, pager, next, sizes, jumper",
total: 0,
selectRows: "",
elementLoadingText: "正在加载...",
moreQueryFlag: false,
queryForm: {
pageNo: 1,
pageSize: 10,
### 2
#for(column : data.model.briefQueryList)
###
#if(column.showType == "2")
#(column.fieldHumpName)_EQ: "",
#else if(column.showType == "3" || column.showType == "4")
###
#(column.fieldHumpName)_BEGIN: "",
#(column.fieldHumpName)_END: "",
#else
#if(column.queryType == "EQ" || column.queryType == "LIKE")
#(column.fieldHumpName)_#(column.queryType): "",
#else if(column.queryType == "RANGE")
#(column.fieldHumpName)_BEGIN: "",
#(column.fieldHumpName)_END: "",
#end
#end
#end
###
#for(column : data.model.moreQueryList)
###
#if(column.showType == "2")
#(column.fieldHumpName)_EQ: "",
#else if(column.showType == "3" || column.showType == "4")
###
#(column.fieldHumpName)_BEGIN: "",
#(column.fieldHumpName)_END: "",
#else
#if(column.queryType == "EQ" || column.queryType == "LIKE")
#(column.fieldHumpName)_#(column.queryType): "",
#else if(column.queryType == "RANGE")
#(column.fieldHumpName)_BEGIN: "",
#(column.fieldHumpName)_END: "",
#end
#end
#end
},
### 2
#for(column : data.model.briefQueryList)
###
#if(column.showType == "3" || column.showType == "4")
#(column.fieldHumpName)DatePicker: [],
#end
#end
###
#for(column : data.model.moreQueryList)
###
#if(column.showType == "3" || column.showType == "4")
#(column.fieldHumpName)DatePicker: [],
#end
#end
dict:{},
pickerOptions: {
shortcuts: [{
text: '',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
}, {
text: '',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
}, {
text: '',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', [start, end]);
}
}]
},
};
},
created() {
this.fetchData();
},
mounted() {
#for(column : data.model.columnList)
#if(column.dictTypeCode != null && column.dictTypeCode != "")
this.dict.#(column.dictTypeCode) = this.$getDictList("#(column.dictTypeCode)");
#end
#end
},
methods: {
setSelectRows(val) {
this.selectRows = val;
},
handleInsert(row) {
this.$refs["edit"].showEdit();
},
handleUpdate(row) {
if (row.id) {
this.$refs["edit"].showEdit(row);
}
},
handleDelete(row) {
if (row.id) {
this.$baseConfirm("你确定要删除当前项吗", null, async () => {
const { msg } = await doDelete({ id: row.id });
this.$baseMessage(msg, "success");
await this.fetchData();
});
} else {
if (this.selectRows.length > 0) {
const ids = this.selectRows.map((item) => item.id).join();
this.$baseConfirm("你确定要删除选中项吗", null, async () => {
const { msg } = await doDeleteAll({ ids });
this.$baseMessage(msg, "success");
await this.fetchData();
});
} else {
this.$baseMessage("未选中任何行", "error");
return false;
}
}
},
// 导出excel
handleExportExcel(el){
// 导出按钮防抖处理 默认限制为10秒
vueButtonClickBan(el, 10);
// 执行导出
doExportExcel(this.queryForm);
},
// 导入excel
handleImportExcel(){
this.$refs["import"].show();
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNo = val;
this.fetchData();
},
moreQuery(){
this.moreQueryFlag = !this.moreQueryFlag;
},
queryData() {
### 2
#for(column : data.model.briefQueryList)
###
#if(column.showType == "3" || column.showType == "4")
if(isNotNull(this.#(column.fieldHumpName)DatePicker) && this.#(column.fieldHumpName)DatePicker.length === 2){
this.queryForm.#(column.fieldHumpName)_BEGIN =
this.#(column.fieldHumpName)DatePicker.length === 0 ? "" : formateDate(this.#(column.fieldHumpName)DatePicker[0], 'yyyy-MM-dd hh:mm:ss');
this.queryForm.#(column.fieldHumpName)_END =
this.#(column.fieldHumpName)DatePicker.length === 0 ? "" : formateDate(this.#(column.fieldHumpName)DatePicker[1], 'yyyy-MM-dd hh:mm:ss');
}else{
this.queryForm.#(column.fieldHumpName)_BEGIN = "";
this.queryForm.#(column.fieldHumpName)_END = "";
} #end
#end
###
#for(column : data.model.moreQueryList)
###
#if(column.showType == "3" || column.showType == "4")
if(isNotNull(this.#(column.fieldHumpName)DatePicker) && this.#(column.fieldHumpName)DatePicker.length === 2){
this.queryForm.#(column.fieldHumpName)_BEGIN =
this.#(column.fieldHumpName)DatePicker.length === 0 ? "" : formateDate(this.#(column.fieldHumpName)DatePicker[0], 'yyyy-MM-dd hh:mm:ss');
this.queryForm.#(column.fieldHumpName)_END =
this.#(column.fieldHumpName)DatePicker.length === 0 ? "" : formateDate(this.#(column.fieldHumpName)DatePicker[1], 'yyyy-MM-dd hh:mm:ss');
}else{
this.queryForm.#(column.fieldHumpName)_BEGIN = "";
this.queryForm.#(column.fieldHumpName)_END = "";
}
#end
#end
this.queryForm.pageNo = 1;
this.fetchData();
},
async fetchData() {
this.listLoading = true;
const { data } = await getList(this.queryForm);
if(isNotNull(data)){
this.list = data.rows;
this.total = data.total;
setTimeout(() => {
this.listLoading = false;
}, 300);
}
},
},
};
</script>

@ -1,58 +0,0 @@
> Copyright 2020 OPSLI https://www.opsli.com
#[[## OPSLI ]]#
> #(data.codeTitle)[#(data.model.tableHumpName)] , #(currTime)
> : #(data.authorName)
#[[### ]]#
>
```
`api` `modulars`
api
org.opsli.api.wrapper.
org.opsli.api.web.
modulars
org.opsli.modulars.
```
#[[### ]]#
```
views vue
/src/views/modules//index.vue
/src/views/modules//components/Edit.vue
```
```
api api
/src/api//api.js
```
#[[### ]]#
```
`#(data.moduleName.toLowerCase())` ()
`#(data.subModuleName.toLowerCase())`
#if(data.subModuleName != null && data.subModuleName != "")
: `views/modules/#(data.moduleName.toLowerCase())/#(data.subModuleName.toLowerCase())/index`
#else
: `views/modules/#(data.moduleName.toLowerCase())/index`
#end
`select`
`insert`
`update`
`delete`
`import`
`export`
```
Loading…
Cancel
Save