Vue3 CRUD Schema 模版,index 和 form 完善

This commit is contained in:
YunaiV 2023-04-12 23:11:04 +08:00
parent 9d272e7941
commit cb6b7a754e
3 changed files with 138 additions and 144 deletions

View File

@ -112,6 +112,10 @@ public class CodegenEngine {
// Vue3 Schema 模版 // Vue3 Schema 模版
.put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("views/data.ts"), .put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("views/data.ts"),
vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts"))
.put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("views/index.vue"),
vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue"))
.put(CodegenFrontTypeEnum.VUE3_SCHEMA.getType(), vue3SchemaTemplatePath("views/form.vue"),
vue3FilePath("views/${table.moduleName}/${classNameVar}/${simpleClassName}Form.vue"))
.build(); .build();
@Resource @Resource

View File

@ -0,0 +1,65 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<Form ref="formRef" :schema="allSchemas.formSchema" :rules="rules" v-loading="formLoading" />
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
<el-button @click="dialogVisible = false">取 消</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}'
import { rules, allSchemas } from './${classNameVar}.data'
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formType = ref('') // 表单的类型create - 新增update - 修改
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
// 修改时,设置数据
if (id) {
formLoading.value = true
try {
const data = await ${simpleClassName}Api.get${simpleClassName}(id)
formRef.value.setValues(data)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 校验表单
if (!formRef) return
const valid = await formRef.value.getElFormRef().validate()
if (!valid) return
// 提交请求
formLoading.value = true
try {
const data = formRef.value.formModel as ${simpleClassName}Api.${simpleClassName}VO
if (formType.value === 'create') {
await ${simpleClassName}Api.create${simpleClassName}(data)
message.success(t('common.createSuccess'))
} else {
await ${simpleClassName}Api.update${simpleClassName}(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
// 发送操作成功的事件
emit('success')
} finally {
formLoading.value = false
}
}
</script>

View File

@ -1,160 +1,85 @@
<template> <template>
<!-- 搜索工作栏 -->
<ContentWrap> <ContentWrap>
<!-- 列表 --> <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams">
<XTable @register="registerTable"> <!-- 新增等操作按钮 -->
<template #toolbar_buttons> <template #actionMore>
<!-- 操作:新增 --> <el-button
<XButton
type="primary" type="primary"
preIcon="ep:zoom-in" plain
:title="t('action.add')" @click="openForm('create')"
v-hasPermi="['${permissionPrefix}:create']" v-hasPermi="['${permissionPrefix}:create']"
@click="handleCreate()" >
/> <Icon icon="ep:plus" class="mr-5px" /> 新增
<!-- 操作:导出 --> </el-button>
<XButton
type="warning"
preIcon="ep:download"
:title="t('action.export')"
v-hasPermi="['${permissionPrefix}:export']"
@click="exportList('${table.classComment}.xls')"
/>
</template> </template>
<template #actionbtns_default="{ row }"> </Search>
<!-- 操作:修改 -->
<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="deleteData(row.id)"
/>
</template>
</XTable>
</ContentWrap> </ContentWrap>
<!-- 弹窗 -->
<XModal id="${classNameVar}Model" :loading="modelLoading" v-model="modelVisible" :title="modelTitle"> <!-- 列表 -->
<!-- 表单:添加/修改 --> <ContentWrap>
<Form <Table
ref="formRef" :columns="allSchemas.tableColumns"
v-if="['create', 'update'].includes(actionType)" :data="tableObject.tableList"
:schema="allSchemas.formSchema" :loading="tableObject.loading"
:rules="rules" :pagination="{
/> total: tableObject.total
<!-- 表单:详情 --> }"
<Descriptions v-model:pageSize="tableObject.pageSize"
v-if="actionType === 'detail'" v-model:currentPage="tableObject.currentPage"
:schema="allSchemas.detailSchema" >
:data="detailData" <template #action="{ row }">
/> <el-button
<template #footer> link
<!-- 按钮:保存 --> type="primary"
<XButton @click="openForm('update', row.id)"
v-if="['create', 'update'].includes(actionType)" v-hasPermi="['${permissionPrefix}:update']"
type="primary" >
:title="t('action.save')" 编辑
:loading="actionLoading" </el-button>
@click="submitForm()" <el-button
/> link
<!-- 按钮:关闭 --> type="danger"
<XButton :loading="actionLoading" :title="t('dialog.close')" @click="modelVisible = false" /> v-hasPermi="['${permissionPrefix}:delete']"
</template> @click="handleDelete(row.id)"
</XModal> >
删除
</el-button>
</template>
</Table>
</ContentWrap>
<!-- 表单弹窗:添加/修改 -->
<${simpleClassName}Form ref="formRef" @success="getList" />
</template> </template>
<script setup lang="ts" name="${simpleClassName}"> <script setup lang="ts" name="${table.className}">
import { FormExpose } from '@/components/Form' import { allSchemas } from './${classNameVar}.data'
// 业务相关的 import
import { rules, allSchemas } from './${classNameVar}.data'
import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}' import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${classNameVar}'
import ${simpleClassName}Form from './${simpleClassName}Form.vue'
const { t } = useI18n() // 国际化 // tableObject表格的属性对象可获得分页大小、条数等属性
const message = useMessage() // 消息弹窗 // tableMethods表格的操作对象可进行获得分页、删除记录等操作
// 详细可见https://kailong110120130.gitee.io/vue-element-plus-admin-doc/components/table.html#usetable
// 列表相关的变量 const { tableObject, tableMethods } = useTable({
const [registerTable, { reload, deleteData, exportList }] = useXTable({ getListApi: ${simpleClassName}Api.get${simpleClassName}Page, // 分页接口
allSchemas: allSchemas, delListApi: ${simpleClassName}Api.delete${simpleClassName} // 删除接口
getListApi: ${simpleClassName}Api.get${simpleClassName}PageApi,
deleteApi: ${simpleClassName}Api.delete${simpleClassName}Api,
exportListApi: ${simpleClassName}Api.export${simpleClassName}Api
}) })
// 获得表格的各种操作
const { getList, setSearchParams } = tableMethods
// 弹窗相关的变量 /** 添加/修改操作 */
const modelVisible = ref(false) // 是否显示弹出层 const formRef = ref()
const modelTitle = ref('edit') // 弹出层标题 const openForm = (type: string, id?: number) => {
const modelLoading = ref(false) // 弹出层loading formRef.value.open(type, id)
const actionType = ref('') // 操作按钮的类型
const actionLoading = ref(false) // 按钮 Loading
const formRef = ref<FormExpose>() // 表单 Ref
const detailData = ref() // 详情 Ref
// 设置标题
const setDialogTile = (type: string) => {
modelLoading.value = true
modelTitle.value = t('action.' + type)
actionType.value = type
modelVisible.value = true
} }
// 新增操作 /** 删除按钮操作 */
const handleCreate = () => { const handleDelete = (id: number) => {
setDialogTile('create') tableMethods.delList(id, false)
modelLoading.value = false
} }
// 修改操作 /** 初始化 **/
const handleUpdate = async (rowId: number) => { onMounted(() => {
setDialogTile('update') getList()
// 设置数据 })
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 submitForm = async () => {
const elForm = unref(formRef)?.getElFormRef()
if (!elForm) return
elForm.validate(async (valid) => {
if (valid) {
actionLoading.value = true
// 提交请求
try {
const data = unref(formRef)?.formModel as ${simpleClassName}Api.${simpleClassName}VO
if (actionType.value === 'create') {
await ${simpleClassName}Api.create${simpleClassName}Api(data)
message.success(t('common.createSuccess'))
} else {
await ${simpleClassName}Api.update${simpleClassName}Api(data)
message.success(t('common.updateSuccess'))
}
modelVisible.value = false
} finally {
actionLoading.value = false
// 刷新列表
await reload()
}
}
})
}
</script> </script>