同步新版首页文案关键词并更新测试以匹配 v2/v3 视觉改版;部署脚本增加未同步改动保护

这个提交包含在:
wikiboss
2026-11-05 15:13:22 +08:00
父节点 77495769c4
当前提交 96a3f8b672
共有 9 个文件被更改,包括 175 次插入 和 119 次删除

查看文件

@@ -13,13 +13,13 @@
<div class="hn-wrap hn-hero-caption"><span>立足贵阳 · 服务全国</span><a href="#services">探索我们的服务 <span aria-hidden="true">↓</span></a><span>NAHAICHUAN TECHNOLOGY</span></div>
</section>
<div class="hn-promise"><div class="hn-wrap"><div><b>以业务为起点</b><span>先了解流程,再确定方案</span></div><div><b>以交付为依据</b><span>阶段成果确认,过程有据可查</span></div><div><b>以使用为目标</b><span>兼顾上线运行与后续维护</span></div></div></div>
<section class="hn-section" id="services"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">01 / 专业服务</p><h2>系统开发与长期维护</h2></div><div><p>从企业日常经营出发,<br>把实际业务需求转化为可用的软件。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}">全部服务 <span aria-hidden="true">↗</span></a></div></div><div class="hn-services"><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="3" y="4" width="26" height="19" rx="2"/><path d="M11 29h10M16 23v6M10 11l-3 3 3 3m12-6 3 3-3 3m-4-7-4 8"/></svg><span>01</span></div><h3>软件开发</h3><p>围绕订单、库存、财务与内部协同,开发符合企业实际流程的业务系统。</p><div class="hn-service-tags">业务系统定制 · 系统集成 · 旧系统改造</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_software')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="8" y="2" width="16" height="28" rx="3"/><path d="M13 6h6m-4 20h2M13 13l-3 3 3 3m6-6 3 3-3 3"/></svg><span>02</span></div><h3>APP与小程序定制</h3><p>面向客户服务、移动办公与门店经营,连接移动终端与后台业务。</p><div class="hn-service-tags">iOS / Android · 微信小程序 · 多端协同</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_app')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 3v5m0 16v5M3 16h5m16 0h5M7 7l4 4m10 10 4 4M25 7l-4 4M11 21l-4 4"/><rect x="10" y="10" width="12" height="12" rx="3"/><path d="M14 16h4m-2-2v4"/></svg><span>03</span></div><h3>智能体开发</h3><p>以企业知识与业务流程为基础,提供知识问答、资料检索和任务辅助。</p><div class="hn-service-tags">企业知识库 · 流程配置 · 私有化部署</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_agent')}">了解服务 <span aria-hidden="true">↗</span></a></article></div></div></section>
<section class="hn-section" id="services"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">01 / 专业服务</p><h2>系统开发与长期维护</h2></div><div><p>从企业日常经营出发,<br>把实际业务需求转化为可用的软件。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}">全部服务 <span aria-hidden="true">↗</span></a></div></div><div class="hn-services"><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="3" y="4" width="26" height="19" rx="2"/><path d="M11 29h10M16 23v6M10 11l-3 3 3 3m12-6 3 3-3 3m-4-7-4 8"/></svg><span>01</span></div><h3>软件开发</h3><p>围绕订单、库存、财务与内部协同,开发符合企业实际流程的业务系统。</p><div class="hn-service-tags">业务系统定制 · 微服务架构 · 系统集成 · 旧系统改造</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_software')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="8" y="2" width="16" height="28" rx="3"/><path d="M13 6h6m-4 20h2M13 13l-3 3 3 3m6-6 3 3-3 3"/></svg><span>02</span></div><h3>APP与小程序定制</h3><p>面向客户服务、移动办公与门店经营,连接移动终端与后台业务。</p><div class="hn-service-tags">iOS / Android · 微信小程序 · 多端协同</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_app')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 3v5m0 16v5M3 16h5m16 0h5M7 7l4 4m10 10 4 4M25 7l-4 4M11 21l-4 4"/><rect x="10" y="10" width="12" height="12" rx="3"/><path d="M14 16h4m-2-2v4"/></svg><span>03</span></div><h3>智能体开发</h3><p>以企业知识与业务流程为基础,提供知识问答、资料检索和任务辅助。</p><div class="hn-service-tags">企业知识库 · 流程配置 · 私有化部署</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_agent')}">了解服务 <span aria-hidden="true">↗</span></a></article></div></div></section>
<section class="hn-section hn-soft" id="products"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">02 / 产品中心</p><h2>标准化业务系统</h2></div><div><p>成熟功能满足共性需求,<br>按业务需要配置、集成与扩展。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}">产品详情 <span aria-hidden="true">↗</span></a></div></div>
<div class="hn-product-feature"><div class="hn-product-intro"><span class="hn-small">产品选型</span><h3>从一笔订单,<br>到日常经营。</h3><p>线上销售、门店收款、采购库存,<br>选择适合当前业务的管理工具。</p><a class="hn-btn" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#demo-sandbox">预约产品演示 <span aria-hidden="true">↗</span></a></div><div class="hn-product-visual"><div class="hn-app-window" aria-label="业务系统界面示意"><div class="hn-app-bar"><span class="hn-app-mark">川</span><strong>经营管理工作台</strong><span class="hn-demo-label">界面示意</span></div><div class="hn-app-body"><aside><b>工作台</b><span>订单管理</span><span>商品管理</span><span>会员管理</span><span>库存管理</span><span>经营报表</span></aside><div class="hn-app-content"><h4>经营概览 <small>业务数据,一处查看</small></h4><div class="hn-stat-row"><div><span>销售管理</span><b>订单汇总</b><i></i></div><div><span>库存管理</span><b>出入库记录</b><i></i></div><div><span>会员管理</span><b>客户档案</b><i></i></div></div><div class="hn-chart"><div><b>销售趋势</b><span>销售 / 订单</span></div><svg viewBox="0 0 500 110" aria-hidden="true"><path d="M0 100H500M0 65H500M0 30H500" stroke="#e8edf3" fill="none"/><path d="M0 95 45 80 90 86 135 52 180 62 225 31 270 48 315 20 360 32 405 12 450 27 500 5V110H0Z" fill="#e8f0fe"/><path d="M0 95 45 80 90 86 135 52 180 62 225 31 270 48 315 20 360 32 405 12 450 27 500 5" stroke="#2563eb" stroke-width="3" fill="none"/></svg><div class="hn-chart-bottom"><span>业务记录</span><span>经营统计</span><span>趋势分析</span></div></div></div></div></div></div></div>
<div class="hn-products"><article><span class="hn-small">线上交易</span><h3>商城</h3><p>商品、订单、会员与营销管理,满足线上销售与日常运营。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">门店经营</span><h3>收银</h3><p>收款、退款、交班与门店对账,衔接一线操作和总部管理。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#demo-sandbox">申请演示 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">采购与库存</span><h3>进销存</h3><p>关联采购、销售、库存与往来账目,记录每一笔业务流转。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">订阅使用</span><h3>SaaS版本</h3><p>按订阅方式使用业务功能,适合希望简化部署和维护的企业。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询开通 <span aria-hidden="true">↗</span></a></article></div></div></section>
<div class="hn-products"><article><span class="hn-small">线上交易</span><h3>商城</h3><p>商品、订单、会员与营销管理,满足线上销售与日常运营。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">门店经营</span><h3>收银</h3><p>收款、退款、防重复扣款与门店对账,衔接一线操作和总部管理。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#demo-sandbox">申请演示 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">采购与库存</span><h3>进销存</h3><p>关联采购、销售、库存与往来账目,记录每一笔业务流转。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">订阅使用</span><h3>SaaS版本</h3><p>按订阅方式使用业务功能,适合希望简化部署和维护的企业。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询开通 <span aria-hidden="true">↗</span></a></article></div></div></section>
<section class="hn-section" id="cases"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">03 / 项目案例</p><h2>项目实践与行业应用</h2></div><div><p>项目案例:业务挑战与技术方案。<br>了解不同场景下的系统建设思路。</p><a class="hn-link" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}">浏览案例 <span aria-hidden="true">↗</span></a></div></div><div class="hn-cases"><a class="hn-case" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"><figure><img src="__ADDON__/images/showcases/case_distrib.svg" width="800" height="460" alt="分销订货与业务协同方案示意" loading="lazy"><figcaption>方案示意</figcaption></figure><div class="hn-case-copy"><span class="hn-small">商贸流通</span><h3>分销订货与业务协同<span aria-hidden="true">↗</span></h3><p>关联多渠道订单、库存和结算,衔接订货、审核与发货流程。</p></div></a><a class="hn-case" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"><figure><img src="__ADDON__/images/showcases/case_catering.svg" width="800" height="460" alt="收银与门店管理方案示意" loading="lazy"><figcaption>方案示意</figcaption></figure><div class="hn-case-copy"><span class="hn-small">连锁经营</span><h3>收银与门店管理<span aria-hidden="true">↗</span></h3><p>整合门店收款、单据同步与总部对账,统一业务记录。</p></div></a><a class="hn-case" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"><figure><img src="__ADDON__/images/showcases/case_manufacture.svg" width="800" height="460" alt="进销存与供应商协同方案示意" loading="lazy"><figcaption>方案示意</figcaption></figure><div class="hn-case-copy"><span class="hn-small">生产管理</span><h3>进销存与供应商协同<span aria-hidden="true">↗</span></h3><p>连接采购、物料与生产,完善库存记录和供应商协作流程。</p></div></a></div></div></section>
<section class="hn-section hn-process-section" id="delivery"><div class="hn-wrap" id="process"><div class="hn-heading"><div><p class="hn-kicker">04 / 实施交付</p><h2>每一步,都有明确的交付</h2></div><p>项目推进流程<br>范围、进度与成果,按阶段沟通确认。</p></div><ol class="hn-process">
<li><span>01</span><h3>需求与方案</h3><p>了解业务流程、使用对象和现有系统,确认功能范围、预算与计划。</p><small>需求说明 / 实施方案</small></li><li><span>02</span><h3>设计与开发</h3><p>确认交互原型和技术方案,分阶段开发,并及时沟通调整事项。</p><small>交互原型 / 阶段版本</small></li><li><span>03</span><h3>测试与验收</h3><p>按约定业务场景开展测试,核对功能、数据和问题处理结果。</p><small>测试记录 / 验收清单</small></li><li><span>04</span><h3>上线与维护</h3><p>完成部署、操作培训与资料移交,按约定提供后续维护。</p><small>部署文档 / 使用培训</small></li></ol><div class="hn-delivery-note"><strong>交付清楚,后续有据。</strong><p>源码、接口文档、部署资料及维护安排,在项目启动前明确,具体以合同约定为准。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询交付安排 <span aria-hidden="true">↗</span></a></div></div></section>
<li><span>01</span><h3>需求与方案</h3><p>了解业务流程、使用对象和现有系统,确认功能范围、预算与计划。</p><small>需求说明 / 实施方案</small></li><li><span>02</span><h3>设计与开发</h3><p>确认交互原型和技术方案,分阶段开发,并及时沟通调整事项。</p><small>交互原型 / 阶段版本</small></li><li><span>03</span><h3>测试与验收</h3><p>按约定业务场景开展测试,核对功能、数据和问题处理结果。</p><small>测试记录 / 验收清单</small></li><li><span>04</span><h3>上线与维护</h3><p>完成部署、操作培训与资料移交,按约定提供后续维护。</p><small>部署文档 / 使用培训</small></li></ol><div class="hn-delivery-note"><strong>交付清楚,后续有据。</strong><p>源码交付、接口文档、代码审查记录、部署资料及维护安排,在项目启动前明确,具体以合同约定为准。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询交付安排 <span aria-hidden="true">↗</span></a></div></div></section>
<section class="hn-section hn-about"><div class="hn-wrap hn-about-grid"><figure><picture><source srcset="__ADDON__/images/home/office-editorial-v3.webp" type="image/webp"><img src="__ADDON__/images/home/office-editorial-v3.jpg" width="1536" height="1024" loading="lazy" alt="自然光下的现代办公洽谈空间,品牌意境图"></picture><figcaption>品牌意境图</figcaption></figure><div><p class="hn-kicker">05 / 关于纳海川</p><h2>认真理解业务,<br>踏实做好研发。</h2><p>贵阳纳海川科技有限公司,专注企业软件开发与业务系统建设。我们为企业提供软件定制、移动应用、智能体开发及标准化业务产品。</p><p>重视每一次需求确认、每一个阶段成果,也关注系统交付之后的日常使用。</p><a class="hn-link" href="{:addon_url('official/web.official_home/single',[':pid'=>1,':sid'=>1])}">了解我们 <span aria-hidden="true">↗</span></a><div class="hn-about-sign"><span>纳海川</span><small>贵阳 · 中国</small></div></div></div><div class="hn-wrap hn-feedback"><div><p class="hn-kicker">合作记录</p><h2>客户反馈</h2></div><div class="hn-quotes"><blockquote><p>“订货中台重构后,大促当天订单未出现积压,库存与财务账目一致。沟通直接,变更均有记录。”</p><footer>供应链企业 · 技术负责人<span>订货中台项目</span></footer></blockquote><blockquote><p>“收银员半天即可上手。门店断网时仍可正常收银,网络恢复后单据自动补传,月底对账工作量明显减少。”</p><footer>连锁零售企业 · 运营负责人<span>门店收银项目</span></footer></blockquote></div></div></section>
<section class="hn-section hn-soft" id="insights"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">06 / 研发记录</p><h2>技术与实践</h2></div><a class="hn-link" href="{:addon_url('official/web.official_journalism/list',[':pid'=>6,':sid'=>6])}">更多动态 <span aria-hidden="true">↗</span></a></div><div class="hn-news">{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}

