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,35 @@
import { d as defineEventHandler, g as getCookie, 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 envCookie = getCookie(event, "websopy_api_env");
const isDevEnv = envCookie === "dev";
const appApiBase = isDevEnv ? "http://127.0.0.1:9500" : config.public.appApiBase || "https://websopy-api.websoft.top";
const path = getRouterParam(event, "path") || "";
const search = getRequestURL(event).search;
const target = joinURL(appApiBase + "/api/app", path) + search;
const tenantId = getHeader(event, "tenantid") || config.public.tenantId;
const authorization = getHeader(event, "authorization");
return proxyRequest(event, target, {
headers: {
TenantId: String(tenantId),
...authorization ? { Authorization: String(authorization) } : {}
}
});
});
export { ____path_ as default };
//# sourceMappingURL=_...path_.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"_...path_.mjs","sources":["../../../../../../server/api/_app/[...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;AAEA,kBAAA,kBAAA,CAAA,CAAA,KAAA,KAAA;AACA,EAAA,MAAA,SAAA,gBAAA,EAAA;AAGA,EAAA,MAAA,SAAA,GAAA,SAAA,CAAA,KAAA,EAAA,iBAAA,CAAA;AACA,EAAA,MAAA,WAAA,SAAA,KAAA,KAAA;AAGA,EAAA,MAAA,UAAA,GAAA,QAAA,GACA,uBAAA,GACA,MAAA,CAAA,OAAA,UAAA,IAAA,iCAAA;AAEA,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,UAAA,GAAA,UAAA,EAAA,IAAA,CAAA,GAAA,MAAA;AAEA,EAAA,MAAA,WAAA,SAAA,CAAA,KAAA,EAAA,UAAA,CAAA,IAAA,OAAA,MAAA,CAAA,QAAA;AACA,EAAA,MAAA,aAAA,GAAA,SAAA,CAAA,KAAA,EAAA,eAAA,CAAA;AAEA,EAAA,OAAA,YAAA,CAAA,OAAA,MAAA,EAAA;AAAA,IACA,OAAA,EAAA;AAAA,MACA,QAAA,EAAA,OAAA,QAAA,CAAA;AAAA,MACA,GAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,aAAA,CAAA,KAAA;AAAA;AACA,GACA,CAAA;AACA,CAAA,CAAA;;;;"}

View File

@@ -0,0 +1,33 @@
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 fileServerBase = config.public.fileServerBase || "https://server.websoft.top";
const path = getRouterParam(event, "path") || "";
const search = getRequestURL(event).search;
const target = joinURL(fileServerBase, path) + search;
const tenantId = getHeader(event, "tenantid") || config.public.tenantId;
const authorization = getHeader(event, "authorization");
return proxyRequest(event, target, {
headers: {
TenantId: String(tenantId),
...authorization ? { Authorization: String(authorization) } : {}
}
});
});
export { ____path_ as default };
//# sourceMappingURL=_...path_.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"_...path_.mjs","sources":["../../../../../../server/api/_file/[...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;AAEA,kBAAA,kBAAA,CAAA,CAAA,KAAA,KAAA;AACA,EAAA,MAAA,SAAA,gBAAA,EAAA;AACA,EAAA,MAAA,cAAA,GAAA,MAAA,CAAA,MAAA,CAAA,cAAA,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,cAAA,EAAA,IAAA,CAAA,GAAA,MAAA;AAEA,EAAA,MAAA,WAAA,SAAA,CAAA,KAAA,EAAA,UAAA,CAAA,IAAA,OAAA,MAAA,CAAA,QAAA;AACA,EAAA,MAAA,aAAA,GAAA,SAAA,CAAA,KAAA,EAAA,eAAA,CAAA;AAEA,EAAA,OAAA,YAAA,CAAA,OAAA,MAAA,EAAA;AAAA,IACA,OAAA,EAAA;AAAA,MACA,QAAA,EAAA,OAAA,QAAA,CAAA;AAAA,MACA,GAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,aAAA,CAAA,KAAA;AAAA;AACA,GACA,CAAA;AACA,CAAA,CAAA;;;;"}

View File

