feat(api): 添加多路由代理处理实现

- 新增api目录下多个接口路径代理处理文件,支持动态拼接目标URL
- 根据环境变量选择不同的后端服务地址(如dev和生产环境)
- 统一添加TenantId和Authorization请求头传递租户及身份信息
- 实现请求参数及搜索参数的完整转发
- 引入better-sqlite3及node内建模块支持服务端功能
- 新增专家详情页面,实现文章、成果及预约咨询功能展示
- 页面实现加载骨架屏、标签页切换及空状态提示优化体验
This commit is contained in:
2026-04-28 13:50:27 +08:00
parent 3edf4f0124
commit 528fe28ffc
399 changed files with 53320 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
import { d as defineEventHandler, u as useRuntimeConfig, a as getRouterParam, b as getRequestURL, c as getHeader, p as proxyRequest } from '../../../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'better-sqlite3';
function joinURL(base, path) {
if (!path) return base;
return base.replace(/\/+$/, "") + "/" + path.replace(/^\/+/, "");
}
const ____path_ = defineEventHandler((event) => {
const config = useRuntimeConfig();
const mpApiBase = config.public.mpApiBase || "https://mp-api.websoft.top";
const path = getRouterParam(event, "path") || "";
const search = getRequestURL(event).search;
const target = joinURL(mpApiBase + "/api/cms", path) + search;
const tenantId = getHeader(event, "tenantid") || config.public.tenantId;
return proxyRequest(event, target, {
headers: {
TenantId: String(tenantId)
}
});
});
export { ____path_ as default };
//# sourceMappingURL=_...path_.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"_...path_.mjs","sources":["../../../../../../server/api/cms/[...path].ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,SAAA,OAAA,CAAA,MAAA,IAAA,EAAA;AACA,EAAA,IAAA,CAAA,MAAA,OAAA,IAAA;AACA,EAAA,OAAA,IAAA,CAAA,QAAA,MAAA,EAAA,EAAA,IAAA,GAAA,GAAA,IAAA,CAAA,OAAA,CAAA,MAAA,EAAA,EAAA,CAAA;AACA;AAMA,kBAAA,kBAAA,CAAA,CAAA,KAAA,KAAA;AACA,EAAA,MAAA,SAAA,gBAAA,EAAA;AACA,EAAA,MAAA,SAAA,GAAA,MAAA,CAAA,MAAA,CAAA,SAAA,IAAA,4BAAA;AACA,EAAA,MAAA,IAAA,GAAA,cAAA,CAAA,KAAA,EAAA,MAAA,CAAA,IAAA,EAAA;AACA,EAAA,MAAA,MAAA,GAAA,aAAA,CAAA,KAAA,CAAA,CAAA,MAAA;AACA,EAAA,MAAA,MAAA,GAAA,OAAA,CAAA,SAAA,GAAA,UAAA,EAAA,IAAA,CAAA,GAAA,MAAA;AAEA,EAAA,MAAA,WAAA,SAAA,CAAA,KAAA,EAAA,UAAA,CAAA,IAAA,OAAA,MAAA,CAAA,QAAA;AAEA,EAAA,OAAA,YAAA,CAAA,OAAA,MAAA,EAAA;AAAA,IACA,OAAA,EAAA;AAAA,MACA,QAAA,EAAA,OAAA,QAAA;AAAA;AACA,GACA,CAAA;AACA,CAAA,CAAA;;;;"}

View File

