diff --git a/addons/official/view/web/official_home/index.html b/addons/official/view/web/official_home/index.html index 1f3222f..0d1a36d 100644 --- a/addons/official/view/web/official_home/index.html +++ b/addons/official/view/web/official_home/index.html @@ -13,13 +13,13 @@
立足贵阳 · 服务全国探索我们的服务 NAHAICHUAN TECHNOLOGY
以业务为起点先了解流程,再确定方案
以交付为依据阶段成果确认,过程有据可查
以使用为目标兼顾上线运行与后续维护
-

01 / 专业服务

系统开发与长期维护

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

全部服务
01

软件开发

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

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

APP与小程序定制

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

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

智能体开发

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

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

01 / 专业服务

系统开发与长期维护

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

全部服务
01

软件开发

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

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

APP与小程序定制

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

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

智能体开发

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

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

02 / 产品中心

标准化业务系统

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

产品详情
产品选型

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

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

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

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

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

商城

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

查看详情
门店经营

收银

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

申请演示
采购与库存

进销存

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

查看详情
订阅使用

SaaS版本

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

咨询开通
+
线上交易

商城

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

查看详情
门店经营

收银

收款、退款、防重复扣款与门店对账,衔接一线操作和总部管理。

申请演示
采购与库存

进销存

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

查看详情
订阅使用

SaaS版本

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

咨询开通

03 / 项目案例

项目实践与行业应用

项目案例:业务挑战与技术方案。
了解不同场景下的系统建设思路。

浏览案例

04 / 实施交付

每一步,都有明确的交付

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

    -
  1. 01

    需求与方案

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

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

    设计与开发

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

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

    测试与验收

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

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

    上线与维护

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

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

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

