import { promises as fs } from 'fs'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { createInterface } from 'readline'; // 获取当前文件的目录 const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); interface GenerateOptions { name: string; // 模块名称,如 user, role 等 description: string; // 中文描述,如 "用户管理" baseUrl: string; // API基础路径,如 "/api/v1/users" pageType?: 'list' | 'detail' | 'form'; // 页面类型,预留扩展 } // 生成 types.ts function generateTypes(options: GenerateOptions): string { const { name } = options; const typeName = name.charAt(0).toUpperCase() + name.slice(1); return `import type { BaseResponse, BaseQuery } from '@/types/base'; export interface ${typeName}Response extends BaseResponse { name: string; description?: string; enabled: boolean; sort: number; // TODO: 添加其他字段 } export interface ${typeName}Query extends BaseQuery { name?: string; enabled?: boolean; // TODO: 添加其他查询字段 } export interface ${typeName}Request { name: string; description?: string; enabled: boolean; sort: number; // TODO: 添加其他请求字段 } `; } // 生成 schema.ts function generateSchema(options: GenerateOptions): string { const { name } = options; const typeName = name.charAt(0).toUpperCase() + name.slice(1); return `import * as z from "zod"; export const searchFormSchema = z.object({ name: z.string().optional(), enabled: z.boolean().optional(), }); export const ${typeName.toLowerCase()}FormSchema = z.object({ name: z.string().min(1, "请输入名称").max(50, "名称不能超过50个字符"), description: z.string().max(200, "描述不能超过200个字符").optional(), enabled: z.boolean().default(true), sort: z.number().min(0).default(0), }); export type SearchFormValues = z.infer; export type ${typeName}FormValues = z.infer; `; } // 生成 service.ts function generateService(options: GenerateOptions): string { const { name, baseUrl } = options; const typeName = name.charAt(0).toUpperCase() + name.slice(1); return `import request from '@/utils/request'; import type { Page } from '@/types/base'; import type { ${typeName}Response, ${typeName}Query, ${typeName}Request } from './types'; const BASE_URL = '${baseUrl}'; // 创建 export const create${typeName} = (data: ${typeName}Request) => request.post(BASE_URL, data); // 更新 export const update${typeName} = (id: number, data: ${typeName}Request) => request.put(\`\${BASE_URL}/\${id}\`, data); // 删除 export const delete${typeName} = (id: number) => request.delete(\`\${BASE_URL}/\${id}\`); // 获取详情 export const get${typeName} = (id: number) => request.get<${typeName}Response>(\`\${BASE_URL}/\${id}\`); // 分页查询列表 export const get${typeName}Page = (params?: ${typeName}Query) => request.get>(\`\${BASE_URL}/page\`, { params }); // 获取所有列表 export const get${typeName}List = () => request.get<${typeName}Response[]>(BASE_URL); // 条件查询列表 export const get${typeName}ListByCondition = (params?: ${typeName}Query) => request.get<${typeName}Response[]>(\`\${BASE_URL}/list\`, { params }); `; } // 生成 Modal 组件 function generateModal(options: GenerateOptions): string { const { name } = options; const typeName = name.charAt(0).toUpperCase() + name.slice(1); return `import React, { useEffect } from 'react'; import type { ${typeName}Response } from '../types'; import { create${typeName}, update${typeName} } from '../service'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { useToast } from "@/components/ui/use-toast"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { ${typeName.toLowerCase()}FormSchema, type ${typeName}FormValues } from '../schema'; import { Textarea } from "@/components/ui/textarea"; interface ${typeName}ModalProps { open: boolean; onCancel: () => void; onSuccess: () => void; initialValues?: ${typeName}Response; } const ${typeName}Modal: React.FC<${typeName}ModalProps> = ({ open, onCancel, onSuccess, initialValues, }) => { const { toast } = useToast(); const isEdit = !!initialValues?.id; const form = useForm<${typeName}FormValues>({ resolver: zodResolver(${typeName.toLowerCase()}FormSchema), defaultValues: { name: "", description: "", enabled: true, sort: 0, }, }); useEffect(() => { if (initialValues) { form.reset({ name: initialValues.name, description: initialValues.description || "", enabled: initialValues.enabled, sort: initialValues.sort, }); } }, [initialValues, form]); const handleSubmit = async (values: ${typeName}FormValues) => { try { if (isEdit) { await update${typeName}(initialValues.id, values); } else { await create${typeName}(values); } toast({ title: \`\${isEdit ? '更新' : '创建'}成功\`, duration: 3000, }); form.reset(); onSuccess(); } catch (error) { toast({ variant: "destructive", title: \`\${isEdit ? '更新' : '创建'}失败\`, description: error instanceof Error ? error.message : undefined, duration: 3000, }); } }; return ( !open && onCancel()}> {isEdit ? '编辑' : '新建'}
( 名称 )} /> ( 描述