@@ -0,0 +1,37 @@
import { d as defineEventHandler, e as getQuery, u as useRuntimeConfig, c as getHeader, $ as $fetch, f as createError } from '../../../../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'better-sqlite3';
const getSiteInfo_get = defineEventHandler(async (event) => {
var _a;
const config = useRuntimeConfig();
const query = getQuery(event);
const modulesApiBase = config.public.modulesApiBase || config.public.ApiBase || "https://websopy-api.websoft.top/api";
const tenantId = getHeader(event, "tenantid") || config.public.tenantId || config.public.TenantId || "5";
const authorization = getHeader(event, "authorization");
try {
return await $fetch("/cms/cms-website/getSiteInfo", {
baseURL: modulesApiBase,
headers: {
TenantId: String(tenantId),
...authorization ? { Authorization: String(authorization) } : {}
},
query
});
} catch (error) {
throw createError({
statusCode: (error == null ? void 0 : error.statusCode) || ((_a = error == null ? void 0 : error.response) == null ? void 0 : _a.status) || 502,
statusMessage: (error == null ? void 0 : error.statusMessage) || "Failed to fetch site info"
});
}
});
export { getSiteInfo_get as default };
//# sourceMappingURL=getSiteInfo.get.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getSiteInfo.get.mjs","sources":["../../../../../../../server/api/cms/cms-website/getSiteInfo.get.ts"],"names":[],"mappings":";;;;;;;;;;;AAIA,wBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,SAAA,gBAAA,EAAA;AACA,EAAA,MAAA,KAAA,GAAA,SAAA,KAAA,CAAA;AACA,EAAA,MAAA,iBACA,MAAA,CAAA,MAAA,CAAA,cAAA,IAAA,MAAA,CAAA,OAAA,OAAA,IAAA,qCAAA;AAEA,EAAA,MAAA,QAAA,GACA,SAAA,CAAA,KAAA,EAAA,UAAA,CAAA,IACA,OAAA,MAAA,CAAA,QAAA,IACA,MAAA,CAAA,MAAA,CAAA,QAAA,IACA,GAAA;AACA,EAAA,MAAA,aAAA,GAAA,SAAA,CAAA,KAAA,EAAA,eAAA,CAAA;AAEA,EAAA,IAAA;AACA,IAAA,OAAA,MAAA,OAAA,8BAAA,EAAA;AAAA,MACA,OAAA,EAAA,cAAA;AAAA,MACA,OAAA,EAAA;AAAA,QACA,QAAA,EAAA,OAAA,QAAA,CAAA;AAAA,QACA,GAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,aAAA,CAAA,KAAA;AAAA,OACA;AAAA,MACA;AAAA,KACA,CAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,aAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,UAAA,MAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,QAAA,KAAA,mBAAA,MAAA,CAAA,IAAA,GAAA;AAAA,MACA,aAAA,EAAA,CAAA,+BAAA,aAAA,KAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -0,0 +1,37 @@
import { d as defineEventHandler, e as getQuery, u as useRuntimeConfig, c as getHeader, $ as $fetch, f as createError } from '../../../../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'better-sqlite3';
const pageAll_get = defineEventHandler(async (event) => {
var _a;
const config = useRuntimeConfig();
const query = getQuery(event);
const modulesApiBase = config.public.modulesApiBase || config.public.ApiBase || "https://websopy-api.websoft.top/api";
const tenantId = getHeader(event, "tenantid") || config.public.tenantId || config.public.TenantId || "5";
const authorization = getHeader(event, "authorization");
try {
return await $fetch("/cms/cms-website/pageAll", {
baseURL: modulesApiBase,
headers: {
TenantId: String(tenantId),
...authorization ? { Authorization: String(authorization) } : {}
},
query
});
} catch (error) {
throw createError({
statusCode: (error == null ? void 0 : error.statusCode) || ((_a = error == null ? void 0 : error.response) == null ? void 0 : _a.status) || 502,
statusMessage: (error == null ? void 0 : error.statusMessage) || "Failed to fetch pageAll"
});
}
});
export { pageAll_get as default };
//# sourceMappingURL=pageAll.get.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"pageAll.get.mjs","sources":["../../../../../../../server/api/cms/cms-website/pageAll.get.ts"],"names":[],"mappings":";;;;;;;;;;;AAIA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,MAAA,SAAA,gBAAA,EAAA;AACA,EAAA,MAAA,KAAA,GAAA,SAAA,KAAA,CAAA;AACA,EAAA,MAAA,iBACA,MAAA,CAAA,MAAA,CAAA,cAAA,IAAA,MAAA,CAAA,OAAA,OAAA,IAAA,qCAAA;AAEA,EAAA,MAAA,QAAA,GACA,SAAA,CAAA,KAAA,EAAA,UAAA,CAAA,IACA,OAAA,MAAA,CAAA,QAAA,IACA,MAAA,CAAA,MAAA,CAAA,QAAA,IACA,GAAA;AACA,EAAA,MAAA,aAAA,GAAA,SAAA,CAAA,KAAA,EAAA,eAAA,CAAA;AAEA,EAAA,IAAA;AACA,IAAA,OAAA,MAAA,OAAA,0BAAA,EAAA;AAAA,MACA,OAAA,EAAA,cAAA;AAAA,MACA,OAAA,EAAA;AAAA,QACA,QAAA,EAAA,OAAA,QAAA,CAAA;AAAA,QACA,GAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,aAAA,CAAA,KAAA;AAAA,OACA;AAAA,MACA;AAAA,KACA,CAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,aAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,UAAA,MAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,QAAA,KAAA,mBAAA,MAAA,CAAA,IAAA,GAAA;AAAA,MACA,aAAA,EAAA,CAAA,+BAAA,aAAA,KAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}