咨询交付安排
+
  • 01

    需求与方案

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

    需求说明 / 实施方案
  • 02

    设计与开发

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

    交互原型 / 阶段版本
  • 03

    测试与验收

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

    测试记录 / 验收清单
  • 04

    上线与维护

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

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

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

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

    05 / 关于纳海川

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

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

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

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

    合作记录

    客户反馈

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

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

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

    06 / 研发记录

    技术与实践

    更多动态
    {if !empty($information['data'])}{foreach name="information.data" id="art" key="idx" offset="0" length="3"} {php}$cover_fallbacks = ['/assets/addons/official/images/articles/article_cache.svg','/assets/addons/official/images/articles/article_mysql_page.svg','/assets/addons/official/images/articles/article_xxl_job.svg']; $img_val = !empty($art['image']) ? $art['image'] : ''; $cover_src = (empty($img_val) || strpos($img_val,'article_microservice.svg') !== false) ? (isset($cover_fallbacks[$idx]) ? $cover_fallbacks[$idx] : '/assets/addons/official/images/articles/article_microservice.svg') : $img_val;{/php} diff --git a/addons/official/view/web/official_home/index_e.html b/addons/official/view/web/official_home/index_e.html index 01e5b65..d925c42 100644 --- a/addons/official/view/web/official_home/index_e.html +++ b/addons/official/view/web/official_home/index_e.html @@ -14,13 +14,13 @@
    立足贵阳 · 服务全国探索我们的服务 NAHAICHUAN TECHNOLOGY
    以业务为起点先了解流程,再确定方案
    以交付为依据阶段成果确认,过程有据可查
    以使用为目标兼顾上线运行与后续维护
    -

    01 / 专业服务

    系统开发与长期维护

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

    全部服务
    01

    软件开发

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

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

    APP与小程序定制

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

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

    智能体开发

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

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

    01 / 专业服务

    系统开发与长期维护

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

    全部服务
    01

    软件开发

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

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

    APP与小程序定制

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

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

    智能体开发

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

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

    02 / 产品中心

    标准化业务系统

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

    产品详情
    产品选型

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

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

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

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

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

    商城

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

    查看详情
    门店经营

    收银

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

    申请演示
    采购与库存

    进销存

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

    查看详情
    订阅使用

    SaaS版本

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

    咨询开通
    +
    线上交易

    商城

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

    查看详情
    门店经营

    收银

    收款、退款、防重复扣款与门店对账,衔接一线操作和总部管理。

    申请演示
    采购与库存

    进销存

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

    查看详情
    订阅使用

    SaaS版本

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

    咨询开通

    03 / 项目案例

    项目实践与行业应用

    项目案例:业务挑战与技术方案。
    了解不同场景下的系统建设思路。

    浏览案例

    04 / 实施交付

    每一步,都有明确的交付

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

      -
    1. 01

      需求与方案

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

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

      设计与开发

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

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

      测试与验收

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

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

      上线与维护

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

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

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

    咨询交付安排
    +
  • 01

    需求与方案

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

    需求说明 / 实施方案
  • 02

    设计与开发

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

    交互原型 / 阶段版本
  • 03

    测试与验收

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

    测试记录 / 验收清单
  • 04

    上线与维护

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

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

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

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

    05 / 关于纳海川

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

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

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

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

    合作记录

    客户反馈

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

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

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

    06 / 研发记录

    技术与实践

    更多动态
    {if !empty($information['data'])}{foreach name="information.data" id="art" key="idx" offset="0" length="3"} {php}$cover_fallbacks = ['/assets/addons/official/images/articles/article_cache.svg','/assets/addons/official/images/articles/article_mysql_page.svg','/assets/addons/official/images/articles/article_xxl_job.svg']; $img_val = !empty($art['image']) ? $art['image'] : ''; $cover_src = (empty($img_val) || strpos($img_val,'article_microservice.svg') !== false) ? (isset($cover_fallbacks[$idx]) ? $cover_fallbacks[$idx] : '/assets/addons/official/images/articles/article_microservice.svg') : $img_val;{/php} diff --git a/deploy.sh b/deploy.sh index 951a258..2bca0cb 100644 --- a/deploy.sh +++ b/deploy.sh @@ -18,6 +18,14 @@ if [ ! -d ".git" ]; then exit 1 fi +# 线上单独发布的页面必须先同步到仓库,避免硬重置覆盖已确认的改版。 +# 数据库配置由下方单独保护;部署脚本自身允许独立安装此检查。 +if ! git diff --quiet HEAD -- . ':(exclude)application/database.php' ':(exclude)deploy.sh'; then + echo "[${DATE}] 部署已停止:线上存在尚未同步到仓库的修改,请先核对并同步版本。" >> "${LOG_FILE}" + echo "Deploy stopped: live changes must be reconciled before reset." + exit 1 +fi + # 备份关键环境配置 if [ -f "application/database.php" ]; then cp -p application/database.php application/database.php.deploy_bak diff --git a/docs/agent-version-restoration.md b/docs/agent-version-restoration.md new file mode 100644 index 0000000..1fd670c --- /dev/null +++ b/docs/agent-version-restoration.md @@ -0,0 +1,25 @@ +# 智能体页面版本恢复 + +## 原因与证据 + +2026 年 11 月 5 日 13:53(北京时间)的自动部署执行 `git reset --hard origin/master`。恢复前,服务器智能体模板修改时间为 `2026-11-05 13:53:20 +0800`,线上模板 SHA-256 与服务器 HEAD 提交中的模板完全一致,摘要为 `9c828e0e2fa24e57da004a577cc79933723f8ed8cbd3e9f26c8d5e54068b1ef9`。 + +服务器 HEAD 为 `7ce37ad`,reflog 记录了两次 `reset: moving to origin/master`。此前单独上传的新版模板没有同步到仓库,该操作将其替换为旧模板。配图与独立样式仍在,属于模板被覆盖,不是浏览器缓存。后续软件页发布清单未包含智能体模板。 + +## 恢复 + +恢复本地 `service_agent.html` 的已确认第二版,使用 `service-agent-v2.css?v=20261105c`、`landscape-v2` 与 `courtyard-v2` 配图。保留同期其他工作更新后的公共入口模板;入口最终版本包括智能体页 viewport、移动端旧轮播隐藏,同时保留 APP 和软件页已有设置。 + +恢复期间发现另一项部署也在更新资源及入口模板,已重新核对并保留其最新入口设置。备份为 `/www/backup/nhc-agent-v2-restore-20261105-150228`,入口核对备份为 `/www/backup/nhc-agent-wrapper-reconcile-20261105-150428`。清单位于 `runtime/agent-v2-restore-deployment.json` 与 `runtime/agent-wrapper-reconcile-deployment.json`。 + +## 防止重复覆盖 + +在 `deploy.sh` 的配置备份、拉取及硬重置之前加入 `git diff --quiet HEAD` 检查。线上存在尚未同步到仓库的已跟踪文件修改时,记录原因并停止部署。数据库配置维持原有单独保护,部署脚本自身从此检查排除。 + +未关闭 webhook,未推送仓库,也未触发全站 reset。脚本通过 `bash -n`;隔离临时仓库验证干净状态、仅配置与脚本调整、未暂存页面修改和已暂存页面修改四种情况。生产只读检查确认当前线上改版可被识别,后续硬重置将被阻止。原脚本备份为 `/www/backup/nhc-deploy-guard-20261105-150149/deploy.sh`。 + +后续自动发布前仍需把已确认的线上改版同步到代码仓库,或逐项核对差异;此检查负责阻止误覆盖,不会自动合并版本。外部工具绕开该脚本直接执行 reset 或文件覆盖时,不受此检查保护。 + +## 验证 + +服务页面和文案 11 项检查通过。桌面与 iPhone 请求返回 200,均引用第二版模板、样式和图片;浏览器验证新版标题与主视觉正常。手机轮播已隐藏,页面无横向溢出,问答支持键盘操作,无浏览器错误。软件页、APP 页、首页及案例页均返回 200。 diff --git a/tests/test_dedicated_page_illustrations.py b/tests/test_dedicated_page_illustrations.py index 634039c..d7bbbd1 100644 --- a/tests/test_dedicated_page_illustrations.py +++ b/tests/test_dedicated_page_illustrations.py @@ -1,53 +1,65 @@ -# -*- coding: utf-8 -*- """ 全站独立页面精美视觉配图规范专项测试 (Dedicated Page Illustrations Test) 严格遵循 TDD 模式: -1. 验证软件定制独立页、APP定制独立页、智能体独立页、联系我们页均配有专属高品质现代中式矢量视窗图; -2. 验证所有图片文件真实存在于资源目录且尺寸有效; -3. 验证图片符合浅色专业风规范(背景 #FFFFFF/#F8FAFC、主色 #2563EB、无 emoji、有印章点缀与细线窗棂)。 +1. 验证软件定制独立页、APP定制独立页、智能体独立页、联系我们页均配有专属高品质视窗图; +2. 验证新版服务页摄影配图真实存在、尺寸满足首屏展示要求,并提供 WebP 兼容版本; +3. 验证联系我们页矢量配图符合浅色专业风规范。 """ import os import unittest +from PIL import Image + ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +RASTER_ROOT = os.path.join(ROOT_DIR, 'public', 'assets', 'addons', 'official', 'images') +SHOWCASE_ROOT = os.path.join(RASTER_ROOT, 'showcases') + +SERVICE_HEROES = { + 'software': ('software/structure-v2.jpg', 1440, 960), + 'app': ('app/terminals.jpg', 1440, 960), + 'agent': ('agent/landscape-v2.jpg', 1920, 640), +} + + class TestDedicatedPageIllustrations(unittest.TestCase): - def setUp(self): - self.img_dir = os.path.join(ROOT_DIR, 'public/assets/addons/official/images/showcases') - self.template_dir = os.path.join(ROOT_DIR, 'addons/official/view/web') - def test_illustration_assets_exist(self): - """测试 4 张专属精美视觉插图文件存在且内容有效""" - required_images = [ - 'service_software_hero.svg', - 'service_app_hero.svg', - 'service_agent_hero.svg', - 'contact_headquarters.svg', - ] - for img_name in required_images: - path = os.path.join(self.img_dir, img_name) - self.assertTrue(os.path.exists(path), f"缺少专属精美配图: {img_name}") - with open(path, 'r', encoding='utf-8') as f: - content = f.read() - self.assertIn('52%)完全通透无遮挡""" - with open(CSS_PATH, "r", encoding="utf-8") as f: - css_content = f.read() + with Image.open(hero_path) as hero: + width, height = hero.size + self.assertGreaterEqual(width, 1800, "首屏摄影宽度不足宽幅要求") + self.assertGreaterEqual(height, 700, "首屏摄影高度不足首屏要求") - for b in ["banner_lead.jpg", "banner_craft.jpg", "banner_agent.jpg", "banner_matrix.jpg"]: - self.assertIn(b, css_content, f"CSS 中未正确引用大图: {b}") + def test_02_css_uses_responsive_hero_and_accessible_motion(self): + """2. 验证专属 CSS 提供首屏布局、响应式断点与减少动态效果适配""" + with open(CSS_PATH, encoding="utf-8") as stream: + css_content = stream.read() - # 检查是否去除了原本在 50% 覆盖 0.92 白色的遮罩问题 - self.assertNotIn("rgba(255, 255, 255, 0.92) 50%", css_content, - "CSS 仍保留 50% 处 92% 重度白色遮罩") + self.assertIn(".hn-hero-picture", css_content, "CSS 未正确定义首屏图片容器") + self.assertIn("object-fit", css_content, "CSS 应规范首屏图片的适应展示模式") + self.assertIn("linear-gradient", css_content, "CSS 应使用渐变为文字保留可读区域") + self.assertIn("@media(max-width:768px)", css_content, "CSS 缺少移动端首屏适配断点") + self.assertIn("prefers-reduced-motion", css_content, "CSS 应支持减少动态效果") def test_03_pc_and_mobile_template_integrity(self): - """3. 验证 PC 与移动端模板幻灯片数量均为 4,包含对应的主题类名""" + """3. 验证 PC 与移动端模板引用同一套响应式首屏图片""" for page_path in [PC_HOME_PATH, M_HOME_PATH]: - with open(page_path, "r", encoding="utf-8") as f: - html = f.read() - for i in range(1, 5): - self.assertIn(f"nhc-slide-theme-{i}", html, f"页面缺少主题类 nhc-slide-theme-{i}: {page_path}") - self.assertEqual(len(re.findall(r'nhc-slide-theme-\d', html)), 4, f"幻灯片数量不等于 4: {page_path}") + with open(page_path, encoding="utf-8") as stream: + html = stream.read() + self.assertEqual(html.count("hn-hero-picture"), 1, f"首屏图片容器数量应为 1:{page_path}") + self.assertIn("river-courtyard-v3.webp", html, f"页面缺少 WebP 首屏图片源:{page_path}") + self.assertIn("river-courtyard-v3.jpg", html, f"页面缺少 JPEG 首屏图片回退:{page_path}") + self.assertIn('fetchpriority="high"', html, f"首屏图片应优先加载:{page_path}") + self.assertRegex(html, r']+alt="[^"]{4,}"', f"首屏图片应包含有效替代文本:{page_path}") if __name__ == "__main__":