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,419 @@
import { a as _export_sfc, n as navigateTo } from './server.mjs';
import { defineComponent, resolveComponent, mergeProps, withCtx, createTextVNode, unref, createSlots, createVNode, toDisplayString, createBlock, openBlock, Fragment, renderList, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderComponent, ssrRenderList, ssrInterpolate } from 'vue/server-renderer';
import { u as usePageSeo } from './usePageSeo-0Fjg7K52.mjs';
import '../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';
import 'vue-router';
import 'ant-design-vue';
import '@babel/runtime/helpers/esm/extends';
import 'stylis';
import 'dayjs';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/plugins';
import 'unhead/utils';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "website",
__ssrInlineRender: true,
setup(__props) {
usePageSeo({
title: "云官网 - 企业品牌展示与在线获客一体化解决方案",
description: "专为中小企业设计的 SaaS 云官网系统支持多模板、多语言、SEO 优化与可视化内容管理,下单即开通,快速搭建品牌展示与在线获客阵地。",
path: "/website"
});
const go = (url) => {
if (/^https?:\/\//i.test(url)) {
return;
}
return navigateTo(url);
};
const stats = [
{ value: "10+", label: "行业精品模板", sub: "持续更新" },
{ value: "多语言", label: "国际化支持", sub: "覆盖海外市场" },
{ value: "99.9%", label: "SLA 可用性", sub: "全年稳定运行" },
{ value: "5分钟", label: "极速开通", sub: "支付即用" }
];
const features = [
{
icon: "✨",
title: "AI 一句话建站",
desc: "描述您的业务AI 自动生成页面结构、文案与配色,告别空白页面焦虑。"
},
{
icon: "🎨",
title: "多模板一键套用",
desc: "覆盖企业、品牌、服务等多种行业风格,可视化编辑,无需代码即可上线。"
},
{
icon: "🔍",
title: "SEO 深度优化",
desc: "内置 TDK 配置、结构化数据、Sitemap 自动生成,助力搜索引擎收录与排名提升。"
},
{
icon: "🌐",
title: "多语言国际化",
desc: "支持中英文及多语言站点,自动切换,轻松拓展海外市场。"
},
{
icon: "📝",
title: "内容管理系统",
desc: "文章、案例、产品、团队等内容板块灵活配置,支持富文本与 Markdown。"
},
{
icon: "📊",
title: "访客数据分析",
desc: "集成 PV/UV 统计、来源分析与转化漏斗,量化营销效果。"
},
{
icon: "📱",
title: "全端响应式适配",
desc: "桌面、平板、手机全端适配,保证任意设备下的品牌一致性。"
},
{
icon: "🔗",
title: "自定义域名绑定",
desc: "支持绑定企业专属域名,一键配置 HTTPS品牌形象更专业。"
},
{
icon: "📬",
title: "在线表单与获客",
desc: "内置联系表单、询盘收集与线索管理,帮助企业高效跟进客户。"
}
];
const scenes = [
{ icon: "🏢", title: "企业品牌官网", desc: "展示公司实力、产品与团队,提升品牌信任度。" },
{ icon: "🛍️", title: "产品与服务展示", desc: "清晰呈现产品特性与优势,驱动在线询盘转化。" },
{ icon: "📣", title: "营销落地页", desc: "快速搭建活动、推广专题页,配合广告投放高效获客。" },
{ icon: "🌍", title: "跨境外贸官网", desc: "多语言站点支持,帮助企业开拓海外市场与客户。" }
];
const steps = [
{
title: "选择套餐",
desc: "按业务需求选择合适的套餐,支持随时升级。"
},
{
title: "完成支付",
desc: "支付成功后系统自动触发开通流程,无需人工干预。"
},
{
title: "即刻上线",
desc: "自动完成站点初始化与模板安装,登录管理后台开始运营。"
}
];
const plans = [
{
name: "基础版",
price: "¥399",
period: "/年",
recommend: false,
desc: "适合初创企业快速建站",
features: ["5 个内容页面", "3 套基础模板", "SSL + 自定义域名", "访客统计", "在线表单"]
},
{
name: "专业版",
price: "¥999",
period: "/年",
recommend: true,
desc: "适合品牌塑造与持续运营",
features: [
"不限页面数量",
"全部模板解锁",
"AI 一句话建站",
"SEO 深度优化",
"多语言支持",
"数据分析报表",
"插件市场加购",
"优先客服支持"
]
},
{
name: "私有化版",
price: "面议",
period: "",
recommend: false,
desc: "适合有私有化需求的企业",
features: [
"专业版全部功能",
"AI 建站全功能",
"源码交付",
"私有化部署",
"二次开发支持",
"专属售后服务",
"定制功能开发"
]
}
];
return (_ctx, _push, _parent, _attrs) => {
const _component_a_tag = resolveComponent("a-tag");
const _component_a_button = resolveComponent("a-button");
const _component_a_card = resolveComponent("a-card");
const _component_a_divider = resolveComponent("a-divider");
_push(`<div${ssrRenderAttrs(mergeProps({ class: "page" }, _attrs))} data-v-be0b0c41><section class="relative overflow-hidden bg-gradient-to-br from-gray-950 via-slate-900 to-blue-950 text-white" data-v-be0b0c41><div class="absolute inset-0 overflow-hidden" data-v-be0b0c41><div class="absolute -top-1/2 left-1/2 -translate-x-1/2 w-[800px] h-[400px] rounded-full bg-blue-500/20 blur-3xl" data-v-be0b0c41></div><div class="absolute -bottom-1/3 -right-1/4 w-[600px] h-[600px] rounded-full bg-indigo-500/15 blur-3xl" data-v-be0b0c41></div><div class="absolute inset-0 bg-[linear-gradient(rgba(255,255,255,0.02)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,0.02)_1px,transparent_1px)] bg-[size:60px_60px]" data-v-be0b0c41></div><div class="absolute top-16 left-20 w-2 h-2 rounded-full bg-white/40 animate-pulse" data-v-be0b0c41></div><div class="absolute top-40 right-32 w-3 h-3 rounded-full bg-blue-300/40 animate-pulse" style="${ssrRenderStyle({ "animation-delay": "0.5s" })}" data-v-be0b0c41></div><div class="absolute bottom-28 left-1/3 w-2 h-2 rounded-full bg-indigo-300/40 animate-pulse" style="${ssrRenderStyle({ "animation-delay": "1s" })}" data-v-be0b0c41></div><div class="absolute top-1/3 right-1/5 w-1.5 h-1.5 rounded-full bg-white/30 animate-pulse" style="${ssrRenderStyle({ "animation-delay": "1.5s" })}" data-v-be0b0c41></div></div><div class="relative mx-auto max-w-screen-xl px-4 py-20 md:py-28" data-v-be0b0c41><div class="grid items-center gap-10 md:grid-cols-2" data-v-be0b0c41><div data-v-be0b0c41><div class="mb-4 flex flex-wrap gap-2" data-v-be0b0c41>`);
_push(ssrRenderComponent(_component_a_tag, {
color: "blue",
class: "text-white border-white/30 bg-white/20"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`云官网`);
} else {
return [
createTextVNode("云官网")
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_a_tag, {
color: "cyan",
class: "text-white border-white/30 bg-white/15"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`AI 建站`);
} else {
return [
createTextVNode("AI 建站")
];
}
}),
_: 1
}, _parent));
_push(`</div><h1 class="mb-4 text-3xl font-bold md:text-5xl leading-tight" data-v-be0b0c41> 企业云官网<br data-v-be0b0c41><span class="text-blue-400" data-v-be0b0c41>品牌展示 · 获客转化</span></h1><p class="mb-6 text-lg text-gray-300" data-v-be0b0c41> 专为中小企业设计的 SaaS 官网系统支持多模板、多语言、SEO 优化与可视化内容管理;下单即开通,快速搭建品牌展示与在线获客阵地。 </p><div class="flex flex-wrap gap-3" data-v-be0b0c41>`);
_push(ssrRenderComponent(_component_a_button, {
type: "primary",
size: "large",
class: "bg-blue-500 border-blue-500 hover:bg-blue-400",
onClick: ($event) => go("https://site.websoft.top/register")
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`立即开通`);
} else {
return [
createTextVNode("立即开通")
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_a_button, {
ghost: "",
size: "large",
class: "border-white text-white hover:bg-white/10",
onClick: ($event) => ("navigateTo" in _ctx ? _ctx.navigateTo : unref(navigateTo))("/contact")
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`预约演示`);
} else {
return [
createTextVNode("预约演示")
];
}
}),
_: 1
}, _parent));
_push(`</div></div><div class="grid grid-cols-2 gap-4" data-v-be0b0c41><!--[-->`);
ssrRenderList(stats, (stat) => {
_push(`<div class="rounded-2xl border border-white/10 bg-white/5 p-5 backdrop-blur text-center hover:bg-white/10 transition-colors" data-v-be0b0c41><div class="text-3xl font-bold text-white mb-1" data-v-be0b0c41>${ssrInterpolate(stat.value)}</div><div class="text-sm text-gray-400" data-v-be0b0c41>${ssrInterpolate(stat.label)}</div>`);
if (stat.sub) {
_push(`<div class="text-xs text-blue-400 mt-1" data-v-be0b0c41>${ssrInterpolate(stat.sub)}</div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
});
_push(`<!--]--></div></div></div></section><section class="bg-gradient-to-r from-blue-600 via-indigo-600 to-violet-600 py-8" data-v-be0b0c41><div class="mx-auto max-w-screen-xl px-4" data-v-be0b0c41><div class="flex flex-wrap items-center justify-between gap-4" data-v-be0b0c41><div class="flex items-center gap-4" data-v-be0b0c41><span class="text-3xl" data-v-be0b0c41>✨</span><div class="text-white" data-v-be0b0c41><div class="font-bold text-lg" data-v-be0b0c41>AI 一句话生成官网</div><div class="text-white/80 text-sm" data-v-be0b0c41>描述您的业务AI 自动生成页面结构、文案与配色5 分钟搭建专业官网</div></div></div>`);
_push(ssrRenderComponent(_component_a_button, {
size: "large",
class: "bg-white text-blue-600 border-white font-semibold hover:bg-white/90",
onClick: ($event) => ("navigateTo" in _ctx ? _ctx.navigateTo : unref(navigateTo))("/ai-agent")
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(` 体验 AI 建站 `);
} else {
return [
createTextVNode(" 体验 AI 建站 ")
];
}
}),
_: 1
}, _parent));
_push(`</div></div></section><section class="py-16 md:py-24" data-v-be0b0c41><div class="mx-auto max-w-screen-xl px-4" data-v-be0b0c41><div class="mb-12 text-center" data-v-be0b0c41><h2 class="mb-3 text-2xl font-bold md:text-3xl" data-v-be0b0c41>核心功能</h2><p class="text-slate-500" data-v-be0b0c41>从品牌展示到线索获取,全链路覆盖</p></div><div class="grid gap-5 md:grid-cols-3" data-v-be0b0c41><!--[-->`);
ssrRenderList(features, (feat) => {
_push(`<div class="rounded-2xl border border-slate-100 bg-white p-6 shadow-sm hover:shadow-md transition-shadow hover:-translate-y-1 duration-200" data-v-be0b0c41><div class="flex items-start gap-4" data-v-be0b0c41><span class="text-3xl" data-v-be0b0c41>${ssrInterpolate(feat.icon)}</span><div data-v-be0b0c41><div class="font-semibold text-base mb-1" data-v-be0b0c41>${ssrInterpolate(feat.title)}</div><div class="text-slate-500 text-sm leading-relaxed" data-v-be0b0c41>${ssrInterpolate(feat.desc)}</div></div></div></div>`);
});
_push(`<!--]--></div></div></section><section class="bg-slate-50 py-16 md:py-20" data-v-be0b0c41><div class="mx-auto max-w-screen-xl px-4" data-v-be0b0c41><div class="mb-12 text-center" data-v-be0b0c41><h2 class="mb-3 text-2xl font-bold md:text-3xl" data-v-be0b0c41>适用场景</h2><p class="text-slate-500" data-v-be0b0c41>覆盖各类企业品牌展示与在线营销需求</p></div><div class="grid gap-6 md:grid-cols-4" data-v-be0b0c41><!--[-->`);
ssrRenderList(scenes, (scene) => {
_push(`<div class="rounded-xl bg-white p-6 text-center shadow-sm hover:shadow-md transition-shadow hover:-translate-y-1 duration-200 cursor-default" data-v-be0b0c41><div class="text-4xl mb-4" data-v-be0b0c41>${ssrInterpolate(scene.icon)}</div><div class="font-semibold mb-2" data-v-be0b0c41>${ssrInterpolate(scene.title)}</div><div class="text-slate-500 text-sm" data-v-be0b0c41>${ssrInterpolate(scene.desc)}</div></div>`);
});
_push(`<!--]--></div></div></section><section class="py-16 md:py-20" data-v-be0b0c41><div class="mx-auto max-w-screen-xl px-4" data-v-be0b0c41><div class="mb-12 text-center" data-v-be0b0c41><h2 class="mb-3 text-2xl font-bold md:text-3xl" data-v-be0b0c41>3 步完成开通</h2><p class="text-slate-500" data-v-be0b0c41>支付即开通,无需等待,极速上线</p></div><div class="grid gap-6 md:grid-cols-3" data-v-be0b0c41><!--[-->`);
ssrRenderList(steps, (step, i) => {
_push(`<div class="relative text-center" data-v-be0b0c41>`);
if (i < steps.length - 1) {
_push(`<div class="absolute top-7 left-[calc(50%+28px)] right-0 h-0.5 bg-gradient-to-r from-blue-300 to-transparent hidden md:block" data-v-be0b0c41></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-2xl bg-gradient-to-br from-blue-500 to-indigo-600 text-white text-xl font-bold shadow-lg" data-v-be0b0c41>${ssrInterpolate(i + 1)}</div><h4 class="mb-2 font-semibold" data-v-be0b0c41>${ssrInterpolate(step.title)}</h4><p class="text-sm text-slate-500" data-v-be0b0c41>${ssrInterpolate(step.desc)}</p></div>`);
});
_push(`<!--]--></div></div></section><section class="bg-slate-50 py-16 md:py-24" data-v-be0b0c41><div class="mx-auto max-w-screen-xl px-4" data-v-be0b0c41><div class="mb-12 text-center" data-v-be0b0c41><h2 class="mb-3 text-2xl font-bold md:text-3xl" data-v-be0b0c41>套餐选择</h2><p class="text-slate-500" data-v-be0b0c41>按需选择,支付即开通,随时升级</p></div><div class="grid gap-6 md:grid-cols-3" data-v-be0b0c41><!--[-->`);
ssrRenderList(plans, (plan) => {
_push(ssrRenderComponent(_component_a_card, {
key: plan.name,
class: ["h-full text-center", plan.recommend ? "border-2 border-blue-500 shadow-xl" : ""]
}, createSlots({
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="text-lg font-bold mb-1" data-v-be0b0c41${_scopeId}>${ssrInterpolate(plan.name)}</div><div class="text-3xl font-bold text-blue-600 my-3" data-v-be0b0c41${_scopeId}>${ssrInterpolate(plan.price)} <span class="text-sm text-slate-400 font-normal" data-v-be0b0c41${_scopeId}>${ssrInterpolate(plan.period)}</span></div><div class="text-slate-500 text-sm mb-4" data-v-be0b0c41${_scopeId}>${ssrInterpolate(plan.desc)}</div>`);
_push2(ssrRenderComponent(_component_a_divider, null, null, _parent2, _scopeId));
_push2(`<ul class="text-left text-sm space-y-2 mb-6" data-v-be0b0c41${_scopeId}><!--[-->`);
ssrRenderList(plan.features, (item) => {
_push2(`<li class="flex items-center gap-2" data-v-be0b0c41${_scopeId}><span class="text-green-500 font-bold" data-v-be0b0c41${_scopeId}>✓</span><span class="text-slate-600" data-v-be0b0c41${_scopeId}>${ssrInterpolate(item)}</span></li>`);
});
_push2(`<!--]--></ul>`);
_push2(ssrRenderComponent(_component_a_button, {
type: plan.recommend ? "primary" : "default",
block: "",
size: "large",
onClick: ($event) => go("https://site.websoft.top/register")
}, {
default: withCtx((_2, _push3, _parent3, _scopeId2) => {
if (_push3) {
_push3(` 立即开通 `);
} else {
return [
createTextVNode(" 立即开通 ")
];
}
}),
_: 2
}, _parent2, _scopeId));
} else {
return [
createVNode("div", { class: "text-lg font-bold mb-1" }, toDisplayString(plan.name), 1),
createVNode("div", { class: "text-3xl font-bold text-blue-600 my-3" }, [
createTextVNode(toDisplayString(plan.price) + " ", 1),
createVNode("span", { class: "text-sm text-slate-400 font-normal" }, toDisplayString(plan.period), 1)
]),
createVNode("div", { class: "text-slate-500 text-sm mb-4" }, toDisplayString(plan.desc), 1),
createVNode(_component_a_divider),
createVNode("ul", { class: "text-left text-sm space-y-2 mb-6" }, [
(openBlock(true), createBlock(Fragment, null, renderList(plan.features, (item) => {
return openBlock(), createBlock("li", {
key: item,
class: "flex items-center gap-2"
}, [
createVNode("span", { class: "text-green-500 font-bold" }, "✓"),
createVNode("span", { class: "text-slate-600" }, toDisplayString(item), 1)
]);
}), 128))
]),
createVNode(_component_a_button, {
type: plan.recommend ? "primary" : "default",
block: "",
size: "large",
onClick: ($event) => go("https://site.websoft.top/register")
}, {
default: withCtx(() => [
createTextVNode(" 立即开通 ")
]),
_: 1
}, 8, ["type", "onClick"])
];
}
}),
_: 2
}, [
plan.recommend ? {
name: "extra",
fn: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(ssrRenderComponent(_component_a_tag, { color: "blue" }, {
default: withCtx((_2, _push3, _parent3, _scopeId2) => {
if (_push3) {
_push3(`推荐`);
} else {
return [
createTextVNode("推荐")
];
}
}),
_: 2
}, _parent2, _scopeId));
} else {
return [
createVNode(_component_a_tag, { color: "blue" }, {
default: withCtx(() => [
createTextVNode("推荐")
]),
_: 1
})
];
}
}),
key: "0"
} : void 0
]), _parent));
});
_push(`<!--]--></div></div></section><section class="bg-gradient-to-r from-blue-600 to-indigo-700 py-16 text-white" data-v-be0b0c41><div class="mx-auto max-w-screen-xl px-4 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between" data-v-be0b0c41><div data-v-be0b0c41><div class="text-2xl font-bold mb-2" data-v-be0b0c41>立即搭建你的企业云官网</div><div class="text-blue-200" data-v-be0b0c41>下单支付即开通,数分钟完成部署与初始化</div></div><div class="flex gap-3" data-v-be0b0c41>`);
_push(ssrRenderComponent(_component_a_button, {
size: "large",
ghost: "",
onClick: ($event) => ("navigateTo" in _ctx ? _ctx.navigateTo : unref(navigateTo))("/contact")
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`预约演示`);
} else {
return [
createTextVNode("预约演示")
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_a_button, {
size: "large",
class: "bg-white text-blue-700 border-white hover:bg-white/90",
onClick: ($event) => go("https://site.websoft.top/register")
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(` 立即开通 `);
} else {
return [
createTextVNode(" 立即开通 ")
];
}
}),
_: 1
}, _parent));
_push(`</div></div></section></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/website.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const website = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-be0b0c41"]]);
export { website as default };
//# sourceMappingURL=website-Cj_wOCFL.mjs.map