@@ -0,0 +1,35 @@
import { d as defineEventHandler, g as getCookie, 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 envCookie = getCookie(event, "websopy_api_env");
const isDevEnv = envCookie === "dev";
const mpApiBase = isDevEnv ? "http://127.0.0.1:9500" : config.public.mpApiBase || "https://mp-api.websoft.top";
const path = getRouterParam(event, "path") || "";
const search = getRequestURL(event).search;
const target = joinURL(mpApiBase, path) + search;
const tenantId = getHeader(event, "tenantid") || config.public.tenantId;
const authorization = getHeader(event, "authorization");
return proxyRequest(event, target, {
headers: {
TenantId: String(tenantId),
...authorization ? { Authorization: String(authorization) } : {}
}
});
});
export { ____path_ as default };
//# sourceMappingURL=_...path_.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"_...path_.mjs","sources":["../../../../../../server/api/_modules/[...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;AAEA,kBAAA,kBAAA,CAAA,CAAA,KAAA,KAAA;AACA,EAAA,MAAA,SAAA,gBAAA,EAAA;AAGA,EAAA,MAAA,SAAA,GAAA,SAAA,CAAA,KAAA,EAAA,iBAAA,CAAA;AACA,EAAA,MAAA,WAAA,SAAA,KAAA,KAAA;AAGA,EAAA,MAAA,SAAA,GAAA,QAAA,GACA,uBAAA,GACA,MAAA,CAAA,OAAA,SAAA,IAAA,4BAAA;AAEA,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,EAAA,IAAA,CAAA,GAAA,MAAA;AAEA,EAAA,MAAA,WAAA,SAAA,CAAA,KAAA,EAAA,UAAA,CAAA,IAAA,OAAA,MAAA,CAAA,QAAA;AACA,EAAA,MAAA,aAAA,GAAA,SAAA,CAAA,KAAA,EAAA,eAAA,CAAA;AAEA,EAAA,OAAA,YAAA,CAAA,OAAA,MAAA,EAAA;AAAA,IACA,OAAA,EAAA;AAAA,MACA,QAAA,EAAA,OAAA,QAAA,CAAA;AAAA,MACA,GAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,aAAA,CAAA,KAAA;AAAA;AACA,GACA,CAAA;AACA,CAAA,CAAA;;;;"}

View File

@@ -0,0 +1,35 @@
import { d as defineEventHandler, g as getCookie, 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 envCookie = getCookie(event, "websopy_api_env");
const isDevEnv = envCookie === "dev";
const serverApiBase = isDevEnv ? "https://server.websoft.top/api" : config.public.serverApiBase || config.public.ServerApi || "https://server.websoft.top/api";
const path = getRouterParam(event, "path") || "";
const search = getRequestURL(event).search;
const target = joinURL(serverApiBase, path) + search;
const tenantId = getHeader(event, "tenantid") || config.public.tenantId;
const authorization = getHeader(event, "authorization");
return proxyRequest(event, target, {
headers: {
TenantId: String(tenantId),
...authorization ? { Authorization: String(authorization) } : {}
}
});
});
export { ____path_ as default };
//# sourceMappingURL=_...path_.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"_...path_.mjs","sources":["../../../../../../server/api/_server/[...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;AAEA,kBAAA,kBAAA,CAAA,CAAA,KAAA,KAAA;AACA,EAAA,MAAA,SAAA,gBAAA,EAAA;AAGA,EAAA,MAAA,SAAA,GAAA,SAAA,CAAA,KAAA,EAAA,iBAAA,CAAA;AACA,EAAA,MAAA,WAAA,SAAA,KAAA,KAAA;AAGA,EAAA,MAAA,aAAA,GAAA,WACA,gCAAA,GACA,MAAA,CAAA,OAAA,aAAA,IAAA,MAAA,CAAA,OAAA,SAAA,IAAA,gCAAA;AAEA,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,aAAA,EAAA,IAAA,CAAA,GAAA,MAAA;AAEA,EAAA,MAAA,WAAA,SAAA,CAAA,KAAA,EAAA,UAAA,CAAA,IAAA,OAAA,MAAA,CAAA,QAAA;AACA,EAAA,MAAA,aAAA,GAAA,SAAA,CAAA,KAAA,EAAA,eAAA,CAAA;AAEA,EAAA,OAAA,YAAA,CAAA,OAAA,MAAA,EAAA;AAAA,IACA,OAAA,EAAA;AAAA,MACA,QAAA,EAAA,OAAA,QAAA,CAAA;AAAA,MACA,GAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,aAAA,CAAA,KAAA;AAAA;AACA,GACA,CAAA;AACA,CAAA,CAAA;;;;"}

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;;;;"}