查看文件

@@ -14,13 +14,13 @@
<div class="hn-wrap hn-hero-caption"><span>立足贵阳 · 服务全国</span><a href="#services">探索我们的服务 <span aria-hidden="true">↓</span></a><span>NAHAICHUAN TECHNOLOGY</span></div>
</section>
<div class="hn-promise"><div class="hn-wrap"><div><b>以业务为起点</b><span>先了解流程,再确定方案</span></div><div><b>以交付为依据</b><span>阶段成果确认,过程有据可查</span></div><div><b>以使用为目标</b><span>兼顾上线运行与后续维护</span></div></div></div>
<section class="hn-section" id="services"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">01 / 专业服务</p><h2>系统开发与长期维护</h2></div><div><p>从企业日常经营出发,<br>把实际业务需求转化为可用的软件。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}">全部服务 <span aria-hidden="true">↗</span></a></div></div><div class="hn-services"><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="3" y="4" width="26" height="19" rx="2"/><path d="M11 29h10M16 23v6M10 11l-3 3 3 3m12-6 3 3-3 3m-4-7-4 8"/></svg><span>01</span></div><h3>软件开发</h3><p>围绕订单、库存、财务与内部协同,开发符合企业实际流程的业务系统。</p><div class="hn-service-tags">业务系统定制 · 系统集成 · 旧系统改造</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_software')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="8" y="2" width="16" height="28" rx="3"/><path d="M13 6h6m-4 20h2M13 13l-3 3 3 3m6-6 3 3-3 3"/></svg><span>02</span></div><h3>APP与小程序定制</h3><p>面向客户服务、移动办公与门店经营,连接移动终端与后台业务。</p><div class="hn-service-tags">iOS / Android · 微信小程序 · 多端协同</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_app')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 3v5m0 16v5M3 16h5m16 0h5M7 7l4 4m10 10 4 4M25 7l-4 4M11 21l-4 4"/><rect x="10" y="10" width="12" height="12" rx="3"/><path d="M14 16h4m-2-2v4"/></svg><span>03</span></div><h3>智能体开发</h3><p>以企业知识与业务流程为基础,提供知识问答、资料检索和任务辅助。</p><div class="hn-service-tags">企业知识库 · 流程配置 · 私有化部署</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_agent')}">了解服务 <span aria-hidden="true">↗</span></a></article></div></div></section>
<section class="hn-section" id="services"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">01 / 专业服务</p><h2>系统开发与长期维护</h2></div><div><p>从企业日常经营出发,<br>把实际业务需求转化为可用的软件。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}">全部服务 <span aria-hidden="true">↗</span></a></div></div><div class="hn-services"><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="3" y="4" width="26" height="19" rx="2"/><path d="M11 29h10M16 23v6M10 11l-3 3 3 3m12-6 3 3-3 3m-4-7-4 8"/></svg><span>01</span></div><h3>软件开发</h3><p>围绕订单、库存、财务与内部协同,开发符合企业实际流程的业务系统。</p><div class="hn-service-tags">业务系统定制 · 微服务架构 · 系统集成 · 旧系统改造</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_software')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect x="8" y="2" width="16" height="28" rx="3"/><path d="M13 6h6m-4 20h2M13 13l-3 3 3 3m6-6 3 3-3 3"/></svg><span>02</span></div><h3>APP与小程序定制</h3><p>面向客户服务、移动办公与门店经营,连接移动终端与后台业务。</p><div class="hn-service-tags">iOS / Android · 微信小程序 · 多端协同</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_app')}">了解服务 <span aria-hidden="true">↗</span></a></article><article class="hn-service"><div class="hn-service-top"><svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 3v5m0 16v5M3 16h5m16 0h5M7 7l4 4m10 10 4 4M25 7l-4 4M11 21l-4 4"/><rect x="10" y="10" width="12" height="12" rx="3"/><path d="M14 16h4m-2-2v4"/></svg><span>03</span></div><h3>智能体开发</h3><p>以企业知识与业务流程为基础,提供知识问答、资料检索和任务辅助。</p><div class="hn-service-tags">企业知识库 · 流程配置 · 私有化部署</div><a class="hn-link" href="{:addon_url('official/web.official_product/service_agent')}">了解服务 <span aria-hidden="true">↗</span></a></article></div></div></section>
<section class="hn-section hn-soft" id="products"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">02 / 产品中心</p><h2>标准化业务系统</h2></div><div><p>成熟功能满足共性需求,<br>按业务需要配置、集成与扩展。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}">产品详情 <span aria-hidden="true">↗</span></a></div></div>
<div class="hn-product-feature"><div class="hn-product-intro"><span class="hn-small">产品选型</span><h3>从一笔订单,<br>到日常经营。</h3><p>线上销售、门店收款、采购库存,<br>选择适合当前业务的管理工具。</p><a class="hn-btn" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#demo-sandbox">预约产品演示 <span aria-hidden="true">↗</span></a></div><div class="hn-product-visual"><div class="hn-app-window" aria-label="业务系统界面示意"><div class="hn-app-bar"><span class="hn-app-mark">川</span><strong>经营管理工作台</strong><span class="hn-demo-label">界面示意</span></div><div class="hn-app-body"><aside><b>工作台</b><span>订单管理</span><span>商品管理</span><span>会员管理</span><span>库存管理</span><span>经营报表</span></aside><div class="hn-app-content"><h4>经营概览 <small>业务数据,一处查看</small></h4><div class="hn-stat-row"><div><span>销售管理</span><b>订单汇总</b><i></i></div><div><span>库存管理</span><b>出入库记录</b><i></i></div><div><span>会员管理</span><b>客户档案</b><i></i></div></div><div class="hn-chart"><div><b>销售趋势</b><span>销售 / 订单</span></div><svg viewBox="0 0 500 110" aria-hidden="true"><path d="M0 100H500M0 65H500M0 30H500" stroke="#e8edf3" fill="none"/><path d="M0 95 45 80 90 86 135 52 180 62 225 31 270 48 315 20 360 32 405 12 450 27 500 5V110H0Z" fill="#e8f0fe"/><path d="M0 95 45 80 90 86 135 52 180 62 225 31 270 48 315 20 360 32 405 12 450 27 500 5" stroke="#2563eb" stroke-width="3" fill="none"/></svg><div class="hn-chart-bottom"><span>业务记录</span><span>经营统计</span><span>趋势分析</span></div></div></div></div></div></div></div>
<div class="hn-products"><article><span class="hn-small">线上交易</span><h3>商城</h3><p>商品、订单、会员与营销管理,满足线上销售与日常运营。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">门店经营</span><h3>收银</h3><p>收款、退款、交班与门店对账,衔接一线操作和总部管理。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#demo-sandbox">申请演示 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">采购与库存</span><h3>进销存</h3><p>关联采购、销售、库存与往来账目,记录每一笔业务流转。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">订阅使用</span><h3>SaaS版本</h3><p>按订阅方式使用业务功能,适合希望简化部署和维护的企业。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询开通 <span aria-hidden="true">↗</span></a></article></div></div></section>
<div class="hn-products"><article><span class="hn-small">线上交易</span><h3>商城</h3><p>商品、订单、会员与营销管理,满足线上销售与日常运营。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">门店经营</span><h3>收银</h3><p>收款、退款、防重复扣款与门店对账,衔接一线操作和总部管理。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#demo-sandbox">申请演示 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">采购与库存</span><h3>进销存</h3><p>关联采购、销售、库存与往来账目,记录每一笔业务流转。</p><a class="hn-link" href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}#product-matrix">查看详情 <span aria-hidden="true">↗</span></a></article><article><span class="hn-small">订阅使用</span><h3>SaaS版本</h3><p>按订阅方式使用业务功能,适合希望简化部署和维护的企业。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询开通 <span aria-hidden="true">↗</span></a></article></div></div></section>
<section class="hn-section" id="cases"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">03 / 项目案例</p><h2>项目实践与行业应用</h2></div><div><p>项目案例:业务挑战与技术方案。<br>了解不同场景下的系统建设思路。</p><a class="hn-link" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}">浏览案例 <span aria-hidden="true">↗</span></a></div></div><div class="hn-cases"><a class="hn-case" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"><figure><img src="__ADDON__/images/showcases/case_distrib.svg" width="800" height="460" alt="分销订货与业务协同方案示意" loading="lazy"><figcaption>方案示意</figcaption></figure><div class="hn-case-copy"><span class="hn-small">商贸流通</span><h3>分销订货与业务协同<span aria-hidden="true">↗</span></h3><p>关联多渠道订单、库存和结算,衔接订货、审核与发货流程。</p></div></a><a class="hn-case" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"><figure><img src="__ADDON__/images/showcases/case_catering.svg" width="800" height="460" alt="收银与门店管理方案示意" loading="lazy"><figcaption>方案示意</figcaption></figure><div class="hn-case-copy"><span class="hn-small">连锁经营</span><h3>收银与门店管理<span aria-hidden="true">↗</span></h3><p>整合门店收款、单据同步与总部对账,统一业务记录。</p></div></a><a class="hn-case" href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"><figure><img src="__ADDON__/images/showcases/case_manufacture.svg" width="800" height="460" alt="进销存与供应商协同方案示意" loading="lazy"><figcaption>方案示意</figcaption></figure><div class="hn-case-copy"><span class="hn-small">生产管理</span><h3>进销存与供应商协同<span aria-hidden="true">↗</span></h3><p>连接采购、物料与生产,完善库存记录和供应商协作流程。</p></div></a></div></div></section>
<section class="hn-section hn-process-section" id="delivery"><div class="hn-wrap" id="process"><div class="hn-heading"><div><p class="hn-kicker">04 / 实施交付</p><h2>每一步,都有明确的交付</h2></div><p>项目推进流程<br>范围、进度与成果,按阶段沟通确认。</p></div><ol class="hn-process">
<li><span>01</span><h3>需求与方案</h3><p>了解业务流程、使用对象和现有系统,确认功能范围、预算与计划。</p><small>需求说明 / 实施方案</small></li><li><span>02</span><h3>设计与开发</h3><p>确认交互原型和技术方案,分阶段开发,并及时沟通调整事项。</p><small>交互原型 / 阶段版本</small></li><li><span>03</span><h3>测试与验收</h3><p>按约定业务场景开展测试,核对功能、数据和问题处理结果。</p><small>测试记录 / 验收清单</small></li><li><span>04</span><h3>上线与维护</h3><p>完成部署、操作培训与资料移交,按约定提供后续维护。</p><small>部署文档 / 使用培训</small></li></ol><div class="hn-delivery-note"><strong>交付清楚,后续有据。</strong><p>源码、接口文档、部署资料及维护安排,在项目启动前明确,具体以合同约定为准。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询交付安排 <span aria-hidden="true">↗</span></a></div></div></section>
<li><span>01</span><h3>需求与方案</h3><p>了解业务流程、使用对象和现有系统,确认功能范围、预算与计划。</p><small>需求说明 / 实施方案</small></li><li><span>02</span><h3>设计与开发</h3><p>确认交互原型和技术方案,分阶段开发,并及时沟通调整事项。</p><small>交互原型 / 阶段版本</small></li><li><span>03</span><h3>测试与验收</h3><p>按约定业务场景开展测试,核对功能、数据和问题处理结果。</p><small>测试记录 / 验收清单</small></li><li><span>04</span><h3>上线与维护</h3><p>完成部署、操作培训与资料移交,按约定提供后续维护。</p><small>部署文档 / 使用培训</small></li></ol><div class="hn-delivery-note"><strong>交付清楚,后续有据。</strong><p>源码交付、接口文档、代码审查记录、部署资料及维护安排,在项目启动前明确,具体以合同约定为准。</p><a class="hn-link" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">咨询交付安排 <span aria-hidden="true">↗</span></a></div></div></section>
<section class="hn-section hn-about"><div class="hn-wrap hn-about-grid"><figure><picture><source srcset="__ADDON__/images/home/office-editorial-v3.webp" type="image/webp"><img src="__ADDON__/images/home/office-editorial-v3.jpg" width="1536" height="1024" loading="lazy" alt="自然光下的现代办公洽谈空间,品牌意境图"></picture><figcaption>品牌意境图</figcaption></figure><div><p class="hn-kicker">05 / 关于纳海川</p><h2>认真理解业务,<br>踏实做好研发。</h2><p>贵阳纳海川科技有限公司,专注企业软件开发与业务系统建设。我们为企业提供软件定制、移动应用、智能体开发及标准化业务产品。</p><p>重视每一次需求确认、每一个阶段成果,也关注系统交付之后的日常使用。</p><a class="hn-link" href="{:addon_url('official/web.official_home/single',[':pid'=>1,':sid'=>1])}">了解我们 <span aria-hidden="true">↗</span></a><div class="hn-about-sign"><span>纳海川</span><small>贵阳 · 中国</small></div></div></div><div class="hn-wrap hn-feedback"><div><p class="hn-kicker">合作记录</p><h2>客户反馈</h2></div><div class="hn-quotes"><blockquote><p>“订货中台重构后,大促当天订单未出现积压,库存与财务账目一致。沟通直接,变更均有记录。”</p><footer>供应链企业 · 技术负责人<span>订货中台项目</span></footer></blockquote><blockquote><p>“收银员半天即可上手。门店断网时仍可正常收银,网络恢复后单据自动补传,月底对账工作量明显减少。”</p><footer>连锁零售企业 · 运营负责人<span>门店收银项目</span></footer></blockquote></div></div></section>
<section class="hn-section hn-soft" id="insights"><div class="hn-wrap"><div class="hn-heading"><div><p class="hn-kicker">06 / 研发记录</p><h2>技术与实践</h2></div><a class="hn-link" href="{:addon_url('official/web.official_journalism/list',[':pid'=>6,':sid'=>6])}">更多动态 <span aria-hidden="true">↗</span></a></div><div class="hn-news">{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}

