官网改版上线:关于我们与联系我们页重构、首页AI主视觉v4、品牌标识与导航交互;同步测试与设计文档

这个提交包含在:
wikiboss
2026-11-05 16:04:20 +08:00
父节点 96a3f8b672
当前提交 e924c8d872
共有 39 个文件被更改,包括 2742 次插入 和 2591 次删除

查看文件

@@ -1,12 +1,15 @@
<link rel="stylesheet" href="__ADDON__/css/modern_nhc.css?v=20261009_grand">
<link rel="stylesheet" href="__ADDON__/css/typography-nhc.css?v=20261105_yahei">
<link rel="stylesheet" href="__ADDON__/m/css/materialize.css">
<link rel="stylesheet" href="__ADDON__/m/css/loader.css">
<link rel="stylesheet" href="__ADDON__/m/css/lightbox.css">
<link rel="stylesheet" href="__ADDON__/m/css/fontawesome.min.css">
<link rel="stylesheet" href="__ADDON__/m/css/owl.carousel.min.css">
<link rel="stylesheet" href="__ADDON__/m/css/owl.theme.default.min.css">
<link rel="stylesheet" href="__ADDON__/layui-v2.6.8/layui-v2.6.8/layui/css/layui.css">
<script src="__ADDON__/layui-v2.6.8/layui-v2.6.8/layui/layui.js"></script>
<link rel="stylesheet" href="__ADDON__/m/css/style.css">
<!--<script src="__ADDON__/m/js/lightbox.js"></script>-->
<link rel="stylesheet" href="__ADDON__/css/modern_nhc.css?v=20261009_grand">
<link rel="stylesheet" href="__ADDON__/css/typography-nhc.css?v=20261105_yahei">
<link rel="stylesheet" href="__ADDON__/css/header-brand.css?v=20261105_mobile_nav_fix">
<link rel="stylesheet" href="__ADDON__/m/css/materialize.css">
<link rel="stylesheet" href="__ADDON__/m/css/loader.css">
<link rel="stylesheet" href="__ADDON__/m/css/lightbox.css">
<link rel="stylesheet" href="__ADDON__/m/css/fontawesome.min.css">
<link rel="stylesheet" href="__ADDON__/m/css/owl.carousel.min.css">
<link rel="stylesheet" href="__ADDON__/m/css/owl.theme.default.min.css">
<link rel="stylesheet" href="__ADDON__/layui-v2.6.8/layui-v2.6.8/layui/css/layui.css">
<script src="__ADDON__/layui-v2.6.8/layui-v2.6.8/layui/layui.js"></script>
<link rel="stylesheet" href="__ADDON__/m/css/style.css">
<!--<script src="__ADDON__/m/js/lightbox.js"></script>-->
<script defer src="__ADDON__/js/header-scroll.js?v=20261105_scroll"></script>

查看文件

@@ -1,6 +1,7 @@
<link href="__ADDON__/images/favicon.ico" type="image/x-icon" rel="icon">
<link href="__ADDON__/css/modern_nhc.css?v=20261105_contrast" rel="stylesheet" type="text/css">
<link href="__ADDON__/css/typography-nhc.css?v=20261105_yahei" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="__ADDON__/css/header-brand.css?v=20261105_mobile_nav_fix">
<link href="__ADDON__/css/style.css" rel="stylesheet" type="text/css">
<link href="__ADDON__/css/animate.css" rel="stylesheet" type="text/css">
<link href="__ADDON__/css/page_style.css" rel="stylesheet" type="text/css">
@@ -10,3 +11,5 @@
<script type="text/javascript" src="__ADDON__/js/animate.js"></script>
<script defer src="__ADDON__/js/header-scroll.js?v=20261105_scroll"></script>

查看文件

@@ -3,45 +3,15 @@
<div class="nhc-container">
<div class="nhc-nav-inner">
<!-- 网站 Logo 与中式品牌名称 -->
<div class="nhc-logo">
<a
href="{:addon_url('official/web.official_home/index')}"
style="display: flex; align-items: center; gap: 12px"
>
{if __config('site_logo','value')}
<img
src="{:__config('site_logo','value')}"
alt="{:__config('basic_title','value')}"
style="height: 38px; width: auto"
/>
{else/}
<div
style="
width: 36px;
height: 36px;
background: var(--primary);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
border-radius: var(--radius-sm);
font-size: 18px;
"
>
川
</div>
{/if}
<div class="nhc-logo-brand">
<span class="nhc-logo-text">纳海川</span>
<span class="nhc-logo-sub">NAHAICHUAN</span>
</div>
</a>
<span class="nhc-seal" style="margin-left: 8px">纳海川</span>
</div>
<div class="nhc-logo">
<a class="nhc-brand-home" href="{:addon_url('official/web.official_home/index')}" aria-label="纳海川科技首页">
<span class="nhc-brand-symbol" aria-hidden="true"></span>
<span class="nhc-logo-brand"><span class="nhc-logo-text">纳海川</span><span class="nhc-logo-sub">企业软件研发</span></span>
</a>
</div>
<!-- 主导航菜单 (服务、产品、案例、关于我们、联系我们) -->
<nav>
<nav class="nhc-main-nav" aria-label="主导航">
<ul class="nhc-nav-menu">
<li>
<a
@@ -645,7 +615,7 @@
<path d="M5 12h14M12 5l7 7-7 7" />
</svg>
</a>
</div>
</div><details class="nhc-compact-menu"><summary>菜单 <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"/></svg></summary><nav aria-label="窄屏主导航"><a href="{:addon_url('official/web.official_home/index')}">首页</a><a href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}">服务</a><a href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}">产品</a><a href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}">案例</a><a href="{:addon_url('official/web.official_home/single',[':pid'=>1,':sid'=>1])}">关于我们</a><a href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">联系我们</a></nav></details>
</div>
</div>
</header>

查看文件

@@ -1,31 +1,507 @@
{extend name="web/official_common/pc/base" /}
{block name="css"}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="__ADDON__/css/home-v3.css?v=20261105-v3">
{/block}
{block name="content"}
{extend name="web/official_common/pc/base" /} {block name="css"}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="__ADDON__/css/home-v3.css?v=20261105-v3" />
{/block} {block name="content"}
<main class="home-nhc" id="home-main">
<a class="hn-skip" href="#services">跳至服务内容</a>
<section class="hn-hero">
<picture class="hn-hero-picture"><source srcset="__ADDON__/images/home/river-courtyard-v3.webp" type="image/webp"><img src="__ADDON__/images/home/river-courtyard-v3.jpg" width="2400" height="960" alt="远山与庭院之间,蓝色玻璃曲线沿水面延展" fetchpriority="high"></picture>
<div class="hn-wrap hn-hero-content"><p class="hn-kicker">纳海川科技 / 企业软件服务</p><h1>为企业经营,<br>做好每一套软件。</h1><p class="hn-hero-desc">软件定制、APP与小程序、企业智能体。<br>从业务梳理到上线维护,提供完整的研发服务。</p><div class="hn-actions"><a class="hn-btn" href="#contact">沟通项目需求 <span aria-hidden="true">↗</span></a><a class="hn-outline" href="#products">浏览产品 <span aria-hidden="true">↗</span></a></div></div>
<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 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>
<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>
<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}
<article><a href="{:addon_url('official/web.official_journalism/details',[':pid'=>6,':sid'=>$art['official_category_id'],':id'=>$art['id']])}"><figure><img src="{$cover_src}" alt="{$art['title']}" width="800" height="450" loading="lazy"></figure><time datetime="{:date('Y-m-d', $art['createtime'])}">{:date('Y-m-d', $art['createtime'])}</time><h3>{$art['title']}</h3><span class="hn-read">阅读全文 <span aria-hidden="true">↗</span></span></a></article>
{/foreach}{else/}<p class="hn-empty">项目与技术记录持续更新中,您也可以直接与我们讨论具体需求。</p>{/if}</div></div></section>
<section class="hn-section" id="faq"><div class="hn-wrap hn-faq-grid"><div><p class="hn-kicker">合作问答</p><h2>开始之前,<br>您可能关心</h2></div><div class="hn-faq-list"><details open><summary>只有初步想法,可以先沟通吗?<span aria-hidden="true">+</span></summary><p>可以。先说明使用对象、主要业务流程和希望解决的问题,我们一起梳理建设方向;涉及详细调研或原型设计的工作,再根据工作量单独约定。</p></details><details><summary>项目费用和周期如何确定?<span aria-hidden="true">+</span></summary><p>根据功能范围、流程复杂度、终端数量和接口条件进行评估,确认阶段计划和费用清单。服务器及第三方服务费用另行说明。</p></details><details><summary>已有系统,可以改造或增加功能吗?<span aria-hidden="true">+</span></summary><p>先评估现有源码、接口、数据结构与运行环境,具备条件后确定改造范围;涉及数据迁移与系统切换时,单独安排验证。</p></details></div></div></section>
<section class="hn-contact" id="contact"><div class="hn-wrap"><div><p class="hn-kicker">与纳海川谈谈您的项目</p><h2>从一次沟通,<br>开始您的软件项目。</h2><p>有具体的系统研发或产品选型需求?可以直接沟通</p></div><div class="hn-contact-actions"><a class="hn-btn" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">提交项目需求 <span aria-hidden="true">↗</span></a><a class="hn-phone" href="tel:{:__config('site_mobile','value')}"><small>电话咨询</small><span>{:__config('site_mobile','value')}</span></a><p>业务场景 / 现有系统 / 期望时间</p></div></div></section>
<a class="hn-skip" href="#services">跳至服务内容</a>
<section class="hn-hero">
<picture class="hn-hero-picture">
<source media="(max-width: 768px)" srcset="__ADDON__/images/home/ai-computing-mobile-v4.webp" type="image/webp">
<source media="(max-width: 768px)" srcset="__ADDON__/images/home/ai-computing-mobile-v4.jpg" type="image/jpeg">
<source srcset="__ADDON__/images/home/ai-computing-v4.webp" type="image/webp">
<img src="__ADDON__/images/home/ai-computing-v4.jpg" width="1983" height="793" alt="蓝色玻璃计算核心连接神经网络球体与数据节点,呈现人工智能与软件技术" fetchpriority="high">
</picture>
<div class="hn-wrap hn-hero-content">
<p class="hn-kicker">纳海川科技 / 企业软件服务</p>
<h1>为企业经营,<br />做好每一套软件。</h1>
<p class="hn-hero-desc">
软件定制、APP与小程序、企业智能体。<br />从业务梳理到上线维护,提供完整的研发服务。
</p>
<div class="hn-actions">
<a class="hn-btn" href="#contact"
>沟通项目需求 <span aria-hidden="true">↗</span></a
><a class="hn-outline" href="#products"
>浏览产品 <span aria-hidden="true">↗</span></a
>
</div>
</div>
<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 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>
<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>
<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}
<article>
<a
href="{:addon_url('official/web.official_journalism/details',[':pid'=>6,':sid'=>$art['official_category_id'],':id'=>$art['id']])}"
><figure>
<img
src="{$cover_src}"
alt="{$art['title']}"
width="800"
height="450"
loading="lazy"
/>
</figure>
<time datetime="{:date('Y-m-d', $art['createtime'])}"
>{:date('Y-m-d', $art['createtime'])}</time
>
<h3>{$art['title']}</h3>
<span class="hn-read">阅读全文 <span aria-hidden="true">↗</span></span></a
>
</article>
{/foreach}{else/}
<p class="hn-empty">
项目与技术记录持续更新中,您也可以直接与我们讨论具体需求。
</p>
{/if}
</div>
</div>
</section>
<section class="hn-section" id="faq">
<div class="hn-wrap hn-faq-grid">
<div>
<p class="hn-kicker">合作问答</p>
<h2>开始之前,<br />您可能关心</h2>
</div>
<div class="hn-faq-list">
<details open>
<summary>
只有初步想法,可以先沟通吗?<span aria-hidden="true">+</span>
</summary>
<p>
可以。先说明使用对象、主要业务流程和希望解决的问题,我们一起梳理建设方向;涉及详细调研或原型设计的工作,再根据工作量单独约定。
</p>
</details>
<details>
<summary>
项目费用和周期如何确定?<span aria-hidden="true">+</span>
</summary>
<p>
根据功能范围、流程复杂度、终端数量和接口条件进行评估,确认阶段计划和费用清单。服务器及第三方服务费用另行说明。
</p>
</details>
<details>
<summary>
已有系统,可以改造或增加功能吗?<span aria-hidden="true">+</span>
</summary>
<p>
先评估现有源码、接口、数据结构与运行环境,具备条件后确定改造范围;涉及数据迁移与系统切换时,单独安排验证。
</p>
</details>
</div>
</div>
</section>
<section class="hn-contact" id="contact">
<div class="hn-wrap">
<div>
<p class="hn-kicker">与纳海川谈谈您的项目</p>
<h2>从一次沟通,<br />开始您的软件项目。</h2>
<p>有具体的系统研发或产品选型需求?可以直接沟通</p>
</div>
<div class="hn-contact-actions">
<a
class="hn-btn"
href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}"
>提交项目需求 <span aria-hidden="true">↗</span></a
><a class="hn-phone" href="tel:{:__config('site_mobile','value')}"
><small>电话咨询</small><span>{:__config('site_mobile','value')}</span></a
>
<p>业务场景 / 现有系统 / 期望时间</p>
</div>
</div>
</section>
</main>
{/block}

查看文件

@@ -1,32 +1,555 @@
{extend name="web/official_common/mobile/base" /}
{block name="css"}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="__ADDON__/css/home-v3.css?v=20261105-v3">
<style>body > .slide, body > .navbar, body > .sidebar-panel {display:none}</style>
{/block}
{block name="content"}
{extend name="web/official_common/mobile/base" /} {block name="css"}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="__ADDON__/css/home-v3.css?v=20261105-v3" />
<style>
body > .slide,
body > .navbar,
body > .sidebar-panel {
display: none;
}
</style>
{/block} {block name="content"}
<main class="home-nhc" id="home-main">
<header class="hn-mobile-header"><a class="hn-mobile-brand" href="{:addon_url('official/web.official_home/index')}">纳海川<span>NAHAICHUAN</span></a><a class="hn-mobile-contact" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">联系咨询</a><details class="hn-mobile-menu"><summary>菜单 <svg aria-hidden="true" viewBox="0 0 24 24"><path d="M4 7h16M4 12h16M4 17h16"/></svg></summary><nav aria-label="主菜单"><a href="{:addon_url('official/web.official_home/index')}" aria-current="page">首页</a><a href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}">服务</a><a href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}">产品</a><a href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}">案例</a><a href="{:addon_url('official/web.official_home/single',[':pid'=>1,':sid'=>1])}">关于我们</a><a href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">联系我们</a></nav></details></header>
<a class="hn-skip" href="#services">跳至服务内容</a>
<section class="hn-hero">
<picture class="hn-hero-picture"><source srcset="__ADDON__/images/home/river-courtyard-v3.webp" type="image/webp"><img src="__ADDON__/images/home/river-courtyard-v3.jpg" width="2400" height="960" alt="远山与庭院之间,蓝色玻璃曲线沿水面延展" fetchpriority="high"></picture>
<div class="hn-wrap hn-hero-content"><p class="hn-kicker">纳海川科技 / 企业软件服务</p><h1>为企业经营,<br>做好每一套软件。</h1><p class="hn-hero-desc">软件定制、APP与小程序、企业智能体。<br>从业务梳理到上线维护,提供完整的研发服务。</p><div class="hn-actions"><a class="hn-btn" href="#contact">沟通项目需求 <span aria-hidden="true">↗</span></a><a class="hn-outline" href="#products">浏览产品 <span aria-hidden="true">↗</span></a></div></div>
<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 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>
<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>
<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}
<article><a href="{:addon_url('official/web.official_journalism/details',[':pid'=>6,':sid'=>$art['official_category_id'],':id'=>$art['id']])}"><figure><img src="{$cover_src}" alt="{$art['title']}" width="800" height="450" loading="lazy"></figure><time datetime="{:date('Y-m-d', $art['createtime'])}">{:date('Y-m-d', $art['createtime'])}</time><h3>{$art['title']}</h3><span class="hn-read">阅读全文 <span aria-hidden="true">↗</span></span></a></article>
{/foreach}{else/}<p class="hn-empty">项目与技术记录持续更新中,您也可以直接与我们讨论具体需求。</p>{/if}</div></div></section>
<section class="hn-section" id="faq"><div class="hn-wrap hn-faq-grid"><div><p class="hn-kicker">合作问答</p><h2>开始之前,<br>您可能关心</h2></div><div class="hn-faq-list"><details open><summary>只有初步想法,可以先沟通吗?<span aria-hidden="true">+</span></summary><p>可以。先说明使用对象、主要业务流程和希望解决的问题,我们一起梳理建设方向;涉及详细调研或原型设计的工作,再根据工作量单独约定。</p></details><details><summary>项目费用和周期如何确定?<span aria-hidden="true">+</span></summary><p>根据功能范围、流程复杂度、终端数量和接口条件进行评估,确认阶段计划和费用清单。服务器及第三方服务费用另行说明。</p></details><details><summary>已有系统,可以改造或增加功能吗?<span aria-hidden="true">+</span></summary><p>先评估现有源码、接口、数据结构与运行环境,具备条件后确定改造范围;涉及数据迁移与系统切换时,单独安排验证。</p></details></div></div></section>
<section class="hn-contact" id="contact"><div class="hn-wrap"><div><p class="hn-kicker">与纳海川谈谈您的项目</p><h2>从一次沟通,<br>开始您的软件项目。</h2><p>有具体的系统研发或产品选型需求?可以直接沟通</p></div><div class="hn-contact-actions"><a class="hn-btn" href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}">提交项目需求 <span aria-hidden="true">↗</span></a><a class="hn-phone" href="tel:{:__config('site_mobile','value')}"><small>电话咨询</small><span>{:__config('site_mobile','value')}</span></a><p>业务场景 / 现有系统 / 期望时间</p></div></div></section>
<header class="hn-mobile-header">
<a
class="hn-mobile-brand"
href="{:addon_url('official/web.official_home/index')}"
>纳海川<span>NAHAICHUAN</span></a
><a
class="hn-mobile-contact"
href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}"
>联系咨询</a
>
<details class="hn-mobile-menu">
<summary>
菜单
<svg aria-hidden="true" viewBox="0 0 24 24">
<path d="M4 7h16M4 12h16M4 17h16" />
</svg>
</summary>
<nav aria-label="主菜单">
<a
href="{:addon_url('official/web.official_home/index')}"
aria-current="page"
>首页</a
><a
href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}"
>服务</a
><a
href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}"
>产品</a
><a
href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"
>案例</a
><a
href="{:addon_url('official/web.official_home/single',[':pid'=>1,':sid'=>1])}"
>关于我们</a
><a
href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}"
>联系我们</a
>
</nav>
</details>
</header>
<a class="hn-skip" href="#services">跳至服务内容</a>
<section class="hn-hero">
<picture class="hn-hero-picture">
<source media="(max-width: 768px)" srcset="__ADDON__/images/home/ai-computing-mobile-v4.webp" type="image/webp">
<source media="(max-width: 768px)" srcset="__ADDON__/images/home/ai-computing-mobile-v4.jpg" type="image/jpeg">
<source srcset="__ADDON__/images/home/ai-computing-v4.webp" type="image/webp">
<img src="__ADDON__/images/home/ai-computing-v4.jpg" width="1983" height="793" alt="蓝色玻璃计算核心连接神经网络球体与数据节点,呈现人工智能与软件技术" fetchpriority="high">
</picture>
<div class="hn-wrap hn-hero-content">
<p class="hn-kicker">纳海川科技 / 企业软件服务</p>
<h1>为企业经营,<br />做好每一套软件。</h1>
<p class="hn-hero-desc">
软件定制、APP与小程序、企业智能体。<br />从业务梳理到上线维护,提供完整的研发服务。
</p>
<div class="hn-actions">
<a class="hn-btn" href="#contact"
>沟通项目需求 <span aria-hidden="true">↗</span></a
><a class="hn-outline" href="#products"
>浏览产品 <span aria-hidden="true">↗</span></a
>
</div>
</div>
<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 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>
<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>
<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}
<article>
<a
href="{:addon_url('official/web.official_journalism/details',[':pid'=>6,':sid'=>$art['official_category_id'],':id'=>$art['id']])}"
><figure>
<img
src="{$cover_src}"
alt="{$art['title']}"
width="800"
height="450"
loading="lazy"
/>
</figure>
<time datetime="{:date('Y-m-d', $art['createtime'])}"
>{:date('Y-m-d', $art['createtime'])}</time
>
<h3>{$art['title']}</h3>
<span class="hn-read">阅读全文 <span aria-hidden="true">↗</span></span></a
>
</article>
{/foreach}{else/}
<p class="hn-empty">
项目与技术记录持续更新中,您也可以直接与我们讨论具体需求。
</p>
{/if}
</div>
</div>
</section>
<section class="hn-section" id="faq">
<div class="hn-wrap hn-faq-grid">
<div>
<p class="hn-kicker">合作问答</p>
<h2>开始之前,<br />您可能关心</h2>
</div>
<div class="hn-faq-list">
<details open>
<summary>
只有初步想法,可以先沟通吗?<span aria-hidden="true">+</span>
</summary>
<p>
可以。先说明使用对象、主要业务流程和希望解决的问题,我们一起梳理建设方向;涉及详细调研或原型设计的工作,再根据工作量单独约定。
</p>
</details>
<details>
<summary>
项目费用和周期如何确定?<span aria-hidden="true">+</span>
</summary>
<p>
根据功能范围、流程复杂度、终端数量和接口条件进行评估,确认阶段计划和费用清单。服务器及第三方服务费用另行说明。
</p>
</details>
<details>
<summary>
已有系统,可以改造或增加功能吗?<span aria-hidden="true">+</span>
</summary>
<p>
先评估现有源码、接口、数据结构与运行环境,具备条件后确定改造范围;涉及数据迁移与系统切换时,单独安排验证。
</p>
</details>
</div>
</div>
</section>
<section class="hn-contact" id="contact">
<div class="hn-wrap">
<div>
<p class="hn-kicker">与纳海川谈谈您的项目</p>
<h2>从一次沟通,<br />开始您的软件项目。</h2>
<p>有具体的系统研发或产品选型需求?可以直接沟通</p>
</div>
<div class="hn-contact-actions">
<a
class="hn-btn"
href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}"
>提交项目需求 <span aria-hidden="true">↗</span></a
><a class="hn-phone" href="tel:{:__config('site_mobile','value')}"
><small>电话咨询</small><span>{:__config('site_mobile','value')}</span></a
>
<p>业务场景 / 现有系统 / 期望时间</p>
</div>
</div>
</section>
</main>
{/block}

查看文件

