Commit 4f00d923af25bef33fa21d64dfbc087a51e8ec85

Authored by YunaiV
Committed by &wxr
1 parent 6879fcd9

代码生成:支持 Vue3 标准模版的列表

yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
@@ -105,8 +105,8 @@ public class CodegenEngine { @@ -105,8 +105,8 @@ public class CodegenEngine {
105 // Vue3 105 // Vue3
106 .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/index.vue"), 106 .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/index.vue"),
107 vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue")) 107 vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue"))
108 - .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/data.ts"),  
109 - vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) 108 +// .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("views/data.ts"),
  109 +// vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts"))
110 .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("api/api.ts"), 110 .put(CodegenFrontTypeEnum.VUE3.getType(), vue3TemplatePath("api/api.ts"),
111 vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts")) 111 vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts"))
112 .build(); 112 .build();
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm
@@ -14,61 +14,32 @@ export interface ${simpleClassName}VO { @@ -14,61 +14,32 @@ export interface ${simpleClassName}VO {
14 #end 14 #end
15 } 15 }
16 16
17 -export interface ${simpleClassName}PageReqVO extends PageParam {  
18 -#foreach ($column in $columns)  
19 -#if (${column.listOperation})##查询操作  
20 -#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")  
21 - ${column.javaField}?: number  
22 -#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime")  
23 - ${column.javaField}?: Date[]  
24 -#else  
25 - ${column.javaField}?: ${column.javaType.toLowerCase()}  
26 -#end  
27 -#end  
28 -#end  
29 -}  
30 -  
31 -export interface ${simpleClassName}ExcelReqVO {  
32 -#foreach ($column in $columns)  
33 -#if (${column.listOperation})##查询操作  
34 -#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")  
35 - ${column.javaField}?: number  
36 -#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime")  
37 - ${column.javaField}?: Date[]  
38 -#else  
39 - ${column.javaField}?: ${column.javaType.toLowerCase()}  
40 -#end  
41 -#end  
42 -#end  
43 -}  
44 -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")  
45 -  
46 // 查询${table.classComment}列表 17 // 查询${table.classComment}列表
47 -export const get${simpleClassName}PageApi = async (params: ${simpleClassName}PageReqVO) => { 18 +export const get${simpleClassName}Page = async (params: ${simpleClassName}PageReqVO) => {
48 return await request.get({ url: '${baseURL}/page', params }) 19 return await request.get({ url: '${baseURL}/page', params })
49 } 20 }
50 21
51 // 查询${table.classComment}详情 22 // 查询${table.classComment}详情
52 -export const get${simpleClassName}Api = async (id: number) => { 23 +export const get${simpleClassName} = async (id: number) => {
53 return await request.get({ url: '${baseURL}/get?id=' + id }) 24 return await request.get({ url: '${baseURL}/get?id=' + id })
54 } 25 }
55 26
56 // 新增${table.classComment} 27 // 新增${table.classComment}
57 -export const create${simpleClassName}Api = async (data: ${simpleClassName}VO) => { 28 +export const create${simpleClassName} = async (data: ${simpleClassName}VO) => {
58 return await request.post({ url: '${baseURL}/create', data }) 29 return await request.post({ url: '${baseURL}/create', data })
59 } 30 }
60 31
61 // 修改${table.classComment} 32 // 修改${table.classComment}
62 -export const update${simpleClassName}Api = async (data: ${simpleClassName}VO) => { 33 +export const update${simpleClassName} = async (data: ${simpleClassName}VO) => {
63 return await request.put({ url: '${baseURL}/update', data }) 34 return await request.put({ url: '${baseURL}/update', data })
64 } 35 }
65 36
66 // 删除${table.classComment} 37 // 删除${table.classComment}
67 -export const delete${simpleClassName}Api = async (id: number) => { 38 +export const delete${simpleClassName} = async (id: number) => {
68 return await request.delete({ url: '${baseURL}/delete?id=' + id }) 39 return await request.delete({ url: '${baseURL}/delete?id=' + id })
69 } 40 }
70 41
71 // 导出${table.classComment} Excel 42 // 导出${table.classComment} Excel
72 -export const export${simpleClassName}Api = async (params: ${simpleClassName}ExcelReqVO) => { 43 +export const export${simpleClassName}Api = async (params) => {
73 return await request.download({ url: '${baseURL}/export-excel', params }) 44 return await request.download({ url: '${baseURL}/export-excel', params })
74 } 45 }
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/form.vue.vm 0 → 100644
  1 +<!-- 对话框(添加 / 修改) -->
  2 +<el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
  3 + <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  4 + #foreach($column in $columns)
  5 + #if ($column.createOperation || $column.updateOperation)
  6 + #set ($dictType = $column.dictType)
  7 + #set ($javaField = $column.javaField)
  8 + #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  9 + #set ($comment = $column.columnComment)
  10 + #if ($column.htmlType == "input")
  11 + #if (!$column.primaryKey)## 忽略主键,不用在表单里
  12 + <el-form-item label="${comment}" prop="${javaField}">
  13 + <el-input v-model="form.${javaField}" placeholder="请输入${comment}" />
  14 + </el-form-item>
  15 + #end
  16 + #elseif($column.htmlType == "imageUpload")## 图片上传
  17 + #set ($hasImageUploadColumn = true)
  18 + <el-form-item label="${comment}">
  19 + <imageUpload v-model="form.${javaField}"/>
  20 + </el-form-item>
  21 + #elseif($column.htmlType == "fileUpload")## 文件上传
  22 + #set ($hasFileUploadColumn = true)
  23 + <el-form-item label="${comment}">
  24 + <fileUpload v-model="form.${javaField}"/>
  25 + </el-form-item>
  26 + #elseif($column.htmlType == "editor")## 文本编辑器
  27 + #set ($hasEditorColumn = true)
  28 + <el-form-item label="${comment}">
  29 + <editor v-model="form.${javaField}" :min-height="192"/>
  30 + </el-form-item>
  31 + #elseif($column.htmlType == "select")## 下拉框
  32 + <el-form-item label="${comment}" prop="${javaField}">
  33 + <el-select v-model="form.${javaField}" placeholder="请选择${comment}">
  34 + #if ("" != $dictType)## 有数据字典
  35 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
  36 + :key="dict.value" :label="dict.label" #if ($column.javaType == "Integer" || $column.javaType == "Long"):value="parseInt(dict.value)"#else:value="dict.value"#end />
  37 + #else##没数据字典
  38 + <el-option label="请选择字典生成" value="" />
  39 + #end
  40 + </el-select>
  41 + </el-form-item>
  42 + #elseif($column.htmlType == "checkbox")## 多选框
  43 + <el-form-item label="${comment}" prop="${javaField}">
  44 + <el-checkbox-group v-model="form.${javaField}">
  45 + #if ("" != $dictType)## 有数据字典
  46 + <el-checkbox v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
  47 + :key="dict.value" #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.value)"#else:label="dict.value"#end>{{dict.label}}</el-checkbox>
  48 + #else##没数据字典
  49 + <el-checkbox>请选择字典生成</el-checkbox>
  50 + #end
  51 + </el-checkbox-group>
  52 + </el-form-item>
  53 + #elseif($column.htmlType == "radio")## 单选框
  54 + <el-form-item label="${comment}" prop="${javaField}">
  55 + <el-radio-group v-model="form.${javaField}">
  56 + #if ("" != $dictType)## 有数据字典
  57 + <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
  58 + :key="dict.value" #if($column.javaType == "Integer" || $column.javaType == "Long"):label="parseInt(dict.value)"#else:label="dict.value"#end>{{dict.label}}</el-radio>
  59 + #else##没数据字典
  60 + <el-radio label="1">请选择字典生成</el-radio>
  61 + #end
  62 + </el-radio-group>
  63 + </el-form-item>
  64 + #elseif($column.htmlType == "datetime")## 时间框
  65 + <el-form-item label="${comment}" prop="${javaField}">
  66 + <el-date-picker clearable v-model="form.${javaField}" type="date" value-format="timestamp" placeholder="选择${comment}" />
  67 + </el-form-item>
  68 + #elseif($column.htmlType == "textarea")## 文本框
  69 + <el-form-item label="${comment}" prop="${javaField}">
  70 + <el-input v-model="form.${javaField}" type="textarea" placeholder="请输入内容" />
  71 + </el-form-item>
  72 + #end
  73 + #end
  74 + #end
  75 + </el-form>
  76 + <div slot="footer" class="dialog-footer">
  77 + <el-button type="primary" @click="submitForm">确 定</el-button>
  78 + <el-button @click="cancel">取 消</el-button>
  79 + </div>
  80 +</el-dialog>
  81 +
  82 +
  83 +// 弹出层标题
  84 +title: "",
  85 +// 是否显示弹出层
  86 +open: false,
  87 +
  88 +// 表单参数
  89 +form: {},
  90 +// 表单校验
  91 +rules: {
  92 +#foreach ($column in $columns)
  93 + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
  94 + #set($comment=$column.columnComment)
  95 + $column.javaField: [{ required: true, message: "${comment}不能为空", trigger: #if($column.htmlType == "select")"change"#else"blur"#end }],
  96 + #end
  97 +#end
  98 +}
  99 +
  100 +
  101 +/** 表单重置 */
  102 +reset() {
  103 +this.form = {
  104 +#foreach ($column in $columns)
  105 + #if ($column.createOperation || $column.updateOperation)
  106 + #if ($column.htmlType == "checkbox")
  107 + $column.javaField: [],
  108 + #else
  109 + $column.javaField: undefined,
  110 + #end
  111 + #end
  112 +#end
  113 +};
  114 +this.resetForm("form");
  115 +},
  116 +
  117 +/** 新增按钮操作 */
  118 +handleAdd() {
  119 +this.reset();
  120 +this.open = true;
  121 +this.title = "添加${table.classComment}";
  122 +},
  123 +/** 修改按钮操作 */
  124 +handleUpdate(row) {
  125 +this.reset();
  126 +const ${primaryColumn.javaField} = row.${primaryColumn.javaField};
  127 +get${simpleClassName}(${primaryColumn.javaField}).then(response => {
  128 +this.form = response.data;
  129 +#foreach ($column in $columns)
  130 + #if($column.htmlType == "checkbox")## checkbox 特殊处理
  131 + this.form.$column.javaField = this.form.${column.javaField}.split(",");
  132 + #end
  133 +#end
  134 +this.open = true;
  135 +this.title = "修改${table.classComment}";
  136 +});
  137 +},
  138 +/** 提交按钮 */
  139 +submitForm() {
  140 +this.#[[$]]#refs["form"].validate(valid => {
  141 +if (!valid) {
  142 +return;
  143 +}
  144 +#foreach ($column in $columns)
  145 +#if($column.htmlType == "checkbox")
  146 +this.form.$column.javaField = this.form.${column.javaField}.join(",");
  147 +#end
  148 +#end
  149 +// 修改的提交
  150 +if (this.form.${primaryColumn.javaField} != null) {
  151 +update${simpleClassName}(this.form).then(response => {
  152 +this.#[[$modal]]#.msgSuccess("修改成功");
  153 +this.open = false;
  154 +this.getList();
  155 +});
  156 +return;
  157 +}
  158 +// 添加的提交
  159 +create${simpleClassName}(this.form).then(response => {
  160 +this.#[[$modal]]#.msgSuccess("新增成功");
  161 +this.open = false;
  162 +this.getList();
  163 +});
  164 +});
  165 +},
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm
1 <template> 1 <template>
2 - <ContentWrap>  
3 - <!-- 列表 -->  
4 - <XTable @register="registerTable">  
5 - <template #toolbar_buttons>  
6 - <!-- 操作:新增 -->  
7 - <XButton  
8 - type="primary"  
9 - preIcon="ep:zoom-in"  
10 - :title="t('action.add')"  
11 - v-hasPermi="['${permissionPrefix}:create']"  
12 - @click="handleCreate()" 2 + <content-wrap>
  3 + <!-- 搜索工作栏 -->
  4 + <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true">
  5 + #foreach($column in $columns)
  6 + #if ($column.listOperation)
  7 + #set ($dictType = $column.dictType)
  8 + #set ($javaField = $column.javaField)
  9 + #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  10 + #set ($comment = $column.columnComment)
  11 + #if ($column.htmlType == "input")
  12 + <el-form-item label="${comment}" prop="${javaField}">
  13 + <el-input
  14 + v-model="queryParams.${javaField}"
  15 + placeholder="请输入${comment}"
  16 + clearable
  17 + @keyup.enter="handleQuery"
