mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	feat: vue3 codegen
This commit is contained in:
		@@ -91,8 +91,6 @@ public class CodegenEngine {
 | 
			
		||||
                    vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts"))
 | 
			
		||||
            .put(vue3TemplatePath("api/api.ts"),
 | 
			
		||||
                    vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts"))
 | 
			
		||||
            .put(vue3TemplatePath("api/types.ts"),
 | 
			
		||||
                    vue3FilePath("api/${table.moduleName}/${classNameVar}/types.ts"))
 | 
			
		||||
            // SQL
 | 
			
		||||
            .put("codegen/sql/sql.vm", "sql/sql.sql")
 | 
			
		||||
            .put("codegen/sql/h2.vm", "sql/h2.sql")
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,48 @@
 | 
			
		||||
import request from '@/config/axios'
 | 
			
		||||
import { ${simpleClassName}VO, ${simpleClassName}PageReqVO, ${simpleClassName}ExcelReqVO } from './types'
 | 
			
		||||
 | 
			
		||||
export interface ${simpleClassName}VO {
 | 
			
		||||
#foreach ($column in $columns)
 | 
			
		||||
#if ($column.createOperation || $column.updateOperation)
 | 
			
		||||
#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
 | 
			
		||||
 ${column.javaField}?: number
 | 
			
		||||
#elseif(${column.javaType.toLowerCase()} == "date")
 | 
			
		||||
 ${column.javaField}?: string
 | 
			
		||||
#else
 | 
			
		||||
 ${column.javaField}?: ${column.javaType.toLowerCase()}
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ${simpleClassName}PageReqVO extends PageParam {
 | 
			
		||||
#foreach ($column in $columns)
 | 
			
		||||
#if (${column.listOperation})##查询操作
 | 
			
		||||
#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
 | 
			
		||||
 ${column.javaField}?: number
 | 
			
		||||
#elseif(${column.javaType.toLowerCase()} == "date")
 | 
			
		||||
 ${column.javaField}?: string
 | 
			
		||||
#else
 | 
			
		||||
 ${column.javaField}?: ${column.javaType.toLowerCase()}
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ${simpleClassName}ExcelReqVO {
 | 
			
		||||
  #foreach ($column in $columns)
 | 
			
		||||
    #if (${column.listOperation})##查询操作
 | 
			
		||||
      #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
 | 
			
		||||
          ${column.javaField}: number
 | 
			
		||||
      #elseif(${column.javaType.toLowerCase()} == "date")
 | 
			
		||||
          ${column.javaField}: string
 | 
			
		||||
      #else
 | 
			
		||||
          ${column.javaField}: ${column.javaType.toLowerCase()}
 | 
			
		||||
      #end
 | 
			
		||||
    #end
 | 
			
		||||
  #end
 | 
			
		||||
}
 | 
			
		||||
#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")
 | 
			
		||||
 | 
			
		||||
// 查询${table.classComment}列表
 | 
			
		||||
export const get${simpleClassName}PageApi = async (params: ${simpleClassName}PageReqVO) => {
 | 
			
		||||
  return await request.get({ url: '${baseURL}/page', params })
 | 
			
		||||
 
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
export type ${simpleClassName}VO = {
 | 
			
		||||
#foreach ($column in $columns)
 | 
			
		||||
#if ($column.createOperation || $column.updateOperation)
 | 
			
		||||
#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
 | 
			
		||||
  ${column.javaField}: number
 | 
			
		||||
#elseif(${column.javaType.toLowerCase()} == "date")
 | 
			
		||||
  ${column.javaField}: string
 | 
			
		||||
#else
 | 
			
		||||
  ${column.javaField}: ${column.javaType.toLowerCase()}
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type ${simpleClassName}PageReqVO = {
 | 
			
		||||
#foreach ($column in $columns)
 | 
			
		||||
#if (${column.listOperation})##查询操作
 | 
			
		||||
#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
 | 
			
		||||
  ${column.javaField}: number
 | 
			
		||||
#elseif(${column.javaType.toLowerCase()} == "date")
 | 
			
		||||
  ${column.javaField}: string
 | 
			
		||||
#else
 | 
			
		||||
  ${column.javaField}: ${column.javaType.toLowerCase()}
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type ${simpleClassName}ExcelReqVO = {
 | 
			
		||||
#foreach ($column in $columns)
 | 
			
		||||
#if (${column.listOperation})##查询操作
 | 
			
		||||
#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer")
 | 
			
		||||
  ${column.javaField}: number
 | 
			
		||||
#elseif(${column.javaType.toLowerCase()} == "date")
 | 
			
		||||
  ${column.javaField}: string
 | 
			
		||||
#else
 | 
			
		||||
  ${column.javaField}: ${column.javaType.toLowerCase()}
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
}
 | 
			
		||||
@@ -1,51 +1,51 @@
 | 
			
		||||
import { reactive } from 'vue'
 | 
			
		||||
import { useI18n } from '@/hooks/web/useI18n'
 | 
			
		||||
import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
 | 
			
		||||
import { DICT_TYPE } from '@/utils/dict'
 | 
			
		||||
import { required } from '@/utils/formRules'
 | 
			
		||||
import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
 | 
			
		||||
const { t } = useI18n() // 国际化
 | 
			
		||||
// 表单校验
 | 
			
		||||
export const rules = reactive({
 | 
			
		||||
#foreach ($column in $columns)
 | 
			
		||||
#if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
 | 
			
		||||
#set($comment=$column.columnComment)
 | 
			
		||||
  $column.javaField: [{ required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == "select")'change'#else'blur'#end }],
 | 
			
		||||
  $column.javaField: [required],
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
})
 | 
			
		||||
// CrudSchema
 | 
			
		||||
const crudSchemas = reactive<CrudSchema[]>([
 | 
			
		||||
const crudSchemas = reactive<VxeCrudSchema>({
 | 
			
		||||
  primaryKey: 'id', // 默认的主键ID
 | 
			
		||||
  primaryTitle: t('common.index'), // 默认显示的值
 | 
			
		||||
  primaryType: 'seq', // 默认为seq,序号模式
 | 
			
		||||
  action: true,
 | 
			
		||||
  actionWidth: '200', // 3个按钮默认200,如有删减对应增减即可
 | 
			
		||||
  columns: [
 | 
			
		||||
#foreach($column in $columns)
 | 
			
		||||
  #if ($column.listOperation || $column.listOperationResult || $column.createOperation || $column.updateOperation)
 | 
			
		||||
  #set ($dictType = $column.dictType)
 | 
			
		||||
  #if(!$column.primaryKey)
 | 
			
		||||
  {
 | 
			
		||||
    label: '${column.columnComment}',
 | 
			
		||||
    title: '${column.columnComment}',
 | 
			
		||||
    field: '${column.javaField}',
 | 
			
		||||
    #if ("" != $dictType)## 有数据字典
 | 
			
		||||
    dictType: DICT_TYPE.$dictType.toUpperCase(),
 | 
			
		||||
    #end
 | 
			
		||||
    #if($column.primaryKey)
 | 
			
		||||
    type: 'index',
 | 
			
		||||
    form: {
 | 
			
		||||
      show: false
 | 
			
		||||
    },
 | 
			
		||||
    detail: {
 | 
			
		||||
      show: false
 | 
			
		||||
    }
 | 
			
		||||
    #else
 | 
			
		||||
    #if (!$column.createOperation && !$column.updateOperation)
 | 
			
		||||
    form: {
 | 
			
		||||
      show: false
 | 
			
		||||
    },
 | 
			
		||||
    isForm: false
 | 
			
		||||
    #elseif(!("" != $column.dictType))
 | 
			
		||||
    #if ($column.htmlType == "datetime")## 时间框
 | 
			
		||||
    form: {
 | 
			
		||||
      show: true,
 | 
			
		||||
      #if ($column.htmlType == "datetime")## 时间框
 | 
			
		||||
      component: 'DatePicker',
 | 
			
		||||
      componentProps: {
 | 
			
		||||
        type: 'datetime',
 | 
			
		||||
        valueFormat: 'YYYY-MM-DD HH:mm:ss'
 | 
			
		||||
      }
 | 
			
		||||
      #elseif($column.htmlType == "editor")## 文本编辑器
 | 
			
		||||
    }
 | 
			
		||||
    #elseif($column.htmlType == "editor")## 文本编辑器
 | 
			
		||||
    form: {
 | 
			
		||||
      show: true,
 | 
			
		||||
      component: 'Editor',
 | 
			
		||||
      colProps: {
 | 
			
		||||
        span: 24
 | 
			
		||||
@@ -53,7 +53,10 @@ const crudSchemas = reactive<CrudSchema[]>([
 | 
			
		||||
      componentProps: {
 | 
			
		||||
        valueHtml: ''
 | 
			
		||||
      }
 | 
			
		||||
      #elseif($column.htmlType == "textarea")## 文本框
 | 
			
		||||
    }
 | 
			
		||||
    #elseif($column.htmlType == "textarea")## 文本框
 | 
			
		||||
    form: {
 | 
			
		||||
      show: true,
 | 
			
		||||
      component: 'Input',
 | 
			
		||||
      componentProps: {
 | 
			
		||||
        type: 'textarea',
 | 
			
		||||
@@ -62,50 +65,27 @@ const crudSchemas = reactive<CrudSchema[]>([
 | 
			
		||||
      colProps: {
 | 
			
		||||
        span: 24
 | 
			
		||||
      }
 | 
			
		||||
      #end
 | 
			
		||||
    },
 | 
			
		||||
    }
 | 
			
		||||
    #end
 | 
			
		||||
    #end
 | 
			
		||||
    #if ($column.listOperationResult)
 | 
			
		||||
    #if($column.htmlType == "input")
 | 
			
		||||
    isSearch: true
 | 
			
		||||
    #elseif("" != $dictType)
 | 
			
		||||
    isSearch: true
 | 
			
		||||
    #elseif($column.htmlType == "datetime")
 | 
			
		||||
    search: {
 | 
			
		||||
      #if($column.htmlType == "input")
 | 
			
		||||
      show: true
 | 
			
		||||
      #else
 | 
			
		||||
      #if($column.htmlType == "datetime")
 | 
			
		||||
      show: true,
 | 
			
		||||
      component: 'DatePicker',
 | 
			
		||||
      componentProps: {
 | 
			
		||||
        type: 'datetimerange',
 | 
			
		||||
        valueFormat: 'YYYY-MM-DD HH:mm:ss'
 | 
			
		||||
      itemRender: {
 | 
			
		||||
        name: 'XDataTimePicker'
 | 
			
		||||
      }
 | 
			
		||||
      #elseif($column.htmlType == "select" || $column.htmlType == "radio")
 | 
			
		||||
      #if ("" == $dictType)## 没有数据字典
 | 
			
		||||
      show: true,
 | 
			
		||||
      component: 'Select',
 | 
			
		||||
      componentProps: {
 | 
			
		||||
        option: [{'','请选择字典生成'}]
 | 
			
		||||
      }
 | 
			
		||||
      #else
 | 
			
		||||
      show: true
 | 
			
		||||
      #end
 | 
			
		||||
      #end
 | 
			
		||||
      #end
 | 
			
		||||
    }
 | 
			
		||||
    #end
 | 
			
		||||
    #end
 | 
			
		||||
    #end
 | 
			
		||||
  },
 | 
			
		||||
  #end
 | 
			
		||||
#end
 | 
			
		||||
  {
 | 
			
		||||
    label: t('table.action'),
 | 
			
		||||
    field: 'action',
 | 
			
		||||
    width: '240px',
 | 
			
		||||
    form: {
 | 
			
		||||
      show: false
 | 
			
		||||
    },
 | 
			
		||||
    detail: {
 | 
			
		||||
      show: false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
export const { allSchemas } = useCrudSchemas(crudSchemas)
 | 
			
		||||
  ]
 | 
			
		||||
})
 | 
			
		||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
 | 
			
		||||
@@ -1,51 +1,151 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <ContentWrap>
 | 
			
		||||
    <!-- 列表 -->
 | 
			
		||||
    <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar">
 | 
			
		||||
      <template #toolbar_buttons>
 | 
			
		||||
        <!-- 操作:新增 -->
 | 
			
		||||
        <XButton
 | 
			
		||||
          type="primary"
 | 
			
		||||
          preIcon="ep:zoom-in"
 | 
			
		||||
          :title="t('action.add')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:create']"
 | 
			
		||||
          @click="handleCreate()"
 | 
			
		||||
        />
 | 
			
		||||
        <!-- 操作:导出 -->
 | 
			
		||||
        <XButton
 | 
			
		||||
          type="warning"
 | 
			
		||||
          preIcon="ep:download"
 | 
			
		||||
          :title="t('action.export')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:export']"
 | 
			
		||||
          @click="handleExport()"
 | 
			
		||||
        />
 | 
			
		||||
      </template>
 | 
			
		||||
      <template #actionbtns_default="{ row }">
 | 
			
		||||
        <!-- 操作:修改 -->
 | 
			
		||||
        <XTextButton
 | 
			
		||||
          preIcon="ep:edit"
 | 
			
		||||
          :title="t('action.edit')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:update']"
 | 
			
		||||
          @click="handleUpdate(row.id)"
 | 
			
		||||
        />
 | 
			
		||||
        <!-- 操作:详情 -->
 | 
			
		||||
        <XTextButton
 | 
			
		||||
          preIcon="ep:view"
 | 
			
		||||
          :title="t('action.detail')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:query']"
 | 
			
		||||
          @click="handleDetail(row.id)"
 | 
			
		||||
        />
 | 
			
		||||
        <!-- 操作:删除 -->
 | 
			
		||||
        <XTextButton
 | 
			
		||||
          preIcon="ep:delete"
 | 
			
		||||
          :title="t('action.del')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:delete']"
 | 
			
		||||
          @click="handleDelete(row.id)"
 | 
			
		||||
        />
 | 
			
		||||
      </template>
 | 
			
		||||
    </vxe-grid>
 | 
			
		||||
  </ContentWrap>
 | 
			
		||||
  <!-- 弹窗 -->
 | 
			
		||||
  <XModal id="${classNameVar}Model" :loading="modelLoading" v-model="modelVisible" :title="modelTitle">
 | 
			
		||||
    <!-- 表单:添加/修改 -->
 | 
			
		||||
    <Form
 | 
			
		||||
      ref="formRef"
 | 
			
		||||
      v-if="['create', 'update'].includes(actionType)"
 | 
			
		||||
      :schema="allSchemas.formSchema"
 | 
			
		||||
      :rules="rules"
 | 
			
		||||
    />
 | 
			
		||||
    <!-- 表单:详情 -->
 | 
			
		||||
    <Descriptions
 | 
			
		||||
      v-if="actionType === 'detail'"
 | 
			
		||||
      :schema="allSchemas.detailSchema"
 | 
			
		||||
      :data="detailData"
 | 
			
		||||
    />
 | 
			
		||||
    <template #footer>
 | 
			
		||||
      <!-- 按钮:保存 -->
 | 
			
		||||
      <XButton
 | 
			
		||||
        v-if="['create', 'update'].includes(actionType)"
 | 
			
		||||
        type="primary"
 | 
			
		||||
        :title="t('action.save')"
 | 
			
		||||
        :loading="actionLoading"
 | 
			
		||||
        @click="submitForm()"
 | 
			
		||||
      />
 | 
			
		||||
      <!-- 按钮:关闭 -->
 | 
			
		||||
      <XButton :loading="actionLoading" :title="t('dialog.close')" @click="modelVisible = false" />
 | 
			
		||||
    </template>
 | 
			
		||||
  </XModal>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
// 全局相关的 import
 | 
			
		||||
import { ref, unref } from 'vue'
 | 
			
		||||
import dayjs from 'dayjs'
 | 
			
		||||
import { ElMessage } from 'element-plus'
 | 
			
		||||
import { DICT_TYPE } from '@/utils/dict'
 | 
			
		||||
import { useTable } from '@/hooks/web/useTable'
 | 
			
		||||
import { useI18n } from '@/hooks/web/useI18n'
 | 
			
		||||
import { useMessage } from '@/hooks/web/useMessage'
 | 
			
		||||
import { useVxeGrid } from '@/hooks/web/useVxeGrid'
 | 
			
		||||
import { VxeGridInstance } from 'vxe-table'
 | 
			
		||||
import { FormExpose } from '@/components/Form'
 | 
			
		||||
import type { ${simpleClassName}VO } from '@/api/${table.moduleName}/${classNameVar}/types'
 | 
			
		||||
// 业务相关的 import
 | 
			
		||||
import { rules, allSchemas } from './${classNameVar}.data'
 | 
			
		||||
import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}'
 | 
			
		||||
const { t } = useI18n() // 国际化
 | 
			
		||||
 | 
			
		||||
// ========== 列表相关 ==========
 | 
			
		||||
const { register, tableObject, methods } = useTable<${simpleClassName}VO>({
 | 
			
		||||
const { t } = useI18n() // 国际化
 | 
			
		||||
const message = useMessage() // 消息弹窗
 | 
			
		||||
 | 
			
		||||
// 列表相关的变量
 | 
			
		||||
const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref
 | 
			
		||||
const { gridOptions, reloadList, deleteData, exportList } = useVxeGrid<${simpleClassName}Api.${simpleClassName}VO>({
 | 
			
		||||
  allSchemas: allSchemas,
 | 
			
		||||
  getListApi: ${simpleClassName}Api.get${simpleClassName}PageApi,
 | 
			
		||||
  delListApi: ${simpleClassName}Api.delete${simpleClassName}Api,
 | 
			
		||||
  deleteApi: ${simpleClassName}Api.delete${simpleClassName}Api,
 | 
			
		||||
  exportListApi: ${simpleClassName}Api.export${simpleClassName}Api
 | 
			
		||||
})
 | 
			
		||||
const { getList, setSearchParams, delList, exportList } = methods
 | 
			
		||||
 | 
			
		||||
// ========== CRUD 相关 ==========
 | 
			
		||||
const actionLoading = ref(false) // 遮罩层
 | 
			
		||||
// 弹窗相关的变量
 | 
			
		||||
const modelVisible = ref(false) // 是否显示弹出层
 | 
			
		||||
const modelTitle = ref('edit') // 弹出层标题
 | 
			
		||||
const modelLoading = ref(false) // 弹出层loading
 | 
			
		||||
const actionType = ref('') // 操作按钮的类型
 | 
			
		||||
const dialogVisible = ref(false) // 是否显示弹出层
 | 
			
		||||
const dialogTitle = ref('edit') // 弹出层标题
 | 
			
		||||
const actionLoading = ref(false) // 按钮 Loading
 | 
			
		||||
const formRef = ref<FormExpose>() // 表单 Ref
 | 
			
		||||
const detailData = ref() // 详情 Ref
 | 
			
		||||
 | 
			
		||||
// 设置标题
 | 
			
		||||
const setDialogTile = (type: string) => {
 | 
			
		||||
  dialogTitle.value = t('action.' + type)
 | 
			
		||||
  modelLoading.value = true
 | 
			
		||||
  modelTitle.value = t('action.' + type)
 | 
			
		||||
  actionType.value = type
 | 
			
		||||
  dialogVisible.value = true
 | 
			
		||||
  modelVisible.value = true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 新增操作
 | 
			
		||||
const handleCreate = () => {
 | 
			
		||||
  setDialogTile('create')
 | 
			
		||||
  // 重置表单
 | 
			
		||||
  unref(formRef)?.getElFormRef()?.resetFields()
 | 
			
		||||
  modelLoading.value = false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 导出操作
 | 
			
		||||
const handleExport = async () => {
 | 
			
		||||
  await exportList(xGrid, '导出.xls')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改操作
 | 
			
		||||
const handleUpdate = async (row: ${simpleClassName}VO) => {
 | 
			
		||||
const handleUpdate = async (rowId: number) => {
 | 
			
		||||
  setDialogTile('update')
 | 
			
		||||
  // 设置数据
 | 
			
		||||
  const res = await ${simpleClassName}Api.get${simpleClassName}Api(row.id)
 | 
			
		||||
  const res = await ${simpleClassName}Api.get${simpleClassName}Api(rowId)
 | 
			
		||||
  unref(formRef)?.setValues(res)
 | 
			
		||||
  modelLoading.value = false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 详情操作
 | 
			
		||||
const handleDetail = async (rowId: number) => {
 | 
			
		||||
  setDialogTile('detail')
 | 
			
		||||
  const res = await ${simpleClassName}Api.get${simpleClassName}Api(rowId)
 | 
			
		||||
  detailData.value = res
 | 
			
		||||
  modelLoading.value = false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 删除操作
 | 
			
		||||
const handleDelete = async (rowId: number) => {
 | 
			
		||||
  await deleteData(xGrid, rowId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 提交按钮
 | 
			
		||||
@@ -57,156 +157,23 @@ const submitForm = async () => {
 | 
			
		||||
      actionLoading.value = true
 | 
			
		||||
      // 提交请求
 | 
			
		||||
      try {
 | 
			
		||||
        const data = unref(formRef)?.formModel as ${simpleClassName}VO
 | 
			
		||||
        const data = unref(formRef)?.formModel as ${simpleClassName}Api.${simpleClassName}VO
 | 
			
		||||
        if (actionType.value === 'create') {
 | 
			
		||||
          await ${simpleClassName}Api.create${simpleClassName}Api(data)
 | 
			
		||||
          ElMessage.success(t('common.createSuccess'))
 | 
			
		||||
          message.success(t('common.createSuccess'))
 | 
			
		||||
        } else {
 | 
			
		||||
          await ${simpleClassName}Api.update${simpleClassName}Api(data)
 | 
			
		||||
          ElMessage.success(t('common.updateSuccess'))
 | 
			
		||||
          message.success(t('common.updateSuccess'))
 | 
			
		||||
        }
 | 
			
		||||
        // 操作成功,重新加载列表
 | 
			
		||||
        dialogVisible.value = false
 | 
			
		||||
        await getList()
 | 
			
		||||
      } finally {
 | 
			
		||||
        actionLoading.value = false
 | 
			
		||||
        // 刷新列表
 | 
			
		||||
        await reloadList(xGrid)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ========== 详情相关 ==========
 | 
			
		||||
const detailRef = ref() // 详情 Ref
 | 
			
		||||
 | 
			
		||||
// 详情操作
 | 
			
		||||
const handleDetail = async (row: ${simpleClassName}VO) => {
 | 
			
		||||
  // 设置数据
 | 
			
		||||
  detailRef.value = row
 | 
			
		||||
  setDialogTile('detail')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ========== 初始化 ==========
 | 
			
		||||
getList()
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <!-- 搜索工作区 -->
 | 
			
		||||
  <ContentWrap>
 | 
			
		||||
    <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
 | 
			
		||||
  </ContentWrap>
 | 
			
		||||
  <ContentWrap>
 | 
			
		||||
    <!-- 操作工具栏 -->
 | 
			
		||||
    <div class="mb-10px">
 | 
			
		||||
      <XButton
 | 
			
		||||
        type="primary"
 | 
			
		||||
        preIcon="ep:zoom-in"
 | 
			
		||||
        :title="t('action.add')"
 | 
			
		||||
        v-hasPermi="['${permissionPrefix}:create']"
 | 
			
		||||
        @click="handleCreate()"
 | 
			
		||||
      />
 | 
			
		||||
      <XButton
 | 
			
		||||
        type="warning"
 | 
			
		||||
        preIcon="ep:download"
 | 
			
		||||
        :title="t('action.export')"
 | 
			
		||||
        v-hasPermi="['${permissionPrefix}:export']"
 | 
			
		||||
        @click="exportList('数据.xls')"
 | 
			
		||||
      />
 | 
			
		||||
    </div>
 | 
			
		||||
    <!-- 列表 -->
 | 
			
		||||
    <Table
 | 
			
		||||
      :columns="allSchemas.tableColumns"
 | 
			
		||||
      :selection="false"
 | 
			
		||||
      :data="tableObject.tableList"
 | 
			
		||||
      :loading="tableObject.loading"
 | 
			
		||||
      :pagination="{
 | 
			
		||||
        total: tableObject.total
 | 
			
		||||
      }"
 | 
			
		||||
      v-model:pageSize="tableObject.pageSize"
 | 
			
		||||
      v-model:currentPage="tableObject.currentPage"
 | 
			
		||||
      @register="register"
 | 
			
		||||
    >
 | 
			
		||||
#foreach($column in $columns)
 | 
			
		||||
#if ($column.listOperationResult)
 | 
			
		||||
  #set ($dictType=$column.dictType)
 | 
			
		||||
  #if ($column.javaType == "LocalDateTime")## 时间类型
 | 
			
		||||
      <template #${column.javaField}="{ row }">
 | 
			
		||||
        <span>{{ dayjs(row.${column.javaField}).format('YYYY-MM-DD HH:mm:ss') }}</span>
 | 
			
		||||
      </template>
 | 
			
		||||
  #elseif("" != $column.dictType)## 数据字典
 | 
			
		||||
      <template #${column.javaField}="{ row }">
 | 
			
		||||
        <DictTag :type="DICT_TYPE.$dictType.toUpperCase()" :value="row.${column.javaField}" />
 | 
			
		||||
      </template>
 | 
			
		||||
  #end
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
      <template #action="{ row }">
 | 
			
		||||
        <XButton
 | 
			
		||||
          link
 | 
			
		||||
          type="primary"
 | 
			
		||||
          preIcon="ep:edit"
 | 
			
		||||
          :title="t('action.edit')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:update']"
 | 
			
		||||
          @click="handleUpdate(row.id)"
 | 
			
		||||
        />
 | 
			
		||||
        <XButton
 | 
			
		||||
          link
 | 
			
		||||
          type="primary"
 | 
			
		||||
          preIcon="ep:view"
 | 
			
		||||
          :title="t('action.detail')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:update']"
 | 
			
		||||
          @click="handleDetail(row)"
 | 
			
		||||
        />
 | 
			
		||||
        <XButton
 | 
			
		||||
          link
 | 
			
		||||
          type="primary"
 | 
			
		||||
          preIcon="ep:delete"
 | 
			
		||||
          :title="t('action.del')"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:delete']"
 | 
			
		||||
          @click="handleDelete(row.id)"
 | 
			
		||||
        />
 | 
			
		||||
      </template>
 | 
			
		||||
    </Table>
 | 
			
		||||
  </ContentWrap>
 | 
			
		||||
 | 
			
		||||
  <Dialog v-model="dialogVisible" :title="dialogTitle">
 | 
			
		||||
    <!-- 对话框(添加 / 修改) -->
 | 
			
		||||
    <Form
 | 
			
		||||
      v-if="['create', 'update'].includes(actionType)"
 | 
			
		||||
      :schema="allSchemas.formSchema"
 | 
			
		||||
      :rules="rules"
 | 
			
		||||
      ref="formRef"
 | 
			
		||||
    />
 | 
			
		||||
    <!-- 对话框(详情) -->
 | 
			
		||||
    <Descriptions
 | 
			
		||||
      v-if="actionType === 'detail'"
 | 
			
		||||
      :schema="allSchemas.detailSchema"
 | 
			
		||||
      :data="detailRef"
 | 
			
		||||
    >
 | 
			
		||||
#foreach($column in $columns)
 | 
			
		||||
  #if ($column.listOperationResult)
 | 
			
		||||
    #set ($dictType=$column.dictType)
 | 
			
		||||
    #if ($column.javaType == "LocalDateTime")## 时间类型
 | 
			
		||||
      <template #${column.javaField}="{ row }">
 | 
			
		||||
        <span>{{ dayjs(row.${column.javaField}).format('YYYY-MM-DD HH:mm:ss') }}</span>
 | 
			
		||||
      </template>
 | 
			
		||||
    #elseif("" != $column.dictType)## 数据字典
 | 
			
		||||
      <template #${column.javaField}="{ row }">
 | 
			
		||||
        <DictTag :type="DICT_TYPE.$dictType.toUpperCase()" :value="row.${column.javaField}" />
 | 
			
		||||
      </template>
 | 
			
		||||
    #end
 | 
			
		||||
  #end
 | 
			
		||||
#end
 | 
			
		||||
    </Descriptions>
 | 
			
		||||
    <!-- 操作按钮 -->
 | 
			
		||||
    <template #footer>
 | 
			
		||||
      <XButton
 | 
			
		||||
        v-if="['create', 'update'].includes(actionType)"
 | 
			
		||||
        :loading="actionLoading"
 | 
			
		||||
        :title="t('action.save')"
 | 
			
		||||
        type="primary"
 | 
			
		||||
        @click="submitForm"
 | 
			
		||||
      />
 | 
			
		||||
      <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
 | 
			
		||||
    </template>
 | 
			
		||||
  </Dialog>
 | 
			
		||||
</template>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user