@@ -1,503 +1,297 @@
{extend name="web/official_common/pc/base" /} {block name="content"}
<!-- 纳海川官方网站 · 关于我们独立页 (About Us Page) 开始 -->
<!-- 1. 关于我们 Hero 视窗 -->
<section class="nhc-page-hero nhc-lattice-pattern">
<div class="nhc-container">
<div class="nhc-breadcrumb">
<a href="{:addon_url('official/web.official_home/index')}">首页</a>
<span>/</span>
<span>关于我们</span>
</div>
<div style="margin-bottom: 16px">
<span class="nhc-seal">自主可控 · 源码交付</span>
</div>
<h1 class="nhc-page-title">十年技术积累 · 专注自主可控软件研发</h1>
<p class="nhc-page-desc">
贵阳纳海川科技有限公司立足西南、服务全国,专注于企业级软件系统定制、全场景移动应用与小程序定制、私有化
AI
智能体应用及成熟商业软件研发。交付完整工程源代码与全套开发文档,实行代码审查与质量测试,为客户交付稳定可靠的软件系统。
</p>
{extend name="web/official_common/pc/base" /} {block name="css"}
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="stylesheet" href="__ADDON__/css/about-nhc.css?v=20261105a" />
{/block} {block name="content"}
<main class="about-nhc" id="about-main">
<a class="ab-skip" href="#company">跳至公司介绍</a>
<section class="ab-hero">
<div class="ab-wrap">
<nav class="ab-crumb" aria-label="当前位置">
<a href="{:addon_url('official/web.official_home/index')}">首页</a
><span>/</span><span aria-current="page">关于我们</span>
</nav>
<div class="ab-hero-grid">
<div>
<p class="ab-eyebrow">纳海川科技 / 关于我们</p>
<h1>专注企业软件研发<br />与业务系统建设</h1>
</div>
</section>
<!-- 2. 东方工程哲学与品牌渊源 (Brand & Philosophy) -->
<section
class="nhc-about-brand nhc-section-padding"
style="background: #ffffff"
>
<div class="nhc-container">
<div class="nhc-section-header">
<div class="nhc-section-tag">
<span class="nhc-seal">技术立身</span>
<span class="nhc-tag-text">ENGINEERING VALUES</span>
</div>
<h2 class="nhc-section-title">
坚持扎实工程实践 · 交付自主可控的软件资产
</h2>
<p class="nhc-section-desc">
纳海川以自主可控的技术体系、统一的质量标准与行业积累,为客户交付数字化系统。
</p>
<div class="nhc-line-divider"><span></span></div>
</div>
<!-- 三大研发原则 -->
<div class="nhc-about-pillars-grid">
<div class="nhc-about-pillar-card nhc-corner-card">
<div class="nhc-pillar-icon-box">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path
d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"
/>
</svg>
</div>
<h3 class="nhc-pillar-title">
自主可控研发 · 拒绝低质套壳代码
</h3>
<p class="nhc-pillar-text">
核心业务逻辑遵循规范自主编写,交付完整工程源代码与开发文档,支持客户自主维护与代码安全审计。
</p>
</div>
<div class="nhc-about-pillar-card nhc-corner-card">
<div class="nhc-pillar-icon-box">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path
d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"
/>
</svg>
</div>
<h3 class="nhc-pillar-title">
标准化开放架构 · 对接企业现有系统
</h3>
<p class="nhc-pillar-text">
系统采用模块化与微服务设计,具备标准的 RESTful 与 RPC
接口规范。可与企业既有的金蝶、用友、各类 WMS
仓储及第三方物流、支付系统互通,保护企业既有 IT 投资。
</p>
</div>
<div class="nhc-about-pillar-card nhc-corner-card">
<div class="nhc-pillar-icon-box">
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14" />
<polyline points="22 4 12 14.01 9 11.01" />
</svg>
</div>
<h3 class="nhc-pillar-title">
严谨工程质量管理 · 支撑系统稳定运行
</h3>
<p class="nhc-pillar-text">
全流程实行规范化代码审查与多层级自动化测试,把控功能质量、并发性能与数据安全,推动系统在生产环境中稳定运行。
</p>
</div>
</div>
<!-- 十年技术演进历程时间轴 (Milestones) -->
<div class="nhc-timeline-wrap" style="margin-top: 60px">
<div style="text-align: center; margin-bottom: 36px">
<span class="nhc-seal" style="margin-bottom: 8px"
>演进轨迹</span
>
<h3
style="
font-family: var(--font-serif);
font-size: 22px;
font-weight: 700;
color: var(--text-primary);
margin: 0;
"
>
纳海川十年技术积累与发展历程
</h3>
</div>
<div class="nhc-timeline-grid">
<div class="nhc-timeline-item">
<div class="nhc-timeline-year">2016</div>
<div class="nhc-timeline-dot"></div>
<h4 class="nhc-timeline-title">初创起步 · 专注基础软件</h4>
<p class="nhc-timeline-desc">
立足贵阳本地,专注于企业软件与数字化系统定制,确立自主可控的技术研发底座。
</p>
</div>
<div class="nhc-timeline-item">
<div class="nhc-timeline-year">2019</div>
<div class="nhc-timeline-dot"></div>
<h4 class="nhc-timeline-title">
产品成型 · 商业系统标准化
</h4>
<p class="nhc-timeline-desc">
相继发布商业商城系统、智能收银与进销存管理系统,持续服务实体商户与供应链伙伴。
</p>
</div>
<div class="nhc-timeline-item">
<div class="nhc-timeline-year">2022</div>
<div class="nhc-timeline-dot"></div>
<h4 class="nhc-timeline-title">
架构升级 · 建立企业级技术底座
</h4>
<p class="nhc-timeline-desc">
构建纳海川架构底层与业务组件库,推行规范化研发体系与质量流程。
</p>
</div>
<div class="nhc-timeline-item current">
<div class="nhc-timeline-year">2024~2026</div>
<div class="nhc-timeline-dot"></div>
<h4 class="nhc-timeline-title">
AI 应用 · 垂直私域智能体研发
</h4>
<p class="nhc-timeline-desc">
发布支持内网私有部署的垂直领域 RAG
智能体与私有知识库系统,帮助政企客户改善内部文档检索慢、人工初审标准不统一的问题。
</p>
</div>
</div>
</div>
<div>
<p class="ab-hero-name">贵阳纳海川科技有限公司</p>
<p class="ab-lead">
立足贵阳,面向企业经营与管理需求,提供软件开发、APP
与小程序定制、企业智能体及商业软件服务。
</p>
<a class="ab-text-link" href="#company"
>了解纳海川 <span aria-hidden="true">↓</span></a
>
</div>
</section>
</div>
<figure class="ab-panorama">
<picture
><source
srcset="__ADDON__/images/about/landscape.webp"
type="image/webp" />
<img
src="__ADDON__/images/about/landscape.jpg"
width="1440"
height="960"
alt="白色石材层叠成山形,蓝色玻璃水道穿行其间,表达业务与技术的连接"
fetchpriority="high"
/></picture>
<figcaption>
<span>业务与技术,在此相接。</span><span>纳海川 / 抽象建筑示意</span>
</figcaption>
</figure>
</div>
</section>
<div class="ab-index">
<nav class="ab-wrap" aria-label="本页导航">
<a href="#company"><span>01</span> 公司介绍</a
><a href="#services"><span>02</span> 服务方向</a
><a href="#team"><span>03</span> 团队协作</a
><a href="#credentials"><span>04</span> 资质与资料</a>
</nav>
</div>
<!-- 3. 核心研发与架构团队阵容 (Engineering Team) -->
<section
class="nhc-about-team nhc-section-padding"
style="background: var(--bg-secondary)"
>
<div class="nhc-container">
<div class="nhc-section-header">
<div class="nhc-section-tag">
<span class="nhc-seal">核心团队</span>
<span class="nhc-tag-text">TECHNICAL LEADERSHIP</span>
</div>
<h2 class="nhc-section-title">纳海川核心技术团队</h2>
<p class="nhc-section-desc">
核心架构团队具备大型系统研发与高并发调优经验,严守代码质量底线,支撑系统长期稳定运行。
</p>
<div class="nhc-line-divider"><span></span></div>
</div>
<section class="ab-section nhc-about-brand" id="company">
<div class="ab-wrap ab-company">
<div>
<p class="ab-eyebrow">01 / 公司介绍</p>
<h2>从业务出发,<br />把系统建设做具体</h2>
<p class="ab-location">贵州 · 贵阳<span>NAHAICHUAN</span></p>
</div>
<div class="ab-company-copy">
<p class="ab-intro">
贵阳纳海川科技有限公司成立于 2016
年,围绕企业软件研发与业务系统建设开展服务,涵盖定制开发、现有系统改造、业务接口集成及商业软件应用。
</p>
<p>
我们关注系统在实际工作中的使用方式:由谁操作、业务如何流转、数据怎样衔接,以及后续如何维护。项目从需求梳理开始,逐步确认设计、开发、测试与交付安排。
</p>
<dl class="ab-facts">
<div>
<dt>服务对象</dt>
<dd>有软件建设与业务管理需求的企业及机构</dd>
</div>
<div>
<dt>工作内容</dt>
<dd>需求梳理、设计研发、系统集成、部署交付</dd>
</div>
<div>
<dt>合作方式</dt>
<dd>按项目范围,确认阶段计划与验收依据</dd>
</div>
</dl>
</div>
</div>
</section>
<div class="nhc-team-grid">
<!-- 专家 1 -->
<div class="nhc-team-card nhc-corner-card">
<div class="nhc-team-badge">技术总监</div>
<div
class="nhc-team-avatar-box"
style="
background: transparent;
border: none;
box-shadow: none;
"
>
<img
src="__ADDON__/images/showcases/team_architect.svg"
alt="首席系统架构师徽章"
style="
width: 76px;
height: 76px;
display: block;
margin: 0 auto;
"
/>
</div>
<h3 class="nhc-team-name">首席系统架构师</h3>
<div class="nhc-team-exp">
多年大型系统架构经验 · 系统架构专家
</div>
<p class="nhc-team-desc">
曾主持分布式微服务架构设计与多活容灾改造,主导纳海川底层核心交易引擎与分库分表设计。
</p>
<div class="nhc-team-skills">
<span class="nhc-team-skill-tag">分布式架构</span>
<span class="nhc-team-skill-tag">微服务治理</span>
<span class="nhc-team-skill-tag">容灾多活</span>
</div>
</div>
<!-- 专家 2 -->
<div class="nhc-team-card nhc-corner-card">
<div class="nhc-team-badge">工程交付主管</div>
<div
class="nhc-team-avatar-box"
style="
background: transparent;
border: none;
box-shadow: none;
"
>
<img
src="__ADDON__/images/showcases/team_fullstack.svg"
alt="全栈研发总监徽章"
style="
width: 76px;
height: 76px;
display: block;
margin: 0 auto;
"
/>
</div>
<h3 class="nhc-team-name">全栈研发总监</h3>
<div class="nhc-team-exp">
企业软件工程经验 · 供应链中台系统负责人
</div>
<p class="nhc-team-desc">
主导商业进销存、智能收银与私有化商城系统研发,熟悉软硬件协议对接、离线脱机记账与业务状态机。
</p>
<div class="nhc-team-skills">
<span class="nhc-team-skill-tag">业务中台</span>
<span class="nhc-team-skill-tag">状态机编排</span>
<span class="nhc-team-skill-tag">软硬件互联</span>
</div>
</div>
<!-- 专家 3 -->
<div class="nhc-team-card nhc-corner-card">
<div class="nhc-team-badge">前沿技术带头人</div>
<div
class="nhc-team-avatar-box"
style="
background: transparent;
border: none;
box-shadow: none;
"
>
<img
src="__ADDON__/images/showcases/team_ai.svg"
alt="AI智能体算法主管徽章"
style="
width: 76px;
height: 76px;
display: block;
margin: 0 auto;
"
/>
</div>
<h3 class="nhc-team-name">AI 智能体算法主管</h3>
<div class="nhc-team-exp">
计算机应用技术硕士 · 专注于企业私有 RAG 与 Agent 工作流
</div>
<p class="nhc-team-desc">
专注于开源大语言模型在政企内网环境的量化微调、向量数据库检索及多智能体协作工作流构建,支撑垂直领域业务核查与合规问答。
</p>
<div class="nhc-team-skills">
<span class="nhc-team-skill-tag">私有 RAG</span>
<span class="nhc-team-skill-tag">LLM 微调</span>
<span class="nhc-team-skill-tag">Agent 协同</span>
</div>
</div>
<!-- 专家 4 -->
<div class="nhc-team-card nhc-corner-card">
<div class="nhc-team-badge">质保与合规专家</div>
<div
class="nhc-team-avatar-box"
style="
background: transparent;
border: none;
box-shadow: none;
"
>
<img
src="__ADDON__/images/showcases/team_security.svg"
alt="软件质量与安全合规专家徽章"
style="
width: 76px;
height: 76px;
display: block;
margin: 0 auto;
"
/>
</div>
<h3 class="nhc-team-name">软件质量与安全合规专家</h3>
<div class="nhc-team-exp">
CISSP 认证安全专家 · ISO 9001/27001 全流程审计师
</div>
<p class="nhc-team-desc">
推行规范化代码审查与全流程测试,落实网络安全等保合规规范与数据防篡改加密,推动系统合规交付。
</p>
<div class="nhc-team-skills">
<span class="nhc-team-skill-tag">代码审查</span>
<span class="nhc-team-skill-tag">等保三级</span>
<span class="nhc-team-skill-tag">安全审计</span>
</div>
</div>
</div>
<section class="ab-section ab-soft" id="services">
<div class="ab-wrap">
<div class="ab-heading">
<div>
<p class="ab-eyebrow">02 / 服务方向</p>
<h2>围绕业务需求,提供适合的建设方案</h2>
</div>
</section>
<p>
根据使用场景、现有系统与部署条件,选择定制开发、产品应用或分阶段改造。
</p>
</div>
<div class="ab-services">
<a href="/official/service/software.html"
><span class="ab-number">01</span>
<div>
<h3>软件定制开发</h3>
<p>企业业务系统、现有系统改造、接口集成与共用业务模块建设。</p>
</div>
<span class="ab-service-note">需求梳理 / 设计研发 / 系统集成</span
><span class="ab-arrow" aria-hidden="true">↗</span></a
>
<a href="/official/service/app.html"
><span class="ab-number">02</span>
<div>
<h3>APP 与小程序定制</h3>
<p>结合移动端使用场景,开展应用研发、后台管理及业务系统对接。</p>
</div>
<span class="ab-service-note">移动应用 / 微信生态 / 多端协作</span
><span class="ab-arrow" aria-hidden="true">↗</span></a
>
<a href="/official/service/agent.html"
><span class="ab-number">03</span>
<div>
<h3>企业智能体开发</h3>
<p>围绕知识查询、客户服务与业务辅助,建设知识库并衔接现有系统。</p>
</div>
<span class="ab-service-note">知识库 / 任务流程 / 人工复核</span
><span class="ab-arrow" aria-hidden="true">↗</span></a
>
<a
href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}"
><span class="ab-number">04</span>
<div>
<h3>商业软件与产品服务</h3>
<p>提供商城、收银、进销存及 SaaS 版本,按业务条件评估功能适配。</p>
</div>
<span class="ab-service-note">产品选型 / 功能配置 / 部署应用</span
><span class="ab-arrow" aria-hidden="true">↗</span></a
>
</div>
</div>
</section>
<!-- 4. 法定资质、软著资产与安全合规体系 (Qualifications & Compliance) -->
<section
class="nhc-about-qualifications nhc-section-padding"
style="background: #ffffff"
>
<div class="nhc-container">
<div class="nhc-section-header">
<div class="nhc-section-tag">
<span class="nhc-seal">合规资产</span>
<span class="nhc-tag-text">QUALIFICATIONS & ASSETS</span>
</div>
<h2 class="nhc-section-title">法定资质认证 · 合规资产保障</h2>
<p class="nhc-section-desc">
纳海川持有软件著作权与安全认证,为客户系统提供知识产权保护、合规审查依据及数据安全防护。
</p>
<div class="nhc-line-divider"><span></span></div>
</div>
<!-- 资质证书与合规标准网格 -->
<div class="nhc-certs-grid">
<div class="nhc-cert-card" style="padding-top: 18px">
<div
style="
margin-bottom: 12px;
display: flex;
justify-content: center;
"
>
<img
src="__ADDON__/images/showcases/cert_hi_tech.svg"
alt="国家高新技术企业认证"
style="width: 140px; height: auto"
/>
</div>
<h3 class="nhc-cert-name">国家高新技术企业</h3>
<p class="nhc-cert-sub">
遵循国家科技型企业与高新技术标准体系 ·
全国高新技术企业认定管理机构备案认定
</p>
</div>
<div class="nhc-cert-card" style="padding-top: 18px">
<div class="nhc-cert-seal">认证</div>
<h3 class="nhc-cert-name">双软企业评估认证</h3>
<p class="nhc-cert-sub">
遵循软件产品评估与软件企业专业规范 · 规范化软件工程管理
</p>
</div>
<div class="nhc-cert-card" style="padding-top: 18px">
<div
style="
margin-bottom: 12px;
display: flex;
justify-content: center;
"
>
<img
src="__ADDON__/images/showcases/cert_iso9001.svg"
alt="ISO9001质量管理体系认证"
style="width: 140px; height: auto"
/>
</div>
<h3 class="nhc-cert-name">ISO9001:2015 质量管理体系认证</h3>
<p class="nhc-cert-sub">
参照 ISO9001 质量管理体系规范 ·
全生命周期敏捷研发与质量验收交付
</p>
</div>
<div class="nhc-cert-card" style="padding-top: 18px">
<div class="nhc-cert-seal">体系</div>
<h3 class="nhc-cert-name">ISO27001:2022 信息安全管理体系</h3>
<p class="nhc-cert-sub">
对标 ISO27001 信息安全管理规范 ·
客户数据资产与信息安全防护标准体系
</p>
</div>
</div>
<!-- 软著资产与私有合规承诺 -->
<div class="nhc-assets-banner" style="margin-top: 36px">
<div class="nhc-assets-item">
<div class="nhc-assets-num">自主可控</div>
<div class="nhc-assets-title">计算机软件著作权登记证书</div>
<div class="nhc-assets-desc">
核心业务系统拥有自主可控知识产权,软件著作权依法登记保护,源代码自主研发,避免知识产权纠纷。
</div>
</div>
<div class="nhc-assets-divider"></div>
<div class="nhc-assets-item">
<div class="nhc-assets-num">全量</div>
<div class="nhc-assets-title">完整源码交付与私有化部署</div>
<div class="nhc-assets-desc">
客户专属环境独立部署,提供全套开源编译指令、数据库结构字典与架构拓扑,数据不出客户内网。
</div>
</div>
<div class="nhc-assets-divider"></div>
<div class="nhc-assets-item">
<div class="nhc-assets-num">等保合规</div>
<div class="nhc-assets-title">网络安全等级保护合规设计</div>
<div class="nhc-assets-desc">
遵循网络安全法规范与等保合规技术要求,支持防篡改、TLS 1.3
加密与完整的操作审计日志
</div>
</div>
</div>
<section class="ab-section nhc-about-team" id="team">
<div class="ab-wrap">
<div class="ab-heading">
<div>
<p class="ab-eyebrow">03 / 团队协作</p>
<h2>团队职责与项目协作</h2>
</div>
</section>
<p>
围绕需求、研发、测试与交付组织协作。具体参与人员与分工,在项目计划中确认。
</p>
</div>
<div class="ab-team-grid">
<figure class="ab-courtyard">
<picture
><source
srcset="__ADDON__/images/about/collaboration.webp"
type="image/webp" />
<img
src="__ADDON__/images/about/collaboration.jpg"
width="1440"
height="960"
loading="lazy"
alt="多组石材墙面围合成开放庭院,蓝色玻璃连接中央空间,表达团队协作"
/></picture>
<figcaption>分工协作,共同完成项目。<span>抽象建筑示意</span></figcaption>
</figure>
<ol class="ab-roles">
<li>
<span>01</span>
<div>
<h3>需求与设计</h3>
<p>梳理业务流程、使用角色与功能优先级,以需求说明和原型核对建设范围。</p>
</div>
</li>
<li>
<span>02</span>
<div>
<h3>研发与集成</h3>
<p>完成应用、数据与接口开发,记录技术约定和版本变更,推进系统联调。</p>
</div>
</li>
<li>
<span>03</span>
<div>
<h3>测试与交付</h3>
<p>
依据业务用例验证功能,跟进问题处理,准备验收资料、部署说明与操作培训。
</p>
</div>
</li>
<li>
<span>04</span>
<div>
<h3>运行与维护</h3>
<p>
按约定安排使用支持、问题排查及版本维护;新增功能另行评估范围与工作量。
</p>
</div>
</li>
</ol>
</div>
</div>
</section>
<!-- 5. 底部行动号召 (CTA Section) -->
<section class="nhc-cta">
<div class="nhc-container">
<div class="nhc-cta-inner">
<div class="nhc-cta-content">
<span
class="nhc-seal"
style="
background: rgba(255, 255, 255, 0.15);
border-color: rgba(255, 255, 255, 0.4);
color: #ffffff;
margin-bottom: 12px;
"
>诚意合作</span
>
<h2 class="nhc-cta-title">
找懂业务、讲规范的研发团队,让软件项目平稳落地
</h2>
<p class="nhc-cta-desc">
无论是新项目的技术选型,还是已有系统的升级改造,纳海川技术顾问与架构团队可提供专业评估与实施规划。
</p>
</div>
<div class="nhc-cta-buttons">
<a
href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}"
class="nhc-btn nhc-cta-btn-light nhc-btn-lg"
>
<span>预约咨询</span>
<svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path d="M5 12h14M12 5l7 7-7 7" />
</svg>
</a>
<a
href="tel:{:__config('site_mobile','value')}"
class="nhc-btn nhc-cta-btn-ghost nhc-btn-lg"
>
<span>电话咨询</span>
</a>
</div>
</div>
<section class="ab-section ab-soft nhc-about-qualifications" id="credentials">
<div class="ab-wrap">
<div class="ab-heading">
<div>
<p class="ab-eyebrow">04 / 资质与项目资料</p>
<h2>资料与权属,逐项核对</h2>
</div>
</section>
<p>
合作所需资料按项目范围沟通,企业主体、授权范围与有效期限以核验资料为准。
</p>
</div>
<div class="ab-records">
<article>
<span class="ab-number">01 / 企业主体</span>
<h3>主体信息与合作资料</h3>
<p>
核对签约主体、经营信息及项目所需资料,使合同、实施与交付主体保持一致。
</p>
</article>
<article>
<span class="ab-number">02 / 知识产权</span>
<h3>软件权属与授权范围</h3>
<p>
定制源码、计算机软件著作权及第三方组件分别说明,使用权属和交付范围以合同与授权资料为准,便于自主可控地维护系统。
</p>
</article>
<article>
<span class="ab-number">03 / 项目要求</span>
<h3>标准要求与核验依据</h3>
<p>
涉及 ISO9001、ISO27001
或等保要求时,按项目要求核对适用范围、有效资料与双方责任。具体认证情况以有效证书为准。
</p>
</article>
</div>
</div>
</section>
<section class="ab-section" id="cooperation">
<div class="ab-wrap">
<div class="ab-heading">
<div>
<p class="ab-eyebrow">合作方式</p>
<h2>明确范围,按约定交付</h2>
</div>
<a
class="ab-text-link"
href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}"
>了解项目案例 <span aria-hidden="true">↗</span></a
>
</div>
<ol class="ab-working">
<li>
<span>01</span>
<h3>先了解问题</h3>
<p>说明当前业务、现有系统和主要问题,确认调研与资料准备事项。</p>
</li>
<li>
<span>02</span>
<h3>再确认安排</h3>
<p>明确功能范围、阶段计划、费用和配合条件,发生变更时同步核对影响。</p>
</li>
<li>
<span>03</span>
<h3>按清单交付</h3>
<p>以业务用例和验收清单核对成果,移交约定的源码、文档与使用资料。</p>
</li>
</ol>
</div>
</section>
<section class="ab-contact">
<div class="ab-wrap">
<div>
<p class="ab-eyebrow">与纳海川建立联系</p>
<h2>沟通您的软件建设需求</h2>
<p>从当前的问题开始,一起确认适合的实施范围。</p>
</div>
<div>
<a
class="ab-button"
href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}"
>沟通项目需求 <span aria-hidden="true">↗</span></a
><a class="ab-text-link" href="tel:{:__config('site_mobile','value')}"
>电话咨询 <span>{:__config('site_mobile','value')}</span></a
>
</div>
</div>
</section>
</main>
<!-- 纳海川官方网站 · 关于我们独立页 (About Us Page) 结束 -->
{/block}