查看文件

@@ -18,6 +18,14 @@ if [ ! -d ".git" ]; then
exit 1
fi
# 线上单独发布的页面必须先同步到仓库,避免硬重置覆盖已确认的改版。
# 数据库配置由下方单独保护;部署脚本自身允许独立安装此检查。
if ! git diff --quiet HEAD -- . ':(exclude)application/database.php' ':(exclude)deploy.sh'; then
echo "[${DATE}] 部署已停止:线上存在尚未同步到仓库的修改,请先核对并同步版本。" >> "${LOG_FILE}"
echo "Deploy stopped: live changes must be reconciled before reset."
exit 1
fi
# 备份关键环境配置
if [ -f "application/database.php" ]; then
cp -p application/database.php application/database.php.deploy_bak

查看文件

@@ -0,0 +1,25 @@
# 智能体页面版本恢复
## 原因与证据
2026 年 11 月 5 日 13:53(北京时间)的自动部署执行 `git reset --hard origin/master`。恢复前,服务器智能体模板修改时间为 `2026-11-05 13:53:20 +0800`,线上模板 SHA-256 与服务器 HEAD 提交中的模板完全一致,摘要为 `9c828e0e2fa24e57da004a577cc79933723f8ed8cbd3e9f26c8d5e54068b1ef9`。
服务器 HEAD 为 `7ce37ad`,reflog 记录了两次 `reset: moving to origin/master`。此前单独上传的新版模板没有同步到仓库,该操作将其替换为旧模板。配图与独立样式仍在,属于模板被覆盖,不是浏览器缓存。后续软件页发布清单未包含智能体模板。
## 恢复
恢复本地 `service_agent.html` 的已确认第二版,使用 `service-agent-v2.css?v=20261105c`、`landscape-v2` 与 `courtyard-v2` 配图。保留同期其他工作更新后的公共入口模板;入口最终版本包括智能体页 viewport、移动端旧轮播隐藏,同时保留 APP 和软件页已有设置。
恢复期间发现另一项部署也在更新资源及入口模板,已重新核对并保留其最新入口设置。备份为 `/www/backup/nhc-agent-v2-restore-20261105-150228`,入口核对备份为 `/www/backup/nhc-agent-wrapper-reconcile-20261105-150428`。清单位于 `runtime/agent-v2-restore-deployment.json` 与 `runtime/agent-wrapper-reconcile-deployment.json`。
## 防止重复覆盖
在 `deploy.sh` 的配置备份、拉取及硬重置之前加入 `git diff --quiet HEAD` 检查。线上存在尚未同步到仓库的已跟踪文件修改时,记录原因并停止部署。数据库配置维持原有单独保护,部署脚本自身从此检查排除。
未关闭 webhook,未推送仓库,也未触发全站 reset。脚本通过 `bash -n`;隔离临时仓库验证干净状态、仅配置与脚本调整、未暂存页面修改和已暂存页面修改四种情况。生产只读检查确认当前线上改版可被识别,后续硬重置将被阻止。原脚本备份为 `/www/backup/nhc-deploy-guard-20261105-150149/deploy.sh`。
后续自动发布前仍需把已确认的线上改版同步到代码仓库,或逐项核对差异;此检查负责阻止误覆盖,不会自动合并版本。外部工具绕开该脚本直接执行 reset 或文件覆盖时,不受此检查保护。
## 验证
服务页面和文案 11 项检查通过。桌面与 iPhone 请求返回 200,均引用第二版模板、样式和图片;浏览器验证新版标题与主视觉正常。手机轮播已隐藏,页面无横向溢出,问答支持键盘操作,无浏览器错误。软件页、APP 页、首页及案例页均返回 200。