13 /> 18 />
14 - <!-- 操作:导出 -->  
15 - <XButton  
16 - type="warning"  
17 - preIcon="ep:download"  
18 - :title="t('action.export')"  
19 - v-hasPermi="['${permissionPrefix}:export']"  
20 - @click="exportList('${table.classComment}.xls')"  
21 - />  
22 - </template>  
23 - <template #actionbtns_default="{ row }">  
24 - <!-- 操作:修改 -->  
25 - <XTextButton  
26 - preIcon="ep:edit"  
27 - :title="t('action.edit')"  
28 - v-hasPermi="['${permissionPrefix}:update']"  
29 - @click="handleUpdate(row.id)" 19 + </el-form-item>
  20 + #elseif ($column.htmlType == "select" || $column.htmlType == "radio")
  21 + <el-form-item label="${comment}" prop="${javaField}">
  22 + <el-select v-model="queryParams.${javaField}" placeholder="请选择${comment}" clearable>
  23 + #if ("" != $dictType)## 设置了 dictType 数据字典的情况
  24 + <!-- TODO 芋艿:需要考虑不同类型的处理 -->
  25 + <el-option
  26 + v-for="dict in getDictDatas(DICT_TYPE.$dictType.toUpperCase())"
  27 + :key="dict.value"
  28 + :label="dict.label"
  29 + :value="dict.value"
  30 + />
  31 + #else## 未设置 dictType 数据字典的情况
  32 + <el-option label="请选择字典生成" value="" />
  33 + #end
  34 + </el-select>
  35 + </el-form-item>
  36 + #elseif($column.htmlType == "datetime")
  37 + #if ($column.listOperationCondition != "BETWEEN")## 非范围
  38 + <el-form-item label="${comment}" prop="${javaField}">
  39 + <el-date-picker
  40 + v-model="queryParams.${javaField}"
  41 + value-format="yyyy-MM-dd"
  42 + type="date"
  43 + placeholder="选择${comment}"
  44 + clearable