查看文件

@@ -1,508 +1,38 @@
{extend name="web/official_common/pc/base" /} {block name="css"}
<link
href="__ADDON__/layui-v2.6.8/layui-v2.6.8/layui/css/layui.css"
rel="stylesheet"
type="text/css"
/>
{/block} {block name="content"}
<!-- 纳海川官方网站 · 联系我们独立页 (Contact Us Page) 开始 -->
<!-- 1. 联系我们 Hero 视窗 -->
<section class="nhc-page-hero nhc-lattice-pattern">
<div class="nhc-container">
<div class="nhc-breadcrumb">
<a href="{:addon_url('official/web.official_home/index')}">首页</a>
<span>/</span>
<span>联系我们</span>
</div>
<div style="margin-bottom: 16px">
<span class="nhc-seal">务实沟通 · 敏捷响应</span>
</div>
<h1 class="nhc-page-title">业务咨询与技术评估</h1>
<p class="nhc-page-desc">
告知您的业务需求或系统现状,纳海川技术与架构团队将在 2
小时内安排专属架构师与您沟通并输出初步评估。
</p>
</div>
</section>
<!-- 2. 主体联系与需求评估板块 (12列网格,左7右5) -->
<section
class="nhc-contact-section"
style="padding: 70px 0 90px; background: #ffffff"
>
<div class="nhc-container">
<div class="nhc-contact-layout">
<!-- 左侧:需求评估与工单表单 (7列) -->
<div class="nhc-contact-form-wrap nhc-corner-card">
<div class="nhc-form-header">
<span class="nhc-seal" style="margin-bottom: 8px"
>需求评估</span
>
<h2 class="nhc-form-title">预约架构师 1 对 1 方案研讨</h2>
<p class="nhc-form-sub">
请详细填写您的业务需求与期望指标,我们将在 2
小时内安排专属架构师与您对接。
</p>
</div>
<form
enctype="multipart/form-data"
class="nhc-contact-form"
id="frmResume"
>
{:token()}
<!-- 意向主题快捷选择 -->
<div class="nhc-form-group">
<label class="nhc-form-label"
>意向合作方向
<span class="nhc-required">*</span></label
>
<div class="nhc-tag-selector">
<span
class="nhc-topic-tag active"
data-topic="企业级技术中台与软件定制"
>企业级中台定制</span
>
<span
class="nhc-topic-tag"
data-topic="APP与微信小程序全生态定制"
>APP/小程序定制</span
>
<span
class="nhc-topic-tag"
data-topic="垂直领域私有 RAG 与 AI 智能体开发"
>私有 AI 智能体</span
>
<span
class="nhc-topic-tag"
data-topic="商业商城/收银/进销存系统部署"
>商业产品选型</span
>
</div>
<input
type="text"
name="title"
id="contactTitle"
value="企业级技术中台与软件定制"
required
class="nhc-form-input"
placeholder="请填写需求主题或选择上方标签"
/>
</div>
<div class="nhc-form-row">
<!-- 称呼 -->
<div class="nhc-form-group">
<label class="nhc-form-label"
>对接人姓名 / 称呼
<span class="nhc-required">*</span></label
>
<input
type="text"
name="name"
required
class="nhc-form-input"
placeholder="如:张总监 / 李经理"
/>
</div>
<!-- 电话 -->
<div class="nhc-form-group">
<label class="nhc-form-label"
>联系电话 / 手机
<span class="nhc-required">*</span></label
>
<input
type="text"
name="phone"
required
class="nhc-form-input"
placeholder="请填写您的联系手机"
/>
</div>
</div>
<!-- 详细需求 -->
<div class="nhc-form-group">
<label class="nhc-form-label"
>业务背景与详细需求
<span class="nhc-required">*</span></label
>
<textarea
name="content"
class="nhc-form-textarea"
rows="4"
placeholder="请简述您的业务需求、期望实现的功能模块、预估上线周期或性能要求,以便架构师提前研判..."
></textarea>
</div>
{if $captchaType == 'text'}
<div class="nhc-form-group">
<label class="nhc-form-label"
>安全验证码
<span class="nhc-required">*</span></label
>
<div
style="
display: flex;
gap: 12px;
align-items: center;
"
>
{include file="web/official_common/pc/captcha"
event="register" type="$captchaType" /}
</div>
</div>
{/if}
<div style="margin-top: 24px">
<button
class="nhc-btn nhc-btn-primary nhc-btn-lg in_post"
stu="1"
type="button"
style="width: 100%; justify-content: center"
>
<span>立即提交</span>
<svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path d="M5 12h14M12 5l7 7-7 7" />
</svg>
</button>
</div>
<div class="nhc-form-privacy">
纳海川执行 ISO 27001
信息安全规范,对您的商业需求与业务数据长期保密。
</div>
</form>
</div>
<!-- 右侧:直通热线、实体地址与地图 (5列) -->
<div class="nhc-contact-info-wrap">
<!-- 贵阳双基地地理拓扑与接待视窗 -->
<div
style="
margin-bottom: 24px;
border-radius: 6px;
overflow: hidden;
border: 1px solid var(--border-color);
box-shadow: 0 4px 16px rgba(15, 23, 42, 0.04);
"
>
<img
src="__ADDON__/images/showcases/contact_headquarters.svg"
alt="纳海川贵阳双基地拓扑与快速建联视窗"
style="width: 100%; height: auto; display: block"
loading="lazy"
/>
</div>
<!-- 直通热线与响应 SLA 卡片 -->
<div
class="nhc-contact-card nhc-corner-card"
style="margin-bottom: 24px"
>
<div class="nhc-info-badge">快速直联</div>
<h3 class="nhc-info-card-title">业务咨询与技术支持</h3>
<div class="nhc-info-item">
<div class="nhc-info-icon">
<svg
width="18"
height="18"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path
d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"
/>
</svg>
</div>
<div class="nhc-info-text">
<div class="nhc-info-label">业务咨询专线</div>
<a
href="tel:13984036826"
class="nhc-info-val nhc-phone-link"
>13984036826</a
>
<div class="nhc-info-note">
工作日 09:00 - 18:00(架构师直连)
</div>
</div>
</div>
<div class="nhc-info-item">
<div class="nhc-info-icon">
<svg
width="18"
height="18"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path
d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"
/>
<polyline points="22,6 12,13 2,6" />
</svg>
</div>
<div class="nhc-info-text">
<div class="nhc-info-label">技术支持公用邮箱</div>
<div class="nhc-info-val">server@gynhc.com</div>
<div class="nhc-info-note">
商务合作、技术方案咨询接收入口
</div>
</div>
</div>
<div class="nhc-sla-bar">
<div class="nhc-sla-tag">SLA 响应承诺</div>
<div class="nhc-sla-text">
工作日 2 小时内快速响应 · 24 小时内出具方案大纲
</div>
</div>
</div>
<!-- 实体办公双基地与地图视窗 (Map & Addresses) -->
<div class="nhc-contact-card nhc-contact-map nhc-corner-card">
<h3 class="nhc-info-card-title">实体办公基地</h3>
<!-- 营销与销售中心 -->
<div class="nhc-location-item">
<div class="nhc-location-header">
<span
class="nhc-seal"
style="padding: 1px 6px; font-size: 10px"
>营销中心</span
>
<span class="nhc-location-title"
>花果园中环广场商务基地</span
>
</div>
<p class="nhc-location-addr">
贵州省贵阳市南明区花果园遵义中路中环广场2号楼26楼20-21号
</p>
</div>
<!-- 研发与技术中心 -->
<div
class="nhc-location-item"
style="
border-top: 1px solid var(--border-color);
padding-top: 14px;
margin-top: 14px;
"
>
<div class="nhc-location-header">
<span
class="nhc-seal"
style="padding: 1px 6px; font-size: 10px"
>技术中心</span
>
<span class="nhc-location-title"
>经开区大数据安全产业基地</span
>
</div>
<p class="nhc-location-addr">
贵州省贵阳市经开区数字经济产业园大数据安全产业园数楼4楼02-03号
</p>
</div>
<!-- 地图视窗 / 示意图 -->
<div class="nhc-map-visual" style="margin-top: 18px">
<div class="nhc-map-canvas">
<div class="nhc-map-pin pin-1">
<span class="nhc-pin-pulse"></span>
<span class="nhc-pin-label">南明营销中心</span>
</div>
<div class="nhc-map-pin pin-2">
<span class="nhc-pin-pulse"></span>
<span class="nhc-pin-label">经开技术中心</span>
</div>
<div class="nhc-map-grid-bg"></div>
</div>
<div class="nhc-map-footer">
<span>贵阳核心产业园区 · 欢迎来访考察交流</span>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 3. 常见技术咨询解答 -->
<section
class="nhc-faq nhc-section-padding"
style="background: var(--bg-secondary)"
>
<div class="nhc-container">
<div class="nhc-section-header">
<div class="nhc-section-tag">
<span class="nhc-seal">沟通须知</span>
<span class="nhc-tag-text">COOPERATION FAQ</span>
</div>
<h2 class="nhc-section-title">初次对接常见问题</h2>
<p class="nhc-section-desc">
我们以务实坦诚的态度,提前解答您在商务与技术合作中重点关注的核心疑问。
</p>
<div class="nhc-line-divider"><span></span></div>
</div>
<div class="nhc-faq-grid">
<div class="nhc-faq-item">
<h3 class="nhc-faq-question">提交需求后多久能收到初步方案?</h3>
<p class="nhc-faq-answer">
我们在收到需求后 2 小时内安排解决方案架构师电话回访,并在 24
小时内出具针对实际业务需求的初步技术方案与评估大纲。
</p>
</div>
<div class="nhc-faq-item">
<h3 class="nhc-faq-question">
是否支持前期签署保密协议(NDA)?
</h3>
<p class="nhc-faq-answer">
支持。对于涉及敏感商业逻辑、政企业务规范或专属数据的项目,纳海川在深度技术交流前可先行签署具备法律效力的保密协议。
</p>
</div>
<div class="nhc-faq-item">
<h3 class="nhc-faq-question">
是否支持技术架构师现场当面交流?
</h3>
<p class="nhc-faq-answer">
西南地区(贵阳及周边城市)可安排架构师上门沟通或邀请莅临纳海川基地;全国其他省市可安排腾讯会议/飞书视频技术研讨。
</p>
</div>
<div class="nhc-faq-item">
<h3 class="nhc-faq-question">
定制开发的项目如何保障代码归属与二次开发?
</h3>
<p class="nhc-faq-answer">
纳海川提供完整工程源码交付协议,不设硬件锁、加密狗或暗门,交付全套源码、数据库设计字典及本地化持续集成编译指南。
</p>
</div>
</div>
</div>
</section>
<!-- 纳海川官方网站 · 联系我们独立页 (Contact Us Page) 结束 -->
{/block} {block name="js"}
<script src="__ADDON__/layui-v2.6.8/layui-v2.6.8/layui/layui.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script>
var captchaType = "{$captchaType}";
layui.use(["layer"], function () {
var layer = layui.layer;
// 快捷标签选择
document.querySelectorAll(".nhc-topic-tag").forEach(function (tag) {
tag.addEventListener("click", function () {
document
.querySelectorAll(".nhc-topic-tag")
.forEach(function (t) {
t.classList.remove("active");
});
this.classList.add("active");
var topic = this.getAttribute("data-topic");
document.getElementById("contactTitle").value = topic;
});
});
$(".in_post").click(function () {
let that = this;
let title = $("input[name='title']").val();
let name = $("input[name='name']").val();
let phone = $("input[name='phone']").val();
let __token__ = $("input[name='__token__']").val();
let content = $("textarea[name='content']").val();
let captcha = $("input[name='captcha']").val();
let stu = $(".in_post").attr("stu");
if (stu != 1) {
layer.msg("请勿重复点击提交");
return false;
}
if (!title) {
layer.msg("请填写需求意向主题");
return false;
}
if (!name) {
layer.msg("请填写您的姓名或称呼");
return false;
}
if (!phone) {
layer.msg("请填写联系电话");
return false;
}
if (!content) {
layer.msg("请填写详细需求与业务背景");
return false;
}
if (captchaType == "text") {
if (!captcha) {
layer.msg("请填写安全验证码");
return false;
}
}
var data = {
name: name,
title: title,
phone: phone,
content: content,
captcha: captcha,
__token__: __token__,
};
$(".in_post").attr("stu", 2);
axios
.post("", data)
.then(function (response) {
let data = response.data;
$(".in_post").attr("stu", 1);
if (data.code) {
layer.alert(
"需求评估已成功提交!纳海川解决方案架构师将在 2 小时内与您联系对接。",
{ icon: 6, title: "提交成功" },
);
$("input[name='name']").val("");
$("input[name='phone']").val("");
$("textarea[name='content']").val("");
$("input[name='captcha']").val("");
return false;
}
layer.msg(data.msg, { icon: 5 }, function () {
axios
.get(
"{:addon_url('official/web.official_home/get_token')}",
data,
)
.then(function (response) {
let res = response.data;
if (res.code == 1) {
$("input[name='__token__']").val(res.data);
}
});
});
})
.catch(function (error) {
$(".in_post").attr("stu", 1);
layer.msg(
"提交失败,请检查网络或直接拨打业务专线 13984036826",
);
});
});
});
</script>
{extend name="web/official_common/pc/base" /}
{block name="css"}
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="stylesheet" href="__ADDON__/css/contact-nhc.css?v=20261105a">
{/block}
{block name="content"}
<main class="contact-nhc" id="contact-main">
<a class="ct-skip" href="#project-form">跳至项目咨询表单</a>
<section class="ct-hero"><div class="ct-wrap"><nav class="ct-crumb" aria-label="当前位置"><a href="{:addon_url('official/web.official_home/index')}">首页</a><span>/</span><span aria-current="page">联系我们</span></nav><div class="ct-hero-grid"><div><p class="ct-eyebrow">纳海川科技 / 联系我们</p><h1>业务咨询与技术评估</h1><p class="ct-lead">说明您的业务需求、现有系统与主要问题。我们据此了解项目情况,沟通建设范围与实施条件。</p><div class="ct-actions"><a class="ct-button" href="#project-form">填写项目需求 <span aria-hidden="true">↓</span></a><a class="ct-text-link" href="tel:{:__config('site_mobile','value')}">电话咨询 <span>{:__config('site_mobile','value')}</span></a></div></div><figure class="ct-art"><picture><source srcset="__ADDON__/images/contact/connection.webp" type="image/webp"><img src="__ADDON__/images/contact/connection.jpg" width="1440" height="960" alt="两组白色石材门框由蓝色玻璃桥连接,表达交流与合作" fetchpriority="high"></picture><figcaption><span>从沟通开始,确认项目方向。</span><span>抽象建筑示意</span></figcaption></figure></div></div></section>
<section class="ct-section" id="consultation"><div class="ct-wrap ct-main-grid"><div class="ct-form-panel"><div class="ct-section-intro"><p class="ct-eyebrow">项目咨询</p><h2>告诉我们您的需求</h2><p>填写称呼、联系电话、需求主题和简要说明,便于后续联系。标注 * 的项目为必填。</p></div>
<form class="ct-form" id="project-form" method="post" action="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}" data-token-url="{:addon_url('official/web.official_home/get_token')}" novalidate>
{:token()}
<fieldset class="ct-direction"><legend>咨询方向 <span>可选</span></legend><div class="ct-topics"><button type="button" data-topic="软件定制开发" aria-pressed="false">软件开发</button><button type="button" data-topic="APP 与小程序定制" aria-pressed="false">APP / 小程序</button><button type="button" data-topic="企业智能体开发" aria-pressed="false">企业智能体</button><button type="button" data-topic="商业软件产品咨询" aria-pressed="false">产品咨询</button></div></fieldset>
<div class="ct-field"><label for="ct-title">需求主题 <span aria-hidden="true">*</span></label><input id="ct-title" name="title" type="text" maxlength="100" required aria-describedby="ct-title-error" placeholder="例如:订货系统开发、现有系统改造"><p class="ct-field-error" id="ct-title-error" hidden></p></div>
<div class="ct-field-row"><div class="ct-field"><label for="ct-name">您的称呼 <span aria-hidden="true">*</span></label><input id="ct-name" name="name" type="text" maxlength="50" autocomplete="name" required aria-describedby="ct-name-error" placeholder="请填写姓名或称呼"><p class="ct-field-error" id="ct-name-error" hidden></p></div><div class="ct-field"><label for="ct-phone">联系电话 <span aria-hidden="true">*</span></label><input id="ct-phone" name="phone" type="tel" inputmode="tel" maxlength="30" autocomplete="tel" required aria-describedby="ct-phone-hint ct-phone-error" placeholder="手机或固定电话"><p class="ct-hint" id="ct-phone-hint">固定电话请包含区号。</p><p class="ct-field-error" id="ct-phone-error" hidden></p></div></div>
<div class="ct-field"><label for="ct-content">需求说明 <span aria-hidden="true">*</span></label><textarea id="ct-content" name="content" rows="4" maxlength="5000" required aria-describedby="ct-content-hint ct-content-error" placeholder="请简要说明业务现状、希望解决的问题和计划时间。"></textarea><p class="ct-hint" id="ct-content-hint">初次沟通无需提交账号、密码或未脱敏的业务数据。</p><p class="ct-field-error" id="ct-content-error" hidden></p></div>
{if $captchaType == 'text'}
<div class="ct-field"><label for="ct-captcha">图片验证码 <span aria-hidden="true">*</span></label><div class="ct-captcha"><input id="ct-captcha" name="captcha" type="text" maxlength="10" autocomplete="off" required aria-describedby="ct-captcha-hint ct-captcha-error" placeholder="输入图片字符"><button type="button" class="ct-captcha-refresh" aria-label="更换图片验证码" data-captcha-url="{:captcha_src()}"><img src="{:captcha_src()}" alt="验证码图片" width="110" height="44"><span>换一张</span></button></div><p class="ct-hint" id="ct-captcha-hint">看不清时,可点击图片更换。</p><p class="ct-field-error" id="ct-captcha-error" hidden></p></div>
{/if}
<p class="ct-submit-status" role="status" aria-live="polite" tabindex="-1" hidden></p>
<div class="ct-submit-line"><button class="ct-button ct-submit" type="submit">提交项目需求 <span aria-hidden="true">↗</span></button><p>提交后,请保持联系电话畅通。</p></div>
<p class="ct-form-note">您提交的信息将用于本次项目咨询与联系。涉及保密资料时,可先沟通保密安排,再提供相关材料。</p>
<noscript><p class="ct-noscript">在线提交需要启用 JavaScript,也可通过电话或邮箱联系。</p></noscript>
</form></div>
<aside class="ct-direct"><p class="ct-eyebrow">直接联系</p><h2>选择适合的沟通方式</h2><dl class="ct-contact-list"><div><dt>业务咨询电话</dt><dd><a class="ct-phone" href="tel:{:__config('site_mobile','value')}">{:__config('site_mobile','value')}</a></dd></div><div><dt>电子邮箱</dt><dd><a href="mailto:{:__config('site_email','value')}">{:__config('site_email','value')}</a></dd></div><div><dt>工作时间</dt><dd>周一至周五 09:00—18:00</dd></div></dl><div class="ct-prepare"><h3>沟通前,可先准备</h3><ol><li><span>01</span>主要业务流程与使用对象</li><li><span>02</span>现有系统、设备或接口情况</li><li><span>03</span>需要处理的问题与计划时间</li></ol><p>暂时没有完整需求文档,也可以先做简要说明。</p></div><div class="ct-next"><h3>提交后的沟通安排</h3><p>收到信息后,我们会根据需求与工作安排联系您,进一步确认项目范围、资料条件和评估方式。</p></div></aside></div></section>
<section class="ct-section ct-soft nhc-contact-map" id="visit"><div class="ct-wrap"><div class="ct-heading"><div><p class="ct-eyebrow">到访信息</p><h2>来访前,请先联系确认</h2></div><p>请先确认接待地点、时间与交流内容。以下提供地址及地图查询入口,具体路线请以地图查询结果为准。</p></div><div class="ct-offices"><article><span class="ct-eyebrow">01 / 营销中心</span><h3>花果园中环广场</h3><address>贵州省贵阳市南明区花果园遵义中路中环广场2号楼26楼20-21号</address><a class="ct-text-link" href="https://uri.amap.com/search?keyword=%E8%B4%B5%E9%98%B3%E8%8A%B1%E6%9E%9C%E5%9B%AD%E4%B8%AD%E7%8E%AF%E5%B9%BF%E5%9C%BA2%E5%8F%B7%E6%A5%BC&amp;city=%E8%B4%B5%E9%98%B3&amp;view=map" target="_blank" rel="noopener noreferrer">查询地图 <span aria-hidden="true">↗</span><span class="ct-sr">(在新窗口打开高德地图)</span></a></article><article><span class="ct-eyebrow">02 / 技术中心</span><h3>经开区大数据安全产业园</h3><address>贵州省贵阳市经开区数字经济产业园大数据安全产业园数楼4楼02-03号</address><a class="ct-text-link" href="https://uri.amap.com/search?keyword=%E8%B4%B5%E9%98%B3%E7%BB%8F%E5%BC%80%E5%8C%BA%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%BA%A7%E4%B8%9A%E5%9B%AD&amp;city=%E8%B4%B5%E9%98%B3&amp;view=map" target="_blank" rel="noopener noreferrer">查询地图 <span aria-hidden="true">↗</span><span class="ct-sr">(在新窗口打开高德地图)</span></a></article></div></div></section>
<section class="ct-section" id="faq"><div class="ct-wrap ct-faq-layout"><div><p class="ct-eyebrow">沟通须知</p><h2>初次咨询,<br>您可能关心这些</h2></div><div class="ct-faq"><details><summary>只有初步想法,可以先沟通吗?<span aria-hidden="true"></span></summary><p>可以。先说明使用对象、当前的操作方式和主要问题,再逐步梳理功能范围与优先级。涉及详细调研、原型或专项验证时,另行确认工作内容。</p></details><details><summary>何时可以确定方案、周期与费用?<span aria-hidden="true"></span></summary><p>需要先了解业务流程、功能范围、接口与资料条件。评估后再确认实施计划与费用清单;初次留言不等同于已完成方案评估。</p></details><details><summary>涉及商业资料,如何安排沟通?<span aria-hidden="true"></span></summary><p>可先用脱敏资料说明业务,必要时在进一步交流前沟通保密协议、资料范围与使用方式。请勿通过留言提交账号密码或完整的敏感业务数据。</p></details><details><summary>能否线上交流或当面讨论?<span aria-hidden="true"></span></summary><p>可先通过电话或线上会议确认需求。需要到访或现场调研时,提前沟通地点、人员、内容及相关安排。</p></details></div></div></section>
</main>
{/block}
{block name="js"}
<script src="__ADDON__/js/contact-nhc.js?v=20261105a" defer></script>
{/block}

查看文件