View File

@@ -0,0 +1,419 @@
import { createRenderer, getRequestDependencies, getPreloadLinks, getPrefetchLinks } from 'vue-bundle-renderer/runtime';
import { h as buildAssetsURL, u as useRuntimeConfig, i as getResponseStatusText, j as getResponseStatus, k as defineRenderHandler, l as publicAssetsURL, e as getQuery, f as createError, m as destr, n as getRouteRules, o as useNitroApp } from '../nitro/nitro.mjs';
import { renderToString } from 'vue/server-renderer';
import { createHead as createHead$1, propsToString, renderSSRHead } from 'unhead/server';
import { stringify, uneval } from 'devalue';
import { FlatMetaPlugin } from 'unhead/plugins';
import { walkResolver } from 'unhead/utils';
import { toValue, isRef, hasInjectionContext, inject, ref, watchEffect, getCurrentInstance, onBeforeUnmount, onDeactivated, onActivated } from 'vue';
const VueResolver = (_, value) => {
return isRef(value) ? toValue(value) : value;
};
const headSymbol = "usehead";
// @__NO_SIDE_EFFECTS__
function vueInstall(head) {
const plugin = {
install(app) {
app.config.globalProperties.$unhead = head;
app.config.globalProperties.$head = head;
app.provide(headSymbol, head);
}
};
return plugin.install;
}
// @__NO_SIDE_EFFECTS__
function injectHead() {
if (hasInjectionContext()) {
const instance = inject(headSymbol);
if (!instance) {
throw new Error("useHead() was called without provide context, ensure you call it through the setup() function.");
}
return instance;
}
throw new Error("useHead() was called without provide context, ensure you call it through the setup() function.");
}
function useHead(input, options = {}) {
const head = options.head || /* @__PURE__ */ injectHead();
return head.ssr ? head.push(input || {}, options) : clientUseHead(head, input, options);
}
function clientUseHead(head, input, options = {}) {
const deactivated = ref(false);
let entry;
watchEffect(() => {
const i = deactivated.value ? {} : walkResolver(input, VueResolver);
if (entry) {
entry.patch(i);
} else {
entry = head.push(i, options);
}
});
const vm = getCurrentInstance();
if (vm) {
onBeforeUnmount(() => {
entry.dispose();
});
onDeactivated(() => {
deactivated.value = true;
});
onActivated(() => {
deactivated.value = false;
});
}
return entry;
}
function useSeoMeta(input = {}, options = {}) {
const head = options.head || /* @__PURE__ */ injectHead();
head.use(FlatMetaPlugin);
const { title, titleTemplate, ...meta } = input;
return useHead({
title,
titleTemplate,
_flatMeta: meta
}, options);
}
// @__NO_SIDE_EFFECTS__
function createHead(options = {}) {
const head = createHead$1({
...options,
propResolvers: [VueResolver]
});
head.install = vueInstall(head);
return head;
}
const appHead = {"meta":[{"charset":"utf-8"},{"name":"viewport","content":"width=device-width, initial-scale=1"},{"name":"robots","content":"index,follow"}],"link":[{"rel":"icon","type":"image/x-icon","href":"/favicon.ico"}],"style":[],"script":[],"noscript":[],"titleTemplate":"%s - 决策咨询网"};
const appRootTag = "div";
const appRootAttrs = {"id":"__nuxt"};
const appTeleportTag = "div";
const appTeleportAttrs = {"id":"teleports"};
const appSpaLoaderTag = "div";
const appSpaLoaderAttrs = {"id":"__nuxt-loader"};
const appId = "nuxt-app";
const APP_ROOT_OPEN_TAG = `<${appRootTag}${propsToString(appRootAttrs)}>`;
const APP_ROOT_CLOSE_TAG = `</${appRootTag}>`;
const getServerEntry = () => import('../build/server.mjs').then((r) => r.default || r);
const getPrecomputedDependencies = () => import('../build/client.precomputed.mjs').then((r) => r.default || r).then((r) => typeof r === "function" ? r() : r);
const getSSRRenderer = lazyCachedFunction(async () => {
const createSSRApp = await getServerEntry();
if (!createSSRApp) {
throw new Error("Server bundle is not available");
}
const precomputed = await getPrecomputedDependencies();
const renderer = createRenderer(createSSRApp, {
precomputed,
manifest: void 0,
renderToString: renderToString$1,
buildAssetsURL
});
async function renderToString$1(input, context) {
const html = await renderToString(input, context);
return APP_ROOT_OPEN_TAG + html + APP_ROOT_CLOSE_TAG;
}
return renderer;
});
const getSPARenderer = lazyCachedFunction(async () => {
const precomputed = await getPrecomputedDependencies();
const spaTemplate = await import('../virtual/_virtual_spa-template.mjs').then((r) => r.template).catch(() => "").then((r) => {
{
const APP_SPA_LOADER_OPEN_TAG = `<${appSpaLoaderTag}${propsToString(appSpaLoaderAttrs)}>`;
const APP_SPA_LOADER_CLOSE_TAG = `</${appSpaLoaderTag}>`;
const appTemplate = APP_ROOT_OPEN_TAG + APP_ROOT_CLOSE_TAG;
const loaderTemplate = r ? APP_SPA_LOADER_OPEN_TAG + r + APP_SPA_LOADER_CLOSE_TAG : "";
return appTemplate + loaderTemplate;
}
});
const renderer = createRenderer(() => () => {
}, {
precomputed,
manifest: void 0,
renderToString: () => spaTemplate,
buildAssetsURL
});
const result = await renderer.renderToString({});
const renderToString = (ssrContext) => {
const config = useRuntimeConfig(ssrContext.event);
ssrContext.modules ||= /* @__PURE__ */ new Set();
ssrContext.payload.serverRendered = false;
ssrContext.config = {
public: config.public,
app: config.app
};
return Promise.resolve(result);
};
return {
rendererContext: renderer.rendererContext,
renderToString
};
});
function lazyCachedFunction(fn) {
let res = null;
return () => {
if (res === null) {
res = fn().catch((err) => {
res = null;
throw err;
});
}
return res;
};
}
function getRenderer(ssrContext) {
return ssrContext.noSSR ? getSPARenderer() : getSSRRenderer();
}
const getSSRStyles = lazyCachedFunction(() => import('../build/styles.mjs').then((r) => r.default || r));
function renderPayloadResponse(ssrContext) {
return {
body: stringify(splitPayload(ssrContext).payload, ssrContext._payloadReducers) ,
statusCode: getResponseStatus(ssrContext.event),
statusMessage: getResponseStatusText(ssrContext.event),
headers: {
"content-type": "application/json;charset=utf-8" ,
"x-powered-by": "Nuxt"
}
};
}
function renderPayloadJsonScript(opts) {
const contents = opts.data ? stringify(opts.data, opts.ssrContext._payloadReducers) : "";
const payload = {
"type": "application/json",
"innerHTML": contents,
"data-nuxt-data": appId,
"data-ssr": !(opts.ssrContext.noSSR)
};
{
payload.id = "__NUXT_DATA__";
}
if (opts.src) {
payload["data-src"] = opts.src;
}
const config = uneval(opts.ssrContext.config);
return [
payload,
{
innerHTML: `window.__NUXT__={};window.__NUXT__.config=${config}`
}
];
}
function splitPayload(ssrContext) {
const { data, prerenderedAt, ...initial } = ssrContext.payload;
return {
initial: { ...initial, prerenderedAt },
payload: { data, prerenderedAt }
};
}
const unheadOptions = {
disableDefaults: true,
};
function createSSRContext(event) {
const ssrContext = {
url: event.path,
event,
runtimeConfig: useRuntimeConfig(event),
noSSR: event.context.nuxt?.noSSR || (false),
head: createHead(unheadOptions),
error: false,
nuxt: void 0,
/* NuxtApp */
payload: {},
_payloadReducers: /* @__PURE__ */ Object.create(null),
modules: /* @__PURE__ */ new Set()
};
return ssrContext;
}
function setSSRError(ssrContext, error) {
ssrContext.error = true;
ssrContext.payload = { error };
ssrContext.url = error.url;
}
async function renderInlineStyles(usedModules) {
const styleMap = await getSSRStyles();
const inlinedStyles = /* @__PURE__ */ new Set();
for (const mod of usedModules) {
if (mod in styleMap && styleMap[mod]) {
for (const style of await styleMap[mod]()) {
inlinedStyles.add(style);
}
}
}
return Array.from(inlinedStyles).map((style) => ({ innerHTML: style }));
}
const renderSSRHeadOptions = {"omitLineBreaks":true};
const entryIds = [];
globalThis.__buildAssetsURL = buildAssetsURL;
globalThis.__publicAssetsURL = publicAssetsURL;
const HAS_APP_TELEPORTS = !!(appTeleportAttrs.id);
const APP_TELEPORT_OPEN_TAG = HAS_APP_TELEPORTS ? `<${appTeleportTag}${propsToString(appTeleportAttrs)}>` : "";
const APP_TELEPORT_CLOSE_TAG = HAS_APP_TELEPORTS ? `</${appTeleportTag}>` : "";
const PAYLOAD_URL_RE = /^[^?]*\/_payload.json(?:\?.*)?$/ ;
const renderer = defineRenderHandler(async (event) => {
const nitroApp = useNitroApp();
const ssrError = event.path.startsWith("/__nuxt_error") ? getQuery(event) : null;
if (ssrError && !("__unenv__" in event.node.req)) {
throw createError({
statusCode: 404,
statusMessage: "Page Not Found: /__nuxt_error"
});
}
const ssrContext = createSSRContext(event);
const headEntryOptions = { mode: "server" };
ssrContext.head.push(appHead, headEntryOptions);
if (ssrError) {
ssrError.statusCode &&= Number.parseInt(ssrError.statusCode);
if (typeof ssrError.data === "string") {
try {
ssrError.data = destr(ssrError.data);
} catch {
}
}
setSSRError(ssrContext, ssrError);
}
const isRenderingPayload = PAYLOAD_URL_RE.test(ssrContext.url);
if (isRenderingPayload) {
const url = ssrContext.url.substring(0, ssrContext.url.lastIndexOf("/")) || "/";
ssrContext.url = url;
event._path = event.node.req.url = url;
}
const routeOptions = getRouteRules(event);
if (routeOptions.ssr === false) {
ssrContext.noSSR = true;
}
const renderer = await getRenderer(ssrContext);
{
for (const id of entryIds) {
ssrContext.modules.add(id);
}
}
const _rendered = await renderer.renderToString(ssrContext).catch(async (error) => {
if (ssrContext._renderResponse && error.message === "skipping render") {
return {};
}
const _err = !ssrError && ssrContext.payload?.error || error;
await ssrContext.nuxt?.hooks.callHook("app:error", _err);
throw _err;
});
const inlinedStyles = !ssrContext._renderResponse && !isRenderingPayload ? await renderInlineStyles(ssrContext.modules ?? []) : [];
await ssrContext.nuxt?.hooks.callHook("app:rendered", { ssrContext, renderResult: _rendered });
if (ssrContext._renderResponse) {
return ssrContext._renderResponse;
}
if (ssrContext.payload?.error && !ssrError) {
throw ssrContext.payload.error;
}
if (isRenderingPayload) {
const response = renderPayloadResponse(ssrContext);
return response;
}
const NO_SCRIPTS = routeOptions.noScripts;
const { styles, scripts } = getRequestDependencies(ssrContext, renderer.rendererContext);
if (inlinedStyles.length) {
ssrContext.head.push({ style: inlinedStyles });
}
const link = [];
for (const resource of Object.values(styles)) {
link.push({ rel: "stylesheet", href: renderer.rendererContext.buildAssetsURL(resource.file), crossorigin: "" });
}
if (link.length) {
ssrContext.head.push({ link }, headEntryOptions);
}
if (!NO_SCRIPTS) {
ssrContext.head.push({
link: getPreloadLinks(ssrContext, renderer.rendererContext)
}, headEntryOptions);
ssrContext.head.push({
link: getPrefetchLinks(ssrContext, renderer.rendererContext)
}, headEntryOptions);
ssrContext.head.push({
script: renderPayloadJsonScript({ ssrContext, data: ssrContext.payload })
}, {
...headEntryOptions,
// this should come before another end of body scripts
tagPosition: "bodyClose",
tagPriority: "high"
});
}
if (!routeOptions.noScripts) {
const tagPosition = "head";
ssrContext.head.push({
script: Object.values(scripts).map((resource) => ({
type: resource.module ? "module" : null,
src: renderer.rendererContext.buildAssetsURL(resource.file),
defer: resource.module ? null : true,
// if we are rendering script tag payloads that import an async payload
// we need to ensure this resolves before executing the Nuxt entry
tagPosition,
crossorigin: ""
}))
}, headEntryOptions);
}
const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(ssrContext.head, renderSSRHeadOptions);
const htmlContext = {
htmlAttrs: htmlAttrs ? [htmlAttrs] : [],
head: normalizeChunks([headTags]),
bodyAttrs: bodyAttrs ? [bodyAttrs] : [],
bodyPrepend: normalizeChunks([bodyTagsOpen, ssrContext.teleports?.body]),
body: [
_rendered.html,
APP_TELEPORT_OPEN_TAG + (HAS_APP_TELEPORTS ? joinTags([ssrContext.teleports?.[`#${appTeleportAttrs.id}`]]) : "") + APP_TELEPORT_CLOSE_TAG
],
bodyAppend: [bodyTags]
};
await nitroApp.hooks.callHook("render:html", htmlContext, { event });
return {
body: renderHTMLDocument(htmlContext),
statusCode: getResponseStatus(event),
statusMessage: getResponseStatusText(event),
headers: {
"content-type": "text/html;charset=utf-8",
"x-powered-by": "Nuxt"
}
};
});
function normalizeChunks(chunks) {
const result = [];
for (const _chunk of chunks) {
const chunk = _chunk?.trim();
if (chunk) {
result.push(chunk);
}
}
return result;
}
function joinTags(tags) {
return tags.join("");
}
function joinAttrs(chunks) {
if (chunks.length === 0) {
return "";
}
return " " + chunks.join(" ");
}
function renderHTMLDocument(html) {
return `<!DOCTYPE html><html${joinAttrs(html.htmlAttrs)}><head>${joinTags(html.head)}</head><body${joinAttrs(html.bodyAttrs)}>${joinTags(html.bodyPrepend)}${joinTags(html.body)}${joinTags(html.bodyAppend)}</body></html>`;
}
const renderer$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
default: renderer
}, Symbol.toStringTag, { value: 'Module' }));
export { useHead as a, headSymbol as h, renderer$1 as r, useSeoMeta as u };
//# sourceMappingURL=renderer.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"renderer.mjs","sources":["../../../../node_modules/.pnpm/@unhead+vue@2.1.1_vue@3.5.26_typescript@5.9.3_/node_modules/@unhead/vue/dist/shared/vue.N9zWjxoK.mjs","../../../../node_modules/.pnpm/@unhead+vue@2.1.1_vue@3.5.26_typescript@5.9.3_/node_modules/@unhead/vue/dist/shared/vue.Bm-NbY4b.mjs","../../../../node_modules/.pnpm/@unhead+vue@2.1.1_vue@3.5.26_typescript@5.9.3_/node_modules/@unhead/vue/dist/server.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.2.2_better-sqlite3@12.8.0_db0@0.3.4_better-sqlite3@12.8.0__ioredis_a0a2be7525d559e696e64db570f075d2/node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/build-files.js","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.2.2_better-sqlite3@12.8.0_db0@0.3.4_better-sqlite3@12.8.0__ioredis_a0a2be7525d559e696e64db570f075d2/node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/payload.js","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.2.2_better-sqlite3@12.8.0_db0@0.3.4_better-sqlite3@12.8.0__ioredis_a0a2be7525d559e696e64db570f075d2/node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/app.js","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.2.2_better-sqlite3@12.8.0_db0@0.3.4_better-sqlite3@12.8.0__ioredis_a0a2be7525d559e696e64db570f075d2/node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/inline-styles.js","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.2.2_better-sqlite3@12.8.0_db0@0.3.4_better-sqlite3@12.8.0__ioredis_a0a2be7525d559e696e64db570f075d2/node_modules/@nuxt/nitro-server/dist/runtime/handlers/renderer.js"],"names":["renderToString","_renderToString"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7]}