30 /> 45 />
31 - <!-- 操作:详情 -->  
32 - <XTextButton  
33 - preIcon="ep:view"  
34 - :title="t('action.detail')"  
35 - v-hasPermi="['${permissionPrefix}:query']"  
36 - @click="handleDetail(row.id)" 46 + </el-form-item>
  47 + #else## 范围
  48 + <el-form-item label="${comment}" prop="${javaField}">
  49 + <el-date-picker
  50 + v-model="queryParams.${javaField}"
  51 + value-format="yyyy-MM-dd HH:mm:ss"
  52 + type="daterange"
  53 + start-placeholder="开始日期"
  54 + end-placeholder="结束日期"
  55 + :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
37 /> 56 />
38 - <!-- 操作:删除 -->  
39 - <XTextButton  
40 - preIcon="ep:delete"  
41 - :title="t('action.del')"  
42 - v-hasPermi="['${permissionPrefix}:delete']"  
43 - @click="deleteData(row.id)"  
44 - />  
45 - </template>  
46 - </XTable>  
47 - </ContentWrap>  
48 - <!-- 弹窗 -->  
49 - <XModal id="${classNameVar}Model" :loading="modelLoading" v-model="modelVisible" :title="modelTitle">  
50 - <!-- 表单:添加/修改 -->  
51 - <Form  
52 - ref="formRef"  
53 - v-if="['create', 'update'].includes(actionType)"  
54 - :schema="allSchemas.formSchema"  
55 - :rules="rules"  
56 - />  
57 - <!-- 表单:详情 -->  
58 - <Descriptions  
59 - v-if="actionType === 'detail'"  
60 - :schema="allSchemas.detailSchema"  
61 - :data="detailData"  
62 - />  
63 - <template #footer>  
64 - <!-- 按钮:保存 -->  
65 - <XButton  
66 - v-if="['create', 'update'].includes(actionType)"  
67 - type="primary"  
68 - :title="t('action.save')"  
69 - :loading="actionLoading"  
70 - @click="submitForm()" 57 + </el-form-item>
  58 + #end
  59 + #end
  60 + #end
  61 + #end
  62 + <el-form-item>
  63 + <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  64 + <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  65 + <el-button type="primary" @click="openModal('create')" v-hasPermi="['${permissionPrefix}:create']">
  66 + <Icon icon="ep:plus" class="mr-5px" /> 新增
  67 + </el-button>
  68 + <el-button
  69 + type="success"
  70 + plain
  71 + @click="handleExport"
  72 + :loading="exportLoading"
  73 + v-hasPermi="['${permissionPrefix}:export']"
  74 + >
  75 + <Icon icon="ep:download" class="mr-5px" /> 导出
  76 + </el-button>
  77 + </el-form-item>
  78 + </el-form>
  79 + </content-wrap>
  80 +
  81 + <!-- 列表 -->
  82 + <content-wrap>
  83 + <el-table v-loading="loading" :data="list">
  84 + #foreach($column in $columns)
  85 + #if ($column.listOperationResult)
  86 + #set ($dictType=$column.dictType)
  87 + #set ($javaField = $column.javaField)
  88 + #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  89 + #set ($comment=$column.columnComment)
  90 + #if ($column.javaType == "LocalDateTime")## 时间类型
  91 + <el-table-column
  92 + label="${comment}"
  93 + align="center"
  94 + prop="${javaField}"
  95 + :formatter="dateFormatter"
