diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei deleted file mode 100644 index 70ea973..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei +++ /dev/null @@ -1,244 +0,0 @@ -<template> - <div> -<#assign list_need_category=false> -<#assign list_need_pca=false> -<#assign bpm_flag=false> - -<#-- 开始循环 --> -<#list columns as po> -<#if po.fieldDbName=='bpm_status'> - <#assign bpm_flag=true> -</#if> -<#if po.classType=='cat_tree' && po.dictText?default("")?trim?length == 0> -<#assign list_need_category=true> -</#if> -<#if po.classType=='pca'> -<#assign list_need_pca=true> -</#if> -</#list> -<#-- 结束循环 --> - <!--引用表格--> - <BasicTable @register="registerTable" :rowSelection="rowSelection"> - <!--插槽:table标题--> - <template #tableTitle> - <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button> - <ExcelButton :config="excelConfig"></ExcelButton> - <a-dropdown v-if="checkedKeys.length > 0"> - <template #overlay> - <a-menu> - <a-menu-item key="1" @click="batchHandleDelete"> - <Icon icon="ant-design:delete-outlined"></Icon> - 删除 - </a-menu-item> - </a-menu> - </template> - <a-button>批量操作 - <Icon icon="mdi:chevron-down"></Icon> - </a-button> - </a-dropdown> - </template> - <!--操作栏--> - <template #action="{ record }"> - <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/> - </template> - <!--字段回显插槽--> - <template #htmlSlot="{text}"> - <div v-html="text"></div> - </template> - <template #fileSlot="{text}"> - <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> - <a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button> - </template> - </BasicTable> - <!-- 表单区域 --> - <${entityName}Modal @register="registerModal" @success="handleSuccess"></${entityName}Modal> - </div> -</template> - -<script lang="ts" setup> - import {ref, computed, unref} from 'vue'; - import {BasicTable, useTable, TableAction} from '/@/components/Table'; - import ExcelButton from '/@/components/jeecg/ExcelButton.vue' - import {useModal} from '/@/components/Modal'; - import ${entityName}Modal from './components/${entityName}Modal.vue' - import {columns, searchFormSchema} from './${entityName?uncap_first}.data'; - import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName?uncap_first}.api'; - <#if list_need_category> - import { loadCategoryData } from '/@/api/common/api' - import { getAuthCache, setAuthCache } from '/@/utils/auth'; - import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum'; - </#if> - const checkedKeys = ref<Array<string | number>>([]); - //注册model - const [registerModal, {openModal}] = useModal(); - //注册table数据 - const [registerTable, {reload}] = useTable({ - title: '${tableVo.ftlDescription}', - api: list, - rowKey: 'id', - columns, - formConfig: { - labelWidth: 120, - schemas: searchFormSchema, - autoSubmitOnEnter:true, - showAdvancedButton:true, - 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> - ], - }, - striped: true, - useSearchForm: true, - showTableSetting: true, - clickToRowSelect: false, - bordered: true, - showIndexColumn: false, - tableSetting: {fullScreen: true}, - actionColumn: { - width: 120, - title: '操作', - dataIndex: 'action', - slots: {customRender: 'action'}, - fixed: 'right', - }, - }) - /** - * excel导入导出配置 - */ - const excelConfig = { - export: { - name:'${tableVo.ftlDescription}', - url: getExportUrl, - }, - import: { - url: getImportUrl, - success: reload, - } - } - /** - * 选择列配置 - */ - const rowSelection = { - type: 'checkbox', - columnWidth: 30, - selectedRowKeys: checkedKeys, - onChange: onSelectChange - } - /** - * 选择事件 - */ - function onSelectChange(selectedRowKeys: (string | number)[]) { - checkedKeys.value = selectedRowKeys; - } - /** - * 新增事件 - */ - function handleAdd() { - openModal(true, { - isUpdate: false, - showFooter: true, - }); - } - /** - * 编辑事件 - */ - function handleEdit(record: Recordable) { - openModal(true, { - record, - isUpdate: true, - showFooter: true, - }); - } - /** - * 详情 - */ - function handleDetail(record: Recordable) { - openModal(true, { - record, - isUpdate: true, - showFooter: false, - }); - } - /** - * 删除事件 - */ - async function handleDelete(record) { - await deleteOne({id: record.id}, reload); - } - /** - * 批量删除事件 - */ - async function batchHandleDelete() { - await batchDelete({ids: checkedKeys.value}, reload); - } - /** - * 成功回调 - */ - function handleSuccess() { - reload(); - } - /** - * 操作栏 - */ - function getTableAction(record){ - return [ - { - label: '编辑', - onClick: handleEdit.bind(null, record), - } - ] - } - /** - * 下拉操作栏 - */ - function getDropDownAction(record){ - return [ - { - label: '详情', - onClick: handleDetail.bind(null, record), - }, { - label: '删除', - popConfirm: { - title: '是否确认删除', - confirm: handleDelete.bind(null, record), - } - } - ] - } - <#if list_need_category> - /** - * 初始化字典配置 - */ - function initDictConfig(){ - <#list columns as po> - <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'> - <#if po.classType=='cat_tree' && list_need_category==true> - loadCategoryData({code:'${po.dictField?default("")}'}).then((res) => { - if (res) { - let allDictDate = getAuthCache(DB_DICT_DATA_KEY); - if(!allDictDate['${po.dictField?default("")}']){ - Object.assign(allDictDate,{'${po.dictField?default("")}':res}) - } - setAuthCache(DB_DICT_DATA_KEY,allDictDate) - } - }) - </#if> - </#if> - </#list> - } - initDictConfig(); - </#if> -</script> - -<style scoped> - -</style> \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi deleted file mode 100644 index c579f91..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi +++ /dev/null @@ -1,61 +0,0 @@ -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', -} -/** - * 导出api - * @param params - */ -export const getExportUrl = Api.exportXls; -/** - * 导入api - */ -export const getImportUrl = Api.importExcel; -/** - * 列表接口 - * @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}); -} diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi deleted file mode 100644 index 57949c5..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ /dev/null @@ -1,352 +0,0 @@ -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}', - 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' },//TODO 未翻译 - <#elseif po.classType=='file'> - dataIndex: '${po.fieldName}', - slots: { customRender: 'fileSlot' }, - <#elseif po.classType=='image'> - dataIndex: '${po.fieldName}', - customRender:render.renderAvatar, - <#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: 'JMultiSelectTag',//暂无该组件 - componentProps:{ - dictCode:"query_field_dictCode?default("")" - }, - <#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'> - component: 'JPopup', - componentProps: ({ formActionType }) => { - const {setFieldsValue} = formActionType; - return{ - setFieldsValue:setFieldsValue, - code:"${po.dictTable}", - fieldConfig:"${po.dictField}", - multi:${po.extendParams.popupMulti?c}, - } - }, -<#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> -<#else> - { - label: "${po.filedComment}", - field: "${po.fieldName}", -<#if po.classType=='date'> - component: 'RangePicker', -<#elseif po.classType=='datetime'> - component: 'RangePicker', - componentProps: { - showTime:true - }, -<#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> -<#list columns as po><#rt/> -<#if po.fieldDbName=='bpm_status'> - <#assign bpm_flag=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: '${po.fieldName}', - <#if po.classType =='date'> - component: 'DatePicker', - <#elseif po.fieldType =='datetime'> - component: 'DatePicker', - componentProps: { - showTime:true - }, - <#elseif po.fieldType =='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}, - } - } - <#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',//TODO 注意string转换问题 - <#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 暂无该组件 - 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: 'JCodeEditor', //TODO String后缀暂未添加 - <#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,true)[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> -]; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei deleted file mode 100644 index 1570c46..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei +++ /dev/null @@ -1,58 +0,0 @@ -<template> - <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit"> - <BasicForm @register="registerForm"/> - </BasicModal> -</template> - -<script lang="ts" setup> - import {ref, computed, unref} from 'vue'; - import {BasicModal, useModalInner} from '/@/components/Modal'; - import {BasicForm, useForm} from '/@/components/Form/index'; - import {formSchema} from '../${entityName?uncap_first}.data'; - import {saveOrUpdate} from '../${entityName?uncap_first}.api'; - // Emits声明 - const emit = defineEmits(['register','success']); - const isUpdate = ref(true); - //表单配置 - const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({ - labelWidth: 150, - schemas: formSchema, - showActionButtonGroup: false, - }); - //表单赋值 - const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => { - //重置表单 - await resetFields(); - setModalProps({confirmLoading: false,showFooter:!!data?.showFooter}); - isUpdate.value = !!data?.isUpdate; - if (unref(isUpdate)) { - //表单赋值 - await setFieldsValue({ - ...data.record, - }); - } - // 隐藏底部时禁用整个表单 - setProps({ disabled: !data?.showFooter }) - }); - //设置标题 - const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑')); - //表单提交事件 - async function handleSubmit(v) { - try { - let values = await validate(); - setModalProps({confirmLoading: true}); - //提交表单 - await saveOrUpdate(values, isUpdate.value); - //关闭弹窗 - closeModal(); - //刷新列表 - emit('success'); - } finally { - setModalProps({confirmLoading: false}); - } - } -</script> - -<style lang="less" scoped> - -</style> \ 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}/vue3/${entityName}__api.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi deleted file mode 100644 index df69b12..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi +++ /dev/null @@ -1,82 +0,0 @@ -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} = '/sys/${entityName?uncap_first}/delete', - deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch', - 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}); -/** - * 删除 - */ -export const delete${entityName} = (params,handleSuccess) => { - return defHttp.delete({url: Api.delete${entityName}, params}, {joinParamsToUrl: true}).then(() => { - handleSuccess(); - }); -} -/** - * 批量删除 - * @param params - */ -export const batchDelete${entityName} = (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 saveOrUpdateDict = (params, isUpdate) => { - let url = isUpdate ? Api.edit : Api.save; - return defHttp.post({url: url, params}); -} -/** - * 查询全部树形节点数据 - * @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}/vue3/${entityName}__data.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi deleted file mode 100644 index 57949c5..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ /dev/null @@ -1,352 +0,0 @@ -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}', - 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' },//TODO 未翻译 - <#elseif po.classType=='file'> - dataIndex: '${po.fieldName}', - slots: { customRender: 'fileSlot' }, - <#elseif po.classType=='image'> - dataIndex: '${po.fieldName}', - customRender:render.renderAvatar, - <#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: 'JMultiSelectTag',//暂无该组件 - componentProps:{ - dictCode:"query_field_dictCode?default("")" - }, - <#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'> - component: 'JPopup', - componentProps: ({ formActionType }) => { - const {setFieldsValue} = formActionType; - return{ - setFieldsValue:setFieldsValue, - code:"${po.dictTable}", - fieldConfig:"${po.dictField}", - multi:${po.extendParams.popupMulti?c}, - } - }, -<#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> -<#else> - { - label: "${po.filedComment}", - field: "${po.fieldName}", -<#if po.classType=='date'> - component: 'RangePicker', -<#elseif po.classType=='datetime'> - component: 'RangePicker', - componentProps: { - showTime:true - }, -<#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> -<#list columns as po><#rt/> -<#if po.fieldDbName=='bpm_status'> - <#assign bpm_flag=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: '${po.fieldName}', - <#if po.classType =='date'> - component: 'DatePicker', - <#elseif po.fieldType =='datetime'> - component: 'DatePicker', - componentProps: { - showTime:true - }, - <#elseif po.fieldType =='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}, - } - } - <#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',//TODO 注意string转换问题 - <#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 暂无该组件 - 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: 'JCodeEditor', //TODO String后缀暂未添加 - <#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,true)[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> -]; diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei deleted file mode 100644 index 2360e9b..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei +++ /dev/null @@ -1,87 +0,0 @@ -<template> - <BasicModal v-bind="$attrs" @register="registerModal" :title="getTitle" @ok="handleSubmit"> - <BasicForm @register="registerForm"/> - </BasicModal> -</template> -<script lang="ts" setup> - import {ref, computed, unref} from 'vue'; - import {BasicModal, useModalInner} from '/src/components/Modal'; - import {BasicForm, useForm} from '/src/components/Form'; - import {formSchema} from '../${entityName?uncap_first}.data'; - import {loadTreeData, saveOrUpdateDict} from '../${entityName?uncap_first}.api'; - // 获取emit - const emit = defineEmits(['register', 'success']); - const isUpdate = ref(true); - const expandedRowKeys = ref([]); - const treeData = ref([]); - //表单配置 - const [registerForm, {resetFields, setFieldsValue, validate, updateSchema}] = useForm({ - schemas: formSchema, - showActionButtonGroup: false, - labelCol: { - xs: { span: 24 }, - sm: { span: 4 }, - }, - wrapperCol: { - xs: { span: 24 }, - sm: { span: 18 }, - }, - }); - //表单赋值 - const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => { - //重置表单 - await resetFields(); - expandedRowKeys.value = []; - setModalProps({confirmLoading: false, minHeight: 80}); - isUpdate.value = !!data?.isUpdate; - if (data?.record) { - //表单赋值 - await setFieldsValue({ - ...data.record, - }); - } - //父级节点树信息 - treeData.value = await loadTreeData({'async': false,'pcode':''}); - updateSchema({ - field: 'pid', - componentProps: {treeData}, - }); - }); - //设置标题 - const getTitle = computed(() => (!unref(isUpdate) ? '新增字典' : '编辑字典')); - - /** - * 根据pid获取展开的节点 - * @param pid - * @param arr - */ - function getExpandKeysByPid(pid,arr){ - if(pid && arr && arr.length>0){ - for(let i=0;i<arr.length;i++){ - if(arr[i].key==pid && unref(expandedRowKeys).indexOf(pid)<0){ - expandedRowKeys.value.push(arr[i].key); - getExpandKeysByPid(arr[i]['parentId'],unref(treeData)) - }else{ - getExpandKeysByPid(pid,arr[i].children) - } - } - } - } - //表单提交事件 - async function handleSubmit() { - try { - let values = await validate(); - setModalProps({confirmLoading: true}); - //提交表单 - await saveOrUpdateDict(values, isUpdate.value); - //关闭弹窗 - closeModal(); - //展开的节点信息 - await getExpandKeysByPid(values['pid'],unref(treeData)) - //刷新列表(isUpdate:是否编辑;values:表单信息;expandedArr:展开的节点信息) - emit('success', {isUpdate: unref(isUpdate), values:{...values},expandedArr: unref(expandedRowKeys).reverse()}); - } finally { - setModalProps({confirmLoading: false}); - } - } -</script> diff --git a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/index.vuei b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/index.vuei deleted file mode 100644 index ca91976..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/index.vuei +++ /dev/null @@ -1,295 +0,0 @@ -<template> - <div class="p-4"> - <!--引用表格--> - <BasicTable @register="registerTable" :rowSelection="rowSelection" :expandedRowKeys="expandedRowKeys" @expand="handleExpand" @fetch-success="onFetchSuccess"> - <!--插槽:table标题--> - <template #tableTitle> - <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增</a-button> - <a-upload name="file" :showUploadList="false" :customRequest="(file)=>handleImportXls(file,getImportUrl,importSuccess)"> - <a-button type="primary" preIcon="ant-design:import-outlined">导入</a-button> - </a-upload> - <a-button type="primary" preIcon="ant-design:export-outlined" @click="handleExportXls('${tableVo.ftlDescription}管理',getExportUrl)"> 导出</a-button> - - <a-dropdown v-if="checkedKeys.length > 0"> - <template #overlay> - <a-menu> - <a-menu-item key="1" @click="batchHandleDelete"> - <Icon icon="ant-design:delete-outlined"></Icon> - 删除 - </a-menu-item> - </a-menu> - </template> - <a-button>批量操作 - <Icon icon="ant-design:down-outlined"></Icon> - </a-button> - </a-dropdown> - </template> - <!--操作栏--> - <template #action="{ record }"> - <TableAction :actions="getTableAction(record)"/> - </template> - </BasicTable> - <!--字典弹窗--> - <${entityName}Modal @register="registerModal" @success="handleSuccess"/> - </div> -</template> - -<script lang="ts" setup> - //ts语法 - import {ref, computed, unref, toRaw, nextTick} from 'vue'; - import {BasicTable, useTable, TableAction} from '/src/components/Table'; - import {useDrawer} from '/src/components/Drawer'; - import ${entityName}Modal from './components/${entityName}Modal.vue'; - import {useModal} from '/src/components/Modal'; - import {useMethods} from '/src/hooks/system/useMethods'; - import {columns} from './${entityName}.data'; - import {list, delete${entityName}, batchDelete${entityName}, getExportUrl,getImportUrl, getChildList,getChildListBatch} from './${entityName}.api'; - - const checkedKeys = ref<Array<string | number>>([]); - const expandedRowKeys = ref([]); - const {handleExportXls,handleImportXls} = useMethods(); - //字典model - const [registerModal, {openModal}] = useModal(); - //注册table数据 - const [registerTable, {reload, collapseAll, updateTableDataRecord, findTableDataRecord,getDataSource}] = useTable({ - api: list, - rowKey: 'id', - columns, - striped: true, - useSearchForm: false, - showTableSetting: true, - clickToRowSelect: false, - bordered: true, - showIndexColumn: false, - tableSetting: {fullScreen: true}, - canResize: false, - actionColumn: { - width: 80, - title: '操作', - dataIndex: 'action', - slots: {customRender: 'action'}, - fixed: undefined, - }, - }) - - /** - * 选择列配置 - */ - const rowSelection = { - type: 'checkbox', - columnWidth: 10, - selectedRowKeys: checkedKeys, - onChange: onSelectChange - } - - /** - * 选择事件 - */ - function onSelectChange(selectedRowKeys: (string | number)[]) { - checkedKeys.value = selectedRowKeys; - } - - /** - * 新增事件 - */ - function handleCreate() { - openModal(true, { - isUpdate: false, - }); - } - - /** - * 编辑事件 - */ - async function handleEdit(record) { - openModal(true, { - record, - isUpdate: true, - }); - } - - /** - * 详情 - */ - async function handleDetail(record) { - openModal(true, { - record, - isUpdate: true, - hideFooter: true, - }); - } - - /** - * 删除事件 - */ - async function handleDelete(record) { - await delete${entityName}({id: record.id}, importSuccess); - - } - - /** - * 批量删除事件 - */ - async function batchHandleDelete() { - const ids = checkedKeys.value.filter(item => !item.includes('loading')) - await batchDelete${entityName}({ids: ids}, importSuccess); - } - /** - * 导入 - */ - function importSuccess() { - reload() && (expandedRowKeys.value = []); - } - /** - * 添加下级 - */ - function handleAddSub(record) { - openModal(true, { - record, - isUpdate: false, - }); - } - /** - * 成功回调 - */ - async function handleSuccess({isUpdate, values, expandedArr}) { - if (isUpdate) { - //编辑回调 - updateTableDataRecord(values.id, values); - } else { - if(!values['pid']){ - //新增根节点 - reload(); - }else{ - //新增子集 - expandedRowKeys.value = []; - for (let key of unref(expandedArr)) { - await expandTreeNode(key) - } - } - } - } - - /** - * 接口请求成功后回调 - */ - function onFetchSuccess(result) { - getDataByResult(result.items)&&loadDataByExpandedRows(); - } - /** - * 根据已展开的行查询数据(用于保存后刷新时异步加载子级的数据) - */ - async function loadDataByExpandedRows() { - if (unref(expandedRowKeys).length > 0) { - const res = await getChildListBatch({ parentIds: unref(expandedRowKeys).join(',')}); - if (res.success && res.result.records.length>0) { - //已展开的数据批量子节点 - let records = res.result.records - const listMap = new Map(); - for (let item of records) { - let pid = item['pid']; - if (unref(expandedRowKeys).includes(pid)) { - let mapList = listMap.get(pid); - if (mapList == null) { - mapList = []; - } - mapList.push(item); - listMap.set(pid, mapList); - } - } - let childrenMap = listMap; - let fn = (list) => { - if(list) { - list.forEach(data => { - if (unref(expandedRowKeys).includes(data.id)) { - data.children = getDataByResult(childrenMap.get(data.id)) - fn(data.children) - } - }) - } - }; - fn(getDataSource()) - } - } - } - /** - * 处理数据集 - */ - function getDataByResult(result){ - if(result && result.length>0){ - return result.map(item=>{ - //判断是否标记了带有子节点 - if(item["hasChild"]=='1'){ - let loadChild = { id: item.id+'_loadChild', name: 'loading...', isLoading: true } - item.children = [loadChild] - } - return item - }) - } - } - /** - *树节点展开合并 - * */ - async function handleExpand(expanded, record) { - // 判断是否是展开状态,展开状态(expanded)并且存在子集(children)并且未加载过(isLoading)的就去查询子节点数据 - if (expanded) { - expandedRowKeys.value.push(record.id) - if (record.children.length > 0 && !!record.children[0].isLoading) { - let result = await getChildList({pid: record.id}); - result=result.records?result.records:result; - if (result && result.length > 0) { - record.children = getDataByResult(result); - } else { - record.children = null - record.hasChild = '0' - } - } - } else { - let keyIndex = expandedRowKeys.value.indexOf(record.id) - if (keyIndex >= 0) { - expandedRowKeys.value.splice(keyIndex, 1); - } - } - } - /** - *操作表格后处理树节点展开合并 - * */ - async function expandTreeNode(key) { - let record = findTableDataRecord(key) - expandedRowKeys.value.push(key); - let result = await getChildList({pid: key}); - if (result && result.length > 0) { - record.children = getDataByResult(result); - } else { - record.children = null - record.hasChild = '0' - } - updateTableDataRecord(key, record); - } - /** - * 操作栏 - */ - function getTableAction(record) { - return [ - { - label: '编辑', - onClick: handleEdit.bind(null, record), - }, - { - label: '删除', - popConfirm: { - title: '确定删除吗?', - confirm: handleDelete.bind(null, record), - }, - }, - { - label: '添加下级', - onClick: handleAddSub.bind(null, {pid: record.id}), - } - ] - } -</script> - -<style scoped> - -</style> 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 deleted file mode 100644 index 70ea973..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei +++ /dev/null @@ -1,244 +0,0 @@ -<template> - <div> -<#assign list_need_category=false> -<#assign list_need_pca=false> -<#assign bpm_flag=false> - -<#-- 开始循环 --> -<#list columns as po> -<#if po.fieldDbName=='bpm_status'> - <#assign bpm_flag=true> -</#if> -<#if po.classType=='cat_tree' && po.dictText?default("")?trim?length == 0> -<#assign list_need_category=true> -</#if> -<#if po.classType=='pca'> -<#assign list_need_pca=true> -</#if> -</#list> -<#-- 结束循环 --> - <!--引用表格--> - <BasicTable @register="registerTable" :rowSelection="rowSelection"> - <!--插槽:table标题--> - <template #tableTitle> - <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button> - <ExcelButton :config="excelConfig"></ExcelButton> - <a-dropdown v-if="checkedKeys.length > 0"> - <template #overlay> - <a-menu> - <a-menu-item key="1" @click="batchHandleDelete"> - <Icon icon="ant-design:delete-outlined"></Icon> - 删除 - </a-menu-item> - </a-menu> - </template> - <a-button>批量操作 - <Icon icon="mdi:chevron-down"></Icon> - </a-button> - </a-dropdown> - </template> - <!--操作栏--> - <template #action="{ record }"> - <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/> - </template> - <!--字段回显插槽--> - <template #htmlSlot="{text}"> - <div v-html="text"></div> - </template> - <template #fileSlot="{text}"> - <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> - <a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button> - </template> - </BasicTable> - <!-- 表单区域 --> - <${entityName}Modal @register="registerModal" @success="handleSuccess"></${entityName}Modal> - </div> -</template> - -<script lang="ts" setup> - import {ref, computed, unref} from 'vue'; - import {BasicTable, useTable, TableAction} from '/@/components/Table'; - import ExcelButton from '/@/components/jeecg/ExcelButton.vue' - import {useModal} from '/@/components/Modal'; - import ${entityName}Modal from './components/${entityName}Modal.vue' - import {columns, searchFormSchema} from './${entityName?uncap_first}.data'; - import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName?uncap_first}.api'; - <#if list_need_category> - import { loadCategoryData } from '/@/api/common/api' - import { getAuthCache, setAuthCache } from '/@/utils/auth'; - import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum'; - </#if> - const checkedKeys = ref<Array<string | number>>([]); - //注册model - const [registerModal, {openModal}] = useModal(); - //注册table数据 - const [registerTable, {reload}] = useTable({ - title: '${tableVo.ftlDescription}', - api: list, - rowKey: 'id', - columns, - formConfig: { - labelWidth: 120, - schemas: searchFormSchema, - autoSubmitOnEnter:true, - showAdvancedButton:true, - 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> - ], - }, - striped: true, - useSearchForm: true, - showTableSetting: true, - clickToRowSelect: false, - bordered: true, - showIndexColumn: false, - tableSetting: {fullScreen: true}, - actionColumn: { - width: 120, - title: '操作', - dataIndex: 'action', - slots: {customRender: 'action'}, - fixed: 'right', - }, - }) - /** - * excel导入导出配置 - */ - const excelConfig = { - export: { - name:'${tableVo.ftlDescription}', - url: getExportUrl, - }, - import: { - url: getImportUrl, - success: reload, - } - } - /** - * 选择列配置 - */ - const rowSelection = { - type: 'checkbox', - columnWidth: 30, - selectedRowKeys: checkedKeys, - onChange: onSelectChange - } - /** - * 选择事件 - */ - function onSelectChange(selectedRowKeys: (string | number)[]) { - checkedKeys.value = selectedRowKeys; - } - /** - * 新增事件 - */ - function handleAdd() { - openModal(true, { - isUpdate: false, - showFooter: true, - }); - } - /** - * 编辑事件 - */ - function handleEdit(record: Recordable) { - openModal(true, { - record, - isUpdate: true, - showFooter: true, - }); - } - /** - * 详情 - */ - function handleDetail(record: Recordable) { - openModal(true, { - record, - isUpdate: true, - showFooter: false, - }); - } - /** - * 删除事件 - */ - async function handleDelete(record) { - await deleteOne({id: record.id}, reload); - } - /** - * 批量删除事件 - */ - async function batchHandleDelete() { - await batchDelete({ids: checkedKeys.value}, reload); - } - /** - * 成功回调 - */ - function handleSuccess() { - reload(); - } - /** - * 操作栏 - */ - function getTableAction(record){ - return [ - { - label: '编辑', - onClick: handleEdit.bind(null, record), - } - ] - } - /** - * 下拉操作栏 - */ - function getDropDownAction(record){ - return [ - { - label: '详情', - onClick: handleDetail.bind(null, record), - }, { - label: '删除', - popConfirm: { - title: '是否确认删除', - confirm: handleDelete.bind(null, record), - } - } - ] - } - <#if list_need_category> - /** - * 初始化字典配置 - */ - function initDictConfig(){ - <#list columns as po> - <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'> - <#if po.classType=='cat_tree' && list_need_category==true> - loadCategoryData({code:'${po.dictField?default("")}'}).then((res) => { - if (res) { - let allDictDate = getAuthCache(DB_DICT_DATA_KEY); - if(!allDictDate['${po.dictField?default("")}']){ - Object.assign(allDictDate,{'${po.dictField?default("")}':res}) - } - setAuthCache(DB_DICT_DATA_KEY,allDictDate) - } - }) - </#if> - </#if> - </#list> - } - initDictConfig(); - </#if> -</script> - -<style scoped> - -</style> \ 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/${entityName}__api.tsi b/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi deleted file mode 100644 index 3b9ce59..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi +++ /dev/null @@ -1,72 +0,0 @@ -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', -<#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 ${sub.entityName?uncap_first}List = Api.${sub.entityName?uncap_first}List; -</#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}); -} 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 deleted file mode 100644 index 4380bc2..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi +++ /dev/null @@ -1,698 +0,0 @@ -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' },//TODO 未翻译 - <#elseif po.classType=='file'> - dataIndex: '${po.fieldName}', - slots: { customRender: 'fileSlot' }, - <#elseif po.classType=='image'> - dataIndex: '${po.fieldName}', - customRender:render.renderAvatar, - <#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: 'JMultiSelectTag',//暂无该组件 - componentProps:{ - dictCode:"query_field_dictCode?default("")" - }, - <#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'> - component: 'JPopup', - componentProps: ({ formActionType }) => { - const {setFieldsValue} = formActionType; - return{ - setFieldsValue:setFieldsValue, - code:"${po.dictTable}", - fieldConfig:"${po.dictField}", - multi:${po.extendParams.popupMulti?c}, - } - }, -<#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> -<#else> - { - label: "${po.filedComment}", - field: "${po.fieldName}", -<#if po.classType=='date'> - component: 'RangePicker', -<#elseif po.classType=='datetime'> - component: 'RangePicker', - componentProps: { - showTime:true - }, -<#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> -<#list columns as po><#rt/> -<#if po.fieldDbName=='bpm_status'> - <#assign bpm_flag=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: '${po.fieldName}', - <#if po.classType =='date'> - component: 'DatePicker', - <#elseif po.fieldType =='datetime'> - component: 'DatePicker', - componentProps: { - showTime:true - }, - <#elseif po.fieldType =='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}, - } - } - <#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',//TODO 注意string转换问题 - <#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 暂无该组件 - 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: 'JCodeEditor', //TODO String后缀暂未添加 - <#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,true)[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> -]; -//子表单数据 -<#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> -<#list sub.colums as po><#rt/> -<#if po.fieldDbName=='bpm_status'> - <#assign bpm_flag=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: '${po.fieldName}', - <#if po.classType =='date'> - component: 'DatePicker', - <#elseif po.fieldType =='datetime'> - component: 'DatePicker', - componentProps: { - showTime:true - }, - <#elseif po.fieldType =='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}, - } - } - <#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',//TODO 注意string转换问题 - <#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 暂无该组件 - 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: 'JCodeEditor', //TODO String后缀暂未添加 - <#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,true)[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> -</#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 =='textarea'> - type: JVxeTypes.textarea, - <#if col.readonly=='Y'> - disabled:true, - </#if> -<#elseif "int,decimal,double,"?contains(col.classType)> - 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 =='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> - type: JVxeTypes.popup, - popupCode:"${col.dictTable}", - field:"${col.dictField}", - orgFields:"${col.dictField}", - destFields:"${Format.underlineToHump(col.dictText)}", - <#if col.readonly=='Y'> - disabled:true, - </#if> -<#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> -<#-- 子表的校验 --> -<#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> - }, -</#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}/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 deleted file mode 100644 index 590d2eb..0000000 --- a/jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei +++ /dev/null @@ -1,179 +0,0 @@ -<template> - <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit"> - <BasicForm @register="registerForm" ref="formRef"/> - <!-- 子表单区域 --> - <a-tabs v-model:activeKey="activeKey" @change="handleChangeTabs"> -<#list subTables as sub><#rt/> - <#if sub.foreignRelationType =='1'> - <a-tab-pane tab="${sub.ftlDescription}" :key="refKeys[${sub_index}]" :forceRender="true"> - <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form"></${sub.entityName}Form> - </a-tab-pane> - - <#else> - <a-tab-pane tab="${sub.ftlDescription}" :key="refKeys[${sub_index}]" :forceRender="true"> - <JVxeTable - keep-source - resizable - :ref="refKeys[${sub_index}]" - :loading="${sub.entityName?uncap_first}Table.loading" - :columns="${sub.entityName?uncap_first}Table.columns" - :dataSource="${sub.entityName?uncap_first}Table.dataSource" - :maxHeight="300" - :rowNumber="true" - :rowSelection="true" - :toolbar="true" - /> - </a-tab-pane> - </#if> -</#list> - </a-tabs> - </BasicModal> -</template> - -<script lang="ts" setup> - import {ref, computed, unref,reactive} from 'vue'; - import {BasicModal, useModalInner} from '/@/components/Modal'; - import {BasicForm, useForm} from '/@/components/Form/index'; - import { JVxeTable } from '/@/components/jeecg/JVxeTable' - import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts' - <#list subTables as sub> - <#if sub.foreignRelationType =='1'> - import ${sub.entityName}Form from './${sub.entityName}Form.vue' - </#if> - </#list> - import {formSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}Columns</#if></#list>} from '../${entityName?uncap_first}.data'; - import {saveOrUpdate<#list subTables as sub>,${sub.entityName?uncap_first}List</#list>} from '../${entityName?uncap_first}.api'; - import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils' - // Emits声明 - const emit = defineEmits(['register','success']); - const isUpdate = ref(true); - const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]); - <#assign hasOne2Many = false> - <#assign hasOne2One = false> - const activeKey = ref('${subTables[0].entityName?uncap_first}'); -<#list subTables as sub> -<#if sub.foreignRelationType =='0'> - <#assign hasOne2Many = true> - const ${sub.entityName?uncap_first} = ref(); -</#if> -<#if sub.foreignRelationType =='1'> - <#assign hasOne2One = true> - const ${sub.entityName?uncap_first}Form = ref(); -</#if> -</#list> - const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>}; - <#list subTables as sub> - <#if sub.foreignRelationType =='0'> - const ${sub.entityName?uncap_first}Table = reactive({ - loading: false, - dataSource: [], - columns:${sub.entityName?uncap_first}Columns - }) - </#if> - </#list> - //表单配置 - const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({ - labelWidth: 150, - schemas: formSchema, - showActionButtonGroup: false, - }); - //表单赋值 - const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => { - //重置表单 - await reset(); - setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter}); - isUpdate.value = !!data?.isUpdate; - if (unref(isUpdate)) { - //表单赋值 - await setFieldsValue({ - ...data.record, - }); - <#list subTables as sub><#rt/> - <#if sub.foreignRelationType =='1'> - ${sub.entityName?uncap_first}Form.value.initFormData(${sub.entityName?uncap_first}List,data?.record?.id) - </#if> - </#list> - <#list subTables as sub><#rt/> - <#if sub.foreignRelationType =='0'> - requestSubTableData(${sub.entityName?uncap_first}List, {id:data?.record?.id}, ${sub.entityName?uncap_first}Table) - </#if> - </#list> - } - // 隐藏底部时禁用整个表单 - setProps({ disabled: !data?.showFooter }) - }); - //方法配置 - const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm</#if>); - - //设置标题 - const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑')); - - async function reset(){ - await resetFields(); - activeKey.value = ref('${subTables[0].entityName?uncap_first}'); - <#list subTables as sub> - <#if sub.foreignRelationType =='0'> - ${sub.entityName?uncap_first}Table.dataSource = []; - </#if> - <#if sub.foreignRelationType =='1'> - ${sub.entityName?uncap_first}Form.value.resetFields(); - </#if> - </#list> - } - function classifyIntoFormData(allValues) { - let main = Object.assign({}, allValues.formValue) - return { - ...main, // 展开 - <#assign subManyIndex = 0> - <#list subTables as sub><#rt/> - <#if sub.foreignRelationType =='0'> - ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData, - <#assign subManyIndex = subManyIndex+1> - <#else> - ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(), - </#if> - </#list> - } - } - <#if hasOne2One==true> - //校验所有一对一子表表单 - function validateSubForm(allValues){ - return new Promise((resolve,reject)=>{ - Promise.all([ - <#list subTables as sub><#rt/> - <#if sub.foreignRelationType =='1'> - ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index}), - </#if> - </#list> - ]).then(() => { - resolve(allValues) - }).catch(e => { - if (e.error === VALIDATE_FAILED) { - // 如果有未通过表单验证的子表,就自动跳转到它所在的tab - activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index] - } else { - console.error(e) - } - }) - }) - } - </#if> - //表单提交事件 - async function requestAddOrEdit(values) { - try { - setModalProps({confirmLoading: true}); - //提交表单 - await saveOrUpdate(values, isUpdate.value); - //关闭弹窗 - closeModal(); - //刷新列表 - emit('success'); - } finally { - setModalProps({confirmLoading: false}); - } - } -</script> - -<style lang="less" scoped> - -</style> \ 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 deleted file mode 100644 index afa4e7b..0000000 --- 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 +++ /dev/null @@ -1,64 +0,0 @@ -<#list subTables as sub> -<#if sub.foreignRelationType=='1'> -#segment#${sub.entityName}Form.vue -<template> - <BasicForm @register="registerForm"/> -</template> -<script lang="ts"> - import {defineComponent} from 'vue'; - import {BasicForm, useForm} from '/@/components/Form/index'; - import {${sub.entityName?uncap_first}FormSchema} from '../${entityName?uncap_first}.data'; - import {defHttp} from '/@/utils/http/axios'; - import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils' - - export default defineComponent({ - name:"${sub.entityName}Form", - components: {BasicForm}, - emits:['register'], - setup(_,{emit}) { - const [registerForm, {resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({ - labelWidth: 150, - schemas: ${sub.entityName?uncap_first}FormSchema, - showActionButtonGroup: false, - }); - /** - *初始化加载数据 - */ - function initFormData(url,id){ - if(id){ - defHttp.get({url,params:{id}},{isTransformResponse:false}).then(res=>{ - res.success && setFieldsValue({...res.result[0]}); - }) - } - } - /** - *获取表单数据 - */ - function getFormData(){ - return [getFieldsValue()]; - } - /** - *表单校验 - */ - function validateForm(index){ - return new Promise((resolve, reject) => { - // 验证子表表单 - validate().then(()=>{ - return resolve() - }).catch(()=> { - return reject({ error: VALIDATE_FAILED ,index}) - }) - }) - } - return { - registerForm, - resetFields, - initFormData, - getFormData, - validateForm - } - } - }) -</script> -</#if> -</#list>