diff --git a/scripts/代码生成模板antdv-next专用/README.md b/scripts/代码生成模板antdv-next专用/README.md new file mode 100644 index 00000000..679b1d3e --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/README.md @@ -0,0 +1,23 @@ +## Vben5 代码生成模板 + +注意antdv-next专用 跟ant-design-vue不兼容 + +## 粘贴 vben5 模板文件 + +将`vben5`文件夹复制到`/ruoyi-modules/ruoyi-generator`的`/resources/vm`下 + +## 替换 java 文件 + +- 将`VelocityUtils.java`替换`路径: /ruoyi-modules/ruoyi-generator/src/main/java/org/dromara/generator/util`(简单描述就是替换 utils 文件) **此文件只是新增了 vben 代码支持, 不影响原版生成** + +![image][reference_name] + +## 重启 + +重启后端 + +## 预览/下载 + +预览/下载 `vben5`文件夹即为前端生成的代码 + +[reference_name]: data:image/png;base64,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 diff --git a/scripts/代码生成模板antdv-next专用/VelocityUtils.java b/scripts/代码生成模板antdv-next专用/VelocityUtils.java new file mode 100644 index 00000000..c098f7c1 --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/VelocityUtils.java @@ -0,0 +1,414 @@ +package org.dromara.generator.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.mybatis.enums.DataBaseType; +import org.dromara.generator.constant.GenConstants; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.generator.domain.GenTable; +import org.dromara.generator.domain.GenTableColumn; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.velocity.VelocityContext; + +import java.util.*; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class VelocityUtils { + + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + // 判断是modal还是drawer + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); + if (ObjectUtil.isNotNull(paramsObj)) { + String popupComponent = Optional + .ofNullable(paramsObj.getStr("popupComponent")) + .orElse("modal"); + velocityContext.put("popupComponent", popupComponent); + velocityContext.put("PopupComponent", StringUtils.capitalize(popupComponent)); + } else { + velocityContext.put("popupComponent", "modal"); + velocityContext.put("PopupComponent", "Modal"); + } + // 判断是原生antd表单还是useForm表单 + // native 原生antd表单 + // useForm useVbenForm + if (ObjectUtil.isNotNull(paramsObj)) { + String formComponent = Optional + .ofNullable(paramsObj.getStr("formComponent")) + .orElse("useForm"); + velocityContext.put("formComponent", formComponent); + } else { + velocityContext.put("formComponent", "useForm"); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME)); + } + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList<>(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/vo.java.vm"); + templates.add("vm/java/bo.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + DataBaseType dataBaseType = DataBaseHelper.getDataBaseType(); + if (dataBaseType.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (dataBaseType.isPostgreSql()) { + templates.add("vm/sql/postgres/sql.vm"); + } else if (dataBaseType.isSqlServer()) { + templates.add("vm/sql/sqlserver/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } + templates.add("vm/ts/api.ts.vm"); + templates.add("vm/ts/types.ts.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } + + /** + * 添加vben5 + */ + templates.add("vm/vben5/api/index.ts.vm"); + templates.add("vm/vben5/api/model.d.ts.vm"); + templates.add("vm/vben5/views/data.ts.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vben5/views/index_vben.vue.vm"); + templates.add("vm/vben5/views/popup.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vben5/views/index_vben_tree.vue.vm"); + templates.add("vm/vben5/views/popup_tree.vue.vm"); + } + + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("vo.java.vm")) { + fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className); + } + if (template.contains("bo.java.vm")) { + fileName = StringUtils.format("{}/domain/bo/{}Bo.java", javaPath, className); + } + if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName); + } else if (template.contains("types.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + + // 判断是modal还是drawer + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); + String popupComponent = "modal"; + if (ObjectUtil.isNotNull(paramsObj)) { + popupComponent = Optional + .ofNullable(paramsObj.getStr("popupComponent")) + .orElse("modal"); + } + String vben5Path = "vben5"; + if (template.contains("vm/vben5/api/index.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/index.ts", vben5Path, moduleName, businessName); + } + if (template.contains("vm/vben5/api/model.d.ts.vm")) { + fileName = StringUtils.format("{}/api/{}/{}/model.d.ts", vben5Path, moduleName, businessName); + } + if (template.contains("vm/vben5/views/index_vben.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vben5Path, moduleName, businessName); + } + if (template.contains("vm/vben5/views/index_vben_tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vben5Path, moduleName, businessName); + } + if (template.contains("vm/vben5/views/data.ts.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/data.ts", vben5Path, moduleName, businessName); + } + if (template.contains("vm/vben5/views/popup.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/{}-{}.vue", vben5Path, moduleName, businessName, businessName, popupComponent); + } + if (template.contains("vm/vben5/views/popup_tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/{}-{}.vue", vben5Path, moduleName, businessName, businessName, popupComponent); + } + + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + HashSet importList = new HashSet<>(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } else if (!column.isSuperColumn() && "imageUpload".equals(column.getHtmlType())) { + importList.add("org.dromara.common.translation.annotation.Translation"); + importList.add("org.dromara.common.translation.constant.TransConstant"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet<>(); + addDicts(dicts, columns); + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(Map paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + Dict paramsObj = JsonUtils.parseMap(options); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/scripts/代码生成模板antdv-next专用/vben5/api/index.ts.vm b/scripts/代码生成模板antdv-next专用/vben5/api/index.ts.vm new file mode 100644 index 00000000..018c139a --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/vben5/api/index.ts.vm @@ -0,0 +1,69 @@ +import type { ${BusinessName}VO, ${BusinessName}Form, ${BusinessName}Query } from './model'; + +import type { ID, IDS } from '#/api/common'; +#if($tplCategory != 'tree') +import type { PageResult } from '#/api/common'; +#end + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +/** +* 查询${functionName}列表 +* @param params +* @returns ${functionName}列表 +*/ +export function ${businessName}List(params?: ${BusinessName}Query) { + #if($tplCategory != 'tree') + return requestClient.get>('/${moduleName}/${businessName}/list', { params }); + #else + return requestClient.get<${BusinessName}VO[]>(`/${moduleName}/${businessName}/list`, { params }); + #end +} + +#if($tplCategory != 'tree') +/** + * 导出${functionName}列表 + * @param params + * @returns ${functionName}列表 + */ +export function ${businessName}Export(params?: ${BusinessName}Query) { + return commonExport('/${moduleName}/${businessName}/export', params ?? {}); +} +#end + +/** + * 查询${functionName}详情 + * @param ${pkColumn.javaField} id + * @returns ${functionName}详情 + */ +export function ${businessName}Info(${pkColumn.javaField}: ID) { + return requestClient.get<${BusinessName}VO>(`/${moduleName}/${businessName}/${${pkColumn.javaField}}`); +} + +/** + * 新增${functionName} + * @param data + * @returns void + */ +export function ${businessName}Add(data: ${BusinessName}Form) { + return requestClient.postWithMsg('/${moduleName}/${businessName}', data); +} + +/** + * 更新${functionName} + * @param data + * @returns void + */ +export function ${businessName}Update(data: ${BusinessName}Form) { + return requestClient.putWithMsg('/${moduleName}/${businessName}', data); +} + +/** + * 删除${functionName} + * @param ${pkColumn.javaField} id + * @returns void + */ +export function ${businessName}Remove(${pkColumn.javaField}: ID | IDS) { + return requestClient.deleteWithMsg(`/${moduleName}/${businessName}/${${pkColumn.javaField}}`); +} diff --git a/scripts/代码生成模板antdv-next专用/vben5/api/model.d.ts.vm b/scripts/代码生成模板antdv-next专用/vben5/api/model.d.ts.vm new file mode 100644 index 00000000..862c2648 --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/vben5/api/model.d.ts.vm @@ -0,0 +1,56 @@ +import type { PageQuery, BaseEntity } from '#/api/common'; + +export interface ${BusinessName}VO { +#foreach ($column in $columns) +#if($column.list) + /** + * $column.columnComment + */ + $column.javaField:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +#if ($table.tree) + /** + * 子对象 + */ + children: ${BusinessName}VO[]; +#end +} + +export interface ${BusinessName}Form extends BaseEntity { +#foreach ($column in $columns) +#if($column.insert || $column.edit) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end +} + +export interface ${BusinessName}Query #if(!${treeCode})extends PageQuery #end{ +#foreach ($column in $columns) +#if($column.query) + /** + * $column.columnComment + */ + $column.javaField?:#if($column.javaField.indexOf("id") != -1 || $column.javaField.indexOf("Id") != -1) string | number; + #elseif($column.javaType == 'Long' || $column.javaType == 'Integer' || $column.javaType == 'Double' || $column.javaType == 'Float' || $column.javaType == 'BigDecimal') number; + #elseif($column.javaType == 'Boolean') boolean; + #else string; + #end +#end +#end + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/scripts/代码生成模板antdv-next专用/vben5/views/data.ts.vm b/scripts/代码生成模板antdv-next专用/vben5/views/data.ts.vm new file mode 100644 index 00000000..81a69ace --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/vben5/views/data.ts.vm @@ -0,0 +1,215 @@ +import type { FormSchemaGetter } from '#/adapter/form'; +import type { VxeGridProps } from '#/adapter/vxe-table'; + +#if(${dicts} != '') +import { getDictOptions } from '#/utils/dict'; +import { renderDict } from '#/utils/render'; +#end + +export const querySchema: FormSchemaGetter = () => [ + #foreach($column in $columns) + #if($column.query) + #if($column.dictType) + #set($dictType=$column.dictType) + #else + #set($dictType="") + #end + #set($parentheseIndex=$column.columnComment.indexOf("(")) + #if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) + #else + #set($comment=$column.columnComment) + #end + #if($column.htmlType == "input") + #set($component="Input") + #elseif($column.htmlType == "textarea") + #set($component="Textarea") + #elseif($column.htmlType == "select") + #set($component="Select") + #elseif($column.htmlType == "radio") + #set($component="RadioGroup") + #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") + #set($component="DatePicker") + #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") + #set($component="RangePicker") + #else + #set($component="Input") + #end + { + component: '${component}', + #if($component == "Select" || $component == "RadioGroup") + componentProps: { + #if($dictType != "") + // 可选从DictEnum中获取 DictEnum.${dictType.toUpperCase()} 便于维护 + options: getDictOptions('$dictType'), + #end + #if($component == "RadioGroup") + buttonStyle: 'solid', + optionType: 'button', + #end + }, + #elseif($component == "DatePicker" || $component == "RangePicker") + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + }, + #end + fieldName: '${column.javaField}', + label: '${comment}', + }, + #end + #end +]; + +// 需要使用i18n注意这里要改成getter形式 否则切换语言不会刷新 +// export const columns: () => VxeGridProps['columns'] = () => [ +export const columns: VxeGridProps['columns'] = [ + #if($tplCategory != 'tree') + { type: 'checkbox', width: 60 }, + #end + #foreach($column in $columns) + #if($column.list) + #if($column.dictType) + #set($dictType=$column.dictType) + #else + #set($dictType="") + #end + #set($parentheseIndex=$column.columnComment.indexOf("(")) + #if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) + #else + #set($comment=$column.columnComment) + #end + { + title: '${comment}', + field: '${column.javaField}', + #if( $foreach.count == 1 && $tplCategory == 'tree') + treeNode: true, + #end + #if($dictType != "") + slots: { + default: ({ row }) => { + // 可选从DictEnum中获取 DictEnum.${dictType.toUpperCase()} 便于维护 + return renderDict(row.${column.javaField}, '$dictType'); + }, + }, + #end + }, + #end + #end + { + field: 'action', + fixed: 'right', + slots: { default: 'action' }, + title: '操作', + width: 180, + }, +]; + +#if($formComponent == "useForm") +export const ${popupComponent}Schema: FormSchemaGetter = () => [ + #foreach($column in $columns) + #if($column.edit) + #if($column.dictType) + #set($dictType=$column.dictType) + #else + #set($dictType="") + #end + #set($parentheseIndex=$column.columnComment.indexOf("(")) + #if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) + #else + #set($comment=$column.columnComment) + #end + #if($column.htmlType == "input") + #set($component="Input") + #elseif($column.htmlType == "textarea") + #set($component="Textarea") + #elseif($column.htmlType == "select") + #set($component="Select") + #elseif($column.htmlType == "radio") + #set($component="RadioGroup") + #elseif($column.htmlType == "checkbox") + #set($component="Checkbox") + #elseif($column.htmlType == "imageUpload") + #set($component="ImageUpload") + #elseif($column.htmlType == "fileUpload") + #set($component="FileUpload") + #elseif($column.htmlType == "editor") + #set($component="RichTextarea") + #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") + #set($component="DatePicker") + #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") + #set($component="RangePicker") + #else + #set($component="Input") + #end + #if($column.required && $column.pk == false) + #set($required='true') + #else + #set($required='false') + #end + { + label: '${comment}', + fieldName: '${column.javaField}', + #if("" != $treeParentCode && $column.javaField == $treeParentCode) + component: 'TreeSelect', + #else + component: '${component}', + #end + #if($component == "DatePicker" || $component == "RangePicker") + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + }, + #elseif($component == "ImageUpload") + componentProps: { + // accept: 'image/*', // 可选拓展名或者mime类型 ,拼接 + // maxCount: 1, // 最大上传文件数 默认为1 为1会绑定为string而非string[]类型 + }, + #elseif($component == "FileUpload") + /** + * 注意这里获取为数组 需要自行定义回显/提交 + * 文件上传还在demo阶段 可能有重大改动! + */ + componentProps: { + // accept: 'application/pdf', // 可选拓展名或者mime类型 ,拼接 + // maxCount: 1, // 最大上传文件数 默认为1 为1会绑定为string而非string[]类型 + }, + #elseif($component == "RichTextarea") + componentProps: { + // disabled: false, // 是否只读 + // height: 400 // 高度 默认400 + }, + #elseif($component == "Select" || $component == "RadioGroup" || $component == "Checkbox") + componentProps: { + #if($dictType != "") + // 可选从DictEnum中获取 DictEnum.${dictType.toUpperCase()} 便于维护 + options: getDictOptions('$dictType'), + #end + #if($component == "RadioGroup") + buttonStyle: 'solid', + optionType: 'button', + #end + }, + #end + #if(${column.pk}) + dependencies: { + show: () => false, + triggerFields: [''], + }, + #end + #if($required == 'true' && $column.pk == false) + #if($component == "Select" || $component == "RadioGroup" || $component == "Checkbox") + rules: 'selectRequired', + #else + rules: 'required', + #end + #end + }, + #end + #end +]; +#end diff --git a/scripts/代码生成模板antdv-next专用/vben5/views/index_vben.vue.vm b/scripts/代码生成模板antdv-next专用/vben5/views/index_vben.vue.vm new file mode 100644 index 00000000..786fccfe --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/vben5/views/index_vben.vue.vm @@ -0,0 +1,173 @@ + + + diff --git a/scripts/代码生成模板antdv-next专用/vben5/views/index_vben_tree.vue.vm b/scripts/代码生成模板antdv-next专用/vben5/views/index_vben_tree.vue.vm new file mode 100644 index 00000000..7b36577b --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/vben5/views/index_vben_tree.vue.vm @@ -0,0 +1,147 @@ + + + diff --git a/scripts/代码生成模板antdv-next专用/vben5/views/popup.vue.vm b/scripts/代码生成模板antdv-next专用/vben5/views/popup.vue.vm new file mode 100644 index 00000000..1af14e38 --- /dev/null +++ b/scripts/代码生成模板antdv-next专用/vben5/views/popup.vue.vm @@ -0,0 +1,376 @@ +#if($formComponent == "useForm") + + + +#else + + + +