71 /> 96 />
72 - <!-- 按钮:关闭 -->  
73 - <XButton :loading="actionLoading" :title="t('dialog.close')" @click="modelVisible = false" />  
74 - </template>  
75 - </XModal> 97 + #elseif("" != $column.dictType)## 数据字典
  98 + <el-table-column label="${comment}" align="center" prop="${javaField}">
  99 + <template #default="scope">
  100 + <dict-tag :type="DICT_TYPE.$dictType.toUpperCase()" :value="scope.row.${column.javaField}" />
  101 + </template>
  102 + </el-table-column>
  103 + #else
  104 + <el-table-column label="${comment}" align="center" prop="${javaField}" />
  105 + #end
  106 + #end
  107 + #end
  108 + <el-table-column label="操作" align="center">
  109 + <template #default="scope">
  110 + <el-button
  111 + link
  112 + type="primary"
  113 + @click="openModal('update', scope.row.id)"
  114 + v-hasPermi="['${permissionPrefix}:update']"
  115 + >
  116 + 编辑
  117 + </el-button>
  118 + <el-button
  119 + link
  120 + type="danger"
  121 + @click="handleDelete(scope.row.id)"
  122 + v-hasPermi="['${permissionPrefix}:delete']"
  123 + >
  124 + 删除
  125 + </el-button>
  126 + </template>
  127 + </el-table-column>
  128 + </el-table>
  129 + <!-- 分页 -->
  130 + <Pagination
  131 + :total="total"
  132 + v-model:page="queryParams.pageNo"
  133 + v-model:limit="queryParams.pageSize"
  134 + @pagination="getList"
  135 + />
  136 + </content-wrap>
