@@ -34,8 +41,20 @@
-
+
+
+
+
+
+
+
+ {{ getAreaTextByCode(text) }}
+
+
+ 无文件
+ 下载
+
<${entityName}Modal @register="registerModal" @success="handleSuccess"/>
@@ -49,9 +68,12 @@
import {useModal} from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'
import ${entityName}Modal from './components/${entityName}Modal.vue';
- import {columns} from './${entityName}.data';
+ import {columns,searchFormSchema} from './${entityName}.data';
+ import { downloadFile } from '/@/utils/common/renderUtils';
import {list, delete${entityName}, batchDelete${entityName}, getExportUrl,getImportUrl, getChildList,getChildListBatch} from './${entityName}.api';
-
+ <#if list_need_pca>
+ import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';
+ #if>
const expandedRowKeys = ref([]);
//字典model
const [registerModal, {openModal}] = useModal();
@@ -62,6 +84,36 @@
title: '${tableVo.ftlDescription}',
columns,
canResize:false,
+ formConfig: {
+ labelWidth: 120,
+ schemas: searchFormSchema,
+ autoSubmitOnEnter:true,
+ showAdvancedButton:true,
+ fieldMapToNumber: [
+ <#list columns as po>
+ <#if po.isQuery=='Y'>
+ <#if po.queryMode!='single'>
+ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],
+ #if>
+ #if>
+ #if>
+ #list>
+ ],
+ fieldMapToTime: [
+ <#list columns as po>
+ <#if po.isQuery=='Y'>
+ <#if po.queryMode!='single'>
+ <#if po.classType=='date'>
+ ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],
+ <#elseif po.classType=='datetime'>
+ ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],
+ #if>
+ #if>
+ #if>
+ #list>
+ ],
+ },
actionColumn: {
width: 240,
},
@@ -120,13 +172,13 @@
*/
async function batchHandleDelete() {
const ids = selectedRowKeys.value.filter(item => !item.includes('loading'))
- await batchDelete${entityName}({ids: ids}, importSuccess);
+ await batchDelete${entityName}({id: ids}, importSuccess);
}
/**
* 导入
*/
function importSuccess() {
- reload() && (expandedRowKeys.value = []);
+ (selectedRowKeys.value = []) && reload();
}
/**
* 添加下级
@@ -140,12 +192,16 @@
/**
* 成功回调
*/
- async function handleSuccess({isUpdate, values, expandedArr}) {
+ async function handleSuccess({isUpdate, values, expandedArr, changeParent}) {
if (isUpdate) {
- //编辑回调
- updateTableDataRecord(values.id, values);
+ if (changeParent) {
+ reload();
+ } else {
+ // 编辑回调
+ updateTableDataRecord(values.id, values);
+ }
} else {
- if(!values['${pidFieldName}']){
+ if(!values['id'] || !values['${pidFieldName}']){
//新增根节点
reload();
}else{
@@ -263,19 +319,29 @@
label: '编辑',
onClick: handleEdit.bind(null, record),
},
- {
- label: '删除',
- popConfirm: {
- title: '确定删除吗?',
- confirm: handleDelete.bind(null, record),
- },
- },
{
label: '添加下级',
onClick: handleAddSub.bind(null, {${pidFieldName}: record.id}),
}
]
}
+ /**
+ * 下拉操作栏
+ */
+ function getDropDownAction(record){
+ return [
+ {
+ label: '详情',
+ onClick: handleDetail.bind(null, record),
+ }, {
+ label: '删除',
+ popConfirm: {
+ title: '确定删除吗?',
+ confirm: handleDelete.bind(null, record),
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei
new file mode 100644
index 00000000..39a9f3cf
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei
@@ -0,0 +1,497 @@
+
+
+<#assign pidFieldName = "">
+<#assign hasChildrenField = "">
+<#list originalColumns as po>
+ <#if po.fieldDbName == tableVo.extendParams.pidField>
+ <#assign pidFieldName = po.fieldName>
+ #if>
+ <#if po.fieldDbName == tableVo.extendParams.hasChildren>
+ <#assign hasChildrenField = po.fieldName>
+ #if>
+#list>
+<#assign query_field_no=0>
+<#assign need_category = false>
+<#assign need_pca = false>
+<#assign need_search = false>
+<#assign need_dept_user = false>
+<#assign need_switch = false>
+<#assign need_dept = false>
+<#assign need_multi = false>
+<#assign need_popup = false>
+<#assign need_select_tag = false>
+<#assign need_select_tree = false>
+<#assign need_time = false>
+<#assign bpm_flag=false>
+<#assign need_markdown = false>
+<#assign need_upload = false>
+<#assign need_image_upload = false>
+<#assign need_editor = false>
+<#assign need_checkbox = false>
+<#assign query_flag = false>
+
+
+<#-- 结束循环 -->
+
+
+
+
+ 新增
+
+
+
+
+
+ 删除
+
+
+
+ 批量操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getAreaTextByCode(text) }}
+
+
+ 无文件
+ 下载
+
+
+
+ <${entityName}Modal ref="registerModal" @success="handleSuccess">${entityName}Modal>
+
+
+
+
+
+
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi
new file mode 100644
index 00000000..0ff2ed7d
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi
@@ -0,0 +1,90 @@
+import { defHttp } from "/@/utils/http/axios";
+import { Modal } from 'ant-design-vue';
+
+enum Api {
+ list = '/${entityPackage}/${entityName?uncap_first}/rootList',
+ save='/${entityPackage}/${entityName?uncap_first}/add',
+ edit='/${entityPackage}/${entityName?uncap_first}/edit',
+ delete${entityName} = '/${entityPackage}/${entityName?uncap_first}/delete',
+ importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',
+ exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',
+ loadTreeData = '/${entityPackage}/${entityName?uncap_first}/loadTreeRoot',
+ getChildList = '/${entityPackage}/${entityName?uncap_first}/childList',
+ getChildListBatch = '/${entityPackage}/${entityName?uncap_first}/getChildListBatch',
+}
+
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ * @param params
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) => defHttp.get({ url: Api.list, params });
+
+/**
+ * 删除
+ * @param params
+ * @param handleSuccess
+ */
+export const delete${entityName} = (params,handleSuccess) => {
+ return defHttp.delete({ url: Api.delete${entityName}, params }, { joinParamsToUrl: true }).then(() => {
+ handleSuccess();
+ });
+}
+
+/**
+ * 批量删除
+ * @param params
+ * @param handleSuccess
+ */
+export const batchDelete${entityName} = (params, handleSuccess) => {
+ Modal.confirm({
+ title: '确认删除',
+ content: '是否删除选中数据',
+ okText: '确认',
+ cancelText: '取消',
+ onOk: () => {
+ return defHttp.delete({ url: Api.delete${entityName}, data: params }, { joinParamsToUrl: true }).then(() => {
+ handleSuccess();
+ });
+ }
+ });
+}
+
+/**
+ * 保存或者更新
+ * @param params
+ * @param isUpdate
+ */
+export const saveOrUpdateDict = (params, isUpdate) => {
+ let url = isUpdate ? Api.edit : Api.save;
+ return defHttp.post({ url: url, params },{ isTransformResponse:false });
+}
+
+/**
+ * 查询全部树形节点数据
+ * @param params
+ */
+export const loadTreeData = (params) => defHttp.get({ url: Api.loadTreeData,params });
+
+/**
+ * 查询子节点数据
+ * @param params
+ */
+export const getChildList = (params) => defHttp.get({ url: Api.getChildList, params });
+
+/**
+ * 批量查询子节点数据
+ * @param params
+ */
+export const getChildListBatch = (params) => defHttp.get({ url: Api.getChildListBatch, params },{ isTransformResponse:false });
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi
new file mode 100644
index 00000000..8a3ecb8d
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi
@@ -0,0 +1,399 @@
+<#include "/common/utils.ftl">
+import {BasicColumn} from '/@/components/Table';
+import {FormSchema} from '/@/components/Table';
+import { rules} from '/@/utils/helper/validator';
+import { render } from '/@/utils/common/renderUtils';
+//列表数据
+export const columns: BasicColumn[] = [
+ <#list columns as po>
+ <#if po.isShowList =='Y' && po.fieldName !='id'>
+ {
+ title: '${po.filedComment}',
+ <#if po.fieldDbName == tableVo.extendParams.textField>
+ align: 'left',
+ <#else>
+ align: 'center',
+ #if>
+ <#if po.sort=='Y'>
+ sorter: true,
+ #if>
+ <#if po.classType=='date'>
+ dataIndex: '${po.fieldName}',
+ customRender:({text}) =>{
+ return !text?"":(text.length>10?text.substr(0,10):text);
+ },
+ <#elseif po.fieldDbType=='Blob'>
+ dataIndex: '${po.fieldName}String'
+ <#elseif po.classType=='umeditor'>
+ dataIndex: '${po.fieldName}',
+ slots: { customRender: 'htmlSlot' },
+ <#elseif po.classType=='pca'>
+ dataIndex: '${po.fieldName}',
+ slots: { customRender: 'pcaSlot' },
+ <#elseif po.classType=='file'>
+ dataIndex: '${po.fieldName}',
+ slots: { customRender: 'fileSlot' },
+ <#elseif po.classType=='image'>
+ dataIndex: '${po.fieldName}',
+ customRender: render.renderImage,
+ <#elseif po.classType=='switch'>
+ dataIndex: '${po.fieldName}',
+<#assign switch_extend_arr=['Y','N']>
+<#if po.dictField?default("")?contains("[")>
+<#assign switch_extend_arr=po.dictField?eval>
+#if>
+<#list switch_extend_arr as a>
+<#if a_index == 0>
+<#assign switch_extend_arr1=a>
+<#else>
+<#assign switch_extend_arr2=a>
+#if>
+#list>
+ customRender:({text}) => {
+ return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]);
+ },
+ <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>
+ dataIndex: '${po.fieldName}_dictText'
+ <#elseif po.classType=='cat_tree'>
+ dataIndex: '${po.fieldName}',
+ <#if po.dictText?default("")?trim?length == 0>
+ customRender:({text}) => {
+ return render.renderCategoryTree(text,'${po.dictField?default("")}');
+ },
+ <#else>
+ customRender: ({text, record}) => (text ? record['${po.dictText}'] : '');
+ #if>
+ <#else>
+ dataIndex: '${po.fieldName}'
+ #if>
+ },
+ #if>
+ #list>
+];
+
+//查询数据
+export const searchFormSchema: FormSchema[] = [
+<#-- 开始循环 -->
+<#list columns as po>
+<#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+#if>
+<#if po.isQuery=='Y'>
+<#assign query_flag=true>
+ <#assign query_field_dictCode="">
+ <#if po.dictTable?default("")?trim?length gt 1>
+ <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ <#assign query_field_dictCode="${po.dictField}">
+ #if>
+<#if po.queryMode=='single'>
+ {
+ label: "${po.filedComment}",
+ field: "${po.fieldName}",
+<#if po.classType=='sel_search'>
+ component: 'JSearchSelect',
+ componentProps: {
+ dict:"${po.dictTable},${po.dictText},${po.dictField}"
+ },
+<#elseif po.classType=='sel_user'>
+ component: 'JSelectUserByDept',
+<#elseif po.classType=='switch'>
+ component: 'JSwitch',
+ componentProps: {
+ <#if po.dictField != 'is_open'>
+ options: '${po.dictField}',
+ #if>
+ },
+ <#elseif po.classType=='sel_depart'>
+ component: 'JSelectDept',
+ <#elseif po.classType=='list_multi'>
+ component: 'JSelectMultiple',
+ componentProps: {
+ <#if po.dictTable?default("")?trim?length gt 1>
+ options: "${po.dictField}",
+ dictCode: "${po.dictTable},${po.dictText},${po.dictField}",
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode: "${po.dictField}",
+ #if>
+ triggerChange: true
+ },
+ <#elseif po.classType=='cat_tree'>
+ component: 'JCategorySelect',
+ componentProps:{
+ pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题
+ },
+<#elseif po.classType=='date'>
+ component: 'DatePicker',
+<#elseif po.classType=='datetime'>
+ component: 'DatePicker',
+ componentProps: {
+ showTime: true
+ },
+<#elseif po.classType=='pca'>
+ component: 'JAreaLinkage',
+<#elseif po.classType=='popup'>
+ <#include "/common/form/vue3popup.ftl">
+<#elseif po.classType == 'sel_tree'>
+ component: 'JTreeSelect',
+ componentProps: {
+ <#if po.dictText??>
+ <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>
+ dict: "${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",
+ #if>
+ <#if po.dictText?split(',')[1]??>
+ pidField: "${po.dictText?split(',')[1]}",
+ #if>
+ <#if po.dictText?split(',')[3]??>
+ hasChildField: "${po.dictText?split(',')[3]}",
+ #if>
+ #if>
+ pidValue: "${po.dictField}",
+ },
+<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>
+<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->
+ component: 'JDictSelectTag',
+ componentProps:{
+ <#if po.dictTable?default("")?trim?length gt 1>
+ dictCode: "${po.dictTable},${po.dictText},${po.dictField}"
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode: "${po.dictField}"
+ #if>
+ },
+<#else>
+ component: 'Input',
+#if>
+ colProps: {span: 6},
+ },
+<#else>
+ {
+ label: "${po.filedComment}",
+ field: "${po.fieldName}",
+<#if po.classType=='date'>
+ component: 'RangePicker',
+<#elseif po.classType=='datetime'>
+ component: 'RangePicker',
+ componentProps: {
+ showTime: true
+ },
+<#elseif po.classType == 'time'>
+ component: 'TimePicker',
+ componentProps:{
+ valueFormat: 'HH:mm:ss',
+ },
+<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'JRangeNumber',
+<#else>
+ component: 'Input', //TODO 范围查询
+#if>
+ colProps: {span: 6},
+ },
+#if>
+#if>
+#list>
+<#-- 结束循环 -->
+];
+
+//表单数据
+export const formSchema: FormSchema[] = [
+<#assign form_cat_tree = false>
+<#assign form_cat_back = "">
+<#assign bpm_flag=false>
+<#assign id_exists = false>
+<#list columns as po><#rt/>
+<#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+#if>
+<#if po.fieldDbName == 'id'>
+ <#assign id_exists = true>
+#if>
+<#if po.isShow =='Y'>
+<#assign form_field_dictCode="">
+ <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>
+ <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ <#assign form_field_dictCode="${po.dictField}">
+ #if>
+ {
+ label: '${po.filedComment}',
+ field: ${autoStringSuffix(po)},
+ <#if po.fieldDbName == tableVo.extendParams.pidField>
+ component: 'JTreeSelect',
+ componentProps: {
+ dict: "${tableVo.tableName},${tableVo.extendParams.textField},id",
+ pidField: "${tableVo.extendParams.pidField}",
+ pidValue: "0",
+ hasChildField: "${tableVo.extendParams.hasChildren}",
+ },
+ <#elseif po.classType =='date'>
+ component: 'DatePicker',
+ <#elseif po.classType =='datetime'>
+ component: 'DatePicker',
+ componentProps: {
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD hh:mm:ss'
+ },
+ <#elseif po.classType =='time'>
+ component: 'TimePicker',
+ componentProps:{
+ valueFormat: 'HH:mm:ss',
+ },
+ <#elseif po.classType =='popup'>
+ <#include "/common/form/vue3popup.ftl">
+ <#elseif po.classType =='sel_depart'>
+ component: 'JSelectDept',
+ <#elseif po.classType =='switch'>
+ component: 'JSwitch',
+ componentProps:{
+ <#if po.dictField != 'is_open'>
+ options:${po.dictField}
+ #if>
+ },
+ <#elseif po.classType =='pca'>
+ component: 'JAreaLinkage',
+ <#elseif po.classType =='markdown'>
+ component: 'JMarkdownEditor',//注意string转换问题
+ <#elseif po.classType =='password'>
+ component: 'InputPassword',
+ <#elseif po.classType =='sel_user'>
+ component: 'JSelectUserByDept',
+ componentProps:{
+ labelKey: 'realname',
+ },
+ <#elseif po.classType =='textarea'>
+ component: 'InputTextArea',
+ <#elseif po.classType=='list' || po.classType=='radio'>
+ component: 'JDictSelectTag',
+ componentProps:{
+ dictCode: "${form_field_dictCode}"
+ },
+ <#elseif po.classType=='list_multi' || po.classType=='checkbox'>
+ component: 'JSelectMultiple',
+ componentProps:{
+ dictCode: "${form_field_dictCode}"
+ },
+ <#elseif po.classType=='sel_search'>
+ component: 'JSearchSelect',
+ componentProps:{
+ dict: "${form_field_dictCode}"
+ },
+<#elseif po.classType=='cat_tree'>
+ <#assign form_cat_tree = true>
+ component: 'JCategorySelect',
+ componentProps:{
+ pcode: "${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题
+ },
+ <#if po.dictText?default("")?trim?length gt 1>
+ <#assign form_cat_back = "${po.dictText}">
+ #if>
+ <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'InputNumber',
+ <#elseif po.classType=='file'>
+ component: 'JUpload',
+ componentProps:{
+ <#if po.uploadnum??>
+ maxCount: ${po.uploadnum}
+ #if>
+ },
+ <#elseif po.classType=='image'>
+ component: 'JImageUpload',
+ componentProps:{
+ <#if po.uploadnum??>
+ fileMax: ${po.uploadnum}
+ #if>
+ },
+ <#elseif po.classType=='umeditor'>
+ component: 'JEditor',
+ <#elseif po.classType == 'sel_tree'>
+ component: 'JTreeSelect',
+ componentProps:{
+ <#if po.dictText??>
+ <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>
+ dict: "${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",
+ #if>
+ <#if po.dictText?split(',')[1]??>
+ pidField: "${po.dictText?split(',')[1]}",
+ #if>
+ <#if po.dictText?split(',')[3]??>
+ hasChildField: "${po.dictText?split(',')[3]}",
+ #if>
+ #if>
+ pidValue: "${po.dictField}",
+ },
+ <#else>
+ component: 'Input',
+ #if>
+ <#include "/common/utils.ftl">
+ <#if po.isShow == 'Y' && poHasCheck(po)>
+ dynamicRules: ({ model, schema }) => {
+ <#if po.fieldName != 'id'>
+ <#assign fieldValidType = po.fieldValidType!''>
+ return [
+ <#-- 非空校验 -->
+ <#if po.nullable == 'N' || fieldValidType == '*'>
+ { required: true, message: '请输入${po.filedComment}!' },
+ <#elseif fieldValidType!=''>
+ { required: false },
+ #if>
+ <#-- 唯一校验 -->
+ <#if fieldValidType == 'only'>
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
+ <#-- 6到16位数字 -->
+ <#elseif fieldValidType == 'n6-16'>
+ { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!' },
+ <#-- 6到16位任意字符 -->
+ <#elseif fieldValidType == '*6-16'>
+ { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!' },
+ <#-- 6到18位字母 -->
+ <#elseif fieldValidType == 's6-18'>
+ { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!' },
+ <#-- 网址 -->
+ <#elseif fieldValidType == 'url'>
+ { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!' },
+ <#-- 电子邮件 -->
+ <#elseif fieldValidType == 'e'>
+ { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件! },
+ <#-- 手机号码 -->
+ <#elseif fieldValidType == 'm'>
+ { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!' },
+ <#-- 邮政编码 -->
+ <#elseif fieldValidType == 'p'>
+ { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!' },
+ <#-- 字母 -->
+ <#elseif fieldValidType == 's'>
+ { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!' },
+ <#-- 数字 -->
+ <#elseif fieldValidType == 'n'>
+ { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!' },
+ <#-- 整数 -->
+ <#elseif fieldValidType == 'z'>
+ { pattern: /^-?\d+$/, message: '请输入整数!' },
+ <#-- 金额 -->
+ <#elseif fieldValidType == 'money'>
+ { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!' },
+ <#-- 正则校验 -->
+ <#elseif fieldValidType != '' && fieldValidType != '*'>
+ { pattern: '${fieldValidType}', message: '不符合校验规则!' },
+ <#-- 无校验 -->
+ <#else>
+ <#t>
+ #if>
+ ];
+ #if>
+ },
+ #if>
+ <#if po.readonly=='Y'>
+ dynamicDisabled: true
+ #if>
+ },
+#if>
+#list>
+<#if id_exists == false>
+ // TODO 主键隐藏字段,目前写死为ID
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false,
+ },
+#if>
+];
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei
new file mode 100644
index 00000000..a5b550fd
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei
@@ -0,0 +1,235 @@
+<#include "/common/utils.ftl">
+
+
+
+
+<#assign need_category = false>
+<#assign bpm_flag=false>
+<#assign need_pca = false>
+<#assign need_search = false>
+<#assign need_dept_user = false>
+<#assign need_switch = false>
+<#assign need_dept = false>
+<#assign need_multi = false>
+<#assign need_popup = false>
+<#assign need_select_tag = false>
+<#assign need_select_tree = false>
+<#assign need_time = false>
+<#assign need_markdown = false>
+<#assign need_upload = false>
+<#assign need_image_upload = false>
+<#assign need_editor = false>
+<#assign need_checkbox = false>
+<#assign pidFieldName = "">
+<#assign hasOnlyValidate = false>
+<#assign form_span = 24>
+<#if tableVo.fieldRowNum==2>
+<#assign form_span = 12>
+<#elseif tableVo.fieldRowNum==3>
+<#assign form_span = 8>
+<#elseif tableVo.fieldRowNum==4>
+<#assign form_span = 6>
+#if>
+<#list columns as po>
+<#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+#if>
+<#if po.isShow == 'Y' && po.fieldValidType?default("") == 'only'>
+ <#assign hasOnlyValidate = true>
+#if>
+ <#if po.fieldDbName == tableVo.extendParams.pidField>
+ <#assign pidFieldName = po.fieldName>
+
+
+ disabled<#else>:disabled="disabled"#if>>
+
+
+
+ #if>
+ <#include "/common/form/native/vue3NativeForm.ftl">
+#list>
+
+
+
+
+
+
+
+
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei
new file mode 100644
index 00000000..70dfb5d6
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei
@@ -0,0 +1,81 @@
+
+
+ <${entityName}Form ref="registerForm" @ok="submitCallback" :disabled="disableSubmit">${entityName}Form>
+
+
+
+
+
+
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
index 7bf649a8..9196325d 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
package ${bussiPackage}.${entityPackage}.entity;
import java.io.Serializable;
@@ -31,9 +32,9 @@ public class ${entityName} implements Serializable {
<#-- 生成字典Code -->
<#assign list_field_dictCode="">
<#if po.classType='sel_user'>
- <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'>
+ <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'>
<#elseif po.classType='sel_depart'>
- <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'>
+ <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'>
<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>
<#if po.dictTable?default("")?trim?length gt 1>
<#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
index d549c98f..03fe3eb2 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
<#list subTables as subTab>
#segment#${subTab.entityName}.java
package ${bussiPackage}.${entityPackage}.entity;
@@ -65,7 +66,8 @@ public class ${subTab.entityName} implements Serializable {
@Dict(dicCode = "id",dicText = "name",dictTable = "sys_category")
#if>
<#if po.classType =='sel_depart'>
- @Dict(dicCode = "id",dicText = "depart_name",dictTable = "sys_depart")
+ <#assign list_field_dictCode='dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dictTable = "sys_depart"'>
+ @Dict(${list_field_dictCode})
#if>
<#-- 大字段转换 -->
<#include "/common/blob.ftl">
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei
index 1cf248a6..494ff9f2 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei
@@ -193,7 +193,7 @@
<#assign sub_seq=1>
<#list subTables as sub>
forceRender#if>>
- <${sub.entityName}List :mainId="selectedMainId" />
+ <${sub.entityName}List :mainId="${sub.entityName?uncap_first}MainId" />
<#assign sub_seq=sub_seq+1>
#list>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei
index 120bdd0e..1df98593 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei
@@ -44,7 +44,7 @@
@input="popupCallback"
<#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='sel_depart'>
-
disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if> <#if po.readonly=='Y'>disabled#if>>
<#elseif po.classType =='pca'>
@@ -54,7 +54,7 @@
<#elseif po.classType =='password'>
disabled#if>/>
<#elseif po.classType =='sel_user'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
disabled#if>/>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei
index 1af2447b..37a1a118 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei
@@ -46,7 +46,7 @@
@input="popupCallback"
<#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='sel_depart'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if> <#if po.readonly=='Y'>disabled#if>>
<#elseif po.classType =='pca'>
@@ -56,7 +56,7 @@
<#elseif po.classType =='password'>
disabled#if>/>
<#elseif po.classType =='sel_user'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
disabled#if>/>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
index 9aa4df25..45f4359a 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
@@ -46,6 +46,10 @@
+
+
+ {{ getAreaTextByCode(text) }}
+
无文件
下载
@@ -77,6 +81,10 @@
#list>
import {columns, searchFormSchema} from './${entityName}.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';
+ import {downloadFile} from '/@/utils/common/renderUtils';
+ <#if list_need_pca>
+ import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';
+ #if>
<#if list_need_category>
import { loadCategoryData } from '/@/api/common/api'
import { getAuthCache, setAuthCache } from '/@/utils/auth';
@@ -94,6 +102,17 @@
rowSelection: {type: 'radio'},
formConfig: {
schemas: searchFormSchema,
+ fieldMapToNumber: [
+ <#list columns as po>
+ <#if po.isQuery=='Y'>
+ <#if po.queryMode!='single'>
+ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],
+ #if>
+ #if>
+ #if>
+ #list>
+ ],
fieldMapToTime: [
<#list columns as po>
<#if po.isQuery=='Y'>
@@ -108,14 +127,15 @@
#list>
],
},
- actionColumn: {
+ actionColumn: {
width: 120,
- },
- pagination:{
- current: 1,
- pageSize: 5,
- pageSizeOptions: ['5', '10', '20'],
- }
+ fixed:'right'
+ },
+ pagination:{
+ current: 1,
+ pageSize: 5,
+ pageSizeOptions: ['5', '10', '20'],
+ }
},
exportConfig: {
name:"${tableVo.ftlDescription}",
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
index 19bf9d35..47f36da0 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
@@ -24,7 +25,7 @@ export const columns: BasicColumn[] = [
slots: { customRender: 'htmlSlot' },
<#elseif po.classType=='pca'>
dataIndex: '${po.fieldName}',
- slots: { customRender: 'pcaSlot' },//TODO 未翻译
+ slots: { customRender: 'pcaSlot' },
<#elseif po.classType=='file'>
dataIndex: '${po.fieldName}',
slots: { customRender: 'fileSlot' },
@@ -91,17 +92,23 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='switch'>
component: 'JSwitch',
componentProps:{
+ query:true,
<#if po.dictField != 'is_open'>
- options:"${po.dictField}"
+ options:${po.dictField}
#if>
},
<#elseif po.classType=='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType=='list_multi'>
- component: 'JMultiSelectTag',//暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
- dictCode:"query_field_dictCode?default("")"
- },
+ <#if po.dictTable?default("")?trim?length gt 1>
+ dictCode:"${po.dictTable},${po.dictText},${po.dictField}",
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode:"${po.dictField}",
+ #if>
+ triggerChange: true
+ },
<#elseif po.classType=='cat_tree'>
component: 'JCategorySelect',
componentProps:{
@@ -117,16 +124,7 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='pca'>
component: 'JAreaLinkage',
<#elseif po.classType=='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:"${po.dictField}",
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>
<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->
component: 'JDictSelectTag',
@@ -153,6 +151,8 @@ export const searchFormSchema: FormSchema[] = [
componentProps: {
showTime:true
},
+<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'JRangeNumber',
<#else>
component: 'Input', //TODO 范围查询
#if>
@@ -186,27 +186,22 @@ export const formSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
@@ -235,7 +230,7 @@ export const formSchema: FormSchema[] = [
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
},
@@ -270,7 +265,7 @@ export const formSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -302,16 +297,16 @@ export const formSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
@@ -387,7 +382,7 @@ export const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [
slots: { customRender: 'htmlSlot' },
<#elseif po.classType=='pca'>
dataIndex: '${po.fieldName}',
- slots: { customRender: 'pcaSlot' },//TODO 未翻译
+ slots: { customRender: 'pcaSlot' },
<#elseif po.classType=='file'>
dataIndex: '${po.fieldName}',
slots: { customRender: 'fileSlot' },
@@ -419,7 +414,7 @@ export const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [
return render.renderCategoryTree(text,'${po.dictField?default("")}')
},
<#else>
- customRender: (text, record) => (text ? record['${po.dictText}'] : '')
+ customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')
#if>
<#else>
dataIndex: '${po.fieldName}'
@@ -452,27 +447,22 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
@@ -494,14 +484,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
labelKey:'realname',
},
<#elseif po.classType =='textarea'>
- component: 'InputTextArea',//TODO 注意string转换问题
+ component: 'InputTextArea',
<#elseif po.classType=='list' || po.classType=='radio'>
component: 'JDictSelectTag',
componentProps:{
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
},
@@ -536,7 +526,7 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -568,16 +558,16 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei
index ceb367b0..a7b39a70 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei
@@ -51,6 +51,7 @@
import {${sub.entityName?uncap_first}List, ${sub.entityName?uncap_first}Delete, ${sub.entityName?uncap_first}DeleteBatch, ${sub.entityName?uncap_first}ExportXlsUrl, ${sub.entityName?uncap_first}ImportUrl } from './${entityName}.api';
import {isEmpty} from "/@/utils/is";
import {useMessage} from '/@/hooks/web/useMessage';
+ import {downloadFile} from '/@/utils/common/renderUtils';
//接收主表id
const mainId = inject('mainId') || '';
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
index fd54ae49..9d11f259 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
@@ -1,5 +1,6 @@
+<#include "/common/utils.ftl">
-
+
@@ -18,6 +19,7 @@
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
//表单赋值
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
@@ -54,5 +56,12 @@
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei
index a328e79b..d2ea771a 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei
@@ -2,7 +2,7 @@
<#list subTables as sub>
#segment#${sub.entityName}Modal.vue
-
+
@@ -24,6 +24,7 @@
labelWidth: 150,
schemas: ${sub.entityName?uncap_first}FormSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
//表单赋值
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
@@ -63,4 +64,14 @@
}
}
+
#list>
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
index 36fb9fcb..579ab5f6 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
@@ -200,17 +200,14 @@ public class ${entityName}Controller {
QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
- //Step.2 获取导出数据
- List<${entityName}> queryList = ${entityName?uncap_first}Service.list(queryWrapper);
- // 过滤选中数据
+ //配置选中数据查询条件
String selections = request.getParameter("selections");
- List<${entityName}> ${entityName?uncap_first}List = new ArrayList<${entityName}>();
- if(oConvertUtils.isEmpty(selections)) {
- ${entityName?uncap_first}List = queryList;
- }else {
- List selectionList = Arrays.asList(selections.split(","));
- ${entityName?uncap_first}List = queryList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
+ if(oConvertUtils.isNotEmpty(selections)) {
+ List selectionList = Arrays.asList(selections.split(","));
+ queryWrapper.in("id",selectionList);
}
+ //Step.2 获取导出数据
+ List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);
// Step.3 组装pageList
List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
index ed071adc..ee8d8cc9 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
package ${bussiPackage}.${entityPackage}.entity;
import java.io.Serializable;
@@ -31,9 +32,9 @@ public class ${entityName} implements Serializable {
<#-- 生成字典Code -->
<#assign list_field_dictCode="">
<#if po.classType='sel_user'>
- <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'>
+ <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'>
<#elseif po.classType='sel_depart'>
- <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'>
+ <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'>
<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>
<#if po.dictTable?default("")?trim?length gt 1>
<#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
index 30ba2dd4..bca19fdc 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
<#list subTables as subTab>
#segment#${subTab.entityName}.java
package ${bussiPackage}.${entityPackage}.entity;
@@ -33,9 +34,9 @@ public class ${subTab.entityName} implements Serializable {
<#-- 生成字典Code -->
<#assign list_field_dictCode="">
<#if po.classType='sel_user'>
- <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'>
+ <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'>
<#elseif po.classType='sel_depart'>
- <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'>
+ <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'>
<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>
<#if po.dictTable?default("")?trim?length gt 1>
<#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
index ad814c06..74784e96 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
@@ -41,7 +41,7 @@
@input="popupCallback"
<#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='sel_depart'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if> <#if po.readonly=='Y'>disabled#if>>
<#elseif po.classType =='pca'>
@@ -51,7 +51,7 @@
<#elseif po.classType =='password'>
disabled#if>/>
<#elseif po.classType =='sel_user'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
disabled#if>/>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
index 4252c92b..96d95595 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
@@ -36,9 +36,9 @@
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if>>
<#elseif po.classType =='sel_depart'>
-
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='sel_user'>
-
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
index 23fe7130..a62d4fbe 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
@@ -60,6 +60,10 @@
+
+
+ {{ getAreaTextByCode(text) }}
+
无文件
下载
@@ -81,6 +85,10 @@
#list>
import {columns, searchFormSchema} from './${entityName}.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';
+ import {downloadFile} from '/@/utils/common/renderUtils';
+ <#if list_need_pca>
+ import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';
+ #if>
<#if list_need_category>
import { loadCategoryData } from '/@/api/common/api'
import { getAuthCache, setAuthCache } from '/@/utils/auth';
@@ -102,6 +110,17 @@
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
+ fieldMapToNumber: [
+ <#list columns as po>
+ <#if po.isQuery=='Y'>
+ <#if po.queryMode!='single'>
+ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],
+ #if>
+ #if>
+ #if>
+ #list>
+ ],
fieldMapToTime: [
<#list columns as po>
<#if po.isQuery=='Y'>
@@ -116,9 +135,10 @@
#list>
],
},
- actionColumn: {
+ actionColumn: {
width: 120,
- },
+ fixed:'right'
+ },
},
exportConfig: {
name:"${tableVo.ftlDescription}",
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
index a8f82241..cecb7bfa 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
@@ -25,7 +26,7 @@ export const columns: BasicColumn[] = [
slots: { customRender: 'htmlSlot' },
<#elseif po.classType=='pca'>
dataIndex: '${po.fieldName}',
- slots: { customRender: 'pcaSlot' },//TODO 未翻译
+ slots: { customRender: 'pcaSlot' },
<#elseif po.classType=='file'>
dataIndex: '${po.fieldName}',
slots: { customRender: 'fileSlot' },
@@ -57,7 +58,7 @@ export const columns: BasicColumn[] = [
return render.renderCategoryTree(text,'${po.dictField?default("")}')
},
<#else>
- customRender: (text, record) => (text ? record['${po.dictText}'] : '')
+ customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')
#if>
<#else>
dataIndex: '${po.fieldName}'
@@ -84,7 +85,7 @@ export const searchFormSchema: FormSchema[] = [
<#if po.queryMode=='single'>
{
label: "${po.filedComment}",
- field: "${po.fieldName}",
+ field: ${autoStringSuffix(po)},
<#if po.classType=='sel_search'>
component: 'JSearchSelect',
componentProps:{
@@ -95,16 +96,22 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='switch'>
component: 'JSwitch',
componentProps:{
+ query:true,
<#if po.dictField != 'is_open'>
- options:"${po.dictField}"
+ options:${po.dictField}
#if>
},
<#elseif po.classType=='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType=='list_multi'>
- component: 'JMultiSelectTag',//暂无该组件
- componentProps:{
- dictCode:"query_field_dictCode?default("")"
+ component: 'JSelectMultiple',
+ componentProps:{
+ <#if po.dictTable?default("")?trim?length gt 1>
+ dictCode:"${po.dictTable},${po.dictText},${po.dictField}",
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode:"${po.dictField}",
+ #if>
+ triggerChange: true
},
<#elseif po.classType=='cat_tree'>
component: 'JCategorySelect',
@@ -121,16 +128,7 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='pca'>
component: 'JAreaLinkage',
<#elseif po.classType=='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:"${po.dictField}",
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>
<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->
component: 'JDictSelectTag',
@@ -157,6 +155,8 @@ export const searchFormSchema: FormSchema[] = [
componentProps: {
showTime:true
},
+<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'JRangeNumber',
<#else>
component: 'Input', //TODO 范围查询
#if>
@@ -189,28 +189,23 @@ export const formSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
- <#elseif po.classType =='sel_depart'>
+ <#include "/common/form/vue3popup.ftl">
+ <#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
component: 'JSwitch',
@@ -231,14 +226,14 @@ export const formSchema: FormSchema[] = [
labelKey:'realname',
},
<#elseif po.classType =='textarea'>
- component: 'InputTextArea',//TODO 注意string转换问题
+ component: 'InputTextArea',
<#elseif po.classType=='list' || po.classType=='radio'>
component: 'JDictSelectTag',
componentProps:{
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
},
@@ -273,7 +268,7 @@ export const formSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -305,16 +300,16 @@ export const formSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
@@ -390,7 +385,7 @@ export const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [
slots: { customRender: 'htmlSlot' },
<#elseif po.classType=='pca'>
dataIndex: '${po.fieldName}',
- slots: { customRender: 'pcaSlot' },//TODO 未翻译
+ slots: { customRender: 'pcaSlot' },
<#elseif po.classType=='file'>
dataIndex: '${po.fieldName}',
slots: { customRender: 'fileSlot' },
@@ -422,7 +417,7 @@ export const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [
return render.renderCategoryTree(text,'${po.dictField?default("")}')
},
<#else>
- customRender: (text, record) => (text ? record['${po.dictText}'] : '')
+ customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')
#if>
<#else>
dataIndex: '${po.fieldName}'
@@ -436,10 +431,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
<#assign form_cat_tree = false>
<#assign form_cat_back = "">
<#assign bpm_flag=false>
+<#assign sub_id_exists=false>
<#list sub.colums as po><#rt/>
<#if po.fieldDbName=='bpm_status'>
<#assign bpm_flag=true>
#if>
+<#if po.fieldDbName=='id'>
+ <#assign sub_id_exists=true>
+#if>
<#if po.isShow =='Y'>
<#assign form_field_dictCode="">
<#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>
@@ -449,27 +448,22 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
@@ -491,14 +485,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
labelKey:'realname',
},
<#elseif po.classType =='textarea'>
- component: 'InputTextArea',//TODO 注意string转换问题
+ component: 'InputTextArea',
<#elseif po.classType=='list' || po.classType=='radio'>
component: 'JDictSelectTag',
componentProps:{
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
},
@@ -533,7 +527,7 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -565,16 +559,16 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
@@ -616,6 +610,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
},
#if>
#list>
+<#if sub_id_exists == false>
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false
+ },
+#if>
];
#if>
#list>
@@ -642,12 +644,20 @@ export const ${sub.entityName?uncap_first}JVxeColumns: JVxeColumn[] = [
<#if col.readonly=='Y'>
disabled:true,
#if>
+<#elseif col.classType =='time'>
+ type: JVxeTypes.time,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
<#elseif col.classType =='textarea'>
type: JVxeTypes.textarea,
<#if col.readonly=='Y'>
disabled:true,
#if>
-<#elseif "int,decimal,double,"?contains(col.classType)>
+<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
+<#-- elseif "int,decimal,double,"?contains(col.classType) -->
+<#elseif col.fieldDbType=='int' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>
+<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
type: JVxeTypes.inputNumber,
<#if col.readonly=='Y'>
disabled:true,
@@ -684,6 +694,16 @@ export const ${sub.entityName?uncap_first}JVxeColumns: JVxeColumn[] = [
<#if col.readonly=='Y'>
disabled:true,
#if>
+<#elseif col.classType =='sel_depart'>
+ type: JVxeTypes.departSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='sel_user'>
+ type: JVxeTypes.userSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
<#elseif col.classType =='image'>
type: JVxeTypes.image,
token:true,
@@ -707,9 +727,9 @@ export const ${sub.entityName?uncap_first}JVxeColumns: JVxeColumn[] = [
<#elseif col.classType =='switch'>
type: JVxeTypes.checkbox,
<#if col.dictField == 'is_open'>
- customValue: ['Y', 'N'],
+ customValue: ['Y', 'N'],
<#else>
- customValue: ${col.dictField},
+ customValue: ${col.dictField},
#if>
<#if col.readonly=='Y'>
disabled:true,
@@ -720,18 +740,11 @@ export const ${sub.entityName?uncap_first}JVxeColumns: JVxeColumn[] = [
<#else>
<#assign popupBackFields = "${col.dictText}">
#if>
- type: JVxeTypes.popup,
- popupCode:"${col.dictTable}",
- field:"${col.dictField}",
- orgFields:"${col.dictField}",
- destFields:"${Format.underlineToHump(col.dictText)}",
- <#if col.readonly=='Y'>
- disabled:true,
- #if>
+ <#include "/common/form/vue3Jvxepopup.ftl">
<#else>
- type: JVxeTypes.input,
+ type: JVxeTypes.input,
<#if col.readonly=='Y'>
- disabled:true,
+ disabled:true,
#if>
#if>
<#if col.classType =='list_multi' || col.classType =='checkbox'>
@@ -754,18 +767,7 @@ export const ${sub.entityName?uncap_first}JVxeColumns: JVxeColumn[] = [
defaultValue:'',
#if>
<#-- 子表的校验 -->
-<#assign subFieldValidType = col.fieldValidType!''>
-<#-- 非空校验 -->
-<#if col.nullable == 'N' || subFieldValidType == '*'>
- validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],
-<#-- 其他情况下,只要有值就被认为是正则校验 -->
-<#elseif subFieldValidType?length gt 0>
-<#assign subMessage = '格式不正确'>
-<#if subFieldValidType == 'only' >
- <#assign subMessage = '不能重复'>
-#if>
- validateRules: [{ pattern: "${subFieldValidType}", message: "${'$'}{title}${subMessage}" }],
-#if>
+ <#include "/common/validatorRulesTemplate/sub-vue3.ftl">
},
#if>
#if>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
index 4996cb58..b641c5d4 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
@@ -1,5 +1,6 @@
+<#include "/common/utils.ftl">
-
+
@@ -7,7 +8,7 @@
<#assign refKey = sub.entityName?uncap_first/>
<#if sub.foreignRelationType =='1'>
- <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form">${sub.entityName}Form>
+ <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form" :disabled="formDisabled">${sub.entityName}Form>
<#else>
@@ -19,7 +20,8 @@
:loading="${sub.entityName?uncap_first}Table.loading"
:columns="${sub.entityName?uncap_first}Table.columns"
:dataSource="${sub.entityName?uncap_first}Table.dataSource"
- :maxHeight="300"
+ :height="340"
+ :disabled="formDisabled"
:rowNumber="true"
:rowSelection="true"
:toolbar="true"
@@ -48,6 +50,7 @@
// Emits声明
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
+ const formDisabled = ref(false);
const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', #list>]);
<#assign hasOne2Many = false>
<#assign hasOne2One = false>
@@ -77,6 +80,7 @@
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
//表单赋值
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
@@ -84,6 +88,7 @@
await reset();
setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
isUpdate.value = !!data?.isUpdate;
+ formDisabled.value = !data?.showFooter;
if (unref(isUpdate)) {
//表单赋值
await setFieldsValue({
@@ -176,5 +181,12 @@
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
index 062fa1b8..37dde1fd 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
<#list subTables as sub>
<#if sub.foreignRelationType=='1'>
#segment#${sub.entityName}Form.vue
@@ -15,11 +16,18 @@
name:"${sub.entityName}Form",
components: {BasicForm},
emits:['register'],
- setup(_,{emit}) {
- const [registerForm, {resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({
+ props:{
+ disabled: {
+ type: Boolean,
+ default: false
+ }
+ },
+ setup(props,{emit}) {
+ const [registerForm, {setProps, resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({
labelWidth: 150,
schemas: ${sub.entityName?uncap_first}FormSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
/**
*初始化加载数据
@@ -30,13 +38,22 @@
res.success && setFieldsValue({...res.result.records[0]});
})
}
+ setProps({disabled: props.disabled})
}
- /**
- *获取表单数据
- */
+
+ /**
+ *获取表单数据
+ */
function getFormData(){
- return [getFieldsValue()];
+ let formData = getFieldsValue();
+ Object.keys(formData).map(k=>{
+ if(formData[k] instanceof Array){
+ formData[k] = formData[k].join(',')
+ }
+ });
+ return [formData];
}
+
/**
*表单校验
*/
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
index 43919c8b..f9e34dba 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
@@ -205,17 +205,14 @@ public class ${entityName}Controller {
QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
- //Step.2 获取导出数据
- List<${entityName}> queryList = ${entityName?uncap_first}Service.list(queryWrapper);
- // 过滤选中数据
+ //配置选中数据查询条件
String selections = request.getParameter("selections");
- List<${entityName}> ${entityName?uncap_first}List = new ArrayList<${entityName}>();
- if(oConvertUtils.isEmpty(selections)) {
- ${entityName?uncap_first}List = queryList;
- }else {
- List selectionList = Arrays.asList(selections.split(","));
- ${entityName?uncap_first}List = queryList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
+ if(oConvertUtils.isNotEmpty(selections)) {
+ List selectionList = Arrays.asList(selections.split(","));
+ queryWrapper.in("id",selectionList);
}
+ //Step.2 获取导出数据
+ List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);
// Step.3 组装pageList
List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
index c861c4a1..4d1b4253 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
package ${bussiPackage}.${entityPackage}.entity;
import java.io.Serializable;
@@ -31,9 +32,9 @@ public class ${entityName} implements Serializable {
<#-- 生成字典Code -->
<#assign list_field_dictCode="">
<#if po.classType='sel_user'>
- <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'>
+ <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'>
<#elseif po.classType='sel_depart'>
- <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'>
+ <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'>
<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>
<#if po.dictTable?default("")?trim?length gt 1>
<#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
index b6aabe85..93ddf952 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
<#list subTables as subTab>
#segment#${subTab.entityName}.java
package ${bussiPackage}.${entityPackage}.entity;
@@ -32,9 +33,9 @@ public class ${subTab.entityName} implements Serializable {
<#-- 生成字典Code -->
<#assign list_field_dictCode="">
<#if po.classType='sel_user'>
- <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'>
+ <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'>
<#elseif po.classType='sel_depart'>
- <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'>
+ <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'>
<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>
<#if po.dictTable?default("")?trim?length gt 1>
<#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
index f387f76a..51b96c79 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
@@ -48,7 +48,7 @@
@input="popupCallback"
<#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='sel_depart'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if> <#if po.readonly=='Y'>disabled#if>>
<#elseif po.classType =='pca'>
@@ -58,7 +58,7 @@
<#elseif po.classType =='password'>
disabled#if>/>
<#elseif po.classType =='sel_user'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
disabled#if>/>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
index 96cfc114..97d12033 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
@@ -44,7 +44,7 @@
:multi="${po.extendParams.popupMulti?c}"
@input="popupCallback"/>
<#elseif po.classType =='sel_depart'>
-
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if>>
<#elseif po.classType =='pca'>
@@ -54,7 +54,7 @@
<#elseif po.classType =='password'>
<#elseif po.classType =='sel_user'>
-
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
index b75bbbd5..b8cfe023 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
@@ -46,6 +46,10 @@
+
+
+ {{ getAreaTextByCode(text) }}
+
无文件
下载
@@ -64,6 +68,10 @@
import ${entityName}Modal from './components/${entityName}Modal.vue'
import {columns, searchFormSchema} from './${entityName}.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';
+ import {downloadFile} from '/@/utils/common/renderUtils';
+<#if list_need_pca>
+ import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';
+#if>
<#if list_need_category>
import { loadCategoryData } from '/@/api/common/api'
import { getAuthCache, setAuthCache } from '/@/utils/auth';
@@ -84,6 +92,17 @@
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
+ fieldMapToNumber: [
+ <#list columns as po>
+ <#if po.isQuery=='Y'>
+ <#if po.queryMode!='single'>
+ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],
+ #if>
+ #if>
+ #if>
+ #list>
+ ],
fieldMapToTime: [
<#list columns as po>
<#if po.isQuery=='Y'>
@@ -98,9 +117,10 @@
#list>
],
},
- actionColumn: {
+ actionColumn: {
width: 120,
- },
+ fixed:'right'
+ },
},
exportConfig: {
name:"${tableVo.ftlDescription}",
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
index c52445ad..bb4097f7 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
@@ -25,7 +26,7 @@ export const columns: BasicColumn[] = [
slots: { customRender: 'htmlSlot' },
<#elseif po.classType=='pca'>
dataIndex: '${po.fieldName}',
- slots: { customRender: 'pcaSlot' },//TODO 未翻译
+ slots: { customRender: 'pcaSlot' },
<#elseif po.classType=='file'>
dataIndex: '${po.fieldName}',
slots: { customRender: 'fileSlot' },
@@ -57,7 +58,7 @@ export const columns: BasicColumn[] = [
return render.renderCategoryTree(text,'${po.dictField?default("")}')
},
<#else>
- customRender: (text, record) => (text ? record['${po.dictText}'] : '')
+ customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')
#if>
<#else>
dataIndex: '${po.fieldName}'
@@ -95,16 +96,22 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='switch'>
component: 'JSwitch',
componentProps:{
+ query:true,
<#if po.dictField != 'is_open'>
- options:"${po.dictField}"
+ options:${po.dictField}
#if>
},
<#elseif po.classType=='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType=='list_multi'>
- component: 'JMultiSelectTag',//暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
- dictCode:"query_field_dictCode?default("")"
+ <#if po.dictTable?default("")?trim?length gt 1>
+ dictCode:"${po.dictTable},${po.dictText},${po.dictField}",
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode:"${po.dictField}",
+ #if>
+ triggerChange: true
},
<#elseif po.classType=='cat_tree'>
component: 'JCategorySelect',
@@ -121,16 +128,7 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='pca'>
component: 'JAreaLinkage',
<#elseif po.classType=='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:"${po.dictField}",
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>
<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->
component: 'JDictSelectTag',
@@ -157,6 +155,8 @@ export const searchFormSchema: FormSchema[] = [
componentProps: {
showTime:true
},
+<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'JRangeNumber',
<#else>
component: 'Input', //TODO 范围查询
#if>
@@ -189,27 +189,22 @@ export const formSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
@@ -231,14 +226,14 @@ export const formSchema: FormSchema[] = [
labelKey:'realname',
},
<#elseif po.classType =='textarea'>
- component: 'InputTextArea',//TODO 注意string转换问题
+ component: 'InputTextArea',
<#elseif po.classType=='list' || po.classType=='radio'>
component: 'JDictSelectTag',
componentProps:{
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
},
@@ -273,7 +268,7 @@ export const formSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -305,16 +300,16 @@ export const formSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
@@ -373,10 +368,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
<#assign form_cat_tree = false>
<#assign form_cat_back = "">
<#assign bpm_flag=false>
+<#assign sub_id_exists=false>
<#list sub.colums as po><#rt/>
<#if po.fieldDbName=='bpm_status'>
<#assign bpm_flag=true>
#if>
+<#if po.fieldDbName=='id'>
+ <#assign sub_id_exists=true>
+#if>
<#if po.isShow =='Y'>
<#assign form_field_dictCode="">
<#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>
@@ -386,27 +385,22 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
@@ -428,14 +422,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
labelKey:'realname',
},
<#elseif po.classType =='textarea'>
- component: 'InputTextArea',//TODO 注意string转换问题
+ component: 'InputTextArea',
<#elseif po.classType=='list' || po.classType=='radio'>
component: 'JDictSelectTag',
componentProps:{
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
}
@@ -470,7 +464,7 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -502,16 +496,16 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
@@ -553,6 +547,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
},
#if>
#list>
+<#if sub_id_exists == false>
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false
+ },
+#if>
];
#if>
#list>
@@ -579,12 +581,20 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#if col.readonly=='Y'>
disabled:true,
#if>
+<#elseif col.classType =='time'>
+ type: JVxeTypes.time,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
<#elseif col.classType =='textarea'>
type: JVxeTypes.textarea,
<#if col.readonly=='Y'>
disabled:true,
#if>
-<#elseif "int,decimal,double,"?contains(col.classType)>
+<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
+<#-- elseif "int,decimal,double,"?contains(col.classType) -->
+<#elseif col.fieldDbType=='int' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>
+<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
type: JVxeTypes.inputNumber,
<#if col.readonly=='Y'>
disabled:true,
@@ -621,6 +631,16 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#if col.readonly=='Y'>
disabled:true,
#if>
+<#elseif col.classType =='sel_depart'>
+ type: JVxeTypes.departSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='sel_user'>
+ type: JVxeTypes.userSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
<#elseif col.classType =='image'>
type: JVxeTypes.image,
token:true,
@@ -644,9 +664,9 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#elseif col.classType =='switch'>
type: JVxeTypes.checkbox,
<#if col.dictField == 'is_open'>
- customValue: ['Y', 'N'],
+ customValue: ['Y', 'N'],
<#else>
- customValue: ${col.dictField},
+ customValue: ${col.dictField},
#if>
<#if col.readonly=='Y'>
disabled:true,
@@ -657,18 +677,11 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#else>
<#assign popupBackFields = "${col.dictText}">
#if>
- type: JVxeTypes.popup,
- popupCode:"${col.dictTable}",
- field:"${col.dictField}",
- orgFields:"${col.dictField}",
- destFields:"${Format.underlineToHump(col.dictText)}",
- <#if col.readonly=='Y'>
- disabled:true,
- #if>
+ <#include "/common/form/vue3Jvxepopup.ftl">
<#else>
- type: JVxeTypes.input,
+ type: JVxeTypes.input,
<#if col.readonly=='Y'>
- disabled:true,
+ disabled:true,
#if>
#if>
<#if col.classType =='list_multi' || col.classType =='checkbox'>
@@ -691,18 +704,7 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
defaultValue:'',
#if>
<#-- 子表的校验 -->
-<#assign subFieldValidType = col.fieldValidType!''>
-<#-- 非空校验 -->
-<#if col.nullable == 'N' || subFieldValidType == '*'>
- validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],
-<#-- 其他情况下,只要有值就被认为是正则校验 -->
-<#elseif subFieldValidType?length gt 0>
-<#assign subMessage = '格式不正确'>
-<#if subFieldValidType == 'only' >
- <#assign subMessage = '不能重复'>
-#if>
- validateRules: [{ pattern: "${subFieldValidType}", message: "${'$'}{title}${subMessage}" }],
-#if>
+ <#include "/common/validatorRulesTemplate/sub-vue3.ftl">
},
#if>
#if>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..7292339d
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
index 6a2e26ba..85ffc479 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
@@ -1,5 +1,6 @@
+<#include "/common/utils.ftl">
-
+
@@ -7,7 +8,7 @@
<#assign refKey = sub.entityName?uncap_first/>
<#if sub.foreignRelationType =='1'>
- <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form">${sub.entityName}Form>
+ <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form" :disabled="formDisabled">${sub.entityName}Form>
<#else>
@@ -19,9 +20,10 @@
:loading="${sub.entityName?uncap_first}Table.loading"
:columns="${sub.entityName?uncap_first}Table.columns"
:dataSource="${sub.entityName?uncap_first}Table.dataSource"
- :maxHeight="300"
+ :height="340"
:rowNumber="true"
:rowSelection="true"
+ :disabled="formDisabled"
:toolbar="true"
/>
@@ -48,6 +50,7 @@
// Emits声明
const emit = defineEmits(['register','success']);
const isUpdate = ref(true);
+ const formDisabled = ref(false);
const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', #list>]);
<#assign hasOne2Many = false>
<#assign hasOne2One = false>
@@ -77,6 +80,7 @@
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
//表单赋值
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
@@ -84,6 +88,7 @@
await reset();
setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
isUpdate.value = !!data?.isUpdate;
+ formDisabled.value = !data?.showFooter;
if (unref(isUpdate)) {
//表单赋值
await setFieldsValue({
@@ -176,5 +181,12 @@
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
index 6af0c523..dbb8c091 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
<#list subTables as sub>
<#if sub.foreignRelationType=='1'>
#segment#${sub.entityName}Form.vue
@@ -15,11 +16,18 @@
name:"${sub.entityName}Form",
components: {BasicForm},
emits:['register'],
- setup(_,{emit}) {
- const [registerForm, {resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({
+ props:{
+ disabled: {
+ type: Boolean,
+ default: false
+ }
+ },
+ setup(props,{emit}) {
+ const [registerForm, {setProps, resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({
labelWidth: 150,
schemas: ${sub.entityName?uncap_first}FormSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
/**
*初始化加载数据
@@ -30,12 +38,19 @@
res.success && setFieldsValue({...res.result[0]});
})
}
+ setProps({disabled: props.disabled})
}
/**
*获取表单数据
*/
function getFormData(){
- return [getFieldsValue()];
+ let formData = getFieldsValue();
+ Object.keys(formData).map(k=>{
+ if(formData[k] instanceof Array){
+ formData[k] = formData[k].join(',')
+ }
+ });
+ return [formData];
}
/**
*表单校验
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei
new file mode 100644
index 00000000..75691fc1
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei
@@ -0,0 +1,340 @@
+
+
+ <#assign query_field_no=0>
+ <#assign need_category = false>
+ <#assign need_pca = false>
+ <#assign need_search = false>
+ <#assign need_dept_user = false>
+ <#assign need_switch = false>
+ <#assign need_dept = false>
+ <#assign need_multi = false>
+ <#assign need_popup = false>
+ <#assign need_select_tag = false>
+ <#assign need_select_tree = false>
+ <#assign need_time = false>
+ <#assign bpm_flag=false>
+ <#assign need_markdown = false>
+ <#assign need_upload = false>
+ <#assign need_image_upload = false>
+ <#assign need_editor = false>
+ <#assign need_checkbox = false>
+
+
+<#-- 结束循环 -->
+
+
+
+
+ 新增
+ 导出
+ 导入
+
+
+
+
+
+ 删除
+
+
+
+ 批量操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getAreaTextByCode(text) }}
+
+
+ 无文件
+ 下载
+
+
+
+ <${entityName}Modal @register="registerModal" @success="handleSuccess">${entityName}Modal>
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi
new file mode 100644
index 00000000..74f56d17
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi
@@ -0,0 +1,82 @@
+import {defHttp} from '/@/utils/http/axios';
+import {Modal} from 'ant-design-vue';
+
+enum Api {
+ list = '/${entityPackage}/${entityName?uncap_first}/list',
+ save='/${entityPackage}/${entityName?uncap_first}/add',
+ edit='/${entityPackage}/${entityName?uncap_first}/edit',
+ deleteOne = '/${entityPackage}/${entityName?uncap_first}/delete',
+ deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',
+ importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',
+ exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',
+ queryDataById = '/${entityPackage}/${entityName?uncap_first}/queryById',
+<#list subTables as sub><#rt/>
+ ${sub.entityName?uncap_first}List = '/${entityPackage}/${entityName?uncap_first}/query${sub.entityName}ByMainId',
+#list>
+}
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+<#list subTables as sub><#rt/>
+/**
+ * 查询子表数据
+ * @param params
+ */
+export const query${sub.entityName}ListByMainId = (id) => defHttp.get({url: Api.${sub.entityName?uncap_first}List, params:{ id }});
+#list>
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) =>
+ defHttp.get({url: Api.list, params});
+
+/**
+ * 删除单个
+ */
+export const deleteOne = (params,handleSuccess) => {
+ return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
+ handleSuccess();
+ });
+}
+/**
+ * 批量删除
+ * @param params
+ */
+export const batchDelete = (params, handleSuccess) => {
+ Modal.confirm({
+ title: '确认删除',
+ content: '是否删除选中数据',
+ okText: '确认',
+ cancelText: '取消',
+ onOk: () => {
+ return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
+ handleSuccess();
+ });
+ }
+ });
+}
+/**
+ * 保存或者更新
+ * @param params
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+ let url = isUpdate ? Api.edit : Api.save;
+ return defHttp.post({url: url, params});
+}
+
+/**
+* 根据id查询数据
+* @param params
+*/
+export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }});
+
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi
new file mode 100644
index 00000000..243f984e
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi
@@ -0,0 +1,714 @@
+<#include "/common/utils.ftl">
+import {BasicColumn} from '/@/components/Table';
+import {FormSchema} from '/@/components/Table';
+import { rules} from '/@/utils/helper/validator';
+import { render } from '/@/utils/common/renderUtils';
+import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
+//列表数据
+export const columns: BasicColumn[] = [
+ <#list columns as po>
+ <#if po.isShowList =='Y' && po.fieldName !='id'>
+ {
+ title: '${po.filedComment}',
+ align:"center",
+ <#if po.sort=='Y'>
+ sorter: true,
+ #if>
+ <#if po.classType=='date'>
+ dataIndex: '${po.fieldName}',
+ customRender:({text}) =>{
+ return !text?"":(text.length>10?text.substr(0,10):text)
+ },
+ <#elseif po.fieldDbType=='Blob'>
+ dataIndex: '${po.fieldName}String'
+ <#elseif po.classType=='umeditor'>
+ dataIndex: '${po.fieldName}',
+ slots: { customRender: 'htmlSlot' },
+ <#elseif po.classType=='pca'>
+ dataIndex: '${po.fieldName}',
+ slots: { customRender: 'pcaSlot' },
+ <#elseif po.classType=='file'>
+ dataIndex: '${po.fieldName}',
+ slots: { customRender: 'fileSlot' },
+ <#elseif po.classType=='image'>
+ dataIndex: '${po.fieldName}',
+ customRender:render.renderImage,
+ <#elseif po.classType=='switch'>
+ dataIndex: '${po.fieldName}',
+<#assign switch_extend_arr=['Y','N']>
+<#if po.dictField?default("")?contains("[")>
+<#assign switch_extend_arr=po.dictField?eval>
+#if>
+<#list switch_extend_arr as a>
+<#if a_index == 0>
+<#assign switch_extend_arr1=a>
+<#else>
+<#assign switch_extend_arr2=a>
+#if>
+#list>
+ customRender:({text}) => {
+ return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])
+ },
+ <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>
+ dataIndex: '${po.fieldName}_dictText'
+ <#elseif po.classType=='cat_tree'>
+ dataIndex: '${po.fieldName}',
+ <#if po.dictText?default("")?trim?length == 0>
+ customRender:({text}) => {
+ return render.renderCategoryTree(text,'${po.dictField?default("")}')
+ },
+ <#else>
+ customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')
+ #if>
+ <#else>
+ dataIndex: '${po.fieldName}'
+ #if>
+ },
+ #if>
+ #list>
+];
+//查询数据
+export const searchFormSchema: FormSchema[] = [
+<#-- 开始循环 -->
+<#list columns as po>
+<#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+#if>
+<#if po.isQuery=='Y'>
+<#assign query_flag=true>
+ <#assign query_field_dictCode="">
+ <#if po.dictTable?default("")?trim?length gt 1>
+ <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ <#assign query_field_dictCode="${po.dictField}">
+ #if>
+<#if po.queryMode=='single'>
+ {
+ label: "${po.filedComment}",
+ field: "${po.fieldName}",
+<#if po.classType=='sel_search'>
+ component: 'JSearchSelect',
+ componentProps:{
+ dict:"${po.dictTable},${po.dictText},${po.dictField}"
+ },
+<#elseif po.classType=='sel_user'>
+ component: 'JSelectUserByDept',
+<#elseif po.classType=='switch'>
+ component: 'JSwitch',
+ componentProps:{
+ <#if po.dictField != 'is_open'>
+ options:"${po.dictField}"
+ #if>
+ },
+ <#elseif po.classType=='sel_depart'>
+ component: 'JSelectDept',
+ <#elseif po.classType=='list_multi'>
+ component: 'JSelectMultiple',
+ componentProps:{
+ <#if po.dictTable?default("")?trim?length gt 1>
+ dictCode:"${po.dictTable},${po.dictText},${po.dictField}",
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode:"${po.dictField}",
+ #if>
+ triggerChange: true
+ },
+ <#elseif po.classType=='cat_tree'>
+ component: 'JCategorySelect',
+ componentProps:{
+ pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题
+ },
+<#elseif po.classType=='date'>
+ component: 'DatePicker',
+<#elseif po.classType=='datetime'>
+ component: 'DatePicker',
+ componentProps: {
+ showTime:true
+ },
+<#elseif po.classType=='pca'>
+ component: 'JAreaLinkage',
+<#elseif po.classType=='popup'>
+ <#include "/common/form/vue3popup.ftl">
+<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>
+<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->
+ component: 'JDictSelectTag',
+ componentProps:{
+ <#if po.dictTable?default("")?trim?length gt 1>
+ dictCode:"${po.dictTable},${po.dictText},${po.dictField}"
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode:"${po.dictField}"
+ #if>
+ },
+<#else>
+ component: 'Input',
+#if>
+ colProps: {span: 6},
+ },
+<#else>
+ {
+ label: "${po.filedComment}",
+ field: "${po.fieldName}",
+<#if po.classType=='date'>
+ component: 'RangePicker',
+<#elseif po.classType=='datetime'>
+ component: 'RangePicker',
+ componentProps: {
+ showTime:true
+ },
+<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'JRangeNumber',
+<#else>
+ component: 'Input', //TODO 范围查询
+#if>
+ colProps: {span: 6},
+ },
+#if>
+#if>
+#list>
+<#-- 结束循环 -->
+];
+//表单数据
+export const formSchema: FormSchema[] = [
+<#assign form_cat_tree = false>
+<#assign form_cat_back = "">
+<#assign bpm_flag=false>
+<#assign id_exists = false>
+<#list columns as po><#rt/>
+<#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+#if>
+<#if po.fieldDbName == 'id'>
+ <#assign id_exists = true>
+#if>
+<#if po.isShow =='Y'>
+<#assign form_field_dictCode="">
+ <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>
+ <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ <#assign form_field_dictCode="${po.dictField}">
+ #if>
+ {
+ label: '${po.filedComment}',
+ field: ${autoStringSuffix(po)},
+ <#if po.classType =='date'>
+ component: 'DatePicker',
+ <#elseif po.classType =='datetime'>
+ component: 'DatePicker',
+ componentProps: {
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
+ },
+ <#elseif po.classType =='time'>
+ component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
+ <#elseif po.classType =='popup'>
+ <#include "/common/form/vue3popup.ftl">
+ <#elseif po.classType =='sel_depart'>
+ component: 'JSelectDept',
+ <#elseif po.classType =='switch'>
+ component: 'JSwitch',
+ componentProps:{
+ <#if po.dictField != 'is_open'>
+ options:${po.dictField}
+ #if>
+ },
+ <#elseif po.classType =='pca'>
+ component: 'JAreaLinkage',
+ <#elseif po.classType =='markdown'>
+ component: 'JMarkdownEditor',//注意string转换问题
+ <#elseif po.classType =='password'>
+ component: 'InputPassword',
+ <#elseif po.classType =='sel_user'>
+ component: 'JSelectUserByDept',
+ componentProps:{
+ labelKey:'realname',
+ },
+ <#elseif po.classType =='textarea'>
+ component: 'InputTextArea',
+ <#elseif po.classType=='list' || po.classType=='radio'>
+ component: 'JDictSelectTag',
+ componentProps:{
+ dictCode:"${form_field_dictCode}"
+ },
+ <#elseif po.classType=='list_multi' || po.classType=='checkbox'>
+ component: 'JSelectMultiple',
+ componentProps:{
+ dictCode:"${form_field_dictCode}"
+ },
+ <#elseif po.classType=='sel_search'>
+ component: 'JSearchSelect',
+ componentProps:{
+ dict:"${form_field_dictCode}"
+ },
+<#elseif po.classType=='cat_tree'>
+ <#assign form_cat_tree = true>
+ component: 'JCategorySelect',
+ componentProps:{
+ pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题
+ },
+ <#if po.dictText?default("")?trim?length gt 1>
+ <#assign form_cat_back = "${po.dictText}">
+ #if>
+ <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'InputNumber',
+ <#elseif po.classType=='file'>
+ component: 'JUpload',
+ componentProps:{
+ <#if po.uploadnum??>
+ maxCount:${po.uploadnum}
+ #if>
+ },
+ <#elseif po.classType=='image'>
+ component: 'JImageUpload',
+ componentProps:{
+ <#if po.uploadnum??>
+ fileMax:${po.uploadnum}
+ #if>
+ },
+ <#elseif po.classType=='umeditor'>
+ component: 'JEditor',
+ <#elseif po.classType == 'sel_tree'>
+ component: 'JTreeSelect',
+ componentProps:{
+ <#if po.dictText??>
+ <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>
+ dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",
+ <#elseif po.dictText?split(',')[1]??>
+ pidField:"${po.dictText?split(',')[1]}",
+ <#elseif po.dictText?split(',')[3]??>
+ hasChildField:"${po.dictText?split(',')[3]}",
+ #if>
+ #if>
+ pidValue:"${po.dictField}",
+ },
+ <#else>
+ component: 'Input',
+ #if>
+ <#include "/common/utils.ftl">
+ <#if po.isShow == 'Y' && poHasCheck(po)>
+ dynamicRules: ({model,schema}) => {
+ <#if po.fieldName != 'id'>
+ <#assign fieldValidType = po.fieldValidType!''>
+ return [
+ <#-- 非空校验 -->
+ <#if po.nullable == 'N' || fieldValidType == '*'>
+ { required: true, message: '请输入${po.filedComment}!'},
+ <#elseif fieldValidType!=''>
+ { required: false},
+ #if>
+ <#-- 唯一校验 -->
+ <#if fieldValidType == 'only'>
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
+ <#-- 6到16位数字 -->
+ <#elseif fieldValidType == 'n6-16'>
+ { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
+ <#-- 6到16位任意字符 -->
+ <#elseif fieldValidType == '*6-16'>
+ { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
+ <#-- 6到18位字符串 -->
+ <#elseif fieldValidType == 's6-18'>
+ { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ <#-- 网址 -->
+ <#elseif fieldValidType == 'url'>
+ { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
+ <#-- 电子邮件 -->
+ <#elseif fieldValidType == 'e'>
+ { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},
+ <#-- 手机号码 -->
+ <#elseif fieldValidType == 'm'>
+ { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},
+ <#-- 邮政编码 -->
+ <#elseif fieldValidType == 'p'>
+ { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},
+ <#-- 字母 -->
+ <#elseif fieldValidType == 's'>
+ { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},
+ <#-- 数字 -->
+ <#elseif fieldValidType == 'n'>
+ { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},
+ <#-- 整数 -->
+ <#elseif fieldValidType == 'z'>
+ { pattern: /^-?\d+$/, message: '请输入整数!'},
+ <#-- 金额 -->
+ <#elseif fieldValidType == 'money'>
+ { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},
+ <#-- 正则校验 -->
+ <#elseif fieldValidType != '' && fieldValidType != '*'>
+ { pattern: '${fieldValidType}', message: '不符合校验规则!'},
+ <#-- 无校验 -->
+ <#else>
+ <#t>
+ #if>
+ ];
+ #if>
+ },
+ #if>
+ <#if po.readonly=='Y'>
+ dynamicDisabled:true
+ #if>
+ },
+#if>
+#list>
+<#if id_exists == false>
+ // TODO 主键隐藏字段,目前写死为ID
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false
+ },
+#if>
+];
+//子表单数据
+<#list subTables as sub>
+<#if sub.foreignRelationType =='1'>
+export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
+<#assign form_cat_tree = false>
+<#assign form_cat_back = "">
+<#assign bpm_flag=false>
+<#assign sub_id_exists=false>
+<#list sub.colums as po><#rt/>
+<#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+#if>
+<#if po.fieldDbName=='id'>
+ <#assign sub_id_exists=true>
+#if>
+<#if po.isShow =='Y'>
+<#assign form_field_dictCode="">
+ <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>
+ <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ <#assign form_field_dictCode="${po.dictField}">
+ #if>
+ {
+ label: '${po.filedComment}',
+ field: ${autoStringSuffix(po)},
+ <#if po.classType =='date'>
+ component: 'DatePicker',
+ <#elseif po.classType =='datetime'>
+ component: 'DatePicker',
+ componentProps: {
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
+ },
+ <#elseif po.classType =='time'>
+ component: 'TimePicker',
+ componentProps: {
+ valueFormat: 'HH:mm:ss'
+ },
+ <#elseif po.classType =='popup'>
+ <#include "/common/form/vue3popup.ftl">
+ <#elseif po.classType =='sel_depart'>
+ component: 'JSelectDept',
+ <#elseif po.classType =='switch'>
+ component: 'JSwitch',
+ componentProps:{
+ <#if po.dictField != 'is_open'>
+ options:${po.dictField}
+ #if>
+ },
+ <#elseif po.classType =='pca'>
+ component: 'JAreaLinkage',
+ <#elseif po.classType =='markdown'>
+ component: 'JMarkdownEditor',//注意string转换问题
+ <#elseif po.classType =='password'>
+ component: 'InputPassword',
+ <#elseif po.classType =='sel_user'>
+ component: 'JSelectUserByDept',
+ componentProps:{
+ labelKey:'realname',
+ },
+ <#elseif po.classType =='textarea'>
+ component: 'InputTextArea',
+ <#elseif po.classType=='list' || po.classType=='radio'>
+ component: 'JDictSelectTag',
+ componentProps:{
+ dictCode:"${form_field_dictCode}"
+ },
+ <#elseif po.classType=='list_multi' || po.classType=='checkbox'>
+ component: 'JSelectMultiple',
+ componentProps:{
+ dictCode:"${form_field_dictCode}"
+ }
+ <#elseif po.classType=='sel_search'>
+ component: 'JSearchSelect',
+ componentProps:{
+ dict:"${form_field_dictCode}"
+ },
+<#elseif po.classType=='cat_tree'>
+ <#assign form_cat_tree = true>
+ component: 'JCategorySelect',
+ componentProps:{
+ pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题
+ },
+ <#if po.dictText?default("")?trim?length gt 1>
+ <#assign form_cat_back = "${po.dictText}">
+ #if>
+ <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'InputNumber',
+ <#elseif po.classType=='file'>
+ component: 'JUpload',
+ componentProps:{
+ <#if po.uploadnum??>
+ maxCount:${po.uploadnum}
+ #if>
+ },
+ <#elseif po.classType=='image'>
+ component: 'JImageUpload',
+ componentProps:{
+ <#if po.uploadnum??>
+ fileMax:${po.uploadnum}
+ #if>
+ },
+ <#elseif po.classType=='umeditor'>
+ component: 'JEditor',
+ <#elseif po.classType == 'sel_tree'>
+ component: 'JTreeSelect',
+ componentProps:{
+ <#if po.dictText??>
+ <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>
+ dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",
+ <#elseif po.dictText?split(',')[1]??>
+ pidField:"${po.dictText?split(',')[1]}",
+ <#elseif po.dictText?split(',')[3]??>
+ hasChildField:"${po.dictText?split(',')[3]}",
+ #if>
+ #if>
+ pidValue:"${po.dictField}",
+ },
+ <#else>
+ component: 'Input',
+ #if>
+ <#include "/common/utils.ftl">
+ <#if po.isShow == 'Y' && poHasCheck(po)>
+ dynamicRules: ({model,schema}) => {
+ <#if po.fieldName != 'id'>
+ <#assign fieldValidType = po.fieldValidType!''>
+ return [
+ <#-- 非空校验 -->
+ <#if po.nullable == 'N' || fieldValidType == '*'>
+ { required: true, message: '请输入${po.filedComment}!'},
+ <#elseif fieldValidType!=''>
+ { required: false},
+ #if>
+ <#-- 唯一校验 -->
+ <#if fieldValidType == 'only'>
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
+ <#-- 6到16位数字 -->
+ <#elseif fieldValidType == 'n6-16'>
+ { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
+ <#-- 6到16位任意字符 -->
+ <#elseif fieldValidType == '*6-16'>
+ { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
+ <#-- 6到18位字符串 -->
+ <#elseif fieldValidType == 's6-18'>
+ { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ <#-- 网址 -->
+ <#elseif fieldValidType == 'url'>
+ { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
+ <#-- 电子邮件 -->
+ <#elseif fieldValidType == 'e'>
+ { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},
+ <#-- 手机号码 -->
+ <#elseif fieldValidType == 'm'>
+ { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},
+ <#-- 邮政编码 -->
+ <#elseif fieldValidType == 'p'>
+ { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},
+ <#-- 字母 -->
+ <#elseif fieldValidType == 's'>
+ { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},
+ <#-- 数字 -->
+ <#elseif fieldValidType == 'n'>
+ { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},
+ <#-- 整数 -->
+ <#elseif fieldValidType == 'z'>
+ { pattern: /^-?\d+$/, message: '请输入整数!'},
+ <#-- 金额 -->
+ <#elseif fieldValidType == 'money'>
+ { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},
+ <#-- 正则校验 -->
+ <#elseif fieldValidType != '' && fieldValidType != '*'>
+ { pattern: '${fieldValidType}', message: '不符合校验规则!'},
+ <#-- 无校验 -->
+ <#else>
+ <#t>
+ #if>
+ ];
+ #if>
+ },
+ #if>
+ <#if po.readonly=='Y'>
+ dynamicDisabled:true
+ #if>
+ },
+#if>
+#list>
+<#if sub_id_exists == false>
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false
+ },
+#if>
+];
+#if>
+#list>
+//子表表格配置
+<#list subTables as sub>
+<#if sub.foreignRelationType =='0'>
+export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
+<#assign popupBackFields = "">
+
+<#-- 循环子表的列 开始 -->
+<#list sub.colums as col><#rt/>
+<#if col.isShow =='Y'>
+<#if col.filedComment !='外键' >
+ {
+ title: '${col.filedComment}',
+ key: '${autoStringSuffixForModel(col)}',
+<#if col.classType =='date'>
+ type: JVxeTypes.date,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='datetime'>
+ type: JVxeTypes.datetime,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='time'>
+ type: JVxeTypes.time,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='textarea'>
+ type: JVxeTypes.textarea,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
+<#-- elseif "int,decimal,double,"?contains(col.classType) -->
+<#elseif col.fieldDbType=='int' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>
+<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
+ type: JVxeTypes.inputNumber,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='list' || col.classType =='radio'>
+ type: JVxeTypes.select,
+ options:[],
+ <#if col.dictTable?default("")?trim?length gt 1>
+ dictCode:"${col.dictTable},${col.dictText},${col.dictField}",
+ <#else>
+ dictCode:"${col.dictField}",
+ #if>
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='list_multi' || col.classType =='checkbox'>
+ type: JVxeTypes.selectMultiple,
+ options:[],
+ <#if col.dictTable?default("")?trim?length gt 1>
+ dictCode:"${col.dictTable},${col.dictText},${col.dictField}",
+ <#else>
+ dictCode:"${col.dictField}",
+ #if>
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='sel_search'>
+ type: JVxeTypes.selectSearch,
+ <#if col.dictTable?default("")?trim?length gt 1>
+ dictCode:"${col.dictTable},${col.dictText},${col.dictField}",
+ <#else>
+ dictCode:"${col.dictField}",
+ #if>
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='sel_depart'>
+ type: JVxeTypes.departSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='sel_user'>
+ type: JVxeTypes.userSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='image'>
+ type: JVxeTypes.image,
+ token:true,
+ responseName:"message",
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+ <#if col.uploadnum??>
+ number: ${col.uploadnum},
+ #if>
+<#elseif col.classType =='file'>
+ type: JVxeTypes.file,
+ token:true,
+ responseName:"message",
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+ <#if col.uploadnum??>
+ number: ${col.uploadnum},
+ #if>
+<#elseif col.classType =='switch'>
+ type: JVxeTypes.checkbox,
+ <#if col.dictField == 'is_open'>
+ customValue: ['Y', 'N'],
+ <#else>
+ customValue: ${col.dictField},
+ #if>
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='popup'>
+<#if popupBackFields?length gt 0>
+ <#assign popupBackFields = "${popupBackFields}"+","+"${col.dictText}">
+<#else>
+ <#assign popupBackFields = "${col.dictText}">
+#if>
+ <#include "/common/form/vue3Jvxepopup.ftl">
+<#else>
+ type: JVxeTypes.input,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+#if>
+<#if col.classType =='list_multi' || col.classType =='checkbox'>
+ width:"250px",
+<#else>
+ width:"200px",
+#if>
+<#if col.classType =='file'>
+ placeholder: '请选择文件',
+<#else>
+ placeholder: '请输入${'$'}{title}',
+#if>
+<#if col.defaultVal??>
+<#if col.fieldDbType=="BigDecimal" || col.fieldDbType=="double" || col.fieldDbType=="int">
+ defaultValue:${col.defaultVal},
+ <#else>
+ defaultValue:"${col.defaultVal}",
+#if>
+<#else>
+ defaultValue:'',
+#if>
+<#-- 子表的校验 -->
+ <#include "/common/validatorRulesTemplate/sub-vue3.ftl">
+ },
+#if>
+#if>
+#list>
+<#-- 循环子表的列 结束 -->
+ ]
+#if>
+#list>
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei
new file mode 100644
index 00000000..e3e4cf88
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei
@@ -0,0 +1,264 @@
+<#include "/common/utils.ftl">
+<#assign need_category = false>
+<#assign bpm_flag=false>
+<#assign need_pca = false>
+<#assign need_search = false>
+<#assign need_dept_user = false>
+<#assign need_switch = false>
+<#assign need_dept = false>
+<#assign need_multi = false>
+<#assign need_popup = false>
+<#assign need_select_tag = false>
+<#assign need_select_tree = false>
+<#assign need_time = false>
+<#assign need_markdown = false>
+<#assign need_upload = false>
+<#assign need_image_upload = false>
+<#assign need_editor = false>
+<#assign need_checkbox = false>
+<#assign form_span = 24>
+<#if tableVo.fieldRowNum==2>
+ <#assign form_span = 12>
+<#elseif tableVo.fieldRowNum==3>
+ <#assign form_span = 8>
+<#elseif tableVo.fieldRowNum==4>
+ <#assign form_span = 6>
+#if>
+<#assign hasOne2manyTable = false>
+<#assign subTabActiveKey = ''>
+<#assign subMainFieldMap={}>
+<#assign subTableColumnsKey=[]>
+<#assign hasOnlyValidate = false>
+
+
+
+
+ <#list columns as po>
+ <#if po.isShow == 'Y' && po.fieldValidType?default("") == 'only'>
+ <#assign hasOnlyValidate = true>
+ #if>
+ <#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+ #if>
+<#include "/common/form/native/vue3NativeForm.ftl">
+ #list>
+
+
+
+
+
+<#list subTables as sub><#rt/>
+
+ <#if sub.foreignRelationType =='1'>
+ <${Format.humpToShortbar(sub.entityName)}-form ref="${sub.entityName?uncap_first}FormRef" :disabled="formDisabled">${Format.humpToShortbar(sub.entityName)}-form>
+ <#else>
+
+ #if>
+
+#list>
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei
new file mode 100644
index 00000000..24366e8d
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei
@@ -0,0 +1,69 @@
+<#include "/common/utils.ftl">
+
+
+ <${Format.humpToShortbar(entityName)}-form ref="formComponent" :disabled="formDisabled" @success="submitSuccess">${Format.humpToShortbar(entityName)}-form>
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei
new file mode 100644
index 00000000..303fdbef
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei
@@ -0,0 +1,149 @@
+<#include "/common/utils.ftl">
+<#list subTables as sub>
+<#if sub.foreignRelationType=='1'>
+#segment#${sub.entityName}Form.vue
+<#include "/common/utils.ftl">
+<#assign need_category = false>
+<#assign bpm_flag=false>
+<#assign need_pca = false>
+<#assign need_search = false>
+<#assign need_dept_user = false>
+<#assign need_switch = false>
+<#assign need_dept = false>
+<#assign need_multi = false>
+<#assign need_popup = false>
+<#assign need_select_tag = false>
+<#assign need_select_tree = false>
+<#assign need_time = false>
+<#assign need_markdown = false>
+<#assign need_upload = false>
+<#assign need_image_upload = false>
+<#assign need_editor = false>
+<#assign need_checkbox = false>
+<#assign form_span = 24>
+<#if tableVo.fieldRowNum==2>
+ <#assign form_span = 12>
+<#elseif tableVo.fieldRowNum==3>
+ <#assign form_span = 8>
+<#elseif tableVo.fieldRowNum==4>
+ <#assign form_span = 6>
+#if>
+ <#assign hasOnlyValidate = false>
+
+
+
+
+ <#list sub.colums as po>
+ <#if po.isShow == 'Y' && po.fieldValidType?default("") == 'only'>
+ <#assign hasOnlyValidate = true>
+ #if>
+ <#if po.fieldDbName=='bpm_status'>
+ <#assign bpm_flag=true>
+ #if>
+ <#include "/common/form/native/vue3NativeForm.ftl">
+ #list>
+
+
+
+
+
+
+#if>
+#list>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
index 4877656b..b2581f9e 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
@@ -196,17 +196,14 @@ public class ${entityName}Controller {
QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
- //Step.2 获取导出数据
- List<${entityName}> queryList = ${entityName?uncap_first}Service.list(queryWrapper);
- // 过滤选中数据
- String selections = request.getParameter("selections");
- List<${entityName}> ${entityName?uncap_first}List = new ArrayList<${entityName}>();
- if(oConvertUtils.isEmpty(selections)) {
- ${entityName?uncap_first}List = queryList;
- }else {
- List selectionList = Arrays.asList(selections.split(","));
- ${entityName?uncap_first}List = queryList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());
- }
+ //配置选中数据查询条件
+ String selections = request.getParameter("selections");
+ if(oConvertUtils.isNotEmpty(selections)) {
+ List selectionList = Arrays.asList(selections.split(","));
+ queryWrapper.in("id",selectionList);
+ }
+ //Step.2 获取导出数据
+ List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);
// Step.3 组装pageList
List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
index c861c4a1..4d1b4253 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
package ${bussiPackage}.${entityPackage}.entity;
import java.io.Serializable;
@@ -31,9 +32,9 @@ public class ${entityName} implements Serializable {
<#-- 生成字典Code -->
<#assign list_field_dictCode="">
<#if po.classType='sel_user'>
- <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'>
+ <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'>
<#elseif po.classType='sel_depart'>
- <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'>
+ <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'>
<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>
<#if po.dictTable?default("")?trim?length gt 1>
<#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
index b6aabe85..93ddf952 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
<#list subTables as subTab>
#segment#${subTab.entityName}.java
package ${bussiPackage}.${entityPackage}.entity;
@@ -32,9 +33,9 @@ public class ${subTab.entityName} implements Serializable {
<#-- 生成字典Code -->
<#assign list_field_dictCode="">
<#if po.classType='sel_user'>
- <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "realname", dicCode = "username"'>
+ <#assign list_field_dictCode=', dictTable = "sys_user", dicText = "${camelToDashed(po.extendParams.text?default(\"realname\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"username\")?trim)}"'>
<#elseif po.classType='sel_depart'>
- <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "depart_name", dicCode = "id"'>
+ <#assign list_field_dictCode=', dictTable = "sys_depart", dicText = "${camelToDashed(po.extendParams.text?default(\"depart_name\")?trim)}", dicCode = "${camelToDashed(po.extendParams.store?default(\"id\")?trim)}"'>
<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>
<#if po.dictTable?default("")?trim?length gt 1>
<#assign list_field_dictCode=', dictTable = "${po.dictTable}", dicText = "${po.dictText}", dicCode = "${po.dictField}"'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
index c503847d..5e82b9ed 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei
@@ -39,7 +39,7 @@
@input="popupCallback"
<#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='sel_depart'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if> <#if po.readonly=='Y'>disabled#if>>
<#elseif po.classType =='pca'>
@@ -49,7 +49,7 @@
<#elseif po.classType =='password'>
disabled#if>/>
<#elseif po.classType =='sel_user'>
- disabled#if>/>
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
disabled#if>/>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
index ca111ff8..ff5e255c 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei
@@ -44,7 +44,7 @@
:multi="${po.extendParams.popupMulti?c}"
@input="popupCallback"/>
<#elseif po.classType =='sel_depart'>
-
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if> />
<#elseif po.classType =='switch'>
:options="${po.dictField}"#if>>
<#elseif po.classType =='pca'>
@@ -54,7 +54,7 @@
<#elseif po.classType =='password'>
<#elseif po.classType =='sel_user'>
-
+ store="${po.extendParams.store}"#if><#if po.extendParams.text?default("")?trim?length gt 0> text="${po.extendParams.text}"#if> <#if po.readonly=='Y'>disabled#if>/>
<#elseif po.classType =='textarea'>
<#elseif po.classType=='list' || po.classType=='radio'>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
index fd577a11..6ba0f5bb 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei
@@ -46,6 +46,10 @@
+
+
+ {{ getAreaTextByCode(text) }}
+
无文件
下载
@@ -64,6 +68,10 @@
import ${entityName}Modal from './components/${entityName}Modal.vue'
import {columns, searchFormSchema} from './${entityName}.data';
import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';
+ import {downloadFile} from '/@/utils/common/renderUtils';
+<#if list_need_pca>
+ import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';
+#if>
<#if list_need_category>
import { loadCategoryData } from '/@/api/common/api'
import { getAuthCache, setAuthCache } from '/@/utils/auth';
@@ -84,6 +92,17 @@
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
+ fieldMapToNumber: [
+ <#list columns as po>
+ <#if po.isQuery=='Y'>
+ <#if po.queryMode!='single'>
+ <#if po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],
+ #if>
+ #if>
+ #if>
+ #list>
+ ],
fieldMapToTime: [
<#list columns as po>
<#if po.isQuery=='Y'>
@@ -98,9 +117,10 @@
#list>
],
},
- actionColumn: {
+ actionColumn: {
width: 120,
- },
+ fixed:'right'
+ },
},
exportConfig: {
name:"${tableVo.ftlDescription}",
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
index 6d77bc26..09e94e90 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
@@ -25,7 +26,7 @@ export const columns: BasicColumn[] = [
slots: { customRender: 'htmlSlot' },
<#elseif po.classType=='pca'>
dataIndex: '${po.fieldName}',
- slots: { customRender: 'pcaSlot' },//TODO 未翻译
+ slots: { customRender: 'pcaSlot' },
<#elseif po.classType=='file'>
dataIndex: '${po.fieldName}',
slots: { customRender: 'fileSlot' },
@@ -57,7 +58,7 @@ export const columns: BasicColumn[] = [
return render.renderCategoryTree(text,'${po.dictField?default("")}')
},
<#else>
- customRender: (text, record) => (text ? record['${po.dictText}'] : '')
+ customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')
#if>
<#else>
dataIndex: '${po.fieldName}'
@@ -95,16 +96,22 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='switch'>
component: 'JSwitch',
componentProps:{
+ query:true,
<#if po.dictField != 'is_open'>
- options:"${po.dictField}"
+ options:${po.dictField}
#if>
},
<#elseif po.classType=='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType=='list_multi'>
- component: 'JMultiSelectTag',//暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
- dictCode:"query_field_dictCode?default("")"
+ <#if po.dictTable?default("")?trim?length gt 1>
+ dictCode:"${po.dictTable},${po.dictText},${po.dictField}",
+ <#elseif po.dictField?default("")?trim?length gt 1>
+ dictCode:"${po.dictField}",
+ #if>
+ triggerChange: true
},
<#elseif po.classType=='cat_tree'>
component: 'JCategorySelect',
@@ -121,16 +128,7 @@ export const searchFormSchema: FormSchema[] = [
<#elseif po.classType=='pca'>
component: 'JAreaLinkage',
<#elseif po.classType=='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:"${po.dictField}",
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>
<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->
component: 'JDictSelectTag',
@@ -157,6 +155,8 @@ export const searchFormSchema: FormSchema[] = [
componentProps: {
showTime:true
},
+<#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>
+ component: 'JRangeNumber',
<#else>
component: 'Input', //TODO 范围查询
#if>
@@ -189,27 +189,19 @@ export const formSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
@@ -231,14 +223,14 @@ export const formSchema: FormSchema[] = [
labelKey:'realname',
},
<#elseif po.classType =='textarea'>
- component: 'InputTextArea',//TODO 注意string转换问题
+ component: 'InputTextArea',
<#elseif po.classType=='list' || po.classType=='radio'>
component: 'JDictSelectTag',
componentProps:{
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
},
@@ -273,7 +265,7 @@ export const formSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -305,16 +297,16 @@ export const formSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
@@ -373,10 +365,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
<#assign form_cat_tree = false>
<#assign form_cat_back = "">
<#assign bpm_flag=false>
+<#assign sub_id_exists = false>
<#list sub.colums as po><#rt/>
<#if po.fieldDbName=='bpm_status'>
<#assign bpm_flag=true>
#if>
+<#if po.fieldDbName == 'id'>
+ <#assign sub_id_exists = true>
+#if>
<#if po.isShow =='Y'>
<#assign form_field_dictCode="">
<#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>
@@ -386,27 +382,19 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
{
label: '${po.filedComment}',
- field: '${po.fieldName}',
+ field: ${autoStringSuffix(po)},
<#if po.classType =='date'>
component: 'DatePicker',
- <#elseif po.fieldType =='datetime'>
+ <#elseif po.classType =='datetime'>
component: 'DatePicker',
componentProps: {
- showTime:true
+ showTime:true,
+ valueFormat: 'YYYY-MM-DD HH:mm:ss'
},
- <#elseif po.fieldType =='time'>
+ <#elseif po.classType =='time'>
component: 'TimePicker',
<#elseif po.classType =='popup'>
- component: 'JPopup',
- componentProps: ({ formActionType }) => {
- const {setFieldsValue} = formActionType;
- return{
- setFieldsValue:setFieldsValue,
- code:"${po.dictTable}",
- fieldConfig:${po.dictField},
- multi:${po.extendParams.popupMulti?c},
- }
- },
+ <#include "/common/form/vue3popup.ftl">
<#elseif po.classType =='sel_depart'>
component: 'JSelectDept',
<#elseif po.classType =='switch'>
@@ -428,14 +416,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
labelKey:'realname',
},
<#elseif po.classType =='textarea'>
- component: 'InputTextArea',//TODO 注意string转换问题
+ component: 'InputTextArea',
<#elseif po.classType=='list' || po.classType=='radio'>
component: 'JDictSelectTag',
componentProps:{
dictCode:"${form_field_dictCode}"
},
<#elseif po.classType=='list_multi' || po.classType=='checkbox'>
- component: 'JMultiSelectTag',//TODO 暂无该组件
+ component: 'JSelectMultiple',
componentProps:{
dictCode:"${form_field_dictCode}"
},
@@ -470,7 +458,7 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
},
<#elseif po.classType=='umeditor'>
- component: 'JCodeEditor', //TODO String后缀暂未添加
+ component: 'JEditor',
<#elseif po.classType == 'sel_tree'>
component: 'JTreeSelect',
componentProps:{
@@ -502,16 +490,16 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
#if>
<#-- 唯一校验 -->
<#if fieldValidType == 'only'>
- {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema,true)[0]},
+ {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'#if>, '${po.fieldDbName}',model,schema)[0]},
<#-- 6到16位数字 -->
<#elseif fieldValidType == 'n6-16'>
{ pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},
<#-- 6到16位任意字符 -->
<#elseif fieldValidType == '*6-16'>
{ pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},
- <#-- 6到18位字符串 -->
+ <#-- 6到18位字母 -->
<#elseif fieldValidType == 's6-18'>
- { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},
+ { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},
<#-- 网址 -->
<#elseif fieldValidType == 'url'>
{ pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},
@@ -553,6 +541,14 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
},
#if>
#list>
+<#if sub_id_exists == false>
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false
+ },
+#if>
];
#if>
#list>
@@ -579,12 +575,20 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#if col.readonly=='Y'>
disabled:true,
#if>
+<#elseif col.classType =='time'>
+ type: JVxeTypes.time,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
<#elseif col.classType =='textarea'>
type: JVxeTypes.textarea,
<#if col.readonly=='Y'>
disabled:true,
#if>
-<#elseif "int,decimal,double,"?contains(col.classType)>
+<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
+<#-- elseif "int,decimal,double,"?contains(col.classType) -->
+<#elseif col.fieldDbType=='int' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>
+<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对,数字或者金额类型 -->
type: JVxeTypes.inputNumber,
<#if col.readonly=='Y'>
disabled:true,
@@ -621,6 +625,16 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#if col.readonly=='Y'>
disabled:true,
#if>
+<#elseif col.classType =='sel_depart'>
+ type: JVxeTypes.departSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
+<#elseif col.classType =='sel_user'>
+ type: JVxeTypes.userSelect,
+ <#if col.readonly=='Y'>
+ disabled:true,
+ #if>
<#elseif col.classType =='image'>
type: JVxeTypes.image,
token:true,
@@ -644,9 +658,9 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#elseif col.classType =='switch'>
type: JVxeTypes.checkbox,
<#if col.dictField == 'is_open'>
- customValue: ['Y', 'N'],
+ customValue: ['Y', 'N'],
<#else>
- customValue: ${col.dictField},
+ customValue: ${col.dictField},
#if>
<#if col.readonly=='Y'>
disabled:true,
@@ -657,14 +671,7 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
<#else>
<#assign popupBackFields = "${col.dictText}">
#if>
- type: JVxeTypes.popup,
- popupCode:"${col.dictTable}",
- field:"${col.dictField}",
- orgFields:"${col.dictField}",
- destFields:"${Format.underlineToHump(col.dictText)}",
- <#if col.readonly=='Y'>
- disabled:true,
- #if>
+ <#include "/common/form/vue3Jvxepopup.ftl">
<#else>
type: JVxeTypes.input,
<#if col.readonly=='Y'>
@@ -691,18 +698,7 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
defaultValue:'',
#if>
<#-- 子表的校验 -->
-<#assign subFieldValidType = col.fieldValidType!''>
-<#-- 非空校验 -->
-<#if col.nullable == 'N' || subFieldValidType == '*'>
- validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],
-<#-- 其他情况下,只要有值就被认为是正则校验 -->
-<#elseif subFieldValidType?length gt 0>
-<#assign subMessage = '格式不正确'>
-<#if subFieldValidType == 'only' >
- <#assign subMessage = '不能重复'>
-#if>
- validateRules: [{ pattern: "${subFieldValidType}", message: "${'$'}{title}${subMessage}" }],
-#if>
+ <#include "/common/validatorRulesTemplate/sub-vue3.ftl">
},
#if>
#if>
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
new file mode 100644
index 00000000..5396d5d5
--- /dev/null
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}_menu_insert.sql
@@ -0,0 +1 @@
+<#include "/common/sql/menu_insert.ftl">
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
index aa5fe59c..eade8bb2 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei
@@ -1,21 +1,22 @@
+<#include "/common/utils.ftl">
-
+
-
+
<#list subTables as sub><#rt/>
<#assign refKey = sub.entityName?uncap_first/>
<#if sub.foreignRelationType =='1'>
-
- <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form">${sub.entityName}Form>
+
+ <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form" :disabled="formDisabled">${sub.entityName}Form>
<#else>
-
+
'${sub.entityName?uncap_first}', #list>]);
<#assign hasOne2Many = false>
<#assign hasOne2One = false>
@@ -81,6 +85,7 @@
labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
//表单赋值
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {
@@ -88,6 +93,7 @@
await reset();
setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});
isUpdate.value = !!data?.isUpdate;
+ formDisabled.value = !data?.showFooter;
if (unref(isUpdate)) {
//表单赋值
await setFieldsValue({
@@ -109,9 +115,21 @@
});
//方法配置
const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm#if>);
-
- //设置标题
- const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
+ // 弹窗tabs滚动区域的高度
+ const tabsStyle = computed(() => {
+ let height: Nullable = null
+ let minHeight = '100px'
+ let maxHeight: Nullable = '500px'
+ // 弹窗wrapper
+ let modalWrapperRef = modalRef.value?.modalWrapperRef
+ if (modalWrapperRef) {
+ if (modalWrapperRef.fullScreen) {
+ height = 'calc(' + modalWrapperRef.spinStyle.height + ' - 50px)';
+ maxHeight = null
+ }
+ }
+ return {height, minHeight, maxHeight}
+ })
async function reset(){
await resetFields();
@@ -180,5 +198,38 @@
+
+
\ No newline at end of file
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
index 6af0c523..9969aaf1 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei
@@ -1,3 +1,4 @@
+<#include "/common/utils.ftl">
<#list subTables as sub>
<#if sub.foreignRelationType=='1'>
#segment#${sub.entityName}Form.vue
@@ -15,11 +16,18 @@
name:"${sub.entityName}Form",
components: {BasicForm},
emits:['register'],
- setup(_,{emit}) {
- const [registerForm, {resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({
+ props:{
+ disabled: {
+ type: Boolean,
+ default: false
+ }
+ },
+ setup(props,{emit}) {
+ const [registerForm, {setProps, resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({
labelWidth: 150,
schemas: ${sub.entityName?uncap_first}FormSchema,
showActionButtonGroup: false,
+ baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}
});
/**
*初始化加载数据
@@ -30,12 +38,19 @@
res.success && setFieldsValue({...res.result[0]});
})
}
+ setProps({disabled: props.disabled})
}
/**
*获取表单数据
*/
function getFormData(){
- return [getFieldsValue()];
+ let formData = getFieldsValue();
+ Object.keys(formData).map(k=>{
+ if(formData[k] instanceof Array){
+ formData[k] = formData[k].join(',')
+ }
+ });
+ return [formData];
}
/**
*表单校验
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
index 98092f3e..79b8d13b 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
@@ -78,11 +78,11 @@ export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [
{
title: '${col.filedComment}',
key: '${col.fieldName}',
-<#if col.classType =='date'>
+<#if col.fieldType =='date'>
type: JVxeTypes.date,
-<#elseif col.classType =='datetime'>
+<#elseif col.fieldType =='datetime'>
type: JVxeTypes.datetime,
-<#elseif "int,decimal,double,"?contains(col.classType)>
+<#elseif "int,decimal,double,"?contains(col.fieldType)>
type: JVxeTypes.inputNumber,
<#else>
type: JVxeTypes.input,
diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
index 8b147487..8d8ac1c6 100644
--- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
+++ b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi
@@ -103,7 +103,11 @@ export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [
<#if po.fieldType =='date'>
component: 'DatePicker',
<#elseif po.fieldType =='datetime'>
- component: 'TimePicker',
+ component: 'DatePicker',
+ componentProps: {
+ showTime: true,
+ valueFormat: 'YYYY-MM-DD hh:mm:ss',
+ },
<#elseif "int,decimal,double,"?contains(po.fieldType)>
component: 'InputNumber',
<#else>