@@ -1,535 +1,38 @@
{extend name="web/official_common/mobile/base" /} {block name="content"}
<!-- 纳海川官方网站 · 移动端联系我们独立页 (Contact Us Page Mobile) 开始 -->
<div
class="nhc-mobile-contact-page"
style="background: #f8fafc; min-height: 100vh; padding-bottom: 60px"
>
<!-- 1. 移动端 Hero 视窗 -->
<div
style="
background: #ffffff;
padding: 28px 16px 24px;
border-bottom: 1px solid #e2e8f0;
text-align: center;
"
>
<div style="margin-bottom: 10px">
<span class="nhc-seal" style="padding: 2px 10px; font-size: 11px"
>务实沟通 · 敏捷响应</span
>
</div>
<h1
style="
font-family:
&quot;Noto Serif SC&quot;, &quot;SimSun&quot;, serif;
font-size: 20px;
font-weight: 700;
color: #0f172a;
margin: 0 0 10px 0;
line-height: 1.4;
"
>
业务咨询与技术评估
</h1>
<p style="font-size: 13px; color: #64748b; margin: 0; line-height: 1.6">
贵阳纳海川科技有限公司技术团队立足贵阳、服务全国,提供专业的技术方案评估与
24 小时快速响应对接。
</p>
</div>
<!-- 2. 直通热线与 SLA 响应卡片 -->
<div style="padding: 16px">
<!-- 贵阳双基地地理拓扑视窗 -->
<div
style="
margin-bottom: 16px;
border-radius: 6px;
overflow: hidden;
border: 1px solid #e2e8f0;
box-shadow: 0 2px 10px rgba(15, 23, 42, 0.03);
"
>
<img
src="__ADDON__/images/showcases/contact_headquarters.svg"
alt="纳海川贵阳双基地拓扑视窗"
style="width: 100%; height: auto; display: block"
loading="lazy"
/>
</div>
<div
style="
background: #ffffff;
border-radius: 6px;
border: 1px solid #e2e8f0;
padding: 18px;
margin-bottom: 16px;
"
>
<div
style="
font-size: 11px;
font-weight: 700;
color: #2563eb;
letter-spacing: 1px;
text-transform: uppercase;
margin-bottom: 6px;
"
>
快速直联通道
</div>
<div
style="
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
"
>
<div>
<div style="font-size: 12px; color: #64748b">
业务咨询与架构专线
</div>
<div
style="
font-family: &quot;Noto Serif SC&quot;, serif;
font-size: 20px;
font-weight: 700;
color: #0f172a;
"
>
13984036826
</div>
</div>
<a
href="tel:13984036826"
style="
background: #2563eb;
color: #ffffff;
font-size: 13px;
font-weight: 600;
padding: 8px 16px;
border-radius: 4px;
text-decoration: none;
"
>
立即拨打
</a>
</div>
<div
style="
border-top: 1px solid #f1f5f9;
padding-top: 10px;
font-size: 12px;
color: #64748b;
display: flex;
justify-content: space-between;
"
>
<span>技术邮箱: server@gynhc.com</span>
<span>响应承诺: 2小时直连</span>
</div>
</div>
<!-- 3. 需求评估表单卡片 -->
<div
style="
background: #ffffff;
border-radius: 6px;
border: 1px solid #e2e8f0;
padding: 20px;
"
>
<div style="text-align: center; margin-bottom: 16px">
<span class="nhc-seal" style="padding: 2px 8px; font-size: 11px"
>需求评估</span
>
<h2
style="
font-family:
&quot;Noto Serif SC&quot;, &quot;SimSun&quot;, serif;
font-size: 17px;
font-weight: 700;
color: #0f172a;
margin: 6px 0 4px 0;
"
>
预约架构师 1 对 1 方案研讨
</h2>
<p style="font-size: 12px; color: #64748b; margin: 0">
提交您的业务需求,架构师将在 2 小时内回访
</p>
</div>
<form enctype="multipart/form-data" id="frmMobileContact">
{:token()}
<!-- 需求主题 -->
<div style="margin-bottom: 14px">
<label
style="
display: block;
font-size: 12px;
font-weight: 600;
color: #334155;
margin-bottom: 6px;
"
>
合作方向 / 需求主题
<span style="color: #dc2626">*</span>
</label>
<input
type="text"
name="title"
id="mobileTitle"
value="企业级技术中台与软件定制"
required
style="
width: 100%;
box-sizing: border-box;
padding: 10px 12px;
border: 1px solid #cbd5e1;
border-radius: 4px;
font-size: 13px;
color: #0f172a;
"
/>
</div>
<!-- 对接人 -->
<div style="margin-bottom: 14px">
<label
style="
display: block;
font-size: 12px;
font-weight: 600;
color: #334155;
margin-bottom: 6px;
"
>
对接人姓名 / 称呼 <span style="color: #dc2626">*</span>
</label>
<input
type="text"
name="name"
required
placeholder="如:张总监 / 李经理"
style="
width: 100%;
box-sizing: border-box;
padding: 10px 12px;
border: 1px solid #cbd5e1;
border-radius: 4px;
font-size: 13px;
color: #0f172a;
"
/>
</div>
<!-- 电话 -->
<div style="margin-bottom: 14px">
<label
style="
display: block;
font-size: 12px;
font-weight: 600;
color: #334155;
margin-bottom: 6px;
"
>
联系手机 <span style="color: #dc2626">*</span>
</label>
<input
type="tel"
name="phone"
required
placeholder="请填写联系电话"
style="
width: 100%;
box-sizing: border-box;
padding: 10px 12px;
border: 1px solid #cbd5e1;
border-radius: 4px;
font-size: 13px;
color: #0f172a;
"
/>
</div>
<!-- 详细需求 -->
<div style="margin-bottom: 14px">
<label
style="
display: block;
font-size: 12px;
font-weight: 600;
color: #334155;
margin-bottom: 6px;
"
>
业务需求与期望功能 <span style="color: #dc2626">*</span>
</label>
<textarea
name="content"
rows="3"
placeholder="请简述您的业务需求、期望功能或预估上线周期..."
style="
width: 100%;
box-sizing: border-box;
padding: 10px 12px;
border: 1px solid #cbd5e1;
border-radius: 4px;
font-size: 13px;
color: #0f172a;
resize: vertical;
"
></textarea>
</div>
{if $captchaType == 'text'}
<div style="margin-bottom: 14px">
<label
style="
display: block;
font-size: 12px;
font-weight: 600;
color: #334155;
margin-bottom: 6px;
"
>
安全验证码 <span style="color: #dc2626">*</span>
</label>
<div style="display: flex; gap: 8px">
<input
type="text"
name="captcha"
id="captcha_input_m"
required
placeholder="填写验证码"
style="
width: 60%;
box-sizing: border-box;
padding: 10px 12px;
border: 1px solid #cbd5e1;
border-radius: 4px;
font-size: 13px;
"
/>
<img
src="{:captcha_src()}"
height="40"
onclick="
this.src = '{:captcha_src()}?r=' + Math.random()
"
style="border-radius: 4px"
/>
</div>
</div>
{/if}
<button
class="in_post_m"
stu="1"
type="button"
style="
width: 100%;
background: #2563eb;
color: #ffffff;
font-size: 14px;
font-weight: 600;
padding: 12px 0;
border: none;
border-radius: 4px;
cursor: pointer;
"
>
立即提交
</button>
<div
style="
text-align: center;
font-size: 11px;
color: #94a3b8;
margin-top: 10px;
"
>
执行 ISO 27001 体系规范 · 客户商业信息与数据长期保密
</div>
</form>
</div>
<!-- 4. 物理实体办公双基地 (Dual-HQ) -->
<div
style="
background: #ffffff;
border-radius: 6px;
border: 1px solid #e2e8f0;
padding: 18px;
margin-top: 16px;
"
>
<div
style="
font-size: 11px;
font-weight: 700;
color: #0f172a;
letter-spacing: 1px;
margin-bottom: 12px;
"
>
实体办公基地
</div>
<div style="margin-bottom: 14px">
<div
style="
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 4px;
"
>
<span
class="nhc-seal"
style="padding: 1px 6px; font-size: 10px"
>营销中心</span
>
<span
style="
font-size: 13px;
font-weight: 700;
color: #0f172a;
"
>花果园中环广场商务基地</span
>
</div>
<div style="font-size: 12px; color: #475569; line-height: 1.5">
贵州省贵阳市南明区花果园遵义中路中环广场2号楼26楼20-21号
</div>
</div>
<div style="border-top: 1px solid #f1f5f9; padding-top: 14px">
<div
style="
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 4px;
"
>
<span
class="nhc-seal"
style="padding: 1px 6px; font-size: 10px"
>技术中心</span
>
<span
style="
font-size: 13px;
font-weight: 700;
color: #0f172a;
"
>经开区大数据安全产业基地</span
>
</div>
<div style="font-size: 12px; color: #475569; line-height: 1.5">
贵州省贵阳市经开区数字经济产业园大数据安全产业园数楼4楼02-03号
</div>
</div>
</div>
</div>
</div>
<!-- 纳海川官方网站 · 移动端联系我们独立页 (Contact Us Page Mobile) 结束 -->
{/block} {block name="js"}
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script>
var captchaType = "{$captchaType}";
document.addEventListener("DOMContentLoaded", function () {
var postBtn = document.querySelector(".in_post_m");
if (!postBtn) return;
postBtn.addEventListener("click", function () {
var form = document.getElementById("frmMobileContact");
var title = form.querySelector("input[name='title']").value;
var name = form.querySelector("input[name='name']").value;
var phone = form.querySelector("input[name='phone']").value;
var content = form.querySelector("textarea[name='content']").value;
var tokenInput = form.querySelector("input[name='__token__']");
var token = tokenInput ? tokenInput.value : "";
var captchaInput = form.querySelector("#captcha_input_m");
var captcha = captchaInput ? captchaInput.value : "";
if (!title) {
alert("请填写需求意向主题");
return;
}
if (!name) {
alert("请填写您的称呼");
return;
}
if (!phone) {
alert("请填写联系手机");
return;
}
if (!content) {
alert("请填写详细需求与业务背景");
return;
}
if (captchaType === "text" && !captcha) {
alert("请填写安全验证码");
return;
}
postBtn.disabled = true;
postBtn.innerText = "正在提交...";
var data = {
name: name,
title: title,
phone: phone,
content: content,
captcha: captcha,
__token__: token,
};
axios
.post("", data)
.then(function (response) {
var res = response.data;
postBtn.disabled = false;
postBtn.innerText = "立即提交需求评估";
if (res.code) {
alert(
"需求评估已成功提交!纳海川架构师将在 2 小时内与您联系对接。",
);
form.querySelector("input[name='name']").value = "";
form.querySelector("input[name='phone']").value = "";
form.querySelector("textarea[name='content']").value =
"";
if (captchaInput) captchaInput.value = "";
} else {
alert(res.msg || "提交失败,请重试");
axios
.get(
"{:addon_url('official/web.official_home/get_token')}",
data,
)
.then(function (tRes) {
if (
tRes.data &&
tRes.data.code === 1 &&
tokenInput
) {
tokenInput.value = tRes.data.data;
}
});
}
})
.catch(function (err) {
postBtn.disabled = false;
postBtn.innerText = "立即提交需求评估";
alert("提交失败,请检查网络或直接拨打电话 13984036826");
});
});
});
</script>
{extend name="web/official_common/mobile/base" /}
{block name="css"}
<style>body > .slide,body > .navbar,body > .sidebar-panel{display:none}</style>
<link rel="stylesheet" href="__ADDON__/css/contact-nhc.css?v=20261105a">
{/block}
{block name="content"}
<main class="contact-nhc" id="contact-main">
<header class="ct-mobile-header"><a class="ct-brand" href="{:addon_url('official/web.official_home/index')}">纳海川<span>NAHAICHUAN</span></a><a class="ct-header-contact" href="tel:{:__config('site_mobile','value')}">电话咨询</a><details class="ct-menu"><summary>菜单 <svg aria-hidden="true" viewBox="0 0 24 24"><path d="M4 7h16M4 12h16M4 17h16"/></svg></summary><nav aria-label="主菜单"><a href="{:addon_url('official/web.official_home/index')}">首页</a><a href="{:addon_url('official/web.official_product/list',[':pid'=>19,':sid'=>19])}">服务</a><a href="{:addon_url('official/web.official_product/list',[':pid'=>22,':sid'=>22])}">产品</a><a href="{:addon_url('official/web.official_case_show/list',[':pid'=>14,':sid'=>14])}">案例</a><a href="{:addon_url('official/web.official_home/single',[':pid'=>1,':sid'=>1])}">关于我们</a><a href="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}" aria-current="page">联系我们</a></nav></details></header>
<a class="ct-skip" href="#project-form">跳至项目咨询表单</a>
<section class="ct-hero"><div class="ct-wrap"><nav class="ct-crumb" aria-label="当前位置"><a href="{:addon_url('official/web.official_home/index')}">首页</a><span>/</span><span aria-current="page">联系我们</span></nav><div class="ct-hero-grid"><div><p class="ct-eyebrow">纳海川科技 / 联系我们</p><h1>业务咨询与技术评估</h1><p class="ct-lead">说明您的业务需求、现有系统与主要问题。我们据此了解项目情况,沟通建设范围与实施条件。</p><div class="ct-actions"><a class="ct-button" href="#project-form">填写项目需求 <span aria-hidden="true">↓</span></a><a class="ct-text-link" href="tel:{:__config('site_mobile','value')}">电话咨询 <span>{:__config('site_mobile','value')}</span></a></div></div><figure class="ct-art"><picture><source srcset="__ADDON__/images/contact/connection.webp" type="image/webp"><img src="__ADDON__/images/contact/connection.jpg" width="1440" height="960" alt="两组白色石材门框由蓝色玻璃桥连接,表达交流与合作" fetchpriority="high"></picture><figcaption><span>从沟通开始,确认项目方向。</span><span>抽象建筑示意</span></figcaption></figure></div></div></section>
<section class="ct-section" id="consultation"><div class="ct-wrap ct-main-grid"><div class="ct-form-panel"><div class="ct-section-intro"><p class="ct-eyebrow">项目咨询</p><h2>告诉我们您的需求</h2><p>填写称呼、联系电话、需求主题和简要说明,便于后续联系。标注 * 的项目为必填。</p></div>
<form class="ct-form" id="project-form" method="post" action="{:addon_url('official/web.official_online_message/list',[':pid'=>18,':sid'=>18])}" data-token-url="{:addon_url('official/web.official_home/get_token')}" novalidate>
{:token()}
<fieldset class="ct-direction"><legend>咨询方向 <span>可选</span></legend><div class="ct-topics"><button type="button" data-topic="软件定制开发" aria-pressed="false">软件开发</button><button type="button" data-topic="APP 与小程序定制" aria-pressed="false">APP / 小程序</button><button type="button" data-topic="企业智能体开发" aria-pressed="false">企业智能体</button><button type="button" data-topic="商业软件产品咨询" aria-pressed="false">产品咨询</button></div></fieldset>
<div class="ct-field"><label for="ct-title">需求主题 <span aria-hidden="true">*</span></label><input id="ct-title" name="title" type="text" maxlength="100" required aria-describedby="ct-title-error" placeholder="例如:订货系统开发、现有系统改造"><p class="ct-field-error" id="ct-title-error" hidden></p></div>
<div class="ct-field-row"><div class="ct-field"><label for="ct-name">您的称呼 <span aria-hidden="true">*</span></label><input id="ct-name" name="name" type="text" maxlength="50" autocomplete="name" required aria-describedby="ct-name-error" placeholder="请填写姓名或称呼"><p class="ct-field-error" id="ct-name-error" hidden></p></div><div class="ct-field"><label for="ct-phone">联系电话 <span aria-hidden="true">*</span></label><input id="ct-phone" name="phone" type="tel" inputmode="tel" maxlength="30" autocomplete="tel" required aria-describedby="ct-phone-hint ct-phone-error" placeholder="手机或固定电话"><p class="ct-hint" id="ct-phone-hint">固定电话请包含区号。</p><p class="ct-field-error" id="ct-phone-error" hidden></p></div></div>
<div class="ct-field"><label for="ct-content">需求说明 <span aria-hidden="true">*</span></label><textarea id="ct-content" name="content" rows="4" maxlength="5000" required aria-describedby="ct-content-hint ct-content-error" placeholder="请简要说明业务现状、希望解决的问题和计划时间。"></textarea><p class="ct-hint" id="ct-content-hint">初次沟通无需提交账号、密码或未脱敏的业务数据。</p><p class="ct-field-error" id="ct-content-error" hidden></p></div>
{if $captchaType == 'text'}
<div class="ct-field"><label for="ct-captcha">图片验证码 <span aria-hidden="true">*</span></label><div class="ct-captcha"><input id="ct-captcha" name="captcha" type="text" maxlength="10" autocomplete="off" required aria-describedby="ct-captcha-hint ct-captcha-error" placeholder="输入图片字符"><button type="button" class="ct-captcha-refresh" aria-label="更换图片验证码" data-captcha-url="{:captcha_src()}"><img src="{:captcha_src()}" alt="验证码图片" width="110" height="44"><span>换一张</span></button></div><p class="ct-hint" id="ct-captcha-hint">看不清时,可点击图片更换。</p><p class="ct-field-error" id="ct-captcha-error" hidden></p></div>
{/if}
<p class="ct-submit-status" role="status" aria-live="polite" tabindex="-1" hidden></p>
<div class="ct-submit-line"><button class="ct-button ct-submit" type="submit">提交项目需求 <span aria-hidden="true">↗</span></button><p>提交后,请保持联系电话畅通。</p></div>
<p class="ct-form-note">您提交的信息将用于本次项目咨询与联系。涉及保密资料时,可先沟通保密安排,再提供相关材料。</p>
<noscript><p class="ct-noscript">在线提交需要启用 JavaScript,也可通过电话或邮箱联系。</p></noscript>
</form></div>
<aside class="ct-direct"><p class="ct-eyebrow">直接联系</p><h2>选择适合的沟通方式</h2><dl class="ct-contact-list"><div><dt>业务咨询电话</dt><dd><a class="ct-phone" href="tel:{:__config('site_mobile','value')}">{:__config('site_mobile','value')}</a></dd></div><div><dt>电子邮箱</dt><dd><a href="mailto:{:__config('site_email','value')}">{:__config('site_email','value')}</a></dd></div><div><dt>工作时间</dt><dd>周一至周五 09:00—18:00</dd></div></dl><div class="ct-prepare"><h3>沟通前,可先准备</h3><ol><li><span>01</span>主要业务流程与使用对象</li><li><span>02</span>现有系统、设备或接口情况</li><li><span>03</span>需要处理的问题与计划时间</li></ol><p>暂时没有完整需求文档,也可以先做简要说明。</p></div><div class="ct-next"><h3>提交后的沟通安排</h3><p>收到信息后,我们会根据需求与工作安排联系您,进一步确认项目范围、资料条件和评估方式。</p></div></aside></div></section>
<section class="ct-section ct-soft nhc-contact-map" id="visit"><div class="ct-wrap"><div class="ct-heading"><div><p class="ct-eyebrow">到访信息</p><h2>来访前,请先联系确认</h2></div><p>请先确认接待地点、时间与交流内容。以下提供地址及地图查询入口,具体路线请以地图查询结果为准。</p></div><div class="ct-offices"><article><span class="ct-eyebrow">01 / 营销中心</span><h3>花果园中环广场</h3><address>贵州省贵阳市南明区花果园遵义中路中环广场2号楼26楼20-21号</address><a class="ct-text-link" href="https://uri.amap.com/search?keyword=%E8%B4%B5%E9%98%B3%E8%8A%B1%E6%9E%9C%E5%9B%AD%E4%B8%AD%E7%8E%AF%E5%B9%BF%E5%9C%BA2%E5%8F%B7%E6%A5%BC&amp;city=%E8%B4%B5%E9%98%B3&amp;view=map" target="_blank" rel="noopener noreferrer">查询地图 <span aria-hidden="true">↗</span><span class="ct-sr">(在新窗口打开高德地图)</span></a></article><article><span class="ct-eyebrow">02 / 技术中心</span><h3>经开区大数据安全产业园</h3><address>贵州省贵阳市经开区数字经济产业园大数据安全产业园数楼4楼02-03号</address><a class="ct-text-link" href="https://uri.amap.com/search?keyword=%E8%B4%B5%E9%98%B3%E7%BB%8F%E5%BC%80%E5%8C%BA%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8%E4%BA%A7%E4%B8%9A%E5%9B%AD&amp;city=%E8%B4%B5%E9%98%B3&amp;view=map" target="_blank" rel="noopener noreferrer">查询地图 <span aria-hidden="true">↗</span><span class="ct-sr">(在新窗口打开高德地图)</span></a></article></div></div></section>
<section class="ct-section" id="faq"><div class="ct-wrap ct-faq-layout"><div><p class="ct-eyebrow">沟通须知</p><h2>初次咨询,<br>您可能关心这些</h2></div><div class="ct-faq"><details><summary>只有初步想法,可以先沟通吗?<span aria-hidden="true"></span></summary><p>可以。先说明使用对象、当前的操作方式和主要问题,再逐步梳理功能范围与优先级。涉及详细调研、原型或专项验证时,另行确认工作内容。</p></details><details><summary>何时可以确定方案、周期与费用?<span aria-hidden="true"></span></summary><p>需要先了解业务流程、功能范围、接口与资料条件。评估后再确认实施计划与费用清单;初次留言不等同于已完成方案评估。</p></details><details><summary>涉及商业资料,如何安排沟通?<span aria-hidden="true"></span></summary><p>可先用脱敏资料说明业务,必要时在进一步交流前沟通保密协议、资料范围与使用方式。请勿通过留言提交账号密码或完整的敏感业务数据。</p></details><details><summary>能否线上交流或当面讨论?<span aria-hidden="true"></span></summary><p>可先通过电话或线上会议确认需求。需要到访或现场调研时,提前沟通地点、人员、内容及相关安排。</p></details></div></div></section>
</main>
{/block}
{block name="js"}
<script src="__ADDON__/js/contact-nhc.js?v=20261105a" defer></script>
{/block}

查看文件

@@ -0,0 +1,20 @@
{
"tool": "built-in image_gen",
"directory": "M:/2026项目/nahaichuan/public/assets/addons/official/images/about",
"images": [
{
"files": [
"landscape.webp",
"landscape.jpg"
],
"prompt": "Ultra-refined abstract landscape sculpture photograph for the About page of a Chinese enterprise software company. Landscape 3:2 image designed to crop into a wide 3:1 panorama. A low continuous installation of precisely layered warm-white limestone terraces, like a restrained abstract mountain landscape, with a single translucent deep cobalt-blue glass water channel weaving smoothly through the central valley and joining two quiet courtyards. Complete low sculpture lies in middle horizontal band with broad empty space above and below; museum architectural model, real tactile stone microtexture, finely crafted edges, no ornamental patterns. Seamless warm pale-white gallery background, natural soft daylight, delicate shadows and subtle blue refraction. Contemporary Chinese spatial sensibility through negative space, clean alignment and landscape rhythm. Luxury architecture monograph editorial photography, physical material realism, calm and professional. No text, no letters, no logos, no screens, no interface, no circuitry, no robots, no spheres, no ribbons, no purple, no neon, no cartoon."
},
{
"files": [
"collaboration.webp",
"collaboration.jpg"
],
"prompt": "Exquisite abstract architectural still-life photography for the About page of a refined Chinese software engineering company. Landscape 3:2. A small complete model of four finely crafted warm-white limestone wall planes meeting around one open rectangular courtyard, connected through narrow elegant doorway gaps, and one clear cobalt-blue glass sheet crossing the shared central space. All walls at different measured heights, quiet collaboration expressed through a coherent built structure, balanced oblique high camera angle, subtle joinery and fine limestone grain. Complete sculpture centered with generous margins on matte warm-white gallery ground. Soft daylight, delicate slate shadows, restrained blue refraction, physical realism, luxury architecture catalogue editorial style. Contemporary Chinese courtyard proportions through geometry and emptiness, no traditional ornament. No people, no fake office, no text, no letters, no logos, no screen, no UI, no circuitry, no neon, no purple, no robots, no spheres, no ribbons, no cartoon."
}
]
}

