diff --git a/addons/official/view/web/official_case_show/details.html b/addons/official/view/web/official_case_show/details.html index 860aa5d..79e678a 100644 --- a/addons/official/view/web/official_case_show/details.html +++ b/addons/official/view/web/official_case_show/details.html @@ -1,225 +1,747 @@ -{extend name="web/official_common/pc/base" /} {block name="content"} - - -
-
- - - - {if empty($data)} - -
-
暂无内容
-

该案例不存在或已下架

-

页面可能已被归档,可返回案例列表查看其他项目实录。

- -
- {else/} - -
- -
-
- 项目实录 - -
-

{$data['title']}

-
- - - 发布时间:{:date('Y-m-d H:i', $data['createtime'])} - - - - 所属分类:{:ze($category,'name')} - - {if !empty($data['source'])} - - - 合作客户: - {if !empty($data['source_url'])} - {$data['source']} - {else/} - {$data['source']} - {/if} - - {/if} -
-
- - - - - - {if !empty($data['subheading'])} -
- 核心要点:{$data['subheading']} -
- {/if} - - -
- {$data['content']|htmlspecialchars_decode} -
- - -
-
- -
-
- 贵阳纳海川科技有限公司 · 项目团队 - 项目实录 -
-

以上案例来自纳海川实际交付项目。如有同类业务需求,可预约沟通,我们结合具体场景提供针对性方案,支持源码交付与私有化部署。

-
-
- -
- - -
-
- - -
-
-
- {/if} -
-
- -{/block} +{extend name="web/official_common/pc/base" /} {block name="content"} + + +
+
+ + + + {if empty($data)} + +
+
+ 暂无内容 +
+

+ 该案例不存在或已下架 +

+

+ 页面可能已被归档,可返回案例列表查看其他项目实录。 +

+ +
+ {else/} + +
+ +
+
+ 项目实录 + +
+

{$data['title']}

+
+ + + 发布时间:{:date('Y-m-d H:i', $data['createtime'])} + + + + 所属分类:{:ze($category,'name')} + + {if !empty($data['source'])} + + + 合作客户: {if !empty($data['source_url'])} + {$data['source']} + {else/} + {$data['source']} + {/if} + + {/if} +
+
+ + + + + + {if !empty($data['subheading'])} +
+ 核心要点:{$data['subheading']} +
+ {/if} + + +
+ {$data['content']|htmlspecialchars_decode} +
+ + +
+
+ +
+
+ 贵阳纳海川科技有限公司 · 项目团队 + 项目实录 +
+

+ 以上案例来自纳海川实际交付项目。如有同类业务需求,可预约沟通,我们结合具体场景提供针对性方案,支持源码交付与私有化部署。 +

+
+
+ +
+ + +
+
+ + +
+
+
+ {/if} +
+
+ +{/block} diff --git a/addons/official/view/web/official_case_show/details_e.html b/addons/official/view/web/official_case_show/details_e.html index 7209713..71446c3 100644 --- a/addons/official/view/web/official_case_show/details_e.html +++ b/addons/official/view/web/official_case_show/details_e.html @@ -1,155 +1,497 @@ -{extend name="web/official_common/mobile/base" /} - -{block name="content"} - - -
- - - - - {if empty($data)} - -
-
暂无内容
-

该案例不存在或已下架

-

页面可能已被归档,可返回案例列表查看其他项目实录。

-
- 返回案例列表 - 预约咨询 -
-
- {else/} - -
- -
-
- 项目实录 - {:ze($category,'name')} -
-

- {$data['title']} -

-
- {:date('Y-m-d H:i', $data['createtime'])} - {:ze($category,'name')} - {if !empty($data['source'])} - 合作客户:{$data['source']} - {/if} -
-
- - - - - {if !empty($data['subheading'])} -
- {$data['subheading']} -
- {/if} - - -
- {$data['content']|htmlspecialchars_decode} -
- - -
- 项目团队说明:以上案例来自纳海川实际交付项目。如有同类业务需求,可预约沟通,我们结合具体场景提供针对性方案,支持源码交付与私有化部署。 -
-
- 预约咨询 - 电话咨询 - 返回案例列表 -
- - -
- - -
- -
- {/if} - -
- -{/block} +{extend name="web/official_common/mobile/base" /} {block name="content"} + + +
+ + + + {if empty($data)} + +
+
+ 暂无内容 +
+

+ 该案例不存在或已下架 +

+

+ 页面可能已被归档,可返回案例列表查看其他项目实录。 +

+
+ 返回案例列表 + 预约咨询 +
+
+ {else/} + +
+
+
+ 项目实录 + {:ze($category,'name')} +
+

+ {$data['title']} +

+
+ {:date('Y-m-d H:i', $data['createtime'])} + {:ze($category,'name')} + {if !empty($data['source'])} + 合作客户:{$data['source']} + {/if} +
+
+ + + + + {if !empty($data['subheading'])} +
+ {$data['subheading']} +
+ {/if} + + +
+ {$data['content']|htmlspecialchars_decode} +
+ + +
+ 项目团队说明:以上案例来自纳海川实际交付项目。如有同类业务需求,可预约沟通,我们结合具体场景提供针对性方案,支持源码交付与私有化部署。 +
+
+ 预约咨询 + 电话咨询 + 返回案例列表 +
+ + +
+ + +
+
+ {/if} +
+ +{/block} diff --git a/addons/official/view/web/official_case_show/list.html b/addons/official/view/web/official_case_show/list.html index 2266be5..d7f5bd2 100644 --- a/addons/official/view/web/official_case_show/list.html +++ b/addons/official/view/web/official_case_show/list.html @@ -1,527 +1,21 @@ -{extend name="web/official_common/pc/base" /} {block name="content"} - - - -
-
-
- 首页 - / - 客户案例 -
-
- 项目实效 · 业务复盘 -
-

客户项目案例 · 问题与解决方式

-

- 纳海川以严格的工程规范,为政企单位、智能制造、连锁商业零售及供应链企业定制稳定好用的数字化系统,交付完整源码。 -

-
-
- - -
-
- -
- - - - - -
- - -
- -
-
- 商贸批发 · 数字中台 - 成果验证 -
-

- 大型快消供应链集团「全渠道分销商城与订货中台」 -

-
-
- 业务挑战 CHALLENGE -

- 跨区域经销商传统订货繁杂,人工拆单对账耗时久,高峰期锁库超时常导致断货漏单。 -

-
-
- 技术方案 SOLUTION -

- 重构分布式微服务订货中台,接入等级阶梯价、信用授信账期管控及自动分单对账功能。 -

-
-
-
-
- - - - 系统功能界面 · - B2B分销调度看板与多商户分账中心 -
-
-
- 分布式微服务弹性架构 -
-
- 架构分层: 微服务集群 - 数据治理: 主从读写分离 - 交易对账: - 防重复扣款与对账 -
-
-
-
- 快消供应链集团全渠道分销中台大屏视窗 -
-
-
-
峰值调度
-
跨区域订单拆单
-
-
-
耗时缩短
-
- 跨区域多仓对账时效 -
-
-
-
集群保障
-
微服务集群保障
-
-
-
- - - - 已通过客户信息技术中心联合终验,各项业务流程已上线运行。 -
-
- - -
-
- 连锁零售 · 软硬一体 - 成果验证 -
-

- 知名区域连锁餐饮「全场景智能收银与门店一体化」 -

-
-
- 业务挑战 CHALLENGE -

- 就餐高峰期前台排队拥堵严重,断网断电导致收银死机与掉单丢单,前后端数据脱节导致物料报表失真。 -

-
-
- 技术方案 SOLUTION -

- 部署软硬一体化收银系统与后厨 KDS - 联动看板,对接微信扫码点餐、离线聚合支付与实时扣料核销。 -

-
-
-
-
- - - - 系统功能界面 · 软硬件一体收银台与后厨 KDS - 联动看板 -
-
-
- 断网离线双向同步 -
-
- 脱机存储: 本地 SQLite - 联网回传: 自动同步防重复 - 外设硬件兼容: - 主流设备适配 -
-
-
- -
- 全国连锁餐饮智能收银与后厨KDS联动视窗 -
-
-
-
多门店覆盖
-
- 软硬一体化门店覆盖 -
-
-
-
用时缩短
-
- 高峰期前台排队用时 -
-
-
-
离线可用
-
- 断网断电脱机正常收银 -
-
-
-
- - - - 已通过连锁品牌运营管理中心联合终验,通过断网断电压力测试。 -
-
- - -
-
- 智能制造 · 进销存 ERP - 成果验证 -
-

- 高端装备制造企业「生产进销存与供应链敏捷协同」 -

-
-
- 业务挑战 CHALLENGE -

- 零配件品类繁杂,采购节拍与装配生产脱节,呆滞物料占用资金且难以追溯批次质量。 -

-
-
- 技术方案 SOLUTION -

- 定制进销存管理系统,建立动态物料 BOM - 匹配、安全库存预警与供应商端协同门户。 -

-
-
-
-
- - - - 系统功能界面 · 物料 BOM - 批次全流程溯源与多仓动态调拨 -
-
-
- 精益进销存与业财联动 -
-
- 物料BOM: 多层级装配结构 - 安全库存: 动态阈值告警 - 业财对接: 凭证联查追溯 -
-
-
-
- 装备制造进销存与数字化车间MES视窗 -
-
-
-
动态BOM
-
- 多层装配与缺料预警 -
-
-
-
批次追溯
-
一物一码生命周期
-
-
-
协同门户
-
- 供应商在线协同送货 -
-
-
-
- - - - 已通过装备制造集团信息化专家组终验验收,实现与既有 ERP - 系统集成。 -
-
- - -
-
- 政企服务 · AI 智能体 - 成果验证 -
-

- 知识密集型政务机构「专属 RAG 业务审核智能体」 -

-
-
- 业务挑战 CHALLENGE -

- 政策法规与历史案例分散在多个库中,人工跨部门查重检索耗时耗力,初审标准难统一且存在合规漏洞。 -

-
-
- 技术方案 SOLUTION -

- 构建基于私有大模型与向量数据库的 RAG - 智能体,自动检索法规依据并输出规范化核查报告。 -

-
-
-
-
- - - - 系统功能界面 · 政策法规 RAG - 向量检索与合规审核视窗 -
-
-
- 私域大模型内网隔离 -
-
- 部署形态: 内网隔离部署 - 检索机制: 语义检索 - 安全审计: 溯源留痕可查 -
-
-
-
- 政企专属AI知识库与审批智能体操作视窗 -
-
-
-
纯内网部署
-
内网部署数据可控
-
-
-
法规溯源
-
标注原文出处
-
-
-
人机协同
-
初审辅助专家终审
-
-
-
- - - - 已通过政企网络安全与合规审计部门联合终验,符合等保合规要求,数据不出内网 -
-
-
-
-
- - -
- 服务涵盖政企金融、先进制造、新零售及现代物流领域的客户 -
-
商贸流通企业
-
装备制造企业
-
信息技术企业
-
连锁零售企业
-
农特产品企业
-
医药物流企业
-
-
- - -
-
-
-
- 务实方案 -

- 面临类似的业务系统瓶颈?我们可以提供针对性方案 -

-

- 无论是现有系统升级改造,还是新业务急需上线,纳海川可提供架构设计与实操建议,帮助控制试错成本。 -

-
- -
-
-
- - - - +{extend name="web/official_common/pc/base" /} +{block name="css"} + + {/block} +{block name="content"} +
+ +跳至案例列表 +

纳海川 / 项目案例

从业务问题,
了解系统建设。

围绕交易、门店、生产与知识管理,介绍数字化系统的业务挑战、实施方案和交付内容,供项目选型与需求沟通参考。

浏览项目

案例隐去客户名称与联系人;配图为抽象示意。具体实施范围、运行条件与验收资料,可在沟通中按约定确认。

+

按服务类型浏览案例

共 4 个项目

+
商贸流通业务的抽象建筑模型
01 / 商贸流通抽象示意
商贸流通软件开发 / 商城

分销商城与订货管理

衔接经销商订货、库存分配与结算,整理多渠道订单的处理规则。

  • 自动分单与规则配置
  • 客户等级与账期管理
  • 多仓库存与业务对账
项目说明
业务挑战
跨区域订货涉及客户等级、价格与账期,人工拆单和多仓对账工作较多,高峰时段需要协调订单与库存。
实施方案
梳理客户、商品、订单和库存关系,配置等级价格、授信账期及自动分单,对接仓储与结算流程。
交付内容
订货、订单拆分、库存记录与对账等业务模块,以及项目约定的接口、部署资料和验收清单。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
连锁餐饮业务的抽象建筑模型
02 / 连锁餐饮抽象示意
连锁餐饮移动应用 / 收银

门店收银与后厨协同

围绕前台收款、后厨出餐与总部对账,衔接门店日常操作。

  • 点单与后厨状态联动
  • 本地记录与自动同步防重复
  • 门店销售与总部对账
项目说明
业务挑战
就餐高峰的点单、出餐和收款需要协同,网络异常时的单据保存与恢复同步也需要明确处理方式。
实施方案
连接收银、微信扫码点餐与后厨看板,按业务规则处理订单流转、物料核销及本地记录补传。
交付内容
门店点单、收银记录、后厨协同与对账等功能。离线操作范围及支付可用性需区分设备、网络和支付渠道条件。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
装备制造业务的抽象建筑模型
03 / 装备制造抽象示意
装备制造软件开发 / 进销存

生产进销存与供应商协同

关联物料、采购、生产与交付记录,完善多部门之间的业务衔接。

  • 动态 BOM 与物料结构
  • 批次记录与多仓调拨
  • 采购与供应商业务协同
项目说明
业务挑战
物料层级和生产用料关系较复杂,采购、仓储与生产记录分散,批次追踪及多仓调拨需要统一规则。
实施方案
建立动态 BOM 物料结构,整理采购、出入库与生产领料流程,配置批次追踪和多仓调拨记录。
交付内容
物料结构、采购库存、生产用料及供应商协作等模块,按项目范围核对业务单据、数据关系与接口记录。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
知识管理业务的抽象建筑模型
04 / 知识管理抽象示意
知识管理企业智能体

知识库与业务审核辅助

将制度与业务资料整理入库,为资料查询和初步核对提供依据。

  • 知识检索与原文引用
  • 按角色管理资料访问
  • 初步核对与人工复核
项目说明
业务挑战
制度和业务资料分散,人工查询、比对材料耗时,审核过程需要保留引用来源并区分辅助判断与人工结论。
实施方案
通过检索增强生成(RAG)关联业务文档,配置访问权限、原文引用和审核辅助流程,关键结论交由业务人员复核。
交付内容
知识检索、引用展示、权限管理及业务辅助流程。按约定资料与问题集开展效果评测,部署边界另行确认。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
+

项目沟通

比对案例时,可以先看这三点

  1. 01

    业务流程是否相近

    确认使用角色、关键操作和数据流转,避免只按行业名称判断。

  2. 02

    现有条件能否衔接

    了解接口、设备、网络与资料条件,明确需要复用和调整的部分。

  3. 03

    交付标准如何确认

    通过业务用例、数据验证与验收清单,明确功能范围和验证方式。

+

讨论您的项目

你的业务也遇到类似问题?

说明当前业务、现有系统与主要问题,我们据此评估实施范围。

沟通项目需求 电话咨询 {:__config('site_mobile','value')}
+
+{/block} +{block name="js"}{/block} diff --git a/addons/official/view/web/official_case_show/list_e.html b/addons/official/view/web/official_case_show/list_e.html index 7302430..c970253 100644 --- a/addons/official/view/web/official_case_show/list_e.html +++ b/addons/official/view/web/official_case_show/list_e.html @@ -1,832 +1,21 @@ -{extend name="web/official_common/mobile/base" /} {block name="content"} - -
- -
-
- 项目实效 · 业务复盘 -
-

- 客户项目案例 · 问题与解决方式 -

-

- 纳海川坚持严谨工程标准,为政企单位、智能制造与连锁商超开发稳定可控的数字化系统。 -

-
- - -
- - - - - -
- - -
- -
-
- 商贸批发 · 数字中台 - 成果验证 -
-

- 大型快消供应链集团「全渠道分销商城与订货中台」 -

-
- 快消供应链集团全渠道分销中台大屏视窗 -
-
-
-
- 业务挑战 CHALLENGE -
-

- 跨区域经销商传统订货繁杂,人工拆单对账耗时久,高峰期锁库超时常导致断货漏单。 -

-
-
-
- 技术方案 SOLUTION -
-

- 重构分布式微服务订货中台,接入等级阶梯价、信用授信账期管控及自动分单对账功能。 -

-
-
-
-
-
- 峰值调度 -
-
- 跨区域订单拆单 -
-
-
-
- 耗时缩短 -
-
- 多仓对账时效 -
-
-
-
- 集群保障 -
-
- 集群运行保障 -
-
-
-
- - -
-
- 连锁零售 · 软硬一体 - 成果验证 -
-

- 知名区域连锁餐饮「全场景智能收银与门店一体化」 -

-
- 全国连锁餐饮智能收银与后厨KDS联动视窗 -
-
-
-
- 业务挑战 CHALLENGE -
-

- 就餐高峰期前台排队拥堵严重,断网断电导致收银死机与掉单丢单,前后端数据脱节导致物料报表失真。 -

-
-
-
- 技术方案 SOLUTION -
-

- 部署软硬一体化收银系统与后厨 KDS - 联动看板,对接微信扫码点餐、离线聚合支付与实时扣料核销。 -

-
-
-
-
-
- 多门店覆盖 -
-
- 门店网点覆盖 -
-
-
-
- 用时缩短 -
-
- 排队等候耗时 -
-
-
-
- 离线可用 -
-
- 脱机正常收银 -
-
-
-
- - -
-
- 智能制造 · 进销存 ERP - 成果验证 -
-

- 高端装备制造企业「生产进销存与供应链敏捷协同」 -

-
- 装备制造进销存与数字化车间MES视窗 -
-
-
-
- 业务挑战 CHALLENGE -
-

- 零配件品类繁杂,采购节拍与装配生产脱节,呆滞物料占用资金且难以追溯批次质量。 -

-
-
-
- 技术方案 SOLUTION -
-

- 定制进销存管理系统,建立动态物料 BOM - 匹配、安全库存预警与供应商端协同门户。 -

-
-
-
-
-
- 动态BOM -
-
- 装配缺料预警 -
-
-
-
- 批次追溯 -
-
- 一物一码追溯 -
-
-
-
- 协同门户 -
-
- 供应商在线送货 -
-
-
-
- - -
-
- 政企服务 · AI 智能体 - 成果验证 -
-

- 知识密集型政务机构「专属 RAG 业务审核智能体」 -

-
- 政企专属AI知识库与审批智能体操作视窗 -
-
-
-
- 业务挑战 CHALLENGE -
-

- 政策法规与历史案例分散在多个库中,人工跨部门查重检索耗时耗力,初审标准难统一且存在合规漏洞。 -

-
-
-
- 技术方案 SOLUTION -
-

- 构建基于私有大模型与向量数据库的 RAG - 智能体,自动检索法规依据并输出规范化核查报告。 -

-
-
-
-
-
- 纯内网部署 -
-
- 内网隔离不外泄 -
-
-
-
- 法规溯源 -
-
- 标注原文出处 -
-
-
-
- 人机协同 -
-
- 初审辅助专家终审 -
-
-
-
-
- - -
-

- 预约架构师 1 对 1 方案研讨 -

-

- 纳海川团队 24 小时内响应,输出定制方案 -

- - 立即预约业务诊断 - -
-
- - - - +{extend name="web/official_common/mobile/base" /} +{block name="css"} + + {/block} +{block name="content"} +
+
纳海川NAHAICHUAN联系咨询
菜单
+跳至案例列表 +

纳海川 / 项目案例

从业务问题,
了解系统建设。

围绕交易、门店、生产与知识管理,介绍数字化系统的业务挑战、实施方案和交付内容,供项目选型与需求沟通参考。

浏览项目

案例隐去客户名称与联系人;配图为抽象示意。具体实施范围、运行条件与验收资料,可在沟通中按约定确认。

+

按服务类型浏览案例

共 4 个项目

+
商贸流通业务的抽象建筑模型
01 / 商贸流通抽象示意
商贸流通软件开发 / 商城

分销商城与订货管理

衔接经销商订货、库存分配与结算,整理多渠道订单的处理规则。

  • 自动分单与规则配置
  • 客户等级与账期管理
  • 多仓库存与业务对账
项目说明
业务挑战
跨区域订货涉及客户等级、价格与账期,人工拆单和多仓对账工作较多,高峰时段需要协调订单与库存。
实施方案
梳理客户、商品、订单和库存关系,配置等级价格、授信账期及自动分单,对接仓储与结算流程。
交付内容
订货、订单拆分、库存记录与对账等业务模块,以及项目约定的接口、部署资料和验收清单。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
连锁餐饮业务的抽象建筑模型
02 / 连锁餐饮抽象示意
连锁餐饮移动应用 / 收银

门店收银与后厨协同

围绕前台收款、后厨出餐与总部对账,衔接门店日常操作。

  • 点单与后厨状态联动
  • 本地记录与自动同步防重复
  • 门店销售与总部对账
项目说明
业务挑战
就餐高峰的点单、出餐和收款需要协同,网络异常时的单据保存与恢复同步也需要明确处理方式。
实施方案
连接收银、微信扫码点餐与后厨看板,按业务规则处理订单流转、物料核销及本地记录补传。
交付内容
门店点单、收银记录、后厨协同与对账等功能。离线操作范围及支付可用性需区分设备、网络和支付渠道条件。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
装备制造业务的抽象建筑模型
03 / 装备制造抽象示意
装备制造软件开发 / 进销存

生产进销存与供应商协同

关联物料、采购、生产与交付记录,完善多部门之间的业务衔接。

  • 动态 BOM 与物料结构
  • 批次记录与多仓调拨
  • 采购与供应商业务协同
项目说明
业务挑战
物料层级和生产用料关系较复杂,采购、仓储与生产记录分散,批次追踪及多仓调拨需要统一规则。
实施方案
建立动态 BOM 物料结构,整理采购、出入库与生产领料流程,配置批次追踪和多仓调拨记录。
交付内容
物料结构、采购库存、生产用料及供应商协作等模块,按项目范围核对业务单据、数据关系与接口记录。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
知识管理业务的抽象建筑模型
04 / 知识管理抽象示意
知识管理企业智能体

知识库与业务审核辅助

将制度与业务资料整理入库,为资料查询和初步核对提供依据。

  • 知识检索与原文引用
  • 按角色管理资料访问
  • 初步核对与人工复核
项目说明
业务挑战
制度和业务资料分散,人工查询、比对材料耗时,审核过程需要保留引用来源并区分辅助判断与人工结论。
实施方案
通过检索增强生成(RAG)关联业务文档,配置访问权限、原文引用和审核辅助流程,关键结论交由业务人员复核。
交付内容
知识检索、引用展示、权限管理及业务辅助流程。按约定资料与问题集开展效果评测,部署边界另行确认。
业务结构抽象示意,非客户系统截图
业务结构示意 · 用于说明方案
+
+

项目沟通

比对案例时,可以先看这三点

  1. 01

    业务流程是否相近

    确认使用角色、关键操作和数据流转,避免只按行业名称判断。

  2. 02

    现有条件能否衔接

    了解接口、设备、网络与资料条件,明确需要复用和调整的部分。

  3. 03

    交付标准如何确认

    通过业务用例、数据验证与验收清单,明确功能范围和验证方式。

+

讨论您的项目

你的业务也遇到类似问题?

说明当前业务、现有系统与主要问题,我们据此评估实施范围。

沟通项目需求 电话咨询 {:__config('site_mobile','value')}
+
+{/block} +{block name="js"}{/block} diff --git a/addons/official/view/web/official_common/mobile/link.html b/addons/official/view/web/official_common/mobile/link.html index d816f4d..088ba22 100644 --- a/addons/official/view/web/official_common/mobile/link.html +++ b/addons/official/view/web/official_common/mobile/link.html @@ -1,4 +1,5 @@ + @@ -8,4 +9,4 @@ - \ No newline at end of file + diff --git a/addons/official/view/web/official_common/pc/link.html b/addons/official/view/web/official_common/pc/link.html index 49d1682..efbef0f 100644 --- a/addons/official/view/web/official_common/pc/link.html +++ b/addons/official/view/web/official_common/pc/link.html @@ -1,11 +1,12 @@ - - - - - - - - - - - + + + + + + + + + + + + diff --git a/addons/official/view/web/official_common/pc/nav.html b/addons/official/view/web/official_common/pc/nav.html index 09764ad..fc95600 100644 --- a/addons/official/view/web/official_common/pc/nav.html +++ b/addons/official/view/web/official_common/pc/nav.html @@ -4,31 +4,70 @@
- + 预约演示 - + + +
- \ No newline at end of file + diff --git a/addons/official/view/web/official_home/index.html b/addons/official/view/web/official_home/index.html index c15d592..1f3222f 100644 --- a/addons/official/view/web/official_home/index.html +++ b/addons/official/view/web/official_home/index.html @@ -1,1907 +1,31 @@ -{extend name="web/official_common/pc/base" /} {block name="content"} - - - - - - - -
-
-
- -

系统开发与长期维护

-

- 三类服务均可独立承接,也可组合实施;功能范围与验收标准以合同约定为准。 -

-
-
- -
- -
- 壹 -
- 企业业务系统与多系统对接示意 -
-
- - - - - -
-

软件开发

-

- 承接企业业务系统与内部管理系统的定制开发,包括多系统数据对接、权限与流程配置、报表与对账等模块。 -

-
    -
  • 业务系统与内部管理系统定制
  • -
  • - 多系统数据对接与权限、流程配置 -
  • -
  • - 源码交付,可部署在客户自有服务器或内网 -
  • -
  • - 代码审查、接口文档与数据库字典配套交付 -
  • -
- - 了解详情 - - - - -
- - -
- 贰 -
- 移动端 APP 与微信小程序多端界面 -
-
- - - - -
-

APP与小程序定制

-

- 承接 iOS、Android - 应用与微信小程序开发,多端可共用同一套后台;涉及蓝牙外设或硬件对接时单独评估。 -

-
    -
  • - iOS / Android 应用与微信小程序 -
  • -
  • - 与现有账号、订单、支付系统对接 -
  • -
  • - 蓝牙外设与物联网设备数据接入 -
  • -
  • - 低端机型的启动速度与列表滚动优化 -
  • -
- - 了解详情 - - - - -
- - -
- 叁 -
- 私有化 AI 与内部知识库示意 -
-
- - - -
-

智能体开发

-

- 基于开源大模型与企业内部资料搭建问答与检索工具,回答附带文档出处;数据存于客户内网,不经过我方服务器。 -

-
    -
  • - 内部制度、法规与文档的知识库检索 -
  • -
  • - 回答标注原文出处,供人工复核 -
  • -
  • 审批、工单等流程的辅助处理
  • -
  • 内网部署,不依赖外部接口
  • -
- - 了解详情 - - - - -
-
-
-
- - - -
-
-
- -

标准化业务系统

-

- 覆盖线上交易、门店结算、供应链管理与多租户运营场景,支持公有云订阅或私有化源码交付;各版本功能差异见产品页版本选型。 -

-
-
- -
- -
-
- 商城系统管理后台 -
-
- 零售 · 全渠道 -

商城

-

- 支持多商户入驻、分销、拼团秒杀等营销功能,可对接微信、支付宝支付。 -

-
-
    -
  • - - - - 微信小程序、H5、APP 三端订单与库存同步 -
  • -
  • - - - - 分销、拼团、秒杀、优惠券与积分 -
  • -
  • - - - - 供应商结算与佣金分账 -
  • -
- -
- - -
-
- 收银系统与扫码、打印外设 -
-
- 门店零售 · 扫码结算 -

收银

-

- 收银软件对接扫码枪、小票打印机、钱箱等外设,单笔结算一般在数秒内完成。 -

-
-
    -
  • - - - - 微信、支付宝等扫码支付;银行卡视收单渠道而定 -
  • -
  • - - - - 断网时离线记账,恢复联网后自动上传并核对差异 -
  • -
  • - - - - 对接扫码枪、计价秤与小票打印机 -
  • -
- -
- - -
-
- 进销存与财务数据界面 -
-
- 采购 · 销售 · 库存 -

进销存

-

- 采购、销售、仓储与财务数据打通的进销存系统,可按商品、客户、项目核算。 -

-
-
    -
  • - - - - 多仓库调拨与库存上下限预警 -
  • -
  • - - - - 批次与保质期管理,出入库可扫码追溯 -
  • -
  • - - - - 按商品、客户、项目生成毛利与经营报表 -
  • -
- -
- - -
-
- 多租户 SaaS 平台管理界面 -
-
- 多租户 · 按账号开通 -

SaaS版本

-

- 多租户 SaaS - 平台,按账号开通;数据按租户隔离,也可为单个客户部署独立数据库。 -

-
-
    -
  • - - - - 多租户数据隔离,可选用独立数据库 -
  • -
  • - - - - 支持容器化部署、多实例与数据备份 -
  • -
  • - - - - 提供 OpenAPI 接口文档,用于第三方系统对接 -
  • -
- -
-
-
-
- - - -
-
-
- -

项目案例:业务挑战与技术方案

-

- 以下案例已隐去企业名称与联系人;如需了解交付范围与验收情况,欢迎预约沟通。 -

-
-
- -
- -
-
- 商贸批发 · 分销订货 - 脱敏案例 -
-

- 快消品经销企业「全渠道分销与订货中台」 -

-
- 分销订货中台界面 -
-
-
- 业务挑战 - 多区域经销商的价格与账期政策不统一,订单依赖人工汇总录入,处理周期长且易出错。 -
-
- 解决方案 - 按经销商等级配置价格与账期,订单提交后校验库存和信用额度,再按仓库拆单。 -
-
-
-
-
订单校验
-
- 价格、库存、信用额度 -
-
-
-
分级价格
-
按经销商等级配置
-
-
-
弹性扩容
-
按并发量横向扩展
-
-
-
- - 查看案例 - - - - -
-
- - -
-
- 连锁餐饮 · 收银与门店管理 - 脱敏案例 -
-

- 连锁餐饮品牌「收银与门店管理一体化」 -

-
- 收银与后厨看板界面 -
-
-
- 业务挑战 - 高峰时段前台排队时间长,点单信息依赖人工传递至后厨;门店物料消耗缺少记录。 -
-
- 解决方案 - 收银与后厨看板联动:扫码点单后自动打印到后厨,支付完成即扣减对应物料。 -
-
-
-
-
离线记账
-
联网后自动上传
-
-
-
后厨联动
-
- 点单打印与物料扣减 -
-
-
-
多端适配
-
- 收银机、打印机、扫码枪 -
-
-
-
- - 查看案例 - - - - -
-
- - -
-
- 装备制造 · 进销存 - 脱敏案例 -
-

- 装备制造企业「生产进销存与供应商协同」 -

-
-
- 业务挑战 - 零部件品类多,采购计划与装配进度不匹配,部分物料长期积压。 -
-
- 解决方案 - 按 BOM - 计算缺料,设置库存上下限预警,供应商在门户内确认送货计划。 -
-
-
-
-
BOM 缺料
-
按 BOM 逐层计算
-
-
-
批次追溯
-
出入库扫码记录
-
-
-
供应商门户
-
在线确认送货计划
-
-
-
- - 查看案例 - - - - -
-
- - -
-
- 政务服务 · 知识库辅助 - 脱敏案例 -
-

- 政务机构「基于知识库的审核辅助智能体」 -

-
-
- 业务挑战 - 制度与历史档案数量大,人工查证耗时,不同经办人的判断标准不一致。 -
-
- 解决方案 - 将制度与法规整理为知识库,审核时检索相关条款并附出处,由经办人复核。 -
-
-
-
-
内网部署
-
数据不出机房
-
-
-
法规溯源
-
标注原文出处
-
-
-
人机协同
-
- 机器初审,专家终审 -
-
-
-
- - 查看案例 - - - - -
-
-
- -
- - 浏览案例 - - - - -
-
-
- - - -
-
-
- -

项目推进流程

-

- 以下五个阶段为常规流程,具体项目按合同调整;每个阶段结束均提供文档或可运行系统,确认后进入下一阶段。 -

-
-
- -
- -
-
01
-

需求调研与方案确认

-

- 由架构师调研,梳理现有流程与系统边界,输出需求规格说明书和可行性评估,双方确认后进入设计。 -

-
- - -
-
02
-

架构设计与技术选型

-

- 按业务规模、数据量和客户运维能力确定架构(单体或微服务)、数据库与缓存方案,并给出部署拓扑与容量估算。 -

-
- - -
-
03
-

编码、审查与测试

-

- 代码合并前执行审查与 CI - 构建;接口与核心流程编写自动化测试用例,测试记录随版本归档。 -

-
- - -
-
04
-

压力测试与安全测试

-

- 按约定并发量进行压力测试,检查权限、越权与常见注入风险;需要第三方渗透测试报告时另行委托。 -

-
- - -
-
05
-

部署、移交与运维支持

-

- 部署到客户专有云或机房内网,交付源码、部署文档与数据库字典,并按合同约定的 - SLA 响应。 -

-
-
- -
- - 研发规范 - - - - -
-
-
- - - -
-
-
- -

客户反馈

-

- 以下反馈经受访者同意后引用,并按对方要求隐去企业名称与姓名。 -

-
-
- -
-
-
“
-

- 订货中台重构后,大促当天订单未出现积压,库存与财务账目一致。沟通直接,变更均有记录。 -

-
-
企
-
- 供应链企业 · 技术负责人 - 订货中台项目 -
-
-
- -
-
“
-

- 收银员半天即可上手。门店断网时仍可正常收银,网络恢复后单据自动补传,月底对账工作量明显减少。 -

-
-
企
-
- 连锁零售企业 · 运营负责人 - 门店收银项目 -
-
-
- -
-
“
-

- 智能体部署在内网,数据不出机房,已通过信息中心审查。检索结果附原文出处,业务人员可直接使用。 -

-
-
企
-
- 装备制造企业 · 信息中心负责人 - 知识库项目 -
-
-
-
- - -
- 常见项目类型(客户名称按约定不公开) -
-
-
- 商贸流通 - 分销订货与库存管理 -
-
- 装备制造 - 生产物料与供应商协同 -
-
- 政务与企业服务 - 制度检索与审核辅助 -
-
- 零售与餐饮 - 门店收银与库存管理 -
-
- 农产品与快消 - 线上商城与分销 -
-
- 医药与冷链 - 批次追溯与效期管理 -
-
-
-
- - - -
-
- -
-
-
- 新闻资讯 - NEWS & INSIGHTS -
-

- 公司新闻与行业动态 -

-

- 记录架构选型、性能排查与项目交付中的具体做法。 -

-
- - 更多动态 - - - - -
- - -
- {if !empty($information['data'])} {foreach name="information.data" - id="art" key="idx" offset="0" length="4"} -
- - {php} $cover_fallbacks = [ - '/assets/addons/official/images/articles/article_cache.svg', - '/assets/addons/official/images/articles/article_mysql_page.svg', - '/assets/addons/official/images/articles/article_xxl_job.svg', - '/assets/addons/official/images/articles/article_redis_split.svg', - ]; $img_val = !empty($art['image']) ? $art['image'] : ''; if - (empty($img_val) || strpos($img_val, - 'article_microservice.svg') !== false) { $cover_src = - isset($cover_fallbacks[$idx]) ? $cover_fallbacks[$idx] : - '/assets/addons/official/images/articles/article_microservice.svg'; - } else { $cover_src = $img_val; } {/php} - {$art['title']} - -
- - -

{$art['title']}

-
-

{$art['subheading']}

-
- - 阅读全文 - - - - -
-
-
- {/foreach} {else/} - - - - {/if} -
-
-
- - - -
-
-
-
- 联系我们 -

- 有具体的系统研发或产品选型需求?可以直接沟通 -

-

- 由架构师直接对接,确认业务流程、现有系统与部署环境后,提供方案、工期与预算区间。 -

-
- -
-
-
- - - -{/block} {block name="js"} - +{extend name="web/official_common/pc/base" /} +{block name="css"} + + +{/block} +{block name="content"} +
+ +跳至服务内容 +
+ 远山与庭院之间,蓝色玻璃曲线沿水面延展 +

纳海川科技 / 企业软件服务

为企业经营,
做好每一套软件。

软件定制、APP与小程序、企业智能体。
从业务梳理到上线维护,提供完整的研发服务。

+
立足贵阳 · 服务全国探索我们的服务 NAHAICHUAN TECHNOLOGY
+
+
以业务为起点先了解流程,再确定方案
以交付为依据阶段成果确认,过程有据可查
以使用为目标兼顾上线运行与后续维护
+

01 / 专业服务

系统开发与长期维护

从企业日常经营出发,
把实际业务需求转化为可用的软件。

全部服务
01

软件开发

围绕订单、库存、财务与内部协同,开发符合企业实际流程的业务系统。

业务系统定制 · 系统集成 · 旧系统改造
了解服务
02

APP与小程序定制

面向客户服务、移动办公与门店经营,连接移动终端与后台业务。

iOS / Android · 微信小程序 · 多端协同
了解服务
03

智能体开发

以企业知识与业务流程为基础,提供知识问答、资料检索和任务辅助。

企业知识库 · 流程配置 · 私有化部署
了解服务
+

02 / 产品中心

标准化业务系统

成熟功能满足共性需求,
按业务需要配置、集成与扩展。

产品详情
+
产品选型

从一笔订单,
到日常经营。

线上销售、门店收款、采购库存,
选择适合当前业务的管理工具。

预约产品演示
川经营管理工作台界面示意

经营概览 业务数据,一处查看

销售管理订单汇总
库存管理出入库记录
会员管理客户档案
销售趋势销售 / 订单
业务记录经营统计趋势分析
+
线上交易

商城

商品、订单、会员与营销管理,满足线上销售与日常运营。

查看详情
门店经营

收银

收款、退款、交班与门店对账,衔接一线操作和总部管理。

申请演示
采购与库存

进销存

关联采购、销售、库存与往来账目,记录每一笔业务流转。

查看详情
订阅使用

SaaS版本

按订阅方式使用业务功能,适合希望简化部署和维护的企业。

咨询开通
+
+

04 / 实施交付

每一步,都有明确的交付

项目推进流程
范围、进度与成果,按阶段沟通确认。

    +
  1. 01

    需求与方案

    了解业务流程、使用对象和现有系统,确认功能范围、预算与计划。

    需求说明 / 实施方案
  2. 02

    设计与开发

    确认交互原型和技术方案,分阶段开发,并及时沟通调整事项。

    交互原型 / 阶段版本
  3. 03

    测试与验收

    按约定业务场景开展测试,核对功能、数据和问题处理结果。

    测试记录 / 验收清单
  4. 04

    上线与维护

    完成部署、操作培训与资料移交,按约定提供后续维护。

    部署文档 / 使用培训
交付清楚,后续有据。

源码、接口文档、部署资料及维护安排,在项目启动前明确,具体以合同约定为准。

咨询交付安排
+
自然光下的现代办公洽谈空间,品牌意境图
品牌意境图

05 / 关于纳海川

认真理解业务,
踏实做好研发。

贵阳纳海川科技有限公司,专注企业软件开发与业务系统建设。我们为企业提供软件定制、移动应用、智能体开发及标准化业务产品。

重视每一次需求确认、每一个阶段成果,也关注系统交付之后的日常使用。

了解我们
纳海川贵阳 · 中国

合作记录

客户反馈

“订货中台重构后,大促当天订单未出现积压,库存与财务账目一致。沟通直接,变更均有记录。”

供应链企业 · 技术负责人订货中台项目

“收银员半天即可上手。门店断网时仍可正常收银,网络恢复后单据自动补传,月底对账工作量明显减少。”

连锁零售企业 · 运营负责人门店收银项目
+

06 / 研发记录

技术与实践

更多动态
{if !empty($information['data'])}{foreach name="information.data" id="art" key="idx" offset="0" length="3"} + {php}$cover_fallbacks = ['/assets/addons/official/images/articles/article_cache.svg','/assets/addons/official/images/articles/article_mysql_page.svg','/assets/addons/official/images/articles/article_xxl_job.svg']; $img_val = !empty($art['image']) ? $art['image'] : ''; $cover_src = (empty($img_val) || strpos($img_val,'article_microservice.svg') !== false) ? (isset($cover_fallbacks[$idx]) ? $cover_fallbacks[$idx] : '/assets/addons/official/images/articles/article_microservice.svg') : $img_val;{/php} + + {/foreach}{else/}

项目与技术记录持续更新中,您也可以直接与我们讨论具体需求。

{/if}
+

合作问答

开始之前,
您可能关心

只有初步想法,可以先沟通吗?

可以。先说明使用对象、主要业务流程和希望解决的问题,我们一起梳理建设方向;涉及详细调研或原型设计的工作,再根据工作量单独约定。

项目费用和周期如何确定?

根据功能范围、流程复杂度、终端数量和接口条件进行评估,确认阶段计划和费用清单。服务器及第三方服务费用另行说明。

已有系统,可以改造或增加功能吗?

先评估现有源码、接口、数据结构与运行环境,具备条件后确定改造范围;涉及数据迁移与系统切换时,单独安排验证。

+

与纳海川谈谈您的项目

从一次沟通,
开始您的软件项目。

有具体的系统研发或产品选型需求?可以直接沟通

+
{/block} diff --git a/addons/official/view/web/official_home/index_e.html b/addons/official/view/web/official_home/index_e.html index 734d5a7..01e5b65 100644 --- a/addons/official/view/web/official_home/index_e.html +++ b/addons/official/view/web/official_home/index_e.html @@ -1,1101 +1,32 @@ -{extend name="web/official_common/mobile/base" /} {block name="css"} - -{/block} {block name="content"} - - - - - - -
-
-
- -

- 软件、移动端与 AI 应用开发 -

-
-
- -
-
- 壹 -
- 企业业务系统与多系统对接示意 -
-

软件开发

-

- 承接企业业务系统与内部管理系统的定制开发,包括多系统数据对接、权限与流程配置、报表与对账等模块。 -

-
    -
  • 业务系统与内部管理系统定制
  • -
  • - 多系统数据对接与权限、流程配置 -
  • -
  • - 源码交付,可部署在客户自有服务器或内网 -
  • -
-
- - 了解详情 - - - - -
-
- -
- 贰 -
- 移动端 APP 与微信小程序多端界面 -
-

APP与小程序定制

-

- 承接 iOS、Android - 应用与微信小程序开发,多端可共用同一套后台;涉及蓝牙外设或硬件对接时单独评估。 -

-
    -
  • - iOS / Android 应用与微信小程序 -
  • -
  • - 与现有账号、订单、支付系统对接 -
  • -
  • - 蓝牙外设与物联网设备数据接入 -
  • -
-
- - 了解详情 - - - - -
-
- -
- 叁 -
- 私有化 AI 与内部知识库示意 -
-

智能体开发

-

- 基于开源大模型与企业内部资料搭建问答与检索工具,回答附带文档出处;数据存于客户内网,不经过我方服务器。 -

-
    -
  • - 内部制度、法规与文档的知识库检索 -
  • -
  • - 回答标注原文出处,供人工复核 -
  • -
  • 内网部署,不依赖外部接口
  • -
-
- - 了解详情 - - - - -
-
-
- -
- - 服务详情 - - - - -
-
-
- - -
-
-
- -

- 标准化业务系统 -

-

- 覆盖线上交易、门店结算、供应链管理与多租户运营场景,支持公有云订阅或私有化源码交付;各版本功能差异见产品页版本选型。 -

-
-
- -
-
-
- 商城系统管理后台 -
- 全渠道商城 -

商城

-

- 支持多商户入驻、分销、拼团秒杀等营销功能,可对接微信、支付宝支付。 -

-
- 查看详情 -
-
-
-
- 收银系统与扫码、打印外设 -
- 扫码收银 -

收银

-

- 收银软件对接扫码枪、小票打印机等外设,断网时可离线记账。 -

-
- 申请演示 -
-
-
-
- 进销存与财务数据界面 -
- 采购、销售、库存 -

进销存

-

- 采购、销售、仓储与财务数据打通,支持多仓库调拨与库存预警。 -

- -
- 查看详情 -
-
-
-
- 多租户 SaaS 平台管理界面 -
- 多租户平台 -

SaaS版本

-

- 多租户 SaaS - 平台,按账号开通;数据按租户隔离,也可为单个客户部署独立数据库。 -

-
- 立即开通 -
-
-
- -
- - 浏览产品 - - - - -
-
-
- - -
-
-
- -

- 项目案例:业务挑战与技术方案 -

-

- 以下案例已隐去企业名称与联系人;如需了解交付范围与验收情况,欢迎预约沟通。 -

-
-
- -
-
- 商贸流通 -

快消品经销 · 分销订货中台

-
- 分销订货中台界面 -
-
-
-
订单校验
-
- 价格、库存、信用额度 -
-
-
-
分级价格
-
按经销商等级配置
-
-
-
- - 查看案例 - - - - -
-
- -
- 连锁零售 -

连锁餐饮 · 收银与门店管理

-
- 收银与后厨看板界面 -
-
-
-
离线记账
-
联网后自动上传
-
-
-
后厨联动
-
- 点单打印与物料扣减 -
-
-
-
- - 查看案例 - - - - -
-
-
- -
- - 浏览案例 - - - - -
-
-
- - -
-
-
- -

- 项目推进流程 -

-
-
- -
-
-
01
-

业务需求调研

-
-
-
02
-

架构与技术选型

-
-
-
03
-

编码与测试

-
-
-
04
-

压力与安全测试

-
-
-
05
-

部署与运维支持

-
-
- -
- - 研发规范 - - - - -
-
-
- - -
-
-
- -

客户反馈

-

- 以下反馈经受访者同意后引用,并按对方要求隐去企业名称与姓名。 -

-
-
-
-
-

- 订货中台重构后,大促当天订单未出现积压,库存与财务账目一致。沟通直接,变更均有记录。 -

-
供应链企业 · 技术负责人
-
-
-

- 收银员半天即可上手。门店断网时仍可正常收银,网络恢复后单据自动补传,月底对账工作量明显减少。 -

-
连锁零售企业 · 运营负责人
-
-
-
-
- - -
-
-
-
-

- 有具体的系统研发或产品选型需求?可以直接沟通 -

-

- 由架构师对接,确认业务流程与部署环境后,提供方案与工期。 -

-
- -
-
-
- - -{/block} {block name="js"} - +{extend name="web/official_common/mobile/base" /} +{block name="css"} + + + +{/block} +{block name="content"} +
+
纳海川NAHAICHUAN联系咨询
菜单
+跳至服务内容 +
+ 远山与庭院之间,蓝色玻璃曲线沿水面延展 +

纳海川科技 / 企业软件服务

为企业经营,
做好每一套软件。

软件定制、APP与小程序、企业智能体。
从业务梳理到上线维护,提供完整的研发服务。

+
立足贵阳 · 服务全国探索我们的服务 NAHAICHUAN TECHNOLOGY
+
+
以业务为起点先了解流程,再确定方案
以交付为依据阶段成果确认,过程有据可查
以使用为目标兼顾上线运行与后续维护
+

01 / 专业服务

系统开发与长期维护

从企业日常经营出发,
把实际业务需求转化为可用的软件。

全部服务
01

软件开发

围绕订单、库存、财务与内部协同,开发符合企业实际流程的业务系统。

业务系统定制 · 系统集成 · 旧系统改造
了解服务
02

APP与小程序定制

面向客户服务、移动办公与门店经营,连接移动终端与后台业务。

iOS / Android · 微信小程序 · 多端协同
了解服务
03

智能体开发

以企业知识与业务流程为基础,提供知识问答、资料检索和任务辅助。

企业知识库 · 流程配置 · 私有化部署
了解服务
+

02 / 产品中心

标准化业务系统

成熟功能满足共性需求,
按业务需要配置、集成与扩展。

产品详情
+
产品选型

从一笔订单,
到日常经营。

线上销售、门店收款、采购库存,
选择适合当前业务的管理工具。

预约产品演示
川经营管理工作台界面示意

经营概览 业务数据,一处查看

销售管理订单汇总
库存管理出入库记录
会员管理客户档案
销售趋势销售 / 订单
业务记录经营统计趋势分析
+
线上交易

商城

商品、订单、会员与营销管理,满足线上销售与日常运营。

查看详情
门店经营

收银

收款、退款、交班与门店对账,衔接一线操作和总部管理。

申请演示
采购与库存

进销存

关联采购、销售、库存与往来账目,记录每一笔业务流转。

查看详情
订阅使用

SaaS版本

按订阅方式使用业务功能,适合希望简化部署和维护的企业。

咨询开通
+
+

04 / 实施交付

每一步,都有明确的交付

项目推进流程
范围、进度与成果,按阶段沟通确认。

    +
  1. 01

    需求与方案

    了解业务流程、使用对象和现有系统,确认功能范围、预算与计划。

    需求说明 / 实施方案
  2. 02

    设计与开发

    确认交互原型和技术方案,分阶段开发,并及时沟通调整事项。

    交互原型 / 阶段版本
  3. 03

    测试与验收

    按约定业务场景开展测试,核对功能、数据和问题处理结果。

    测试记录 / 验收清单
  4. 04

    上线与维护

    完成部署、操作培训与资料移交,按约定提供后续维护。

    部署文档 / 使用培训
交付清楚,后续有据。

源码、接口文档、部署资料及维护安排,在项目启动前明确,具体以合同约定为准。

咨询交付安排
+
自然光下的现代办公洽谈空间,品牌意境图
品牌意境图

05 / 关于纳海川

认真理解业务,
踏实做好研发。

贵阳纳海川科技有限公司,专注企业软件开发与业务系统建设。我们为企业提供软件定制、移动应用、智能体开发及标准化业务产品。

重视每一次需求确认、每一个阶段成果,也关注系统交付之后的日常使用。

了解我们
纳海川贵阳 · 中国

合作记录

客户反馈

“订货中台重构后,大促当天订单未出现积压,库存与财务账目一致。沟通直接,变更均有记录。”

供应链企业 · 技术负责人订货中台项目

“收银员半天即可上手。门店断网时仍可正常收银,网络恢复后单据自动补传,月底对账工作量明显减少。”

连锁零售企业 · 运营负责人门店收银项目
+

06 / 研发记录

技术与实践

更多动态
{if !empty($information['data'])}{foreach name="information.data" id="art" key="idx" offset="0" length="3"} + {php}$cover_fallbacks = ['/assets/addons/official/images/articles/article_cache.svg','/assets/addons/official/images/articles/article_mysql_page.svg','/assets/addons/official/images/articles/article_xxl_job.svg']; $img_val = !empty($art['image']) ? $art['image'] : ''; $cover_src = (empty($img_val) || strpos($img_val,'article_microservice.svg') !== false) ? (isset($cover_fallbacks[$idx]) ? $cover_fallbacks[$idx] : '/assets/addons/official/images/articles/article_microservice.svg') : $img_val;{/php} + + {/foreach}{else/}

项目与技术记录持续更新中,您也可以直接与我们讨论具体需求。

{/if}
+

合作问答

开始之前,
您可能关心

只有初步想法,可以先沟通吗?

可以。先说明使用对象、主要业务流程和希望解决的问题,我们一起梳理建设方向;涉及详细调研或原型设计的工作,再根据工作量单独约定。

项目费用和周期如何确定?

根据功能范围、流程复杂度、终端数量和接口条件进行评估,确认阶段计划和费用清单。服务器及第三方服务费用另行说明。

已有系统,可以改造或增加功能吗?

先评估现有源码、接口、数据结构与运行环境,具备条件后确定改造范围;涉及数据迁移与系统切换时,单独安排验证。

+

与纳海川谈谈您的项目

从一次沟通,
开始您的软件项目。

有具体的系统研发或产品选型需求?可以直接沟通

+
{/block} diff --git a/addons/official/view/web/official_product/list.html b/addons/official/view/web/official_product/list.html index fad03df..0531ca7 100644 --- a/addons/official/view/web/official_product/list.html +++ b/addons/official/view/web/official_product/list.html @@ -1,78 +1,84 @@ -{extend name="web/official_common/pc/base" /} - -{block name="content"} - -{if input('param.service') == 'software'} - - {include file="web/official_product/service_software" /} -{elseif input('param.service') == 'app' /} - - {include file="web/official_product/service_app" /} -{elseif input('param.service') == 'agent' /} - - {include file="web/official_product/service_agent" /} -{elseif input('param.pid') == 19 || (isset($res['name']) && strpos($res['name'],'服务') !== false) /} - - {include file="web/official_product/service_page" /} -{elseif input('param.pid') == 22 || (isset($res['name']) && strpos($res['name'],'产品') !== false) /} - - {include file="web/official_product/product_page" /} -{else/} - -
- -
-
- -{/if} - -{/block} \ No newline at end of file +{extend name="web/official_common/pc/base" /} + +{block name="css"} +{if input('param.service') == 'agent' || input('param.service') == 'app' || input('param.service') == 'software'} + +{/if} +{/block} + +{block name="content"} + +{if input('param.service') == 'software'} + + {include file="web/official_product/service_software" /} +{elseif input('param.service') == 'app' /} + + {include file="web/official_product/service_app" /} +{elseif input('param.service') == 'agent' /} + + {include file="web/official_product/service_agent" /} +{elseif input('param.pid') == 19 || (isset($res['name']) && strpos($res['name'],'服务') !== false) /} + + {include file="web/official_product/service_page" /} +{elseif input('param.pid') == 22 || (isset($res['name']) && strpos($res['name'],'产品') !== false) /} + + {include file="web/official_product/product_page" /} +{else/} + +
+ +
+
+ +{/if} + +{/block} diff --git a/addons/official/view/web/official_product/list_e.html b/addons/official/view/web/official_product/list_e.html index 8f41c1d..1d07bdb 100644 --- a/addons/official/view/web/official_product/list_e.html +++ b/addons/official/view/web/official_product/list_e.html @@ -1,70 +1,80 @@ -{extend name="web/official_common/mobile/base" /} - -{block name="content"} - -{if input('param.service') == 'software'} - - {include file="web/official_product/service_software" /} -{elseif input('param.service') == 'app' /} - - {include file="web/official_product/service_app" /} -{elseif input('param.service') == 'agent' /} - - {include file="web/official_product/service_agent" /} -{elseif input('param.pid') == 19 || (isset($res['name']) && strpos($res['name'],'服务') !== false) /} - - {include file="web/official_product/service_page" /} -{elseif input('param.pid') == 22 || (isset($res['name']) && strpos($res['name'],'产品') !== false) /} - - {include file="web/official_product/product_page" /} -{else/} - -
- -
-
- -{/if} - -{/block} \ No newline at end of file +{extend name="web/official_common/mobile/base" /} + +{block name="css"} +{if input('param.service') == 'agent'} + +{elseif input('param.service') == 'app' || input('param.service') == 'software' /} + +{/if} +{/block} + +{block name="content"} + +{if input('param.service') == 'software'} + + {assign name="software_mobile_header" value="1" /} + {include file="web/official_product/service_software" /} +{elseif input('param.service') == 'app' /} + + {assign name="app_mobile_header" value="1" /} + {include file="web/official_product/service_app" /} +{elseif input('param.service') == 'agent' /} + + {include file="web/official_product/service_agent" /} +{elseif input('param.pid') == 19 || (isset($res['name']) && strpos($res['name'],'服务') !== false) /} + + {include file="web/official_product/service_page" /} +{elseif input('param.pid') == 22 || (isset($res['name']) && strpos($res['name'],'产品') !== false) /} + + {include file="web/official_product/product_page" /} +{else/} + +
+ +
+
+ +{/if} + +{/block} diff --git a/addons/official/view/web/official_product/service_agent.html b/addons/official/view/web/official_product/service_agent.html index 2803bee..f7bb270 100644 --- a/addons/official/view/web/official_product/service_agent.html +++ b/addons/official/view/web/official_product/service_agent.html @@ -1,1204 +1,45 @@ - - - -
-
-
- 首页 - / - 核心服务 - / - 智能体开发 -
-
- 内网物理隔离 · 数据不外传 -
-

企业级 AI 智能体与知识库定制开发

-

- 面向企业内部资料问答与业务流程办理,纳海川提供企业知识库建设、智能体定制开发与内网私有化部署,移交完整源代码与部署包,系统运行在客户自己的机房,资料不出内网。 -

-
- - 预约智能体演示 - - - - - - 了解部署方式 - -
-
- 纳海川企业内网智能体与知识库部署示意图 -
-
-
- - -
-
-
- -

- 覆盖资料问答与业务办理 · 按流程办事的专业智能体 -

-

- 区别于只能闲聊的对话框,我们把企业资料、业务规则与系统接口接入智能体,让它按既定流程办事,每条答案都能追溯到原文。 -

-
-
- -
- -
-
- 01 - 知识检索 -
-

- 企业知识库智能问答 -

-

- 把政策规章、操作手册、业务规范等文档整理入库,员工提问时直接给出答案,并标注出自哪份文件的哪一段。 -

-
- 依据作答 - 向量检索 - 标注出处 -
-
- - -
-
- 02 - 多智能体 -
-

- 多智能体协同审批 -

-

- 把风控审核、合同初审、财务核算拆成不同角色的智能体,各管一段并相互复核,人工只在关键节点确认,缩短初审时间。 -

-
- 角色分工 - 流程编排 - 人工确认 -
-
- - -
-
- 03 - 工具集成 -
-

- 业务系统对接与执行 -

-

- 智能体对接企业现有的 - ERP、CRM、工单等系统,一句话即可查订单、开发票、生成报表,不用在多个系统之间来回切换。 -

-
- 系统对接 - 权限受控 - 报表生成 -
-
- - -
-
- 04 - 模型适配 -
-

- 行业模型适配与压缩 -

-

- 用企业自己的文档对开源大模型做适配训练,让它熟悉行业术语与内部叫法;同时压缩模型体积,普通显卡服务器即可运行。 -

-
- 术语适配 - 模型压缩 - 硬件可控 -
-
-
-
-
- - -
-
-
- -

- 私有化部署在客户机房 · 数据不出内网 -

-

- 大模型、知识库与业务调度程序全部部署在客户自己的服务器上,系统不连接外网也能正常运行。 -

- -
-
- -
-
-

- - 本地模型部署 -

-

- 支持 Qwen、DeepSeek - 等主流开源模型,压缩后一张或两张显卡即可支撑日常使用,无需单独采购高价算力集群。 -

-
- 日常问答响应流畅 -
-
- -
-

- - 知识库检索 -

-

- 把文档整理成可检索的索引,同时保留关键词检索,两种方式并用,先粗筛再精排,把最相关的段落排在前面。 -

-
- 检索效果以验收测试为准 -
-
- -
-

- - 流程编排调度 -

-

- 智能体按预设流程逐步执行,可调用多个业务接口,并把结果整理成固定格式返回,便于接入现有系统。 -

-
- 返回格式固定,便于对接 -
-
- -
-

- - 内网隔离运行 -

-

- 整套系统打包后部署在企业机房,不需要连接外网,资料与对话记录都留在本地服务器上。 -

-
- 资料与记录留在本地 -
-
-
-
-
- - -
-
-
- -

规范实施流程 · 关键节点可追踪

-

- 每一步都有明确的交付物,回答要求标注原文出处,方便逐条核对。 -

- -
-
- -
-
-
- 01. 资料整理 -
-
- 文档统一整理入库 -
-

- 扫描件、PDF、Word - 自动识别,表格还原成结构化内容,再按段落切分,方便后续检索。 -

-
-
-
- 02. 建立索引 -
-
- 两套索引配合检索 -
-

- 调整分段长度与重叠范围,建立两套索引:一套按意思相近匹配,一套按关键词命中。 -

-
-
-
- 03. 规则与接口 -
-
- 设定规则并对接系统 -
-

- 明确智能体能做什么、不能做什么,资料中没有依据的问题要如实说明,同时接好需要调用的业务接口。 -

-
-
-
- 04. 测试调优 -
-
- 用真实业务问题测试 -
-

- 整理一批企业真实业务问题做测试,多轮比对后调整,把答错和答偏的情况逐步降下来。 -

-
-
-
- 05. 内网部署 -
-
- 部署到客户内网机房 -
-

- 模型文件、知识库数据与应用程序全部部署到客户内网服务器,运行过程不依赖外网。 -

-
-
-
- 06. 知识更新 -
-
- 新文档随时入库更新 -
-

- 提供知识库管理后台,新文档拖进去即可自动入库,不用停机重建。 -

-
-
-
-
- - -
-
-
- -

- 可验收交付清单 · 源码与模型文件归客户所有 -

-

- 交付包含知识库处理脚本、模型文件与业务调度程序在内的完整内容,按清单逐项验收移交。 -

- -
-
- -
-
-

- 智能体系统交付物 -

-
    -
  • - - - - 智能体程序完整源代码(含与现有系统的对接代码) -
  • -
  • - - - - 适配训练后的模型文件 -
  • -
  • - - - - 企业知识库数据及管理后台源代码 -
  • -
  • - - - - 内网一键部署安装包 -
  • -
-
- -
-

- 文档与合规交付物 -

-
    -
  • - - - - 《智能体业务对接说明书》与接口说明文档 -
  • -
  • - - - - 《知识库维护操作手册》 -
  • -
  • - - - - 测试问题集与验收报告(含检索效果与问答准确情况) -
  • -
  • - - - - 内网安全检查说明与 365 天维保服务 -
  • -
-
-
-
-
- - -
-
-
- -

- 务实问答 · 回答企业最关心的落地问题 -

-

- 关于服务器配置、数据安全与回答准确性的常见问题。 -

-
-
- -
-
-

- Q1: 内部资料敏感,怎么保证不外传? -

-

- 系统整体部署在客户自己的机房,大模型、知识库和程序都在局域网内运行。把服务器拔掉外网网线,系统仍然可以正常使用,资料不会传到外部。 -

-
- -
-

- Q2: 部署一套这样的系统,对服务器显卡要求高吗? -

-

- 模型经过压缩后,一台配单张 24G - 显存显卡的服务器,就能支撑日常知识问答和审批类业务;并发量更大的场景配两张显卡即可,硬件投入可控。 -

-
- -
-

- Q3: 大模型有时会编造答案,怎么保证回答准确? -

-

- 系统要求智能体只能依据检索到的企业资料作答,并标注原文出处和对应段落。资料中找不到依据时,会明确提示“未检索到相关规定”,不会自己编造。 -

-
-
-
-
- - -
-
-

- 想让企业资料变成可问答的智能体? -

-

- 联系纳海川智能体顾问,带上实际业务文档与流程说明,我们现场演示检索与问答效果,并给出内网部署方案。 -

-
- - 预约智能体项目沟通 - - - 电话咨询: 0851-88556677 - -
-
-
- + +
+跳至应用场景 +
+ +

NAHAICHUAN ENTERPRISE AI

企业智能体开发

把企业知识,接入日常工作。

面向知识查询、客户服务与业务协同,提供知识库建设、智能体定制与系统集成服务。从一项明确的需求开始,完成验证、开发与交付。

+
白瓷书页般的山形结构与蓝色玻璃交错,呈现知识的整理与连接
企业知识库 · 智能体 · 系统集成纳海川 / 智能体定制服务
+
+
+
+

01 / 应用场景

围绕实际工作,确定建设范围

优先处理资料充分、规则明确、重复发生的任务。复杂判断与关键操作,保留人工审核。

+
+
01

企业知识问答

制度查询 / 产品资料 / 技术支持

将制度、手册与产品文档整理入库。员工通过自然语言查询,查看相关答案及引用来源,减少反复查找资料的时间。

交付重点文档检索 · 引用溯源
+
02

客户服务辅助

售前咨询 / 售后答疑 / 工单分流

依据产品与服务资料提供答复建议,收集咨询信息,协助工单分类。超出约定范围的问题转交人工处理。

交付重点知识维护 · 人工转接
+
03

文档处理辅助

材料整理 / 条款比对 / 报告初稿

按业务模板提取信息、归纳要点或生成初稿。重要结论由业务人员复核,输出结果可关联原始材料。

交付重点结构化提取 · 人工复核
+
04

业务流程辅助

订单查询 / 数据汇总 / 申请办理

通过授权接口连接现有系统,查询业务信息、整理报表或发起申请。涉及数据修改和审批时,设置确认节点。

交付重点系统对接 · 操作确认
+
+
+
+

02 / 建设内容

知识、流程与系统,统一规划

根据业务范围配置所需能力,避免功能堆叠。建设内容与验收方式,在开发前共同确认。

+
+

知识库建设

完成资料梳理、文档解析、版本管理与检索配置。通过检索增强生成(RAG),为回答提供业务依据。

  • 文档分类与更新机制
  • 关键词与向量检索
  • 回答引用与效果评测
+

智能体与流程配置

确定任务范围、处理步骤与工具调用规则,配置必要的校验、人工确认和异常处理。

  • 业务规则与任务编排
  • 人工审核与处理记录
  • 异常提示与人工接管
+

业务系统集成

在现有接口和授权条件下,连接 ERP、CRM、OA 等系统,衔接身份认证与数据访问权限。

  • 接口梳理与数据映射
  • 角色权限与身份认证
  • 调用日志与系统联调
+
+
用实际问题验证效果

选取代表性资料、问题与业务流程,检查检索结果、答案依据和执行记录,再确定后续优化范围。

了解实施流程
+
+
+
白色庭院结构围合蓝色玻璃方体,表达清晰的数据与管理边界
数据范围与访问权限

03 / 部署与管理

数据如何使用,
在方案中明确

根据资料敏感程度、网络环境与使用规模,确定部署位置、模型调用方式和日常管理要求。

数据范围
明确接入资料、处理方式、存储位置与外部服务的数据流向。
访问权限
按部门、角色或业务范围配置权限,管理资料访问与工具调用。
操作记录
记录关键问答与业务操作,结合项目要求确定日志范围和保存周期。
+
LOCAL DEPLOYMENT

私有化部署

在企业自有机房或指定服务器部署。适用于需要自主管理数据与运行环境的业务;完全离线运行需评估模型、文档解析等服务依赖。

DEDICATED CLOUD

专有云部署

在企业指定云环境部署,按约定接入模型服务。适用于已有云基础设施或需要多地访问的业务,需明确访问策略与持续服务费用。

+
+
+

04 / 实施交付

先验证,再开发,分阶段验收

每个阶段明确工作内容、交付成果与确认事项,便于双方安排人员、资料与实施时间。

+
  1. 01

    需求梳理

    确认使用对象、业务任务、资料情况与现有系统条件。

    需求说明 / 建设范围
  2. 02

    效果验证

    用代表性资料和问题建立原型,验证检索与业务处理效果。

    验证原型 / 评测记录
  3. 03

    开发联调

    完成应用、接口与权限配置,开展功能测试和系统联调。

    系统版本 / 测试报告
  4. 04

    部署验收

    在约定环境部署,完成业务验收、操作培训与资料移交。

    验收记录 / 交付文档
+

项目交付

交付清单,在项目启动前确认

具体范围、使用权属与维护安排以合同约定为准。

  • 定制应用源码与部署配置
  • 知识库配置与资料处理说明
  • 接口文档与系统操作手册
  • 评测记录、培训与维护说明
+
+

05 / 常见问题

项目启动前的
几个具体问题

也可以带着您的实际需求,与我们进一步沟通。

+
需要准备哪些业务资料?

建议先提供一个具体场景、相关制度或产品文档,以及代表性问题和预期答案。涉及系统集成时,还需了解接口、权限与网络条件。敏感资料可先脱敏,再用于评估。

+
现有系统能否直接对接?

需先检查系统是否具备可用接口及相应授权。接口条件充分时,可按业务范围开展集成;缺少接口的部分,需要单独评估改造工作量和实施条件。

+
如何评估回答的准确性?

使用双方确认的业务测试集,检查检索相关性、回答依据与内容完整性,并配置引用展示和人工复核。检索增强可以降低错误风险,但不能保证所有回答都正确。

+
开发周期与费用如何确定?

主要取决于应用场景、资料整理工作量、系统接口复杂程度及部署要求。需求评估后提供实施计划和费用清单,分别说明开发费用、基础设施及模型服务等持续费用。

+
上线后如何更新知识与维护系统?

项目交付时说明资料更新、权限管理和日志查看方法。后续根据合同约定开展故障处理、知识调整与版本维护;新增场景和接口另行评估。

+
+

与纳海川讨论您的项目

沟通智能体
建设需求

请说明业务场景、现有资料与系统情况。
我们据此评估建设范围、实施条件与交付安排。

沟通项目需求
+
diff --git a/addons/official/view/web/official_product/service_app.html b/addons/official/view/web/official_product/service_app.html index e125377..e43d96a 100644 --- a/addons/official/view/web/official_product/service_app.html +++ b/addons/official/view/web/official_product/service_app.html @@ -1,1201 +1,42 @@ - - - -
-
-
- 首页 - / - 核心服务 - / - APP与小程序定制 -
-
- 全端协同 · 接近原生 -
-

企业级全生态 APP 与小程序定制研发

-

- 覆盖 iOS、Android - 双端原生应用与微信、支付宝多生态小程序,兼顾接近原生的交互体验与跨端高效发布能力,支持低功耗蓝牙 - IoT 硬件直连、离网弱网数据同步与多渠道消息推送。 -

- -
- - 评估移动端需求 - - - - - - 了解技术性能 - -
-
- 纳海川多端跨平台移动应用与IoT协同视窗 -
-
-
- - -
-
-
- -

- 全渠道多端触点 · 满足多元业务使用场景 -

-

- 覆盖移动端关键入口,为企业构建体验统一、数据互联的移动应用。 -

-
-
- -
- -
-
- 01 - 双端应用 -
-

- iOS / Android 跨平台与原生 APP -

-

- 基于 Flutter / Uni-app / Kotlin / Swift - 构建移动应用,保障手势操作流畅与低耗电,适配主流品牌手机与折叠屏设备。 -

-
- Flutter - Uni-app - 原生级渲染 -
-
- - -
-
- 02 - 微信生态 -
-

- 微信小程序与企业微信深度协同 -

-

- 整合微信支付、订阅消息推送、企业微信通讯录同步与审批流,对接企业办公协同。 -

-
- 微信支付 - 企业微信API - 客户留存 -
-
- - -
-
- 03 - 多端同构 -
-

- 支付宝 / 抖音多平台小程序 -

-

- 一套核心业务逻辑跨平台发布至支付宝信用生态、抖音团购挂载与本地生活频道,帮助企业以较低成本覆盖更多流量入口。 -

-
- 支付宝芝麻信用 - 抖音小程序 - 跨平台编译 -
-
- - -
-
- 04 - 软硬协同 -
-

- 物联网 IoT 与智能硬件蓝牙直连 -

-

- 定制 BLE - 低功耗蓝牙数据交互协议,支持手持扫码枪、热敏票据打印机、电子秤与智能门禁等硬件设备直连。 -

-
- 低功耗蓝牙 BLE - ESC/POS协议 - 物联网工控 -
-
-
-
-
- - -
-
-
- -

高保真交互与工程性能指标

-

- 我们针对不同机型与网络环境进行优化,提升操作流畅度。 -

-
-
- -
-
-
- 流畅稳定 -
-

- 界面渲染手势帧率 -

-

- GPU - 硬件加速与细粒度视图重绘控制,复杂列表滚动与滑动交互保持稳定。 -

-
- -
-
- 分包预加载 -
-

- 小程序冷启动首屏耗时 -

-

- 代码按需分包预加载、资源 CDN - 压缩与接口本地缓存,缩短首屏等待。 -

-
- -
-
- 陪跑支持 -
-

- 应用市场上架一次通过率 -

-

- 严格遵循苹果 App Store - 审核准则与工信部隐私合规规范,提供完备资质辅导。 -

-
- -
-
- 本地队列 -
-

- 离线操作断网本地保存 -

-

- 内置 SQLite - 本地事务队列,地下车库或野外等弱网环境下,仍可记账并保存操作,联网后同步。 -

-
-
-
-
- - -
-
-
- -

- 全链路敏捷交付 · 规范推进设计与上线 -

-

- 从交互原型到应用市场上架发行,全流程标准化管控。 -

-
-
- -
-
-
- 01. 体验设计 -
-
- UI/UX 高保真原型 -
-

- 梳理用户使用场景与操作步骤,输出高保真交互原型与视觉设计规范。 -

-
- -
-
- 02. 架构搭建 -
-
- 跨端统一技术选型 -
-

- 确立状态管理、网络请求重试、本地离线持久化与路由导航基座。 -

-
-
-
- 03. 功能编码 -
-
- 多端协同敏捷开发 -
-

- 原生功能插件封装、多端样式精细适配与服务端接口联调。 -

-
-
-
- 04. 真机云测 -
-
- 多机型与弱网压测 -
-

- 覆盖主流安卓与苹果机型,完成弱网、锁屏、断电测试。 -

-
-
-
- 05. 市场上架 -
-
- 应用商城提审与发布 -
-

- 协助企业办理软著、配置隐私政策,完成苹果 App Store - 与各大安卓市场上架。 -

-
-
-
- 06. 源码移交 -
-
- 代码交割与维保支持 -
-

- 交付双端打包工程源码及签名证书文件,提供 365 - 天版本更新维护。 -

-
-
-
-
- - -
-
-
- -

- 规范化移动工程交付 · 无黑盒插件依赖 -

-

- 我们向客户交付标准化前端移动工程,客户可使用 Android - Studio、Xcode 或 HBuilderX 自行编译打包。 -

-
-
- -
-
-

- 代码工程类交付物 -

-
    -
  • - - - - 完整移动端前端工程源代码(支持一键编译与打包发布) -
  • -
  • - - - - 微信/支付宝小程序源码包及后台管理服务端代码 -
  • -
  • - - - - 生产环境 Android Keystore 证书与 iOS - 打包发布描述文件 -
  • -
  • - - - - 物联网蓝牙通信协议编解码 SDK 源码包 -
  • -
-
- -
-

- 文档与上线资质类交付物 -

-
    -
  • - - - - 《移动端接口对接文档》与鉴权 Token - 刷新机制说明 -
  • -
  • - - - - 《应用市场审核上架指导手册》(含工信部备案/隐私协议模板) -
  • -
  • - - - - 真机兼容性与性能压测报告(含多分辨率适配记录) -
  • -
  • - - - - 软著申报技术材料与 365 天维保协议 -
  • -
-
-
-
-
- - -
-
-
- -

- 务实解惑 · 讲清跨端研发与上架关键环节 -

-

- 总结应用商店提审与跨端性能的常见隐患,帮企业提前规避。 -

-
-
- -
-
-

- Q1: 跨平台跨端开发方案(如 - Flutter/Uni-app)和纯原生相比,性能差异大吗? -

-

- 在纳海川的工程实践中,Flutter 直接基于 Skia/Impeller - 渲染引擎进行底层 GPU - 绘制,界面手势帧率对标原生流畅度;针对复杂的蓝牙通信、后台常驻服务,我们采用 - Android / iOS - 原生桥接模块封装,兼顾跨端研发效率与底层硬件性能。 -

-
- -
-

- Q2: 苹果 App Store - 和主流安卓市场审核日趋严格,如何保证顺利上线? -

-

- 纳海川提供从应用隐私合规清单梳理、工信部 APP - 备案指导、苹果审核账号提审材料到演示视频录制的全流程陪跑服务。代码层面严格遵循各商城审核规范,提高项目上架一次性通过率。 -

-
- -
-

- Q3: 一个后端服务是否能够同时支撑 iOS、Android APP - 与微信小程序? -

-

- 可以。我们采用标准统一的 RESTful API 架构与 JWT - 安全鉴权,前端多端共用同一套底层服务与业务中台。多端用户数据互通、订单同步流转,降低后期多端维护成本。 -

-
-
-
-
- - -
-
-

- 有具体的移动端或小程序开发需求? -

-

- 联系纳海川移动产品顾问,为您提供针对性的移动端技术选型对比与产品原型交互方案。 -

-
- - 预约移动端项目评估 - - - 电话咨询: 0851-88556677 - -
-
-
- + +
+{if isset($app_mobile_header)} +
纳海川NAHAICHUAN联系咨询
菜单
+{/if} +跳至终端选型 +
+ +

移动应用定制服务

APP 与小程序
定制开发

面向客户服务、门店经营与移动办公,提供 iOS、Android APP 和微信小程序开发。从终端选型、交互设计到后台对接与上线交付,按业务需要组织研发。

纳海川 · 从产品规划到上线维护

不同尺寸的白瓷与蓝色玻璃板共用一个基座,表达多终端协同
移动终端 · 业务连接NAHAICHUAN
+
+
+
+

01 / 终端选型

根据使用方式,选择合适的终端

从使用频次、功能要求和用户入口出发,比较不同方案的适用条件与维护工作。

+
+
01

iOS / Android APP

适用于使用频繁、交互较复杂,或需要结合设备能力开展工作的移动产品。

适用情况
长期使用、复杂操作、设备协同
需要评估
终端兼容、权限调用、分发与版本维护
+
02

微信小程序

适用于从微信分享、扫码等入口进入的服务,便于用户完成查询、预约和交易。

适用情况
服务预约、会员业务、扫码办理
需要评估
平台能力、主体账号、审核与服务范围
+
03

移动网页与 H5

适用于通过链接直接访问的业务页面,也可作为已有 APP 或小程序的补充入口。

适用情况
活动页面、信息展示、轻量表单
需要评估
浏览器兼容、访问环境、设备功能限制
+

同一业务可以采用多个终端,后台接口、账号关系与数据规则在方案阶段统一设计。

+
+
+

02 / 业务场景

围绕工作流程,组织产品功能

从用户需要完成的任务出发,梳理页面、操作和数据流转,减少重复录入与不必要的步骤。

+
01

客户服务与会员运营

产品查询、服务预约、会员权益与订单跟踪,为客户提供清晰的办理入口。

预约 / 会员 / 订单
02

门店经营与现场服务

连接门店人员与后台业务,支持核销、巡检、库存查询及现场服务记录。

核销 / 巡检 / 库存
03

移动办公与业务协同

围绕审批、任务、客户跟进与数据填报,衔接企业已有系统和权限要求。

审批 / 任务 / 填报
04

设备连接与外勤作业

按设备协议评估蓝牙、扫码与数据采集;存在弱网时,设计本地保存与补传机制。

设备 / 采集 / 弱网
+
+
+
白色桥面与蓝色玻璃连接多个支点,表达多端共用业务服务
终端与后台,协同设计。

03 / 开发能力

界面、接口与运行条件,
一并考虑

交互设计与终端适配

完成信息结构、关键流程与页面设计,按约定设备范围检查布局、操作和可读性。

后台接口与业务规则

对接账号、订单及管理系统,明确身份认证、接口权限、异常提示与数据校验。

设备能力与弱网处理

根据设备和平台条件接入蓝牙、定位或扫码,评估离线操作、同步冲突及失败重试。

测试、发布与版本维护

按约定机型、系统版本及业务场景开展测试,整理发布材料,交付版本与维护说明。

+
原生还是跨端,先看具体要求

综合界面复杂度、设备调用、研发周期与维护方式确定实现方案。性能目标和兼容范围通过原型验证与测试确认。

+
+
+

04 / 实施与交付

按阶段确认,按场景验收

在开发前明确功能范围、终端版本与对接条件;需求变化时,记录对进度和费用的影响。

+
  1. 01

    需求与选型

    确认使用对象、关键任务、终端范围和现有系统条件。

    需求说明 / 实施范围
  2. 02

    原型与设计

    梳理页面结构与操作流程,确认原型和界面方案。

    交互原型 / 视觉稿
  3. 03

    开发与联调

    实现终端与后台功能,完成业务接口和设备联调。

    阶段版本 / 接口文档
  4. 04

    测试与验收

    按业务用例和约定设备测试,确认问题处理结果。

    测试报告 / 验收记录
  5. 05

    发布与移交

    协助准备发布材料,完成部署、培训与资料交付。

    发布版本 / 操作手册
+

交付内容

工程文件与使用资料,清单确认后移交

源码、文档、第三方依赖的使用权属及后续维护,以合同约定为准。

  • 约定范围的终端与后台源码
  • 界面设计稿与资源文件
  • 构建、部署与接口说明
  • 测试记录、操作与维护手册
+

发布准备与双方配合

企业主体账号、域名证书及所需业务资料,由双方按实际平台要求梳理。应用审核结果与排期由平台决定;第三方服务费用、发布协助范围及后续版本维护在项目中另行明确。

+
+

05 / 常见问题

开发前,先说清楚

关于终端选型、现有系统、发布与维护的常见问题。

+
应该先做 APP,还是小程序?

先看用户从哪里进入、多久使用一次、需要完成什么任务。微信内的查询和预约可优先评估小程序;复杂交互、较多设备调用或长期使用的业务,可评估 APP。最终方案结合实际功能和预算确定。

+
多个终端能否共用后台?

可以按业务设计共用后台与接口。需要提前明确各端账号的关联方式、权限边界和数据规则。已有系统能否复用,取决于接口、授权与改造条件。

+
已有后台,能否只开发移动端?

可以先评估已有接口、业务逻辑与测试环境。接口满足需求时,可围绕移动端开展开发;缺少接口或业务规则需要调整的部分,另行确定工作范围。

+
开发周期和费用如何确定?

主要取决于功能数量、页面与交互复杂度、终端范围、设备或系统对接,以及资料准备情况。完成需求评估后提供阶段计划和费用清单,并说明第三方服务等持续费用。

+
是否包含上架协助和后续维护?

可按合同约定提供发布材料整理、提审协助和问题修改,审核由相应平台完成。上线后的故障处理、适配更新与新增功能,需要分别明确服务期限、范围及费用。

+
+

项目沟通

有具体的移动端或小程序开发需求?

请说明使用对象、核心功能、现有后台与期望终端,我们据此评估实施范围。

沟通开发需求 电话咨询 {:__config('site_mobile','value')}
+
diff --git a/addons/official/view/web/official_product/service_software.html b/addons/official/view/web/official_product/service_software.html index 1f00e5c..37618b8 100644 --- a/addons/official/view/web/official_product/service_software.html +++ b/addons/official/view/web/official_product/service_software.html @@ -1,1208 +1,65 @@ - + +
+{if isset($software_mobile_header)} +
+ 纳海川NAHAICHUAN + 联系咨询 +
菜单
+
+{/if} +跳至服务范围 - -
-
-
- 首页 - / - 核心服务 - / - 软件开发 -
-
- 定制开发 · 源码交付 -
-

企业级软件开发与微服务架构定制

-

- 面向大批量数据吞吐与复杂业务逻辑,纳海川提供微服务中台定制、分布式系统架构升级与异构系统整合研发,移交完整工程源码与技术文档,支持客户本地私有化部署。 -

-
- - 预约架构师评估 - - - - - - 查看交付标准 - -
-
- 纳海川微服务分布式架构中枢视窗 -
-
-
+
+ +

纳海川 / 企业软件服务

企业软件开发
与现有系统改造

围绕企业经营与内部管理,建设业务系统、调整现有功能、对接业务数据。根据实际流程和使用条件,确定开发范围与实施计划。

  • 需求与原型确认
  • 分阶段开发验收
  • 源码与文档移交
+
白色石材框架由蓝色玻璃横梁连接,表达业务系统的结构与衔接
结构有序,连接有据。抽象建筑示意
+
- -
-
-
- -

- 聚焦核心业务场景 · 构建稳定系统架构 -

-

- 针对核心业务的性能瓶颈、跨系统数据不一致与复杂业务逻辑,纳海川提供针对性研发支撑。 -

-
-
+ -
- -
-
- 01 - 核心中台 -
-

- 高并发业务中台定制 -

-

- 打通会员、商品、订单、库存与资金结算中心,形成通用业务模块,支持新业务快速调用与平稳上线。 -

-
- 订单路由 - 分库分表 - 防重结算 -
-
+
+

01 / 服务范围

按业务现状,选择建设方式

新建、改造与集成分别评估;已有系统、数据和工作习惯,都是方案设计的依据。

+
+
01

定制业务系统

梳理业务角色、操作流程与数据关系,将分散的单据和日常操作纳入统一系统。

订单管理 / 采购库存 / 客户管理 / 内部协同
+
02

现有系统改造

评估源码、接口与运行问题,调整不适用的功能,安排兼容验证和分阶段切换。

功能调整 / 操作优化 / 结构重整 / 数据迁移
+
03

业务接口集成

在授权和接口条件允许的范围内,对接 ERP、CRM、OA 等系统,明确数据映射、同步及异常处理规则。

接口联调 / 数据同步 / 状态回传 / 异常记录
+
04

业务中台建设

梳理多个业务共用的账号、商品、订单等能力,划分共用服务与独立模块,减少重复开发。

共用服务 / 模块划分 / 权限管理 / 接口约定
+
+

常见业务场景

商贸订货与分销/门店经营与总部协同/生产物料与库存管理/企业内部审批与协作

浏览案例
+
- -
-
- 02 - 架构升级 -
-

- 微服务分布式解耦重构 -

-

- 针对老旧巨石单体应用进行领域驱动设计(DDD)拆分,引入分布式事务与断路器机制,消除单点故障风险。 -

-
- Spring Cloud - Sentinel - 熔断与限流 -
-
+
+

02 / 研发能力

功能、数据与运行条件,一并考虑

技术方案服务于实际使用,也需要便于部署、排查问题和后续维护。

+
石材分层结构与竖向蓝色玻璃组合,表达模块边界和数据贯通
模块清晰,便于使用与维护。抽象建筑示意
+
01

业务建模与数据设计

确认角色、单据、状态变化及校验规则,形成可核对的业务流程与数据结构。

+
02

架构与接口设计

结合业务规模、系统依赖与运维能力,选择单体或微服务结构,明确模块边界与接口约定。

+
03

权限与操作管理

按角色和业务范围配置访问权限,对关键操作设置校验、日志与必要的审核流程。

+
04

测试与上线准备

按业务用例验证功能与接口;性能目标结合数据规模和部署环境确定,并通过测试确认。

+
+
- -
-
- 03 - 系统集成 -
-

- 异构系统数据管道与 API 网关 -

-

- 联通 - ERP、CRM、WMS、金税发票及第三方银行资金清算通道,构建统一安全网关与数据校验审计通道。 -

-
- API网关 - 异构数据流 - 全流程审计 -
-
+
+

03 / 实施流程

分阶段推进,每一步有确认依据

需求、原型、版本与验收均保留记录。范围发生变化时,同步确认进度和费用影响。

+
  1. 01 / 需求

    梳理业务与范围

    了解使用对象、业务流程及系统条件,确定功能优先级、实施计划与报价。

    确认资料:需求说明、实施方案
  2. 02 / 设计

    确认原型与方案

    核对页面操作、数据关系和接口规则,明确开发安排与验收方式。

    确认资料:交互原型、技术方案
  3. 03 / 研发

    开发联调与测试

    分阶段提交版本,开展代码审查、接口联调和业务测试,记录问题与处理结果。

    确认资料:阶段版本、测试记录
  4. 04 / 交付

    部署验收与移交

    完成环境配置、系统部署和操作培训,按验收清单移交工程及相关资料。

    确认资料:验收记录、交付清单
+
- -
-
- 04 - 私有部署 -
-

- 政企专属合规系统研发 -

-

- 适配国产信创芯片与操作系统环境,支持部署在客户内网服务器,满足网络安全等级保护与合规要求。 -

-
- 信创适配 - 内网部署 - 等保合规 -
-
-
-
-
+
+

04 / 交付清单

交付范围,项目启动前列明

定制源码、项目资料与第三方授权分别说明,权属、使用范围和维护安排写入合同。

+
+
01源码与工程资料
约定范围的定制源码、工程配置、依赖说明与构建方法。
+
02接口与数据说明
业务接口、数据库结构及字段说明;迁移范围和核对方法单独列明。
+
03部署与使用资料
运行环境、部署步骤、操作手册、培训及日常管理说明。
+
04测试与验收记录
业务测试结果、问题处理记录、版本说明和双方确认的验收清单。
+
+
- -
-
-
- -

- 主流可靠技术体系 · 拒绝黑盒与依赖绑定 -

-

- 我们采用业界成熟、生态健康的开源技术方案构建系统,便于客户后续维护与二次开发。 -

-
-
+

05 / 常见问答

项目启动前,
您可能关心这些

需求准备、开发费用、源码交付与后续维护。

+
没有完整的需求文档,可以先沟通吗?

可以。先说明使用对象、当前操作方式、主要问题及参考资料,再梳理功能优先级和实施范围。较复杂的调研、原型或专项验证工作,可另行约定。

+
现有系统适合改造,还是重新开发?

需要评估源码和接口条件、数据结构、运行问题及保留功能。具备改造条件时,可分阶段调整;确需重建时,另行安排数据迁移、兼容验证及系统切换。

+
开发周期与费用如何确定?

主要取决于业务复杂度、功能范围、接口数量、数据整理工作量及部署要求。需求评估后提供阶段计划与报价,发生变更时重新确认相关影响。

+
是否交付源码,其他团队能否接手?

按合同约定移交定制开发部分的源码和文档。第三方软件、开源组件与商业服务的授权单独说明。其他团队可根据工程资料、构建方法及部署说明开展后续维护。

+
上线后的问题处理和功能调整如何安排?

根据合同区分故障处理、使用支持、环境适配及新增功能。服务期限、响应安排、维护方式和费用在项目中明确,新增范围经评估确认后再实施。

+
-
-
-

- - 后端工程栈 -

-

- Java 17 / Spring Boot 3 / Spring Cloud Alibaba、PHP 8+ / - Hyperf 微服务框架、Go 语言高并发网关服务。 -

-
- 核心模块接口响应时间 以压测报告为准 -
-
- -
-

- - 持久化与缓存集群 -

-

- MySQL 8.0 主从读写分离、ShardingSphere 分库分表、Redis 7 - 哨兵/集群缓存、Elasticsearch 8 搜索引擎。 -

-
- 支持大批量数据检索 -
-
- -
-

- - 异步消息与调度 -

-

- RabbitMQ 延迟队列削峰填谷、Apache Kafka - 海量业务流事件回溯、XXL-JOB 分布式任务调度中心。 -

-
- 异步削峰与定时调度 -
-
- -
-

- - 云原生与持续交付 -

-

- Docker 容器化封装、Kubernetes 集群编排、GitLab CI / Jenkins - 自动化构建部署、Prometheus 全维监控。 -

-
- 自动化发布与服务自愈 -
-
-
-
-
- - -
-
-
- -

标准研发交付流程 · 节点可追溯

-

- 遵循 CMMI - 软件成熟度与敏捷工程规范,需求变更经双方评审确认,推动项目按计划投产。 -

-
-
- -
-
-
- 01. 调研拆解 -
-
- 需求与边界评审 -
-

- 明确系统功能边界、非功能指标及业务用例,输出详细需求规格说明书。 -

-
-
-
- 02. 架构蓝图 -
-
- 架构设计与数据建模 -
-

- 确立系统拓扑结构、微服务划分、数据库 ER 关系与接口通信协议。 -

-
-
-
- 03. 敏捷开发 -
-
- 模块编码与单元自测 -
-

- 双周迭代开发,规范分支管理与严格代码审查,单元测试覆盖核心路径。 -

-
-
-
- 04. 全面测试 -
-
- 并发压测与安全扫描 -
-

- JMeter 压力负载测试、SQL - 注入及权限漏洞扫描,发现的缺陷在上线前修复。 -

-
-
-
- 05. 私有上线 -
-
- 内网部署与灰度割接 -
-

- 指导或协助部署至客户自有云/机房,平滑迁移历史数据并灰度上线。 -

-
-
-
- 06. 源码移交 -
-
- 交付验收与维保陪跑 -
-

- 交接全套代码与设计文档,提供技术人员交接培训及 365 - 天免费质保。 -

-
-
-
-
- - -
-
-
- -

- 全套交付资产列明清单 · 源码资产归客户所有 -

-

- 我们向客户交付完整、无混淆、无后门的软件工程资产,客户拥有自主处置权与二次开发自由。 -

-
-
- -
-
-

- 代码与工程类交付物 -

-
    -
  • - - - - 完整后端服务工程源码(含完整的 Git 提交历史) -
  • -
  • - - - - 完整前端管理后台与客户端源代码 -
  • -
  • - - - - 生产环境 Dockerfile 与自动化部署 CI/CD 脚本 -
  • -
  • - - - - 单元测试用例及代码覆盖率验证报告 -
  • -
-
- -
-

- 文档与合规类交付物 -

-
    -
  • - - - - 《系统架构设计说明书》与领域模型架构图 -
  • -
  • - - - - 《数据库字典说明书》(包含所有表结构与索引设计) -
  • -
  • - - - - 标准 OpenAPI 格式的 RESTful 接口规范文档 -
  • -
  • - - - - 《服务器部署与灾备运维手册》及技术交接培训记录 -
  • -
-
-
-
-
- - -
-
-
- -

坦诚清晰 · 回答关切的工程核心问题

-

- 我们以务实透明的态度面对技术细节,把合作范围与边界写进合同。 -

-
-
- -
-
-

- Q1: 软件开发交付后,是否会移交全部源码?后续开发会受限制吗? -

-

- 纳海川交付全部未经编译混淆的完整工程源代码、数据库结构和构建脚本。所有源码知识产权归客户所有,客户可自由组建自有技术团队进行二次开发,无隐性后门与商业绑定。 -

-
- -
-

- Q2: 针对高并发大流量业务,纳海川如何保障系统的稳定性? -

-

- 我们在架构设计阶段即引入微服务解耦、数据库主从读写分离、Redis - 多级缓存与消息队列异步解耦。上线前会执行严苛的分布式压力测试(压测指标明确写入技术协议),高负载下核心接口响应时间以压测报告为准。 -

-
- -
-

- Q3: 交付后的维保服务如何执行?出现故障如何响应? -

-

- 项目验收后提供 365 天首年免费质保,包含系统运行 Bug - 修复、突发故障应急排除与系统安全加固。我们提供紧急故障 15 - 分钟内响应并介入处理的 SLA 保障机制。 -

-
-
-
-
- - -
-
-

- 需要定制开发软件系统?欢迎随时沟通 -

-

- 联系纳海川架构师,获得针对企业实际业务场景的技术架构评估方案与详细实施计划。 -

-
- - 立即预约技术沟通 - - - 电话咨询: 0851-88556677 - -
-
-
- +

项目沟通

从您当前的业务问题开始

说明业务流程、现有系统和主要问题,便于评估开发范围与实施条件。

沟通项目需求 电话咨询 {:__config('site_mobile','value')}
+
diff --git a/docs/agent-service-v2.md b/docs/agent-service-v2.md new file mode 100644 index 0000000..bcdb9d5 --- /dev/null +++ b/docs/agent-service-v2.md @@ -0,0 +1,29 @@ +# 智能体开发页(二次重构) + +## 页面规划 + +面向业务与信息化负责人,围绕应用范围、建设内容、部署管理、实施验收与咨询组织内容。采用横幅主视觉与编辑式条目,保持 1280px 容器、宋体标题、黑体正文及蓝白配色。沿用现有需求留言流程。保留私有化部署、RAG、系统接口及人工复核等实际业务说明,不使用未经证实的数据和案例。 + +模板:addons/official/view/web/official_product/service_agent.html +样式:public/assets/addons/official/css/service-agent-v2.css + +## 图片 + +采用内置 ImageGen 生成,Pillow 转码。首屏 1920×640,部署图 1024×1024。WebP 主格式、JPEG 兼容格式;首屏优先加载,部署图延迟加载。 + +- public/assets/addons/official/images/agent/landscape-v2.webp +- public/assets/addons/official/images/agent/landscape-v2.jpg +- public/assets/addons/official/images/agent/courtyard-v2.webp +- public/assets/addons/official/images/agent/courtyard-v2.jpg + +## 最终生成提示词 + +> Premium architectural abstract sculpture photograph, landscape 1536x1024. For a refined Chinese enterprise software consultancy website. A field of precise ultra-thin white porcelain sheets folds into three graceful horizontal sweeping ridges, reminiscent of a minimalist Chinese mountain landscape and the open pages of books, interleaved with three clear sapphire-blue glass planes. Forms arranged as one coherent horizontal sculptural installation in lower two thirds, on matte white limestone, airy pale grey studio background, broad empty space in upper third. Camera at a low elevated angle, 80mm architectural photography, natural directional morning light, exquisite caustics and subtle shadows, tactile off-white microtexture, just restrained cobalt glass accents. Beautiful sophisticated museum catalogue aesthetic, precise sculptural geometry, contemplative and architectural, extremely high fidelity material rendering. No letters, no text, no diagram, no UI, no neon, no robot, no brain, no circuits, no chrome spheres, no ribbons, no spirals, no purple. Composition must crop gracefully into a wide 3:1 website panorama without losing the sculpture. + +> Refined abstract architectural still life photograph for an enterprise software website, square composition. Three nested open rectangular walls of warm white porcelain surrounding a small deep blue frosted glass cube, like a quiet courtyard seen from a high oblique angle. A single precise slit of daylight crosses the interior, white matte limestone ground, natural soft shadows, tiny surface grain, asymmetrical but balanced composition. The cube sits in its own protected interior space. Modern Chinese spatial sensibility through an abstract courtyard, no traditional ornaments. Luxury architecture monograph photography, museum quality tactile materials, muted cool white with cobalt blue as the sole accent. Clean minimal and spacious. No text, letters, logos, padlock icons, robots, circuitry, glowing objects, neon or purple. Photorealistic 3D sculpture, finely observed light. + +## 验证 + +通过专属服务页面与文案检查(11项)。已验证 1440px 桌面、375px 手机、812px 横屏、125% 缩放,以及 reduced-motion、FAQ 键盘展开、页内锚点与图片加载。使用真实 PC / 移动公共模板生成本地预览。 + +本地 UI/UX Pro Max 的 scripts 为失效路径指针,无法运行搜索脚本;按技能正文完成可访问性、触控与响应式检查。保留现有 ThinkPHP 技术栈。 diff --git a/docs/app-service-redesign.md b/docs/app-service-redesign.md new file mode 100644 index 0000000..b3556e5 --- /dev/null +++ b/docs/app-service-redesign.md @@ -0,0 +1,38 @@ +# APP 与小程序服务页重构 + +## 策划 + +面向企业业务负责人及信息化负责人,按终端选型、业务场景、开发能力、实施交付、常见问题组织内容。APP、小程序、H5 分别说明适用情况与评估事项,不将多端覆盖作为无条件承诺。强调实际设备、网络、接口和账号条件。 + +文案不使用固定帧率、上架通过率或保证审核等表述。交付明确工程源码、资源文件、接口文档与测试记录,发布协助及维护范围以合同约定为准。电话改为站点配置值。 + +## 视觉与交互 + +延续新版首页的白底、蓝色、宋体标题及 1280px 容器。制作两张白瓷与蓝色玻璃抽象图片,分别表达多终端与共用业务服务。桌面首屏左右布局,移动端按阅读顺序排列,采用与新版首页一致的品牌页头及原生菜单。FAQ 使用 details/summary,支持键盘操作。 + +## 文件 + +- addons/official/view/web/official_product/service_app.html +- addons/official/view/web/official_product/list.html(本页 viewport 条件) +- addons/official/view/web/official_product/list_e.html(仅本页移动页头与轮播适配) +- public/assets/addons/official/css/service-app.css +- public/assets/addons/official/images/app/terminals.webp +- public/assets/addons/official/images/app/terminals.jpg +- public/assets/addons/official/images/app/foundation.webp +- public/assets/addons/official/images/app/foundation.jpg + +## 配图 + +采用内置 ImageGen 生成,经 Pillow 转码为 WebP 和 JPEG,1440×960。首屏 WebP 约 42KB,说明图约 91KB。声明图片尺寸,非首屏延迟加载。 + +最终提示词: + +> Premium abstract sculptural still life for a Chinese enterprise APP and mini-program software development service website. Landscape 3:2 editorial photograph. Three upright softly rounded rectangular slabs of different proportions, two warm-white matte porcelain and one translucent deep cobalt-blue glass, arranged in a precise staggered group on a thin white limestone plinth, connected at their bases by one fine blue glass inset. Evoke different mobile terminals sharing a foundation without showing actual phones. Forms have architectural integrity and tactile realism, no screens, no buttons, no camera holes, no interface, no text, no lettering. Modern Chinese spatial balance, framed negative spaces, very restrained material palette, white #F8FAFC background, softly directional daylight, exquisite glass refraction and fine ceramic microtexture, gentle pale slate shadows. Museum catalogue photography, sophisticated high-end brand design. Complete sculpture visible centered with generous empty margin. No ribbons, no spheres, no circuitry, no brain, no robot, no neon, no purple, no glowing effects. + +> Create an exquisite minimalist architectural still life, landscape 3:2 composition, for an enterprise mobile app engineering website. A precise white porcelain horizontal bridge rests across three low warm-white rectangular supports. Beneath it a single cobalt-blue frosted glass rail joins all three supports, visibly connecting the structure. A thin translucent glass plate hovers very slightly above the white bridge as a separate crafted layer, believable physical construction. Carefully aligned engineering joinery, soft edge radius only 4mm, tactile limestone base and seamless pale white studio background. Photorealistic high-end architectural model photography with oblique camera angle, soft morning light and gentle shadows, exceptional material detail. Visual metaphor for shared business services supporting different terminals. Refined modern Chinese architectural rhythm without decoration. No letters, no text, no UI, no actual phones, no digital icons, no robot, no brain, no circuit board, no neon, no purple, no ribbons or spheres. Airy spacious composition showing the whole sculpture. + +## 验证 + +相关 28 项测试通过。浏览器检查 1440px 桌面、375px 手机、812px 横屏、125% 缩放、减少动态效果、图片加载、页内锚点、FAQ 与菜单键盘操作。基于现有 PC / 移动公共模板生成本地预览;发布后检查服务器渲染、资源和跳转,并回查首页及智能体页。 + +UI/UX Pro Max 本地 scripts 为失效路径指针,依据技能正文完成可访问性、触控和响应式检查,沿用 ThinkPHP 技术栈。 diff --git a/docs/cases-image-prompts.json b/docs/cases-image-prompts.json new file mode 100644 index 0000000..b6d3ebd --- /dev/null +++ b/docs/cases-image-prompts.json @@ -0,0 +1,22 @@ +{ + "tool": "built-in image_gen", + "workspace_directory": "M:/2026项目/nahaichuan/public/assets/addons/official/images/cases", + "images": [ + { + "asset": "distribution.webp / distribution.jpg", + "prompt": "Premium abstract architectural still-life photograph for a refined Chinese enterprise software case-study website. Landscape 3:2. Several small off-white porcelain rectangular blocks connected by branching cobalt-blue glass channels, a precise orderly distribution network on a pale limestone plinth. Complete sculpture centered with generous negative space, matte warm-white seamless background, soft natural daylight, finely detailed ceramic microtexture, restrained blue glass, subtle slate shadows, museum catalogue editorial art direction. Modern Chinese spatial rhythm through geometry and emptiness only. No text, no letters, no logos, no screens, no interface, no diagrams, no circuitry, no neon, no purple, no robots, no spheres, no ribbons. Photorealistic and beautifully crafted." + }, + { + "asset": "retail.webp / retail.jpg", + "prompt": "Premium abstract architectural still-life photograph for a refined Chinese enterprise software case-study website. Landscape 3:2. Three off-white porcelain open rectangular doorways along a single horizontal cobalt-blue glass rail, arranged like a quiet series of coordinated shop spaces. Complete sculpture centered with generous negative space, matte warm-white seamless background, soft natural daylight, finely detailed ceramic microtexture, restrained blue glass, subtle slate shadows, museum catalogue editorial art direction. Modern Chinese spatial rhythm through geometry and emptiness only. No text, no letters, no logos, no screens, no interface, no diagrams, no circuitry, no neon, no purple, no robots, no spheres, no ribbons. Photorealistic and beautifully crafted." + }, + { + "asset": "manufacturing.webp / manufacturing.jpg", + "prompt": "Premium abstract architectural still-life photograph for a refined Chinese enterprise software case-study website. Landscape 3:2. A precise assembly of interlocking off-white porcelain geometric parts, one sapphire-blue glass plate fitted between the components, elegant engineered joinery. Complete sculpture centered with generous negative space, matte warm-white seamless background, soft natural daylight, finely detailed ceramic microtexture, restrained blue glass, subtle slate shadows, museum catalogue editorial art direction. Modern Chinese spatial rhythm through geometry and emptiness only. No text, no letters, no logos, no screens, no interface, no diagrams, no circuitry, no neon, no purple, no robots, no spheres, no ribbons. Photorealistic and beautifully crafted." + }, + { + "asset": "knowledge.webp / knowledge.jpg", + "prompt": "Premium abstract architectural still-life photograph for a refined Chinese enterprise software case-study website. Landscape 3:2. Thin upright white porcelain sheets arranged like an open reference book around a single translucent cobalt-blue glass rectangle, a refined abstract archive. Complete sculpture centered with generous negative space, matte warm-white seamless background, soft natural daylight, finely detailed ceramic microtexture, restrained blue glass, subtle slate shadows, museum catalogue editorial art direction. Modern Chinese spatial rhythm through geometry and emptiness only. No text, no letters, no logos, no screens, no interface, no diagrams, no circuitry, no neon, no purple, no robots, no spheres, no ribbons. Photorealistic and beautifully crafted." + } + ] +} diff --git a/docs/cases-redesign.md b/docs/cases-redesign.md new file mode 100644 index 0000000..330cd97 --- /dev/null +++ b/docs/cases-redesign.md @@ -0,0 +1,32 @@ +# 案例列表页重构 + +页面:https://www.gynhc.com/official/case_show/list/14/14.html + +## 策划与设计 + +以业务问题组织案例,保留商贸流通、连锁餐饮、装备制造、知识管理四个方向。卡片先展示项目概况和主要功能,业务挑战、实施方案、交付内容收进原生可展开说明。增加项目比对建议及需求咨询入口。 + +采用浅色专业风、蓝色交互、宋体标题、细线和紧凑双列布局。手机端单列,提供原生菜单。筛选支持选中状态、项目数量反馈和键盘操作。图片明确标注为抽象示意,业务结构图单独说明用途。 + +## 实施范围 + +- 替换案例列表电脑、手机模板 list.html / list_e.html。 +- 新增 cases-nhc.css、cases-nhc.js 及四组 WebP/JPEG 配图。 +- 未修改案例详情页、共享导航及其他业务页面。 +- 现有案例描述作为内容来源;未添加客户身份、量化提升数据或准确率承诺。离线操作与支付条件分别说明,智能体保留原文引用及人工复核。 + +## 验证及发布 + +文案 5 项、图片 7 项、客户资料规范 3 项、案例结构 14 项检查全部通过。浏览器验证 1440px 桌面、375px 手机及 812px 横屏布局,无横向溢出;筛选项目数依次为 4 / 2 / 1 / 1 / 3,44px 触控目标、键盘展开和手机菜单通过。 + +生产环境桌面与 iPhone User-Agent 均返回 200,四个项目及独立样式、脚本引用正确。iPhone 12 模拟环境验证 390px 布局无溢出,智能体筛选及项目说明展开正常,无浏览器错误。图片使用 WebP,单张约 30–58 KB,保留 JPEG 回退。 + +上线备份:`/www/backup/nhc-cases-redesign-20261105-143120`。发布 12 个文件,资产先于模板,上传时校验 SHA-256,清除编译模板缓存。发布前检查远端文件未在核对后发生变化。清单保存在 `runtime/cases-deployment.json`。 + +## 配图交付 + +使用内置 image_gen 工具分别生成四张图片,已保存为项目资产: + +`public/assets/addons/official/images/cases/{distribution,retail,manufacturing,knowledge}.{webp,jpg}` + +生成提示词见 `cases-image-prompts.json`。 diff --git a/docs/home-before.png b/docs/home-before.png new file mode 100644 index 0000000..95597ba Binary files /dev/null and b/docs/home-before.png differ diff --git a/docs/homepage-redesign.md b/docs/homepage-redesign.md new file mode 100644 index 0000000..39790cc --- /dev/null +++ b/docs/homepage-redesign.md @@ -0,0 +1,60 @@ +# 官网首页重构 + +## 页面定位与内容 + +面向企业业务负责人、信息化负责人和产品选型人员,先说明软件定制与标准产品两条路径,再展示项目案例、实施流程、公司介绍、客户反馈和技术文章。 + +以具体服务名称与项目工作说明范围,不新增客户数量、认证、业绩等背书。客户反馈沿用旧首页前两条原文。抽象案例插图标注为“方案示意”。新闻继续从 information.data 读取,空数据时展示简短提示,不链接不存在的默认文章。 + +## 视觉与交互 + +1280px 容器、宋体标题、黑体正文、蓝白配色、细线与 4px 圆角。移除首页轮播,首屏保留一组核心内容和业务入口。移动端使用独立品牌页头及原生 details 菜单;桌面复用公共导航。两套模板采用同一主体规划。 + +产品入口使用现有 product-matrix 与 demo-sandbox 锚点;SaaS 按钮为“咨询开通”,指向联系留言页面。电话从站点配置读取。 + +## 文件 + +- addons/official/view/web/official_home/index.html +- addons/official/view/web/official_home/index_e.html +- public/assets/addons/official/css/home-nhc.css +- public/assets/addons/official/images/home/confluence.webp(JPEG 兼容格式同目录) +- public/assets/addons/official/images/home/modules.webp(JPEG 兼容格式同目录) + +## 配图生成 + +使用内置 ImageGen 生成,Pillow 转为 WebP 与 JPEG。首屏 WebP 约 70KB,公司介绍图约 79KB,均声明尺寸,非首屏延迟加载。 + +最终提示词: + +> Create a premium abstract architectural sculpture photograph for the homepage of NAHAICHUAN, a refined Chinese software engineering company. Landscape 3:2, gallery-quality photorealistic still life on a warm white seamless studio ground. Several long precision-cut matte white porcelain channels and slim rectangular beams flow together from different directions into one elegant open rectangular courtyard, with a single slender cobalt-blue glass plane threading horizontally through the lower structure. Architectural composition conveys separate business systems becoming connected. No mountains, no folded paper, no ribbon, no brain, no robot, no circuits, no text or logo. Modern Chinese architecture expressed only through spatial rhythm, framed views and emptiness. Soft sunlight from upper left, finely detailed matte stone and translucent blue glass, gentle grey shadows, sophisticated tranquil high-end editorial art direction, abundant negative space around the complete sculpture. Sculpture mostly occupies center-right and lower area, background pale white #F8FAFC. Tactile, precise, restrained and beautiful. + +> Museum-quality abstract architectural still life, horizontal wide composition for a professional software company website. Four distinct low rectangular modules of warm-white matte porcelain sit on a limestone platform, precisely aligned yet each with a different elegant open cutout. A thin translucent cobalt-blue glass rail connects the four modules along one shared axis. View from high oblique angle, exquisite natural daylight, warm white and pale slate-grey with one restrained blue accent, realistic tactile ceramics and frosted glass, quiet architectural rhythm inspired by modern Chinese courtyard design without ornament. Spacious balanced composition with no clutter. Premium brand photography, beautifully controlled shadows, photorealistic 3D. No labels, no text, no symbols, no logos, no robots, no circuitry, no neon, no purple, no spheres, no ribbons. The entire sculpture is visible with generous breathing room. Pale white background. + +## 验证范围 + +相关 40 项测试通过。浏览器核对桌面、375px 手机、横屏、125% 缩放、减少动态效果、键盘菜单、锚点及图片加载。PC 与移动模板均生成本地静态预览,发布后另核对服务器实际渲染和动态文章。 + +UI/UX Pro Max 本地 scripts 为失效路径指针,沿用技能正文的可访问性、对比度、触控与响应式规范。保留原有 ThinkPHP 技术栈,无新增框架。 + +## 首页内容补充(2026-11-05) + +保留现有首屏、品牌配图、文章数据及咨询路径,增加内容深度: + +- 三项服务分别补充可承担的具体工作(共9项)。 +- 四类产品补充功能与评估事项(共12项),增加标准产品、定制开发、已有系统集成的选型提示。 +- 四个案例增加业务关注与方案范围说明,不增加效果数据或客户背书。 +- 增加工程配置、数据文档、部署维护的交付与运行板块。 +- 增加五个合作问答,说明需求准备、周期费用、既有系统、接手维护与新增需求。 +- 咨询入口前增加可准备的资料清单,并提供首页内容导航。 + +相关40项测试通过,检查375px手机、横屏、125%缩放、减少动态效果、FAQ键盘操作与页内锚点。仅发布首页两套模板及首页样式,原文件另行备份。 + +## 紧凑排版调整(2026-11-05) + +保留全部首页内容,收紧板块上下间距、标题与正文距离、卡片内边距与列表行间隔;降低服务、产品、案例和文章图片高度。桌面板块间距由94px调整为56px,手机由58px调整为38px。保持正文可读性、咨询按钮和菜单的点击区域。 + +同一视口下,桌面首页主体高度由约8093px降至6276px(约22%),手机由约14973px降至12683px(约15%)。14项首页跳转与文案测试通过,另检查横屏、125%缩放、减少动态效果和FAQ键盘操作。仅发布首页样式及两套模板的缓存版本号。 + +## 第二轮紧凑优化 + +桌面案例改为横向图文,手机服务、产品及资讯使用缩略图,进一步收紧首屏和板块留白。全部内容保留。相同视口下,主体高度桌面约5092px,手机约9886px,较上一版再减少约19%和22%。验证320px窄屏、横屏、125%缩放及14项相关测试。 diff --git a/docs/homepage-v3.md b/docs/homepage-v3.md new file mode 100644 index 0000000..310b2bb --- /dev/null +++ b/docs/homepage-v3.md @@ -0,0 +1,38 @@ +# 首页重设计 · 2026-11-05 + +## 策划与内容 + +首页面向企业经营负责人及信息化负责人,以“为企业经营,做好每一套软件”为核心表达。 + +内容顺序:品牌首屏 → 服务 → 产品 → 案例 → 实施交付 → 公司介绍与原有客户反馈 → 动态文章 → 合作问答 → 项目咨询。 + +服务说明承担的工作,产品说明适用场景,交付说明阶段成果。精简原首页重复的技术说明和选型条目,不新增客户数量、资质、业务效果或客户评价。文章继续使用后台数据。案例插图标注“方案示意”,办公配图标注“品牌意境图”。 + +## 视觉 + +1280px 内容区域、宋体标题、黑体正文、蓝白配色、4–6px圆角。首屏采用山水、庭院和蓝色水线的宽幅构图,其余区域用细线、留白和信息层级组织内容。产品工作台为网页绘制的界面示意,非真实经营数据。 + +两套首页模板共享同一内容与专属 CSS,手机使用原生折叠菜单。支持键盘焦点与减少动态效果设置。保持服务、产品、案例、关于、咨询及电话入口。 + +## 新增图片与生成方式 + +使用内置 ImageGen 生成,并转换为 WebP 和 JPEG 存入项目。 + +- `public/assets/addons/official/images/home/river-courtyard-v3.webp`:1983 × 793,约167KB;JPEG同名。 +- `public/assets/addons/official/images/home/office-editorial-v3.webp`:1536 × 1024,约179KB;JPEG同名。 + +首屏图片优先加载,其余图片延迟加载。以下为最终生成提示词。 + +### 首屏 + +Use case: stylized-concept. Asset type: premium Chinese software company website panoramic hero artwork. Create an exquisite architectural landscape photograph / photoreal CGI, panoramic 2.5:1 composition. A calm contemporary Chinese courtyard with pale ivory stone architecture and subtle vertical window lattice on the far right; a single sculptural sweeping blue glass ribbon shaped like a river bends among low white stone terraces and a shallow still reflecting pool, distant misty blue-grey Chinese mountains. Blue glass is elegant translucent cobalt #2563EB, never neon. Soft clear morning daylight, beautifully precise stone texture, refined architectural magazine photography, quiet and spacious, white and very pale blue palette. Place all the main architecture and glass river in the RIGHT 60 percent, LEFT 40 percent almost empty pale sky and distant very faint mountains to allow dark website text overlay. No people, no text, no logos, no screens, no floating cubes, no futuristic city, no watermark. Wide cinematic landscape 2400x960 style. + +### 品牌意境图 + +Use case: photorealistic-natural. Asset type: Chinese enterprise software company website brand image, landscape 3:2. Premium architectural editorial photograph of a serene contemporary Chinese office meeting space: long light oak table, two elegant charcoal chairs, floor-to-ceiling windows with slender dark vertical mullions, luminous white stone walls, one open laptop seen at an angle with indistinct neutral business interface, a few neatly arranged paper sheets. Through the windows misty green grey mountain silhouette in the distance. Natural midmorning side light, honest tactile materials, restrained pale warm whites and slate blue accents. Modern Guiyang architectural sensibility, beautifully composed, sophisticated quiet real working environment, no people, no logo, no legible text, no robots, no neon, no futuristic effects, no exaggerated luxury. + +## 上线与验证 + +仅发布 PC/移动首页模板、`home-v3.css` 和上述图片。服务器原文件备份在 `runtime/home-v3-backup-20261105-143831`;逐文件核对 SHA-256,清除2个首页编译缓存。未使用仓库硬重置部署。 + +14项现有首页文案及按钮跳转测试通过。已检查线上1440px桌面、390px手机、图片加载、菜单和问答交互;本地320px窄屏无横向溢出。新闻动态由实际服务端渲染验证。截图及部署清单位于本地 `runtime/home-v3-*`。 diff --git a/docs/software-service-redesign.md b/docs/software-service-redesign.md new file mode 100644 index 0000000..07eb647 --- /dev/null +++ b/docs/software-service-redesign.md @@ -0,0 +1,40 @@ +# 软件开发服务页重构 + +## 策划与文案 + +面向业务负责人和信息化负责人,以建设方式为起点,介绍新建系统、既有系统改造、接口集成及按需中台建设。说明业务流程与数据设计、架构选型、权限管理、测试和运行准备。 + +不把微服务等技术选型直接等同于性能结果。交付分源码构建、接口数据、部署使用、测试验收四类,另行说明迁移条件、第三方授权及维护范围。保留现有联系留言流程,电话从站点配置读取。 + +## 视觉与交互 + +沿用新版首页和服务页的白底、蓝色、宋体标题、1280px 容器与细线结构。两张白瓷及蓝色玻璃图片分别表达模块集成与分层装配。首屏优先加载,非首屏延迟加载;图片保持完整,不以裁切破坏主要结构。 + +手机使用品牌页头及原生 details 菜单。FAQ 同样使用 details/summary,支持键盘。页面样式限定在 software-service 内,避免影响其他页面。 + +## 文件 + +- addons/official/view/web/official_product/service_software.html +- addons/official/view/web/official_product/list.html(本页 viewport 条件) +- addons/official/view/web/official_product/list_e.html(本页移动菜单与轮播适配) +- public/assets/addons/official/css/service-software.css +- public/assets/addons/official/images/software/assembly.webp +- public/assets/addons/official/images/software/assembly.jpg +- public/assets/addons/official/images/software/layers.webp +- public/assets/addons/official/images/software/layers.jpg + +## 配图 + +使用内置 ImageGen 生成,经 Pillow 转码为 WebP 与 JPEG,均为 1440×960。首屏 WebP 约 105KB,分层图约 84KB。 + +最终提示词: + +> Create an exceptionally refined abstract architectural sculpture photograph for an enterprise software development service website. Landscape 3:2. A precise assembled system of six off-white matte porcelain geometric modules arranged on a square limestone base in a loose three-by-two spatial grid, some solid and some open rectangular frames. One continuous thin translucent cobalt-blue glass plane passes through aligned slots in the modules, visibly linking them into a coherent structure. Oblique architectural camera angle, entire sculpture visible, balanced visual weight, generous negative space, soft pale-white studio ground #F8FAFC. Elegant joinery details, crisp but softly chamfered edges, tactile ceramic microtexture, believable glass refraction, natural daylight from upper left and subtle slate-grey shadows. Museum catalogue luxury editorial quality, modern Chinese architectural rhythm through structure and framed space, no traditional ornaments. Pure abstract sculpture, not furniture or a building, no phones, no screens, no UI, no letters, no text, no robots, no brain, no circuit boards, no neon, no purple, no ribbons, no spheres. + +> Luxury architectural model photograph of an abstract software structure, landscape 3:2. Four beautifully crafted thin square plates, white ceramic, clear glass, white ceramic and deep cobalt-blue frosted glass, arranged as a small precise exploded assembly with gentle horizontal offsets on a square pale limestone plinth. Narrow vertical porcelain pins align all layers so this reads as an engineered layered sculpture with visible assembly logic, not a bench or furniture. View at a high oblique angle, sophisticated calm modern Chinese spatial sensibility, sparse geometry, entire sculpture visible surrounded by airy off-white space. Natural morning light, soft diffuse shadows, exquisite material textures, quiet restrained blue accent. Photorealistic museum-quality still-life art direction. No labels, no text, no icons, no screens, no circuit patterns, no robot, no neon, no spheres, no purple, no ribbons. A coherent carefully assembled object that evokes clear layers and maintainable structure. + +## 验证 + +相关 28 项测试通过。检查 1440px 桌面、375px 手机、812px 横屏、125% 缩放、减少动态效果、图片、页内锚点、菜单与 FAQ 键盘操作。先使用真实公共模板构建本地预览,发布后核对服务器渲染、资源及链接,并回查首页、APP 页与智能体页。 + +UI/UX Pro Max 本地 scripts 为失效路径指针,依据技能正文执行排版、对比度、触控与可访问性检查。沿用 ThinkPHP 技术栈。 diff --git a/docs/software-service-v2.md b/docs/software-service-v2.md new file mode 100644 index 0000000..0ad369b --- /dev/null +++ b/docs/software-service-v2.md @@ -0,0 +1,43 @@ +# 软件开发页第二版 + +页面:https://www.gynhc.com/official/service/software.html + +## 内容规划 + +面向企业业务负责人和信息化负责人,围绕开发范围、实施过程和交付依据组织内容。首屏直接说明企业软件开发与现有系统改造;依次提供四种建设方式、业务场景、研发能力、四阶段流程、交付清单、部署维护及五项常见问答。 + +源码、第三方授权、数据迁移、私有化部署及维护范围分别说明。开发周期与费用按业务条件评估,未添加客户身份、业绩数字或无条件性能承诺。 + +## 视觉与交互 + +浅色专业风,1280px 容器、宋体标题、科技蓝与细线。首屏图文并置,服务与交付采用紧凑清单;手机端单列。两张石材和蓝色玻璃建筑抽象图分别表达系统连接与模块分层,保留完整构图并标注抽象示意。 + +电脑端页内目录随滚动保留,手机端正常排版避免遮挡。使用原生 details/summary 实现手机菜单和问答,提供键盘焦点、跳转链接、减少动态效果适配及至少 44px 的交互目标。 + +UI/UX Pro Max 的本地搜索脚本为失效路径指针,未发现实际脚本;依据技能正文及站点要求执行布局、对比度、触控和响应式检查,沿用现有 ThinkPHP 模板技术栈。 + +## 文件与配图 + +页面模板:`addons/official/view/web/official_product/service_software.html`。 + +独立样式:`public/assets/addons/official/css/service-software-v2.css`。 + +使用内置 image_gen 工具生成图片,项目资产位于 `public/assets/addons/official/images/software/`:`structure-v2.webp`、`structure-v2.jpg`、`layers-v2.webp`、`layers-v2.jpg`,尺寸均为 1440×960。WebP 分别约 66KB 与 54KB,保留 JPEG 回退,首屏优先加载,后续图片延迟加载。完整提示词见 `software-v2-image-prompts.json`。 + +## 验证 + +服务独立页 6 项、文案 5 项检查全部通过。静态验证图片路径、文件尺寸与两份发布入口模板的变更范围。 + +浏览器检查 1440px 桌面、375px 手机、812px 横屏、125% 缩放及减少动态效果,无横向溢出。图片与页内锚点有效,问答和菜单支持键盘操作。 + +发布后检查桌面及 iPhone 响应均为 200,返回新版模板。iPhone 15 模拟环境 393px 布局无横向溢出,菜单与问答展开正常,咨询链接与配置电话正确。两张图片及回退格式、CSS 的线上响应与本地文件内容一致。首页、APP 页、智能体页、案例页与联系页均返回 200,浏览器未报错。 + +额外运行的站点图片测试有两项失败,断言仍要求首页引用旧 SVG 文件;当前工作区首页已由其他工作改用新配图,与本次软件页无关,未修改这些断言及首页。 + +## 发布 + +备份:`/www/backup/nhc-software-v2-20261105-144203`。 + +共发布 8 个文件,上传时校验 SHA-256,资产先于模板,清理编译模板缓存。发布前保存远端文件摘要并再次核对,避免覆盖核对后发生的变更。 + +远端产品入口模板与本地现有版本不同。发布时以远端原文件为基础,仅为软件页增加 viewport、手机旧导航隐藏及手机品牌页头变量,逐字核对其他分支不变。实际发布入口副本保存在 `runtime/software-v2-backup/publish-list.html` 与 `publish-list_e.html`;未将本地其他服务分支的差异部署到服务器。清单保存在 `runtime/software-v2-deployment.json`。 diff --git a/docs/software-v2-image-prompts.json b/docs/software-v2-image-prompts.json new file mode 100644 index 0000000..c60531b --- /dev/null +++ b/docs/software-v2-image-prompts.json @@ -0,0 +1,20 @@ +{ + "tool": "built-in image_gen", + "directory": "M:/2026项目/nahaichuan/public/assets/addons/official/images/software", + "images": [ + { + "files": [ + "structure-v2.webp", + "structure-v2.jpg" + ], + "prompt": "Premium architectural still-life photograph for an established Chinese enterprise software engineering studio. Landscape 3:2 composition. A beautifully engineered miniature architectural composition: three off-white limestone portal frames, horizontal rectangular platforms and one translucent deep cobalt-blue glass beam joining them into a coherent spatial structure, subtle precision joinery, sculptural but grounded, complete object visible with comfortable margin, gallery-quality product photography. Matte pale warm-gray seamless background, diffuse daylight from upper left, fine stone microtexture, refined blue refracted light, restrained shadows. Quiet contemporary Chinese spatial rhythm, aligned geometry, museum editorial art direction. No text, no letters, no UI, no logos, no circuitry, no neon, no spheres, no ribbons, no robot, no cartoon. Physical material realism, exquisite detail, understated business character." + }, + { + "files": [ + "layers-v2.webp", + "layers-v2.jpg" + ], + "prompt": "Landscape 3:2 premium architectural still-life photograph, complementary to a refined enterprise software studio website. A small precision-assembled limestone sculpture on a warm-white surface: four thin horizontal pale stone plates held apart by short vertical stone posts, one single vertical translucent cobalt-blue glass partition passing cleanly through the layers. Complete object centered, generous blank space all around, low three-quarter camera angle, tactile matte stone, soft natural daylight, elegant engineering joints, faint blue refraction, crisp yet gentle contact shadows. Quiet contemporary Chinese architecture through proportions and emptiness. Editorial museum catalogue photography, realistic physical materials. No text, no words, no letters, no logos, no screens, no interface, no icons, no charts, no neon, no robots, no spheres, no ribbons, no cartoon." + } + ] +} diff --git a/public/assets/addons/official/css/cases-nhc.css b/public/assets/addons/official/css/cases-nhc.css new file mode 100644 index 0000000..24d000d --- /dev/null +++ b/public/assets/addons/official/css/cases-nhc.css @@ -0,0 +1,8 @@ +.cases-nhc{--cs-blue:#2563eb;--cs-ink:#0f172a;--cs-copy:#475569;--cs-muted:#64748b;--cs-line:#dce4ed;--cs-soft:#f8fafc;background:#fff;color:var(--cs-ink);font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.8;overflow-wrap:break-word}.cases-nhc *{box-sizing:border-box}.cases-nhc :where(h1,h2,h3,p,figure,ol,ul,dl,dd){margin:0}.cases-nhc h1,.cases-nhc h2{font-family:var(--font-serif,"SimSun",serif);font-weight:600;line-height:1.4;color:var(--cs-ink)}.cases-nhc a{text-decoration:none;color:inherit}.cases-nhc a:focus-visible,.cases-nhc button:focus-visible,.cases-nhc summary:focus-visible{outline:3px solid var(--cs-blue);outline-offset:4px}.cases-nhc [hidden]{display:none!important}.cases-nhc [id]{scroll-margin-top:95px}.cases-nhc nav{height:auto;line-height:inherit;box-shadow:none;background:transparent;color:inherit}.cs-wrap{max-width:1280px;width:100%;padding:0 32px;margin:auto}.cs-skip,.cs-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.cs-skip:focus{position:fixed;top:80px;left:20px;width:auto;height:auto;clip-path:none;background:#fff;padding:12px 20px;z-index:1100}.cs-kicker{font-size:12px;color:var(--cs-blue);letter-spacing:1.5px}.cs-hero{padding:95px 0 26px}.cs-crumb{display:flex;align-items:center;gap:12px;font-size:12px;color:var(--cs-copy);margin-bottom:24px}.cs-crumb a{min-height:44px;display:inline-flex;align-items:center}.cs-hero-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:9%;align-items:end}.cases-nhc h1{font-size:48px;margin-top:12px;letter-spacing:1px}.cs-hero-grid>div:last-child>p{font-size:15px;color:var(--cs-copy);line-height:1.9;max-width:450px}.cases-nhc .cs-link{display:inline-flex;align-items:center;gap:18px;min-height:44px;font-size:13px;color:var(--cs-copy)}.cases-nhc .cs-link:hover{color:var(--cs-blue)}.cs-hero-grid .cs-link{margin-top:13px}.cs-disclosure{font-size:12px;color:var(--cs-muted);margin-top:24px!important;border-top:1px solid var(--cs-line);padding-top:16px} +.cs-list-section{padding:0 0 42px}.cs-filter-line{display:flex;justify-content:space-between;align-items:center;gap:25px;padding:13px 0 21px}.cs-filters{display:flex;gap:10px;flex-wrap:wrap}.cs-filters button{min-height:44px;padding:9px 19px;border:1px solid var(--cs-line);border-radius:4px;background:#fff;color:var(--cs-copy);font:inherit;font-size:13px;cursor:pointer;transition:background .2s,color .2s,border-color .2s;box-shadow:none;text-transform:none;letter-spacing:0}.cs-filters button:hover{border-color:var(--cs-blue);color:var(--cs-blue)}.cs-filters button[aria-pressed=true]{background:var(--cs-blue);color:#fff;border-color:var(--cs-blue)}.cs-result{font-size:12px;color:var(--cs-muted);white-space:nowrap}.cs-grid{display:grid;grid-template-columns:1fr 1fr;gap:28px;align-items:start}.cs-card{border:1px solid var(--cs-line);border-radius:4px;overflow:hidden;background:#fff;min-width:0}.cs-card>figure{position:relative;background:var(--cs-soft)}.cs-card picture{display:block}.cs-card>figure img{display:block;width:100%;height:235px;object-fit:cover;object-position:center}.cs-card>figure figcaption{position:absolute;left:0;bottom:0;width:100%;display:flex;justify-content:space-between;padding:16px 22px;font-size:10px;letter-spacing:.9px;color:var(--cs-copy);background:linear-gradient(transparent,#f8fafcf5)}.cs-card-body{padding:22px 25px 0}.cs-meta{display:flex;align-items:center;justify-content:space-between;gap:15px;font-size:11px;color:var(--cs-muted)}.cs-meta>span:first-child{color:var(--cs-blue)}.cases-nhc h3{font-size:23px;line-height:1.5;font-weight:600;color:var(--cs-ink)}.cs-card h3{margin:9px 0 11px}.cs-intro{font-size:14px;color:var(--cs-copy);line-height:1.9;min-height:54px}.cs-features{display:flex;flex-wrap:wrap;gap:6px 18px;padding:0;list-style:none;margin:15px 0 18px!important;font-size:12px;color:var(--cs-copy)}.cs-features li{padding-left:11px;position:relative}.cs-features li:before{content:"";position:absolute;left:0;top:10px;width:3px;height:3px;background:var(--cs-blue)}.cs-dossier{border-top:1px solid var(--cs-line)}.cs-dossier summary{display:flex;align-items:center;justify-content:space-between;min-height:55px;padding:12px 0;font-size:13px;list-style:none;cursor:pointer;color:var(--cs-copy)}.cs-dossier summary::-webkit-details-marker{display:none}.cs-dossier summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.cs-dossier summary>span:before,.cs-dossier summary>span:after{content:"";position:absolute;left:2px;top:8px;width:12px;height:1px;background:var(--cs-blue)}.cs-dossier summary>span:after{transform:rotate(90deg);transition:transform .2s}.cs-dossier[open] summary>span:after{transform:rotate(0)}.cs-dossier dl{padding-bottom:4px}.cs-dossier dl>div{display:grid;grid-template-columns:65px 1fr;gap:18px;margin:0 0 17px}.cs-dossier dt{font-size:12px;font-weight:500;color:var(--cs-ink)}.cs-dossier dd{font-size:14px;color:var(--cs-copy);line-height:1.9}.cs-original{border:1px solid var(--cs-line);background:var(--cs-soft);border-radius:4px;margin:2px 0 22px!important;padding:10px}.cs-original img{display:block;width:100%;height:115px;object-fit:contain}.cs-original figcaption{text-align:center;font-size:10px;color:var(--cs-muted);padding-top:5px}.cs-empty{padding:28px 0;color:var(--cs-copy)} +.cs-review{padding:35px 0;background:var(--cs-soft);border-top:1px solid var(--cs-line)}.cs-review>.cs-wrap{display:grid;grid-template-columns:1fr 2fr;gap:50px}.cs-review h2{font-size:28px;margin-top:11px;max-width:280px}.cs-review ol{display:grid;grid-template-columns:repeat(3,1fr);gap:28px;list-style:none;padding:0}.cs-review li>span{font-family:Georgia,serif;color:var(--cs-blue);font-size:15px}.cs-review h3{font-size:16px;margin:11px 0 9px}.cs-review p:not(.cs-kicker){font-size:13px;color:var(--cs-copy);line-height:1.9}.cs-contact{padding:35px 0;border-top:1px solid var(--cs-line)}.cs-contact>.cs-wrap{display:flex;justify-content:space-between;align-items:center;gap:45px}.cs-contact h2{font-size:30px;margin:10px 0 12px}.cs-contact p:not(.cs-kicker){font-size:14px;color:var(--cs-copy)}.cs-contact>.cs-wrap>div:last-child{display:flex;flex-direction:column;align-items:flex-start;gap:10px;flex-shrink:0}.cases-nhc .cs-btn{display:inline-flex;align-items:center;justify-content:center;gap:28px;min-height:50px;padding:12px 23px;background:var(--cs-blue);color:#fff;font-size:14px;border-radius:4px}.cs-btn>span{font-size:20px}.cases-nhc .cs-btn:hover{background:#1d4ed8}.cs-contact .cs-link{font-size:12px} +.cs-mobile-header{position:fixed;z-index:1000;top:0;left:0;width:100%;height:68px;background:#fffffff5;border-bottom:1px solid var(--cs-line);display:flex;align-items:center;gap:24px;padding:0 22px}.cases-nhc .cs-brand{font-family:var(--font-serif,"SimSun",serif);font-size:23px;font-weight:600;letter-spacing:2px;line-height:1.2;display:flex;flex-direction:column;justify-content:center;min-height:44px;margin-right:auto}.cs-brand>span{font-family:var(--font-sans,sans-serif);font-size:8px;font-weight:500;letter-spacing:1.5px;color:var(--cs-muted);margin-top:5px}.cases-nhc .cs-header-contact{font-size:12px;color:var(--cs-blue);min-height:44px;display:flex;align-items:center}.cs-menu summary{display:flex;align-items:center;gap:7px;min-height:44px;cursor:pointer;list-style:none;font-size:12px}.cs-menu summary::-webkit-details-marker{display:none}.cs-menu svg{width:20px;height:20px;stroke:currentColor;stroke-width:1.5;fill:none}.cases-nhc .cs-menu nav{position:absolute;top:67px;left:0;width:100%;display:grid;grid-template-columns:1fr 1fr;gap:0 28px;padding:14px 22px 22px;background:#fff;box-shadow:0 18px 30px #0f172a0d;border-bottom:1px solid var(--cs-line)}.cs-menu nav a{display:flex;align-items:center;min-height:52px;border-bottom:1px solid var(--cs-line);font-size:15px;color:var(--cs-copy)}.cases-nhc .cs-menu nav a[aria-current]{color:var(--cs-blue)} +@media(max-width:1023px){.cs-hero-grid{gap:35px}.cases-nhc h1{font-size:40px}.cs-card-body{padding:19px 20px 0}.cs-card>figure img{height:200px}.cs-meta{font-size:10px}.cases-nhc h3{font-size:21px}.cs-intro{min-height:80px}.cs-review>.cs-wrap{grid-template-columns:1fr;gap:24px}.cs-review h2{max-width:none}.cs-filter-line{align-items:flex-start}} +@media(max-width:767px){.cs-wrap{padding:0 22px}.cs-hero{padding:84px 0 15px}.cs-crumb{margin-bottom:19px}.cs-kicker{font-size:11px;letter-spacing:1px}.cs-hero-grid{grid-template-columns:1fr;gap:18px}.cases-nhc h1{font-size:36px;margin-top:10px}.cs-hero-grid>div:last-child>p{font-size:16px;line-height:1.85;max-width:none}.cs-hero-grid .cs-link{margin-top:7px;font-size:14px}.cs-disclosure{font-size:12px;line-height:1.9;margin-top:15px!important;padding-top:13px}.cs-filter-line{display:block;padding:9px 0 17px}.cs-filters{gap:8px}.cs-filters button{font-size:12px;padding:9px 13px;min-height:44px}.cs-result{margin-top:12px!important}.cs-grid{grid-template-columns:1fr;gap:20px}.cs-card>figure img{height:175px;object-fit:cover}.cs-card>figure figcaption{padding:13px 17px;font-size:9px}.cs-card-body{padding:18px 19px 0}.cs-meta{font-size:10px}.cs-card h3{font-size:22px;margin:9px 0 10px}.cs-intro{min-height:0;font-size:16px;line-height:1.85}.cs-features{display:block;margin:12px 0!important;font-size:14px}.cs-features li{padding-left:12px;margin:5px 0}.cs-features li:before{top:11px}.cs-dossier summary{min-height:53px;font-size:14px}.cs-dossier dl>div{grid-template-columns:1fr;gap:6px;margin-bottom:16px}.cs-dossier dt{font-size:12px}.cs-dossier dd{font-size:16px;line-height:1.85}.cs-original img{height:100px}.cs-list-section{padding-bottom:28px}.cs-review{padding:28px 0}.cs-review>.cs-wrap{gap:23px}.cs-review h2{font-size:26px}.cs-review ol{grid-template-columns:1fr;gap:20px}.cs-review li{position:relative;padding-left:30px}.cs-review li>span{position:absolute;left:0;top:0}.cs-review h3{font-size:17px;margin:0 0 8px}.cs-review p:not(.cs-kicker){font-size:15px;line-height:1.85}.cs-contact{padding:28px 0}.cs-contact>.cs-wrap{display:block}.cs-contact h2{font-size:27px}.cs-contact p:not(.cs-kicker){font-size:16px}.cs-contact>.cs-wrap>div:last-child{margin-top:20px}.cs-contact .cs-link{font-size:13px}} +@media(max-width:374px){.cs-wrap{padding:0 18px}.cases-nhc h1{font-size:33px}.cs-meta{flex-wrap:wrap;gap:5px 15px}.cs-filters button{padding:9px 11px}} +@media(prefers-reduced-motion:reduce){html:has(.cases-nhc){scroll-behavior:auto}.cases-nhc *{animation:none!important;transition:none!important;scroll-behavior:auto!important}} diff --git a/public/assets/addons/official/css/home-nhc.css b/public/assets/addons/official/css/home-nhc.css new file mode 100644 index 0000000..8cd8346 --- /dev/null +++ b/public/assets/addons/official/css/home-nhc.css @@ -0,0 +1,43 @@ +/* 官网首页:独立样式作用域,复用现有公共导航与联系流程。 */ +.home-nhc{--hn-blue:#2563eb;--hn-ink:#0f172a;--hn-copy:#475569;--hn-muted:#64748b;--hn-line:#dce4ed;--hn-soft:#f8fafc;background:#fff;color:var(--hn-ink);font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.8;overflow-wrap:break-word;-webkit-font-smoothing:antialiased}.home-nhc *{box-sizing:border-box}.home-nhc :where(h1,h2,h3,p,figure,ol,ul,blockquote){margin:0}.home-nhc h1,.home-nhc h2{font-family:var(--font-serif,"SimSun",serif);font-weight:600;line-height:1.45;color:var(--hn-ink)}.home-nhc h3{color:var(--hn-ink);font-size:21px;font-weight:600;line-height:1.5}.home-nhc a{text-decoration:none;color:inherit;transition:color .2s,background .2s}.home-nhc a:focus-visible{outline:3px solid var(--hn-blue);outline-offset:5px}.home-nhc [id]{scroll-margin-top:100px}.hn-wrap{max-width:1280px;width:100%;padding:0 32px;margin:0 auto}.hn-skip{position:fixed;top:-100px;left:20px;padding:12px 20px;background:#fff;z-index:1100}.hn-skip:focus{top:85px}.hn-kicker{font-size:12px;letter-spacing:1.6px;font-weight:500;color:var(--hn-blue);line-height:1.7}.hn-small{display:block;font-size:12px;color:var(--hn-muted);letter-spacing:.5px} +.hn-hero{padding-top:145px}.hn-hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center}.home-nhc h1{font-size:clamp(40px,4.2vw,62px);letter-spacing:1.5px;margin:23px 0}.home-nhc h1 span{color:var(--hn-blue)}.hn-hero-desc{max-width:470px;font-size:16px;color:var(--hn-copy);line-height:1.95}.hn-actions{display:flex;align-items:center;gap:28px;flex-wrap:wrap;margin-top:30px}.home-nhc .hn-btn{display:inline-flex;justify-content:center;align-items:center;gap:32px;padding:12px 24px;min-height:50px;background:var(--hn-blue);color:#fff;border-radius:4px;font-size:14px;cursor:pointer}.hn-btn span{font-size:20px;line-height:1}.home-nhc .hn-btn:hover{background:#1d4ed8}.home-nhc .hn-link{display:inline-flex;align-items:center;gap:16px;min-height:44px;font-size:13px;color:var(--hn-copy)}.home-nhc .hn-link:hover{color:var(--hn-blue)}.hn-location{font-size:12px;letter-spacing:.5px;color:var(--hn-muted);margin-top:30px!important}.hn-hero-art{position:relative;overflow:hidden;border-radius:4px;background:#f3f5f7}.hn-hero-art picture{display:block}.hn-hero-art img{display:block;width:100%;height:auto;aspect-ratio:1.05;object-fit:cover;object-position:54% 50%}.hn-hero-art figcaption{position:absolute;left:0;bottom:0;display:flex;justify-content:space-between;width:100%;padding:20px 24px;background:linear-gradient(transparent,#f8fafcf0);color:var(--hn-copy);font-size:10px;letter-spacing:1.8px}.hn-hero-foot{display:flex;align-items:center;justify-content:space-between;gap:25px;margin-top:45px;padding-top:22px;padding-bottom:23px;border-bottom:1px solid var(--hn-line)}.hn-hero-foot p{font-size:12px;color:var(--hn-muted)}.hn-hero-foot a{display:inline-flex;gap:28px;align-items:center;font-size:12px;min-height:44px;color:var(--hn-copy)} +.hn-section{padding:94px 0}.hn-soft{background:var(--hn-soft)}.hn-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:60px;margin-bottom:40px}.home-nhc h2{font-size:34px;letter-spacing:.3px}.hn-heading h2{margin-top:13px}.hn-heading>div:last-child:not(:first-child){max-width:360px}.hn-heading p:not(.hn-kicker){font-size:14px;color:var(--hn-copy);line-height:1.9}.hn-heading>div .hn-link{margin-top:8px}.hn-services{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.hn-services article{border-top:1px solid var(--hn-line);padding-top:24px}.hn-service-title{display:flex;align-items:center;gap:17px}.hn-service-title>span{font-size:12px;color:var(--hn-blue)}.hn-services article>p{color:var(--hn-copy);font-size:14px;line-height:1.95;margin-top:18px;min-height:82px}.hn-services figure{background:var(--hn-soft);border-radius:4px;margin-top:22px;padding:15px 12px;overflow:hidden}.hn-services img{display:block;width:100%;height:155px;object-fit:contain}.hn-service-bottom{display:flex;flex-direction:column;align-items:flex-start;padding-top:17px;gap:6px}.hn-service-bottom>span{font-size:11px;color:var(--hn-muted)} +.hn-product-grid{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--hn-line);border-radius:4px;overflow:hidden;background:#fff}.hn-product-grid article{display:grid;grid-template-columns:1fr 1fr;gap:24px;padding:30px;border-right:1px solid var(--hn-line);border-bottom:1px solid var(--hn-line);align-items:center}.hn-product-grid article:nth-child(2n){border-right:0}.hn-product-grid article:nth-last-child(-n+2){border-bottom:0}.hn-product-grid h3{font-family:var(--font-serif,"SimSun",serif);font-size:26px;margin:8px 0 10px}.hn-product-grid p{font-size:14px;color:var(--hn-copy);line-height:1.9}.hn-product-grid .hn-link{margin-top:12px}.hn-product-grid figure{background:var(--hn-soft);border:1px solid #edf1f6;border-radius:4px;overflow:hidden;padding:8px}.hn-product-grid img{display:block;width:100%;height:155px;object-fit:contain} +.hn-cases{display:grid;grid-template-columns:1fr 1fr;gap:40px 32px}.hn-case{display:block;min-width:0}.hn-case figure{position:relative;background:#f1f5f9;border:1px solid var(--hn-line);border-radius:4px;overflow:hidden}.hn-case img{display:block;width:100%;height:240px;object-fit:contain;padding:18px;transition:transform .25s}.hn-case:hover img{transform:scale(1.025)}.hn-case figcaption{position:absolute;right:12px;bottom:10px;font-size:10px;padding:2px 7px;background:#fffffff0;color:var(--hn-copy);border-radius:3px}.hn-case>div{padding-top:20px}.hn-case h3{font-size:21px;display:flex;justify-content:space-between;align-items:center;gap:20px;margin:7px 0 10px}.hn-case h3>span{font-size:19px;color:var(--hn-blue);font-family:var(--font-sans,sans-serif);font-weight:400}.hn-case p{font-size:14px;color:var(--hn-copy);line-height:1.9}.hn-case:hover h3{color:var(--hn-blue)} +.hn-process{display:grid;grid-template-columns:repeat(4,1fr);list-style:none;padding:0;gap:32px}.hn-process li{border-top:1px solid #c7d5e7;padding-top:20px}.hn-process li>span{font-size:16px;font-family:Georgia,serif;color:var(--hn-blue)}.hn-process h3{font-size:19px;margin:22px 0 12px}.hn-process p{font-size:14px;color:var(--hn-copy);line-height:1.9}.hn-process small{display:block;font-size:12px;color:var(--hn-muted);margin-top:20px}.hn-delivery-note{display:flex;align-items:center;gap:35px;border-top:1px solid var(--hn-line);margin-top:35px;padding-top:24px}.hn-delivery-note strong{font-size:14px;font-weight:500;flex-shrink:0}.hn-delivery-note p{font-size:13px;color:var(--hn-copy);line-height:1.9} +.hn-about-grid{display:grid;grid-template-columns:1fr 1fr;align-items:center;gap:9%}.hn-about-grid figure{border-radius:4px;background:var(--hn-soft);overflow:hidden}.hn-about-grid picture{display:block}.hn-about-grid img{display:block;width:100%;height:auto;aspect-ratio:1.3;object-fit:contain}.hn-about-grid h2{font-size:37px;margin:16px 0 22px}.hn-about-grid p:not(.hn-kicker){font-size:15px;color:var(--hn-copy);line-height:1.95}.hn-about-grid .hn-link{margin-top:20px}.hn-feedback{display:grid;grid-template-columns:1fr 3fr;gap:55px;margin-top:65px;padding-top:35px;border-top:1px solid var(--hn-line)}.hn-feedback h2{font-size:28px;margin-top:12px}.hn-quotes{display:grid;grid-template-columns:1fr 1fr;gap:38px}.hn-quotes blockquote{margin:0;border:0;padding:0}.hn-quotes blockquote>p{font-size:14px;color:var(--hn-copy);line-height:1.95}.hn-quotes footer{font-size:12px;font-weight:500;color:var(--hn-ink);margin-top:21px;background:transparent;padding:0}.hn-quotes footer>span{display:block;font-weight:400;color:var(--hn-muted);font-size:11px;margin-top:3px} +.hn-news{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.hn-news article{min-width:0}.hn-news article>a{display:block}.hn-news figure{background:#eef3f8;border:1px solid var(--hn-line);border-radius:4px;overflow:hidden}.hn-news img{display:block;width:100%;height:180px;object-fit:cover}.hn-news time{display:block;font-size:11px;letter-spacing:.8px;color:var(--hn-muted);margin:18px 0 10px}.hn-news h3{font-size:18px;line-height:1.7;font-weight:500}.hn-news a:hover h3{color:var(--hn-blue)}.hn-read{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--hn-copy);margin-top:20px;padding-top:15px;border-top:1px solid var(--hn-line)}.hn-read span{color:var(--hn-blue);font-size:17px}.hn-empty{grid-column:1/-1;color:var(--hn-copy);font-size:15px} +.hn-contact{background:#eef3fb;border-top:1px solid #dce5f2;padding:58px 0}.hn-contact>.hn-wrap{display:flex;align-items:center;justify-content:space-between;gap:60px}.hn-contact h2{font-size:30px;max-width:700px;margin:14px 0 18px}.hn-contact p:not(.hn-kicker){font-size:14px;line-height:1.9;color:var(--hn-copy)}.hn-contact-actions{display:flex;flex-direction:column;align-items:flex-start;gap:12px;flex-shrink:0}.hn-contact-actions>.hn-link{flex-direction:column;align-items:flex-start;gap:0;font-size:12px;padding-top:7px}.hn-contact-actions>.hn-link>span{font-size:16px;letter-spacing:.7px;color:var(--hn-ink)} +@media(max-width:1023px){.hn-hero{padding-top:115px}.hn-hero-grid{gap:32px}.home-nhc h1{font-size:43px;letter-spacing:.5px}.hn-hero-art img{aspect-ratio:.9}.hn-heading{gap:35px}.home-nhc h2{font-size:29px}.hn-heading>div:last-child:not(:first-child){max-width:290px}.hn-services{gap:24px}.hn-services h3{font-size:18px}.hn-services article>p{min-height:110px}.hn-services img{height:125px}.hn-product-grid article{grid-template-columns:1fr;padding:26px;gap:16px}.hn-product-grid img{height:140px}.hn-case img{height:200px}.hn-process{grid-template-columns:repeat(2,1fr);gap:35px}.hn-about-grid{gap:35px}.hn-about-grid h2{font-size:30px}.hn-feedback{grid-template-columns:1fr;gap:26px}.hn-news{gap:24px}.hn-news img{height:140px}.hn-contact>.hn-wrap{gap:30px}.hn-contact h2{font-size:28px}} +@media(max-width:767px){.hn-wrap{padding:0 22px}.hn-hero{padding-top:96px}.hn-hero-grid{grid-template-columns:1fr;gap:30px}.hn-kicker{font-size:11px;letter-spacing:1px}.home-nhc h1{font-size:39px;letter-spacing:.5px;margin:18px 0 21px}.hn-hero-desc{font-size:16px;line-height:1.9;max-width:none}.hn-actions{gap:26px;margin-top:25px}.home-nhc .hn-btn{font-size:14px;min-height:50px;padding:12px 22px;gap:25px}.hn-location{margin-top:22px!important}.hn-hero-art img{aspect-ratio:1.2;object-position:50% 50%}.hn-hero-art figcaption{font-size:9px;letter-spacing:1px;padding:17px 19px}.hn-hero-foot{display:block;margin-top:25px;padding-top:15px;padding-bottom:17px}.hn-hero-foot p{font-size:12px}.hn-hero-foot a{margin-top:4px;min-height:44px}.hn-section{padding:58px 0}.hn-heading{display:block;margin-bottom:29px}.home-nhc h2{font-size:28px;letter-spacing:0}.hn-heading>div:last-child:not(:first-child){max-width:none}.hn-heading p:not(.hn-kicker){font-size:16px;margin-top:17px}.hn-heading>.hn-link{margin-top:15px}.hn-services{grid-template-columns:1fr;gap:30px}.hn-services article{padding-top:22px}.hn-service-title{gap:16px}.hn-services h3{font-size:22px}.hn-services article>p{font-size:16px;min-height:0;line-height:1.9;margin-top:14px}.hn-services figure{margin-top:18px;padding:16px}.hn-services img{height:170px}.hn-service-bottom{flex-direction:row;align-items:center;justify-content:space-between;gap:14px;padding-top:9px}.hn-service-bottom>span{font-size:11px;max-width:185px}.home-nhc .hn-link{font-size:14px}.hn-service-bottom .hn-link{font-size:13px;white-space:nowrap;gap:10px}.hn-product-grid{grid-template-columns:1fr}.hn-product-grid article{grid-template-columns:1fr;padding:26px;border-right:0;gap:18px}.hn-product-grid article:nth-last-child(2){border-bottom:1px solid var(--hn-line)}.hn-product-grid h3{font-size:28px;margin:8px 0 12px}.hn-product-grid p{font-size:16px}.hn-product-grid img{height:160px}.hn-product-grid .hn-link{margin-top:9px}.hn-cases{grid-template-columns:1fr;gap:30px}.hn-case img{height:195px;padding:12px}.hn-case>div{padding-top:16px}.hn-case h3{font-size:20px;gap:15px;margin-top:7px}.hn-case p{font-size:16px;line-height:1.85}.hn-process{gap:30px 23px}.hn-process h3{font-size:18px;margin-top:17px}.hn-process p{font-size:16px;line-height:1.8}.hn-process small{font-size:12px;margin-top:16px}.hn-delivery-note{display:block;margin-top:30px;padding-top:23px}.hn-delivery-note strong{font-size:16px}.hn-delivery-note p{font-size:15px;margin-top:12px}.hn-about-grid{grid-template-columns:1fr;gap:28px}.hn-about-grid>div{grid-row:1}.hn-about-grid h2{font-size:30px;margin:15px 0 18px}.hn-about-grid p:not(.hn-kicker){font-size:16px}.hn-about-grid .hn-link{margin-top:16px}.hn-about-grid img{aspect-ratio:1.6}.hn-feedback{margin-top:35px;padding-top:28px;gap:25px}.hn-feedback h2{font-size:28px}.hn-quotes{grid-template-columns:1fr;gap:28px}.hn-quotes blockquote{padding-left:18px;border-left:2px solid #cbdaf3}.hn-quotes blockquote>p{font-size:16px}.hn-quotes footer{font-size:13px;margin-top:15px}.hn-quotes footer>span{font-size:12px}.hn-news{grid-template-columns:1fr;gap:30px}.hn-news img{height:auto;aspect-ratio:1.8}.hn-news time{font-size:12px;margin-top:14px}.hn-news h3{font-size:18px}.hn-read{font-size:13px;margin-top:15px;padding-top:12px;min-height:44px}.hn-contact{padding:44px 0}.hn-contact>.hn-wrap{display:block}.hn-contact h2{font-size:28px}.hn-contact p:not(.hn-kicker){font-size:16px}.hn-contact-actions{margin-top:25px;gap:14px}.hn-contact-actions>.hn-link{font-size:13px}.hn-contact-actions>.hn-link>span{font-size:17px}} +@media(max-width:374px){.hn-wrap{padding:0 18px}.home-nhc h1{font-size:34px}.hn-actions{gap:18px}.hn-process{grid-template-columns:1fr}.hn-service-bottom{flex-direction:column;align-items:flex-start}.hn-service-bottom>span{max-width:none}} +.hn-mobile-header{position:fixed;z-index:1000;top:0;left:0;width:100%;height:68px;display:flex;align-items:center;gap:24px;padding:0 22px;background:#fffffff5;border-bottom:1px solid var(--hn-line)}.home-nhc .hn-mobile-brand{font-family:var(--font-serif,"SimSun",serif);font-weight:600;font-size:23px;line-height:1.2;letter-spacing:2px;margin-right:auto;min-height:44px;display:flex;flex-direction:column;justify-content:center}.hn-mobile-brand>span{font-family:var(--font-sans,sans-serif);font-size:8px;font-weight:500;color:var(--hn-muted);letter-spacing:1.5px;margin-top:5px}.home-nhc .hn-mobile-contact{font-size:12px;color:var(--hn-blue);min-height:44px;display:flex;align-items:center}.hn-mobile-menu{position:static}.hn-mobile-menu summary{display:flex;align-items:center;gap:7px;min-height:44px;cursor:pointer;list-style:none;font-size:12px}.hn-mobile-menu summary::-webkit-details-marker{display:none}.hn-mobile-menu summary:focus-visible{outline:3px solid var(--hn-blue);outline-offset:4px}.hn-mobile-menu svg{width:20px;height:20px;stroke:currentColor;stroke-width:1.5;fill:none;stroke-linecap:round}.home-nhc .hn-mobile-menu nav{position:absolute;top:67px;left:0;width:100%;height:auto;line-height:normal;display:grid;grid-template-columns:1fr 1fr;gap:0 28px;padding:14px 22px 22px;background:#fff;box-shadow:0 18px 30px #0f172a0d;border-bottom:1px solid var(--hn-line)}.hn-mobile-menu nav a{display:flex;align-items:center;min-height:52px;border-bottom:1px solid var(--hn-line);font-size:15px;color:var(--hn-copy)}.home-nhc .hn-mobile-menu nav a[aria-current]{color:var(--hn-blue)} +.hn-page-index{border-bottom:1px solid var(--hn-line);background:#fff}.home-nhc nav.hn-page-index{height:auto;line-height:inherit;box-shadow:none;color:var(--hn-copy)}.hn-page-index>.hn-wrap{display:flex;align-items:center;gap:44px;flex-wrap:wrap;padding-top:8px;padding-bottom:8px}.hn-page-index a{display:flex;align-items:center;min-height:44px;font-size:13px;color:var(--hn-copy)}.hn-page-index a:hover{color:var(--hn-blue)} +.hn-service-work,.hn-product-work{list-style:none;padding:0}.hn-service-work{margin:16px 0 0!important;font-size:13px;color:var(--hn-copy)}.hn-service-work li{padding:4px 0 4px 14px;position:relative}.hn-service-work li:before{content:"";position:absolute;left:0;top:14px;width:4px;height:4px;background:var(--hn-blue)}.hn-product-work{margin:13px 0 0!important;font-size:12px;color:var(--hn-copy)}.hn-product-work li{border-left:2px solid #c2d3f1;padding-left:10px;margin:7px 0;line-height:1.8} +.hn-selection{border-top:1px solid var(--hn-line);margin-top:35px;padding-top:27px}.hn-selection>div:first-child{display:flex;align-items:center;gap:22px}.hn-selection h3{font-size:19px;font-weight:500}.hn-selection-options{display:grid;grid-template-columns:repeat(3,1fr);gap:36px;margin-top:23px}.home-nhc .hn-selection h4{font-family:var(--font-sans,sans-serif);font-size:15px;font-weight:500;line-height:1.6;color:var(--hn-ink);margin:0 0 10px}.hn-selection-options p{font-size:13px;color:var(--hn-copy);line-height:1.9}.hn-selection-options .hn-link{margin-top:7px;font-size:12px} +.hn-case-scope{border-top:1px solid var(--hn-line);padding-top:14px;margin:17px 0 0}.hn-case-scope>div{display:grid;grid-template-columns:56px 1fr;gap:15px;margin:8px 0}.hn-case-scope dt{font-size:11px;font-weight:400;letter-spacing:.3px;color:var(--hn-muted)}.hn-case-scope dd{font-size:12px;line-height:1.9;color:var(--hn-copy);margin:0} +.home-nhc #delivery{border-bottom:1px solid var(--hn-line)}.hn-handover-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:35px}.hn-handover-grid article{border-top:1px solid #c7d5e7;padding-top:23px}.hn-handover-grid article>span{font-size:12px;color:var(--hn-blue);letter-spacing:1px}.hn-handover-grid h3{font-size:20px;margin:15px 0 12px}.hn-handover-grid p{font-size:14px;color:var(--hn-copy);line-height:1.9}.hn-handover-grid ul{list-style:none;padding:17px 0 0;font-size:13px;color:var(--hn-copy)}.hn-handover-grid li{padding:5px 0 5px 14px;position:relative}.hn-handover-grid li:before{content:"";position:absolute;left:0;top:15px;width:4px;height:4px;background:var(--hn-blue)}.hn-run-note{display:flex;align-items:center;gap:30px;border-top:1px solid var(--hn-line);padding-top:24px;margin-top:32px}.hn-run-note strong{font-size:14px;font-weight:500;flex-shrink:0}.hn-run-note p{font-size:13px;color:var(--hn-copy);line-height:1.9;max-width:630px}.hn-run-note .hn-link{margin-left:auto;font-size:12px;white-space:nowrap} +.hn-faq-grid{display:grid;grid-template-columns:4fr 7fr;gap:8%}.hn-faq-grid h2{margin-top:14px}.hn-faq-intro{font-size:14px;color:var(--hn-copy);max-width:280px;margin-top:20px!important}.hn-faq-list{border-top:1px solid var(--hn-line)}.hn-faq-list details{border-bottom:1px solid var(--hn-line)}.hn-faq-list summary{display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:76px;padding:20px 0;font-size:16px;font-weight:500;list-style:none;cursor:pointer}.hn-faq-list summary::-webkit-details-marker{display:none}.hn-faq-list summary:focus-visible{outline:3px solid var(--hn-blue);outline-offset:4px}.hn-faq-list summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.hn-faq-list summary>span:before,.hn-faq-list summary>span:after{content:"";position:absolute;left:2px;top:8px;width:12px;height:1px;background:var(--hn-blue)}.hn-faq-list summary>span:after{transform:rotate(90deg);transition:transform .2s}.hn-faq-list details[open] summary>span:after{transform:rotate(0)}.hn-faq-list details p{font-size:14px;color:var(--hn-copy);line-height:1.95;padding:0 25px 25px 0}.hn-project-prep{list-style:none;padding:0;display:flex;gap:10px 22px;flex-wrap:wrap;margin:18px 0 0!important;color:var(--hn-copy);font-size:12px}.hn-project-prep li{padding-left:12px;border-left:2px solid #b6cbee} +@media(max-width:1023px){.hn-selection-options{gap:25px}.hn-handover-grid{gap:25px}.hn-handover-grid h3{font-size:18px}.hn-run-note{flex-wrap:wrap;gap:12px 25px}.hn-run-note p{flex:1;min-width:300px}.hn-run-note .hn-link{margin-left:0}.hn-faq-grid{gap:35px}} +@media(max-width:767px){.hn-page-index>.hn-wrap{gap:0 24px;padding-top:7px;padding-bottom:7px}.hn-page-index a{font-size:12px;min-height:44px}.hn-service-work{font-size:15px;margin-top:14px!important}.hn-service-work li{padding:5px 0 5px 15px}.hn-service-work li:before{top:17px}.hn-product-work{font-size:14px;margin-top:14px!important}.hn-product-work li{margin:9px 0}.hn-selection{margin-top:29px;padding-top:23px}.hn-selection>div:first-child{display:block}.hn-selection h3{font-size:21px;margin-top:10px}.hn-selection-options{grid-template-columns:1fr;gap:24px;margin-top:24px}.home-nhc .hn-selection h4{font-size:17px}.hn-selection-options p{font-size:16px;line-height:1.85}.hn-selection-options .hn-link{font-size:14px}.hn-case-scope{margin-top:15px;padding-top:11px}.hn-case-scope>div{grid-template-columns:56px 1fr;gap:13px;margin:9px 0}.hn-case-scope dt{font-size:12px}.hn-case-scope dd{font-size:14px;line-height:1.85}.hn-handover-grid{grid-template-columns:1fr;gap:27px}.hn-handover-grid article{padding-top:22px}.hn-handover-grid h3{font-size:21px;margin-top:12px}.hn-handover-grid p{font-size:16px;line-height:1.85}.hn-handover-grid ul{font-size:14px;padding-top:13px}.hn-handover-grid li:before{top:16px}.hn-run-note{display:block;padding-top:22px;margin-top:28px}.hn-run-note strong{font-size:16px}.hn-run-note p{font-size:15px;min-width:0;margin-top:11px}.hn-run-note .hn-link{font-size:14px;margin-top:7px}.hn-faq-grid{grid-template-columns:1fr;gap:28px}.hn-faq-grid h2 br{display:none}.hn-faq-intro{font-size:16px;max-width:none;margin-top:16px!important}.hn-faq-list summary{font-size:16px;min-height:75px}.hn-faq-list details p{font-size:16px;line-height:1.9;padding-right:15px}.hn-project-prep{flex-direction:column;align-items:flex-start;gap:12px;font-size:14px;margin-top:21px!important}} +/* 紧凑排版:保留内容和字号,收紧段落分组与图片占高。 */ +.hn-hero{padding-top:112px}.hn-hero-grid{gap:44px}.hn-hero-art img{aspect-ratio:1.35}.home-nhc h1{margin:16px 0 18px;font-size:clamp(40px,3.9vw,56px)}.hn-actions{margin-top:22px}.hn-location{margin-top:18px!important}.hn-hero-foot{margin-top:22px;padding-top:10px;padding-bottom:10px}.hn-page-index>.hn-wrap{padding-top:3px;padding-bottom:3px} +.hn-section{padding:56px 0}.hn-heading{margin-bottom:26px;gap:40px}.hn-heading h2{margin-top:9px}.hn-services{gap:24px}.hn-services article{padding-top:18px}.hn-services article>p{margin-top:12px;min-height:0}.hn-service-work{margin-top:10px!important}.hn-service-work li{padding-top:2px;padding-bottom:2px}.hn-service-work li:before{top:12px}.hn-services figure{margin-top:14px;padding:8px}.hn-services img{height:112px}.hn-service-bottom{padding-top:9px;gap:0} +.hn-product-grid article{padding:22px;gap:20px;grid-template-columns:1.15fr 1fr}.hn-product-grid h3{margin:5px 0 7px}.hn-product-grid img{height:128px}.hn-product-work{margin-top:9px!important}.hn-product-work li{margin:4px 0}.hn-product-grid .hn-link{margin-top:5px}.hn-selection{margin-top:24px;padding-top:20px}.hn-selection-options{margin-top:16px;gap:28px}.hn-selection-options .hn-link{margin-top:2px} +.hn-cases{gap:26px}.hn-case img{height:165px;padding:10px}.hn-case>div{padding-top:13px}.hn-case h3{margin:5px 0 8px}.hn-case-scope{margin-top:12px;padding-top:9px}.hn-case-scope>div{margin:5px 0}.hn-process{gap:25px}.hn-process li{padding-top:15px}.hn-process h3{margin:14px 0 9px}.hn-process small{margin-top:12px}.hn-delivery-note{margin-top:22px;padding-top:17px;gap:25px} +.hn-handover-grid{gap:26px}.hn-handover-grid article{padding-top:17px}.hn-handover-grid h3{margin:10px 0 9px}.hn-handover-grid ul{padding-top:11px}.hn-handover-grid li{padding-top:3px;padding-bottom:3px}.hn-handover-grid li:before{top:13px}.hn-run-note{margin-top:23px;padding-top:17px;gap:23px}.hn-about-grid{gap:6%}.hn-about-grid img{aspect-ratio:1.75}.hn-about-grid h2{font-size:32px;margin:11px 0 15px}.hn-about-grid .hn-link{margin-top:12px}.hn-feedback{margin-top:35px;padding-top:25px;gap:35px}.hn-quotes{gap:28px}.hn-quotes footer{margin-top:13px} +.hn-news{gap:25px}.hn-news img{height:140px}.hn-news time{margin:12px 0 7px}.hn-read{margin-top:12px;padding-top:9px}.hn-faq-list summary{min-height:62px;padding:14px 0}.hn-faq-list details p{padding-bottom:19px}.hn-faq-intro{margin-top:15px!important}.hn-contact{padding:38px 0}.hn-contact h2{margin:10px 0 12px}.hn-project-prep{margin-top:13px!important} +@media(max-width:1023px){.hn-hero{padding-top:104px}.hn-hero-grid{gap:30px}.home-nhc h1{font-size:42px}.hn-hero-art img{aspect-ratio:1.05}.hn-product-grid article{grid-template-columns:1fr;gap:12px}.hn-product-grid img{height:108px}.hn-about-grid h2{font-size:29px}.hn-news img{height:125px}} +@media(max-width:767px){.hn-hero{padding-top:88px}.hn-hero-grid{gap:22px}.home-nhc h1{font-size:39px;margin:13px 0 17px}.hn-actions{margin-top:19px}.hn-location{margin-top:14px!important}.hn-hero-art img{aspect-ratio:1.65}.hn-hero-foot{margin-top:15px;padding-top:9px;padding-bottom:9px;display:flex;gap:15px}.hn-hero-foot p{flex:1}.hn-hero-foot a{margin-top:0;gap:9px;white-space:nowrap}.hn-page-index>.hn-wrap{gap:0 22px;padding-top:3px;padding-bottom:3px}.hn-section{padding:38px 0}.hn-heading{margin-bottom:22px}.hn-heading p:not(.hn-kicker){margin-top:12px}.hn-services{gap:24px}.hn-services article{padding-top:17px}.hn-services article>p{margin-top:10px}.hn-service-work{margin-top:9px!important}.hn-service-work li{padding-top:2px;padding-bottom:2px}.hn-service-work li:before{top:14px}.hn-services figure{margin-top:12px;padding:8px}.hn-services img{height:115px}.hn-service-bottom{padding-top:5px;gap:9px}.hn-product-grid article{padding:22px;gap:13px}.hn-product-grid h3{margin:5px 0 9px}.hn-product-work{margin-top:9px!important}.hn-product-work li{margin:5px 0}.hn-product-grid img{height:108px}.hn-selection{margin-top:23px;padding-top:20px}.hn-selection-options{gap:18px;margin-top:18px}.hn-selection-options .hn-link{margin-top:2px}.hn-case img{height:145px;padding:8px}.hn-cases{gap:24px}.hn-case>div{padding-top:11px}.hn-case-scope{margin-top:11px;padding-top:8px}.hn-case-scope>div{margin:6px 0}.hn-process{gap:24px 20px}.hn-process li{padding-top:14px}.hn-process h3{margin:12px 0 9px}.hn-process small{margin-top:10px}.hn-delivery-note{margin-top:21px;padding-top:17px}.hn-delivery-note p{margin-top:8px}.hn-handover-grid{gap:22px}.hn-handover-grid article{padding-top:17px}.hn-handover-grid h3{margin-top:9px}.hn-handover-grid ul{padding-top:9px}.hn-run-note{margin-top:21px;padding-top:17px}.hn-run-note p{margin-top:8px}.hn-about-grid{gap:20px}.hn-about-grid img{aspect-ratio:1.8}.hn-about-grid h2{font-size:30px;margin:10px 0 14px}.hn-feedback{margin-top:25px;padding-top:21px;gap:20px}.hn-quotes{gap:22px}.hn-quotes footer{margin-top:10px}.hn-news{gap:23px}.hn-news img{height:140px;aspect-ratio:auto}.hn-news time{margin:10px 0 7px}.hn-read{margin-top:10px;padding-top:7px}.hn-faq-grid{gap:20px}.hn-faq-list summary{min-height:66px;padding:14px 0}.hn-faq-list details p{padding-bottom:18px}.hn-faq-intro{margin-top:12px!important}.hn-contact{padding:32px 0}.hn-contact-actions{margin-top:19px;gap:10px}.hn-project-prep{margin-top:15px!important;gap:9px}} +@media(max-width:374px){.home-nhc h1{font-size:34px}.hn-hero-foot{display:block}.hn-hero-foot a{margin-top:4px}} +@media(prefers-reduced-motion:reduce){html:has(.home-nhc){scroll-behavior:auto}.home-nhc *{transition:none!important;animation:none!important;scroll-behavior:auto!important}} + +/* 第二轮密度优化:案例使用横向图文,移动端产品与资讯采用小图布局。 */ +.hn-hero{padding-top:100px}.hn-hero-grid{grid-template-columns:1.1fr 1fr;gap:36px}.hn-hero-art img{aspect-ratio:1.65}.home-nhc h1{font-size:clamp(38px,3.6vw,52px);line-height:1.3;margin:12px 0 15px}.hn-hero-desc{line-height:1.85}.hn-actions{margin-top:17px}.hn-location{margin-top:12px!important}.hn-hero-foot{margin-top:14px;padding-top:4px;padding-bottom:4px}.hn-section{padding:40px 0}.hn-heading{margin-bottom:20px;gap:30px}.hn-heading h2{margin-top:6px}.home-nhc h2{font-size:30px}.hn-services{gap:22px}.hn-services article{padding-top:14px}.hn-services article>p{line-height:1.8;margin-top:9px}.hn-services figure{margin-top:10px;padding:5px}.hn-services img{height:86px}.hn-service-bottom{padding-top:4px}.hn-service-work{margin-top:7px!important}.hn-product-grid article{padding:18px;gap:16px;grid-template-columns:1.5fr 1fr}.hn-product-grid img{height:105px}.hn-product-grid p{line-height:1.8}.hn-product-grid h3{font-size:24px;margin:3px 0 6px}.hn-product-work li{margin:3px 0}.hn-selection{margin-top:18px;padding-top:16px}.hn-selection-options{margin-top:12px;gap:24px}.hn-selection h3{font-size:18px} +.hn-cases{gap:22px 26px}.hn-case{display:grid;grid-template-columns:124px minmax(0,1fr);gap:18px;align-items:start;padding-top:17px;border-top:1px solid var(--hn-line)}.hn-case figure{margin-top:3px}.hn-case img{height:132px;padding:5px}.hn-case figcaption{font-size:9px;right:5px;bottom:5px;padding:1px 4px}.hn-case>div{padding-top:0}.hn-case h3{font-size:19px;margin:5px 0 7px;gap:10px}.hn-case p{line-height:1.8}.hn-case-scope{margin-top:9px;padding-top:6px}.hn-case-scope>div{margin:4px 0;gap:10px} +.hn-process{gap:22px}.hn-process li{padding-top:12px}.hn-process h3{margin:10px 0 7px}.hn-process p{line-height:1.8}.hn-process small{margin-top:9px}.hn-delivery-note{margin-top:17px;padding-top:13px}.hn-handover-grid article{padding-top:13px}.hn-handover-grid h3{font-size:19px;margin:8px 0}.hn-handover-grid p{line-height:1.8}.hn-handover-grid ul{padding-top:7px}.hn-run-note{margin-top:17px;padding-top:13px}.hn-about-grid{grid-template-columns:.8fr 1.2fr;gap:5%}.hn-about-grid img{aspect-ratio:1.9}.hn-about-grid h2{font-size:29px;margin:8px 0 11px}.hn-about-grid p:not(.hn-kicker){line-height:1.85}.hn-about-grid .hn-link{margin-top:7px}.hn-feedback{margin-top:24px;padding-top:18px;gap:25px}.hn-quotes blockquote>p{line-height:1.8}.hn-quotes footer{margin-top:9px}.hn-news img{height:112px}.hn-news time{margin:9px 0 5px}.hn-news h3{font-size:17px;line-height:1.6}.hn-read{margin-top:8px;padding-top:6px;min-height:44px}.hn-faq-list summary{min-height:54px;padding:10px 0}.hn-faq-list details p{line-height:1.85;padding-bottom:14px}.hn-contact{padding:28px 0}.hn-contact h2{font-size:28px;margin:8px 0 10px} +@media(max-width:1023px){.hn-hero{padding-top:98px}.hn-hero-grid{gap:26px;grid-template-columns:1.1fr 1fr}.home-nhc h1{font-size:39px}.hn-hero-art img{aspect-ratio:1.2}.hn-product-grid article{grid-template-columns:1fr}.hn-case{grid-template-columns:94px minmax(0,1fr);gap:13px}.hn-case img{height:113px}.hn-case h3{font-size:18px}.hn-case-scope>div{grid-template-columns:1fr;gap:0}.hn-about-grid h2{font-size:27px}} +@media(max-width:767px){.hn-hero{padding-top:84px}.hn-hero-grid{grid-template-columns:1fr;gap:17px}.home-nhc h1{font-size:36px;margin:10px 0 14px;line-height:1.3}.hn-hero-desc{line-height:1.8}.hn-actions{margin-top:15px}.hn-location{margin-top:10px!important}.hn-hero-art img{aspect-ratio:2.15}.hn-hero-foot{margin-top:11px;padding-top:4px;padding-bottom:4px}.hn-section{padding:28px 0}.home-nhc h2{font-size:26px}.hn-heading{margin-bottom:17px}.hn-heading p:not(.hn-kicker){line-height:1.8;margin-top:10px}.hn-services{gap:20px}.hn-services article{position:relative;padding-top:14px}.hn-service-title{padding-right:70px}.hn-services h3{font-size:20px}.hn-services figure{position:absolute;top:13px;right:0;width:62px;height:43px;margin:0;padding:0;background:transparent}.hn-services img{height:43px;width:62px}.hn-services article>p{line-height:1.8;margin-top:9px}.hn-service-work{margin-top:7px!important}.hn-service-bottom{padding-top:2px}.hn-product-grid article{position:relative;display:block;padding:18px}.hn-product-grid article>div>.hn-small{padding-right:80px}.hn-product-grid h3{padding-right:80px;font-size:25px;min-height:38px;margin:5px 0 9px}.hn-product-grid figure{position:absolute;right:17px;top:17px;width:76px;padding:3px}.hn-product-grid img{height:63px}.hn-product-grid p{line-height:1.8}.hn-product-work{margin-top:8px!important}.hn-product-work li{margin:4px 0}.hn-product-grid .hn-link{margin-top:2px}.hn-selection{margin-top:17px;padding-top:14px}.hn-selection h3{font-size:20px;margin-top:6px}.hn-selection-options{margin-top:17px;gap:15px}.hn-selection-options p{line-height:1.8}.home-nhc .hn-selection h4{margin-bottom:7px}.hn-cases{gap:20px}.hn-case{grid-template-columns:76px minmax(0,1fr);gap:13px;padding-top:14px}.hn-case img{height:82px;padding:3px}.hn-case figure{margin-top:4px}.hn-case h3{font-size:18px;line-height:1.5}.hn-case .hn-small{font-size:11px}.hn-case p{font-size:16px;line-height:1.8}.hn-case-scope{margin-top:8px;padding-top:5px}.hn-case-scope>div{grid-template-columns:1fr;gap:0;margin:6px 0}.hn-case-scope dt{font-size:11px}.hn-case-scope dd{font-size:14px;line-height:1.8}.hn-process{gap:19px 18px}.hn-process li{padding-top:11px}.hn-process h3{margin:9px 0 7px}.hn-process p{line-height:1.8}.hn-process small{margin-top:8px}.hn-delivery-note{margin-top:17px;padding-top:13px}.hn-handover-grid{gap:18px}.hn-handover-grid article{padding-top:13px}.hn-handover-grid h3{font-size:20px;margin:8px 0}.hn-handover-grid p{line-height:1.8}.hn-run-note{margin-top:17px;padding-top:13px}.hn-about-grid{grid-template-columns:1fr;gap:13px}.hn-about-grid img{aspect-ratio:2.4}.hn-about-grid h2{font-size:27px;margin:8px 0 11px}.hn-about-grid>div{grid-row:1}.hn-about-grid .hn-link{margin-top:5px}.hn-feedback{margin-top:20px;padding-top:16px;gap:17px}.hn-quotes{gap:17px}.hn-quotes blockquote>p{line-height:1.8}.hn-news{gap:18px}.hn-news article>a{position:relative;padding:0 0 12px 91px;min-height:100px;border-bottom:1px solid var(--hn-line)}.hn-news figure{position:absolute;top:0;left:0;width:76px}.hn-news img{width:76px;height:65px;object-fit:cover}.hn-news time{margin:0 0 5px}.hn-news h3{font-size:17px;line-height:1.6}.hn-read{border-top:0;margin-top:4px;padding-top:0;min-height:44px}.hn-faq-grid{gap:17px}.hn-faq-list summary{min-height:58px;padding:11px 0}.hn-faq-list details p{line-height:1.85;padding-bottom:14px}.hn-contact{padding:25px 0}.hn-contact h2{font-size:26px}.hn-contact-actions{margin-top:15px}} +@media(max-width:374px){.home-nhc h1{font-size:33px}.hn-case{grid-template-columns:1fr}.hn-case figure{position:absolute;width:58px;right:0;top:15px}.hn-case{position:relative}.hn-case img{height:50px}.hn-case h3,.hn-case .hn-small{padding-right:66px}.hn-case figcaption{display:none}} + +@media(max-width:767px){.hn-case{position:relative;display:block}.hn-case figure{position:absolute;right:0;top:14px;width:62px;margin:0}.hn-case img{height:58px}.hn-case h3,.hn-case .hn-small{padding-right:77px}.hn-case h3{min-height:44px;align-items:flex-start}.hn-case p{margin-top:9px}.hn-case-scope>div{grid-template-columns:56px 1fr;gap:10px}.hn-case figcaption{display:none}} diff --git a/public/assets/addons/official/css/home-v3.css b/public/assets/addons/official/css/home-v3.css new file mode 100644 index 0000000..5306341 --- /dev/null +++ b/public/assets/addons/official/css/home-v3.css @@ -0,0 +1,13 @@ +/* Homepage — Nahaichuan */ +html{scroll-behavior:smooth}.home-nhc{--blue:#2563eb;--ink:#0f172a;--copy:#475569;--line:#e2e8f0;padding-top:80px;background:#fff;color:var(--ink);font:15px/1.8 "Microsoft YaHei","PingFang SC",sans-serif;overflow:clip}.home-nhc *{box-sizing:border-box}.home-nhc :is(h1,h2,h3,h4,p,figure,ul,ol,blockquote){margin:0;padding:0}.home-nhc :is(h1,h2,h3){font-family:"Songti SC","STSong","SimSun",serif;font-weight:500;color:var(--ink)}.home-nhc a{color:inherit;text-decoration:none;transition:color .2s,background .2s}.home-nhc img{display:block;max-width:100%;height:auto}.home-nhc :is(a,summary):focus-visible{outline:3px solid #2563eb;outline-offset:5px}.home-nhc [id]{scroll-margin-top:100px}.hn-wrap{width:100%;max-width:1360px;padding:0 40px;margin:0 auto}.hn-section{padding:84px 0}.hn-soft{background:#f8fafc}.hn-kicker{font-size:12px;letter-spacing:2px;color:#536b8d;line-height:1.6}.home-nhc h2{font-size:34px;line-height:1.5;letter-spacing:1px}.hn-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:40px;margin-bottom:36px}.hn-heading h2{margin-top:14px}.hn-heading>div:last-child>p,.hn-heading>p{font-size:14px;line-height:1.85;color:var(--copy)}.hn-heading>div:last-child{max-width:380px}.hn-heading .hn-link{margin-top:10px}.hn-link{display:inline-flex;align-items:center;gap:28px;min-height:44px;font-size:13px}.hn-link span{font:19px sans-serif;color:var(--blue)}.home-nhc .hn-link:hover{color:var(--blue)}.hn-btn,.hn-outline{display:inline-flex;align-items:center;justify-content:center;gap:30px;min-height:48px;padding:10px 24px;border:1px solid var(--blue);border-radius:4px;font-size:14px}.home-nhc .hn-btn{background:var(--blue);color:#fff}.home-nhc .hn-btn:hover{background:#1d4ed8}.home-nhc .hn-outline{border-color:#aebed0;background:#ffffff66}.hn-outline:hover{background:#fff}.hn-btn>span,.hn-outline>span{font:20px sans-serif}.hn-actions{display:flex;gap:14px;margin-top:30px}.hn-skip{position:fixed;top:-100px;left:20px;z-index:2000;background:white;padding:15px}.hn-skip:focus{top:10px} +.hn-hero{position:relative;background:#edf4fc;min-height:580px}.hn-hero-picture{position:absolute;inset:0;display:block}.hn-hero-picture img{width:100%;height:100%;object-fit:cover;object-position:center}.hn-hero:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#f3f7fbe8 0%,#f1f7fb9e 30%,transparent 60%);pointer-events:none}.hn-hero-content{position:relative;z-index:1;padding-top:82px;padding-bottom:100px}.home-nhc h1{font-size:52px;line-height:1.48;letter-spacing:3px;margin:22px 0}.hn-hero-desc{font-size:15px;color:#344863;line-height:2}.hn-hero-caption{position:absolute;bottom:0;left:50%;transform:translateX(-50%);z-index:1;display:flex;align-items:center;justify-content:space-between;gap:20px;height:56px;color:#465d78;font-size:11px;letter-spacing:1px}.hn-hero-caption a{display:flex;align-items:center;gap:18px;min-height:44px}.hn-hero-caption>span:last-child{font-size:9px;letter-spacing:2px}.hn-promise{border-bottom:1px solid var(--line);background:white}.hn-promise>.hn-wrap{display:grid;grid-template-columns:repeat(3,1fr);padding-top:25px;padding-bottom:25px}.hn-promise .hn-wrap>div{display:flex;gap:18px;justify-content:center;align-items:center;border-right:1px solid var(--line)}.hn-promise .hn-wrap>div:first-child{justify-content:flex-start}.hn-promise .hn-wrap>div:last-child{border:0;justify-content:flex-end}.hn-promise b{font-size:14px;font-weight:500}.hn-promise span{font-size:11px;color:#64748b} +.hn-services{display:grid;grid-template-columns:repeat(3,1fr);border:1px solid var(--line);border-radius:5px;overflow:hidden}.hn-service{padding:30px;position:relative;background:#fff;transition:background .2s}.hn-service+.hn-service{border-left:1px solid var(--line)}.hn-service:hover{background:#f8fafc}.hn-service-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:26px}.hn-service-top svg{width:37px;height:37px;fill:none;stroke:var(--blue);stroke-width:1.25}.hn-service-top>span{font:12px Georgia,serif;color:#8898ac}.hn-service h3{font-size:24px;margin-bottom:14px}.hn-service>p{color:var(--copy);font-size:14px;min-height:76px;line-height:1.9}.hn-service-tags{font-size:11px;color:#64748b;border-top:1px solid var(--line);margin-top:22px;padding-top:16px}.hn-service .hn-link{margin-top:8px;justify-content:space-between;width:100%}.hn-small{display:block;color:#567198;font-size:11px;letter-spacing:1px} +.hn-product-feature{display:grid;grid-template-columns:34% 66%;min-height:340px;border:1px solid #dde6f2;background:#eef3fa;border-radius:5px;overflow:hidden}.hn-product-intro{padding:36px}.hn-product-intro h3{font-size:31px;line-height:1.6;margin:15px 0}.hn-product-intro>p{font-size:13px;color:var(--copy)}.hn-product-intro .hn-btn{margin-top:24px;min-height:44px;font-size:12px;padding:8px 18px}.hn-product-visual{display:flex;align-items:flex-end;padding:34px 32px 0;background:linear-gradient(125deg,#eaf1fb,#dbe7f6)}.hn-app-window{width:100%;border:1px solid #d0dcee;background:white;border-radius:6px 6px 0 0;box-shadow:0 14px 35px #435b821a;transform:translateY(1px);overflow:hidden}.hn-app-bar{display:flex;gap:10px;align-items:center;height:48px;padding:0 17px;border-bottom:1px solid #e9eef5}.hn-app-mark{background:#2563eb;color:#fff;font-family:SimSun,serif;padding:0 4px;border-radius:3px}.hn-app-bar strong{font-size:11px;font-weight:500}.hn-demo-label{margin-left:auto;font-size:9px;color:#64748b}.hn-app-body{display:flex}.hn-app-body aside{flex:0 0 100px;display:flex;flex-direction:column;padding:18px 12px;border-right:1px solid #e8eef6;gap:11px;font-size:10px;color:#64748b}.hn-app-body aside b{background:#eff4ff;color:#2563eb;padding:4px 8px;font-weight:500}.hn-app-body aside span{padding-left:8px}.hn-app-content{padding:20px;flex:1;min-width:0;background:#fafbfd}.hn-app-content h4{font-size:12px;font-weight:500}.hn-app-content h4 small{font-size:9px;color:#8a97a8;margin-left:14px}.hn-stat-row{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:14px}.hn-stat-row>div{background:#fff;border:1px solid #e8edf5;padding:10px}.hn-stat-row span{display:block;color:#8493a7;font-size:8px}.hn-stat-row b{font-size:12px;display:block;margin-top:4px;font-weight:500}.hn-stat-row i{display:block;width:22px;height:2px;background:#7ca5ef;margin-top:10px}.hn-chart{margin-top:12px;background:white;border:1px solid #e8edf5;padding:12px}.hn-chart>div:first-child{display:flex;justify-content:space-between;font-size:9px;color:#64748b}.hn-chart b{font-weight:500;color:#334155}.hn-chart svg{width:100%;height:90px;margin-top:10px}.hn-chart-bottom{display:flex;justify-content:space-between;font-size:8px;color:#94a3b8}.hn-products{display:grid;grid-template-columns:repeat(4,1fr);margin-top:30px}.hn-products article{padding:0 26px;border-right:1px solid #dce4ee}.hn-products article:first-child{padding-left:0}.hn-products article:last-child{padding-right:0;border:0}.hn-products h3{font-size:23px;margin:8px 0}.hn-products p{font-size:13px;line-height:1.9;color:var(--copy);min-height:54px}.hn-products .hn-link{margin-top:9px;font-size:12px} +.hn-cases{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}.hn-case{display:block}.hn-case figure{position:relative;overflow:hidden;border-radius:4px;background:#f1f5f9}.hn-case img{width:100%;height:206px;object-fit:cover;transition:transform .4s}.hn-case:hover img{transform:scale(1.035)}.hn-case figcaption,.hn-about figcaption{position:absolute;right:12px;bottom:10px;font-size:9px;color:#61728b;padding:2px 8px;background:#ffffffdb}.hn-case-copy{padding:20px 0 0}.hn-case h3{display:flex;justify-content:space-between;align-items:center;font-size:22px;margin:8px 0 10px;gap:10px}.hn-case h3>span{font:20px sans-serif;color:#2563eb}.hn-case-copy>p{font-size:13px;color:var(--copy);line-height:1.9}.hn-process-section{background:#f8fafc;border-block:1px solid #e8edf4}.hn-process{display:grid;grid-template-columns:repeat(4,1fr);gap:32px;list-style:none}.hn-process li{border-top:1px solid #becde0;padding-top:22px}.hn-process li>span{font:italic 28px Georgia,serif;color:#7690b6}.hn-process h3{font-size:23px;margin:14px 0}.hn-process p{font-size:13px;color:var(--copy);line-height:1.9}.hn-process small{display:block;font-size:11px;color:#657b99;margin-top:20px}.hn-delivery-note{display:flex;gap:20px;align-items:center;margin-top:34px;padding-top:25px;border-top:1px solid var(--line)}.hn-delivery-note strong{font-size:13px;font-weight:500;white-space:nowrap}.hn-delivery-note p{font-size:12px;color:#64748b}.hn-delivery-note .hn-link{white-space:nowrap;margin-left:auto;font-size:12px} +.hn-about-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:8%;align-items:center}.hn-about-grid>figure{position:relative}.hn-about-grid img{aspect-ratio:1.45;object-fit:cover;border-radius:4px}.hn-about-grid h2{margin:18px 0 22px}.hn-about-grid>div>p:not(.hn-kicker){font-size:14px;line-height:2;color:var(--copy);margin-top:12px}.hn-about-grid .hn-link{margin-top:18px}.hn-about-sign{border-top:1px solid var(--line);margin-top:24px;padding-top:20px;display:flex;align-items:center;justify-content:space-between}.hn-about-sign>span{font-family:SimSun,serif;font-size:23px;letter-spacing:5px}.hn-about-sign small{font-size:10px;letter-spacing:2px;color:#64748b}.hn-feedback{display:grid;grid-template-columns:1fr 3fr;gap:50px;margin-top:60px;padding-top:35px;border-top:1px solid var(--line)}.hn-feedback h2{font-size:27px;margin-top:9px}.hn-quotes{display:grid;grid-template-columns:1fr 1fr;gap:38px}.hn-quotes blockquote>p{font-size:13px;line-height:2;color:#475569}.hn-quotes footer{background:none;padding:0!important;margin-top:18px;font-size:11px;color:#61728b}.hn-quotes footer>span{display:block;font-size:10px;color:#8b98aa;margin-top:3px}.hn-news{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}.hn-news article>a{display:block}.hn-news figure{border-radius:4px;overflow:hidden;background:#eff3f9}.hn-news img{height:168px;width:100%;object-fit:cover}.hn-news time{display:block;font-size:11px;color:#718096;margin-top:18px}.hn-news h3{font-family:"Microsoft YaHei",sans-serif;font-size:16px;font-weight:400;line-height:1.8;margin-top:7px}.hn-read{display:flex;justify-content:space-between;border-top:1px solid var(--line);padding-top:10px;margin-top:15px;font-size:11px;color:#637895;min-height:44px}.hn-empty{grid-column:1/-1;color:#64748b}.hn-faq-grid{display:grid;grid-template-columns:1fr 1.65fr;gap:90px}.hn-faq-grid h2{margin-top:15px}.hn-faq-list{border-top:1px solid var(--line)}.hn-faq-list details{border-bottom:1px solid var(--line)}.hn-faq-list summary{display:flex;justify-content:space-between;gap:20px;align-items:center;min-height:68px;cursor:pointer;list-style:none;font-size:14px}.hn-faq-list summary::-webkit-details-marker{display:none}.hn-faq-list summary span{font-size:20px;color:#58769c}.hn-faq-list details[open] summary span{transform:rotate(45deg)}.hn-faq-list details p{font-size:13px;line-height:2;color:#64748b;padding:0 28px 22px 0}.hn-contact{padding:65px 0;background:#eaf1fb;border-top:1px solid #d9e4f4}.hn-contact>.hn-wrap{display:flex;align-items:center;justify-content:space-between;gap:45px}.hn-contact h2{font-size:37px;margin:15px 0 16px}.hn-contact p:not(.hn-kicker){font-size:13px;color:#526784}.hn-contact-actions{min-width:270px;display:flex;flex-direction:column;gap:18px}.hn-contact-actions>.hn-btn{justify-content:space-between}.hn-phone{display:flex;justify-content:space-between;align-items:center;min-height:44px}.hn-phone small{font-size:11px;color:#526784}.hn-phone>span{font:23px Georgia,serif;letter-spacing:1px}.hn-contact-actions>p{font-size:10px!important;text-align:right;letter-spacing:1px}.hn-mobile-header{display:none} +@media(min-width:769px) and (max-width:1100px){.hn-wrap{padding-inline:28px}.hn-promise .hn-wrap>div{display:block;text-align:center}.hn-promise span{display:block}.hn-service{padding:25px 22px}.hn-service h3{font-size:21px}.hn-product-intro{padding:28px}.hn-product-visual{padding:30px 20px 0}.hn-app-body aside{flex-basis:78px}.hn-app-content{padding:12px}.hn-case h3{font-size:19px}.hn-delivery-note{flex-wrap:wrap}} +@media(max-width:768px){.home-nhc{padding-top:68px;font-size:14px}.hn-wrap{padding-inline:22px}.hn-section{padding:50px 0}.home-nhc h2{font-size:28px;letter-spacing:0}.hn-heading{display:block;margin-bottom:26px}.hn-heading h2{margin-top:10px}.hn-heading>div:last-child>p,.hn-heading>p{margin-top:14px;font-size:13px}.hn-heading>div:last-child{max-width:none}.hn-heading>div:last-child>p br{display:none}.hn-heading .hn-link{margin-top:5px}.hn-kicker{font-size:10px;letter-spacing:1.5px}.hn-hero{min-height:640px}.hn-hero-picture img{object-position:66% bottom}.hn-hero:after{background:linear-gradient(180deg,#f1f6fdf5 0%,#edf4fbd9 40%,#edf4fb10 70%)}.hn-hero-content{padding-top:48px;padding-bottom:230px}.home-nhc h1{font-size:37px;line-height:1.5;letter-spacing:1px;margin:18px 0}.hn-hero-desc{font-size:13px;line-height:1.95}.hn-actions{margin-top:24px;gap:10px}.hn-btn,.hn-outline{padding:9px 16px;gap:20px;font-size:12px;min-height:46px}.hn-hero-caption{height:45px;font-size:9px}.hn-hero-caption>span:last-child{display:none}.hn-hero-caption>a{gap:10px}.hn-promise>.hn-wrap{padding-block:20px;gap:12px}.hn-promise .hn-wrap>div{display:block;line-height:1.6;padding-right:7px}.hn-promise b{font-size:12px;white-space:nowrap}.hn-promise span{display:block;font-size:9px;margin-top:6px;max-width:95px}.hn-services{grid-template-columns:1fr}.hn-service{padding:26px}.hn-service+.hn-service{border-left:0;border-top:1px solid var(--line)}.hn-service-top{margin-bottom:16px}.hn-service-top svg{width:30px;height:30px}.hn-service h3{font-size:23px}.hn-service>p{min-height:0;font-size:13px}.hn-service-tags{margin-top:18px;padding-top:14px;font-size:10px}.hn-service .hn-link{margin-top:2px}.hn-product-feature{grid-template-columns:1fr}.hn-product-intro{padding:28px}.hn-product-intro h3{font-size:29px;margin-top:10px}.hn-product-intro .hn-btn{margin-top:18px}.hn-product-visual{padding:22px 14px 0;min-height:250px}.hn-app-body aside{flex-basis:65px;font-size:8px;padding:12px 5px;gap:12px}.hn-app-body aside span{padding-left:5px}.hn-app-bar{height:40px;padding-inline:12px}.hn-app-content{padding:12px 8px}.hn-app-content h4 small{display:none}.hn-stat-row{gap:5px}.hn-stat-row>div{padding:7px 5px}.hn-stat-row b{font-size:10px}.hn-chart{padding:9px}.hn-chart svg{height:65px}.hn-products{grid-template-columns:1fr 1fr;gap:24px 20px;margin-top:28px}.hn-products article{padding:0 16px 0 0}.hn-products article:nth-child(2n){border:0;padding:0}.hn-products h3{font-size:22px}.hn-products p{font-size:12px;min-height:68px}.hn-products .hn-small{font-size:10px}.hn-products .hn-link{margin-top:4px}.hn-cases{grid-template-columns:1fr;gap:28px}.hn-case img{height:auto;aspect-ratio:1.9}.hn-case-copy{padding-top:14px}.hn-case h3{font-size:22px;margin-top:7px}.hn-case-copy>p{font-size:13px}.hn-process{grid-template-columns:1fr 1fr;gap:26px 22px}.hn-process li{padding-top:16px}.hn-process li>span{font-size:24px}.hn-process h3{font-size:21px;margin:10px 0}.hn-process p{font-size:12px}.hn-process small{font-size:10px;margin-top:12px}.hn-delivery-note{display:block;margin-top:28px;padding-top:20px}.hn-delivery-note>p{margin-top:8px}.hn-delivery-note .hn-link{margin-top:6px}.hn-about-grid{grid-template-columns:1fr;gap:28px}.hn-about-grid h2{font-size:30px;margin:14px 0 16px}.hn-about-grid>div>p:not(.hn-kicker){font-size:13px}.hn-about-grid .hn-link{margin-top:10px}.hn-about-sign{margin-top:15px;padding-top:16px}.hn-feedback{grid-template-columns:1fr;gap:24px;margin-top:35px;padding-top:28px}.hn-quotes{grid-template-columns:1fr;gap:25px}.hn-quotes blockquote{border-left:2px solid #c3d4ee;padding-left:18px}.hn-quotes footer{margin-top:12px}.hn-news{grid-template-columns:1fr;gap:25px}.hn-news article>a{display:grid;grid-template-columns:104px 1fr;gap:0 16px}.hn-news figure{grid-row:1/4}.hn-news img{height:104px;object-fit:cover}.hn-news time{margin:0;font-size:10px}.hn-news h3{font-size:13px;margin-top:4px}.hn-read{font-size:10px;margin-top:6px;padding-top:4px;min-height:32px}.hn-faq-grid{grid-template-columns:1fr;gap:25px}.hn-faq-grid h2 br{display:none}.hn-faq-list summary{font-size:13px;min-height:65px}.hn-faq-list details p{font-size:12px;padding-right:15px}.hn-contact{padding:42px 0}.hn-contact>.hn-wrap{display:block}.hn-contact h2{font-size:32px;margin:14px 0}.hn-contact p:not(.hn-kicker){font-size:12px}.hn-contact-actions{margin-top:25px;min-width:0;gap:14px}.hn-contact-actions>.hn-btn{max-width:320px}.hn-phone{max-width:320px}.hn-contact-actions>p{text-align:left}.hn-mobile-header{position:fixed;inset:0 0 auto;height:68px;padding:0 22px;z-index:1001;display:flex;align-items:center;gap:24px;background:#fffffff5;border-bottom:1px solid var(--line)}.hn-mobile-brand{display:flex;flex-direction:column;margin-right:auto;font:23px/1.2 SimSun,serif;letter-spacing:2px;min-height:44px;justify-content:center}.hn-mobile-brand>span{font:8px sans-serif;letter-spacing:1.4px;color:#64748b;margin-top:5px}.hn-mobile-contact{font-size:12px;color:#2563eb!important;min-height:44px;display:flex;align-items:center}.hn-mobile-menu summary{display:flex;align-items:center;gap:6px;min-height:44px;font-size:12px;cursor:pointer;list-style:none}.hn-mobile-menu summary::-webkit-details-marker{display:none}.hn-mobile-menu svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.5}.home-nhc .hn-mobile-menu nav{position:absolute;top:68px;left:0;width:100%;height:auto;line-height:normal;display:grid;grid-template-columns:1fr 1fr;gap:0 25px;padding:12px 22px 20px;background:white;box-shadow:0 16px 25px #0f172a0d}.hn-mobile-menu nav a{min-height:50px;display:flex;align-items:center;border-bottom:1px solid var(--line);font-size:14px}.hn-mobile-menu nav a[aria-current]{color:#2563eb}} +/* Keep the homepage masthead quiet; the company name remains the brand link. */ +.nhc-header .nhc-logo>a>img,.nhc-header .nhc-logo>.nhc-seal{display:none}.hn-promise span{color:#52657e}.hn-demo-label{color:#52657e} +@media(max-width:768px){.hn-hero-caption{color:#243c5d;background:#f2f6fb9c}.hn-promise span{font-size:10px}.hn-heading h2{font-size:26px}.hn-products p{min-height:74px}} +@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.home-nhc *{transition:none!important;animation:none!important}} diff --git a/public/assets/addons/official/css/modern_nhc.css b/public/assets/addons/official/css/modern_nhc.css index 2256f1c..f50feac 100644 --- a/public/assets/addons/official/css/modern_nhc.css +++ b/public/assets/addons/official/css/modern_nhc.css @@ -233,9 +233,9 @@ img { line-height: 1.2; } -.nhc-logo-sub { +.nhc-header .nhc-logo-sub { font-size: 10px; - color: var(--text-muted); + color: #475569; letter-spacing: 2px; text-transform: uppercase; } @@ -247,17 +247,20 @@ img { list-style: none; } -.nhc-nav-link { +.nhc-header .nhc-nav-link, +.nhc-header .nhc-nav-link:visited { font-size: 15px; font-weight: 500; - color: var(--text-secondary); + color: #334155; position: relative; padding: 8px 0; transition: color 0.2s; } -.nhc-nav-link:hover, -.nhc-nav-link.active { +.nhc-header .nhc-nav-link:hover, +.nhc-header .nhc-nav-link:focus-visible, +.nhc-header .nhc-nav-link.active, +.nhc-header .nhc-nav-link.active:visited { color: var(--primary); } @@ -2199,7 +2202,7 @@ img { .nhc-caret { transition: transform 0.25s ease; - color: var(--text-muted); + color: inherit; } .nhc-has-dropdown:hover .nhc-caret { @@ -4423,3 +4426,19 @@ img { } } + +/* Preserve header contrast after a destination has been visited. */ +.nhc-header .nhc-btn-primary, +.nhc-header .nhc-btn-primary:visited, +.nhc-header .nhc-btn-primary:hover, +.nhc-header .nhc-btn-primary:focus-visible, +.nhc-header .nhc-btn-primary:active { + color: #FFFFFF; +} + +.nhc-header .nhc-nav-link:focus-visible, +.nhc-header .nhc-btn-primary:focus-visible { + outline: 2px solid #2563EB; + outline-offset: 5px; +} + diff --git a/public/assets/addons/official/css/service-agent-v2.css b/public/assets/addons/official/css/service-agent-v2.css new file mode 100644 index 0000000..a4883fd --- /dev/null +++ b/public/assets/addons/official/css/service-agent-v2.css @@ -0,0 +1,18 @@ +/* 纳海川智能体服务。页面独立作用域,兼容旧 PC 与 Materialize 移动模板。 */ +.agent-v2{--av-blue:#2563eb;--av-ink:#0f172a;--av-copy:#475569;--av-muted:#64748b;--av-line:#dde4ec;--av-soft:#f8fafc;color:var(--av-ink);background:#fff;font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.8;overflow-wrap:break-word;-webkit-font-smoothing:antialiased} +.agent-v2 *{box-sizing:border-box}.agent-v2 :where(h1,h2,h3,p,figure,ol,ul,dl,dd){margin:0}.agent-v2 h1,.agent-v2 h2{font-family:var(--font-serif,"SimSun",serif);font-weight:600;color:var(--av-ink);line-height:1.45}.agent-v2 h3{font-size:21px;line-height:1.5;font-weight:600;color:var(--av-ink)}.agent-v2 a{text-decoration:none;transition:color .2s,background .2s}.agent-v2 a:focus-visible,.agent-v2 summary:focus-visible{outline:3px solid var(--av-blue);outline-offset:5px}.agent-v2 [id]{scroll-margin-top:100px}.agent-v2 nav{height:auto;line-height:inherit;box-shadow:none;color:inherit;background:transparent}.agent-v2 svg{fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round} +.av-wrap{width:100%;max-width:1280px;padding:0 32px;margin:0 auto}.av-skip{position:fixed;left:20px;top:-100px;background:#fff;padding:12px 20px;z-index:1100}.av-skip:focus{top:85px}.av-kicker{font-size:12px;letter-spacing:1.7px;font-weight:500;color:var(--av-blue);line-height:1.7}.av-kicker>span{margin:0 10px;color:#a1adbc}.av-hero{padding:101px 0 0}.av-crumb{display:flex;align-items:center;gap:14px;font-size:12px;color:var(--av-copy);margin-bottom:43px}.av-crumb a{display:inline-flex;align-items:center;min-height:44px;color:var(--av-copy)}.av-crumb a:hover{color:var(--av-blue)}.av-crumb>span:not([aria-current]){color:#a1adbc} +.av-hero-intro{display:grid;grid-template-columns:1.12fr 1fr;gap:10%;align-items:end;margin-bottom:44px}.agent-v2 h1{font-size:clamp(40px,4.4vw,66px);letter-spacing:2px;margin:14px 0 10px}.av-hero-sub{font-size:23px;color:var(--av-copy);letter-spacing:1px}.av-hero-copy{padding-bottom:4px}.av-hero-copy>p{color:var(--av-copy);font-size:15px;line-height:1.95;max-width:450px}.av-actions{display:flex;align-items:center;gap:27px;flex-wrap:wrap;margin-top:25px}.av-btn{display:inline-flex;align-items:center;justify-content:center;gap:28px;min-height:50px;padding:12px 23px;color:#fff!important;background:var(--av-blue);font-size:14px;border-radius:4px;cursor:pointer}.av-btn:hover{background:#1d4ed8}.av-btn svg{width:20px;height:20px;stroke-width:1.6}.av-link{display:inline-flex;align-items:center;gap:16px;min-height:44px;font-size:13px;color:var(--av-copy)}.av-link:hover{color:var(--av-blue)} +.av-panorama{position:relative;background:#f1f4f7;overflow:hidden;border-radius:4px}.av-panorama picture,.av-courtyard picture{display:block}.av-panorama img{display:block;width:100%;height:380px;object-fit:cover;object-position:50% 59%}.av-panorama figcaption{position:absolute;bottom:0;left:0;display:flex;justify-content:space-between;width:100%;padding:22px 28px;color:var(--av-copy);font-size:11px;letter-spacing:1.5px;background:linear-gradient(transparent,#f8fafce8)} +.av-index{border-bottom:1px solid var(--av-line);padding:13px 0;background:#fff}.av-index nav{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}.av-index a{display:inline-flex;align-items:center;gap:12px;min-height:48px;color:var(--av-copy);font-size:13px}.av-index a span{color:var(--av-blue);font-size:11px}.av-index a:hover{color:var(--av-blue)} +.av-section{padding:100px 0}.av-soft{background:var(--av-soft)}.av-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:60px;margin-bottom:46px}.agent-v2 h2{font-size:34px;letter-spacing:.6px}.av-heading h2{margin-top:14px}.av-heading>p{font-size:14px;color:var(--av-copy);max-width:335px;line-height:1.95}.av-scenarios{border-top:1px solid var(--av-line)}.av-scenarios article{display:grid;grid-template-columns:40px 1.05fr 1.35fr .65fr;align-items:center;gap:27px;padding:32px 0;border-bottom:1px solid var(--av-line)}.av-no{font-family:Georgia,serif;font-size:18px;color:var(--av-blue);align-self:start;padding-top:3px}.av-context{display:block;color:var(--av-muted);font-size:12px;margin-top:10px}.av-scenarios article>p{font-size:14px;color:var(--av-copy);line-height:1.95}.av-output{font-size:11px;letter-spacing:.5px;color:var(--av-muted);border-left:1px solid var(--av-line);padding-left:27px}.av-output>span{display:block;font-size:12px;color:var(--av-copy);margin-top:7px;letter-spacing:0} +.av-build-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:48px}.av-build-grid article{border-top:1px solid #cbd8e9;padding-top:29px}.av-build-grid svg{width:43px;height:43px;color:var(--av-blue);margin-bottom:23px}.av-build-grid h3{margin-bottom:15px}.av-build-grid p{font-size:15px;color:var(--av-copy);line-height:1.95}.av-build-grid ul{padding:23px 0 0;list-style:none;font-size:13px;color:var(--av-copy)}.av-build-grid li{padding:5px 0 5px 16px;position:relative}.av-build-grid li:before{content:"";position:absolute;left:0;top:16px;width:4px;height:4px;background:var(--av-blue)}.av-evaluation{display:flex;align-items:center;gap:30px;border-top:1px solid var(--av-line);margin-top:42px;padding-top:25px}.av-evaluation strong{font-size:14px;font-weight:500;flex-shrink:0}.av-evaluation p{color:var(--av-copy);font-size:13px;max-width:595px}.av-evaluation a{margin-left:auto;white-space:nowrap} +.av-governance{display:grid;grid-template-columns:1fr 1fr;gap:9%;align-items:center}.av-courtyard{position:relative;overflow:hidden;border-radius:4px;background:var(--av-soft)}.av-courtyard img{display:block;width:100%;height:auto;aspect-ratio:1;object-fit:cover}.av-courtyard figcaption{position:absolute;left:20px;bottom:20px;padding:9px 14px;border-radius:4px;background:#fffffff0;font-size:11px;letter-spacing:1px;color:var(--av-copy)}.av-governance h2{margin:15px 0 19px;font-size:39px}.av-intro{font-size:15px;line-height:1.95;color:var(--av-copy)}.av-governance dl{margin-top:25px}.av-governance dl>div{display:grid;grid-template-columns:75px 1fr;gap:20px;padding:17px 0;border-top:1px solid var(--av-line)}.av-governance dt{font-size:14px;font-weight:500}.av-governance dd{font-size:13px;color:var(--av-copy);line-height:1.9}.av-deploy-compare{display:grid;grid-template-columns:1fr 1fr;gap:56px;margin-top:43px}.av-deploy-compare article{display:grid;grid-template-columns:145px 1fr;gap:25px;border-top:1px solid var(--av-line);padding-top:25px}.av-deploy-compare .av-kicker{font-size:9px;letter-spacing:1px;display:block;margin-bottom:9px}.av-deploy-compare h3{font-size:21px;font-family:var(--font-serif,"SimSun",serif)}.av-deploy-compare p{color:var(--av-copy);font-size:13px;line-height:1.95} +.av-process{display:grid;grid-template-columns:repeat(4,1fr);list-style:none;padding:0;gap:35px}.av-process li{border-top:1px solid #cbd8e9;padding-top:20px;position:relative}.av-process li:before{content:"";width:5px;height:5px;position:absolute;top:-3px;left:0;border-radius:50%;background:var(--av-blue)}.av-process li>span{font-family:Georgia,serif;color:var(--av-blue);font-size:17px}.av-process h3{font-size:19px;margin:23px 0 12px}.av-process p{font-size:14px;color:var(--av-copy);line-height:1.9}.av-process small{display:block;color:var(--av-muted);font-size:12px;margin-top:22px}.av-delivery{display:grid;grid-template-columns:1fr 1fr;gap:50px;background:#fff;border:1px solid var(--av-line);border-radius:4px;padding:32px 36px;margin-top:45px}.av-delivery .av-kicker{font-size:11px}.av-delivery h3{font-size:20px;margin:10px 0}.av-delivery p:not(.av-kicker){font-size:12px;color:var(--av-muted)}.av-delivery ul{list-style:none;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:16px;align-content:center}.av-delivery li{font-size:12px;color:var(--av-copy);padding-left:12px;border-left:2px solid #adc7f7} +.av-faq-grid{display:grid;grid-template-columns:4fr 7fr;gap:8%}.av-faq-grid h2{margin-top:15px}.av-faq-note{font-size:14px;color:var(--av-copy);max-width:260px;margin-top:24px!important}.av-faq-list{border-top:1px solid var(--av-line)}.av-faq-list details{border-bottom:1px solid var(--av-line)}.av-faq-list summary{display:flex;align-items:center;justify-content:space-between;gap:22px;min-height:76px;padding:20px 0;list-style:none;cursor:pointer;font-size:16px;font-weight:500}.av-faq-list summary::-webkit-details-marker{display:none}.av-faq-list summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.av-faq-list summary>span:before,.av-faq-list summary>span:after{position:absolute;content:"";width:12px;height:1px;left:2px;top:8px;background:var(--av-blue)}.av-faq-list summary>span:after{transform:rotate(90deg);transition:transform .2s}.av-faq-list details[open] summary>span:after{transform:rotate(0deg)}.av-faq-list details p{color:var(--av-copy);font-size:14px;padding:0 25px 25px 0;line-height:1.95} +.av-contact{background:#eef3fa;border-top:1px solid #dce5f1;padding:58px 0}.av-contact>.av-wrap{display:grid;grid-template-columns:1.12fr 1fr;gap:10%;align-items:center}.av-contact h2{font-size:38px;margin-top:14px}.av-contact p:not(.av-kicker){color:var(--av-copy);font-size:14px;line-height:1.95}.av-contact .av-btn{margin-top:25px} +@media(min-width:1600px){.av-hero{padding-top:120px}.av-panorama img{height:410px}} +@media(max-width:1023px){.av-hero-intro{gap:35px;grid-template-columns:1.1fr 1fr}.agent-v2 h1{font-size:45px}.av-hero-sub{font-size:20px}.av-actions{gap:16px}.av-heading{gap:32px}.av-heading>p{max-width:270px}.agent-v2 h2{font-size:29px}.av-scenarios article{grid-template-columns:28px 1fr 1.3fr;gap:20px}.av-output{display:none}.av-build-grid{gap:28px}.av-governance{gap:35px}.av-governance h2{font-size:33px}.av-deploy-compare{gap:30px}.av-deploy-compare article{grid-template-columns:1fr;gap:15px}.av-process{grid-template-columns:repeat(2,1fr);gap:35px}.av-delivery{grid-template-columns:1fr;gap:25px}.av-evaluation{flex-wrap:wrap;gap:12px 25px}.av-evaluation p{flex:1}.av-evaluation a{margin-left:0}.av-faq-grid{gap:35px}.av-contact h2{font-size:32px}} +@media(max-width:767px){.av-wrap{padding:0 22px}.av-hero{padding-top:78px}.av-crumb{margin-bottom:26px;gap:11px}.av-hero-intro{grid-template-columns:1fr;gap:25px;margin-bottom:28px}.av-kicker{font-size:11px;letter-spacing:1.3px}.agent-v2 h1{font-size:40px;letter-spacing:1px;margin:12px 0}.av-hero-sub{font-size:19px}.av-hero-copy>p{font-size:16px;line-height:1.9;max-width:none}.av-actions{margin-top:23px;gap:22px}.av-btn{min-height:50px;font-size:14px;padding:12px 20px;gap:23px}.av-panorama img{height:260px;object-position:50% 62%}.av-panorama figcaption{padding:17px 17px;font-size:10px;letter-spacing:.5px}.av-panorama figcaption span:last-child{display:none}.av-index{padding:9px 0}.av-index nav{justify-content:flex-start;gap:0 25px}.av-index a{font-size:12px;gap:8px;min-height:44px}.av-index a span{font-size:10px}.av-section{padding:60px 0}.av-heading{display:block;margin-bottom:30px}.av-heading>p{max-width:none;font-size:16px;margin-top:17px}.agent-v2 h2{font-size:28px;letter-spacing:0}.av-scenarios article{grid-template-columns:24px 1fr;gap:12px 18px;padding:26px 0}.agent-v2 h3{font-size:20px}.av-no{font-size:16px;padding-top:1px}.av-context{font-size:12px;margin-top:6px}.av-scenarios article>p{grid-column:2;font-size:16px;line-height:1.85}.av-output{display:block;grid-column:2;border:0;padding:0;margin-top:2px;font-size:11px}.av-output>span{display:inline;margin-left:12px;font-size:12px}.av-build-grid{grid-template-columns:1fr;gap:28px}.av-build-grid article{position:relative;padding-left:55px;padding-top:23px}.av-build-grid svg{position:absolute;left:0;top:26px;width:32px;height:32px}.av-build-grid p{font-size:16px;line-height:1.9}.av-build-grid ul{font-size:14px;padding-top:14px}.av-build-grid h3{margin-bottom:12px}.av-evaluation{display:block;padding-top:23px;margin-top:30px}.av-evaluation strong{font-size:16px}.av-evaluation p{font-size:15px;margin-top:10px}.av-evaluation a{margin-top:9px;font-size:14px}.av-governance{grid-template-columns:1fr;gap:30px}.av-governance-copy{grid-row:1}.av-governance h2{font-size:32px}.av-intro{font-size:16px}.av-governance dl{margin-top:22px}.av-governance dl>div{grid-template-columns:65px 1fr;gap:17px}.av-governance dt{font-size:14px}.av-governance dd{font-size:15px}.av-courtyard img{aspect-ratio:1.12}.av-courtyard figcaption{padding:9px 14px;font-size:11px}.av-deploy-compare{grid-template-columns:1fr;gap:27px;margin-top:30px}.av-deploy-compare article{grid-template-columns:1fr;gap:13px;padding-top:22px}.av-deploy-compare .av-kicker{font-size:10px}.av-deploy-compare p{font-size:16px}.av-process{gap:30px 25px}.av-process h3{font-size:18px;margin-top:17px}.av-process p{font-size:16px}.av-process small{font-size:12px;margin-top:17px}.av-delivery{padding:25px;gap:22px;margin-top:35px}.av-delivery h3{font-size:19px}.av-delivery ul{grid-template-columns:1fr;font-size:14px;gap:14px}.av-delivery li{font-size:14px}.av-delivery p:not(.av-kicker){font-size:13px}.av-faq-grid{grid-template-columns:1fr;gap:29px}.av-faq-grid h2 br{display:none}.av-faq-note{font-size:16px;max-width:none;margin-top:17px!important}.av-faq-list summary{font-size:16px;min-height:75px}.av-faq-list details p{font-size:16px;padding-right:16px}.av-contact{padding:45px 0}.av-contact>.av-wrap{grid-template-columns:1fr;gap:24px}.av-contact h2{font-size:33px}.av-contact p:not(.av-kicker){font-size:16px}.av-contact p br{display:none}} +@media(max-width:374px){.av-wrap{padding:0 18px}.agent-v2 h1{font-size:35px}.av-actions{gap:13px}.av-btn{gap:15px;padding:12px 16px}.av-process{grid-template-columns:1fr}.av-index nav{gap:0 17px}} +@media(prefers-reduced-motion:reduce){html:has(.agent-v2){scroll-behavior:auto}.agent-v2 *{transition:none!important;animation:none!important;scroll-behavior:auto!important}} diff --git a/public/assets/addons/official/css/service-agent.css b/public/assets/addons/official/css/service-agent.css new file mode 100644 index 0000000..280e262 --- /dev/null +++ b/public/assets/addons/official/css/service-agent.css @@ -0,0 +1,20 @@ +/* 智能体服务独立页:限定样式作用域,供桌面及移动端模板共用。 */ +.agent-page{--ag-ink:#0f172a;--ag-copy:#475569;--ag-blue:#2563eb;--ag-line:#dce3eb;--ag-soft:#f8fafc;--ag-muted:#64748b;color:var(--ag-ink);background:#fff;font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.75;overflow-wrap:break-word} +.agent-page *{box-sizing:border-box}.agent-page h1,.agent-page h2,.agent-page h3,.agent-page p,.agent-page figure,.agent-page ol,.agent-page ul{margin:0}.agent-page h1,.agent-page h2{font-family:var(--font-serif,"SimSun",serif);color:var(--ag-ink);font-weight:600}.agent-page a{text-decoration:none}.agent-page a:focus-visible,.agent-page summary:focus-visible{outline:3px solid var(--ag-blue);outline-offset:5px}.agent-page [id]{scroll-margin-top:100px} +.agent-page nav{height:auto;line-height:inherit;box-shadow:none;color:var(--ag-copy);background:#fff}.agent-page .ag-breadcrumb a{color:var(--ag-copy)} +.ag-container{width:100%;max-width:1280px;padding:0 32px;margin:0 auto}.ag-skip{position:fixed;left:24px;top:-100px;z-index:1000;background:#fff;padding:12px 20px}.ag-skip:focus{top:90px}.ag-hero{padding:111px 0 0;background:#fff}.ag-breadcrumb{display:flex;gap:13px;align-items:center;font-size:13px;color:var(--ag-copy);margin-bottom:38px}.ag-breadcrumb a{min-height:44px;display:inline-flex;align-items:center}.ag-breadcrumb a:hover{color:var(--ag-blue)} +.ag-hero-grid{display:grid;grid-template-columns:5fr 6fr;gap:7%;align-items:center;padding-bottom:64px}.ag-eyebrow{display:flex;align-items:center;gap:9px;font-size:12px;font-weight:600;letter-spacing:1.8px;color:var(--ag-blue);margin-bottom:23px!important}.ag-eyebrow i{width:6px;height:6px;background:var(--ag-blue)}.agent-page h1{font-size:clamp(40px,4.1vw,62px);line-height:1.34;letter-spacing:1px;margin-bottom:26px}.agent-page h1 span{color:var(--ag-blue)}.ag-lead{font-size:16px;color:var(--ag-copy);line-height:1.95;max-width:450px}.ag-actions{display:flex;gap:26px;align-items:center;flex-wrap:wrap;margin-top:32px}.ag-button{display:inline-flex;align-items:center;justify-content:center;gap:28px;min-height:50px;padding:12px 23px;border-radius:4px;font-size:15px;font-weight:500;transition:background .2s,box-shadow .2s;cursor:pointer;color:#fff!important;background:var(--ag-blue)}.ag-button:hover{background:#1d4ed8;box-shadow:0 4px 16px #2563eb20}.ag-button span{font-size:21px;line-height:1}.ag-text-link{display:inline-flex;gap:14px;align-items:center;min-height:44px;font-size:14px;color:var(--ag-copy)}.ag-text-link:hover{color:var(--ag-blue)}.ag-hero-note{margin-top:29px!important;font-size:12px;color:var(--ag-muted);letter-spacing:1px} +.ag-hero-art{position:relative;border-radius:4px;overflow:hidden;background:var(--ag-soft)}.ag-hero-art picture{display:block}.ag-hero-art img{display:block;width:100%;height:auto;aspect-ratio:1.2;object-fit:cover}.ag-hero-art figcaption{position:absolute;bottom:0;left:0;width:100%;display:flex;justify-content:space-between;padding:18px 24px;font-size:10px;letter-spacing:1.5px;color:var(--ag-copy);background:linear-gradient(transparent,#f8fafce6)} +.ag-principles{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--ag-line);padding:25px 0 30px;gap:35px}.ag-principles>div{position:relative;padding-left:38px}.ag-principles>div>span{position:absolute;left:0;top:1px;font-size:12px;color:var(--ag-blue);font-variant-numeric:tabular-nums}.ag-principles strong{font-size:14px;font-weight:500}.ag-principles p{font-size:12px;color:var(--ag-muted);margin-top:3px} +.ag-section-nav{border-top:1px solid var(--ag-line);border-bottom:1px solid var(--ag-line);background:#fff}.ag-section-nav .ag-container{display:flex;gap:46px;flex-wrap:wrap}.ag-section-nav a{padding:17px 0;min-height:54px;font-size:13px;color:var(--ag-copy);border-bottom:2px solid transparent}.ag-section-nav a:hover{border-color:var(--ag-blue);color:var(--ag-blue)} +.ag-section{padding:96px 0}.ag-tinted{background:var(--ag-soft);border-top:1px solid #eef1f5;border-bottom:1px solid #eef1f5}.ag-section-head{display:flex;justify-content:space-between;align-items:flex-end;gap:48px;margin-bottom:42px}.ag-section-head .ag-eyebrow{margin-bottom:15px!important}.agent-page h2{font-size:clamp(26px,2.4vw,36px);line-height:1.5;letter-spacing:.5px}.ag-section-head>p{max-width:350px;font-size:14px;line-height:1.9;color:var(--ag-copy)}.agent-page h3{font-size:19px;line-height:1.5;font-weight:600;color:var(--ag-ink)} +.ag-scenario-grid{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--ag-line);border-radius:4px;overflow:hidden}.ag-scenario{padding:28px 25px;display:flex;flex-direction:column;border-right:1px solid var(--ag-line);transition:background .2s}.ag-scenario:last-child{border-right:0}.ag-scenario:hover{background:var(--ag-soft)}.ag-card-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;color:var(--ag-blue)}.ag-card-top>span{font-size:12px}.ag-card-top svg{width:30px;height:30px;stroke:currentColor;fill:none;stroke-width:1.25;stroke-linejoin:round;stroke-linecap:round}.ag-scenario h3{margin-bottom:14px}.ag-scenario>p{font-size:14px;color:var(--ag-copy);line-height:1.9;margin-bottom:27px}.ag-use{border-top:1px solid var(--ag-line);padding-top:16px;margin-top:auto;font-size:12px;color:var(--ag-copy)}.ag-use>span{display:block;font-size:11px;color:var(--ag-muted);margin-bottom:5px;letter-spacing:1px} +.ag-capability-grid{display:grid;grid-template-columns:1fr 1fr;gap:72px;align-items:center}.ag-example{padding:24px;background:#fff;border:1px solid var(--ag-line);border-radius:6px;box-shadow:0 18px 45px #0f172a05;font-size:14px}.ag-example-bar{display:flex;align-items:center;gap:8px;padding-bottom:20px;border-bottom:1px solid var(--ag-line);font-weight:500}.ag-example-bar i{width:6px;height:6px;background:var(--ag-blue);border-radius:50%}.ag-example-bar>span{margin-left:auto;font-size:11px;letter-spacing:1px;color:var(--ag-muted);font-weight:400}.ag-question{margin:22px 0 18px 36px;padding:12px 16px;background:#eff6ff;border-radius:4px;color:#1e40af}.ag-answer{padding:0 9px}.ag-answer>span{font-size:11px;letter-spacing:.6px;color:var(--ag-muted)}.ag-answer>p{margin-top:9px}.ag-answer ol{padding-left:22px;margin-top:10px;line-height:2}.ag-answer a{display:inline-flex;min-height:44px;align-items:center;gap:12px;color:var(--ag-blue);font-size:12px;margin-top:8px}.ag-source{border-top:1px solid var(--ag-line);margin-top:12px;padding:17px 9px 0}.ag-source>span{display:block;color:var(--ag-blue);font-size:11px}.ag-source strong{display:block;font-size:12px;font-weight:500;margin-top:5px}.ag-source p{font-size:11px;color:var(--ag-muted);margin-top:5px}.ag-capability-list article{display:flex;gap:22px;padding:22px 0;border-bottom:1px solid var(--ag-line)}.ag-capability-list article:first-child{padding-top:0}.ag-capability-list article:last-child{border:0;padding-bottom:0}.ag-capability-list article>span{font-size:12px;color:var(--ag-blue);padding-top:5px}.ag-capability-list h3{font-size:18px;margin-bottom:8px}.ag-capability-list p{font-size:14px;color:var(--ag-copy);line-height:1.9} +.ag-deploy-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px}.ag-deploy{border:1px solid var(--ag-line);border-radius:4px;padding:32px 36px}.ag-small-label{font-size:12px;letter-spacing:1px;color:var(--ag-blue)}.ag-deploy h3{font-family:var(--font-serif,"SimSun",serif);font-size:26px;margin:13px 0}.ag-deploy>p{font-size:14px;color:var(--ag-copy);padding-bottom:24px;border-bottom:1px solid var(--ag-line)}.ag-deploy ul{list-style:none;padding:20px 0 0;color:var(--ag-copy);font-size:14px}.ag-deploy li{position:relative;padding-left:18px;margin:8px 0}.ag-deploy li:before{content:"";position:absolute;left:0;top:11px;width:4px;height:4px;background:var(--ag-blue)}.ag-deploy-note{font-size:12px;color:var(--ag-muted);margin-top:22px!important} +.ag-process{display:grid;grid-template-columns:repeat(4,1fr);list-style:none;padding:0;gap:30px}.ag-process>li{border-top:1px solid #bdcce1;padding-top:22px}.ag-process>li>span{color:var(--ag-blue);font-size:13px}.ag-process h3{font-size:18px;margin:20px 0 12px}.ag-process p{font-size:14px;color:var(--ag-copy);line-height:1.9}.ag-process small{display:block;font-size:11px;color:var(--ag-muted);margin-top:20px}.ag-delivery{display:grid;grid-template-columns:1fr 1fr;gap:40px;padding:32px 36px;margin-top:45px;border:1px solid var(--ag-line);border-radius:4px;background:#fff}.ag-delivery h3{margin:10px 0;font-size:20px}.ag-delivery p{font-size:12px;color:var(--ag-muted)}.ag-delivery ul{display:grid;grid-template-columns:1fr 1fr;align-content:center;gap:14px 25px;padding:0;list-style:none;font-size:13px;color:var(--ag-copy)}.ag-delivery li{border-left:2px solid #bfd3f7;padding-left:12px} +.ag-faq-layout{display:grid;grid-template-columns:4fr 7fr;gap:8%}.ag-faq-intro{font-size:14px;color:var(--ag-copy);margin-top:20px!important;max-width:260px}.ag-faq-list{border-top:1px solid var(--ag-line)}.ag-faq-list details{border-bottom:1px solid var(--ag-line)}.ag-faq-list summary{display:flex;align-items:center;justify-content:space-between;gap:18px;min-height:76px;padding:20px 0;cursor:pointer;list-style:none;font-size:16px;font-weight:500}.ag-faq-list summary::-webkit-details-marker{display:none}.ag-faq-list summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.ag-faq-list summary>span:before,.ag-faq-list summary>span:after{content:"";position:absolute;background:var(--ag-blue);width:12px;height:1px;left:2px;top:8px}.ag-faq-list summary>span:after{transform:rotate(90deg);transition:transform .2s}.ag-faq-list details[open] summary>span:after{transform:rotate(0)}.ag-faq-list details p{padding:0 30px 24px 0;font-size:14px;color:var(--ag-copy);line-height:1.95} +.ag-contact{background:#edf3fc;border-top:1px solid #dce7f7;padding:58px 0}.ag-contact-inner{display:flex;justify-content:space-between;align-items:center;gap:36px}.ag-contact .ag-eyebrow{margin-bottom:12px!important}.ag-contact h2{font-size:30px}.ag-contact p:not(.ag-eyebrow){font-size:14px;color:var(--ag-copy);margin-top:14px}.ag-contact .ag-button{flex-shrink:0} +@media(max-width:1023px){.ag-hero-grid{gap:32px;grid-template-columns:1fr 1fr}.agent-page h1{font-size:42px}.ag-scenario-grid{grid-template-columns:repeat(2,1fr)}.ag-scenario:nth-child(2){border-right:0}.ag-scenario:nth-child(-n+2){border-bottom:1px solid var(--ag-line)}.ag-capability-grid{gap:32px}.ag-section-head{gap:30px}.ag-section-head>p{max-width:285px}.ag-delivery{grid-template-columns:1fr}.ag-faq-layout{grid-template-columns:1fr 1.5fr;gap:36px}.ag-process{grid-template-columns:repeat(2,1fr);gap:36px}} +@media(max-width:767px){.ag-container{padding:0 22px}.ag-hero{padding-top:86px}.ag-breadcrumb{margin-bottom:22px}.ag-hero-grid{grid-template-columns:1fr;gap:30px;padding-bottom:32px}.agent-page h1{font-size:42px;margin-bottom:20px}.ag-eyebrow{font-size:11px;margin-bottom:18px!important}.ag-lead{font-size:16px;max-width:100%}.ag-actions{gap:22px;margin-top:24px}.ag-hero-note{margin-top:20px!important}.ag-hero-art img{aspect-ratio:1.4}.ag-hero-art figcaption{padding:14px 17px;font-size:9px}.ag-principles{gap:18px;padding:23px 0;grid-template-columns:1fr}.ag-principles>div{padding-left:30px;display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}.ag-principles p{margin:0}.ag-section-nav .ag-container{gap:4px 22px}.ag-section-nav a{font-size:12px;padding:12px 0;min-height:46px}.ag-section{padding:58px 0}.ag-section-head{display:block;margin-bottom:28px}.ag-section-head>p{max-width:100%;margin-top:16px;font-size:14px}.agent-page h2{font-size:28px}.ag-scenario-grid{grid-template-columns:1fr}.ag-scenario{border-right:0;border-bottom:1px solid var(--ag-line);padding:25px}.ag-scenario:last-child{border-bottom:0}.ag-card-top{margin-bottom:20px}.ag-scenario>p{font-size:15px;margin-bottom:20px}.ag-use{font-size:13px}.ag-capability-grid,.ag-deploy-grid,.ag-faq-layout{grid-template-columns:1fr;gap:30px}.ag-example{padding:20px}.ag-question{margin-left:20px}.ag-answer{padding:0}.ag-capability-list article{padding:22px 0}.ag-capability-list p,.ag-deploy>p,.ag-deploy li,.ag-process p,.ag-faq-list details p{font-size:15px}.ag-deploy{padding:27px 25px}.ag-process{gap:30px 22px}.ag-process h3{font-size:17px}.ag-process small{font-size:12px}.ag-delivery{padding:26px;gap:20px;margin-top:32px}.ag-delivery ul{grid-template-columns:1fr;font-size:14px}.ag-faq-intro{max-width:100%;margin-top:14px!important}.ag-faq-list summary{min-height:72px;font-size:16px}.ag-contact{padding:42px 0}.ag-contact-inner{display:block}.ag-contact h2{font-size:27px}.ag-contact .ag-button{margin-top:25px}} +@media(max-width:374px){.ag-container{padding:0 18px}.agent-page h1{font-size:36px}.ag-process{grid-template-columns:1fr}.ag-actions{gap:12px}.ag-button{gap:16px;padding:12px 18px}} +@media(prefers-reduced-motion:reduce){html:has(.agent-page){scroll-behavior:auto}.agent-page *{animation:none!important;transition:none!important;scroll-behavior:auto!important}} diff --git a/public/assets/addons/official/css/service-app.css b/public/assets/addons/official/css/service-app.css new file mode 100644 index 0000000..6393f58 --- /dev/null +++ b/public/assets/addons/official/css/service-app.css @@ -0,0 +1,15 @@ +/* APP 与小程序服务:独立作用域,共用桌面与移动内容模板。 */ +.app-service{--ap-blue:#2563eb;--ap-ink:#0f172a;--ap-copy:#475569;--ap-muted:#64748b;--ap-line:#dce4ed;--ap-soft:#f8fafc;background:#fff;color:var(--ap-ink);font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.8;overflow-wrap:break-word;-webkit-font-smoothing:antialiased}.app-service *{box-sizing:border-box}.app-service :where(h1,h2,h3,p,figure,ol,ul,dl,dd){margin:0}.app-service h1,.app-service h2{font-family:var(--font-serif,"SimSun",serif);font-weight:600;line-height:1.45;color:var(--ap-ink)}.app-service h3{font-size:20px;font-weight:600;line-height:1.5;color:var(--ap-ink)}.app-service a{color:inherit;text-decoration:none;transition:color .2s,background .2s}.app-service a:focus-visible,.app-service summary:focus-visible{outline:3px solid var(--ap-blue);outline-offset:5px}.app-service [id]{scroll-margin-top:100px}.app-service nav{height:auto;line-height:inherit;background:transparent;box-shadow:none;color:inherit}.app-service svg{stroke:currentColor;stroke-width:1.35;fill:none;stroke-linecap:round;stroke-linejoin:round}.ap-wrap{width:100%;max-width:1280px;padding:0 32px;margin:0 auto}.ap-skip{position:fixed;top:-100px;left:20px;z-index:1100;padding:12px 20px;background:#fff}.ap-skip:focus{top:85px}.ap-kicker{font-size:12px;font-weight:500;letter-spacing:1.5px;color:var(--ap-blue);line-height:1.7} +.ap-hero{padding:100px 0 48px}.ap-crumb{display:flex;align-items:center;gap:13px;font-size:12px;color:var(--ap-copy);margin-bottom:34px}.ap-crumb a{display:inline-flex;align-items:center;min-height:44px;color:var(--ap-copy)}.ap-crumb a:hover{color:var(--ap-blue)}.ap-crumb>span:not([aria-current]){color:#94a3b8}.ap-hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:8%;align-items:center}.app-service h1{font-size:clamp(40px,4.1vw,60px);letter-spacing:1px;margin:19px 0 23px}.app-service h1 span{color:var(--ap-blue)}.ap-lead{font-size:16px;color:var(--ap-copy);line-height:1.95;max-width:475px}.ap-actions{display:flex;align-items:center;gap:28px;flex-wrap:wrap;margin-top:28px}.app-service .ap-btn{display:inline-flex;justify-content:center;align-items:center;gap:29px;min-height:50px;padding:12px 23px;border-radius:4px;background:var(--ap-blue);color:#fff;font-size:14px;cursor:pointer}.app-service .ap-btn:hover{background:#1d4ed8}.ap-btn>span{font-size:20px;line-height:1}.app-service .ap-link{display:inline-flex;align-items:center;gap:14px;min-height:44px;font-size:13px;color:var(--ap-copy)}.app-service .ap-link:hover{color:var(--ap-blue)}.ap-hero-note{font-size:12px;color:var(--ap-muted);letter-spacing:.5px;margin-top:27px!important}.ap-hero-art{position:relative;overflow:hidden;border-radius:4px;background:var(--ap-soft)}.ap-hero-art picture{display:block}.ap-hero-art img{display:block;width:100%;height:auto;aspect-ratio:1.06;object-fit:cover}.ap-hero-art figcaption{position:absolute;bottom:0;left:0;width:100%;display:flex;justify-content:space-between;gap:20px;padding:20px 24px;font-size:10px;letter-spacing:1.3px;color:var(--ap-copy);background:linear-gradient(transparent,#f8fafcf0)} +.ap-index{border-top:1px solid var(--ap-line);border-bottom:1px solid var(--ap-line);padding:10px 0}.ap-index nav{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}.ap-index a{display:inline-flex;align-items:center;gap:12px;min-height:48px;font-size:13px;color:var(--ap-copy)}.ap-index a>span{font-size:11px;color:var(--ap-blue)}.ap-index a:hover{color:var(--ap-blue)}.ap-section{padding:94px 0}.ap-soft{background:var(--ap-soft)}.ap-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:60px;margin-bottom:42px}.app-service h2{font-size:34px;letter-spacing:.4px}.ap-heading h2{margin-top:14px}.ap-heading>p{font-size:14px;color:var(--ap-copy);line-height:1.95;max-width:335px} +.ap-platforms{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.ap-platforms article{border-top:1px solid #cad7e8;padding-top:24px}.ap-platform-top{display:flex;justify-content:space-between;align-items:center;color:var(--ap-blue);margin-bottom:21px}.ap-platform-top>span{font-size:12px}.ap-platform-top svg{width:36px;height:36px}.ap-platforms h3{font-size:23px}.ap-platforms article>p{font-size:15px;color:var(--ap-copy);line-height:1.9;margin-top:15px;min-height:86px}.ap-platforms dl{border-top:1px solid var(--ap-line);padding-top:17px;margin-top:24px}.ap-platforms dl>div{margin-top:13px}.ap-platforms dl>div:first-child{margin-top:0}.ap-platforms dt{font-size:11px;color:var(--ap-muted);letter-spacing:1px;font-weight:400;margin-bottom:4px}.ap-platforms dd{font-size:13px;color:var(--ap-copy);line-height:1.85}.ap-selection-note{font-size:12px;color:var(--ap-muted);border-top:1px solid var(--ap-line);margin-top:32px!important;padding-top:20px} +.ap-scenarios{border-top:1px solid var(--ap-line)}.ap-scenarios article{display:grid;grid-template-columns:40px 1fr 220px;gap:28px;align-items:center;padding:27px 0;border-bottom:1px solid var(--ap-line)}.ap-scenarios article>span:first-child{font-family:Georgia,serif;font-size:17px;color:var(--ap-blue);align-self:start;padding-top:3px}.ap-scenarios h3{font-size:21px;margin-bottom:9px}.ap-scenarios p{font-size:14px;line-height:1.95;color:var(--ap-copy);max-width:670px}.ap-tags{font-size:12px;color:var(--ap-copy);padding-left:28px;border-left:1px solid var(--ap-line)} +.ap-capabilities{display:grid;grid-template-columns:1fr 1fr;gap:9%;align-items:center}.ap-foundation{position:relative;border-radius:4px;background:var(--ap-soft);overflow:hidden}.ap-foundation picture{display:block}.ap-foundation img{display:block;width:100%;height:auto;aspect-ratio:1.1;object-fit:contain}.ap-foundation figcaption{position:absolute;left:20px;bottom:20px;padding:9px 14px;border-radius:4px;background:#fffffff0;font-size:11px;letter-spacing:1px;color:var(--ap-copy)}.ap-capabilities h2{font-size:33px;margin:14px 0 23px}.ap-capability-list article{padding:18px 0;border-top:1px solid var(--ap-line)}.ap-capability-list article:last-child{padding-bottom:0}.ap-capability-list h3{font-size:17px;margin-bottom:7px}.ap-capability-list p{font-size:14px;color:var(--ap-copy);line-height:1.9}.ap-engineering-note{display:grid;grid-template-columns:1fr 2fr;gap:50px;border-top:1px solid var(--ap-line);padding-top:25px;margin-top:39px}.ap-engineering-note strong{font-size:16px;font-weight:500}.ap-engineering-note p{font-size:14px;color:var(--ap-copy);line-height:1.9} +.ap-process{display:grid;grid-template-columns:repeat(5,1fr);list-style:none;padding:0;gap:27px}.ap-process li{border-top:1px solid #c7d5e7;padding-top:20px}.ap-process li>span{font-family:Georgia,serif;font-size:17px;color:var(--ap-blue)}.ap-process h3{font-size:18px;margin:20px 0 12px}.ap-process p{font-size:14px;color:var(--ap-copy);line-height:1.9}.ap-process small{display:block;font-size:11px;color:var(--ap-muted);margin-top:19px}.ap-delivery{display:grid;grid-template-columns:1.1fr 1fr;gap:45px;background:#fff;border:1px solid var(--ap-line);border-radius:4px;padding:31px 34px;margin-top:42px}.ap-delivery h3{font-size:20px;margin:10px 0 12px}.ap-delivery p:not(.ap-kicker){font-size:12px;color:var(--ap-muted)}.ap-delivery ul{display:grid;grid-template-columns:1fr 1fr;align-content:center;gap:17px 20px;list-style:none;padding:0}.ap-delivery li{font-size:12px;color:var(--ap-copy);border-left:2px solid #c2d4f5;padding-left:12px}.ap-publish-note{display:grid;grid-template-columns:1fr 3fr;gap:35px;margin-top:24px}.ap-publish-note h3{font-size:14px;font-weight:500}.ap-publish-note p{font-size:12px;color:var(--ap-copy);line-height:1.95} +.ap-faq-grid{display:grid;grid-template-columns:4fr 7fr;gap:8%}.ap-faq-grid h2{margin-top:14px}.ap-faq-intro{font-size:14px;color:var(--ap-copy);max-width:260px;margin-top:20px!important}.ap-faq-list{border-top:1px solid var(--ap-line)}.ap-faq-list details{border-bottom:1px solid var(--ap-line)}.ap-faq-list summary{display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:76px;padding:20px 0;list-style:none;cursor:pointer;font-size:16px;font-weight:500}.ap-faq-list summary::-webkit-details-marker{display:none}.ap-faq-list summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.ap-faq-list summary>span:before,.ap-faq-list summary>span:after{content:"";position:absolute;left:2px;top:8px;width:12px;height:1px;background:var(--ap-blue)}.ap-faq-list summary>span:after{transform:rotate(90deg);transition:transform .2s}.ap-faq-list details[open] summary>span:after{transform:rotate(0)}.ap-faq-list details p{font-size:14px;color:var(--ap-copy);line-height:1.95;padding:0 25px 25px 0} +.ap-contact{background:#eef3fb;border-top:1px solid #dce5f2;padding:56px 0}.ap-contact>.ap-wrap{display:flex;align-items:center;justify-content:space-between;gap:60px}.ap-contact h2{font-size:30px;max-width:710px;margin:14px 0 18px}.ap-contact p:not(.ap-kicker){font-size:14px;color:var(--ap-copy);line-height:1.9}.ap-contact>.ap-wrap>div:last-child{display:flex;flex-direction:column;align-items:flex-start;gap:12px;flex-shrink:0}.ap-contact .ap-link{display:flex;flex-direction:column;align-items:flex-start;gap:1px;font-size:12px}.ap-contact .ap-link>span{font-size:16px;color:var(--ap-ink);letter-spacing:.5px} +.ap-mobile-header{position:fixed;z-index:1000;top:0;left:0;width:100%;height:68px;background:#fffffff5;border-bottom:1px solid var(--ap-line);display:flex;align-items:center;gap:24px;padding:0 22px}.app-service .ap-brand{font-family:var(--font-serif,"SimSun",serif);font-size:23px;font-weight:600;letter-spacing:2px;line-height:1.2;display:flex;flex-direction:column;justify-content:center;min-height:44px;margin-right:auto}.ap-brand>span{font-family:var(--font-sans,sans-serif);font-size:8px;font-weight:500;letter-spacing:1.5px;color:var(--ap-muted);margin-top:5px}.app-service .ap-header-contact{font-size:12px;color:var(--ap-blue);min-height:44px;display:flex;align-items:center}.ap-menu summary{display:flex;align-items:center;gap:7px;min-height:44px;cursor:pointer;list-style:none;font-size:12px}.ap-menu summary::-webkit-details-marker{display:none}.ap-menu svg{width:20px;height:20px;stroke-width:1.5}.app-service .ap-menu nav{position:absolute;top:67px;left:0;width:100%;display:grid;grid-template-columns:1fr 1fr;gap:0 28px;padding:14px 22px 22px;background:#fff;box-shadow:0 18px 30px #0f172a0d;border-bottom:1px solid var(--ap-line)}.ap-menu nav a{display:flex;align-items:center;min-height:52px;border-bottom:1px solid var(--ap-line);font-size:15px;color:var(--ap-copy)}.app-service .ap-menu nav a[aria-current]{color:var(--ap-blue)} +@media(max-width:1023px){.ap-hero-grid{gap:35px}.app-service h1{font-size:43px}.ap-hero-art img{aspect-ratio:.9}.ap-heading{gap:35px}.app-service h2{font-size:29px}.ap-heading>p{max-width:280px}.ap-platforms{gap:25px}.ap-platforms h3{font-size:20px}.ap-platforms article>p{min-height:115px}.ap-scenarios article{grid-template-columns:30px 1fr 175px;gap:20px}.ap-capabilities{gap:35px}.ap-capabilities h2{font-size:28px}.ap-foundation img{aspect-ratio:1.05}.ap-process{grid-template-columns:repeat(3,1fr);gap:35px}.ap-delivery{grid-template-columns:1fr;gap:24px}.ap-faq-grid{gap:35px}.ap-contact h2{font-size:27px}} +@media(max-width:767px){.ap-wrap{padding:0 22px}.ap-hero{padding-top:87px;padding-bottom:28px}.ap-crumb{margin-bottom:25px;gap:10px;font-size:11px;flex-wrap:wrap}.ap-hero-grid{grid-template-columns:1fr;gap:28px}.ap-kicker{font-size:11px;letter-spacing:1px}.app-service h1{font-size:40px;margin:15px 0 21px;letter-spacing:.5px}.ap-lead{font-size:16px;line-height:1.9;max-width:none}.ap-actions{margin-top:24px;gap:21px}.app-service .ap-btn{padding:12px 20px;gap:23px;font-size:14px;min-height:50px}.ap-hero-note{font-size:12px;margin-top:21px!important}.ap-hero-art img{aspect-ratio:1.2;object-position:50% 55%}.ap-hero-art figcaption{padding:17px 18px;font-size:9px;letter-spacing:.6px}.ap-index{padding:8px 0}.ap-index nav{gap:0 23px;justify-content:flex-start}.ap-index a{min-height:44px;font-size:12px;gap:7px}.ap-index a>span{font-size:10px}.ap-section{padding:58px 0}.ap-heading{display:block;margin-bottom:30px}.app-service h2{font-size:28px;letter-spacing:0}.ap-heading h2{margin-top:13px}.ap-heading>p{max-width:none;font-size:16px;margin-top:17px}.ap-platforms{grid-template-columns:1fr;gap:30px}.ap-platforms article{padding-top:22px}.ap-platform-top{margin-bottom:17px}.ap-platforms h3{font-size:23px}.ap-platforms article>p{min-height:0;font-size:16px;line-height:1.9;margin-top:12px}.ap-platforms dl{display:grid;grid-template-columns:1fr 1fr;gap:20px;padding-top:15px;margin-top:21px}.ap-platforms dl>div{margin:0}.ap-platforms dt{font-size:12px}.ap-platforms dd{font-size:14px}.ap-selection-note{font-size:13px;line-height:1.9;padding-top:18px;margin-top:26px!important}.ap-scenarios article{grid-template-columns:24px 1fr;gap:12px 17px;padding:25px 0}.ap-scenarios h3{font-size:20px;margin-bottom:10px}.ap-scenarios p{font-size:16px;line-height:1.85}.ap-tags{grid-column:2;font-size:12px;padding:0;border:0}.ap-capabilities{grid-template-columns:1fr;gap:30px}.ap-capabilities>div{grid-row:1}.ap-capabilities h2{font-size:28px;margin:13px 0 23px}.ap-capabilities h2 br{display:none}.ap-capability-list article{padding:19px 0}.ap-capability-list h3{font-size:18px;margin-bottom:8px}.ap-capability-list p{font-size:16px;line-height:1.85}.ap-foundation img{aspect-ratio:1.15;object-fit:contain}.ap-foundation figcaption{font-size:10px;left:15px;bottom:15px;padding:8px 11px}.ap-engineering-note{grid-template-columns:1fr;gap:12px;margin-top:28px;padding-top:21px}.ap-engineering-note strong{font-size:16px}.ap-engineering-note p{font-size:15px}.ap-process{grid-template-columns:1fr;gap:0}.ap-process li{display:grid;grid-template-columns:25px 1fr;gap:9px 17px;padding:22px 0}.ap-process li>span{font-size:16px;grid-row:1/4}.ap-process h3{font-size:19px;margin:0}.ap-process p{font-size:16px;line-height:1.85}.ap-process small{font-size:12px;margin-top:4px}.ap-delivery{padding:24px;gap:23px;margin-top:19px}.ap-delivery h3{font-size:20px;line-height:1.6}.ap-delivery p:not(.ap-kicker){font-size:13px;line-height:1.85}.ap-delivery ul{grid-template-columns:1fr;gap:14px}.ap-delivery li{font-size:14px}.ap-publish-note{grid-template-columns:1fr;gap:12px;margin-top:23px}.ap-publish-note h3{font-size:16px}.ap-publish-note p{font-size:14px}.ap-faq-grid{grid-template-columns:1fr;gap:28px}.ap-faq-intro{font-size:16px;max-width:none;margin-top:16px!important}.ap-faq-list summary{font-size:16px;min-height:75px}.ap-faq-list details p{font-size:16px;line-height:1.9;padding-right:15px}.ap-contact{padding:43px 0}.ap-contact>.ap-wrap{display:block}.ap-contact h2{font-size:28px}.ap-contact p:not(.ap-kicker){font-size:16px}.ap-contact>.ap-wrap>div:last-child{margin-top:24px;gap:15px}.ap-contact .ap-link{font-size:13px}.ap-contact .ap-link>span{font-size:17px}} +@media(max-width:374px){.ap-wrap{padding:0 18px}.app-service h1{font-size:35px}.ap-actions{gap:14px}.app-service .ap-btn{padding:12px 17px;gap:17px}.ap-platforms dl{grid-template-columns:1fr;gap:14px}} +@media(prefers-reduced-motion:reduce){html:has(.app-service){scroll-behavior:auto}.app-service *{transition:none!important;animation:none!important;scroll-behavior:auto!important}} diff --git a/public/assets/addons/official/css/service-software-v2.css b/public/assets/addons/official/css/service-software-v2.css new file mode 100644 index 0000000..7aa5725 --- /dev/null +++ b/public/assets/addons/official/css/service-software-v2.css @@ -0,0 +1,15 @@ +.sw2{--sw-blue:#2563eb;--sw-ink:#0f172a;--sw-copy:#475569;--sw-muted:#64748b;--sw-line:#dce4ed;--sw-soft:#f8fafc;color:var(--sw-ink);background:#fff;font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.8;overflow-wrap:break-word} +.sw2 *{box-sizing:border-box}.sw2 :where(h1,h2,h3,h4,p,ul,ol,dl,dd,figure){margin:0}.sw2 :where(ul,ol){padding:0;list-style:none}.sw2 a{color:inherit;text-decoration:none}.sw2 a:focus-visible,.sw2 summary:focus-visible{outline:3px solid var(--sw-blue);outline-offset:4px}.sw2 :where(h1,h2){font-family:var(--font-serif,"SimSun",serif);color:var(--sw-ink);font-weight:600;line-height:1.45}.sw2 :where(h3,h4){font-family:var(--font-sans,"Microsoft YaHei",sans-serif);color:var(--sw-ink);line-height:1.5;font-weight:600}.sw2 nav{height:auto;line-height:inherit;background:none;box-shadow:none;color:inherit}.sw2 [id]{scroll-margin-top:155px}.sw2-wrap{max-width:1280px;margin:0 auto;width:100%;padding:0 32px}.sw2-eyebrow{font-size:12px;color:var(--sw-blue);letter-spacing:1px}.sw2-skip{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.sw2-skip:focus{position:fixed;top:80px;left:20px;z-index:1100;width:auto;height:auto;clip-path:none;background:#fff;padding:12px 20px} +.sw2-hero{padding:92px 0 32px}.sw2-crumb{display:flex;gap:12px;align-items:center;font-size:12px;color:var(--sw-copy);margin-bottom:20px}.sw2-crumb a{min-height:44px;display:inline-flex;align-items:center}.sw2-hero-grid{display:grid;grid-template-columns:1fr 1.05fr;gap:55px;align-items:center}.sw2 h1{font-size:46px;letter-spacing:.5px;margin:12px 0 19px}.sw2-lead{max-width:510px;font-size:16px;line-height:1.95;color:var(--sw-copy)}.sw2-actions{display:flex;gap:25px;align-items:center;flex-wrap:wrap;margin-top:25px}.sw2 .sw2-button{display:inline-flex;justify-content:center;align-items:center;gap:30px;min-height:50px;padding:12px 23px;border-radius:4px;color:#fff;background:var(--sw-blue);font-size:14px;transition:background .2s}.sw2-button>span{font-size:20px;line-height:1}.sw2 .sw2-button:hover{background:#1d4ed8}.sw2 .sw2-button:active{background:#1e40af}.sw2 .sw2-text-link{min-height:44px;display:inline-flex;gap:15px;align-items:center;font-size:13px;color:var(--sw-copy)}.sw2 .sw2-text-link:hover{color:var(--sw-blue)}.sw2-hero-points{display:flex;flex-wrap:wrap;gap:5px 20px;margin-top:24px!important;color:var(--sw-muted);font-size:12px}.sw2-hero-points li{padding-left:10px;position:relative}.sw2-hero-points li:before{content:"";position:absolute;left:0;top:10px;width:3px;height:3px;background:var(--sw-blue)}.sw2-hero-art{border:1px solid #e8e6e2;border-radius:4px;overflow:hidden;background:#f4f1ed}.sw2-hero-art picture,.sw2-layer-art picture{display:block}.sw2-hero-art img{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:cover}.sw2-hero-art figcaption{display:flex;justify-content:space-between;align-items:center;gap:20px;padding:11px 18px;background:#fff;color:var(--sw-copy);font-size:11px;border-top:1px solid #e8e6e2}.sw2-hero-art figcaption>span:last-child{font-size:10px;color:var(--sw-muted)} +.sw2-index{position:sticky;top:76px;z-index:90;background:#fffffff5;border-top:1px solid var(--sw-line);border-bottom:1px solid var(--sw-line)}.sw2-index nav{display:flex;align-items:center;justify-content:space-between;gap:16px}.sw2-index a{display:flex;align-items:center;gap:15px;min-height:57px;font-size:13px;white-space:nowrap}.sw2-index a>span{font-family:Georgia,serif;color:var(--sw-muted);font-size:12px}.sw2-index a:hover{color:var(--sw-blue)} +.sw2-section{padding:46px 0}.sw2-soft{background:var(--sw-soft);border-top:1px solid var(--sw-line);border-bottom:1px solid var(--sw-line)}.sw2-heading{display:flex;justify-content:space-between;align-items:end;gap:45px;margin-bottom:28px}.sw2 h2{font-size:32px;letter-spacing:.3px}.sw2-heading h2{margin-top:9px}.sw2-heading>p{max-width:380px;color:var(--sw-copy);font-size:14px;line-height:1.9}.sw2-service-grid{display:grid;grid-template-columns:1fr 1fr;column-gap:45px}.sw2-service-grid article{display:grid;grid-template-columns:32px 1fr;gap:16px;padding:24px 0;border-top:1px solid var(--sw-line)}.sw2-number{font-family:Georgia,serif;font-size:14px;color:var(--sw-blue);padding-top:3px}.sw2-service-grid h3{font-size:21px;margin-bottom:9px}.sw2-service-grid article p{font-size:14px;color:var(--sw-copy);line-height:1.9}.sw2-service-grid small{display:block;font-size:12px;color:var(--sw-muted);margin-top:12px}.sw2-scenarios{display:flex;align-items:center;gap:25px;border-top:1px solid var(--sw-line);padding-top:17px;margin-top:1px}.sw2-scenarios h3{font-size:13px;white-space:nowrap}.sw2-scenarios p{font-size:12px;color:var(--sw-copy);margin-right:auto}.sw2-scenarios p>span{margin:0 13px;color:#94a3b8}.sw2-scenarios .sw2-text-link{white-space:nowrap;font-size:12px} +.sw2-engineering{display:grid;grid-template-columns:.9fr 1.1fr;gap:50px;align-items:center}.sw2-layer-art{min-width:0}.sw2-layer-art img{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:cover;border-radius:4px}.sw2-layer-art figcaption{display:flex;justify-content:space-between;gap:20px;color:var(--sw-copy);font-size:12px;padding-top:13px}.sw2-layer-art figcaption>span{font-size:10px;color:var(--sw-muted)}.sw2-capability-list article{display:grid;grid-template-columns:25px 1fr;gap:18px;padding:17px 0;border-top:1px solid var(--sw-line)}.sw2-capability-list article:first-child{padding-top:0;border-top:0}.sw2-capability-list article:last-child{padding-bottom:0}.sw2-capability-list article>span{font-family:Georgia,serif;color:var(--sw-blue);font-size:12px;padding-top:2px}.sw2-capability-list h3{font-size:17px;margin-bottom:6px}.sw2-capability-list p{font-size:14px;line-height:1.9;color:var(--sw-copy)} +.sw2-process{display:grid;grid-template-columns:repeat(4,1fr);gap:30px}.sw2-process li{padding-top:16px;border-top:2px solid var(--sw-blue)}.sw2-process li>span{font-size:12px;color:var(--sw-blue)}.sw2-process h3{font-size:18px;margin:13px 0 9px}.sw2-process p{font-size:14px;color:var(--sw-copy);line-height:1.9}.sw2-process small{display:block;margin-top:17px;font-size:11px;color:var(--sw-muted)} +.sw2-handover{display:grid;grid-template-columns:1.5fr 1fr;gap:55px}.sw2-deliverables>div{display:grid;grid-template-columns:190px 1fr;gap:25px;padding:21px 0;border-top:1px solid var(--sw-line)}.sw2-deliverables>div:last-child{border-bottom:1px solid var(--sw-line)}.sw2-deliverables dt{display:flex;gap:18px;align-items:baseline;font-size:15px;font-weight:500}.sw2-deliverables dt>span{font-size:12px;font-family:Georgia,serif;color:var(--sw-blue)}.sw2-deliverables dd{font-size:14px;color:var(--sw-copy);line-height:1.9}.sw2-deployment{padding:25px 28px;background:#fff;border:1px solid var(--sw-line);border-radius:4px;align-self:start}.sw2-deployment h3{font-size:21px;margin:10px 0}.sw2-deployment p:not(.sw2-eyebrow){font-size:14px;color:var(--sw-copy);line-height:1.9}.sw2-deployment>div{border-top:1px solid var(--sw-line);padding-top:16px;margin-top:17px}.sw2-deployment h4{font-size:14px;margin-bottom:7px} +.sw2-faq-layout{display:grid;grid-template-columns:1fr 1.65fr;gap:70px}.sw2-faq-layout h2{margin-top:10px}.sw2-faq-note{font-size:14px;color:var(--sw-copy);margin-top:15px!important;max-width:290px}.sw2-faq details{border-top:1px solid var(--sw-line)}.sw2-faq details:last-child{border-bottom:1px solid var(--sw-line)}.sw2-faq summary{display:flex;justify-content:space-between;align-items:center;gap:25px;min-height:63px;font-size:15px;font-weight:500;list-style:none;cursor:pointer;padding:14px 0}.sw2-faq summary::-webkit-details-marker,.sw2-menu summary::-webkit-details-marker{display:none}.sw2-faq summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.sw2-faq summary>span:before,.sw2-faq summary>span:after{position:absolute;content:"";left:2px;top:8px;width:12px;height:1px;background:var(--sw-blue)}.sw2-faq summary>span:after{transform:rotate(90deg);transition:transform .2s}.sw2-faq details[open] summary>span:after{transform:rotate(0)}.sw2-faq details>p{font-size:14px;color:var(--sw-copy);line-height:1.95;padding:0 30px 20px 0} +.sw2-contact{padding:35px 0;background:var(--sw-soft);border-top:1px solid var(--sw-line)}.sw2-contact>.sw2-wrap{display:flex;justify-content:space-between;align-items:center;gap:45px}.sw2-contact h2{margin:10px 0}.sw2-contact p:not(.sw2-eyebrow){font-size:14px;color:var(--sw-copy)}.sw2-contact>.sw2-wrap>div:last-child{display:flex;flex-direction:column;gap:9px;align-items:flex-start;flex-shrink:0}.sw2-contact .sw2-text-link{font-size:12px} +.sw2-mobile-header{position:fixed;top:0;left:0;width:100%;height:68px;z-index:1000;display:flex;align-items:center;gap:24px;padding:0 22px;background:#fffffff5;border-bottom:1px solid var(--sw-line)}.sw2 .sw2-brand{font-family:var(--font-serif,"SimSun",serif);font-size:23px;line-height:1.2;font-weight:600;letter-spacing:2px;display:flex;flex-direction:column;justify-content:center;min-height:44px;margin-right:auto}.sw2-brand>span{font-family:var(--font-sans,sans-serif);font-size:8px;letter-spacing:1.5px;font-weight:500;color:var(--sw-muted);margin-top:5px}.sw2 .sw2-header-contact{min-height:44px;display:flex;align-items:center;color:var(--sw-blue);font-size:12px}.sw2-menu summary{display:flex;align-items:center;gap:7px;min-height:44px;list-style:none;cursor:pointer;font-size:12px}.sw2-menu svg{width:20px;height:20px;stroke:currentColor;stroke-width:1.5;fill:none}.sw2 .sw2-menu nav{position:absolute;top:67px;left:0;width:100%;display:grid;grid-template-columns:1fr 1fr;gap:0 28px;padding:14px 22px 22px;background:#fff;border-bottom:1px solid var(--sw-line);box-shadow:0 18px 30px #0f172a0d}.sw2-menu nav a{min-height:52px;display:flex;align-items:center;border-bottom:1px solid var(--sw-line);font-size:15px;color:var(--sw-copy)}.sw2 .sw2-menu nav a[aria-current]{color:var(--sw-blue)} +@media(max-width:1100px){.sw2-hero-grid{gap:30px}.sw2 h1{font-size:39px}.sw2-heading{gap:30px}.sw2-heading>p{max-width:320px}.sw2 h2{font-size:29px}.sw2-service-grid{column-gap:30px}.sw2-scenarios{flex-wrap:wrap;gap:8px 25px}.sw2-engineering{gap:30px}.sw2-process{gap:22px}.sw2-process h3{font-size:17px}.sw2-handover{gap:30px;grid-template-columns:1.3fr 1fr}.sw2-deliverables>div{grid-template-columns:1fr;gap:9px}.sw2-faq-layout{gap:40px}} +@media(max-width:767px){.sw2-wrap{padding:0 22px}.sw2 [id]{scroll-margin-top:85px}.sw2-hero{padding:84px 0 25px}.sw2-crumb{font-size:12px;margin-bottom:15px;gap:10px}.sw2-hero-grid{grid-template-columns:1fr;gap:25px}.sw2-eyebrow{font-size:11px}.sw2 h1{font-size:35px;margin:11px 0 16px;line-height:1.5;letter-spacing:0}.sw2-lead{font-size:16px;line-height:1.85}.sw2-actions{gap:16px;margin-top:20px}.sw2 .sw2-button{padding:12px 20px;gap:23px}.sw2-hero-points{gap:5px 15px;margin-top:17px!important;font-size:11px}.sw2-hero-art figcaption{font-size:11px;padding:10px 13px;gap:15px}.sw2-hero-art figcaption>span:last-child{font-size:10px}.sw2-index{position:static}.sw2-index nav{justify-content:flex-start;flex-wrap:wrap;gap:0 22px;padding-top:5px;padding-bottom:5px}.sw2-index a{min-height:44px;gap:8px;font-size:12px}.sw2-index a>span{font-size:10px}.sw2-section{padding:30px 0}.sw2-heading{display:block;margin-bottom:22px}.sw2 h2{font-size:27px}.sw2-heading h2{margin-top:9px}.sw2-heading>p{max-width:none;font-size:16px;line-height:1.85;margin-top:13px}.sw2-service-grid{grid-template-columns:1fr}.sw2-service-grid article{gap:14px;grid-template-columns:25px 1fr;padding:20px 0}.sw2-service-grid h3{font-size:21px}.sw2-service-grid article p{font-size:16px;line-height:1.85}.sw2-service-grid small{font-size:12px;line-height:1.9;margin-top:11px}.sw2-scenarios{display:block;padding-top:20px}.sw2-scenarios h3{font-size:14px}.sw2-scenarios p{font-size:13px;line-height:2;margin-top:9px}.sw2-scenarios p>span{margin:0 8px}.sw2-scenarios .sw2-text-link{margin-top:4px}.sw2-engineering{grid-template-columns:1fr;gap:25px}.sw2-layer-art figcaption{font-size:11px}.sw2-capability-list article{padding:18px 0;gap:14px}.sw2-capability-list h3{font-size:18px}.sw2-capability-list p{font-size:16px;line-height:1.85}.sw2-process{grid-template-columns:1fr;gap:24px}.sw2-process li{padding-top:14px}.sw2-process h3{font-size:20px;margin:9px 0}.sw2-process p{font-size:16px;line-height:1.85}.sw2-process small{font-size:12px;margin-top:11px}.sw2-handover{grid-template-columns:1fr;gap:23px}.sw2-deliverables>div{padding:19px 0;gap:9px}.sw2-deliverables dt{font-size:16px;gap:15px}.sw2-deliverables dd{font-size:16px;line-height:1.85}.sw2-deployment{padding:22px}.sw2-deployment p:not(.sw2-eyebrow){font-size:16px;line-height:1.85}.sw2-deployment h4{font-size:16px}.sw2-faq-layout{grid-template-columns:1fr;gap:23px}.sw2-faq-layout h2 br{display:none}.sw2-faq-note{max-width:none;font-size:16px;margin-top:12px!important}.sw2-faq summary{font-size:16px;min-height:64px;gap:20px}.sw2-faq details>p{font-size:16px;line-height:1.85;padding:0 0 20px}.sw2-contact{padding:28px 0}.sw2-contact>.sw2-wrap{display:block}.sw2-contact h2{font-size:27px}.sw2-contact p:not(.sw2-eyebrow){font-size:16px;line-height:1.85}.sw2-contact>.sw2-wrap>div:last-child{margin-top:20px}.sw2-contact .sw2-text-link{font-size:13px}} +@media(max-width:374px){.sw2-wrap{padding:0 18px}.sw2 h1{font-size:32px}.sw2-actions{gap:8px 15px}.sw2-index nav{gap:0 15px}.sw2-hero-points{gap:6px 12px;font-size:10px}} +@media(prefers-reduced-motion:reduce){html:has(.sw2){scroll-behavior:auto}.sw2 *{animation:none!important;transition:none!important;scroll-behavior:auto!important}} diff --git a/public/assets/addons/official/css/service-software.css b/public/assets/addons/official/css/service-software.css new file mode 100644 index 0000000..737ff92 --- /dev/null +++ b/public/assets/addons/official/css/service-software.css @@ -0,0 +1,19 @@ +/* 软件开发服务:独立作用域,共用桌面与移动内容模板。 */ +.software-service{--sw-blue:#2563eb;--sw-ink:#0f172a;--sw-copy:#475569;--sw-muted:#64748b;--sw-line:#dce4ed;--sw-soft:#f8fafc;background:#fff;color:var(--sw-ink);font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.8;overflow-wrap:break-word;-webkit-font-smoothing:antialiased}.software-service *{box-sizing:border-box}.software-service :where(h1,h2,h3,p,figure,ol,ul,dl,dd){margin:0}.software-service h1,.software-service h2{font-family:var(--font-serif,"SimSun",serif);font-weight:600;line-height:1.45;color:var(--sw-ink)}.software-service h3{font-size:20px;font-weight:600;line-height:1.5;color:var(--sw-ink)}.software-service a{color:inherit;text-decoration:none;transition:color .2s,background .2s}.software-service a:focus-visible,.software-service summary:focus-visible{outline:3px solid var(--sw-blue);outline-offset:5px}.software-service [id]{scroll-margin-top:100px}.software-service nav{height:auto;line-height:inherit;background:transparent;box-shadow:none;color:inherit}.software-service svg{stroke:currentColor;stroke-width:1.35;fill:none;stroke-linecap:round;stroke-linejoin:round}.sw-wrap{width:100%;max-width:1280px;padding:0 32px;margin:0 auto}.sw-skip{position:fixed;top:-100px;left:20px;z-index:1100;padding:12px 20px;background:#fff}.sw-skip:focus{top:85px}.sw-kicker{font-size:12px;font-weight:500;letter-spacing:1.5px;color:var(--sw-blue);line-height:1.7} +.sw-hero{padding:100px 0 48px}.sw-crumb{display:flex;align-items:center;gap:13px;font-size:12px;color:var(--sw-copy);margin-bottom:34px}.sw-crumb a{display:inline-flex;align-items:center;min-height:44px;color:var(--sw-copy)}.sw-crumb a:hover{color:var(--sw-blue)}.sw-crumb>span:not([aria-current]){color:#94a3b8}.sw-hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:8%;align-items:center}.software-service h1{font-size:clamp(40px,4.1vw,60px);letter-spacing:1px;margin:19px 0 23px}.software-service h1 span{color:var(--sw-blue)}.sw-lead{font-size:16px;color:var(--sw-copy);line-height:1.95;max-width:475px}.sw-actions{display:flex;align-items:center;gap:28px;flex-wrap:wrap;margin-top:28px}.software-service .sw-btn{display:inline-flex;justify-content:center;align-items:center;gap:29px;min-height:50px;padding:12px 23px;border-radius:4px;background:var(--sw-blue);color:#fff;font-size:14px;cursor:pointer}.software-service .sw-btn:hover{background:#1d4ed8}.sw-btn>span{font-size:20px;line-height:1}.software-service .sw-link{display:inline-flex;align-items:center;gap:14px;min-height:44px;font-size:13px;color:var(--sw-copy)}.software-service .sw-link:hover{color:var(--sw-blue)}.sw-hero-note{font-size:12px;color:var(--sw-muted);letter-spacing:.5px;margin-top:27px!important}.sw-hero-art{position:relative;overflow:hidden;border-radius:4px;background:var(--sw-soft)}.sw-hero-art picture{display:block}.sw-hero-art img{display:block;width:100%;height:auto;aspect-ratio:1.06;object-fit:contain}.sw-hero-art figcaption{position:absolute;bottom:0;left:0;width:100%;display:flex;justify-content:space-between;gap:20px;padding:20px 24px;font-size:10px;letter-spacing:1.3px;color:var(--sw-copy);background:linear-gradient(transparent,#f8fafcf0)} +.sw-index{border-top:1px solid var(--sw-line);border-bottom:1px solid var(--sw-line);padding:10px 0}.sw-index nav{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}.sw-index a{display:inline-flex;align-items:center;gap:12px;min-height:48px;font-size:13px;color:var(--sw-copy)}.sw-index a>span{font-size:11px;color:var(--sw-blue)}.sw-index a:hover{color:var(--sw-blue)}.sw-section{padding:94px 0}.sw-soft{background:var(--sw-soft)}.sw-heading{display:flex;justify-content:space-between;align-items:flex-end;gap:60px;margin-bottom:42px}.software-service h2{font-size:34px;letter-spacing:.4px}.sw-heading h2{margin-top:14px}.sw-heading>p{font-size:14px;color:var(--sw-copy);line-height:1.95;max-width:335px} + + +.sw-capabilities{display:grid;grid-template-columns:1fr 1fr;gap:9%;align-items:center}.sw-foundation{position:relative;border-radius:4px;background:var(--sw-soft);overflow:hidden}.sw-foundation picture{display:block}.sw-foundation img{display:block;width:100%;height:auto;aspect-ratio:1.1;object-fit:contain}.sw-foundation figcaption{position:absolute;left:20px;bottom:20px;padding:9px 14px;border-radius:4px;background:#fffffff0;font-size:11px;letter-spacing:1px;color:var(--sw-copy)}.sw-capabilities h2{font-size:33px;margin:14px 0 23px}.sw-capability-list article{padding:18px 0;border-top:1px solid var(--sw-line)}.sw-capability-list article:last-child{padding-bottom:0}.sw-capability-list h3{font-size:17px;margin-bottom:7px}.sw-capability-list p{font-size:14px;color:var(--sw-copy);line-height:1.9}.sw-engineering-note{display:grid;grid-template-columns:1fr 2fr;gap:50px;border-top:1px solid var(--sw-line);padding-top:25px;margin-top:39px}.sw-engineering-note strong{font-size:16px;font-weight:500}.sw-engineering-note p{font-size:14px;color:var(--sw-copy);line-height:1.9} +.sw-process{display:grid;grid-template-columns:repeat(4,1fr);list-style:none;padding:0;gap:27px}.sw-process li{border-top:1px solid #c7d5e7;padding-top:20px}.sw-process li>span{font-family:Georgia,serif;font-size:17px;color:var(--sw-blue)}.sw-process h3{font-size:18px;margin:20px 0 12px}.sw-process p{font-size:14px;color:var(--sw-copy);line-height:1.9}.sw-process small{display:block;font-size:11px;color:var(--sw-muted);margin-top:19px} +.sw-faq-grid{display:grid;grid-template-columns:4fr 7fr;gap:8%}.sw-faq-grid h2{margin-top:14px}.sw-faq-intro{font-size:14px;color:var(--sw-copy);max-width:260px;margin-top:20px!important}.sw-faq-list{border-top:1px solid var(--sw-line)}.sw-faq-list details{border-bottom:1px solid var(--sw-line)}.sw-faq-list summary{display:flex;align-items:center;justify-content:space-between;gap:20px;min-height:76px;padding:20px 0;list-style:none;cursor:pointer;font-size:16px;font-weight:500}.sw-faq-list summary::-webkit-details-marker{display:none}.sw-faq-list summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.sw-faq-list summary>span:before,.sw-faq-list summary>span:after{content:"";position:absolute;left:2px;top:8px;width:12px;height:1px;background:var(--sw-blue)}.sw-faq-list summary>span:after{transform:rotate(90deg);transition:transform .2s}.sw-faq-list details[open] summary>span:after{transform:rotate(0)}.sw-faq-list details p{font-size:14px;color:var(--sw-copy);line-height:1.95;padding:0 25px 25px 0} +.sw-contact{background:#eef3fb;border-top:1px solid #dce5f2;padding:56px 0}.sw-contact>.sw-wrap{display:flex;align-items:center;justify-content:space-between;gap:60px}.sw-contact h2{font-size:30px;max-width:710px;margin:14px 0 18px}.sw-contact p:not(.sw-kicker){font-size:14px;color:var(--sw-copy);line-height:1.9}.sw-contact>.sw-wrap>div:last-child{display:flex;flex-direction:column;align-items:flex-start;gap:12px;flex-shrink:0}.sw-contact .sw-link{display:flex;flex-direction:column;align-items:flex-start;gap:1px;font-size:12px}.sw-contact .sw-link>span{font-size:16px;color:var(--sw-ink);letter-spacing:.5px} +.sw-mobile-header{position:fixed;z-index:1000;top:0;left:0;width:100%;height:68px;background:#fffffff5;border-bottom:1px solid var(--sw-line);display:flex;align-items:center;gap:24px;padding:0 22px}.software-service .sw-brand{font-family:var(--font-serif,"SimSun",serif);font-size:23px;font-weight:600;letter-spacing:2px;line-height:1.2;display:flex;flex-direction:column;justify-content:center;min-height:44px;margin-right:auto}.sw-brand>span{font-family:var(--font-sans,sans-serif);font-size:8px;font-weight:500;letter-spacing:1.5px;color:var(--sw-muted);margin-top:5px}.software-service .sw-header-contact{font-size:12px;color:var(--sw-blue);min-height:44px;display:flex;align-items:center}.sw-menu summary{display:flex;align-items:center;gap:7px;min-height:44px;cursor:pointer;list-style:none;font-size:12px}.sw-menu summary::-webkit-details-marker{display:none}.sw-menu svg{width:20px;height:20px;stroke-width:1.5}.software-service .sw-menu nav{position:absolute;top:67px;left:0;width:100%;display:grid;grid-template-columns:1fr 1fr;gap:0 28px;padding:14px 22px 22px;background:#fff;box-shadow:0 18px 30px #0f172a0d;border-bottom:1px solid var(--sw-line)}.sw-menu nav a{display:flex;align-items:center;min-height:52px;border-bottom:1px solid var(--sw-line);font-size:15px;color:var(--sw-copy)}.software-service .sw-menu nav a[aria-current]{color:var(--sw-blue)} +@media(max-width:1023px){.sw-hero-grid{gap:35px}.software-service h1{font-size:43px}.sw-hero-art img{aspect-ratio:.9}.sw-heading{gap:35px}.software-service h2{font-size:29px}.sw-heading>p{max-width:280px}.sw-capabilities{gap:35px}.sw-capabilities h2{font-size:28px}.sw-foundation img{aspect-ratio:1.05}.sw-process{grid-template-columns:repeat(2,1fr);gap:35px}.sw-faq-grid{gap:35px}.sw-contact h2{font-size:27px}} +@media(max-width:767px){.sw-wrap{padding:0 22px}.sw-hero{padding-top:87px;padding-bottom:28px}.sw-crumb{margin-bottom:25px;gap:10px;font-size:11px;flex-wrap:wrap}.sw-hero-grid{grid-template-columns:1fr;gap:28px}.sw-kicker{font-size:11px;letter-spacing:1px}.software-service h1{font-size:40px;margin:15px 0 21px;letter-spacing:.5px}.sw-lead{font-size:16px;line-height:1.9;max-width:none}.sw-actions{margin-top:24px;gap:21px}.software-service .sw-btn{padding:12px 20px;gap:23px;font-size:14px;min-height:50px}.sw-hero-note{font-size:12px;margin-top:21px!important}.sw-hero-art img{aspect-ratio:1.2;object-position:50% 55%}.sw-hero-art figcaption{padding:17px 18px;font-size:9px;letter-spacing:.6px}.sw-index{padding:8px 0}.sw-index nav{gap:0 23px;justify-content:flex-start}.sw-index a{min-height:44px;font-size:12px;gap:7px}.sw-index a>span{font-size:10px}.sw-section{padding:58px 0}.sw-heading{display:block;margin-bottom:30px}.software-service h2{font-size:28px;letter-spacing:0}.sw-heading h2{margin-top:13px}.sw-heading>p{max-width:none;font-size:16px;margin-top:17px}.sw-capabilities{grid-template-columns:1fr;gap:30px}.sw-capabilities>div{grid-row:1}.sw-capabilities h2{font-size:28px;margin:13px 0 23px}.sw-capabilities h2 br{display:none}.sw-capability-list article{padding:19px 0}.sw-capability-list h3{font-size:18px;margin-bottom:8px}.sw-capability-list p{font-size:16px;line-height:1.85}.sw-foundation img{aspect-ratio:1.15;object-fit:contain}.sw-foundation figcaption{font-size:10px;left:15px;bottom:15px;padding:8px 11px}.sw-engineering-note{grid-template-columns:1fr;gap:12px;margin-top:28px;padding-top:21px}.sw-engineering-note strong{font-size:16px}.sw-engineering-note p{font-size:15px}.sw-process{grid-template-columns:1fr;gap:0}.sw-process li{display:grid;grid-template-columns:25px 1fr;gap:9px 17px;padding:22px 0}.sw-process li>span{font-size:16px;grid-row:1/4}.sw-process h3{font-size:19px;margin:0}.sw-process p{font-size:16px;line-height:1.85}.sw-process small{font-size:12px;margin-top:4px}.sw-faq-grid{grid-template-columns:1fr;gap:28px}.sw-faq-intro{font-size:16px;max-width:none;margin-top:16px!important}.sw-faq-list summary{font-size:16px;min-height:75px}.sw-faq-list details p{font-size:16px;line-height:1.9;padding-right:15px}.sw-contact{padding:43px 0}.sw-contact>.sw-wrap{display:block}.sw-contact h2{font-size:28px}.sw-contact p:not(.sw-kicker){font-size:16px}.sw-contact>.sw-wrap>div:last-child{margin-top:24px;gap:15px}.sw-contact .sw-link{font-size:13px}.sw-contact .sw-link>span{font-size:17px}} +@media(max-width:374px){.sw-wrap{padding:0 18px}.software-service h1{font-size:35px}.sw-actions{gap:14px}.software-service .sw-btn{padding:12px 17px;gap:17px}} +@media(prefers-reduced-motion:reduce){html:has(.software-service){scroll-behavior:auto}.software-service *{transition:none!important;animation:none!important;scroll-behavior:auto!important}} + +.sw-scopes{display:grid;grid-template-columns:1fr 1fr;gap:35px 55px}.sw-scopes article{display:grid;grid-template-columns:30px 1fr;gap:20px;border-top:1px solid var(--sw-line);padding-top:27px}.sw-scope-no{font-family:Georgia,serif;font-size:17px;color:var(--sw-blue);padding-top:3px}.sw-scopes h3{font-size:22px;margin-bottom:13px}.sw-scopes p{font-size:15px;color:var(--sw-copy);line-height:1.95}.sw-scope-label{display:block;font-size:12px;color:var(--sw-muted);margin-top:20px}.sw-deliverable-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:30px}.sw-deliverable-grid article{border-top:1px solid #c7d5e7;padding-top:22px}.sw-deliverable-grid article>span{font-size:11px;color:var(--sw-blue);letter-spacing:.6px}.sw-deliverable-grid h3{font-size:19px;line-height:1.6;margin:18px 0 13px}.sw-deliverable-grid p{font-size:14px;color:var(--sw-copy);line-height:1.95}.sw-deployment{display:grid;grid-template-columns:1fr 1fr;gap:55px;margin-top:37px;padding-top:27px;border-top:1px solid var(--sw-line)}.sw-deployment h3{font-size:16px;font-weight:500;margin-bottom:12px}.sw-deployment p{font-size:13px;color:var(--sw-copy);line-height:1.95} +@media(max-width:1023px){.sw-scopes{gap:32px}.sw-scopes article{gap:15px}.sw-deliverable-grid{grid-template-columns:1fr 1fr;gap:30px}.sw-deployment{gap:30px}} +@media(max-width:767px){.sw-scopes{grid-template-columns:1fr;gap:28px}.sw-scopes article{grid-template-columns:24px 1fr;gap:17px;padding-top:23px}.sw-scopes h3{font-size:22px;margin-bottom:12px}.sw-scopes p{font-size:16px;line-height:1.85}.sw-scope-label{font-size:12px;margin-top:16px}.sw-deliverable-grid{grid-template-columns:1fr;gap:25px}.sw-deliverable-grid article{padding-top:22px}.sw-deliverable-grid article>span{font-size:12px}.sw-deliverable-grid h3{font-size:20px;margin:13px 0 11px}.sw-deliverable-grid p{font-size:16px;line-height:1.85}.sw-deployment{grid-template-columns:1fr;gap:24px;margin-top:29px;padding-top:23px}.sw-deployment h3{font-size:17px;margin-bottom:10px}.sw-deployment p{font-size:15px;line-height:1.9}} diff --git a/public/assets/addons/official/css/typography-nhc.css b/public/assets/addons/official/css/typography-nhc.css new file mode 100644 index 0000000..1aab3dc --- /dev/null +++ b/public/assets/addons/official/css/typography-nhc.css @@ -0,0 +1,12 @@ +/* Shared typography for every public desktop and mobile page. */ +:root { + --font-site: "Microsoft YaHei", "微软雅黑", "PingFang SC", sans-serif; + --font-sans: var(--font-site); + --font-serif: var(--font-site); +} + +/* Override older page styles and rich text while preserving icon fonts. */ +html body, +html body *:not(.fa):not([class^="fa-"]):not([class*=" fa-"]):not(.layui-icon):not(.material-icons):not(.iconfont):not([class^="icon-"]):not([class*=" icon-"]) { + font-family: var(--font-site) !important; +} diff --git a/public/assets/addons/official/images/agent/courtyard-v2.jpg b/public/assets/addons/official/images/agent/courtyard-v2.jpg new file mode 100644 index 0000000..3442e36 Binary files /dev/null and b/public/assets/addons/official/images/agent/courtyard-v2.jpg differ diff --git a/public/assets/addons/official/images/agent/courtyard-v2.webp b/public/assets/addons/official/images/agent/courtyard-v2.webp new file mode 100644 index 0000000..d2eb422 Binary files /dev/null and b/public/assets/addons/official/images/agent/courtyard-v2.webp differ diff --git a/public/assets/addons/official/images/agent/knowledge-flow.jpg b/public/assets/addons/official/images/agent/knowledge-flow.jpg new file mode 100644 index 0000000..3ba1e23 Binary files /dev/null and b/public/assets/addons/official/images/agent/knowledge-flow.jpg differ diff --git a/public/assets/addons/official/images/agent/knowledge-flow.webp b/public/assets/addons/official/images/agent/knowledge-flow.webp new file mode 100644 index 0000000..b2efb3c Binary files /dev/null and b/public/assets/addons/official/images/agent/knowledge-flow.webp differ diff --git a/public/assets/addons/official/images/agent/landscape-v2.jpg b/public/assets/addons/official/images/agent/landscape-v2.jpg new file mode 100644 index 0000000..f81bcc8 Binary files /dev/null and b/public/assets/addons/official/images/agent/landscape-v2.jpg differ diff --git a/public/assets/addons/official/images/agent/landscape-v2.webp b/public/assets/addons/official/images/agent/landscape-v2.webp new file mode 100644 index 0000000..3e2e538 Binary files /dev/null and b/public/assets/addons/official/images/agent/landscape-v2.webp differ diff --git a/public/assets/addons/official/images/app/foundation.jpg b/public/assets/addons/official/images/app/foundation.jpg new file mode 100644 index 0000000..9de9ed7 Binary files /dev/null and b/public/assets/addons/official/images/app/foundation.jpg differ diff --git a/public/assets/addons/official/images/app/foundation.webp b/public/assets/addons/official/images/app/foundation.webp new file mode 100644 index 0000000..09958a1 Binary files /dev/null and b/public/assets/addons/official/images/app/foundation.webp differ diff --git a/public/assets/addons/official/images/app/terminals.jpg b/public/assets/addons/official/images/app/terminals.jpg new file mode 100644 index 0000000..0196dc4 Binary files /dev/null and b/public/assets/addons/official/images/app/terminals.jpg differ diff --git a/public/assets/addons/official/images/app/terminals.webp b/public/assets/addons/official/images/app/terminals.webp new file mode 100644 index 0000000..6f95674 Binary files /dev/null and b/public/assets/addons/official/images/app/terminals.webp differ diff --git a/public/assets/addons/official/images/cases/distribution.jpg b/public/assets/addons/official/images/cases/distribution.jpg new file mode 100644 index 0000000..3034e06 Binary files /dev/null and b/public/assets/addons/official/images/cases/distribution.jpg differ diff --git a/public/assets/addons/official/images/cases/distribution.webp b/public/assets/addons/official/images/cases/distribution.webp new file mode 100644 index 0000000..c352bd0 Binary files /dev/null and b/public/assets/addons/official/images/cases/distribution.webp differ diff --git a/public/assets/addons/official/images/cases/knowledge.jpg b/public/assets/addons/official/images/cases/knowledge.jpg new file mode 100644 index 0000000..d6eb9e1 Binary files /dev/null and b/public/assets/addons/official/images/cases/knowledge.jpg differ diff --git a/public/assets/addons/official/images/cases/knowledge.webp b/public/assets/addons/official/images/cases/knowledge.webp new file mode 100644 index 0000000..445e7bf Binary files /dev/null and b/public/assets/addons/official/images/cases/knowledge.webp differ diff --git a/public/assets/addons/official/images/cases/manufacturing.jpg b/public/assets/addons/official/images/cases/manufacturing.jpg new file mode 100644 index 0000000..ebf85bf Binary files /dev/null and b/public/assets/addons/official/images/cases/manufacturing.jpg differ diff --git a/public/assets/addons/official/images/cases/manufacturing.webp b/public/assets/addons/official/images/cases/manufacturing.webp new file mode 100644 index 0000000..89ab2c8 Binary files /dev/null and b/public/assets/addons/official/images/cases/manufacturing.webp differ diff --git a/public/assets/addons/official/images/cases/retail.jpg b/public/assets/addons/official/images/cases/retail.jpg new file mode 100644 index 0000000..7ed3f6a Binary files /dev/null and b/public/assets/addons/official/images/cases/retail.jpg differ diff --git a/public/assets/addons/official/images/cases/retail.webp b/public/assets/addons/official/images/cases/retail.webp new file mode 100644 index 0000000..a509970 Binary files /dev/null and b/public/assets/addons/official/images/cases/retail.webp differ diff --git a/public/assets/addons/official/images/home/confluence.jpg b/public/assets/addons/official/images/home/confluence.jpg new file mode 100644 index 0000000..a24d5d4 Binary files /dev/null and b/public/assets/addons/official/images/home/confluence.jpg differ diff --git a/public/assets/addons/official/images/home/confluence.webp b/public/assets/addons/official/images/home/confluence.webp new file mode 100644 index 0000000..7b49eea Binary files /dev/null and b/public/assets/addons/official/images/home/confluence.webp differ diff --git a/public/assets/addons/official/images/home/modules.jpg b/public/assets/addons/official/images/home/modules.jpg new file mode 100644 index 0000000..181c414 Binary files /dev/null and b/public/assets/addons/official/images/home/modules.jpg differ diff --git a/public/assets/addons/official/images/home/modules.webp b/public/assets/addons/official/images/home/modules.webp new file mode 100644 index 0000000..b566253 Binary files /dev/null and b/public/assets/addons/official/images/home/modules.webp differ diff --git a/public/assets/addons/official/images/home/office-editorial-v3.jpg b/public/assets/addons/official/images/home/office-editorial-v3.jpg new file mode 100644 index 0000000..19fdfc9 Binary files /dev/null and b/public/assets/addons/official/images/home/office-editorial-v3.jpg differ diff --git a/public/assets/addons/official/images/home/office-editorial-v3.webp b/public/assets/addons/official/images/home/office-editorial-v3.webp new file mode 100644 index 0000000..b58a370 Binary files /dev/null and b/public/assets/addons/official/images/home/office-editorial-v3.webp differ diff --git a/public/assets/addons/official/images/home/river-courtyard-v3.jpg b/public/assets/addons/official/images/home/river-courtyard-v3.jpg new file mode 100644 index 0000000..1d4da84 Binary files /dev/null and b/public/assets/addons/official/images/home/river-courtyard-v3.jpg differ diff --git a/public/assets/addons/official/images/home/river-courtyard-v3.webp b/public/assets/addons/official/images/home/river-courtyard-v3.webp new file mode 100644 index 0000000..ec9ab41 Binary files /dev/null and b/public/assets/addons/official/images/home/river-courtyard-v3.webp differ diff --git a/public/assets/addons/official/images/software/assembly.jpg b/public/assets/addons/official/images/software/assembly.jpg new file mode 100644 index 0000000..37f24be Binary files /dev/null and b/public/assets/addons/official/images/software/assembly.jpg differ diff --git a/public/assets/addons/official/images/software/assembly.webp b/public/assets/addons/official/images/software/assembly.webp new file mode 100644 index 0000000..c9909c0 Binary files /dev/null and b/public/assets/addons/official/images/software/assembly.webp differ diff --git a/public/assets/addons/official/images/software/layers-v2.jpg b/public/assets/addons/official/images/software/layers-v2.jpg new file mode 100644 index 0000000..4f10dcb Binary files /dev/null and b/public/assets/addons/official/images/software/layers-v2.jpg differ diff --git a/public/assets/addons/official/images/software/layers-v2.webp b/public/assets/addons/official/images/software/layers-v2.webp new file mode 100644 index 0000000..e080b6a Binary files /dev/null and b/public/assets/addons/official/images/software/layers-v2.webp differ diff --git a/public/assets/addons/official/images/software/layers.jpg b/public/assets/addons/official/images/software/layers.jpg new file mode 100644 index 0000000..56391c6 Binary files /dev/null and b/public/assets/addons/official/images/software/layers.jpg differ diff --git a/public/assets/addons/official/images/software/layers.webp b/public/assets/addons/official/images/software/layers.webp new file mode 100644 index 0000000..a25e1ae Binary files /dev/null and b/public/assets/addons/official/images/software/layers.webp differ diff --git a/public/assets/addons/official/images/software/structure-v2.jpg b/public/assets/addons/official/images/software/structure-v2.jpg new file mode 100644 index 0000000..4d4461a Binary files /dev/null and b/public/assets/addons/official/images/software/structure-v2.jpg differ diff --git a/public/assets/addons/official/images/software/structure-v2.webp b/public/assets/addons/official/images/software/structure-v2.webp new file mode 100644 index 0000000..c4ab31b Binary files /dev/null and b/public/assets/addons/official/images/software/structure-v2.webp differ diff --git a/public/assets/addons/official/js/cases-nhc.js b/public/assets/addons/official/js/cases-nhc.js new file mode 100644 index 0000000..bf4bcb6 --- /dev/null +++ b/public/assets/addons/official/js/cases-nhc.js @@ -0,0 +1,25 @@ +(function () { + 'use strict'; + var page = document.querySelector('.cases-nhc'); + if (!page) return; + var buttons = Array.from(page.querySelectorAll('[data-filter]')); + var cards = Array.from(page.querySelectorAll('.cs-card')); + var status = page.querySelector('.cs-result'); + var empty = page.querySelector('.cs-empty'); + function select(category) { + var count = 0; + cards.forEach(function (card) { + var show = category === 'all' || card.dataset.category.split(' ').indexOf(category) !== -1; + card.hidden = !show; + if (show) count += 1; + }); + buttons.forEach(function (button) { + button.setAttribute('aria-pressed', String(button.dataset.filter === category)); + }); + status.textContent = '共 ' + count + ' 个项目'; + empty.hidden = count !== 0; + } + buttons.forEach(function (button) { + button.addEventListener('click', function () { select(button.dataset.filter); }); + }); +})(); diff --git a/tests/CasesPageTest.php b/tests/CasesPageTest.php index aef087b..8157c5e 100644 --- a/tests/CasesPageTest.php +++ b/tests/CasesPageTest.php @@ -82,9 +82,9 @@ class CasesPageTest $hasFilter = (strpos($this->htmlContent, 'nhc-case-filter') !== false || strpos($this->htmlContent, '全部案例') !== false); $this->assert($hasFilter, "案例页必须包含【筛选】(多维业务/行业分类筛选器)板块"); - $hasChallenge = (strpos($this->htmlContent, '业务挑战') !== false || strpos($this->htmlContent, 'CHALLENGE') !== false); - $hasSolution = (strpos($this->htmlContent, '技术方案') !== false || strpos($this->htmlContent, 'SOLUTION') !== false || strpos($this->htmlContent, '解决方案') !== false); - $hasResult = (strpos($this->htmlContent, '成果验证') !== false || strpos($this->htmlContent, 'RESULT') !== false || strpos($this->htmlContent, '交付成效') !== false); + $hasChallenge = (strpos($this->htmlContent, '遇到的问题') !== false || strpos($this->htmlContent, '业务挑战') !== false || strpos($this->htmlContent, 'CHALLENGE') !== false); + $hasSolution = (strpos($this->htmlContent, '我们的做法') !== false || strpos($this->htmlContent, '技术方案') !== false || strpos($this->htmlContent, '实施方案') !== false || strpos($this->htmlContent, 'SOLUTION') !== false || strpos($this->htmlContent, '解决方案') !== false); + $hasResult = (strpos($this->htmlContent, '交付结果') !== false || strpos($this->htmlContent, '成果验证') !== false || strpos($this->htmlContent, '交付内容') !== false || strpos($this->htmlContent, 'RESULT') !== false || strpos($this->htmlContent, '交付成效') !== false); $this->assert($hasChallenge && $hasSolution && $hasResult, "案例页必须深度包含【挑战、方案、结果】三位一体标杆案例档案"); $hasData = (strpos($this->htmlContent, 'nhc-case-metrics') !== false || strpos($this->htmlContent, '数据验证') !== false || strpos($this->htmlContent, '成果指标') !== false); @@ -93,9 +93,9 @@ class CasesPageTest public function testNoAiCharacteristics() { - // 必须具备真实量化指标(百分比、单量等) - $hasMetrics = (strpos($this->htmlContent, '%') !== false && (strpos($this->htmlContent, '10W') !== false || strpos($this->htmlContent, '300') !== false || strpos($this->htmlContent, '50') !== false)); - $this->assert($hasMetrics, "去AI味道:案例必须具备真实可信的量化业务指标数据"); + // 必须具备真实可信的业务机制与指标(不使用无出处的百分比/单量) + $hasMetrics = (strpos($this->htmlContent, 'nhc-case-metrics') !== false && (strpos($this->htmlContent, '自动分单') !== false || strpos($this->htmlContent, '动态 BOM') !== false || strpos($this->htmlContent, '断网断电仍可收银') !== false)); + $this->assert($hasMetrics, "去AI味道:案例必须具备真实可信的业务机制与指标"); // 覆盖重点实体行业(商贸零售、智能制造、政企服务等) $hasRealIndustries = (strpos($this->htmlContent, '商贸') !== false || strpos($this->htmlContent, '零售') !== false || strpos($this->htmlContent, '制造') !== false); @@ -122,7 +122,7 @@ class CasesPageTest $this->assert(!empty($this->mobileHtmlContent), "移动端案例模板 list_e.html 文件必须存在"); $this->assert(strpos($this->mobileHtmlContent, '纳海川') !== false, "移动端模板必须包含品牌名【纳海川】"); $this->assert(strpos($this->mobileHtmlContent, 'nhc-case-filter') !== false, "移动端模板必须包含多维案例筛选器"); - $this->assert(strpos($this->mobileHtmlContent, 'CHALLENGE') !== false || strpos($this->mobileHtmlContent, '业务挑战') !== false, "移动端模板必须包含标杆案例挑战/方案/结果"); + $this->assert(strpos($this->mobileHtmlContent, '遇到的问题') !== false || strpos($this->mobileHtmlContent, 'CHALLENGE') !== false || strpos($this->mobileHtmlContent, '业务挑战') !== false, "移动端模板必须包含标杆案例挑战/方案/结果"); $this->assert(strpos($this->mobileHtmlContent, 'nhc-case-metrics') !== false, "移动端模板必须包含数据指标墙"); } } diff --git a/tests/run_tests.py b/tests/run_tests.py index 154e98e..b2c66b2 100644 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 -# -*- coding: utf-8 -*- """ 本地测试驱动运行器 (Local TDD Test Runner) 与各 PHP 单元测试断言 100% 对齐,提供极速本地验证反馈 """ + import os import re import sys @@ -13,6 +13,15 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if BASE_DIR not in sys.path: sys.path.insert(0, BASE_DIR) + +def _read(path): + """读取文本文件;文件不存在时返回空字符串。""" + if not os.path.exists(path): + return "" + with open(path, encoding="utf-8") as f: + return f.read() + + class TestResult: def __init__(self, name): self.name = name @@ -34,280 +43,486 @@ class TestResult: print(msg) return self.failed == 0 + def test_cases_page(): res = TestResult("案例独立页 (CasesPage)") - list_html_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_case_show', 'list.html') - list_e_html_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_case_show', 'list_e.html') - css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css') + list_html_path = os.path.join( + BASE_DIR, "addons", "official", "view", "web", "official_case_show", "list.html" + ) + list_e_html_path = os.path.join( + BASE_DIR, + "addons", + "official", + "view", + "web", + "official_case_show", + "list_e.html", + ) + css_path = os.path.join( + BASE_DIR, "public", "assets", "addons", "official", "css", "modern_nhc.css" + ) - html = open(list_html_path, 'r', encoding='utf-8').read() if os.path.exists(list_html_path) else '' - mobile_html = open(list_e_html_path, 'r', encoding='utf-8').read() if os.path.exists(list_e_html_path) else '' - css = open(css_path, 'r', encoding='utf-8').read() if os.path.exists(css_path) else '' + html = _read(list_html_path) if os.path.exists(list_html_path) else "" + mobile_html = _read(list_e_html_path) if os.path.exists(list_e_html_path) else "" + css = _read(css_path) if os.path.exists(css_path) else "" - res.assert_true('纳海川' in html, "PC 案例页必须明确包含品牌名称【纳海川】") - res.assert_true(not re.search(r'纳川(?!海)', html), "PC 案例页严禁错误简称为【纳川】") + res.assert_true("纳海川" in html, "PC 案例页必须明确包含品牌名称【纳海川】") + res.assert_true( + not re.search(r"纳川(?!海)", html), "PC 案例页严禁错误简称为【纳川】" + ) - has_filter = 'nhc-case-filter' in html or '全部案例' in html + has_filter = "nhc-case-filter" in html or "全部案例" in html res.assert_true(has_filter, "PC 案例页必须包含【筛选】板块") - has_chal = '业务挑战' in html or 'CHALLENGE' in html - has_sol = '技术方案' in html or 'SOLUTION' in html - has_res = '成果验证' in html or 'RESULT' in html - res.assert_true(has_chal and has_sol and has_res, "PC 案例页必须包含【挑战、方案、结果】档案") - res.assert_true('nhc-case-metrics' in html or '数据验证' in html, "PC 案例页必须包含【数据】板块") + has_chal = "遇到的问题" in html or "业务挑战" in html or "CHALLENGE" in html + has_sol = any(label in html for label in ("我们的做法", "技术方案", "实施方案", "SOLUTION")) + has_res = any(label in html for label in ("交付结果", "成果验证", "交付内容", "RESULT")) + res.assert_true( + has_chal and has_sol and has_res, "PC 案例页必须包含【挑战、方案、结果】档案" + ) + res.assert_true( + "nhc-case-metrics" in html or "数据验证" in html, + "PC 案例页必须包含【数据】板块", + ) - has_metrics = 'nhc-case-metrics' in html and ('自动化分单' in html or '断网收银' in html or '动态BOM' in html) + has_metrics = "nhc-case-metrics" in html and ( + "自动分单" in html + or "断网断电仍可收银" in html + or "动态 BOM" in html + or "动态BOM" in html + ) res.assert_true(has_metrics, "去AI味道:具备真实可信的落地业务与架构机制") - has_emoji = bool(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]', html)) + has_emoji = bool( + re.search( + r"[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]", + html, + ) + ) res.assert_true(not has_emoji, "案例页严禁使用任何 emoji 表情符号") - res.assert_true('#2563EB' in css or '#2563eb' in css, "沿用科技蓝 #2563EB 主色规范") - res.assert_true('SimSun' in css or 'Songti' in css or 'Noto Serif SC' in css, "沿用宋体标题规范") + res.assert_true("#2563EB" in css or "#2563eb" in css, "沿用科技蓝 #2563EB 主色规范") + res.assert_true( + "SimSun" in css or "Songti" in css or "Noto Serif SC" in css, "沿用宋体标题规范" + ) res.assert_true(bool(mobile_html), "移动端案例模板 list_e.html 必须存在") if mobile_html: - res.assert_true('纳海川' in mobile_html, "移动端模板必须包含品牌名【纳海川】") - res.assert_true('nhc-case-filter' in mobile_html, "移动端模板必须包含多维案例筛选器") - res.assert_true('CHALLENGE' in mobile_html or '业务挑战' in mobile_html, "移动端模板必须包含标杆案例挑战/方案/结果") - res.assert_true('nhc-case-metrics' in mobile_html, "移动端模板必须包含标杆案例量化指标") + res.assert_true("纳海川" in mobile_html, "移动端模板必须包含品牌名【纳海川】") + res.assert_true( + "nhc-case-filter" in mobile_html, "移动端模板必须包含多维案例筛选器" + ) + res.assert_true( + "遇到的问题" in mobile_html + or "CHALLENGE" in mobile_html + or "业务挑战" in mobile_html, + "移动端模板必须包含标杆案例挑战/方案/结果", + ) + res.assert_true( + "nhc-case-metrics" in mobile_html, "移动端模板必须包含标杆案例量化指标" + ) return res.summary() + def test_services_page(): res = TestResult("服务独立页 (ServicesPage)") - svc_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'service_page.html') - list_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'list.html') - css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css') - html = '' + svc_path = os.path.join( + BASE_DIR, + "addons", + "official", + "view", + "web", + "official_product", + "service_page.html", + ) + list_path = os.path.join( + BASE_DIR, "addons", "official", "view", "web", "official_product", "list.html" + ) + html = "" if os.path.exists(svc_path): - html += open(svc_path, 'r', encoding='utf-8').read() + '\n' + html += _read(svc_path) + "\n" if os.path.exists(list_path): - html += open(list_path, 'r', encoding='utf-8').read() + '\n' - css = open(css_path, 'r', encoding='utf-8').read() if os.path.exists(css_path) else '' + html += _read(list_path) + "\n" - res.assert_true('纳海川' in html, "服务页必须明确包含品牌名称【纳海川】") - res.assert_true(not re.search(r'纳川(?!海)', html), "服务页严禁错误简称为【纳川】") - res.assert_true('软件开发' in html and 'APP' in html and '智能体' in html, "服务页必须涵盖软件开发、APP定制、智能体开发") + res.assert_true("纳海川" in html, "服务页必须明确包含品牌名称【纳海川】") + res.assert_true(not re.search(r"纳川(?!海)", html), "服务页严禁错误简称为【纳川】") + res.assert_true( + "软件开发" in html and "APP" in html and "智能体" in html, + "服务页必须涵盖软件开发、APP定制、智能体开发", + ) - has_cat = 'nhc-services-categories' in html or '服务分类' in html or '服务矩阵' in html + has_cat = ( + "nhc-services-categories" in html or "服务分类" in html or "服务矩阵" in html + ) res.assert_true(has_cat, "包含【分类】板块") - has_cap = 'nhc-tech-capabilities' in html or '技术能力' in html or '技术底座' in html + has_cap = ( + "nhc-tech-capabilities" in html or "技术能力" in html or "技术底座" in html + ) res.assert_true(has_cap, "包含【能力】板块") - has_proc = 'nhc-delivery-process' in html or '交付流程' in html or '研发流程' in html + has_proc = ( + "nhc-delivery-process" in html or "交付流程" in html or "研发流程" in html + ) res.assert_true(has_proc, "包含【流程】板块") - has_deliv = 'nhc-deliverables' in html or '交付物' in html or '交付标准' in html + has_deliv = "nhc-deliverables" in html or "交付物" in html or "交付标准" in html res.assert_true(has_deliv, "包含【交付】清单") - has_faq = 'nhc-faq' in html or '常见问答' in html or '技术问答' in html + has_faq = "nhc-faq" in html or "常见问答" in html or "技术问答" in html res.assert_true(has_faq, "包含【FAQ】板块") return res.summary() + def test_products_page(): res = TestResult("产品独立页 (ProductsPage)") - prd_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'product_page.html') - list_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'list.html') - html = '' + prd_path = os.path.join( + BASE_DIR, + "addons", + "official", + "view", + "web", + "official_product", + "product_page.html", + ) + list_path = os.path.join( + BASE_DIR, "addons", "official", "view", "web", "official_product", "list.html" + ) + html = "" if os.path.exists(prd_path): - html += open(prd_path, 'r', encoding='utf-8').read() + '\n' + html += _read(prd_path) + "\n" if os.path.exists(list_path): - html += open(list_path, 'r', encoding='utf-8').read() + '\n' + html += _read(list_path) + "\n" - res.assert_true('纳海川' in html, "产品页必须明确包含品牌名称【纳海川】") - res.assert_true(not re.search(r'纳川(?!海)', html), "产品页严禁错误简称为【纳川】") - res.assert_true('商城' in html and '收银' in html and '进销存' in html and 'SaaS' in html, "产品页必须涵盖商城、收银、进销存、SaaS版本") + res.assert_true("纳海川" in html, "产品页必须明确包含品牌名称【纳海川】") + res.assert_true(not re.search(r"纳川(?!海)", html), "产品页严禁错误简称为【纳川】") + res.assert_true( + "商城" in html and "收银" in html and "进销存" in html and "SaaS" in html, + "产品页必须涵盖商城、收银、进销存、SaaS版本", + ) - has_matrix = 'nhc-product-matrix' in html or '产品矩阵' in html or '商业矩阵' in html + has_matrix = ( + "nhc-product-matrix" in html or "产品矩阵" in html or "商业矩阵" in html + ) res.assert_true(has_matrix, "包含【矩阵】板块") - has_features = 'nhc-product-features' in html or '功能架构' in html or '核心功能' in html + has_features = ( + "nhc-product-features" in html or "功能架构" in html or "核心功能" in html + ) res.assert_true(has_features, "包含【功能】板块") - has_editions = 'nhc-product-editions' in html or '版本对比' in html or '版本选型' in html + has_editions = ( + "nhc-product-editions" in html or "版本对比" in html or "版本选型" in html + ) res.assert_true(has_editions, "包含【版本】板块") - has_pricing = 'nhc-product-pricing' in html or '定价' in html or '部署模式' in html or '商业授权' in html + has_pricing = ( + "nhc-product-pricing" in html + or "定价" in html + or "部署模式" in html + or "商业授权" in html + ) res.assert_true(has_pricing, "包含【定价】板块") - has_demo = 'nhc-product-demo' in html or '在线演示' in html or '预约演示' in html or '申请演示' in html + has_demo = ( + "nhc-product-demo" in html + or "在线演示" in html + or "预约演示" in html + or "申请演示" in html + ) res.assert_true(has_demo, "包含【演示】板块") return res.summary() + def test_nav_megamenu(): res = TestResult("导航二级卡片面板 (NavMegaMenu)") - nav_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_common', 'pc', 'nav.html') - css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css') - html = open(nav_path, 'r', encoding='utf-8').read() if os.path.exists(nav_path) else '' - css = open(css_path, 'r', encoding='utf-8').read() if os.path.exists(css_path) else '' + nav_path = os.path.join( + BASE_DIR, + "addons", + "official", + "view", + "web", + "official_common", + "pc", + "nav.html", + ) + css_path = os.path.join( + BASE_DIR, "public", "assets", "addons", "official", "css", "modern_nhc.css" + ) + html = _read(nav_path) if os.path.exists(nav_path) else "" + css = _read(css_path) if os.path.exists(css_path) else "" - res.assert_true('nhc-has-dropdown' in html, "导航栏必须具备 nhc-has-dropdown 下拉菜单触发类") - res.assert_true('nhc-mega-panel' in html, "导航栏必须具备 nhc-mega-panel 二级卡片面板容器") - res.assert_true('软件开发' in html and '智能体开发' in html, "服务二级面板包含核心服务") - res.assert_true('商城' in html and '收银' in html and '进销存' in html and 'SaaS' in html, "产品二级面板包含核心产品") - res.assert_true('.nhc-mega-panel' in css, "CSS 包含 .nhc-mega-panel 卡片面板样式") - res.assert_true('.nhc-has-dropdown:hover' in css, "CSS 包含鼠标悬停触发规则") + res.assert_true( + "nhc-has-dropdown" in html, "导航栏必须具备 nhc-has-dropdown 下拉菜单触发类" + ) + res.assert_true( + "nhc-mega-panel" in html, "导航栏必须具备 nhc-mega-panel 二级卡片面板容器" + ) + res.assert_true( + "软件开发" in html and "智能体开发" in html, "服务二级面板包含核心服务" + ) + res.assert_true( + "商城" in html and "收银" in html and "进销存" in html and "SaaS" in html, + "产品二级面板包含核心产品", + ) + res.assert_true(".nhc-mega-panel" in css, "CSS 包含 .nhc-mega-panel 卡片面板样式") + res.assert_true(".nhc-has-dropdown:hover" in css, "CSS 包含鼠标悬停触发规则") return res.summary() + def test_about_page(): res = TestResult("关于我们独立页 (AboutPage)") - single_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'single.html') - single_e_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'single_e.html') - css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css') + single_path = os.path.join( + BASE_DIR, "addons", "official", "view", "web", "official_home", "single.html" + ) + single_e_path = os.path.join( + BASE_DIR, "addons", "official", "view", "web", "official_home", "single_e.html" + ) - html = open(single_path, 'r', encoding='utf-8').read() if os.path.exists(single_path) else '' - mobile_html = open(single_e_path, 'r', encoding='utf-8').read() if os.path.exists(single_e_path) else '' - css = open(css_path, 'r', encoding='utf-8').read() if os.path.exists(css_path) else '' + html = _read(single_path) if os.path.exists(single_path) else "" + mobile_html = _read(single_e_path) if os.path.exists(single_e_path) else "" - res.assert_true('纳海川' in html, "PC 关于我们页必须明确包含品牌名称【纳海川】") - res.assert_true(not re.search(r'纳川(?!海)', html), "PC 关于我们页严禁错误简称为【纳川】") + res.assert_true("纳海川" in html, "PC 关于我们页必须明确包含品牌名称【纳海川】") + res.assert_true( + not re.search(r"纳川(?!海)", html), "PC 关于我们页严禁错误简称为【纳川】" + ) - has_brand = 'nhc-about-brand' in html or '工程哲学' in html or '品牌' in html + has_brand = "nhc-about-brand" in html or "工程哲学" in html or "品牌" in html res.assert_true(has_brand, "必须包含【品牌】(品牌渊源与东方工程哲学)板块") - has_team = 'nhc-about-team' in html or '技术委员会' in html or '核心团队' in html + has_team = "nhc-about-team" in html or "技术委员会" in html or "核心团队" in html res.assert_true(has_team, "必须包含【团队】(技术委员会专家与核心团队)板块") - has_certs = 'nhc-about-qualifications' in html or '软件著作权' in html or '合规体系' in html + has_certs = ( + "nhc-about-qualifications" in html or "软件著作权" in html or "合规体系" in html + ) res.assert_true(has_certs, "必须包含【资质】(权威资质、软著资产与安全合规体系)板块") - has_milestones = '2016' in html or '2019' in html or '2024' in html or '发展历程' in html + has_milestones = ( + "2016" in html or "2019" in html or "2024" in html or "发展历程" in html + ) res.assert_true(has_milestones, "去AI味道:展示具体发展历程或里程碑") - has_tech = '架构师' in html or '全栈' in html or '智能体' in html + has_tech = "架构师" in html or "全栈" in html or "智能体" in html res.assert_true(has_tech, "去AI味道:展示严谨技术职称与专业领域") - has_certs_concrete = 'ISO' in html or '著作权' in html or '等保' in html + has_certs_concrete = "ISO" in html or "著作权" in html or "等保" in html res.assert_true(has_certs_concrete, "去AI味道:展示具体行业认证体系与软著资产") - has_emoji = bool(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]', html)) + has_emoji = bool( + re.search( + r"[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\u2600-\u26FF\u2700-\u27BF]", + html, + ) + ) res.assert_true(not has_emoji, "严禁使用任何 emoji 表情符号") res.assert_true(bool(mobile_html), "移动端关于我们模板 single_e.html 必须存在") if mobile_html: - res.assert_true('纳海川' in mobile_html, "移动端模板包含品牌名【纳海川】") - res.assert_true('团队' in mobile_html or '专家' in mobile_html, "移动端模板包含核心团队介绍") - res.assert_true('资质' in mobile_html or '著作权' in mobile_html, "移动端模板包含资质认证板块") + res.assert_true("纳海川" in mobile_html, "移动端模板包含品牌名【纳海川】") + res.assert_true( + "团队" in mobile_html or "专家" in mobile_html, "移动端模板包含核心团队介绍" + ) + res.assert_true( + "资质" in mobile_html or "著作权" in mobile_html, + "移动端模板包含资质认证板块", + ) return res.summary() + def test_contact_page(): res = TestResult("联系我们独立页 (ContactPage)") - contact_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_online_message', 'list.html') - contact_e_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_online_message', 'list_e.html') - css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css') + contact_path = os.path.join( + BASE_DIR, + "addons", + "official", + "view", + "web", + "official_online_message", + "list.html", + ) + contact_e_path = os.path.join( + BASE_DIR, + "addons", + "official", + "view", + "web", + "official_online_message", + "list_e.html", + ) - html = open(contact_path, 'r', encoding='utf-8').read() if os.path.exists(contact_path) else '' - mobile_html = open(contact_e_path, 'r', encoding='utf-8').read() if os.path.exists(contact_e_path) else '' - css = open(css_path, 'r', encoding='utf-8').read() if os.path.exists(css_path) else '' + html = _read(contact_path) if os.path.exists(contact_path) else "" + mobile_html = _read(contact_e_path) if os.path.exists(contact_e_path) else "" - res.assert_true('纳海川' in html, "PC 联系我们页必须明确包含品牌名称【纳海川】") - res.assert_true(not re.search(r'纳川(?!海)', html), "PC 联系我们页严禁错误简称为【纳川】") + res.assert_true("纳海川" in html, "PC 联系我们页必须明确包含品牌名称【纳海川】") + res.assert_true( + not re.search(r"纳川(?!海)", html), "PC 联系我们页严禁错误简称为【纳川】" + ) - has_form = ']*>[\s\S]*?立即开通', self.pc_html) or - ("demo-sandbox" in self.pc_html and "立即开通" in self.pc_html) or - ("official_online_message/list" in self.pc_html and "立即开通" in self.pc_html), - "SaaS版本【立即开通】必须跳转到产品演示沙箱或咨询开通" + re.search(r']*href="\{:addon_url\(\'official/web\.official_online_message/list\',[^\n]*?\)\}"[^>]*>\s*咨询开通', self.pc_html), + "SaaS版本【咨询开通】必须跳转到联系留言页" ) def test_04_pc_case_cards_clickable(self): diff --git a/tests/test_natural_copywriting.py b/tests/test_natural_copywriting.py index 253e6ca..3f57933 100644 --- a/tests/test_natural_copywriting.py +++ b/tests/test_natural_copywriting.py @@ -137,9 +137,9 @@ class TestNaturalCopywriting(unittest.TestCase): # 案例页务实表达 self.assertIn( - "面临类似的业务系统瓶颈?我们可以提供针对性方案", + "你的业务也遇到类似问题?", self.cases_html, - "案例页CTA必须直面业务痛点", + "案例页CTA必须直接回应客户问题", ) # 关于我们与联系我们 @@ -284,10 +284,15 @@ class TestNaturalCopywriting(unittest.TestCase): # 验证新优化的务实干练文案已生效 self.assertIn("成熟商业系统 · 支撑全渠道经营与业务协同", self.products_html) self.assertIn("动态安全库存模型与自动补货采购建议", self.products_html) - self.assertIn( - "覆盖资料问答与业务办理 · 按流程办事的专业智能体", service_agent_html - ) - self.assertIn("全链路敏捷交付 · 规范推进设计与上线", service_app_html) + self.assertIn("企业知识问答", service_agent_html) + self.assertIn("业务流程辅助", service_agent_html) + self.assertIn("检索增强可以降低错误风险,但不能保证所有回答都正确", service_agent_html) + self.assertNotIn("不会自己编造", service_agent_html) + self.assertNotIn("一张或两张显卡即可", service_agent_html) + self.assertIn("根据使用方式,选择合适的终端", service_app_html) + self.assertIn("应用审核结果与排期由平台决定", service_app_html) + self.assertNotIn("上架一次通过率", service_app_html) + self.assertNotIn("全生态", service_app_html) self.assertIn("全量规范移交客户", self.services_html)