76 </template> 137 </template>
  138 +
77 <script setup lang="ts" name="${simpleClassName}"> 139 <script setup lang="ts" name="${simpleClassName}">
78 -import { FormExpose } from '@/components/Form'  
79 -// 业务相关的 import  
80 -import { rules, allSchemas } from './${classNameVar}.data' 140 +import { DICT_TYPE, getDictOptions } from '@/utils/dict'
  141 +import { dateFormatter } from '@/utils/formatTime'
  142 +import download from '@/utils/download'
81 import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}' 143 import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}'
82 -  
83 -const { t } = useI18n() // 国际化 144 +// import ConfigForm from './form.vue'
84 const message = useMessage() // 消息弹窗 145 const message = useMessage() // 消息弹窗
  146 +const { t } = useI18n() // 国际化
85 147
86 -// 列表相关的变量  
87 -const [registerTable, { reload, deleteData, exportList }] = useXTable({  
88 - allSchemas: allSchemas,  
89 - getListApi: ${simpleClassName}Api.get${simpleClassName}PageApi,  
90 - deleteApi: ${simpleClassName}Api.delete${simpleClassName}Api,  
91 - exportListApi: ${simpleClassName}Api.export${simpleClassName}Api 148 +const loading = ref(true) // 列表的加载中
  149 +const total = ref(0) // 列表的总页数
  150 +const list = ref([]) // 列表的数据
  151 +const queryParams = reactive({
  152 + pageNo: 1,
  153 + pageSize: 10,
  154 + #foreach ($column in $columns)
  155 + #if ($column.listOperation)
  156 + #if ($column.listOperationCondition != 'BETWEEN')
  157 + $column.javaField: null,
  158 + #end
  159 + #if ($column.htmlType == "datetime" || $column.listOperationCondition == "BETWEEN")
  160 + $column.javaField: [],
  161 + #end
  162 + #end
  163 + #end
92 }) 164 })
  165 +const queryFormRef = ref() // 搜索的表单
  166 +const exportLoading = ref(false) // 导出的加载中
