# 智慧医养居家上门服务平台 — 官网前端实现方案 > 基于:`官网设计方案Prompt.txt`(7轮需求采集产物) > 仓库:`hss-home-service/website/`(独立 Nuxt3 项目) > 后端:已有 Spring Boot 后端,运行在 18080 端口,`/api/hss/*` 84 个接口 --- ## 1. 需求与约束摘要 | 项 | 内容 | |---|---| | **任务类型** | 新功能开发(新建项目) | | **目标** | 实现完整产品官网:9 页面 + 公共组件,品牌展示 + 获客转化 | | **技术栈** | Vue3 + Nuxt3 + Tailwind CSS(严格) | | **UI 库** | 不引入 UI 组件库,仅 Tailwind 自定义组件 | | **渲染** | SSG / 静态预渲染优先 | | **暗色/i18n** | 不做 | | **动效** | CSS transition/animation + IntersectionObserver,禁用 GSAP/3D | | **表单** | 开发期 mock,正式通过 `/api` 对接已有后端 | | **SEO** | 每页 useSeoMeta,百度优先,兼顾 Google | | **可访问性** | WCAG 2.2 AA:label、focus、错误提示、键盘可达、对比度 | | **性能** | Lighthouse 四项 ≥90,首屏 <2s | | **图片** | loremflickr 占位,标注"示意素材,待替换" | --- ## 2. 代码依据 | 文件 | 职责 | |---|---| | `src/main/java/.../common/ApiResponse.java` | 后端统一响应格式 `{code, message, data, requestId, timestamp}`,code=200 成功 | | `docker-compose.yml` | 后端运行在 18080 端口,官网通过 Nginx 反代 `/api` | | `delivery-miniapp/common/api.js` | 现有前端请求封装风格参考(BASE_URL, getHeaders, apiGet/apiPost) | | `官网设计方案Prompt.txt` | 7 轮需求采集产物:商业目标、用户、内容、结构、功能、视觉、技术 | --- ## 3. 改动范围清单 全部新建,`website/` 目录与现有后端 `src/` 同级。 | 路径 | 增/删/改 | 摘要 | |------|----------|------| | `website/package.json` | 增 | Nuxt3 项目依赖 | | `website/nuxt.config.ts` | 增 | SSG、SEO、Tailwind、API 代理 | | `website/tailwind.config.ts` | 增 | 医疗蓝/健康绿/暖橙 色彩体系 | | `website/app.vue` | 增 | 根布局 | | `website/pages/index.vue` | 增 | 首页(12 段模块) | | `website/pages/solution.vue` | 增 | 解决方案页 | | `website/pages/capabilities.vue` | 增 | 核心能力页 | | `website/pages/scenarios.vue` | 增 | 应用场景页 | | `website/pages/service-loop.vue` | 增 | 服务闭环流程图页 | | `website/pages/security.vue` | 增 | 安全合规页 | | `website/pages/resources.vue` | 增 | 资源中心页 | | `website/pages/about.vue` | 增 | 关于我们页 | | `website/pages/contact.vue` | 增 | 联系我们页 | | `website/components/AppHeader.vue` | 增 | 顶部导航(Logo + 9 栏目 + 登录入口) | | `website/components/AppFooter.vue` | 增 | 页脚(栏目链接 + 版权 + ICP 备案) | | `website/components/HeroSection.vue` | 增 | Hero 首屏区块 | | `website/components/ServiceLoopFlow.vue` | 增 | 8 阶段交互式流程图 | | `website/components/CapabilityCard.vue` | 增 | 核心能力卡片 | | `website/components/TriEndDisplay.vue` | 增 | 三端协同展示 | | `website/components/ScenarioCard.vue` | 增 | 应用场景卡片 | | `website/components/DataDashboard.vue` | 增 | 数据看板动效 | | `website/components/SecurityGrid.vue` | 增 | 安全合规网格 | | `website/components/ValueMetrics.vue` | 增 | 建设价值指标 | | `website/components/DemoForm.vue` | 增 | 预约演示表单 | | `website/components/DownloadForm.vue` | 增 | 获取方案/白皮书表单 | | `website/components/ContactForm.vue` | 增 | 联系我们表单 | | `website/components/CtaSection.vue` | 增 | 底部 CTA 区块 | | `website/composables/useLeadForm.ts` | 增 | 表单提交封装(mock/API 切换) | | `website/composables/useScrollAnim.ts` | 增 | 滚动动效 composable | | `website/composables/useSeo.ts` | 增 | SEO meta 配置 | | `website/data/siteContent.ts` | 增 | 站点内容数据(文案/栏目/菜单) | | `website/data/solutions.ts` | 增 | 解决方案数据 | | `website/data/scenarios.ts` | 增 | 应用场景数据 | | `website/assets/css/main.css` | 增 | 全局样式 + CSS 变量 | | `website/public/robots.txt` | 增 | 爬虫配置 | | `website/server/api/lead.post.ts` | 增 | Nuxt server route(开发期 mock,生产反代) | --- ## 4. 方案概述 ### 4.1 架构 ``` website/ # 独立 Nuxt3 项目 ├── pages/ # 9 个页面(基于文件路由) │ ├── index.vue # 首页(SSG) │ ├── solution.vue # 解决方案 │ ├── capabilities.vue # 核心能力 │ ├── scenarios.vue # 应用场景 │ ├── service-loop.vue # 服务闭环 │ ├── security.vue # 安全合规 │ ├── resources.vue # 资源中心 │ ├── about.vue # 关于我们 │ └── contact.vue # 联系我们 ├── components/ # 16 个公共组件 ├── composables/ # 3 个 composables ├── data/ # 站点内容数据 ├── server/api/ # 开发期 mock(生产反代) ├── nuxt.config.ts # SSG + SEO + Tailwind └── tailwind.config.ts # 医疗蓝/健康绿/暖橙 ``` ### 4.2 API 对接 ``` 开发期: 表单提交 → /api/lead → server/api/lead.post.ts (mock 返回 200) 生产期(Nginx): /api/* → proxy_pass http://hss-app:8080/api/hss/* 表单提交到新后端端点 POST /api/hss/leads(待后端新增) 或复用现有 POST /api/hss/applications 作为线索入口(字段映射) ``` ### 4.3 数据流 ``` siteContent.ts (静态数据) → pages/*.vue (渲染) → components/*.vue (模块展示) 用户交互(表单提交) → composables/useLeadForm.ts (封装) → server/api/lead.post.ts (mock) | /api/hss/leads (生产) ``` --- ## 5. 代码级修改说明 ### 5.1 项目初始化 **文件**:`website/package.json`(新增) ```json { "name": "hss-website", "type": "module", "scripts": { "dev": "nuxt dev", "build": "nuxt build", "generate": "nuxt generate", "preview": "nuxt preview" }, "devDependencies": { "@nuxtjs/tailwindcss": "^6.12.0", "nuxt": "^3.13.0", "vue": "^3.5.0" } } ``` **文件**:`website/nuxt.config.ts`(新增) ```typescript export default defineNuxtConfig({ ssr: false, // SSG only app: { head: { titleTemplate: '%s | 智慧医养居家上门服务平台', meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { name: 'description', content: '面向政府、医院与养老机构的智慧医养居家上门服务闭环管理平台' } ], link: [ { rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' } ] } }, nitro: { prerender: { routes: ['/'], crawlLinks: true } }, modules: ['@nuxtjs/tailwindcss'], runtimeConfig: { public: { apiBase: process.env.API_BASE || 'http://localhost:18080/api/hss' } } }) ``` ### 5.2 Tailwind 配置 **文件**:`website/tailwind.config.ts`(新增) ```typescript export default { theme: { extend: { colors: { primary: { DEFAULT: '#155EEF', 50: '#EBF0FF', 100: '#D6E0FF', 500: '#155EEF', 700: '#0B4C8C', 900: '#062D5E' }, accent: { DEFAULT: '#20C997', 50: '#E6F9F5', 500: '#20C997', 700: '#18A999' }, cta: { DEFAULT: '#FF8A3D', 500: '#FF8A3D', 700: '#FF7A1A' }, surface: { DEFAULT: '#F5F9FF', white: '#FFFFFF' }, text: { primary: '#1F2937', secondary: '#6B7280' } }, fontFamily: { sans: ['"Noto Sans SC"', '"Source Han Sans"', '"Alibaba PuHuiTi"', 'system-ui', 'sans-serif'], mono: ['Inter', 'system-ui', 'sans-serif'] } } } } ``` ### 5.3 全局样式 **文件**:`website/assets/css/main.css`(新增) ```css @tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --color-primary: #155EEF; --color-accent: #20C997; --color-cta: #FF8A3D; --color-surface: #F5F9FF; --color-text: #1F2937; --color-text-secondary: #6B7280; } html { scroll-behavior: smooth; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } :focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; } } @layer components { .section-container { @apply max-w-7xl mx-auto px-4 sm:px-6 lg:px-8; } .section-title { @apply text-3xl md:text-4xl font-bold text-text-primary text-center; } .section-subtitle { @apply text-lg text-text-secondary text-center mt-4 max-w-2xl mx-auto; } } ``` ### 5.4 根布局 **文件**:`website/app.vue`(新增) ```vue ``` ### 5.5 导航栏组件 **文件**:`website/components/AppHeader.vue`(新增) ```vue ``` ### 5.6 首页 **文件**:`website/pages/index.vue`(新增) 当前逻辑:不存在。 拟议改动:按 Prompt 第 12 段顺序实现首页模块。 ```vue ``` ### 5.7 服务闭环流程图 **文件**:`website/components/ServiceLoopFlow.vue`(新增) ```vue ``` ### 5.8 公共组件速览 **HeroSection.vue**(新增)— 首屏:左文右图,一句话定位 + 价值说明 + 双 CTA + 组合视觉 **CapabilityCard.vue**(新增)— 图标 + 标题 + 描述,hover 上浮阴影 **TriEndDisplay.vue**(新增)— 三列卡片联动:家属端 / delivery 端 / 管理监管端 **ScenarioCard.vue**(新增)— 场景图标 + 标题 + 描述,可点击跳转 **DataDashboard.vue**(新增)— 数字跳动 (countUp) + 图表渐入 mock **SecurityGrid.vue**(新增)— 权限/审计/隐私/授权/追溯 网格展示 **ValueMetrics.vue**(新增)— 效率/质量/监管/结算 四指标 + 数据 **AppFooter.vue**(新增)— 四列链接 + Logo + ICP 备案号 **CtaSection.vue**(新增)— 全宽蓝底 + "立即预约演示" 主按钮 + "获取方案" 副按钮 ### 5.9 表单 Composable **文件**:`website/composables/useLeadForm.ts`(新增) ```typescript import { ref } from 'vue'; interface LeadForm { name: string; orgName: string; phone: string; type: 'demo' | 'download' | 'contact'; extra?: Record; } export function useLeadForm(type: LeadForm['type']) { const loading = ref(false); const success = ref(false); const error = ref(''); const form = ref({ name: '', orgName: '', phone: '', type }); async function submit() { loading.value = true; error.value = ''; try { const config = useRuntimeConfig(); const res = await $fetch<{ code: number; message: string }>('/api/lead', { method: 'POST', body: { ...form.value, timestamp: Date.now() } }); if (res.code === 200) { success.value = true; } else { error.value = res.message || '提交失败,请稍后重试'; } } catch (e: any) { error.value = e?.message || '网络错误,请稍后重试'; } finally { loading.value = false; } } function reset() { success.value = false; error.value = ''; } return { form, loading, success, error, submit, reset }; } ``` ### 5.10 Mock API(开发期) **文件**:`website/server/api/lead.post.ts`(新增) ```typescript export default defineEventHandler(async (event) => { const body = await readBody(event); // 开发期 mock:直接返回成功 console.log('[mock] lead received:', body); return { code: 200, message: 'success', data: { id: Date.now() }, requestId: 'mock-' + Date.now(), timestamp: Date.now() }; }); ``` --- ## 6. 截图与代码对照 本需求无用户提供的界面截图。以下为设计方案 Prompt 中定义的模块与代码映射: | 设计 Prompt 模块 | 对应组件 | 关键交互 | |---|---|---| | Hero 首屏(一句话定位+CTA+视觉) | `HeroSection.vue` | 静态展示,CTA 跳转 /contact | | 服务闭环流程图(8 阶段) | `ServiceLoopFlow.vue` | IntersectionObserver 逐步点亮 | | 核心能力卡片(8 张) | `CapabilityCard.vue` | hover 上浮 + 阴影 | | 三端协同展示 | `TriEndDisplay.vue` | 三列卡片联动 | | 应用场景卡片 | `ScenarioCard.vue` | 可点击跳转场景详情 | | 数据看板 | `DataDashboard.vue` | 数字跳动(countUp) + 渐入 | | 安全合规网格 | `SecurityGrid.vue` | 图标+说明网格 | | 预约演示表单 | `DemoForm.vue` | useLeadForm('demo'),6 字段 | | 获取方案表单 | `DownloadForm.vue` | useLeadForm('download'),4 字段 | | 联系我们表单 | `ContactForm.vue` | useLeadForm('contact'),5 字段 | --- ## 7. 类型、接口与 Mock ### 7.1 后端需新增接口 当前后端 84 个接口中无表单/线索相关端点。需新增: ```java // POST /api/hss/leads — 接收官网表单提交 @PostMapping("/leads") @Idempotent(prefix = "lead:submit") public ApiResponse> submitLead(@RequestBody LeadRequest req) { // 存储表单提交记录到 hss_leads 表(或复用现有通知/审计表记录) } ``` 若第一版不新增后端端点,官网表单可: - 开发期:用 `server/api/lead.post.ts` mock - 过渡期:复用 `POST /api/hss/applications` 作为线索入口(字段映射) - 正式期:新增 `POST /api/hss/leads` ### 7.2 响应格式对齐 后端 `ApiResponse`:`{code, message, data, requestId, timestamp}` 前端 `useLeadForm` 已对齐此格式,检查 `res.code === 200`。 --- ## 8. 自测与回归 ### 8.1 页面可达性验证 - [ ] 首页 `/` — 12 段模块完整渲染 - [ ] 解决方案 `/solution` — 内容卡片 + CTA - [ ] 核心能力 `/capabilities` — 8 张卡片 + 详情 - [ ] 应用场景 `/scenarios` — 5 场景 - [ ] 服务闭环 `/service-loop` — 8 节点流程图 - [ ] 安全合规 `/security` — 网格展示 - [ ] 资源中心 `/resources` — 下载卡片 + 表单 - [ ] 关于我们 `/about` — 团队/愿景 - [ ] 联系我们 `/contact` — 完整表单 ### 8.2 响应式验证 - [ ] 桌面 1440px+:全模块正常 - [ ] 平板 768px:网格变 2 列,流程图竖排 - [ ] 手机 375px:流程变纵向步骤条,CTA 固定底部 ### 8.3 性能验证 - [ ] `npm run generate` 成功产出静态文件 - [ ] 首屏 < 2s(空缓存) - [ ] Lighthouse ≥ 90(Performance/Accessibility/SEO/Best Practices) ### 8.4 可访问性验证 - [ ] Tab 键可遍历导航和表单 - [ ] 表单字段有 label + 错误提示 - [ ] 颜色对比度满足 AA - [ ] `prefers-reduced-motion` 关闭动效 ### 8.5 SEO 验证 - [ ] 每页有独立 title / description - [ ] 生成 sitemap.xml / robots.txt - [ ] 百度搜索关键词可检索到页面 --- ## 9. 短 Prompt ```txt 在 hss-home-service/website/ 下新建 Nuxt3 项目。 技术栈:Vue3 + Nuxt3 + Tailwind CSS。不引入 UI 组件库。 渲染模式:SSG/静态预渲染。不做 SSR、暗色模式、i18n。 动效:CSS transition/animation + IntersectionObserver,禁用 GSAP/3D。 表单:用 composables/useLeadForm.ts 封装,开发期 mock (/api/lead),正式切 /api/hss/leads。 设计 Token:主色 #155EEF、辅助 #20C997、CTA #FF8A3D、背景 #F5F9FF。 需交付 9 个页面 + 16 个公共组件,响应式,Lighthouse ≥90,WCAG 2.2 AA。 具体方案见 IMPLEMENTATION.md,严格按此执行。 ```