feat: 初始化居家上门服务系统完整项目代码

- Spring Boot 后端服务 (hss-home-service)
- delivery-miniapp 配送小程序
- website 官网 (Nuxt)
- docs 架构设计文档
- Docker 容器化部署配置

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 09:04:49 +08:00
parent 46c7887a18
commit c02029a5f3
471 changed files with 42313 additions and 2 deletions

View File

@@ -0,0 +1,63 @@
import { defineComponent, computed, mergeProps, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderAttr } from "vue/server-renderer";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "AppIcon",
__ssrInlineRender: true,
props: {
name: {},
size: {}
},
setup(__props) {
const props = __props;
const icons = {
// 核心能力
clipboard: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4",
health: "M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z",
document: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z",
rocket: "M15.042 21.672L13.684 16.6m0 0l-2.51 2.225.569-9.47 5.227 7.917-3.286-.672zM12 2.25V4.5m5.834.166l-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243l-1.59-1.59",
check: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z",
eye: "M15 12a3 3 0 11-6 0 3 3 0 016 0z M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z",
star: "M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z",
money: "M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z",
// 场景
government: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
hospital: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M11 8h2v3h3v2h-3v3h-2v-3H8v-2h3V8z",
home: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6",
community: "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z",
shield: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z",
// 通用
phone: "M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z",
download: "M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z",
mail: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z",
chart: "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z",
user: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z",
lock: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z",
cog: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z",
globe: "M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z",
database: "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"
// 流程步骤
};
const pathData = computed(() => icons[props.name] || icons.clipboard);
return (_ctx, _push, _parent, _attrs) => {
_push(`<svg${ssrRenderAttrs(mergeProps({
class: __props.size || "w-6 h-6",
fill: "none",
stroke: "currentColor",
"stroke-width": "1.5",
"stroke-linecap": "round",
"stroke-linejoin": "round",
viewBox: "0 0 24 24"
}, _attrs))}><path${ssrRenderAttr("d", pathData.value)}></path></svg>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/AppIcon.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as _
};
//# sourceMappingURL=AppIcon--JRwwp2l.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,50 @@
import { a as _export_sfc, _ as __nuxt_component_0 } from "../server.mjs";
import { mergeProps, withCtx, createTextVNode, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderComponent } from "vue/server-renderer";
const _sfc_main = {};
function _sfc_ssrRender(_ctx, _push, _parent, _attrs) {
const _component_NuxtLink = __nuxt_component_0;
_push(`<section${ssrRenderAttrs(mergeProps({ class: "py-20 bg-gradient-to-r from-primary-700 to-primary-900 text-white" }, _attrs))}><div class="section-container text-center"><h2 class="text-3xl md:text-4xl font-bold mb-4">准备好提升居家服务管理效率了吗?</h2><p class="text-lg text-blue-100 mb-8 max-w-xl mx-auto">立即预约演示,了解平台如何帮助您的机构实现服务可监管、过程可追溯、质量可评价、费用可结算。</p><div class="flex flex-col sm:flex-row gap-4 justify-center">`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/contact",
class: "px-8 py-4 bg-cta text-white rounded-xl text-lg font-semibold hover:bg-cta-700 transition-colors shadow-lg shadow-cta/25"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(` 预约演示 `);
} else {
return [
createTextVNode(" 预约演示 ")
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/resources",
class: "px-8 py-4 bg-white/15 backdrop-blur text-white rounded-xl text-lg font-semibold hover:bg-white/25 transition-colors border border-white/20"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(` 获取方案 `);
} else {
return [
createTextVNode(" 获取方案 ")
];
}
}),
_: 1
}, _parent));
_push(`</div></div></section>`);
}
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/CtaSection.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const __nuxt_component_2 = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
export {
__nuxt_component_2 as _
};
//# sourceMappingURL=CtaSection-ClDHCKqS.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"CtaSection-ClDHCKqS.js","sources":["../../../../components/CtaSection.vue"],"sourcesContent":["<template>\n <section class=\"py-20 bg-gradient-to-r from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h2 class=\"text-3xl md:text-4xl font-bold mb-4\">准备好提升居家服务管理效率了吗?</h2>\n <p class=\"text-lg text-blue-100 mb-8 max-w-xl mx-auto\">立即预约演示,了解平台如何帮助您的机构实现服务可监管、过程可追溯、质量可评价、费用可结算。</p>\n <div class=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <NuxtLink to=\"/contact\"\n class=\"px-8 py-4 bg-cta text-white rounded-xl text-lg font-semibold hover:bg-cta-700 transition-colors shadow-lg shadow-cta/25\">\n 预约演示\n </NuxtLink>\n <NuxtLink to=\"/resources\"\n class=\"px-8 py-4 bg-white/15 backdrop-blur text-white rounded-xl text-lg font-semibold hover:bg-white/25 transition-colors border border-white/20\">\n 获取方案\n </NuxtLink>\n </div>\n </div>\n </section>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps","_push","_parent"],"mappings":";;;;;;AACW,QAAA,WAAAA,eAAAC,WAAA,EAAA,OAAM,uEAAmE,MAAA,CAAA,CAAA,uRAAA;;IAKlE,IAAG;AAAA,IACX,OAAM;AAAA;qBADR,CAGW,GAAAC,QAAAC,UAAA,aAAA;;;;;0BAFuH,QAElI;AAAA;;;;;;IACU,IAAG;AAAA,IACX,OAAM;AAAA;qBADR,CAGW,GAAAD,QAAAC,UAAA,aAAA;;;;;0BAF0I,QAErJ;AAAA;;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"CtaSection-ClDHCKqS.js","mappings":";;;;;;AACW,QAAA,WAAAA,eAAAC,WAAA,EAAA,OAAM,uEAAmE,MAAA,CAAA,CAAA,uRAAA;;IAKlE,IAAG;AAAA,IACX,OAAM;AAAA;qBADR,CAGW,GAAAC,QAAAC,UAAA,aAAA;;;;;0BAFuH,QAElI;AAAA;;;;;;IACU,IAAG;AAAA,IACX,OAAM;AAAA;qBADR,CAGW,GAAAD,QAAAC,UAAA,aAAA;;;;;0BAF0I,QAErJ;AAAA;;;;;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps","_push","_parent"],"sources":["../../../../components/CtaSection.vue"],"sourcesContent":["<template>\n <section class=\"py-20 bg-gradient-to-r from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h2 class=\"text-3xl md:text-4xl font-bold mb-4\">准备好提升居家服务管理效率了吗?</h2>\n <p class=\"text-lg text-blue-100 mb-8 max-w-xl mx-auto\">立即预约演示,了解平台如何帮助您的机构实现服务可监管、过程可追溯、质量可评价、费用可结算。</p>\n <div class=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <NuxtLink to=\"/contact\"\n class=\"px-8 py-4 bg-cta text-white rounded-xl text-lg font-semibold hover:bg-cta-700 transition-colors shadow-lg shadow-cta/25\">\n 预约演示\n </NuxtLink>\n <NuxtLink to=\"/resources\"\n class=\"px-8 py-4 bg-white/15 backdrop-blur text-white rounded-xl text-lg font-semibold hover:bg-white/25 transition-colors border border-white/20\">\n 获取方案\n </NuxtLink>\n </div>\n </div>\n </section>\n</template>\n"],"version":3}

View File

@@ -0,0 +1,35 @@
import { defineComponent, mergeProps, unref, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderAttr, ssrInterpolate, ssrIncludeBooleanAttr } from "vue/server-renderer";
import { u as useLeadForm } from "./useLeadForm-hNHTDEhY.js";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "DownloadForm",
__ssrInlineRender: true,
setup(__props) {
const { form, loading, success, error } = useLeadForm("download");
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "max-w-sm mx-auto" }, _attrs))}>`);
if (!unref(success)) {
_push(`<form class="space-y-4"><div><label class="block text-sm font-medium mb-1 text-left">姓名 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).name)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none" placeholder="您的姓名"></div><div><label class="block text-sm font-medium mb-1 text-left">单位名称 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).orgName)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none" placeholder="您所在的单位"></div><div><label class="block text-sm font-medium mb-1 text-left">手机号 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).phone)} type="tel" class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none" placeholder="您的手机号"></div>`);
if (unref(error)) {
_push(`<p class="text-red-500 text-sm">${ssrInterpolate(unref(error))}</p>`);
} else {
_push(`<!---->`);
}
_push(`<button type="submit"${ssrIncludeBooleanAttr(unref(loading)) ? " disabled" : ""} class="w-full px-6 py-3 bg-primary text-white rounded-xl font-semibold hover:bg-primary-700 transition-colors disabled:opacity-50">${ssrInterpolate(unref(loading) ? "提交中..." : "获取方案资料")}</button></form>`);
} else {
_push(`<div class="text-center py-8"><p class="text-xl font-bold mb-2">📥 资料已提交获取申请</p><p class="text-sm text-text-secondary">我们将尽快将方案资料发送给您。</p></div>`);
}
_push(`</div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/DownloadForm.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as _
};
//# sourceMappingURL=DownloadForm-DWoM9wYa.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DownloadForm-DWoM9wYa.js","sources":["../../../../components/DownloadForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useLeadForm } from '~/composables/useLeadForm'\nconst { form, loading, success, error, submit } = useLeadForm('download')\n</script>\n\n<template>\n <div class=\"max-w-sm mx-auto\">\n <form v-if=\"!success\" @submit.prevent=\"submit\" class=\"space-y-4\">\n <div>\n <label class=\"block text-sm font-medium mb-1 text-left\">姓名 <span class=\"text-red-500\">*</span></label>\n <input v-model=\"form.name\" class=\"w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none\" placeholder=\"您的姓名\" />\n </div>\n <div>\n <label class=\"block text-sm font-medium mb-1 text-left\">单位名称 <span class=\"text-red-500\">*</span></label>\n <input v-model=\"form.orgName\" class=\"w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none\" placeholder=\"您所在的单位\" />\n </div>\n <div>\n <label class=\"block text-sm font-medium mb-1 text-left\">手机号 <span class=\"text-red-500\">*</span></label>\n <input v-model=\"form.phone\" type=\"tel\" class=\"w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none\" placeholder=\"您的手机号\" />\n </div>\n <p v-if=\"error\" class=\"text-red-500 text-sm\">{{ error }}</p>\n <button type=\"submit\" :disabled=\"loading\"\n class=\"w-full px-6 py-3 bg-primary text-white rounded-xl font-semibold hover:bg-primary-700 transition-colors disabled:opacity-50\">\n {{ loading ? '提交中...' : '获取方案资料' }}\n </button>\n </form>\n <div v-else class=\"text-center py-8\">\n <p class=\"text-xl font-bold mb-2\">📥 资料已提交获取申请</p>\n <p class=\"text-sm text-text-secondary\">我们将尽快将方案资料发送给您。</p>\n </div>\n </div>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps","_unref","_ssrRenderAttr"],"mappings":";;;;;;;AAEA,UAAM,EAAE,MAAM,SAAS,SAAS,MAAc,IAAI,YAAY,UAAU;;AAIjE,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,sBAAkB,MAAA,CAAA,CAAA,GAAA;WACdC,MAAA,OAAA,GAAO;0JAGAC,cAAA,SAAAD,MAAA,IAAA,EAAK,IAAI,iRAITC,cAAA,SAAAD,MAAA,IAAA,EAAK,OAAO,kRAIZC,cAAA,SAAAD,MAAA,IAAA,EAAK,KAAK;YAEnBA,MAAA,KAAA,GAAK;kEAAkCA,MAAA,KAAA,CAAK,CAAA,MAAA;AAAA;;;4DACpBA,MAAA,OAAA,CAAO,IAAA,cAAA,wJAEnCA,MAAA,OAAA,IAAO,WAAA,QAAA;;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"DownloadForm-DWoM9wYa.js","mappings":";;;;;;;AAEA,UAAM,EAAE,MAAM,SAAS,SAAS,MAAc,IAAI,YAAY,UAAU;;AAIjE,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,sBAAkB,MAAA,CAAA,CAAA,GAAA;WACdC,MAAA,OAAA,GAAO;0JAGAC,cAAA,SAAAD,MAAA,IAAA,EAAK,IAAI,iRAITC,cAAA,SAAAD,MAAA,IAAA,EAAK,OAAO,kRAIZC,cAAA,SAAAD,MAAA,IAAA,EAAK,KAAK;YAEnBA,MAAA,KAAA,GAAK;kEAAkCA,MAAA,KAAA,CAAK,CAAA,MAAA;AAAA;;;4DACpBA,MAAA,OAAA,CAAO,IAAA,cAAA,wJAEnCA,MAAA,OAAA,IAAO,WAAA,QAAA;;;;;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps","_unref","_ssrRenderAttr"],"sources":["../../../../components/DownloadForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useLeadForm } from '~/composables/useLeadForm'\nconst { form, loading, success, error, submit } = useLeadForm('download')\n</script>\n\n<template>\n <div class=\"max-w-sm mx-auto\">\n <form v-if=\"!success\" @submit.prevent=\"submit\" class=\"space-y-4\">\n <div>\n <label class=\"block text-sm font-medium mb-1 text-left\">姓名 <span class=\"text-red-500\">*</span></label>\n <input v-model=\"form.name\" class=\"w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none\" placeholder=\"您的姓名\" />\n </div>\n <div>\n <label class=\"block text-sm font-medium mb-1 text-left\">单位名称 <span class=\"text-red-500\">*</span></label>\n <input v-model=\"form.orgName\" class=\"w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none\" placeholder=\"您所在的单位\" />\n </div>\n <div>\n <label class=\"block text-sm font-medium mb-1 text-left\">手机号 <span class=\"text-red-500\">*</span></label>\n <input v-model=\"form.phone\" type=\"tel\" class=\"w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none\" placeholder=\"您的手机号\" />\n </div>\n <p v-if=\"error\" class=\"text-red-500 text-sm\">{{ error }}</p>\n <button type=\"submit\" :disabled=\"loading\"\n class=\"w-full px-6 py-3 bg-primary text-white rounded-xl font-semibold hover:bg-primary-700 transition-colors disabled:opacity-50\">\n {{ loading ? '提交中...' : '获取方案资料' }}\n </button>\n </form>\n <div v-else class=\"text-center py-8\">\n <p class=\"text-xl font-bold mb-2\">📥 资料已提交获取申请</p>\n <p class=\"text-sm text-text-secondary\">我们将尽快将方案资料发送给您。</p>\n </div>\n </div>\n</template>\n"],"version":3}

View File

@@ -0,0 +1,25 @@
import { defineComponent, mergeProps, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrInterpolate } from "vue/server-renderer";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "PainPointCard",
__ssrInlineRender: true,
props: {
title: {},
desc: {}
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-white rounded-2xl p-8 shadow-sm border border-gray-100" }, _attrs))}><h3 class="font-bold text-xl mb-3 text-red-500">${ssrInterpolate(__props.title)}</h3><p class="text-text-secondary leading-relaxed">${ssrInterpolate(__props.desc)}</p></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/PainPointCard.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as _
};
//# sourceMappingURL=PainPointCard-Lm1N0rdZ.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"PainPointCard-Lm1N0rdZ.js","sources":["../../../../components/PainPointCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ title: string; desc: string }>()\n</script>\n\n<template>\n <div class=\"bg-white rounded-2xl p-8 shadow-sm border border-gray-100\">\n <h3 class=\"font-bold text-xl mb-3 text-red-500\">{{ title }}</h3>\n <p class=\"text-text-secondary leading-relaxed\">{{ desc }}</p>\n </div>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps"],"mappings":";;;;;;;;;;;mBAKOA,eAAAC,WAAA,EAAA,OAAM,+DAA2D,MAAA,CAAA,oEACjB,QAAA,KAAK,uEACN,QAAA,IAAI;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"PainPointCard-Lm1N0rdZ.js","mappings":";;;;;;;;;;;mBAKOA,eAAAC,WAAA,EAAA,OAAM,+DAA2D,MAAA,CAAA,oEACjB,QAAA,KAAK,uEACN,QAAA,IAAI;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps"],"sources":["../../../../components/PainPointCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ title: string; desc: string }>()\n</script>\n\n<template>\n <div class=\"bg-white rounded-2xl p-8 shadow-sm border border-gray-100\">\n <h3 class=\"font-bold text-xl mb-3 text-red-500\">{{ title }}</h3>\n <p class=\"text-text-secondary leading-relaxed\">{{ desc }}</p>\n </div>\n</template>\n"],"version":3}

View File

@@ -0,0 +1,33 @@
import { _ as _sfc_main$1 } from "./AppIcon--JRwwp2l.js";
import { defineComponent, mergeProps, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderComponent, ssrInterpolate } from "vue/server-renderer";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "ScenarioCard",
__ssrInlineRender: true,
props: {
icon: {},
title: {},
desc: {}
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
const _component_AppIcon = _sfc_main$1;
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-surface rounded-2xl p-8 hover:shadow-md transition-all duration-300 border border-gray-100 group" }, _attrs))}><div class="w-14 h-14 rounded-2xl bg-gradient-to-br from-primary-50 to-accent-50 text-primary flex items-center justify-center mb-5 group-hover:from-primary group-hover:to-accent group-hover:text-white transition-all">`);
_push(ssrRenderComponent(_component_AppIcon, {
name: __props.icon,
class: "w-7 h-7"
}, null, _parent));
_push(`</div><h3 class="font-bold text-xl mb-3">${ssrInterpolate(__props.title)}</h3><p class="text-sm text-text-secondary leading-relaxed mb-4">${ssrInterpolate(__props.desc)}</p><span class="text-primary font-medium text-sm hover:underline cursor-pointer inline-flex items-center gap-1"> 了解更多 <svg class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M9 5l7 7-7 7" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/ScenarioCard.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as _
};
//# sourceMappingURL=ScenarioCard-KNU_bnPj.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ScenarioCard-KNU_bnPj.js","sources":["../../../../components/ScenarioCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ icon: string; title: string; desc: string }>()\n</script>\n\n<template>\n <div class=\"bg-surface rounded-2xl p-8 hover:shadow-md transition-all duration-300 border border-gray-100 group\">\n <div class=\"w-14 h-14 rounded-2xl bg-gradient-to-br from-primary-50 to-accent-50 text-primary flex items-center justify-center mb-5 group-hover:from-primary group-hover:to-accent group-hover:text-white transition-all\">\n <AppIcon :name=\"icon\" class=\"w-7 h-7\" />\n </div>\n <h3 class=\"font-bold text-xl mb-3\">{{ title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed mb-4\">{{ desc }}</p>\n <span class=\"text-primary font-medium text-sm hover:underline cursor-pointer inline-flex items-center gap-1\">\n 了解更多\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M9 5l7 7-7 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </div>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps"],"mappings":";;;;;;;;;;;;;;AAKO,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,yGAAqG,MAAA,CAAA,CAAA,6NAAA;;QAElG,MAAM,QAAA;AAAA,QAAM,OAAM;AAAA,MAAA;uEAEQ,QAAA,KAAK,oFACoB,QAAA,IAAI;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"ScenarioCard-KNU_bnPj.js","mappings":";;;;;;;;;;;;;;AAKO,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,yGAAqG,MAAA,CAAA,CAAA,6NAAA;;QAElG,MAAM,QAAA;AAAA,QAAM,OAAM;AAAA,MAAA;uEAEQ,QAAA,KAAK,oFACoB,QAAA,IAAI;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps"],"sources":["../../../../components/ScenarioCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ icon: string; title: string; desc: string }>()\n</script>\n\n<template>\n <div class=\"bg-surface rounded-2xl p-8 hover:shadow-md transition-all duration-300 border border-gray-100 group\">\n <div class=\"w-14 h-14 rounded-2xl bg-gradient-to-br from-primary-50 to-accent-50 text-primary flex items-center justify-center mb-5 group-hover:from-primary group-hover:to-accent group-hover:text-white transition-all\">\n <AppIcon :name=\"icon\" class=\"w-7 h-7\" />\n </div>\n <h3 class=\"font-bold text-xl mb-3\">{{ title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed mb-4\">{{ desc }}</p>\n <span class=\"text-primary font-medium text-sm hover:underline cursor-pointer inline-flex items-center gap-1\">\n 了解更多\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M9 5l7 7-7 7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </span>\n </div>\n</template>\n"],"version":3}

View File

@@ -0,0 +1,26 @@
import { defineComponent, mergeProps, unref, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderList, ssrInterpolate } from "vue/server-renderer";
import { b as securityItems } from "../server.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "SecurityGrid",
__ssrInlineRender: true,
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "grid md:grid-cols-2 lg:grid-cols-3 gap-6" }, _attrs))}><!--[-->`);
ssrRenderList(unref(securityItems), (s) => {
_push(`<div class="bg-surface rounded-2xl p-8 border border-gray-100 hover:shadow-md transition-all duration-300"><div class="w-10 h-10 rounded-lg bg-primary-50 flex items-center justify-center mb-4"><svg class="w-5 h-5 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg></div><h3 class="font-bold text-lg mb-2">${ssrInterpolate(s.title)}</h3><p class="text-sm text-text-secondary leading-relaxed">${ssrInterpolate(s.desc)}</p></div>`);
});
_push(`<!--]--></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/SecurityGrid.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as _
};
//# sourceMappingURL=SecurityGrid-LoMlH504.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"SecurityGrid-LoMlH504.js","sources":["../../../../components/SecurityGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { securityItems } from '~/data/siteContent'\n</script>\n\n<template>\n <div class=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6\">\n <div v-for=\"s in securityItems\" :key=\"s.title\"\n class=\"bg-surface rounded-2xl p-8 border border-gray-100 hover:shadow-md transition-all duration-300\">\n <div class=\"w-10 h-10 rounded-lg bg-primary-50 flex items-center justify-center mb-4\">\n <svg class=\"w-5 h-5 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n </svg>\n </div>\n <h3 class=\"font-bold text-lg mb-2\">{{ s.title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed\">{{ s.desc }}</p>\n </div>\n </div>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps","_ssrRenderList","_unref","_ssrInterpolate"],"mappings":";;;;;;;;AAKO,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,8CAA0C,MAAA,CAAA,CAAA,WAAA;AAClCC,oBAAAC,MAAA,aAAA,IAAL,MAAC;ymBAQ2BC,eAAA,EAAE,KAAK,gEACaA,eAAA,EAAE,IAAI;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"SecurityGrid-LoMlH504.js","mappings":";;;;;;;;AAKO,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,8CAA0C,MAAA,CAAA,CAAA,WAAA;AAClCC,oBAAAC,MAAA,aAAA,IAAL,MAAC;ymBAQ2BC,eAAA,EAAE,KAAK,gEACaA,eAAA,EAAE,IAAI;;;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps","_ssrRenderList","_unref","_ssrInterpolate"],"sources":["../../../../components/SecurityGrid.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { securityItems } from '~/data/siteContent'\n</script>\n\n<template>\n <div class=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6\">\n <div v-for=\"s in securityItems\" :key=\"s.title\"\n class=\"bg-surface rounded-2xl p-8 border border-gray-100 hover:shadow-md transition-all duration-300\">\n <div class=\"w-10 h-10 rounded-lg bg-primary-50 flex items-center justify-center mb-4\">\n <svg class=\"w-5 h-5 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n </svg>\n </div>\n <h3 class=\"font-bold text-lg mb-2\">{{ s.title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed\">{{ s.desc }}</p>\n </div>\n </div>\n</template>\n"],"version":3}

View File

@@ -0,0 +1,65 @@
import { ref, defineComponent, mergeProps, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderList, ssrInterpolate } from "vue/server-renderer";
import { a as _export_sfc } from "../server.mjs";
function useScrollAnim(options = {}) {
const { delay = 0, threshold = 0.15 } = options;
const isVisible = ref(false);
let observer = null;
function observe(el, overrides = {}) {
const d = overrides.delay ?? delay;
const cls = overrides.class ?? "flow-visible";
observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
setTimeout(() => {
entry.target.classList.add(cls);
}, d);
observer?.unobserve(entry.target);
}
});
},
{ threshold }
);
observer.observe(el);
}
function unobserveAll() {
observer?.disconnect();
}
return { isVisible, observe, unobserve: unobserveAll };
}
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "ServiceLoopFlow",
__ssrInlineRender: true,
setup(__props) {
const steps = [
{ num: "01", title: "需求受理", desc: "多渠道统一接入\n自动校验与审核" },
{ num: "02", title: "能力评估", desc: "上门评估定级\nGPS签到+拍照" },
{ num: "03", title: "方案制定", desc: "个性化服务方案\n费用透明计算" },
{ num: "04", title: "智能派单", desc: "算法匹配推荐\n人工确认兜底" },
{ num: "05", title: "上门执行", desc: "GPS签到校验\n项目级执行记录" },
{ num: "06", title: "过程监管", desc: "抽查违规整改\n审计日志追溯" },
{ num: "07", title: "验收评价", desc: "星级+标签评价\n评分影响后续派单" },
{ num: "08", title: "结算归档", desc: "自动汇总结算\n电子台账归档" }
];
useScrollAnim();
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "relative" }, _attrs))} data-v-f6f421ef><div class="hidden lg:block absolute top-1/2 left-[5%] right-[5%] h-0.5 bg-gray-200 -translate-y-1/2 z-0" data-v-f6f421ef></div><div class="grid grid-cols-2 lg:grid-cols-4 gap-4 md:gap-6 relative z-10" data-v-f6f421ef><!--[-->`);
ssrRenderList(steps, (s, i) => {
_push(`<div class="flow-step bg-white rounded-2xl p-5 md:p-6 text-center shadow-sm opacity-0 translate-y-8 transition-all duration-500 hover:shadow-lg group" data-v-f6f421ef><span class="w-12 h-12 mx-auto mb-4 rounded-full bg-gradient-to-br from-primary-50 to-accent-50 text-primary font-bold text-sm flex items-center justify-center group-hover:from-primary group-hover:to-accent group-hover:text-white transition-all" data-v-f6f421ef>${ssrInterpolate(s.num)}</span><h4 class="font-bold text-sm mb-1" data-v-f6f421ef>${ssrInterpolate(s.title)}</h4><p class="text-xs text-text-secondary whitespace-pre-line leading-relaxed" data-v-f6f421ef>${ssrInterpolate(s.desc)}</p></div>`);
});
_push(`<!--]--></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/ServiceLoopFlow.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const __nuxt_component_0 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f6f421ef"]]);
export {
__nuxt_component_0 as _
};
//# sourceMappingURL=ServiceLoopFlow-BcBowZhS.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ServiceLoopFlow-BcBowZhS.js","sources":["../../../../composables/useScrollAnim.ts","../../../../components/ServiceLoopFlow.vue"],"sourcesContent":["import { ref, onMounted, onBeforeUnmount } from 'vue'\n\ninterface ScrollAnimOptions {\n delay?: number\n class?: string\n threshold?: number\n}\n\nexport function useScrollAnim(options: ScrollAnimOptions = {}) {\n const { delay = 0, threshold = 0.15 } = options\n const isVisible = ref(false)\n let observer: IntersectionObserver | null = null\n\n function observe(el: Element, overrides: ScrollAnimOptions = {}) {\n const d = overrides.delay ?? delay\n const cls = overrides.class ?? 'flow-visible'\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setTimeout(() => {\n entry.target.classList.add(cls)\n }, d)\n observer?.unobserve(entry.target)\n }\n })\n },\n { threshold }\n )\n observer.observe(el)\n }\n\n function unobserveAll() {\n observer?.disconnect()\n }\n\n onBeforeUnmount(() => unobserveAll())\n\n return { isVisible, observe, unobserve: unobserveAll }\n}\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useScrollAnim } from '~/composables/useScrollAnim'\n\nconst steps = [\n { num: '01', title: '需求受理', desc: '多渠道统一接入\\n自动校验与审核' },\n { num: '02', title: '能力评估', desc: '上门评估定级\\nGPS签到+拍照' },\n { num: '03', title: '方案制定', desc: '个性化服务方案\\n费用透明计算' },\n { num: '04', title: '智能派单', desc: '算法匹配推荐\\n人工确认兜底' },\n { num: '05', title: '上门执行', desc: 'GPS签到校验\\n项目级执行记录' },\n { num: '06', title: '过程监管', desc: '抽查违规整改\\n审计日志追溯' },\n { num: '07', title: '验收评价', desc: '星级+标签评价\\n评分影响后续派单' },\n { num: '08', title: '结算归档', desc: '自动汇总结算\\n电子台账归档' },\n]\n\nconst { observe } = useScrollAnim()\nonMounted(() => {\n document.querySelectorAll('.flow-step').forEach((el, i) => {\n observe(el, { delay: i * 100, class: 'flow-visible' })\n })\n})\n</script>\n\n<template>\n <div class=\"relative\">\n <div class=\"hidden lg:block absolute top-1/2 left-[5%] right-[5%] h-0.5 bg-gray-200 -translate-y-1/2 z-0\" />\n <div class=\"grid grid-cols-2 lg:grid-cols-4 gap-4 md:gap-6 relative z-10\">\n <div v-for=\"(s, i) in steps\" :key=\"i\"\n class=\"flow-step bg-white rounded-2xl p-5 md:p-6 text-center shadow-sm opacity-0 translate-y-8 transition-all duration-500 hover:shadow-lg group\">\n <span class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gradient-to-br from-primary-50 to-accent-50 text-primary font-bold text-sm flex items-center justify-center group-hover:from-primary group-hover:to-accent group-hover:text-white transition-all\">\n {{ s.num }}\n </span>\n <h4 class=\"font-bold text-sm mb-1\">{{ s.title }}</h4>\n <p class=\"text-xs text-text-secondary whitespace-pre-line leading-relaxed\">{{ s.desc }}</p>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.flow-visible { opacity: 1; transform: translateY(0); }\n</style>\n"],"names":["_ssrRenderAttrs","_mergeProps","_ssrInterpolate"],"mappings":";;;AAQO,SAAS,cAAc,UAA6B,IAAI;AAC7D,QAAM,EAAE,QAAQ,GAAG,YAAY,SAAS;AACxC,QAAM,YAAY,IAAI,KAAK;AAC3B,MAAI,WAAwC;AAE5C,WAAS,QAAQ,IAAa,YAA+B,IAAI;AAC/D,UAAM,IAAI,UAAU,SAAS;AAC7B,UAAM,MAAM,UAAU,SAAS;AAC/B,eAAW,IAAI;AAAA,MACb,CAAC,YAAY;AACX,gBAAQ,QAAQ,CAAC,UAAU;AACzB,cAAI,MAAM,gBAAgB;AACxB,uBAAW,MAAM;AACf,oBAAM,OAAO,UAAU,IAAI,GAAG;AAAA,YAChC,GAAG,CAAC;AACJ,sBAAU,UAAU,MAAM,MAAM;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,EAAE,UAAA;AAAA,IAAU;AAEd,aAAS,QAAQ,EAAE;AAAA,EACrB;AAEA,WAAS,eAAe;AACtB,cAAU,WAAA;AAAA,EACZ;AAIA,SAAO,EAAE,WAAW,SAAS,WAAW,aAAA;AAC1C;;;;;ACnCA,UAAM,QAAQ;AAAA,MACZ,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,mBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,mBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,kBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,iBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,mBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,iBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,oBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,iBAAA;AAAA,IAAiB;AAGjC,kBAAA;;AASb,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,cAAU,MAAA,CAAA,CAAA,qPAAA;oBAGK,OAAK,CAAd,GAAG,MAAC;8bAGVC,eAAA,EAAE,GAAG,8DAE4BA,eAAA,EAAE,KAAK,oGACiCA,eAAA,EAAE,IAAI;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"ServiceLoopFlow-BcBowZhS.js","mappings":";;;AAQO,SAAS,cAAc,UAA6B,IAAI;AAC7D,QAAM,EAAE,QAAQ,GAAG,YAAY,SAAS;AACxC,QAAM,YAAY,IAAI,KAAK;AAC3B,MAAI,WAAwC;AAE5C,WAAS,QAAQ,IAAa,YAA+B,IAAI;AAC/D,UAAM,IAAI,UAAU,SAAS;AAC7B,UAAM,MAAM,UAAU,SAAS;AAC/B,eAAW,IAAI;AAAA,MACb,CAAC,YAAY;AACX,gBAAQ,QAAQ,CAAC,UAAU;AACzB,cAAI,MAAM,gBAAgB;AACxB,uBAAW,MAAM;AACf,oBAAM,OAAO,UAAU,IAAI,GAAG;AAAA,YAChC,GAAG,CAAC;AACJ,sBAAU,UAAU,MAAM,MAAM;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,EAAE,UAAA;AAAA,IAAU;AAEd,aAAS,QAAQ,EAAE;AAAA,EACrB;AAEA,WAAS,eAAe;AACtB,cAAU,WAAA;AAAA,EACZ;AAIA,SAAO,EAAE,WAAW,SAAS,WAAW,aAAA;AAC1C;;;;;ACnCA,UAAM,QAAQ;AAAA,MACZ,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,mBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,mBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,kBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,iBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,mBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,iBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,oBAAA;AAAA,MAClC,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,iBAAA;AAAA,IAAiB;AAGjC,kBAAA;;AASb,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,cAAU,MAAA,CAAA,CAAA,qPAAA;oBAGK,OAAK,CAAd,GAAG,MAAC;8bAGVC,eAAA,EAAE,GAAG,8DAE4BA,eAAA,EAAE,KAAK,oGACiCA,eAAA,EAAE,IAAI;;;;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps","_ssrInterpolate"],"sources":["../../../../composables/useScrollAnim.ts","../../../../components/ServiceLoopFlow.vue"],"sourcesContent":["import { ref, onMounted, onBeforeUnmount } from 'vue'\n\ninterface ScrollAnimOptions {\n delay?: number\n class?: string\n threshold?: number\n}\n\nexport function useScrollAnim(options: ScrollAnimOptions = {}) {\n const { delay = 0, threshold = 0.15 } = options\n const isVisible = ref(false)\n let observer: IntersectionObserver | null = null\n\n function observe(el: Element, overrides: ScrollAnimOptions = {}) {\n const d = overrides.delay ?? delay\n const cls = overrides.class ?? 'flow-visible'\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setTimeout(() => {\n entry.target.classList.add(cls)\n }, d)\n observer?.unobserve(entry.target)\n }\n })\n },\n { threshold }\n )\n observer.observe(el)\n }\n\n function unobserveAll() {\n observer?.disconnect()\n }\n\n onBeforeUnmount(() => unobserveAll())\n\n return { isVisible, observe, unobserve: unobserveAll }\n}\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useScrollAnim } from '~/composables/useScrollAnim'\n\nconst steps = [\n { num: '01', title: '需求受理', desc: '多渠道统一接入\\n自动校验与审核' },\n { num: '02', title: '能力评估', desc: '上门评估定级\\nGPS签到+拍照' },\n { num: '03', title: '方案制定', desc: '个性化服务方案\\n费用透明计算' },\n { num: '04', title: '智能派单', desc: '算法匹配推荐\\n人工确认兜底' },\n { num: '05', title: '上门执行', desc: 'GPS签到校验\\n项目级执行记录' },\n { num: '06', title: '过程监管', desc: '抽查违规整改\\n审计日志追溯' },\n { num: '07', title: '验收评价', desc: '星级+标签评价\\n评分影响后续派单' },\n { num: '08', title: '结算归档', desc: '自动汇总结算\\n电子台账归档' },\n]\n\nconst { observe } = useScrollAnim()\nonMounted(() => {\n document.querySelectorAll('.flow-step').forEach((el, i) => {\n observe(el, { delay: i * 100, class: 'flow-visible' })\n })\n})\n</script>\n\n<template>\n <div class=\"relative\">\n <div class=\"hidden lg:block absolute top-1/2 left-[5%] right-[5%] h-0.5 bg-gray-200 -translate-y-1/2 z-0\" />\n <div class=\"grid grid-cols-2 lg:grid-cols-4 gap-4 md:gap-6 relative z-10\">\n <div v-for=\"(s, i) in steps\" :key=\"i\"\n class=\"flow-step bg-white rounded-2xl p-5 md:p-6 text-center shadow-sm opacity-0 translate-y-8 transition-all duration-500 hover:shadow-lg group\">\n <span class=\"w-12 h-12 mx-auto mb-4 rounded-full bg-gradient-to-br from-primary-50 to-accent-50 text-primary font-bold text-sm flex items-center justify-center group-hover:from-primary group-hover:to-accent group-hover:text-white transition-all\">\n {{ s.num }}\n </span>\n <h4 class=\"font-bold text-sm mb-1\">{{ s.title }}</h4>\n <p class=\"text-xs text-text-secondary whitespace-pre-line leading-relaxed\">{{ s.desc }}</p>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.flow-visible { opacity: 1; transform: translateY(0); }\n</style>\n"],"version":3}

View File

@@ -0,0 +1,5 @@
const ServiceLoopFlow_vue_vue_type_style_index_0_scoped_f6f421ef_lang = ".flow-visible[data-v-f6f421ef]{opacity:1;transform:translateY(0)}";
export {
ServiceLoopFlow_vue_vue_type_style_index_0_scoped_f6f421ef_lang as default
};
//# sourceMappingURL=ServiceLoopFlow-styles-1.mjs-DvFCHxjj.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ServiceLoopFlow-styles-1.mjs-DvFCHxjj.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}

View File

@@ -0,0 +1 @@
{"file":"ServiceLoopFlow-styles-1.mjs-DvFCHxjj.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}

View File

@@ -0,0 +1,4 @@
import style_0 from "./ServiceLoopFlow-styles-1.mjs-DvFCHxjj.js";
export default [
style_0
]

View File

@@ -0,0 +1,58 @@
import { _ as _sfc_main$2 } from "./AppIcon--JRwwp2l.js";
import { defineComponent, mergeProps, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderComponent, ssrInterpolate, ssrRenderList, ssrRenderClass, ssrRenderAttr } from "vue/server-renderer";
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "CapabilityCard",
__ssrInlineRender: true,
props: {
icon: {},
title: {},
desc: {}
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
const _component_AppIcon = _sfc_main$2;
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-white rounded-2xl p-6 shadow-sm hover:shadow-md hover:-translate-y-1 transition-all duration-300 border border-gray-50 group" }, _attrs))}><div class="w-12 h-12 rounded-xl bg-primary-50 text-primary flex items-center justify-center mb-4 group-hover:bg-primary group-hover:text-white transition-colors">`);
_push(ssrRenderComponent(_component_AppIcon, {
name: __props.icon,
class: "w-6 h-6"
}, null, _parent));
_push(`</div><h3 class="font-bold text-lg mb-2">${ssrInterpolate(__props.title)}</h3><p class="text-sm text-text-secondary leading-relaxed">${ssrInterpolate(__props.desc)}</p></div>`);
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/CapabilityCard.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "TriEndDisplay",
__ssrInlineRender: true,
setup(__props) {
const ends = [
{ title: "服务对象/家属端", desc: "申请服务、查看方案、签署确认、验收评价、支付结算", color: "border-primary", bg: "bg-primary-50", img: "people" },
{ title: "服务人员 Delivery 端", desc: "接单确认、GPS签到、项目级执行、异常上报、证据上传", color: "border-accent", bg: "bg-accent-50", img: "technology" },
{ title: "机构管理/监管端", desc: "受理派单、调度台、数据看板、质量监管、结算审核、合规审计", color: "border-cta", bg: "bg-orange-50", img: "office" }
];
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "grid md:grid-cols-3 gap-8" }, _attrs))}><!--[-->`);
ssrRenderList(ends, (e, i) => {
_push(`<div class="${ssrRenderClass([[e.color, e.bg], "rounded-2xl border-2 p-8 text-center transition-all duration-300 hover:shadow-lg"])}"><img${ssrRenderAttr("src", `https://loremflickr.com/240/160/${e.img}`)}${ssrRenderAttr("alt", e.title + "(示意素材,待替换)")} class="w-full h-40 object-cover rounded-xl mb-6" width="240" height="160" loading="lazy"><h3 class="font-bold text-xl mb-3">${ssrInterpolate(e.title)}</h3><p class="text-sm text-text-secondary leading-relaxed">${ssrInterpolate(e.desc)}</p></div>`);
});
_push(`<!--]--></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/TriEndDisplay.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main$1 as _,
_sfc_main as a
};
//# sourceMappingURL=TriEndDisplay-B5fVYJfo.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"TriEndDisplay-B5fVYJfo.js","sources":["../../../../components/CapabilityCard.vue","../../../../components/TriEndDisplay.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ icon: string; title: string; desc: string }>()\n</script>\n\n<template>\n <div class=\"bg-white rounded-2xl p-6 shadow-sm hover:shadow-md hover:-translate-y-1 transition-all duration-300 border border-gray-50 group\">\n <div class=\"w-12 h-12 rounded-xl bg-primary-50 text-primary flex items-center justify-center mb-4 group-hover:bg-primary group-hover:text-white transition-colors\">\n <AppIcon :name=\"icon\" class=\"w-6 h-6\" />\n </div>\n <h3 class=\"font-bold text-lg mb-2\">{{ title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed\">{{ desc }}</p>\n </div>\n</template>\n","<script setup lang=\"ts\">\nconst ends = [\n { title: '服务对象/家属端', desc: '申请服务、查看方案、签署确认、验收评价、支付结算', color: 'border-primary', bg: 'bg-primary-50', img: 'people' },\n { title: '服务人员 Delivery 端', desc: '接单确认、GPS签到、项目级执行、异常上报、证据上传', color: 'border-accent', bg: 'bg-accent-50', img: 'technology' },\n { title: '机构管理/监管端', desc: '受理派单、调度台、数据看板、质量监管、结算审核、合规审计', color: 'border-cta', bg: 'bg-orange-50', img: 'office' },\n]\n</script>\n\n<template>\n <div class=\"grid md:grid-cols-3 gap-8\">\n <div v-for=\"(e, i) in ends\" :key=\"i\"\n class=\"rounded-2xl border-2 p-8 text-center transition-all duration-300 hover:shadow-lg\"\n :class=\"[e.color, e.bg]\">\n <img :src=\"`https://loremflickr.com/240/160/${e.img}`\"\n :alt=\"e.title + '(示意素材,待替换)'\" class=\"w-full h-40 object-cover rounded-xl mb-6\" width=\"240\" height=\"160\" loading=\"lazy\" />\n <h3 class=\"font-bold text-xl mb-3\">{{ e.title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed\">{{ e.desc }}</p>\n </div>\n </div>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps","_ssrRenderClass","_ssrInterpolate"],"mappings":";;;;;;;;;;;;;;AAKO,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,qIAAiI,MAAA,CAAA,CAAA,sKAAA;;QAE9H,MAAM,QAAA;AAAA,QAAM,OAAM;AAAA,MAAA;uEAEQ,QAAA,KAAK,+EACe,QAAA,IAAI;;;;;;;;;;;;;;ACTlE,UAAM,OAAO;AAAA,MACX,EAAE,OAAO,YAAY,MAAM,4BAA4B,OAAO,kBAAkB,IAAI,iBAAiB,KAAK,SAAA;AAAA,MAC1G,EAAE,OAAO,mBAAmB,MAAM,8BAA8B,OAAO,iBAAiB,IAAI,gBAAgB,KAAK,aAAA;AAAA,MACjH,EAAE,OAAO,YAAY,MAAM,gCAAgC,OAAO,cAAc,IAAI,gBAAgB,KAAK,SAAA;AAAA,IAAS;;AAK7G,YAAA,OAAAD,eAAAC,WAAA,EAAA,OAAM,+BAA2B,MAAA,CAAA,CAAA,WAAA;oBACd,MAAI,CAAb,GAAG,MAAC;6BAENC,eAAA,CAAA,CAAA,EAAE,OAAO,EAAE,EAAE,GAAA,kFAAA,CAAA,wBAChB,OAAG,mCAAqC,EAAE,GAAG,EAAA,kBAChD,OAAK,EAAE,QAAK,YAAA,iIACuBC,eAAA,EAAE,KAAK,gEACaA,eAAA,EAAE,IAAI;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"TriEndDisplay-B5fVYJfo.js","mappings":";;;;;;;;;;;;;;AAKO,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,qIAAiI,MAAA,CAAA,CAAA,sKAAA;;QAE9H,MAAM,QAAA;AAAA,QAAM,OAAM;AAAA,MAAA;uEAEQ,QAAA,KAAK,+EACe,QAAA,IAAI;;;;;;;;;;;;;;ACTlE,UAAM,OAAO;AAAA,MACX,EAAE,OAAO,YAAY,MAAM,4BAA4B,OAAO,kBAAkB,IAAI,iBAAiB,KAAK,SAAA;AAAA,MAC1G,EAAE,OAAO,mBAAmB,MAAM,8BAA8B,OAAO,iBAAiB,IAAI,gBAAgB,KAAK,aAAA;AAAA,MACjH,EAAE,OAAO,YAAY,MAAM,gCAAgC,OAAO,cAAc,IAAI,gBAAgB,KAAK,SAAA;AAAA,IAAS;;AAK7G,YAAA,OAAAD,eAAAC,WAAA,EAAA,OAAM,+BAA2B,MAAA,CAAA,CAAA,WAAA;oBACd,MAAI,CAAb,GAAG,MAAC;6BAENC,eAAA,CAAA,CAAA,EAAE,OAAO,EAAE,EAAE,GAAA,kFAAA,CAAA,wBAChB,OAAG,mCAAqC,EAAE,GAAG,EAAA,kBAChD,OAAK,EAAE,QAAK,YAAA,iIACuBC,eAAA,EAAE,KAAK,gEACaA,eAAA,EAAE,IAAI;;;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps","_ssrRenderClass","_ssrInterpolate"],"sources":["../../../../components/CapabilityCard.vue","../../../../components/TriEndDisplay.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ icon: string; title: string; desc: string }>()\n</script>\n\n<template>\n <div class=\"bg-white rounded-2xl p-6 shadow-sm hover:shadow-md hover:-translate-y-1 transition-all duration-300 border border-gray-50 group\">\n <div class=\"w-12 h-12 rounded-xl bg-primary-50 text-primary flex items-center justify-center mb-4 group-hover:bg-primary group-hover:text-white transition-colors\">\n <AppIcon :name=\"icon\" class=\"w-6 h-6\" />\n </div>\n <h3 class=\"font-bold text-lg mb-2\">{{ title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed\">{{ desc }}</p>\n </div>\n</template>\n","<script setup lang=\"ts\">\nconst ends = [\n { title: '服务对象/家属端', desc: '申请服务、查看方案、签署确认、验收评价、支付结算', color: 'border-primary', bg: 'bg-primary-50', img: 'people' },\n { title: '服务人员 Delivery 端', desc: '接单确认、GPS签到、项目级执行、异常上报、证据上传', color: 'border-accent', bg: 'bg-accent-50', img: 'technology' },\n { title: '机构管理/监管端', desc: '受理派单、调度台、数据看板、质量监管、结算审核、合规审计', color: 'border-cta', bg: 'bg-orange-50', img: 'office' },\n]\n</script>\n\n<template>\n <div class=\"grid md:grid-cols-3 gap-8\">\n <div v-for=\"(e, i) in ends\" :key=\"i\"\n class=\"rounded-2xl border-2 p-8 text-center transition-all duration-300 hover:shadow-lg\"\n :class=\"[e.color, e.bg]\">\n <img :src=\"`https://loremflickr.com/240/160/${e.img}`\"\n :alt=\"e.title + '(示意素材,待替换)'\" class=\"w-full h-40 object-cover rounded-xl mb-6\" width=\"240\" height=\"160\" loading=\"lazy\" />\n <h3 class=\"font-bold text-xl mb-3\">{{ e.title }}</h3>\n <p class=\"text-sm text-text-secondary leading-relaxed\">{{ e.desc }}</p>\n </div>\n </div>\n</template>\n"],"version":3}