38
docs/about-redesign.md 普通文件
查看文件

@@ -0,0 +1,38 @@
# 关于我们页面重构
页面:https://www.gynhc.com/h/home/single/1/1.html
## 规划与文案
以公司介绍、服务方向、团队协作、资质与资料、合作方式和项目沟通组织内容。保留原站成立于 2016 年、贵阳所在地及现有软件业务信息。服务方向连接软件开发、APP 与小程序、企业智能体和商业产品页面。
团队按需求设计、研发集成、测试交付、运行维护说明职责,未沿用缺少佐证的个人履历。资质板块改为企业主体、软件权属与项目标准要求,撤下示意认证徽章;具体认证以有效证书核验,未新增资质、客户、业绩或绝对化承诺。
## 设计与资源
浅色专业风,蓝色交互、1280px 容器、细线分区与紧凑排版。字体遵循网站当前的全站设置。首屏使用石材山形与蓝色玻璃水道抽象图,团队板块使用开放庭院抽象图,均注明示意性质。
页面模板:
- `addons/official/view/web/official_home/single.html`
- `addons/official/view/web/official_home/single_e.html`
独立样式:`public/assets/addons/official/css/about-nhc.css`,作用域限定在 `.about-nhc`。
内置 image_gen 生成两张配图,最终资产位于 `public/assets/addons/official/images/about/`:`landscape.webp`、`landscape.jpg`、`collaboration.webp`、`collaboration.jpg`,尺寸均为 1440×960。WebP 分别为 52,500 与 83,050 字节,保留 JPEG 回退;首屏优先加载、团队图片延迟加载。首屏根据宽屏与手机布局在 CSS 中调整展示比例。完整提示词见 `about-image-prompts.json`。
## 验证
文案 5 项、资料规范 3 项、图片 7 项、关于我们结构 13 项检查通过。相关旧断言已从要求示意认证徽章改为核对配图回退及资质核验措辞,保留测试文件中的其他改动。
浏览器验证 1440px 桌面、375px 手机、812px 横屏、125% 缩放及减少动态效果。图片加载、页内导航、键盘菜单操作正常,主要触控目标至少 44px,无横向溢出。发布后 iPhone 15 模拟环境 393px 宽度检查通过,手机菜单、咨询链接、配置电话和主视觉正常,无浏览器错误。
电脑、手机响应及五个静态资源均为 200,线上资源内容与本地一致。四个服务产品入口、案例入口和咨询入口均返回 200。
UI/UX Pro Max 本地搜索脚本为失效路径指针;依据技能正文及站点规范完成设计与可访问性检查,保留现有 ThinkPHP 技术栈。
## 发布与回退
发布 7 个文件,资产先于模板,逐文件校验 SHA-256,并清理编译模板缓存。发布前保存远端摘要,覆盖前再次核对远端状态。未触发 Git 硬重置,未修改全站样式、公共导航及其他页面。
服务器原版备份:`/www/backup/nhc-about-redesign-20261105-152033`。发布清单:`runtime/about-deployment.json`。本地改前模板及远端核对快照保存在 `runtime/about-backup/`。

查看文件

@@ -0,0 +1,8 @@
{
"tool": "built-in image_gen",
"files": [
"M:/2026项目/nahaichuan/public/assets/addons/official/images/contact/connection.webp",
"M:/2026项目/nahaichuan/public/assets/addons/official/images/contact/connection.jpg"
],
"prompt": "Exquisite abstract architectural still-life photograph for the contact page of a refined Chinese enterprise software company. Landscape 3:2. Two precisely carved warm-white limestone open portal structures face each other across a narrow gap, joined by a single horizontal clear cobalt-blue glass bridge at mid height. A small quiet shared space beneath the connecting beam. Complete sculpture centered with generous margins, restrained modern Chinese spatial proportions and framed emptiness, realistic stone microtexture, elegant precision joinery. Matte warm-white seamless gallery backdrop, soft natural daylight, delicate slate shadows and subtle blue glass refraction. Museum architecture catalogue editorial photography, beautiful understated business character, physically realistic materials. No text, no letters, no logos, no screens, no interface, no phone icons, no location pins, no circuitry, no neon, no purple, no robot, no sphere, no ribbons, no cartoon."
}

45
docs/contact-redesign.md 普通文件
查看文件

@@ -0,0 +1,45 @@
# 联系我们页面重构
页面:https://www.gynhc.com/official/online_message/list/18/18.html
## 页面策划与文案
以业务咨询为核心,提供电话、邮箱和在线留言三种沟通方式。页面包括首屏介绍、项目需求表单、直接联系、资料准备建议、到访地址和常见问答。沿用现有电话、邮箱、工作时间与办公地址;地图按地点关键词查询,不使用未经核实的坐标或伪地图。
撤下两小时回访、24 小时方案等未确认承诺,改为根据需求和工作安排沟通。说明初次咨询的资料范围、脱敏建议及保密安排,不以 ISO 字样作无依据背书。电话与邮箱读取站点配置,点击即可拨号或打开邮件应用。
## 设计与资产
浅色商务风,1280px 容器、科技蓝、细线及紧凑布局。桌面采用表单与联系方式双列,手机端单列。保留站点当前字体规范。新增石材门框与蓝色玻璃桥抽象主视觉,配图明确标注示意。
页面模板:`addons/official/view/web/official_online_message/list.html`、`list_e.html`。
独立样式:`public/assets/addons/official/css/contact-nhc.css`;独立脚本:`public/assets/addons/official/js/contact-nhc.js`。未修改后端控制器、模型及全站公共样式。
图片使用内置 image_gen 生成,保存于 `public/assets/addons/official/images/contact/connection.webp` 与 `connection.jpg`,1440×960。WebP 66,562 字节,JPEG 151,461 字节,首屏优先加载。提示词见 `contact-image-prompt.json`。
## 表单行为
- 称呼、联系电话、主题及需求说明必填,标签与输入控件显式关联;错误显示在对应字段并聚焦首项错误。
- 咨询方向使用按钮,支持键盘及选中状态,可快速填入主题,也可自行编辑。
- 图片验证码支持键盘更换,继续使用原站验证码和令牌机制。
- 使用原有 `name`、`phone`、`title`、`content`、`captcha`、`__token__` 字段及原提交接口。每次提交前从现有 `/hhome/get_token.html` 获取新令牌,避免单次令牌失效后无法重试。
- 提交中禁用按钮,输入设为只读,避免重复提交及输入变化。仅服务端明确成功时清空内容;失败保留正文,校验返回后刷新验证码。
- 网络异常或超时后不自动重复 POST。若无法确认提交结果,显示电话或邮箱确认提示并保留输入。
- 移除页面对外部 Axios CDN 及专属弹层脚本的依赖,使用原生 Fetch 与内联状态反馈。公共模板依赖保持不变。
## 验证
文案 5 项、配图 2 项、联系页结构 12 项检查通过。`tests/contact_form_browser.js` 在本地真实浏览器中执行 13 项模拟检查,覆盖空表单、电话校验、方向选择、重复点击、请求字段与令牌、服务器拒绝、验证码刷新、成功重置、失败重试及网络异常。所有成功路径采用本地模拟响应,未发送真实咨询留言。
检查 1440px 桌面、375px 手机、812px 横屏、125% 缩放及减少动态效果,无横向溢出。发现旧移动样式以 `!important` 覆盖输入框,已在页面独立作用域内修复为 16px 字号、48px 高度,文本域至少 125px。标签、主要按钮、验证码按钮与输入控件触控尺寸通过检查,菜单和问答支持键盘操作。
发布后桌面和 iPhone 请求为 200,模板、脚本、样式与图片引用正确,四个资源内容与本地一致。iPhone 15 模拟环境 393px 宽度无溢出,主题选择、菜单、问答和主视觉正常,无浏览器错误。验证码接口返回图片,令牌接口返回有效响应;使用空必填字段验证线上接口拒绝缺失令牌及空内容,未创建留言。未向线上写入成功测试记录,成功反馈与重试流程通过模拟验证。
UI/UX Pro Max 本地搜索脚本为失效路径指针,依据技能正文完成布局、表单、可访问性与响应式检查,保留现有 ThinkPHP 技术栈。
## 发布与回退
发布 6 个文件,静态资源先于模板,上传校验 SHA-256,覆盖前检查远端未在核对后变更,清理编译模板缓存。未执行 Git reset 或修改其他业务页面。
服务器原版备份:`/www/backup/nhc-contact-redesign-20261105-153734`。清单:`runtime/contact-deployment.json`。本地旧模板与远端快照:`runtime/contact-backup/`。

查看文件

@@ -0,0 +1,7 @@
{
"mode": "Built-in ImageGen",
"desktopPrompt": "Use case: stylized-concept. Asset type: panoramic homepage hero artwork for NAHAICHUAN, a professional Chinese enterprise software and AI development company. Create a visually exceptional premium photorealistic CGI technology brand image, extremely wide 2.5:1 landscape, ideally 2400 x 960. Scene is a luminous white and ice-blue seamless environment. The RIGHT 60 percent contains an elegant large translucent sapphire-blue glass AI computing core with precision silver microprocessor layers at its base; hovering just above it is a beautifully structured neural-network sphere made from fine blue connections and tiny glass nodes, visually clear and sophisticated rather than tangled. Several fine cyan-blue data pathways flow smoothly from the core across a pale ceramic surface into a few low, precisely aligned translucent computing modules. Subtle distant layers suggest connected digital infrastructure. Make AI and advanced computing immediately recognizable. Materials are exquisitely detailed optical glass, brushed silver, matte white ceramic; convincing soft shadows and physically based reflections. Bright refined corporate technology atmosphere, blue #2563EB and restrained cyan #06B6D4 highlights, luminous without neon. MAIN SUBJECT CENTER at approximately 72 percent across the image, all important elements in the right half, sphere fully in frame and with breathing room. LEFT 42 percent is nearly empty, very pale white-blue atmospheric negative space with no objects, no prominent lines, no graphics, intended for dark Chinese heading overlay. Keep the foreground lower-left quiet. Strong spatial hierarchy, premium global enterprise technology art direction, highly polished but credible. No text, letters, numbers, watermark, logo, humanoids, robot, human brain, hands, characters, dark background, purple gradients, cyberpunk city, neon, lens flare, mountains, pagoda, courtyard, cartoon, clutter, generic floating cubes. Produce only the clean image asset, no website mockup.",
"mobilePrompt": "Use case: precise-object-edit / layout recomposition. This is the mobile homepage hero variant of the supplied technology brand image. Preserve the exact same premium photorealistic blue glass AI microprocessor, silver ceramic layers, fine neural-network sphere, small connected computing modules and the pale white-blue visual language. Recompose into a PORTRAIT image 1024x1536, 2:3 aspect ratio. The UPPER 52 percent must be almost entirely empty very pale white-blue atmosphere, smooth and quiet, reserved for dark website heading and buttons; no objects or linework in this upper region. Place the COMPLETE neural sphere and its main glass computing core together in the LOWER 48 percent, centered horizontally, with the sphere around 67 percent down and processor around 85 percent down. All of the main sphere and processor should be fully visible, scaled to fit with 10 percent side margins, smaller secondary modules near the lower corners connected by delicate blue data streams. Soft studio daylight, beautiful crisp optical glass detail, highly polished refined corporate AI aesthetic. No text, no letters, no numbers, no watermark, no logo, no humans, no robot, no brain, no neon, no dark background. This must look like the same brand artwork recomposed for mobile, not a different technology subject.",
"desktopAsset": "public/assets/addons/official/images/home/ai-computing-v4.webp",
"mobileAsset": "public/assets/addons/official/images/home/ai-computing-mobile-v4.webp"
}

查看文件

