Commit ccac1c85311e3b9ab0befc9aef419f80c12a6eeb

Authored by zhangdaiscott
1 parent 78451b6e

暂时删除vue3模板,因为vue3前端项目未正式发布,减少大家的误解

Showing 13 changed files with 0 additions and 2788 deletions
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei deleted
1 -<template>  
2 - <div>  
3 -<#assign list_need_category=false>  
4 -<#assign list_need_pca=false>  
5 -<#assign bpm_flag=false>  
6 -  
7 -<#-- 开始循环 -->  
8 -<#list columns as po>  
9 -<#if po.fieldDbName=='bpm_status'>  
10 - <#assign bpm_flag=true>  
11 -</#if>  
12 -<#if po.classType=='cat_tree' && po.dictText?default("")?trim?length == 0>  
13 -<#assign list_need_category=true>  
14 -</#if>  
15 -<#if po.classType=='pca'>  
16 -<#assign list_need_pca=true>  
17 -</#if>  
18 -</#list>  
19 -<#-- 结束循环 -->  
20 - <!--引用表格-->  
21 - <BasicTable @register="registerTable" :rowSelection="rowSelection">  
22 - <!--插槽:table标题-->  
23 - <template #tableTitle>  
24 - <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>  
25 - <ExcelButton :config="excelConfig"></ExcelButton>  
26 - <a-dropdown v-if="checkedKeys.length > 0">  
27 - <template #overlay>  
28 - <a-menu>  
29 - <a-menu-item key="1" @click="batchHandleDelete">  
30 - <Icon icon="ant-design:delete-outlined"></Icon>  
31 - 删除  
32 - </a-menu-item>  
33 - </a-menu>  
34 - </template>  
35 - <a-button>批量操作  
36 - <Icon icon="mdi:chevron-down"></Icon>  
37 - </a-button>  
38 - </a-dropdown>  
39 - </template>  
40 - <!--操作栏-->  
41 - <template #action="{ record }">  
42 - <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>  
43 - </template>  
44 - <!--字段回显插槽-->  
45 - <template #htmlSlot="{text}">  
46 - <div v-html="text"></div>  
47 - </template>  
48 - <template #fileSlot="{text}">  
49 - <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>  
50 - <a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>  
51 - </template>  
52 - </BasicTable>  
53 - <!-- 表单区域 -->  
54 - <${entityName}Modal @register="registerModal" @success="handleSuccess"></${entityName}Modal>  
55 - </div>  
56 -</template>  
57 -  
58 -<script lang="ts" setup>  
59 - import {ref, computed, unref} from 'vue';  
60 - import {BasicTable, useTable, TableAction} from '/@/components/Table';  
61 - import ExcelButton from '/@/components/jeecg/ExcelButton.vue'  
62 - import {useModal} from '/@/components/Modal';  
63 - import ${entityName}Modal from './components/${entityName}Modal.vue'  
64 - import {columns, searchFormSchema} from './${entityName?uncap_first}.data';  
65 - import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName?uncap_first}.api';  
66 - <#if list_need_category>  
67 - import { loadCategoryData } from '/@/api/common/api'  
68 - import { getAuthCache, setAuthCache } from '/@/utils/auth';  
69 - import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';  
70 - </#if>  
71 - const checkedKeys = ref<Array<string | number>>([]);  
72 - //注册model  
73 - const [registerModal, {openModal}] = useModal();  
74 - //注册table数据  
75 - const [registerTable, {reload}] = useTable({  
76 - title: '${tableVo.ftlDescription}',  
77 - api: list,  
78 - rowKey: 'id',  
79 - columns,  
80 - formConfig: {  
81 - labelWidth: 120,  
82 - schemas: searchFormSchema,  
83 - autoSubmitOnEnter:true,  
84 - showAdvancedButton:true,  
85 - fieldMapToTime: [  
86 - <#list columns as po>  
87 - <#if po.isQuery=='Y'>  
88 - <#if po.queryMode!='single'>  
89 - <#if po.classType=='date'>  
90 - ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],  
91 - <#elseif po.classType=='datetime'>  
92 - ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],  
93 - </#if>  
94 - </#if>  
95 - </#if>  
96 - </#list>  
97 - ],  
98 - },  
99 - striped: true,  
100 - useSearchForm: true,  
101 - showTableSetting: true,  
102 - clickToRowSelect: false,  
103 - bordered: true,  
104 - showIndexColumn: false,  
105 - tableSetting: {fullScreen: true},  
106 - actionColumn: {  
107 - width: 120,  
108 - title: '操作',  
109 - dataIndex: 'action',  
110 - slots: {customRender: 'action'},  
111 - fixed: 'right',  
112 - },  
113 - })  
114 - /**  
115 - * excel导入导出配置  
116 - */  
117 - const excelConfig = {  
118 - export: {  
119 - name:'${tableVo.ftlDescription}',  
120 - url: getExportUrl,  
121 - },  
122 - import: {  
123 - url: getImportUrl,  
124 - success: reload,  
125 - }  
126 - }  
127 - /**  
128 - * 选择列配置  
129 - */  
130 - const rowSelection = {  
131 - type: 'checkbox',  
132 - columnWidth: 30,  
133 - selectedRowKeys: checkedKeys,  
134 - onChange: onSelectChange  
135 - }  
136 - /**  
137 - * 选择事件  
138 - */  
139 - function onSelectChange(selectedRowKeys: (string | number)[]) {  
140 - checkedKeys.value = selectedRowKeys;  
141 - }  
142 - /**  
143 - * 新增事件  
144 - */  
145 - function handleAdd() {  
146 - openModal(true, {  
147 - isUpdate: false,  
148 - showFooter: true,  
149 - });  
150 - }  
151 - /**  
152 - * 编辑事件  
153 - */  
154 - function handleEdit(record: Recordable) {  
155 - openModal(true, {  
156 - record,  
157 - isUpdate: true,  
158 - showFooter: true,  
159 - });  
160 - }  
161 - /**  
162 - * 详情  
163 - */  
164 - function handleDetail(record: Recordable) {  
165 - openModal(true, {  
166 - record,  
167 - isUpdate: true,  
168 - showFooter: false,  
169 - });  
170 - }  
171 - /**  
172 - * 删除事件  
173 - */  
174 - async function handleDelete(record) {  
175 - await deleteOne({id: record.id}, reload);  
176 - }  
177 - /**  
178 - * 批量删除事件  
179 - */  
180 - async function batchHandleDelete() {  
181 - await batchDelete({ids: checkedKeys.value}, reload);  
182 - }  
183 - /**  
184 - * 成功回调  
185 - */  
186 - function handleSuccess() {  
187 - reload();  
188 - }  
189 - /**  
190 - * 操作栏  
191 - */  
192 - function getTableAction(record){  
193 - return [  
194 - {  
195 - label: '编辑',  
196 - onClick: handleEdit.bind(null, record),  
197 - }  
198 - ]  
199 - }  
200 - /**  
201 - * 下拉操作栏  
202 - */  
203 - function getDropDownAction(record){  
204 - return [  
205 - {  
206 - label: '详情',  
207 - onClick: handleDetail.bind(null, record),  
208 - }, {  
209 - label: '删除',  
210 - popConfirm: {  
211 - title: '是否确认删除',  
212 - confirm: handleDelete.bind(null, record),  
213 - }  
214 - }  
215 - ]  
216 - }  
217 - <#if list_need_category>  
218 - /**  
219 - * 初始化字典配置  
220 - */  
221 - function initDictConfig(){  
222 - <#list columns as po>  
223 - <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>  
224 - <#if po.classType=='cat_tree' && list_need_category==true>  
225 - loadCategoryData({code:'${po.dictField?default("")}'}).then((res) => {  
226 - if (res) {  
227 - let allDictDate = getAuthCache(DB_DICT_DATA_KEY);  
228 - if(!allDictDate['${po.dictField?default("")}']){  
229 - Object.assign(allDictDate,{'${po.dictField?default("")}':res})  
230 - }  
231 - setAuthCache(DB_DICT_DATA_KEY,allDictDate)  
232 - }  
233 - })  
234 - </#if>  
235 - </#if>  
236 - </#list>  
237 - }  
238 - initDictConfig();  
239 - </#if>  
240 -</script>  
241 -  
242 -<style scoped>  
243 -  
244 -</style>  
245 \ No newline at end of file 0 \ No newline at end of file
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi deleted
1 -import {defHttp} from '/@/utils/http/axios';  
2 -import {Modal} from 'ant-design-vue';  
3 -  
4 -enum Api {  
5 - list = '/${entityPackage}/${entityName?uncap_first}/list',  
6 - save='/${entityPackage}/${entityName?uncap_first}/add',  
7 - edit='/${entityPackage}/${entityName?uncap_first}/edit',  
8 - deleteOne = '/${entityPackage}/${entityName?uncap_first}/delete',  
9 - deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',  
10 - importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',  
11 - exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',  
12 -}  
13 -/**  
14 - * 导出api  
15 - * @param params  
16 - */  
17 -export const getExportUrl = Api.exportXls;  
18 -/**  
19 - * 导入api  
20 - */  
21 -export const getImportUrl = Api.importExcel;  
22 -/**  
23 - * 列表接口  
24 - * @param params  
25 - */  
26 -export const list = (params) =>  
27 - defHttp.get({url: Api.list, params});  
28 -  
29 -/**  
30 - * 删除单个  
31 - */  
32 -export const deleteOne = (params,handleSuccess) => {  
33 - return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {  
34 - handleSuccess();  
35 - });  
36 -}  
37 -/**  
38 - * 批量删除  
39 - * @param params  
40 - */  
41 -export const batchDelete = (params, handleSuccess) => {  
42 - Modal.confirm({  
43 - title: '确认删除',  
44 - content: '是否删除选中数据',  
45 - okText: '确认',  
46 - cancelText: '取消',  
47 - onOk: () => {  
48 - return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {  
49 - handleSuccess();  
50 - });  
51 - }  
52 - });  
53 -}  
54 -/**  
55 - * 保存或者更新  
56 - * @param params  
57 - */  
58 -export const saveOrUpdate = (params, isUpdate) => {  
59 - let url = isUpdate ? Api.edit : Api.save;  
60 - return defHttp.post({url: url, params});  
61 -}  
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi deleted
1 -import {BasicColumn} from '/@/components/Table';  
2 -import {FormSchema} from '/@/components/Table';  
3 -import { rules} from '/@/utils/helper/validator';  
4 -import { render } from '/@/utils/common/renderUtils';  
5 -//列表数据  
6 -export const columns: BasicColumn[] = [  
7 - <#list columns as po>  
8 - <#if po.isShowList =='Y' && po.fieldName !='id'>  
9 - {  
10 - title: '${po.filedComment}',  
11 - align:"center",  
12 - <#if po.sort=='Y'>  
13 - sorter: true,  
14 - </#if>  
15 - <#if po.classType=='date'>  
16 - dataIndex: '${po.fieldName}',  
17 - customRender:({text}) =>{  
18 - return !text?"":(text.length>10?text.substr(0,10):text)  
19 - },  
20 - <#elseif po.fieldDbType=='Blob'>  
21 - dataIndex: '${po.fieldName}String'  
22 - <#elseif po.classType=='umeditor'>  
23 - dataIndex: '${po.fieldName}',  
24 - slots: { customRender: 'htmlSlot' },  
25 - <#elseif po.classType=='pca'>  
26 - dataIndex: '${po.fieldName}',  
27 - slots: { customRender: 'pcaSlot' },//TODO 未翻译  
28 - <#elseif po.classType=='file'>  
29 - dataIndex: '${po.fieldName}',  
30 - slots: { customRender: 'fileSlot' },  
31 - <#elseif po.classType=='image'>  
32 - dataIndex: '${po.fieldName}',  
33 - customRender:render.renderAvatar,  
34 - <#elseif po.classType=='switch'>  
35 - dataIndex: '${po.fieldName}',  
36 -<#assign switch_extend_arr=['Y','N']>  
37 -<#if po.dictField?default("")?contains("[")>  
38 -<#assign switch_extend_arr=po.dictField?eval>  
39 -</#if>  
40 -<#list switch_extend_arr as a>  
41 -<#if a_index == 0>  
42 -<#assign switch_extend_arr1=a>  
43 -<#else>  
44 -<#assign switch_extend_arr2=a>  
45 -</#if>  
46 -</#list>  
47 - customRender:({text}) => {  
48 - return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])  
49 - },  
50 - <#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'>  
51 - dataIndex: '${po.fieldName}_dictText'  
52 - <#elseif po.classType=='cat_tree'>  
53 - dataIndex: '${po.fieldName}',  
54 - <#if po.dictText?default("")?trim?length == 0>  
55 - customRender:({text}) => {  
56 - return render.renderCategoryTree(text,'${po.dictField?default("")}')  
57 - },  
58 - <#else>  
59 - customRender: (text, record) => (text ? record['${po.dictText}'] : '')  
60 - </#if>  
61 - <#else>  
62 - dataIndex: '${po.fieldName}'  
63 - </#if>  
64 - },  
65 - </#if>  
66 - </#list>  
67 -];  
68 -//查询数据  
69 -export const searchFormSchema: FormSchema[] = [  
70 -<#-- 开始循环 -->  
71 -<#list columns as po>  
72 -<#if po.fieldDbName=='bpm_status'>  
73 - <#assign bpm_flag=true>  
74 -</#if>  
75 -<#if po.isQuery=='Y'>  
76 -<#assign query_flag=true>  
77 - <#assign query_field_dictCode="">  
78 - <#if po.dictTable?default("")?trim?length gt 1>  
79 - <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">  
80 - <#elseif po.dictField?default("")?trim?length gt 1>  
81 - <#assign query_field_dictCode="${po.dictField}">  
82 - </#if>  
83 -<#if po.queryMode=='single'>  
84 - {  
85 - label: "${po.filedComment}",  
86 - field: "${po.fieldName}",  
87 -<#if po.classType=='sel_search'>  
88 - component: 'JSearchSelect',  
89 - componentProps:{  
90 - dict:"${po.dictTable},${po.dictText},${po.dictField}"  
91 - },  
92 -<#elseif po.classType=='sel_user'>  
93 - component: 'JSelectUserByDept',  
94 -<#elseif po.classType=='switch'>  
95 - component: 'JSwitch',  
96 - componentProps:{  
97 - <#if po.dictField != 'is_open'>  
98 - options:"${po.dictField}"  
99 - </#if>  
100 - },  
101 - <#elseif po.classType=='sel_depart'>  
102 - component: 'JSelectDept',  
103 - <#elseif po.classType=='list_multi'>  
104 - component: 'JMultiSelectTag',//暂无该组件  
105 - componentProps:{  
106 - dictCode:"query_field_dictCode?default("")"  
107 - },  
108 - <#elseif po.classType=='cat_tree'>  
109 - component: 'JCategorySelect',  
110 - componentProps:{  
111 - pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题  
112 - },  
113 -<#elseif po.classType=='date'>  
114 - component: 'DatePicker',  
115 -<#elseif po.classType=='datetime'>  
116 - component: 'DatePicker',  
117 - componentProps: {  
118 - showTime:true  
119 - },  
120 -<#elseif po.classType=='pca'>  
121 - component: 'JAreaLinkage',  
122 -<#elseif po.classType=='popup'>  
123 - component: 'JPopup',  
124 - componentProps: ({ formActionType }) => {  
125 - const {setFieldsValue} = formActionType;  
126 - return{  
127 - setFieldsValue:setFieldsValue,  
128 - code:"${po.dictTable}",  
129 - fieldConfig:"${po.dictField}",  
130 - multi:${po.extendParams.popupMulti?c},  
131 - }  
132 - },  
133 -<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>  
134 -<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->  
135 - component: 'JDictSelectTag',  
136 - componentProps:{  
137 - <#if po.dictTable?default("")?trim?length gt 1>  
138 - dictCode:"${po.dictTable},${po.dictText},${po.dictField}"  
139 - <#elseif po.dictField?default("")?trim?length gt 1>  
140 - dictCode:"${po.dictField}"  
141 - </#if>  
142 - },  
143 -<#else>  
144 - component: 'Input',  
145 -</#if>  
146 -<#else>  
147 - {  
148 - label: "${po.filedComment}",  
149 - field: "${po.fieldName}",  
150 -<#if po.classType=='date'>  
151 - component: 'RangePicker',  
152 -<#elseif po.classType=='datetime'>  
153 - component: 'RangePicker',  
154 - componentProps: {  
155 - showTime:true  
156 - },  
157 -<#else>  
158 - component: 'Input', //TODO 范围查询  
159 -</#if>  
160 - colProps: {span: 6},  
161 - },  
162 -</#if>  
163 -</#if>  
164 -</#list>  
165 -<#-- 结束循环 -->  
166 -];  
167 -//表单数据  
168 -export const formSchema: FormSchema[] = [  
169 -<#assign form_cat_tree = false>  
170 -<#assign form_cat_back = "">  
171 -<#assign bpm_flag=false>  
172 -<#list columns as po><#rt/>  
173 -<#if po.fieldDbName=='bpm_status'>  
174 - <#assign bpm_flag=true>  
175 -</#if>  
176 -<#if po.isShow =='Y'>  
177 -<#assign form_field_dictCode="">  
178 - <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>  
179 - <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">  
180 - <#elseif po.dictField?default("")?trim?length gt 1>  
181 - <#assign form_field_dictCode="${po.dictField}">  
182 - </#if>  
183 - {  
184 - label: '${po.filedComment}',  
185 - field: '${po.fieldName}',  
186 - <#if po.classType =='date'>  
187 - component: 'DatePicker',  
188 - <#elseif po.fieldType =='datetime'>  
189 - component: 'DatePicker',  
190 - componentProps: {  
191 - showTime:true  
192 - },  
193 - <#elseif po.fieldType =='time'>  
194 - component: 'TimePicker',  
195 - <#elseif po.classType =='popup'>  
196 - component: 'JPopup',  
197 - componentProps: ({ formActionType }) => {  
198 - const {setFieldsValue} = formActionType;  
199 - return{  
200 - setFieldsValue:setFieldsValue,  
201 - code:"${po.dictTable}",  
202 - fieldConfig:${po.dictField},  
203 - multi:${po.extendParams.popupMulti?c},  
204 - }  
205 - }  
206 - <#elseif po.classType =='sel_depart'>  
207 - component: 'JSelectDept',  
208 - <#elseif po.classType =='switch'>  
209 - component: 'JSwitch',  
210 - componentProps:{  
211 - <#if po.dictField != 'is_open'>  
212 - options:${po.dictField}  
213 - </#if>  
214 - }  
215 - <#elseif po.classType =='pca'>  
216 - component: 'JAreaLinkage',  
217 - <#elseif po.classType =='markdown'>  
218 - component: 'JMarkdownEditor',//注意string转换问题  
219 - <#elseif po.classType =='password'>  
220 - component: 'InputPassword',  
221 - <#elseif po.classType =='sel_user'>  
222 - component: 'JSelectUserByDept',  
223 - componentProps:{  
224 - labelKey:'realname',  
225 - }  
226 - <#elseif po.classType =='textarea'>  
227 - component: 'InputTextArea',//TODO 注意string转换问题  
228 - <#elseif po.classType=='list' || po.classType=='radio'>  
229 - component: 'JDictSelectTag',  
230 - componentProps:{  
231 - dictCode:"${form_field_dictCode}"  
232 - }  
233 - <#elseif po.classType=='list_multi' || po.classType=='checkbox'>  
234 - component: 'JMultiSelectTag',//TODO 暂无该组件  
235 - componentProps:{  
236 - dictCode:"${form_field_dictCode}"  
237 - }  
238 - <#elseif po.classType=='sel_search'>  
239 - component: 'JSearchSelect',  
240 - componentProps:{  
241 - dict:"${form_field_dictCode}"  
242 - }  
243 -<#elseif po.classType=='cat_tree'>  
244 - <#assign form_cat_tree = true>  
245 - component: 'JCategorySelect',  
246 - componentProps:{  
247 - pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题  
248 - }  
249 - <#if po.dictText?default("")?trim?length gt 1>  
250 - <#assign form_cat_back = "${po.dictText}">  
251 - </#if>  
252 - <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>  
253 - component: 'InputNumber',  
254 - <#elseif po.classType=='file'>  
255 - component: 'JUpload',  
256 - componentProps:{  
257 - <#if po.uploadnum??>  
258 - maxCount:${po.uploadnum}  
259 - </#if>  
260 - }  
261 - <#elseif po.classType=='image'>  
262 - component: 'JImageUpload',  
263 - componentProps:{  
264 - <#if po.uploadnum??>  
265 - fileMax:${po.uploadnum}  
266 - </#if>  
267 - }  
268 - <#elseif po.classType=='umeditor'>  
269 - component: 'JCodeEditor', //TODO String后缀暂未添加  
270 - <#elseif po.classType == 'sel_tree'>  
271 - component: 'JTreeSelect',  
272 - componentProps:{  
273 - <#if po.dictText??>  
274 - <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>  
275 - dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",  
276 - <#elseif po.dictText?split(',')[1]??>  
277 - pidField:"${po.dictText?split(',')[1]}",  
278 - <#elseif po.dictText?split(',')[3]??>  
279 - hasChildField:"${po.dictText?split(',')[3]}",  
280 - </#if>  
281 - </#if>  
282 - pidValue:"${po.dictField}",  
283 - }  
284 - <#else>  
285 - component: 'Input',  
286 - </#if>  
287 - <#include "/common/utils.ftl">  
288 - <#if po.isShow == 'Y' && poHasCheck(po)>  
289 - dynamicRules: ({model,schema}) => {  
290 - <#if po.fieldName != 'id'>  
291 - <#assign fieldValidType = po.fieldValidType!''>  
292 - return [  
293 - <#-- 非空校验 -->  
294 - <#if po.nullable == 'N' || fieldValidType == '*'>  
295 - { required: true, message: '请输入${po.filedComment}!'},  
296 - <#elseif fieldValidType!=''>  
297 - { required: false},  
298 - </#if>  
299 - <#-- 唯一校验 -->  
300 - <#if fieldValidType == 'only'>  
301 - {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema,true)[0]},  
302 - <#-- 6到16位数字 -->  
303 - <#elseif fieldValidType == 'n6-16'>  
304 - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},  
305 - <#-- 6到16位任意字符 -->  
306 - <#elseif fieldValidType == '*6-16'>  
307 - { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},  
308 - <#-- 6到18位字符串 -->  
309 - <#elseif fieldValidType == 's6-18'>  
310 - { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},  
311 - <#-- 网址 -->  
312 - <#elseif fieldValidType == 'url'>  
313 - { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},  
314 - <#-- 电子邮件 -->  
315 - <#elseif fieldValidType == 'e'>  
316 - { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},  
317 - <#-- 手机号码 -->  
318 - <#elseif fieldValidType == 'm'>  
319 - { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},  
320 - <#-- 邮政编码 -->  
321 - <#elseif fieldValidType == 'p'>  
322 - { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},  
323 - <#-- 字母 -->  
324 - <#elseif fieldValidType == 's'>  
325 - { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},  
326 - <#-- 数字 -->  
327 - <#elseif fieldValidType == 'n'>  
328 - { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},  
329 - <#-- 整数 -->  
330 - <#elseif fieldValidType == 'z'>  
331 - { pattern: /^-?\d+$/, message: '请输入整数!'},  
332 - <#-- 金额 -->  
333 - <#elseif fieldValidType == 'money'>  
334 - { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},  
335 - <#-- 正则校验 -->  
336 - <#elseif fieldValidType != '' && fieldValidType != '*'>  
337 - { pattern: '${fieldValidType}', message: '不符合校验规则!'},  
338 - <#-- 无校验 -->  
339 - <#else>  
340 - <#t>  
341 - </#if>  
342 - ];  
343 - </#if>  
344 - },  
345 - </#if>  
346 - <#if po.readonly=='Y'>  
347 - dynamicDisabled:true  
348 - </#if>  
349 - },  
350 -</#if>  
351 -</#list>  
352 -];  
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei deleted
1 -<template>  
2 - <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit">  
3 - <BasicForm @register="registerForm"/>  
4 - </BasicModal>  
5 -</template>  
6 -  
7 -<script lang="ts" setup>  
8 - import {ref, computed, unref} from 'vue';  
9 - import {BasicModal, useModalInner} from '/@/components/Modal';  
10 - import {BasicForm, useForm} from '/@/components/Form/index';  
11 - import {formSchema} from '../${entityName?uncap_first}.data';  
12 - import {saveOrUpdate} from '../${entityName?uncap_first}.api';  
13 - // Emits声明  
14 - const emit = defineEmits(['register','success']);  
15 - const isUpdate = ref(true);  
16 - //表单配置  
17 - const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({  
18 - labelWidth: 150,  
19 - schemas: formSchema,  
20 - showActionButtonGroup: false,  
21 - });  
22 - //表单赋值  
23 - const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {  
24 - //重置表单  
25 - await resetFields();  
26 - setModalProps({confirmLoading: false,showFooter:!!data?.showFooter});  
27 - isUpdate.value = !!data?.isUpdate;  
28 - if (unref(isUpdate)) {  
29 - //表单赋值  
30 - await setFieldsValue({  
31 - ...data.record,  
32 - });  
33 - }  
34 - // 隐藏底部时禁用整个表单  
35 - setProps({ disabled: !data?.showFooter })  
36 - });  
37 - //设置标题  
38 - const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));  
39 - //表单提交事件  
40 - async function handleSubmit(v) {  
41 - try {  
42 - let values = await validate();  
43 - setModalProps({confirmLoading: true});  
44 - //提交表单  
45 - await saveOrUpdate(values, isUpdate.value);  
46 - //关闭弹窗  
47 - closeModal();  
48 - //刷新列表  
49 - emit('success');  
50 - } finally {  
51 - setModalProps({confirmLoading: false});  
52 - }  
53 - }  
54 -</script>  
55 -  
56 -<style lang="less" scoped>  
57 -  
58 -</style>  
59 \ No newline at end of file 0 \ No newline at end of file
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi deleted
1 -import {defHttp} from "/@/utils/http/axios";  
2 -import {Modal} from 'ant-design-vue';  
3 -  
4 -enum Api {  
5 - list = '/${entityPackage}/${entityName?uncap_first}/rootList',  
6 - save='/${entityPackage}/${entityName?uncap_first}/add',  
7 - edit='/${entityPackage}/${entityName?uncap_first}/edit',  
8 - delete${entityName} = '/sys/${entityName?uncap_first}/delete',  
9 - deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',  
10 - importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',  
11 - exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',  
12 - loadTreeData = '/${entityPackage}/${entityName?uncap_first}/loadTreeRoot',  
13 - getChildList = '/${entityPackage}/${entityName?uncap_first}/childList',  
14 - getChildListBatch = '/${entityPackage}/${entityName?uncap_first}/getChildListBatch',  
15 -}  
16 -/**  
17 - * 导出api  
18 - * @param params  
19 - */  
20 -export const getExportUrl = Api.exportXls;  
21 -/**  
22 - * 导入api  
23 - * @param params  
24 - */  
25 -export const getImportUrl = Api.importExcel;  
26 -/**  
27 - * 列表接口  
28 - * @param params  
29 - */  
30 -export const list = (params) =>  
31 - defHttp.get({url: Api.list, params});  
32 -/**  
33 - * 删除  
34 - */  
35 -export const delete${entityName} = (params,handleSuccess) => {  
36 - return defHttp.delete({url: Api.delete${entityName}, params}, {joinParamsToUrl: true}).then(() => {  
37 - handleSuccess();  
38 - });  
39 -}  
40 -/**  
41 - * 批量删除  
42 - * @param params  
43 - */  
44 -export const batchDelete${entityName} = (params, handleSuccess) => {  
45 - Modal.confirm({  
46 - title: '确认删除',  
47 - content: '是否删除选中数据',  
48 - okText: '确认',  
49 - cancelText: '取消',  
50 - onOk: () => {  
51 - return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {  
52 - handleSuccess();  
53 - });  
54 - }  
55 - });  
56 -}  
57 -/**  
58 - * 保存或者更新  
59 - * @param params  
60 - */  
61 -export const saveOrUpdateDict = (params, isUpdate) => {  
62 - let url = isUpdate ? Api.edit : Api.save;  
63 - return defHttp.post({url: url, params});  
64 -}  
65 -/**  
66 - * 查询全部树形节点数据  
67 - * @param params  
68 - */  
69 -export const loadTreeData = (params) =>  
70 - defHttp.get({url: Api.loadTreeData,params});  
71 -/**  
72 - * 查询子节点数据  
73 - * @param params  
74 - */  
75 -export const getChildList = (params) =>  
76 - defHttp.get({url: Api.getChildList, params});  
77 -/**  
78 - * 批量查询子节点数据  
79 - * @param params  
80 - */  
81 -export const getChildListBatch = (params) =>  
82 - defHttp.get({url: Api.getChildListBatch, params},{isTransformResponse:false});  
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi deleted
1 -import {BasicColumn} from '/@/components/Table';  
2 -import {FormSchema} from '/@/components/Table';  
3 -import { rules} from '/@/utils/helper/validator';  
4 -import { render } from '/@/utils/common/renderUtils';  
5 -//列表数据  
6 -export const columns: BasicColumn[] = [  
7 - <#list columns as po>  
8 - <#if po.isShowList =='Y' && po.fieldName !='id'>  
9 - {  
10 - title: '${po.filedComment}',  
11 - align:"center",  
12 - <#if po.sort=='Y'>  
13 - sorter: true,  
14 - </#if>  
15 - <#if po.classType=='date'>  
16 - dataIndex: '${po.fieldName}',  
17 - customRender:({text}) =>{  
18 - return !text?"":(text.length>10?text.substr(0,10):text)  
19 - },  
20 - <#elseif po.fieldDbType=='Blob'>  
21 - dataIndex: '${po.fieldName}String'  
22 - <#elseif po.classType=='umeditor'>  
23 - dataIndex: '${po.fieldName}',  
24 - slots: { customRender: 'htmlSlot' },  
25 - <#elseif po.classType=='pca'>  
26 - dataIndex: '${po.fieldName}',  
27 - slots: { customRender: 'pcaSlot' },//TODO 未翻译  
28 - <#elseif po.classType=='file'>  
29 - dataIndex: '${po.fieldName}',  
30 - slots: { customRender: 'fileSlot' },  
31 - <#elseif po.classType=='image'>  
32 - dataIndex: '${po.fieldName}',  
33 - customRender:render.renderAvatar,  
34 - <#elseif po.classType=='switch'>  
35 - dataIndex: '${po.fieldName}',  
36 -<#assign switch_extend_arr=['Y','N']>  
37 -<#if po.dictField?default("")?contains("[")>  
38 -<#assign switch_extend_arr=po.dictField?eval>  
39 -</#if>  
40 -<#list switch_extend_arr as a>  
41 -<#if a_index == 0>  
42 -<#assign switch_extend_arr1=a>  
43 -<#else>  
44 -<#assign switch_extend_arr2=a>  
45 -</#if>  
46 -</#list>  
47 - customRender:({text}) => {  
48 - return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])  
49 - },  
50 - <#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'>  
51 - dataIndex: '${po.fieldName}_dictText'  
52 - <#elseif po.classType=='cat_tree'>  
53 - dataIndex: '${po.fieldName}',  
54 - <#if po.dictText?default("")?trim?length == 0>  
55 - customRender:({text}) => {  
56 - return render.renderCategoryTree(text,'${po.dictField?default("")}')  
57 - },  
58 - <#else>  
59 - customRender: (text, record) => (text ? record['${po.dictText}'] : '')  
60 - </#if>  
61 - <#else>  
62 - dataIndex: '${po.fieldName}'  
63 - </#if>  
64 - },  
65 - </#if>  
66 - </#list>  
67 -];  
68 -//查询数据  
69 -export const searchFormSchema: FormSchema[] = [  
70 -<#-- 开始循环 -->  
71 -<#list columns as po>  
72 -<#if po.fieldDbName=='bpm_status'>  
73 - <#assign bpm_flag=true>  
74 -</#if>  
75 -<#if po.isQuery=='Y'>  
76 -<#assign query_flag=true>  
77 - <#assign query_field_dictCode="">  
78 - <#if po.dictTable?default("")?trim?length gt 1>  
79 - <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">  
80 - <#elseif po.dictField?default("")?trim?length gt 1>  
81 - <#assign query_field_dictCode="${po.dictField}">  
82 - </#if>  
83 -<#if po.queryMode=='single'>  
84 - {  
85 - label: "${po.filedComment}",  
86 - field: "${po.fieldName}",  
87 -<#if po.classType=='sel_search'>  
88 - component: 'JSearchSelect',  
89 - componentProps:{  
90 - dict:"${po.dictTable},${po.dictText},${po.dictField}"  
91 - },  
92 -<#elseif po.classType=='sel_user'>  
93 - component: 'JSelectUserByDept',  
94 -<#elseif po.classType=='switch'>  
95 - component: 'JSwitch',  
96 - componentProps:{  
97 - <#if po.dictField != 'is_open'>  
98 - options:"${po.dictField}"  
99 - </#if>  
100 - },  
101 - <#elseif po.classType=='sel_depart'>  
102 - component: 'JSelectDept',  
103 - <#elseif po.classType=='list_multi'>  
104 - component: 'JMultiSelectTag',//暂无该组件  
105 - componentProps:{  
106 - dictCode:"query_field_dictCode?default("")"  
107 - },  
108 - <#elseif po.classType=='cat_tree'>  
109 - component: 'JCategorySelect',  
110 - componentProps:{  
111 - pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题  
112 - },  
113 -<#elseif po.classType=='date'>  
114 - component: 'DatePicker',  
115 -<#elseif po.classType=='datetime'>  
116 - component: 'DatePicker',  
117 - componentProps: {  
118 - showTime:true  
119 - },  
120 -<#elseif po.classType=='pca'>  
121 - component: 'JAreaLinkage',  
122 -<#elseif po.classType=='popup'>  
123 - component: 'JPopup',  
124 - componentProps: ({ formActionType }) => {  
125 - const {setFieldsValue} = formActionType;  
126 - return{  
127 - setFieldsValue:setFieldsValue,  
128 - code:"${po.dictTable}",  
129 - fieldConfig:"${po.dictField}",  
130 - multi:${po.extendParams.popupMulti?c},  
131 - }  
132 - },  
133 -<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>  
134 -<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->  
135 - component: 'JDictSelectTag',  
136 - componentProps:{  
137 - <#if po.dictTable?default("")?trim?length gt 1>  
138 - dictCode:"${po.dictTable},${po.dictText},${po.dictField}"  
139 - <#elseif po.dictField?default("")?trim?length gt 1>  
140 - dictCode:"${po.dictField}"  
141 - </#if>  
142 - },  
143 -<#else>  
144 - component: 'Input',  
145 -</#if>  
146 -<#else>  
147 - {  
148 - label: "${po.filedComment}",  
149 - field: "${po.fieldName}",  
150 -<#if po.classType=='date'>  
151 - component: 'RangePicker',  
152 -<#elseif po.classType=='datetime'>  
153 - component: 'RangePicker',  
154 - componentProps: {  
155 - showTime:true  
156 - },  
157 -<#else>  
158 - component: 'Input', //TODO 范围查询  
159 -</#if>  
160 - colProps: {span: 6},  
161 - },  
162 -</#if>  
163 -</#if>  
164 -</#list>  
165 -<#-- 结束循环 -->  
166 -];  
167 -//表单数据  
168 -export const formSchema: FormSchema[] = [  
169 -<#assign form_cat_tree = false>  
170 -<#assign form_cat_back = "">  
171 -<#assign bpm_flag=false>  
172 -<#list columns as po><#rt/>  
173 -<#if po.fieldDbName=='bpm_status'>  
174 - <#assign bpm_flag=true>  
175 -</#if>  
176 -<#if po.isShow =='Y'>  
177 -<#assign form_field_dictCode="">  
178 - <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>  
179 - <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">  
180 - <#elseif po.dictField?default("")?trim?length gt 1>  
181 - <#assign form_field_dictCode="${po.dictField}">  
182 - </#if>  
183 - {  
184 - label: '${po.filedComment}',  
185 - field: '${po.fieldName}',  
186 - <#if po.classType =='date'>  
187 - component: 'DatePicker',  
188 - <#elseif po.fieldType =='datetime'>  
189 - component: 'DatePicker',  
190 - componentProps: {  
191 - showTime:true  
192 - },  
193 - <#elseif po.fieldType =='time'>  
194 - component: 'TimePicker',  
195 - <#elseif po.classType =='popup'>  
196 - component: 'JPopup',  
197 - componentProps: ({ formActionType }) => {  
198 - const {setFieldsValue} = formActionType;  
199 - return{  
200 - setFieldsValue:setFieldsValue,  
201 - code:"${po.dictTable}",  
202 - fieldConfig:${po.dictField},  
203 - multi:${po.extendParams.popupMulti?c},  
204 - }  
205 - }  
206 - <#elseif po.classType =='sel_depart'>  
207 - component: 'JSelectDept',  
208 - <#elseif po.classType =='switch'>  
209 - component: 'JSwitch',  
210 - componentProps:{  
211 - <#if po.dictField != 'is_open'>  
212 - options:${po.dictField}  
213 - </#if>  
214 - }  
215 - <#elseif po.classType =='pca'>  
216 - component: 'JAreaLinkage',  
217 - <#elseif po.classType =='markdown'>  
218 - component: 'JMarkdownEditor',//注意string转换问题  
219 - <#elseif po.classType =='password'>  
220 - component: 'InputPassword',  
221 - <#elseif po.classType =='sel_user'>  
222 - component: 'JSelectUserByDept',  
223 - componentProps:{  
224 - labelKey:'realname',  
225 - }  
226 - <#elseif po.classType =='textarea'>  
227 - component: 'InputTextArea',//TODO 注意string转换问题  
228 - <#elseif po.classType=='list' || po.classType=='radio'>  
229 - component: 'JDictSelectTag',  
230 - componentProps:{  
231 - dictCode:"${form_field_dictCode}"  
232 - }  
233 - <#elseif po.classType=='list_multi' || po.classType=='checkbox'>  
234 - component: 'JMultiSelectTag',//TODO 暂无该组件  
235 - componentProps:{  
236 - dictCode:"${form_field_dictCode}"  
237 - }  
238 - <#elseif po.classType=='sel_search'>  
239 - component: 'JSearchSelect',  
240 - componentProps:{  
241 - dict:"${form_field_dictCode}"  
242 - }  
243 -<#elseif po.classType=='cat_tree'>  
244 - <#assign form_cat_tree = true>  
245 - component: 'JCategorySelect',  
246 - componentProps:{  
247 - pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题  
248 - }  
249 - <#if po.dictText?default("")?trim?length gt 1>  
250 - <#assign form_cat_back = "${po.dictText}">  
251 - </#if>  
252 - <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>  
253 - component: 'InputNumber',  
254 - <#elseif po.classType=='file'>  
255 - component: 'JUpload',  
256 - componentProps:{  
257 - <#if po.uploadnum??>  
258 - maxCount:${po.uploadnum}  
259 - </#if>  
260 - }  
261 - <#elseif po.classType=='image'>  
262 - component: 'JImageUpload',  
263 - componentProps:{  
264 - <#if po.uploadnum??>  
265 - fileMax:${po.uploadnum}  
266 - </#if>  
267 - }  
268 - <#elseif po.classType=='umeditor'>  
269 - component: 'JCodeEditor', //TODO String后缀暂未添加  
270 - <#elseif po.classType == 'sel_tree'>  
271 - component: 'JTreeSelect',  
272 - componentProps:{  
273 - <#if po.dictText??>  
274 - <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>  
275 - dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",  
276 - <#elseif po.dictText?split(',')[1]??>  
277 - pidField:"${po.dictText?split(',')[1]}",  
278 - <#elseif po.dictText?split(',')[3]??>  
279 - hasChildField:"${po.dictText?split(',')[3]}",  
280 - </#if>  
281 - </#if>  
282 - pidValue:"${po.dictField}",  
283 - }  
284 - <#else>  
285 - component: 'Input',  
286 - </#if>  
287 - <#include "/common/utils.ftl">  
288 - <#if po.isShow == 'Y' && poHasCheck(po)>  
289 - dynamicRules: ({model,schema}) => {  
290 - <#if po.fieldName != 'id'>  
291 - <#assign fieldValidType = po.fieldValidType!''>  
292 - return [  
293 - <#-- 非空校验 -->  
294 - <#if po.nullable == 'N' || fieldValidType == '*'>  
295 - { required: true, message: '请输入${po.filedComment}!'},  
296 - <#elseif fieldValidType!=''>  
297 - { required: false},  
298 - </#if>  
299 - <#-- 唯一校验 -->  
300 - <#if fieldValidType == 'only'>  
301 - {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema,true)[0]},  
302 - <#-- 6到16位数字 -->  
303 - <#elseif fieldValidType == 'n6-16'>  
304 - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},  
305 - <#-- 6到16位任意字符 -->  
306 - <#elseif fieldValidType == '*6-16'>  
307 - { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},  
308 - <#-- 6到18位字符串 -->  
309 - <#elseif fieldValidType == 's6-18'>  
310 - { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},  
311 - <#-- 网址 -->  
312 - <#elseif fieldValidType == 'url'>  
313 - { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},  
314 - <#-- 电子邮件 -->  
315 - <#elseif fieldValidType == 'e'>  
316 - { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},  
317 - <#-- 手机号码 -->  
318 - <#elseif fieldValidType == 'm'>  
319 - { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},  
320 - <#-- 邮政编码 -->  
321 - <#elseif fieldValidType == 'p'>  
322 - { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},  
323 - <#-- 字母 -->  
324 - <#elseif fieldValidType == 's'>  
325 - { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},  
326 - <#-- 数字 -->  
327 - <#elseif fieldValidType == 'n'>  
328 - { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},  
329 - <#-- 整数 -->  
330 - <#elseif fieldValidType == 'z'>  
331 - { pattern: /^-?\d+$/, message: '请输入整数!'},  
332 - <#-- 金额 -->  
333 - <#elseif fieldValidType == 'money'>  
334 - { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},  
335 - <#-- 正则校验 -->  
336 - <#elseif fieldValidType != '' && fieldValidType != '*'>  
337 - { pattern: '${fieldValidType}', message: '不符合校验规则!'},  
338 - <#-- 无校验 -->  
339 - <#else>  
340 - <#t>  
341 - </#if>  
342 - ];  
343 - </#if>  
344 - },  
345 - </#if>  
346 - <#if po.readonly=='Y'>  
347 - dynamicDisabled:true  
348 - </#if>  
349 - },  
350 -</#if>  
351 -</#list>  
352 -];  
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei deleted
1 -<template>  
2 - <BasicModal v-bind="$attrs" @register="registerModal" :title="getTitle" @ok="handleSubmit">  
3 - <BasicForm @register="registerForm"/>  
4 - </BasicModal>  
5 -</template>  
6 -<script lang="ts" setup>  
7 - import {ref, computed, unref} from 'vue';  
8 - import {BasicModal, useModalInner} from '/src/components/Modal';  
9 - import {BasicForm, useForm} from '/src/components/Form';  
10 - import {formSchema} from '../${entityName?uncap_first}.data';  
11 - import {loadTreeData, saveOrUpdateDict} from '../${entityName?uncap_first}.api';  
12 - // 获取emit  
13 - const emit = defineEmits(['register', 'success']);  
14 - const isUpdate = ref(true);  
15 - const expandedRowKeys = ref([]);  
16 - const treeData = ref([]);  
17 - //表单配置  
18 - const [registerForm, {resetFields, setFieldsValue, validate, updateSchema}] = useForm({  
19 - schemas: formSchema,  
20 - showActionButtonGroup: false,  
21 - labelCol: {  
22 - xs: { span: 24 },  
23 - sm: { span: 4 },  
24 - },  
25 - wrapperCol: {  
26 - xs: { span: 24 },  
27 - sm: { span: 18 },  
28 - },  
29 - });  
30 - //表单赋值  
31 - const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {  
32 - //重置表单  
33 - await resetFields();  
34 - expandedRowKeys.value = [];  
35 - setModalProps({confirmLoading: false, minHeight: 80});  
36 - isUpdate.value = !!data?.isUpdate;  
37 - if (data?.record) {  
38 - //表单赋值  
39 - await setFieldsValue({  
40 - ...data.record,  
41 - });  
42 - }  
43 - //父级节点树信息  
44 - treeData.value = await loadTreeData({'async': false,'pcode':''});  
45 - updateSchema({  
46 - field: 'pid',  
47 - componentProps: {treeData},  
48 - });  
49 - });  
50 - //设置标题  
51 - const getTitle = computed(() => (!unref(isUpdate) ? '新增字典' : '编辑字典'));  
52 -  
53 - /**  
54 - * 根据pid获取展开的节点  
55 - * @param pid  
56 - * @param arr  
57 - */  
58 - function getExpandKeysByPid(pid,arr){  
59 - if(pid && arr && arr.length>0){  
60 - for(let i=0;i<arr.length;i++){  
61 - if(arr[i].key==pid && unref(expandedRowKeys).indexOf(pid)<0){  
62 - expandedRowKeys.value.push(arr[i].key);  
63 - getExpandKeysByPid(arr[i]['parentId'],unref(treeData))  
64 - }else{  
65 - getExpandKeysByPid(pid,arr[i].children)  
66 - }  
67 - }  
68 - }  
69 - }  
70 - //表单提交事件  
71 - async function handleSubmit() {  
72 - try {  
73 - let values = await validate();  
74 - setModalProps({confirmLoading: true});  
75 - //提交表单  
76 - await saveOrUpdateDict(values, isUpdate.value);  
77 - //关闭弹窗  
78 - closeModal();  
79 - //展开的节点信息  
80 - await getExpandKeysByPid(values['pid'],unref(treeData))  
81 - //刷新列表(isUpdate:是否编辑;values:表单信息;expandedArr:展开的节点信息)  
82 - emit('success', {isUpdate: unref(isUpdate), values:{...values},expandedArr: unref(expandedRowKeys).reverse()});  
83 - } finally {  
84 - setModalProps({confirmLoading: false});  
85 - }  
86 - }  
87 -</script>  
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/index.vuei deleted
1 -<template>  
2 - <div class="p-4">  
3 - <!--引用表格-->  
4 - <BasicTable @register="registerTable" :rowSelection="rowSelection" :expandedRowKeys="expandedRowKeys" @expand="handleExpand" @fetch-success="onFetchSuccess">  
5 - <!--插槽:table标题-->  
6 - <template #tableTitle>  
7 - <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增</a-button>  
8 - <a-upload name="file" :showUploadList="false" :customRequest="(file)=>handleImportXls(file,getImportUrl,importSuccess)">  
9 - <a-button type="primary" preIcon="ant-design:import-outlined">导入</a-button>  
10 - </a-upload>  
11 - <a-button type="primary" preIcon="ant-design:export-outlined" @click="handleExportXls('${tableVo.ftlDescription}管理',getExportUrl)"> 导出</a-button>  
12 -  
13 - <a-dropdown v-if="checkedKeys.length > 0">  
14 - <template #overlay>  
15 - <a-menu>  
16 - <a-menu-item key="1" @click="batchHandleDelete">  
17 - <Icon icon="ant-design:delete-outlined"></Icon>  
18 - 删除  
19 - </a-menu-item>  
20 - </a-menu>  
21 - </template>  
22 - <a-button>批量操作  
23 - <Icon icon="ant-design:down-outlined"></Icon>  
24 - </a-button>  
25 - </a-dropdown>  
26 - </template>  
27 - <!--操作栏-->  
28 - <template #action="{ record }">  
29 - <TableAction :actions="getTableAction(record)"/>  
30 - </template>  
31 - </BasicTable>  
32 - <!--字典弹窗-->  
33 - <${entityName}Modal @register="registerModal" @success="handleSuccess"/>  
34 - </div>  
35 -</template>  
36 -  
37 -<script lang="ts" setup>  
38 - //ts语法  
39 - import {ref, computed, unref, toRaw, nextTick} from 'vue';  
40 - import {BasicTable, useTable, TableAction} from '/src/components/Table';  
41 - import {useDrawer} from '/src/components/Drawer';  
42 - import ${entityName}Modal from './components/${entityName}Modal.vue';  
43 - import {useModal} from '/src/components/Modal';  
44 - import {useMethods} from '/src/hooks/system/useMethods';  
45 - import {columns} from './${entityName}.data';  
46 - import {list, delete${entityName}, batchDelete${entityName}, getExportUrl,getImportUrl, getChildList,getChildListBatch} from './${entityName}.api';  
47 -  
48 - const checkedKeys = ref<Array<string | number>>([]);  
49 - const expandedRowKeys = ref([]);  
50 - const {handleExportXls,handleImportXls} = useMethods();  
51 - //字典model  
52 - const [registerModal, {openModal}] = useModal();  
53 - //注册table数据  
54 - const [registerTable, {reload, collapseAll, updateTableDataRecord, findTableDataRecord,getDataSource}] = useTable({  
55 - api: list,  
56 - rowKey: 'id',  
57 - columns,  
58 - striped: true,  
59 - useSearchForm: false,  
60 - showTableSetting: true,  
61 - clickToRowSelect: false,  
62 - bordered: true,  
63 - showIndexColumn: false,  
64 - tableSetting: {fullScreen: true},  
65 - canResize: false,  
66 - actionColumn: {  
67 - width: 80,  
68 - title: '操作',  
69 - dataIndex: 'action',  
70 - slots: {customRender: 'action'},  
71 - fixed: undefined,  
72 - },  
73 - })  
74 -  
75 - /**  
76 - * 选择列配置  
77 - */  
78 - const rowSelection = {  
79 - type: 'checkbox',  
80 - columnWidth: 10,  
81 - selectedRowKeys: checkedKeys,  
82 - onChange: onSelectChange  
83 - }  
84 -  
85 - /**  
86 - * 选择事件  
87 - */  
88 - function onSelectChange(selectedRowKeys: (string | number)[]) {  
89 - checkedKeys.value = selectedRowKeys;  
90 - }  
91 -  
92 - /**  
93 - * 新增事件  
94 - */  
95 - function handleCreate() {  
96 - openModal(true, {  
97 - isUpdate: false,  
98 - });  
99 - }  
100 -  
101 - /**  
102 - * 编辑事件  
103 - */  
104 - async function handleEdit(record) {  
105 - openModal(true, {  
106 - record,  
107 - isUpdate: true,  
108 - });  
109 - }  
110 -  
111 - /**  
112 - * 详情  
113 - */  
114 - async function handleDetail(record) {  
115 - openModal(true, {  
116 - record,  
117 - isUpdate: true,  
118 - hideFooter: true,  
119 - });  
120 - }  
121 -  
122 - /**  
123 - * 删除事件  
124 - */  
125 - async function handleDelete(record) {  
126 - await delete${entityName}({id: record.id}, importSuccess);  
127 -  
128 - }  
129 -  
130 - /**  
131 - * 批量删除事件  
132 - */  
133 - async function batchHandleDelete() {  
134 - const ids = checkedKeys.value.filter(item => !item.includes('loading'))  
135 - await batchDelete${entityName}({ids: ids}, importSuccess);  
136 - }  
137 - /**  
138 - * 导入  
139 - */  
140 - function importSuccess() {  
141 - reload() && (expandedRowKeys.value = []);  
142 - }  
143 - /**  
144 - * 添加下级  
145 - */  
146 - function handleAddSub(record) {  
147 - openModal(true, {  
148 - record,  
149 - isUpdate: false,  
150 - });  
151 - }  
152 - /**  
153 - * 成功回调  
154 - */  
155 - async function handleSuccess({isUpdate, values, expandedArr}) {  
156 - if (isUpdate) {  
157 - //编辑回调  
158 - updateTableDataRecord(values.id, values);  
159 - } else {  
160 - if(!values['pid']){  
161 - //新增根节点  
162 - reload();  
163 - }else{  
164 - //新增子集  
165 - expandedRowKeys.value = [];  
166 - for (let key of unref(expandedArr)) {  
167 - await expandTreeNode(key)  
168 - }  
169 - }  
170 - }  
171 - }  
172 -  
173 - /**  
174 - * 接口请求成功后回调  
175 - */  
176 - function onFetchSuccess(result) {  
177 - getDataByResult(result.items)&&loadDataByExpandedRows();  
178 - }  
179 - /**  
180 - * 根据已展开的行查询数据(用于保存后刷新时异步加载子级的数据)  
181 - */  
182 - async function loadDataByExpandedRows() {  
183 - if (unref(expandedRowKeys).length > 0) {  
184 - const res = await getChildListBatch({ parentIds: unref(expandedRowKeys).join(',')});  
185 - if (res.success && res.result.records.length>0) {  
186 - //已展开的数据批量子节点  
187 - let records = res.result.records  
188 - const listMap = new Map();  
189 - for (let item of records) {  
190 - let pid = item['pid'];  
191 - if (unref(expandedRowKeys).includes(pid)) {  
192 - let mapList = listMap.get(pid);  
193 - if (mapList == null) {  
194 - mapList = [];  
195 - }  
196 - mapList.push(item);  
197 - listMap.set(pid, mapList);  
198 - }  
199 - }  
200 - let childrenMap = listMap;  
201 - let fn = (list) => {  
202 - if(list) {  
203 - list.forEach(data => {  
204 - if (unref(expandedRowKeys).includes(data.id)) {  
205 - data.children = getDataByResult(childrenMap.get(data.id))  
206 - fn(data.children)  
207 - }  
208 - })  
209 - }  
210 - };  
211 - fn(getDataSource())  
212 - }  
213 - }  
214 - }  
215 - /**  
216 - * 处理数据集  
217 - */  
218 - function getDataByResult(result){  
219 - if(result && result.length>0){  
220 - return result.map(item=>{  
221 - //判断是否标记了带有子节点  
222 - if(item["hasChild"]=='1'){  
223 - let loadChild = { id: item.id+'_loadChild', name: 'loading...', isLoading: true }  
224 - item.children = [loadChild]  
225 - }  
226 - return item  
227 - })  
228 - }  
229 - }  
230 - /**  
231 - *树节点展开合并  
232 - * */  
233 - async function handleExpand(expanded, record) {  
234 - // 判断是否是展开状态,展开状态(expanded)并且存在子集(children)并且未加载过(isLoading)的就去查询子节点数据  
235 - if (expanded) {  
236 - expandedRowKeys.value.push(record.id)  
237 - if (record.children.length > 0 && !!record.children[0].isLoading) {  
238 - let result = await getChildList({pid: record.id});  
239 - result=result.records?result.records:result;  
240 - if (result && result.length > 0) {  
241 - record.children = getDataByResult(result);  
242 - } else {  
243 - record.children = null  
244 - record.hasChild = '0'  
245 - }  
246 - }  
247 - } else {  
248 - let keyIndex = expandedRowKeys.value.indexOf(record.id)  
249 - if (keyIndex >= 0) {  
250 - expandedRowKeys.value.splice(keyIndex, 1);  
251 - }  
252 - }  
253 - }  
254 - /**  
255 - *操作表格后处理树节点展开合并  
256 - * */  
257 - async function expandTreeNode(key) {  
258 - let record = findTableDataRecord(key)  
259 - expandedRowKeys.value.push(key);  
260 - let result = await getChildList({pid: key});  
261 - if (result && result.length > 0) {  
262 - record.children = getDataByResult(result);  
263 - } else {  
264 - record.children = null  
265 - record.hasChild = '0'  
266 - }  
267 - updateTableDataRecord(key, record);  
268 - }  
269 - /**  
270 - * 操作栏  
271 - */  
272 - function getTableAction(record) {  
273 - return [  
274 - {  
275 - label: '编辑',  
276 - onClick: handleEdit.bind(null, record),  
277 - },  
278 - {  
279 - label: '删除',  
280 - popConfirm: {  
281 - title: '确定删除吗?',  
282 - confirm: handleDelete.bind(null, record),  
283 - },  
284 - },  
285 - {  
286 - label: '添加下级',  
287 - onClick: handleAddSub.bind(null, {pid: record.id}),  
288 - }  
289 - ]  
290 - }  
291 -</script>  
292 -  
293 -<style scoped>  
294 -  
295 -</style>  
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei deleted
1 -<template>  
2 - <div>  
3 -<#assign list_need_category=false>  
4 -<#assign list_need_pca=false>  
5 -<#assign bpm_flag=false>  
6 -  
7 -<#-- 开始循环 -->  
8 -<#list columns as po>  
9 -<#if po.fieldDbName=='bpm_status'>  
10 - <#assign bpm_flag=true>  
11 -</#if>  
12 -<#if po.classType=='cat_tree' && po.dictText?default("")?trim?length == 0>  
13 -<#assign list_need_category=true>  
14 -</#if>  
15 -<#if po.classType=='pca'>  
16 -<#assign list_need_pca=true>  
17 -</#if>  
18 -</#list>  
19 -<#-- 结束循环 -->  
20 - <!--引用表格-->  
21 - <BasicTable @register="registerTable" :rowSelection="rowSelection">  
22 - <!--插槽:table标题-->  
23 - <template #tableTitle>  
24 - <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>  
25 - <ExcelButton :config="excelConfig"></ExcelButton>  
26 - <a-dropdown v-if="checkedKeys.length > 0">  
27 - <template #overlay>  
28 - <a-menu>  
29 - <a-menu-item key="1" @click="batchHandleDelete">  
30 - <Icon icon="ant-design:delete-outlined"></Icon>  
31 - 删除  
32 - </a-menu-item>  
33 - </a-menu>  
34 - </template>  
35 - <a-button>批量操作  
36 - <Icon icon="mdi:chevron-down"></Icon>  
37 - </a-button>  
38 - </a-dropdown>  
39 - </template>  
40 - <!--操作栏-->  
41 - <template #action="{ record }">  
42 - <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>  
43 - </template>  
44 - <!--字段回显插槽-->  
45 - <template #htmlSlot="{text}">  
46 - <div v-html="text"></div>  
47 - </template>  
48 - <template #fileSlot="{text}">  
49 - <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>  
50 - <a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>  
51 - </template>  
52 - </BasicTable>  
53 - <!-- 表单区域 -->  
54 - <${entityName}Modal @register="registerModal" @success="handleSuccess"></${entityName}Modal>  
55 - </div>  
56 -</template>  
57 -  
58 -<script lang="ts" setup>  
59 - import {ref, computed, unref} from 'vue';  
60 - import {BasicTable, useTable, TableAction} from '/@/components/Table';  
61 - import ExcelButton from '/@/components/jeecg/ExcelButton.vue'  
62 - import {useModal} from '/@/components/Modal';  
63 - import ${entityName}Modal from './components/${entityName}Modal.vue'  
64 - import {columns, searchFormSchema} from './${entityName?uncap_first}.data';  
65 - import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName?uncap_first}.api';  
66 - <#if list_need_category>  
67 - import { loadCategoryData } from '/@/api/common/api'  
68 - import { getAuthCache, setAuthCache } from '/@/utils/auth';  
69 - import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';  
70 - </#if>  
71 - const checkedKeys = ref<Array<string | number>>([]);  
72 - //注册model  
73 - const [registerModal, {openModal}] = useModal();  
74 - //注册table数据  
75 - const [registerTable, {reload}] = useTable({  
76 - title: '${tableVo.ftlDescription}',  
77 - api: list,  
78 - rowKey: 'id',  
79 - columns,  
80 - formConfig: {  
81 - labelWidth: 120,  
82 - schemas: searchFormSchema,  
83 - autoSubmitOnEnter:true,  
84 - showAdvancedButton:true,  
85 - fieldMapToTime: [  
86 - <#list columns as po>  
87 - <#if po.isQuery=='Y'>  
88 - <#if po.queryMode!='single'>  
89 - <#if po.classType=='date'>  
90 - ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],  
91 - <#elseif po.classType=='datetime'>  
92 - ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],  
93 - </#if>  
94 - </#if>  
95 - </#if>  
96 - </#list>  
97 - ],  
98 - },  
99 - striped: true,  
100 - useSearchForm: true,  
101 - showTableSetting: true,  
102 - clickToRowSelect: false,  
103 - bordered: true,  
104 - showIndexColumn: false,  
105 - tableSetting: {fullScreen: true},  
106 - actionColumn: {  
107 - width: 120,  
108 - title: '操作',  
109 - dataIndex: 'action',  
110 - slots: {customRender: 'action'},  
111 - fixed: 'right',  
112 - },  
113 - })  
114 - /**  
115 - * excel导入导出配置  
116 - */  
117 - const excelConfig = {  
118 - export: {  
119 - name:'${tableVo.ftlDescription}',  
120 - url: getExportUrl,  
121 - },  
122 - import: {  
123 - url: getImportUrl,  
124 - success: reload,  
125 - }  
126 - }  
127 - /**  
128 - * 选择列配置  
129 - */  
130 - const rowSelection = {  
131 - type: 'checkbox',  
132 - columnWidth: 30,  
133 - selectedRowKeys: checkedKeys,  
134 - onChange: onSelectChange  
135 - }  
136 - /**  
137 - * 选择事件  
138 - */  
139 - function onSelectChange(selectedRowKeys: (string | number)[]) {  
140 - checkedKeys.value = selectedRowKeys;  
141 - }  
142 - /**  
143 - * 新增事件  
144 - */  
145 - function handleAdd() {  
146 - openModal(true, {  
147 - isUpdate: false,  
148 - showFooter: true,  
149 - });  
150 - }  
151 - /**  
152 - * 编辑事件  
153 - */  
154 - function handleEdit(record: Recordable) {  
155 - openModal(true, {  
156 - record,  
157 - isUpdate: true,  
158 - showFooter: true,  
159 - });  
160 - }  
161 - /**  
162 - * 详情  
163 - */  
164 - function handleDetail(record: Recordable) {  
165 - openModal(true, {  
166 - record,  
167 - isUpdate: true,  
168 - showFooter: false,  
169 - });  
170 - }  
171 - /**  
172 - * 删除事件  
173 - */  
174 - async function handleDelete(record) {  
175 - await deleteOne({id: record.id}, reload);  
176 - }  
177 - /**  
178 - * 批量删除事件  
179 - */  
180 - async function batchHandleDelete() {  
181 - await batchDelete({ids: checkedKeys.value}, reload);  
182 - }  
183 - /**  
184 - * 成功回调  
185 - */  
186 - function handleSuccess() {  
187 - reload();  
188 - }  
189 - /**  
190 - * 操作栏  
191 - */  
192 - function getTableAction(record){  
193 - return [  
194 - {  
195 - label: '编辑',  
196 - onClick: handleEdit.bind(null, record),  
197 - }  
198 - ]  
199 - }  
200 - /**  
201 - * 下拉操作栏  
202 - */  
203 - function getDropDownAction(record){  
204 - return [  
205 - {  
206 - label: '详情',  
207 - onClick: handleDetail.bind(null, record),  
208 - }, {  
209 - label: '删除',  
210 - popConfirm: {  
211 - title: '是否确认删除',  
212 - confirm: handleDelete.bind(null, record),  
213 - }  
214 - }  
215 - ]  
216 - }  
217 - <#if list_need_category>  
218 - /**  
219 - * 初始化字典配置  
220 - */  
221 - function initDictConfig(){  
222 - <#list columns as po>  
223 - <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>  
224 - <#if po.classType=='cat_tree' && list_need_category==true>  
225 - loadCategoryData({code:'${po.dictField?default("")}'}).then((res) => {  
226 - if (res) {  
227 - let allDictDate = getAuthCache(DB_DICT_DATA_KEY);  
228 - if(!allDictDate['${po.dictField?default("")}']){  
229 - Object.assign(allDictDate,{'${po.dictField?default("")}':res})  
230 - }  
231 - setAuthCache(DB_DICT_DATA_KEY,allDictDate)  
232 - }  
233 - })  
234 - </#if>  
235 - </#if>  
236 - </#list>  
237 - }  
238 - initDictConfig();  
239 - </#if>  
240 -</script>  
241 -  
242 -<style scoped>  
243 -  
244 -</style>  
245 \ No newline at end of file 0 \ No newline at end of file
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi deleted
1 -import {defHttp} from '/@/utils/http/axios';  
2 -import {Modal} from 'ant-design-vue';  
3 -  
4 -enum Api {  
5 - list = '/${entityPackage}/${entityName?uncap_first}/list',  
6 - save='/${entityPackage}/${entityName?uncap_first}/add',  
7 - edit='/${entityPackage}/${entityName?uncap_first}/edit',  
8 - deleteOne = '/${entityPackage}/${entityName?uncap_first}/delete',  
9 - deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',  
10 - importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',  
11 - exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',  
12 -<#list subTables as sub><#rt/>  
13 - ${sub.entityName?uncap_first}List = '/${entityPackage}/${entityName?uncap_first}/query${sub.entityName}ByMainId',  
14 -</#list>  
15 -}  
16 -/**  
17 - * 导出api  
18 - * @param params  
19 - */  
20 -export const getExportUrl = Api.exportXls;  
21 -  
22 -/**  
23 - * 导入api  
24 - */  
25 -export const getImportUrl = Api.importExcel;  
26 -<#list subTables as sub><#rt/>  
27 -/**  
28 - * 查询子表数据  
29 - * @param params  
30 - */  
31 -export const ${sub.entityName?uncap_first}List = Api.${sub.entityName?uncap_first}List;  
32 -</#list>  
33 -/**  
34 - * 列表接口  
35 - * @param params  
36 - */  
37 -export const list = (params) =>  
38 - defHttp.get({url: Api.list, params});  
39 -  
40 -/**  
41 - * 删除单个  
42 - */  
43 -export const deleteOne = (params,handleSuccess) => {  
44 - return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {  
45 - handleSuccess();  
46 - });  
47 -}  
48 -/**  
49 - * 批量删除  
50 - * @param params  
51 - */  
52 -export const batchDelete = (params, handleSuccess) => {  
53 - Modal.confirm({  
54 - title: '确认删除',  
55 - content: '是否删除选中数据',  
56 - okText: '确认',  
57 - cancelText: '取消',  
58 - onOk: () => {  
59 - return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {  
60 - handleSuccess();  
61 - });  
62 - }  
63 - });  
64 -}  
65 -/**  
66 - * 保存或者更新  
67 - * @param params  
68 - */  
69 -export const saveOrUpdate = (params, isUpdate) => {  
70 - let url = isUpdate ? Api.edit : Api.save;  
71 - return defHttp.post({url: url, params});  
72 -}  
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi deleted
1 -import {BasicColumn} from '/@/components/Table';  
2 -import {FormSchema} from '/@/components/Table';  
3 -import { rules} from '/@/utils/helper/validator';  
4 -import { render } from '/@/utils/common/renderUtils';  
5 -import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'  
6 -//列表数据  
7 -export const columns: BasicColumn[] = [  
8 - <#list columns as po>  
9 - <#if po.isShowList =='Y' && po.fieldName !='id'>  
10 - {  
11 - title: '${po.filedComment}',  
12 - align:"center",  
13 - <#if po.sort=='Y'>  
14 - sorter: true,  
15 - </#if>  
16 - <#if po.classType=='date'>  
17 - dataIndex: '${po.fieldName}',  
18 - customRender:({text}) =>{  
19 - return !text?"":(text.length>10?text.substr(0,10):text)  
20 - },  
21 - <#elseif po.fieldDbType=='Blob'>  
22 - dataIndex: '${po.fieldName}String'  
23 - <#elseif po.classType=='umeditor'>  
24 - dataIndex: '${po.fieldName}',  
25 - slots: { customRender: 'htmlSlot' },  
26 - <#elseif po.classType=='pca'>  
27 - dataIndex: '${po.fieldName}',  
28 - slots: { customRender: 'pcaSlot' },//TODO 未翻译  
29 - <#elseif po.classType=='file'>  
30 - dataIndex: '${po.fieldName}',  
31 - slots: { customRender: 'fileSlot' },  
32 - <#elseif po.classType=='image'>  
33 - dataIndex: '${po.fieldName}',  
34 - customRender:render.renderAvatar,  
35 - <#elseif po.classType=='switch'>  
36 - dataIndex: '${po.fieldName}',  
37 -<#assign switch_extend_arr=['Y','N']>  
38 -<#if po.dictField?default("")?contains("[")>  
39 -<#assign switch_extend_arr=po.dictField?eval>  
40 -</#if>  
41 -<#list switch_extend_arr as a>  
42 -<#if a_index == 0>  
43 -<#assign switch_extend_arr1=a>  
44 -<#else>  
45 -<#assign switch_extend_arr2=a>  
46 -</#if>  
47 -</#list>  
48 - customRender:({text}) => {  
49 - return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])  
50 - },  
51 - <#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'>  
52 - dataIndex: '${po.fieldName}_dictText'  
53 - <#elseif po.classType=='cat_tree'>  
54 - dataIndex: '${po.fieldName}',  
55 - <#if po.dictText?default("")?trim?length == 0>  
56 - customRender:({text}) => {  
57 - return render.renderCategoryTree(text,'${po.dictField?default("")}')  
58 - },  
59 - <#else>  
60 - customRender: (text, record) => (text ? record['${po.dictText}'] : '')  
61 - </#if>  
62 - <#else>  
63 - dataIndex: '${po.fieldName}'  
64 - </#if>  
65 - },  
66 - </#if>  
67 - </#list>  
68 -];  
69 -//查询数据  
70 -export const searchFormSchema: FormSchema[] = [  
71 -<#-- 开始循环 -->  
72 -<#list columns as po>  
73 -<#if po.fieldDbName=='bpm_status'>  
74 - <#assign bpm_flag=true>  
75 -</#if>  
76 -<#if po.isQuery=='Y'>  
77 -<#assign query_flag=true>  
78 - <#assign query_field_dictCode="">  
79 - <#if po.dictTable?default("")?trim?length gt 1>  
80 - <#assign query_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">  
81 - <#elseif po.dictField?default("")?trim?length gt 1>  
82 - <#assign query_field_dictCode="${po.dictField}">  
83 - </#if>  
84 -<#if po.queryMode=='single'>  
85 - {  
86 - label: "${po.filedComment}",  
87 - field: "${po.fieldName}",  
88 -<#if po.classType=='sel_search'>  
89 - component: 'JSearchSelect',  
90 - componentProps:{  
91 - dict:"${po.dictTable},${po.dictText},${po.dictField}"  
92 - },  
93 -<#elseif po.classType=='sel_user'>  
94 - component: 'JSelectUserByDept',  
95 -<#elseif po.classType=='switch'>  
96 - component: 'JSwitch',  
97 - componentProps:{  
98 - <#if po.dictField != 'is_open'>  
99 - options:"${po.dictField}"  
100 - </#if>  
101 - },  
102 - <#elseif po.classType=='sel_depart'>  
103 - component: 'JSelectDept',  
104 - <#elseif po.classType=='list_multi'>  
105 - component: 'JMultiSelectTag',//暂无该组件  
106 - componentProps:{  
107 - dictCode:"query_field_dictCode?default("")"  
108 - },  
109 - <#elseif po.classType=='cat_tree'>  
110 - component: 'JCategorySelect',  
111 - componentProps:{  
112 - pcode:"${po.dictField?default("")}",//back和事件未添加,暂时有问题  
113 - },  
114 -<#elseif po.classType=='date'>  
115 - component: 'DatePicker',  
116 -<#elseif po.classType=='datetime'>  
117 - component: 'DatePicker',  
118 - componentProps: {  
119 - showTime:true  
120 - },  
121 -<#elseif po.classType=='pca'>  
122 - component: 'JAreaLinkage',  
123 -<#elseif po.classType=='popup'>  
124 - component: 'JPopup',  
125 - componentProps: ({ formActionType }) => {  
126 - const {setFieldsValue} = formActionType;  
127 - return{  
128 - setFieldsValue:setFieldsValue,  
129 - code:"${po.dictTable}",  
130 - fieldConfig:"${po.dictField}",  
131 - multi:${po.extendParams.popupMulti?c},  
132 - }  
133 - },  
134 -<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>  
135 -<#-- ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->  
136 - component: 'JDictSelectTag',  
137 - componentProps:{  
138 - <#if po.dictTable?default("")?trim?length gt 1>  
139 - dictCode:"${po.dictTable},${po.dictText},${po.dictField}"  
140 - <#elseif po.dictField?default("")?trim?length gt 1>  
141 - dictCode:"${po.dictField}"  
142 - </#if>  
143 - },  
144 -<#else>  
145 - component: 'Input',  
146 -</#if>  
147 -<#else>  
148 - {  
149 - label: "${po.filedComment}",  
150 - field: "${po.fieldName}",  
151 -<#if po.classType=='date'>  
152 - component: 'RangePicker',  
153 -<#elseif po.classType=='datetime'>  
154 - component: 'RangePicker',  
155 - componentProps: {  
156 - showTime:true  
157 - },  
158 -<#else>  
159 - component: 'Input', //TODO 范围查询  
160 -</#if>  
161 - colProps: {span: 6},  
162 - },  
163 -</#if>  
164 -</#if>  
165 -</#list>  
166 -<#-- 结束循环 -->  
167 -];  
168 -//表单数据  
169 -export const formSchema: FormSchema[] = [  
170 -<#assign form_cat_tree = false>  
171 -<#assign form_cat_back = "">  
172 -<#assign bpm_flag=false>  
173 -<#list columns as po><#rt/>  
174 -<#if po.fieldDbName=='bpm_status'>  
175 - <#assign bpm_flag=true>  
176 -</#if>  
177 -<#if po.isShow =='Y'>  
178 -<#assign form_field_dictCode="">  
179 - <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>  
180 - <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">  
181 - <#elseif po.dictField?default("")?trim?length gt 1>  
182 - <#assign form_field_dictCode="${po.dictField}">  
183 - </#if>  
184 - {  
185 - label: '${po.filedComment}',  
186 - field: '${po.fieldName}',  
187 - <#if po.classType =='date'>  
188 - component: 'DatePicker',  
189 - <#elseif po.fieldType =='datetime'>  
190 - component: 'DatePicker',  
191 - componentProps: {  
192 - showTime:true  
193 - },  
194 - <#elseif po.fieldType =='time'>  
195 - component: 'TimePicker',  
196 - <#elseif po.classType =='popup'>  
197 - component: 'JPopup',  
198 - componentProps: ({ formActionType }) => {  
199 - const {setFieldsValue} = formActionType;  
200 - return{  
201 - setFieldsValue:setFieldsValue,  
202 - code:"${po.dictTable}",  
203 - fieldConfig:${po.dictField},  
204 - multi:${po.extendParams.popupMulti?c},  
205 - }  
206 - }  
207 - <#elseif po.classType =='sel_depart'>  
208 - component: 'JSelectDept',  
209 - <#elseif po.classType =='switch'>  
210 - component: 'JSwitch',  
211 - componentProps:{  
212 - <#if po.dictField != 'is_open'>  
213 - options:${po.dictField}  
214 - </#if>  
215 - }  
216 - <#elseif po.classType =='pca'>  
217 - component: 'JAreaLinkage',  
218 - <#elseif po.classType =='markdown'>  
219 - component: 'JMarkdownEditor',//注意string转换问题  
220 - <#elseif po.classType =='password'>  
221 - component: 'InputPassword',  
222 - <#elseif po.classType =='sel_user'>  
223 - component: 'JSelectUserByDept',  
224 - componentProps:{  
225 - labelKey:'realname',  
226 - }  
227 - <#elseif po.classType =='textarea'>  
228 - component: 'InputTextArea',//TODO 注意string转换问题  
229 - <#elseif po.classType=='list' || po.classType=='radio'>  
230 - component: 'JDictSelectTag',  
231 - componentProps:{  
232 - dictCode:"${form_field_dictCode}"  
233 - }  
234 - <#elseif po.classType=='list_multi' || po.classType=='checkbox'>  
235 - component: 'JMultiSelectTag',//TODO 暂无该组件  
236 - componentProps:{  
237 - dictCode:"${form_field_dictCode}"  
238 - }  
239 - <#elseif po.classType=='sel_search'>  
240 - component: 'JSearchSelect',  
241 - componentProps:{  
242 - dict:"${form_field_dictCode}"  
243 - }  
244 -<#elseif po.classType=='cat_tree'>  
245 - <#assign form_cat_tree = true>  
246 - component: 'JCategorySelect',  
247 - componentProps:{  
248 - pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题  
249 - }  
250 - <#if po.dictText?default("")?trim?length gt 1>  
251 - <#assign form_cat_back = "${po.dictText}">  
252 - </#if>  
253 - <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>  
254 - component: 'InputNumber',  
255 - <#elseif po.classType=='file'>  
256 - component: 'JUpload',  
257 - componentProps:{  
258 - <#if po.uploadnum??>  
259 - maxCount:${po.uploadnum}  
260 - </#if>  
261 - }  
262 - <#elseif po.classType=='image'>  
263 - component: 'JImageUpload',  
264 - componentProps:{  
265 - <#if po.uploadnum??>  
266 - fileMax:${po.uploadnum}  
267 - </#if>  
268 - }  
269 - <#elseif po.classType=='umeditor'>  
270 - component: 'JCodeEditor', //TODO String后缀暂未添加  
271 - <#elseif po.classType == 'sel_tree'>  
272 - component: 'JTreeSelect',  
273 - componentProps:{  
274 - <#if po.dictText??>  
275 - <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>  
276 - dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",  
277 - <#elseif po.dictText?split(',')[1]??>  
278 - pidField:"${po.dictText?split(',')[1]}",  
279 - <#elseif po.dictText?split(',')[3]??>  
280 - hasChildField:"${po.dictText?split(',')[3]}",  
281 - </#if>  
282 - </#if>  
283 - pidValue:"${po.dictField}",  
284 - }  
285 - <#else>  
286 - component: 'Input',  
287 - </#if>  
288 - <#include "/common/utils.ftl">  
289 - <#if po.isShow == 'Y' && poHasCheck(po)>  
290 - dynamicRules: ({model,schema}) => {  
291 - <#if po.fieldName != 'id'>  
292 - <#assign fieldValidType = po.fieldValidType!''>  
293 - return [  
294 - <#-- 非空校验 -->  
295 - <#if po.nullable == 'N' || fieldValidType == '*'>  
296 - { required: true, message: '请输入${po.filedComment}!'},  
297 - <#elseif fieldValidType!=''>  
298 - { required: false},  
299 - </#if>  
300 - <#-- 唯一校验 -->  
301 - <#if fieldValidType == 'only'>  
302 - {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema,true)[0]},  
303 - <#-- 6到16位数字 -->  
304 - <#elseif fieldValidType == 'n6-16'>  
305 - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},  
306 - <#-- 6到16位任意字符 -->  
307 - <#elseif fieldValidType == '*6-16'>  
308 - { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},  
309 - <#-- 6到18位字符串 -->  
310 - <#elseif fieldValidType == 's6-18'>  
311 - { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},  
312 - <#-- 网址 -->  
313 - <#elseif fieldValidType == 'url'>  
314 - { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},  
315 - <#-- 电子邮件 -->  
316 - <#elseif fieldValidType == 'e'>  
317 - { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},  
318 - <#-- 手机号码 -->  
319 - <#elseif fieldValidType == 'm'>  
320 - { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},  
321 - <#-- 邮政编码 -->  
322 - <#elseif fieldValidType == 'p'>  
323 - { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},  
324 - <#-- 字母 -->  
325 - <#elseif fieldValidType == 's'>  
326 - { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},  
327 - <#-- 数字 -->  
328 - <#elseif fieldValidType == 'n'>  
329 - { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},  
330 - <#-- 整数 -->  
331 - <#elseif fieldValidType == 'z'>  
332 - { pattern: /^-?\d+$/, message: '请输入整数!'},  
333 - <#-- 金额 -->  
334 - <#elseif fieldValidType == 'money'>  
335 - { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},  
336 - <#-- 正则校验 -->  
337 - <#elseif fieldValidType != '' && fieldValidType != '*'>  
338 - { pattern: '${fieldValidType}', message: '不符合校验规则!'},  
339 - <#-- 无校验 -->  
340 - <#else>  
341 - <#t>  
342 - </#if>  
343 - ];  
344 - </#if>  
345 - },  
346 - </#if>  
347 - <#if po.readonly=='Y'>  
348 - dynamicDisabled:true  
349 - </#if>  
350 - },  
351 -</#if>  
352 -</#list>  
353 -];  
354 -//子表单数据  
355 -<#list subTables as sub>  
356 -<#if sub.foreignRelationType =='1'>  
357 -export const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [  
358 -<#assign form_cat_tree = false>  
359 -<#assign form_cat_back = "">  
360 -<#assign bpm_flag=false>  
361 -<#list sub.colums as po><#rt/>  
362 -<#if po.fieldDbName=='bpm_status'>  
363 - <#assign bpm_flag=true>  
364 -</#if>  
365 -<#if po.isShow =='Y'>  
366 -<#assign form_field_dictCode="">  
367 - <#if po.dictTable?default("")?trim?length gt 1 && po.dictText?default("")?trim?length gt 1 && po.dictField?default("")?trim?length gt 1>  
368 - <#assign form_field_dictCode="${po.dictTable},${po.dictText},${po.dictField}">  
369 - <#elseif po.dictField?default("")?trim?length gt 1>  
370 - <#assign form_field_dictCode="${po.dictField}">  
371 - </#if>  
372 - {  
373 - label: '${po.filedComment}',  
374 - field: '${po.fieldName}',  
375 - <#if po.classType =='date'>  
376 - component: 'DatePicker',  
377 - <#elseif po.fieldType =='datetime'>  
378 - component: 'DatePicker',  
379 - componentProps: {  
380 - showTime:true  
381 - },  
382 - <#elseif po.fieldType =='time'>  
383 - component: 'TimePicker',  
384 - <#elseif po.classType =='popup'>  
385 - component: 'JPopup',  
386 - componentProps: ({ formActionType }) => {  
387 - const {setFieldsValue} = formActionType;  
388 - return{  
389 - setFieldsValue:setFieldsValue,  
390 - code:"${po.dictTable}",  
391 - fieldConfig:${po.dictField},  
392 - multi:${po.extendParams.popupMulti?c},  
393 - }  
394 - }  
395 - <#elseif po.classType =='sel_depart'>  
396 - component: 'JSelectDept',  
397 - <#elseif po.classType =='switch'>  
398 - component: 'JSwitch',  
399 - componentProps:{  
400 - <#if po.dictField != 'is_open'>  
401 - options:${po.dictField}  
402 - </#if>  
403 - }  
404 - <#elseif po.classType =='pca'>  
405 - component: 'JAreaLinkage',  
406 - <#elseif po.classType =='markdown'>  
407 - component: 'JMarkdownEditor',//注意string转换问题  
408 - <#elseif po.classType =='password'>  
409 - component: 'InputPassword',  
410 - <#elseif po.classType =='sel_user'>  
411 - component: 'JSelectUserByDept',  
412 - componentProps:{  
413 - labelKey:'realname',  
414 - }  
415 - <#elseif po.classType =='textarea'>  
416 - component: 'InputTextArea',//TODO 注意string转换问题  
417 - <#elseif po.classType=='list' || po.classType=='radio'>  
418 - component: 'JDictSelectTag',  
419 - componentProps:{  
420 - dictCode:"${form_field_dictCode}"  
421 - }  
422 - <#elseif po.classType=='list_multi' || po.classType=='checkbox'>  
423 - component: 'JMultiSelectTag',//TODO 暂无该组件  
424 - componentProps:{  
425 - dictCode:"${form_field_dictCode}"  
426 - }  
427 - <#elseif po.classType=='sel_search'>  
428 - component: 'JSearchSelect',  
429 - componentProps:{  
430 - dict:"${form_field_dictCode}"  
431 - }  
432 -<#elseif po.classType=='cat_tree'>  
433 - <#assign form_cat_tree = true>  
434 - component: 'JCategorySelect',  
435 - componentProps:{  
436 - pcode:"${po.dictField?default("")}", //TODO back和事件未添加,暂时有问题  
437 - }  
438 - <#if po.dictText?default("")?trim?length gt 1>  
439 - <#assign form_cat_back = "${po.dictText}">  
440 - </#if>  
441 - <#elseif po.fieldDbType=='int' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>  
442 - component: 'InputNumber',  
443 - <#elseif po.classType=='file'>  
444 - component: 'JUpload',  
445 - componentProps:{  
446 - <#if po.uploadnum??>  
447 - maxCount:${po.uploadnum}  
448 - </#if>  
449 - }  
450 - <#elseif po.classType=='image'>  
451 - component: 'JImageUpload',  
452 - componentProps:{  
453 - <#if po.uploadnum??>  
454 - fileMax:${po.uploadnum}  
455 - </#if>  
456 - }  
457 - <#elseif po.classType=='umeditor'>  
458 - component: 'JCodeEditor', //TODO String后缀暂未添加  
459 - <#elseif po.classType == 'sel_tree'>  
460 - component: 'JTreeSelect',  
461 - componentProps:{  
462 - <#if po.dictText??>  
463 - <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>  
464 - dict:"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}",  
465 - <#elseif po.dictText?split(',')[1]??>  
466 - pidField:"${po.dictText?split(',')[1]}",  
467 - <#elseif po.dictText?split(',')[3]??>  
468 - hasChildField:"${po.dictText?split(',')[3]}",  
469 - </#if>  
470 - </#if>  
471 - pidValue:"${po.dictField}",  
472 - }  
473 - <#else>  
474 - component: 'Input',  
475 - </#if>  
476 - <#include "/common/utils.ftl">  
477 - <#if po.isShow == 'Y' && poHasCheck(po)>  
478 - dynamicRules: ({model,schema}) => {  
479 - <#if po.fieldName != 'id'>  
480 - <#assign fieldValidType = po.fieldValidType!''>  
481 - return [  
482 - <#-- 非空校验 -->  
483 - <#if po.nullable == 'N' || fieldValidType == '*'>  
484 - { required: true, message: '请输入${po.filedComment}!'},  
485 - <#elseif fieldValidType!=''>  
486 - { required: false},  
487 - </#if>  
488 - <#-- 唯一校验 -->  
489 - <#if fieldValidType == 'only'>  
490 - {...rules.duplicateCheckRule(<#if sub?default("")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema,true)[0]},  
491 - <#-- 6到16位数字 -->  
492 - <#elseif fieldValidType == 'n6-16'>  
493 - { pattern: /^\d{6,16}$/, message: '请输入6到16位数字!'},  
494 - <#-- 6到16位任意字符 -->  
495 - <#elseif fieldValidType == '*6-16'>  
496 - { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},  
497 - <#-- 6到18位字符串 -->  
498 - <#elseif fieldValidType == 's6-18'>  
499 - { pattern: /^.{6,18}$/, message: '请输入6到18位任意字符!'},  
500 - <#-- 网址 -->  
501 - <#elseif fieldValidType == 'url'>  
502 - { pattern: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$/, message: '请输入正确的网址!'},  
503 - <#-- 电子邮件 -->  
504 - <#elseif fieldValidType == 'e'>  
505 - { pattern: /^([\w]+\.*)([\w]+)@[\w]+\.\w{3}(\.\w{2}|)$/, message: '请输入正确的电子邮件!'},  
506 - <#-- 手机号码 -->  
507 - <#elseif fieldValidType == 'm'>  
508 - { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号码!'},  
509 - <#-- 邮政编码 -->  
510 - <#elseif fieldValidType == 'p'>  
511 - { pattern: /^[1-9]\d{5}$/, message: '请输入正确的邮政编码!'},  
512 - <#-- 字母 -->  
513 - <#elseif fieldValidType == 's'>  
514 - { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},  
515 - <#-- 数字 -->  
516 - <#elseif fieldValidType == 'n'>  
517 - { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!'},  
518 - <#-- 整数 -->  
519 - <#elseif fieldValidType == 'z'>  
520 - { pattern: /^-?\d+$/, message: '请输入整数!'},  
521 - <#-- 金额 -->  
522 - <#elseif fieldValidType == 'money'>  
523 - { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},  
524 - <#-- 正则校验 -->  
525 - <#elseif fieldValidType != '' && fieldValidType != '*'>  
526 - { pattern: '${fieldValidType}', message: '不符合校验规则!'},  
527 - <#-- 无校验 -->  
528 - <#else>  
529 - <#t>  
530 - </#if>  
531 - ];  
532 - </#if>  
533 - },  
534 - </#if>  
535 - <#if po.readonly=='Y'>  
536 - dynamicDisabled:true  
537 - </#if>  
538 - },  
539 -</#if>  
540 -</#list>  
541 -];  
542 -</#if>  
543 -</#list>  
544 -//子表表格配置  
545 -<#list subTables as sub>  
546 -<#if sub.foreignRelationType =='0'>  
547 -export const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [  
548 -<#assign popupBackFields = "">  
549 -  
550 -<#-- 循环子表的列 开始 -->  
551 -<#list sub.colums as col><#rt/>  
552 -<#if col.isShow =='Y'>  
553 -<#if col.filedComment !='外键' >  
554 - {  
555 - title: '${col.filedComment}',  
556 - key: '${autoStringSuffixForModel(col)}',  
557 -<#if col.classType =='date'>  
558 - type: JVxeTypes.date,  
559 - <#if col.readonly=='Y'>  
560 - disabled:true,  
561 - </#if>  
562 -<#elseif col.classType =='datetime'>  
563 - type: JVxeTypes.datetime,  
564 - <#if col.readonly=='Y'>  
565 - disabled:true,  
566 - </#if>  
567 -<#elseif col.classType =='textarea'>  
568 - type: JVxeTypes.textarea,  
569 - <#if col.readonly=='Y'>  
570 - disabled:true,  
571 - </#if>  
572 -<#elseif "int,decimal,double,"?contains(col.classType)>  
573 - type: JVxeTypes.inputNumber,  
574 - <#if col.readonly=='Y'>  
575 - disabled:true,  
576 - </#if>  
577 -<#elseif col.classType =='list' || col.classType =='radio'>  
578 - type: JVxeTypes.select,  
579 - options:[],  
580 - <#if col.dictTable?default("")?trim?length gt 1>  
581 - dictCode:"${col.dictTable},${col.dictText},${col.dictField}",  
582 - <#else>  
583 - dictCode:"${col.dictField}",  
584 - </#if>  
585 - <#if col.readonly=='Y'>  
586 - disabled:true,  
587 - </#if>  
588 -<#elseif col.classType =='list_multi' || col.classType =='checkbox'>  
589 - type: JVxeTypes.selectMultiple,  
590 - options:[],  
591 - <#if col.dictTable?default("")?trim?length gt 1>  
592 - dictCode:"${col.dictTable},${col.dictText},${col.dictField}",  
593 - <#else>  
594 - dictCode:"${col.dictField}",  
595 - </#if>  
596 - <#if col.readonly=='Y'>  
597 - disabled:true,  
598 - </#if>  
599 -<#elseif col.classType =='sel_search'>  
600 - type: JVxeTypes.selectSearch,  
601 - <#if col.dictTable?default("")?trim?length gt 1>  
602 - dictCode:"${col.dictTable},${col.dictText},${col.dictField}",  
603 - <#else>  
604 - dictCode:"${col.dictField}",  
605 - </#if>  
606 - <#if col.readonly=='Y'>  
607 - disabled:true,  
608 - </#if>  
609 -<#elseif col.classType =='image'>  
610 - type: JVxeTypes.image,  
611 - token:true,  
612 - responseName:"message",  
613 - <#if col.readonly=='Y'>  
614 - disabled:true,  
615 - </#if>  
616 - <#if col.uploadnum??>  
617 - number: ${col.uploadnum},  
618 - </#if>  
619 -<#elseif col.classType =='file'>  
620 - type: JVxeTypes.file,  
621 - token:true,  
622 - responseName:"message",  
623 - <#if col.readonly=='Y'>  
624 - disabled:true,  
625 - </#if>  
626 - <#if col.uploadnum??>  
627 - number: ${col.uploadnum},  
628 - </#if>  
629 -<#elseif col.classType =='switch'>  
630 - type: JVxeTypes.checkbox,  
631 - <#if col.dictField == 'is_open'>  
632 - customValue: ['Y', 'N'],  
633 - <#else>  
634 - customValue: ${col.dictField},  
635 - </#if>  
636 - <#if col.readonly=='Y'>  
637 - disabled:true,  
638 - </#if>  
639 -<#elseif col.classType =='popup'>  
640 -<#if popupBackFields?length gt 0>  
641 - <#assign popupBackFields = "${popupBackFields}"+","+"${col.dictText}">  
642 -<#else>  
643 - <#assign popupBackFields = "${col.dictText}">  
644 -</#if>  
645 - type: JVxeTypes.popup,  
646 - popupCode:"${col.dictTable}",  
647 - field:"${col.dictField}",  
648 - orgFields:"${col.dictField}",  
649 - destFields:"${Format.underlineToHump(col.dictText)}",  
650 - <#if col.readonly=='Y'>  
651 - disabled:true,  
652 - </#if>  
653 -<#else>  
654 - type: JVxeTypes.input,  
655 - <#if col.readonly=='Y'>  
656 - disabled:true,  
657 - </#if>  
658 -</#if>  
659 -<#if col.classType =='list_multi' || col.classType =='checkbox'>  
660 - width:"250px",  
661 -<#else>  
662 - width:"200px",  
663 -</#if>  
664 -<#if col.classType =='file'>  
665 - placeholder: '请选择文件',  
666 -<#else>  
667 - placeholder: '请输入${'$'}{title}',  
668 -</#if>  
669 -<#if col.defaultVal??>  
670 -<#if col.fieldDbType=="BigDecimal" || col.fieldDbType=="double" || col.fieldDbType=="int">  
671 - defaultValue:${col.defaultVal},  
672 - <#else>  
673 - defaultValue:"${col.defaultVal}",  
674 -</#if>  
675 -<#else>  
676 - defaultValue:'',  
677 -</#if>  
678 -<#-- 子表的校验 -->  
679 -<#assign subFieldValidType = col.fieldValidType!''>  
680 -<#-- 非空校验 -->  
681 -<#if col.nullable == 'N' || subFieldValidType == '*'>  
682 - validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],  
683 -<#-- 其他情况下,只要有值就被认为是正则校验 -->  
684 -<#elseif subFieldValidType?length gt 0>  
685 -<#assign subMessage = '格式不正确'>  
686 -<#if subFieldValidType == 'only' >  
687 - <#assign subMessage = '不能重复'>  
688 -</#if>  
689 - validateRules: [{ pattern: "${subFieldValidType}", message: "${'$'}{title}${subMessage}" }],  
690 -</#if>  
691 - },  
692 -</#if>  
693 -</#if>  
694 -</#list>  
695 -<#-- 循环子表的列 结束 -->  
696 - ]  
697 -</#if>  
698 -</#list>  
699 \ No newline at end of file 0 \ No newline at end of file
jeecg-boot/jeecg-boot-module-system/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei deleted
1 -<template>  
2 - <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit">  
3 - <BasicForm @register="registerForm" ref="formRef"/>  
4 - <!-- 子表单区域 -->  
5 - <a-tabs v-model:activeKey="activeKey" @change="handleChangeTabs">  
6 -<#list subTables as sub><#rt/>  
7 - <#if sub.foreignRelationType =='1'>  
8 - <a-tab-pane tab="${sub.ftlDescription}" :key="refKeys[${sub_index}]" :forceRender="true">  
9 - <${sub.entityName}Form ref="${sub.entityName?uncap_first}Form"></${sub.entityName}Form>  
10 - </a-tab-pane>  
11 -  
12 - <#else>  
13 - <a-tab-pane tab="${sub.ftlDescription}" :key="refKeys[${sub_index}]" :forceRender="true">  
14 - <JVxeTable  
15 - keep-source  
16 - resizable  
17 - :ref="refKeys[${sub_index}]"  
18 - :loading="${sub.entityName?uncap_first}Table.loading"  
19 - :columns="${sub.entityName?uncap_first}Table.columns"  
20 - :dataSource="${sub.entityName?uncap_first}Table.dataSource"  
21 - :maxHeight="300"  
22 - :rowNumber="true"  
23 - :rowSelection="true"  
24 - :toolbar="true"  
25 - />  
26 - </a-tab-pane>  
27 - </#if>  
28 -</#list>  
29 - </a-tabs>  
30 - </BasicModal>  
31 -</template>  
32 -  
33 -<script lang="ts" setup>  
34 - import {ref, computed, unref,reactive} from 'vue';  
35 - import {BasicModal, useModalInner} from '/@/components/Modal';  
36 - import {BasicForm, useForm} from '/@/components/Form/index';  
37 - import { JVxeTable } from '/@/components/jeecg/JVxeTable'  
38 - import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'  
39 - <#list subTables as sub>  
40 - <#if sub.foreignRelationType =='1'>  
41 - import ${sub.entityName}Form from './${sub.entityName}Form.vue'  
42 - </#if>  
43 - </#list>  
44 - import {formSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}Columns</#if></#list>} from '../${entityName?uncap_first}.data';  
45 - import {saveOrUpdate<#list subTables as sub>,${sub.entityName?uncap_first}List</#list>} from '../${entityName?uncap_first}.api';  
46 - import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'  
47 - // Emits声明  
48 - const emit = defineEmits(['register','success']);  
49 - const isUpdate = ref(true);  
50 - const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);  
51 - <#assign hasOne2Many = false>  
52 - <#assign hasOne2One = false>  
53 - const activeKey = ref('${subTables[0].entityName?uncap_first}');  
54 -<#list subTables as sub>  
55 -<#if sub.foreignRelationType =='0'>  
56 - <#assign hasOne2Many = true>  
57 - const ${sub.entityName?uncap_first} = ref();  
58 -</#if>  
59 -<#if sub.foreignRelationType =='1'>  
60 - <#assign hasOne2One = true>  
61 - const ${sub.entityName?uncap_first}Form = ref();  
62 -</#if>  
63 -</#list>  
64 - const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>};  
65 - <#list subTables as sub>  
66 - <#if sub.foreignRelationType =='0'>  
67 - const ${sub.entityName?uncap_first}Table = reactive({  
68 - loading: false,  
69 - dataSource: [],  
70 - columns:${sub.entityName?uncap_first}Columns  
71 - })  
72 - </#if>  
73 - </#list>  
74 - //表单配置  
75 - const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({  
76 - labelWidth: 150,  
77 - schemas: formSchema,  
78 - showActionButtonGroup: false,  
79 - });  
80 - //表单赋值  
81 - const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {  
82 - //重置表单  
83 - await reset();  
84 - setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});  
85 - isUpdate.value = !!data?.isUpdate;  
86 - if (unref(isUpdate)) {  
87 - //表单赋值  
88 - await setFieldsValue({  
89 - ...data.record,  
90 - });  
91 - <#list subTables as sub><#rt/>  
92 - <#if sub.foreignRelationType =='1'>  
93 - ${sub.entityName?uncap_first}Form.value.initFormData(${sub.entityName?uncap_first}List,data?.record?.id)  
94 - </#if>  
95 - </#list>  
96 - <#list subTables as sub><#rt/>  
97 - <#if sub.foreignRelationType =='0'>  
98 - requestSubTableData(${sub.entityName?uncap_first}List, {id:data?.record?.id}, ${sub.entityName?uncap_first}Table)  
99 - </#if>  
100 - </#list>  
101 - }  
102 - // 隐藏底部时禁用整个表单  
103 - setProps({ disabled: !data?.showFooter })  
104 - });  
105 - //方法配置  
106 - const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm</#if>);  
107 -  
108 - //设置标题  
109 - const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));  
110 -  
111 - async function reset(){  
112 - await resetFields();  
113 - activeKey.value = ref('${subTables[0].entityName?uncap_first}');  
114 - <#list subTables as sub>  
115 - <#if sub.foreignRelationType =='0'>  
116 - ${sub.entityName?uncap_first}Table.dataSource = [];  
117 - </#if>  
118 - <#if sub.foreignRelationType =='1'>  
119 - ${sub.entityName?uncap_first}Form.value.resetFields();  
120 - </#if>  
121 - </#list>  
122 - }  
123 - function classifyIntoFormData(allValues) {  
124 - let main = Object.assign({}, allValues.formValue)  
125 - return {  
126 - ...main, // 展开  
127 - <#assign subManyIndex = 0>  
128 - <#list subTables as sub><#rt/>  
129 - <#if sub.foreignRelationType =='0'>  
130 - ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,  
131 - <#assign subManyIndex = subManyIndex+1>  
132 - <#else>  
133 - ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(),  
134 - </#if>  
135 - </#list>  
136 - }  
137 - }  
138 - <#if hasOne2One==true>  
139 - //校验所有一对一子表表单  
140 - function validateSubForm(allValues){  
141 - return new Promise((resolve,reject)=>{  
142 - Promise.all([  
143 - <#list subTables as sub><#rt/>  
144 - <#if sub.foreignRelationType =='1'>  
145 - ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index}),  
146 - </#if>  
147 - </#list>  
148 - ]).then(() => {  
149 - resolve(allValues)  
150 - }).catch(e => {  
151 - if (e.error === VALIDATE_FAILED) {  
152 - // 如果有未通过表单验证的子表,就自动跳转到它所在的tab  
153 - activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index]  
154 - } else {  
155 - console.error(e)  
156 - }  
157 - })  
158 - })  
159 - }  
160 - </#if>  
161 - //表单提交事件  
162 - async function requestAddOrEdit(values) {  
163 - try {  
164 - setModalProps({confirmLoading: true});  
165 - //提交表单  
166 - await saveOrUpdate(values, isUpdate.value);  
167 - //关闭弹窗  
168 - closeModal();  
169 - //刷新列表  
170 - emit('success');  
171 - } finally {  
172 - setModalProps({confirmLoading: false});  
173 - }  
174 - }  
175 -</script>  
176 -  
177 -<style lang="less" scoped>  
178 -  
179 -</style>  
180 \ No newline at end of file 0 \ No newline at end of file
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
1 -<#list subTables as sub>  
2 -<#if sub.foreignRelationType=='1'>  
3 -#segment#${sub.entityName}Form.vue  
4 -<template>  
5 - <BasicForm @register="registerForm"/>  
6 -</template>  
7 -<script lang="ts">  
8 - import {defineComponent} from 'vue';  
9 - import {BasicForm, useForm} from '/@/components/Form/index';  
10 - import {${sub.entityName?uncap_first}FormSchema} from '../${entityName?uncap_first}.data';  
11 - import {defHttp} from '/@/utils/http/axios';  
12 - import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'  
13 -  
14 - export default defineComponent({  
15 - name:"${sub.entityName}Form",  
16 - components: {BasicForm},  
17 - emits:['register'],  
18 - setup(_,{emit}) {  
19 - const [registerForm, {resetFields, setFieldsValue,getFieldsValue,validate}] = useForm({  
20 - labelWidth: 150,  
21 - schemas: ${sub.entityName?uncap_first}FormSchema,  
22 - showActionButtonGroup: false,  
23 - });  
24 - /**  
25 - *初始化加载数据  
26 - */  
27 - function initFormData(url,id){  
28 - if(id){  
29 - defHttp.get({url,params:{id}},{isTransformResponse:false}).then(res=>{  
30 - res.success && setFieldsValue({...res.result[0]});  
31 - })  
32 - }  
33 - }  
34 - /**  
35 - *获取表单数据  
36 - */  
37 - function getFormData(){  
38 - return [getFieldsValue()];  
39 - }  
40 - /**  
41 - *表单校验  
42 - */  
43 - function validateForm(index){  
44 - return new Promise((resolve, reject) => {  
45 - // 验证子表表单  
46 - validate().then(()=>{  
47 - return resolve()  
48 - }).catch(()=> {  
49 - return reject({ error: VALIDATE_FAILED ,index})  
50 - })  
51 - })  
52 - }  
53 - return {  
54 - registerForm,  
55 - resetFields,  
56 - initFormData,  
57 - getFormData,  
58 - validateForm  
59 - }  
60 - }  
61 - })  
62 -</script>  
63 -</#if>  
64 -</#list>