View File

@@ -0,0 +1,38 @@
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { defineComponent, unref, useSSRContext } from "vue";
import { ssrInterpolate, ssrRenderComponent } from "vue/server-renderer";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import { e as siteName, f as siteTagline } from "../server.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "about",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "关于我们", description: siteTagline });
return (_ctx, _push, _parent, _attrs) => {
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">关于我们</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">${ssrInterpolate(unref(siteName))}</p></div></section><section class="py-20 bg-white"><div class="section-container max-w-3xl"><div class="prose prose-lg mx-auto"><h2 class="text-3xl font-bold mb-6">平台愿景</h2><p class="text-text-secondary leading-relaxed mb-8"> 我们致力于为政府、医院、养老机构和社区服务中心提供专业、可信、智能的居家上门服务闭环管理平台。 通过数字化手段,让每一个服务请求都有始有终、每一步操作都可追溯、每一个异常都有处理、每一笔费用都有结算。 </p><h2 class="text-3xl font-bold mb-6">核心团队</h2><p class="text-text-secondary leading-relaxed mb-8"> 团队由医疗信息化、养老服务运营、企业级 SaaS 平台开发等领域的资深专家组成, 具有丰富的医养结合数字化平台建设和落地经验。 </p><h2 class="text-3xl font-bold mb-6">行业标准</h2><p class="text-text-secondary leading-relaxed mb-8"> 平台设计严格遵循《居家养老上门服务基本规范》GB/T 43153-2023 以及智慧健康养老产业发展相关指导文件, 确保服务流程、数据安全、质量评价和用户隐私保护符合国家标准。 </p></div></div></section>`);
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/about.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=about-DRb7Qi-T.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"about-DRb7Qi-T.js","sources":["../../../../pages/about.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { siteName, siteTagline } from '~/data/siteContent'\nuseSeo({ title: '关于我们', description: siteTagline })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">关于我们</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">{{ siteName }}</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container max-w-3xl\">\n <div class=\"prose prose-lg mx-auto\">\n <h2 class=\"text-3xl font-bold mb-6\">平台愿景</h2>\n <p class=\"text-text-secondary leading-relaxed mb-8\">\n 我们致力于为政府、医院、养老机构和社区服务中心提供专业、可信、智能的居家上门服务闭环管理平台。\n 通过数字化手段,让每一个服务请求都有始有终、每一步操作都可追溯、每一个异常都有处理、每一笔费用都有结算。\n </p>\n\n <h2 class=\"text-3xl font-bold mb-6\">核心团队</h2>\n <p class=\"text-text-secondary leading-relaxed mb-8\">\n 团队由医疗信息化、养老服务运营、企业级 SaaS 平台开发等领域的资深专家组成,\n 具有丰富的医养结合数字化平台建设和落地经验。\n </p>\n\n <h2 class=\"text-3xl font-bold mb-6\">行业标准</h2>\n <p class=\"text-text-secondary leading-relaxed mb-8\">\n 平台设计严格遵循《居家养老上门服务基本规范》GB/T 43153-2023 以及智慧健康养老产业发展相关指导文件,\n 确保服务流程、数据安全、质量评价和用户隐私保护符合国家标准。\n </p>\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"names":["_unref"],"mappings":";;;;;;;;;;;;;;;;;;;AAGA,WAAO,EAAE,OAAO,QAAQ,aAAa,aAAa;;;iRAOUA,MAAA,QAAA,CAAQ,CAAA,ysBAAA;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"about-DRb7Qi-T.js","mappings":";;;;;;;;;;;;;;;;;;;AAGA,WAAO,EAAE,OAAO,QAAQ,aAAa,aAAa;;;iRAOUA,MAAA,QAAA,CAAQ,CAAA,ysBAAA;;;;;;;;;;;;","names":["_unref"],"sources":["../../../../pages/about.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { siteName, siteTagline } from '~/data/siteContent'\nuseSeo({ title: '关于我们', description: siteTagline })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">关于我们</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">{{ siteName }}</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container max-w-3xl\">\n <div class=\"prose prose-lg mx-auto\">\n <h2 class=\"text-3xl font-bold mb-6\">平台愿景</h2>\n <p class=\"text-text-secondary leading-relaxed mb-8\">\n 我们致力于为政府、医院、养老机构和社区服务中心提供专业、可信、智能的居家上门服务闭环管理平台。\n 通过数字化手段,让每一个服务请求都有始有终、每一步操作都可追溯、每一个异常都有处理、每一笔费用都有结算。\n </p>\n\n <h2 class=\"text-3xl font-bold mb-6\">核心团队</h2>\n <p class=\"text-text-secondary leading-relaxed mb-8\">\n 团队由医疗信息化、养老服务运营、企业级 SaaS 平台开发等领域的资深专家组成,\n 具有丰富的医养结合数字化平台建设和落地经验。\n </p>\n\n <h2 class=\"text-3xl font-bold mb-6\">行业标准</h2>\n <p class=\"text-text-secondary leading-relaxed mb-8\">\n 平台设计严格遵循《居家养老上门服务基本规范》GB/T 43153-2023 以及智慧健康养老产业发展相关指导文件,\n 确保服务流程、数据安全、质量评价和用户隐私保护符合国家标准。\n </p>\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"version":3}

View File

@@ -0,0 +1,31 @@
import { _ as __nuxt_component_0 } from "./client-only-BYtvs9ir.js";
import { defineComponent, ref, useSSRContext } from "vue";
import { ssrRenderComponent } from "vue/server-renderer";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "applications",
__ssrInlineRender: true,
setup(__props) {
ref([]);
ref(true);
ref(false);
ref(false);
ref(false);
ref({ patientId: "", serviceType: "HOME_CARE", channel: "WECHAT", contactName: "", contactPhone: "", address: "", regionCode: "441402001", notes: "" });
return (_ctx, _push, _parent, _attrs) => {
const _component_ClientOnly = __nuxt_component_0;
_push(ssrRenderComponent(_component_ClientOnly, _attrs, {}, _parent));
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/platform/applications.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=applications-Cy7tl04a.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,50 @@
import { _ as _sfc_main$1, a as _sfc_main$2 } from "./TriEndDisplay-B5fVYJfo.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { defineComponent, unref, mergeProps, useSSRContext } from "vue";
import { ssrRenderList, ssrRenderComponent } from "vue/server-renderer";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import { c as capabilities } from "../server.mjs";
import "./AppIcon--JRwwp2l.js";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "capabilities",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "核心能力", description: "八大核心能力覆盖居家上门服务完整业务链路:需求受理、能力评估、方案制定、智能派单、上门执行、过程监管、验收评价、结算归档。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_CapabilityCard = _sfc_main$1;
const _component_TriEndDisplay = _sfc_main$2;
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">核心能力</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">八大能力模块,覆盖居家上门服务完整业务链路</p></div></section><section class="py-20 bg-surface"><div class="section-container"><div class="grid md:grid-cols-2 lg:grid-cols-4 gap-6"><!--[-->`);
ssrRenderList(unref(capabilities), (c) => {
_push(ssrRenderComponent(_component_CapabilityCard, mergeProps({
key: c.title
}, { ref_for: true }, c), null, _parent));
});
_push(`<!--]--></div></div></section><section class="py-20 bg-white"><div class="section-container"><h2 class="section-title">三端协同</h2>`);
_push(ssrRenderComponent(_component_TriEndDisplay, { class: "mt-12" }, null, _parent));
_push(`</div></section>`);
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/capabilities.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=capabilities-Cm2IW4XJ.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"capabilities-Cm2IW4XJ.js","sources":["../../../../pages/capabilities.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { capabilities } from '~/data/siteContent'\nuseSeo({ title: '核心能力', description: '八大核心能力覆盖居家上门服务完整业务链路:需求受理、能力评估、方案制定、智能派单、上门执行、过程监管、验收评价、结算归档。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">核心能力</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">八大能力模块,覆盖居家上门服务完整业务链路</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <div class=\"grid md:grid-cols-2 lg:grid-cols-4 gap-6\">\n <CapabilityCard v-for=\"c in capabilities\" :key=\"c.title\" v-bind=\"c\" />\n </div>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">三端协同</h2>\n <TriEndDisplay class=\"mt-12\" />\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"names":["_ssrRenderList","_unref","_ssrRenderComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAGA,WAAO,EAAE,OAAO,QAAQ,aAAa,iEAAiE;;;;;;AAclEA,oBAAAC,MAAA,YAAA,IAAL,MAAC;;UAAmB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;AAQrD,YAAAC,mBAAA,0BAAA,EAAA,OAAM,WAAO,MAAA,OAAA,CAAA;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"capabilities-Cm2IW4XJ.js","mappings":";;;;;;;;;;;;;;;;;;;;;AAGA,WAAO,EAAE,OAAO,QAAQ,aAAa,iEAAiE;;;;;;AAclEA,oBAAAC,MAAA,YAAA,IAAL,MAAC;;UAAmB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;AAQrD,YAAAC,mBAAA,0BAAA,EAAA,OAAM,WAAO,MAAA,OAAA,CAAA;;;;;;;;;;;;;","names":["_ssrRenderList","_unref","_ssrRenderComponent"],"sources":["../../../../pages/capabilities.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { capabilities } from '~/data/siteContent'\nuseSeo({ title: '核心能力', description: '八大核心能力覆盖居家上门服务完整业务链路:需求受理、能力评估、方案制定、智能派单、上门执行、过程监管、验收评价、结算归档。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">核心能力</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">八大能力模块,覆盖居家上门服务完整业务链路</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <div class=\"grid md:grid-cols-2 lg:grid-cols-4 gap-6\">\n <CapabilityCard v-for=\"c in capabilities\" :key=\"c.title\" v-bind=\"c\" />\n </div>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">三端协同</h2>\n <TriEndDisplay class=\"mt-12\" />\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"version":3}

View File

@@ -0,0 +1,44 @@
import { defineComponent, createElementBlock, shallowRef, getCurrentInstance, provide, cloneVNode, h } from "vue";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
defineComponent({
name: "ServerPlaceholder",
render() {
return createElementBlock("div");
}
});
const clientOnlySymbol = /* @__PURE__ */ Symbol.for("nuxt:client-only");
const __nuxt_component_0 = defineComponent({
name: "ClientOnly",
inheritAttrs: false,
props: ["fallback", "placeholder", "placeholderTag", "fallbackTag"],
...false,
setup(props, { slots, attrs }) {
const mounted = shallowRef(false);
const vm = getCurrentInstance();
if (vm) {
vm._nuxtClientOnly = true;
}
provide(clientOnlySymbol, true);
return () => {
if (mounted.value) {
const vnodes = slots.default?.();
if (vnodes && vnodes.length === 1) {
return [cloneVNode(vnodes[0], attrs)];
}
return vnodes;
}
const slot = slots.fallback || slots.placeholder;
if (slot) {
return h(slot);
}
const fallbackStr = props.fallback || props.placeholder || "";
const fallbackTag = props.fallbackTag || props.placeholderTag || "span";
return createElementBlock(fallbackTag, attrs, fallbackStr);
};
}
});
export {
__nuxt_component_0 as _
};
//# sourceMappingURL=client-only-BYtvs9ir.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,107 @@
import { defineComponent, mergeProps, unref, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate, ssrRenderComponent } from "vue/server-renderer";
import { u as useLeadForm } from "./useLeadForm-hNHTDEhY.js";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import "../server.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
__name: "DemoForm",
__ssrInlineRender: true,
setup(__props) {
const { form, loading, success, error } = useLeadForm("demo");
const focusAreas = ["政府监管", "医院延续护理", "养老机构上门服务", "社区居家照护", "长护险管理", "其他"];
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "max-w-lg mx-auto" }, _attrs))}>`);
if (!unref(success)) {
_push(`<form class="space-y-5"><div><label class="block text-sm font-medium mb-1 text-left">姓名 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).name)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none transition-all" placeholder="您的姓名"></div><div><label class="block text-sm font-medium mb-1 text-left">单位名称 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).orgName)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none transition-all" placeholder="您所在的单位"></div><div><label class="block text-sm font-medium mb-1 text-left">职务</label><input${ssrRenderAttr("value", unref(form).position)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none transition-all" placeholder="您的职务/角色"></div><div><label class="block text-sm font-medium mb-1 text-left">手机号 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).phone)} type="tel" class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none transition-all" placeholder="您的手机号"></div><div><label class="block text-sm font-medium mb-1 text-left">所在城市</label><input${ssrRenderAttr("value", unref(form).city)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none transition-all" placeholder="城市"></div><div><label class="block text-sm font-medium mb-1 text-left">关注方向</label><select class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none transition-all"><option value=""${ssrIncludeBooleanAttr(Array.isArray(unref(form).focusArea) ? ssrLooseContain(unref(form).focusArea, "") : ssrLooseEqual(unref(form).focusArea, "")) ? " selected" : ""}>请选择</option><!--[-->`);
ssrRenderList(focusAreas, (a) => {
_push(`<option${ssrRenderAttr("value", a)}${ssrIncludeBooleanAttr(Array.isArray(unref(form).focusArea) ? ssrLooseContain(unref(form).focusArea, a) : ssrLooseEqual(unref(form).focusArea, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`);
});
_push(`<!--]--></select></div><div><label class="block text-sm font-medium mb-1 text-left">留言需求</label><textarea rows="3" class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none transition-all resize-none" placeholder="请简要描述您的需求">${ssrInterpolate(unref(form).message)}</textarea></div>`);
if (unref(error)) {
_push(`<p class="text-red-500 text-sm">${ssrInterpolate(unref(error))}</p>`);
} else {
_push(`<!---->`);
}
_push(`<button type="submit"${ssrIncludeBooleanAttr(unref(loading)) ? " disabled" : ""} class="w-full px-6 py-3 bg-cta text-white rounded-xl font-semibold hover:bg-cta-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">${ssrInterpolate(unref(loading) ? "提交中..." : "提交预约")}</button></form>`);
} else {
_push(`<div class="text-center py-12"><div class="w-16 h-16 mx-auto mb-4 rounded-full bg-green-100 text-green-500 flex items-center justify-center"><svg class="w-10 h-10" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M5 13l4 4L19 7" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><h3 class="text-2xl font-bold mb-2">提交成功</h3><p class="text-text-secondary">感谢您的关注,我们将尽快与您联系。</p></div>`);
}
_push(`</div>`);
};
}
});
const _sfc_setup$2 = _sfc_main$2.setup;
_sfc_main$2.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/DemoForm.vue");
return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
};
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "ContactForm",
__ssrInlineRender: true,
setup(__props) {
const { form, loading, success, error } = useLeadForm("contact");
const coopTypes = ["政府项目", "医院合作", "养老机构合作", "社区服务", "技术合作", "其他"];
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "max-w-lg mx-auto" }, _attrs))}>`);
if (!unref(success)) {
_push(`<form class="space-y-5"><div class="grid sm:grid-cols-2 gap-5"><div><label class="block text-sm font-medium mb-1 text-left">姓名 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).name)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none" placeholder="您的姓名"></div><div><label class="block text-sm font-medium mb-1 text-left">单位名称 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).orgName)} class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none" placeholder="您所在的单位"></div></div><div><label class="block text-sm font-medium mb-1 text-left">手机号 <span class="text-red-500">*</span></label><input${ssrRenderAttr("value", unref(form).phone)} type="tel" class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none" placeholder="您的手机号"></div><div><label class="block text-sm font-medium mb-1 text-left">合作类型</label><select class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none"><option value=""${ssrIncludeBooleanAttr(Array.isArray(unref(form).contact) ? ssrLooseContain(unref(form).contact, "") : ssrLooseEqual(unref(form).contact, "")) ? " selected" : ""}>请选择</option><!--[-->`);
ssrRenderList(coopTypes, (t) => {
_push(`<option${ssrRenderAttr("value", t)}${ssrIncludeBooleanAttr(Array.isArray(unref(form).contact) ? ssrLooseContain(unref(form).contact, t) : ssrLooseEqual(unref(form).contact, t)) ? " selected" : ""}>${ssrInterpolate(t)}</option>`);
});
_push(`<!--]--></select></div><div><label class="block text-sm font-medium mb-1 text-left">需求描述</label><textarea rows="4" class="w-full px-4 py-3 rounded-xl border border-gray-200 focus:border-primary focus:ring-2 focus:ring-primary-50 outline-none resize-none" placeholder="请描述您的合作需求">${ssrInterpolate(unref(form).message)}</textarea></div>`);
if (unref(error)) {
_push(`<p class="text-red-500 text-sm">${ssrInterpolate(unref(error))}</p>`);
} else {
_push(`<!---->`);
}
_push(`<button type="submit"${ssrIncludeBooleanAttr(unref(loading)) ? " disabled" : ""} class="w-full px-6 py-3 bg-cta text-white rounded-xl font-semibold hover:bg-cta-700 transition-colors disabled:opacity-50">${ssrInterpolate(unref(loading) ? "提交中..." : "提交咨询")}</button></form>`);
} else {
_push(`<div class="text-center py-12"><div class="w-16 h-16 mx-auto mb-4 rounded-full bg-green-100 text-green-500 flex items-center justify-center"><svg class="w-10 h-10" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M5 13l4 4L19 7" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><h3 class="text-2xl font-bold mb-2">提交成功</h3><p class="text-text-secondary">感谢您的咨询,我们将尽快与您联系。</p></div>`);
}
_push(`</div>`);
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/ContactForm.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "contact",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "联系我们", description: "预约演示、获取方案、合作咨询。填写表单,我们将尽快与您联系。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_DemoForm = _sfc_main$2;
const _component_ContactForm = _sfc_main$1;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">联系我们</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">预约演示、获取方案或合作咨询</p></div></section><section class="py-20 bg-surface"><div class="section-container"><div class="grid lg:grid-cols-2 gap-16 items-start"><div><h2 class="text-2xl font-bold mb-6">预约演示</h2><p class="text-text-secondary mb-8">填写表单,我们的产品顾问将在 1 个工作日内与您联系,为您安排专属演示。</p>`);
_push(ssrRenderComponent(_component_DemoForm, null, null, _parent));
_push(`</div><div><h2 class="text-2xl font-bold mb-6">合作咨询</h2><p class="text-text-secondary mb-8">如果您有政府项目合作、医院对接、机构采购或其他合作需求,请填写下方表单。</p>`);
_push(ssrRenderComponent(_component_ContactForm, null, null, _parent));
_push(`</div></div></div></section><!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/contact.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=contact-ERUzdvQx.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,517 @@
import { defineComponent, mergeProps, useSSRContext, ref, withCtx, createVNode, openBlock, createBlock, Fragment, renderList, toDisplayString, unref } from "vue";
import { ssrRenderAttrs, ssrInterpolate, ssrRenderSlot, ssrRenderClass, ssrRenderList, ssrRenderComponent } from "vue/server-renderer";
import { _ as _sfc_main$4 } from "./AppIcon--JRwwp2l.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import { c as capabilities } from "../server.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
__name: "PlatformStatCard",
__ssrInlineRender: true,
props: {
label: {},
value: {},
suffix: {},
trend: {},
loading: { type: Boolean }
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-white rounded-2xl p-6 shadow-sm border border-gray-100" }, _attrs))}>`);
if (__props.loading) {
_push(`<div class="animate-pulse space-y-3"><div class="h-4 bg-gray-200 rounded w-16"></div><div class="h-8 bg-gray-200 rounded w-24"></div></div>`);
} else {
_push(`<!--[--><p class="text-sm text-text-secondary mb-2">${ssrInterpolate(__props.label)}</p><p class="text-3xl font-bold font-mono text-primary">${ssrInterpolate(__props.value)}`);
if (__props.suffix) {
_push(`<span class="text-lg text-text-secondary ml-1">${ssrInterpolate(__props.suffix)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</p>`);
if (__props.trend) {
_push(`<p class="text-xs text-accent mt-1">${ssrInterpolate(__props.trend)}</p>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
}
_push(`</div>`);
};
}
});
const _sfc_setup$3 = _sfc_main$3.setup;
_sfc_main$3.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/PlatformStatCard.vue");
return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
};
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
__name: "PlatformSection",
__ssrInlineRender: true,
props: {
title: {},
desc: {}
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-white rounded-2xl shadow-sm border border-gray-100 overflow-hidden" }, _attrs))}><div class="px-6 py-4 border-b border-gray-50 flex items-center justify-between"><div><h3 class="font-bold text-text-primary">${ssrInterpolate(__props.title)}</h3>`);
if (__props.desc) {
_push(`<p class="text-xs text-text-secondary mt-0.5">${ssrInterpolate(__props.desc)}</p>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex gap-2"><span class="w-2.5 h-2.5 rounded-full bg-red-400"></span><span class="w-2.5 h-2.5 rounded-full bg-yellow-400"></span><span class="w-2.5 h-2.5 rounded-full bg-green-400"></span></div></div><div class="p-0">`);
ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent);
_push(`</div></div>`);
};
}
});
const _sfc_setup$2 = _sfc_main$2.setup;
_sfc_main$2.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/PlatformSection.vue");
return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
};
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "PlatformWorkOrderRow",
__ssrInlineRender: true,
props: {
id: {},
patientName: {},
serviceType: {},
status: {},
serviceDate: {},
staffName: {}
},
setup(__props) {
const statusMap = {
ORDER_CREATED: { label: "待派单", class: "bg-gray-100 text-gray-600" },
ORDER_ASSIGNED: { label: "已派单", class: "bg-blue-50 text-blue-600" },
ORDER_ACCEPTED: { label: "已接单", class: "bg-indigo-50 text-indigo-600" },
ORDER_CHECKED_IN: { label: "已签到", class: "bg-teal-50 text-teal-600" },
ORDER_IN_SERVICE: { label: "服务中", class: "bg-accent-50 text-accent-700" },
ORDER_COMPLETED: { label: "已完成", class: "bg-green-50 text-green-600" },
ORDER_EXCEPTION: { label: "异常", class: "bg-red-50 text-red-600" },
ACCEPTED: { label: "已验收", class: "bg-green-100 text-green-700" }
};
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "flex items-center gap-4 px-4 py-3 bg-white border-b border-gray-50 hover:bg-gray-50 transition-colors" }, _attrs))}><span class="text-sm text-text-secondary w-12 shrink-0">#${ssrInterpolate(__props.id)}</span><span class="text-sm font-medium flex-1 truncate">${ssrInterpolate(__props.patientName)}</span><span class="text-xs text-text-secondary w-16 shrink-0">${ssrInterpolate(__props.serviceType)}</span><span class="text-xs w-24 shrink-0">${ssrInterpolate(__props.serviceDate)}</span><span class="${ssrRenderClass([statusMap[__props.status]?.class || "bg-gray-100", "text-xs px-2 py-1 rounded-full font-medium shrink-0"])}">${ssrInterpolate(statusMap[__props.status]?.label || __props.status)}</span><span class="text-xs text-text-secondary w-20 shrink-0 truncate">${ssrInterpolate(__props.staffName || "-")}</span></div>`);
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/PlatformWorkOrderRow.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "demo",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "平台演示", description: "智慧医养居家上门服务平台 — 功能演示与真实数据展示" });
const dashboard = ref({});
ref({});
const quality = ref({});
ref([]);
ref([]);
ref(true);
const activeTab = ref("overview");
const tabs = [
{ key: "overview", label: "管理看板" },
{ key: "orders", label: "工单管理" },
{ key: "dispatch", label: "派单调度" },
{ key: "delivery", label: "移动执行" }
];
function fmt(n, def = "--") {
if (n === null || n === void 0) return def;
if (typeof n === "number") return n.toLocaleString();
return String(n);
}
return (_ctx, _push, _parent, _attrs) => {
const _component_PlatformStatCard = _sfc_main$3;
const _component_PlatformSection = _sfc_main$2;
const _component_AppIcon = _sfc_main$4;
const _component_PlatformWorkOrderRow = _sfc_main$1;
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-16 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container"><span class="text-sm text-blue-200 mb-2 block">Platform Demo</span><h1 class="text-4xl md:text-5xl font-bold mb-4">平台功能演示</h1><p class="text-lg text-blue-100 max-w-2xl">以下展示平台真实管理界面,数据通过后端 API 实时获取</p></div></section><div class="bg-white border-b sticky top-16 z-30"><div class="section-container flex gap-0 overflow-x-auto"><!--[-->`);
ssrRenderList(tabs, (t) => {
_push(`<button class="${ssrRenderClass([activeTab.value === t.key ? "border-primary text-primary" : "border-transparent text-text-secondary hover:text-text-primary", "px-6 py-4 text-sm font-medium border-b-2 transition-colors shrink-0"])}">${ssrInterpolate(t.label)}</button>`);
});
_push(`<!--]--></div></div>`);
if (activeTab.value === "overview") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-8"><div class="grid grid-cols-2 lg:grid-cols-4 gap-4">`);
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "今日工单",
value: fmt(dashboard.value.todayOrders),
suffix: "单"
}, null, _parent));
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "进行中",
value: fmt(dashboard.value.inProgress),
suffix: "单"
}, null, _parent));
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "服务完成率",
value: fmt(quality.value.serviceCompletionRate),
suffix: "%"
}, null, _parent));
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "活跃服务人员",
value: fmt(dashboard.value.availableStaff),
suffix: "人"
}, null, _parent));
_push(`</div><div class="grid lg:grid-cols-2 gap-8">`);
_push(ssrRenderComponent(_component_PlatformSection, {
title: "实时工单状态分布",
desc: "各状态工单数量概览"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6 grid grid-cols-2 gap-3"${_scopeId}><!--[-->`);
ssrRenderList([
{ label: "待派单", v: dashboard.value.pendingDispatch, c: "bg-gray-100" },
{ label: "进行中", v: dashboard.value.inProgress, c: "bg-blue-50" },
{ label: "已完成", v: dashboard.value.completedToday, c: "bg-green-50" },
{ label: "异常", v: dashboard.value.exceptions, c: "bg-red-50" }
], (item) => {
_push2(`<div class="${ssrRenderClass(["rounded-xl p-4 text-center", item.c])}"${_scopeId}><div class="text-2xl font-bold font-mono"${_scopeId}>${ssrInterpolate(fmt(item.v))}</div><div class="text-xs text-text-secondary mt-1"${_scopeId}>${ssrInterpolate(item.label)}</div></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-6 grid grid-cols-2 gap-3" }, [
(openBlock(true), createBlock(Fragment, null, renderList([
{ label: "待派单", v: dashboard.value.pendingDispatch, c: "bg-gray-100" },
{ label: "进行中", v: dashboard.value.inProgress, c: "bg-blue-50" },
{ label: "已完成", v: dashboard.value.completedToday, c: "bg-green-50" },
{ label: "异常", v: dashboard.value.exceptions, c: "bg-red-50" }
], (item) => {
return openBlock(), createBlock("div", {
key: item.label,
class: ["rounded-xl p-4 text-center", item.c]
}, [
createVNode("div", { class: "text-2xl font-bold font-mono" }, toDisplayString(fmt(item.v)), 1),
createVNode("div", { class: "text-xs text-text-secondary mt-1" }, toDisplayString(item.label), 1)
], 2);
}), 128))
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, {
title: "核心能力模块",
desc: "平台覆盖居家服务全流程"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6 grid grid-cols-2 gap-3"${_scopeId}><!--[-->`);
ssrRenderList(unref(capabilities).slice(0, 8), (c) => {
_push2(`<div class="flex items-center gap-3 p-3 rounded-xl hover:bg-primary-50 transition-colors cursor-pointer group"${_scopeId}><div class="w-10 h-10 rounded-lg bg-primary-50 text-primary flex items-center justify-center group-hover:bg-primary group-hover:text-white transition-colors shrink-0"${_scopeId}>`);
_push2(ssrRenderComponent(_component_AppIcon, {
name: c.icon,
class: "w-5 h-5"
}, null, _parent2, _scopeId));
_push2(`</div><div class="min-w-0"${_scopeId}><div class="text-sm font-medium truncate"${_scopeId}>${ssrInterpolate(c.title)}</div><div class="text-xs text-text-secondary truncate"${_scopeId}>${ssrInterpolate(c.desc)}</div></div></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-6 grid grid-cols-2 gap-3" }, [
(openBlock(true), createBlock(Fragment, null, renderList(unref(capabilities).slice(0, 8), (c) => {
return openBlock(), createBlock("div", {
key: c.title,
class: "flex items-center gap-3 p-3 rounded-xl hover:bg-primary-50 transition-colors cursor-pointer group"
}, [
createVNode("div", { class: "w-10 h-10 rounded-lg bg-primary-50 text-primary flex items-center justify-center group-hover:bg-primary group-hover:text-white transition-colors shrink-0" }, [
createVNode(_component_AppIcon, {
name: c.icon,
class: "w-5 h-5"
}, null, 8, ["name"])
]),
createVNode("div", { class: "min-w-0" }, [
createVNode("div", { class: "text-sm font-medium truncate" }, toDisplayString(c.title), 1),
createVNode("div", { class: "text-xs text-text-secondary truncate" }, toDisplayString(c.desc), 1)
])
]);
}), 128))
])
];
}
}),
_: 1
}, _parent));
_push(`</div></div></section>`);
} else {
_push(`<!---->`);
}
if (activeTab.value === "orders") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-6">`);
_push(ssrRenderComponent(_component_PlatformSection, {
title: "工单管理",
desc: "受理、派单、接单、执行、完成全流程工单视图"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="divide-y divide-gray-50"${_scopeId}><div class="flex items-center gap-4 px-4 py-3 bg-gray-50 text-xs font-medium text-text-secondary"${_scopeId}><span class="w-12"${_scopeId}>ID</span><span class="flex-1"${_scopeId}>服务对象</span><span class="w-16"${_scopeId}>类型</span><span class="w-24"${_scopeId}>日期</span><span class="w-24"${_scopeId}>状态</span><span class="w-20"${_scopeId}>人员</span></div><!--[-->`);
ssrRenderList([
{ id: 1001, patientName: "张奶奶", serviceType: "居家护理", status: "ORDER_IN_SERVICE", serviceDate: "2026-05-18", staffName: "李护理员" },
{ id: 1002, patientName: "王大爷", serviceType: "康复训练", status: "ORDER_COMPLETED", serviceDate: "2026-05-18", staffName: "张康复师" },
{ id: 1003, patientName: "赵阿姨", serviceType: "助浴服务", status: "ORDER_ASSIGNED", serviceDate: "2026-05-18", staffName: "--" },
{ id: 1004, patientName: "刘爷爷", serviceType: "健康管理", status: "ORDER_CHECKED_IN", serviceDate: "2026-05-18", staffName: "陈护理员" },
{ id: 1005, patientName: "孙奶奶", serviceType: "能力评估", status: "ORDER_EXCEPTION", serviceDate: "2026-05-17", staffName: "周评估员" }
], (wo) => {
_push2(ssrRenderComponent(_component_PlatformWorkOrderRow, mergeProps({
key: wo.id
}, { ref_for: true }, wo), null, _parent2, _scopeId));
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "divide-y divide-gray-50" }, [
createVNode("div", { class: "flex items-center gap-4 px-4 py-3 bg-gray-50 text-xs font-medium text-text-secondary" }, [
createVNode("span", { class: "w-12" }, "ID"),
createVNode("span", { class: "flex-1" }, "服务对象"),
createVNode("span", { class: "w-16" }, "类型"),
createVNode("span", { class: "w-24" }, "日期"),
createVNode("span", { class: "w-24" }, "状态"),
createVNode("span", { class: "w-20" }, "人员")
]),
(openBlock(), createBlock(Fragment, null, renderList([
{ id: 1001, patientName: "张奶奶", serviceType: "居家护理", status: "ORDER_IN_SERVICE", serviceDate: "2026-05-18", staffName: "李护理员" },
{ id: 1002, patientName: "王大爷", serviceType: "康复训练", status: "ORDER_COMPLETED", serviceDate: "2026-05-18", staffName: "张康复师" },
{ id: 1003, patientName: "赵阿姨", serviceType: "助浴服务", status: "ORDER_ASSIGNED", serviceDate: "2026-05-18", staffName: "--" },
{ id: 1004, patientName: "刘爷爷", serviceType: "健康管理", status: "ORDER_CHECKED_IN", serviceDate: "2026-05-18", staffName: "陈护理员" },
{ id: 1005, patientName: "孙奶奶", serviceType: "能力评估", status: "ORDER_EXCEPTION", serviceDate: "2026-05-17", staffName: "周评估员" }
], (wo) => {
return createVNode(_component_PlatformWorkOrderRow, mergeProps({
key: wo.id
}, { ref_for: true }, wo), null, 16);
}), 64))
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, {
title: "工单状态流转",
desc: "状态机驱动的完整流转路径"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6"${_scopeId}><div class="flex flex-wrap items-center gap-2 text-xs"${_scopeId}><span class="px-3 py-1.5 rounded-full bg-gray-100"${_scopeId}>ORDER_CREATED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-blue-50 text-blue-600"${_scopeId}>ORDER_ASSIGNED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-indigo-50 text-indigo-600"${_scopeId}>ORDER_ACCEPTED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-teal-50 text-teal-600"${_scopeId}>ORDER_CHECKED_IN</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-accent-50 text-accent-700"${_scopeId}>ORDER_IN_SERVICE</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-green-50 text-green-600"${_scopeId}>ORDER_COMPLETED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-green-100 text-green-700"${_scopeId}>ACCEPTED</span></div></div>`);
} else {
return [
createVNode("div", { class: "p-6" }, [
createVNode("div", { class: "flex flex-wrap items-center gap-2 text-xs" }, [
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-gray-100" }, "ORDER_CREATED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-blue-50 text-blue-600" }, "ORDER_ASSIGNED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-indigo-50 text-indigo-600" }, "ORDER_ACCEPTED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-teal-50 text-teal-600" }, "ORDER_CHECKED_IN"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-accent-50 text-accent-700" }, "ORDER_IN_SERVICE"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-green-50 text-green-600" }, "ORDER_COMPLETED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-green-100 text-green-700" }, "ACCEPTED")
])
])
];
}
}),
_: 1
}, _parent));
_push(`</div></section>`);
} else {
_push(`<!---->`);
}
if (activeTab.value === "dispatch") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-6">`);
_push(ssrRenderComponent(_component_PlatformSection, {
title: "调度工作台",
desc: "智能推荐 + 人工确认,两阶段派单"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6 space-y-4"${_scopeId}><div class="flex items-center justify-between p-4 bg-primary-50 rounded-xl"${_scopeId}><div${_scopeId}><div class="text-sm font-bold"${_scopeId}>#1003 赵阿姨 — 助浴服务</div><div class="text-xs text-text-secondary"${_scopeId}>梅江区金山街道 · 2026-05-18 09:00-10:00 · 低风险</div></div><span class="px-3 py-1.5 bg-primary text-white rounded-lg text-xs font-medium"${_scopeId}>待派单</span></div><div class="text-sm font-medium text-text-primary mt-4 mb-2"${_scopeId}>智能推荐 Top 3</div><!--[-->`);
ssrRenderList([
{ name: "李护理员", score: 92, reasons: "资质匹配·距离1.2km·负载低·满意度4.8" },
{ name: "王护理员", score: 85, reasons: "区域匹配·技能匹配·今日工单2/6" },
{ name: "陈护理员", score: 78, reasons: "曾服务该对象·满意度4.6·工单量适中" }
], (r, i) => {
_push2(`<div class="flex items-center gap-4 p-4 rounded-xl border hover:border-primary hover:bg-primary-50/50 transition-colors cursor-pointer"${_scopeId}><span class="w-10 h-10 rounded-full bg-gradient-to-br from-primary-50 to-accent-50 text-primary flex items-center justify-center font-bold text-sm shrink-0"${_scopeId}>${ssrInterpolate(i + 1)}</span><div class="flex-1 min-w-0"${_scopeId}><div class="text-sm font-medium"${_scopeId}>${ssrInterpolate(r.name)}</div><div class="text-xs text-text-secondary truncate"${_scopeId}>${ssrInterpolate(r.reasons)}</div></div><span class="text-lg font-bold font-mono text-primary shrink-0"${_scopeId}>${ssrInterpolate(r.score)}</span><button class="px-4 py-2 bg-primary text-white rounded-lg text-xs font-medium hover:bg-primary-700 transition-colors shrink-0"${_scopeId}>派单</button></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-6 space-y-4" }, [
createVNode("div", { class: "flex items-center justify-between p-4 bg-primary-50 rounded-xl" }, [
createVNode("div", null, [
createVNode("div", { class: "text-sm font-bold" }, "#1003 赵阿姨 — 助浴服务"),
createVNode("div", { class: "text-xs text-text-secondary" }, "梅江区金山街道 · 2026-05-18 09:00-10:00 · 低风险")
]),
createVNode("span", { class: "px-3 py-1.5 bg-primary text-white rounded-lg text-xs font-medium" }, "待派单")
]),
createVNode("div", { class: "text-sm font-medium text-text-primary mt-4 mb-2" }, "智能推荐 Top 3"),
(openBlock(), createBlock(Fragment, null, renderList([
{ name: "李护理员", score: 92, reasons: "资质匹配·距离1.2km·负载低·满意度4.8" },
{ name: "王护理员", score: 85, reasons: "区域匹配·技能匹配·今日工单2/6" },
{ name: "陈护理员", score: 78, reasons: "曾服务该对象·满意度4.6·工单量适中" }
], (r, i) => {
return createVNode("div", {
key: i,
class: "flex items-center gap-4 p-4 rounded-xl border hover:border-primary hover:bg-primary-50/50 transition-colors cursor-pointer"
}, [
createVNode("span", { class: "w-10 h-10 rounded-full bg-gradient-to-br from-primary-50 to-accent-50 text-primary flex items-center justify-center font-bold text-sm shrink-0" }, toDisplayString(i + 1), 1),
createVNode("div", { class: "flex-1 min-w-0" }, [
createVNode("div", { class: "text-sm font-medium" }, toDisplayString(r.name), 1),
createVNode("div", { class: "text-xs text-text-secondary truncate" }, toDisplayString(r.reasons), 1)
]),
createVNode("span", { class: "text-lg font-bold font-mono text-primary shrink-0" }, toDisplayString(r.score), 1),
createVNode("button", { class: "px-4 py-2 bg-primary text-white rounded-lg text-xs font-medium hover:bg-primary-700 transition-colors shrink-0" }, "派单")
]);
}), 64))
])
];
}
}),
_: 1
}, _parent));
_push(`</div></section>`);
} else {
_push(`<!---->`);
}
if (activeTab.value === "delivery") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-6"><div class="grid lg:grid-cols-3 gap-6">`);
_push(ssrRenderComponent(_component_PlatformSection, { title: "Delivery 工作台" }, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-4 space-y-3"${_scopeId}><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>今日工单</span><span class="font-bold"${_scopeId}>6</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>待接单</span><span class="font-bold text-blue-600"${_scopeId}>2</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>待签到</span><span class="font-bold text-teal-600"${_scopeId}>1</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>服务中</span><span class="font-bold text-accent-700"${_scopeId}>1</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>已完成</span><span class="font-bold text-green-600"${_scopeId}>2</span></div></div>`);
} else {
return [
createVNode("div", { class: "p-4 space-y-3" }, [
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "今日工单"),
createVNode("span", { class: "font-bold" }, "6")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "待接单"),
createVNode("span", { class: "font-bold text-blue-600" }, "2")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "待签到"),
createVNode("span", { class: "font-bold text-teal-600" }, "1")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "服务中"),
createVNode("span", { class: "font-bold text-accent-700" }, "1")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "已完成"),
createVNode("span", { class: "font-bold text-green-600" }, "2")
])
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, { title: "GPS 签到" }, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-4 space-y-3"${_scopeId}><div class="text-xs text-text-secondary"${_scopeId}>当前位置距服务地址</div><div class="text-3xl font-bold font-mono text-accent-700"${_scopeId}>85m</div><div class="text-xs text-green-600"${_scopeId}>✓ 200米范围内可签到</div><div class="flex gap-2 mt-3"${_scopeId}><div class="w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary"${_scopeId}>📷 现场拍照</div><div class="w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary"${_scopeId}>✍️ 对象确认</div></div><button class="w-full py-3 bg-cta text-white rounded-xl text-sm font-bold hover:bg-cta-700 transition-colors"${_scopeId}>确认签到</button></div>`);
} else {
return [
createVNode("div", { class: "p-4 space-y-3" }, [
createVNode("div", { class: "text-xs text-text-secondary" }, "当前位置距服务地址"),
createVNode("div", { class: "text-3xl font-bold font-mono text-accent-700" }, "85m"),
createVNode("div", { class: "text-xs text-green-600" }, "✓ 200米范围内可签到"),
createVNode("div", { class: "flex gap-2 mt-3" }, [
createVNode("div", { class: "w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary" }, "📷 现场拍照"),
createVNode("div", { class: "w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary" }, "✍️ 对象确认")
]),
createVNode("button", { class: "w-full py-3 bg-cta text-white rounded-xl text-sm font-bold hover:bg-cta-700 transition-colors" }, "确认签到")
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, { title: "项目执行记录" }, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-4 space-y-3"${_scopeId}><!--[-->`);
ssrRenderList([
{ name: "助洁服务", status: "COMPLETED", time: "09:15-10:05", duration: "50分钟" },
{ name: "健康监测", status: "IN_PROGRESS", time: "10:10-", duration: "进行中" },
{ name: "康复指导", status: "PENDING", time: "--", duration: "待执行" }
], (item, i) => {
_push2(`<div class="flex items-center gap-3 text-sm"${_scopeId}><span class="${ssrRenderClass([
"w-2 h-2 rounded-full shrink-0",
item.status === "COMPLETED" ? "bg-green-500" : item.status === "IN_PROGRESS" ? "bg-accent" : "bg-gray-300"
])}"${_scopeId}></span><span class="flex-1 font-medium"${_scopeId}>${ssrInterpolate(item.name)}</span><span class="text-xs text-text-secondary"${_scopeId}>${ssrInterpolate(item.time)}</span><span class="text-xs text-text-secondary w-14 text-right"${_scopeId}>${ssrInterpolate(item.duration)}</span></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-4 space-y-3" }, [
(openBlock(), createBlock(Fragment, null, renderList([
{ name: "助洁服务", status: "COMPLETED", time: "09:15-10:05", duration: "50分钟" },
{ name: "健康监测", status: "IN_PROGRESS", time: "10:10-", duration: "进行中" },
{ name: "康复指导", status: "PENDING", time: "--", duration: "待执行" }
], (item, i) => {
return createVNode("div", {
key: i,
class: "flex items-center gap-3 text-sm"
}, [
createVNode("span", {
class: [
"w-2 h-2 rounded-full shrink-0",
item.status === "COMPLETED" ? "bg-green-500" : item.status === "IN_PROGRESS" ? "bg-accent" : "bg-gray-300"
]
}, null, 2),
createVNode("span", { class: "flex-1 font-medium" }, toDisplayString(item.name), 1),
createVNode("span", { class: "text-xs text-text-secondary" }, toDisplayString(item.time), 1),
createVNode("span", { class: "text-xs text-text-secondary w-14 text-right" }, toDisplayString(item.duration), 1)
]);
}), 64))
])
];
}
}),
_: 1
}, _parent));
_push(`</div></div></section>`);
} else {
_push(`<!---->`);
}
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/demo.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=demo-BC4si0ca.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"entry-styles-1.mjs-Cy2s_ZjC.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}

View File

@@ -0,0 +1 @@
{"file":"entry-styles-1.mjs-Cy2s_ZjC.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"version":3,"file":"entry-styles-2.mjs-NDOZV5T7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}

View File

@@ -0,0 +1 @@
{"file":"entry-styles-2.mjs-NDOZV5T7.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}

View File

@@ -0,0 +1,6 @@
import style_0 from "./entry-styles-1.mjs-Cy2s_ZjC.js";
import style_1 from "./entry-styles-2.mjs-NDOZV5T7.js";
export default [
style_0,
style_1
]

View File

@@ -0,0 +1,90 @@
import { a as _export_sfc, _ as __nuxt_component_0 } from "../server.mjs";
import { mergeProps, withCtx, createTextVNode, toDisplayString, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrInterpolate, ssrRenderComponent } from "vue/server-renderer";
import { u as useHead } from "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
const _sfc_main = {
__name: "error-404",
__ssrInlineRender: true,
props: {
appName: {
type: String,
default: "Nuxt"
},
version: {
type: String,
default: ""
},
status: {
type: Number,
default: 404
},
statusText: {
type: String,
default: "Not Found"
},
description: {
type: String,
default: "Sorry, the page you are looking for could not be found."
},
backHome: {
type: String,
default: "Go back home"
}
},
setup(__props) {
const props = __props;
useHead({
title: `${props.status} - ${props.statusText} | ${props.appName}`,
script: [
{
innerHTML: `!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`
}
],
style: [
{
innerHTML: `*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }`
}
]
});
return (_ctx, _push, _parent, _attrs) => {
const _component_NuxtLink = __nuxt_component_0;
_push(`<div${ssrRenderAttrs(mergeProps({ class: "antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black" }, _attrs))} data-v-1bd9e11a><div class="fixed left-0 right-0 spotlight z-10" data-v-1bd9e11a></div><div class="max-w-520px text-center z-20" data-v-1bd9e11a><h1 class="font-medium mb-8 sm:text-10xl text-8xl" data-v-1bd9e11a>${ssrInterpolate(__props.status)}</h1><p class="font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl" data-v-1bd9e11a>${ssrInterpolate(__props.description)}</p><div class="flex items-center justify-center w-full" data-v-1bd9e11a>`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/",
class: "cursor-pointer gradient-border px-4 py-2 sm:px-6 sm:py-3 sm:text-xl text-md"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`${ssrInterpolate(__props.backHome)}`);
} else {
return [
createTextVNode(toDisplayString(__props.backHome), 1)
];
}
}),
_: 1
}, _parent));
_push(`</div></div></div>`);
};
}
};
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("node_modules/nuxt/dist/app/components/error-404.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const error404 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1bd9e11a"]]);
export {
error404 as default
};
//# sourceMappingURL=error-404-Cx-ou_ki.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
const error404_vue_vue_type_style_index_0_scoped_1bd9e11a_lang = '.spotlight[data-v-1bd9e11a]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);bottom:-30vh;filter:blur(20vh);height:40vh}.gradient-border[data-v-1bd9e11a]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:.5rem;position:relative}@media(prefers-color-scheme:light){.gradient-border[data-v-1bd9e11a]{background-color:#ffffff4d}.gradient-border[data-v-1bd9e11a]:before{background:linear-gradient(90deg,#e2e2e2,#e2e2e2 25%,#00dc82,#36e4da 75%,#0047e1)}}@media(prefers-color-scheme:dark){.gradient-border[data-v-1bd9e11a]{background-color:#1414144d}.gradient-border[data-v-1bd9e11a]:before{background:linear-gradient(90deg,#303030,#303030 25%,#00dc82,#36e4da 75%,#0047e1)}}.gradient-border[data-v-1bd9e11a]:before{background-size:400% auto;border-radius:.5rem;content:"";inset:0;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.5;padding:2px;position:absolute;transition:background-position .3s ease-in-out,opacity .2s ease-in-out;width:100%}.gradient-border[data-v-1bd9e11a]:hover:before{background-position:-50% 0;opacity:1}.fixed[data-v-1bd9e11a]{position:fixed}.left-0[data-v-1bd9e11a]{left:0}.right-0[data-v-1bd9e11a]{right:0}.z-10[data-v-1bd9e11a]{z-index:10}.z-20[data-v-1bd9e11a]{z-index:20}.grid[data-v-1bd9e11a]{display:grid}.mb-16[data-v-1bd9e11a]{margin-bottom:4rem}.mb-8[data-v-1bd9e11a]{margin-bottom:2rem}.max-w-520px[data-v-1bd9e11a]{max-width:520px}.min-h-screen[data-v-1bd9e11a]{min-height:100vh}.w-full[data-v-1bd9e11a]{width:100%}.flex[data-v-1bd9e11a]{display:flex}.cursor-pointer[data-v-1bd9e11a]{cursor:pointer}.place-content-center[data-v-1bd9e11a]{place-content:center}.items-center[data-v-1bd9e11a]{align-items:center}.justify-center[data-v-1bd9e11a]{justify-content:center}.overflow-hidden[data-v-1bd9e11a]{overflow:hidden}.bg-white[data-v-1bd9e11a]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-4[data-v-1bd9e11a]{padding-left:1rem;padding-right:1rem}.px-8[data-v-1bd9e11a]{padding-left:2rem;padding-right:2rem}.py-2[data-v-1bd9e11a]{padding-bottom:.5rem;padding-top:.5rem}.text-center[data-v-1bd9e11a]{text-align:center}.text-8xl[data-v-1bd9e11a]{font-size:6rem;line-height:1}.text-xl[data-v-1bd9e11a]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-1bd9e11a]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-1bd9e11a]{font-weight:300}.font-medium[data-v-1bd9e11a]{font-weight:500}.leading-tight[data-v-1bd9e11a]{line-height:1.25}.font-sans[data-v-1bd9e11a]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-1bd9e11a]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-black[data-v-1bd9e11a]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\\:text-white[data-v-1bd9e11a]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:px-0[data-v-1bd9e11a]{padding-left:0;padding-right:0}.sm\\:px-6[data-v-1bd9e11a]{padding-left:1.5rem;padding-right:1.5rem}.sm\\:py-3[data-v-1bd9e11a]{padding-bottom:.75rem;padding-top:.75rem}.sm\\:text-4xl[data-v-1bd9e11a]{font-size:2.25rem;line-height:2.5rem}.sm\\:text-xl[data-v-1bd9e11a]{font-size:1.25rem;line-height:1.75rem}}';
export {
error404_vue_vue_type_style_index_0_scoped_1bd9e11a_lang as default
};
//# sourceMappingURL=error-404-styles-1.mjs-COQ9lBg6.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"error-404-styles-1.mjs-COQ9lBg6.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}

View File

@@ -0,0 +1 @@
{"file":"error-404-styles-1.mjs-COQ9lBg6.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}

View File

@@ -0,0 +1,4 @@
import style_0 from "./error-404-styles-1.mjs-COQ9lBg6.js";
export default [
style_0
]

View File

@@ -0,0 +1,69 @@
import { mergeProps, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrInterpolate } from "vue/server-renderer";
import { a as _export_sfc } from "../server.mjs";
import { u as useHead } from "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
const _sfc_main = {
__name: "error-500",
__ssrInlineRender: true,
props: {
appName: {
type: String,
default: "Nuxt"
},
version: {
type: String,
default: ""
},
status: {
type: Number,
default: 500
},
statusText: {
type: String,
default: "Server error"
},
description: {
type: String,
default: "This page is temporarily unavailable."
}
},
setup(__props) {
const props = __props;
useHead({
title: `${props.status} - ${props.statusText} | ${props.appName}`,
script: [
{
innerHTML: `!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`
}
],
style: [
{
innerHTML: `*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }`
}
]
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black" }, _attrs))} data-v-a01dd0ba><div class="-bottom-1/2 fixed h-1/2 left-0 right-0 spotlight" data-v-a01dd0ba></div><div class="max-w-520px text-center" data-v-a01dd0ba><h1 class="font-medium mb-8 sm:text-10xl text-8xl" data-v-a01dd0ba>${ssrInterpolate(__props.status)}</h1><p class="font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl" data-v-a01dd0ba>${ssrInterpolate(__props.description)}</p></div></div>`);
};
}
};
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("node_modules/nuxt/dist/app/components/error-500.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const error500 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a01dd0ba"]]);
export {
error500 as default
};
//# sourceMappingURL=error-500-CvzBcyf_.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
const error500_vue_vue_type_style_index_0_scoped_a01dd0ba_lang = ".spotlight[data-v-a01dd0ba]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);filter:blur(20vh)}.fixed[data-v-a01dd0ba]{position:fixed}.-bottom-1\\/2[data-v-a01dd0ba]{bottom:-50%}.left-0[data-v-a01dd0ba]{left:0}.right-0[data-v-a01dd0ba]{right:0}.grid[data-v-a01dd0ba]{display:grid}.mb-16[data-v-a01dd0ba]{margin-bottom:4rem}.mb-8[data-v-a01dd0ba]{margin-bottom:2rem}.h-1\\/2[data-v-a01dd0ba]{height:50%}.max-w-520px[data-v-a01dd0ba]{max-width:520px}.min-h-screen[data-v-a01dd0ba]{min-height:100vh}.place-content-center[data-v-a01dd0ba]{place-content:center}.overflow-hidden[data-v-a01dd0ba]{overflow:hidden}.bg-white[data-v-a01dd0ba]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-8[data-v-a01dd0ba]{padding-left:2rem;padding-right:2rem}.text-center[data-v-a01dd0ba]{text-align:center}.text-8xl[data-v-a01dd0ba]{font-size:6rem;line-height:1}.text-xl[data-v-a01dd0ba]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-a01dd0ba]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-a01dd0ba]{font-weight:300}.font-medium[data-v-a01dd0ba]{font-weight:500}.leading-tight[data-v-a01dd0ba]{line-height:1.25}.font-sans[data-v-a01dd0ba]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-a01dd0ba]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-black[data-v-a01dd0ba]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\\:text-white[data-v-a01dd0ba]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:px-0[data-v-a01dd0ba]{padding-left:0;padding-right:0}.sm\\:text-4xl[data-v-a01dd0ba]{font-size:2.25rem;line-height:2.5rem}}";
export {
error500_vue_vue_type_style_index_0_scoped_a01dd0ba_lang as default
};
//# sourceMappingURL=error-500-styles-1.mjs-C0glhSuM.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"error-500-styles-1.mjs-C0glhSuM.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}

View File

@@ -0,0 +1 @@
{"file":"error-500-styles-1.mjs-C0glhSuM.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}

View File

@@ -0,0 +1,4 @@
import style_0 from "./error-500-styles-1.mjs-C0glhSuM.js";
export default [
style_0
]

View File

@@ -0,0 +1,212 @@
import { f as siteTagline, d as siteDescription, _ as __nuxt_component_0, m as metrics, a as _export_sfc, p as painPoints, c as capabilities, s as scenarios } from "../server.mjs";
import { defineComponent, mergeProps, unref, withCtx, createTextVNode, useSSRContext, ref } from "vue";
import { ssrRenderAttrs, ssrInterpolate, ssrRenderComponent, ssrRenderList } from "vue/server-renderer";
import { _ as _sfc_main$5 } from "./PainPointCard-Lm1N0rdZ.js";
import { _ as __nuxt_component_0$1 } from "./ServiceLoopFlow-BcBowZhS.js";
import { _ as _sfc_main$6, a as _sfc_main$7 } from "./TriEndDisplay-B5fVYJfo.js";
import { _ as _sfc_main$8 } from "./ScenarioCard-KNU_bnPj.js";
import { _ as _sfc_main$9 } from "./SecurityGrid-LoMlH504.js";
import { _ as _sfc_main$a } from "./DownloadForm-DWoM9wYa.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
import "./AppIcon--JRwwp2l.js";
import "./useLeadForm-hNHTDEhY.js";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
const _sfc_main$4 = /* @__PURE__ */ defineComponent({
__name: "HeroSection",
__ssrInlineRender: true,
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
const _component_NuxtLink = __nuxt_component_0;
_push(`<section${ssrRenderAttrs(mergeProps({ class: "relative overflow-hidden bg-gradient-to-br from-primary-900 via-primary-700 to-primary-500 text-white" }, _attrs))}><div class="absolute inset-0 opacity-10"><div class="absolute top-10 left-10 w-72 h-72 bg-white rounded-full blur-3xl"></div><div class="absolute bottom-10 right-10 w-96 h-96 bg-accent rounded-full blur-3xl"></div></div><div class="section-container relative py-20 lg:py-32"><div class="max-w-3xl"><span class="inline-block px-3 py-1 rounded-full bg-white/20 text-sm font-medium mb-6 backdrop-blur"> 智慧医养 · 居家上门服务 · 长护险管理 </span><h1 class="text-4xl md:text-5xl lg:text-6xl font-bold leading-tight mb-6">${ssrInterpolate(unref(siteTagline))}</h1><p class="text-lg md:text-xl text-blue-100 mb-8 max-w-2xl">${ssrInterpolate(unref(siteDescription))}</p><div class="flex flex-col sm:flex-row gap-4">`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/contact",
class: "px-8 py-4 bg-cta text-white rounded-xl text-lg font-semibold hover:bg-cta-700 transition-colors text-center shadow-lg shadow-cta/25"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(` 预约演示 `);
} else {
return [
createTextVNode(" 预约演示 ")
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/service-loop",
class: "px-8 py-4 bg-white/15 backdrop-blur text-white rounded-xl text-lg font-semibold hover:bg-white/25 transition-colors text-center border border-white/20"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(` 查看服务闭环 `);
} else {
return [
createTextVNode(" 查看服务闭环 ")
];
}
}),
_: 1
}, _parent));
_push(`</div></div><div class="mt-12 lg:absolute lg:right-8 lg:top-1/2 lg:-translate-y-1/2 lg:mt-0"><img src="https://loremflickr.com/560/400/technology" alt="平台概览示意图(示意素材,待替换)" class="rounded-2xl shadow-2xl w-full max-w-lg opacity-90" width="560" height="400" loading="eager"></div></div></section>`);
};
}
});
const _sfc_setup$4 = _sfc_main$4.setup;
_sfc_main$4.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/HeroSection.vue");
return _sfc_setup$4 ? _sfc_setup$4(props, ctx) : void 0;
};
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
__name: "DataDashboard",
__ssrInlineRender: true,
setup(__props) {
const stats = ref([
{ label: "今日工单", value: 0, suffix: "单" },
{ label: "进行中", value: 0, suffix: "单" },
{ label: "服务完成率", value: 0, suffix: "%" },
{ label: "异常工单", value: 0, suffix: "单" }
]);
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({
id: "dashboard-section",
class: "space-y-6"
}, _attrs))}><div class="grid grid-cols-2 lg:grid-cols-4 gap-4"><!--[-->`);
ssrRenderList(stats.value, (s) => {
_push(`<div class="bg-white rounded-2xl p-6 text-center shadow-sm border border-gray-50"><div class="text-3xl font-bold font-mono text-primary mb-2">${ssrInterpolate(s.value)}${ssrInterpolate(s.suffix)}</div><div class="text-sm text-text-secondary">${ssrInterpolate(s.label)}</div></div>`);
});
_push(`<!--]--></div><img src="https://loremflickr.com/960/300/technology" alt="数据看板示意图(示意素材,待替换)" class="w-full rounded-xl shadow-sm" width="960" height="300" loading="lazy"></div>`);
};
}
});
const _sfc_setup$3 = _sfc_main$3.setup;
_sfc_main$3.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/DataDashboard.vue");
return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
};
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
__name: "ValueMetrics",
__ssrInlineRender: true,
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "grid grid-cols-2 lg:grid-cols-4 gap-6" }, _attrs))}><!--[-->`);
ssrRenderList(unref(metrics), (m) => {
_push(`<div class="bg-white rounded-2xl p-8 text-center shadow-sm border border-gray-100"><div class="text-4xl font-bold font-mono text-primary mb-3">${ssrInterpolate(m.value)}</div><div class="font-semibold text-text-primary mb-1">${ssrInterpolate(m.label)}</div><div class="text-xs text-text-secondary">${ssrInterpolate(m.desc)}</div></div>`);
});
_push(`<!--]--></div>`);
};
}
});
const _sfc_setup$2 = _sfc_main$2.setup;
_sfc_main$2.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/ValueMetrics.vue");
return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
};
const _sfc_main$1 = {};
function _sfc_ssrRender(_ctx, _push, _parent, _attrs) {
const _component_NuxtLink = __nuxt_component_0;
_push(`<div${ssrRenderAttrs(mergeProps({ class: "fixed bottom-0 left-0 right-0 lg:hidden z-40 bg-white border-t border-gray-200 px-4 py-3 safe-area-bottom" }, _attrs))} data-v-f60dad24>`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/contact",
class: "block w-full text-center px-6 py-3 bg-cta text-white rounded-xl font-semibold text-base shadow-lg"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(` 预约演示 `);
} else {
return [
createTextVNode(" 预约演示 ")
];
}
}),
_: 1
}, _parent));
_push(`</div>`);
}
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/MobileBottomCTA.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const __nuxt_component_11 = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["ssrRender", _sfc_ssrRender], ["__scopeId", "data-v-f60dad24"]]);
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "index",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "首页", description: "智慧医养居家上门服务闭环管理平台,覆盖申请、评估、方案、派单、执行、监管、验收、结算全流程。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_HeroSection = _sfc_main$4;
const _component_PainPointCard = _sfc_main$5;
const _component_ServiceLoopFlow = __nuxt_component_0$1;
const _component_CapabilityCard = _sfc_main$6;
const _component_TriEndDisplay = _sfc_main$7;
const _component_ScenarioCard = _sfc_main$8;
const _component_DataDashboard = _sfc_main$3;
const _component_SecurityGrid = _sfc_main$9;
const _component_ValueMetrics = _sfc_main$2;
const _component_DownloadForm = _sfc_main$a;
const _component_CtaSection = __nuxt_component_2;
const _component_MobileBottomCTA = __nuxt_component_11;
_push(`<!--[-->`);
_push(ssrRenderComponent(_component_HeroSection, null, null, _parent));
_push(`<section class="py-20 bg-surface"><div class="section-container"><h2 class="section-title">居家上门服务,为什么这么难管?</h2><p class="section-subtitle">申请流程乱、评估标准不一、派单靠经验、上门难监管、质量难追溯、结算不规范</p><div class="grid md:grid-cols-3 gap-8 mt-12"><!--[-->`);
ssrRenderList(unref(painPoints), (p) => {
_push(ssrRenderComponent(_component_PainPointCard, mergeProps({
key: p.title
}, { ref_for: true }, p), null, _parent));
});
_push(`<!--]--></div></div></section><section class="py-20 bg-white"><div class="section-container"><h2 class="section-title">一套平台,打通居家服务全流程</h2><p class="section-subtitle">从服务申请到结算归档,每个环节都可监管、可追溯、可评价</p><img src="https://loremflickr.com/1024/400/technology" alt="平台概览示意图(示意素材,待替换)" class="mt-12 rounded-2xl shadow-lg w-full" width="1024" height="400" loading="lazy"></div></section><section class="py-20 bg-surface"><div class="section-container"><h2 class="section-title">完整服务闭环</h2><p class="section-subtitle">8 个阶段无缝衔接,每个节点都可监管、可追溯</p>`);
_push(ssrRenderComponent(_component_ServiceLoopFlow, { class: "mt-12" }, null, _parent));
_push(`</div></section><section class="py-20 bg-white"><div class="section-container"><h2 class="section-title">八大核心能力</h2><p class="section-subtitle">覆盖居家上门服务完整业务链路</p><div class="grid md:grid-cols-2 lg:grid-cols-4 gap-6 mt-12"><!--[-->`);
ssrRenderList(unref(capabilities), (c) => {
_push(ssrRenderComponent(_component_CapabilityCard, mergeProps({
key: c.title
}, { ref_for: true }, c), null, _parent));
});
_push(`<!--]--></div></div></section><section class="py-20 bg-surface"><div class="section-container"><h2 class="section-title">三端协同,角色分明</h2><p class="section-subtitle">家属端、服务端、管理端各司其职</p>`);
_push(ssrRenderComponent(_component_TriEndDisplay, { class: "mt-12" }, null, _parent));
_push(`</div></section><section class="py-20 bg-white"><div class="section-container"><h2 class="section-title">覆盖五大应用场景</h2><p class="section-subtitle">适配不同机构类型的业务需求</p><div class="grid md:grid-cols-2 lg:grid-cols-3 gap-6 mt-12"><!--[-->`);
ssrRenderList(unref(scenarios), (s) => {
_push(ssrRenderComponent(_component_ScenarioCard, mergeProps({
key: s.title
}, { ref_for: true }, s), null, _parent));
});
_push(`<!--]--></div></div></section><section class="py-20 bg-surface"><div class="section-container"><h2 class="section-title">实时监管,数据驱动</h2><p class="section-subtitle">运营数据一目了然,异常预警即时通知</p>`);
_push(ssrRenderComponent(_component_DataDashboard, { class: "mt-12" }, null, _parent));
_push(`</div></section><section class="py-20 bg-white"><div class="section-container"><h2 class="section-title">医疗级安全合规</h2><p class="section-subtitle">数据安全与合规体系,满足政企医疗行业标准</p>`);
_push(ssrRenderComponent(_component_SecurityGrid, { class: "mt-12" }, null, _parent));
_push(`</div></section><section class="py-20 bg-surface"><div class="section-container"><h2 class="section-title">平台建设价值</h2>`);
_push(ssrRenderComponent(_component_ValueMetrics, { class: "mt-12" }, null, _parent));
_push(`</div></section><section class="py-20 bg-white"><div class="section-container text-center"><h2 class="section-title">获取完整方案</h2><p class="section-subtitle">下载解决方案 PDF、白皮书和产品介绍资料</p>`);
_push(ssrRenderComponent(_component_DownloadForm, { class: "mt-8" }, null, _parent));
_push(`</div></section>`);
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(ssrRenderComponent(_component_MobileBottomCTA, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/index.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=index-BDL6Z3sD.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,193 @@
import { n as navigateTo, _ as __nuxt_component_0 } from "../server.mjs";
import { _ as _sfc_main$1 } from "./AppIcon--JRwwp2l.js";
import { defineComponent, ref, withAsyncContext, mergeProps, withCtx, createVNode, createTextVNode, toDisplayString, unref, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderComponent, ssrRenderList, ssrInterpolate, ssrRenderAttr, ssrIncludeBooleanAttr } from "vue/server-renderer";
import { u as usePlatformAuth } from "./usePlatformAuth-DS6-BJES.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "index",
__ssrInlineRender: true,
async setup(__props) {
let __temp, __restore;
const { isLoggedIn, user, ROLES } = usePlatformAuth();
const stats = ref({});
ref([]);
const activeMenu = ref("dashboard");
if (!isLoggedIn.value) {
[__temp, __restore] = withAsyncContext(() => navigateTo("/platform/login")), await __temp, __restore();
}
const menuItems = [
{ key: "dashboard", label: "工作台", icon: "chart" },
{ key: "applications", label: "服务申请", icon: "clipboard", href: "/platform/applications" },
{ key: "work-orders", label: "工单管理", icon: "document", href: "/platform/work-orders" }
];
const roleMenus = {
RECEPTIONIST: ["applications"],
ASSESSOR: ["applications"],
DISPATCHER: ["work-orders"],
STAFF: ["work-orders"],
SETTLER: ["dashboard"],
SUPERVISOR: ["dashboard"],
ADMIN: ["applications", "work-orders"]
};
return (_ctx, _push, _parent, _attrs) => {
const _component_NuxtLink = __nuxt_component_0;
const _component_AppIcon = _sfc_main$1;
_push(`<div${ssrRenderAttrs(mergeProps({ class: "min-h-screen bg-surface flex" }, _attrs))}><aside class="hidden lg:flex flex-col w-56 bg-white border-r shrink-0"><div class="p-4 border-b">`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/platform",
class: "flex items-center gap-2 font-bold text-primary"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="w-8 h-8 rounded-lg bg-primary flex items-center justify-center text-white text-xs font-mono"${_scopeId}>H</div><span class="text-sm"${_scopeId}>智慧医养平台</span>`);
} else {
return [
createVNode("div", { class: "w-8 h-8 rounded-lg bg-primary flex items-center justify-center text-white text-xs font-mono" }, "H"),
createVNode("span", { class: "text-sm" }, "智慧医养平台")
];
}
}),
_: 1
}, _parent));
_push(`</div><nav class="flex-1 p-3 space-y-1"><!--[-->`);
ssrRenderList(menuItems, (m) => {
_push(ssrRenderComponent(_component_NuxtLink, {
key: m.key,
to: m.href || "/platform",
class: ["flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm transition-colors", activeMenu.value === m.key ? "bg-primary-50 text-primary font-medium" : "text-text-secondary hover:bg-gray-50"]
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(ssrRenderComponent(_component_AppIcon, {
name: m.icon,
class: "w-4 h-4"
}, null, _parent2, _scopeId));
_push2(` ${ssrInterpolate(m.label)}`);
} else {
return [
createVNode(_component_AppIcon, {
name: m.icon,
class: "w-4 h-4"
}, null, 8, ["name"]),
createTextVNode(" " + toDisplayString(m.label), 1)
];
}
}),
_: 2
}, _parent));
});
_push(`<!--]--></nav><div class="p-3 border-t"><div class="flex items-center gap-2 px-3 py-2 text-sm"><div class="w-7 h-7 rounded-full bg-primary-50 text-primary flex items-center justify-center text-xs font-bold">${ssrInterpolate(unref(user)?.userName?.charAt(0))}</div><div class="min-w-0"><div class="text-xs font-medium truncate">${ssrInterpolate(unref(user)?.userName)}</div><select class="text-xs text-text-secondary bg-transparent border-none outline-none cursor-pointer"><!--[-->`);
ssrRenderList(unref(ROLES), (r) => {
_push(`<option${ssrRenderAttr("value", r.key)}${ssrIncludeBooleanAttr(unref(user)?.userRole === r.key) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select></div></div><button class="w-full mt-2 px-3 py-2 text-xs text-text-secondary hover:text-red-500 transition-colors text-left rounded-lg hover:bg-red-50">退出登录</button></div></aside><main class="flex-1 overflow-auto"><div class="lg:hidden bg-white border-b px-4 py-3 flex items-center justify-between">`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/platform",
class: "font-bold text-primary text-sm"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`智慧医养平台`);
} else {
return [
createTextVNode("智慧医养平台")
];
}
}),
_: 1
}, _parent));
_push(`<div class="flex items-center gap-2"><select class="text-xs border rounded-lg px-2 py-1 outline-none"><!--[-->`);
ssrRenderList(unref(ROLES), (r) => {
_push(`<option${ssrRenderAttr("value", r.key)}${ssrIncludeBooleanAttr(unref(user)?.userRole === r.key) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select><button class="text-xs text-red-500">退出</button></div></div><div class="p-4 lg:p-8"><h2 class="text-xl font-bold mb-6">工作台 — ${ssrInterpolate(unref(ROLES).find((r) => r.key === unref(user)?.userRole)?.label || unref(user)?.userRole)}</h2><div class="grid grid-cols-2 lg:grid-cols-4 gap-4 mb-8"><div class="bg-white rounded-xl p-4 shadow-sm border"><div class="text-2xl font-bold font-mono text-primary">${ssrInterpolate(stats.value.todayOrders || "--")}</div><div class="text-xs text-text-secondary mt-1">今日工单</div></div><div class="bg-white rounded-xl p-4 shadow-sm border"><div class="text-2xl font-bold font-mono text-accent-700">${ssrInterpolate(stats.value.inProgress || "--")}</div><div class="text-xs text-text-secondary mt-1">进行中</div></div><div class="bg-white rounded-xl p-4 shadow-sm border"><div class="text-2xl font-bold font-mono text-green-600">${ssrInterpolate(stats.value.completedToday || "--")}</div><div class="text-xs text-text-secondary mt-1">已完成</div></div><div class="bg-white rounded-xl p-4 shadow-sm border"><div class="text-2xl font-bold font-mono text-red-500">${ssrInterpolate(stats.value.exceptions || "--")}</div><div class="text-xs text-text-secondary mt-1">异常</div></div></div><div class="grid lg:grid-cols-2 gap-6"><div class="bg-white rounded-2xl shadow-sm border p-6"><h3 class="font-bold mb-4">快捷操作</h3><div class="grid grid-cols-2 gap-3">`);
if (["RECEPTIONIST", "ADMIN"].includes(unref(user)?.userRole || "")) {
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/platform/applications",
class: "p-4 rounded-xl bg-primary-50 text-primary text-sm font-medium hover:bg-primary hover:text-white transition-colors text-center"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`受理新申请`);
} else {
return [
createTextVNode("受理新申请")
];
}
}),
_: 1
}, _parent));
} else {
_push(`<!---->`);
}
if (["DISPATCHER", "ADMIN"].includes(unref(user)?.userRole || "")) {
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/platform/work-orders",
class: "p-4 rounded-xl bg-accent-50 text-accent-700 text-sm font-medium hover:bg-accent hover:text-white transition-colors text-center"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`查看工单`);
} else {
return [
createTextVNode("查看工单")
];
}
}),
_: 1
}, _parent));
} else {
_push(`<!---->`);
}
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/demo",
class: "p-4 rounded-xl bg-gray-50 text-text-secondary text-sm font-medium hover:bg-gray-100 transition-colors text-center"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`平台演示`);
} else {
return [
createTextVNode("平台演示")
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/",
class: "p-4 rounded-xl bg-gray-50 text-text-secondary text-sm font-medium hover:bg-gray-100 transition-colors text-center"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`返回官网`);
} else {
return [
createTextVNode("返回官网")
];
}
}),
_: 1
}, _parent));
_push(`</div></div><div class="bg-white rounded-2xl shadow-sm border p-6"><h3 class="font-bold mb-4">当前角色权限</h3><div class="space-y-2 text-sm"><div class="flex justify-between py-2 border-b border-gray-50"><span class="text-text-secondary">角色</span><span class="font-medium">${ssrInterpolate(unref(ROLES).find((r) => r.key === unref(user)?.userRole)?.label)}</span></div><div class="flex justify-between py-2 border-b border-gray-50"><span class="text-text-secondary">可操作模块</span><span class="font-medium">${ssrInterpolate((roleMenus[unref(user)?.userRole || ""] || ["dashboard"]).join(", "))}</span></div><div class="flex justify-between py-2"><span class="text-text-secondary">数据范围</span><span class="font-medium">本机构</span></div></div></div></div></div></main></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/platform/index.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=index-kIYeHZWZ.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
const MobileBottomCTA_vue_vue_type_style_index_0_scoped_f60dad24_lang = ".safe-area-bottom[data-v-f60dad24]{padding-bottom:max(.75rem,env(safe-area-inset-bottom))}";
export {
MobileBottomCTA_vue_vue_type_style_index_0_scoped_f60dad24_lang as default
};
//# sourceMappingURL=index-styles-1.mjs-DmGDOtnw.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index-styles-1.mjs-DmGDOtnw.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}

View File

@@ -0,0 +1 @@
{"file":"index-styles-1.mjs-DmGDOtnw.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}

View File

@@ -0,0 +1,4 @@
import style_0 from "./index-styles-1.mjs-DmGDOtnw.js";
export default [
style_0
]

View File

@@ -0,0 +1,45 @@
import { defineComponent, ref, mergeProps, unref, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrRenderList, ssrRenderClass, ssrInterpolate, ssrIncludeBooleanAttr } from "vue/server-renderer";
import { u as usePlatformAuth } from "./usePlatformAuth-DS6-BJES.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "../server.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "login",
__ssrInlineRender: true,
setup(__props) {
const { PRESET_USERS } = usePlatformAuth();
const selected = ref("admin");
const loading = ref(false);
const error = ref("");
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "min-h-screen bg-surface flex items-center justify-center p-4" }, _attrs))}><div class="w-full max-w-md"><div class="text-center mb-8"><div class="w-16 h-16 mx-auto mb-4 rounded-2xl bg-gradient-to-br from-primary to-accent flex items-center justify-center"><span class="text-white font-bold text-2xl font-mono">H</span></div><h1 class="text-2xl font-bold">智慧医养居家上门服务平台</h1><p class="text-text-secondary text-sm mt-2">演示环境 — 选择角色即可登录</p></div><div class="bg-white rounded-2xl shadow-sm border p-6 space-y-4"><label class="block text-sm font-medium text-text-secondary">选择登录角色</label><div class="grid grid-cols-2 gap-2"><!--[-->`);
ssrRenderList(unref(PRESET_USERS), (u, k) => {
_push(`<button class="${ssrRenderClass([selected.value === k ? "border-primary bg-primary-50 text-primary" : "border-gray-100 hover:border-gray-200", "text-left px-4 py-3 rounded-xl border-2 transition-all text-sm"])}"><div class="font-medium">${ssrInterpolate(u.userName)}</div><div class="text-xs text-text-secondary">${ssrInterpolate(u.userRole)}</div></button>`);
});
_push(`<!--]--></div>`);
if (error.value) {
_push(`<p class="text-red-500 text-sm text-center">${ssrInterpolate(error.value)}</p>`);
} else {
_push(`<!---->`);
}
_push(`<button${ssrIncludeBooleanAttr(loading.value) ? " disabled" : ""} class="w-full py-3 bg-primary text-white rounded-xl font-semibold hover:bg-primary-700 transition-colors disabled:opacity-50">${ssrInterpolate(loading.value ? "登录中..." : "进入平台")}</button><p class="text-xs text-text-secondary text-center"> 演示环境使用 Header 认证,无需密码。选择角色后直接进入对应工作台。 </p></div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/platform/login.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=login-Bp9OHacV.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"login-Bp9OHacV.js","sources":["../../../../pages/platform/login.vue"],"sourcesContent":["\n<script setup lang=\"ts\">\ndefinePageMeta({ ssr: false })\nimport { ref } from 'vue'\nimport { usePlatformAuth } from '~/composables/usePlatformAuth'\nconst { login, PRESET_USERS } = usePlatformAuth()\nconst selected = ref('admin')\nconst loading = ref(false)\nconst error = ref('')\n\nasync function doLogin() {\n loading.value = true; error.value = ''\n const u = login(selected.value)\n if (u) {\n await navigateTo('/platform')\n } else {\n error.value = '登录失败'\n }\n loading.value = false\n}\n</script>\n\n<template>\n <div class=\"min-h-screen bg-surface flex items-center justify-center p-4\">\n <div class=\"w-full max-w-md\">\n <div class=\"text-center mb-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-gradient-to-br from-primary to-accent flex items-center justify-center\">\n <span class=\"text-white font-bold text-2xl font-mono\">H</span>\n </div>\n <h1 class=\"text-2xl font-bold\">智慧医养居家上门服务平台</h1>\n <p class=\"text-text-secondary text-sm mt-2\">演示环境 — 选择角色即可登录</p>\n </div>\n\n <div class=\"bg-white rounded-2xl shadow-sm border p-6 space-y-4\">\n <label class=\"block text-sm font-medium text-text-secondary\">选择登录角色</label>\n <div class=\"grid grid-cols-2 gap-2\">\n <button v-for=\"(u, k) in PRESET_USERS\" :key=\"k\"\n @click=\"selected = k\"\n class=\"text-left px-4 py-3 rounded-xl border-2 transition-all text-sm\"\n :class=\"selected === k ? 'border-primary bg-primary-50 text-primary' : 'border-gray-100 hover:border-gray-200'\">\n <div class=\"font-medium\">{{ u.userName }}</div>\n <div class=\"text-xs text-text-secondary\">{{ u.userRole }}</div>\n </button>\n </div>\n\n <p v-if=\"error\" class=\"text-red-500 text-sm text-center\">{{ error }}</p>\n\n <button @click=\"doLogin\" :disabled=\"loading\"\n class=\"w-full py-3 bg-primary text-white rounded-xl font-semibold hover:bg-primary-700 transition-colors disabled:opacity-50\">\n {{ loading ? '登录中...' : '进入平台' }}\n </button>\n\n <p class=\"text-xs text-text-secondary text-center\">\n 演示环境使用 Header 认证,无需密码。选择角色后直接进入对应工作台。\n </p>\n </div>\n </div>\n </div>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps","_unref","_ssrRenderClass","_ssrInterpolate"],"mappings":";;;;;;;;;;;;;;;;AAKA,UAAM,EAAS,aAAA,IAAiB,gBAAA;AAChC,UAAM,WAAW,IAAI,OAAO;AAC5B,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,QAAQ,IAAI,EAAE;;AAeb,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,kEAA8D,MAAA,CAAA,CAAA,yiBAAA;oBAaxCC,MAAA,YAAA,GAAY,CAArB,GAAG,MAAC;gCAGVC,eAAA,CAAA,SAAA,UAAa,IAAC,8CAAA,yCAAA,gEAAA,CAAA,+BACMC,eAAA,EAAE,QAAQ,mDACMA,eAAA,EAAE,QAAQ;;;UAIjD,MAAA,OAAK;4EAA8C,MAAA,KAAK,CAAA,MAAA;AAAA;;;4CAE7B,QAAA,KAAO,IAAA,cAAA,mJAEtC,QAAA,QAAO,WAAA,MAAA;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"login-Bp9OHacV.js","mappings":";;;;;;;;;;;;;;;;AAKA,UAAM,EAAS,aAAA,IAAiB,gBAAA;AAChC,UAAM,WAAW,IAAI,OAAO;AAC5B,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,QAAQ,IAAI,EAAE;;AAeb,YAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,kEAA8D,MAAA,CAAA,CAAA,yiBAAA;oBAaxCC,MAAA,YAAA,GAAY,CAArB,GAAG,MAAC;gCAGVC,eAAA,CAAA,SAAA,UAAa,IAAC,8CAAA,yCAAA,gEAAA,CAAA,+BACMC,eAAA,EAAE,QAAQ,mDACMA,eAAA,EAAE,QAAQ;;;UAIjD,MAAA,OAAK;4EAA8C,MAAA,KAAK,CAAA,MAAA;AAAA;;;4CAE7B,QAAA,KAAO,IAAA,cAAA,mJAEtC,QAAA,QAAO,WAAA,MAAA;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps","_unref","_ssrRenderClass","_ssrInterpolate"],"sources":["../../../../pages/platform/login.vue"],"sourcesContent":["\n<script setup lang=\"ts\">\ndefinePageMeta({ ssr: false })\nimport { ref } from 'vue'\nimport { usePlatformAuth } from '~/composables/usePlatformAuth'\nconst { login, PRESET_USERS } = usePlatformAuth()\nconst selected = ref('admin')\nconst loading = ref(false)\nconst error = ref('')\n\nasync function doLogin() {\n loading.value = true; error.value = ''\n const u = login(selected.value)\n if (u) {\n await navigateTo('/platform')\n } else {\n error.value = '登录失败'\n }\n loading.value = false\n}\n</script>\n\n<template>\n <div class=\"min-h-screen bg-surface flex items-center justify-center p-4\">\n <div class=\"w-full max-w-md\">\n <div class=\"text-center mb-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 rounded-2xl bg-gradient-to-br from-primary to-accent flex items-center justify-center\">\n <span class=\"text-white font-bold text-2xl font-mono\">H</span>\n </div>\n <h1 class=\"text-2xl font-bold\">智慧医养居家上门服务平台</h1>\n <p class=\"text-text-secondary text-sm mt-2\">演示环境 — 选择角色即可登录</p>\n </div>\n\n <div class=\"bg-white rounded-2xl shadow-sm border p-6 space-y-4\">\n <label class=\"block text-sm font-medium text-text-secondary\">选择登录角色</label>\n <div class=\"grid grid-cols-2 gap-2\">\n <button v-for=\"(u, k) in PRESET_USERS\" :key=\"k\"\n @click=\"selected = k\"\n class=\"text-left px-4 py-3 rounded-xl border-2 transition-all text-sm\"\n :class=\"selected === k ? 'border-primary bg-primary-50 text-primary' : 'border-gray-100 hover:border-gray-200'\">\n <div class=\"font-medium\">{{ u.userName }}</div>\n <div class=\"text-xs text-text-secondary\">{{ u.userRole }}</div>\n </button>\n </div>\n\n <p v-if=\"error\" class=\"text-red-500 text-sm text-center\">{{ error }}</p>\n\n <button @click=\"doLogin\" :disabled=\"loading\"\n class=\"w-full py-3 bg-primary text-white rounded-xl font-semibold hover:bg-primary-700 transition-colors disabled:opacity-50\">\n {{ loading ? '登录中...' : '进入平台' }}\n </button>\n\n <p class=\"text-xs text-text-secondary text-center\">\n 演示环境使用 Header 认证,无需密码。选择角色后直接进入对应工作台。\n </p>\n </div>\n </div>\n </div>\n</template>\n"],"version":3}

View File

@@ -0,0 +1,71 @@
import { defineComponent, mergeProps, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrInterpolate, ssrRenderList, ssrRenderComponent } from "vue/server-renderer";
import { _ as _sfc_main$2 } from "./DownloadForm-DWoM9wYa.js";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import "./useLeadForm-hNHTDEhY.js";
import "../server.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "ResourceCard",
__ssrInlineRender: true,
props: {
title: {},
desc: {},
type: {}
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-surface rounded-2xl p-8 border border-gray-100 hover:shadow-md transition-all duration-300" }, _attrs))}><div class="w-12 h-12 rounded-lg bg-primary-50 flex items-center justify-center mb-4"><svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"></path></svg></div><h3 class="font-bold text-lg mb-2">${ssrInterpolate(__props.title)}</h3><p class="text-sm text-text-secondary mb-4">${ssrInterpolate(__props.desc)}</p><span class="text-primary font-medium text-sm hover:underline cursor-pointer">下载 ${ssrInterpolate(__props.type)}</span></div>`);
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/ResourceCard.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const resources = [
{ title: "平台解决方案", desc: "完整的平台能力介绍、服务闭环说明和技术架构概览", type: "PDF" },
{ title: "产品介绍白皮书", desc: "行业背景、平台定位、核心功能和建设价值详细说明", type: "PDF" },
{ title: "部署与对接指南", desc: "技术部署方案、API 对接说明和运维要求", type: "PDF" }
];
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "resources",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "资源中心", description: "下载解决方案 PDF、白皮书、产品介绍资料获取最新政策解读和行业洞察。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_ResourceCard = _sfc_main$1;
const _component_DownloadForm = _sfc_main$2;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">资源中心</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">下载解决方案、白皮书和产品资料</p></div></section><section class="py-20 bg-surface"><div class="section-container"><div class="grid md:grid-cols-3 gap-6"><!--[-->`);
ssrRenderList(resources, (r) => {
_push(ssrRenderComponent(_component_ResourceCard, mergeProps({
key: r.title
}, { ref_for: true }, r), null, _parent));
});
_push(`<!--]--></div></div></section><section class="py-20 bg-white"><div class="section-container text-center"><h2 class="section-title">获取完整方案资料</h2>`);
_push(ssrRenderComponent(_component_DownloadForm, { class: "mt-8" }, null, _parent));
_push(`</div></section><!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/resources.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=resources-a5Wv6dYO.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"resources-a5Wv6dYO.js","sources":["../../../../components/ResourceCard.vue","../../../../pages/resources.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ title: string; desc: string; type: string }>()\n</script>\n\n<template>\n <div class=\"bg-surface rounded-2xl p-8 border border-gray-100 hover:shadow-md transition-all duration-300\">\n <div class=\"w-12 h-12 rounded-lg bg-primary-50 flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 class=\"font-bold text-lg mb-2\">{{ title }}</h3>\n <p class=\"text-sm text-text-secondary mb-4\">{{ desc }}</p>\n <span class=\"text-primary font-medium text-sm hover:underline cursor-pointer\">下载 {{ type }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nuseSeo({ title: '资源中心', description: '下载解决方案 PDF、白皮书、产品介绍资料获取最新政策解读和行业洞察。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">资源中心</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">下载解决方案、白皮书和产品资料</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <div class=\"grid md:grid-cols-3 gap-6\">\n <ResourceCard v-for=\"r in resources\" :key=\"r.title\" v-bind=\"r\" />\n </div>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container text-center\">\n <h2 class=\"section-title\">获取完整方案资料</h2>\n <DownloadForm class=\"mt-8\" />\n </div>\n </section>\n</template>\n\n<script lang=\"ts\">\nconst resources = [\n { title: '平台解决方案', desc: '完整的平台能力介绍、服务闭环说明和技术架构概览', type: 'PDF' },\n { title: '产品介绍白皮书', desc: '行业背景、平台定位、核心功能和建设价值详细说明', type: 'PDF' },\n { title: '部署与对接指南', desc: '技术部署方案、API 对接说明和运维要求', type: 'PDF' },\n]\n</script>\n"],"names":["_ssrRenderAttrs","_mergeProps","_ssrRenderList","_ssrRenderComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;mBAKOA,eAAAC,WAAA,EAAA,OAAM,mGAA+F,MAAA,CAAA,6aAMlE,QAAA,KAAK,oEACI,QAAA,IAAI,wGACiC,QAAA,IAAI;;;;;;;;;;ACiB5F,MAAM,YAAY;AAAA,EAChB,EAAE,OAAO,UAAU,MAAM,2BAA2B,MAAM,MAAA;AAAA,EAC1D,EAAE,OAAO,WAAW,MAAM,2BAA2B,MAAM,MAAA;AAAA,EAC3D,EAAE,OAAO,WAAW,MAAM,wBAAwB,MAAM,MAAA;AAC1D;;;;;AAhCA,WAAO,EAAE,OAAO,QAAQ,aAAa,wCAAwC;;;;;AAc3CC,oBAAA,YAAL,MAAC;;UAAgB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;AAQjD,YAAAC,mBAAA,yBAAA,EAAA,OAAM,UAAM,MAAA,OAAA,CAAA;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"resources-a5Wv6dYO.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;mBAKOA,eAAAC,WAAA,EAAA,OAAM,mGAA+F,MAAA,CAAA,6aAMlE,QAAA,KAAK,oEACI,QAAA,IAAI,wGACiC,QAAA,IAAI;;;;;;;;;;ACiB5F,MAAM,YAAY;AAAA,EAChB,EAAE,OAAO,UAAU,MAAM,2BAA2B,MAAM,MAAA;AAAA,EAC1D,EAAE,OAAO,WAAW,MAAM,2BAA2B,MAAM,MAAA;AAAA,EAC3D,EAAE,OAAO,WAAW,MAAM,wBAAwB,MAAM,MAAA;AAC1D;;;;;AAhCA,WAAO,EAAE,OAAO,QAAQ,aAAa,wCAAwC;;;;;AAc3CC,oBAAA,YAAL,MAAC;;UAAgB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;AAQjD,YAAAC,mBAAA,yBAAA,EAAA,OAAM,UAAM,MAAA,OAAA,CAAA;;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps","_ssrRenderList","_ssrRenderComponent"],"sources":["../../../../components/ResourceCard.vue","../../../../pages/resources.vue"],"sourcesContent":["<script setup lang=\"ts\">\ndefineProps<{ title: string; desc: string; type: string }>()\n</script>\n\n<template>\n <div class=\"bg-surface rounded-2xl p-8 border border-gray-100 hover:shadow-md transition-all duration-300\">\n <div class=\"w-12 h-12 rounded-lg bg-primary-50 flex items-center justify-center mb-4\">\n <svg class=\"w-6 h-6 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 class=\"font-bold text-lg mb-2\">{{ title }}</h3>\n <p class=\"text-sm text-text-secondary mb-4\">{{ desc }}</p>\n <span class=\"text-primary font-medium text-sm hover:underline cursor-pointer\">下载 {{ type }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nuseSeo({ title: '资源中心', description: '下载解决方案 PDF、白皮书、产品介绍资料获取最新政策解读和行业洞察。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">资源中心</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">下载解决方案、白皮书和产品资料</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <div class=\"grid md:grid-cols-3 gap-6\">\n <ResourceCard v-for=\"r in resources\" :key=\"r.title\" v-bind=\"r\" />\n </div>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container text-center\">\n <h2 class=\"section-title\">获取完整方案资料</h2>\n <DownloadForm class=\"mt-8\" />\n </div>\n </section>\n</template>\n\n<script lang=\"ts\">\nconst resources = [\n { title: '平台解决方案', desc: '完整的平台能力介绍、服务闭环说明和技术架构概览', type: 'PDF' },\n { title: '产品介绍白皮书', desc: '行业背景、平台定位、核心功能和建设价值详细说明', type: 'PDF' },\n { title: '部署与对接指南', desc: '技术部署方案、API 对接说明和运维要求', type: 'PDF' },\n]\n</script>\n"],"version":3}

View File

@@ -0,0 +1,47 @@
import { _ as _sfc_main$1 } from "./ScenarioCard-KNU_bnPj.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { defineComponent, unref, mergeProps, useSSRContext } from "vue";
import { ssrRenderList, ssrRenderComponent } from "vue/server-renderer";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import { s as scenarios } from "../server.mjs";
import "./AppIcon--JRwwp2l.js";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "scenarios",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "应用场景", description: "覆盖政府监管、医院延续护理、养老机构、社区服务中心、长护险管理五大应用场景。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_ScenarioCard = _sfc_main$1;
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">应用场景</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">适配不同机构类型的业务需求</p></div></section><section class="py-20 bg-surface"><div class="section-container"><div class="grid md:grid-cols-2 lg:grid-cols-3 gap-6"><!--[-->`);
ssrRenderList(unref(scenarios), (s) => {
_push(ssrRenderComponent(_component_ScenarioCard, mergeProps({
key: s.title
}, { ref_for: true }, s), null, _parent));
});
_push(`<!--]--></div></div></section>`);
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/scenarios.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=scenarios-c-hTY43N.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"scenarios-c-hTY43N.js","sources":["../../../../pages/scenarios.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { scenarios } from '~/data/siteContent'\nuseSeo({ title: '应用场景', description: '覆盖政府监管、医院延续护理、养老机构、社区服务中心、长护险管理五大应用场景。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">应用场景</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">适配不同机构类型的业务需求</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <div class=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6\">\n <ScenarioCard v-for=\"s in scenarios\" :key=\"s.title\" v-bind=\"s\" />\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"names":["_ssrRenderList","_unref"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAGA,WAAO,EAAE,OAAO,QAAQ,aAAa,0CAA0C;;;;;AAc7CA,oBAAAC,MAAA,SAAA,IAAL,MAAC;;UAAgB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"scenarios-c-hTY43N.js","mappings":";;;;;;;;;;;;;;;;;;;;;AAGA,WAAO,EAAE,OAAO,QAAQ,aAAa,0CAA0C;;;;;AAc7CA,oBAAAC,MAAA,SAAA,IAAL,MAAC;;UAAgB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;;;;;;;;;;;;","names":["_ssrRenderList","_unref"],"sources":["../../../../pages/scenarios.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { scenarios } from '~/data/siteContent'\nuseSeo({ title: '应用场景', description: '覆盖政府监管、医院延续护理、养老机构、社区服务中心、长护险管理五大应用场景。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">应用场景</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">适配不同机构类型的业务需求</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <div class=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6\">\n <ScenarioCard v-for=\"s in scenarios\" :key=\"s.title\" v-bind=\"s\" />\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"version":3}

View File

@@ -0,0 +1,42 @@
import { _ as _sfc_main$1 } from "./SecurityGrid-LoMlH504.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { defineComponent, useSSRContext } from "vue";
import { ssrRenderComponent } from "vue/server-renderer";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import "../server.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "security",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "安全合规", description: "RBAC 权限体系、数据分类分级、授权同意管理、审计日志追溯、脱敏展示、合规留痕。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_SecurityGrid = _sfc_main$1;
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">安全合规</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">医疗级安全合规体系,满足政企、医疗行业标准</p></div></section><section class="py-20 bg-surface"><div class="section-container">`);
_push(ssrRenderComponent(_component_SecurityGrid, null, null, _parent));
_push(`</div></section>`);
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/security.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=security-xgUg9gDm.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"security-xgUg9gDm.js","sources":["../../../../pages/security.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nuseSeo({ title: '安全合规', description: 'RBAC 权限体系、数据分类分级、授权同意管理、审计日志追溯、脱敏展示、合规留痕。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">安全合规</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">医疗级安全合规体系,满足政企、医疗行业标准</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <SecurityGrid />\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,WAAO,EAAE,OAAO,QAAQ,aAAa,6CAA6C;;;;;;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"security-xgUg9gDm.js","mappings":";;;;;;;;;;;;;;;;;;;;AAEA,WAAO,EAAE,OAAO,QAAQ,aAAa,6CAA6C;;;;;;;;;;;;;;;;;;","names":[],"sources":["../../../../pages/security.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nuseSeo({ title: '安全合规', description: 'RBAC 权限体系、数据分类分级、授权同意管理、审计日志追溯、脱敏展示、合规留痕。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">安全合规</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">医疗级安全合规体系,满足政企、医疗行业标准</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <SecurityGrid />\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"version":3}

View File

@@ -0,0 +1,59 @@
import { _ as __nuxt_component_0 } from "./ServiceLoopFlow-BcBowZhS.js";
import { _ as _sfc_main$1 } from "./AppIcon--JRwwp2l.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { defineComponent, useSSRContext } from "vue";
import { ssrRenderComponent } from "vue/server-renderer";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import "../server.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "service-loop",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "服务闭环", description: "8 个阶段无缝衔接:需求受理→能力评估→方案制定→智能派单→上门执行→过程监管→验收评价→结算归档。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_ServiceLoopFlow = __nuxt_component_0;
const _component_AppIcon = _sfc_main$1;
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">服务闭环</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">从申请到归档,每个环节都可监管、可追溯、可评价</p></div></section><section class="py-20 bg-surface"><div class="section-container">`);
_push(ssrRenderComponent(_component_ServiceLoopFlow, null, null, _parent));
_push(`</div></section><section class="py-20 bg-white"><div class="section-container"><h2 class="section-title">数据完整性保障</h2><div class="grid md:grid-cols-3 gap-6 mt-12 text-center"><div class="p-6"><div class="w-12 h-12 mx-auto mb-3 rounded-xl bg-primary-50 text-primary flex items-center justify-center">`);
_push(ssrRenderComponent(_component_AppIcon, {
name: "database",
class: "w-6 h-6"
}, null, _parent));
_push(`</div><h3 class="font-bold mb-2">环节联动</h3><p class="text-sm text-text-secondary">上游数据自动驱动下游,评估结果 → 方案制定,签署生效 → 服务计划</p></div><div class="p-6"><div class="w-12 h-12 mx-auto mb-3 rounded-xl bg-accent-50 text-accent flex items-center justify-center">`);
_push(ssrRenderComponent(_component_AppIcon, {
name: "check",
class: "w-6 h-6"
}, null, _parent));
_push(`</div><h3 class="font-bold mb-2">状态校验</h3><p class="text-sm text-text-secondary">每步流转必须满足前置条件,未签署方案不能生成工单,未验收工单不能结算</p></div><div class="p-6"><div class="w-12 h-12 mx-auto mb-3 rounded-xl bg-cta/10 text-cta flex items-center justify-center">`);
_push(ssrRenderComponent(_component_AppIcon, {
name: "clipboard",
class: "w-6 h-6"
}, null, _parent));
_push(`</div><h3 class="font-bold mb-2">版本可追溯</h3><p class="text-sm text-text-secondary">评估报告、方案快照、价格规则、签署记录全部版本化管理,不可覆盖</p></div></div></div></section>`);
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/service-loop.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=service-loop-DeE-MiwA.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"service-loop-DeE-MiwA.js","sources":["../../../../pages/service-loop.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nuseSeo({ title: '服务闭环', description: '8 个阶段无缝衔接:需求受理→能力评估→方案制定→智能派单→上门执行→过程监管→验收评价→结算归档。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">服务闭环</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">从申请到归档,每个环节都可监管、可追溯、可评价</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <ServiceLoopFlow />\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">数据完整性保障</h2>\n <div class=\"grid md:grid-cols-3 gap-6 mt-12 text-center\">\n <div class=\"p-6\"><div class=\"w-12 h-12 mx-auto mb-3 rounded-xl bg-primary-50 text-primary flex items-center justify-center\"><AppIcon name=\"database\" class=\"w-6 h-6\"/></div><h3 class=\"font-bold mb-2\">环节联动</h3><p class=\"text-sm text-text-secondary\">上游数据自动驱动下游,评估结果 → 方案制定,签署生效 → 服务计划</p></div>\n <div class=\"p-6\"><div class=\"w-12 h-12 mx-auto mb-3 rounded-xl bg-accent-50 text-accent flex items-center justify-center\"><AppIcon name=\"check\" class=\"w-6 h-6\"/></div><h3 class=\"font-bold mb-2\">状态校验</h3><p class=\"text-sm text-text-secondary\">每步流转必须满足前置条件,未签署方案不能生成工单,未验收工单不能结算</p></div>\n <div class=\"p-6\"><div class=\"w-12 h-12 mx-auto mb-3 rounded-xl bg-cta/10 text-cta flex items-center justify-center\"><AppIcon name=\"clipboard\" class=\"w-6 h-6\"/></div><h3 class=\"font-bold mb-2\">版本可追溯</h3><p class=\"text-sm text-text-secondary\">评估报告、方案快照、价格规则、签署记录全部版本化管理,不可覆盖</p></div>\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEA,WAAO,EAAE,OAAO,QAAQ,aAAa,sDAAsD;;;;;;;;;QAqBkD,MAAK;AAAA,QAAW,OAAM;AAAA,MAAA;;;QACxB,MAAK;AAAA,QAAQ,OAAM;AAAA,MAAA;;;QACzB,MAAK;AAAA,QAAY,OAAM;AAAA,MAAA;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"service-loop-DeE-MiwA.js","mappings":";;;;;;;;;;;;;;;;;;;;;AAEA,WAAO,EAAE,OAAO,QAAQ,aAAa,sDAAsD;;;;;;;;;QAqBkD,MAAK;AAAA,QAAW,OAAM;AAAA,MAAA;;;QACxB,MAAK;AAAA,QAAQ,OAAM;AAAA,MAAA;;;QACzB,MAAK;AAAA,QAAY,OAAM;AAAA,MAAA;;;;;;;;;;;;;","names":[],"sources":["../../../../pages/service-loop.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nuseSeo({ title: '服务闭环', description: '8 个阶段无缝衔接:需求受理→能力评估→方案制定→智能派单→上门执行→过程监管→验收评价→结算归档。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">服务闭环</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">从申请到归档,每个环节都可监管、可追溯、可评价</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <ServiceLoopFlow />\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">数据完整性保障</h2>\n <div class=\"grid md:grid-cols-3 gap-6 mt-12 text-center\">\n <div class=\"p-6\"><div class=\"w-12 h-12 mx-auto mb-3 rounded-xl bg-primary-50 text-primary flex items-center justify-center\"><AppIcon name=\"database\" class=\"w-6 h-6\"/></div><h3 class=\"font-bold mb-2\">环节联动</h3><p class=\"text-sm text-text-secondary\">上游数据自动驱动下游,评估结果 → 方案制定,签署生效 → 服务计划</p></div>\n <div class=\"p-6\"><div class=\"w-12 h-12 mx-auto mb-3 rounded-xl bg-accent-50 text-accent flex items-center justify-center\"><AppIcon name=\"check\" class=\"w-6 h-6\"/></div><h3 class=\"font-bold mb-2\">状态校验</h3><p class=\"text-sm text-text-secondary\">每步流转必须满足前置条件,未签署方案不能生成工单,未验收工单不能结算</p></div>\n <div class=\"p-6\"><div class=\"w-12 h-12 mx-auto mb-3 rounded-xl bg-cta/10 text-cta flex items-center justify-center\"><AppIcon name=\"clipboard\" class=\"w-6 h-6\"/></div><h3 class=\"font-bold mb-2\">版本可追溯</h3><p class=\"text-sm text-text-secondary\">评估报告、方案快照、价格规则、签署记录全部版本化管理,不可覆盖</p></div>\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n"],"version":3}

View File

@@ -0,0 +1,63 @@
import { _ as _sfc_main$1 } from "./PainPointCard-Lm1N0rdZ.js";
import { _ as _sfc_main$2 } from "./AppIcon--JRwwp2l.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { defineComponent, unref, mergeProps, useSSRContext } from "vue";
import { ssrRenderList, ssrRenderComponent, ssrInterpolate } from "vue/server-renderer";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import { p as painPoints } from "../server.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const solutions = [
{ icon: "database", title: "全流程打通", desc: "从申请到归档,一套平台覆盖所有业务环节,消除信息孤岛。" },
{ icon: "cog", title: "智能调度", desc: "算法匹配推荐,人工确认兜底,提升派单效率和公平性。" },
{ icon: "phone", title: "移动端执行", desc: "服务人员通过 Delivery 端完成接单、签到、执行、异常上报。" },
{ icon: "chart", title: "数据监管", desc: "实时看板、异常预警、质量分析,数据驱动管理决策。" }
];
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "solution",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "解决方案", description: "一套平台打通居家服务全流程,解决申请受理难、派单调度难、过程监管难等核心痛点。" });
return (_ctx, _push, _parent, _attrs) => {
const _component_PainPointCard = _sfc_main$1;
const _component_AppIcon = _sfc_main$2;
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container text-center"><h1 class="text-4xl md:text-5xl font-bold mb-4">解决方案</h1><p class="text-xl text-blue-100 max-w-2xl mx-auto">一套平台打通居家服务全流程,解决行业核心痛点</p></div></section><section class="py-20 bg-surface"><div class="section-container"><h2 class="section-title">行业痛点</h2><div class="grid md:grid-cols-3 gap-8 mt-12"><!--[-->`);
ssrRenderList(unref(painPoints), (p) => {
_push(ssrRenderComponent(_component_PainPointCard, mergeProps({
key: p.title
}, { ref_for: true }, p), null, _parent));
});
_push(`<!--]--></div></div></section><section class="py-20 bg-white"><div class="section-container"><h2 class="section-title">平台如何解决</h2><div class="grid md:grid-cols-2 gap-8 mt-12"><!--[-->`);
ssrRenderList(solutions, (s) => {
_push(`<div class="flex gap-4"><div class="w-12 h-12 rounded-xl bg-primary-50 text-primary flex items-center justify-center shrink-0">`);
_push(ssrRenderComponent(_component_AppIcon, {
name: s.icon,
class: "w-6 h-6"
}, null, _parent));
_push(`</div><div><h3 class="font-bold text-xl mb-2">${ssrInterpolate(s.title)}</h3><p class="text-text-secondary">${ssrInterpolate(s.desc)}</p></div></div>`);
});
_push(`<!--]--></div></div></section>`);
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/solution.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=solution-Cdu4og0R.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"solution-Cdu4og0R.js","sources":["../../../../pages/solution.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { painPoints } from '~/data/siteContent'\nuseSeo({ title: '解决方案', description: '一套平台打通居家服务全流程,解决申请受理难、派单调度难、过程监管难等核心痛点。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">解决方案</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">一套平台打通居家服务全流程,解决行业核心痛点</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">行业痛点</h2>\n <div class=\"grid md:grid-cols-3 gap-8 mt-12\">\n <PainPointCard v-for=\"p in painPoints\" :key=\"p.title\" v-bind=\"p\" />\n </div>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">平台如何解决</h2>\n <div class=\"grid md:grid-cols-2 gap-8 mt-12\">\n <div v-for=\"s in solutions\" :key=\"s.title\" class=\"flex gap-4\">\n <div class=\"w-12 h-12 rounded-xl bg-primary-50 text-primary flex items-center justify-center shrink-0\">\n <AppIcon :name=\"s.icon\" class=\"w-6 h-6\" />\n </div>\n <div>\n <h3 class=\"font-bold text-xl mb-2\">{{ s.title }}</h3>\n <p class=\"text-text-secondary\">{{ s.desc }}</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n\n<script lang=\"ts\">\nconst solutions = [\n { icon: 'database', title: '全流程打通', desc: '从申请到归档,一套平台覆盖所有业务环节,消除信息孤岛。' },\n { icon: 'cog', title: '智能调度', desc: '算法匹配推荐,人工确认兜底,提升派单效率和公平性。' },\n { icon: 'phone', title: '移动端执行', desc: '服务人员通过 Delivery 端完成接单、签到、执行、异常上报。' },\n { icon: 'chart', title: '数据监管', desc: '实时看板、异常预警、质量分析,数据驱动管理决策。' },\n]\n</script>\n"],"names":["_ssrRenderList","_unref","_ssrInterpolate"],"mappings":";;;;;;;;;;;;;;;;;AA4CA,MAAM,YAAY;AAAA,EAChB,EAAE,MAAM,YAAY,OAAO,SAAS,MAAM,8BAAA;AAAA,EAC1C,EAAE,MAAM,OAAO,OAAO,QAAQ,MAAM,4BAAA;AAAA,EACpC,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,oCAAA;AAAA,EACvC,EAAE,MAAM,SAAS,OAAO,QAAQ,MAAM,2BAAA;AACxC;;;;;AA9CA,WAAO,EAAE,OAAO,QAAQ,aAAa,2CAA2C;;;;;;AAe7CA,oBAAAC,MAAA,UAAA,IAAL,MAAC;;UAAiB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;AAS9CD,oBAAA,YAAL,MAAC;;;UAEC,MAAM,EAAE;AAAA,UAAM,OAAM;AAAA,QAAA;+DAGQE,eAAA,EAAE,KAAK,wCACXA,eAAA,EAAE,IAAI;;;;;;;;;;;;;;"}

View File

@@ -0,0 +1 @@
{"file":"solution-Cdu4og0R.js","mappings":";;;;;;;;;;;;;;;;;AA4CA,MAAM,YAAY;AAAA,EAChB,EAAE,MAAM,YAAY,OAAO,SAAS,MAAM,8BAAA;AAAA,EAC1C,EAAE,MAAM,OAAO,OAAO,QAAQ,MAAM,4BAAA;AAAA,EACpC,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,oCAAA;AAAA,EACvC,EAAE,MAAM,SAAS,OAAO,QAAQ,MAAM,2BAAA;AACxC;;;;;AA9CA,WAAO,EAAE,OAAO,QAAQ,aAAa,2CAA2C;;;;;;AAe7CA,oBAAAC,MAAA,UAAA,IAAL,MAAC;;UAAiB,KAAK,EAAE;AAAA,QAAA,sBAAe,CAAC,GAAA,MAAA,OAAA,CAAA;AAAA;;AAS9CD,oBAAA,YAAL,MAAC;;;UAEC,MAAM,EAAE;AAAA,UAAM,OAAM;AAAA,QAAA;+DAGQE,eAAA,EAAE,KAAK,wCACXA,eAAA,EAAE,IAAI;;;;;;;;;;;;;;","names":["_ssrRenderList","_unref","_ssrInterpolate"],"sources":["../../../../pages/solution.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useSeo } from '~/composables/useSeo'\nimport { painPoints } from '~/data/siteContent'\nuseSeo({ title: '解决方案', description: '一套平台打通居家服务全流程,解决申请受理难、派单调度难、过程监管难等核心痛点。' })\n</script>\n\n<template>\n <section class=\"py-20 bg-gradient-to-br from-primary-700 to-primary-900 text-white\">\n <div class=\"section-container text-center\">\n <h1 class=\"text-4xl md:text-5xl font-bold mb-4\">解决方案</h1>\n <p class=\"text-xl text-blue-100 max-w-2xl mx-auto\">一套平台打通居家服务全流程,解决行业核心痛点</p>\n </div>\n </section>\n\n <section class=\"py-20 bg-surface\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">行业痛点</h2>\n <div class=\"grid md:grid-cols-3 gap-8 mt-12\">\n <PainPointCard v-for=\"p in painPoints\" :key=\"p.title\" v-bind=\"p\" />\n </div>\n </div>\n </section>\n\n <section class=\"py-20 bg-white\">\n <div class=\"section-container\">\n <h2 class=\"section-title\">平台如何解决</h2>\n <div class=\"grid md:grid-cols-2 gap-8 mt-12\">\n <div v-for=\"s in solutions\" :key=\"s.title\" class=\"flex gap-4\">\n <div class=\"w-12 h-12 rounded-xl bg-primary-50 text-primary flex items-center justify-center shrink-0\">\n <AppIcon :name=\"s.icon\" class=\"w-6 h-6\" />\n </div>\n <div>\n <h3 class=\"font-bold text-xl mb-2\">{{ s.title }}</h3>\n <p class=\"text-text-secondary\">{{ s.desc }}</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n <CtaSection />\n</template>\n\n<script lang=\"ts\">\nconst solutions = [\n { icon: 'database', title: '全流程打通', desc: '从申请到归档,一套平台覆盖所有业务环节,消除信息孤岛。' },\n { icon: 'cog', title: '智能调度', desc: '算法匹配推荐,人工确认兜底,提升派单效率和公平性。' },\n { icon: 'phone', title: '移动端执行', desc: '服务人员通过 Delivery 端完成接单、签到、执行、异常上报。' },\n { icon: 'chart', title: '数据监管', desc: '实时看板、异常预警、质量分析,数据驱动管理决策。' },\n]\n</script>\n"],"version":3}

View File

@@ -0,0 +1,70 @@
import { ref } from "vue";
import { u as useRuntimeConfig } from "../server.mjs";
function isSuccess(code) {
return code === 200 || code === "200" || code === "SUCCESS";
}
function validatePhone(phone) {
return /^1[3-9]\d{9}$/.test(phone);
}
function useLeadForm(type) {
const config = useRuntimeConfig();
const loading = ref(false);
const success = ref(false);
const error = ref("");
const form = ref({
name: "",
orgName: "",
phone: "",
type
});
async function submit() {
error.value = "";
if (!form.value.name.trim()) {
error.value = "请填写姓名";
return;
}
if (!form.value.orgName.trim()) {
error.value = "请填写单位名称";
return;
}
if (!validatePhone(form.value.phone)) {
error.value = "请填写正确的手机号";
return;
}
loading.value = true;
try {
if (config.public.useMockLead) {
await new Promise((resolve) => setTimeout(resolve, 600));
success.value = true;
loading.value = false;
return;
}
const res = await $fetch(`${config.public.apiPrefix}/leads`, {
method: "POST",
body: {
...form.value,
source: "official_website",
submittedAt: (/* @__PURE__ */ new Date()).toISOString()
}
});
if (isSuccess(res.code)) {
success.value = true;
} else {
error.value = res.message || "提交失败,请稍后重试";
}
} catch (e) {
error.value = e?.data?.message || e?.message || "网络异常,请稍后重试";
} finally {
loading.value = false;
}
}
function reset() {
success.value = false;
error.value = "";
}
return { form, loading, success, error, submit, reset };
}
export {
useLeadForm as u
};
//# sourceMappingURL=useLeadForm-hNHTDEhY.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"useLeadForm-hNHTDEhY.js","sources":["../../../../composables/useLeadForm.ts"],"sourcesContent":["import { ref } from 'vue'\n\ntype LeadType = 'demo' | 'download' | 'contact'\n\ntype ApiResponse<T = unknown> = {\n code: number | string\n message: string\n data?: T\n requestId?: string\n timestamp?: string | number\n}\n\nexport type LeadForm = {\n name: string\n orgName: string\n phone: string\n city?: string\n position?: string\n focusArea?: string\n contact?: string\n message?: string\n type: LeadType\n extra?: Record<string, string>\n}\n\nfunction isSuccess(code: number | string): boolean {\n return code === 200 || code === '200' || code === 'SUCCESS'\n}\n\nfunction validatePhone(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone)\n}\n\nexport function useLeadForm(type: LeadType) {\n const config = useRuntimeConfig()\n\n const loading = ref(false)\n const success = ref(false)\n const error = ref('')\n\n const form = ref<LeadForm>({\n name: '',\n orgName: '',\n phone: '',\n type\n })\n\n async function submit() {\n error.value = ''\n\n if (!form.value.name.trim()) {\n error.value = '请填写姓名'\n return\n }\n if (!form.value.orgName.trim()) {\n error.value = '请填写单位名称'\n return\n }\n if (!validatePhone(form.value.phone)) {\n error.value = '请填写正确的手机号'\n return\n }\n\n loading.value = true\n\n try {\n if (config.public.useMockLead) {\n await new Promise(resolve => setTimeout(resolve, 600))\n success.value = true\n loading.value = false\n return\n }\n\n const res = await $fetch<ApiResponse>(`${config.public.apiPrefix}/leads`, {\n method: 'POST',\n body: {\n ...form.value,\n source: 'official_website',\n submittedAt: new Date().toISOString()\n }\n })\n\n if (isSuccess(res.code)) {\n success.value = true\n } else {\n error.value = res.message || '提交失败,请稍后重试'\n }\n } catch (e: any) {\n error.value = e?.data?.message || e?.message || '网络异常,请稍后重试'\n } finally {\n loading.value = false\n }\n }\n\n function reset() {\n success.value = false\n error.value = ''\n }\n\n return { form, loading, success, error, submit, reset }\n}\n"],"names":[],"mappings":";;AAyBA,SAAS,UAAU,MAAgC;AACjD,SAAO,SAAS,OAAO,SAAS,SAAS,SAAS;AACpD;AAEA,SAAS,cAAc,OAAwB;AAC7C,SAAO,gBAAgB,KAAK,KAAK;AACnC;AAEO,SAAS,YAAY,MAAgB;AAC1C,QAAM,SAAS,iBAAA;AAEf,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,QAAQ,IAAI,EAAE;AAEpB,QAAM,OAAO,IAAc;AAAA,IACzB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,EAAA,CACD;AAED,iBAAe,SAAS;AACtB,UAAM,QAAQ;AAEd,QAAI,CAAC,KAAK,MAAM,KAAK,QAAQ;AAC3B,YAAM,QAAQ;AACd;AAAA,IACF;AACA,QAAI,CAAC,KAAK,MAAM,QAAQ,QAAQ;AAC9B,YAAM,QAAQ;AACd;AAAA,IACF;AACA,QAAI,CAAC,cAAc,KAAK,MAAM,KAAK,GAAG;AACpC,YAAM,QAAQ;AACd;AAAA,IACF;AAEA,YAAQ,QAAQ;AAEhB,QAAI;AACF,UAAI,OAAO,OAAO,aAAa;AAC7B,cAAM,IAAI,QAAQ,CAAA,YAAW,WAAW,SAAS,GAAG,CAAC;AACrD,gBAAQ,QAAQ;AAChB,gBAAQ,QAAQ;AAChB;AAAA,MACF;AAEA,YAAM,MAAM,MAAM,OAAoB,GAAG,OAAO,OAAO,SAAS,UAAU;AAAA,QACxE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,GAAG,KAAK;AAAA,UACR,QAAQ;AAAA,UACR,cAAa,oBAAI,KAAA,GAAO,YAAA;AAAA,QAAY;AAAA,MACtC,CACD;AAED,UAAI,UAAU,IAAI,IAAI,GAAG;AACvB,gBAAQ,QAAQ;AAAA,MAClB,OAAO;AACL,cAAM,QAAQ,IAAI,WAAW;AAAA,MAC/B;AAAA,IACF,SAAS,GAAQ;AACf,YAAM,QAAQ,GAAG,MAAM,WAAW,GAAG,WAAW;AAAA,IAClD,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,WAAS,QAAQ;AACf,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAAA,EAChB;AAEA,SAAO,EAAE,MAAM,SAAS,SAAS,OAAO,QAAQ,MAAA;AAClD;"}

View File

@@ -0,0 +1 @@
{"file":"useLeadForm-hNHTDEhY.js","mappings":";;AAyBA,SAAS,UAAU,MAAgC;AACjD,SAAO,SAAS,OAAO,SAAS,SAAS,SAAS;AACpD;AAEA,SAAS,cAAc,OAAwB;AAC7C,SAAO,gBAAgB,KAAK,KAAK;AACnC;AAEO,SAAS,YAAY,MAAgB;AAC1C,QAAM,SAAS,iBAAA;AAEf,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,UAAU,IAAI,KAAK;AACzB,QAAM,QAAQ,IAAI,EAAE;AAEpB,QAAM,OAAO,IAAc;AAAA,IACzB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,EAAA,CACD;AAED,iBAAe,SAAS;AACtB,UAAM,QAAQ;AAEd,QAAI,CAAC,KAAK,MAAM,KAAK,QAAQ;AAC3B,YAAM,QAAQ;AACd;AAAA,IACF;AACA,QAAI,CAAC,KAAK,MAAM,QAAQ,QAAQ;AAC9B,YAAM,QAAQ;AACd;AAAA,IACF;AACA,QAAI,CAAC,cAAc,KAAK,MAAM,KAAK,GAAG;AACpC,YAAM,QAAQ;AACd;AAAA,IACF;AAEA,YAAQ,QAAQ;AAEhB,QAAI;AACF,UAAI,OAAO,OAAO,aAAa;AAC7B,cAAM,IAAI,QAAQ,CAAA,YAAW,WAAW,SAAS,GAAG,CAAC;AACrD,gBAAQ,QAAQ;AAChB,gBAAQ,QAAQ;AAChB;AAAA,MACF;AAEA,YAAM,MAAM,MAAM,OAAoB,GAAG,OAAO,OAAO,SAAS,UAAU;AAAA,QACxE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,GAAG,KAAK;AAAA,UACR,QAAQ;AAAA,UACR,cAAa,oBAAI,KAAA,GAAO,YAAA;AAAA,QAAY;AAAA,MACtC,CACD;AAED,UAAI,UAAU,IAAI,IAAI,GAAG;AACvB,gBAAQ,QAAQ;AAAA,MAClB,OAAO;AACL,cAAM,QAAQ,IAAI,WAAW;AAAA,MAC/B;AAAA,IACF,SAAS,GAAQ;AACf,YAAM,QAAQ,GAAG,MAAM,WAAW,GAAG,WAAW;AAAA,IAClD,UAAA;AACE,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,WAAS,QAAQ;AACf,YAAQ,QAAQ;AAChB,UAAM,QAAQ;AAAA,EAChB;AAEA,SAAO,EAAE,MAAM,SAAS,SAAS,OAAO,QAAQ,MAAA;AAClD;","names":[],"sources":["../../../../composables/useLeadForm.ts"],"sourcesContent":["import { ref } from 'vue'\n\ntype LeadType = 'demo' | 'download' | 'contact'\n\ntype ApiResponse<T = unknown> = {\n code: number | string\n message: string\n data?: T\n requestId?: string\n timestamp?: string | number\n}\n\nexport type LeadForm = {\n name: string\n orgName: string\n phone: string\n city?: string\n position?: string\n focusArea?: string\n contact?: string\n message?: string\n type: LeadType\n extra?: Record<string, string>\n}\n\nfunction isSuccess(code: number | string): boolean {\n return code === 200 || code === '200' || code === 'SUCCESS'\n}\n\nfunction validatePhone(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone)\n}\n\nexport function useLeadForm(type: LeadType) {\n const config = useRuntimeConfig()\n\n const loading = ref(false)\n const success = ref(false)\n const error = ref('')\n\n const form = ref<LeadForm>({\n name: '',\n orgName: '',\n phone: '',\n type\n })\n\n async function submit() {\n error.value = ''\n\n if (!form.value.name.trim()) {\n error.value = '请填写姓名'\n return\n }\n if (!form.value.orgName.trim()) {\n error.value = '请填写单位名称'\n return\n }\n if (!validatePhone(form.value.phone)) {\n error.value = '请填写正确的手机号'\n return\n }\n\n loading.value = true\n\n try {\n if (config.public.useMockLead) {\n await new Promise(resolve => setTimeout(resolve, 600))\n success.value = true\n loading.value = false\n return\n }\n\n const res = await $fetch<ApiResponse>(`${config.public.apiPrefix}/leads`, {\n method: 'POST',\n body: {\n ...form.value,\n source: 'official_website',\n submittedAt: new Date().toISOString()\n }\n })\n\n if (isSuccess(res.code)) {\n success.value = true\n } else {\n error.value = res.message || '提交失败,请稍后重试'\n }\n } catch (e: any) {\n error.value = e?.data?.message || e?.message || '网络异常,请稍后重试'\n } finally {\n loading.value = false\n }\n }\n\n function reset() {\n success.value = false\n error.value = ''\n }\n\n return { form, loading, success, error, submit, reset }\n}\n"],"version":3}

View File

@@ -0,0 +1,79 @@
import { computed, ref } from "vue";
const ROLES = [
{ key: "ADMIN", label: "系统管理员" },
{ key: "RECEPTIONIST", label: "受理员" },
{ key: "ASSESSOR", label: "评估员" },
{ key: "PLANNER", label: "方案制定员" },
{ key: "DISPATCHER", label: "调度员" },
{ key: "STAFF", label: "服务人员" },
{ key: "SETTLER", label: "结算员" },
{ key: "SUPERVISOR", label: "监管员" },
{ key: "REVIEWER", label: "复核员" }
];
const PRESET_USERS = {
admin: { userId: "1", userName: "系统管理员", userRole: "ADMIN", tenantId: "1", orgId: "1" },
receptionist: { userId: "2", userName: "受理员小王", userRole: "RECEPTIONIST", tenantId: "1", orgId: "1" },
assessor: { userId: "3", userName: "评估员老张", userRole: "ASSESSOR", tenantId: "1", orgId: "1" },
planner: { userId: "4", userName: "方案员小李", userRole: "PLANNER", tenantId: "1", orgId: "1" },
dispatcher: { userId: "5", userName: "调度员老赵", userRole: "DISPATCHER", tenantId: "1", orgId: "1" },
staff: { userId: "6", userName: "护理员老陈", userRole: "STAFF", tenantId: "1", orgId: "1" },
settler: { userId: "7", userName: "结算员小周", userRole: "SETTLER", tenantId: "1", orgId: "1" },
supervisor: { userId: "8", userName: "监管员老刘", userRole: "SUPERVISOR", tenantId: "1", orgId: "1" }
};
const STORAGE_KEY = "hss_platform_user";
const currentUser = ref(null);
function loadUser() {
try {
const stored = localStorage.getItem(STORAGE_KEY);
return stored ? JSON.parse(stored) : null;
} catch {
return null;
}
}
function saveUser(user) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(user));
currentUser.value = user;
}
function clearUser() {
localStorage.removeItem(STORAGE_KEY);
currentUser.value = null;
}
function usePlatformAuth() {
if (!currentUser.value) {
currentUser.value = loadUser();
}
const isLoggedIn = computed(() => !!currentUser.value);
const user = computed(() => currentUser.value);
function login(username) {
const u = PRESET_USERS[username.toLowerCase()];
if (u) {
saveUser(u);
return u;
}
return null;
}
function logout() {
clearUser();
}
function switchRole(roleKey) {
if (!currentUser.value) return;
const updated = { ...currentUser.value, userRole: roleKey };
saveUser(updated);
}
function getAuthHeaders() {
const u = currentUser.value;
if (!u) return {};
return {
"X-User-Id": u.userId,
"X-User-Role": u.userRole,
"X-Tenant-Id": u.tenantId,
"X-Org-Id": u.orgId,
"Content-Type": "application/json"
};
}
return { isLoggedIn, user, login, logout, switchRole, getAuthHeaders, ROLES, PRESET_USERS };
}
export {
usePlatformAuth as u
};
//# sourceMappingURL=usePlatformAuth-DS6-BJES.js.map

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More