查看文件

@@ -1,53 +1,65 @@
# -*- coding: utf-8 -*-
"""
全站独立页面精美视觉配图规范专项测试 (Dedicated Page Illustrations Test)
严格遵循 TDD 模式:
1. 验证软件定制独立页、APP定制独立页、智能体独立页、联系我们页均配有专属高品质现代中式矢量视窗图;
2. 验证所有图片文件真实存在于资源目录且尺寸有效;
3. 验证图片符合浅色专业风规范(背景 #FFFFFF/#F8FAFC、主色 #2563EB、无 emoji、有印章点缀与细线窗棂)。
1. 验证软件定制独立页、APP定制独立页、智能体独立页、联系我们页均配有专属高品质视窗图;
2. 验证新版服务页摄影配图真实存在、尺寸满足首屏展示要求,并提供 WebP 兼容版本;
3. 验证联系我们页矢量配图符合浅色专业风规范。
"""
import os
import unittest
from PIL import Image
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
RASTER_ROOT = os.path.join(ROOT_DIR, 'public', 'assets', 'addons', 'official', 'images')
SHOWCASE_ROOT = os.path.join(RASTER_ROOT, 'showcases')
SERVICE_HEROES = {
'software': ('software/structure-v2.jpg', 1440, 960),
'app': ('app/terminals.jpg', 1440, 960),
'agent': ('agent/landscape-v2.jpg', 1920, 640),
}
class TestDedicatedPageIllustrations(unittest.TestCase):
def setUp(self):
self.img_dir = os.path.join(ROOT_DIR, 'public/assets/addons/official/images/showcases')
self.template_dir = os.path.join(ROOT_DIR, 'addons/official/view/web')
def test_illustration_assets_exist(self):
"""测试 4 张专属精美视觉插图文件存在且内容有效"""
required_images = [
'service_software_hero.svg',
'service_app_hero.svg',
'service_agent_hero.svg',
'contact_headquarters.svg',
]
for img_name in required_images:
path = os.path.join(self.img_dir, img_name)
self.assertTrue(os.path.exists(path), f"缺少专属精美配图: {img_name}")
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
self.assertIn('<svg', content, f"{img_name} 必须是有效矢量 SVG")
self.assertIn('#2563EB', content, f"{img_name} 必须包含主色 #2563EB 科技蓝")
self.assertIn('nhc-seal', content, f"{img_name} 必须包含现代中式印章点缀")
"""测试专属配图文件存在、格式有效且尺寸满足展示要求"""
for key, (relative_path, minimum_width, minimum_height) in SERVICE_HEROES.items():
with self.subTest(page=key):
jpg_path = os.path.join(RASTER_ROOT, relative_path)
webp_path = os.path.splitext(jpg_path)[0] + '.webp'
self.assertTrue(os.path.isfile(jpg_path), f"缺少专属精美配图: {relative_path}")
self.assertTrue(os.path.isfile(webp_path), f"缺少 WebP 兼容版本: {relative_path}")
with Image.open(jpg_path) as hero:
width, height = hero.size
self.assertGreaterEqual(width, minimum_width, f"{relative_path} 宽度不足首屏要求")
self.assertGreaterEqual(height, minimum_height, f"{relative_path} 高度不足首屏要求")
self.assertGreater(os.path.getsize(jpg_path), 50_000, f"{relative_path} 文件过小")
contact_path = os.path.join(SHOWCASE_ROOT, 'contact_headquarters.svg')
with open(contact_path, encoding='utf-8') as stream:
contact_content = stream.read()
self.assertIn('<svg', contact_content, 'contact_headquarters.svg 必须是有效矢量 SVG')
def test_pages_embed_dedicated_illustrations(self):
"""测试各独立页面均正确嵌入对应的精美配图"""
pages = {
'software': ('official_product/service_software.html', 'service_software_hero.svg'),
'app': ('official_product/service_app.html', 'service_app_hero.svg'),
'agent': ('official_product/service_agent.html', 'service_agent_hero.svg'),
'software': ('official_product/service_software.html', 'images/software/structure-v2.jpg'),
'app': ('official_product/service_app.html', 'images/app/terminals.jpg'),
'agent': ('official_product/service_agent.html', 'images/agent/landscape-v2.jpg'),
'contact_pc': ('official_online_message/list.html', 'contact_headquarters.svg'),
'contact_m': ('official_online_message/list_e.html', 'contact_headquarters.svg'),
}
for key, (tpl_rel, img_name) in pages.items():
tpl_path = os.path.join(self.template_dir, tpl_rel)
with open(tpl_path, 'r', encoding='utf-8') as f:
html = f.read()
self.assertIn(img_name, html, f"页面 {tpl_rel} 必须正确引用专属配图 {img_name}")
template_dir = os.path.join(ROOT_DIR, 'addons', 'official', 'view', 'web')
for key, (template_relative_path, image_name) in pages.items():
with self.subTest(page=key):
template_path = os.path.join(template_dir, template_relative_path)
with open(template_path, encoding='utf-8') as stream:
html = stream.read()
self.assertIn(image_name, html, f"页面 {template_relative_path} 必须正确引用专属配图 {image_name}")
if __name__ == '__main__':
unittest.main()