@@ -0,0 +1,11 @@
.about-nhc{--ab-blue:#2563eb;--ab-ink:#0f172a;--ab-copy:#475569;--ab-muted:#64748b;--ab-line:#dce4ed;--ab-soft:#f8fafc;background:#fff;color:var(--ab-ink);font-family:var(--font-sans,"Microsoft YaHei",sans-serif);font-size:16px;line-height:1.8;overflow-wrap:break-word}.about-nhc *{box-sizing:border-box}.about-nhc :where(h1,h2,h3,p,ul,ol,dl,dd,figure){margin:0}.about-nhc :where(ul,ol){list-style:none;padding:0}.about-nhc :where(h1,h2){font-family:var(--font-serif,"SimSun",serif);font-weight:600;color:var(--ab-ink);line-height:1.5}.about-nhc h3{font-size:20px;line-height:1.5;color:var(--ab-ink);font-weight:600}.about-nhc a{color:inherit;text-decoration:none}.about-nhc a:focus-visible,.about-nhc summary:focus-visible{outline:3px solid var(--ab-blue);outline-offset:4px}.about-nhc nav{height:auto;line-height:inherit;background:transparent;color:inherit;box-shadow:none}.about-nhc [id]{scroll-margin-top:100px}.ab-wrap{max-width:1280px;width:100%;padding:0 32px;margin:auto}.ab-eyebrow{color:var(--ab-blue);font-size:12px;letter-spacing:1px}.ab-skip{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.ab-skip:focus{position:fixed;top:80px;left:20px;z-index:1100;width:auto;height:auto;clip-path:none;background:#fff;padding:12px 20px}.about-nhc .ab-text-link{display:inline-flex;align-items:center;gap:16px;min-height:44px;color:var(--ab-copy);font-size:13px}.about-nhc .ab-text-link:hover{color:var(--ab-blue)}
.ab-hero{padding:92px 0 0}.ab-crumb{display:flex;align-items:center;gap:12px;font-size:12px;color:var(--ab-copy);margin-bottom:22px}.ab-crumb a{display:inline-flex;align-items:center;min-height:44px}.ab-hero-grid{display:grid;grid-template-columns:1.05fr 1fr;gap:9%;align-items:end;margin-bottom:28px}.about-nhc h1{font-size:43px;letter-spacing:.5px;margin-top:12px}.ab-hero-name{font-size:19px;font-weight:500;color:var(--ab-ink);margin-bottom:9px!important}.ab-lead{font-size:15px;color:var(--ab-copy);line-height:1.95;max-width:460px}.ab-hero-grid .ab-text-link{margin-top:9px}.ab-panorama{position:relative;background:#f1efec;overflow:hidden;border-radius:4px}.ab-panorama picture{display:block}.ab-panorama img{display:block;width:100%;height:auto;aspect-ratio:3/1;object-fit:cover}.ab-panorama figcaption{position:absolute;left:0;bottom:0;width:100%;display:flex;justify-content:space-between;gap:20px;padding:19px 24px;font-size:11px;color:var(--ab-copy);background:linear-gradient(transparent,#f8fafcf2)}.ab-panorama figcaption>span:last-child{font-size:10px}.ab-index{border-bottom:1px solid var(--ab-line);background:#fff}.ab-index nav{display:flex;justify-content:space-between;align-items:center;gap:20px}.ab-index a{display:flex;align-items:center;gap:16px;min-height:62px;font-size:13px}.ab-index a:hover{color:var(--ab-blue)}.ab-index a>span{font-size:11px;color:var(--ab-muted)}
.ab-section{padding:42px 0}.ab-soft{background:var(--ab-soft);border-top:1px solid var(--ab-line);border-bottom:1px solid var(--ab-line)}.about-nhc h2{font-size:30px;letter-spacing:.2px}.ab-heading{display:flex;align-items:end;justify-content:space-between;gap:45px;margin-bottom:26px}.ab-heading h2{margin-top:9px}.ab-heading>p{font-size:14px;line-height:1.9;color:var(--ab-copy);max-width:370px}.ab-company{display:grid;grid-template-columns:1fr 1.65fr;gap:65px}.ab-company h2{margin-top:10px}.ab-location{color:var(--ab-copy);font-size:13px;margin-top:21px!important;display:flex;flex-direction:column;gap:5px}.ab-location>span{font-size:10px;letter-spacing:2px;color:var(--ab-muted)}.ab-company-copy>p{font-size:14px;line-height:1.95;color:var(--ab-copy)}.ab-company-copy>.ab-intro{font-size:17px;color:var(--ab-ink);margin-bottom:15px}.ab-facts{margin-top:22px!important;border-top:1px solid var(--ab-line)}.ab-facts>div{display:grid;grid-template-columns:90px 1fr;gap:23px;padding-top:13px;font-size:13px}.ab-facts dt{color:var(--ab-muted)}.ab-facts dd{color:var(--ab-copy)}
.ab-services{border-top:1px solid var(--ab-line)}.ab-services>a{display:grid;grid-template-columns:35px 1fr 270px 24px;align-items:center;gap:25px;min-height:113px;padding:22px 0;border-bottom:1px solid var(--ab-line);transition:background .2s}.ab-services>a:hover{background:#eef3fa}.ab-number{color:var(--ab-blue);font-size:12px}.ab-services h3{font-size:20px;margin-bottom:7px}.ab-services p{font-size:14px;line-height:1.9;color:var(--ab-copy)}.ab-service-note{font-size:12px;color:var(--ab-muted)}.ab-arrow{font-size:22px;color:var(--ab-blue);justify-self:end}.ab-services>a:hover .ab-arrow{color:#1d4ed8}
.ab-team-grid{display:grid;grid-template-columns:.95fr 1.05fr;gap:50px;align-items:center}.ab-courtyard picture{display:block}.ab-courtyard img{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:cover;border-radius:4px}.ab-courtyard figcaption{display:flex;justify-content:space-between;gap:20px;font-size:11px;color:var(--ab-copy);padding-top:13px}.ab-courtyard figcaption>span{font-size:10px;color:var(--ab-muted)}.ab-roles li{display:grid;grid-template-columns:25px 1fr;gap:18px;padding:17px 0;border-top:1px solid var(--ab-line)}.ab-roles li:first-child{border-top:0;padding-top:0}.ab-roles li:last-child{padding-bottom:0}.ab-roles li>span{font-size:12px;color:var(--ab-blue);padding-top:3px}.ab-roles h3{font-size:17px;margin-bottom:7px}.ab-roles p{font-size:14px;line-height:1.9;color:var(--ab-copy)}
.ab-records{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.ab-records article{border-top:1px solid var(--ab-line);padding-top:19px}.ab-records h3{font-size:18px;margin:12px 0 10px}.ab-records p{font-size:14px;color:var(--ab-copy);line-height:1.95}.ab-working{display:grid;grid-template-columns:repeat(3,1fr);gap:40px}.ab-working li{position:relative;border-top:1px solid var(--ab-line);padding:19px 0 0 36px}.ab-working li>span{position:absolute;left:0;top:20px;color:var(--ab-blue);font-size:12px}.ab-working h3{font-size:18px;margin-bottom:10px}.ab-working p{font-size:14px;color:var(--ab-copy);line-height:1.9}.ab-contact{padding:32px 0;background:var(--ab-soft);border-top:1px solid var(--ab-line)}.ab-contact>.ab-wrap{display:flex;align-items:center;justify-content:space-between;gap:50px}.ab-contact h2{margin:10px 0}.ab-contact p:not(.ab-eyebrow){font-size:14px;color:var(--ab-copy)}.ab-contact>.ab-wrap>div:last-child{display:flex;flex-direction:column;align-items:flex-start;gap:10px;flex-shrink:0}.about-nhc .ab-button{display:inline-flex;align-items:center;justify-content:center;gap:28px;min-height:50px;padding:12px 23px;color:#fff;background:var(--ab-blue);font-size:14px;border-radius:4px;transition:background .2s}.about-nhc .ab-button:hover{background:#1d4ed8}.about-nhc .ab-button:active{background:#1e40af}.ab-button>span{font-size:20px;line-height:1}.ab-contact .ab-text-link{font-size:12px}
.ab-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(--ab-line)}.about-nhc .ab-brand{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}.ab-brand>span{font-size:8px;letter-spacing:1.5px;font-weight:500;color:var(--ab-muted);margin-top:5px}.about-nhc .ab-header-contact{min-height:44px;display:flex;align-items:center;color:var(--ab-blue);font-size:12px}.ab-menu summary{display:flex;align-items:center;gap:7px;min-height:44px;list-style:none;cursor:pointer;font-size:12px}.ab-menu summary::-webkit-details-marker{display:none}.ab-menu svg{width:20px;height:20px;stroke:currentColor;stroke-width:1.5;fill:none}.about-nhc .ab-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(--ab-line);box-shadow:0 18px 30px #0f172a0d}.ab-menu nav a{display:flex;align-items:center;min-height:52px;border-bottom:1px solid var(--ab-line);font-size:15px;color:var(--ab-copy)}.about-nhc .ab-menu nav a[aria-current]{color:var(--ab-blue)}
@media(max-width:1023px){.ab-hero-grid{gap:35px}.about-nhc h1{font-size:35px}.ab-hero-name{font-size:17px}.about-nhc h2{font-size:27px}.ab-heading{gap:30px}.ab-heading>p{max-width:300px}.ab-company{gap:35px;grid-template-columns:1fr 1.5fr}.ab-services>a{grid-template-columns:28px 1fr 24px;gap:20px}.ab-service-note{display:none}.ab-team-grid{gap:30px}.ab-records{gap:25px}.ab-working{gap:27px}.ab-contact>.ab-wrap{gap:30px}}
@media(max-width:767px){.ab-wrap{padding:0 22px}.about-nhc [id]{scroll-margin-top:85px}.ab-hero{padding:84px 0 0}.ab-crumb{margin-bottom:16px}.ab-eyebrow{font-size:11px}.ab-hero-grid{grid-template-columns:1fr;gap:20px;margin-bottom:23px}.about-nhc h1{font-size:32px;margin-top:11px;letter-spacing:0;line-height:1.5}.ab-hero-name{font-size:17px;margin-bottom:9px!important}.ab-lead{font-size:16px;line-height:1.85;max-width:none}.ab-hero-grid .ab-text-link{margin-top:7px}.ab-panorama img{aspect-ratio:1.65;object-fit:cover;object-position:center}.ab-panorama figcaption{padding:13px 16px;font-size:10px}.ab-panorama figcaption>span:last-child{display:none}.ab-index nav{justify-content:flex-start;flex-wrap:wrap;gap:0 22px;padding-top:7px;padding-bottom:7px}.ab-index a{font-size:12px;min-height:44px;gap:8px}.ab-index a>span{font-size:10px}.ab-section{padding:29px 0}.about-nhc h2{font-size:26px}.ab-heading{display:block;margin-bottom:22px}.ab-heading>p{max-width:none;font-size:16px;line-height:1.85;margin-top:13px}.ab-heading>.ab-text-link{margin-top:12px}.ab-company{grid-template-columns:1fr;gap:20px}.ab-company h2 br{display:none}.ab-location{display:none}.ab-company-copy>.ab-intro{font-size:17px;line-height:1.9;margin-bottom:14px}.ab-company-copy>p{font-size:16px;line-height:1.85}.ab-facts{margin-top:20px!important}.ab-facts>div{grid-template-columns:65px 1fr;gap:18px;font-size:14px;padding-top:13px}.ab-services>a{grid-template-columns:22px 1fr 18px;gap:13px;padding:21px 0;min-height:0}.ab-services h3{font-size:19px}.ab-services p{font-size:16px;line-height:1.85}.ab-arrow{font-size:20px}.ab-team-grid{grid-template-columns:1fr;gap:25px}.ab-courtyard figcaption{font-size:11px}.ab-roles li{gap:14px;padding:18px 0}.ab-roles h3{font-size:18px}.ab-roles p{font-size:16px;line-height:1.85}.ab-records{grid-template-columns:1fr;gap:23px}.ab-records article{padding-top:17px}.ab-records h3{font-size:19px;margin:10px 0}.ab-records p{font-size:16px;line-height:1.85}.ab-working{grid-template-columns:1fr;gap:23px}.ab-working h3{font-size:19px}.ab-working p{font-size:16px;line-height:1.85}.ab-contact{padding:28px 0}.ab-contact>.ab-wrap{display:block}.ab-contact h2{font-size:26px}.ab-contact p:not(.ab-eyebrow){font-size:16px;line-height:1.85}.ab-contact>.ab-wrap>div:last-child{margin-top:20px}.ab-contact .ab-text-link{font-size:13px}}
@media(max-width:374px){.ab-wrap{padding:0 18px}.about-nhc h1{font-size:29px}.ab-index nav{gap:0 16px}.ab-mobile-header{gap:20px}}
@media(prefers-reduced-motion:reduce){html:has(.about-nhc){scroll-behavior:auto}.about-nhc *{animation:none!important;transition:none!important;scroll-behavior:auto!important}}

查看文件

@@ -0,0 +1,12 @@
.contact-nhc{--ct-blue:#2563eb;--ct-ink:#0f172a;--ct-copy:#475569;--ct-muted:#64748b;--ct-line:#dce4ed;--ct-soft:#f8fafc;--ct-error:#b91c1c;background:#fff;color:var(--ct-ink);font-size:16px;line-height:1.8;overflow-wrap:break-word}.contact-nhc *{box-sizing:border-box}.contact-nhc :where(h1,h2,h3,p,figure,ol,dl,dd,fieldset){margin:0}.contact-nhc :where(h1,h2){font-family:var(--font-serif,"SimSun",serif);font-weight:600;line-height:1.5;color:var(--ct-ink)}.contact-nhc h3{font-size:18px;line-height:1.5;font-weight:600;color:var(--ct-ink)}.contact-nhc a{color:inherit;text-decoration:none}.contact-nhc :where(a,button,input,textarea,summary):focus-visible{outline:3px solid var(--ct-blue);outline-offset:4px}.contact-nhc nav{height:auto;line-height:inherit;box-shadow:none;background:transparent;color:inherit}.contact-nhc [hidden]{display:none!important}.contact-nhc [id]{scroll-margin-top:100px}.ct-wrap{max-width:1280px;width:100%;margin:auto;padding:0 32px}.ct-eyebrow{font-size:12px;letter-spacing:1px;color:var(--ct-blue)}.ct-skip,.ct-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}.ct-skip:focus{position:fixed;top:80px;left:20px;width:auto;height:auto;clip-path:none;background:#fff;padding:12px 20px;z-index:1100}.contact-nhc .ct-button{display:inline-flex;align-items:center;justify-content:center;gap:25px;min-height:50px;padding:12px 22px;border:1px solid var(--ct-blue);border-radius:4px;background:var(--ct-blue);color:#fff;font-size:14px;line-height:1.7;cursor:pointer;transition:background .2s;box-shadow:none;text-transform:none;letter-spacing:0}.ct-button>span{font-size:20px;line-height:1}.contact-nhc .ct-button:hover{background:#1d4ed8}.contact-nhc .ct-button:disabled{background:#64748b;border-color:#64748b;color:#fff;cursor:wait}.contact-nhc .ct-text-link{display:inline-flex;align-items:center;gap:15px;min-height:44px;color:var(--ct-copy);font-size:13px}.contact-nhc .ct-text-link:hover{color:var(--ct-blue)}
.ct-hero{padding:92px 0 30px}.ct-crumb{display:flex;align-items:center;gap:12px;font-size:12px;color:var(--ct-copy);margin-bottom:20px}.ct-crumb a{display:inline-flex;align-items:center;min-height:44px}.ct-hero-grid{display:grid;grid-template-columns:1.05fr 1fr;gap:70px;align-items:center}.contact-nhc h1{font-size:39px;margin:12px 0 19px;letter-spacing:.3px}.ct-lead{font-size:16px;line-height:1.95;color:var(--ct-copy);max-width:480px}.ct-actions{display:flex;flex-wrap:wrap;align-items:center;gap:15px 25px;margin-top:25px}.ct-art{border:1px solid #e8e6e2;border-radius:4px;overflow:hidden;background:#f2efea}.ct-art picture{display:block}.ct-art img{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:cover}.ct-art figcaption{display:flex;justify-content:space-between;gap:20px;font-size:11px;color:var(--ct-copy);padding:11px 16px;background:#fff;border-top:1px solid #e8e6e2}.ct-art figcaption>span:last-child{font-size:10px;color:var(--ct-muted)}
.ct-section{padding:38px 0}.ct-soft{background:var(--ct-soft);border-top:1px solid var(--ct-line);border-bottom:1px solid var(--ct-line)}.ct-main-grid{display:grid;grid-template-columns:1.45fr 1fr;gap:70px}.ct-form-panel{min-width:0}.ct-section-intro h2{font-size:29px;margin:9px 0 11px}.ct-section-intro>p:last-child{font-size:14px;color:var(--ct-copy);line-height:1.9}.ct-form{margin-top:23px}.contact-nhc .ct-direction{border:0;padding:0;margin:0 0 20px;min-width:0}.ct-direction legend{font-size:14px;font-weight:500;color:var(--ct-ink);padding:0;margin-bottom:10px}.ct-direction legend>span{font-size:12px;color:var(--ct-muted);margin-left:9px;font-weight:400}.ct-topics{display:flex;gap:8px;flex-wrap:wrap}.ct-topics button{min-height:44px;border:1px solid var(--ct-line);border-radius:4px;background:#fff;color:var(--ct-copy);padding:8px 13px;font:inherit;font-size:12px;cursor:pointer;transition:background .2s,color .2s,border-color .2s;box-shadow:none;text-transform:none;letter-spacing:0}.ct-topics button:hover{border-color:var(--ct-blue);color:var(--ct-blue)}.ct-topics button[aria-pressed=true]{background:#eff6ff;border-color:var(--ct-blue);color:#1d4ed8}.ct-field{margin-bottom:19px;min-width:0}.ct-field-row{display:grid;grid-template-columns:1fr 1fr;gap:20px}.contact-nhc .ct-field label{display:block;position:static;transform:none;font-size:14px;color:var(--ct-ink);font-weight:500;margin:0 0 8px;line-height:1.6}.ct-field label>span{color:var(--ct-error);margin-left:3px}.contact-nhc .ct-field input,.contact-nhc .ct-field textarea{display:block;width:100%;height:48px;box-sizing:border-box;min-width:0;border:1px solid #cbd5e1;border-radius:4px;background:#fff;color:var(--ct-ink);padding:11px 13px;margin:0;font:inherit;font-size:15px;line-height:1.6;box-shadow:none;transition:border-color .2s}.contact-nhc .ct-field textarea{height:auto;min-height:125px;resize:vertical}.contact-nhc .ct-field input:focus,.contact-nhc .ct-field textarea:focus{border-color:var(--ct-blue);box-shadow:0 0 0 1px var(--ct-blue)}.contact-nhc .ct-field :where(input,textarea)[aria-invalid=true]{border-color:var(--ct-error)}.contact-nhc :where(input,textarea)::placeholder{color:var(--ct-muted);opacity:1}.ct-hint{font-size:12px;color:var(--ct-muted);line-height:1.8;margin-top:7px!important}.ct-field-error{font-size:13px;color:var(--ct-error);line-height:1.8;margin-top:7px!important}.ct-captcha{display:flex;align-items:center;gap:15px}.contact-nhc .ct-captcha input{max-width:210px;flex:1}.ct-captcha-refresh{display:inline-flex;align-items:center;gap:10px;min-height:48px;border:0;padding:0;background:#fff;cursor:pointer;font-size:12px;color:var(--ct-copy);box-shadow:none;text-transform:none;letter-spacing:0}.ct-captcha-refresh img{width:110px;height:44px;object-fit:contain;display:block}.ct-submit-status{font-size:14px;line-height:1.9;padding:12px 15px;border:1px solid var(--ct-line);background:var(--ct-soft);color:var(--ct-copy);border-radius:4px;margin:0 0 17px!important}.ct-submit-status[data-state=error]{color:var(--ct-error);border-color:#fecaca;background:#fff7f7}.ct-submit-status[data-state=success]{color:#166534;border-color:#bbf7d0;background:#f0fdf4}.ct-submit-line{display:flex;align-items:center;gap:20px;flex-wrap:wrap}.ct-submit-line>p{font-size:12px;color:var(--ct-muted)}.ct-form-note,.ct-noscript{font-size:12px;color:var(--ct-copy);line-height:1.9;margin-top:16px!important}.ct-direct{align-self:start;background:var(--ct-soft);border:1px solid var(--ct-line);border-radius:4px;padding:28px}.ct-direct h2{font-size:24px;margin-top:10px}.ct-contact-list{margin-top:19px!important}.ct-contact-list>div{padding:16px 0;border-bottom:1px solid var(--ct-line)}.ct-contact-list dt{font-size:12px;color:var(--ct-muted);margin-bottom:4px}.ct-contact-list dd{font-size:14px;color:var(--ct-copy)}.ct-contact-list a{min-height:44px;display:inline-flex;align-items:center}.ct-contact-list .ct-phone{font-size:27px;letter-spacing:.5px;color:var(--ct-ink)}.ct-contact-list a:hover{color:var(--ct-blue)}.ct-prepare{padding-top:23px}.ct-prepare h3,.ct-next h3{font-size:16px}.ct-prepare ol{padding:0;list-style:none;margin-top:13px}.ct-prepare li{display:flex;gap:15px;font-size:13px;color:var(--ct-copy);margin-top:9px}.ct-prepare li>span{font-size:11px;color:var(--ct-blue);padding-top:2px}.ct-prepare p,.ct-next p{font-size:13px;color:var(--ct-copy);line-height:1.9;margin-top:13px}.ct-next{padding-top:20px;margin-top:21px;border-top:1px solid var(--ct-line)}
.ct-heading{display:flex;align-items:end;justify-content:space-between;gap:50px;margin-bottom:25px}.contact-nhc h2{font-size:29px}.ct-heading h2{margin-top:9px}.ct-heading>p{font-size:14px;line-height:1.9;color:var(--ct-copy);max-width:400px}.ct-offices{display:grid;grid-template-columns:1fr 1fr;gap:50px}.ct-offices article{border-top:1px solid var(--ct-line);padding-top:21px}.ct-offices h3{font-size:21px;margin:11px 0}.ct-offices address{font-style:normal;font-size:14px;line-height:1.95;color:var(--ct-copy);max-width:460px}.ct-offices .ct-text-link{margin-top:8px}.ct-faq-layout{display:grid;grid-template-columns:1fr 1.65fr;gap:65px}.ct-faq-layout h2{margin-top:10px}.ct-faq details{border-top:1px solid var(--ct-line)}.ct-faq details:last-child{border-bottom:1px solid var(--ct-line)}.ct-faq summary{display:flex;align-items:center;justify-content:space-between;gap:25px;min-height:63px;padding:14px 0;font-size:15px;font-weight:500;cursor:pointer;list-style:none}.ct-faq summary::-webkit-details-marker{display:none}.ct-faq summary>span{position:relative;width:16px;height:16px;flex-shrink:0}.ct-faq summary>span:before,.ct-faq summary>span:after{content:"";position:absolute;left:2px;top:8px;width:12px;height:1px;background:var(--ct-blue)}.ct-faq summary>span:after{transform:rotate(90deg);transition:transform .2s}.ct-faq details[open] summary>span:after{transform:rotate(0)}.ct-faq details>p{padding:0 25px 20px 0;font-size:14px;color:var(--ct-copy);line-height:1.95}
.ct-mobile-header{position:fixed;top:0;left:0;width:100%;height:68px;z-index:1000;background:#fffffff5;border-bottom:1px solid var(--ct-line);display:flex;align-items:center;gap:24px;padding:0 22px}.contact-nhc .ct-brand{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}.ct-brand>span{font-size:8px;font-weight:500;letter-spacing:1.5px;margin-top:5px;color:var(--ct-muted)}.contact-nhc .ct-header-contact{min-height:44px;display:flex;align-items:center;font-size:12px;color:var(--ct-blue)}.ct-menu summary{display:flex;align-items:center;gap:7px;min-height:44px;font-size:12px;cursor:pointer;list-style:none}.ct-menu summary::-webkit-details-marker{display:none}.ct-menu svg{width:20px;height:20px;stroke:currentColor;stroke-width:1.5;fill:none}.contact-nhc .ct-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(--ct-line);box-shadow:0 18px 30px #0f172a0d}.ct-menu nav a{display:flex;align-items:center;min-height:52px;border-bottom:1px solid var(--ct-line);font-size:15px;color:var(--ct-copy)}.contact-nhc .ct-menu nav a[aria-current]{color:var(--ct-blue)}
@media(max-width:1023px){.ct-hero-grid{gap:35px}.contact-nhc h1{font-size:34px}.ct-main-grid{gap:35px;grid-template-columns:1.4fr 1fr}.ct-direct{padding:22px}.contact-nhc h2{font-size:26px}.ct-direct h2{font-size:22px}.ct-captcha{gap:10px}.ct-captcha-refresh{gap:7px}.ct-captcha-refresh>span{display:none}.ct-faq-layout{gap:35px}}
@media(max-width:767px){.ct-wrap{padding:0 22px}.contact-nhc [id]{scroll-margin-top:85px}.ct-hero{padding:84px 0 24px}.ct-crumb{margin-bottom:16px}.ct-eyebrow{font-size:11px}.ct-hero-grid{grid-template-columns:1fr;gap:25px}.contact-nhc h1{font-size:30px;margin:11px 0 16px;letter-spacing:0}.ct-lead{font-size:16px;line-height:1.85}.ct-actions{gap:10px 20px;margin-top:20px}.ct-art figcaption{font-size:10px;padding:10px 13px;gap:15px}.ct-section{padding:28px 0}.ct-main-grid{grid-template-columns:1fr;gap:28px}.contact-nhc h2{font-size:26px}.ct-section-intro>p:last-child{font-size:16px;line-height:1.85}.ct-form{margin-top:20px}.ct-direction legend{font-size:15px}.ct-topics{gap:8px}.ct-topics button{font-size:12px;padding:8px 11px}.ct-field-row{grid-template-columns:1fr;gap:0}.contact-nhc .ct-field label{font-size:15px}.contact-nhc .ct-field input,.contact-nhc .ct-field textarea{font-size:16px;min-height:48px}.ct-field{margin-bottom:18px}.ct-hint{font-size:12px}.ct-field-error{font-size:14px}.ct-captcha-refresh>span{display:inline}.ct-captcha-refresh{flex-shrink:0}.contact-nhc .ct-captcha input{max-width:none;flex:1;min-width:80px}.ct-submit-line{gap:12px}.ct-submit-line>p{font-size:12px}.ct-submit-status{font-size:16px}.ct-form-note{font-size:12px}.ct-direct{padding:23px}.ct-direct h2{font-size:24px}.ct-contact-list dd{font-size:16px}.ct-contact-list .ct-phone{font-size:29px}.ct-prepare h3,.ct-next h3{font-size:17px}.ct-prepare li,.ct-prepare p,.ct-next p{font-size:16px;line-height:1.85}.ct-prepare li>span{font-size:12px}.ct-heading{display:block;margin-bottom:22px}.ct-heading>p{font-size:16px;line-height:1.85;max-width:none;margin-top:13px}.ct-offices{grid-template-columns:1fr;gap:23px}.ct-offices h3{font-size:20px}.ct-offices address{font-size:16px;line-height:1.85}.ct-faq-layout{grid-template-columns:1fr;gap:22px}.ct-faq-layout h2 br{display:none}.ct-faq summary{font-size:16px;gap:20px}.ct-faq details>p{font-size:16px;line-height:1.85;padding:0 0 20px}}
@media(max-width:374px){.ct-wrap{padding:0 18px}.contact-nhc h1{font-size:27px}.ct-captcha-refresh>span{display:none}.ct-mobile-header{gap:20px}.ct-topics button{padding:8px 10px}}
/* The legacy mobile stylesheet forces form styles with !important. */
.contact-nhc .ct-field input,.contact-nhc .ct-field textarea{box-sizing:border-box!important;border:1px solid #cbd5e1!important;background:#fff!important;padding:11px 13px!important;font-size:16px!important;margin:0!important;box-shadow:none!important;color:var(--ct-ink)!important}
.contact-nhc .ct-field input{height:48px!important}.contact-nhc .ct-field textarea{height:auto!important;min-height:125px!important}.contact-nhc .ct-field :where(input,textarea)[aria-invalid=true]{border-color:var(--ct-error)!important}.contact-nhc .ct-field :where(input,textarea):focus{border-color:var(--ct-blue)!important;box-shadow:0 0 0 1px var(--ct-blue)!important}.contact-nhc .ct-field label{color:var(--ct-ink)!important}
@media(prefers-reduced-motion:reduce){html:has(.contact-nhc){scroll-behavior:auto}.contact-nhc *{animation:none!important;transition:none!important;scroll-behavior:auto!important}}

查看文件

@@ -0,0 +1,70 @@
/* Shared brand masthead. Text follows the site-wide YaHei typography. */
.nhc-header{background:#fffffff7;border-bottom:1px solid #dce5f0;box-shadow:0 2px 12px #0f172a04}
.nhc-header>.nhc-container{max-width:1360px;padding:0 40px}
.nhc-header .nhc-nav-inner{position:relative;height:80px;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:30px}
.nhc-header .nhc-logo{gap:0;min-width:0;white-space:nowrap}
.nhc-header .nhc-brand-home{display:flex;align-items:center;gap:12px;min-height:48px;color:#0f172a}
.nhc-header .nhc-brand-symbol{display:block;width:36px;height:48px;flex-shrink:0;background:url('../images/brand/nhc-official-logo.png') center/auto 100% no-repeat}
.nhc-header .nhc-logo-brand{gap:3px;display:flex;flex-direction:column}
.nhc-header .nhc-logo-text{font-size:25px;line-height:1.2;letter-spacing:3px;font-weight:700;color:#0f172a}
.nhc-header .nhc-logo-sub{font-size:10px;line-height:1.3;letter-spacing:2px;color:#475569;font-weight:500}
.nhc-header .nhc-brand-descriptor{display:flex;flex-direction:column;gap:5px;margin-left:20px;padding-left:20px;border-left:1px solid #d7e0eb;color:#334155;font-size:12px;line-height:1.5;letter-spacing:1px}
.nhc-brand-descriptor small{font-size:9px;color:#64748b;letter-spacing:1px}
.nhc-header .nhc-main-nav{display:flex;align-items:center;height:80px}
.nhc-header .nhc-nav-menu{display:flex;align-items:center;gap:27px;margin:0;padding:0;height:100%}
.nhc-header .nhc-nav-menu>li{position:static;height:100%;display:flex;align-items:center}
.nhc-header .nhc-nav-link{font-size:14px;line-height:1.5;letter-spacing:.3px;display:inline-flex;align-items:center;gap:5px;min-height:80px;padding:0;white-space:nowrap}
.nhc-header .nhc-nav-link::after{bottom:16px;height:2px;border-radius:1px}
.nhc-header .nhc-nav-link:hover::after,.nhc-header .nhc-nav-link.active::after,.nhc-header .nhc-nav-link:focus-visible::after{width:18px}
.nhc-header .nhc-caret{width:11px;height:11px;opacity:.85}
.nhc-header .nhc-nav-actions{justify-self:end;padding-left:24px;border-left:1px solid #e2e8f0;gap:0}
.nhc-header .nhc-nav-actions .nhc-btn{min-height:42px;padding:9px 17px;border-radius:4px;font-size:12px;gap:15px;box-shadow:none;white-space:nowrap}
.nhc-header .nhc-mega-panel{top:100%;left:50%;width:1100px;max-width:100%;border-radius:0 0 6px 6px;padding:28px 30px}
.nhc-header .nhc-has-dropdown:focus-within .nhc-mega-panel{opacity:1;visibility:visible;pointer-events:auto;transform:translateX(-50%) translateY(0)}
.nhc-header .nhc-has-dropdown:focus-within>.nhc-nav-link{color:#2563eb}
.nhc-header .nhc-compact-menu{display:none}
/* The supplied official logo is shared by desktop and mobile headers. */
body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header){gap:18px;background:#fffffff7;border-bottom:1px solid #dce5f0;box-shadow:0 2px 12px #0f172a04}
body :is(.hn-mobile-brand,.sw2-brand,.sw-brand,.ap-brand,.av-brand,.cs-brand){position:relative;padding-left:36px;font-size:22px!important;letter-spacing:2px;font-weight:700!important;line-height:1.2}
body :is(.hn-mobile-brand,.sw2-brand,.sw-brand,.ap-brand,.av-brand,.cs-brand)::before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:26px;height:36px;background:url('../images/brand/nhc-official-logo.png') center/auto 100% no-repeat}
body :is(.hn-mobile-brand,.sw2-brand,.sw-brand,.ap-brand,.av-brand,.cs-brand)>span{display:none!important}
@media(max-width:1200px){.nhc-header .nhc-brand-descriptor{display:none}.nhc-header .nhc-nav-inner{gap:24px}.nhc-header .nhc-nav-menu{gap:24px}}
@media(min-width:769px) and (max-width:1000px){.nhc-header>.nhc-container{padding-inline:28px}.nhc-header .nhc-nav-inner{gap:18px}.nhc-header .nhc-nav-menu{gap:18px}.nhc-header .nhc-logo-text{font-size:23px}.nhc-header .nhc-logo-sub{font-size:8px;letter-spacing:1.5px}.nhc-header .nhc-brand-symbol{width:30px;height:42px}.nhc-header .nhc-brand-home{gap:10px}.nhc-header .nhc-nav-link{font-size:13px}.nhc-header .nhc-nav-actions{padding-left:18px}.nhc-header .nhc-nav-actions .nhc-btn{padding-inline:13px;gap:10px}}
@media(max-width:768px){.nhc-header>.nhc-container{padding-inline:22px}.nhc-header .nhc-nav-inner{height:68px;grid-template-columns:1fr auto;gap:18px}.nhc-header .nhc-main-nav,.nhc-header .nhc-nav-actions{display:none}.nhc-header .nhc-brand-symbol{width:26px;height:36px}.nhc-header .nhc-brand-home{gap:10px}.nhc-header .nhc-logo-text{font-size:22px;letter-spacing:2px}.nhc-header .nhc-logo-sub{font-size:7px;letter-spacing:1.1px}.nhc-header .nhc-compact-menu{display:block}.nhc-compact-menu summary{display:flex;align-items:center;gap:8px;min-height:44px;cursor:pointer;list-style:none;font-size:12px;color:#334155}.nhc-compact-menu summary::-webkit-details-marker{display:none}.nhc-compact-menu summary svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.5}.nhc-header .nhc-compact-menu nav{position:absolute;top:68px;left:-22px;width:calc(100% + 44px);height:auto;line-height:1.5;background:#fff;border-bottom:1px solid #dce5f0;box-shadow:0 12px 20px #0f172a0a;display:grid;grid-template-columns:1fr 1fr;padding:12px 22px 20px;gap:0 24px}.nhc-compact-menu nav a{display:flex;align-items:center;min-height:50px;border-bottom:1px solid #e2e8f0;color:#334155;font-size:14px}.nhc-compact-menu :is(a,summary):focus-visible{outline:2px solid #2563eb;outline-offset:3px}}
@media(max-width:360px){body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header){gap:12px;padding-inline:18px}body :is(.hn-mobile-brand,.sw2-brand,.sw-brand,.ap-brand,.av-brand,.cs-brand){padding-left:34px;font-size:20px!important}body :is(.hn-mobile-brand,.sw2-brand,.sw-brand,.ap-brand,.av-brand,.cs-brand)::before{width:24px;height:34px}}
/* Scrolled masthead: navy ground, light type, original logo on a white tile. */
html.nhc-nav-scrolled .nhc-header,
html.nhc-nav-scrolled body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header),
html.nhc-nav-scrolled body>.navbar {
background:#0f172af7;
border-bottom-color:#2d3b51;
box-shadow:0 5px 20px #02061726;
}
html.nhc-nav-scrolled .nhc-header :is(.nhc-brand-home,.nhc-logo-text){color:#fff}
html.nhc-nav-scrolled .nhc-header .nhc-logo-sub{color:#cbd5e1}
html.nhc-nav-scrolled .nhc-header .nhc-nav-link,
html.nhc-nav-scrolled .nhc-header .nhc-nav-link:visited{color:#e2e8f0}
html.nhc-nav-scrolled .nhc-header .nhc-nav-link:is(:hover,:focus-visible,.active),
html.nhc-nav-scrolled .nhc-header .nhc-nav-link.active:visited,
html.nhc-nav-scrolled .nhc-header .nhc-has-dropdown:focus-within>.nhc-nav-link{color:#93c5fd}
html.nhc-nav-scrolled .nhc-header .nhc-nav-link::after{background:#93c5fd}
html.nhc-nav-scrolled .nhc-header .nhc-nav-actions{border-left-color:#334155}
html.nhc-nav-scrolled .nhc-header .nhc-compact-menu summary{color:#e2e8f0}
html.nhc-nav-scrolled .nhc-header .nhc-brand-symbol,
html.nhc-nav-scrolled body :is(.hn-mobile-brand,.sw2-brand,.sw-brand,.ap-brand,.av-brand,.cs-brand)::before{background-color:#fff;background-size:auto 90%;border-radius:3px}
html.nhc-nav-scrolled body :is(.hn-mobile-brand,.sw2-brand,.sw-brand,.ap-brand,.av-brand,.cs-brand){color:#fff!important}
html.nhc-nav-scrolled body :is(.hn-mobile-contact,.sw2-header-contact,.sw-header-contact,.ap-header-contact,.av-header-contact,.cs-header-contact){color:#dbeafe!important}
html.nhc-nav-scrolled body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header) summary{color:#e2e8f0}
html.nhc-nav-scrolled body>.navbar :is(.content-left a,.content-center h1,.content-right a){color:#fff}
/* Expanded mobile panels stay white, including when the masthead is dark. */
body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header,.ab-mobile-header,.ct-mobile-header,.nhc-header) details nav{color:#334155;background:#fff}
body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header,.ab-mobile-header,.ct-mobile-header,.nhc-header) details nav a,
body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header,.ab-mobile-header,.ct-mobile-header,.nhc-header) details nav a:visited{color:#334155}
body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header,.ab-mobile-header,.ct-mobile-header,.nhc-header) details nav a:is([aria-current],:hover,:focus-visible){color:#2563eb}
/* Mobile dropdowns retain their white panels and dark menu text. */
html.nhc-nav-scrolled body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header) nav,
html.nhc-nav-scrolled body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header) nav a{color:#334155}
html.nhc-nav-scrolled body :is(.hn-mobile-header,.sw2-mobile-header,.sw-mobile-header,.ap-mobile-header,.av-mobile-header,.cs-mobile-header) nav a:is([aria-current],:hover,:focus-visible){color:#2563eb}

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 175 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 81 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 112 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 51 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 28 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 148 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 65 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 148 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 81 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 183 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 102 KiB

查看文件

@@ -0,0 +1,108 @@
(function () {
'use strict';
var form = document.querySelector('.ct-form');
if (!form) return;
var submit = form.querySelector('.ct-submit');
var status = form.querySelector('.ct-submit-status');
var topics = Array.from(form.querySelectorAll('[data-topic]'));
var refresh = form.querySelector('.ct-captcha-refresh');
var fields = Array.from(form.querySelectorAll('input[required],textarea[required]'));
var pending = false;
var messages = {title: '请填写需求主题。', name: '请填写您的称呼。', phone: '请填写联系电话。', content: '请简要说明您的需求。', captcha: '请填写图片验证码。'};
function showStatus(message, state) {
status.textContent = message;
status.dataset.state = state;
status.hidden = false;
}
function validate(field) {
var value = field.value.trim();
var message = value ? '' : messages[field.name];
if (!message && field.name === 'phone' && (!/^[+\d\s().-]+$/.test(value) || value.replace(/\D/g, '').length < 7)) {
message = '请填写可联系的手机或固定电话,固定电话请包含区号。';
}
var error = document.getElementById(field.id + '-error');
field.setAttribute('aria-invalid', String(!!message));
error.textContent = message;
error.hidden = !message;
return !message;
}
function resetCaptcha() {
if (!refresh) return;
var url = refresh.dataset.captchaUrl;
refresh.querySelector('img').src = url + (url.indexOf('?') === -1 ? '?' : '&') + 'r=' + Date.now();
form.elements.captcha.value = '';
}
async function request(url, options) {
var controller = new AbortController();
var timer = setTimeout(function () { controller.abort(); }, 20000);
try {
var response = await fetch(url, Object.assign({credentials: 'same-origin', cache: 'no-store', signal: controller.signal}, options));
if (!response.ok) throw new Error('http');
return await response.json();
} finally { clearTimeout(timer); }
}
topics.forEach(function (button) {
button.addEventListener('click', function () {
if (pending) return;
form.elements.title.value = button.dataset.topic;
topics.forEach(function (item) { item.setAttribute('aria-pressed', String(item === button)); });
validate(form.elements.title);
});
});
form.elements.title.addEventListener('input', function () {
topics.forEach(function (item) { item.setAttribute('aria-pressed', String(item.dataset.topic === form.elements.title.value)); });
});
fields.forEach(function (field) {
field.addEventListener('blur', function () { validate(field); });
field.addEventListener('input', function () { if (field.getAttribute('aria-invalid') === 'true') validate(field); });
});
if (refresh) refresh.addEventListener('click', function () { if (!pending) resetCaptcha(); });
form.addEventListener('submit', async function (event) {
event.preventDefault();
if (pending) return;
var invalid = fields.filter(function (field) { return !validate(field); });
if (invalid.length) {
showStatus('请检查标注的必填内容后再提交。', 'error');
invalid[0].focus();
return;
}
pending = true;
fields.forEach(function (field) { field.readOnly = true; });
submit.disabled = true;
form.setAttribute('aria-busy', 'true');
submit.textContent = '正在提交…';
showStatus('正在提交您的项目需求,请稍候。', 'pending');
var payload = new URLSearchParams();
fields.forEach(function (field) { payload.set(field.name, field.value.trim()); });
var submitted = false;
try {
// Token is single-use; obtain one for each attempt, including retries.
var token = await request(form.dataset.tokenUrl);
if (Number(token.code) !== 1 || !token.data) throw new Error('token');
form.elements.__token__.value = token.data;
payload.set('__token__', token.data);
submitted = true;
var result = await request(form.action, {method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest'}, body: payload.toString()});
if (Number(result.code) === 1) {
form.reset();
topics.forEach(function (item) { item.setAttribute('aria-pressed', 'false'); });
fields.forEach(function (field) { field.removeAttribute('aria-invalid'); document.getElementById(field.id + '-error').hidden = true; });
showStatus('您的需求已提交。我们将根据您留下的联系方式与您沟通,请保持电话畅通。', 'success');
} else {
var message = result.msg === '请先登录!' ? '页面校验已失效,请重试提交。' : String(result.msg || '暂未提交成功,请稍后重试或通过电话联系。');
showStatus(message, 'error');
}
resetCaptcha();
} catch (error) {
showStatus(submitted ? '暂时无法确认提交结果。为避免重复提交,请稍后通过电话或邮箱确认;您填写的内容已保留。' : '暂时无法连接提交服务,请稍后重试或通过电话、邮箱联系。您填写的内容已保留。', 'error');
} finally {
pending = false;
fields.forEach(function (field) { field.readOnly = false; });
submit.disabled = false;
submit.textContent = '提交项目需求 ↗';
form.setAttribute('aria-busy', 'false');
status.focus();
}
});
})();

查看文件

@@ -0,0 +1,22 @@
/* Keep the public navigation readable while content passes beneath it. */
(function () {
'use strict';
var root = document.documentElement;
var pending = false;
function update() {
root.classList.toggle('nhc-nav-scrolled', window.scrollY > 40);
pending = false;
}
function onScroll() {
if (!pending) {
pending = true;
window.requestAnimationFrame(update);
}
}
update();
window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('pageshow', update);
}());

查看文件

@@ -0,0 +1,62 @@
// Run on the local contact preview with agent-browser eval. All requests are mocked.
(async function () {
if (!location.hostname.match(/^(127\.0\.0\.1|localhost)$/)) throw new Error('Use local preview only');
var form = document.querySelector('.ct-form');
var submit = form.querySelector('.ct-submit');
var status = form.querySelector('.ct-submit-status');
var originalFetch = window.fetch;
var calls = [];
var mode = 'reject';
var results = [];
function assert(condition, name) { if (!condition) throw new Error(name); results.push(name); }
window.fetch = async function (url, options) {
calls.push({url: String(url), method: options.method || 'GET', body: options.body || ''});
if (!options.method) {
if (mode === 'token-fail') throw new Error('network');
return {ok: true, json: async function () { return {code: 1, data: 'test-single-use-token'}; }};
}
if (mode === 'network-fail') throw new Error('network');
await new Promise(function (resolve) { setTimeout(resolve, 10); });
return {ok: true, json: async function () { return mode === 'success' ? {code: 1} : {code: 0, msg: '验证码不正确'}; }};
};
function fill() {
form.elements.title.value = '本地界面测试';
form.elements.name.value = '测试';
form.elements.phone.value = '0851-12345678';
form.elements.content.value = '本地模拟数据,不会向线上发送。';
if (form.elements.captcha) form.elements.captcha.value = 'test';
}
function send() { form.dispatchEvent(new Event('submit', {bubbles: true, cancelable: true})); }
async function settled() {
for (var i = 0; i < 100; i++) {
if (form.getAttribute('aria-busy') !== 'true') return;
await new Promise(function (resolve) { setTimeout(resolve, 5); });
}
throw new Error('Form did not settle');
}
try {
form.reset(); send();
assert(calls.length === 0 && document.activeElement === form.elements.title, 'Empty form: focus first error, no request');
form.querySelector('[data-topic]').click();
assert(form.elements.title.value === form.querySelector('[data-topic]').dataset.topic, 'Topic button fills title');
fill(); form.elements.phone.value = '123'; send();
assert(calls.length === 0 && form.elements.phone.getAttribute('aria-invalid') === 'true', 'Invalid phone blocked');
fill(); send(); send();
assert(submit.disabled, 'Submitting state disables button');
await settled();
assert(calls.filter(function (c) { return c.method === 'POST'; }).length === 1, 'Duplicate submit sends one POST');
var body = new URLSearchParams(calls.find(function (c) { return c.method === 'POST'; }).body);
assert(body.get('__token__') === 'test-single-use-token' && body.get('phone') === '0851-12345678', 'Uses fresh token and expected backend fields');
assert(status.dataset.state === 'error' && form.elements.content.value.length > 0 && !submit.disabled, 'Server rejection preserves fields and permits retry');
if (form.elements.captcha) assert(form.elements.captcha.value === '', 'Rejected submission refreshes captcha');
calls = []; fill(); mode = 'success'; send(); await settled();
assert(status.dataset.state === 'success' && form.elements.name.value === '' && form.elements.content.value === '', 'Confirmed success clears fields and announces result');
assert(calls.length === 2 && calls[0].method === 'GET', 'Retry obtains a new token');
calls = []; fill(); mode = 'network-fail'; send(); await settled();
assert(status.dataset.state === 'error' && status.textContent.includes('无法确认提交结果') && form.elements.content.value.length > 0, 'Unknown POST outcome preserves data without automatic retry');
assert(calls.length === 2 && !submit.disabled, 'Network failure releases button');
calls = []; fill(); mode = 'token-fail'; send(); await settled();
assert(calls.length === 1 && status.dataset.state === 'error', 'Token fetch failure never sends POST');
return {passed: results.length, checks: results, network: 'Mocked locally; no real messages sent'};
} finally { window.fetch = originalFetch; }
})();

查看文件

@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
"""
中华人民共和国广告法文案合规自动化专项测试
(Ad Law Compliance Test Suite)
@@ -34,7 +33,7 @@ class TestAdLawCompliance(unittest.TestCase):
self.contents = {}
for key, path in self.target_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] = ""
@@ -56,9 +55,10 @@ class TestAdLawCompliance(unittest.TestCase):
# 严禁出现“国家级认定”、“国家级自主研发”等违法表述
self.assertNotIn('国家级自主研发', self.all_text, "不得使用'国家级自主研发'违规修饰")
self.assertNotIn('国家级科技创新认定', self.all_text, "不得使用'国家级科技创新认定'违规表述")
# 合规的表达应当为官方备案机构或高新技术企业全称
self.assertIn('全国高新技术企业认定管理机构备案认定', self.contents['single_pc'],
"资质表述须符合法定规范,应使用全国高新技术企业认定管理机构备案认定")
# 合规的表达应当使用法定全称,并以有效资料与证书为准
for page_name, content in (('PC 关于我们页', self.contents['single_pc']), ('移动端关于我们页', self.contents['single_m'])):
self.assertIn('计算机软件著作权', content, f"{page_name}资质表述应使用法定全称")
self.assertIn('以有效证书为准', content, f"{page_name}资质表述应以有效证书为准")
def test_no_absolute_guarantee_and_exaggeration(self):
"""广告法第四条/第二十八条:严禁绝对化与夸大免责承诺"""
@@ -73,7 +73,7 @@ class TestAdLawCompliance(unittest.TestCase):
clean_text = re.sub(r'[\'\"a-zA-Z0-9_\-:]*\s*:\s*100%', '', self.all_text)
clean_text = re.sub(r'width\s*=\s*[\'\"]100%[\'\"]', '', clean_text)
clean_text = re.sub(r'height\s*=\s*[\'\"]100%[\'\"]', '', clean_text)
self.assertNotIn('准确率: <strong>100%</strong>', clean_text, "分账准确率不得夸大承诺100%")
self.assertNotIn('自动对账率: <strong>100%</strong>', clean_text, "对账率不得夸大承诺100%")
self.assertNotIn('100% 完整源码', clean_text, "应表述为完整工程源码交付,避免100%绝对词")
@@ -133,7 +133,7 @@ class TestAdLawCompliance(unittest.TestCase):
"""排查 public/assets/addons/official/images/showcases/ 目录下所有原型 SVG 是否包含虚假宣传数据"""
svg_dir = os.path.join(ROOT_DIR, 'public/assets/addons/official/images/showcases')
self.assertTrue(os.path.exists(svg_dir), f"SVG 展示目录不存在: {svg_dir}")
# 针对每个 SVG 定义违规关键词
svg_forbidden_rules = {
'case_distrib.svg': [
@@ -168,7 +168,7 @@ class TestAdLawCompliance(unittest.TestCase):
for filename, forbidden_list in svg_forbidden_rules.items():
svg_path = os.path.join(svg_dir, filename)
if os.path.exists(svg_path):
with open(svg_path, 'r', encoding='utf-8') as f:
with open(svg_path, encoding='utf-8') as f:
content = f.read()
for forbidden in forbidden_list:
self.assertNotIn(forbidden, content, f"SVG 文件 {filename} 中严禁包含虚假宣传或夸大编造数据: '{forbidden}'")

查看文件

@@ -41,18 +41,13 @@ class TestClientRigorEnhancements(unittest.TestCase):
"案例独立页必须包含明确的验收与生产运行记录")
def test_authoritative_certifications_and_copyright_numbers(self):
"""关于我们资质板块必须展示规整的资质体系与等保合规"""
# ISO 与 等保
self.assertIn('ISO9001', self.about_html, "PC 关于我们必须包含 ISO9001 质量认证")
self.assertIn('ISO27001', self.about_html, "PC 关于我们必须包含 ISO27001 安全认证")
self.assertTrue('等保' in self.about_html, "PC 关于我们必须包含等保合规设计")
# 软著与知识产权
self.assertTrue('计算机软件著作权' in self.about_html and '自主可控' in self.about_html,
"PC 关于我们必须展示自主可控的计算机软件著作权与知识产权")
# 移动端同步
self.assertIn('ISO', self.about_mobile, "移动端关于我们必须同步展示权威资质")
self.assertTrue('等保' in self.about_mobile, "移动端关于我们必须同步展示等保合规")
"""资质和软件权属应说明核验依据,不以示意徽章冒充认证。"""
for content in (self.about_html, self.about_mobile):
for label in ('企业主体', '计算机软件著作权', '第三方组件', '合同', 'ISO9001', 'ISO27001', '等保'):
self.assertIn(label, content)
self.assertIn('具体认证情况以有效证书为准', content)
self.assertNotIn('cert_hi_tech.svg', content)
self.assertNotIn('cert_iso9001.svg', content)
def test_demo_sandbox_rigorous_commitment(self):
"""产品页演示沙箱必须具备极速建联与真实脱敏环境承诺"""

查看文件

@@ -5,6 +5,7 @@
2. 验证新版服务页摄影配图真实存在、尺寸满足首屏展示要求,并提供 WebP 兼容版本;
3. 验证联系我们页矢量配图符合浅色专业风规范。
"""
import os
import unittest
@@ -12,54 +13,86 @@ 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')
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),
"software": ("software/structure-v2.jpg", 1440, 960),
"app": ("app/terminals.jpg", 1440, 960),
"agent": ("agent/landscape-v2.jpg", 1920, 640),
"contact": ("contact/connection.jpg", 1440, 960),
}
class TestDedicatedPageIllustrations(unittest.TestCase):
def test_illustration_assets_exist(self):
"""测试专属配图文件存在、格式有效且尺寸满足展示要求"""
for key, (relative_path, minimum_width, minimum_height) in SERVICE_HEROES.items():
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}")
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} 文件过小")
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_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')
self.assertIn(
"<svg", contact_content, "contact_headquarters.svg 必须是有效矢量 SVG"
)
def test_pages_embed_dedicated_illustrations(self):
"""测试各独立页面均正确嵌入对应的精美配图"""
pages = {
'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'),
"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",
"images/contact/connection.jpg",
),
"contact_m": (
"official_online_message/list_e.html",
"images/contact/connection.jpg",
),
}
template_dir = os.path.join(ROOT_DIR, 'addons', 'official', 'view', 'web')
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:
with open(template_path, encoding="utf-8") as stream:
html = stream.read()
self.assertIn(image_name, html, f"页面 {template_relative_path} 必须正确引用专属配图 {image_name}")
self.assertIn(
image_name,
html,
f"页面 {template_relative_path} 必须正确引用专属配图 {image_name}",
)
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main()

查看文件

@@ -3,6 +3,7 @@
新闻资讯与技术文章改版及丰富度测试 (TDD 模式)
验证文章独立页、移动端模板、首页联动、数据库种子文件及去AI味道规范
"""
import os
import re
import unittest
@@ -16,26 +17,86 @@ def _read_text(path):
class TestJournalismAndArticles(unittest.TestCase):
def setUp(self):
self.pc_list_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_journalism', 'list.html')
self.pc_details_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_journalism', 'details.html')
self.mobile_list_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_journalism', 'list_e.html')
self.mobile_details_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_journalism', 'details_e.html')
self.home_index_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'index.html')
self.footer_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_common', 'pc', 'footer.html')
self.css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css')
self.seed_sql_path = os.path.join(BASE_DIR, 'database', 'seeds', 'journalism_articles.sql')
self.pc_list_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_journalism",
"list.html",
)
self.pc_details_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_journalism",
"details.html",
)
self.mobile_list_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_journalism",
"list_e.html",
)
self.mobile_details_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_journalism",
"details_e.html",
)
self.home_index_path = os.path.join(
BASE_DIR, "addons", "official", "view", "web", "official_home", "index.html"
)
self.footer_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_common",
"pc",
"footer.html",
)
self.css_path = os.path.join(
BASE_DIR, "public", "assets", "addons", "official", "css", "modern_nhc.css"
)
self.seed_sql_path = os.path.join(
BASE_DIR, "database", "seeds", "journalism_articles.sql"
)
def test_pc_list_template_spec(self):
"""验证 PC 端文章资讯列表页规范(标题、简介、缩略图专业排版)"""
self.assertTrue(os.path.exists(self.pc_list_path), "PC 文章列表模板 list.html 必须存在")
self.assertTrue(
os.path.exists(self.pc_list_path), "PC 文章列表模板 list.html 必须存在"
)
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")
self.assertIn("nhc-article-hero", content, "必须包含现代中式 Hero Banner 容器类")
self.assertIn("nhc-news-list", content, "必须包含新闻资讯列表容器 nhc-news-list")
self.assertIsNone(
re.search(r"纳川(?!海)", content), "严禁将品牌错误简写为【纳川】"
)
self.assertFalse(
re.search(
r"[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]",
content,
),
"严禁包含任何 emoji",
)
self.assertIn(
"nhc-article-hero", content, "必须包含现代中式 Hero Banner 容器类"
)
self.assertIn(
"nhc-news-list", content, "必须包含新闻资讯列表容器 nhc-news-list"
)
self.assertIn("nhc-news-row", content, "必须包含图文行卡片 nhc-news-row")
self.assertIn("nhc-news-thumb", content, "必须包含缩略图容器 nhc-news-thumb")
self.assertIn("nhc-news-title", content, "必须包含文章标题 nhc-news-title")
@@ -44,28 +105,62 @@ class TestJournalismAndArticles(unittest.TestCase):
def test_pc_details_template_spec(self):
"""验证 PC 端文章资讯详情页规范"""
self.assertTrue(os.path.exists(self.pc_details_path), "PC 文章详情模板 details.html 必须存在")
self.assertTrue(
os.path.exists(self.pc_details_path),
"PC 文章详情模板 details.html 必须存在",
)
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")
self.assertIsNone(
re.search(r"纳川(?!海)", content), "严禁将品牌错误简写为【纳川】"
)
self.assertFalse(
re.search(
r"[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]",
content,
),
"严禁包含任何 emoji",
)
self.assertIn("nhc-article-body", content, "必须包含规范的文章正文排版容器")
self.assertIn("nhc-breadcrumb", content, "必须包含严谨的面包屑导航")
self.assertIn("info_previous_next_wrap", content, "必须包含上一篇/下一篇自然导流结构")
self.assertIn(
"info_previous_next_wrap", content, "必须包含上一篇/下一篇自然导流结构"
)
def test_mobile_templates_spec_and_bugfix(self):
"""验证移动端模板规范(标题、简介、缩略图专业排版)"""
self.assertTrue(os.path.exists(self.mobile_list_path), "移动端列表模板 list_e.html 必须存在")
self.assertTrue(os.path.exists(self.mobile_details_path), "移动端详情模板 details_e.html 必须存在")
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 = _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, "移动端列表必须包含简介结构")
self.assertNotIn("official_video/list", details_content, "详情页严禁遗留旧 official_video/list 错误路径")
self.assertFalse(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]', list_content), "移动端列表严禁 emoji")
self.assertFalse(re.search(r'[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]', details_content), "移动端详情严禁 emoji")
self.assertNotIn(
"official_video/list",
details_content,
"详情页严禁遗留旧 official_video/list 错误路径",
)
self.assertFalse(
re.search(
r"[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]",
list_content,
),
"移动端列表严禁 emoji",
)
self.assertFalse(
re.search(
r"[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\u2600-\u26FF\u2700-\u27BF]",
details_content,
),
"移动端详情严禁 emoji",
)
def test_css_design_tokens_for_articles(self):
"""验证 CSS 中已包含文章与资讯专属图文排版样式定义"""
@@ -78,26 +173,47 @@ class TestJournalismAndArticles(unittest.TestCase):
def test_seed_sql_rich_articles(self):
"""验证数据库种子包含不少于 38 篇扎实深度专业文章"""
self.assertTrue(os.path.exists(self.seed_sql_path), "数据库种子文件 journalism_articles.sql 必须存在")
self.assertTrue(
os.path.exists(self.seed_sql_path),
"数据库种子文件 journalism_articles.sql 必须存在",
)
sql = _read_text(self.seed_sql_path)
# 验证至少 38 篇优质文章插入 (初始 8 篇 + 新增 30 篇)
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})")
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 智能体/大模型与知识库落地文章")
self.assertTrue("代码" in sql or "软件质量" in sql, "必须覆盖代码规范与交付文章")
self.assertTrue(
"代码" in sql or "软件质量" in sql, "必须覆盖代码规范与交付文章"
)
self.assertIn("缓存", sql, "必须覆盖分布式缓存相关深度文章")
self.assertIn("分库分表", sql, "必须覆盖数据库分库分表相关文章")
self.assertIn("先进先出", sql, "必须覆盖批次库存先进先出算法相关文章")
# 严禁假大空与 AI 味营销词汇
for bad_word in ["赋能千行百业", "颠覆式创新", "颠覆传统", "未来已来", "数字化新纪元", "技术委员会", "研发委员会", "原创技术资产", "工程受控说明"]:
for bad_word in [
"赋能千行百业",
"颠覆式创新",
"颠覆传统",
"未来已来",
"数字化新纪元",
"技术委员会",
"研发委员会",
"原创技术资产",
"工程受控说明",
]:
self.assertNotIn(bad_word, sql, f"文章种子严禁包含 AI 味空话:{bad_word}")
def test_home_and_footer_linkage(self):
@@ -118,8 +234,13 @@ class TestJournalismAndArticles(unittest.TestCase):
self.assertTrue(has_news_section, "首页必须包含技术洞察与研发动态板块")
# 页脚必须有技术资讯入口
has_insights_link = "official_journalism" in footer or "技术洞察" in footer or "新闻资讯" in footer
has_insights_link = (
"official_journalism" in footer
or "技术洞察" in footer
or "新闻资讯" in footer
)
self.assertTrue(has_insights_link, "页脚必须包含技术洞察/新闻资讯链接")
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main()

查看文件

@@ -143,9 +143,14 @@ class TestNaturalCopywriting(unittest.TestCase):
)
# 关于我们与联系我们
self.assertIn(
"找懂业务、讲规范的研发团队,让软件项目平稳落地",
self.about_html,
self.assertTrue(
any(
text in self.about_html
for text in (
"找懂业务、讲规范的研发团队,让软件项目平稳落地",
"沟通您的软件建设需求",
)
),
"关于我们CTA必须务实接地气",
)
self.assertIn(
@@ -286,7 +291,9 @@ class TestNaturalCopywriting(unittest.TestCase):
self.assertIn("动态安全库存模型与自动补货采购建议", self.products_html)
self.assertIn("企业知识问答", service_agent_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)

查看文件

@@ -5,101 +5,143 @@
2. 确保面向客户与访客,使用大白话、实在话(如防重复扣款、源码交付、内网部署数据不泄露、标注文档原文);
3. 确保各个独立页面文案短小精悍、不啰嗦、讲人话。
"""
import os
import unittest
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class TestPlainAndConciseCopywriting(unittest.TestCase):
class TestPlainAndConciseCopywriting(unittest.TestCase):
def setUp(self):
self.files = {
'index': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/index.html'),
'index_e': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/index_e.html'),
'service_page': os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/service_page.html'),
'service_software': os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/service_software.html'),
'service_app': os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/service_app.html'),
'service_agent': os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/service_agent.html'),
'product_page': os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/product_page.html'),
'cases_page': os.path.join(ROOT_DIR, 'addons/official/view/web/official_case_show/list.html'),
'cases_e': os.path.join(ROOT_DIR, 'addons/official/view/web/official_case_show/list_e.html'),
'about_page': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/single.html'),
'about_e': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/single_e.html'),
'contact_page': os.path.join(ROOT_DIR, 'addons/official/view/web/official_online_message/list.html'),
'contact_e': os.path.join(ROOT_DIR, 'addons/official/view/web/official_online_message/list_e.html'),
'nav_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_common/pc/nav.html'),
'footer_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_common/pc/footer.html'),
"index": os.path.join(
ROOT_DIR, "addons/official/view/web/official_home/index.html"
),
"index_e": os.path.join(
ROOT_DIR, "addons/official/view/web/official_home/index_e.html"
),
"service_page": os.path.join(
ROOT_DIR, "addons/official/view/web/official_product/service_page.html"
),
"service_software": os.path.join(
ROOT_DIR,
"addons/official/view/web/official_product/service_software.html",
),
"service_app": os.path.join(
ROOT_DIR, "addons/official/view/web/official_product/service_app.html"
),
"service_agent": os.path.join(
ROOT_DIR, "addons/official/view/web/official_product/service_agent.html"
),
"product_page": os.path.join(
ROOT_DIR, "addons/official/view/web/official_product/product_page.html"
),
"cases_page": os.path.join(
ROOT_DIR, "addons/official/view/web/official_case_show/list.html"
),
"cases_e": os.path.join(
ROOT_DIR, "addons/official/view/web/official_case_show/list_e.html"
),
"about_page": os.path.join(
ROOT_DIR, "addons/official/view/web/official_home/single.html"
),
"about_e": os.path.join(
ROOT_DIR, "addons/official/view/web/official_home/single_e.html"
),
"contact_page": os.path.join(
ROOT_DIR, "addons/official/view/web/official_online_message/list.html"
),
"contact_e": os.path.join(
ROOT_DIR, "addons/official/view/web/official_online_message/list_e.html"
),
"nav_pc": os.path.join(
ROOT_DIR, "addons/official/view/web/official_common/pc/nav.html"
),
"footer_pc": os.path.join(
ROOT_DIR, "addons/official/view/web/official_common/pc/footer.html"
),
}
self.contents = {}
for key, path in self.files.items():
if os.path.exists(path):
with open(path, encoding='utf-8') as f:
with open(path, encoding="utf-8") as f:
self.contents[key] = f.read()
else:
self.contents[key] = ''
self.contents[key] = ""
self.all_text = "\n".join(self.contents.values())
def test_forbid_ai_jargon_and_cliches(self):
"""严格杜绝 AI/互联网黑话与套话口癖"""
forbidden_jargon = [
'闭环', # 典型大厂/AI黑话(如“业务闭环”、“闭环协同”、“交付闭环”)
'工匠精神打磨', # 空洞煽情修饰
'准备开启您的', # 典型 AI 祈使反问句
'矩阵赋能', # AI 常用生造词
'双向幂等校验', # 过于晦涩的技术术语,应通俗化为防重复扣款/防重复提交
'多路向量重排召回',# 技术晦涩,应通俗化说明知识库检索精准
'多路向量召回', # 算法黑话
'无感幂等同步', # 技术行话,应通俗化为自动同步防重复
'数字化落地样本', # 典型公关大词,客户需要的是业务系统而非“样本”
'确定性数字化样本',
'知识管线', # 算法黑话,应通俗化为企业知识库
'语料处理管线', # 算法行话,应通俗化为知识库处理脚本
'操作链路', # UX大厂黑话,应通俗化为操作步骤
'脱敏数据沙箱', # 过于晦涩,应通俗化为演示环境
'厘清业务痛点', # 居高临下大厂套话,应为调研实际业务流程
'全链路打通', # 大厂黑话,应为全面打通或全面贯通
'全链路压测', # 应为高并发压力测试
"闭环", # 典型大厂/AI黑话(如“业务闭环”、“闭环协同”、“交付闭环”)
"工匠精神打磨", # 空洞煽情修饰
"准备开启您的", # 典型 AI 祈使反问句
"矩阵赋能", # AI 常用生造词
"双向幂等校验", # 过于晦涩的技术术语,应通俗化为防重复扣款/防重复提交
"多路向量重排召回", # 技术晦涩,应通俗化说明知识库检索精准
"多路向量召回", # 算法黑话
"无感幂等同步", # 技术行话,应通俗化为自动同步防重复
"数字化落地样本", # 典型公关大词,客户需要的是业务系统而非“样本”
"确定性数字化样本",
"知识管线", # 算法黑话,应通俗化为企业知识库
"语料处理管线", # 算法行话,应通俗化为知识库处理脚本
"操作链路", # UX大厂黑话,应通俗化为操作步骤
"脱敏数据沙箱", # 过于晦涩,应通俗化为演示环境
"厘清业务痛点", # 居高临下大厂套话,应为调研实际业务流程
"全链路打通", # 大厂黑话,应为全面打通或全面贯通
"全链路压测", # 应为高并发压力测试
]
for jargon in forbidden_jargon:
self.assertNotIn(jargon, self.all_text, f"全站文案仍包含黑话或AI套话: '{jargon}'")
self.assertNotIn(
jargon, self.all_text, f"全站文案仍包含黑话或AI套话: '{jargon}'"
)
def test_customer_friendly_plain_language(self):
"""面向客户与访客的大白话表达:突出价值与保障"""
# 首页:通俗的防重复扣款与数据安全
self.assertIn('防重复扣款', self.contents['index'], "首页产品指标应使用客户一目了然的'防重复扣款'")
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 ('引用来源', '引用溯源', '引用展示')),
"智能体页必须讲清楚回答带有引用来源"
any(
label in self.contents["service_agent"]
for label in ("引用来源", "引用溯源", "引用展示")
),
"智能体页必须讲清楚回答带有引用来源",
)
# 案例页:拒绝“样本”,使用“数字化系统”;使用“自动同步防重复”
self.assertIn('数字化系统', self.contents['cases_page'])
self.assertIn('自动同步防重复', self.contents['cases_page'])
self.assertNotIn('多路向量召回', self.contents['cases_page'])
self.assertIn("数字化系统", self.contents["cases_page"])
self.assertIn("自动同步防重复", self.contents["cases_page"])
self.assertNotIn("多路向量召回", self.contents["cases_page"])
# 联系我们表单:使用通俗的“业务需求”而非大厂“痛点”
self.assertNotIn('系统痛点', self.contents['contact_page'])
self.assertIn('业务需求', self.contents['contact_page'])
self.assertNotIn("系统痛点", self.contents["contact_page"])
self.assertIn("业务需求", self.contents["contact_page"])
# 软件开发页:面向客户的直白 CTA
self.assertNotIn('准备开启您的企业级定制软件工程?', self.contents['service_software'])
self.assertNotIn(
"准备开启您的企业级定制软件工程?", self.contents["service_software"]
)
# APP与小程序页:通俗表述
self.assertNotIn('私域闭环', self.contents['service_app'])
self.assertNotIn("私域闭环", self.contents["service_app"])
# 产品页:开箱即用与源码买断清晰明了
self.assertIn('成熟商业系统', self.contents['product_page'])
self.assertIn("成熟商业系统", self.contents["product_page"])
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main()

查看文件

@@ -9,134 +9,251 @@
5. CSS 针对配图有严格的响应式(max-width: 100%、圆角、细线边框、悬停微光)控制
6. 无破损路径或 404 资源引用
"""
import os
import unittest
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class SiteImagesTest(unittest.TestCase):
def setUp(self):
self.img_dir = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'images', 'showcases')
self.pc_home_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'index.html')
self.mobile_home_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'index_e.html')
self.service_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'service_page.html')
self.product_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'product_page.html')
self.case_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_case_show', 'list.html')
self.case_mobile_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_case_show', 'list_e.html')
self.about_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'single.html')
self.about_mobile_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'single_e.html')
self.css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css')
self.img_dir = os.path.join(
BASE_DIR, "public", "assets", "addons", "official", "images", "showcases"
)
self.pc_home_path = os.path.join(
BASE_DIR, "addons", "official", "view", "web", "official_home", "index.html"
)
self.mobile_home_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_home",
"index_e.html",
)
self.service_page_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_product",
"service_page.html",
)
self.product_page_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_product",
"product_page.html",
)
self.case_page_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_case_show",
"list.html",
)
self.case_mobile_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_case_show",
"list_e.html",
)
self.about_page_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_home",
"single.html",
)
self.about_mobile_path = os.path.join(
BASE_DIR,
"addons",
"official",
"view",
"web",
"official_home",
"single_e.html",
)
self.css_path = os.path.join(
BASE_DIR, "public", "assets", "addons", "official", "css", "modern_nhc.css"
)
def test_01_image_assets_exist_and_non_empty(self):
"""核心配图资源必须物理存在且内容非空"""
required_images = [
# 服务类配图
'service_middle.svg',
'service_app.svg',
'service_agent.svg',
"service_middle.svg",
"service_app.svg",
"service_agent.svg",
# 产品类配图
'product_mall.svg',
'product_pos.svg',
'product_erp.svg',
'product_saas.svg',
"product_mall.svg",
"product_pos.svg",
"product_erp.svg",
"product_saas.svg",
# 案例类配图
'case_distrib.svg',
'case_catering.svg',
'case_gov_agent.svg',
'case_manufacture.svg',
"case_distrib.svg",
"case_catering.svg",
"case_gov_agent.svg",
"case_manufacture.svg",
# 专家与资质徽标
'team_architect.svg',
'team_fullstack.svg',
'team_ai.svg',
'team_security.svg',
'cert_hi_tech.svg',
'cert_iso9001.svg'
"team_architect.svg",
"team_fullstack.svg",
"team_ai.svg",
"team_security.svg",
"cert_hi_tech.svg",
"cert_iso9001.svg",
]
self.assertTrue(os.path.isdir(self.img_dir), f"图片目录 {self.img_dir} 必须存在")
self.assertTrue(
os.path.isdir(self.img_dir), f"图片目录 {self.img_dir} 必须存在"
)
for img_name in required_images:
img_path = os.path.join(self.img_dir, img_name)
self.assertTrue(os.path.isfile(img_path), f"图片文件 {img_name} 必须存在于 showcases 目录下")
self.assertTrue(
os.path.isfile(img_path),
f"图片文件 {img_name} 必须存在于 showcases 目录下",
)
size = os.path.getsize(img_path)
self.assertGreater(size, 100, f"图片文件 {img_name} 大小不能过小")
def test_02_pc_and_mobile_homepage_service_images(self):
"""首页服务入口必须包含三个一致的服务视觉卡片"""
with open(self.pc_home_path, 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, 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.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}")
for content, page_name in [
(pc_content, "PC 首页"),
(mobile_content, "移动端首页"),
]:
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, 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, 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('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}")
for content, page_name in [
(pc_content, "PC 首页"),
(mobile_content, "移动端首页"),
]:
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, 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, 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, "移动端案例独立页")]:
self.assertIn('case_distrib.svg', content, f"{page_name} 应包含分销订货中台界面图")
self.assertIn('case_catering.svg', content, f"{page_name} 应包含连锁餐饮收银界面图")
self.assertIn('case_gov_agent.svg', content, f"{page_name} 应包含政务智能体界面图")
self.assertIn('case_manufacture.svg', content, f"{page_name} 应包含工业制造进销存界面图")
for content, page_name in [
(case_pc, "PC 案例独立页"),
(case_mobile, "移动端案例独立页"),
]:
self.assertIn(
"case_distrib.svg", content, f"{page_name} 应包含分销订货中台界面图"
)
self.assertIn(
"case_catering.svg", content, f"{page_name} 应包含连锁餐饮收银界面图"
)
self.assertIn(
"case_gov_agent.svg", content, f"{page_name} 应包含政务智能体界面图"
)
self.assertIn(
"case_manufacture.svg",
content,
f"{page_name} 应包含工业制造进销存界面图",
)
def test_05_service_and_product_pages_have_showcases(self):
"""独立服务页与产品页必须嵌入高质量系统拓扑与界面大图"""
with open(self.service_page_path, 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, 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)
self.assertIn('service_app.svg', service_content)
self.assertIn('service_agent.svg', service_content)
self.assertIn("service_middle.svg", service_content)
self.assertIn("service_app.svg", service_content)
self.assertIn("service_agent.svg", service_content)
self.assertIn('product_mall.svg', product_content)
self.assertIn('product_pos.svg', product_content)
self.assertIn('product_erp.svg', product_content)
self.assertIn('product_saas.svg', product_content)
self.assertIn("product_mall.svg", product_content)
self.assertIn("product_pos.svg", product_content)
self.assertIn("product_erp.svg", product_content)
self.assertIn("product_saas.svg", product_content)
def test_06_about_pages_have_expert_and_cert_badges(self):
"""关于我们页必须包含专家团队专业徽标与资质认证图"""
with open(self.about_page_path, encoding='utf-8') as f:
def test_06_about_pages_have_abstract_brand_images(self):
"""关于我们使用已标注的品牌抽象配图,保留格式回退。"""
with open(self.about_page_path, encoding="utf-8") as f:
about_pc = f.read()
with open(self.about_mobile_path, 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, "移动端关于我们页")]:
self.assertIn('team_architect.svg', content, f"{page_name} 应包含首席架构师徽章")
self.assertIn('team_fullstack.svg', content, f"{page_name} 应包含全栈研发总监徽章")
self.assertIn('team_ai.svg', content, f"{page_name} 应包含AI智能体专家徽章")
self.assertIn('team_security.svg', content, f"{page_name} 应包含质量安全合规专家徽章")
self.assertIn('cert_hi_tech.svg', content, f"{page_name} 应包含高新技术企业认证图")
self.assertIn('cert_iso9001.svg', content, f"{page_name} 应包含ISO9001认证图")
for content, page_name in [
(about_pc, "PC 关于我们页"),
(about_mobile, "移动端关于我们页"),
]:
for name in ("landscape", "collaboration"):
for extension in ("webp", "jpg"):
relative_path = f"images/about/{name}.{extension}"
self.assertIn(
relative_path, content, f"{page_name} 应包含抽象配图及格式回退"
)
self.assertTrue(
os.path.isfile(
os.path.join(
BASE_DIR,
"public",
"assets",
"addons",
"official",
relative_path,
)
)
)
self.assertIn("抽象建筑示意", content)
self.assertNotIn("cert_hi_tech.svg", content)
self.assertNotIn("cert_iso9001.svg", content)
def test_07_responsive_image_styles_in_css(self):
"""CSS 必须具备严谨的配图自适应与质感样式定义"""
with open(self.css_path, 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 图片容器类")
self.assertIn('object-fit', css, "CSS 应规范图片的适应展示模式")
self.assertIn('.nhc-case-img-wrap', css, "CSS 应定义案例图视窗包装器")
self.assertIn('.nhc-service-media-box', css, "CSS 应定义服务媒体容器")
self.assertIn(".nhc-card-thumb", css, "CSS 应定义 .nhc-card-thumb 图片容器类")
self.assertIn("object-fit", css, "CSS 应规范图片的适应展示模式")
self.assertIn(".nhc-case-img-wrap", css, "CSS 应定义案例图视窗包装器")
self.assertIn(".nhc-service-media-box", css, "CSS 应定义服务媒体容器")
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main()

查看文件

@@ -1,7 +1,8 @@
"""
测试首页高端主视觉系统 (Test Premium Home Hero Visual)
验证宽幅首屏摄影的高清画质、响应式图片源、桌面与移动端一致引用、
无文字遮挡的渐变处理、响应式断点与减少动态效果适配。
验证宽幅首屏摄影的高清画质、桌面与移动端响应式图片源、
两端模板一致引用、优先加载与有效替代文本、
渐变处理、响应式断点与减少动态效果适配。
"""
import os
@@ -10,25 +11,39 @@ import unittest
from PIL import Image
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
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")
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_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, "首屏摄影文件过小")
"""1. 验证桌面与移动端首屏摄影物理存在、分辨率高、画质饱满"""
hero_images = {
"ai-computing-v4.jpg": (1983, 793),
"ai-computing-mobile-v4.jpg": (1024, 1536),
}
for filename, (minimum_width, minimum_height) in hero_images.items():
with self.subTest(hero=filename):
hero_path = os.path.join(HERO_IMAGE_DIR, filename)
self.assertTrue(os.path.exists(hero_path), f"首屏宽幅摄影不存在: {filename}")
self.assertGreater(os.path.getsize(hero_path), 100 * 1024, f"首屏摄影文件过小: {filename}")
with Image.open(hero_path) as hero:
width, height = hero.size
self.assertGreaterEqual(width, 1800, "首屏摄影宽度不足宽幅要求")
self.assertGreaterEqual(height, 700, "首屏摄影高度不足首屏要求")
with Image.open(hero_path) as hero:
width, height = hero.size
self.assertGreaterEqual(width, minimum_width, f"首屏摄影宽度不足要求: {filename}")
self.assertGreaterEqual(height, minimum_height, f"首屏摄影高度不足要求: {filename}")
def test_02_css_uses_responsive_hero_and_accessible_motion(self):
"""2. 验证专属 CSS 提供首屏布局、响应式断点与减少动态效果适配"""
@@ -42,15 +57,24 @@ class PremiumHeroBannerTest(unittest.TestCase):
self.assertIn("prefers-reduced-motion", css_content, "CSS 应支持减少动态效果")
def test_03_pc_and_mobile_template_integrity(self):
"""3. 验证 PC 与移动端模板引用同一套响应式首屏图片"""
"""3. 验证 PC 与移动端模板引用桌面与移动端两套响应式首屏图片"""
for page_path in [PC_HOME_PATH, M_HOME_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}")
for filename in (
"ai-computing-v4.webp",
"ai-computing-v4.jpg",
"ai-computing-mobile-v4.webp",
"ai-computing-mobile-v4.jpg",
):
self.assertIn(filename, html, f"页面缺少首屏图片资源 {filename}:{page_path}")
self.assertIn('fetchpriority="high"', html, f"首屏图片应优先加载:{page_path}")
self.assertRegex(html, r'<img[^>]+alt="[^"]{4,}"', f"首屏图片应包含有效替代文本:{page_path}")
self.assertRegex(
html,
r'<img[^>]+alt="[^"]{4,}"',
f"首屏图片应包含有效替代文本:{page_path}",
)
if __name__ == "__main__":