93 167
94 -// 弹窗相关的变量  
95 -const modelVisible = ref(false) // 是否显示弹出层  
96 -const modelTitle = ref('edit') // 弹出层标题  
97 -const modelLoading = ref(false) // 弹出层loading  
98 -const actionType = ref('') // 操作按钮的类型  
99 -const actionLoading = ref(false) // 按钮 Loading  
100 -const formRef = ref<FormExpose>() // 表单 Ref  
101 -const detailData = ref() // 详情 Ref  
102 -  
103 -// 设置标题  
104 -const setDialogTile = (type: string) => {  
105 - modelLoading.value = true  
106 - modelTitle.value = t('action.' + type)  
107 - actionType.value = type  
108 - modelVisible.value = true 168 +/** 查询参数列表 */
  169 +const getList = async () => {
  170 + loading.value = true
  171 + try {
  172 + const data = await ${simpleClassName}Api.get${simpleClassName}Page(queryParams)
  173 + list.value = data.list
  174 + total.value = data.total
  175 + } finally {
  176 + loading.value = false
  177 + }
109 } 178 }
110 179
111 -// 新增操作  
112 -const handleCreate = () => {  
113 - setDialogTile('create')  
114 - modelLoading.value = false 180 +/** 搜索按钮操作 */
  181 +const handleQuery = () => {
  182 + queryParams.pageNo = 1
  183 + getList()
115 } 184 }
116 185
117 -// 修改操作  
118 -const handleUpdate = async (rowId: number) => {  
119 - setDialogTile('update')  
120 - // 设置数据  
121 - const res = await ${simpleClassName}Api.get${simpleClassName}Api(rowId)  
122 - unref(formRef)?.setValues(res)  
123 - modelLoading.value = false 186 +/** 重置按钮操作 */
  187 +const resetQuery = () => {
  188 + queryFormRef.value.resetFields()
  189 + handleQuery()
124 } 190 }
125 191
126 -// 详情操作  
127 -const handleDetail = async (rowId: number) => {  
128 - setDialogTile('detail')  
129 - const res = await ${simpleClassName}Api.get${simpleClassName}Api(rowId)  
130 - detailData.value = res  
131 - modelLoading.value = false 192 +/** 添加/修改操作 */
  193 +// const modalRef = ref()
  194 +// const openModal = (type: string, id?: number) => {
  195 +// modalRef.value.openModal(type, id)
  196 +// }
  197 +
  198 +/** 删除按钮操作 */
  199 +const handleDelete = async (id: number) => {
  200 + try {
  201 + // 删除的二次确认
  202 + await message.delConfirm()
  203 + // 发起删除
  204 + await ${simpleClassName}Api.delete${simpleClassName}(id)
  205 + message.success(t('common.delSuccess'))
  206 + // 刷新列表
  207 + await getList()
  208 + } catch {}
132 } 209 }
133 210
134 -// 提交按钮  
135 -const submitForm = async () => {  
136 - const elForm = unref(formRef)?.getElFormRef()  
137 - if (!elForm) return  
138 - elForm.validate(async (valid) => {  
139 - if (valid) {  
140 - actionLoading.value = true  
141 - // 提交请求  
142 - try {  
143 - const data = unref(formRef)?.formModel as ${simpleClassName}Api.${simpleClassName}VO  
144 - if (actionType.value === 'create') {  
145 - await ${simpleClassName}Api.create${simpleClassName}Api(data)  
146 - message.success(t('common.createSuccess'))  
147 - } else {  
148 - await ${simpleClassName}Api.update${simpleClassName}Api(data)  
149 - message.success(t('common.updateSuccess'))  
150 - }  
151 - modelVisible.value = false  
152 - } finally {  
153 - actionLoading.value = false  
154 - // 刷新列表  
155 - await reload()  
156 - }  
157 - }  
158 - }) 211 +/** 导出按钮操作 */
  212 +const handleExport = async () => {
  213 + try {
  214 + // 导出的二次确认
  215 + await message.exportConfirm()
  216 + // 发起导出
  217 + exportLoading.value = true
  218 + const data = await ${simpleClassName}Api.export${simpleClassName}Api(queryParams)
  219 + download.excel(data, '${table.classComment}.xls')
  220 + } catch {
  221 + } finally {
  222 + exportLoading.value = false
  223 + }
159 } 224 }
  225 +
  226 +/** 初始化 **/
  227 +onMounted(() => {
  228 + getList()
  229 +})
