diff --git a/README.md b/README.md index e0678bd..6f20ce3 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,9 @@ ## 开发与部署 -用 Linux 开发与部署,包管理器采用 bun@1.3.11。数据库为 **postgres**(通过 `DATABASE_URL` 连接;本地可参考 `.env.example` 复制为 `.env.local`)。部署时可直接打包 `.output` 目录,在服务器环境执行迁移命令,省时省力。 \ No newline at end of file +用 Linux 开发与部署,包管理器采用 bun@1.3.11。数据库为 **postgres**(通过 `DATABASE_URL` 连接;本地可参考 `.env.example` 复制为 `.env.local`)。部署时可直接打包 `.output` 目录,在服务器环境执行迁移命令,省时省力。 + +## 计划 + +- [ ] 支持定时任务 +- [ ] \ No newline at end of file diff --git a/app/app.vue b/app/app.vue index 2740a31..28d8f53 100644 --- a/app/app.vue +++ b/app/app.vue @@ -1,5 +1,6 @@ diff --git a/bun.lock b/bun.lock index 59b0b5a..59990c8 100644 --- a/bun.lock +++ b/bun.lock @@ -9,12 +9,14 @@ "drizzle-orm": "^0.45.2", "drizzle-pkg": "workspace:*", "drizzle-seed": "0.3.1", + "drizzle-zod": "^0.8.3", "log4js": "^6.9.1", "logger": "workspace:*", "nuxt": "4.4.2", "pg": "8.20.0", "vue": "3.5.32", "vue-router": "5.0.4", + "zod": "^4.3.6", }, "devDependencies": { "@types/pg": "^8.20.0", @@ -731,6 +733,8 @@ "drizzle-seed": ["drizzle-seed@0.3.1", "", { "dependencies": { "pure-rand": "^6.1.0" }, "peerDependencies": { "drizzle-orm": ">=0.36.4" }, "optionalPeers": ["drizzle-orm"] }, "sha512-F/0lgvfOAsqlYoHM/QAGut4xXIOXoE5VoAdv2FIl7DpGYVXlAzKuJO+IphkKUFK3Dz+rFlOsQLnMNrvoQ0cx7g=="], + "drizzle-zod": ["drizzle-zod@0.8.3", "", { "peerDependencies": { "drizzle-orm": ">=0.36.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-66yVOuvGhKJnTdiqj1/Xaaz9/qzOdRJADpDa68enqS6g3t0kpNkwNYjUuaeXgZfO/UWuIM9HIhSlJ6C5ZraMww=="], + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], @@ -1445,6 +1449,8 @@ "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], diff --git a/package.json b/package.json index 1082266..a19dff2 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,14 @@ "drizzle-orm": "^0.45.2", "drizzle-pkg": "workspace:*", "drizzle-seed": "0.3.1", + "drizzle-zod": "^0.8.3", "log4js": "^6.9.1", "logger": "workspace:*", "nuxt": "4.4.2", "pg": "8.20.0", "vue": "3.5.32", - "vue-router": "5.0.4" + "vue-router": "5.0.4", + "zod": "^4.3.6" }, "devDependencies": { "@types/pg": "^8.20.0", diff --git a/server/api/hello.ts b/server/api/hello.ts index 253114b..146a58e 100644 --- a/server/api/hello.ts +++ b/server/api/hello.ts @@ -1,13 +1,14 @@ -import { usersTable } from "drizzle-pkg/lib/schema/schema"; -import { dbGlobal } from "drizzle-pkg/lib/db"; import log4js from "logger"; +import { getUsers } from "#server/service/auth"; const logger = log4js.getLogger("APP") -export default defineEventHandler(async (event) => { +export default defineWrappedResponseHandler({ + auth: true, + authType: 'token', +}, async (event) => { logger.info("hello: world"); - const users = await dbGlobal.select().from(usersTable) - logger.info("users (formatted): %s \n", JSON.stringify(users, null, 2)); + const users = await getUsers(1) return { hello: 'world', users: users, diff --git a/server/service/auth/index.ts b/server/service/auth/index.ts new file mode 100644 index 0000000..c5ad8f6 --- /dev/null +++ b/server/service/auth/index.ts @@ -0,0 +1,12 @@ +import { dbGlobal } from "drizzle-pkg/lib/db"; +import { usersTable } from "drizzle-pkg/lib/schema/schema"; +import { eq } from "drizzle-orm"; +import log4js from "logger"; + +const logger = log4js.getLogger("AUTH") + +export async function getUsers(id: number) { + const users = await dbGlobal.select().from(usersTable) + logger.info("users (formatted): %s \n", JSON.stringify(users, null, 2)); + return users; +} \ No newline at end of file diff --git a/server/utils/handler.ts b/server/utils/handler.ts new file mode 100644 index 0000000..cef2844 --- /dev/null +++ b/server/utils/handler.ts @@ -0,0 +1,27 @@ + +interface IConfig { + auth?: boolean; + authType?: 'token' | 'basic'; +} + +export const defineWrappedResponseHandler = ( + handlerOrConfig?: EventHandler | IConfig, + _handler?: EventHandler, +): EventHandler => { + const handler = typeof handlerOrConfig === 'function' ? handlerOrConfig : _handler; + if (!handler) { + throw new Error('handler or config is required'); + } + const config = typeof handlerOrConfig === 'object' ? handlerOrConfig : {}; + return defineEventHandler(async (event) => { + try { + // do something before the route handler + const response = await handler(event) + // do something after the route handler + return { response } + } catch (err) { + // Error handling + return { err } + } + }) +} \ No newline at end of file