diff --git a/saas-admin-api.postman_collection.json b/saas-admin-api.postman_collection.json index d7b15d8..b265c52 100644 --- a/saas-admin-api.postman_collection.json +++ b/saas-admin-api.postman_collection.json @@ -17,7 +17,7 @@ "mode": "raw", "raw": "{\"question\": \"商家 测试商家 昨天的 GMV 是多少?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -32,7 +32,7 @@ "mode": "raw", "raw": "{\"question\": \"订单 2025052215583773001 的状态是什么?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -47,7 +47,7 @@ "mode": "raw", "raw": "{\"question\": \"用户 3750 的信息?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -62,7 +62,7 @@ "mode": "raw", "raw": "{\"question\": \"商品 气密性通风口门及不锈锈钢通风圆管 卖了多少件?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -77,7 +77,7 @@ "mode": "raw", "raw": "{\"question\": \"商家 测试商家 的退款率是多少?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -92,7 +92,7 @@ "mode": "raw", "raw": "{\"question\": \"列出所有未发货订单\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -107,7 +107,7 @@ "mode": "raw", "raw": "{\"question\": \"列出所有正常营业的商户\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -122,7 +122,7 @@ "mode": "raw", "raw": "{\"question\": \"商户 测试商家 的提现记录有哪些?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -137,7 +137,7 @@ "mode": "raw", "raw": "{\"question\": \"用户 3750 的充值记录有哪些?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -152,7 +152,7 @@ "mode": "raw", "raw": "{\"question\": \"用户 3750 的邀请奖励有哪些?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -167,7 +167,7 @@ "mode": "raw", "raw": "{\"question\": \"最近的系统公告有哪些?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -182,7 +182,7 @@ "mode": "raw", "raw": "{\"question\": \"最近的店铺笔记有哪些?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -197,7 +197,7 @@ "mode": "raw", "raw": "{\"question\": \"商家 测试商家 的 uniacid 是多少?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -212,7 +212,7 @@ "mode": "raw", "raw": "{\"question\": \"用户 1 的 uniacid 是多少?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } }, { @@ -227,7 +227,7 @@ "mode": "raw", "raw": "{\"question\": \"当前有多少商家用户?\"}" }, - "url": "{{base_url}}/admin/query" + "url": "{{base_url}}/api/v1/admin/query" } } ], diff --git a/src/index.ts b/src/index.ts index a069c88..a517bf2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ // src/index.ts import { Elysia } from 'elysia'; -import adminRoutes from './routes/admin'; +import routes from './routes'; import { config } from 'dotenv'; config(); const app = new Elysia() - .use(adminRoutes) + .use(routes) .get('/', () => 'SaaS Admin API - Ready for Dify Agent') .listen(process.env.PORT || 8080); diff --git a/src/routes/index.ts b/src/routes/index.ts new file mode 100644 index 0000000..0630840 --- /dev/null +++ b/src/routes/index.ts @@ -0,0 +1,14 @@ +// src/routes/index.ts +import { Elysia } from 'elysia'; +import v1Routes from './v1'; + +// 主路由配置,支持多版本管理 +const routes = new Elysia() + // v1 版本路由 + .group('/api/v1', (app) => app.use(v1Routes)) + // 未来可以在这里添加 v2, v3 等版本路由 + // .group('/api/v2', (app) => app.use(v2Routes)) + // .group('/api/v3', (app) => app.use(v3Routes)) +; + +export default routes; \ No newline at end of file diff --git a/src/routes/admin.ts b/src/routes/v1/admin.ts similarity index 89% rename from src/routes/admin.ts rename to src/routes/v1/admin.ts index 2933cab..3c8478f 100644 --- a/src/routes/admin.ts +++ b/src/routes/v1/admin.ts @@ -1,7 +1,7 @@ -// src/routes/admin.ts +// src/routes/v1/admin.ts import { Elysia } from 'elysia'; -import { verifyApiKey, sanitizeResult } from '../security'; -import { executeNaturalLanguageQuery } from '../queryEngine'; +import { verifyApiKey, sanitizeResult } from './services/security'; +import { executeNaturalLanguageQuery } from './services/queryEngine'; const adminRoutes = new Elysia({ prefix: '/admin' }) .use(verifyApiKey) diff --git a/src/routes/v1/index.ts b/src/routes/v1/index.ts new file mode 100644 index 0000000..5563fb2 --- /dev/null +++ b/src/routes/v1/index.ts @@ -0,0 +1,8 @@ +// src/routes/v1/index.ts +import { Elysia } from 'elysia'; +import adminRoutes from './admin'; + +const v1Routes = new Elysia() + .use(adminRoutes); + +export default v1Routes; \ No newline at end of file diff --git a/src/queryEngine.ts b/src/routes/v1/services/queryEngine.ts similarity index 99% rename from src/queryEngine.ts rename to src/routes/v1/services/queryEngine.ts index fe3a33c..1a091bf 100644 --- a/src/queryEngine.ts +++ b/src/routes/v1/services/queryEngine.ts @@ -1,5 +1,5 @@ -// src/queryEngine.ts -import pool from './db'; +// src/routes/v1/services/queryEngine.ts +import pool from '../../../db'; type QueryContext = { current_tenant_id?: string; diff --git a/src/security.ts b/src/routes/v1/services/security.ts similarity index 98% rename from src/security.ts rename to src/routes/v1/services/security.ts index b7ef03c..9b8dab7 100644 --- a/src/security.ts +++ b/src/routes/v1/services/security.ts @@ -1,4 +1,4 @@ -// src/security.ts +// src/routes/v1/services/security.ts import { Elysia, Context } from 'elysia'; // 脱敏规则配置