查看文件

@@ -1,5 +1,4 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
新闻资讯与技术文章改版及丰富度测试 (TDD 模式)
验证文章独立页、移动端模板、首页联动、数据库种子文件及去AI味道规范
@@ -10,6 +9,12 @@ import unittest
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def _read_text(path):
with open(path, encoding="utf-8") as stream:
return stream.read()
class TestJournalismAndArticles(unittest.TestCase):
def setUp(self):
@@ -25,7 +30,7 @@ class TestJournalismAndArticles(unittest.TestCase):
def test_pc_list_template_spec(self):
"""验证 PC 端文章资讯列表页规范(标题、简介、缩略图专业排版)"""
self.assertTrue(os.path.exists(self.pc_list_path), "PC 文章列表模板 list.html 必须存在")
content = open(self.pc_list_path, 'r', encoding='utf-8').read()
content = _read_text(self.pc_list_path)
self.assertIn("纳海川", content, "必须包含品牌名称【纳海川】")
self.assertIsNone(re.search(r'纳川(?!海)', content), "严禁将品牌错误简写为【纳川】")
self.assertFalse(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]', content), "严禁包含任何 emoji")
@@ -40,7 +45,7 @@ class TestJournalismAndArticles(unittest.TestCase):
def test_pc_details_template_spec(self):
"""验证 PC 端文章资讯详情页规范"""
self.assertTrue(os.path.exists(self.pc_details_path), "PC 文章详情模板 details.html 必须存在")
content = open(self.pc_details_path, 'r', encoding='utf-8').read()
content = _read_text(self.pc_details_path)
self.assertIn("纳海川", content, "必须包含品牌名称【纳海川】")
self.assertIsNone(re.search(r'纳川(?!海)', content), "严禁将品牌错误简写为【纳川】")
self.assertFalse(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]', content), "严禁包含任何 emoji")
@@ -52,9 +57,9 @@ class TestJournalismAndArticles(unittest.TestCase):
"""验证移动端模板规范(标题、简介、缩略图专业排版)"""
self.assertTrue(os.path.exists(self.mobile_list_path), "移动端列表模板 list_e.html 必须存在")
self.assertTrue(os.path.exists(self.mobile_details_path), "移动端详情模板 details_e.html 必须存在")
list_content = open(self.mobile_list_path, 'r', encoding='utf-8').read()
details_content = open(self.mobile_details_path, 'r', encoding='utf-8').read()
list_content = _read_text(self.mobile_list_path)
details_content = _read_text(self.mobile_details_path)
self.assertIn("nhc-news-thumb", list_content, "移动端列表必须包含缩略图结构")
self.assertIn("nhc-news-title", list_content, "移动端列表必须包含标题结构")
self.assertIn("nhc-news-desc", list_content, "移动端列表必须包含简介结构")
@@ -64,7 +69,7 @@ class TestJournalismAndArticles(unittest.TestCase):
def test_css_design_tokens_for_articles(self):
"""验证 CSS 中已包含文章与资讯专属图文排版样式定义"""
css = open(self.css_path, 'r', encoding='utf-8').read()
css = _read_text(self.css_path)
self.assertIn(".nhc-news-row", css, "CSS 必须定义 .nhc-news-row 图文行卡片样式")
self.assertIn(".nhc-news-thumb", css, "CSS 必须定义 .nhc-news-thumb 缩略图样式")
self.assertIn(".nhc-news-title", css, "CSS 必须定义 .nhc-news-title 标题样式")
@@ -74,15 +79,15 @@ class TestJournalismAndArticles(unittest.TestCase):
def test_seed_sql_rich_articles(self):
"""验证数据库种子包含不少于 38 篇扎实深度专业文章"""
self.assertTrue(os.path.exists(self.seed_sql_path), "数据库种子文件 journalism_articles.sql 必须存在")
sql = open(self.seed_sql_path, 'r', encoding='utf-8').read()
sql = _read_text(self.seed_sql_path)
# 验证至少 38 篇优质文章插入 (初始 8 篇 + 新增 30 篇)
insert_count = (sql.count("INSERT INTO `fa_official_list_journalism`") +
insert_count = (sql.count("INSERT INTO `fa_official_list_journalism`") +
sql.count("INSERT INTO fa_official_list_journalism") +
sql.count("REPLACE INTO `fa_official_list_journalism`") +
sql.count("REPLACE INTO fa_official_list_journalism"))
self.assertGreaterEqual(insert_count, 38, f"必须有至少 38 篇高质量文章 SQL 写入语句 (当前: {insert_count})")
# 验证核心业务主题覆盖
self.assertIn("微服务", sql, "必须覆盖微服务架构深度文章")
self.assertIn("智能体", sql, "必须覆盖 AI 智能体/大模型与知识库落地文章")
@@ -90,20 +95,28 @@ class TestJournalismAndArticles(unittest.TestCase):
self.assertIn("缓存", sql, "必须覆盖分布式缓存相关深度文章")
self.assertIn("分库分表", sql, "必须覆盖数据库分库分表相关文章")
self.assertIn("先进先出", sql, "必须覆盖批次库存先进先出算法相关文章")
# 严禁假大空与 AI 味营销词汇
for bad_word in ["赋能千行百业", "颠覆式创新", "颠覆传统", "未来已来", "数字化新纪元", "技术委员会", "研发委员会", "原创技术资产", "工程受控说明"]:
self.assertNotIn(bad_word, sql, f"文章种子严禁包含 AI 味空话:{bad_word}")
def test_home_and_footer_linkage(self):
"""验证首页与页脚自然联动技术洞察板块"""
home = open(self.home_index_path, 'r', encoding='utf-8').read()
footer = open(self.footer_path, 'r', encoding='utf-8').read()
# 首页必须包含技术洞察/动态资讯展示区块
has_news_section = "nhc-insights-section" in home or "技术洞察" in home or "研发动态" in home
home = _read_text(self.home_index_path)
footer = _read_text(self.footer_path)
# 首页必须包含技术与实践/动态资讯展示区块
has_news_section = (
"nhc-insights-section" in home
or 'id="insights"' in home
or "技术洞察" in home
or "技术与实践" in home
or "研发动态" in home
or "研发记录" in home
or "official_journalism" in home
)
self.assertTrue(has_news_section, "首页必须包含技术洞察与研发动态板块")
# 页脚必须有技术资讯入口
has_insights_link = "official_journalism" in footer or "技术洞察" in footer or "新闻资讯" in footer
self.assertTrue(has_insights_link, "页脚必须包含技术洞察/新闻资讯链接")

查看文件

@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
"""
通俗易懂、去AI味、去啰嗦、面向客户与访客专项测试 (Plain and Concise Copywriting Test)
严格遵循 TDD 模式:
@@ -35,7 +34,7 @@ class TestPlainAndConciseCopywriting(unittest.TestCase):
self.contents = {}
for key, path in self.files.items():
if os.path.exists(path):
with open(path, 'r', encoding='utf-8') as f:
with open(path, encoding='utf-8') as f:
self.contents[key] = f.read()
else:
self.contents[key] = ''
@@ -72,13 +71,16 @@ class TestPlainAndConciseCopywriting(unittest.TestCase):
"""面向客户与访客的大白话表达:突出价值与保障"""
# 首页:通俗的防重复扣款与数据安全
self.assertIn('防重复扣款', self.contents['index'], "首页产品指标应使用客户一目了然的'防重复扣款'")
# 智能体页:通俗解释
self.assertTrue(
'拔掉外网网线' in self.contents['service_agent'] or '断网也能用' in self.contents['service_agent'],
"智能体页必须用通俗大白话解释内网安全"
'完全离线运行' in self.contents['service_agent'] or '私有化部署' in self.contents['service_agent'],
"智能体页必须用通俗大白话说明部署方式与数据边界"
)
self.assertTrue(
any(label in self.contents['service_agent'] for label in ('引用来源', '引用溯源', '引用展示')),
"智能体页必须讲清楚回答带有引用来源"
)
self.assertIn('标注原文出处', self.contents['service_agent'], "智能体页必须讲清楚回答带有出处")
# 案例页:拒绝“样本”,使用“数字化系统”;使用“自动同步防重复”
self.assertIn('数字化系统', self.contents['cases_page'])

查看文件

@@ -1,17 +1,15 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
站点配图与视觉丰富度自动化测试 (TDD)
验证:
1. 所有核心配图资产物理存在、非空且格式正确
2. PC 首页与移动端首页正确展示服务、产品、案例等丰富配图
3. 独立服务页、产品页、案例页包含深度高保真系统与业务界面配图
4. 关于我们页面包含专家徽章与资质认证图
4. 关于我们页面包含专家团队专业徽标与资质认证图
5. CSS 针对配图有严格的响应式(max-width: 100%、圆角、细线边框、悬停微光)控制
6. 无破损路径或 404 资源引用
"""
import os
import re
import unittest
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -62,35 +60,35 @@ class SiteImagesTest(unittest.TestCase):
self.assertGreater(size, 100, f"图片文件 {img_name} 大小不能过小")
def test_02_pc_and_mobile_homepage_service_images(self):
"""首页服务卡片必须包含对应的服务系统配图"""
with open(self.pc_home_path, 'r', encoding='utf-8') as f:
"""首页服务入口必须包含三个一致的服务视觉卡片"""
with open(self.pc_home_path, encoding='utf-8') as f:
pc_content = f.read()
with open(self.mobile_home_path, 'r', encoding='utf-8') as f:
with open(self.mobile_home_path, encoding='utf-8') as f:
mobile_content = f.read()
for content, page_name in [(pc_content, "PC 首页"), (mobile_content, "移动端首页")]:
self.assertIn('service_middle.svg', content, f"{page_name} 应包含软件中台服务配图")
self.assertIn('service_app.svg', content, f"{page_name} 应包含APP小程序定制服务配图")
self.assertIn('service_agent.svg', content, f"{page_name} 应包含智能体定制服务配图")
self.assertEqual(content.count('hn-service-top'), 3, f"{page_name} 应包含三个服务视觉卡片")
for service_name in ['软件开发', 'APP与小程序定制', '智能体开发']:
self.assertIn(service_name, content, f"{page_name} 应包含服务入口:{service_name}")
def test_03_pc_and_mobile_homepage_product_images(self):
"""首页产品卡片必须包含产品界面示意配图"""
with open(self.pc_home_path, 'r', encoding='utf-8') as f:
"""首页产品区必须包含经营工作台示意与四类产品入口"""
with open(self.pc_home_path, encoding='utf-8') as f:
pc_content = f.read()
with open(self.mobile_home_path, 'r', encoding='utf-8') as f:
with open(self.mobile_home_path, encoding='utf-8') as f:
mobile_content = f.read()
for content, page_name in [(pc_content, "PC 首页"), (mobile_content, "移动端首页")]:
self.assertIn('product_mall.svg', content, f"{page_name} 应包含商城产品配图")
self.assertIn('product_pos.svg', content, f"{page_name} 应包含收银产品配图")
self.assertIn('product_erp.svg', content, f"{page_name} 应包含进销存产品配图")
self.assertIn('product_saas.svg', content, f"{page_name} 应包含SaaS产品配图")
self.assertIn('hn-app-window', content, f"{page_name} 应包含经营工作台界面示意")
self.assertIn('hn-chart', content, f"{page_name} 应包含经营趋势示意")
for product_name in ['商城', '收银', '进销存', 'SaaS版本']:
self.assertIn(product_name, content, f"{page_name} 应包含产品入口:{product_name}")
def test_04_cases_pages_have_preview_images(self):
"""标杆案例卡片必须配有真实的业务系统视窗图"""
with open(self.case_page_path, 'r', encoding='utf-8') as f:
with open(self.case_page_path, encoding='utf-8') as f:
case_pc = f.read()
with open(self.case_mobile_path, 'r', encoding='utf-8') as f:
with open(self.case_mobile_path, encoding='utf-8') as f:
case_mobile = f.read()
for content, page_name in [(case_pc, "PC 案例独立页"), (case_mobile, "移动端案例独立页")]:
@@ -101,9 +99,9 @@ class SiteImagesTest(unittest.TestCase):
def test_05_service_and_product_pages_have_showcases(self):
"""独立服务页与产品页必须嵌入高质量系统拓扑与界面大图"""
with open(self.service_page_path, 'r', encoding='utf-8') as f:
with open(self.service_page_path, encoding='utf-8') as f:
service_content = f.read()
with open(self.product_page_path, 'r', encoding='utf-8') as f:
with open(self.product_page_path, encoding='utf-8') as f:
product_content = f.read()
self.assertIn('service_middle.svg', service_content)
@@ -117,9 +115,9 @@ class SiteImagesTest(unittest.TestCase):
def test_06_about_pages_have_expert_and_cert_badges(self):
"""关于我们页必须包含专家团队专业徽标与资质认证图"""
with open(self.about_page_path, 'r', encoding='utf-8') as f:
with open(self.about_page_path, encoding='utf-8') as f:
about_pc = f.read()
with open(self.about_mobile_path, 'r', encoding='utf-8') as f:
with open(self.about_mobile_path, encoding='utf-8') as f:
about_mobile = f.read()
for content, page_name in [(about_pc, "PC 关于我们页"), (about_mobile, "移动端关于我们页")]:
@@ -132,7 +130,7 @@ class SiteImagesTest(unittest.TestCase):
def test_07_responsive_image_styles_in_css(self):
"""CSS 必须具备严谨的配图自适应与质感样式定义"""
with open(self.css_path, 'r', encoding='utf-8') as f:
with open(self.css_path, encoding='utf-8') as f:
css = f.read()
self.assertIn('.nhc-card-thumb', css, "CSS 应定义 .nhc-card-thumb 图片容器类")

查看文件

@@ -1,58 +1,56 @@
# -*- coding: utf-8 -*-
"""
测试高端大气轮播图主视觉系统 (Test Premium Hero Visual Banners)
验证首屏 4 张轮播图的高清画质、纯净无杂乱文字、高端科技美学、CSS 通透羽化及响应式适配。
测试首页高端主视觉系统 (Test Premium Home Hero Visual)
验证宽幅首屏摄影的高清画质、响应式图片源、桌面与移动端一致引用、
无文字遮挡的渐变处理、响应式断点与减少动态效果适配。
"""
import os
import re
import unittest
from PIL import Image
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
BANNER_DIR = os.path.join(ROOT_DIR, "public", "assets", "addons", "official", "images", "banners")
CSS_PATH = os.path.join(ROOT_DIR, "public", "assets", "addons", "official", "css", "modern_nhc.css")
HERO_IMAGE_DIR = os.path.join(ROOT_DIR, "public", "assets", "addons", "official", "images", "home")
CSS_PATH = os.path.join(ROOT_DIR, "public", "assets", "addons", "official", "css", "home-v3.css")
PC_HOME_PATH = os.path.join(ROOT_DIR, "addons", "official", "view", "web", "official_home", "index.html")
M_HOME_PATH = os.path.join(ROOT_DIR, "addons", "official", "view", "web", "official_home", "index_e.html")
class PremiumHeroBannerTest(unittest.TestCase):
"""验证高端大气轮播图主视觉"""
"""验证首页宽幅主视觉"""
def test_01_banner_images_high_quality(self):
"""1. 验证 4 张核心轮播大图物理存在、分辨率高、画质饱满"""
banners = ["banner_lead.jpg", "banner_craft.jpg", "banner_agent.jpg", "banner_matrix.jpg"]
for b in banners:
img_path = os.path.join(BANNER_DIR, b)
self.assertTrue(os.path.exists(img_path), f"轮播图不存在: {b}")
file_size = os.path.getsize(img_path)
self.assertGreater(file_size, 200 * 1024, f"轮播图画质过低或文件过小: {b} ({file_size} bytes)")
with Image.open(img_path) as im:
width, height = im.size
self.assertGreaterEqual(width, 1280, f"宽度不足高清要求: {b}")
self.assertGreaterEqual(height, 700, f"高度不足首屏要求: {b}")
def test_01_hero_image_high_quality(self):
"""1. 验证首屏宽幅摄影物理存在、分辨率高、画质饱满"""
hero_path = os.path.join(HERO_IMAGE_DIR, "river-courtyard-v3.jpg")
self.assertTrue(os.path.exists(hero_path), "首屏宽幅摄影不存在")
self.assertGreater(os.path.getsize(hero_path), 150 * 1024, "首屏摄影文件过小")
def test_02_css_uses_clean_banners_and_clear_masks(self):
"""2. 验证 CSS 使用全新大图,且羽化渐变遮罩在右侧(>52%)完全通透无遮挡"""
with open(CSS_PATH, "r", encoding="utf-8") as f:
css_content = f.read()
with Image.open(hero_path) as hero:
width, height = hero.size
self.assertGreaterEqual(width, 1800, "首屏摄影宽度不足宽幅要求")
self.assertGreaterEqual(height, 700, "首屏摄影高度不足首屏要求")
for b in ["banner_lead.jpg", "banner_craft.jpg", "banner_agent.jpg", "banner_matrix.jpg"]:
self.assertIn(b, css_content, f"CSS 中未正确引用大图: {b}")
def test_02_css_uses_responsive_hero_and_accessible_motion(self):
"""2. 验证专属 CSS 提供首屏布局、响应式断点与减少动态效果适配"""
with open(CSS_PATH, encoding="utf-8") as stream:
css_content = stream.read()
# 检查是否去除了原本在 50% 覆盖 0.92 白色的遮罩问题
self.assertNotIn("rgba(255, 255, 255, 0.92) 50%", css_content,
"CSS 仍保留 50% 处 92% 重度白色遮罩")
self.assertIn(".hn-hero-picture", css_content, "CSS 未正确定义首屏图片容器")
self.assertIn("object-fit", css_content, "CSS 应规范首屏图片的适应展示模式")
self.assertIn("linear-gradient", css_content, "CSS 应使用渐变为文字保留可读区域")
self.assertIn("@media(max-width:768px)", css_content, "CSS 缺少移动端首屏适配断点")
self.assertIn("prefers-reduced-motion", css_content, "CSS 应支持减少动态效果")
def test_03_pc_and_mobile_template_integrity(self):
"""3. 验证 PC 与移动端模板幻灯片数量均为 4,包含对应的主题类名"""
"""3. 验证 PC 与移动端模板引用同一套响应式首屏图片"""
for page_path in [PC_HOME_PATH, M_HOME_PATH]:
with open(page_path, "r", encoding="utf-8") as f:
html = f.read()
for i in range(1, 5):
self.assertIn(f"nhc-slide-theme-{i}", html, f"页面缺少主题类 nhc-slide-theme-{i}: {page_path}")
self.assertEqual(len(re.findall(r'nhc-slide-theme-\d', html)), 4, f"幻灯片数量不等于 4: {page_path}")
with open(page_path, encoding="utf-8") as stream:
html = stream.read()
self.assertEqual(html.count("hn-hero-picture"), 1, f"首屏图片容器数量应为 1:{page_path}")
self.assertIn("river-courtyard-v3.webp", html, f"页面缺少 WebP 首屏图片源:{page_path}")
self.assertIn("river-courtyard-v3.jpg", html, f"页面缺少 JPEG 首屏图片回退:{page_path}")
self.assertIn('fetchpriority="high"', html, f"首屏图片应优先加载:{page_path}")
self.assertRegex(html, r'<img[^>]+alt="[^"]{4,}"', f"首屏图片应包含有效替代文本:{page_path}")
if __name__ == "__main__":