+
+
+
+ {:ze($res,'name')}
+
+
+ {if !empty($res['son'])}
+
+ {/if}
+
+
+ {foreach $data as $key => $item}
+ -
+
+
![{$item['title']}]({$item['image']})
(int)input('param.pid'),':sid'=>(int)input('param.sid'),':id'=>$item['id']])}"'>
+
+
+
{/foreach}
-
-
-
-
-
- -
- {foreach $data as $key => $item}
-
-
-
![{$item['title']}]({$item['image']})
(int)input('param.pid'),':sid'=>(int)input('param.sid'),':id'=>$item['id']])}"'>
-
- {$item['title']}
-
-
-
+
+
+ {$data->render(['pid'=>(int)input('param.pid'),'sid'=>(int)input('param.sid')])}
- {/foreach}
-
-
-
-
-
- {$data->render(['pid'=>(int)input('param.pid'),'sid'=>(int)input('param.sid')])}
-
+
-
-
-
-
-
+
+{/if}
{/block}
\ No newline at end of file
diff --git a/addons/official/view/web/official_product/service_page.html b/addons/official/view/web/official_product/service_page.html
new file mode 100644
index 0000000..d3ca265
--- /dev/null
+++ b/addons/official/view/web/official_product/service_page.html
@@ -0,0 +1,571 @@
+
+
+
+
+
+
+
+ 精工匠造
+
+
经纬立骨铸基石 · 全栈自主赋生产
+
+ 纳海川聚焦企业级中台定制、全端移动生态与垂直智能体工程,坚持全流程测试驱动开发(TDD)与金融级安全标准,提供 100% 完整源码工程交付与专有私有化部署。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
DOMAIN 01 · 核心中台与底层工程
+
企业级软件开发与微服务中台
+
+ 面向高并发、高可用与复杂业务逻辑场景,纳海川提供专有业务中台重构与定制开发服务。通过微服务分布式解耦、主从数据库读写分离与千万级缓存调度,彻底消除系统性能瓶颈与数据孤岛。
+
+
+ Spring Cloud
+ PHP 8+ / Hyperf
+ MySQL 读写分离
+ Redis 集群
+ RabbitMQ / Kafka
+ Docker / K8s
+
+
+ -
+
+ 高并发分布式微服务架构设计
+
+ -
+
+ 异构系统数据管道与 API 网关集成
+
+ -
+
+ 金融级资金往来加密与等保合规
+
+ -
+
+ 100% 完整工程源码与数据库字典移交
+
+
+
+
+
+ 技术指标规格
+ 企业标准
+
+
+ 核心接口微服务平均响应
+ < 50 ms
+
+
+ 系统并发可用性保障(SLA)
+ 99.95 %
+
+
+ 源码单元测试覆盖率
+ > 80 %
+
+
+ 交付归属与二次开发权
+ 100% 客户独占
+
+
+
+
+
+
+
+
+
+
DOMAIN 02 · 全渠道跨端触点
+
APP与小程序定制研发
+
+ 覆盖 iOS、Android 双端原生应用与微信、支付宝小程序生态,兼具原生级别的 60fps 丝滑交互性能与跨端多平台的敏捷发布能力,深度支持蓝牙硬件直连、移动离线记账与全链路消息推送。
+
+
+ Flutter
+ Uni-app
+ Vue 3 / React
+ TypeScript
+ 微信生态 API
+ 低功耗蓝牙 BLE
+
+
+ -
+
+ iOS / Android 双端原生框架深度优化
+
+ -
+
+ 微信/支付宝/抖音三端小程序一码发布
+
+ -
+
+ 智能扫码盒、打印机与物联网设备对接
+
+ -
+
+ 60fps 丝滑动画与离线弱网数据缓存
+
+
+
+
+
+ 全端体验规格
+ 原生级
+
+
+ 界面渲染交互帧率
+ 60 fps
+
+
+ 小程序冷启动首屏加载
+ < 1.2 s
+
+
+ 应用商店上架一次通过率
+ 98.5 %
+
+
+ 跨机型分辨率无缝自适应
+ 100% 覆盖
+
+
+
+
+
+
+
+
+
+
DOMAIN 03 · 垂直前沿应用
+
企业级 AI 智能体与知识工程开发
+
+ 深入政企垂直业务一线,拒绝假大空套话。纳海川将企业私域业务规范、规章文献与大语言模型结合,通过高维向量检索(RAG)与多智能体(Multi-Agent)自主协同调度,打造数据安全物理隔离的专有业务智能体。
+
+
+ 私有化大模型微调
+ Milvus / Qdrant 向量库
+ RAG 混合检索
+ Multi-Agent 工作流
+ Python / FastAPI
+ 内网物理隔离沙箱
+
+
+ -
+
+ 企业私域知识库 RAG 向量精准检索
+
+ -
+
+ 多智能体自主分工与复杂审批流程协同
+
+ -
+
+ 业务工单与政务咨询 85% 自动化解决
+
+ -
+
+ 企业敏感数据零外泄 · 纯本地私有部署
+
+
+
+
+
+ 智能体指标规格
+ 合规私有
+
+
+ 专有知识库检索命中响应
+ < 1.5 s
+
+
+ 规章制度精准回答准确率
+ 94.6 %
+
+
+ 核心业务工单自动分流处置率
+ 85.0 %
+
+
+ 外部网络依赖与数据出境风险
+ 0 风险(物理内网)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PC 运营管理端 (Vue 3 / React)
+ iOS / Android 原生 App (Flutter)
+ 微信 / 支付宝小程序 (Uni-app)
+ 双屏收银机 / 智能手持终端
+
+
+
+
+
+
+
+ Spring Cloud Gateway
+ Nginx 负载均衡与反向代理
+ WAF 防火墙 & 抗 DDOS 攻击
+ OAuth 2.0 / JWT 统一鉴权
+ SSL / 国密 SM2/SM4 加密传输
+
+
+
+
+
+
+
+ 用户与权限中台 (RBAC)
+ 商品与价格调度中台
+ 高并发订单交易引擎
+ 供应链仓储与调拨中台
+ 多智能体工作流编排 (Agent Core)
+ 清算分账与财务对账中心
+
+
+
+
+
+
+
+ MySQL / PostgreSQL 集群
+ Redis 分布式缓存集群
+ Elasticsearch 海量日志检索
+ Milvus 向量知识库存储
+ Docker / Kubernetes 容器编排
+ 企业私有云 / 政企信创机房
+
+
+
+
+
+
+
+
+
+
+
+
+
+
01
+
需求深度研判
+
+ 格物致知。资深架构师与业务专家深入业务一线,全流程梳理业务痛点,产出详尽需求规格蓝图与可行性评估报告。
+
+
+
+
02
+
架构严谨立骨
+
+ 经纬分明。制定高可用系统拓扑、高安全数据模型、微服务治理及应对极端峰值的应急预案,杜绝后期返工。
+
+
+
+
03
+
敏捷测试驱动
+
+ 精工细琢。严格遵循 TDD 模式与 CI/CD 自动化流水线,代码评审严苛,确保无死锁缺陷,保障高质量源码输出。
+
+
+
+
04
+
高压安全审计
+
+ 严审磐石。全路径模拟超负荷并发压力测试,配合权威渗透扫描与等保合规校验,坚固如铁,滴水不漏。
+
+
+
+
05
+
私有化与维保
+
+ 修己守信。专业工程师现场或专网部署交付,提供完善运维赋能培训与 7×24 持续演进支持,全天候守护平稳运行。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
01 完整工程源码
+
规范注释的 Git 仓库工程,无混淆无加密,含全量第三方依赖清单与编译配置。
+
+
+
+
+
02 系统架构蓝图
+
微服务物理拓扑图、应用部署架构图、系统数据流向图与容灾切换方案。
+
+
+
+
+
03 数据库设计字典
+
全套数据表结构定义、字段详细注释、主外键索引设计与 ER 实体关系图。
+
+
+
+
+
04 标准 API 接口规范
+
基于 Swagger / Postman 规格的可视化在线 API 调试文档与数据返回示例。
+
+
+
+
+
05 需求规格与原型
+
高保真交互产品原型(Axure / Figma)及各版本需求规格说明书(PRD)。
+
+
+
+
+
06 测试用例与报告
+
覆盖关键业务流的单元测试、集成测试自动化脚本与质量验收签署报告。
+
+
+
+
+
07 高压测试与安全报告
+
千万级真实峰值压测报告、弱口令及 SQL 注入渗透漏洞扫描与安全合规证明。
+
+
+
+
+
08 系统运维与应急手册
+
Docker/K8s 自动化部署脚本、日常监控告警阈值配置与系统数据备份恢复手册。
+
+
+
+
+
+
+
< 15 分钟
+
7×24 生产级故障极速响应
+
专线运维架构师待命,重大故障 2 小时内出具解决方案与恢复实施。
+
+
+
365 天
+
首年全面免费维保承诺
+
包含非人为逻辑缺陷免费修复、环境性能巡检与关键安全补丁升级。
+
+
+
100 %
+
知识产权归属客户所有
+
签署正规商用源码交付协议,协助客户申报自主国家计算机软件著作权。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
纳海川交付的系统是否提供全套源代码?后期能否自主二开?
+
+
+
+ 是的,纳海川严格执行“全量源码工程级移交”。项目验收后,我们将包含完整注释的 Git 仓库、数据库字典、Swagger 接口规范及构建脚本全部移交。代码遵循行业通用标准规范,没有任何私有加密后门,客户自有的技术团队完全可以无障碍接管并进行二次开发扩展。
+
+
+
+
+
+
在企业级 AI 智能体开发中,如何确保我们的内部敏感商业数据不泄露?
+
+
+
+ 纳海川提供“纯本地物理内网私有化部署方案”。所有大模型微调推理节点、向量检索数据库(Milvus)及知识库文件均部署在客户专属的本地服务器或政企信创专有云中。整个推理与检索流程完全在客户内网封闭运行,不向任何第三方公网 API 发送数据,从物理架构层面实现数据 0 泄露。
+
+
+
+
+
+
APP 与小程序开发采用什么技术路线?能否保证类似原生的流畅度?
+
+
+
+ 我们根据业务场景提供两种方案:对于重交互、对性能有苛刻要求的核心应用,采用 Flutter 配合底层原生 SDK 深度优化,确保 60fps 渲染与丝滑触控;对于注重敏捷裂变、快速获客的业务,采用 Uni-app 与 Vue 3 体系,实现一套代码编译至微信、支付宝小程序及双端 App,兼顾开发效率与优秀性能。
+
+
+
+
+
+
项目工期与费用是如何进行科学评估的?是否存在隐形增项?
+
+
+
+ 纳海川坚持“需求先行、按模块工时严谨定额”。在签订合同前,资深架构师会与客户共同确认细化到每个功能点和接口的《需求规格说明书(PRD)》,并提供明确的阶段里程碑时间表。双方在明确范围后闭口定价,严格遵循合同边界,绝无任何巧立名目的隐形费用。
+
+
+
+
+
+
+
+
+
+
+
+
技术咨询
+
准备好与资深技术架构师展开深度研讨了吗?
+
+ 纳海川技术委员会核心架构师随时待命,为您提供深度业务剖析、系统架构蓝图规划与可行性评估,2 小时内快速响应对接。
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/addons/official/css/modern_nhc.css b/public/assets/addons/official/css/modern_nhc.css
index 2dec778..2b62c1c 100644
--- a/public/assets/addons/official/css/modern_nhc.css
+++ b/public/assets/addons/official/css/modern_nhc.css
@@ -1432,3 +1432,462 @@ img {
width: 100%;
}
}
+
+/* ==========================================================================
+ 服务独立页专有样式 (Services Page Modern Style)
+ ========================================================================== */
+.nhc-page-hero {
+ position: relative;
+ padding: 130px 0 70px;
+ background:
+ radial-gradient(circle at 50% 15%, rgba(37, 99, 235, 0.07) 0%, transparent 55%),
+ radial-gradient(circle at 85% 60%, rgba(6, 182, 212, 0.05) 0%, transparent 45%),
+ linear-gradient(180deg, #FFFFFF 0%, #F8FAFC 100%);
+ border-bottom: 1px solid var(--border-color);
+ text-align: center;
+}
+
+.nhc-breadcrumb {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 13px;
+ color: var(--text-muted);
+ margin-bottom: 20px;
+}
+
+.nhc-breadcrumb a {
+ color: var(--text-secondary);
+ transition: color 0.2s;
+}
+
+.nhc-breadcrumb a:hover {
+ color: var(--primary);
+}
+
+.nhc-page-title {
+ font-family: var(--font-serif);
+ font-size: 44px;
+ font-weight: 700;
+ color: var(--text-primary);
+ letter-spacing: 1.5px;
+ margin-bottom: 18px;
+}
+
+.nhc-page-desc {
+ max-width: 760px;
+ margin: 0 auto 30px;
+ font-size: 17px;
+ color: var(--text-secondary);
+ line-height: 1.8;
+}
+
+/* 服务三大领域深度卡片 (交替错落或大横幅) */
+.nhc-service-detail-section {
+ padding: 90px 0;
+}
+
+.nhc-service-detail-card {
+ background: var(--bg-primary);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-md);
+ padding: 48px;
+ margin-bottom: 40px;
+ box-shadow: var(--shadow-subtle);
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+}
+
+.nhc-service-detail-card:hover {
+ border-color: rgba(37, 99, 235, 0.3);
+ box-shadow: 0 16px 36px -10px rgba(15, 23, 42, 0.08);
+}
+
+.nhc-service-detail-inner {
+ display: grid;
+ grid-template-columns: 1.2fr 1fr;
+ gap: 48px;
+ align-items: center;
+}
+
+.nhc-service-tagline {
+ font-size: 12px;
+ letter-spacing: 2px;
+ color: var(--primary);
+ font-weight: 600;
+ text-transform: uppercase;
+ margin-bottom: 8px;
+}
+
+.nhc-service-detail-title {
+ font-family: var(--font-serif);
+ font-size: 28px;
+ font-weight: 700;
+ color: var(--text-primary);
+ margin-bottom: 16px;
+}
+
+.nhc-service-detail-desc {
+ font-size: 15px;
+ line-height: 1.8;
+ color: var(--text-secondary);
+ margin-bottom: 24px;
+}
+
+.nhc-tech-pills {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 28px;
+}
+
+.nhc-tech-pill {
+ font-size: 12px;
+ font-family: var(--font-sans);
+ background: #F1F5F9;
+ color: #334155;
+ padding: 4px 12px;
+ border-radius: 4px;
+ border: 1px solid #E2E8F0;
+ font-weight: 500;
+}
+
+.nhc-feature-checklist {
+ list-style: none;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+ margin-bottom: 28px;
+}
+
+.nhc-feature-check-item {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 14px;
+ color: var(--text-primary);
+}
+
+.nhc-feature-check-item svg {
+ color: var(--primary);
+ flex-shrink: 0;
+}
+
+/* 服务卡片右侧视窗展示盒 */
+.nhc-service-visual-box {
+ background: #F8FAFC;
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ padding: 32px;
+ position: relative;
+}
+
+.nhc-visual-title {
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--text-muted);
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ margin-bottom: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.nhc-visual-spec-item {
+ background: #FFFFFF;
+ border: 1px solid #E2E8F0;
+ border-radius: 4px;
+ padding: 14px 16px;
+ margin-bottom: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.nhc-spec-label {
+ font-size: 13px;
+ color: var(--text-secondary);
+}
+
+.nhc-spec-val {
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+/* 全栈技术底座架构全景 (四层架构蓝图) */
+.nhc-tech-stack-section {
+ padding: 80px 0;
+ background-color: var(--bg-secondary);
+ border-top: 1px solid var(--border-color);
+ border-bottom: 1px solid var(--border-color);
+}
+
+.nhc-architecture-diagram {
+ max-width: 1040px;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.nhc-arch-layer {
+ background: #FFFFFF;
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ padding: 24px 28px;
+ box-shadow: var(--shadow-subtle);
+ display: grid;
+ grid-template-columns: 200px 1fr;
+ align-items: center;
+ gap: 24px;
+ transition: border-color 0.25s;
+}
+
+.nhc-arch-layer:hover {
+ border-color: var(--primary);
+}
+
+.nhc-arch-layer-header {
+ border-right: 1px solid var(--border-color);
+ padding-right: 20px;
+}
+
+.nhc-arch-layer-name {
+ font-family: var(--font-serif);
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--text-primary);
+ margin-bottom: 4px;
+}
+
+.nhc-arch-layer-sub {
+ font-size: 11px;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+.nhc-arch-items {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+}
+
+.nhc-arch-badge {
+ background: #F8FAFC;
+ border: 1px solid #E2E8F0;
+ padding: 8px 16px;
+ border-radius: 4px;
+ font-size: 13px;
+ font-weight: 500;
+ color: var(--text-primary);
+ display: flex;
+ align-items: center;
+ gap: 6px;
+}
+
+/* 标准化 8 大交付物清单 */
+.nhc-deliverables-section {
+ padding: 90px 0;
+}
+
+.nhc-deliverables-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 20px;
+}
+
+.nhc-deliverable-item {
+ background: #FFFFFF;
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ padding: 24px 20px;
+ box-shadow: var(--shadow-subtle);
+ transition: all 0.25s ease;
+ position: relative;
+}
+
+.nhc-deliverable-item:hover {
+ transform: translateY(-3px);
+ border-color: var(--primary);
+ box-shadow: 0 10px 24px -5px rgba(15, 23, 42, 0.08);
+}
+
+.nhc-deliverable-icon {
+ width: 40px;
+ height: 40px;
+ border-radius: 6px;
+ background: var(--primary-light);
+ color: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 14px;
+}
+
+.nhc-deliverable-title {
+ font-family: var(--font-serif);
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--text-primary);
+ margin-bottom: 8px;
+}
+
+.nhc-deliverable-desc {
+ font-size: 13px;
+ color: var(--text-secondary);
+ line-height: 1.6;
+}
+
+/* SLA 服务信赖横幅 */
+.nhc-sla-banner {
+ background: linear-gradient(135deg, #1E293B 0%, #0F172A 100%);
+ border-radius: var(--radius-md);
+ padding: 40px 48px;
+ color: #FFFFFF;
+ margin: 40px 0 80px;
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ gap: 32px;
+}
+
+.nhc-sla-col {
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
+ padding-right: 28px;
+}
+
+.nhc-sla-col:last-child {
+ border-right: none;
+ padding-right: 0;
+}
+
+.nhc-sla-val {
+ font-family: var(--font-sans);
+ font-size: 28px;
+ font-weight: 700;
+ color: #60A5FA;
+ margin-bottom: 6px;
+}
+
+.nhc-sla-label {
+ font-size: 14px;
+ font-weight: 600;
+ color: #FFFFFF;
+ margin-bottom: 4px;
+}
+
+.nhc-sla-desc {
+ font-size: 12px;
+ color: #94A3B8;
+ line-height: 1.6;
+}
+
+/* FAQ 问答手风琴列表 */
+.nhc-faq-section {
+ padding: 80px 0;
+ background-color: var(--bg-secondary);
+ border-top: 1px solid var(--border-color);
+}
+
+.nhc-faq-container {
+ max-width: 860px;
+ margin: 0 auto;
+}
+
+.nhc-faq-item {
+ background: #FFFFFF;
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-sm);
+ margin-bottom: 16px;
+ overflow: hidden;
+ transition: border-color 0.2s;
+}
+
+.nhc-faq-item.active {
+ border-color: var(--primary);
+}
+
+.nhc-faq-q {
+ padding: 20px 24px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ cursor: pointer;
+ font-family: var(--font-serif);
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--text-primary);
+ user-select: none;
+}
+
+.nhc-faq-q svg {
+ color: var(--text-muted);
+ transition: transform 0.3s;
+}
+
+.nhc-faq-item.active .nhc-faq-q svg {
+ transform: rotate(180deg);
+ color: var(--primary);
+}
+
+.nhc-faq-a {
+ padding: 0 24px 20px;
+ font-size: 14px;
+ line-height: 1.8;
+ color: var(--text-secondary);
+ border-top: 1px solid transparent;
+}
+
+.nhc-faq-item:not(.active) .nhc-faq-a {
+ display: none;
+}
+
+/* 响应式微调 */
+@media (max-width: 1024px) {
+ .nhc-service-detail-inner {
+ grid-template-columns: 1fr;
+ gap: 32px;
+ }
+ .nhc-arch-layer {
+ grid-template-columns: 1fr;
+ gap: 16px;
+ }
+ .nhc-arch-layer-header {
+ border-right: none;
+ border-bottom: 1px solid var(--border-color);
+ padding-bottom: 12px;
+ }
+ .nhc-deliverables-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+ .nhc-sla-banner {
+ grid-template-columns: 1fr;
+ gap: 24px;
+ }
+ .nhc-sla-col {
+ border-right: none;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+ padding-bottom: 16px;
+ }
+ .nhc-sla-col:last-child {
+ border-bottom: none;
+ }
+}
+
+@media (max-width: 768px) {
+ .nhc-page-title {
+ font-size: 32px;
+ }
+ .nhc-service-detail-card {
+ padding: 24px;
+ }
+ .nhc-feature-checklist {
+ grid-template-columns: 1fr;
+ }
+ .nhc-deliverables-grid {
+ grid-template-columns: 1fr;
+ }
+}
diff --git a/tests/ServicesPageTest.php b/tests/ServicesPageTest.php
new file mode 100644
index 0000000..93c4ed7
--- /dev/null
+++ b/tests/ServicesPageTest.php
@@ -0,0 +1,137 @@
+htmlContent = '';
+ if (file_exists($serviceFile)) {
+ $this->htmlContent .= file_get_contents($serviceFile) . "\n";
+ }
+ if (file_exists($listFile)) {
+ $this->htmlContent .= file_get_contents($listFile) . "\n";
+ }
+ if (file_exists($cssFile)) {
+ $this->cssContent = file_get_contents($cssFile);
+ }
+ }
+
+ public function run()
+ {
+ echo "=== 开始执行服务独立页设计规范与内容完整性测试 (TDD) ===\n";
+
+ // 1. 品牌名称必须为纳海川
+ $this->testBrandName();
+
+ // 2. 必备三大服务领域
+ $this->testServiceCategories();
+
+ // 3. 必备板块测试:分类、能力、流程、交付、FAQ
+ $this->testEssentialSections();
+
+ // 4. 去除 AI 味道:真实技术栈与真实业务交付物
+ $this->testNoAiCharacteristics();
+
+ // 5. 禁止项测试(严禁 emoji)
+ $this->testForbiddenElements();
+
+ // 6. 色彩与设计规范
+ $this->testDesignTokens();
+
+ echo "\n测试结果: {$this->passed} 通过, {$this->failed} 失败\n";
+ if ($this->failed > 0) {
+ exit(1);
+ }
+ }
+
+ private function assert($condition, $message)
+ {
+ if ($condition) {
+ echo " [PASS] {$message}\n";
+ $this->passed++;
+ } else {
+ echo " [FAIL] {$message}\n";
+ $this->failed++;
+ }
+ }
+
+ public function testBrandName()
+ {
+ $this->assert(strpos($this->htmlContent, '纳海川') !== false, "服务页必须明确包含品牌名称【纳海川】");
+ $hasWrongAbbr = preg_match('/纳川(?![海])/u', $this->htmlContent);
+ $this->assert(!$hasWrongAbbr, "服务页严禁错误简称为【纳川】");
+ }
+
+ public function testServiceCategories()
+ {
+ $this->assert(strpos($this->htmlContent, '软件开发') !== false, "必须深度包含【软件开发】服务分类");
+ $this->assert(strpos($this->htmlContent, 'APP与小程序定制') !== false || (strpos($this->htmlContent, 'APP定制') !== false && strpos($this->htmlContent, '小程序定制') !== false), "必须深度包含【APP与小程序定制】服务分类");
+ $this->assert(strpos($this->htmlContent, '智能体开发') !== false, "必须深度包含【智能体开发】服务分类");
+ }
+
+ public function testEssentialSections()
+ {
+ // 按照 AGENTS.md 规范:服务页含分类、能力、流程、交付、FAQ
+ $hasCategory = (strpos($this->htmlContent, 'nhc-services-categories') !== false || strpos($this->htmlContent, '服务分类') !== false || strpos($this->htmlContent, '服务矩阵') !== false);
+ $this->assert($hasCategory, "服务页必须包含【分类】板块");
+
+ $hasCapability = (strpos($this->htmlContent, 'nhc-tech-capabilities') !== false || strpos($this->htmlContent, '技术能力') !== false || strpos($this->htmlContent, '技术底座') !== false);
+ $this->assert($hasCapability, "服务页必须包含【能力】(技术底座/核心能力)板块");
+
+ $hasProcess = (strpos($this->htmlContent, 'nhc-delivery-process') !== false || strpos($this->htmlContent, '交付流程') !== false || strpos($this->htmlContent, '研发流程') !== false);
+ $this->assert($hasProcess, "服务页必须包含【流程】(研发交付流程)板块");
+
+ $hasDeliverables = (strpos($this->htmlContent, 'nhc-deliverables') !== false || strpos($this->htmlContent, '交付物') !== false || strpos($this->htmlContent, '交付标准') !== false);
+ $this->assert($hasDeliverables, "服务页必须包含【交付】(标准交付物与SLA保障)板块");
+
+ $hasFaq = (strpos($this->htmlContent, 'nhc-faq') !== false || strpos($this->htmlContent, '常见问答') !== false || strpos($this->htmlContent, '技术问答') !== false);
+ $this->assert($hasFaq, "服务页必须包含【FAQ】(技术与合作问答)板块");
+ }
+
+ public function testNoAiCharacteristics()
+ {
+ // 必须包含具体真实技术栈,去除空话
+ $hasTechStack = (strpos($this->htmlContent, 'Vue') !== false || strpos($this->htmlContent, 'React') !== false || strpos($this->htmlContent, 'Spring') !== false || strpos($this->htmlContent, 'Docker') !== false || strpos($this->htmlContent, '微服务') !== false);
+ $this->assert($hasTechStack, "去AI味道:必须展示具体的企业级技术栈与架构,而非空泛套话");
+
+ // 必须包含具体的交付物明细(如源码、数据库字典、API规范等)
+ $hasRealDeliverables = (strpos($this->htmlContent, '源码') !== false && (strpos($this->htmlContent, '数据库') !== false || strpos($this->htmlContent, 'API') !== false || strpos($this->htmlContent, '文档') !== false));
+ $this->assert($hasRealDeliverables, "去AI味道:必须列出实体交付物清单(源码移交、数据库字典、API文档等)");
+
+ // 包含真实的 SLA 运维时效标准
+ $hasSla = (strpos($this->htmlContent, 'SLA') !== false || strpos($this->htmlContent, '7×24') !== false || strpos($this->htmlContent, '响应') !== false);
+ $this->assert($hasSla, "去AI味道:必须包含具体的运维 SLA 保障标准");
+ }
+
+ public function testForbiddenElements()
+ {
+ $hasEmoji = preg_match('/[\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}]/u', $this->htmlContent);
+ $this->assert(!$hasEmoji, "服务页严禁使用任何 emoji 表情符号");
+ }
+
+ public function testDesignTokens()
+ {
+ $hasSerif = (stripos($this->cssContent, 'SimSun') !== false || stripos($this->cssContent, 'Songti') !== false || stripos($this->cssContent, 'Noto Serif SC') !== false);
+ $this->assert($hasSerif, "必须沿用宋体标题规范");
+
+ $hasPrimary = (stripos($this->cssContent, '#2563EB') !== false || stripos($this->cssContent, '#2563eb') !== false);
+ $this->assert($hasPrimary, "必须沿用科技蓝 #2563EB 主色规范");
+ }
+}
+
+$test = new ServicesPageTest();
+$test->run();