160 </script> 230 </script>
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vxe/api/api.ts.vm 0 → 100644
  1 +import request from '@/config/axios'
  2 +
  3 +export interface ${simpleClassName}VO {
  4 +#foreach ($column in $columns)
  5 +#if ($column.createOperation || $column.updateOperation)
  6 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")
  7 + ${column.javaField}: number
  8 +#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime")
  9 + ${column.javaField}: Date
  10 +#else
  11 + ${column.javaField}: ${column.javaType.toLowerCase()}
  12 +#end
  13 +#end
  14 +#end
  15 +}
  16 +
  17 +export interface ${simpleClassName}PageReqVO extends PageParam {
  18 +#foreach ($column in $columns)
  19 +#if (${column.listOperation})##查询操作
  20 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")
  21 + ${column.javaField}?: number
  22 +#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime")
  23 + ${column.javaField}?: Date[]
  24 +#else
  25 + ${column.javaField}?: ${column.javaType.toLowerCase()}
  26 +#end
  27 +#end
  28 +#end
  29 +}
  30 +
  31 +export interface ${simpleClassName}ExcelReqVO {
  32 +#foreach ($column in $columns)
  33 +#if (${column.listOperation})##查询操作
  34 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal")
  35 + ${column.javaField}?: number
  36 +#elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdatetime")
  37 + ${column.javaField}?: Date[]
  38 +#else
  39 + ${column.javaField}?: ${column.javaType.toLowerCase()}
  40 +#end
  41 +#end
  42 +#end
  43 +}
  44 +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")
  45 +
  46 +// 查询${table.classComment}列表
  47 +export const get${simpleClassName}PageApi = async (params: ${simpleClassName}PageReqVO) => {
  48 + return await request.get({ url: '${baseURL}/page', params })
  49 +}
  50 +
  51 +// 查询${table.classComment}详情
  52 +export const get${simpleClassName}Api = async (id: number) => {
  53 + return await request.get({ url: '${baseURL}/get?id=' + id })
  54 +}
  55 +
  56 +// 新增${table.classComment}
  57 +export const create${simpleClassName}Api = async (data: ${simpleClassName}VO) => {
  58 + return await request.post({ url: '${baseURL}/create', data })
  59 +}
  60 +
  61 +// 修改${table.classComment}
  62 +export const update${simpleClassName}Api = async (data: ${simpleClassName}VO) => {
  63 + return await request.put({ url: '${baseURL}/update', data })
  64 +}
  65 +
  66 +// 删除${table.classComment}
  67 +export const delete${simpleClassName}Api = async (id: number) => {
  68 + return await request.delete({ url: '${baseURL}/delete?id=' + id })
  69 +}
  70 +
  71 +// 导出${table.classComment} Excel
  72 +export const export${simpleClassName}Api = async (params: ${simpleClassName}ExcelReqVO) => {
  73 + return await request.download({ url: '${baseURL}/export-excel', params })
  74 +}
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm renamed to yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vxe/views/data.ts.vm
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vxe/views/index.vue.vm 0 → 100644
  1 +<template>
  2 + <ContentWrap>
  3 + <!-- 列表 -->
  4 + <XTable @register="registerTable">
  5 + <template #toolbar_buttons>
  6 + <!-- 操作:新增 -->
  7 + <XButton
  8 + type="primary"
  9 + preIcon="ep:zoom-in"
  10 + :title="t('action.add')"
  11 + v-hasPermi="['${permissionPrefix}:create']"
  12 + @click="handleCreate()"
  13 + />
  14 + <!-- 操作:导出 -->
  15 + <XButton
  16 + type="warning"
  17 + preIcon="ep:download"
  18 + :title="t('action.export')"
  19 + v-hasPermi="['${permissionPrefix}:export']"
  20 + @click="exportList('${table.classComment}.xls')"
  21 + />
  22 + </template>
  23 + <template #actionbtns_default="{ row }">
  24 + <!-- 操作:修改 -->
  25 + <XTextButton
  26 + preIcon="ep:edit"
  27 + :title="t('action.edit')"
  28 + v-hasPermi="['${permissionPrefix}:update']"
  29 + @click="handleUpdate(row.id)"
  30 + />
  31 + <!-- 操作:详情 -->
  32 + <XTextButton
  33 + preIcon="ep:view"
  34 + :title="t('action.detail')"
  35 + v-hasPermi="['${permissionPrefix}:query']"
  36 + @click="handleDetail(row.id)"
  37 + />
  38 + <!-- 操作:删除 -->
  39 + <XTextButton
  40 + preIcon="ep:delete"
  41 + :title="t('action.del')"
  42 + v-hasPermi="['${permissionPrefix}:delete']"
  43 + @click="deleteData(row.id)"
  44 + />
  45 + </template>
  46 + </XTable>
  47 + </ContentWrap>
  48 + <!-- 弹窗 -->
  49 + <XModal id="${classNameVar}Model" :loading="modelLoading" v-model="modelVisible" :title="modelTitle">
  50 + <!-- 表单:添加/修改 -->
  51 + <Form
  52 + ref="formRef"
  53 + v-if="['create', 'update'].includes(actionType)"
  54 + :schema="allSchemas.formSchema"
  55 + :rules="rules"
  56 + />
  57 + <!-- 表单:详情 -->
  58 + <Descriptions
  59 + v-if="actionType === 'detail'"
  60 + :schema="allSchemas.detailSchema"
  61 + :data="detailData"
  62 + />
  63 + <template #footer>
  64 + <!-- 按钮:保存 -->
  65 + <XButton
  66 + v-if="['create', 'update'].includes(actionType)"
  67 + type="primary"
  68 + :title="t('action.save')"
  69 + :loading="actionLoading"
  70 + @click="submitForm()"
  71 + />
  72 + <!-- 按钮:关闭 -->
  73 + <XButton :loading="actionLoading" :title="t('dialog.close')" @click="modelVisible = false" />
  74 + </template>
  75 + </XModal>
  76 +</template>
  77 +<script setup lang="ts" name="${simpleClassName}">
  78 +import { FormExpose } from '@/components/Form'
  79 +// 业务相关的 import
  80 +import { rules, allSchemas } from './${classNameVar}.data'
  81 +import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}'
  82 +
  83 +const { t } = useI18n() // 国际化
  84 +const message = useMessage() // 消息弹窗
  85 +
  86 +// 列表相关的变量
  87 +const [registerTable, { reload, deleteData, exportList }] = useXTable({
  88 + allSchemas: allSchemas,
  89 + getListApi: ${simpleClassName}Api.get${simpleClassName}PageApi,
  90 + deleteApi: ${simpleClassName}Api.delete${simpleClassName}Api,
  91 + exportListApi: ${simpleClassName}Api.export${simpleClassName}Api
  92 +})
  93 +
  94 +// 弹窗相关的变量
  95 +const modelVisible = ref(false) // 是否显示弹出层
  96 +const modelTitle = ref('edit') // 弹出层标题
  97 +const modelLoading = ref(false) // 弹出层loading
  98 +const actionType = ref('') // 操作按钮的类型
  99 +const actionLoading = ref(false) // 按钮 Loading
  100 +const formRef = ref<FormExpose>() // 表单 Ref
  101 +const detailData = ref() // 详情 Ref
  102 +
  103 +// 设置标题
  104 +const setDialogTile = (type: string) => {
  105 + modelLoading.value = true
  106 + modelTitle.value = t('action.' + type)
  107 + actionType.value = type
  108 + modelVisible.value = true
  109 +}
  110 +
  111 +// 新增操作
  112 +const handleCreate = () => {
  113 + setDialogTile('create')
  114 + modelLoading.value = false
  115 +}
  116 +
  117 +// 修改操作
  118 +const handleUpdate = async (rowId: number) => {
  119 + setDialogTile('update')
  120 + // 设置数据
  121 + const res = await ${simpleClassName}Api.get${simpleClassName}Api(rowId)
  122 + unref(formRef)?.setValues(res)
  123 + modelLoading.value = false
  124 +}
  125 +
  126 +// 详情操作
  127 +const handleDetail = async (rowId: number) => {
  128 + setDialogTile('detail')
  129 + const res = await ${simpleClassName}Api.get${simpleClassName}Api(rowId)
  130 + detailData.value = res
  131 + modelLoading.value = false
  132 +}
  133 +
  134 +// 提交按钮
  135 +const submitForm = async () => {
  136 + const elForm = unref(formRef)?.getElFormRef()
  137 + if (!elForm) return
  138 + elForm.validate(async (valid) => {
  139 + if (valid) {
  140 + actionLoading.value = true
  141 + // 提交请求
  142 + try {
  143 + const data = unref(formRef)?.formModel as ${simpleClassName}Api.${simpleClassName}VO
  144 + if (actionType.value === 'create') {
  145 + await ${simpleClassName}Api.create${simpleClassName}Api(data)
  146 + message.success(t('common.createSuccess'))
  147 + } else {
  148 + await ${simpleClassName}Api.update${simpleClassName}Api(data)
  149 + message.success(t('common.updateSuccess'))
  150 + }
  151 + modelVisible.value = false
  152 + } finally {
  153 + actionLoading.value = false
  154 + // 刷新列表
  155 + await reload()
  156 + }
  157 + }
  158 + })
  159 +}
  160 +</script>