diff --git a/addons/official/view/web/official_product/service_software.html b/addons/official/view/web/official_product/service_software.html
new file mode 100644
index 0000000..5501f49
--- /dev/null
+++ b/addons/official/view/web/official_product/service_software.html
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+ 自主研发 · 源码交付
+
+
企业级软件开发与微服务架构定制
+
+ 面向千万级数据吞吐与复杂业务逻辑流转,纳海川提供高可用微服务中台定制、分布式系统架构重构与异构系统整合研发,100% 移交工程源码与技术文档,支持客户本地私有化部署。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 01
+ 核心中台
+
+
高并发业务中台定制
+
+ 打通会员、商品、订单、库存与资金结算中心,沉淀通用业务能力,支持前端多业务线敏捷调用与快速上线。
+
+
+ 订单路由
+ 分库分表
+ 幂等结算
+
+
+
+
+
+
+ 02
+ 架构升级
+
+
微服务分布式解耦重构
+
+ 针对老旧巨石单体应用进行领域驱动设计(DDD)拆分,引入分布式事务与断路器机制,消除单点故障风险。
+
+
+ Spring Cloud
+ Sentinel
+ 高可用调度
+
+
+
+
+
+
+ 03
+ 系统集成
+
+
异构系统数据管道与 API 网关
+
+ 无缝联通 ERP、CRM、WMS、金税发票及第三方银行资金清算通道,构建统一安全网关与数据校验审计通道。
+
+
+ API网关
+ 异构数据流
+ 全链路审计
+
+
+
+
+
+
+ 04
+ 私有部署
+
+
政企专属合规系统研发
+
+ 适配国产信创芯片与操作系统环境,支持客户内网服务器物理隔绝部署,严格满足网络安全等级保护与合规要求。
+
+
+ 信创适配
+ 物理隔离
+ 等保合规
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 后端工程栈
+
+
Java 17 / Spring Boot 3 / Spring Cloud Alibaba、PHP 8+ / Hyperf 微服务框架、Go 语言高并发网关服务。
+
核心模块平均响应 < 50ms
+
+
+
+
+
+ 持久化与缓存集群
+
+
MySQL 8.0 主从读写分离、ShardingSphere 分库分表、Redis 7 哨兵/集群缓存、Elasticsearch 8 搜索引擎。
+
支持千万级数据量毫秒级召回
+
+
+
+
+
+ 异步消息与调度
+
+
RabbitMQ 延迟队列削峰填谷、Apache Kafka 海量业务流事件回溯、XXL-JOB 分布式任务调度中心。
+
高并发削峰防雪崩保障
+
+
+
+
+
+ 云原生与持续交付
+
+
Docker 容器化封装、Kubernetes 集群编排、GitLab CI / Jenkins 自动化构建部署、Prometheus 全维监控。
+
自动化发布与毫秒级服务自愈
+
+
+
+
+
+
+
+
+
+
+
+
+
01. 调研拆解
+
需求与边界评审
+
明确系统功能边界、非功能指标及业务用例,输出详细需求规格说明书。
+
+
+
02. 架构蓝图
+
架构设计与数据建模
+
确立系统拓扑结构、微服务划分、数据库 ER 关系与接口通信协议。
+
+
+
03. 敏捷开发
+
模块编码与单元自测
+
双周迭代开发,规范分支管理与严格代码审查,单元测试覆盖核心路径。
+
+
+
04. 全面测试
+
并发压测与安全渗透
+
JMeter 压力负载测试、SQL 注入及权限漏洞渗透测试,保障系统无缺陷。
+
+
+
05. 私有上线
+
内网部署与灰度割接
+
指导或协助部署至客户自有云/物理机房,平滑迁移历史数据并灰度上线。
+
+
+
06. 源码移交
+
交付验收与维保陪跑
+
交接全套代码与设计文档,提供技术人员交接培训及 365 天免费质保。
+
+
+
+
+
+
+
+
+
+
+
+
+
代码与工程类交付物
+
+ -
+
+ 完整后端服务工程源码(含完整的 Git 提交历史)
+
+ -
+
+ 完整前端管理后台与客户端源代码
+
+ -
+
+ 生产环境 Dockerfile 与自动化部署 CI/CD 脚本
+
+ -
+
+ 单元测试用例及代码覆盖率验证报告
+
+
+
+
+
+
文档与合规类交付物
+
+ -
+
+ 《系统架构设计说明书》与领域模型架构图
+
+ -
+
+ 《数据库字典说明书》(包含所有表结构与索引设计)
+
+ -
+
+ 标准 OpenAPI 格式的 RESTful 接口规范文档
+
+ -
+
+ 《服务器部署与灾备运维手册》及技术交接培训记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Q1: 软件开发交付后,是否会移交全部源码?后续开发会受限制吗?
+
+ 纳海川交付全部未经编译混淆的完整工程源代码、数据库结构和构建脚本。所有源码知识产权归客户所有,客户可自由组建自有技术团队进行二次开发,不存在任何隐性后门与商业绑定。
+
+
+
+
+
Q2: 针对高并发大流量业务,纳海川如何保障系统的稳定性?
+
+ 我们在架构设计阶段即引入微服务解耦、数据库主从读写分离、Redis 多级缓存与消息队列异步解耦。上线前会执行严苛的分布式压力测试(压测指标明确写入技术协议),保障高负载下核心接口响应时间稳定在 50ms 以内。
+
+
+
+
+
Q3: 交付后的维保服务如何执行?出现故障如何响应?
+
+ 项目验收后提供 365 天首年免费质保,包含系统运行 Bug 修复、突发故障应急排除与系统安全加固。我们提供紧急故障 15 分钟内响应并介入处理的 SLA 保障机制。
+
+
+
+
+
+
+
+
+
+
+ 准备开启您的企业级定制软件工程?
+
+
+ 联系纳海川资深架构师,获得针对您企业实际业务场景的技术架构评估方案与详细实施计划。
+
+
+
+
+
diff --git a/application/extra/addons.php b/application/extra/addons.php
index e561bb4..61cdb65 100644
--- a/application/extra/addons.php
+++ b/application/extra/addons.php
@@ -19,6 +19,9 @@ return [
'/h/journalism/details/[:pid]/[:sid]/[:id]' => 'official/web.official_journalism/details',
'/h/video/list/[:pid]/[:sid]' => 'official/web.official_video/list',
'/h/video/details/[:pid]/[:sid]/[:id]' => 'official/web.official_video/details',
+ '/official/service/software' => 'official/web.official_product/service_software',
+ '/official/service/app' => 'official/web.official_product/service_app',
+ '/official/service/agent' => 'official/web.official_product/service_agent',
'/official/product/list/[:pid]/[:sid]' => 'official/web.official_product/list',
'/official/product/details/[:pid]/[:sid]/[:id]' => 'official/web.official_product/details',
'/official/case_show/list/[:pid]/[:sid]' => 'official/web.official_case_show/list',
diff --git a/tests/DedicatedServicePagesTest.php b/tests/DedicatedServicePagesTest.php
new file mode 100644
index 0000000..c71f99d
--- /dev/null
+++ b/tests/DedicatedServicePagesTest.php
@@ -0,0 +1,65 @@
+assert(file_exists($softwareFile), "软件开发独立页文件必须存在");
+ $this->assert(file_exists($appFile), "APP与小程序定制独立页文件必须存在");
+ $this->assert(file_exists($agentFile), "智能体开发独立页文件必须存在");
+
+ if (file_exists($softwareFile)) {
+ $softwareContent = file_get_contents($softwareFile);
+ $this->assert(strpos($softwareContent, '纳海川') !== false, "软件开发独立页包含品牌【纳海川】");
+ $this->assert(strpos($softwareContent, '微服务') !== false && strpos($softwareContent, '中台') !== false, "软件开发独立页包含微服务与中台");
+ }
+
+ if (file_exists($appFile)) {
+ $appContent = file_get_contents($appFile);
+ $this->assert(strpos($appContent, '纳海川') !== false, "APP小程序独立页包含品牌【纳海川】");
+ $this->assert(strpos($appContent, '60fps') !== false || strpos($appContent, '蓝牙') !== false, "APP小程序独立页包含真实移动工程指标");
+ }
+
+ if (file_exists($agentFile)) {
+ $agentContent = file_get_contents($agentFile);
+ $this->assert(strpos($agentContent, '纳海川') !== false, "智能体独立页包含品牌【纳海川】");
+ $this->assert(strpos($agentContent, 'RAG') !== false || strpos($agentContent, '物理隔离') !== false, "智能体独立页包含RAG与物理隔离保障");
+ }
+
+ if (file_exists($navFile)) {
+ $navContent = file_get_contents($navFile);
+ $this->assert(strpos($navContent, 'service_software') !== false || strpos($navContent, 'service=software') !== false, "导航卡片支持跳转软件开发独立页");
+ $this->assert(strpos($navContent, 'service_app') !== false || strpos($navContent, 'service=app') !== false, "导航卡片支持跳转APP小程序独立页");
+ $this->assert(strpos($navContent, 'service_agent') !== false || strpos($navContent, 'service=agent') !== false, "导航卡片支持跳转智能体独立页");
+ }
+
+ echo "\n测试结果: {$this->passed} 通过, {$this->failed} 失败\n";
+ return $this->failed === 0;
+ }
+
+ private function assert($condition, $message)
+ {
+ if ($condition) {
+ echo " [PASS] {$message}\n";
+ $this->passed++;
+ } else {
+ echo " [FAIL] {$message}\n";
+ $this->failed++;
+ }
+ }
+}
diff --git a/tests/run_tests.py b/tests/run_tests.py
index fff1231..4582b19 100644
--- a/tests/run_tests.py
+++ b/tests/run_tests.py
@@ -270,6 +270,15 @@ def test_journalism_and_articles_suite():
res.assert_true(test_result.wasSuccessful(), f"新闻资讯与文章深度断言全部通过 (共 {test_result.testsRun} 项)")
return res.summary()
+def test_dedicated_service_pages_suite():
+ res = TestResult("三大服务独立页专项测试 (DedicatedServicePages)")
+ from tests.test_dedicated_service_pages import DedicatedServicePagesTest
+ suite = unittest.TestLoader().loadTestsFromTestCase(DedicatedServicePagesTest)
+ runner = unittest.TextTestRunner(verbosity=0)
+ test_result = runner.run(suite)
+ res.assert_true(test_result.wasSuccessful(), f"三大服务独立页断言全部通过 (共 {test_result.testsRun} 项)")
+ return res.summary()
+
def main():
import unittest
results = [
@@ -284,7 +293,8 @@ def main():
test_ad_law_compliance_suite(),
test_natural_copywriting_suite(),
test_homepage_button_links_suite(),
- test_journalism_and_articles_suite()
+ test_journalism_and_articles_suite(),
+ test_dedicated_service_pages_suite()
]
sys.exit(0 if all(results) else 1)
diff --git a/tests/test_dedicated_service_pages.py b/tests/test_dedicated_service_pages.py
new file mode 100644
index 0000000..97a89b0
--- /dev/null
+++ b/tests/test_dedicated_service_pages.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+三大核心服务独立页面 (Dedicated Service Pages) TDD 验证
+覆盖:软件开发独立页、APP与小程序定制独立页、智能体开发独立页
+验证必备板块:分类、能力、流程、交付、FAQ、CTA、设计规范、去AI味道与禁止项,以及导航卡片联动
+"""
+import os
+import re
+import unittest
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+class DedicatedServicePagesTest(unittest.TestCase):
+ def setUp(self):
+ self.software_page = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'service_software.html')
+ self.app_page = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'service_app.html')
+ self.agent_page = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'service_agent.html')
+ self.nav_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_common', 'pc', 'nav.html')
+ self.home_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'index.html')
+ self.controller_path = os.path.join(BASE_DIR, 'addons', 'official', 'controller', 'web', 'OfficialProduct.php')
+
+ def test_01_files_exist(self):
+ """三个独立服务页面模板文件必须全部存在"""
+ self.assertTrue(os.path.exists(self.software_page), "软件开发独立页模板 (service_software.html) 必须存在")
+ self.assertTrue(os.path.exists(self.app_page), "APP与小程序定制独立页模板 (service_app.html) 必须存在")
+ self.assertTrue(os.path.exists(self.agent_page), "智能体开发独立页模板 (service_agent.html) 必须存在")
+
+ def test_02_software_service_page_content(self):
+ """软件开发独立页必须包含完备板块与专业工程实践"""
+ if not os.path.exists(self.software_page):
+ self.fail("service_software.html 不存在")
+ with open(self.software_page, 'r', encoding='utf-8') as f:
+ content = f.read()
+
+ self.assertIn("纳海川", content, "必须包含品牌名【纳海川】")
+ self.assertFalse(re.search(r'纳川(?!海)', content), "严禁简称为【纳川】")
+ self.assertIn("软件开发", content, "核心标题必须体现软件开发")
+ # 必备板块:分类、能力、流程、交付、FAQ
+ self.assertTrue("nhc-services-categories" in content or "分类" in content or "业务场景" in content, "必须包含业务分类或场景板块")
+ self.assertTrue("nhc-tech-capabilities" in content or "能力" in content or "技术底座" in content, "必须包含核心技术能力板块")
+ self.assertTrue("nhc-delivery-process" in content or "流程" in content or "研发流程" in content, "必须包含工程化流程板块")
+ self.assertTrue("nhc-deliverables" in content or "交付" in content or "交付标准" in content, "必须包含交付物清单板块")
+ self.assertTrue("nhc-faq" in content or "FAQ" in content or "常见问答" in content, "必须包含常见问题解答板块")
+
+ # 真实工程栈与去AI化
+ self.assertTrue("微服务" in content and "中台" in content, "必须体现企业级微服务与中台定制能力")
+ self.assertTrue("源码" in content, "必须承诺交付完整源代码")
+ self.assertFalse(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]', content), "严禁使用 emoji")
+
+ def test_03_app_service_page_content(self):
+ """APP与小程序定制独立页必须包含移动生态全覆盖与真实指标"""
+ if not os.path.exists(self.app_page):
+ self.fail("service_app.html 不存在")
+ with open(self.app_page, 'r', encoding='utf-8') as f:
+ content = f.read()
+
+ self.assertIn("纳海川", content, "必须包含品牌名【纳海川】")
+ self.assertFalse(re.search(r'纳川(?!海)', content), "严禁简称为【纳川】")
+ self.assertTrue("APP" in content and "小程序" in content, "核心标题必须体现 APP 与小程序定制")
+ # 必备板块
+ self.assertTrue("分类" in content or "业务场景" in content or "终端覆盖" in content, "必须包含多端覆盖分类板块")
+ self.assertTrue("能力" in content or "技术" in content or "性能规格" in content, "必须包含移动核心能力板块")
+ self.assertTrue("流程" in content or "研发流程" in content, "必须包含端到端交付流程板块")
+ self.assertTrue("交付" in content or "交付物" in content or "交付标准" in content, "必须包含交付清单板块")
+ self.assertTrue("FAQ" in content or "问答" in content, "必须包含常见问题解答板块")
+
+ # 移动特色真实能力
+ self.assertTrue("iOS" in content and "Android" in content and "微信" in content, "必须覆盖 iOS / Android 与微信生态")
+ self.assertTrue("60fps" in content or "蓝牙" in content or "离线" in content, "必须体现真实移动工程指标")
+ self.assertFalse(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]', content), "严禁使用 emoji")
+
+ def test_04_agent_service_page_content(self):
+ """智能体开发独立页必须包含企业级私域合规与知识工程落地"""
+ if not os.path.exists(self.agent_page):
+ self.fail("service_agent.html 不存在")
+ with open(self.agent_page, 'r', encoding='utf-8') as f:
+ content = f.read()
+
+ self.assertIn("纳海川", content, "必须包含品牌名【纳海川】")
+ self.assertFalse(re.search(r'纳川(?!海)', content), "严禁简称为【纳川】")
+ self.assertTrue("智能体" in content, "核心标题必须体现智能体开发")
+ # 必备板块
+ self.assertTrue("分类" in content or "业务场景" in content or "应用矩阵" in content, "必须包含智能体分类与场景板块")
+ self.assertTrue("能力" in content or "技术" in content or "技术底座" in content, "必须包含核心技术底座板块")
+ self.assertTrue("流程" in content or "实施流程" in content, "必须包含工程化实施流程板块")
+ self.assertTrue("交付" in content or "交付物" in content or "交付标准" in content, "必须包含交付物清单板块")
+ self.assertTrue("FAQ" in content or "问答" in content, "必须包含常见技术问答板块")
+
+ # 私有合规与 RAG 真实特征
+ self.assertTrue("RAG" in content or "向量" in content, "必须包含企业级 RAG 向量工程")
+ self.assertTrue("物理隔离" in content or "私有化" in content or "0 外泄" in content or "0外泄" in content, "必须体现内网物理隔离与数据安全保障")
+ self.assertFalse(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]', content), "严禁使用 emoji")
+
+ def test_05_nav_mega_menu_links_to_dedicated_pages(self):
+ """顶部导航服务矩阵中的三个卡片必须分别指向独立的页面"""
+ with open(self.nav_path, 'r', encoding='utf-8') as f:
+ nav_html = f.read()
+
+ # 提取服务下拉菜单中的三个卡片链接
+ self.assertTrue(
+ "service_software" in nav_html or "service=software" in nav_html,
+ "导航【软件开发】卡片必须链接到专属独立页面"
+ )
+ self.assertTrue(
+ "service_app" in nav_html or "service=app" in nav_html,
+ "导航【APP与小程序定制】卡片必须链接到专属独立页面"
+ )
+ self.assertTrue(
+ "service_agent" in nav_html or "service=agent" in nav_html,
+ "导航【智能体开发】卡片必须链接到专属独立页面"
+ )
+
+ def test_06_controller_supports_dedicated_pages(self):
+ """OfficialProduct 控制器必须具备独立页面分发逻辑或独立动作"""
+ with open(self.controller_path, 'r', encoding='utf-8') as f:
+ code = f.read()
+
+ has_software_route = "service_software" in code or "software" in code
+ has_app_route = "service_app" in code or "app" in code
+ has_agent_route = "service_agent" in code or "agent" in code
+ self.assertTrue(has_software_route and has_app_route and has_agent_route, "控制器必须支持软件开发、APP小程序、智能体独立页面")
+
+if __name__ == '__main__':
+ unittest.main()