diff --git a/.env.develepment b/.env.development
similarity index 100%
rename from .env.develepment
rename to .env.development
diff --git a/package.json b/package.json
index a670be3..7d6ad1e 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,9 @@
"build": "vue-tsc -b && vite build",
"preview": "vite preview",
"generate:page": "node --no-warnings=ExperimentalWarning --experimental-strip-types scripts/generatePage.ts",
- "gp": "node --no-warnings=ExperimentalWarning --experimental-strip-types scripts/generatePage.ts"
+ "gp": "node --no-warnings=ExperimentalWarning --experimental-strip-types scripts/generatePage.ts",
+ "generate:component": "node --no-warnings=ExperimentalWarning --experimental-strip-types scripts/generateComponent.ts",
+ "gc": "node --no-warnings=ExperimentalWarning --experimental-strip-types scripts/generateComponent.ts"
},
"dependencies": {
"@tailwindcss/vite": "^4.1.11",
diff --git a/scripts/generateComponent.ts b/scripts/generateComponent.ts
new file mode 100644
index 0000000..523321f
--- /dev/null
+++ b/scripts/generateComponent.ts
@@ -0,0 +1,132 @@
+import * as fs from "node:fs";
+import * as path from "node:path";
+import * as readline from "node:readline";
+
+// Constants
+const PAGES_DIR = path.resolve(process.cwd(), "src/components");
+const TEMPLATE = `
+
+
+
+
+
+
+
+`;
+
+/**
+ * Ensures the pages directory exists
+ */
+function ensurePagesDirectory() {
+ if (!fs.existsSync(PAGES_DIR)) {
+ console.log(`检测到 ${PAGES_DIR} 目录不存在, 正在为您创建该目录`);
+ fs.mkdirSync(PAGES_DIR, { recursive: true });
+ }
+}
+
+/**
+ * Formats the component name to PascalCase and ensures it ends with .vue
+ * @param name The input name to format
+ * @returns Properly formatted component name
+ */
+function formatComponentName(name: string): string {
+ // .vue extension if present
+ if (name.endsWith(".vue")) {
+ return name;
+ }
+
+ // Page suffix if present
+ if (name.endsWith("Component")) {
+ return `${name}.vue`;
+ }
+
+ // Convert to PascalCase
+ let baseName = name
+ .split(/[-_\s.]+/)
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
+ .join("");
+
+ // Ensure name is not empty
+ if (!baseName) {
+ throw new Error("组件名称不能为空");
+ }
+
+ // Add Page suffix if not already present
+ if (!baseName.endsWith("Component")) {
+ baseName += "Component";
+ }
+
+ // Add .vue extension
+ return `${baseName}.vue`;
+}
+
+/**
+ * Creates a new Vue component file
+ * @param componentName The name of the component to create
+ */
+async function createComponent(componentName: string) {
+ const formattedName = formatComponentName(componentName);
+ const filePath = path.join(PAGES_DIR, formattedName);
+
+ // Check if file already exists
+ if (fs.existsSync(filePath)) {
+ console.error(`❌ 失败: 组件 ${formattedName} 已存在于 ${filePath}`);
+ return false;
+ }
+
+ try {
+ // Write the file
+ fs.writeFileSync(filePath, TEMPLATE);
+ console.log(`✅ 成功: 创建组件 ${formattedName} at ${filePath}`);
+ return true;
+ } catch (error) {
+ console.error(
+ `❌ 失败: ${error instanceof Error ? error.message : String(error)}`,
+ );
+ return false;
+ }
+}
+
+/**
+ * Main function to run the script
+ */
+async function main() {
+ ensurePagesDirectory();
+
+ const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+
+ console.log("\n🚀 组件生成器");
+ console.log("==========================");
+
+ try {
+ const componentName = await new Promise((resolve) => {
+ rl.question(
+ "✨ 请输入组件名称, 程序将自动转换为 PascalCase: (例如: about-me => AboutMeComponent)\n",
+ (answer: string) => {
+ resolve(answer.trim());
+ },
+ );
+ });
+
+ if (!componentName) {
+ console.error("❌ 失败: 组件名称不能为空");
+ return;
+ }
+
+ await createComponent(componentName);
+ } catch (error) {
+ console.error(
+ `❌ 失败: ${error instanceof Error ? error.message : String(error)}`,
+ );
+ } finally {
+ rl.close();
+ }
+}
+
+// Run the script
+main().catch(console.error);
diff --git a/src/apis/example.ts b/src/apis/example.ts
new file mode 100644
index 0000000..8dc81e0
--- /dev/null
+++ b/src/apis/example.ts
@@ -0,0 +1,13 @@
+import http from "@/utils/http";
+
+const url = "";
+
+const data = {};
+
+export const exampleApi = () => {
+ return http({
+ url,
+ method: "POST",
+ data,
+ });
+};
diff --git a/src/assets/hucky.png b/src/assets/hucky.png
new file mode 100644
index 0000000..0c6f38e
Binary files /dev/null and b/src/assets/hucky.png differ
diff --git a/src/components/ExampleComponent.vue b/src/components/ExampleComponent.vue
new file mode 100644
index 0000000..d6b279d
--- /dev/null
+++ b/src/components/ExampleComponent.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+