通用 Vue3 中后台 CRUD 页面生成技能,不依赖任何项目专属生成器或通用组件。基于 Vue3 + TypeScript + Element Plus 纯手写方式,输出可直接复制到任意 Vue3 管理后台项目的 CRUD 业务骨架。

不适用场景:
@/、#/ 或 ./ 相对路径)必须收集以下输入(缺一需先追问):
user-management用户管理/system/user/api/user)@/)import request from '@/utils/request')推荐使用输入模板:input-template.md
最小输出集合:
src/views/{kebab-name}/index.vue — 列表页(含查询/分页)src/views/{kebab-name}/types.ts — 实体类型定义src/api/{kebab-name}.ts — API 请求层按需输出:
src/views/{kebab-name}/columns.ts — 表格列配置(若字段多于 5 列)src/views/{kebab-name}/FormDialog.vue — 新增/编辑弹窗(若要求新增/编辑)src/views/{kebab-name}/DetailDrawer.vue — 详情抽屉(若要求详情)src/router/routes/modules/{kebab-name}.ts — 路由模块(若要求生成路由)mock/{kebab-name}.ts — mock 数据(若要求 mock)// ── 实体类型 ──────────────────────────────────────────────
export interface {Entity} {
id: number
// ...字段
createTime?: string
updateTime?: string
}
// ── 列表查询参数 ──────────────────────────────────────────
export interface {Entity}ListParams {
pageNum: number
pageSize: number
// ...可搜索字段(可选)
}
// ── 列表响应 ─────────────────────────────────────────────
export interface {Entity}ListResponse {
list: {Entity}[]
total: number
}
// ── 表单提交类型(新增/编辑共用或分开) ─────────────────────
export type {Entity}Form = Omit<{Entity}, 'id' | 'createTime' | 'updateTime'>
export type {Entity}CreateForm = {Entity}Form
export type {Entity}UpdateForm = {Entity}Form & { id: number }import request from '@/utils/request'
import type { {Entity}, {Entity}ListParams, {Entity}ListResponse, {Entity}CreateForm, {Entity}UpdateForm } from '@/views/{kebab-name}/types'
// 查询列表(分页)
export function get{Entity}List(params: {Entity}ListParams) {
return request.get<{Entity}ListResponse>('/api/{resource}', { params })
}
// 查询详情
export function get{Entity}Detail(id: number) {
return request.get<{Entity}>(`/api/{resource}/${id}`)
}
// 新增
export function create{Entity}(data: {Entity}CreateForm) {
return request.post<void>('/api/{resource}', data)
}
// 编辑
export function update{Entity}(data: {Entity}UpdateForm) {
return request.put<void>(`/api/{resource}/${data.id}`, data)
}
// 删除
export function remove{Entity}(id: number) {
return request.delete<void>(`/api/{resource}/${id}`)
}
// 批量删除(按需)
export function batchRemove{Entity}(ids: number[]) {
return request.delete<void>('/api/{resource}/batch', { data: { ids } })
}<script setup lang="ts">
① 依赖导入(el-* 组件、类型、API)
② 响应式状态:loading/tableData/total/pageNum/pageSize/searchForm
③ 表格列定义(columns 数组或 columns.ts 引用)
④ 枚举映射(statusMap/statusLabel)
⑤ 数据加载函数 loadData()
⑥ 搜索/重置 handleSearch/handleReset
⑦ 新增/编辑 handleAdd/handleEdit
⑧ 删除 handleDelete(带 ElMessageBox 确认)
⑨ 分页变化监听 watch([pageNum, pageSize])
⑩ onMounted 调用 loadData()
</script>
<template>
① 页面容器(带标题区)
② 搜索表单(el-form inline + el-form-item + el-input/el-select)
③ 操作按钮区(新增/导出)
④ 数据表格(el-table + el-table-column)
⑤ 分页(el-pagination)
</template>el-dialog,通过 defineProps<{ visible; row? }> + defineEmits<{ 'update:visible'; saved }> 控制el-form ref + validate() 做提交前校验{ ...row } 浅拷贝)import type { RouteRecordRaw } from 'vue-router'
const routes: RouteRecordRaw[] = [
{
path: '/{resource}',
name: '{Entity}',
meta: { title: '{中文名}', icon: 'xxx', requiresAuth: true },
children: [
{
path: 'list',
name: '{Entity}List',
component: () => import('@/views/{kebab-name}/index.vue'),
meta: { title: '{中文名}列表' },
},
],
},
]
export default routesany,不使用 as 强转绕过类型问题ElMessageBox.confirm 二次确认const/Map/对象集中定义,不散落在模板中生成完成后须在交付说明中明确:
input-template.mdvalidation-checklist.md