mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	feat: add vue3 codegen(preview)
This commit is contained in:
		@@ -0,0 +1,35 @@
 | 
			
		||||
import { useAxios } from '@/hooks/web/useAxios'
 | 
			
		||||
import { ${simpleClassName}VO,${simpleClassName}PageReqVO,${simpleClassName}ExcelReqVO } from './types'
 | 
			
		||||
 | 
			
		||||
const request = useAxios()
 | 
			
		||||
 | 
			
		||||
#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")
 | 
			
		||||
// 查询${table.classComment}列表
 | 
			
		||||
export const getPostPageApi = async (params: ${simpleClassName}PageReqVO) => {
 | 
			
		||||
    return await request.get({ url: '${baseURL}/page', params })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 查询${table.classComment}详情
 | 
			
		||||
export const getPostApi = async (id: number) => {
 | 
			
		||||
    return await request.get({ url: '${baseURL}/get?id=' + id })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 新增${table.classComment}
 | 
			
		||||
export const createPostApi = async (data: ${simpleClassName}VO) => {
 | 
			
		||||
    return await request.post({ url: '${baseURL}/create', data })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改${table.classComment}
 | 
			
		||||
export const updatePostApi = async (data: ${simpleClassName}VO) => {
 | 
			
		||||
    return await request.put({ url: '${baseURL}/update', data })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 删除${table.classComment}
 | 
			
		||||
export const deletePostApi = async (id: number) => {
 | 
			
		||||
    return await request.delete({ url: '${baseURL}/delete?id=' + id })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 导出${table.classComment} Excel
 | 
			
		||||
export const exportPostApi = async (params: ${simpleClassName}ExcelReqVO) => {
 | 
			
		||||
    return await request.get({ url: '${baseURL}/export-excel', params, responseType: 'blob' })
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
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
 | 
			
		||||
#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
 | 
			
		||||
#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
 | 
			
		||||
#else
 | 
			
		||||
    ${column.javaField}: ${column.javaType.toLowerCase()}
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,111 @@
 | 
			
		||||
import { reactive } from 'vue'
 | 
			
		||||
import { useI18n } from '@/hooks/web/useI18n'
 | 
			
		||||
import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
 | 
			
		||||
import { DICT_TYPE } from '@/utils/dict'
 | 
			
		||||
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 }],
 | 
			
		||||
#end
 | 
			
		||||
#end
 | 
			
		||||
})
 | 
			
		||||
// CrudSchema
 | 
			
		||||
const crudSchemas = reactive<CrudSchema[]>([
 | 
			
		||||
#foreach($column in $columns)
 | 
			
		||||
    #if ($column.listOperation || $column.listOperationResult || $column.createOperation || $column.updateOperation)
 | 
			
		||||
    #set ($dictType = $column.dictType)
 | 
			
		||||
    {
 | 
			
		||||
      label: '${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: {
 | 
			
		||||
         false
 | 
			
		||||
      },
 | 
			
		||||
      #elseif(!("" != $column.dictType))
 | 
			
		||||
      form: {
 | 
			
		||||
          show: true,
 | 
			
		||||
          #if ($column.htmlType == "datetime")## 时间框
 | 
			
		||||
          component: 'DatePicker',
 | 
			
		||||
          componentProps: {
 | 
			
		||||
              type: 'datetime',
 | 
			
		||||
              valueFormat: 'YYYY-MM-DD HH:mm:ss'
 | 
			
		||||
          }
 | 
			
		||||
          #elseif($column.htmlType == "editor")## 文本编辑器
 | 
			
		||||
          component: 'Editor',
 | 
			
		||||
          colProps: {
 | 
			
		||||
              span: 24
 | 
			
		||||
          },
 | 
			
		||||
          componentProps: {
 | 
			
		||||
              valueHtml: ''
 | 
			
		||||
          }
 | 
			
		||||
          #elseif($column.htmlType == "textarea")## 文本框
 | 
			
		||||
          component: 'Input',
 | 
			
		||||
          componentProps: {
 | 
			
		||||
              type: 'textarea',
 | 
			
		||||
              rows: 4
 | 
			
		||||
          },
 | 
			
		||||
          colProps: {
 | 
			
		||||
              span: 24
 | 
			
		||||
          }
 | 
			
		||||
          #end
 | 
			
		||||
      },
 | 
			
		||||
      #end
 | 
			
		||||
      #if ($column.listOperationResult)
 | 
			
		||||
      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'
 | 
			
		||||
         }
 | 
			
		||||
         #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
 | 
			
		||||
    {
 | 
			
		||||
        label: t('table.action'),
 | 
			
		||||
        field: 'action',
 | 
			
		||||
        width: '240px',
 | 
			
		||||
        form: {
 | 
			
		||||
            show: false
 | 
			
		||||
        },
 | 
			
		||||
        detail: {
 | 
			
		||||
            show: false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
export const { allSchemas } = useCrudSchemas(crudSchemas)
 | 
			
		||||
@@ -0,0 +1,214 @@
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
  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 { FormExpose } from '@/components/Form'
 | 
			
		||||
  import type { ${simpleClassName}VO } from '@/api/system/post/types'
 | 
			
		||||
  import { rules, allSchemas } from './post.data'
 | 
			
		||||
  import * as ${simpleClassName}Api from '@/api/system/post'
 | 
			
		||||
  const { t } = useI18n() // 国际化
 | 
			
		||||
 | 
			
		||||
  // ========== 列表相关 ==========
 | 
			
		||||
  const { register, tableObject, methods } = useTable<${simpleClassName}VO>({
 | 
			
		||||
    getListApi: ${simpleClassName}Api.get${simpleClassName}PageApi,
 | 
			
		||||
    delListApi: ${simpleClassName}Api.delete${simpleClassName}Api,
 | 
			
		||||
    exportListApi: ${simpleClassName}Api.export${simpleClassName}Api
 | 
			
		||||
  })
 | 
			
		||||
  const { getList, setSearchParams, delList, exportList } = methods
 | 
			
		||||
 | 
			
		||||
  // 导出操作
 | 
			
		||||
  const handleExport = async () => {
 | 
			
		||||
    await exportList('数据.xls')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // ========== CRUD 相关 ==========
 | 
			
		||||
  const actionLoading = ref(false) // 遮罩层
 | 
			
		||||
  const actionType = ref('') // 操作按钮的类型
 | 
			
		||||
  const dialogVisible = ref(false) // 是否显示弹出层
 | 
			
		||||
  const dialogTitle = ref('edit') // 弹出层标题
 | 
			
		||||
  const formRef = ref<FormExpose>() // 表单 Ref
 | 
			
		||||
 | 
			
		||||
  // 设置标题
 | 
			
		||||
  const setDialogTile = (type: string) => {
 | 
			
		||||
    dialogTitle.value = t('action.' + type)
 | 
			
		||||
    actionType.value = type
 | 
			
		||||
    dialogVisible.value = true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 新增操作
 | 
			
		||||
  const handleCreate = () => {
 | 
			
		||||
    setDialogTile('create')
 | 
			
		||||
    // 重置表单
 | 
			
		||||
    unref(formRef)?.getElFormRef()?.resetFields()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 修改操作
 | 
			
		||||
  const handleUpdate = async (row: ${simpleClassName}VO) => {
 | 
			
		||||
    setDialogTile('update')
 | 
			
		||||
    // 设置数据
 | 
			
		||||
    const res = await ${simpleClassName}Api.get${simpleClassName}Api(row.id)
 | 
			
		||||
    unref(formRef)?.setValues(res)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 提交按钮
 | 
			
		||||
  const submitForm = async () => {
 | 
			
		||||
    actionLoading.value = true
 | 
			
		||||
    // 提交请求
 | 
			
		||||
    try {
 | 
			
		||||
      const data = unref(formRef)?.formModel as ${simpleClassName}VO
 | 
			
		||||
      if (actionType.value === 'create') {
 | 
			
		||||
        await ${simpleClassName}Api.create${simpleClassName}Api(data)
 | 
			
		||||
        ElMessage.success(t('common.createSuccess'))
 | 
			
		||||
      } else {
 | 
			
		||||
        await ${simpleClassName}Api.update${simpleClassName}Api(data)
 | 
			
		||||
        ElMessage.success(t('common.updateSuccess'))
 | 
			
		||||
      }
 | 
			
		||||
      // 操作成功,重新加载列表
 | 
			
		||||
      dialogVisible.value = false
 | 
			
		||||
      await getList()
 | 
			
		||||
    } finally {
 | 
			
		||||
      actionLoading.value = false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 删除操作
 | 
			
		||||
  const handleDelete = (row: ${simpleClassName}VO) => {
 | 
			
		||||
    delList(row.id, false)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // ========== 详情相关 ==========
 | 
			
		||||
  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">
 | 
			
		||||
      <el-button type="primary" v-hasPermi="['${permissionPrefix}:create']" @click="handleCreate">
 | 
			
		||||
        <Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }}
 | 
			
		||||
      </el-button>
 | 
			
		||||
      <el-button
 | 
			
		||||
          type="warning"
 | 
			
		||||
          v-hasPermi="['${permissionPrefix}:export']"
 | 
			
		||||
          :loading="tableObject.exportLoading"
 | 
			
		||||
          @click="handleExport"
 | 
			
		||||
      >
 | 
			
		||||
        <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
 | 
			
		||||
      </el-button>
 | 
			
		||||
    </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 == "Date")## 时间类型
 | 
			
		||||
    <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 }">
 | 
			
		||||
        <el-button
 | 
			
		||||
            link
 | 
			
		||||
            type="primary"
 | 
			
		||||
            v-hasPermi="['${permissionPrefix}:update']"
 | 
			
		||||
            @click="handleUpdate(row)"
 | 
			
		||||
        >
 | 
			
		||||
          <Icon icon="ep:edit" class="mr-1px" /> {{ t('action.edit') }}
 | 
			
		||||
        </el-button>
 | 
			
		||||
        <el-button
 | 
			
		||||
            link
 | 
			
		||||
            type="primary"
 | 
			
		||||
            v-hasPermi="['${permissionPrefix}:update']"
 | 
			
		||||
            @click="handleDetail(row)"
 | 
			
		||||
        >
 | 
			
		||||
          <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
 | 
			
		||||
        </el-button>
 | 
			
		||||
        <el-button
 | 
			
		||||
            link
 | 
			
		||||
            type="primary"
 | 
			
		||||
            v-hasPermi="['${permissionPrefix}:delete']"
 | 
			
		||||
            @click="handleDelete(row)"
 | 
			
		||||
        >
 | 
			
		||||
          <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }}
 | 
			
		||||
        </el-button>
 | 
			
		||||
      </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 == "Date")## 时间类型
 | 
			
		||||
      <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>
 | 
			
		||||
      <el-button
 | 
			
		||||
          v-if="['create', 'update'].includes(actionType)"
 | 
			
		||||
          type="primary"
 | 
			
		||||
          :loading="actionLoading"
 | 
			
		||||
          @click="submitForm"
 | 
			
		||||
      >
 | 
			
		||||
        {{ t('action.save') }}
 | 
			
		||||
      </el-button>
 | 
			
		||||
      <el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button>
 | 
			
		||||
    </template>
 | 
			
		||||
  </Dialog>
 | 
			
		||||
</template>
 | 
			
		||||
		Reference in New Issue
	
	Block a user