diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7c41b2a --- /dev/null +++ b/.env.example @@ -0,0 +1,26 @@ +# 环境变量配置文件 + +# 服务器配置 +NODE_ENV=development +PORT=3000 +HOST=localhost + +# 安全配置 +AI_APIKEY=ai-apikey +SESSION_SECRET=your-session-secret-key-here,another-secret-key +JWT_SECRET=your-jwt-secret-key-must-be-at-least-32-characters-long + +# 数据库配置 +DB_PATH=./data/database.db + +# 日志配置 +LOG_LEVEL=info +LOG_FILE=./logs/app.log + +# 缓存配置 +REDIS_HOST=localhost +REDIS_PORT=6379 + +# 任务调度配置 +JOBS_ENABLED=true +TZ=Asia/Shanghai \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 7d0a184..359f9cc 100644 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/bunfig.toml b/bunfig.toml deleted file mode 100644 index 1e13871..0000000 --- a/bunfig.toml +++ /dev/null @@ -1,16 +0,0 @@ -# bun 编译配置:将 dist 下的所有资源一并内嵌到可执行文件中 -# 注意:命令行中的 --compile/--outfile 参数依然可以覆盖这里的设置 - -[compile] -# 入口文件(与 package.json 的 bundle:exe 一致) -entrypoint = "dist/booststap.js" - -# 需要内嵌到可执行文件中的静态资源(包含服务端/客户端产物) -assets = [ - "dist/**" -] - -# 输出可执行文件路径 -outfile = "dist/koa-ssr.exe" - - diff --git a/internal/x/components/ClientOnly.vue b/internal/x/components/ClientOnly.vue index 479fe11..e90b937 100644 --- a/internal/x/components/ClientOnly.vue +++ b/internal/x/components/ClientOnly.vue @@ -36,10 +36,11 @@ export default defineComponent({ onMounted(() => { mounted.value = true; }); - const vm = getCurrentInstance(); - if (vm) { - vm._nuxtClientOnly = true; - } + // 这里没什么用,先去掉 + // const vm = getCurrentInstance(); + // if (vm) { + // vm._nuxtClientOnly = true; + // } provide(clientOnlySymbol, true); return () => { if (mounted.value) { diff --git a/package.json b/package.json index 78168fb..5052d41 100644 --- a/package.json +++ b/package.json @@ -8,20 +8,17 @@ "scripts": { "postinstall": "node scripts/fix-type-router.js", "dev": "bun run --hot packages/server/src/booststap.ts", + "db": "bun run --env-file=.env --filter server db ", "build:client": "bun run --filter client build", "start": "cd dist && cross-env NODE_ENV=production bun run booststap.js", "build:all": "cross-env NODE_ENV=production tsup --config tsup.config.ts", "build": "rimraf dist && bun run build:client && bun run build:all && node scripts/build.js", - "bundle:exe": "bun build --compile ./dist/booststap.js ./dist/**/* --minify --outfile ./dist/koa-ssr.exe", - "build:exe": "bun run build && bun run bundle:exe", "tsc:booststap": "tsc packages/booststap/src/server.ts --outDir dist --module es2022 --target es2022 --lib es2022,dom --moduleResolution bundler --esModuleInterop --skipLibCheck --forceConsistentCasingInFileNames --noEmit false --incremental false", "tsc:server": "tsc packages/server/src/**/*.ts --outDir dist/server --module es2022 --target es2022 --lib es2022,dom --moduleResolution bundler --esModuleInterop --skipLibCheck --forceConsistentCasingInFileNames --noEmit false --incremental false" }, "devDependencies": { "@types/bun": "latest", - "@types/koa-compose": "^3.2.8", "client": "workspace:*", - "core": "workspace:*", "cross-env": "^10.1.0", "fast-glob": "^3.3.3", "helper": "workspace:*", @@ -29,6 +26,7 @@ "server": "workspace:*", "tsup": "^8.5.0", "unplugin-vue-components": "^29.1.0", + "vite": "^7.1.7", "vite-plugin-devtools-json": "^1.0.0", "x": "workspace:*" }, @@ -36,8 +34,6 @@ "typescript": "^5.9.3" }, "dependencies": { - "koa-compose": "^4.1.0", - "pinia": "^3.0.3", - "vite": "^7.1.7" + "vue": "^3.5.22" } } diff --git a/packages/client/package.json b/packages/client/package.json index 115d4ee..bb8d3ca 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -11,13 +11,18 @@ "@types/jsdom": "^27.0.0", "sass-embedded": "^1.93.2", "unplugin-vue-components": "^29.1.0", - "vue-tsc": "^3.1.0" + "vue-tsc": "^3.1.0", + "@vitejs/plugin-vue": "^6.0.1", + "unplugin-auto-import": "^20.2.0", + "vite-plugin-vue-layouts": "^0.11.0" }, "dependencies": { - "@maz-ui/icons": "^4.1.3", - "@maz-ui/themes": "^4.1.5", "@unhead/vue": "^2.0.17", - "@vitejs/plugin-vue": "^6.0.1", + "ofetch": "^1.4.1", + "pinia": "^3.0.3", + "unplugin-vue-router": "^0.15.0", + "vue-final-modal": "^4.5.5", + "vue-router": "^4.5.1", "ant-design-x-vue": "^1.3.2", "dompurify": "^3.2.7", "eventsource-parser": "^3.0.6", @@ -25,13 +30,9 @@ "jsdom": "^27.0.0", "marked": "^16.3.0", "maz-ui": "^4.1.6", - "ofetch": "^1.4.1", "quill": "^2.0.3", - "unplugin-auto-import": "^20.2.0", - "unplugin-vue-router": "^0.15.0", - "vite-plugin-vue-layouts": "^0.11.0", - "vue": "^3.5.22", - "vue-final-modal": "^4.5.5", - "vue-router": "^4.5.1" + "@maz-ui/icons": "^4.1.3", + "@maz-ui/themes": "^4.1.5", + "@maz-ui/translations": "^4.1.7" } } diff --git a/packages/core/package.json b/packages/core/package.json deleted file mode 100644 index 30dabbb..0000000 --- a/packages/core/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "core", - "exports": { - "./*": { - "import": "./src/*.ts", - "require": "./src/*.ts" - } - } -} diff --git a/packages/server/drizzle.config.ts b/packages/server/drizzle.config.ts new file mode 100644 index 0000000..35b7459 --- /dev/null +++ b/packages/server/drizzle.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'drizzle-kit'; + +export default defineConfig({ + out: './drizzle', + schema: './src/db/schema.ts', + dialect: 'mysql', + dbCredentials: { + url: process.env.DATABASE_URL!, + }, +}); \ No newline at end of file diff --git a/packages/server/drizzle/0000_thick_may_parker.sql b/packages/server/drizzle/0000_thick_may_parker.sql new file mode 100644 index 0000000..64a13c0 --- /dev/null +++ b/packages/server/drizzle/0000_thick_may_parker.sql @@ -0,0 +1,8 @@ +CREATE TABLE `users_table` ( + `id` serial AUTO_INCREMENT NOT NULL, + `name` varchar(255) NOT NULL, + `age` int NOT NULL, + `email` varchar(255) NOT NULL, + CONSTRAINT `users_table_id` PRIMARY KEY(`id`), + CONSTRAINT `users_table_email_unique` UNIQUE(`email`) +); diff --git a/packages/server/drizzle/meta/0000_snapshot.json b/packages/server/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..cc53403 --- /dev/null +++ b/packages/server/drizzle/meta/0000_snapshot.json @@ -0,0 +1,70 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "3770df0e-b3f2-4223-8e66-2880f634d8b0", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "users_table": { + "name": "users_table", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "age": { + "name": "age", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_table_id": { + "name": "users_table_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "users_table_email_unique": { + "name": "users_table_email_unique", + "columns": [ + "email" + ] + } + }, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} \ No newline at end of file diff --git a/packages/server/drizzle/meta/_journal.json b/packages/server/drizzle/meta/_journal.json new file mode 100644 index 0000000..3ced3d6 --- /dev/null +++ b/packages/server/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "mysql", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1760625865036, + "tag": "0000_thick_may_parker", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/packages/server/package.json b/packages/server/package.json index e996d54..366e5c3 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -7,27 +7,37 @@ "types": "./src/*.d.ts" } }, - "scripts": {}, + "scripts": { + "db": "bunx --bun drizzle-kit " + }, "devDependencies": { "@types/formidable": "^3.4.5", "@types/koa": "^3.0.0", "@types/koa-bodyparser": "^4.3.12", + "@types/koa-compose": "^3.2.8", "@types/koa-send": "^4.1.6", - "@types/path-is-absolute": "^1.0.2" + "@types/path-is-absolute": "^1.0.2", + "drizzle-kit": "^0.31.5" }, "dependencies": { "@types/jsonwebtoken": "^9.0.10", + "assert": "^2.1.0", + "drizzle-orm": "^0.44.6", "formidable": "^3.5.4", + "http-errors": "^2.0.0", "jsonwebtoken": "^9.0.2", "koa": "^3.0.1", "koa-bodyparser": "^4.4.1", + "koa-compose": "^4.1.0", "koa-connect": "^2.1.0", "koa-send": "^5.0.1", "koa-session": "^7.0.2", "log4js": "^6.9.1", "minimatch": "^10.0.3", + "mysql2": "^3.15.2", "node-cron": "^4.2.1", "path-is-absolute": "^2.0.0", - "path-to-regexp": "^8.3.0" + "path-to-regexp": "^8.3.0", + "unhead": "^2.0.19" } } diff --git a/packages/server/src/db/index.ts b/packages/server/src/db/index.ts new file mode 100644 index 0000000..ce84de8 --- /dev/null +++ b/packages/server/src/db/index.ts @@ -0,0 +1,4 @@ +import { drizzle } from "drizzle-orm/mysql2"; + +// You can specify any property from the mysql2 connection options +const db = drizzle({ connection: { uri: process.env.DATABASE_URL } }); diff --git a/packages/server/src/db/schema.ts b/packages/server/src/db/schema.ts new file mode 100644 index 0000000..3ad5b0f --- /dev/null +++ b/packages/server/src/db/schema.ts @@ -0,0 +1,8 @@ +import { int, mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core'; + +export const usersTable = mysqlTable('users_table', { + id: serial().primaryKey(), + name: varchar({ length: 255 }).notNull(), + age: int().notNull(), + email: varchar({ length: 255 }).notNull().unique(), +}); diff --git a/packages/server/src/middleware/install.ts b/packages/server/src/middleware/install.ts index aa9811d..f0ca653 100644 --- a/packages/server/src/middleware/install.ts +++ b/packages/server/src/middleware/install.ts @@ -1,5 +1,5 @@ -import { SsrMiddleWare } from "core/SsrMiddleWare" +import { SsrMiddleWare } from "../ssr" import bodyParser from "koa-bodyparser" import app from "@/app" import ResponseTime from "./ResponseTime" diff --git a/packages/core/src/SsrMiddleWare.ts b/packages/server/src/ssr/index.ts similarity index 98% rename from packages/core/src/SsrMiddleWare.ts rename to packages/server/src/ssr/index.ts index 9b3cc08..9b65b91 100644 --- a/packages/core/src/SsrMiddleWare.ts +++ b/packages/server/src/ssr/index.ts @@ -89,7 +89,7 @@ export async function SsrMiddleWare(app: Koa, options?: { onDevViteClose?: Funct } catch (e: Error | any) { vite?.ssrFixStacktrace(e) ctx.status = 500 - console.error(e.stack) + console.error(e) ctx.body = e.stack } await next() diff --git a/scripts/build.js b/scripts/build.js index 7ddeeb8..5bf2954 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -15,12 +15,14 @@ try { console.log('📋 读取package.json文件...'); const rootPackageJson = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf8')); const serverPackageJson = JSON.parse(readFileSync(join(projectRoot, 'packages/server/package.json'), 'utf8')); + const clientPackageJson = JSON.parse(readFileSync(join(projectRoot, 'packages/client/package.json'), 'utf8')); // 2. 合并依赖 console.log('🔗 合并依赖...'); const mergedDependencies = { ...rootPackageJson.dependencies, - ...serverPackageJson.dependencies + ...serverPackageJson.dependencies, + ...clientPackageJson.dependencies }; // 3. 创建生产环境的package.json diff --git a/scripts/fix-type-router.js b/scripts/fix-type-router.js index 9cf6e91..f23d275 100644 --- a/scripts/fix-type-router.js +++ b/scripts/fix-type-router.js @@ -6,13 +6,15 @@ const dtsPath = path.resolve( "../node_modules/vue-router/dist/vue-router.d.ts" ); -const content = fs.readFileSync(dtsPath, "utf8"); +if (fs.existsSync(dtsPath)) { + const content = fs.readFileSync(dtsPath, "utf8"); -const fixedContent = content.replace( - /declare module ['"]vue['"]/g, - "declare module '@vue/runtime-core'" -); + const fixedContent = content.replace( + /declare module ['"]vue['"]/g, + "declare module '@vue/runtime-core'" + ); -fs.writeFileSync(dtsPath, fixedContent, "utf8"); + fs.writeFileSync(dtsPath, fixedContent, "utf8"); -console.log("Fixed vue-router.d.ts module declaration."); + console.log("Fixed vue-router.d.ts module declaration."); +} diff --git a/tsup.config.ts b/tsup.config.ts index 909642e..fe50bdd 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -6,9 +6,10 @@ import fg from "fast-glob" const jobsEntries = await fg(["packages/server/src/jobs/**/*.ts"], { }); const modulesEntries = await fg(["packages/server/src/modules/**/*.ts"], { }); +console.log(process.env.NODE_ENV); export default defineConfig({ - entry: ["packages/server/src/booststap.ts", ...jobsEntries, ...modulesEntries], + entry: [...jobsEntries, ...modulesEntries, "packages/server/src/booststap.ts"], format: "esm", treeshake: true, sourcemap: false, diff --git a/tsup.jobs.config.ts b/tsup.jobs.config.ts deleted file mode 100644 index 8a1a0e0..0000000 --- a/tsup.jobs.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from 'tsup' -import pkg from "./package.json"; -import spkg from "./packages/server/package.json"; -import fg from "fast-glob" - -const entries = await fg(["packages/server/src/jobs/**/*.ts"], { }); - -export default defineConfig({ - entry: entries, - format: 'esm', - sourcemap: false, - clean: false, - outDir: "dist/jobs", - external: [ - ...Object.keys(pkg.dependencies), - ...Object.keys(spkg.dependencies), - ] -}) \ No newline at end of file diff --git a/tsup.modules.config.ts b/tsup.modules.config.ts deleted file mode 100644 index 76c6978..0000000 --- a/tsup.modules.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from 'tsup' -import pkg from "./package.json"; -import spkg from "./packages/server/package.json"; -import fg from "fast-glob" - -const entries = await fg(["packages/server/src/modules/**/*.ts"], { }); - -export default defineConfig({ - entry: entries, - format: 'esm', - sourcemap: false, - clean: false, - outDir: "dist/modules", - external: [ - ...Object.keys(pkg.dependencies), - ...Object.keys(spkg.dependencies), - ] -}) \ No newline at end of file