代码生成器增加 导入导出

v1.4.1
Parker 5 years ago
parent aad018b571
commit 7517810dc0

@ -47,6 +47,8 @@ public enum CreaterMsg implements BaseMsg {
*/ */
EXCEPTION_IMPORT_NULL(50120,"未选中表,无法导入"), EXCEPTION_IMPORT_NULL(50120,"未选中表,无法导入"),
EXCEPTION_IMPORT_TABLE_NULL(50121,"暂无{}该表"), EXCEPTION_IMPORT_TABLE_NULL(50121,"暂无{}该表"),
EXCEPTION_IMPORT_FIELD_NULL(50122,"暂未获得表字段"),
/** /**
* *
@ -58,8 +60,8 @@ public enum CreaterMsg implements BaseMsg {
; ;
private int code; private final int code;
private String message; private final String message;
CreaterMsg(int code, String message){ CreaterMsg(int code, String message){
this.code = code; this.code = code;

@ -126,6 +126,8 @@ public enum CodeBuilder {
fileList.add(VueCodeBuilder.INSTANCE.createIndex(builderModel, dataStr)); fileList.add(VueCodeBuilder.INSTANCE.createIndex(builderModel, dataStr));
// edit // edit
fileList.add(VueCodeBuilder.INSTANCE.createEdit(builderModel, dataStr)); fileList.add(VueCodeBuilder.INSTANCE.createEdit(builderModel, dataStr));
// import
fileList.add(VueCodeBuilder.INSTANCE.createImport(builderModel, dataStr));
// 前api // 前api
fileList.add(VueCodeBuilder.INSTANCE.createApi(builderModel, dataStr)); fileList.add(VueCodeBuilder.INSTANCE.createApi(builderModel, dataStr));

@ -75,11 +75,11 @@ public enum VueCodeBuilder {
List<CreaterTableColumnModel> briefQueryList = new ArrayList<>(2); List<CreaterTableColumnModel> briefQueryList = new ArrayList<>(2);
// 更多检索 // 更多检索
List<CreaterTableColumnModel> moreQueryList = new ArrayList<>(); List<CreaterTableColumnModel> moreQueryList = new ArrayList<>();
for (int i = 0; i < columnList.size(); i++) { for (CreaterTableColumnModel createrTableColumnModel : columnList) {
if(StringUtils.isNotBlank(columnList.get(i).getQueryType()) && if (StringUtils.isNotBlank(createrTableColumnModel.getQueryType()) &&
columnList.get(i).getIzShowList().equals(DictType.NO_YES_YES.getCode()) createrTableColumnModel.getIzShowList().equals(DictType.NO_YES_YES.getCode())
) { ) {
queryList.add(columnList.get(i)); queryList.add(createrTableColumnModel);
} }
} }
// 筛选数据 // 筛选数据
@ -130,7 +130,7 @@ public enum VueCodeBuilder {
List<CreaterTableColumnModel> columnList = builderModel.getModel().getColumnList(); List<CreaterTableColumnModel> columnList = builderModel.getModel().getColumnList();
List<List<CreaterTableColumnModel>> formList = new ArrayList<>(); List<List<CreaterTableColumnModel>> formList = new ArrayList<>();
Map<String,List<String>> valiDict = new HashMap<>(); Map<String,List<String>> valiDict = new HashMap<>();
Set<String> validataTypes = new HashSet<>(); Set<String> validateTypesSet = new HashSet<>();
// 处理验证数据 // 处理验证数据
for (CreaterTableColumnModel columnModel : columnList) { for (CreaterTableColumnModel columnModel : columnList) {
// 数据库字段名转驼峰 // 数据库字段名转驼峰
@ -159,7 +159,7 @@ public enum VueCodeBuilder {
); );
} }
validataTypes.addAll(validateTypeList); validateTypesSet.addAll(validateTypeList);
valiDict.put(columnModel.getFieldName(), validateTypeList); valiDict.put(columnModel.getFieldName(), validateTypeList);
} }
} }
@ -188,17 +188,17 @@ public enum VueCodeBuilder {
} }
} }
StringBuilder validataTypeStb = new StringBuilder(); StringBuilder validateTypeStb = new StringBuilder();
for (String validataType : validataTypes) { for (String validateType : validateTypesSet) {
validataTypeStb.append(validataType); validateTypeStb.append(validateType);
validataTypeStb.append(", "); validateTypeStb.append(", ");
} }
String codeStr = EnjoyUtil.render("/foreend/components/TemplateEdit.html", String codeStr = EnjoyUtil.render("/foreend/components/TemplateEdit.html",
this.createKv(builderModel) this.createKv(builderModel)
.set("formList", formList) .set("formList", formList)
.set("valiDict", valiDict) .set("valiDict", valiDict)
.set("validataTypes", validataTypeStb.toString()) .set("validateTypes", validateTypeStb.toString())
); );
StringBuilder path = new StringBuilder(); StringBuilder path = new StringBuilder();
@ -223,6 +223,52 @@ public enum VueCodeBuilder {
return entityMap; return entityMap;
} }
/**
* Import
* @param builderModelTmp
* @return
*/
public Map<String,String> createImport(CreaterBuilderModel builderModelTmp, String dataStr){
CreaterBuilderModel builderModel =
WrapperUtil.cloneTransformInstance(builderModelTmp, CreaterBuilderModel.class);
List<CreaterTableColumnModel> columnList = builderModel.getModel().getColumnList();
// 处理数据
for (CreaterTableColumnModel columnModel : columnList) {
// 数据库字段名转驼峰
columnModel.setFieldName(
HumpUtil.underlineToHump(
columnModel.getFieldName()
)
);
}
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().getTableName()+"ManagementImport.vue");
entityMap.put(ZipUtils.FILE_DATA, codeStr);
return entityMap;
}
/** /**
* Api * Api
* @param builderModelTmp * @param builderModelTmp

@ -27,8 +27,6 @@ public final class EnjoyUtil {
*/ */
public static String render(String templateFileName, Kv kv) { public static String render(String templateFileName, Kv kv) {
//ClassPathResource resource = new ClassPathResource(templateFileName);
// (InputStream inputStream = resource.getInputStream())
String str = ""; String str = "";
ClassPathResource resource = new ClassPathResource(BASE_PATH + templateFileName); ClassPathResource resource = new ClassPathResource(BASE_PATH + templateFileName);
try (InputStream inputStream = resource.getInputStream()){ try (InputStream inputStream = resource.getInputStream()){

@ -15,6 +15,7 @@
*/ */
package org.opsli.modulars.creater.table.service.impl; package org.opsli.modulars.creater.table.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import org.opsli.common.enums.DictType; import org.opsli.common.enums.DictType;
import org.opsli.common.utils.WrapperUtil; import org.opsli.common.utils.WrapperUtil;
@ -214,6 +215,11 @@ public class TableServiceImpl extends CrudServiceImpl<TableMapper, CreaterTable,
// 获得表字段 // 获得表字段
List<DatabaseColumn> columns = ImportTableUtil.findColumns(tableName); List<DatabaseColumn> columns = ImportTableUtil.findColumns(tableName);
if(CollUtil.isEmpty(columns)){
// 暂未获得表字段
throw new CreaterException(CreaterMsg.EXCEPTION_IMPORT_FIELD_NULL);
}
List<CreaterTableColumnModel> columnModels = new ArrayList<>(); List<CreaterTableColumnModel> columnModels = new ArrayList<>();
for (int i = 0; i < columns.size(); i++) { for (int i = 0; i < columns.size(); i++) {
DatabaseColumn column = columns.get(i); DatabaseColumn column = columns.get(i);

@ -17,9 +17,9 @@ opsli:
- sys_tenant - sys_tenant
- sys_user - sys_user
- sys_user_role_ref - sys_user_role_ref
- sys_user_org_ref
- sys_area - sys_area
- sys_org - sys_org
- sys_org_user_ref
# 排除字段 # 排除字段

@ -35,6 +35,7 @@ import org.opsli.core.persistence.querybuilder.WebQueryBuilder;
import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
#if(data.subModuleName != null && data.subModuleName != "") #if(data.subModuleName != null && data.subModuleName != "")
import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).entity.#(data.model.tableName); import #(data.packageName+"."+data.moduleName+"."+data.subModuleName).entity.#(data.model.tableName);
@ -191,6 +192,7 @@ public class #(data.model.tableName)RestController extends BaseRestController<#(
/** /**
* #(data.codeTitleBrief) Excel * #(data.codeTitleBrief) Excel
* RequiresPermissionsCus
* *
* Token * Token
* *
@ -220,23 +222,25 @@ public class #(data.model.tableName)RestController extends BaseRestController<#(
/** /**
* #(data.codeTitleBrief) Excel * #(data.codeTitleBrief) Excel
* RequiresPermissions Shiro
* @param request request * @param request request
* @return ResultVo * @return ResultVo
*/ */
@ApiOperation(value = "导入Excel", notes = "导入Excel") @ApiOperation(value = "导入Excel", notes = "导入Excel")
#if(data.subModuleName != null && data.subModuleName != "") #if(data.subModuleName != null && data.subModuleName != "")
@RequiresPermissionsCus("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_import") @RequiresPermissions("#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_import")
#else #else
@RequiresPermissionsCus("#(data.moduleName.toLowerCase())_import") @RequiresPermissions("#(data.moduleName.toLowerCase())_import")
#end #end
@EnableLog @EnableLog
@Override @Override
public ResultVo<?> importExcel(MultipartHttpServletRequest request) { public ResultVo<?> importExcel(MultipartHttpServletRequest request) {
return super.excelImport(request); return super.importExcel(request);
} }
/** /**
* #(data.codeTitleBrief) Excel * #(data.codeTitleBrief) Excel
* RequiresPermissionsCus
* @param response response * @param response response
* @return ResultVo * @return ResultVo
*/ */

@ -1,4 +1,5 @@
import request from "@/utils/request"; import request from "@/utils/request";
import {downloadFileByData} from "@/utils/download";
export function getList(data) { export function getList(data) {
return request({ return request({
@ -61,3 +62,57 @@ export function doDeleteAll(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",
// 最长超时时间 50秒
timeout: 50000,
headers: {
'Content-Type': 'multipart/form-data'
},
data,
});
}

@ -46,7 +46,7 @@
<el-date-picker <el-date-picker
v-model="form.#(column.fieldName)" v-model="form.#(column.fieldName)"
type="datetime" type="datetime"
placeholder="选择#(column.fieldComments)时间" placeholder="选择#(column.fieldComments)"
style="width: 100%" style="width: 100%"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
@ -58,7 +58,7 @@
<el-date-picker <el-date-picker
v-model="form.#(column.fieldName)" v-model="form.#(column.fieldName)"
type="date" type="date"
placeholder="选择#(column.fieldComments)日期" placeholder="选择#(column.fieldComments)"
style="width: 100%" style="width: 100%"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
@ -86,7 +86,7 @@
#end #end
import { formateDate } from "@/utils/format"; import { formateDate } from "@/utils/format";
import { isNull } from "@/utils/validate"; import { isNull } from "@/utils/validate";
import { #(validataTypes) getMsg} from "@/utils/valiargs"; import { #(validateTypes) getMsg} from "@/utils/valiargs";
export default { export default {
name: "#(data.model.tableName)ManagementEdit", name: "#(data.model.tableName)ManagementEdit",

@ -0,0 +1,182 @@
<template>
<el-dialog
:title="title"
:visible.sync="dialogFormVisible"
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.tableName)Management";
#else
import { doDownloadTemplate, doImportExcel } from "@/api/#(data.moduleName)/#(data.model.tableName)Management";
#end
import {isNull} from "@/utils/validate";
import {random} from "@/utils";
export default {
name: "#(data.model.tableName)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>

@ -100,6 +100,28 @@
@click="handleInsert" @click="handleInsert"
> </el-button> > </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 <el-button
#if(data.subModuleName != null && data.subModuleName != "") #if(data.subModuleName != null && data.subModuleName != "")
v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_delete')" v-if="$perms('#(data.moduleName.toLowerCase())_#(data.subModuleName.toLowerCase())_delete')"
@ -290,22 +312,25 @@
></el-pagination> ></el-pagination>
<edit ref="edit" @fetchData="fetchData"></edit> <edit ref="edit" @fetchData="fetchData"></edit>
<import ref="import" @fetchData="fetchData" ></import>
</div> </div>
</template> </template>
<script> <script>
#if(data.subModuleName != null && data.subModuleName != "") #if(data.subModuleName != null && data.subModuleName != "")
import { getList, doDelete, doDeleteAll } from "@/api/#(data.moduleName)/#(data.subModuleName)/#(data.model.tableName)Management"; import { getList, doDelete, doDeleteAll, doExportExcel } from "@/api/#(data.moduleName)/#(data.subModuleName)/#(data.model.tableName)Management";
#else #else
import { getList, doDelete, doDeleteAll } from "@/api/#(data.moduleName)/#(data.model.tableName)Management"; import { getList, doDelete, doDeleteAll, doExportExcel } from "@/api/#(data.moduleName)/#(data.model.tableName)Management";
#end #end
import Edit from "./components/#(data.model.tableName)ManagementEdit"; import Edit from "./components/#(data.model.tableName)ManagementEdit";
import Import from "./components/#(data.model.tableName)ManagementImport";
import { isNotNull } from "@/utils/valiargs"; import { isNotNull } from "@/utils/valiargs";
import { formateDate } from "@/utils/format"; import { formateDate } from "@/utils/format";
export default { export default {
name: "#(data.model.tableName)Management", name: "#(data.model.tableName)Management",
components: { Edit }, components: { Edit, Import },
data() { data() {
return { return {
list: null, list: null,
@ -442,6 +467,17 @@
} }
} }
}, },
// 导出excel
handleExportExcel(){
// 执行导出
doExportExcel(this.queryForm);
},
// 导入excel
handleImportExcel(){
this.$refs["import"].show();
},
handleSizeChange(val) { handleSizeChange(val) {
this.queryForm.pageSize = val; this.queryForm.pageSize = val;
this.fetchData(); this.fetchData();

@ -53,7 +53,7 @@ api 包里的代码为 api接口层拷贝至对应目录即可
`insert` `insert`
`update` `update`
`delete` `delete`
`import` `import`
`export` `export`
``` ```

Loading…
Cancel
Save