Browse Source

上传 SQL 文件和 XTU 模板文件

xliu 2 months ago
parent
commit
9bd24b0c59
57 changed files with 7891 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 153 0
      addons/cms/install.sql
  3. 191 0
      addons/cms/testdata.sql
  4. 15 0
      addons/links/install.sql
  5. 18 0
      app/common/model/feedback.sql
  6. 3 0
      templates/xtu/cms/category.html
  7. 112 0
      templates/xtu/cms/category_about.html
  8. 257 0
      templates/xtu/cms/category_download.html
  9. 81 0
      templates/xtu/cms/category_download.html.bak_20260513_132238
  10. 199 0
      templates/xtu/cms/category_download.html.bak_dji_style_20260513_133604
  11. 199 0
      templates/xtu/cms/category_download.html.bak_title_size_20260513_133726
  12. 60 0
      templates/xtu/cms/category_job.html
  13. 51 0
      templates/xtu/cms/category_product.html
  14. 65 0
      templates/xtu/cms/category_support.html
  15. 93 0
      templates/xtu/cms/category_support.html.bak.20260514161655
  16. 25 0
      templates/xtu/cms/common/index_ajax.html
  17. 27 0
      templates/xtu/cms/common/list_ajax.html
  18. 60 0
      templates/xtu/cms/common/sider.html
  19. 135 0
      templates/xtu/cms/footer-links.html
  20. 219 0
      templates/xtu/cms/footer.html
  21. 128 0
      templates/xtu/cms/header.html
  22. 128 0
      templates/xtu/cms/header.html.bak_20260513_132238
  23. 271 0
      templates/xtu/cms/index.html
  24. 447 0
      templates/xtu/cms/index.html.bak-20260409-1047
  25. 67 0
      templates/xtu/cms/list.html
  26. 54 0
      templates/xtu/cms/list_about.html
  27. 64 0
      templates/xtu/cms/list_aftersales.html
  28. 239 0
      templates/xtu/cms/list_download.html
  29. 48 0
      templates/xtu/cms/list_download.html.bak_20260513_122653
  30. 73 0
      templates/xtu/cms/list_fazhan.html
  31. 91 0
      templates/xtu/cms/list_job.html
  32. 280 0
      templates/xtu/cms/list_product.html
  33. 165 0
      templates/xtu/cms/listxtugo.html
  34. 111 0
      templates/xtu/cms/meilisearch_result.html
  35. 51 0
      templates/xtu/cms/page.html
  36. 443 0
      templates/xtu/cms/page_compare.html
  37. 60 0
      templates/xtu/cms/page_contact.html
  38. 264 0
      templates/xtu/cms/page_fankui.html
  39. 489 0
      templates/xtu/cms/page_hangye.html
  40. 51 0
      templates/xtu/cms/page_hangye.html.bak-cooperation-20260508130556
  41. 48 0
      templates/xtu/cms/page_supportcourse.html
  42. 178 0
      templates/xtu/cms/page_supportdetail.html
  43. 26 0
      templates/xtu/cms/search.html
  44. 109 0
      templates/xtu/cms/search_result.html
  45. 151 0
      templates/xtu/cms/show.html
  46. 54 0
      templates/xtu/cms/show_aftersales.html
  47. 196 0
      templates/xtu/cms/show_appointment.html
  48. 139 0
      templates/xtu/cms/show_download.html
  49. 75 0
      templates/xtu/cms/show_fqa.html
  50. 220 0
      templates/xtu/cms/show_job.html
  51. 906 0
      templates/xtu/cms/show_product.html
  52. 22 0
      templates/xtu/cms/show_video.html
  53. 75 0
      templates/xtu/cms/support-contact-block.html
  54. 36 0
      templates/xtu/cms/support-contact-block.html.bak.20260514161655
  55. 45 0
      templates/xtu/cms/tags.html
  56. 25 0
      templates/xtu/cms/tags_list.html
  57. 98 0
      templates/xtu/cms/xunsearch_result.html

+ 1 - 0
.gitignore

@@ -13,6 +13,7 @@ public/runtime/
 node_modules/
 
 # uploads / generated media
+public/uploads/
 
 # editor / system
 .DS_Store

+ 153 - 0
addons/cms/install.sql

@@ -0,0 +1,153 @@
+CREATE TABLE IF NOT EXISTS `__PREFIX__cms_category` (
+  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '栏目ID',
+  `catname` varchar(30) NOT NULL DEFAULT '' COMMENT '栏目名称',
+  `catdir` varchar(30) NOT NULL DEFAULT '' COMMENT '唯一标识',
+  `type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '类别',
+  `target` varchar(20) NOT NULL DEFAULT '_self' COMMENT '打开方式',
+  `modelid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '模型ID',
+  `parentid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '父ID',
+  `arrparentid` varchar(255) NOT NULL DEFAULT '' COMMENT '所有父ID',
+  `arrchildid` mediumtext COMMENT '所有子栏目ID',
+  `child` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否存在子栏目,1存在',
+  `image` varchar(255) NOT NULL DEFAULT '' COMMENT '栏目图片',
+  `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '栏目图标',
+  `description` mediumtext NOT NULL COMMENT '栏目描述',
+  `url` varchar(100) NOT NULL DEFAULT '' COMMENT '链接地址',
+  `items` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '文档数量',
+  `setting` text COMMENT '相关配置信息',
+  `listorder` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
+  `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `catdir` (`catdir`),
+  KEY `parentid` (`parentid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='栏目表';
+
+CREATE TABLE IF NOT EXISTS `__PREFIX__cms_category_priv` (
+  `catid` smallint(5) unsigned NOT NULL DEFAULT '0',
+  `roleid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '角色或者组ID',
+  `is_admin` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否为管理员 1、管理员',
+  `action` varchar(30) NOT NULL DEFAULT '' COMMENT '动作',
+  KEY `catid` (`catid`,`roleid`,`is_admin`,`action`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='栏目权限表';
+
+CREATE TABLE IF NOT EXISTS `__PREFIX__cms_page` (
+  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `catid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '栏目ID',
+  `title` varchar(160) NOT NULL DEFAULT '' COMMENT '标题',
+  `keywords` varchar(255) NOT NULL DEFAULT '' COMMENT '关键字',
+  `description` varchar(255) NOT NULL DEFAULT '' COMMENT 'SEO描述',
+  `content` text COMMENT '内容',
+  `thumb` varchar(255) NOT NULL DEFAULT '' COMMENT '缩略图',
+  `hits` mediumint(8) unsigned DEFAULT '0' COMMENT '点击量',
+  `publish_time` int(10) unsigned DEFAULT NULL COMMENT '发布时间',
+  `create_time` int(10) unsigned DEFAULT NULL COMMENT '创建时间',
+  `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='单页内容表';
+
+CREATE TABLE IF NOT EXISTS `__PREFIX__cms_tags` (
+  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'tagID',
+  `tag` varchar(20) NOT NULL DEFAULT '' COMMENT 'tag名称',
+  `seo_title` varchar(255) NOT NULL DEFAULT '' COMMENT 'seo标题',
+  `seo_keyword` varchar(255) NOT NULL DEFAULT '' COMMENT 'seo关键字',
+  `seo_description` varchar(255) NOT NULL DEFAULT '' COMMENT 'seo简介',
+  `usetimes` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '信息总数',
+  `hits` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '点击数',
+  `create_time` int(10) unsigned DEFAULT NULL COMMENT '添加时间',
+  `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间',
+  `listorder` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `tag` (`tag`),
+  KEY `usetimes` (`usetimes`,`listorder`),
+  KEY `hits` (`hits`,`listorder`)
+) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='tags主表';
+
+CREATE TABLE IF NOT EXISTS `__PREFIX__cms_tags_content` (
+  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `tag_id` int(10) DEFAULT NULL COMMENT '标签ID',
+  `content_id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '信息ID',
+  `catid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '栏目ID',
+  `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='tags数据表';
+
+CREATE TABLE IF NOT EXISTS `__PREFIX__cms_order` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `trade_sn` varchar(50) DEFAULT '' COMMENT '订单ID',
+  `user_id` int(10) unsigned DEFAULT '0' COMMENT '会员ID',
+  `content_id` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '信息ID',
+  `catid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '栏目ID',
+  `title` varchar(100) DEFAULT NULL COMMENT '订单标题',
+  `type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '1金钱or2点数',
+  `total_price` decimal(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '订单总价',
+  `pay_price` decimal(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '实际支付金额',
+  `pay_type` varchar(50) DEFAULT NULL COMMENT '支付类型',
+  `method` varchar(100) NULL DEFAULT '' COMMENT '支付方法',
+  `ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
+  `useragent` varchar(255) DEFAULT NULL COMMENT '用户访问端标识',
+  `remark` varchar(255) NOT NULL COMMENT '备注说明',
+  `pay_time` int(10) unsigned DEFAULT NULL COMMENT '支付时间',
+  `create_time` int(10) unsigned DEFAULT NULL COMMENT '添加时间',
+  `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间',
+  `status` enum('succ','cancel','unpay') NOT NULL DEFAULT 'unpay' COMMENT '状态',
+  PRIMARY KEY (`id`),
+  KEY `catid` (`catid`,`content_id`),
+  KEY `trade_sn` (`trade_sn`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='订单表';
+
+CREATE TABLE IF NOT EXISTS `__PREFIX__cms_content` (
+  `id` int(10) NOT NULL AUTO_INCREMENT,
+  `catid` smallint(5) NOT NULL COMMENT '栏目ID',
+  `content_id` int(10) NOT NULL COMMENT '信息ID',
+  `user_id` mediumint(8) NOT NULL COMMENT '会员ID',
+  `username` varchar(16) NOT NULL COMMENT '用户名',
+  `create_time` int(10) unsigned DEFAULT NULL COMMENT '添加时间',
+  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态',
+  PRIMARY KEY (`id`),
+  KEY `user_id` (`catid`,`content_id`,`status`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='会员投稿信息记录表';
+
+CREATE TABLE `__PREFIX__cms_model` (
+  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+  `module` varchar(15) NOT NULL  DEFAULT '' COMMENT '所属模块',
+  `name` varchar(30) NOT NULL DEFAULT '' COMMENT '模型名称',
+  `tablename` varchar(20) NOT NULL DEFAULT '' COMMENT '表名',
+  `description` varchar(100) NOT NULL DEFAULT '' COMMENT '描述',
+  `setting` text NOT NULL COMMENT '配置信息',
+  `type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '模型类别:1-独立表,2-主附表',
+  `create_time` int(10) unsigned DEFAULT NULL COMMENT '添加时间',
+  `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间',
+  `listorder` tinyint(3) NOT NULL DEFAULT '0' COMMENT '排序',
+  `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='模型列表';
+
+CREATE TABLE `__PREFIX__cms_field` (
+  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+  `modelid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '模型ID',
+  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '字段名',
+  `title` varchar(30) NOT NULL DEFAULT '' COMMENT '别名',
+  `remark` tinytext NULL COMMENT '字段提示',
+  `pattern` varchar(255) NOT NULL DEFAULT '' COMMENT '数据校验正则',
+  `errortips` varchar(255) NOT NULL DEFAULT '' COMMENT '数据校验未通过的提示信息',
+  `type` varchar(20) NOT NULL DEFAULT '' COMMENT '字段类型',
+  `extend` varchar(255) DEFAULT '' COMMENT '扩展信息',
+  `setting` mediumtext NULL COMMENT '字段配置',
+  `ifsystem` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否主表字段 1 是',
+  `iscore` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否内部字段',
+  `iffixed` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否固定不可修改',
+  `ifrequire` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否必填',
+  `ifsearch` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '作为搜索条件',
+  `isadd` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '在投稿中显示',
+  `isorder` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否排序',
+  `create_time` int(10) unsigned DEFAULT NULL COMMENT '创建时间',
+  `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间',
+  `listorder` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
+  `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态',
+  PRIMARY KEY (`id`),
+  KEY `name` (`name`,`modelid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='模型字段列表';
+
+-- 2.2.1 --
+ALTER TABLE `__PREFIX__cms_category` 
+ADD COLUMN `target` varchar(20) NOT NULL DEFAULT '_self' COMMENT '打开方式' AFTER `type`;

File diff suppressed because it is too large
+ 191 - 0
addons/cms/testdata.sql


+ 15 - 0
addons/links/install.sql

@@ -0,0 +1,15 @@
+CREATE TABLE IF NOT EXISTS `__PREFIX__links` (
+  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '链接id',
+  `link_type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0:文字链接,1:logo链接',
+  `url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接地址',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '链接名称',
+  `image` varchar(255) NOT NULL DEFAULT '' COMMENT '链接图片',
+  `target` varchar(25) NOT NULL DEFAULT '' COMMENT '链接打开方式',
+  `description` varchar(255) NOT NULL DEFAULT '' COMMENT '链接描述',
+  `create_time` int(10) unsigned DEFAULT NULL COMMENT '添加时间',
+  `update_time` int(10) UNSIGNED DEFAULT NULL COMMENT '更新时间',
+  `listorder` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
+  `terms_id` smallint(4) NOT NULL COMMENT '分类id',
+  `status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0未通过,1正常',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='友情链接';

+ 18 - 0
app/common/model/feedback.sql

@@ -0,0 +1,18 @@
+CREATE TABLE IF NOT EXISTS `yzn_feedback` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `feedback_type` varchar(32) NOT NULL DEFAULT '' COMMENT '评价类型标识',
+  `feedback_type_text` varchar(100) NOT NULL DEFAULT '' COMMENT '评价类型文本',
+  `rating` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '评分 1-5',
+  `lang` varchar(16) NOT NULL DEFAULT 'cn' COMMENT '语言',
+  `source_page` varchar(255) NOT NULL DEFAULT '' COMMENT '来源页面',
+  `ip` varchar(64) NOT NULL DEFAULT '' COMMENT 'IP',
+  `user_agent` varchar(255) NOT NULL DEFAULT '' COMMENT 'User-Agent',
+  `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态',
+  `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
+  `updatetime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_ip_type` (`ip`,`feedback_type`),
+  KEY `idx_feedback_type` (`feedback_type`),
+  KEY `idx_lang` (`lang`),
+  KEY `idx_createtime` (`createtime`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='前台评价打分';

+ 3 - 0
templates/xtu/cms/category.html

@@ -0,0 +1,3 @@
+{include file="header" /}
+
+{include file="footer" /}

+ 112 - 0
templates/xtu/cms/category_about.html

@@ -0,0 +1,112 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/about.css?v=20260626-1308">
+
+<main class="about-page">
+  <aside class="about-side-nav" aria-label="关于我们章节导航">
+    <div class="about-side-nav-inner">
+      <a class="about-side-logo" href="javascript:;">
+        <img src="/assets/xtu/vendor/img/XTU-logo2.png" alt="XTU">
+      </a>
+      <nav class="about-side-menu">
+        <a class="about-side-link is-active" href="#about-section-1" data-target="about-section-1">{:getCategory(29,'catname')}</a>
+        <a class="about-side-link" href="#about-section-2" data-target="about-section-2">{:getCategory(30,'catname')}</a>
+        <a class="about-side-link" href="#about-section-3" data-target="about-section-3">{:getCategory(31,'catname')}</a>
+        <a class="about-side-link" href="#about-section-4" data-target="about-section-4">{:getCategory(32,'catname')}</a>
+        <a class="about-side-link" href="#about-section-5" data-target="about-section-5">{:getCategory(33,'catname')}</a>
+      </nav>
+    </div>
+  </aside>
+
+  <div class="about-stack">
+    <section class="about-panel about-panel-intro is-active" id="about-section-1" data-panel="about-section-1" style="background:url({:getCategory(29,'image')}) center center / cover no-repeat;">
+      <div class="about-panel-inner about-panel-intro-grid">
+        <div class="about-panel-copy about-panel-copy-centered about-panel-copy-light">
+          {yzn module="cms" action="lists" catid="29" order="listorder DESC,id ASC" num="1" return="data" moreinfo="1"}
+          {volist name="data" id="vo"}
+            {$vo.content|raw}
+          {/volist}
+          {/yzn}
+        </div>
+      </div>
+    </section>
+
+    <section class="about-panel about-panel-reference about-panel-reference-left" id="about-section-2" data-panel="about-section-2">
+      <div class="about-panel-reference-media about-panel-reference-media-office" style="background-image:url({:getCategory(30,'image')});" aria-hidden="true"></div>
+      <div class="about-panel-reference-copy">
+        {yzn module="cms" action="lists" catid="30" order="listorder DESC,id ASC" num="1" return="data" moreinfo="1"}
+        {volist name="data" id="vo"}
+          <h2>{$vo.title}</h2>
+          {$vo.content|raw}
+        {/volist}
+        {/yzn}
+      </div>
+    </section>
+
+    <section class="about-panel about-panel-reference about-panel-reference-right" id="about-section-3" data-panel="about-section-3">
+      <div class="about-panel-reference-media about-panel-reference-media-farm" style="background-image:url({:getCategory(31,'image')});" aria-hidden="true"></div>
+      <div class="about-panel-reference-copy">
+        {yzn module="cms" action="lists" catid="31" order="listorder DESC,id ASC" num="1" return="data" moreinfo="1"}
+        {volist name="data" id="vo"}
+          <h2>{$vo.title}</h2>
+          {$vo.content|raw}
+        {/volist}
+        {/yzn}
+      </div>
+    </section>
+
+    <section class="about-panel about-panel-dark about-panel-message" id="about-section-4" data-panel="about-section-4" style="background:url({:getCategory(32,'image')}) center center / cover no-repeat;">
+      <div class="about-panel-inner about-panel-intro-grid">
+        <div class="about-panel-copy about-panel-copy-centered about-panel-copy-light">
+          {yzn module="cms" action="lists" catid="32" order="listorder DESC,id ASC" num="1" return="data" moreinfo="1"}
+          {volist name="data" id="vo"}
+            {$vo.content|raw}
+          {/volist}
+          {/yzn}
+        </div>
+      </div>
+    </section>
+
+    <section class="about-panel about-panel-light about-panel-timeline about-panel-timeline-compare" id="about-section-5" data-panel="about-section-5" style="--about-panel-bg:#ffffff; --about-panel-overlay:none;">
+      <div class="about-panel-inner about-panel-inner-timeline about-panel-inner-timeline-compare">
+        <div class="about-timeline-intro about-timeline-intro-compare">
+          <h2>{:getCategory(33,'catname')}</h2>
+          <p>{if getCategory(33,'description')}{:getCategory(33,'description')}{else /}{:getCategory(33,'catname')}{/if}</p>
+        </div>
+        <div class="about-inline-accordion about-inline-accordion-compare" aria-label="企业发展年份">
+          {yzn module="cms" action="lists" catid="33" order="listorder DESC,id DESC" num="20" return="timelineDataCompare" moreinfo="1"}
+          {volist name="timelineDataCompare" id="vo" key="k"}
+          <div class="about-inline-accordion-item {if $k==1}is-active{/if}" data-accordion-item>
+            <button class="about-accordion-year {if $k==1}is-active{/if}" type="button" data-stage-target="timeline-stage-{$vo.id}" data-year="{$vo.title}">{$vo.title}</button>
+            <article class="about-stage-panel {if $k==1}is-active{/if}" id="timeline-stage-{$vo.id}" data-stage-panel>
+              <div class="about-stage-copy">
+                <h2>{$vo.title}</h2>
+                <div class="about-stage-richtext">{$vo.content|raw}</div>
+              </div>
+              <div class="about-stage-gallery-wrap">
+                <div class="about-stage-slider" data-stage-slider>
+                  <button class="about-stage-arrow about-stage-arrow-prev" type="button" aria-label="上一张"><i class="bi bi-chevron-left"></i></button>
+                  <div class="about-stage-single-image">
+                    {if !empty($vo.thumbs)}
+                      {volist name="vo.thumbs" id="img" key="imgKey"}
+                      <img src="{$img}" alt="{$vo.title}" data-stage-slide {if $imgKey neq 1}hidden{/if}>
+                      {/volist}
+                   
+                    {/if}
+                  </div>
+                  <button class="about-stage-arrow about-stage-arrow-next" type="button" aria-label="下一张"><i class="bi bi-chevron-right"></i></button>
+                </div>
+              </div>
+            </article>
+          </div>
+          {/volist}
+          {/yzn}
+        </div>
+      </div>
+    </section>
+  </div>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/about.js?v=20260413-1412"></script>
+{include file="footer" /}

+ 257 - 0
templates/xtu/cms/category_download.html

@@ -0,0 +1,257 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/download-center.css?v=20260513-2">
+
+{php}
+$downloadProductId = (int)request()->param('product_id/d', request()->param('project_id/d', request()->param('pid/d', request()->param('id/d', 0))));
+$downloadBaseWhere = '`status` = 1';
+$productWhere = '`status` = 1';
+$currentProductWhere = '`id` = ' . $downloadProductId . ' AND `status` = 1';
+$productDownloadWhere = '';
+if ($downloadProductId > 0) {
+    $productDownloadWhere = ' AND `project_id` = ' . $downloadProductId;
+}
+$downloadDocWhere = '`status` = 1 AND `catid` = 40' . $productDownloadWhere;
+$downloadFirmwareWhere = '`status` = 1 AND `catid` = 57' . $productDownloadWhere;
+{/php}
+
+<main class="download-center-page support-page download-category-page">
+  <div class="cooperation-topbar download-topbar">
+    <div class="cooperation-topbar-inner">
+      <div class="cooperation-topbar-title">{$title|default=cms_t('download_center','下载中心')}</div>
+    </div>
+  </div>
+
+  <section class="download-center-section">
+    <div class="content-1300-wrap download-center-layout">
+      <aside class="download-filter-panel">
+        <div class="download-filter-card">
+          <div class="download-filter-meta download-filter-meta-standalone">
+            <span><i class="bi bi-phone"></i> {:getCategory(42,'catname')}</span>
+            <span><i class="bi bi-journal-text"></i> {:getCategory(40,'catname')}</span>
+            <span><i class="bi bi-cpu"></i> {:getCategory(57,'catname')}</span>
+          </div>
+        </div>
+
+        <div class="download-filter-card download-product-card">
+          <div class="download-filter-title">
+            <i class="bi bi-camera-video"></i>
+            <span>{:cms_t('select_product','选择产品')}</span>
+          </div>
+          <div class="download-product-list download-product-category-list">
+            {yzn module="cms" action="category" where="modelid=2"  order="listorder DESC,id ASC" num="6" return="productCategories"}
+            {volist name="productCategories" id="productCat"}
+    
+
+              {yzn module="cms" action="lists" catid="$productCat['id']" order="listorder DESC,id DESC" num="30" return="downloadProducts" moreinfo="1"}
+              
+              {if !empty($downloadProducts)}
+             
+              {php}
+              $downloadGroupOpen = false;
+              foreach ($downloadProducts as $downloadProductItem) {
+                  if ((int)$downloadProductItem['id'] === $downloadProductId) {
+                      $downloadGroupOpen = true;
+                      break;
+                  }
+              }
+              {/php}
+              <div class="download-product-group {if $downloadGroupOpen}is-open{/if}">
+                <button class="download-product-group-title" type="button" aria-expanded="{if $downloadGroupOpen}true{else /}false{/if}">
+                  <span>{$productCat.catname}</span>
+                  <i class="bi bi-chevron-down"></i>
+                </button>
+                <div class="download-product-group-items">
+                  {volist name="downloadProducts" id="product"}
+                    <a class="download-product-link {if $downloadProductId == $product.id}active{/if}" href="?product_id={$product.id}">
+                      <span>{$product.title}</span>
+                      <i class="bi bi-chevron-right"></i>
+                    </a>
+                  {/volist}
+                </div>
+              </div>
+              {/if}
+              {/yzn}
+            {/volist}
+            {/yzn}
+          </div>
+        </div>
+      </aside>
+
+      <div class="download-content-panel">
+        {if $downloadProductId <= 0}
+          <div class="download-overview-card">
+            {yzn module="cms" action="lists" catid="42" order="listorder DESC,id ASC" num="1" return="xtugoDownloadData" moreinfo="1"}
+            {volist name="xtugoDownloadData" id="vo"}
+            <div class="download-overview-copy">
+              <span class="download-pill">XTU GO</span>
+              <h2>{$vo.title|default=cms_t('xtugo_default_title','骁途用户必备的手机应用')}</h2>
+              <p>{$vo.description|default=cms_t('xtugo_default_desc','一站连接设备、管理素材、获取教程与售后服务,让拍摄体验从开机到分享都更顺手。')}</p>
+              <div class="xtugo-store-list download-store-list">
+                <a class="xtugo-store-btn xtugo-store-btn-android" href="{$vo.andiordurl|default='#'}" target="_blank" rel="noopener">
+                  <span class="xtugo-store-icon"><i class="bi bi-android2"></i></span>
+                  <span class="xtugo-store-copy"><small>{:cms_t('download_for','Download for')}</small><strong>Android</strong></span>
+                </a>
+                <a class="xtugo-store-btn xtugo-store-btn-ios" href="{$vo.appstore|default='#'}" target="_blank" rel="noopener">
+                  <span class="xtugo-store-icon"><i class="bi bi-apple"></i></span>
+                  <span class="xtugo-store-copy"><small>{:cms_t('download_on_the','Download on the')}</small><strong>App Store</strong></span>
+                </a>
+              </div>
+            </div>
+            <div class="download-overview-visual">
+              <img src="{$vo.thumb|default='/assets/xtu/vendor/img/xtugo.png'}" alt="XTU GO">
+            </div>
+            {/volist}
+            {/yzn}
+          </div>
+
+          <div class="download-doc-section">
+            <div class="download-section-head">
+              <h2>{:cms_t('latest_downloads_prefix','最新')}{:getCategory($catid,'catname')}</h2>
+              <p>{:cms_t('download_select_product_tip','选择左侧产品后,可查看该产品专属资料。')}</p>
+            </div>
+            <div class="download-file-grid">
+              {yzn module="cms" action="lists" catid="$catid" where="$downloadBaseWhere" cache="3600" order="$order['data']??'listorder DESC,publish_time DESC,id DESC'" num="12" page="$page" return="data" moreinfo="1"}
+              {volist name="data" id="vo"}
+              <article class="download-file-card">
+                <div class="download-file-icon"><i class="bi bi-file-earmark-arrow-down"></i></div>
+                <div class="download-file-copy">
+                  <h3>{$vo.title}</h3>
+                  <p>{:date('Y-m-d',$vo.publish_time)}</p>
+                </div>
+                <a href="{$vo.fileaddress}" target="_blank" rel="noopener" class="download-file-action">{:cms_t('download','下载')}</a>
+              </article>
+              {/volist}
+              {/yzn}
+            </div>
+            <div class="text-center download-pages">{$pages|raw}</div>
+          </div>
+        {else /}
+          {yzn module="cms" action="lists" modelid="2" where="$currentProductWhere" num="1" return="currentProduct" moreinfo="1"}
+          {volist name="currentProduct" id="product"}
+          {php}
+          $downloadHeroLabel = getCategory($product['catid'], 'catname');
+          {/php}
+          <div class="download-product-hero-card">
+            <div>
+              <span class="download-pill">{$downloadHeroLabel|default=cms_t('product_download_label','产品下载')}</span>
+              <h2>{$product.title}</h2>
+              <p>{$product.description|default=cms_t('product_download_default_desc','请选择下方分类获取对应下载内容。')}</p>
+            </div>
+            {if $product.thumb}<img src="{$product.thumb}" alt="{$product.title}">{/if}
+          </div>
+          {/volist}
+          {/yzn}
+
+          <div class="download-tabs-card">
+            <div class="download-tabs" role="tablist">
+              <button class="download-tab active" type="button" data-tab="app"><i class="bi bi-phone"></i>{:getCategory(42,'catname')}</button>
+              <button class="download-tab" type="button" data-tab="manual"><i class="bi bi-journal-text"></i>{:getCategory(40,'catname')}</button>
+              <button class="download-tab" type="button" data-tab="firmware"><i class="bi bi-cpu"></i>{:getCategory(57,'catname')}</button>
+            </div>
+
+            <div class="download-tab-panel active" id="download-tab-app">
+              {yzn module="cms" action="lists" catid="42" order="listorder DESC,id ASC" num="1" return="xtugoAppData" moreinfo="1"}
+              {volist name="xtugoAppData" id="vo"}
+              <div class="download-app-panel">
+                <div>
+                  <span class="download-pill">XTU GO {:getCategory(42,'catname')}</span>
+                  <h3>{$vo.title|default='XTU GO'}</h3>
+                  <p>{$vo.description|default=cms_t('xtugo_app_default_desc','配套移动应用,支持设备连接、素材管理、教程与服务支持。')}</p>
+                </div>
+                <div class="xtugo-store-list download-store-list">
+                  <a class="xtugo-store-btn xtugo-store-btn-android" href="{$vo.andiordurl|default='#'}" target="_blank" rel="noopener"><span class="xtugo-store-icon"><i class="bi bi-android2"></i></span><span class="xtugo-store-copy"><small>{:cms_t('download_for','Download for')}</small><strong>Android</strong></span></a>
+                  <a class="xtugo-store-btn xtugo-store-btn-ios" href="{$vo.appstore|default='#'}" target="_blank" rel="noopener"><span class="xtugo-store-icon"><i class="bi bi-apple"></i></span><span class="xtugo-store-copy"><small>{:cms_t('download_on_the','Download on the')}</small><strong>App Store</strong></span></a>
+                </div>
+              </div>
+              {/volist}
+              {/yzn}
+            </div>
+
+            <div class="download-tab-panel" id="download-tab-manual">
+              <div class="download-file-grid compact">
+                {yzn module="cms" action="lists" catid="40" where="$downloadDocWhere" order="listorder DESC,publish_time DESC,id DESC" num="30" return="manualFiles" moreinfo="1"}
+                {volist name="manualFiles" id="vo"}
+                <article class="download-file-card">
+                  <div class="download-file-icon"><i class="bi bi-file-earmark-pdf"></i></div>
+                  <div class="download-file-copy"><h3>{$vo.title}</h3><p>{:date('Y-m-d',$vo.publish_time)}</p></div>
+                  <a href="{if !empty($vo.fileaddress)}{$vo.fileaddress}{else /}{$vo.url}{/if}" target="_blank" rel="noopener" class="download-file-action">{:cms_t('download','下载')}</a>
+                </article>
+                {/volist}
+                {/yzn}
+              </div>
+            </div>
+
+            <div class="download-tab-panel" id="download-tab-firmware">
+              <div class="download-file-grid compact">
+                {yzn module="cms" action="lists" catid="57" where="$downloadFirmwareWhere" order="listorder DESC,publish_time DESC,id DESC" num="30" return="firmwareFiles" moreinfo="1"}
+                {volist name="firmwareFiles" id="vo"}
+                <article class="download-file-card">
+                  <div class="download-file-icon"><i class="bi bi-hdd-network"></i></div>
+                  <div class="download-file-copy"><h3>{$vo.title}</h3><p>{:date('Y-m-d',$vo.publish_time)}</p></div>
+                  <a href="{$vo.fileaddress}" target="_blank" rel="noopener" class="download-file-action">{:cms_t('download','下载')}</a>
+                </article>
+                {/volist}
+                {/yzn}
+              </div>
+            </div>
+          </div>
+        {/if}
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+
+
+
+<script>
+document.body.classList.add('download-category-body');
+(function () {
+  var siteHeader = document.getElementById('siteHeader');
+  var syncTopbarPosition = function () {
+    if (!siteHeader) return;
+    var headerRect = siteHeader.getBoundingClientRect();
+    document.documentElement.style.setProperty('--xtu-header-height', Math.max(0, Math.ceil(headerRect.bottom)) + 'px');
+  };
+  syncTopbarPosition();
+  window.addEventListener('load', syncTopbarPosition);
+  window.addEventListener('resize', syncTopbarPosition);
+  window.addEventListener('scroll', syncTopbarPosition, { passive: true });
+  if (window.ResizeObserver && siteHeader) { new ResizeObserver(syncTopbarPosition).observe(siteHeader); }
+})();
+</script>
+
+<script>
+document.addEventListener('DOMContentLoaded', function () {
+  document.querySelectorAll('.download-product-group-title').forEach(function (trigger) {
+    trigger.addEventListener('click', function () {
+      var group = trigger.closest('.download-product-group');
+      if (!group) return;
+      var isOpen = group.classList.contains('is-open');
+      document.querySelectorAll('.download-product-group.is-open').forEach(function (item) {
+        item.classList.remove('is-open');
+        var itemTrigger = item.querySelector('.download-product-group-title');
+        if (itemTrigger) itemTrigger.setAttribute('aria-expanded', 'false');
+      });
+      if (!isOpen) {
+        group.classList.add('is-open');
+        trigger.setAttribute('aria-expanded', 'true');
+      }
+    });
+  });
+
+  document.querySelectorAll('.download-tab').forEach(function (tab) {
+    tab.addEventListener('click', function () {
+      var name = tab.getAttribute('data-tab');
+      document.querySelectorAll('.download-tab').forEach(function (item) { item.classList.remove('active'); });
+      document.querySelectorAll('.download-tab-panel').forEach(function (panel) { panel.classList.remove('active'); });
+      tab.classList.add('active');
+      var target = document.getElementById('download-tab-' + name);
+      if (target) target.classList.add('active');
+    });
+  });
+});
+</script>
+{include file="footer" /}

+ 81 - 0
templates/xtu/cms/category_download.html.bak_20260513_132238

@@ -0,0 +1,81 @@
+{include file="header" /}
+<div class="carousel-main d-flex">
+    <div class="carousel-container">
+        <div class="layui-carousel" id="side-banner">
+            <div carousel-item>
+                {yzn module="cms" action="lists" flag="6" catid="$top_parentid" cache="3600" order="listorder DESC" limit="0,2" return="data" moreinfo="1"}
+                {volist name="data" id="vo"}
+                <a href="{$vo.url}" title="{$vo.title}">
+                    <div class="carousel-box">
+                        <div class="carousel-name">{:getCategory($vo['catid'],'catname')}</div>
+                        <div class="carousel-thumb d-flex align-items-center justify-content-center">
+                            {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>800 × 400</font>{/if}
+                        </div>
+                        <div class="carousel-title">
+                            <h3>{$vo.title}</h3>
+                            <p>{$vo.description|str_cut=###,80}</p>
+                        </div>
+                    </div>
+                </a>
+                {/volist}
+                {/yzn}
+            </div>
+        </div>
+    </div>
+    <div class="side-grid">
+        {yzn module="cms" action="lists" flag="6" catid="$top_parentid" cache="3600" order="listorder DESC" limit="2,4" return="data" moreinfo="1"}
+        {volist name="data" id="vo"}
+        <a href="{$vo.url}" title="{$vo.title}">
+            <div class="side-item">
+                <div class="d-flex side-thumb align-items-center justify-content-center">
+                    {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>800 × 400</font>{/if}
+                </div>
+                <div class="side-caption">
+                    <h3>{$vo.title}</h3>
+                </div>
+            </div>
+        </a>
+        {/volist}
+        {/yzn}
+    </div>
+</div>
+<div class="layui-row layui-col-space16">
+    {yzn module="cms" action="category" catid="$top_parentid" cache="3600" order="listorder DESC" num="6" return="data"}
+    {volist name="data" id="vo"}
+    <div class="layui-col-md12">
+        <div class="layui-card">
+            <div class="layui-card-header d-flex justify-content-between align-items-center">
+                <h3>{$vo.catname}</h3>
+                <a class="more" href="{$vo.url}" target="{$vo.target}" title="{$vo.catname}">更多+</a>
+            </div>
+            <div class="layui-card-body">
+                <ul class="download-list layui-row layui-col-space16">
+                    {yzn module="cms" action="lists" catid="$vo['id']" cache="3600" order="publish_time DESC" num="5" return="data" moreinfo="1"}
+                    {volist name="data" id="vo" key="j"}
+                    <li class="download-item layui-col-lg2 layui-col-md3 layui-col-sm6 text-center">
+                        <div class="download-box">
+                            <a href="{$vo.url}">
+                                <div class="d-flex download-thumb align-items-center justify-content-center">
+                                    {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>220 × 200</font>{/if}
+                                </div>
+                            </a>
+                            <div class="download-info">
+                                <h3 class="download-title"><a href="{$vo.url}">{$vo.title}</a></h3>
+                            </div>
+                            <a href="{$vo.url}" class="layui-btn layui-bg-blue layui-btn-sm layui-btn-fluid">{:cms_t('download','下载')}</a>
+                        </div>
+                    </li>
+                    {/volist}
+                    {/yzn}
+                    <div class="layui-clear"></div>
+                </ul>
+            </div>
+        </div>
+    </div>
+    {if $i % 2 == 0}
+    <div class="layui-clear" style="padding: 0;"></div>
+    {/if}
+    {/volist}
+    {/yzn}
+</div>
+{include file="footer" /}

File diff suppressed because it is too large
+ 199 - 0
templates/xtu/cms/category_download.html.bak_dji_style_20260513_133604


File diff suppressed because it is too large
+ 199 - 0
templates/xtu/cms/category_download.html.bak_title_size_20260513_133726


+ 60 - 0
templates/xtu/cms/category_job.html

@@ -0,0 +1,60 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/job.css?v=20260506-2118">
+
+{php}
+$jobHeroTitle = trim((string)($category['catname'] ?? cms_t('job_join_us','加入我们')));
+$jobHeroDesc = trim((string)(getCategory($catid, 'description') ?: ($category['description'] ?? '')));
+{/php}
+
+<main class="job-page job-list-page job-simple-list-page job-channel-page">
+  <section class="job-channel-banner">
+    <div class="job-channel-banner-bg" aria-hidden="true"></div>
+    <div class="job-channel-banner-mask" aria-hidden="true"></div>
+    <div class="content-1300-wrap">
+      <div class="job-channel-banner-content">
+        <nav class="job-dji-breadcrumb job-channel-breadcrumb" aria-label="breadcrumb">
+          <a href="{:cms_lang_url(addon_url('cms/index/index'))}">{:cms_t('home','首页')}</a>
+          <span>/</span>
+          <em>{$jobHeroTitle}</em>
+        </nav>
+        <h1>{$jobHeroTitle}</h1>
+        {if $jobHeroDesc !== ''}<p>{$jobHeroDesc}</p>{else /}<p>{:cms_t('job_default_intro','在 XTU,把专业能力投入真实场景,与团队一起创造长期价值。')}</p>{/if}
+        <div class="job-channel-banner-actions">
+          <a href="#jobChannelCats" class="job-channel-primary-link">{:cms_t('job_view_categories','查看招聘栏目')} <i class="bi bi-arrow-down-short"></i></a>
+          <span><i class="bi bi-geo-alt"></i> {:cms_t('job_multi_direction','多岗位方向')}</span>
+          <span><i class="bi bi-lightning-charge"></i> {:cms_t('job_quick_apply','快速投递')}</span>
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <section class="job-channel-section" id="jobChannelCats">
+    <div class="content-1300-wrap">
+      <div class="job-channel-head">
+        <h2>{:cms_t('job_types','招聘类型')}</h2>
+        <p>{:cms_t('job_select_category_desc','请选择招聘栏目查看对应岗位。')}</p>
+      </div>
+      <div class="job-channel-grid">
+        {yzn module="cms" action="category" catid="$catid" cache="3600" order="listorder DESC,id ASC" num="12" return="jobCats"}
+        {volist name="jobCats" id="nav" key="k"}
+        <a class="job-channel-card" href="{$nav.url}" target="{$nav.target|default='_self'}">
+          <div class="job-channel-icon">
+            {if stripos($nav.catname,'校') !== false}<i class="bi bi-mortarboard"></i>{elseif stripos($nav.catname,'实习') !== false /}<i class="bi bi-person-workspace"></i>{else /}<i class="bi bi-briefcase"></i>{/if}
+          </div>
+          <div>
+            <h3>{$nav.catname}</h3>
+            {php}$navDesc = trim((string)(getCategory($nav['id'], 'description') ?: ($nav['description'] ?? '')));{/php}
+            {if $navDesc !== ''}<p>{$navDesc}</p>{else /}<p>{:cms_t('job_view_category_jobs_prefix','查看')}{$nav.catname}{:cms_t('job_view_category_jobs_suffix','相关开放岗位。')}</p>{/if}
+          </div>
+          <span>{:cms_t('job_enter_category','进入栏目')} <i class="bi bi-arrow-right"></i></span>
+        </a>
+        {/volist}
+        {/yzn}
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+{include file="footer" /}

+ 51 - 0
templates/xtu/cms/category_product.html

@@ -0,0 +1,51 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/product-channel.css?v=20260422-1519">
+
+<main class="product-channel-page">
+  <section class="product-subnav-strip">
+    <div class="content-1300-wrap">
+      <div class="product-subnav-row">
+        {yzn module="cms" action="category" catid="$top_parentid" cache="3600" order="listorder desc,id ASC" num="12" return="data"}
+        {volist name="data" id="nav"}
+        <a class="product-subnav-item {if $nav.id==$catid}active{/if}" href="{$nav.url}" target="{$nav.target|default='_self'}">
+          <span class="product-subnav-icon"><i class="bi bi-grid"></i></span>
+          <span class="product-subnav-label">{$nav.catname}</span>
+        </a>
+        {/volist}
+        {/yzn}
+      </div>
+    </div>
+  </section>
+
+  <section class="product-channel-hero">
+    <div class="content-1300-wrap text-center">
+      <h1>{if getCategory($catid,'catname')}{:getCategory($catid,'catname')}{else /}{$category.catname|default=''}{/if}</h1>
+      <p>{if getCategory($catid,'description')}{:getCategory($catid,'description')}{elseif !empty($category.description) /}{$category.description}{else /}{:cms_t('product_channel_default_desc','探索适合你的产品,了解核心亮点、适用场景与支持服务。')}{/if}</p>
+    </div>
+  </section>
+
+  <section class="product-gallery-section">
+    <div class="product-gallery-shell">
+      <div class="product-gallery-grid">
+        {yzn module="cms" action="lists" catid="$catid" cache="3600" order="listorder desc,id desc" num="12" return="data" moreinfo="1"}
+        {volist name="data" id="vo" key="k"}
+        <article class="product-gallery-card {if $k==1}product-gallery-card-wide{/if}">
+          <img src="{$vo.image|default=$vo.thumb|default='/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png'}" alt="{$vo.title}">
+          <div class="product-gallery-copy {if $k==1}product-gallery-copy-wide{/if}">
+            {if !empty($vo.subtitle)}<span class="product-gallery-kicker">{$vo.subtitle}</span>{/if}
+            <h3>{$vo.title}</h3>
+            {if !empty($vo.description)}<p>{$vo.description|strip_tags|mb_substr=0,120,'utf-8'}</p>{/if}
+            <div class="product-gallery-actions">
+              <a class="product-cta product-cta-more" href="{$vo.url}">{:cms_t('learn_more','了解更多')}</a>
+              <a class="product-cta product-cta-buy" href="#">{:cms_t('buy_now','立即购买')}</a>
+            </div>
+          </div>
+        </article>
+        {/volist}
+        {/yzn}
+      </div>
+    </div>
+  </section>
+</main>
+
+{include file="footer" /}

+ 65 - 0
templates/xtu/cms/category_support.html

@@ -0,0 +1,65 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/support.css?v=20260422-0910">
+
+<main class="support-page">
+  <section class="support-search-hero" style="--support-hero-bg:url('{$category.image|default='/uploads/20260410/c58114e6547fd339fef54edd2151c0b7.jpg'}')">
+    <div class="support-container support-search-hero-inner">
+      <h1>{if getCategory($catid,'catname')}{:getCategory($catid,'catname')}{else /}{:cms_t('support_default_title','服务与支持')}{/if}</h1>
+      <p>{:getCategory($catid,'description')}</p>
+      <form class="support-search-bar" action="{:cms_lang_url(addon_url('cms/search/index'))}" method="get">
+        <input type="hidden" name="tab" value="help">
+        <div class="support-search-field">
+          <i class="bi bi-search"></i>
+          <input type="text" name="q" placeholder="{:cms_t('support_search_placeholder','输入关键词搜索')}" autocomplete="off">
+        </div>
+        <button class="support-search-submit" type="submit">{:cms_t('support_search','搜索')}</button>
+      </form>
+    </div>
+  </section>
+
+  <section class="support-main support-container">
+    <section class="support-product-section">
+      <div class="support-product-heading">
+        <h2>{:cms_t('support_select_product','产品支持')}</h2>
+      </div>
+        <?php
+            $cwhere = 'modelid=2';
+        ?>
+      <div class="support-product-tabs" role="tablist" aria-label="{:cms_t('support_product_categories','产品分类')}">
+        {yzn module="cms" action="category" where="modelid=2 and status=1"  order="listorder DESC,id ASC" num="24" return="supportProductCategories"}
+        {volist name="supportProductCategories" id="productCat" key="k"}
+        <button class="support-product-tab {if $k==1}is-active{/if}" type="button" role="tab" aria-selected="{if $k==1}true{else /}false{/if}" data-target="support-product-panel-{$productCat.id}">{$productCat.catname}</button>
+        {/volist}
+        {/yzn}
+      </div>
+
+      <div class="support-product-panels">
+        {yzn module="cms" action="category" modelid="2"  order="listorder DESC,id ASC" num="4" return="supportPanelCategories"}
+        {volist name="supportPanelCategories" id="productCat" key="k"}
+        <div class="support-product-panel {if $k==1}is-active{/if}" id="support-product-panel-{$productCat.id}" role="tabpanel" {if $k!=1}hidden{/if}>
+          <div class="support-product-showcase-grid{if $k!=1}-classic{/if}">
+            {yzn module="cms" action="lists" modelid="2" catid="$productCat['id']" num="100" order="listorder desc,id desc" moreinfo="1" return="supportProducts"}
+            {volist name="supportProducts" id="vo"}
+            <a class="support-product-showcase-item" href="{:getCategory(26,'url')}?project={$vo.id}">
+              <span class="support-product-showcase-media">
+                <img src="{$vo.thumb}" alt="{$vo.title}">
+              </span>
+              <h3>{$vo.title}</h3>
+            </a>
+            {/volist}
+            {/yzn}
+          </div>
+        </div>
+        {/volist}
+        {/yzn}
+      </div>
+    </section>
+
+    {include file="support-contact-block" /}
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/support.js?v=20260410-2041"></script>
+{include file="footer" /}

+ 93 - 0
templates/xtu/cms/category_support.html.bak.20260514161655

@@ -0,0 +1,93 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/support.css?v=20260422-0910">
+
+<main class="support-page">
+  <section class="support-search-hero" style="--support-hero-bg:url('{$category.image|default='/uploads/20260410/c58114e6547fd339fef54edd2151c0b7.jpg'}')">
+    <div class="support-container support-search-hero-inner">
+      <h1>{if getCategory($catid,'catname')}{:getCategory($catid,'catname')}{else /}{:cms_t('support_default_title','服务与支持')}{/if}</h1>
+      <p>{:getCategory($catid,'description')}</p>
+      <form class="support-search-bar" action="{:cms_lang_url(addon_url('cms/search/index'))}" method="get">
+        <input type="hidden" name="tab" value="help">
+        <div class="support-search-field">
+          <i class="bi bi-search"></i>
+          <input type="text" name="q" placeholder="{:cms_t('support_search_placeholder','输入关键词搜索')}" autocomplete="off">
+        </div>
+        <button class="support-search-submit" type="submit">{:cms_t('support_search','搜索')}</button>
+      </form>
+    </div>
+  </section>
+
+  <section class="support-main support-container">
+    <section class="support-product-section">
+      <div class="support-product-heading">
+        <h2>{:cms_t('support_select_product','产品支持')}</h2>
+      </div>
+        <?php
+            $cwhere = 'modelid=2';
+        ?>
+      <div class="support-product-tabs" role="tablist" aria-label="{:cms_t('support_product_categories','产品分类')}">
+        {yzn module="cms" action="category" where="modelid=2"  order="listorder DESC,id ASC" num="24" return="supportProductCategories"}
+        {volist name="supportProductCategories" id="productCat" key="k"}
+        <button class="support-product-tab {if $k==1}is-active{/if}" type="button" role="tab" aria-selected="{if $k==1}true{else /}false{/if}" data-target="support-product-panel-{$productCat.id}">{$productCat.catname}</button>
+        {/volist}
+        {/yzn}
+      </div>
+
+      <div class="support-product-panels">
+        {yzn module="cms" action="category" modelid="2"  order="listorder DESC,id ASC" num="4" return="supportPanelCategories"}
+        {volist name="supportPanelCategories" id="productCat" key="k"}
+        <div class="support-product-panel {if $k==1}is-active{/if}" id="support-product-panel-{$productCat.id}" role="tabpanel" {if $k!=1}hidden{/if}>
+          <div class="support-product-showcase-grid{if $k!=1}-classic{/if}">
+            {yzn module="cms" action="lists" modelid="2" catid="$productCat['id']" num="100" orderby="listorder asc,id desc" moreinfo="1" return="supportProducts"}
+            {volist name="supportProducts" id="vo"}
+            <a class="support-product-showcase-item" href="{:getCategory(26,'url')}?project={$vo.id}">
+              <span class="support-product-showcase-media">
+                <img src="{$vo.image|default='/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png'}" alt="{$vo.title}">
+              </span>
+              <h3>{$vo.title}</h3>
+            </a>
+            {/volist}
+            {/yzn}
+          </div>
+        </div>
+        {/volist}
+        {/yzn}
+      </div>
+    </section>
+
+    <section class="support-quick-section">
+      <div class="support-quick-heading">
+        <h2>{:cms_t('support_quick_services','快捷服务')}</h2>
+      </div>
+      <div class="support-quick-service-grid">
+        <a class="support-quick-service-card" href="javascript:;">
+          <span class="support-quick-service-icon"><i class="bi bi-headset"></i></span>
+          <h3>{:cms_t('support_online_service','在线支持')}</h3>
+          <p>{:cms_t('support_online_service_desc','工作时间内获取人工帮助与技术支持')}</p>
+        </a>
+        <a class="support-quick-service-card" href="javascript:;">
+          <span class="support-quick-service-icon"><i class="bi bi-tools"></i></span>
+          <h3>{:cms_t('support_repair_service','维修服务')}</h3>
+          <p>{:cms_t('support_repair_service_desc','提交售后申请,查看维修进度与服务政策')}</p>
+        </a>
+        <a class="support-quick-service-card" href="javascript:;">
+          <span class="support-quick-service-icon"><i class="bi bi-cloud-arrow-down"></i></span>
+          <h3>{:cms_t('support_download_center','下载中心')}</h3>
+          <p>{:cms_t('support_download_center_desc','快速下载说明书、资料与相关软件内容')}</p>
+        </a>
+        <a class="support-quick-service-card" href="javascript:;">
+          <span class="support-quick-service-icon"><i class="bi bi-chat-square-dots"></i></span>
+          <h3>{:cms_t('support_feedback','意见反馈')}</h3>
+          <p>{:cms_t('support_feedback_desc','提交建议与问题,帮助我们持续优化产品体验')}</p>
+        </a>
+      </div>
+    </section>
+
+    {include file="support-contact-block" /}
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/support.js?v=20260410-2041"></script>
+{include file="footer" /}

+ 25 - 0
templates/xtu/cms/common/index_ajax.html

@@ -0,0 +1,25 @@
+{yzn module="cms" action="lists" catid="1" cache="3600" order="publish_time DESC" page="$page" simple="true" num="5" return="data" moreinfo="1"}
+{volist name="data" id="vo"}
+<li class="d-flex article-item-card">
+    <a href="{$vo.url}">
+        <div class="d-flex article-thumb align-items-center justify-content-center">
+            {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>220 × 200</font>{/if}
+        </div>
+    </a>
+    <div class="article-info">
+        <h3 class="article-title"><a href="{$vo.url}">{$vo.title}</a></h3>
+        <div class="article-meta d-flex align-items-center">
+            <span>{:getCategory($vo['catid'],'catname')}</span>
+            <span class="meta-dot"></span>
+            <span>{$vo.publish_time|date="Y-m-d"}</span>
+            <span class="meta-dot"></span>
+            <span>{$vo.hits}浏览</span>
+        </div>
+        <div class="article-abstract text-ellipsis-2">
+            {$vo.description|str_cut=###,80}
+        </div>
+    </div>
+</li>
+{/volist}
+{/yzn}
+{$pages|raw}

+ 27 - 0
templates/xtu/cms/common/list_ajax.html

@@ -0,0 +1,27 @@
+{yzn module="cms" action="order" modelid="$modelid" order="listorder desc" return="order"}
+{yzn module="cms" action="lists" catid="$catid" cache="3600" order="$order['data']??''" page="$page" simple="true" num="10" return="data" moreinfo="1"}
+{volist name="data" id="vo"}
+<li class="d-flex article-item-card">
+    <a href="{$vo.url}">
+        <div class="d-flex article-thumb align-items-center justify-content-center">
+            {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>220 × 200</font>{/if}
+        </div>
+    </a>
+    <div class="article-info">
+        <h3 class="article-title"><a href="{$vo.url}">{$vo.title}</a></h3>
+        <div class="article-meta d-flex align-items-center">
+            <span>{:getCategory($vo['catid'],'catname')}</span>
+            <span class="meta-dot"></span>
+            <span>{$vo.publish_time|date="Y-m-d"}</span>
+            <span class="meta-dot"></span>
+            <span>{$vo.hits}浏览</span>
+        </div>
+        <div class="article-abstract text-ellipsis-2">
+            {$vo.description|str_cut=###,80}
+        </div>
+    </div>
+</li>
+{/volist}
+{/yzn}
+{/yzn}
+{$pages|raw}

+ 60 - 0
templates/xtu/cms/common/sider.html

@@ -0,0 +1,60 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h3>{:cms_t('recommended_news','推荐资讯')}</h3>
+    </div>
+    <div class="layui-card-body">
+        <ul class="recommend-list">
+            {yzn module="cms" action="lists" flag="1" catid="1" cache="3600" order="listorder DESC" num="5" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}
+            <li class="recommend-item align-items-center d-flex">
+                <div class="recommend-number d-flex align-items-center justify-content-center">{$i}</div>
+                <div class="recommend-content">
+                    <h3 class="recommend-title"><a href="{$vo.url}" title="{$vo.title}">{$vo.title}</a></h3>
+                </div>
+            </li>
+            {/volist}
+            {/yzn}
+        </ul>
+    </div>
+</div>
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h3>{:cms_t('popular_tags','热门标签')}</h3>
+    </div>
+    <div class="layui-card-body">
+        <div class="tag-cloud d-flex flex-wrap">
+            {get sql="select * from yzn_cms_tags" order="hits DESC" num="30" cache="600" return="data"}
+            {volist name="data" id="vo"}
+                <a class="tag" href="{:addon_url('cms/tags/index',[':tag'=>$vo['tag']])}" alt="{$vo.tag}" title="{$vo.tag}">{$vo.tag}</a>
+            {/volist}
+            {/get}
+        </div>
+    </div>
+</div>
+
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h3>{:cms_t('resource_downloads','资源下载')}</h3>
+    </div>
+    <div class="layui-card-body">
+        <ul class="down-ul">
+            {yzn module="cms" action="lists" catid="3" cache="3600" order="listorder DESC" num="5" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}
+            <li class="down-item">
+                <div class="down-info">
+                    <h3 class="down-title"><a href="{$vo.url}" title="{$vo.title}">{$vo.title}</a></h3>
+                    <div class="down-meta d-flex align-items-center">
+                        <span>{:getCategory($vo['catid'],'catname')}</span>
+                        <span class="meta-dot"></span>
+                        <span>{$vo.publish_time|date="Y-m-d"}</span>
+                    </div>
+                    <a href="{$vo.url}" class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs">{:cms_t('download','下载')}</a>
+                </div>
+            </li>
+            {/volist}
+            {/yzn}
+        </ul>
+    </div>
+</div></ul>
+    </div>
+</div>

+ 135 - 0
templates/xtu/cms/footer-links.html

@@ -0,0 +1,135 @@
+<section class="section-space footer-links-section footer-dual-section">
+        <div class="content-1300-wrap">
+          <div class="footer-dual-layout">
+            <div class="footer-left-panel">
+              <div class="footer-nav-grid">
+                <div class="footer-nav-col">
+                  <h3>
+                    {:cms_t('footer_hot_products','热门产品分类')}
+                  </h3>
+                   {yzn module="cms" action="category" where="modelid=2 and status=1"  order="listorder DESC,id ASC" num="24" return="supportProductCategories"}
+        {volist name="supportProductCategories" id="productCat" key="k"}
+                  <a href="{$productCat.url}">{$productCat.catname}</a>
+           {/volist}
+        {/yzn}
+ 
+                </div>
+                <div class="footer-nav-col">
+                  <h3>
+                    {:cms_t('footer_online_store','线上商城')}
+                  </h3>
+                  <a href="#">
+                    {:cms_t('footer_official_store','官方商城')}
+                  </a>
+                  <a href="https://mall.jd.com/index-807701.html">
+                    {:cms_t('footer_platform_channel','平台官方渠道')}
+                  </a>
+                </div>
+                <div class="footer-nav-col">
+                  <h3>
+                   {:getCategory(24,'catname')}
+                  </h3>
+                  <a href="{:getCategory(24,'url')}">{:getCategory(24,'catname')}</a>
+                      <a href="{:getCategory(27,'url')}">{:getCategory(27,'catname')}</a>
+                      <a href="{:getCategory(45,'url')}">{:getCategory(45,'catname')} </a>
+                      <a href="{:getCategory(44,'url')}">{:getCategory(44,'catname')}</a>
+                </div>
+                <div class="footer-nav-col">
+                  <h3>
+                    {:cms_t('footer_partnership','申请合作')}
+                  </h3>
+                  <a href="{:getCategory(60,'url')}">
+                    {:getCategory(60,'catname')}
+                  </a>
+                  <a href="{:getCategory(55,'url')}">
+                    {:getCategory(55,'catname')}
+                  </a>
+                </div>
+                <div class="footer-nav-col">
+                  <h3>
+                   {:getCategory(28,'catname')}
+                  </h3>
+                   {yzn module="cms" action="category" catid="28" order="listorder DESC" num="10" return="data"}
+                  {volist name="data" id="vo"}
+                    <a href="{$vo.url}">{$vo.catname}</a>
+                  {/yzn}
+                  {/volist}
+                </div>
+              </div>
+            </div>
+            <aside class="footer-right-panel">
+              <div class="footer-side-card footer-subscribe-card premium-subscribe-card compact-subscribe-card">
+                <div class="premium-subscribe-top compact-subscribe-top footer-subscribe-heading-block">
+                  <h3 class="footer-subscribe-title">
+                    {:cms_t('footer_subscribe_us','订阅我们')}
+                  </h3>
+                  <p class="premium-subscribe-desc footer-subscribe-desc-text">
+                    {:cms_t('footer_subscribe_desc','获取新品发布与品牌动态')}
+                  </p>
+                </div>
+                <div class="footer-form-box footer-form-dark premium-form-box compact-form-box">
+                  <form class="footer-subscribe-form" id="footerSubscribeForm" action="javascript:;" method="post" novalidate>
+                    <input type="hidden" name="source_page" id="footerSubscribeSourcePage" value="">
+                    <input type="hidden" name="source_key" value="footer">
+                    <div class="footer-input-wrap premium-input-wrap compact-input-wrap">
+                      <input type="email" name="email" id="footerSubscribeEmail" class="footer-email-input footer-email-dark premium-email-input" maxlength="191" placeholder="{:cms_t('footer_email_placeholder','请输入邮箱地址')}">
+                      <button class="footer-mail-btn premium-mail-btn" id="footerSubscribeBtn" aria-label="{:cms_t('footer_subscribe_submit','提交')}" type="submit">
+                        {:cms_t('footer_subscribe','订阅')}
+                      </button>
+                    </div>
+                    <div class="footer-subscribe-message footer-subscribe-message-inline" id="footerSubscribeMessage" aria-live="polite"></div>
+                    <label class="footer-subscribe-consent" for="footerSubscribeConsent">
+                      <input type="checkbox" name="privacy_agree" id="footerSubscribeConsent" value="1">
+                      <span>
+                        {:cms_t('footer_subscribe_privacy_agree','我已阅读并同意')}
+                        <a href="{:getCategory(44,'url')}" target="_blank" rel="noopener noreferrer">{:getCategory(44,'catname')}</a>
+                        {:cms_t('footer_subscribe_privacy_suffix',',我同意通过邮箱接收XTU骁途优惠商业信息和最新动态。我可以随时联系XTU骁途取消订阅。')}
+                      </span>
+                    </label>
+                  </form>
+                </div>
+              </div>
+              <div class="footer-social-block compact-social-block footer-social-block-corner">
+                <div class="footer-social-row premium-social-row compact-social-row footer-quick-social-row">
+                  {yzn module="cms" action="lists" catid="47" order="listorder ASC,id ASC" num="20" moreinfo="1" return="footerQuickLinks"}
+                  {volist name="footerQuickLinks" id="vo"}
+                  {php}
+                  $quickLinkUrl = trim((string)($vo['tourl'] ?? ''));
+                  $quickHasUrl = $quickLinkUrl !== '' && strtolower($quickLinkUrl) !== 'javascript:;';
+                  $quickHasQr = !empty($vo['thumb']);
+                  {/php}
+                  {if $quickHasUrl}
+                  <a class="footer-social-item premium-social-item footer-quick-social-item" href="{$quickLinkUrl}" title="{$vo.title}" target="_blank" rel="noopener noreferrer">
+                  {else /}
+                  <div class="footer-social-item premium-social-item footer-quick-social-item footer-quick-social-item-static" title="{$vo.title}">
+                  {/if}
+                    <span class="social-dot premium-social-dot footer-quick-social-dot">
+                      {if !empty($vo.thumb_1)}
+                      <img class="footer-quick-social-icon footer-quick-social-icon-default" src="{$vo.thumb_1}" alt="{$vo.title}">
+                      {/if}
+                      {if !empty($vo.thumb_2)}
+                      <img class="footer-quick-social-icon footer-quick-social-icon-hover" src="{$vo.thumb_2}" alt="{$vo.title}">
+                      {/if}
+                      {if empty($vo.thumb_1) && empty($vo.thumb_2)}
+                      <span class="footer-quick-social-text">{$vo.title|mb_substr=0,1,'utf-8'}</span>
+                      {/if}
+                    </span>
+                    {if $quickHasQr}
+                    <div class="footer-qr-pop premium-qr-pop footer-quick-qr-pop">
+                      <img src="{$vo.thumb}" alt="{$vo.title}">
+                      <span>{$vo.title}</span>
+                    </div>
+                    {/if}
+                  {if $quickHasUrl}
+                  </a>
+                  {else /}
+                  </div>
+                  {/if}
+                  {/volist}
+                  {/yzn}
+                </div>
+              </div>
+            </aside>
+          </div>
+        </div>
+      </section>

+ 219 - 0
templates/xtu/cms/footer.html

@@ -0,0 +1,219 @@
+    <div class="custom-modal" id="languageModal" aria-hidden="true">
+      <div class="custom-modal-dialog custom-modal-dialog-language">
+        <div class="custom-modal-box language-modal-box">
+          <div class="custom-modal-head language-modal-head">
+            <div>
+              <h2 class="modal-title">
+                {:cms_t('choose_language_region','请选择您的国家与地区')}
+              </h2>
+            </div>
+            <button class="custom-modal-close" data-close-modal="languageModal" aria-label="{:cms_t('close','关闭')}">
+              ×
+            </button>
+          </div>
+          <div class="custom-modal-body">
+            <div class="language-list premium-language-list">
+             {if !empty($site_regions)}
+             {volist name="site_regions" id="region"}
+              <a class="language-option premium-language-option {if !empty($site_region) && strtoupper($site_region['code']) == strtoupper($region['code'])}active{/if}" href="{:cms_switch_region_url($region['code'])}">
+                <span class="premium-language-option-country">{$region.name|default=$region.code}</span>
+                <span class="premium-language-option-lang">{:cms_region_lang_label($region['lang'])}</span>
+              </a>
+              {/volist}
+              {/if}
+            </div>
+
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="site-floating-tools" aria-label="{:cms_t('floating_tools','快捷操作')}">
+      <button class="site-floating-tool site-floating-tool-top" type="button" id="backToTopBtn" aria-label="{:cms_t('back_to_top','返回顶部')}">
+        <span class="site-floating-tool-btn"><i class="bi bi-chevron-up"></i></span>
+        <span class="site-floating-tool-text">{:cms_t('back_to_top','返回顶部')}</span>
+      </button>
+
+      <div class="site-floating-tool site-floating-tool-service" tabindex="0" aria-label="{:getCategory(58,'catname')}">
+        <div class="site-floating-tool-panel support-float-panel">
+          <div class="support-float-card-list">
+            {yzn module="cms" action="lists" catid="58" cache="3600" order="listorder DESC,id ASC" num="3" return="floatServices" moreinfo="1"}
+            {volist name="floatServices" id="vo"}
+            <section class="support-float-card-item">
+              <div class="support-float-card-icon">
+                {if !empty($vo.thumb)}
+                <img src="{$vo.thumb}" alt="{$vo.title}">
+                {else /}
+                <i class="bi bi-headset"></i>
+                {/if}
+              </div>
+              <div class="support-float-card-copy">
+                <h3>{$vo.title}</h3>
+                {if !empty($vo.title1)}<p>{$vo.title1}</p>{/if}
+                {if !empty($vo.title2)}<p>{$vo.title2}</p>{/if}
+                {if !empty($vo.tourl)}
+                <a href="{$vo.tourl}" target="{$vo.target|default='_self'}">{$vo.title} <i class="bi bi-chevron-right"></i></a>
+                {/if}
+              </div>
+            </section>
+            {/volist}
+            {/yzn}
+          </div>
+        </div>
+        <span class="site-floating-tool-avatar">
+          <img src="/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png" alt="{:getCategory(58,'catname')}">
+        </span>
+        <button class="site-floating-tool-btn" type="button" aria-label="{:getCategory(58,'catname')}"><i class="bi bi-headset"></i></button>
+        <span class="site-floating-tool-text">{:getCategory(58,'catname')}</span>
+      </div>
+
+      <div class="site-floating-tool site-floating-tool-feedback" tabindex="0" aria-label="{:cms_t('support_feedback','评价打分')}">
+        <div class="site-floating-tool-panel feedback-float-panel">
+          <form class="feedback-float-form" id="feedbackFloatForm" data-submit-url="{:url('index/feedback/submit')}">
+            <div class="feedback-float-head">
+              <h2 class="feedback-float-title">{:cms_t('feedback_title','您要评价哪个方面:')}</h2>
+            </div>
+            <div class="feedback-float-options" role="radiogroup" aria-label="{:cms_t('feedback_title','您要评价哪个方面:')}">
+              <label class="feedback-float-option is-active">
+                <input type="radio" name="feedback_type" value="website" checked>
+                <span>{:cms_t('feedback_type_website','官网体验(页面浏览/设计)')}</span>
+              </label>
+              <label class="feedback-float-option">
+                <input type="radio" name="feedback_type" value="service">
+                <span>{:cms_t('feedback_type_service','服务体验(售后/客服)')}</span>
+              </label>
+              <label class="feedback-float-option">
+                <input type="radio" name="feedback_type" value="product">
+                <span>{:cms_t('feedback_type_product','产品体验(产品/配套软件)')}</span>
+              </label>
+            </div>
+            <div class="feedback-float-divider"></div>
+            <div class="feedback-float-rating-block">
+              <h3>{:cms_t('feedback_rate_prompt','请对“官网体验”进行评价。')}</h3>
+              <div class="feedback-float-stars" data-rating="0">
+                <button type="button" class="feedback-star" data-value="1" aria-label="1 星">★</button>
+                <button type="button" class="feedback-star" data-value="2" aria-label="2 星">★</button>
+                <button type="button" class="feedback-star" data-value="3" aria-label="3 星">★</button>
+                <button type="button" class="feedback-star" data-value="4" aria-label="4 星">★</button>
+                <button type="button" class="feedback-star" data-value="5" aria-label="5 星">★</button>
+              </div>
+              <input type="hidden" name="rating" id="feedbackFloatRating" value="0">
+              <input type="hidden" name="source_page" value="">
+            </div>
+            <button class="feedback-float-submit" id="feedbackFloatSubmit" type="submit" disabled>{:cms_t('submit','提交')}</button>
+            <div class="feedback-float-message" id="feedbackFloatMessage"></div>
+          </form>
+        </div>
+        <button class="site-floating-tool-btn" type="button" aria-label="{:cms_t('support_feedback','评价打分')}"><i class="bi bi-clipboard-check"></i></button>
+        <span class="site-floating-tool-text">{:cms_t('support_feedback','评价打分')}</span>
+      </div>
+    </div>
+    <footer class="site-footer">
+      <div class="content-1300-wrap site-footer-inner">
+        <div class="site-footer-top">
+          <div class="site-footer-links">
+            <a href="{:getCategory(42,'url')}">{:getCategory(42,'catname')}</a>
+            <span class="footer-divider">|</span>
+            <a href="{:getCategory(45,'url')}">{:getCategory(45,'catname')}</a>
+            <span class="footer-divider">|</span>
+            <a href="{:getCategory(44,'url')}">{:getCategory(44,'catname')}</a>	
+            <span class="footer-divider">|</span>
+            <a href="/d/help/17.html">{:cms_t('cookie_policy','Cookie 政策')}</a>
+          </div>
+          <button class="site-footer-locale" type="button" id="openLanguageModalFooter" aria-label="{:cms_t('switch_language_region','切换国家与地区')}">
+            <i class="bi bi-globe2"></i>
+            <span>
+              {if !empty($site_region)}
+                {:cms_region_display_name($site_region)}
+              {else /}
+                {$site_lang|strtoupper}
+              {/if}
+            </span>
+
+          </button>
+        </div>
+        <div class="site-footer-bottom">
+          <div class="site-footer-meta">
+            <span>Copyright © 2026 xtu All rights reserved.</span>
+            <a href="#">粤ICP备 </a>
+          </div>
+          <div class="site-footer-note">
+            {:cms_t('footer_compliance_note','本网站直接或间接向消费者推销商品或者服务的商业宣传均属于广告(包装及参数、售后保障等商品信息除外)')}
+          </div>
+        </div>
+      </div>
+    </footer>
+    <script src="/assets/xtu/vendor/bootstrap.bundle.min.js"></script>
+    <script src="/assets/xtu/vendor/swiper-bundle.min.js"></script>
+    <script>
+      (function () {
+        const form = document.getElementById('footerSubscribeForm');
+        const emailInput = document.getElementById('footerSubscribeEmail');
+        const submitBtn = document.getElementById('footerSubscribeBtn');
+        const messageBox = document.getElementById('footerSubscribeMessage');
+        const consentInput = document.getElementById('footerSubscribeConsent');
+        const sourcePageInput = document.getElementById('footerSubscribeSourcePage');
+        if (!form || !emailInput) {
+          return;
+        }
+
+        const texts = {
+          invalid: "{:cms_t('footer_subscribe_invalid_email','请输入正确的邮箱地址')}",
+          consent: "{:cms_t('footer_subscribe_privacy_required','请先勾选并同意隐私政策')}",
+          success: "{:cms_t('footer_subscribe_success','订阅成功,请留意邮箱通知')}",
+          failed: "{:cms_t('footer_subscribe_failed','订阅失败,请稍后再试')}",
+          sending: "{:cms_t('footer_subscribe_sending','提交中...')}"
+        };
+
+        function setMessage(text, type) {
+          if (!messageBox) return;
+          messageBox.textContent = text || '';
+          messageBox.className = 'footer-subscribe-message' + (type ? ' is-' + type : '');
+        }
+
+        form.addEventListener('submit', async function (e) {
+          e.preventDefault();
+          const email = (emailInput.value || '').trim();
+          if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
+            emailInput.focus();
+            setMessage(texts.invalid, 'error');
+            return;
+          }
+          if (consentInput && !consentInput.checked) {
+            consentInput.focus();
+            setMessage(texts.consent, 'error');
+            return;
+          }
+
+          if (sourcePageInput) sourcePageInput.value = window.location.href;
+          if (submitBtn) submitBtn.disabled = true;
+          setMessage(texts.sending, 'loading');
+
+          try {
+            const body = new URLSearchParams(new FormData(form));
+            const res = await fetch("{:url('index/emailsubscribe/submit')}", {
+              method: 'POST',
+              headers: {
+                'X-Requested-With': 'XMLHttpRequest',
+                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
+              },
+              body: body.toString()
+            });
+            const data = await res.json();
+            if (data.code === 1) {
+              form.reset();
+              setMessage(data.msg || texts.success, 'success');
+            } else {
+              setMessage(data.msg || texts.failed, 'error');
+            }
+          } catch (err) {
+            setMessage(texts.failed, 'error');
+          } finally {
+            if (submitBtn) submitBtn.disabled = false;
+          }
+        });
+      })();
+    </script>
+    <script src="/assets/xtu/script.js"></script>
+  </body>
+</html>

+ 128 - 0
templates/xtu/cms/header.html

@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="{:cms_html_lang($site_lang ?? '')}">
+  <head>
+    <meta charset="UTF-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1">
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
+    <meta name="renderer" content="webkit">
+    <meta name="force-rendering" content="webkit">
+    <title>{if condition="isset($SEO['title']) && !empty($SEO['title'])"}{$SEO['title']}{/if}{$SEO['site_title']}</title>
+    <meta name="keywords" content="{$SEO['keyword']}" />
+    <meta name="description" content="{$SEO['description']}" />
+    <link rel="stylesheet" href="/assets/xtu/vendor/bootstrap.min.css">
+    <link rel="stylesheet" href="/assets/xtu/vendor/bootstrap-icons.min.css">
+    <link rel="stylesheet" href="/assets/xtu/vendor/swiper-bundle.min.css">
+    <link rel="stylesheet" href="/assets/xtu/shared.css?v=20260428-1538">
+    <link rel="stylesheet" href="/assets/xtu/styles.css?v=20260706-mobile-hero-polish">
+  </head>
+  <body class="{if request()->action()=='index' && request()->controller()=='Index'}page-home{else /}page-inner{/if}">
+    {php}$isHomePage = request()->action() == 'index' && request()->controller() == 'Index';$currentRegionShopUrl = cms_region_shop_url($site_region);$siteLogoLight = $cms_config['site_logo_light'] ?? '/assets/xtu/vendor/img/XTU-logo.png';$siteLogoDark = $cms_config['site_logo_dark'] ?? '';$siteLogoDark = $siteLogoDark ?: $siteLogoLight;{/php}
+    <header class="site-header fixed-top{if !$isHomePage} page-navbar-solid{/if}" id="siteHeader" data-nav-mode="{if $isHomePage}home{else /}inner{/if}">
+      <div class="nav-inner-wrap">
+        <nav class="navbar navbar-expand-lg py-3">
+          <div class="container-fluid px-0 align-items-center nav-shell">
+            <a class="navbar-brand logo me-0" title="{$cms_config.site_name}" href="{:cms_lang_url(addon_url('cms/index/index'))}">
+              <img class="site-logo-img" id="siteLogoImg" src="{$siteLogoLight}" data-logo-light="{$siteLogoLight}" data-logo-dark="{$siteLogoDark}" alt="{$cms_config.site_name}">
+            </a>
+            <div class="collapse navbar-collapse ms-lg-4" id="mainNavbar">
+              <ul class="navbar-nav gap-lg-2 gap-xl-3 align-items-lg-center">
+                {yzn module="cms" action="category" catid="0" order="listorder DESC" num="10" return="data"}
+                  {volist name="data" id="vo"}
+                    {yzn module="cms" action="category" catid="$vo['id']" order="listorder DESC,id ASC" num="100" return="navChildren"}
+                    <li class="nav-item {if !empty($navChildren)}dropdown nav-item-has-children{/if}">
+                      <a class="nav-link {if !empty($navChildren)}dropdown-toggle{/if}" href="{$vo.url}" {if !empty($navChildren)}data-nav-trigger="hover"{/if}>
+                        {$vo.catname}
+                      </a>
+                      {if !empty($navChildren)}
+                      <ul class="dropdown-menu border-0 shadow-lg rounded-0">
+                        {volist name="navChildren" id="child"}
+                        <li>
+                          <a class="dropdown-item" href="{$child.url}" target="{$child.target}" title="{$child.catname}">
+                            {$child.catname}
+                          </a>
+                        </li>
+                        {/volist}
+                      </ul>
+                      {/if}
+                    </li>
+                    {/yzn}
+                  {/volist}
+                {/yzn}
+              </ul>
+              <div class="nav-mobile-extras d-lg-none">
+                <div class="nav-mobile-premium-grid">
+                  <button class="nav-glass-btn nav-mobile-premium-btn" id="openSearchModalMobile">
+                    <span class="nav-glass-icon">
+                      <i class="bi bi-search"></i>
+                    </span>
+                  </button>
+                  <button class="nav-glass-btn nav-mobile-premium-btn" id="openLanguageModalMobile" >
+                    <span class="nav-glass-icon">
+                      <i class="bi bi-globe2"></i>
+                    </span>
+                    <span class="nav-glass-text">
+                      {if !empty($site_region)}{:cms_region_display_name($site_region)}{else /}{$site_lang|strtoupper}{/if}
+                    </span>
+                  </button>
+                  {if !empty($currentRegionShopUrl)}
+                  <a href="{$currentRegionShopUrl}" class="nav-glass-btn nav-glass-btn-shop nav-mobile-premium-btn nav-mobile-premium-wide" target="_blank" rel="noopener noreferrer">
+                    <span class="nav-glass-icon">
+                      <i class="bi bi-bag"></i>
+                    </span>
+                    <span class="nav-glass-text">
+                      {:cms_t('mall','商城')}
+                    </span>
+                  </a>
+                  {/if}
+                </div>
+              </div>
+            </div>
+            <div class="nav-right nav-right-mobile-compact d-flex align-items-center gap-2 ms-auto">
+              <div class="nav-right-desktop-actions d-none d-lg-flex align-items-center gap-2" id="navDesktopActions">
+                <button class="nav-glass-btn" id="openHeaderSearch" type="button">
+                  <span class="nav-glass-icon">
+                    <i class="bi bi-search">
+                    </i>
+                  </span>
+                </button>
+                <button class="nav-glass-btn nav-glass-btn-wide" id="openLanguageModal" aria-label="{:cms_t('switch_region','切换地区')}">
+                  <span class="nav-glass-icon">
+                    <i class="bi bi-globe2">
+                    </i>
+                  </span>
+                  <span class="nav-glass-text">
+                    {if !empty($site_region)}{:cms_region_display_name($site_region)}{else /}{$site_lang|strtoupper}{/if}
+                  </span>
+                </button>
+                {if !empty($currentRegionShopUrl)}
+                <a href="{$currentRegionShopUrl}" class="nav-glass-btn nav-glass-btn-shop" target="_blank" rel="noopener noreferrer">
+                  <span class="nav-glass-icon">
+                    <i class="bi bi-bag">
+                    </i>
+                  </span>
+                  <span class="nav-glass-text">
+                    {:cms_t('mall','商城')}
+                  </span>
+                </a>
+                {/if}
+              </div>
+              <button class="navbar-toggler border-0 shadow-none px-0 ms-1" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar" aria-controls="mainNavbar" aria-expanded="false" aria-label="切换导航">
+                <span class="navbar-toggler-icon">
+                </span>
+              </button>
+            </div>
+            <div class="header-inline-search" id="headerInlineSearch" aria-hidden="true">
+              <form class="header-inline-search-form" action="{:cms_lang_url(addon_url('cms/search/index'))}" method="get" id="headerInlineSearchForm">
+                <input type="hidden" name="modelid" value="0">
+                <span class="header-inline-search-icon"><i class="bi bi-search"></i></span>
+                <input type="search" name="q" id="headerInlineSearchInput" class="header-inline-search-input" placeholder="{:cms_t('search_quick_placeholder','搜索产品、服务、支持内容')}" maxlength="25" autocomplete="off" required>
+                <button type="button" class="header-inline-search-close" id="closeHeaderSearch" aria-label="{:cms_t('close_search','关闭搜索')}">
+                  <i class="bi bi-x-lg"></i>
+                </button>
+              </form>
+            </div>
+          </div>
+        </nav>
+      </div>
+    </header>

+ 128 - 0
templates/xtu/cms/header.html.bak_20260513_132238

@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="{:cms_html_lang($site_lang ?? '')}">
+  <head>
+    <meta charset="UTF-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1">
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
+    <meta name="renderer" content="webkit">
+    <meta name="force-rendering" content="webkit">
+    <title>{if condition="isset($SEO['title']) && !empty($SEO['title'])"}{$SEO['title']}{/if}{$SEO['site_title']}</title>
+    <meta name="keywords" content="{$SEO['keyword']}" />
+    <meta name="description" content="{$SEO['description']}" />
+    <link rel="stylesheet" href="/assets/xtu/vendor/bootstrap.min.css">
+    <link rel="stylesheet" href="/assets/xtu/vendor/bootstrap-icons.min.css">
+    <link rel="stylesheet" href="/assets/xtu/vendor/swiper-bundle.min.css">
+    <link rel="stylesheet" href="/assets/xtu/shared.css?v=20260428-1538">
+    <link rel="stylesheet" href="/assets/xtu/styles.css?v=20260508-1">
+  </head>
+  <body class="{if request()->action()=='index' && request()->controller()=='Index'}page-home{else /}page-inner{/if}">
+    {php}$currentRegionShopUrl = cms_region_shop_url($site_region);{/php}
+    <header class="site-header fixed-top {if request()->action()!='index' || request()->controller()!='Index'}page-navbar-solid{/if}" id="siteHeader" data-nav-mode="{if request()->action()=='index' && request()->controller()=='Index'}home{else /}inner{/if}">
+      <div class="nav-inner-wrap">
+        <nav class="navbar navbar-expand-lg py-3">
+          <div class="container-fluid px-0 align-items-center nav-shell">
+            <a class="navbar-brand logo me-0" title="{$cms_config.site_name}" href="{:cms_lang_url(addon_url('cms/index/index'))}">
+              <img class="site-logo-img" id="siteLogoImg" src="/assets/xtu/vendor/img/XTU-logo.png" data-logo-light="/assets/xtu/vendor/img/XTU-logo.png" data-logo-dark="/assets/xtu/vendor/img/XTU-logo2.png" alt="{$cms_config.site_name}">
+            </a>
+            <div class="collapse navbar-collapse ms-lg-4" id="mainNavbar">
+              <ul class="navbar-nav gap-lg-2 gap-xl-3 align-items-lg-center">
+                {yzn module="cms" action="category" catid="0" order="listorder DESC" num="10" return="data"}
+                  {volist name="data" id="vo"}
+                    {yzn module="cms" action="category" catid="$vo['id']" order="listorder DESC,id ASC" num="100" return="navChildren"}
+                    <li class="nav-item {if !empty($navChildren)}dropdown nav-item-has-children{/if}">
+                      <a class="nav-link {if !empty($navChildren)}dropdown-toggle{/if}" href="{$vo.url}" {if !empty($navChildren)}data-nav-trigger="hover"{/if}>
+                        {$vo.catname}
+                      </a>
+                      {if !empty($navChildren)}
+                      <ul class="dropdown-menu border-0 shadow-lg rounded-0">
+                        {volist name="navChildren" id="child"}
+                        <li>
+                          <a class="dropdown-item" href="{$child.url}" target="{$child.target}" title="{$child.catname}">
+                            {$child.catname}
+                          </a>
+                        </li>
+                        {/volist}
+                      </ul>
+                      {/if}
+                    </li>
+                    {/yzn}
+                  {/volist}
+                {/yzn}
+              </ul>
+              <div class="nav-mobile-extras d-lg-none">
+                <div class="nav-mobile-premium-grid">
+                  <button class="nav-glass-btn nav-mobile-premium-btn" id="openSearchModalMobile">
+                    <span class="nav-glass-icon">
+                      <i class="bi bi-search"></i>
+                    </span>
+                  </button>
+                  <button class="nav-glass-btn nav-mobile-premium-btn" id="openLanguageModalMobile" >
+                    <span class="nav-glass-icon">
+                      <i class="bi bi-globe2"></i>
+                    </span>
+                    <span class="nav-glass-text">
+                      {if !empty($site_region)}{:cms_region_display_name($site_region)}{else /}{$site_lang|strtoupper}{/if}
+                    </span>
+                  </button>
+                  {if !empty($currentRegionShopUrl)}
+                  <a href="{$currentRegionShopUrl}" class="nav-glass-btn nav-glass-btn-shop nav-mobile-premium-btn nav-mobile-premium-wide" target="_blank" rel="noopener noreferrer">
+                    <span class="nav-glass-icon">
+                      <i class="bi bi-bag"></i>
+                    </span>
+                    <span class="nav-glass-text">
+                      {:cms_t('mall','商城')}
+                    </span>
+                  </a>
+                  {/if}
+                </div>
+              </div>
+            </div>
+            <div class="nav-right nav-right-mobile-compact d-flex align-items-center gap-2 ms-auto">
+              <div class="nav-right-desktop-actions d-none d-lg-flex align-items-center gap-2" id="navDesktopActions">
+                <button class="nav-glass-btn" id="openHeaderSearch" type="button">
+                  <span class="nav-glass-icon">
+                    <i class="bi bi-search">
+                    </i>
+                  </span>
+                </button>
+                <button class="nav-glass-btn nav-glass-btn-wide" id="openLanguageModal" aria-label="{:cms_t('switch_region','切换地区')}">
+                  <span class="nav-glass-icon">
+                    <i class="bi bi-globe2">
+                    </i>
+                  </span>
+                  <span class="nav-glass-text">
+                    {if !empty($site_region)}{:cms_region_display_name($site_region)}{else /}{$site_lang|strtoupper}{/if}
+                  </span>
+                </button>
+                {if !empty($currentRegionShopUrl)}
+                <a href="{$currentRegionShopUrl}" class="nav-glass-btn nav-glass-btn-shop" target="_blank" rel="noopener noreferrer">
+                  <span class="nav-glass-icon">
+                    <i class="bi bi-bag">
+                    </i>
+                  </span>
+                  <span class="nav-glass-text">
+                    {:cms_t('mall','商城')}
+                  </span>
+                </a>
+                {/if}
+              </div>
+              <button class="navbar-toggler border-0 shadow-none px-0 ms-1" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar" aria-controls="mainNavbar" aria-expanded="false" aria-label="切换导航">
+                <span class="navbar-toggler-icon">
+                </span>
+              </button>
+            </div>
+            <div class="header-inline-search" id="headerInlineSearch" aria-hidden="true">
+              <form class="header-inline-search-form" action="{:cms_lang_url(addon_url('cms/search/index'))}" method="get" id="headerInlineSearchForm">
+                <input type="hidden" name="modelid" value="0">
+                <span class="header-inline-search-icon"><i class="bi bi-search"></i></span>
+                <input type="search" name="q" id="headerInlineSearchInput" class="header-inline-search-input" placeholder="{:cms_t('search_quick_placeholder','搜索产品、服务、支持内容')}" maxlength="25" autocomplete="off" required>
+                <button type="button" class="header-inline-search-close" id="closeHeaderSearch" aria-label="{:cms_t('close_search','关闭搜索')}">
+                  <i class="bi bi-x-lg"></i>
+                </button>
+              </form>
+            </div>
+          </div>
+        </nav>
+      </div>
+    </header>

+ 271 - 0
templates/xtu/cms/index.html

@@ -0,0 +1,271 @@
+{include file="header" /}
+    <main>
+      <section class="hero-section">
+        <div class="swiper hero-swiper" id="heroSwiper">
+          <div class="swiper-wrapper">
+            {yzn module="cms" action="lists" catid="2" order="listorder DESC" num="5" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}  
+            <div class="swiper-slide hero-slide minimal-hero-slide" data-bullet-title="{$vo.title}" data-is-b="{$vo.is_b|default='0'}">
+              <div class="slide-media-layer">
+                <img class="slide-poster" src="{$vo.thumb}" alt="poster">
+                {if !empty($vo.video)}
+                <video class="slide-video" playsinline preload="metadata" muted loop poster="{$vo.thumb}" data-video-group="hero">
+                  <source src="{$vo.video}" type="video/mp4">
+                </video>
+                {/if}
+              </div>
+              <div class="content-1300-wrap h-100 hero-stage-wrap">
+                <div class="hero-slide-inner h-100 d-flex align-items-center justify-content-center hero-slide-layout">
+                  <div class="hero-copy hero-copy-minimal">
+                    <span class="hero-subtitle">
+                      {$vo.title1}
+                    </span>
+                    <h1>{$vo.title}</h1>
+                    <p class="hero-slogan">
+                      {$vo.title2}
+                    </p>
+                    <div class="hero-actions d-flex justify-content-center flex-wrap gap-3">
+                      <a href="{$vo.tourl}" class="btn {if !empty($vo.is_b)}btn-outline-dark{else /}btn-outline-light{/if} rounded-pill px-4 py-2">
+                        {:cms_t('learn_more','了解更多')}
+                        <i class="bi bi-chevron-right">
+                        </i>
+                      </a>
+                      {if !empty($vo.shopurl)}
+                      <a href="{$vo.shopurl}" class="btn {if !empty($vo.is_b)}btn-outline-dark{else /}btn-outline-light{/if} rounded-pill px-4 py-2" target="_blank" rel="noopener noreferrer">
+                        {:cms_t('buy_now','立即购买')}
+                        <i class="bi bi-chevron-right">
+                        </i>
+                      </a>
+                      {/if}
+                    </div>
+                  </div>
+                  <div class="hero-float-gallery">
+                    {if !empty($vo.thumb_1)}
+                    <div class="hero-float-card hero-float-card-1">
+                      <img src="{$vo.thumb_1}" alt="hero float 1">
+                    </div>
+                    {/if}
+                    {if !empty($vo.thumb_2)}
+                    <div class="hero-float-card hero-float-card-2">
+                      <img src="{$vo.thumb_2}" alt="hero float 2">
+                    </div>
+                    {/if}
+                    {if !empty($vo.thumb_3)}
+                    <div class="hero-float-card hero-float-card-3">
+                      <img src="{$vo.thumb_3}" alt="hero float 3">
+                    </div>
+                    {/if}
+                  </div>
+                </div>
+              </div>
+            </div>
+             {/volist}
+             {/yzn}
+          </div>
+          <button class="hero-arrow hero-prev hero-side-arrow">
+            ‹
+          </button>
+          <button class="hero-arrow hero-next hero-side-arrow">
+            ›
+          </button>
+          <div class="hero-swiper-controls">
+            <div class="swiper-pagination hero-pagination">
+            </div>
+          </div>
+        </div>
+      </section>
+      <section class="section-space image-grid-full hero-next-section-tight product-grid-unified">
+        <div class="container-fluid px-3 product-grid-shell">
+          <div class="row g-2 g-lg-3 product-grid-row">
+           {yzn module="cms" action="lists" modelid="2" where="catid in(5,6,7)" flag="3" order="listorder DESC,id DESC" num="10" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}  
+            <div class="col-12 col-lg-6">
+              <article class="overlay-card flat-card grid-card tall-card">
+                <img src="{$vo.thumb2|default=$vo.thumb}" alt="card">
+                <div class="overlay-copy top-copy product-tile-copy">
+                  <span class="product-subtitle">
+                    {$vo.title1}
+                  </span>
+                  <h3>
+                    {$vo.title}
+                  </h3>
+                  <p>
+                    {$vo.title2}
+                  </p>
+                  <div class="product-links">
+                    <a href="{$vo.url}">
+                      {:cms_t('learn_more','了解更多')} >
+                    </a>
+                    {if !empty($vo.shopurl)}
+                    <a href="{$vo.shopurl}" target="_blank" rel="noopener noreferrer">
+                      {:cms_t('buy_now','立即购买')} >
+                    </a>
+                    {/if}
+                  </div>
+                </div>
+              </article>
+            </div>
+            {/volist}
+             {/yzn}
+            
+          </div>
+        </div>
+      </section>
+      <section class="section-space guide-cards-section guide-section-unified">
+        <div class="guide-section-shell">
+          <div class="row guide-section-row">
+            <div class="col-12">
+              <article class="guide-card image-bg-card guide-card-full guide-card-edge">
+                <img class="guide-bg" src="{:getCategory(41,'image')}" alt="{:getCategory(41,'catname')}">
+                <div class="content-1300-wrap guide-content-wrap">
+                  <div class="guide-copy">
+                  <span class="guide-eyebrow">
+                    {:getCategory(41,'catname')}
+                  </span>
+                  <h3>
+                    {:getCategory(41,'description')}
+                  </h3>
+                  <div class="guide-actions">
+                    <a href="{:getCategory(41,'url')}" class="ui-pill-btn ui-pill-btn-dark">
+                      {:cms_t('product_compare','产品对比')}
+                    </a>
+                    <a href="{:getCategory(41,'url')}" class="guide-link">
+                      {:cms_t('help_me_choose','帮我选择')}
+                    </a>
+                  </div>
+                  </div>
+                </div>
+              </article>
+            </div>
+          </div>
+        </div>
+      </section>
+      <section class="section-space cloud-banner-section cloud-banner-section-unified">
+            
+
+          <article class="cloud-banner-card cloud-banner-card-edge" style="background-image:url('/assets/xtu/vendor/img/appbanner.jpg');">
+            <div class="content-1300-wrap cloud-banner-content-wrap h-100">
+              <div class="cloud-banner-left-half">
+                <div class="cloud-copy cloud-copy-centered text-center text-lg-start">
+                  <div class="cloud-logo-mark">
+                    <img src="/assets/xtu/vendor/img/xtugo.png" alt="{:getCategory(42,'catname')}">
+                  </div>
+                  <div class="cloud-actions">
+                    <a href=" {:getCategory(42,'url')}" class="ui-pill-btn ui-pill-btn-dark" target="_blank">
+                      {:cms_t('learn_more','了解更多')} >
+                    </a>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </article>
+
+      </section>
+      <section class="section-space showcase-slider">
+        <div class="content-1300-wrap showcase-head-wrap">
+          <div class="section-head showcase-section-head mb-4">
+            <h2>
+              走进骁途
+            </h2>
+          </div>
+        </div>
+        <div class="container-fluid px-3 px-lg-4 px-xxl-5">
+          <div class="swiper showcase-swiper" id="showcaseSwiper">
+            <div class="swiper-wrapper">
+            {yzn module="cms" action="lists" catid="12" order="listorder DESC" num="10" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}  
+              <a class="swiper-slide showcase-card equal-card" href="{$vo.tourl}">
+                <img src="{$vo.thumb}" alt="side">
+                <div class="showcase-copy text-center text-white">
+                  <span>
+                    {$vo.title}
+                  </span>
+                  <h3>
+                    {$vo.title1}
+                  </h3>
+                </div>
+              </a>
+               {/volist}
+              
+             {/yzn}
+              
+            </div>
+            <button class="showcase-arrow showcase-prev" aria-label="上一张">
+              <i class="bi bi-chevron-left"></i>
+            </button>
+            <button class="showcase-arrow showcase-next" aria-label="下一张">
+              <i class="bi bi-chevron-right"></i>
+            </button>
+            <div class="swiper-pagination showcase-pagination">
+            </div>
+          </div>
+        </div>
+      </section>
+      <section class="section-space industry-strip-section industry-strip-clean">
+        <div class="content-1300-wrap">
+         
+          {yzn module="cms" action="lists" catid="13" order="listorder DESC" num="1" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}  
+          <div class="row align-items-center g-3 g-lg-4 industry-clean-row">
+            <div class="col-12 col-lg-5">
+              <div class="industry-copy industry-copy-clean text-center text-lg-start">
+                <span class="industry-eyebrow">
+                  {$vo.title}
+                </span>
+                <h2>
+                  {$vo.title1}
+                </h2>
+                <a href="{:getCategory(55,'url')}" class="ui-btn ui-btn-primary">
+                  {:cms_t('learn_more','了解更多')}
+                </a>
+              </div>
+            </div>
+            <div class="col-12 col-lg-7">
+              <div class="industry-image-clean">
+                <img src="{$vo.thumb}" alt="industry visual">
+              </div>
+            </div>
+          </div>
+          
+           {/volist}
+              
+             {/yzn}
+        </div>
+      </section>
+      <section class="section-space support-links-section">
+        <div class="content-1300-wrap">
+             
+          <div class="support-quick-layout">
+            {yzn module="cms" action="lists" catid="58" cache="3600" order="listorder DESC,id ASC" num="4" return="supportQuickServices" moreinfo="1"}
+            <div class="support-quick-row support-quick-row-four">
+              {volist name="supportQuickServices" id="vo" key="k"}
+              {php}
+              $supportQuickUrl = trim((string)($vo['tourl'] ?? ''));
+              $supportQuickTag = ($supportQuickUrl === '') ? 'div' : 'a';
+              {/php}
+              <div class="support-quick-col">
+                {if $supportQuickTag=='a'}
+                <a href="{$supportQuickUrl}" class="support-link-card support-quick-card" target="{$vo.target|default='_self'}">
+                {else /}
+                <div class="support-link-card support-quick-card">
+                {/if}
+                  {if !empty($vo.thumb)}<img class="support-icon" src="{$vo.thumb}" alt="{$vo.title}">{/if}
+                  <div class="support-text">{$vo.title}</div>
+                  {if !empty($vo.title1)}<div class="support-desc">{$vo.title1}</div>{/if}
+                  {if !empty($vo.title2)}<div class="support-desc support-desc-muted">{$vo.title2}</div>{/if}
+                {if $supportQuickTag=='a'}
+                </a>
+                {else /}
+                </div>
+                {/if}
+              </div>
+              {/volist}
+            </div>
+            {/yzn}
+          </div>
+        </div>
+      </section>
+      
+    {include file="footer-links" /}  
+    </main>
+{include file="footer" /}

+ 447 - 0
templates/xtu/cms/index.html.bak-20260409-1047

@@ -0,0 +1,447 @@
+{include file="header" /}
+    <main>
+      <section class="hero-section">
+        <div class="swiper hero-swiper" id="heroSwiper">
+          <div class="swiper-wrapper">
+            {yzn module="cms" action="lists" catid="2" order="listorder DESC" num="5" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}  
+            <div class="swiper-slide hero-slide minimal-hero-slide" data-bullet-title="{$vo.title}">
+              <div class="slide-media-layer">
+                <img class="slide-poster" src="{$vo.thumb}" alt="poster">
+                <video class="slide-video" playsinline preload="none" muted data-video-group="hero">
+                </video>
+              </div>
+              <div class="container-fluid px-3 px-lg-4 px-xxl-5 h-100">
+                <div class="hero-slide-inner h-100 d-flex align-items-center justify-content-center text-center">
+                  <div class="hero-copy hero-copy-minimal">
+                    <span class="hero-subtitle">
+                      {$vo.title1}
+                    </span>
+                    <h1>{$vo.title}</h1>
+                    <p class="hero-slogan">
+                      {$vo.title2}
+                    </p>
+                    <div class="hero-actions d-flex justify-content-center flex-wrap gap-3">
+                      <a href="{$vo.url}" class="btn btn-outline-light rounded-pill px-4 py-2">
+                        {:cms_t('learn_more','了解更多')}
+                        <i class="bi bi-chevron-right">
+                        </i>
+                      </a>
+                      <a href="#" class="btn btn-outline-light rounded-pill px-4 py-2">
+                        {:cms_t('buy_now','立即购买')}
+                        <i class="bi bi-chevron-right">
+                        </i>
+                      </a>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+             {/volist}
+             {/yzn}
+          </div>
+          <button class="hero-arrow hero-prev hero-side-arrow">
+            ‹
+          </button>
+          <button class="hero-arrow hero-next hero-side-arrow">
+            ›
+          </button>
+          <div class="hero-swiper-controls">
+            <div class="swiper-pagination hero-pagination">
+            </div>
+          </div>
+        </div>
+      </section>
+      <section class="section-space image-grid-full">
+        <div class="container-fluid px-3">
+          <div class="row g-2 g-lg-3">
+           {yzn module="cms" action="lists" catid="3" order="listorder DESC" num="10" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}  
+            <div class="col-12 col-lg-6">
+              <article class="overlay-card flat-card grid-card tall-card">
+                <img src="{$vo.thumb}" alt="card">
+                <div class="overlay-copy top-copy product-tile-copy">
+                  <span class="product-subtitle">
+                    {$vo.title1}
+                  </span>
+                  <h3>
+                    {$vo.title}
+                  </h3>
+                  <p>
+                    {$vo.title2}
+                  </p>
+                  <div class="product-links">
+                    <a href="{$vo.url}">
+                      {:cms_t('learn_more','了解更多')} >
+                    </a>
+                    <a href="#">
+                      {:cms_t('buy_now','立即购买')} >
+                    </a>
+                  </div>
+                </div>
+              </article>
+            </div>
+            {/volist}
+             {/yzn}
+            
+          </div>
+        </div>
+      </section>
+      <section class="section-space guide-cards-section">
+        <div class="content-1300-wrap">
+          <div class="row g-3 g-lg-4">
+            <div class="col-12 col-lg-6">
+              <article class="guide-card image-bg-card">
+                <img class="guide-bg" src="https://images.unsplash.com/photo-1516035069371-29a1b244cc32?auto=format&fit=crop&w=1400&q=80" alt="guide visual">
+                <div class="guide-copy">
+                  <span class="guide-eyebrow">
+                    选购指南
+                  </span>
+                  <h3>
+                    {:cms_t('product_compare_and_recommend','产品对比和推荐')}
+                  </h3>
+                  <div class="guide-actions">
+                    <a href="#" class="ui-pill-btn ui-pill-btn-dark">
+                      {:cms_t('product_compare','产品对比')}
+                    </a>
+                    <a href="#" class="guide-link">
+                      {:cms_t('help_me_choose','帮我选择')}
+                    </a>
+                  </div>
+                </div>
+              </article>
+            </div>
+            <div class="col-12 col-lg-6">
+              <article class="guide-card image-bg-card">
+                <img class="guide-bg" src="https://images.unsplash.com/photo-1498049794561-7780e7231661?auto=format&fit=crop&w=1400&q=80" alt="guide visual">
+                <div class="guide-copy">
+                  <span class="guide-eyebrow">
+                    精选配件
+                  </span>
+                  <h3>
+                    官方正品装备,
+                    <br>
+                    让创作更出彩。
+                  </h3>
+                  <div class="guide-actions">
+                    <a href="#" class="ui-pill-btn ui-pill-btn-dark">
+                      立即购买
+                    </a>
+                  </div>
+                </div>
+              </article>
+            </div>
+          </div>
+        </div>
+      </section>
+      <section class="section-space cloud-banner-section">
+        <div class="content-1300-wrap">
+            
+            {yzn module="cms" action="lists" catid="4" order="listorder DESC" num="1" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}  
+          <article class="cloud-banner-card">
+            <div class="row align-items-center g-3 g-lg-4 h-100">
+              <div class="col-12 col-lg-4">
+                <div class="cloud-copy text-center text-lg-start">
+                  <div class="cloud-logo">
+                    {$vo.title}
+                  </div>
+                  <div class="cloud-subtitle">
+                    {$vo.title1}
+                  </div>
+                  <span class="cloud-mini-tag">
+                    {$vo.title2}
+                  </span>
+                  <div class="cloud-actions">
+                    <a href="#" class="ui-pill-btn ui-pill-btn-dark">
+                      了解更多
+                    </a>
+                  </div>
+                </div>
+              </div>
+              <div class="col-12 col-lg-8">
+                <div class="cloud-media-wrap single-device-wrap">
+                  <img class="cloud-device-laptop single-device-image" src="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?auto=format&fit=crop&w=1400&q=80" alt="device preview">
+                </div>
+              </div>
+            </div>
+          </article>
+           {/volist}
+             {/yzn}
+          
+        </div>
+      </section>
+      <section class="section-space showcase-slider">
+        <div class="container-fluid px-3 px-lg-4 px-xxl-5">
+          <div class="section-head text-center mb-4">
+            <h2>
+              三屏同页展示模式
+            </h2>
+          </div>
+          <div class="swiper showcase-swiper" id="showcaseSwiper">
+            <div class="swiper-wrapper">
+              <div class="swiper-slide showcase-card equal-card">
+                <img src="https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=1200&q=80" alt="side">
+                <div class="showcase-copy text-center text-white">
+                  <span>
+                    拍摄设备
+                  </span>
+                  <h3>
+                    AERO MAVIC 4 PRO
+                  </h3>
+                  <div class="showcase-links d-flex justify-content-center gap-4 flex-wrap">
+                    <a href="#">
+                      了解更多
+                    </a>
+                  </div>
+                </div>
+              </div>
+              <div class="swiper-slide showcase-card equal-card">
+                <img src="https://images.unsplash.com/photo-1506744038136-46273834b3fb?auto=format&fit=crop&w=1600&q=80" alt="showcase">
+                <div class="showcase-copy text-center text-white">
+                  <span>
+                    探索场景
+                  </span>
+                  <h3>
+                    LANDSCAPE VISION
+                  </h3>
+                  <div class="showcase-links d-flex justify-content-center gap-4 flex-wrap">
+                    <a href="#">
+                      查看影像
+                    </a>
+                    <a href="#">
+                      探索更多
+                    </a>
+                  </div>
+                </div>
+              </div>
+              <div class="swiper-slide showcase-card equal-card">
+                <img src="https://images.unsplash.com/photo-1441974231531-c6227db76b6e?auto=format&fit=crop&w=1200&q=80" alt="side">
+                <div class="showcase-copy text-center text-white">
+                  <span>
+                    影像表达
+                  </span>
+                  <h3>
+                    CINEMA AERIAL
+                  </h3>
+                  <div class="showcase-links d-flex justify-content-center gap-4 flex-wrap">
+                    <a href="#">
+                      立即了解
+                    </a>
+                  </div>
+                </div>
+              </div>
+              <div class="swiper-slide showcase-card equal-card">
+                <img src="https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?auto=format&fit=crop&w=1200&q=80" alt="side">
+                <div class="showcase-copy text-center text-white">
+                  <span>
+                    旅行创作
+                  </span>
+                  <h3>
+                    ALPINE VIEW
+                  </h3>
+                  <div class="showcase-links d-flex justify-content-center gap-4 flex-wrap">
+                    <a href="#">
+                      查看详情
+                    </a>
+                  </div>
+                </div>
+              </div>
+              <div class="swiper-slide showcase-card equal-card">
+                <img src="https://images.unsplash.com/photo-1500534314209-a25ddb2bd429?auto=format&fit=crop&w=1600&q=80" alt="showcase">
+                <div class="showcase-copy text-center text-white">
+                  <span>
+                    内容创作
+                  </span>
+                  <h3>
+                    CINEMA AERIAL SET
+                  </h3>
+                  <div class="showcase-links d-flex justify-content-center gap-4 flex-wrap">
+                    <a href="#">
+                      立即了解
+                    </a>
+                    <a href="#">
+                      进入专题
+                    </a>
+                  </div>
+                </div>
+              </div>
+              <div class="swiper-slide showcase-card equal-card">
+                <img src="https://images.unsplash.com/photo-1516035069371-29a1b244cc32?auto=format&fit=crop&w=1200&q=80" alt="side">
+                <div class="showcase-copy text-center text-white">
+                  <span>
+                    旗舰设备
+                  </span>
+                  <h3>
+                    PRO SERIES
+                  </h3>
+                  <div class="showcase-links d-flex justify-content-center gap-4 flex-wrap">
+                    <a href="#">
+                      立即购买
+                    </a>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <button class="showcase-arrow showcase-prev">
+              ‹
+            </button>
+            <button class="showcase-arrow showcase-next">
+              ›
+            </button>
+            <div class="swiper-pagination showcase-pagination">
+            </div>
+          </div>
+        </div>
+      </section>
+      <section class="section-space industry-strip-section">
+        <div class="content-1300-wrap">
+          <article class="industry-strip-card">
+            <div class="row align-items-center g-3 g-lg-4">
+              <div class="col-12 col-lg-4">
+                <div class="industry-copy text-center text-lg-start">
+                  <span class="industry-eyebrow">
+                    行业应用
+                  </span>
+                  <h2>
+                    相机创造商机
+                  </h2>
+                  <a href="#" class="ui-btn ui-btn-primary">
+                    了解更多
+                  </a>
+                </div>
+              </div>
+              <div class="col-12 col-lg-8">
+                <div class="industry-gallery">
+                  <div class="industry-main">
+                    <img src="https://images.unsplash.com/photo-1516321318423-f06f85e504b3?auto=format&fit=crop&w=1400&q=80" alt="industry visual">
+                  </div>
+                  <div class="industry-side-grid">
+                    <div class="industry-side large">
+                      <img src="https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=900&q=80" alt="industry visual">
+                    </div>
+                    <div class="industry-side">
+                      <img src="https://images.unsplash.com/photo-1581092918484-8313a64fda0c?auto=format&fit=crop&w=900&q=80" alt="industry visual">
+                    </div>
+                    <div class="industry-side">
+                      <img src="https://images.unsplash.com/photo-1516321497487-e288fb19713f?auto=format&fit=crop&w=900&q=80" alt="industry visual">
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </article>
+        </div>
+      </section>
+      <section class="section-space support-links-section">
+        <div class="content-1300-wrap">
+          <div class="row g-3 g-lg-4">
+            <div class="col-6 col-lg-3">
+              <a href="#" class="support-link-card">
+                <img class="support-icon" src="./vendor/icon-consult.svg" alt="产品专家帮您选购">
+                <div class="support-text">
+                  产品专家帮您选购
+                </div>
+              </a>
+            </div>
+            <div class="col-6 col-lg-3">
+              <a href="#" class="support-link-card">
+                <img class="support-icon" src="./vendor/icon-help.svg" alt="使用帮助">
+                <div class="support-text">
+                  使用帮助
+                </div>
+              </a>
+            </div>
+            <div class="col-6 col-lg-3">
+              <a href="#" class="support-link-card">
+                <span class="support-icon support-bi">
+                  <i class="bi bi-download">
+                  </i>
+                </span>
+                <div class="support-text">
+                  下载
+                </div>
+              </a>
+            </div>
+            <div class="col-6 col-lg-3">
+              <a href="#" class="support-link-card">
+                <span class="support-icon support-bi">
+                  <i class="bi bi-headset">
+                  </i>
+                </span>
+                <div class="support-text">
+                  售后服务
+                </div>
+              </a>
+            </div>
+          </div>
+        </div>
+      </section>
+      <section class="section-space zoom-section business-entry-section">
+        <div class="content-1200-wrap">
+          <div class="section-head text-center business-head">
+            <h2>
+              创新业务入口
+            </h2>
+          </div>
+          <div class="row g-2 g-lg-3 business-row-tight">
+            <div class="col-12 col-lg-4">
+              <article class="zoom-card business-card h-100">
+                <div class="zoom-media">
+                  <img src="https://images.unsplash.com/photo-1497366754035-f200968a6e72?auto=format&fit=crop&w=1400&q=80" alt="module">
+                </div>
+                <div class="business-copy text-center three-line-copy">
+                  <h3>
+                    企业业务展示
+                  </h3>
+                  <p>
+                    适合放企业介绍、主营方向与服务能力概览。
+                  </p>
+                  <a href="#">
+                    了解更多 >
+                  </a>
+                </div>
+              </article>
+            </div>
+            <div class="col-12 col-lg-4">
+              <article class="zoom-card business-card h-100">
+                <div class="zoom-media">
+                  <img src="https://images.unsplash.com/photo-1516321497487-e288fb19713f?auto=format&fit=crop&w=1400&q=80" alt="module">
+                </div>
+                <div class="business-copy text-center three-line-copy">
+                  <h3>
+                    服务能力说明
+                  </h3>
+                  <p>
+                    突出服务流程、交付能力与项目执行优势。
+                  </p>
+                  <a href="#">
+                    了解更多 >
+                  </a>
+                </div>
+              </article>
+            </div>
+            <div class="col-12 col-lg-4">
+              <article class="zoom-card business-card h-100">
+                <div class="zoom-media">
+                  <img src="https://images.unsplash.com/photo-1520607162513-77705c0f0d4a?auto=format&fit=crop&w=1400&q=80" alt="module">
+                </div>
+                <div class="business-copy text-center three-line-copy">
+                  <h3>
+                    合作与生态
+                  </h3>
+                  <p>
+                    这一组更适合放合作伙伴、渠道生态或业务入口。
+                  </p>
+                  <a href="#">
+                    了解更多 >
+                  </a>
+                </div>
+              </article>
+            </div>
+          </div>
+        </div>
+      </section>
+    {include file="footer-links" /}  
+    </main>
+{include file="footer" /}

+ 67 - 0
templates/xtu/cms/list.html

@@ -0,0 +1,67 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/news-list.css?v=20260429-1658">
+
+{php}
+$currentPage = max(1, (int)request()->param('page/d', 1));
+$featuredWhere = "FIND_IN_SET('1', flag)";
+$newsWhere = "(flag='' OR flag IS NULL OR !FIND_IN_SET('1', flag))";
+{/php}
+
+<main class="brand-news-page">
+  <section class="brand-news-hero"{if !empty($category['image'])} style="background-image:url({$category['image']});"{/if}>
+    <div class="content-1300-wrap brand-news-hero-inner">
+      <h1>{$category['catname']|default=''}</h1>
+      {if !empty($category['description'])}
+      <p>{$category['description']}</p>
+      {/if}
+    </div>
+  </section>
+
+  <section class="brand-news-section">
+    <div class="content-1300-wrap">
+      {if $currentPage == 1}
+      {yzn module="cms" action="lists" catid="$catid" where="$featuredWhere" order="listorder DESC,publish_time DESC,id DESC" num="1" return="featuredList" moreinfo="1"}
+      {if !empty($featuredList)}
+      {volist name="featuredList" id="featured"}
+      <article class="brand-news-featured-card">
+        <a class="brand-news-featured-media" href="{$featured.url}">
+          <img src="{if !empty($featured.thumb)}{$featured.thumb}{else /}/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png{/if}" alt="{$featured.title}">
+        </a>
+        <div class="brand-news-featured-copy">
+          <div class="brand-news-kicker">{:getCategory($featured['catid'],'catname')}</div>
+          <h2><a href="{$featured.url}">{$featured.title}</a></h2>
+          <div class="brand-news-date">{$featured.publish_time|date='Y-m-d'}</div>
+        </div>
+      </article>
+      {/volist}
+      {/if}
+      {/yzn}
+      {/if}
+
+      <div class="brand-news-grid">
+        {yzn module="cms" action="lists" catid="$catid" where="$newsWhere" order="publish_time DESC,id DESC" num="9" page="$page" return="data" moreinfo="1"}
+        {volist name="data" id="vo"}
+        <article class="brand-news-card">
+          <a class="brand-news-card-media" href="{$vo.url}">
+            <img src="{if !empty($vo.thumb)}{$vo.thumb}{else /}/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png{/if}" alt="{$vo.title}">
+          </a>
+          <div class="brand-news-card-copy">
+            <div class="brand-news-kicker">{:getCategory($vo['catid'],'catname')}</div>
+            <h3><a href="{$vo.url}">{$vo.title}</a></h3>
+            <div class="brand-news-date">{$vo.publish_time|date='Y-m-d'}</div>
+          </div>
+        </article>
+        {/volist}
+        {/yzn}
+      </div>
+
+      {if !empty($pages)}
+      <div class="brand-news-pagination">{$pages|raw}</div>
+      {/if}
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+{include file="footer" /}

+ 54 - 0
templates/xtu/cms/list_about.html

@@ -0,0 +1,54 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/aftersales.css?v=20260412-1343">
+
+<main class="aftersales-page support-page">
+  <section class="aftersales-hero" style="background:url({:getCategory(28,'image')}) center center / cover no-repeat;">
+    <div class="support-container aftersales-hero-inner">
+      <div></div>
+      <div class="aftersales-hero-figure" aria-hidden="true"></div>
+    </div>
+  </section>
+
+  <section class="aftersales-main support-container">
+    <div class="aftersales-breadcrumbs" style="margin-bottom:24px;">
+      <a href="{:getCategory($category['parentid'],'url')}">{:getCategory($category['parentid'],'catname')}</a><span>›</span><a href="javascript:;">{$category['catname']}</a>
+    </div>
+
+    <div class="aftersales-layout">
+      <aside class="aftersales-sidebar">
+        <div class="aftersales-sidebar-card">
+          <ul class="aftersales-nav-list">
+            {yzn module="cms" action="category" catid="$category['parentid']" order="listorder DESC" num="50" return="siblings"}
+            {volist name="siblings" id="vo"}
+            <li>
+              <a class="aftersales-nav-link {if isset($vo['catdir']) && $vo['catdir'] == $category['catdir']}is-active{/if}" href="{$vo['url']}">
+                <span>{$vo['catname']}</span>
+                <i class="bi bi-chevron-right"></i>
+              </a>
+            </li>
+            {/volist}
+            {/yzn}
+          </ul>
+        </div>
+      </aside>
+
+      <div class="aftersales-content-wrap">
+        {yzn module="cms" action="lists" catid="$catid" order="listorder DESC,id ASC" num="1" return="data" moreinfo="1"}
+        {volist name="data" id="vo"}
+        <article class="aftersales-article-card">
+          <h1 class="aftersales-article-title">{$vo['title']}</h1>
+          <div class="aftersales-article-body">
+            {$vo['content']|raw}
+          </div>
+        </article>
+        {/volist}
+        {/yzn}
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/aftersales.js?v=20260411-1248"></script>
+{include file="footer" /}

+ 64 - 0
templates/xtu/cms/list_aftersales.html

@@ -0,0 +1,64 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/aftersales.css?v=20260412-1343">
+
+<main class="aftersales-page support-page">
+  <section class="aftersales-hero">
+    <div class="support-container aftersales-hero-inner">
+      <div class="aftersales-breadcrumbs">
+        <a href="{:getCategory($category['parentid'],'url')}">{:getCategory($category['parentid'],'catname')}</a><span>›</span><a href="javascript:;">{$category.catname}</a>
+      </div>
+      <div class="aftersales-hero-figure" aria-hidden="true">
+        <div class="aftersales-hero-device">
+          <span class="aftersales-hero-device-screen"></span>
+          <span class="aftersales-hero-device-shadow"></span>
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <section class="aftersales-main support-container">
+    <div class="aftersales-layout">
+      <aside class="aftersales-sidebar">
+        <div class="aftersales-sidebar-card">
+          <ul class="aftersales-nav-list">
+           {yzn module="cms" action="lists" catid="$catid" order="$order['data']??''" num="100" return="data" moreinfo="1"}
+            {volist name="data" id="vo" key="j"}
+            <li>
+              <a class="aftersales-nav-link {if $j==1}is-active{/if}" href="{$vo.url}">
+                <span>{$vo.title}</span>
+                <i class="bi bi-chevron-right"></i>
+              </a>
+            </li>
+            
+            {if $j==1}
+            <?php
+                $title = $vo['title'];
+                $content=$vo['content'];
+            ?>
+            
+            {/if}
+            
+             {/volist}
+             {/yzn}
+          </ul>
+        </div>
+      </aside>
+
+      <div class="aftersales-content-wrap">
+         
+        <article class="aftersales-article-card">
+          <h1 class="aftersales-article-title">{$title}</h1>
+          <div class="aftersales-article-body">
+           {$content|raw}
+          </div>
+        </article>
+       
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/aftersales.js?v=20260411-1248"></script>
+{include file="footer" /}

+ 239 - 0
templates/xtu/cms/list_download.html

@@ -0,0 +1,239 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/download-center.css?v=20260513-2">
+
+{php}
+$downloadProductId = (int)request()->param('product_id/d', request()->param('project_id/d', request()->param('pid/d', request()->param('id/d', 0))));
+$downloadBaseWhere = '`status` = 1';
+if ($downloadProductId > 0) {
+    $downloadBaseWhere .= ' AND `project_id` = ' . $downloadProductId;
+}
+$downloadDocWhere = $downloadBaseWhere . ' AND `catid` = 40';
+$downloadFirmwareWhere = $downloadBaseWhere . ' AND `catid` = 57';
+$productWhere = '`status` = 1';
+{/php}
+
+<main class="download-center-page support-page download-list-page">
+  <section class="download-center-hero">
+    <div class="content-1300-wrap">
+      <span class="download-center-kicker">{:cms_t('support_center','支持中心')}</span>
+      <h1>{if $downloadProductId > 0}{:cms_t('download_product_center','产品下载中心')}{else /}{:cms_t('download_center','下载中心')}{/if}</h1>
+      <p>{if $downloadProductId > 0}{:sprintf(cms_t('download_product_center_desc','按产品快速获取%s、%s、%s资料。'), getCategory(42,'catname'), getCategory(40,'catname'), getCategory(57,'catname'))}{else /}{:cms_t('download_center_desc','搜索产品资料,或直接获取 XTU GO 安卓与 iOS 官方下载入口。')}{/if}</p>
+    </div>
+  </section>
+
+  <section class="download-center-section">
+    <div class="content-1300-wrap download-center-layout">
+      <aside class="download-filter-panel">
+        <div class="download-filter-card">
+          <div class="download-filter-meta download-filter-meta-standalone">
+            <span><i class="bi bi-phone"></i> {:getCategory(42,'catname')}</span>
+            <span><i class="bi bi-journal-text"></i> {:getCategory(40,'catname')}</span>
+            <span><i class="bi bi-cpu"></i> {:getCategory(57,'catname')}</span>
+          </div>
+        </div>
+
+        <div class="download-filter-card download-product-card">
+          <div class="download-filter-title">
+            <i class="bi bi-camera-video"></i>
+            <span>{:cms_t('select_product','选择产品')}</span>
+          </div>
+          <div class="download-product-list download-product-category-list">
+            {yzn module="cms" action="category" modelid="2" cache="3600" order="listorder DESC,id ASC" num="30" return="productCategories"}
+            {volist name="productCategories" id="productCat"}
+              {php}
+              $categoryProductWhere = $productWhere . ' AND `catid` = ' . (int)$productCat['id'];
+              {/php}
+              {yzn module="cms" action="lists" modelid="2" where="$categoryProductWhere" order="listorder DESC,id DESC" num="30" return="downloadProducts" moreinfo="1"}
+              {if !empty($downloadProducts)}
+              {php}
+              $downloadGroupOpen = false;
+              foreach ($downloadProducts as $downloadProductItem) {
+                  if ((int)$downloadProductItem['id'] === $downloadProductId) {
+                      $downloadGroupOpen = true;
+                      break;
+                  }
+              }
+              {/php}
+              <div class="download-product-group {if $downloadGroupOpen}is-open{/if}">
+                <button class="download-product-group-title" type="button" aria-expanded="{if $downloadGroupOpen}true{else /}false{/if}">
+                  <span>{$productCat.catname}</span>
+                  <i class="bi bi-chevron-down"></i>
+                </button>
+                <div class="download-product-group-items">
+                  {volist name="downloadProducts" id="product"}
+                    <a class="download-product-link {if $downloadProductId == $product.id}active{/if}" href="?product_id={$product.id}">
+                      <span>{$product.title}</span>
+                      <i class="bi bi-chevron-right"></i>
+                    </a>
+                  {/volist}
+                </div>
+              </div>
+              {/if}
+              {/yzn}
+            {/volist}
+            {/yzn}
+          </div>
+        </div>
+      </aside>
+
+      <div class="download-content-panel">
+        {if $downloadProductId <= 0}
+          <div class="download-overview-card">
+            {yzn module="cms" action="lists" catid="42" order="listorder DESC,id ASC" num="1" return="xtugoDownloadData" moreinfo="1"}
+            {volist name="xtugoDownloadData" id="vo"}
+            <div class="download-overview-copy">
+              <span class="download-pill">XTU GO</span>
+              <h2>{$vo.title|default=cms_t('xtugo_default_title','骁途用户必备的手机应用')}</h2>
+              <p>{$vo.description|default=cms_t('xtugo_default_desc','一站连接设备、管理素材、获取教程与售后服务,让拍摄体验从开机到分享都更顺手。')}</p>
+              <div class="xtugo-store-list download-store-list">
+                <a class="xtugo-store-btn xtugo-store-btn-android" href="{$vo.andiordurl|default='#'}" target="_blank" rel="noopener">
+                  <span class="xtugo-store-icon"><i class="bi bi-android2"></i></span>
+                  <span class="xtugo-store-copy"><small>{:cms_t('download_for','Download for')}</small><strong>Android</strong></span>
+                </a>
+                <a class="xtugo-store-btn xtugo-store-btn-ios" href="{$vo.appstore|default='#'}" target="_blank" rel="noopener">
+                  <span class="xtugo-store-icon"><i class="bi bi-apple"></i></span>
+                  <span class="xtugo-store-copy"><small>{:cms_t('download_on_the','Download on the')}</small><strong>App Store</strong></span>
+                </a>
+              </div>
+            </div>
+            <div class="download-overview-visual">
+              <img src="{$vo.thumb|default='/assets/xtu/vendor/img/xtugo.png'}" alt="XTU GO">
+            </div>
+            {/volist}
+            {/yzn}
+          </div>
+
+          <div class="download-doc-section">
+            <div class="download-section-head">
+              <h2>{:cms_t('latest_downloads_prefix','最新')}{:getCategory($catid,'catname')}</h2>
+              <p>{:cms_t('download_select_product_tip','选择左侧产品后,可查看该产品专属资料。')}</p>
+            </div>
+            <div class="download-file-grid">
+              {yzn module="cms" action="lists" catid="$catid" where="$downloadBaseWhere" cache="3600" order="$order['data']??'listorder DESC,publish_time DESC,id DESC'" num="12" page="$page" return="data" moreinfo="1"}
+              {volist name="data" id="vo"}
+              <article class="download-file-card">
+                <div class="download-file-icon"><i class="bi bi-file-earmark-arrow-down"></i></div>
+                <div class="download-file-copy">
+                  <h3>{$vo.title}</h3>
+                  <p>{:date('Y-m-d',$vo.publish_time)}</p>
+                </div>
+                <a href="{if !empty($vo.fileaddress)}{$vo.fileaddress}{else /}{$vo.url}{/if}" target="_blank" rel="noopener" class="download-file-action">{:cms_t('download','下载')}</a>
+              </article>
+              {/volist}
+              {/yzn}
+            </div>
+            <div class="text-center download-pages">{$pages|raw}</div>
+          </div>
+        {else /}
+          {yzn module="cms" action="lists" modelid="2" where="`id` = $downloadProductId AND `status` = 1" num="1" return="currentProduct" moreinfo="1"}
+          {volist name="currentProduct" id="product"}
+          {php}
+          $downloadHeroLabel = getCategory($product['catid'], 'catname');
+          {/php}
+          <div class="download-product-hero-card">
+            <div>
+              <span class="download-pill">{$downloadHeroLabel|default=cms_t('product_download_label','产品下载')}</span>
+              <h2>{$product.title}</h2>
+              <p>{$product.description|default=cms_t('product_download_default_desc','请选择下方分类获取对应下载内容。')}</p>
+            </div>
+            {if $product.thumb}<img src="{$product.thumb}" alt="{$product.title}">{/if}
+          </div>
+          {/volist}
+          {/yzn}
+
+          <div class="download-tabs-card">
+            <div class="download-tabs" role="tablist">
+              <button class="download-tab active" type="button" data-tab="app"><i class="bi bi-phone"></i>{:getCategory(42,'catname')}</button>
+              <button class="download-tab" type="button" data-tab="manual"><i class="bi bi-journal-text"></i>{:getCategory(40,'catname')}</button>
+              <button class="download-tab" type="button" data-tab="firmware"><i class="bi bi-cpu"></i>{:getCategory(57,'catname')}</button>
+            </div>
+
+            <div class="download-tab-panel active" id="download-tab-app">
+              {yzn module="cms" action="lists" catid="42" order="listorder DESC,id ASC" num="1" return="xtugoAppData" moreinfo="1"}
+              {volist name="xtugoAppData" id="vo"}
+              <div class="download-app-panel">
+                <div>
+                  <span class="download-pill">XTU GO {:getCategory(42,'catname')}</span>
+                  <h3>{$vo.title|default='XTU GO'}</h3>
+                  <p>{$vo.description|default=cms_t('xtugo_app_default_desc','配套移动应用,支持设备连接、素材管理、教程与服务支持。')}</p>
+                </div>
+                <div class="xtugo-store-list download-store-list">
+                  <a class="xtugo-store-btn xtugo-store-btn-android" href="{$vo.andiordurl|default='#'}" target="_blank" rel="noopener"><span class="xtugo-store-icon"><i class="bi bi-android2"></i></span><span class="xtugo-store-copy"><small>{:cms_t('download_for','Download for')}</small><strong>Android</strong></span></a>
+                  <a class="xtugo-store-btn xtugo-store-btn-ios" href="{$vo.appstore|default='#'}" target="_blank" rel="noopener"><span class="xtugo-store-icon"><i class="bi bi-apple"></i></span><span class="xtugo-store-copy"><small>{:cms_t('download_on_the','Download on the')}</small><strong>App Store</strong></span></a>
+                </div>
+              </div>
+              {/volist}
+              {/yzn}
+            </div>
+
+            <div class="download-tab-panel" id="download-tab-manual">
+              <div class="download-file-grid compact">
+                {yzn module="cms" action="lists" catid="40" where="$downloadDocWhere" order="listorder DESC,publish_time DESC,id DESC" num="30" return="manualFiles" moreinfo="1"}
+                {volist name="manualFiles" id="vo"}
+                <article class="download-file-card">
+                  <div class="download-file-icon"><i class="bi bi-file-earmark-pdf"></i></div>
+                  <div class="download-file-copy"><h3>{$vo.title}</h3><p>{:date('Y-m-d',$vo.publish_time)}</p></div>
+                  <a href="{if !empty($vo.fileaddress)}{$vo.fileaddress}{else /}{$vo.url}{/if}" target="_blank" rel="noopener" class="download-file-action">{:cms_t('download','下载')}</a>
+                </article>
+                {/volist}
+                {/yzn}
+              </div>
+            </div>
+
+            <div class="download-tab-panel" id="download-tab-firmware">
+              <div class="download-file-grid compact">
+                {yzn module="cms" action="lists" catid="57" where="$downloadFirmwareWhere" order="listorder DESC,publish_time DESC,id DESC" num="30" return="firmwareFiles" moreinfo="1"}
+                {volist name="firmwareFiles" id="vo"}
+                <article class="download-file-card">
+                  <div class="download-file-icon"><i class="bi bi-hdd-network"></i></div>
+                  <div class="download-file-copy"><h3>{$vo.title}</h3><p>{:date('Y-m-d',$vo.publish_time)}</p></div>
+                  <a href="{if !empty($vo.fileaddress)}{$vo.fileaddress}{else /}{$vo.url}{/if}" target="_blank" rel="noopener" class="download-file-action">{:cms_t('download','下载')}</a>
+                </article>
+                {/volist}
+                {/yzn}
+              </div>
+            </div>
+          </div>
+        {/if}
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+
+
+<script>
+document.body.classList.add('download-category-body');
+document.addEventListener('DOMContentLoaded', function () {
+  document.querySelectorAll('.download-product-group-title').forEach(function (trigger) {
+    trigger.addEventListener('click', function () {
+      var group = trigger.closest('.download-product-group');
+      if (!group) return;
+      var isOpen = group.classList.contains('is-open');
+      document.querySelectorAll('.download-product-group.is-open').forEach(function (item) {
+        item.classList.remove('is-open');
+        var itemTrigger = item.querySelector('.download-product-group-title');
+        if (itemTrigger) itemTrigger.setAttribute('aria-expanded', 'false');
+      });
+      if (!isOpen) {
+        group.classList.add('is-open');
+        trigger.setAttribute('aria-expanded', 'true');
+      }
+    });
+  });
+
+  document.querySelectorAll('.download-tab').forEach(function (tab) {
+    tab.addEventListener('click', function () {
+      var name = tab.getAttribute('data-tab');
+      document.querySelectorAll('.download-tab').forEach(function (item) { item.classList.remove('active'); });
+      document.querySelectorAll('.download-tab-panel').forEach(function (panel) { panel.classList.remove('active'); });
+      tab.classList.add('active');
+      var target = document.getElementById('download-tab-' + name);
+      if (target) target.classList.add('active');
+    });
+  });
+});
+</script>
+{include file="footer" /}

+ 48 - 0
templates/xtu/cms/list_download.html.bak_20260513_122653

@@ -0,0 +1,48 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header d-flex justify-content-between align-items-center">
+                <h3>列表</h3>
+                {yzn module="cms" action="order" modelid="$modelid" order="listorder desc" return="order"}
+                {if isset($order['list']) && $order['list']}
+                <div class="nav">
+                    {volist name="order.list" id="vt"}
+                    <a target="_self" href="{$vt.url}" {if $vt.active}class="active"{/if}><span>{$vt.title}</span></a>
+                    {/volist}
+                </div>
+                {/if}
+                {/yzn}
+            </div>
+            <div class="layui-card-body">
+                <ul class="download-list layui-row layui-col-space16">
+                    {yzn module="cms" action="lists" catid="$catid" cache="3600" order="$order['data']??''" num="12" page="$page" return="data" moreinfo="1"}
+                    {volist name="data" id="vo" key="j"}
+                    <li class="download-item layui-col-md3 layui-col-sm6 text-center">
+                        <div class="download-box">
+                            <a href="{$vo.url}">
+                                <div class="d-flex download-thumb align-items-center justify-content-center">
+                                    {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>220 × 200</font>{/if}
+                                </div>
+                            </a>
+                            <div class="download-info">
+                                <h3 class="download-title"><a href="{$vo.url}">{$vo.title}</a></h3>
+                            </div>
+                            <a href="{$vo.url}" class="layui-btn layui-bg-blue layui-btn-sm layui-btn-fluid">{:cms_t('download','下载')}</a>
+                        </div>
+                    </li>
+                    {/volist}
+                    {/yzn}
+                    <div class="layui-clear"></div>
+                </ul>
+                <div class="text-center">
+                    {$pages|raw}
+                </div>
+            </div>
+        </div>
+	</div>
+    <div class="layui-col-md3">
+       {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

+ 73 - 0
templates/xtu/cms/list_fazhan.html

@@ -0,0 +1,73 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/aftersales.css?v=20260412-1343">
+<link rel="stylesheet" href="/assets/xtu/fazhan.css?v=20260626-1501">
+
+{php}
+$fazhanTitle = trim((string)($category['catname'] ?? '发展历程'));
+$fazhanDesc = trim((string)($category['description'] ?? ''));
+{/php}
+
+<main class="aftersales-page support-page fazhan-page">
+  <section class="aftersales-hero" style="background:url({:getCategory(28,'image')}) center center / cover no-repeat;">
+    <div class="support-container aftersales-hero-inner">
+      <div></div>
+      <div class="aftersales-hero-figure" aria-hidden="true"></div>
+    </div>
+  </section>
+
+  <section class="aftersales-main support-container">
+    <div class="aftersales-breadcrumbs" style="margin-bottom:24px;">
+      <a href="{:getCategory($category['parentid'],'url')}">{:getCategory($category['parentid'],'catname')}</a><span>›</span><a href="javascript:;">{$category['catname']}</a>
+    </div>
+
+    <div class="aftersales-layout">
+      <aside class="aftersales-sidebar">
+        <div class="aftersales-sidebar-card">
+          <ul class="aftersales-nav-list">
+            {yzn module="cms" action="category" catid="$category['parentid']" order="listorder DESC" num="50" return="siblings"}
+            {volist name="siblings" id="vo"}
+            <li>
+              <a class="aftersales-nav-link {if isset($vo['catdir']) && $vo['catdir'] == $category['catdir']}is-active{/if}" href="{$vo['url']}">
+                <span>{$vo['catname']}</span>
+                <i class="bi bi-chevron-right"></i>
+              </a>
+            </li>
+            {/volist}
+            {/yzn}
+          </ul>
+        </div>
+      </aside>
+
+      <div class="aftersales-content-wrap">
+        <article class="aftersales-article-card fazhan-article-card">
+          <h1 class="aftersales-article-title">{$fazhanTitle}</h1>
+          {if $fazhanDesc !== ''}<p class="fazhan-article-desc">{$fazhanDesc}</p>{/if}
+
+          <div class="fazhan-timeline-list">
+            {yzn module="cms" action="lists" catid="$catid" order="listorder DESC,id DESC" num="999" return="data" moreinfo="1"}
+            {volist name="data" id="vo"}
+            <section class="fazhan-timeline-item">
+              <div class="fazhan-timeline-year">{$vo.title}</div>
+              <div class="fazhan-timeline-card">
+                {if !empty($vo.thumb)}
+                <div class="fazhan-timeline-thumb"><img src="{$vo.thumb}" alt="{$vo.title}"></div>
+                {/if}
+                <div class="fazhan-timeline-body">
+                  <h2>{$vo.title}</h2>
+                  <div class="aftersales-article-body fazhan-timeline-text">{$vo.content|raw}</div>
+                </div>
+              </div>
+            </section>
+            {/volist}
+            {/yzn}
+          </div>
+        </article>
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/aftersales.js?v=20260411-1248"></script>
+{include file="footer" /}

+ 91 - 0
templates/xtu/cms/list_job.html

@@ -0,0 +1,91 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/job.css?v=20260506-2118">
+
+{php}
+$jobHeroTitle = trim((string)($category['catname'] ?? cms_t('job_join_us','加入我们')));
+$jobHeroDesc = trim((string)($category['description'] ?? cms_t('job_default_list_intro','与 XTU 一起探索技术与行业应用的更多可能。')));
+{/php}
+
+<main class="job-page job-list-page job-simple-list-page">
+  <section class="job-simple-hero">
+    <div class="content-1300-wrap">
+      <nav class="job-dji-breadcrumb job-simple-breadcrumb" aria-label="breadcrumb">
+        <a href="{:cms_lang_url(addon_url('cms/index/index'))}">{:cms_t('home','首页')}</a>
+        <span>/</span>
+        <em>{$jobHeroTitle}</em>
+      </nav>
+      <h1>{$jobHeroTitle}</h1>
+      {if $jobHeroDesc !== ''}<p>{$jobHeroDesc}</p>{/if}
+    </div>
+  </section>
+
+  <section class="job-simple-list-section">
+    <div class="content-1300-wrap">
+      <div class="job-simple-tools">
+        <div class="job-simple-search">
+          <i class="bi bi-search"></i>
+          <input type="search" id="jobKeyword" placeholder="{:cms_t('job_search_placeholder','搜索岗位名称、地点或类型')}" autocomplete="off">
+        </div>
+        <div class="job-simple-filter" aria-label="{:cms_t('job_category_switch','招聘栏目切换')}">
+          {if !empty($category['parentid'])}
+          {yzn module="cms" action="category" catid="$category['parentid']" cache="3600" order="listorder DESC,id ASC" num="20" return="jobTabs"}
+          {volist name="jobTabs" id="tab"}
+          <a class="job-filter-chip {if $tab.id==$catid}is-active{/if}" href="{$tab.url}" target="{$tab.target|default='_self'}">{$tab.catname}</a>
+          {/volist}
+          {/yzn}
+          {/if}
+        </div>
+      </div>
+
+      <div class="job-list-wrap job-simple-list-wrap" id="jobListWrap">
+        {yzn module="cms" action="lists" catid="$catid" order="listorder DESC,publish_time DESC,id DESC" num="12" page="$page" return="data" moreinfo="1"}
+        {volist name="data" id="vo"}
+        <a class="job-card job-simple-row" href="{$vo.url}" data-title="{$vo.title|default=''}" data-address="{$vo.address|default=''}" data-jobtype="{$vo.jobtype|default=''}">
+          <div class="job-simple-row-title">{$vo.title}</div>
+          <div class="job-simple-row-meta">
+            {if !empty($vo.address)}<span><i class="bi bi-geo-alt"></i>{$vo.address}</span>{/if}
+            {if !empty($vo.jobtype)}<span><i class="bi bi-briefcase"></i>{$vo.jobtype}</span>{/if}
+            {if !empty($vo.publish_time)}<span><i class="bi bi-clock"></i>{$vo.publish_time|date='Y-m-d'}</span>{/if}
+          </div>
+          <span class="job-simple-row-link">{:cms_t('job_view_detail','查看详情')} <i class="bi bi-arrow-right"></i></span>
+        </a>
+        {/volist}
+        {/yzn}
+        <div class="job-empty" id="jobEmpty" hidden>
+          <h3>{:cms_t('job_no_match','暂无匹配岗位')}</h3>
+          <p>{:cms_t('job_no_match_desc','请尝试更换关键词或筛选条件。')}</p>
+        </div>
+      </div>
+
+      {if !empty($pages)}
+      <div class="job-pagination">{$pages|raw}</div>
+      {/if}
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script>
+(function(){
+  var input = document.getElementById('jobKeyword');
+  var wrap = document.getElementById('jobListWrap');
+  var empty = document.getElementById('jobEmpty');
+  if (!wrap) return;
+  var cards = Array.prototype.slice.call(wrap.querySelectorAll('.job-card'));
+  function normalize(v){ return (v || '').toString().toLowerCase().replace(/\s+/g,''); }
+  function applyFilter(){
+    var kw = normalize(input ? input.value : '');
+    var visible = 0;
+    cards.forEach(function(card){
+      var text = normalize([card.dataset.title, card.dataset.address, card.dataset.jobtype].join(' '));
+      var show = !kw || text.indexOf(kw) !== -1;
+      card.style.display = show ? '' : 'none';
+      if (show) visible++;
+    });
+    if (empty) empty.hidden = visible !== 0;
+  }
+  if (input) input.addEventListener('input', applyFilter);
+})();
+</script>
+{include file="footer" /}

+ 280 - 0
templates/xtu/cms/list_product.html

@@ -0,0 +1,280 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/vendor/swiper-bundle.min.css">
+<link rel="stylesheet" href="/assets/xtu/page-compare.css?v=20260422-1749">
+<link rel="stylesheet" href="/assets/xtu/product-list.css?v=20260625-hero-isb">
+
+<main class="product-channel-page product-list-page">
+  <section class="product-list-top-products" aria-label="{:cms_t('product_quick_nav','产品快捷导航')}">
+    <div class="product-list-top-products-inner">
+      <div class="product-list-top-products-row">
+        {yzn module="cms" action="lists" catid="$catid" cache="3600" order="listorder desc,id desc" num="12" return="topProducts" moreinfo="1"}
+        {volist name="topProducts" id="topProduct"}
+        <a class="product-list-top-product" href="{$topProduct.url}" title="{$topProduct.title}">
+          <span class="product-list-top-product-media">
+            <img src="{if !empty($topProduct.thumb)}{$topProduct.thumb}{elseif !empty($topProduct.thumb2) /}{$topProduct.thumb2}{/if}" alt="{$topProduct.title}">
+          </span>
+          <span class="product-list-top-product-title">{$topProduct.title}</span>
+          {if !empty($topProduct.title1)}<span class="product-list-top-product-tag">{$topProduct.title1}</span>{/if}
+        </a>
+        {/volist}
+        {/yzn}
+        <a class="product-list-top-product product-list-top-product-utility" href="{:getCategory(41,'url')}" title="{:cms_t('product_compare','产品对比')}">
+          <span class="product-list-top-product-media"><i class="bi bi-columns-gap"></i></span>
+          <span class="product-list-top-product-title">{:cms_t('product_compare','产品对比')}</span>
+        </a>
+        {if !empty($currentRegionShopUrl)}
+        <a class="product-list-top-product product-list-top-product-utility" href="{$currentRegionShopUrl}" target="_blank" rel="noopener noreferrer" title="{:cms_t('buy_now','立即购买')}">
+          <span class="product-list-top-product-media"><i class="bi bi-bag"></i></span>
+          <span class="product-list-top-product-title">{:cms_t('buy_now','立即购买')}</span>
+        </a>
+        {/if}
+      </div>
+    </div>
+  </section>
+
+  <section class="product-channel-hero">
+    <div class="content-1300-wrap text-center">
+      <h1>{if getCategory($catid,'catname')}{:getCategory($catid,'catname')}{else /}{$category.catname|default=''}{/if}</h1>
+      <p>{if getCategory($catid,'description')}{:getCategory($catid,'description')}{elseif !empty($category.description) /}{$category.description}{else /}{:cms_t('product_channel_default_desc','探索适合你的产品,了解核心亮点、适用场景与支持服务。')}{/if}</p>
+    </div>
+  </section>
+
+  {yzn module="cms" action="lists" catid="$catid" flag="6" cache="3600" order="listorder desc,id desc" num="6" return="bannerData" moreinfo="1"}
+  {if !empty($bannerData)}
+  <section class="product-recommend-banner-section">
+      <div class="swiper product-list-hero-swiper" id="productRecommendSwiper">
+        <div class="swiper-wrapper">
+          {volist name="bannerData" id="vo"}
+          {if !empty($vo.thumb1)}
+          <div class="swiper-slide product-list-hero-slide" data-is-b="{$vo.is_b|default='1'}">
+            <div class="product-list-hero-media">
+              <img src="{$vo.thumb1}" alt="{$vo.title}">
+            </div>
+            <div class="product-list-hero-overlay"></div>
+            <div class="content-1300-wrap product-list-hero-inner">
+              <div class="product-list-hero-copy">
+                {if !empty($vo.title1)}<span class="product-list-hero-subtitle">{$vo.title1}</span>{/if}
+                <h2 class="product-list-hero-title">{$vo.title}</h2>
+                {if !empty($vo.title2)}
+                <p class="product-list-hero-slogan">{$vo.title2}</p>
+                {elseif !empty($vo.description) /}
+                <p class="product-list-hero-slogan">{$vo.description|strip_tags|mb_substr=0,120,'utf-8'}</p>
+                {/if}
+                <div class="product-list-hero-actions">
+                  <a href="{$vo.url}" class="product-list-hero-btn">
+                    {:cms_t('learn_more','了解更多')}
+                    <i class="bi bi-chevron-right"></i>
+                  </a>
+                  {if !empty($vo.shopurl)}
+                  <a href="{$vo.shopurl}" class="product-list-hero-btn" target="_blank">
+                    {:cms_t('buy_now','立即购买')}
+                    <i class="bi bi-chevron-right"></i>
+                  </a>
+                  {/if}
+                </div>
+              </div>
+            </div>
+          </div>
+          {/if}
+          {/volist}
+        </div>
+        <button class="product-list-hero-arrow product-list-hero-prev" type="button">‹</button>
+        <button class="product-list-hero-arrow product-list-hero-next" type="button">›</button>
+        <div class="product-list-hero-controls">
+          <div class="swiper-pagination product-list-hero-pagination"></div>
+        </div>
+      </div>
+  </section>
+  {/if}
+  {/yzn}
+
+  <section class="section-space image-grid-full hero-next-section-tight product-grid-unified product-list-home-grid">
+    <div class="container-fluid px-3 product-grid-shell">
+      <div class="row g-2 g-lg-3 product-grid-row">
+        {yzn module="cms" action="lists" catid="$catid" flag="4"  order="listorder DESC,id DESC" num="20" return="recommendList" moreinfo="1"}
+        {volist name="recommendList" id="vo"}
+        <div class="col-12 col-lg-6">
+          <article class="overlay-card flat-card grid-card tall-card">
+            <img src="{if !empty($vo.thumb2)}{$vo.thumb2}{elseif !empty($vo.thumb) /}{$vo.thumb}{else /}/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png{/if}" alt="{$vo.title}">
+            <div class="overlay-copy top-copy product-tile-copy">
+              {if !empty($vo.title1)}
+              <span class="product-subtitle">{$vo.title1}</span>
+              {/if}
+              <h3>{$vo.title}</h3>
+              <p>{if !empty($vo.title2)}{$vo.title2}{elseif !empty($vo.description) /}{$vo.description|strip_tags|mb_substr=0,80,'utf-8'}{/if}</p>
+              <div class="product-links">
+                <a href="{$vo.url}">{:cms_t('learn_more','了解更多')} ></a>
+                {if !empty($vo.shopurl)}<a href="{$vo.shopurl}" target="_blank">{:cms_t('buy_now','立即购买')} ></a>{/if}
+              </div>
+            </div>
+          </article>
+        </div>
+        {/volist}
+        {/yzn}
+      </div>
+    </div>
+  </section>
+
+  <section class="product-compare-lite-section compare-page">
+    <div class="compare-shell">
+      <div class="product-channel-hero product-compare-heading">
+        <div class="content-1300-wrap text-center">
+          <h1>{:cms_t('product_compare_and_recommend','哪款设备适合你')}</h1>
+        </div>
+      </div>
+
+      {yzn module="cms" action="lists" catid="$catid" order="listorder desc" num="4" return="compareList" moreinfo="1"}
+      {if !empty($compareList)}
+      <div class="compare-products compare-products-4up compare-products-detail-grid">
+        {volist name="compareList" id="cp"}
+        <article class="compare-product-card compare-product-card-detailed">
+          <div class="compare-product-media">
+            <img src="{$cp.thumb}" alt="{$cp.title}">
+          </div>
+          <h3 class="compare-product-title">{$cp.title}</h3>
+          <p class="compare-product-subtitle">{if !empty($cp.title2)}{$cp.title2}{elseif !empty($cp.title1) /}{$cp.title1}{/if}</p>
+          <div class="compare-product-actions">
+            {if !empty($cp.shopurl)}<a class="compare-buy-btn" href="{$cp.shopurl}" target="_blank">{:cms_t('buy_now','立即购买')}</a>{/if}
+            <a class="compare-more-link" href="{$cp.url}">{:cms_t('learn_more','了解更多')}</a>
+          </div>
+          <div class="compare-product-specs">
+             <?php
+             $where = "project_id=".$cp['id'];
+             ?>
+            {yzn module="cms" action="lists" catid="10" where="$where" order="listorder asc,id desc" num="1" return="paramList" moreinfo="1"}
+            {volist name="paramList" id="param"}
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_size','尺寸')}</span>
+              <div class="compare-product-spec-value">{$param.size|default='-'}</div>
+            </div>
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_weight','重量')}</span>
+              <div class="compare-product-spec-value">{$param.weight|default='-'}</div>
+            </div>
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_waterproof','防水')}</span>
+              <div class="compare-product-spec-value">{$param.waterproof|default='-'}</div>
+            </div>
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_image_sensor','影像传感器')}</span>
+              <div class="compare-product-spec-value">{$param.image_sensor|default='-'}</div>
+            </div>
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_normal_video','普通录影')}</span>
+              <div class="compare-product-spec-value">{$param.normal_video|default='-'}</div>
+            </div>
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_stabilization','防抖')}</span>
+              <div class="compare-product-spec-value">{$param.stabilization|default='-'}</div>
+            </div>
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_battery_life','续航时间')}</span>
+              <div class="compare-product-spec-value">{$param.battery_life|default='-'}</div>
+            </div>
+            <div class="compare-product-spec-item">
+              <span class="compare-product-spec-label">{:cms_t('compare_label_charge_time','充电时间')}</span>
+              <div class="compare-product-spec-value">{$param.charge_time|default='-'}</div>
+            </div>
+            {/volist}
+            {/yzn}
+          </div>
+        </article>
+        {/volist}
+      </div>
+      <div class="compare-all-entry-wrap">
+        <a class="compare-all-entry" href="{:getCategory(41,'url')}">{:cms_t('product_compare_all_cameras','对比所有相机')} <i class="bi bi-chevron-right"></i></a>
+      </div>
+      {/if}
+      {/yzn}
+    </div>
+  </section>
+
+  <section class="product-support-links-section">
+    <div class="content-1300-wrap">
+      <div class="product-channel-hero product-support-heading">
+        <div class="content-1300-wrap text-center">
+          <h1>{:cms_t('product_support_title','产品支持')}</h1>
+        </div>
+      </div>
+      <div class="product-support-links-grid">
+        <a class="product-support-link-card" href="{:getCategory(24,'url')}">
+          <div class="product-support-link-media">
+            <img src="/assets/xtu/vendor/img/support-service-card.jpg" alt="{:getCategory(24,'catname')}">
+          </div>
+          <div class="product-support-link-copy">
+            <h3>{:getCategory(24,'catname')}</h3>
+            <p>{if getCategory(24,'description')}{:getCategory(24,'description')}{/if}</p>
+            <span class="product-support-link-action">{:cms_t('learn_more','了解更多')} <i class="bi bi-chevron-right"></i></span>
+          </div>
+        </a>
+        <a class="product-support-link-card" href="{:getCategory(56,'url')}">
+          <div class="product-support-link-media">
+            <img src="/assets/xtu/vendor/img/support-download-card.jpg" alt="{:getCategory(56,'catname')}">
+          </div>
+          <div class="product-support-link-copy">
+            <h3>{:getCategory(56,'catname')}</h3>
+            <p>{if getCategory(56,'description')}{:getCategory(56,'description')}{/if}</p>
+            <span class="product-support-link-action">{:cms_t('learn_more','了解更多')} <i class="bi bi-chevron-right"></i></span>
+          </div>
+        </a>
+      </div>
+    </div>
+  </section>
+
+  <section class="section-space industry-strip-section industry-strip-clean">
+    <div class="content-1300-wrap">
+      {yzn module="cms" action="lists" catid="13" order="listorder DESC" num="1" return="data" moreinfo="1"}
+      {volist name="data" id="vo"}
+      <div class="row align-items-center g-3 g-lg-4 industry-clean-row">
+        <div class="col-12 col-lg-5">
+          <div class="industry-copy industry-copy-clean text-center text-lg-start">
+            <span class="industry-eyebrow">
+              {$vo.title}
+            </span>
+            <h2>
+              {$vo.title1}
+            </h2>
+            <a href="{:getCategory(55,'url')}" class="ui-btn ui-btn-primary">
+              {:cms_t('learn_more','了解更多')}
+            </a>
+          </div>
+        </div>
+        <div class="col-12 col-lg-7">
+          <div class="industry-image-clean">
+            <img src="{$vo.thumb}" alt="industry visual">
+          </div>
+        </div>
+      </div>
+      {/volist}
+      {/yzn}
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/vendor/swiper-bundle.min.js"></script>
+<script>
+  (function () {
+    var el = document.getElementById('productRecommendSwiper');
+    if (!el || typeof Swiper === 'undefined') return;
+    new Swiper(el, {
+      loop: true,
+      speed: 700,
+      autoplay: {
+        delay: 5000,
+        disableOnInteraction: false
+      },
+      pagination: {
+        el: '#productRecommendSwiper .product-list-hero-pagination',
+        clickable: true
+      },
+      navigation: {
+        nextEl: '#productRecommendSwiper .product-list-hero-next',
+        prevEl: '#productRecommendSwiper .product-list-hero-prev'
+      }
+    });
+  })();
+</script>
+
+{include file="footer" /}

+ 165 - 0
templates/xtu/cms/listxtugo.html

@@ -0,0 +1,165 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/vendor/swiper-bundle.min.css">
+<link rel="stylesheet" href="/assets/xtu/xtugo.css?v=20260420-1407">
+
+<main class="xtugo-page support-page">
+  {yzn module="cms" action="lists" catid="$catid" order="listorder DESC,id ASC" num="1" return="xtugoData" moreinfo="1"}
+  {volist name="xtugoData" id="vo"}
+  <section class="xtugo-download-section">
+    <div class="content-1300-wrap xtugo-download-wrap">
+      <div class="xtugo-slider-column">
+        <div class="swiper xtugo-swiper" id="xtugoSwiper">
+          <div class="swiper-wrapper">
+            {if !empty($vo.thumbs)}
+              {volist name="vo.thumbs" id="img" key="imgKey"}
+              <div class="swiper-slide xtugo-slide-card">
+                <img src="{$img}" alt="{$vo.title|default='XTU GO'} {$imgKey}">
+              </div>
+              {/volist}
+            {else /}
+              <div class="swiper-slide xtugo-slide-card">
+                <img src="{$vo.thumb|default='/assets/xtu/vendor/img/xtugo.png'}" alt="{$vo.title|default='XTU GO'}">
+              </div>
+            {/if}
+          </div>
+          <button class="xtugo-swiper-arrow xtugo-swiper-prev" type="button" aria-label="上一张">
+            <i class="bi bi-chevron-left"></i>
+          </button>
+          <button class="xtugo-swiper-arrow xtugo-swiper-next" type="button" aria-label="下一张">
+            <i class="bi bi-chevron-right"></i>
+          </button>
+          <div class="swiper-pagination xtugo-swiper-pagination"></div>
+        </div>
+      </div>
+
+      <div class="xtugo-content-column">
+        <div class="xtugo-app-brand">
+          <div class="xtugo-app-brand-mark">
+            <img src="{$vo.thumb|default='/assets/xtu/vendor/img/xtugo.png'}" alt="{$vo.title|default='XTU GO'}">
+          </div>
+          <div class="xtugo-app-brand-copy">
+            <span class="xtugo-app-brand-kicker">XTU GO</span>
+            <h1>{$vo.title}</h1>
+            <p>{$vo.description}</p>
+          </div>
+        </div>
+
+        <div class="xtugo-feature-grid">
+          <article class="xtugo-feature-item">
+            <div class="xtugo-feature-icon"><i class="bi bi-stars"></i></div>
+            <div class="xtugo-feature-copy">
+              <h3>新品首发</h3>
+              <p>{$vo.description1|default='正品保证,全球首发'}</p>
+            </div>
+          </article>
+          <article class="xtugo-feature-item">
+            <div class="xtugo-feature-icon"><i class="bi bi-gift"></i></div>
+            <div class="xtugo-feature-copy">
+              <h3>独家福利</h3>
+              <p>{$vo.description2|default='下单有礼,六期免息'}</p>
+            </div>
+          </article>
+          <article class="xtugo-feature-item">
+            <div class="xtugo-feature-icon"><i class="bi bi-shield-check"></i></div>
+            <div class="xtugo-feature-copy">
+              <h3>设备管理</h3>
+              <p>{$vo.description3|default='一键呼叫,随时守护'}</p>
+            </div>
+          </article>
+          <article class="xtugo-feature-item">
+            <div class="xtugo-feature-icon"><i class="bi bi-journal-bookmark"></i></div>
+            <div class="xtugo-feature-copy">
+              <h3>官方教程</h3>
+              <p>{$vo.description4|default='轻松上手,大师养成'}</p>
+            </div>
+          </article>
+          <article class="xtugo-feature-item">
+            <div class="xtugo-feature-icon"><i class="bi bi-chat-square-heart"></i></div>
+            <div class="xtugo-feature-copy">
+              <h3>官方社区</h3>
+              <p>{$vo.description5|default='作品欣赏,同好交流'}</p>
+            </div>
+          </article>
+          <article class="xtugo-feature-item">
+            <div class="xtugo-feature-icon"><i class="bi bi-life-preserver"></i></div>
+            <div class="xtugo-feature-copy">
+              <h3>服务支持</h3>
+              <p>{$vo.description6|default='全面保障,无惧意外'}</p>
+            </div>
+          </article>
+        </div>
+
+        <div class="xtugo-download-panel">
+          <div class="xtugo-qr-card">
+            <div class="xtugo-qr-box">
+              <img src="{$vo.ewmurl|default='/assets/xtu/vendor/qr-placeholder.svg'}" alt="{$vo.title|default='XTU GO'} 下载二维码">
+            </div>
+            <p>{$vo.title8|default='扫码下载 XTU GO'}</p>
+          </div>
+
+          <div class="xtugo-store-list">
+            <a class="xtugo-store-btn xtugo-store-btn-android" href="{$vo.andiordurl|default='#'}" target="_blank" rel="noopener">
+              <span class="xtugo-store-icon"><i class="bi bi-android2"></i></span>
+              <span class="xtugo-store-copy">
+                <small>Download for</small>
+                <strong>Android</strong>
+              </span>
+            </a>
+            <a class="xtugo-store-btn xtugo-store-btn-ios" href="{$vo.appstore|default='#'}" target="_blank" rel="noopener">
+              <span class="xtugo-store-icon"><i class="bi bi-apple"></i></span>
+              <span class="xtugo-store-copy">
+                <small>Download on the</small>
+                <strong>App Store</strong>
+              </span>
+            </a>
+          </div>
+        </div>
+      </div>
+    </div>
+  </section>
+  {/volist}
+  {/yzn}
+
+  {yzn module="cms" action="lists" catid="$catid" order="listorder DESC,id ASC" num="1" return="xtugoUpdateData" moreinfo="1"}
+  {volist name="xtugoUpdateData" id="vo"}
+  <section class="xtugo-update-section">
+    <div class="content-1300-wrap">
+      <div class="xtugo-update-heading">最近更新</div>
+      <div class="xtugo-update-banner" style="background-image:url({$vo.thumbbig|default=$vo.thumb});">
+        <div class="xtugo-update-overlay"></div>
+        <div class="xtugo-update-copy">
+          <h2>{$vo.titlemain|default='社区精选|虚拟飞行'}</h2>
+          <p>{$vo.descriptionbig|default='社区精选,一网打尽,虚拟飞行,超多上新。'}</p>
+        </div>
+      </div>
+    </div>
+  </section>
+  {/volist}
+  {/yzn}
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/vendor/swiper-bundle.min.js"></script>
+<script>
+  document.body.classList.add('xtugo-nav-light');
+  if (document.querySelector('#xtugoSwiper') && window.Swiper) {
+    new Swiper('#xtugoSwiper', {
+      loop: true,
+      speed: 700,
+      autoplay: {
+        delay: 3200,
+        disableOnInteraction: false
+      },
+      navigation: {
+        nextEl: '.xtugo-swiper-next',
+        prevEl: '.xtugo-swiper-prev'
+      },
+      pagination: {
+        el: '.xtugo-swiper-pagination',
+        clickable: true
+      }
+    });
+  }
+</script>
+{include file="footer" /}

+ 111 - 0
templates/xtu/cms/meilisearch_result.html

@@ -0,0 +1,111 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <div class="filter-container">
+                    <div class="filter-row">
+                        <div class="filter-category d-flex">
+                            <div class="filter-category-title">时间搜索:</div>
+                            <div class="filter-options">
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=" {empty name="time"}class="active"{/empty}>全部</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=day" {eq name="time" value="day"}class="active"{/eq}>一天内</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=week" {eq name="time" value="week"}class="active"{/eq}>一周内</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=month" {eq name="time" value="month"}class="active"{/eq}>一月内</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=year" {eq name="time" value="year"}class="active"{/eq}>一年内</a>
+		                        </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="filter-row">
+                        <div class="filter-category d-flex">
+                            <div class="filter-category-title">模型搜索:</div>
+                            <div class="filter-options">
+                                <div class="filter-option">
+                                    <a href="?q={$q}" title="全部" {empty name="modelid"}class="active"{/empty}>全部</a>
+                                </div>
+                                {volist name="modellist" id="vo"}
+                                <div class="filter-option">
+                                    <a href="?q={$q}&modelid={$vo.id}" title="{$vo.name}" {eq name="vo.id" value="$modelid"}class="active"{/eq}>{$vo.name}</a>
+                                </div>
+                                {/volist}
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="filter-row">
+                        <div class="filter-category d-flex">
+                            <div class="filter-category-title">排序方式:</div>
+                            <div class="filter-options">
+                                <div class="filter-option">
+                                    <a href="?q={$q}" title="{:cms_t('default_sort','默认')}" {if $sort==''}class="active"{/if}>{:cms_t('default_sort','默认')}</a>
+                                </div>
+                                <div class="filter-option">
+                                    <a href="?q={$q}&sort=publish_time&order=desc" title="{:cms_t('latest_publish','最新发布')}" {if $sort=='publish_time' && $order=='desc'}class="active"{/if}>{:cms_t('latest_publish','最新发布')}</a>
+                                    <a href="?q={$q}&sort=publish_time&order=asc" title="{:cms_t('earliest_publish','最早发布')}" {if $sort=='publish_time' && $order=='asc'}class="active"{/if}>{:cms_t('earliest_publish','最早发布')}</a>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-header d-flex justify-content-between align-items-center">
+                <h3>{:sprintf(cms_t('found_results','找到关于 [%s] 的%s条结果'), $q, $count)}</h3>
+                <div class="layui-font-gray">{:sprintf(cms_t('search_used_time','用时%s 秒'), $search_time)}</div>
+            </div>
+            <div class="layui-card-body">
+                <ul class="article-list">
+                    {volist name="list" id="vo" empty="<div class='no-data'>{:cms_t('no_data','无数据')}</div>"}
+                    <li class="d-flex article-item-card">
+                        <a href="{$vo.url}">
+                            <div class="d-flex article-thumb align-items-center justify-content-center">
+                                {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>220 × 200</font>{/if}
+                            </div>
+                        </a>
+                        <div class="article-info">
+                            <h3 class="article-title"><a href="{$vo.url}">
+                                {if isset($vo['_formatted']['title'])}
+                                    {$vo['_formatted']['title']|raw}
+                                {else}
+                                    {$vo['title']}
+                                {/if}
+                            </a></h3>
+                            <div class="article-meta d-flex align-items-center">
+                                <span>{:getCategory($vo['catid'],'catname')}</span>
+                                <span class="meta-dot"></span>
+                                <span>{$vo.publish_time|date="Y-m-d"}</span>
+                            </div>
+                            <div class="article-abstract text-ellipsis-2">
+                                {if isset($vo['_formatted']['content'])}
+                                    {$vo['_formatted']['content']|str_cut=###,80|raw}
+                                {else}
+                                    {$vo['content']|str_cut=###,80|raw}
+                                {/if}
+                            </div>
+                        </div>
+                    </li>
+                    {/volist}
+                </ul>
+                <div class="text-center">
+                    {$pages|raw}
+                </div>
+            </div>
+        </div>
+	</div>
+    <div class="layui-col-md3">
+       {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

+ 51 - 0
templates/xtu/cms/page.html

@@ -0,0 +1,51 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <ol class="breadcrumb">
+                    <li><a href="{:addon_url('cms/index/index')}">首页</a></li>
+                    {yzn module="cms" action="breadcrumb" catid="$catid" cache="3600" order="listorder DESC" num="5" return="data"}
+                    {volist name="data" id="vo"}
+                    <li><a href="{$vo.url}">{$vo.catname}</a></li>
+                    {/volist}
+                    {/yzn}
+                </ol>
+            </div>
+            <div class="layui-card-body">
+                <div class="article-content">
+                    <h1 class="entry-title">{$title}</h1>
+                    <ul class="entry-meta">
+                        <!--发布时间-->
+                        <li class="meta-date">
+                            <span class="post-icons ri-time-line"></span>
+                            <span class="sr-only">发布时间:</span><time class="meta-value">{$publish_time|date='Y-m-d H:i'}</time>
+                        </li>
+                        <!--浏览数-->
+                        <li class="meta-views">
+                            <span class="post-icons ri-eye-line"></span>
+                            <span class="meta-value">{$hits}次浏览</span>
+                        </li>
+                    </ul>
+                    <div class="entry-content">
+                        {$content|raw}
+                    </div>
+                    <div class="entry-copyright">
+                        <p>本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!</p>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-card-footer d-flex justify-content-end">
+                <div class="social-share text-center" data-initialized="true">
+                    <a href="#" class="social-share-icon icon-weibo"></a>
+                    <a href="#" class="social-share-icon icon-qq"></a>
+                    <a href="#" class="social-share-icon icon-wechat bottom"></a>
+                </div>
+            </div>
+        </div>
+	</div>
+    <div class="layui-col-md3">
+       {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

+ 443 - 0
templates/xtu/cms/page_compare.html

@@ -0,0 +1,443 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/page-compare.css?v=20260625-1420">
+
+{php}
+$compareCategory = isset($category) ? $category : getCategory($catid ?? 41);
+$productModelId = 2;
+
+$catNames = \addons\cms\model\Category::where('modelid', $productModelId)
+    ->where('status', 1)
+    ->order('listorder DESC,id DESC')
+    ->column('catname', 'id');
+$catNames = is_array($catNames) ? $catNames : [];
+$catNames = array_filter($catNames, function ($catName, $catId) {
+    return (int)$catId > 0 && trim((string)$catName) !== '';
+}, ARRAY_FILTER_USE_BOTH);
+$productCatIds = array_map('intval', array_keys($catNames));
+$productCatIds = array_filter($productCatIds, function ($catId) {
+    return $catId > 0;
+});
+$productWhere = '`status` = 1';
+if (!empty($productCatIds)) {
+    $productWhere = "`catid` in(" . implode(',', $productCatIds) . ") AND " . $productWhere;
+}
+
+$productList = !empty($productCatIds) ? (new \addons\cms\model\Cms())->getList(
+    $productModelId,
+    $productWhere,
+    1,
+    '*',
+    'listorder DESC,id DESC',
+    50,
+    false
+) : [];
+$productList = is_array($productList) ? $productList : [];
+
+$compareText = function ($key, $default) {
+    return function_exists('cms_t') ? cms_t($key, $default) : $default;
+};
+foreach ($productList as &$productItem) {
+    $productItem['cat_label'] = $catNames[(int)($productItem['catid'] ?? 0)] ?? '';
+}
+unset($productItem);
+
+$productMap = [];
+$allowedProductIds = [];
+foreach ($productList as $productItem) {
+    $productId = (int)($productItem['id'] ?? 0);
+    if ($productId <= 0) {
+        continue;
+    }
+    $productMap[$productId] = $productItem;
+    $allowedProductIds[$productId] = true;
+}
+
+$selectedIds = [];
+$requestSelected = request()->param('compare_ids/a', []);
+if (!empty($requestSelected) && is_array($requestSelected)) {
+    foreach ($requestSelected as $selectedId) {
+        $selectedId = (int)$selectedId;
+        if ($selectedId > 0 && isset($allowedProductIds[$selectedId]) && !in_array($selectedId, $selectedIds, true)) {
+            $selectedIds[] = $selectedId;
+        }
+        if (count($selectedIds) >= 3) {
+            break;
+        }
+    }
+}
+
+if (empty($selectedIds)) {
+    foreach ($productList as $productItem) {
+        $selectedId = (int)($productItem['id'] ?? 0);
+        if ($selectedId <= 0 || in_array($selectedId, $selectedIds, true)) {
+            continue;
+        }
+        $selectedIds[] = $selectedId;
+        if (count($selectedIds) >= 3) {
+            break;
+        }
+    }
+}
+
+$selectedProducts = [];
+foreach ($selectedIds as $selectedId) {
+    if (isset($productMap[$selectedId])) {
+        $selectedProducts[] = $productMap[$selectedId];
+    }
+}
+if (count($selectedProducts) > 3) {
+    $selectedProducts = array_slice($selectedProducts, 0, 3);
+}
+while (count($selectedProducts) < 3 && !empty($productList)) {
+    foreach ($productList as $productItem) {
+        $exists = false;
+        foreach ($selectedProducts as $selectedProduct) {
+            if ((int)$selectedProduct['id'] === (int)$productItem['id']) {
+                $exists = true;
+                break;
+            }
+        }
+        if (!$exists) {
+            $selectedProducts[] = $productItem;
+            break;
+        }
+    }
+    if (count($selectedProducts) >= count($productList)) {
+        break;
+    }
+}
+$selectedProducts = array_slice($selectedProducts, 0, 3);
+$selectedIds = array_map(function ($product) {
+    return (int)($product['id'] ?? 0);
+}, $selectedProducts);
+
+$specWhere = "`catid` = 10 AND `status` = 1";
+if (!empty($selectedIds)) {
+    $specWhere .= " AND `project_id` in(" . implode(',', $selectedIds) . ")";
+}
+$specRows = (new \addons\cms\model\Cms())->getList(6, $specWhere, 1, '*', 'listorder ASC,id ASC', 500, false);
+$specRows = is_array($specRows) ? $specRows : [];
+
+$specFieldMeta = cms_cache('ModelField')[6] ?? [];
+$enabledFieldTitles = [];
+foreach ($specFieldMeta as $fieldName => $fieldMeta) {
+    if ((int)($fieldMeta['status'] ?? 0) !== 1) {
+        continue;
+    }
+    $enabledFieldTitles[$fieldName] = trim((string)($fieldMeta['title'] ?? $fieldName));
+}
+
+$compareFieldGroups = [
+    $compareText('compare_group_camera', '相机') => [
+        ['name' => '__cat_label', 'label' => $compareText('compare_label_category', '所属分类')],
+        ['name' => '__sj_status', 'label' => $compareText('compare_label_sale_status', '上架状态')],
+    ],
+    $compareText('compare_group_general', '通用') => [
+        ['name' => 'size', 'label' => $compareText('compare_label_size', '尺寸')],
+        ['name' => 'waterproof', 'label' => $compareText('compare_label_waterproof', '防水')],
+        ['name' => 'mac', 'label' => $compareText('compare_label_microphone', '麦克风')],
+        ['name' => 'weight', 'label' => $compareText('compare_label_weight', '重量')],
+        ['name' => 'conn_method', 'label' => $compareText('compare_label_connection_method', '连接方式')],
+        ['name' => 'color_ver', 'label' => $compareText('compare_label_color_version', '颜色版本')],
+        ['name' => 'vertical_shoot', 'label' => $compareText('compare_label_vertical_shoot', '原生竖拍')],
+        ['name' => 'live_stream', 'label' => $compareText('compare_label_live_stream', '直播功能')],
+    ],
+    $compareText('compare_group_display', '显示屏') => [
+        ['name' => 'rear_screen', 'label' => $compareText('compare_label_rear_screen', '后置显示屏')],
+        ['name' => 'front_screen', 'label' => $compareText('compare_label_front_screen', '前置显示屏')],
+        ['name' => 'main_cpu', 'label' => $compareText('compare_label_main_cpu', '主控CPU')],
+        ['name' => 'image_sensor', 'label' => $compareText('compare_label_image_sensor', '影像传感器')],
+        ['name' => 'iso_range', 'label' => $compareText('compare_label_iso_range', 'ISO范围')],
+        ['name' => 'e_shutter_speed', 'label' => $compareText('compare_label_e_shutter_speed', '电子快门速度')],
+        ['name' => 'normal_video', 'label' => $compareText('compare_label_normal_video', '普通录影')],
+        ['name' => 'hdr_video', 'label' => $compareText('compare_label_hdr_video', 'HDR录影')],
+        ['name' => 'night_mode', 'label' => $compareText('compare_label_night_mode', '夜景模式')],
+        ['name' => 'slowmo_video', 'label' => $compareText('compare_label_slowmo_video', '慢动作录影')],
+        ['name' => 'raw_photo', 'label' => $compareText('compare_label_raw_photo', 'RAW拍照')],
+        ['name' => 'time_lapse', 'label' => $compareText('compare_label_time_lapse', '延时摄影')],
+        ['name' => 'pre_record_time', 'label' => $compareText('compare_label_pre_record_time', '预录时长')],
+        ['name' => 'horizon_level', 'label' => $compareText('compare_label_horizon_level', '地平线矫正')],
+        ['name' => 'stabilization', 'label' => $compareText('compare_label_stabilization', '防抖')],
+        ['name' => 'video_max_bitrate', 'label' => $compareText('compare_label_video_max_bitrate', '视频储存最大码流')],
+        ['name' => 'file_system', 'label' => $compareText('compare_label_file_system', '支持文件系统')],
+        ['name' => 'image_format', 'label' => $compareText('compare_label_image_format', '图片格式')],
+        ['name' => 'video_format', 'label' => $compareText('compare_label_video_format', '视频格式')],
+        ['name' => 'sd_card_type', 'label' => $compareText('compare_label_sd_card_type', '支持存储卡类型')],
+        ['name' => 'audio_record', 'label' => $compareText('compare_label_audio_record', '音频录制')],
+    ],
+    $compareText('compare_group_battery', '电池') => [
+        ['name' => 'battery_type', 'label' => $compareText('compare_label_battery_type', '类型')],
+        ['name' => 'battery_cap', 'fallback' => 'battery_capacity', 'label' => $compareText('compare_label_battery_cap', '容量')],
+        ['name' => 'battery_energy', 'label' => $compareText('compare_label_battery_energy', '能量')],
+        ['name' => 'battery_voltage', 'label' => $compareText('compare_label_battery_voltage', '电压')],
+        ['name' => 'work_temp', 'fallback' => 'operating_temperature', 'label' => $compareText('compare_label_work_temp', '使用环境温度')],
+        ['name' => 'fast_charge', 'fallback' => 'fast_charging', 'label' => $compareText('compare_label_fast_charge', '是否支持快充')],
+        ['name' => 'charge_time', 'fallback' => 'charging_time', 'label' => $compareText('compare_label_charge_time', '充电时间')],
+        ['name' => 'battery_life', 'label' => $compareText('compare_label_battery_life', '续航时间')],
+    ],
+    $compareText('compare_group_connectivity', '连接') => [
+        ['name' => 'wifi_freq', 'fallback' => 'wifi_frequency', 'label' => $compareText('compare_label_wifi_freq', 'Wi-Fi 工作频率')],
+        ['name' => 'wifi_proto', 'fallback' => 'wifi_protocol', 'label' => $compareText('compare_label_wifi_proto', 'Wi-Fi 协议')],
+        ['name' => 'bt_freq', 'fallback' => 'bluetooth_frequency', 'label' => $compareText('compare_label_bt_freq', '蓝牙工作频率')],
+        ['name' => 'bt_proto', 'fallback' => 'bluetooth_protocol', 'label' => $compareText('compare_label_bt_proto', '蓝牙协议')],
+    ],
+    $compareText('compare_group_other_features', '其他功能') => [
+        ['name' => 'bt_setup', 'fallback' => 'bluetooth_setup', 'label' => $compareText('compare_label_bt_setup', '蓝牙配网')],
+        ['name' => 'rev_charge', 'fallback' => 'reverse_charging', 'label' => $compareText('compare_label_rev_charge', '应急反向充电')],
+        ['name' => 'voice_ctrl', 'fallback' => 'voice_control', 'label' => $compareText('compare_label_voice_ctrl', '语音控制')],
+        ['name' => 'quick_record', 'fallback' => 'quick_start_recording', 'label' => $compareText('compare_label_quick_record', '快启(快启录像)')],
+    ],
+];
+
+$specGroups = [];
+$specGroupOrder = [];
+foreach ($compareFieldGroups as $groupName => $groupFields) {
+    $rows = [];
+    foreach ($groupFields as $fieldDef) {
+        $fieldName = $fieldDef['name'];
+        $fallbackFieldName = $fieldDef['fallback'] ?? '';
+        $fieldLabel = $fieldDef['label'];
+        $rowValues = [];
+
+        if ($fieldName === '__cat_label') {
+            foreach ($selectedProducts as $product) {
+                $rowValues[(int)$product['id']] = (string)($product['cat_label'] ?? '-');
+            }
+            $rows[] = ['label' => $fieldLabel, 'values' => $rowValues];
+            continue;
+        }
+
+        if ($fieldName === '__sj_status') {
+            foreach ($selectedProducts as $product) {
+                $productId = (int)$product['id'];
+                $statusText = '';
+                foreach ($specRows as $specItem) {
+                    if ((int)($specItem['project_id'] ?? 0) !== $productId) {
+                        continue;
+                    }
+                    $statusText = trim((string)($specItem['list'] ?? ''));
+                    break;
+                }
+                $rowValues[$productId] = $statusText;
+            }
+            $rows[] = ['label' => $fieldLabel, 'values' => $rowValues];
+            continue;
+        }
+
+        if (!isset($enabledFieldTitles[$fieldName]) && (!$fallbackFieldName || !isset($enabledFieldTitles[$fallbackFieldName]))) {
+            continue;
+        }
+
+        foreach ($specRows as $specItem) {
+            $projectId = (int)($specItem['project_id'] ?? 0);
+            if ($projectId <= 0) {
+                continue;
+            }
+            $rawValue = $specItem[$fieldName] ?? '';
+            if (($rawValue === '' || $rawValue === null) && $fallbackFieldName !== '') {
+                $rawValue = $specItem[$fallbackFieldName] ?? '';
+            }
+            if (is_array($rawValue)) {
+                $rawValue = implode(' / ', $rawValue);
+            }
+            $rawValue = preg_replace('/<br\s*\/?>/i', "\n", (string)$rawValue);
+            $value = trim(strip_tags($rawValue));
+            $rowValues[$projectId] = $value;
+        }
+
+        foreach ($selectedProducts as $product) {
+            $productId = (int)$product['id'];
+            if (!isset($rowValues[$productId])) {
+                $rowValues[$productId] = '';
+            }
+        }
+
+        $rows[] = ['label' => $fieldLabel, 'values' => $rowValues];
+    }
+
+    if (!empty($rows)) {
+        $specGroups[$groupName] = $rows;
+        $specGroupOrder[] = $groupName;
+    }
+}
+{/php}
+
+<main class="compare-page">
+  <section class="compare-hero">
+    <div class="compare-hero-banner">
+      <img class="compare-hero-image" src="{:getCategory(41,'image')}" alt="{:getCategory(41,'catname')}">
+      <div class="compare-hero-minimal">
+        <div class="compare-shell">
+          <div class="compare-hero-copy">
+            <span class="compare-hero-overline">{:cms_t('compare_hero_overline','选购指南')}</span>
+            <h1>{if getCategory(41,'description')}{:getCategory(41,'description')}{else /}{:getCategory(41,'catname')}{/if}</h1>
+          </div>
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <section class="compare-main">
+    <div class="compare-shell">
+      <form class="compare-toolbar" method="get" action="{:getCategory($catid,'url')}" id="compareToolbarForm">
+        {volist name="selectedProducts" id="selectedProduct" key="slotIndex"}
+        <div class="compare-dropdown" data-compare-dropdown>
+          <input type="hidden" name="compare_ids[]" value="{$selectedProduct.id}" data-compare-input>
+          <button type="button" class="compare-dropdown-toggle" data-compare-toggle aria-expanded="false">
+            <span class="compare-dropdown-text">
+              <strong>{$selectedProduct.title}</strong>
+              <small>{$selectedProduct.cat_label|default=cms_t('compare_product_series','产品系列')}</small>
+            </span>
+            <span class="compare-dropdown-icon"></span>
+          </button>
+          <div class="compare-dropdown-menu" data-compare-menu>
+            {volist name="productList" id="option"}
+            <button type="button" class="compare-dropdown-item {if $option.id == $selectedProduct.id}is-active{/if}" data-value="{$option.id}" data-label="{$option.title}" data-subtitle="{$option.cat_label|default=cms_t('compare_product_series','产品系列')}">
+              <span class="compare-dropdown-item-title">{$option.title}</span>
+              <span class="compare-dropdown-item-subtitle">{$option.cat_label|default=cms_t('compare_product_series','产品系列')}</span>
+            </button>
+            {/volist}
+          </div>
+        </div>
+        {/volist}
+      </form>
+
+      <div class="compare-products">
+        {volist name="selectedProducts" id="product"}
+        <article class="compare-product-card">
+          <div class="compare-product-media">
+            <img src="{$product.thumb|default=$product.thumb2}" alt="{$product.title}">
+          </div>
+          <h3 class="compare-product-title">{$product.title}</h3>
+          <div class="compare-product-subtitle">{$product.title1|default=$product.title2|default=''}</div>
+          <div class="compare-product-actions">
+            <a class="compare-buy-btn" href="{$product.url}">{:cms_t('buy_now','立即购买')}</a>
+            <a class="compare-more-link" href="{$product.url}">{:cms_t('learn_more','了解更多')} <i class="bi bi-chevron-right"></i></a>
+          </div>
+        </article>
+        {/volist}
+      </div>
+
+      <div class="compare-table-wrap">
+        {if empty($specGroupOrder)}
+          <div class="compare-empty">{:cms_t('compare_empty_desc','当前还没有匹配到参数数据。请确认参数栏目 ID 10 下的内容已启用,并且每条参数内容的 project_id 正确关联到了产品内容 ID。')}</div>
+        {else /}
+          {volist name="specGroupOrder" id="groupName"}
+          <h2 class="compare-group-title">{$groupName}</h2>
+          <div class="compare-table-scroll">
+            <table class="compare-spec-table">
+              <colgroup>
+                <col>
+                <col>
+                <col>
+                <col>
+              </colgroup>
+              <tbody>
+                {volist name="specGroups[$groupName]" id="specRow"}
+                <tr>
+                  <th>{$specRow.label}</th>
+                  {volist name="selectedProducts" id="productForValue"}
+                  <td>{$specRow.values[$productForValue.id]|default=''}</td>
+                  {/volist}
+                </tr>
+                {/volist}
+              </tbody>
+            </table>
+          </div>
+          {/volist}
+        {/if}
+      </div>
+    </div>
+  </section>
+</main>
+
+<script>
+  document.addEventListener('DOMContentLoaded', function () {
+    const form = document.getElementById('compareToolbarForm')
+    const dropdowns = document.querySelectorAll('[data-compare-dropdown]')
+    let submitTimer = null
+    let submitting = false
+
+    const closeAll = () => {
+      dropdowns.forEach((dropdown) => {
+        dropdown.classList.remove('is-open')
+        const toggle = dropdown.querySelector('[data-compare-toggle]')
+        if (toggle) toggle.setAttribute('aria-expanded', 'false')
+      })
+    }
+
+    const markSubmitting = () => {
+      submitting = true
+      dropdowns.forEach((dropdown) => {
+        dropdown.classList.add('is-busy')
+        const toggle = dropdown.querySelector('[data-compare-toggle]')
+        if (toggle) toggle.disabled = true
+      })
+    }
+
+    const scheduleSubmit = () => {
+      if (!form || submitting) return
+      if (submitTimer) window.clearTimeout(submitTimer)
+      submitTimer = window.setTimeout(() => {
+        markSubmitting()
+        form.submit()
+      }, 120)
+    }
+
+    const getCurrentSelectedValues = () => Array.from(dropdowns).map((dropdown) => {
+      const input = dropdown.querySelector('[data-compare-input]')
+      return input ? String(input.value || '') : ''
+    })
+
+    dropdowns.forEach((dropdown) => {
+      const toggle = dropdown.querySelector('[data-compare-toggle]')
+      const input = dropdown.querySelector('[data-compare-input]')
+      const items = dropdown.querySelectorAll('.compare-dropdown-item')
+      if (!toggle || !input) return
+
+      toggle.addEventListener('click', function (event) {
+        event.preventDefault()
+        if (submitting) return
+        const isOpen = dropdown.classList.contains('is-open')
+        closeAll()
+        if (!isOpen) {
+          dropdown.classList.add('is-open')
+          toggle.setAttribute('aria-expanded', 'true')
+        }
+      })
+
+      items.forEach((item) => {
+        item.addEventListener('click', function () {
+          if (submitting) return
+          const nextValue = String(item.dataset.value || '')
+          const currentValues = getCurrentSelectedValues()
+          const currentValue = String(input.value || '')
+          const duplicateUsed = currentValues.some((value, index) => value === nextValue && dropdowns[index] !== dropdown)
+          if (duplicateUsed || nextValue === currentValue) {
+            closeAll()
+            return
+          }
+          input.value = nextValue
+          const titleNode = toggle.querySelector('strong')
+          const subtitleNode = toggle.querySelector('small')
+          if (titleNode) titleNode.textContent = item.dataset.label || ''
+          if (subtitleNode) subtitleNode.textContent = item.dataset.subtitle || ''
+          closeAll()
+          scheduleSubmit()
+        })
+      })
+    })
+
+    document.addEventListener('click', function (event) {
+      if (!event.target.closest('[data-compare-dropdown]')) {
+        closeAll()
+      }
+    })
+
+    document.addEventListener('keydown', function (event) {
+      if (event.key === 'Escape') closeAll()
+    })
+  })
+</script>
+
+{include file="footer" /}

+ 60 - 0
templates/xtu/cms/page_contact.html

@@ -0,0 +1,60 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/cooperation-topbar.css?v=20260508-5">
+<link rel="stylesheet" href="/assets/xtu/contact-page.css?v=20260515-1">
+
+<main class="contact-single-page" id="contactSinglePage">
+  <div class="cooperation-topbar contact-single-topbar">
+    <div class="cooperation-topbar-inner">
+      <div class="cooperation-topbar-title">{$title|default=cms_t('contact_us','联系我们')}</div>
+    </div>
+  </div>
+
+  <section class="contact-single-content">
+    <div class="content-1300-wrap">
+      <div class="contact-single-inner">
+      <div class="contact-single-layout">
+        <aside class="contact-single-sidebar" aria-label="{:getCategory(28,'catname')}">
+          <div class="contact-single-sidebar-card">
+            <h2>{:getCategory(28,'catname')}</h2>
+            <nav class="contact-single-side-nav">
+              {yzn module="cms" action="category" catid="28" cache="3600" order="listorder DESC,id ASC" num="20" return="contactNav"}
+              {volist name="contactNav" id="nav"}
+              <a class="contact-single-side-link {if $nav.id==$catid}active{/if}" href="{$nav.url}" target="{$nav.target|default='_self'}">
+                <span>{$nav.catname}</span>
+                <i class="bi bi-chevron-right"></i>
+              </a>
+              {/volist}
+              {/yzn}
+            </nav>
+          </div>
+        </aside>
+        <article class="contact-single-article">
+          <header class="contact-single-head">
+            <h1>{$title|default=cms_t('contact_us','联系我们')}</h1>
+          </header>
+          <div class="contact-single-body">
+            {$content|raw}
+          </div>
+        </article>
+      </div>
+      </div>
+    </div>
+  </section>
+</main>
+
+<script>
+  document.body.classList.add('contact-single-page-body');
+  (function () {
+    var siteHeader = document.getElementById('siteHeader');
+    var syncTopbarPosition = function () {
+      if (!siteHeader) return;
+      var headerRect = siteHeader.getBoundingClientRect();
+      document.documentElement.style.setProperty('--xtu-header-height', Math.max(0, Math.ceil(headerRect.bottom)) + 'px');
+    };
+    syncTopbarPosition();
+    window.addEventListener('load', syncTopbarPosition);
+    window.addEventListener('resize', syncTopbarPosition);
+    window.addEventListener('scroll', syncTopbarPosition, { passive: true });
+  })();
+</script>
+{include file="footer" /}

+ 264 - 0
templates/xtu/cms/page_fankui.html

@@ -0,0 +1,264 @@
+{include file="header" /}
+{php}
+$feedbackContactPhone = '';
+$feedbackContactTel = '';
+foreach (['cooperation_phone', 'contact_phone', 'service_phone', 'phone', 'tel'] as $phoneConfigKey) {
+    $phoneConfigValue = trim((string)config('site.' . $phoneConfigKey));
+    if ($phoneConfigValue === '') {
+        continue;
+    }
+    $phoneDigits = '';
+    $phoneAllowed = true;
+    $phoneTel = '';
+    foreach (preg_split('//u', $phoneConfigValue, -1, PREG_SPLIT_NO_EMPTY) as $phoneChar) {
+        if (ctype_digit($phoneChar)) {
+            $phoneDigits .= $phoneChar;
+            $phoneTel .= $phoneChar;
+            continue;
+        }
+        if ($phoneChar === '+') {
+            $phoneTel .= $phoneChar;
+            continue;
+        }
+        if (!in_array($phoneChar, ['(', ')', '-', ' '], true)) {
+            $phoneAllowed = false;
+            break;
+        }
+    }
+    if ($phoneAllowed && strlen($phoneDigits) >= 6 && mb_strlen($phoneConfigValue, 'UTF-8') <= 40) {
+        $feedbackContactPhone = $phoneConfigValue;
+        $feedbackContactTel = $phoneTel;
+        break;
+    }
+}
+{/php}
+<link rel="stylesheet" href="/assets/xtu/cooperation-topbar.css?v=20260508-5">
+<link rel="stylesheet" href="/assets/xtu/cooperation.css?v=20260515-feedback-1">
+
+<main class="cooperation-page feedback-message-page" id="feedbackMessagePage" style="--cooperation-bg:url('{$category.image|default='/assets/xtu/vendor/img/appbanner.jpg'}')">
+  <div class="cooperation-topbar">
+    <div class="cooperation-topbar-inner">
+      <div class="cooperation-topbar-title">{$title|default=cms_t('feedback_message_title','意见反馈')}</div>
+    </div>
+  </div>
+
+  <div class="cooperation-shell">
+    <section class="cooperation-copy">
+      <div class="cooperation-bar-inner">
+        <h1>{$title|default=cms_t('feedback_message_title','意见反馈')}</h1>
+        <p>{if getCategory($catid,'description')}{:getCategory($catid,'description')}{elseif !empty($category.description) /}{$category.description}{else /}{:cms_t('feedback_message_intro','欢迎提出您的意见、建议或问题反馈,我们会认真阅读并持续优化服务体验。')}{/if}</p>
+      </div>
+    </section>
+
+    <section class="cooperation-card" aria-labelledby="feedbackMessageFormTitle">
+      <div class="cooperation-card-head">
+        <h2 id="feedbackMessageFormTitle">{:cms_t('feedback_message_form_title','填写反馈')}</h2>
+        <p>{:cms_t('feedback_message_form_desc','请留下您的联系方式和反馈内容,便于我们进一步沟通处理。')}</p>
+      </div>
+      <form id="feedbackMessageForm" class="cooperation-form" data-submit-url="{:url('index/feedback/message')}">
+        <input type="hidden" name="lang" id="feedbackMessageLang" value="{$site_lang|default='cn'}">
+        <input type="hidden" name="source_page" id="feedbackMessageSourcePage" value="">
+        <input type="hidden" name="form_token" id="feedbackMessageFormToken" value="{:md5(session_id().'message_feedback')}">
+        <div class="cooperation-honeypot" aria-hidden="true"><input type="text" name="website" tabindex="-1" autocomplete="off" value=""></div>
+        <div class="cooperation-form-grid">
+          <div class="cooperation-field">
+            <select name="feedback_type" id="feedbackMessageType" aria-label="{:cms_t('feedback_message_type_label','反馈类型')}" required>
+              <option value="">{:cms_t('feedback_message_type_placeholder','反馈类型 *')}</option>
+              <option value="suggestion">{:cms_t('feedback_message_type_suggestion','意见建议')}</option>
+              <option value="problem">{:cms_t('feedback_message_type_problem','问题反馈')}</option>
+              <option value="complaint">{:cms_t('feedback_message_type_complaint','投诉建议')}</option>
+              <option value="other">{:cms_t('feedback_message_type_other','其他')}</option>
+            </select>
+          </div>
+          <div class="cooperation-field"><input type="text" name="name" placeholder="{:cms_t('cooperation_name_placeholder','姓名 *')}" maxlength="80" minlength="2" autocomplete="name" required></div>
+          <div class="cooperation-field"><input type="tel" name="phone" placeholder="{:cms_t('cooperation_phone_placeholder','电话 *')}" maxlength="40" minlength="6" autocomplete="tel" inputmode="tel" pattern="[0-9+()\-\s]{6,40}" required></div>
+          <div class="cooperation-field"><input type="email" name="email" placeholder="{:cms_t('cooperation_email_placeholder','电子邮箱 *')}" maxlength="120" autocomplete="email" required></div>
+          <div class="cooperation-field is-full">
+            <textarea name="content" id="feedbackMessageContent" placeholder="{:cms_t('feedback_message_content_placeholder','请填写反馈内容 *')}" maxlength="500" required></textarea>
+            <span class="cooperation-count" id="feedbackMessageContentCount">0/500</span>
+          </div>
+
+          <div class="cooperation-field is-full" id="feedbackMessageCaptchaWrap" style="display:none;">
+            <label class="screen-reader-text" for="feedbackMessageCaptchaInput">{:cms_t('cooperation_captcha_label','验证码 *')}</label>
+            <div class="cooperation-captcha-row">
+              <input type="text" name="verify" id="feedbackMessageCaptchaInput" placeholder="{:cms_t('cooperation_captcha_placeholder','请输入验证码')}" maxlength="6" autocomplete="off">
+              <a href="javascript:;" class="cooperation-captcha-img-wrap" id="feedbackMessageCaptchaImageLink" aria-label="{:cms_t('cooperation_refresh_captcha','刷新验证码')}"><img src="" alt="{:cms_t('cooperation_captcha_label','验证码')}" id="feedbackMessageCaptchaImage"></a>
+            </div>
+          </div>
+
+          <div class="cooperation-checks">
+            <label><input type="checkbox" name="privacy_agree" value="1" required><span>{:cms_t('cooperation_privacy_prefix','已阅读并同意')}<a href="{:getCategory(44,'url')}" target="_blank" rel="noopener">{:cms_t('cooperation_privacy_link','《隐私政策》')}</a></span></label>
+          </div>
+          <button class="cooperation-submit" id="feedbackMessageSubmitBtn" type="submit">{:cms_t('cooperation_submit','提交信息')}</button>
+          <div class="cooperation-message" id="feedbackMessageMessage" role="status" aria-live="polite"></div>
+          <div class="cooperation-contact">
+            {if condition="$feedbackContactPhone neq ''"}
+            <a href="tel:{$feedbackContactTel}" class="cooperation-contact-link"><i class="bi bi-telephone"></i> {$feedbackContactPhone}</a>
+            {/if}
+          </div>
+        </div>
+      </form>
+    </section>
+  </div>
+</main>
+
+{if condition="!empty($content)"}
+<section class="cooperation-content">
+  <div class="cooperation-content-inner">{$content|raw}</div>
+</section>
+{/if}
+
+<script>
+  document.body.classList.add('cooperation-page-body');
+  (function () {
+    const siteHeader = document.getElementById('siteHeader');
+    const syncTopbarPosition = function () {
+      if (!siteHeader) return;
+      const headerRect = siteHeader.getBoundingClientRect();
+      document.documentElement.style.setProperty('--xtu-header-height', Math.max(0, Math.ceil(headerRect.bottom)) + 'px');
+    };
+    syncTopbarPosition();
+    window.addEventListener('load', syncTopbarPosition);
+    window.addEventListener('resize', syncTopbarPosition);
+    window.addEventListener('scroll', syncTopbarPosition, { passive: true });
+    if (window.ResizeObserver && siteHeader) new ResizeObserver(syncTopbarPosition).observe(siteHeader);
+  })();
+  (function () {
+    const form = document.getElementById('feedbackMessageForm');
+    if (!form) return;
+    const submitBtn = document.getElementById('feedbackMessageSubmitBtn');
+    const messageBox = document.getElementById('feedbackMessageMessage');
+    const contentInput = document.getElementById('feedbackMessageContent');
+    const contentCount = document.getElementById('feedbackMessageContentCount');
+    const sourcePageInput = document.getElementById('feedbackMessageSourcePage');
+    const submitUrl = form.getAttribute('data-submit-url') || '/index/feedback/message';
+    const text = {
+      required: {:json_encode(cms_t('cooperation_required','请完整填写必填信息,并同意隐私政策'), JSON_UNESCAPED_UNICODE)},
+      invalidEmail: {:json_encode(cms_t('cooperation_invalid_email_hint','请输入正确的电子邮箱格式,如 name@example.com'), JSON_UNESCAPED_UNICODE)},
+      invalidPhone: {:json_encode(cms_t('cooperation_invalid_phone','请输入正确的电话号码,可包含数字、+、-、空格和括号'), JSON_UNESCAPED_UNICODE)},
+      fieldTooLong: {:json_encode(cms_t('cooperation_field_too_long','输入内容超过长度限制'), JSON_UNESCAPED_UNICODE)},
+      captchaHint: {:json_encode(cms_t('cooperation_captcha_hint','当前提交较频繁,请先完成验证码'), JSON_UNESCAPED_UNICODE)},
+      captchaError: {:json_encode(cms_t('cooperation_captcha_error','验证码错误,请重新输入'), JSON_UNESCAPED_UNICODE)},
+      sending: {:json_encode(cms_t('cooperation_sending','正在提交...'), JSON_UNESCAPED_UNICODE)},
+      success: {:json_encode(cms_t('feedback_message_success','提交成功,感谢您的反馈'), JSON_UNESCAPED_UNICODE)},
+      failed: {:json_encode(cms_t('cooperation_failed','提交失败,请稍后再试'), JSON_UNESCAPED_UNICODE)}
+    };
+    function setMessage(msg, type) {
+      if (!messageBox) return;
+      messageBox.textContent = msg || '';
+      messageBox.className = 'cooperation-message' + (type ? ' is-' + type : '');
+    }
+    function focusField(input) {
+      if (!input) return;
+      input.scrollIntoView({ behavior: 'smooth', block: 'center' });
+      input.focus({ preventScroll: true });
+    }
+    function showSuccessModal(message) {
+      let modal = document.getElementById('feedbackMessageSuccessModal');
+      if (!modal) {
+        modal = document.createElement('div');
+        modal.id = 'feedbackMessageSuccessModal';
+        modal.className = 'custom-modal custom-modal-cooperation-success';
+        modal.setAttribute('aria-hidden', 'true');
+        modal.innerHTML = '<div class="custom-modal-dialog cooperation-success-modal-dialog"><div class="custom-modal-box cooperation-success-modal-box"><button class="custom-modal-close" type="button" data-close-modal="feedbackMessageSuccessModal" aria-label="关闭">×</button><div class="cooperation-success-icon"><i class="bi bi-check2-circle"></i></div><h3 class="cooperation-success-title">提交成功</h3><p class="cooperation-success-text"></p><div class="cooperation-success-actions"><button type="button" class="cooperation-success-btn" data-close-modal="feedbackMessageSuccessModal">知道了</button></div></div></div>';
+        document.body.appendChild(modal);
+        modal.addEventListener('click', function (e) { if (e.target === modal) closeSuccessModal(); });
+      }
+      const textNode = modal.querySelector('.cooperation-success-text');
+      if (textNode) textNode.textContent = message || text.success;
+      modal.classList.add('is-open');
+      modal.setAttribute('aria-hidden', 'false');
+      document.body.classList.add('modal-open');
+      modal.querySelector('.cooperation-success-btn')?.focus();
+    }
+    function closeSuccessModal() {
+      const modal = document.getElementById('feedbackMessageSuccessModal');
+      if (!modal) return;
+      modal.classList.remove('is-open');
+      modal.setAttribute('aria-hidden', 'true');
+      if (!document.querySelector('.custom-modal.is-open') && !document.querySelector('.header-inline-search.is-open')) document.body.classList.remove('modal-open');
+    }
+    document.addEventListener('click', function (e) {
+      const closeBtn = e.target.closest && e.target.closest('[data-close-modal="feedbackMessageSuccessModal"]');
+      if (closeBtn) { e.preventDefault(); closeSuccessModal(); }
+    });
+    document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeSuccessModal(); });
+    function updateContentCount() {
+      if (!contentInput || !contentCount) return;
+      const max = Number(contentInput.getAttribute('maxlength') || 500);
+      const current = contentInput.value.length;
+      contentCount.textContent = current + '/' + max;
+      contentCount.style.color = current > max * 0.9 ? '#d92d20' : '#98a2b3';
+    }
+    function isValidEmail(value) {
+      const email = String(value || '').trim();
+      if (!email || email.length > 120) return false;
+      return /^[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/.test(email);
+    }
+    function isValidPhone(value) {
+      const phone = String(value || '').trim();
+      if (phone.length < 6 || phone.length > 40) return false;
+      if (!/^[0-9+()\-\s]+$/.test(phone)) return false;
+      return phone.replace(/\D/g, '').length >= 6;
+    }
+    function limitInputLength(input) {
+      if (!input) return;
+      const max = Number(input.getAttribute('maxlength') || 0);
+      if (max > 0 && input.value.length > max) input.value = input.value.slice(0, max);
+    }
+    function showCaptcha(force) {
+      const wrap = document.getElementById('feedbackMessageCaptchaWrap');
+      const input = document.getElementById('feedbackMessageCaptchaInput');
+      const image = document.getElementById('feedbackMessageCaptchaImage');
+      const link = document.getElementById('feedbackMessageCaptchaImageLink');
+      if (!wrap || !input || !image) return;
+      wrap.style.display = force ? '' : 'none';
+      input.required = !!force;
+      if (force && image.src.indexOf('/captcha') === -1) image.src = '/index/feedback/captcha?t=' + Date.now();
+      if (link) link.onclick = function () { image.src = '/index/feedback/captcha?t=' + Date.now(); return false; };
+    }
+    Array.prototype.forEach.call(form.querySelectorAll('input[maxlength], textarea[maxlength]'), function (input) {
+      input.addEventListener('input', function () { limitInputLength(input); if (input === contentInput) updateContentCount(); });
+    });
+    if (contentInput) { contentInput.addEventListener('input', updateContentCount); updateContentCount(); }
+    form.addEventListener('submit', async function (e) {
+      e.preventDefault();
+      const emailInput = form.querySelector('input[name="email"]');
+      const phoneInput = form.querySelector('input[name="phone"]');
+      const privacyInput = form.querySelector('input[name="privacy_agree"]');
+      if (!form.checkValidity() || !privacyInput || !privacyInput.checked) {
+        form.reportValidity && form.reportValidity();
+        setMessage(text.required, 'error');
+        return;
+      }
+      const captchaWrap = document.getElementById('feedbackMessageCaptchaWrap');
+      const captchaInput = document.getElementById('feedbackMessageCaptchaInput');
+      if (captchaWrap && captchaWrap.style.display !== 'none' && (!captchaInput || !captchaInput.value.trim())) {
+        focusField(captchaInput); setMessage(text.captchaHint, 'error'); return;
+      }
+      if (!isValidPhone(phoneInput ? phoneInput.value.trim() : '')) { focusField(phoneInput); setMessage(text.invalidPhone, 'error'); return; }
+      if (!isValidEmail(emailInput ? emailInput.value.trim() : '')) { focusField(emailInput); setMessage(text.invalidEmail, 'error'); return; }
+      Array.prototype.forEach.call(form.querySelectorAll('input[type="text"], input[type="tel"], input[type="email"], textarea'), function (input) { input.value = input.value.trim(); });
+      if (sourcePageInput) sourcePageInput.value = window.location.href;
+      if (submitBtn) submitBtn.disabled = true;
+      setMessage(text.sending, 'loading');
+      try {
+        const body = new URLSearchParams(new FormData(form));
+        const res = await fetch(submitUrl, { method:'POST', headers:{'X-Requested-With':'XMLHttpRequest','Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, body: body.toString() });
+        const data = await res.json();
+        if (data.code === 1) {
+          form.reset(); updateContentCount(); showCaptcha(false); setMessage('', ''); showSuccessModal(data.msg || text.success);
+        } else {
+          if ((data.data && Number(data.data.need_captcha || 0) === 1) || String(data.msg || '').indexOf(text.captchaError) >= 0) showCaptcha(true);
+          setMessage(data.msg || text.failed, 'error');
+        }
+      } catch (err) {
+        setMessage(text.failed, 'error');
+      } finally {
+        if (submitBtn) submitBtn.disabled = false;
+      }
+    });
+  })();
+</script>
+{include file="footer-links" /}
+{include file="footer" /}

+ 489 - 0
templates/xtu/cms/page_hangye.html

@@ -0,0 +1,489 @@
+{include file="header" /}
+{php}
+$cooperationContactPhone = '';
+$cooperationContactTel = '';
+foreach (['cooperation_phone', 'contact_phone', 'service_phone', 'phone', 'tel'] as $phoneConfigKey) {
+    $phoneConfigValue = trim((string)config('site.' . $phoneConfigKey));
+    if ($phoneConfigValue === '') {
+        continue;
+    }
+    $phoneDigits = '';
+    $phoneAllowed = true;
+    $phoneTel = '';
+    foreach (preg_split('//u', $phoneConfigValue, -1, PREG_SPLIT_NO_EMPTY) as $phoneChar) {
+        if (ctype_digit($phoneChar)) {
+            $phoneDigits .= $phoneChar;
+            $phoneTel .= $phoneChar;
+            continue;
+        }
+        if ($phoneChar === '+') {
+            $phoneTel .= $phoneChar;
+            continue;
+        }
+        if (!in_array($phoneChar, ['(', ')', '-', ' '], true)) {
+            $phoneAllowed = false;
+            break;
+        }
+    }
+    if ($phoneAllowed && strlen($phoneDigits) >= 6 && mb_strlen($phoneConfigValue, 'UTF-8') <= 40) {
+        $cooperationContactPhone = $phoneConfigValue;
+        $cooperationContactTel = $phoneTel;
+        break;
+    }
+}
+{/php}
+<link rel="stylesheet" href="/assets/xtu/cooperation-topbar.css?v=20260508-5">
+<link rel="stylesheet" href="/assets/xtu/cooperation.css?v=20260508-15">
+
+<main class="cooperation-page" id="cooperationPage" style="--cooperation-bg:url('{$category.image|default='/assets/xtu/vendor/img/appbanner.jpg'}')">
+  <div class="cooperation-topbar">
+    <div class="cooperation-topbar-inner">
+      <div class="cooperation-topbar-title">{$title|default=cms_t('cooperation_contact_title','联系我们')}</div>
+    </div>
+  </div>
+
+  <div class="cooperation-shell">
+    <section class="cooperation-copy">
+      <div class="cooperation-bar-inner">
+        <h1>{$title|default=cms_t('cooperation_contact_title','联系我们')}</h1>
+        <p>{if getCategory($catid,'description')}{:getCategory($catid,'description')}{elseif !empty($category.description) /}{$category.description}{else /}{:cms_t('cooperation_intro','请填写以下信息,我们的商务团队将会尽快与您联系,结合您的行业场景提供产品、方案与合作支持。')}{/if}</p>
+      </div>
+    </section>
+
+    <section class="cooperation-card" aria-labelledby="cooperationFormTitle">
+      <div class="cooperation-card-head">
+        <h2 id="cooperationFormTitle">{:cms_t('cooperation_contact_title','联系我们')}</h2>
+        <p>{if getCategory($catid,'description')}{:getCategory($catid,'description')}{elseif !empty($category.description) /}{$category.description}{else /}{:cms_t('cooperation_intro','请填写以下信息,我们的商务团队将会尽快与您联系,结合您的行业场景提供产品、方案与合作支持。')}{/if}</p>
+      </div>
+      <form id="cooperationLeadForm" class="cooperation-form" data-options-url="{:url('index/cooperation/options')}" data-submit-url="{:url('index/cooperation/submit')}">
+        <input type="hidden" name="lang" id="cooperationLang" value="{$site_lang|default='cn'}">
+        <input type="hidden" name="source_page" id="cooperationSourcePage" value="">
+        <input type="hidden" name="form_token" id="cooperationFormToken" value="{:md5(session_id().'cooperation_lead')}">
+        <div class="cooperation-honeypot" aria-hidden="true"><input type="text" name="website" tabindex="-1" autocomplete="off" value=""></div>
+        <div class="cooperation-form-grid">
+          <div class="cooperation-field"><input type="text" name="name" placeholder="{:cms_t('cooperation_name_placeholder','姓名 *')}" maxlength="80" minlength="2" autocomplete="name" required></div>
+          <div class="cooperation-field"><input type="tel" name="phone" placeholder="{:cms_t('cooperation_phone_placeholder','电话 *')}" maxlength="40" minlength="6" autocomplete="tel" inputmode="tel" pattern="[0-9+()\-\s]{6,40}" required></div>
+          <div class="cooperation-field"><input type="email" name="email" placeholder="{:cms_t('cooperation_email_placeholder','电子邮箱 *')}" maxlength="120" autocomplete="email" required></div>
+          <div class="cooperation-field"><input type="text" name="company" placeholder="{:cms_t('cooperation_company_placeholder','公司名称 *')}" maxlength="120" minlength="2" autocomplete="organization" required></div>
+          <div class="cooperation-field">
+            <select id="cooperationRegion" aria-label="{:cms_t('cooperation_region_label','洲/区域')}">
+              <option value="">{:cms_t('cooperation_region_placeholder','洲/区域 *')}</option>
+            </select>
+          </div>
+          <div class="cooperation-field">
+            <select name="country" id="cooperationCountry" aria-label="{:cms_t('cooperation_country_label','国家/地区')}" required disabled>
+              <option value="">{:cms_t('cooperation_country_placeholder','国家/地区 *')}</option>
+            </select>
+          </div>
+          <div class="cooperation-field is-full">
+            <select name="industry" id="cooperationIndustry" aria-label="{:cms_t('cooperation_industry_label','行业')}" required>
+              <option value="">{:cms_t('cooperation_industry_placeholder','行业 *')}</option>
+            </select>
+          </div>
+    <div class="cooperation-field is-full">
+      <textarea name="content" id="cooperationContent" placeholder="{:cms_t('cooperation_content_placeholder','咨询内容 *')}" maxlength="300" required></textarea>
+      <span class="cooperation-count" id="cooperationContentCount">0/300</span>
+    </div>
+
+    <div class="cooperation-field is-full" id="cooperationCaptchaWrap" style="display:none;">
+      <input type="hidden" id="cooperationCaptchaNeed" value="{$need_captcha|default=0}">
+      <label class="screen-reader-text" for="cooperationCaptchaInput">{:cms_t('cooperation_captcha_label','验证码 *')}</label>
+      <div class="cooperation-captcha-row">
+        <input type="text" name="verify" id="cooperationCaptchaInput" placeholder="{:cms_t('cooperation_captcha_placeholder','请输入验证码')}" maxlength="6" autocomplete="off">
+        <a href="javascript:;" class="cooperation-captcha-img-wrap" id="cooperationCaptchaImageLink" aria-label="{:cms_t('cooperation_refresh_captcha','刷新验证码')}"><img src="" alt="{:cms_t('cooperation_captcha_label','验证码')}" id="cooperationCaptchaImage"></a>
+      </div>
+    </div>
+
+    <div class="cooperation-checks">
+          <label><input type="checkbox" name="privacy_agree" value="1" required><span>{:cms_t('cooperation_privacy_prefix','已阅读并同意')}<a href="{:getCategory(44,'url')}" target="_blank" rel="noopener">{:cms_t('cooperation_privacy_link','《隐私政策》')}</a></span></label>
+        </div>
+    <button class="cooperation-submit" id="cooperationSubmitBtn" type="submit">{:cms_t('cooperation_submit','提交信息')}</button>
+    <div class="cooperation-message" id="cooperationMessage" role="status" aria-live="polite"></div>
+    <div class="cooperation-contact">
+          {if condition="$cooperationContactPhone neq ''"}
+          <a href="tel:{$cooperationContactTel}" class="cooperation-contact-link"><i class="bi bi-telephone"></i> {$cooperationContactPhone}</a>
+          {/if}
+        </div>
+      </form>
+    </section>
+  </div>
+</main>
+
+{if condition="!empty($content)"}
+<section class="cooperation-content">
+  <div class="cooperation-content-inner">{$content|raw}</div>
+</section>
+{/if}
+
+<script>
+  document.body.classList.add('cooperation-page-body');
+  (function () {
+    const siteHeader = document.getElementById('siteHeader');
+    const syncTopbarPosition = function () {
+      if (!siteHeader) return;
+      const headerRect = siteHeader.getBoundingClientRect();
+      document.documentElement.style.setProperty('--xtu-header-height', Math.max(0, Math.ceil(headerRect.bottom)) + 'px');
+    };
+    syncTopbarPosition();
+    window.addEventListener('load', syncTopbarPosition);
+    window.addEventListener('resize', syncTopbarPosition);
+    window.addEventListener('scroll', syncTopbarPosition, { passive: true });
+    if (window.ResizeObserver && siteHeader) {
+      new ResizeObserver(syncTopbarPosition).observe(siteHeader);
+    }
+  })();
+  (function () {
+    const form = document.getElementById('cooperationLeadForm');
+    if (!form) return;
+
+    const regionSelect = document.getElementById('cooperationRegion');
+    const countrySelect = document.getElementById('cooperationCountry');
+    const industrySelect = document.getElementById('cooperationIndustry');
+    const langInput = document.getElementById('cooperationLang');
+    const sourcePageInput = document.getElementById('cooperationSourcePage');
+    const submitBtn = document.getElementById('cooperationSubmitBtn');
+    const messageBox = document.getElementById('cooperationMessage');
+    const contentInput = document.getElementById('cooperationContent');
+    const contentCount = document.getElementById('cooperationContentCount');
+    const optionsUrl = form.getAttribute('data-options-url') || '/index/cooperation/options';
+    const submitUrl = form.getAttribute('data-submit-url') || '/index/cooperation/submit';
+    let countryTree = [];
+
+    const text = {
+      region: {:json_encode(cms_t('cooperation_region_placeholder','洲/区域 *'), JSON_UNESCAPED_UNICODE)},
+      country: {:json_encode(cms_t('cooperation_country_placeholder','国家/地区 *'), JSON_UNESCAPED_UNICODE)},
+      industry: {:json_encode(cms_t('cooperation_industry_placeholder','行业 *'), JSON_UNESCAPED_UNICODE)},
+      loading: {:json_encode(cms_t('cooperation_loading','选项加载中...'), JSON_UNESCAPED_UNICODE)},
+      required: {:json_encode(cms_t('cooperation_required','请完整填写必填信息,并同意隐私政策'), JSON_UNESCAPED_UNICODE)},
+      invalidEmail: {:json_encode(cms_t('cooperation_invalid_email','请输入正确的电子邮箱'), JSON_UNESCAPED_UNICODE)},
+      invalidPhone: {:json_encode(cms_t('cooperation_invalid_phone','请输入正确的电话号码,可包含数字、+、-、空格和括号'), JSON_UNESCAPED_UNICODE)},
+      invalidEmailHint: {:json_encode(cms_t('cooperation_invalid_email_hint','请输入正确的电子邮箱格式,如 name@example.com'), JSON_UNESCAPED_UNICODE)},
+      tooLong: {:json_encode(cms_t('cooperation_content_too_long','咨询内容请控制在 300 字以内'), JSON_UNESCAPED_UNICODE)},
+      fieldTooLong: {:json_encode(cms_t('cooperation_field_too_long','输入内容超过长度限制'), JSON_UNESCAPED_UNICODE)},
+      captchaHint: {:json_encode(cms_t('cooperation_captcha_hint','当前提交较频繁,请先完成验证码'), JSON_UNESCAPED_UNICODE)},
+      captchaLabel: {:json_encode(cms_t('cooperation_captcha_label','验证码 *'), JSON_UNESCAPED_UNICODE)},
+      captchaPlaceholder: {:json_encode(cms_t('cooperation_captcha_placeholder','请输入验证码'), JSON_UNESCAPED_UNICODE)},
+      refreshCaptcha: {:json_encode(cms_t('cooperation_refresh_captcha','刷新验证码'), JSON_UNESCAPED_UNICODE)},
+      captchaError: {:json_encode(cms_t('cooperation_captcha_error','验证码错误,请重新输入'), JSON_UNESCAPED_UNICODE)},
+      sending: {:json_encode(cms_t('cooperation_sending','正在提交...'), JSON_UNESCAPED_UNICODE)},
+      success: {:json_encode(cms_t('cooperation_success','提交成功,我们将尽快与您联系'), JSON_UNESCAPED_UNICODE)},
+      failed: {:json_encode(cms_t('cooperation_failed','提交失败,请稍后再试'), JSON_UNESCAPED_UNICODE)},
+      optionsFailed: {:json_encode(cms_t('cooperation_options_failed','选项加载失败,请刷新页面重试'), JSON_UNESCAPED_UNICODE)}
+    };
+
+    function normalizeLang(value) {
+      const lang = String(value || 'cn').toLowerCase();
+      if (lang === 'zh-cn' || lang === 'zh' || lang === 'cn') return 'cn';
+      if (lang.indexOf('en') === 0) return 'en';
+      return lang;
+    }
+
+    function setMessage(msg, type) {
+      if (!messageBox) return;
+      messageBox.textContent = msg || '';
+      messageBox.className = 'cooperation-message' + (type ? ' is-' + type : '');
+    }
+
+    function showSuccessModal(message) {
+      let modal = document.getElementById('cooperationSuccessModal');
+      if (!modal) {
+        modal = document.createElement('div');
+        modal.id = 'cooperationSuccessModal';
+        modal.className = 'custom-modal custom-modal-cooperation-success';
+        modal.setAttribute('aria-hidden', 'true');
+        modal.innerHTML = '<div class="custom-modal-dialog cooperation-success-modal-dialog"><div class="custom-modal-box cooperation-success-modal-box"><button class="custom-modal-close" type="button" data-close-modal="cooperationSuccessModal" aria-label="关闭">×</button><div class="cooperation-success-icon"><i class="bi bi-check2-circle"></i></div><h3 class="cooperation-success-title">提交成功</h3><p class="cooperation-success-text"></p><div class="cooperation-success-actions"><button type="button" class="cooperation-success-btn" data-close-modal="cooperationSuccessModal">知道了</button></div></div></div>';
+        document.body.appendChild(modal);
+        modal.addEventListener('click', function (e) {
+          if (e.target === modal) closeSuccessModal();
+        });
+      }
+      const textNode = modal.querySelector('.cooperation-success-text');
+      if (textNode) textNode.textContent = message || text.success;
+      modal.classList.add('is-open');
+      modal.setAttribute('aria-hidden', 'false');
+      document.body.classList.add('modal-open');
+      modal.querySelector('.cooperation-success-btn')?.focus();
+    }
+
+    function closeSuccessModal() {
+      const modal = document.getElementById('cooperationSuccessModal');
+      if (!modal) return;
+      modal.classList.remove('is-open');
+      modal.setAttribute('aria-hidden', 'true');
+      if (!document.querySelector('.custom-modal.is-open') && !document.querySelector('.header-inline-search.is-open')) {
+        document.body.classList.remove('modal-open');
+      }
+    }
+
+    document.addEventListener('click', function (e) {
+      const closeBtn = e.target.closest && e.target.closest('[data-close-modal="cooperationSuccessModal"]');
+      if (closeBtn) {
+        e.preventDefault();
+        closeSuccessModal();
+      }
+    });
+
+    document.addEventListener('keydown', function (e) {
+      if (e.key === 'Escape') closeSuccessModal();
+    });
+    function safeText(value) {
+      return String(value == null ? '' : value);
+    }
+
+    function syncSelectState(select) {
+      if (!select) return;
+      select.classList.toggle('is-placeholder', !select.value);
+    }
+
+    function showCaptcha(force) {
+      const wrap = document.getElementById('cooperationCaptchaWrap');
+      const input = document.getElementById('cooperationCaptchaInput');
+      const image = document.getElementById('cooperationCaptchaImage');
+      const link = document.getElementById('cooperationCaptchaImageLink');
+      if (!wrap || !input || !image) return;
+      wrap.style.display = force ? '' : 'none';
+      input.required = !!force;
+      if (force && image.src.indexOf('/captcha') === -1) {
+        image.src = '/index/cooperation/captcha?t=' + Date.now();
+      }
+      if (link) {
+        link.onclick = function () {
+          image.src = '/index/cooperation/captcha?t=' + Date.now();
+          return false;
+        };
+      }
+    }
+
+    function resetSelect(select, placeholder) {
+      if (!select) return;
+      select.innerHTML = '';
+      const option = document.createElement('option');
+      option.value = '';
+      option.textContent = placeholder;
+      option.disabled = true;
+      option.selected = true;
+      select.appendChild(option);
+      syncSelectState(select);
+    }
+
+    function appendOption(select, value, label) {
+      if (!select) return;
+      const option = document.createElement('option');
+      option.value = safeText(value || label);
+      option.textContent = safeText(label || value);
+      select.appendChild(option);
+    }
+
+    function fillCountries(regionValue) {
+      resetSelect(countrySelect, text.country);
+      const region = countryTree.find(function (item) {
+        return String(item.value || item.title || '') === String(regionValue || '');
+      });
+      const countries = region && Array.isArray(region.children) ? region.children : [];
+      countries.forEach(function (item) {
+        appendOption(countrySelect, item.value, item.title || item.name || item.value);
+      });
+      if (countrySelect) {
+        countrySelect.disabled = !countries.length;
+        syncSelectState(countrySelect);
+      }
+    }
+
+    async function loadOptions() {
+      const lang = normalizeLang(langInput ? langInput.value : 'cn');
+      if (langInput) langInput.value = lang;
+      resetSelect(regionSelect, text.loading);
+      resetSelect(countrySelect, text.country);
+      resetSelect(industrySelect, text.loading);
+      if (countrySelect) countrySelect.disabled = true;
+
+      try {
+        const url = optionsUrl + (optionsUrl.indexOf('?') >= 0 ? '&' : '?') + 'lang=' + encodeURIComponent(lang);
+        const res = await fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } });
+        const data = await res.json();
+        if (data.code !== 1) throw new Error(data.msg || 'options failed');
+        const payload = data.data || {};
+        countryTree = Array.isArray(payload.country_tree) ? payload.country_tree : [];
+        if (Number(payload.need_captcha || 0) === 1) {
+          showCaptcha(true);
+        }
+
+        resetSelect(regionSelect, text.region);
+        countryTree.forEach(function (region) {
+          appendOption(regionSelect, region.value, region.title || region.name || region.value);
+        });
+
+        resetSelect(industrySelect, text.industry);
+        (Array.isArray(payload.industries) ? payload.industries : []).forEach(function (item) {
+          appendOption(industrySelect, item.value, item.title || item.name || item.value);
+        });
+      } catch (err) {
+        resetSelect(regionSelect, text.region);
+        resetSelect(industrySelect, text.industry);
+        setMessage(text.optionsFailed, 'error');
+      }
+    }
+
+    if (regionSelect) {
+      regionSelect.addEventListener('change', function () {
+        syncSelectState(regionSelect);
+        fillCountries(regionSelect.value);
+      });
+    }
+    [countrySelect, industrySelect].forEach(function (select) {
+      if (!select) return;
+      select.addEventListener('change', function () {
+        syncSelectState(select);
+      });
+    });
+
+    function focusField(input) {
+      if (!input) return;
+      input.scrollIntoView({ behavior: 'smooth', block: 'center' });
+      input.focus({ preventScroll: true });
+    }
+
+    function updateContentCount() {
+      if (!contentInput || !contentCount) return;
+      const max = Number(contentInput.getAttribute('maxlength') || 300);
+      const current = contentInput.value.length;
+      contentCount.textContent = current + '/' + max;
+      contentCount.style.color = current > max * 0.9 ? '#d92d20' : '#98a2b3';
+    }
+
+    function isValidEmail(value) {
+      const email = String(value || '').trim();
+      if (!email || email.length > 120) return false;
+      return /^[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/.test(email);
+    }
+
+    function isValidPhone(value) {
+      const phone = String(value || '').trim();
+      if (phone.length < 6 || phone.length > 40) return false;
+      if (!/^[0-9+()\-\s]+$/.test(phone)) return false;
+      const digits = phone.replace(/\D/g, '');
+      return digits.length >= 6;
+    }
+
+    function isWithinMaxLength(input) {
+      if (!input) return true;
+      const max = Number(input.getAttribute('maxlength') || 0);
+      return !max || String(input.value || '').length <= max;
+    }
+
+    function limitInputLength(input) {
+      if (!input) return;
+      const max = Number(input.getAttribute('maxlength') || 0);
+      if (max > 0 && input.value.length > max) {
+        input.value = input.value.slice(0, max);
+      }
+    }
+
+    Array.prototype.forEach.call(form.querySelectorAll('input[maxlength], textarea[maxlength]'), function (input) {
+      input.addEventListener('input', function () {
+        limitInputLength(input);
+        if (input === contentInput) updateContentCount();
+      });
+    });
+
+    if (contentInput) {
+      contentInput.addEventListener('input', updateContentCount);
+      updateContentCount();
+    }
+
+    form.addEventListener('submit', async function (e) {
+      e.preventDefault();
+      const emailInput = form.querySelector('input[name="email"]');
+      const phoneInput = form.querySelector('input[name="phone"]');
+      const privacyInput = form.querySelector('input[name="privacy_agree"]');
+      const email = emailInput ? emailInput.value.trim() : '';
+      const phone = phoneInput ? phoneInput.value.trim() : '';
+
+      if (!form.checkValidity() || !privacyInput || !privacyInput.checked) {
+        form.reportValidity && form.reportValidity();
+        setMessage(text.required, 'error');
+        return;
+      }
+      const captchaWrap = document.getElementById('cooperationCaptchaWrap');
+      const captchaInput = document.getElementById('cooperationCaptchaInput');
+      if (captchaWrap && captchaWrap.style.display !== 'none' && (!captchaInput || !captchaInput.value.trim())) {
+        focusField(captchaInput);
+        setMessage(text.captchaHint, 'error');
+        return;
+      }
+      if (captchaInput && captchaInput.value) captchaInput.value = captchaInput.value.trim();
+      const lengthLimitedInputs = Array.prototype.slice.call(form.querySelectorAll('input[maxlength], textarea[maxlength]'));
+      for (let i = 0; i < lengthLimitedInputs.length; i += 1) {
+        if (!isWithinMaxLength(lengthLimitedInputs[i])) {
+          focusField(lengthLimitedInputs[i]);
+          setMessage(text.fieldTooLong, 'error');
+          return;
+        }
+      }
+      if (!isValidPhone(phone)) {
+        focusField(phoneInput);
+        setMessage(text.invalidPhone, 'error');
+        return;
+      }
+      if (!isValidEmail(email)) {
+        focusField(emailInput);
+        setMessage(text.invalidEmailHint || text.invalidEmail, 'error');
+        return;
+      }
+      if (contentInput && contentInput.value.length > 300) {
+        focusField(contentInput);
+        setMessage(text.tooLong, 'error');
+        return;
+      }
+
+      ['name', 'phone', 'email', 'company'].forEach(function (name) {
+        const input = form.querySelector('[name="' + name + '"]');
+        if (input) input.value = input.value.trim();
+      });
+      if (contentInput) contentInput.value = contentInput.value.trim();
+
+      if (sourcePageInput) sourcePageInput.value = window.location.href;
+      if (submitBtn) submitBtn.disabled = true;
+      setMessage(text.sending, 'loading');
+
+      try {
+        const body = new URLSearchParams(new FormData(form));
+        const res = await fetch(submitUrl, {
+          method: 'POST',
+          headers: {
+            'X-Requested-With': 'XMLHttpRequest',
+            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
+          },
+          body: body.toString()
+        });
+        const data = await res.json();
+        if (data.code === 1) {
+          form.reset();
+          updateContentCount();
+          resetSelect(countrySelect, text.country);
+          if (countrySelect) {
+            countrySelect.disabled = true;
+            syncSelectState(countrySelect);
+          }
+          showCaptcha(false);
+          const successMessage = data.msg || text.success;
+          setMessage('', '');
+          showSuccessModal(successMessage);
+        } else {
+          if ((data.data && Number(data.data.need_captcha || 0) === 1) || String(data.msg || '').indexOf(text.captchaError) >= 0) {
+            showCaptcha(true);
+          }
+          setMessage(data.msg || text.failed, 'error');
+        }
+      } catch (err) {
+        setMessage(text.failed, 'error');
+      } finally {
+        if (submitBtn) submitBtn.disabled = false;
+      }
+    });
+
+    loadOptions();
+  })();
+</script>
+{include file="footer-links" /}
+{include file="footer" /}

+ 51 - 0
templates/xtu/cms/page_hangye.html.bak-cooperation-20260508130556

@@ -0,0 +1,51 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <ol class="breadcrumb">
+                    <li><a href="{:addon_url('cms/index/index')}">首页</a></li>
+                    {yzn module="cms" action="breadcrumb" catid="$catid" cache="3600" order="listorder DESC" num="5" return="data"}
+                    {volist name="data" id="vo"}
+                    <li><a href="{$vo.url}">{$vo.catname}</a></li>
+                    {/volist}
+                    {/yzn}
+                </ol>
+            </div>
+            <div class="layui-card-body">
+                <div class="article-content">
+                    <h1 class="entry-title">{$title}</h1>
+                    <ul class="entry-meta">
+                        <!--发布时间-->
+                        <li class="meta-date">
+                            <span class="post-icons ri-time-line"></span>
+                            <span class="sr-only">发布时间:</span><time class="meta-value">{$publish_time|date='Y-m-d H:i'}</time>
+                        </li>
+                        <!--浏览数-->
+                        <li class="meta-views">
+                            <span class="post-icons ri-eye-line"></span>
+                            <span class="meta-value">{$hits}次浏览</span>
+                        </li>
+                    </ul>
+                    <div class="entry-content">
+                        {$content|raw}
+                    </div>
+                    <div class="entry-copyright">
+                        <p>本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!</p>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-card-footer d-flex justify-content-end">
+                <div class="social-share text-center" data-initialized="true">
+                    <a href="#" class="social-share-icon icon-weibo"></a>
+                    <a href="#" class="social-share-icon icon-qq"></a>
+                    <a href="#" class="social-share-icon icon-wechat bottom"></a>
+                </div>
+            </div>
+        </div>
+	</div>
+    <div class="layui-col-md3">
+       {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

+ 48 - 0
templates/xtu/cms/page_supportcourse.html

@@ -0,0 +1,48 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/support.css?v=20260410-1922">
+<link rel="stylesheet" href="/assets/xtu/support-detail.css?v=20260518-legal-4">
+
+<main class="support-page support-detail-page support-course-page xtu-subnav-page">
+  <section class="xtu-subnav-strip support-course-subnav-strip" aria-label="栏目名称">
+    <div class="support-container">
+      <div class="xtu-subnav-strip-title support-course-strip-title">
+        {$category.catname|default=$title|default='用户服务协议'}
+      </div>
+    </div>
+  </section>
+
+  <section class="support-detail-main support-container support-course-main">
+    <article class="support-course-article">
+      <header class="support-course-header">
+        <h2>{if !empty($title)}{$title}{else /}{:cms_t('support_course_default_title','产品教程')}{/if}</h2>
+      </header>
+      <div class="support-course-content entry-content">
+        {if !empty($content)}
+          {$content|raw}
+        {else /}
+          <div class="support-empty-state">{:cms_t('support_course_empty_content','当前暂无教程内容')}</div>
+        {/if}
+      </div>
+    </article>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script>
+(function () {
+  var siteHeader = document.getElementById('siteHeader');
+  var syncTopbarPosition = function () {
+    if (!siteHeader) return;
+    var headerRect = siteHeader.getBoundingClientRect();
+    document.documentElement.style.setProperty('--xtu-header-height', Math.max(0, Math.ceil(headerRect.bottom)) + 'px');
+  };
+  syncTopbarPosition();
+  window.addEventListener('load', syncTopbarPosition);
+  window.addEventListener('resize', syncTopbarPosition);
+  window.addEventListener('scroll', syncTopbarPosition, { passive: true });
+  if (window.ResizeObserver && siteHeader) { new ResizeObserver(syncTopbarPosition).observe(siteHeader); }
+})();
+</script>
+
+{include file="footer" /}

+ 178 - 0
templates/xtu/cms/page_supportdetail.html

@@ -0,0 +1,178 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/support.css?v=20260410-1922">
+<link rel="stylesheet" href="/assets/xtu/support-detail.css?v=20260428-1633">
+
+<main class="support-page support-detail-page">
+  <section class="support-detail-hero">
+    <div class="support-container support-detail-hero-inner">
+      <div class="support-detail-hero-copy">
+        <h1>{if !empty($supportProject.title)}{$supportProject.title}{elseif !empty($title)}{$title}{/if}</h1>
+        <p>{:cms_t('support_product_support','产品支持')}</p>
+      </div>
+      <div class="support-detail-hero-media" aria-hidden="true">
+        <img src="{$supportProject.thumb}" alt="{if !empty($supportProject.title)}{$supportProject.title}{else /}{:cms_t('support_product_support','产品支持')}{/if}">
+      </div>
+    </div>
+  </section>
+
+  <section class="support-detail-main support-container">
+    <div class="support-detail-tabs" role="tablist" aria-label="{if getCategory($catid,'catname')}{:getCategory($catid,'catname')}{else /}{:cms_t('support_product_tab_switch','产品支持内容切换')}{/if}">
+      <button class="support-detail-tab is-active" type="button" role="tab" aria-selected="true" data-target="support-detail-panel-video">{:getCategory(34,'catname')}</button>
+      <button class="support-detail-tab" type="button" role="tab" aria-selected="false" data-target="support-detail-panel-faq">{:getCategory(25,'catname')}</button>
+      <button class="support-detail-tab" type="button" role="tab" aria-selected="false" data-target="support-detail-panel-guide">{:getCategory(35,'catname')}</button>
+      <button class="support-detail-tab" type="button" role="tab" aria-selected="false" data-target="support-detail-panel-download">{:getCategory(40,'catname')}</button>
+    </div>
+
+    <div class="support-detail-panels">
+      <section class="support-detail-panel is-active" id="support-detail-panel-video" role="tabpanel">
+        {if !empty($supportVideoTabs) && !empty($supportVideoHasContent)}
+        <div class="support-detail-subtabs">
+          {volist name="supportVideoTabs" id="videoTab"}
+          <button class="support-detail-subtab {if $i==1}is-active{/if}" type="button" data-target="video-group-{$videoTab.id}">{$videoTab.catname}</button>
+          {/volist}
+        </div>
+        <div class="support-detail-subpanels">
+          {volist name="supportVideoTabs" id="videoPanel"}
+          <div class="support-detail-subpanel {if $i==1}is-active{/if}" id="video-group-{$videoPanel.id}" {if $i!=1}hidden{/if}>
+            <div class="support-video-grid" data-collapsible="video" data-visible-count="6">
+              {volist name="supportVideoMap[$videoPanel['id']]" id="videoItem"}
+              <a class="support-video-card" href="{$videoItem.url|default='javascript:;'}">
+                <span class="support-video-card-media"><img src="{$videoItem.thumb}" alt="{$videoItem.title}"></span>
+                <span class="support-video-card-title">{$videoItem.title}</span>
+              </a>
+              {/volist}
+            </div>
+            {if empty($supportVideoMap[$videoPanel['id']])}<div class="support-empty-state">{:cms_t('support_empty_video','暂无相关视频教程')}</div>{/if}
+            <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+          </div>
+          {/volist}
+        </div>
+        {else /}
+        <div class="support-video-grid" data-collapsible="video" data-visible-count="6">
+          {volist name="supportVideoDirect" id="videoItem"}
+          <a class="support-video-card" href="{$videoItem.url|default='javascript:;'}">
+            <span class="support-video-card-media"><img src="{$videoItem.image|default='/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png'}" alt="{$videoItem.title}"></span>
+            <span class="support-video-card-title">{$videoItem.title}</span>
+          </a>
+          {/volist}
+        </div>
+        {if empty($supportVideoDirect)}<div class="support-empty-state">{:cms_t('support_empty_video','暂无相关视频教程')}</div>{/if}
+        <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+        {/if}
+      </section>
+
+      <section class="support-detail-panel" id="support-detail-panel-faq" role="tabpanel" hidden>
+        {if !empty($supportFaqTabs) && !empty($supportFaqHasContent)}
+        <div class="support-detail-subtabs">
+          {volist name="supportFaqTabs" id="faqTab"}
+          <button class="support-detail-subtab {if $i==1}is-active{/if}" type="button" data-target="faq-group-{$faqTab.id}">{$faqTab.catname}</button>
+          {/volist}
+        </div>
+        <div class="support-detail-subpanels">
+          {volist name="supportFaqTabs" id="faqPanel"}
+          <div class="support-detail-subpanel {if $i==1}is-active{/if}" id="faq-group-{$faqPanel.id}" {if $i!=1}hidden{/if}>
+            <div class="support-article-list" data-collapsible="list" data-visible-count="5">
+              {volist name="supportFaqMap[$faqPanel['id']]" id="faqItem"}
+              <a class="support-article-item" href="{$faqItem.url|default='javascript:;'}"><span>{$faqItem.title}</span><i class="bi bi-chevron-right"></i></a>
+              {/volist}
+            </div>
+            {if empty($supportFaqMap[$faqPanel['id']])}<div class="support-empty-state">{:cms_t('support_empty_faq','暂无相关常见问题')}</div>{/if}
+            <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+          </div>
+          {/volist}
+        </div>
+        {else /}
+        <div class="support-article-list" data-collapsible="list" data-visible-count="5">
+          {volist name="supportFaqDirect" id="faqItem"}
+          <a class="support-article-item" href="{$faqItem.url|default='javascript:;'}"><span>{$faqItem.title}</span><i class="bi bi-chevron-right"></i></a>
+          {/volist}
+        </div>
+        {if empty($supportFaqDirect)}<div class="support-empty-state">{:cms_t('support_empty_faq','暂无相关常见问题')}</div>{/if}
+        <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+        {/if}
+      </section>
+
+      <section class="support-detail-panel" id="support-detail-panel-guide" role="tabpanel" hidden>
+        {if !empty($supportGuideTabs) && !empty($supportGuideHasContent)}
+        <div class="support-detail-subtabs">
+          {volist name="supportGuideTabs" id="guideTab"}
+          <button class="support-detail-subtab {if $i==1}is-active{/if}" type="button" data-target="guide-group-{$guideTab.id}">{$guideTab.catname}</button>
+          {/volist}
+        </div>
+        <div class="support-detail-subpanels">
+          {volist name="supportGuideTabs" id="guidePanel"}
+          <div class="support-detail-subpanel {if $i==1}is-active{/if}" id="guide-group-{$guidePanel.id}" {if $i!=1}hidden{/if}>
+            <div class="support-article-list" data-collapsible="list" data-visible-count="5">
+              {volist name="supportGuideMap[$guidePanel['id']]" id="guideItem"}
+              <a class="support-article-item" href="{$guideItem.url|default='javascript:;'}"><span>{$guideItem.title}</span><i class="bi bi-chevron-right"></i></a>
+              {/volist}
+            </div>
+            {if empty($supportGuideMap[$guidePanel['id']])}<div class="support-empty-state">{:cms_t('support_empty_guides','暂无相关产品教程')}</div>{/if}
+            <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+          </div>
+          {/volist}
+        </div>
+        {else /}
+        <div class="support-article-list" data-collapsible="list" data-visible-count="5">
+          {volist name="supportGuideDirect" id="guideItem"}
+          <a class="support-article-item" href="{$guideItem.url|default='javascript:;'}"><span>{$guideItem.title}</span><i class="bi bi-chevron-right"></i></a>
+          {/volist}
+        </div>
+        {if empty($supportGuideDirect)}<div class="support-empty-state">{:cms_t('support_empty_guides','暂无相关产品教程')}</div>{/if}
+        <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+        {/if}
+      </section>
+
+      <section class="support-detail-panel" id="support-detail-panel-download" role="tabpanel" hidden>
+        {if !empty($supportDownloadTabs) && !empty($supportDownloadHasContent)}
+        <div class="support-detail-subtabs">
+          {volist name="supportDownloadTabs" id="downloadTab"}
+          <button class="support-detail-subtab {if $i==1}is-active{/if}" type="button" data-target="download-group-{$downloadTab.id}">{$downloadTab.catname}</button>
+          {/volist}
+        </div>
+        <div class="support-detail-subpanels">
+          {volist name="supportDownloadTabs" id="downloadPanel"}
+          <div class="support-detail-subpanel {if $i==1}is-active{/if}" id="download-group-{$downloadPanel.id}" {if $i!=1}hidden{/if}>
+            <div class="support-article-list" data-collapsible="list" data-visible-count="5">
+              {volist name="supportDownloadMap[$downloadPanel['id']]" id="downloadItem"}
+              <a class="support-article-item" href="{$downloadItem[$supportDownloadField]|default='javascript:;'}" target="_blank"><span>{$downloadItem.title}</span><i class="bi bi-chevron-right"></i></a>
+              {/volist}
+            </div>
+            {if empty($supportDownloadMap[$downloadPanel['id']])}<div class="support-empty-state">{:cms_t('support_empty_downloads','暂无相关下载文档')}</div>{/if}
+            <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+          </div>
+          {/volist}
+        </div>
+        {else /}
+        <div class="support-article-list" data-collapsible="list" data-visible-count="5">
+          {volist name="supportDownloadDirect" id="downloadItem"}
+          <a class="support-article-item" href="{$downloadItem[$supportDownloadField]|default='javascript:;'}" target="_blank"><span>{$downloadItem.title}</span><i class="bi bi-chevron-right"></i></a>
+          {/volist}
+        </div>
+        {if empty($supportDownloadDirect)}<div class="support-empty-state">{:cms_t('support_empty_downloads','暂无相关下载文档')}</div>{/if}
+        <div class="support-more-wrap" hidden><button class="support-more-btn" type="button" data-more-text="{:cms_t('support_view_more','查看更多')}" data-less-text="{:cms_t('support_view_less','收起更多')}">{:cms_t('support_view_more','查看更多')}</button></div>
+        {/if}
+      </section>
+    </div>
+  </section>
+
+  <section class="support-detail-contact support-container">
+    {include file="support-contact-block" /}
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<div class="support-video-modal" id="supportVideoModal" hidden>
+  <div class="support-video-modal__backdrop" data-modal-close></div>
+  <div class="support-video-modal__dialog" role="dialog" aria-modal="true" aria-label="{:cms_t('video_play','视频播放')}">
+    <button class="support-video-modal__close" type="button" aria-label="{:cms_t('close','关闭')}" data-modal-close>×</button>
+    <div class="support-video-modal__body">
+      <video class="support-video-modal__player" controls playsinline preload="metadata"></video>
+    </div>
+  </div>
+</div>
+
+<script src="/assets/xtu/support.js?v=20260410-2041"></script>
+<script src="/assets/xtu/support-detail.js?v=20260421-1941"></script>
+{include file="footer" /}

+ 26 - 0
templates/xtu/cms/search.html

@@ -0,0 +1,26 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/search-page.css?v=20260415-1838">
+
+<main class="xtu-search-page page-main-offset">
+  <section class="xtu-search-shell xtu-search-empty-shell">
+    <div class="content-1200-wrap xtu-search-shell-inner xtu-search-empty-inner">
+      <form class="xtu-search-simple-form" method="get" action="{:cms_lang_url(addon_url('cms/search/index'))}">
+        <div class="xtu-search-simple-box xtu-search-simple-box-large">
+          <span class="xtu-search-simple-icon"><i class="bi bi-search"></i></span>
+          <input type="search" name="q" class="xtu-search-simple-input" placeholder="{:cms_t('search_placeholder_all_short','搜索产品、新闻和帮助')}" maxlength="25" autocomplete="off" required>
+          <input type="hidden" name="modelid" value="0">
+          <input type="hidden" name="scope" value="{$scope|default='site'}">
+          <input type="hidden" name="tab" value="{if $scope=='support_faq'}help{else /}product{/if}">
+        </div>
+      </form>
+
+      <div class="xtu-search-simple-tabs xtu-search-simple-tabs-empty">
+        <span class="xtu-search-simple-tab {if $scope!='support_faq'}is-active{/if}">{:cms_t('search_tab_product','产品')}</span>
+        <span class="xtu-search-simple-tab">{:cms_t('search_tab_news','新闻')}</span>
+        <span class="xtu-search-simple-tab {if $scope=='support_faq'}is-active{/if}">{:cms_t('search_tab_help','帮助')}</span>
+      </div>
+    </div>
+  </section>
+</main>
+
+{include file="footer" /}

+ 109 - 0
templates/xtu/cms/search_result.html

@@ -0,0 +1,109 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/search-page.css?v=20260415-1809">
+
+<main class="xtu-search-page page-main-offset">
+  <section class="xtu-search-shell xtu-search-result-shell">
+    <div class="content-1200-wrap xtu-search-shell-inner">
+      <form class="xtu-search-simple-form" method="get" action="{:cms_lang_url(addon_url('cms/search/index'))}">
+        <div class="xtu-search-simple-box">
+          <span class="xtu-search-simple-icon"><i class="bi bi-search"></i></span>
+          <input type="search" name="q" class="xtu-search-simple-input" value="{$q}" placeholder="{:cms_t('search_placeholder_all','请输入关键词搜索产品、新闻或帮助')}" maxlength="25" autocomplete="off" required>
+          <input type="hidden" name="modelid" value="{$modelid}">
+          <input type="hidden" name="scope" value="{$scope|default='site'}">
+          <input type="hidden" name="tab" value="{$defaultTab|default='product'}">
+        </div>
+      </form>
+
+      {php}
+        $searchScope = !empty($scope) ? $scope : 'site';
+        $productTabUrlParams = ['q' => $q, 'modelid' => $modelid, 'scope' => $searchScope, 'tab' => 'product', 'page' => 1];
+        $newsTabUrlParams = ['q' => $q, 'modelid' => $modelid, 'scope' => $searchScope, 'tab' => 'news', 'page' => 1];
+        $helpTabUrlParams = ['q' => $q, 'modelid' => $modelid, 'scope' => $searchScope, 'tab' => 'help', 'page' => 1];
+        if (!empty($time)) {
+            $productTabUrlParams['time'] = $time;
+            $newsTabUrlParams['time'] = $time;
+            $helpTabUrlParams['time'] = $time;
+        }
+      {/php}
+      <div class="xtu-search-simple-tabs xtu-search-simple-tabs-switch" role="tablist">
+        <a class="xtu-search-simple-tab {if $defaultTab=='product'}is-active{/if}" href="{:cms_lang_url(addon_url('cms/search/index', $productTabUrlParams))}">{:cms_t('search_tab_product','产品')} <em>{$groupCounts.product|default=0}</em></a>
+        <a class="xtu-search-simple-tab {if $defaultTab=='news'}is-active{/if}" href="{:cms_lang_url(addon_url('cms/search/index', $newsTabUrlParams))}">{:cms_t('search_tab_news','新闻')} <em>{$groupCounts.news|default=0}</em></a>
+        <a class="xtu-search-simple-tab {if $defaultTab=='help'}is-active{/if}" href="{:cms_lang_url(addon_url('cms/search/index', $helpTabUrlParams))}">{:cms_t('search_tab_help','帮助')} <em>{$groupCounts.help|default=0}</em></a>
+      </div>
+
+      <div class="xtu-search-tab-panels">
+        {if $defaultTab=='product'}
+        <div class="xtu-search-tab-panel is-active" data-panel="product">
+          <div class="xtu-search-simple-list">
+            {if !empty($list)}
+            {volist name="list" id="vo"}
+            <article class="xtu-search-simple-item">
+              <a class="xtu-search-simple-media" href="{$vo.url}" title="{$vo.title}">
+                {if !empty($vo.thumb)}<img src="{$vo.thumb}" alt="{$vo.title}">{else /}<div class="xtu-search-simple-placeholder">XTU</div>{/if}
+              </a>
+              <div class="xtu-search-simple-body">
+                <div class="xtu-search-simple-meta"><span>{:getCategory($vo['catid'],'catname')}</span></div>
+                <h2 class="xtu-search-simple-title"><a href="{$vo.url}">{$vo.title|cms_highlightKeyword=###,$q|raw}</a></h2>
+                <div class="xtu-search-simple-desc">{if !empty($vo.description)}{$vo.description|cms_highlightKeyword=###,$q|raw}{elseif !empty($vo.content)}{$vo.content|strip_tags|mb_substr=0,180,'utf-8'}...{/if}</div>
+              </div>
+            </article>
+            {/volist}
+            {else /}
+            <div class='xtu-search-empty'><h3>{:cms_t('search_empty_product_title','没有找到相关产品内容')}</h3><p>{:cms_t('search_empty_retry','可以尝试更换关键词重新搜索。')}</p></div>
+            {/if}
+          </div>
+        </div>
+        {elseif $defaultTab=='news' /}
+        <div class="xtu-search-tab-panel is-active" data-panel="news">
+          <div class="xtu-search-simple-list">
+            {if !empty($list)}
+            {volist name="list" id="vo"}
+            <article class="xtu-search-simple-item">
+              <a class="xtu-search-simple-media" href="{$vo.url}" title="{$vo.title}">
+                {if !empty($vo.thumb)}<img src="{$vo.thumb}" alt="{$vo.title}">{else /}<div class="xtu-search-simple-placeholder">XTU</div>{/if}
+              </a>
+              <div class="xtu-search-simple-body">
+                <div class="xtu-search-simple-meta"><span>{:getCategory($vo['catid'],'catname')}</span><span class="dot"></span><span>{$vo.publish_time|date='Y-m-d'}</span></div>
+                <h2 class="xtu-search-simple-title"><a href="{$vo.url}">{$vo.title|cms_highlightKeyword=###,$q|raw}</a></h2>
+                <div class="xtu-search-simple-desc">{if !empty($vo.description)}{$vo.description|cms_highlightKeyword=###,$q|raw}{elseif !empty($vo.content)}{$vo.content|strip_tags|mb_substr=0,180,'utf-8'}...{/if}</div>
+              </div>
+            </article>
+            {/volist}
+            {else /}
+            <div class='xtu-search-empty'><h3>{:cms_t('search_empty_news_title','没有找到相关新闻内容')}</h3><p>{:cms_t('search_empty_retry','可以尝试更换关键词重新搜索。')}</p></div>
+            {/if}
+          </div>
+        </div>
+        {else /}
+        <div class="xtu-search-tab-panel is-active" data-panel="help">
+          <div class="xtu-search-help-list">
+            {if !empty($list)}
+            {volist name="list" id="vo"}
+            <article class="xtu-search-help-item">
+              <div class="xtu-search-help-meta">
+                <span>{:getCategory($vo['catid'],'catname')}</span>
+              </div>
+              <h2 class="xtu-search-help-title">
+                <a href="{$vo.url}">{$vo.title|cms_highlightKeyword=###,$q|raw}</a>
+              </h2>
+              <div class="xtu-search-help-desc">
+                {if !empty($vo.description)}{$vo.description|cms_highlightKeyword=###,$q|raw}{elseif !empty($vo.content)}{$vo.content|strip_tags|mb_substr=0,180,'utf-8'}...{/if}
+              </div>
+            </article>
+            {/volist}
+            {else /}
+            <div class='xtu-search-empty'><h3>{:cms_t('search_empty_help_title','没有找到相关帮助内容')}</h3><p>{:cms_t('search_empty_retry','可以尝试更换关键词重新搜索。')}</p></div>
+            {/if}
+          </div>
+        </div>
+        {/if}
+      </div>
+
+      {if !empty($pages)}
+      <div class="xtu-search-pagination">{$pages|raw}</div>
+      {/if}
+    </div>
+  </section>
+</main>
+
+{include file="footer" /}

+ 151 - 0
templates/xtu/cms/show.html

@@ -0,0 +1,151 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/show-news.css?v=20260429-1715">
+
+{php}
+$articleTitle = trim((string)($title ?? ''));
+$articleTitle = $articleTitle !== '' ? $articleTitle : trim((string)($category['catname'] ?? '新闻详情'));
+$articleDesc = trim((string)($description ?? ''));
+if ($articleDesc === '' && !empty($content)) {
+    $articleDesc = mb_substr(trim(strip_tags((string)$content)), 0, 140, 'utf-8');
+}
+$articleHero = '';
+foreach (['thumb3', 'thumb2', 'thumb1', 'thumb'] as $imageField) {
+    if (!empty($$imageField)) {
+        $articleHero = $$imageField;
+        break;
+    }
+}
+$articlePublish = !empty($publish_time) ? date('Y-m-d', (int)$publish_time) : '';
+$articleUpdate = !empty($update_time) ? date('Y-m-d', (int)$update_time) : '';
+$articleTags = [];
+if (!empty($tags)) {
+    $articleTags = array_values(array_filter(array_map('trim', explode(',', (string)$tags))));
+}
+{/php}
+
+<main class="show-news-page">
+  <section class="show-news-hero">
+    <div class="content-1200-wrap show-news-hero-shell is-no-hero">
+      <div class="show-news-hero-copy">
+        <div class="show-news-breadcrumb">
+          <a href="{:cms_lang_url(addon_url('cms/index/index'))}">{:cms_t('home','首页')}</a>
+          <span>/</span>
+          <a href="{:getCategory($catid,'url')}">{$category.catname|default=''}</a>
+        </div>
+        <h1>{$articleTitle}</h1>
+        <div class="show-news-meta">
+          {if $articlePublish !== ''}<span>{$articlePublish}</span>{/if}
+          {if !empty($hits)}<span>{:cms_t('views','浏览')} {$hits}</span>{/if}
+          {if $articleUpdate !== '' && $articleUpdate !== $articlePublish}<span>{:cms_t('updated_at','更新于')} {$articleUpdate}</span>{/if}
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <section class="show-news-main">
+    <div class="content-1200-wrap show-news-main-shell">
+      <article class="show-news-article">
+        <div class="show-news-content">
+          {if $is_pay || $is_part_content_pay == 1}
+            {if !empty($content)}
+            {$content|raw}
+            {elseif !empty($description) /}
+            <p>{$description}</p>
+            {else /}
+            <p>{:cms_t('content_empty','暂无内容')}</p>
+            {/if}
+          {/if}
+
+          {if !$is_pay && $readpoint > 0}
+          <div class="show-news-paywall">
+            <p>{:cms_t('paid_read_tip_prefix','阅读此内容需要支付')} <strong>{$readpoint} {if $paytype==1}{:cms_t('currency_yuan','元')}{else /}{:cms_t('points','积分')}{/if}</strong></p>
+            <div class="show-news-paywall-actions">
+              {if $paytype==1}
+              <a href="{:addon_url('cms/order/submit',['catid'=>$catid,'id'=>$id,'pay_type'=>'wechat'])}" class="show-news-pay-btn">微信支付</a>
+              <a href="{:addon_url('cms/order/submit',['catid'=>$catid,'id'=>$id,'pay_type'=>'alipay'])}" class="show-news-pay-btn is-light">支付宝支付</a>
+              {/if}
+              <a href="{:addon_url('cms/order/submit',['catid'=>$catid,'id'=>$id,'pay_type'=>'balance'])}" class="show-news-pay-btn is-light">余额支付</a>
+            </div>
+          </div>
+          {/if}
+
+          {if !empty($pages)}
+          <div class="show-news-pages">{$pages|raw}</div>
+          {/if}
+        </div>
+
+        {if !empty($articleTags)}
+        <div class="show-news-tags-bar">
+          <div class="show-news-tag-list">
+            {volist name="articleTags" id="tag"}
+            <a href="{:addon_url('cms/tags/index',[':tag'=>$tag])}">{$tag}</a>
+            {/volist}
+          </div>
+        </div>
+        {/if}
+
+        <div class="show-news-bottom-nav">
+          {yzn module="cms" action="pre" catid="$catid" id="$id" cache="3600" return="prevData"}
+          {if !empty($prevData) && !empty($prevData.url)}
+          <a class="show-news-bottom-nav-item" href="{$prevData.url}">
+            <small>{:cms_t('prev_article','上一篇')}</small>
+            <strong>{$prevData.title|default='暂无上一篇'}</strong>
+          </a>
+          {else /}
+          <div class="show-news-bottom-nav-item is-disabled">
+            <small>{:cms_t('prev_article','上一篇')}</small>
+            <strong>{:cms_t('no_prev_article','暂无上一篇')}</strong>
+          </div>
+          {/if}
+          {/yzn}
+
+          {yzn module="cms" action="next" catid="$catid" id="$id" cache="3600" return="nextData"}
+          {if !empty($nextData) && !empty($nextData.url)}
+          <a class="show-news-bottom-nav-item" href="{$nextData.url}">
+            <small>{:cms_t('next_article','下一篇')}</small>
+            <strong>{$nextData.title|default='暂无下一篇'}</strong>
+          </a>
+          {else /}
+          <div class="show-news-bottom-nav-item is-disabled">
+            <small>{:cms_t('next_article','下一篇')}</small>
+            <strong>{:cms_t('no_next_article','暂无下一篇')}</strong>
+          </div>
+          {/if}
+          {/yzn}
+        </div>
+      </article>
+    </div>
+  </section>
+
+  {php}
+  $relatedWhere = "`catid` = " . (int)$catid . " AND `id` <> " . (int)$id . " AND `status` = 1";
+  {/php}
+  {yzn module="cms" action="lists" catid="$catid" where="$relatedWhere" order="publish_time DESC,id DESC" num="3" return="relatedNews" moreinfo="1"}
+  {if !empty($relatedNews)}
+  <section class="show-news-related-section">
+    <div class="content-1200-wrap">
+      <div class="show-news-related-head">
+        <h2>{:cms_t('related_articles','相关推荐')}</h2>
+      </div>
+      <div class="show-news-related-grid">
+        {volist name="relatedNews" id="related"}
+        <a class="show-news-related-card" href="{$related.url}">
+          <div class="show-news-related-card-thumb">
+            <img src="{if !empty($related.thumb)}{$related.thumb}{elseif !empty($related.thumb1) /}{$related.thumb1}{else /}/uploads/20260409/15d257a4faf1bc9aadd0095112b6b7f7.png{/if}" alt="{$related.title}">
+          </div>
+          <div class="show-news-related-card-copy">
+            <span>{$related.publish_time|date='Y-m-d'}</span>
+            <h3>{$related.title}</h3>
+          </div>
+        </a>
+        {/volist}
+      </div>
+    </div>
+  </section>
+  {/if}
+  {/yzn}
+
+  {include file="footer-links" /}
+</main>
+
+{include file="footer" /}

+ 54 - 0
templates/xtu/cms/show_aftersales.html

@@ -0,0 +1,54 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/aftersales.css?v=20260412-1343">
+
+<main class="aftersales-page support-page">
+  <section class="aftersales-hero">
+    <div class="support-container aftersales-hero-inner">
+      <div class="aftersales-breadcrumbs">
+       <a href="{:getCategory($category['parentid'],'url')}">{:getCategory($category['parentid'],'catname')}</a><span>›</span><a href="javascript:;">{$category.catname}</a>
+      </div>
+      <div class="aftersales-hero-figure" aria-hidden="true">
+        <div class="aftersales-hero-device">
+          <span class="aftersales-hero-device-screen"></span>
+          <span class="aftersales-hero-device-shadow"></span>
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <section class="aftersales-main support-container">
+    <div class="aftersales-layout">
+      <aside class="aftersales-sidebar">
+        <div class="aftersales-sidebar-card">
+          <ul class="aftersales-nav-list">
+            {yzn module="cms" action="lists" catid="$catid" order="$order['data']??''" num="100" return="data" moreinfo="1"}
+            {volist name="data" id="vo" key="j"}
+            <li>
+              <a class="aftersales-nav-link {if $id==$vo['id']}is-active{/if}" href="{$vo.url}">
+                <span>{$vo.title}</span>
+                <i class="bi bi-chevron-right"></i>
+              </a>
+            </li>
+
+             {/volist}
+             {/yzn}
+          </ul>
+        </div>
+      </aside>
+
+      <div class="aftersales-content-wrap">
+        <article class="aftersales-article-card">
+          <h1 class="aftersales-article-title">{$title}</h1>
+          <div class="aftersales-article-body">
+         {$content|raw}
+          </div>
+        </article>
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/aftersales.js?v=20260411-1248"></script>
+{include file="footer" /}

+ 196 - 0
templates/xtu/cms/show_appointment.html

@@ -0,0 +1,196 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/appointment.css?v=20260421-1931">
+{php}
+$appointment_status = 'open';
+$now = time();
+$starttime = isset($starttime) ? (int)$starttime : 0;
+$endtime = isset($endtime) ? (int)$endtime : 0;
+if ($starttime > 0 && $now < $starttime) {
+    $appointment_status = 'upcoming';
+} elseif ($endtime > 0 && $now > $endtime) {
+    $appointment_status = 'ended';
+}
+$appointment_status_text = $appointment_status === 'upcoming' ? cms_t('appointment_status_upcoming', '预约尚未开始') : ($appointment_status === 'ended' ? cms_t('appointment_status_ended', '预约已结束') : cms_t('appointment_status_open', '预约开启'));
+{/php}
+<main class="appointment-page">
+  <section class="appointment-hero{if !empty($video)} appointment-hero-has-video{/if}"{if empty($video)} style="background-image:url({$thumbbig|default=$thumb|default='/assets/xtu/vendor/img/appbanner.jpg'});"{/if}>
+    {if !empty($video)}
+    <div class="appointment-hero-media">
+      <video class="appointment-hero-video" autoplay muted loop playsinline preload="metadata" poster="{$thumb|default=$thumbbig|default='/assets/xtu/vendor/img/appbanner.jpg'}">
+        <source src="{$video}" type="video/mp4">
+      </video>
+    </div>
+    {/if}
+    <div class="appointment-hero-overlay"></div>
+    <div class="content-1300-wrap appointment-hero-inner">
+      <div class="appointment-hero-copy">
+        <h1>{$title}</h1>
+        {if !empty($subtitle)}
+        <div class="appointment-hero-subtitle">{$subtitle}</div>
+        {/if}
+        {if !empty($appointment_status_text)}
+        <div class="appointment-hero-status">{$appointment_status_text}</div>
+        {/if}
+        <form class="appointment-form" id="appointmentForm" action="javascript:;" method="post" novalidate>
+          <input type="hidden" name="activity_id" value="{$id}">
+          <input type="hidden" name="activity_title" value="{$title}">
+          <input type="hidden" name="source_page" id="appointmentSourcePage" value="">
+          <input type="hidden" name="lang" id="appointmentLang" value="{$lang?:'cn'}">
+          <label class="visually-hidden" for="appointmentMobile">{:cms_t('appointment_mobile_label','手机号')}</label>
+          <input id="appointmentMobile" class="appointment-input" type="tel" name="mobile" maxlength="20" placeholder="{:cms_t('appointment_mobile_placeholder','手机号码')}">
+          <label class="visually-hidden" for="appointmentEmail">{:cms_t('appointment_email_label','邮箱')}</label>
+          <input id="appointmentEmail" class="appointment-input" type="email" name="email" maxlength="191" placeholder="{:cms_t('appointment_email_placeholder','邮箱地址')}">
+          <button class="appointment-submit" id="appointmentSubmitBtn" type="submit">{:cms_t('appointment_submit','预约提醒')}</button>
+        </form>
+
+      </div>
+    </div>
+  </section>
+
+  {if !empty($content)}
+  <section class="appointment-intro-section">
+    <div class="content-1300-wrap">
+      <div class="appointment-intro">{$content|raw}</div>
+    </div>
+  </section>
+  {/if}
+
+  {if !empty($images)}
+  <section class="appointment-gallery-section">
+    <div class="content-1300-wrap">
+      <div class="swiper appointment-gallery-swiper">
+        <div class="swiper-wrapper">
+          {volist name="images" id="img"}
+          <div class="swiper-slide appointment-gallery-slide">
+            <img src="{$img.url|default=$img}" alt="{$title}">
+          </div>
+          {/volist}
+        </div>
+        <button class="appointment-gallery-arrow appointment-gallery-prev" type="button" aria-label="Prev">
+          <i class="bi bi-chevron-left"></i>
+        </button>
+        <button class="appointment-gallery-arrow appointment-gallery-next" type="button" aria-label="Next">
+          <i class="bi bi-chevron-right"></i>
+        </button>
+        <div class="appointment-gallery-pagination"></div>
+      </div>
+    </div>
+  </section>
+  {/if}
+
+  <section class="appointment-notice-section">
+    <div class="content-1300-wrap">
+      <div class="appointment-notice-box">
+        <div class="appointment-notice-title">{:cms_t('appointment_notice_title','预约须知')}</div>
+        <div class="appointment-notice-content">
+          {if !empty($booking_notice)}
+            {$booking_notice|raw}
+          {else /}
+            <p>{:cms_t('appointment_notice_default','提交预约信息后,我们将在合适时间通过短信或邮件与您联系,请确保联系方式填写正确。')}</p>
+          {/if}
+        </div>
+      </div>
+    </div>
+  </section>
+</main>
+
+<script>
+  document.getElementById('appointmentSourcePage').value = window.location.href;
+  const appointmentTexts = {
+    invalidMobile: "{:cms_t('appointment_invalid_mobile','请输入正确的手机号')}",
+    invalidEmail: "{:cms_t('appointment_invalid_email','请输入正确的邮箱地址')}",
+    success: "{:cms_t('appointment_success','预约成功')}",
+    failed: "{:cms_t('appointment_failed','预约提交失败')}",
+    retryLater: "{:cms_t('appointment_retry_later','提交失败,请稍后再试')}"
+  };
+
+  const appointmentForm = document.getElementById('appointmentForm');
+  const appointmentMobile = document.getElementById('appointmentMobile');
+  const appointmentEmail = document.getElementById('appointmentEmail');
+  const appointmentLang = document.getElementById('appointmentLang');
+
+  function resolveAppointmentLang() {
+    const raw = (appointmentLang?.value || document.documentElement.getAttribute('lang') || 'cn').toLowerCase();
+    return raw || 'cn';
+  }
+
+  function isChineseLang(lang) {
+    return ['cn', 'zh', 'zh-cn'].includes((lang || '').toLowerCase());
+  }
+
+  function syncAppointmentFields() {
+    const lang = resolveAppointmentLang();
+    const chinese = isChineseLang(lang);
+    if (appointmentLang) {
+      appointmentLang.value = lang;
+    }
+    if (appointmentMobile) {
+      appointmentMobile.style.display = chinese ? '' : 'none';
+      appointmentMobile.disabled = !chinese;
+      appointmentMobile.required = chinese;
+      if (!chinese) appointmentMobile.value = '';
+    }
+    if (appointmentEmail) {
+      appointmentEmail.style.display = chinese ? 'none' : '';
+      appointmentEmail.disabled = chinese;
+      appointmentEmail.required = !chinese;
+      if (chinese) appointmentEmail.value = '';
+    }
+  }
+
+  syncAppointmentFields();
+
+  appointmentForm?.addEventListener('submit', async function (e) {
+    e.preventDefault();
+    const form = e.currentTarget;
+    const submit = form.querySelector('.appointment-submit');
+    const lang = resolveAppointmentLang();
+    const chinese = isChineseLang(lang);
+    const mobileValue = (appointmentMobile?.value || '').trim();
+    const emailValue = (appointmentEmail?.value || '').trim();
+
+    if (appointmentLang) {
+      appointmentLang.value = lang;
+    }
+
+    if (chinese) {
+      if (!/^1\d{10}$/.test(mobileValue)) {
+        appointmentMobile?.focus();
+        alert(appointmentTexts.invalidMobile);
+        return;
+      }
+    } else {
+      if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailValue)) {
+        appointmentEmail?.focus();
+        alert(appointmentTexts.invalidEmail);
+        return;
+      }
+    }
+
+    if (submit) submit.disabled = true;
+    try {
+      const body = new URLSearchParams(new FormData(form));
+      const res = await fetch("{:url('index/appointment/submit')}", {
+        method: 'POST',
+        headers: {
+          'X-Requested-With': 'XMLHttpRequest',
+          'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
+        },
+        body: body.toString()
+      });
+      const data = await res.json();
+      if (data.code === 1) {
+        alert(data.msg || appointmentTexts.success);
+        form.reset();
+        syncAppointmentFields();
+      } else {
+        alert(data.msg || appointmentTexts.failed);
+      }
+    } catch (err) {
+      alert(appointmentTexts.retryLater);
+    } finally {
+      if (submit) submit.disabled = false;
+    }
+  });
+</script>
+{include file="footer" /}

+ 139 - 0
templates/xtu/cms/show_download.html

@@ -0,0 +1,139 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+    <div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <ol class="breadcrumb">
+                    <li><a href="{:cms_lang_url(addon_url('cms/index/index'))}">{:cms_t('home','首页')}</a></li>
+                    {yzn module="cms" action="breadcrumb" catid="$catid" cache="3600" order="listorder DESC" num="5" return="data"}
+                    {volist name="data" id="vo"}
+                    <li><a href="{$vo.url}">{$vo.catname}</a></li>
+                    {/volist}
+                    {/yzn}
+                </ol>
+            </div>
+            <div class="layui-card-body">
+                <div class="article-content">
+                    <h1 class="entry-title">{$title}</h1>
+                    <ul class="entry-meta">
+                        <!--发布时间-->
+                        <li class="meta-date">
+                            <span class="post-icons ri-time-line"></span>
+                            <span class="sr-only">{:cms_t('published_at','发布时间')}:</span><time class="meta-value">{$publish_time|date='Y-m-d H:i'}</time>
+                        </li>
+                        <!--浏览数-->
+                        <li class="meta-views">
+                            <span class="post-icons ri-eye-line"></span>
+                            <span class="meta-value">{$hits} {:cms_t('views','浏览')}</span>
+                        </li>
+                        <!--分类-->
+                        <li class="meta-categories">
+                            <span class="post-icons ri-folder-line"></span>
+                            <span class="sr-only">{:cms_t('category','分类')}:</span> <span class="meta-value"><a href="{$category.url}">{$category.catname}</a></span>
+                        </li>
+                    </ul>
+                    <ul class="entry-info">
+                        <li class="d-flex">
+                            <div class="info-item align-items-center d-flex">
+                                <span class="info-label">{:cms_t('software_author','软件作者')}:</span>
+                                <span class="info-value">{:cms_t('not_available','暂无')}</span>
+                            </div>
+                            <div class="info-item align-items-center d-flex">
+                                <span class="info-label">{:cms_t('download_count','下载次数')}:</span>
+                                <span class="info-value">{:cms_t('not_available','暂无')}</span>
+                            </div>
+                            <div class="info-item align-items-center d-flex">
+                                <span class="info-label">{:cms_t('current_version','当前版本')}:</span>
+                                <span class="info-value">v9.11.2</span>
+                            </div>
+                        </li>
+                        <li class="d-flex">
+                            <div class="info-item align-items-center d-flex">
+                                <span class="info-label">{:cms_t('updated_date','更新日期')}:</span>
+                                <span class="info-value">{$update_time|date='Y-m-d'}</span>
+                            </div>
+                            <div class="info-item align-items-center d-flex">
+                                <span class="info-label">{:cms_t('software_size','软件大小')}:</span>
+                                <span class="info-value">{:cms_t('not_available','暂无')}</span>
+                            </div>
+                            <div class="info-item align-items-center d-flex">
+                                <span class="info-label">{:cms_t('software_rating','软件评级')}:</span>
+                                <span class="info-value">
+                                    <div id="half"></div>
+                                </span>
+                            </div>
+                        </li>
+                    </ul>
+                    <a href="{$downloadurl}" target="_blank" class="layui-btn layui-btn layui-bg-blue">{:cms_t('local_download','本地下载')}</a>
+                </div>
+            </div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <h3>{:cms_t('software_intro','软件介绍')}</h3>
+            </div>
+            <div class="layui-card-body">
+                <div class="article-content">
+                    <div class="entry-content">
+                        {if $is_pay || $is_part_content_pay == 1}
+                        {$content|raw}
+                        {/if}
+                        {if !$is_pay && $readpoint > 0}
+                        <div class="allow_visitor">
+                            <p>{:cms_t('paid_read_tip_prefix','阅读此信息需要您支付')} <strong>{$readpoint} {if $paytype==1}{:cms_t('currency_yuan','元')}{else}{:cms_t('points','积分')}{/if}</strong></p>
+                            {if $paytype==1}
+                            <a href="{:addon_url('cms/order/submit',['catid'=>$catid,'id'=>$id,'pay_type'=>'wechat'])}" class="layui-btn">{:cms_t('wechat_pay','微信支付')}</a>
+                            <a href="{:addon_url('cms/order/submit',['catid'=>$catid,'id'=>$id,'pay_type'=>'alipay'])}" class="layui-btn layui-btn-normal">{:cms_t('alipay_pay','支付宝支付')}</a>
+                            {/if}
+                            <a href="{:addon_url('cms/order/submit',['catid'=>$catid,'id'=>$id,'pay_type'=>'balance'])}" class="layui-btn layui-btn-warm">{:cms_t('balance_pay','余额支付')}</a>
+                        </div>
+                        {/if}
+                        {$pages|raw}
+                    </div>
+                    <div class="entry-copyright">
+                        <p>{:cms_t('copyright_notice','本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!')}</p>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-card-footer d-flex justify-content-end">
+                <div class="social-share text-center" data-initialized="true">
+                    <a href="#" class="social-share-icon icon-weibo"></a>
+                    <a href="#" class="social-share-icon icon-qq"></a>
+                    <a href="#" class="social-share-icon icon-wechat bottom"></a>
+                </div>
+            </div>
+        </div>
+        {notempty name="tags"}
+        <div class="article-tag">
+            <span>{:cms_t('article_tags','文章标签')}:</span>
+            <div class="tag-cloud d-flex flex-wrap align-items-center">
+                {volist name=":explode(',',$tags)" id="vo"}
+                <a class="tag" href="{:addon_url('cms/tags/index',[':tag'=>$vo])}">{$vo}</a>
+                {/volist}
+            </div>
+        </div>
+        {/notempty}
+        <div class="article-nav">
+            <div class="box-body">
+                {yzn module="cms" action="pre" catid="$catid" id="$id" cache="3600" return="data"}
+                <a href="{$data.url}" {$data.target}>
+                    <p><i class="post-icons ri-arrow-left-s-line"></i>{:cms_t('prev_article','上一篇')}</p>
+                    <div class="text-ellipsis-1">{$data.title}</div>
+                </a>
+                {/yzn}
+            </div>
+            <div class="box-body">
+                {yzn module="cms" action="next" catid="$catid" id="$id" cache="3600" return="data"}
+                <a href="{$data.url}" {$data.target}>
+                    <p>{:cms_t('next_article','下一篇')}<i class="post-icons ri-arrow-right-s-line"></i></p>
+                    <div class="text-ellipsis-1">{$data.title}</div>
+                </a>
+                {/yzn}
+            </div>
+        </div>
+    </div>
+    <div class="layui-col-md3">
+        {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

+ 75 - 0
templates/xtu/cms/show_fqa.html

@@ -0,0 +1,75 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/show-fqa.css?v=20260518-5">
+
+<main class="show-fqa-page">
+  <section class="show-fqa-subnav-strip" aria-label="FAQ栏目">
+    <div class="content-1300-wrap">
+      <div class="show-fqa-strip-title">
+        {if getCategory($catid,'catname')}{:getCategory($catid,'catname')}{else /}{$category.catname|default=''}{/if}
+      </div>
+    </div>
+  </section>
+
+  <section class="show-fqa-content-section">
+    <div class="content-1300-wrap show-fqa-shell">
+      <aside class="show-fqa-sidebar">
+        <div class="show-fqa-sidebar-panel">
+          <div class="show-fqa-sidebar-scroll">
+            {if !empty($fqaSidebar)}
+              {volist name="fqaSidebar" id="channel"}
+              <section class="show-fqa-channel">
+                <h3>{$channel.title}</h3>
+                {if !empty($channel.groups)}
+                  {volist name="channel.groups" id="group"}
+                  <div class="show-fqa-group">
+                    <h4>{$group.title}</h4>
+                    <ul>
+                      {volist name="group.items" id="item"}
+                      <li class="{if $item.id==$id}is-active{/if}">
+                        <a href="{$item.url|default='javascript:;'}">{$item.title}</a>
+                      </li>
+                      {/volist}
+                    </ul>
+                  </div>
+                  {/volist}
+                {else /}
+                  <div class="show-fqa-empty">{:cms_t('support_empty_faq','暂无相关常见问题')}</div>
+                {/if}
+              </section>
+              {/volist}
+            {else /}
+              <div class="show-fqa-empty">{:cms_t('support_empty_faq','暂无相关常见问题')}</div>
+            {/if}
+          </div>
+        </div>
+      </aside>
+
+      <section class="show-fqa-main">
+        <article class="show-fqa-article">
+          <header class="show-fqa-article-head">
+            <h1>{$title}</h1>
+          </header>
+          <div class="show-fqa-article-body">{$content|raw}</div>
+        </article>
+      </section>
+    </div>
+  </section>
+</main>
+
+<script>
+(function () {
+  var siteHeader = document.getElementById('siteHeader');
+  var syncTopbarPosition = function () {
+    if (!siteHeader) return;
+    var headerRect = siteHeader.getBoundingClientRect();
+    document.documentElement.style.setProperty('--xtu-header-height', Math.max(0, Math.ceil(headerRect.bottom)) + 'px');
+  };
+  syncTopbarPosition();
+  window.addEventListener('load', syncTopbarPosition);
+  window.addEventListener('resize', syncTopbarPosition);
+  window.addEventListener('scroll', syncTopbarPosition, { passive: true });
+  if (window.ResizeObserver && siteHeader) { new ResizeObserver(syncTopbarPosition).observe(siteHeader); }
+})();
+</script>
+
+{include file="footer" /}

+ 220 - 0
templates/xtu/cms/show_job.html

@@ -0,0 +1,220 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/job.css?v=20260506-2118">
+
+{php}
+$jobTitle = trim((string)($title ?? ''));
+$jobTitle = $jobTitle !== '' ? $jobTitle : trim((string)($category['catname'] ?? cms_t('job_detail','岗位详情')));
+$jobAddress = trim((string)($address ?? ''));
+$jobType = trim((string)($jobtype ?? ''));
+$jobPublish = !empty($publish_time) ? date('Y-m-d', (int)$publish_time) : '';
+$jobZhize = trim((string)($zhize ?? ''));
+$jobYaoqiu = trim((string)($yaoqiu ?? ''));
+$jobZhizeHtml = nl2br($jobZhize);
+$jobYaoqiuHtml = nl2br($jobYaoqiu);
+$jobApplyEmail = trim((string)config('site.job_email'));
+$jobApplyEmail = $jobApplyEmail !== '' ? $jobApplyEmail : 'hr@xtu.com';
+$jobMailSubject = rawurlencode(cms_t('job_apply_subject_prefix','应聘岗位:') . $jobTitle);
+{/php}
+
+<main class="job-page job-detail-page job-dji-detail-page">
+  <section class="job-dji-detail-wrap">
+    <div class="content-1300-wrap">
+      <nav class="job-dji-breadcrumb" aria-label="breadcrumb">
+        <a href="{:cms_lang_url(addon_url('cms/index/index'))}">{:cms_t('home','首页')}</a>
+        <span>/</span>
+        {if !empty($category['parentid'])}
+        <a href="{:getCategory($category['parentid'],'url')}">{:getCategory($category['parentid'],'catname')}</a>
+        <span>/</span>
+        {/if}
+        <em>{$category.catname|default=cms_t('job_detail','岗位详情')}</em>
+      </nav>
+      <article class="job-dji-detail-main">
+        <h1 class="job-dji-title">{$jobTitle}</h1>
+
+        <div class="job-dji-meta">
+          {if $jobAddress !== ''}<span><i class="bi bi-geo-alt"></i>{$jobAddress}</span>{/if}
+          {if $jobType !== ''}<span><i class="bi bi-briefcase"></i>{$jobType}</span>{/if}
+          {if $jobPublish !== ''}<span><i class="bi bi-clock"></i>{$jobPublish}</span>{/if}
+        </div>
+
+        <section class="job-dji-block">
+          <h2>{:cms_t('job_responsibilities','工作职责')}</h2>
+          <div class="job-dji-richtext">
+            {if $jobZhize !== ''}
+              {$jobZhizeHtml|raw}
+            {else /}
+              <p>{:cms_t('job_no_responsibilities','暂无工作职责说明。')}</p>
+            {/if}
+          </div>
+        </section>
+
+        <section class="job-dji-block">
+          <h2>{:cms_t('job_requirements','任职要求')}</h2>
+          <div class="job-dji-richtext">
+            {if $jobYaoqiu !== ''}
+              {$jobYaoqiuHtml|raw}
+            {else /}
+              <p>{:cms_t('job_no_requirements','暂无任职要求说明。')}</p>
+            {/if}
+          </div>
+        </section>
+
+        <p class="job-dji-apply-note">{:cms_t('job_apply_email_intro','投递简历请发送至邮箱:')}<a href="mailto:{$jobApplyEmail}">{$jobApplyEmail}</a></p>
+
+        <div class="job-dji-actions">
+          <a class="job-dji-btn job-dji-btn-primary" href="mailto:{$jobApplyEmail}?subject={$jobMailSubject}"><i class="bi bi-send"></i>{:cms_t('job_apply_now','立即申请')}</a>
+          <button class="job-dji-btn job-dji-btn-secondary job-dji-favorite" type="button"><i class="bi bi-star"></i>{:cms_t('job_favorite','收藏')}</button>
+          <button class="job-dji-btn job-dji-btn-secondary job-dji-share" type="button"><i class="bi bi-share"></i>{:cms_t('job_share','分享')}</button>
+        </div>
+      </article>
+    </div>
+  </section>
+
+  <section class="job-dji-more-section">
+    <div class="content-1300-wrap">
+      <div class="job-dji-more-wrap">
+        <div class="job-dji-more-head">
+          <h2>{:cms_t('job_more_jobs','更多岗位')}</h2>
+          <a href="{:getCategory($catid,'url')}">{:cms_t('job_view_all','查看全部')}</a>
+        </div>
+        <div class="job-dji-more-list job-simple-list-wrap">
+        {php}$relatedWhere = "`catid` = " . (int)$catid . " AND `id` <> " . (int)$id . " AND `status` = 1";{/php}
+        {yzn module="cms" action="lists" catid="$catid" where="$relatedWhere" order="publish_time DESC,id DESC" num="3" return="relatedJobs" moreinfo="1"}
+        {volist name="relatedJobs" id="related"}
+        <a class="job-card job-simple-row" href="{$related.url}">
+          <div class="job-simple-row-title">{$related.title}</div>
+          <div class="job-simple-row-meta">
+            {if !empty($related.address)}<span><i class="bi bi-geo-alt"></i>{$related.address}</span>{/if}
+            {if !empty($related.jobtype)}<span><i class="bi bi-briefcase"></i>{$related.jobtype}</span>{/if}
+            {if !empty($related.publish_time)}<span><i class="bi bi-clock"></i>{$related.publish_time|date='Y-m-d'}</span>{/if}
+          </div>
+          <span class="job-simple-row-link">{:cms_t('job_view_detail','查看详情')} <i class="bi bi-arrow-right"></i></span>
+        </a>
+        {/volist}
+        {/yzn}
+        </div>
+      </div>
+    </div>
+  </section>
+
+  {include file="footer-links" /}
+</main>
+
+<div class="job-share-popover" id="jobShareModal" hidden>
+  <button class="job-share-close" type="button" data-share-close aria-label="{:cms_t('job_share_close','关闭')}"><i class="bi bi-x-lg"></i></button>
+  <div class="job-share-qr"><img id="jobShareQr" src="" alt="{:cms_t('job_share_qr_alt','岗位分享二维码')}"></div>
+  <button class="job-share-copy-mini" type="button" id="jobShareCopy"><i class="bi bi-link-45deg"></i>{:cms_t('job_copy_share_link','复制分享链接')}</button>
+  <input id="jobShareLink" type="text" readonly value="" aria-label="{:cms_t('job_share_link','分享链接')}">
+</div>
+
+<script>
+(function(){
+  var modal = document.getElementById('jobShareModal');
+  var qr = document.getElementById('jobShareQr');
+  var linkInput = document.getElementById('jobShareLink');
+  var copyBtn = document.getElementById('jobShareCopy');
+  var activeShareBtn = null;
+  var textCopied = "{:cms_t('job_copied_paste','已复制,可粘贴')}";
+  var textLongPress = "{:cms_t('job_long_press_copy','长按下方链接复制')}";
+  var textCopyLink = "{:cms_t('job_copy_share_link','复制分享链接')}";
+  var textFavorite = "{:cms_t('job_favorite','收藏')}";
+  var textFavoriteTip = "{:cms_t('job_favorite_tip','请按 Ctrl + D 将当前岗位加入浏览器收藏夹')}";
+  function currentUrl(){ return window.location.href.split('#')[0]; }
+  function setCopyText(ok){
+    if (!copyBtn) return;
+    copyBtn.innerHTML = ok ? '<i class="bi bi-check2"></i>' + textCopied : '<i class="bi bi-link-45deg"></i>' + textLongPress;
+    setTimeout(function(){ copyBtn.innerHTML = '<i class="bi bi-link-45deg"></i>' + textCopyLink; }, 1800);
+  }
+  function placeShare(){
+    if (!modal || !activeShareBtn || modal.hidden) return;
+    var rect = activeShareBtn.getBoundingClientRect();
+    var width = modal.offsetWidth || 196;
+    var gap = 10;
+    var left = rect.left + window.pageXOffset + rect.width / 2 - width / 2;
+    var minLeft = window.pageXOffset + 12;
+    var maxLeft = window.pageXOffset + window.innerWidth - width - 12;
+    left = Math.max(minLeft, Math.min(left, maxLeft));
+    var top = rect.bottom + window.pageYOffset + gap;
+    modal.style.left = left + 'px';
+    modal.style.top = top + 'px';
+    modal.style.setProperty('--share-arrow-left', (rect.left + window.pageXOffset + rect.width / 2 - left) + 'px');
+  }
+  function openShare(btn){
+    activeShareBtn = btn;
+    var url = currentUrl();
+    if (linkInput) linkInput.value = url;
+    if (qr) qr.src = 'https://api.qrserver.com/v1/create-qr-code/?size=150x150&margin=8&data=' + encodeURIComponent(url);
+    if (modal) {
+      modal.hidden = false;
+      placeShare();
+    }
+  }
+  function closeShare(){ if (modal) modal.hidden = true; activeShareBtn = null; }
+  function fallbackCopy(url){
+    var ta = document.createElement('textarea');
+    ta.value = url;
+    ta.setAttribute('readonly', 'readonly');
+    ta.style.position = 'fixed';
+    ta.style.left = '0';
+    ta.style.top = '0';
+    ta.style.width = '1px';
+    ta.style.height = '1px';
+    ta.style.opacity = '0.01';
+    ta.style.zIndex = '-1';
+    document.body.appendChild(ta);
+    ta.focus();
+    ta.select();
+    ta.setSelectionRange(0, ta.value.length);
+    var ok = false;
+    try { ok = document.execCommand('copy'); } catch(e) { ok = false; }
+    document.body.removeChild(ta);
+    return ok;
+  }
+  function copyLink(){
+    var url = currentUrl();
+    if (linkInput) linkInput.value = url;
+    var ok = fallbackCopy(url);
+    if (ok) { setCopyText(true); return; }
+    if (navigator.clipboard && window.isSecureContext) {
+      navigator.clipboard.writeText(url).then(function(){ setCopyText(true); }).catch(function(){
+        if (linkInput) { linkInput.focus(); linkInput.select(); linkInput.setSelectionRange(0, linkInput.value.length); }
+        setCopyText(false);
+      });
+    } else {
+      if (linkInput) { linkInput.focus(); linkInput.select(); linkInput.setSelectionRange(0, linkInput.value.length); }
+      setCopyText(false);
+    }
+  }
+  document.addEventListener('click', function (event) {
+    var shareBtn = event.target.closest('.job-dji-share');
+    var favBtn = event.target.closest('.job-dji-favorite');
+    var closeBtn = event.target.closest('[data-share-close]');
+    if (shareBtn) { event.stopPropagation(); openShare(shareBtn); return; }
+    if (favBtn) favoritePage(favBtn);
+    if (closeBtn) { closeShare(); return; }
+    if (modal && !modal.hidden && !event.target.closest('#jobShareModal')) closeShare();
+  });
+  if (copyBtn) copyBtn.addEventListener('click', function(event){ event.stopPropagation(); copyLink(); });
+  window.addEventListener('resize', placeShare);
+  window.addEventListener('scroll', placeShare, true);
+  function favoritePage(btn){
+    var url = currentUrl();
+    var title = document.title;
+    try {
+      if (window.external && ('addFavorite' in window.external)) {
+        window.external.addFavorite(url, title);
+        return;
+      }
+      if (window.sidebar && window.sidebar.addPanel) {
+        window.sidebar.addPanel(title, url, '');
+        return;
+      }
+    } catch(e) {}
+    alert(textFavoriteTip);
+    if (btn) btn.innerHTML = '<i class="bi bi-star-fill"></i>' + textFavorite;
+  }
+  document.addEventListener('keydown', function(event){ if (event.key === 'Escape') closeShare(); });
+})();
+</script>
+
+{include file="footer" /}

+ 906 - 0
templates/xtu/cms/show_product.html

@@ -0,0 +1,906 @@
+{include file="header" /}
+{if $m_style==1}
+<link rel="stylesheet" href="/assets/xtu/show-product.css?v=202608304-mobilefix6">
+{else}
+<link rel="stylesheet" href="/assets/xtu/show-product-bai.css?v=202620804-mobilefix6">
+{/if}
+
+
+<main class="show-product-page">
+  <section class="show-product-hero">
+    <div class="show-product-hero-media">
+      <img src="{$thumb3}" alt="{$title}">
+    </div>
+    <div class="show-product-hero-overlay"></div>
+    <div class="show-product-hero-content">
+      <div class="show-product-hero-copy">
+        {if !empty($title1)}
+        <div class="show-product-hero-subtitle">{$title1}</div>
+        {/if}
+        <h1>{$title}</h1>
+        {if !empty($title2)}
+        <div class="show-product-hero-tagline">{$title2}</div>
+        {/if}
+        <div class="show-product-hero-actions">
+          {if !empty($shopurl)}
+          <a class="show-product-hero-btn show-product-hero-btn-light" href="{$shopurl}" target="_blank">{:cms_t('buy_now','立即购买')}</a>
+          {/if}
+          {if !empty($video)}
+          <button class="show-product-hero-btn show-product-hero-btn-dark js-product-video-open" type="button" data-video="{$video}">
+            {:cms_t('watch_video','观看视频')}
+            <i class="bi bi-play-fill"></i>
+          </button>
+          {/if}
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <div class="show-product-video-modal" id="showProductVideoModal" hidden>
+    <div class="show-product-video-modal__backdrop" data-product-modal-close></div>
+    <div class="show-product-video-modal__dialog" role="dialog" aria-modal="true" aria-label="{:cms_t('watch_video','观看视频')}">
+      <button class="show-product-video-modal__close" type="button" aria-label="{:cms_t('close','关闭')}" data-product-modal-close>×</button>
+      <div class="show-product-video-modal__body">
+        <video class="show-product-video-modal__player" controls playsinline preload="metadata"></video>
+      </div>
+    </div>
+  </div>
+  <?php $where = "project_id=".$id; ?>
+  {yzn module="cms" action="lists" catid="9" where="$where" order="listorder asc,id desc" num="1" return="productBlocks" moreinfo="1"}
+  {volist name="productBlocks" id="block"}
+  <section class="show-product-story-section">
+    <div class="content-1300-wrap">
+      <div class="show-product-story-copy text-center">
+        {if !empty($block.title_2_1)}
+        <h2 class="spx-reveal">{$block.title_2_1}</h2>
+        {/if}
+      </div>
+      <div class="show-product-story-media">
+        {if !empty($block.thumb_2_pc)}
+        <img class="show-product-story-image is-pc" src="{$block.thumb_2_pc}" alt="{$title}">
+        {/if}
+        {if !empty($block.thumb_2_wap)}
+        <img class="show-product-story-image is-wap" src="{$block.thumb_2_wap}" alt="{$title}">
+        {/if}
+      </div>
+      <div class="show-product-story-copy show-product-story-copy-bottom text-center">
+        {if !empty($block.title_2_2)}
+        <p class="spx-reveal spx-reveal--delay-1">{$block.title_2_2}</p>
+        {/if}
+        {if !empty($shopurl)}
+        <div class="show-product-story-action">
+          <a href="{$shopurl}" target="_blank" class="show-product-story-link">{:cms_t('learn_more','了解更多')}</a>
+        </div>
+        {/if}
+      </div>
+    </div>
+  </section>
+
+
+  <section class="spx-stage-three js-spx-stage-three">
+    <div class="content-1300-wrap">
+      <div class="spx-stage-three-copy">
+        <div class="spx-stage-three-copy-switch">
+          {if !empty($block.title_3_1)}
+          <div class="spx-stage-three-title-layer js-spx-stage-three-title-layer">
+            <h2 class="spx-stage-three-title">{$block.title_3_1|nl2br=###|raw}</h2>
+          </div>
+          {/if}
+
+          <div class="spx-stage-three-texts js-spx-stage-three-texts">
+            {if !empty($block.title_3_2)}
+            <h3 class="spx-stage-three-subtitle">{$block.title_3_2|nl2br=###|raw}</h3>
+            {/if}
+            {if !empty($block.title_3_3)}
+            <p class="spx-stage-three-text">{$block.title_3_3|nl2br=###|raw}</p>
+            {/if}
+          </div>
+        </div>
+
+        {if !empty($block.thumb_3_pc)}
+        <div class="spx-stage-three-media">
+          <img class="spx-stage-three-image" src="{$block.thumb_3_pc}" alt="{$title}">
+        </div>
+        {/if}
+      </div>
+    </div>
+  </section>
+
+  <section class="spx-stage-four js-spx-stage-four">
+    <div class="content-1300-wrap">
+      <div class="spx-stage-four-head">
+        <div class="spx-stage-four-head-left">
+          {if !empty($block.title_4_3)}
+          <div class="spx-stage-kicker spx-reveal">{$block.title_4_3|nl2br=###|raw}</div>
+          {/if}
+          {if !empty($block.title_4_1)}
+          <h2 class="spx-stage-four-title spx-reveal spx-reveal--delay-1">{$block.title_4_1|nl2br=###|raw}</h2>
+          {/if}
+        </div>
+        <div class="spx-stage-four-head-right">
+          {if !empty($block.title_4_2)}
+          <div class="spx-stage-four-desc spx-reveal spx-reveal--delay-2">{$block.title_4_2|nl2br=###|raw}</div>
+          {/if}
+        </div>
+      </div>
+
+      <?php
+        $stageFourMedia = !empty($block['thumb_4']) ? $block['thumb_4'] : (!empty($block['video_4']) ? $block['video_4'] : (!empty($block['thumb_4_wap']) ? $block['thumb_4_wap'] : (!empty($block['thumb_4_pc']) ? $block['thumb_4_pc'] : '')));
+        $stageFourMediaExt = $stageFourMedia ? strtolower(pathinfo(parse_url($stageFourMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+        $stageFourMediaIsVideo = in_array($stageFourMediaExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+      ?>
+      <div class="spx-stage-four-compare spx-stage-four-compare-single">
+        <div class="spx-stage-four-card spx-stage-four-card-single">
+          <div class="spx-stage-four-card-media">
+            {if !empty($stageFourMedia)}
+              {if $stageFourMediaIsVideo}
+            <video class="spx-stage-four-video" src="<?php echo $stageFourMedia; ?>" autoplay muted loop playsinline preload="metadata"></video>
+              {else /}
+            <img class="spx-stage-four-image" src="<?php echo $stageFourMedia; ?>" alt="{$title}">
+              {/if}
+            {/if}
+          </div>
+        </div>
+      </div>
+    </div>
+  </section>
+
+  <?php
+    $stageFiveMedia = !empty($block['thumb_5']) ? $block['thumb_5'] : '';
+    $stageFiveMediaExt = $stageFiveMedia ? strtolower(pathinfo(parse_url($stageFiveMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageFiveMediaIsVideo = in_array($stageFiveMediaExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  <section class="spx-stage-five js-spx-stage-five">
+    <div class="content-1300-wrap">
+      <div class="spx-stage-five-copy text-center">
+        {if !empty($block.title_5_3)}
+        <div class="spx-stage-kicker spx-stage-five-kicker spx-reveal">{$block.title_5_3|nl2br=###|raw}</div>
+        {/if}
+        {if !empty($block.title_5_1)}
+        <h2 class="spx-stage-five-title spx-reveal spx-reveal--delay-1">{$block.title_5_1|nl2br=###|raw}</h2>
+        {/if}
+        {if !empty($block.title_5_2)}
+        <div class="spx-stage-five-desc spx-reveal spx-reveal--delay-2">{$block.title_5_2|nl2br=###|raw}</div>
+        {/if}
+      </div>
+      {if !empty($stageFiveMedia)}
+      <div class="spx-stage-five-media">
+        {if $stageFiveMediaIsVideo}
+        <video class="spx-stage-five-video" src="<?php echo $stageFiveMedia; ?>" autoplay muted loop playsinline preload="metadata"></video>
+        {else /}
+        <img class="spx-stage-five-image" src="<?php echo $stageFiveMedia; ?>" alt="{$title}">
+        {/if}
+      </div>
+      {/if}
+    </div>
+  </section>
+
+  <?php
+    $stageSixRaw = $block['thumb_6'] ?? [];
+    $stageSixSlides = [];
+
+    if (is_array($stageSixRaw)) {
+      $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($stageSixRaw));
+      foreach ($iterator as $item) {
+        if (is_string($item)) {
+          $item = trim($item);
+          if ($item !== '') {
+            $stageSixSlides[] = $item;
+          }
+        }
+      }
+    } else {
+      $stageSixRaw = trim((string)$stageSixRaw);
+      if ($stageSixRaw !== '') {
+        $stageSixSlides = preg_split('/[\r\n,|]+/', $stageSixRaw);
+        $stageSixSlides = array_values(array_filter(array_map('trim', $stageSixSlides)));
+      }
+    }
+  ?>
+  <section class="spx-stage-six js-spx-stage-six">
+    <div class="content-1300-wrap">
+      <div class="spx-stage-six-head">
+        <div class="spx-stage-six-head-left">
+          {if !empty($block.title_6_1)}
+          <h2 class="spx-stage-six-title spx-reveal">{$block.title_6_1|nl2br=###|raw}</h2>
+          {/if}
+        </div>
+        <div class="spx-stage-six-head-right">
+          {if !empty($block.title_6_2)}
+          <div class="spx-stage-six-desc spx-reveal spx-reveal--delay-1">{$block.title_6_2|nl2br=###|raw}</div>
+          {/if}
+        </div>
+      </div>
+
+      {if !empty($stageSixSlides)}
+      <div class="spx-stage-six-slider js-stage-six-slider">
+        <div class="spx-stage-six-track">
+          {volist name="stageSixSlides" id="slide" key="slideIndex"}
+          <div class="spx-stage-six-slide{if $slideIndex == 1} is-active{/if}">
+            <img class="spx-stage-six-image" src="{$slide}" alt="{$title}">
+          </div>
+          {/volist}
+
+          {if count($stageSixSlides) > 1}
+          <button class="spx-stage-six-arrow spx-stage-six-arrow-prev" type="button" data-stage-six-prev aria-label="上一张">
+            <i class="bi bi-chevron-left" aria-hidden="true"></i>
+          </button>
+          <button class="spx-stage-six-arrow spx-stage-six-arrow-next" type="button" data-stage-six-next aria-label="下一张">
+            <i class="bi bi-chevron-right" aria-hidden="true"></i>
+          </button>
+
+          <div class="spx-stage-six-dots spx-stage-six-dots-inside">
+            {volist name="stageSixSlides" id="slide" key="slideIndex"}
+            <button class="spx-stage-six-dot{if $slideIndex == 1} is-active{/if}" type="button" data-stage-six-dot="{$slideIndex - 1}" aria-label="Slide {$slideIndex}"></button>
+            {/volist}
+          </div>
+          {/if}
+        </div>
+      </div>
+      {/if}
+    </div>
+  </section>
+
+  <?php
+    $stageSevenMedia = !empty($block['thumb_7']) ? $block['thumb_7'] : '';
+    $stageSevenMediaExt = $stageSevenMedia ? strtolower(pathinfo(parse_url($stageSevenMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageSevenMediaIsVideo = in_array($stageSevenMediaExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  <section class="spx-stage-seven js-spx-stage-seven">
+    <div class="content-1300-wrap">
+      <div class="spx-stage-seven-copy text-center">
+        {if !empty($block.title_7_1)}
+        <h2 class="spx-stage-seven-title spx-reveal">{$block.title_7_1|nl2br=###|raw}</h2>
+        {/if}
+        {if !empty($block.title_7_2)}
+        <div class="spx-stage-seven-desc spx-reveal spx-reveal--delay-1">{$block.title_7_2|nl2br=###|raw}</div>
+        {/if}
+      </div>
+      {if !empty($stageSevenMedia)}
+      <div class="spx-stage-seven-media">
+        {if $stageSevenMediaIsVideo}
+        <video class="spx-stage-seven-video" src="<?php echo $stageSevenMedia; ?>" autoplay muted loop playsinline preload="metadata"></video>
+        {else /}
+        <img class="spx-stage-seven-image" src="<?php echo $stageSevenMedia; ?>" alt="{$title}">
+        {/if}
+      </div>
+      {/if}
+    </div>
+  </section>
+
+  <?php
+    $stageEightMediaRaw = $block['thumb_8'] ?? [];
+    $stageEightLabelRaw = $block['tag_8'] ?? [];
+    $stageEightContentRaw = $block['title_8_2'] ?? [];
+
+    $spxFlatten = function ($value) {
+      $result = [];
+      if (is_array($value)) {
+        $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($value));
+        foreach ($iterator as $item) {
+          if (is_string($item)) {
+            $item = trim($item);
+            if ($item !== '') {
+              $result[] = $item;
+            }
+          }
+        }
+      } else {
+        $value = trim((string)$value);
+        if ($value !== '') {
+          $result = preg_split('/[\r\n|]+/', $value);
+          $result = array_values(array_filter(array_map('trim', $result)));
+        }
+      }
+      return $result;
+    };
+
+    $stageEightMediaList = $spxFlatten($stageEightMediaRaw);
+    $stageEightLabelList = $spxFlatten($stageEightLabelRaw);
+    $stageEightContentList = $spxFlatten($stageEightContentRaw);
+    $stageEightItems = [];
+    $stageEightCount = max(count($stageEightMediaList), count($stageEightLabelList), count($stageEightContentList));
+
+    for ($i = 0; $i < $stageEightCount; $i++) {
+      $media = $stageEightMediaList[$i] ?? '';
+      $label = $stageEightLabelList[$i] ?? '';
+      $content = $stageEightContentList[$i] ?? '';
+      if ($media === '' && $label === '' && $content === '') {
+        continue;
+      }
+      $ext = $media ? strtolower(pathinfo(parse_url($media, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+      $stageEightItems[] = [
+        'media' => $media,
+        'label' => $label,
+        'content' => $content,
+        'is_video' => in_array($ext, ['mp4', 'webm', 'ogg', 'mov', 'm4v']),
+      ];
+    }
+  ?>
+  <section class="spx-stage-eight js-stage-eight">
+    <div class="content-1300-wrap">
+      <div class="spx-stage-eight-copy text-center">
+        {if !empty($block.title_8_1)}
+        <h2 class="spx-stage-eight-title spx-reveal">{$block.title_8_1|nl2br=###|raw}</h2>
+        {/if}
+      </div>
+
+      {if !empty($stageEightItems)}
+      <div class="spx-stage-eight-tabs js-stage-eight-tabs">
+        <div class="spx-stage-eight-media-wrap">
+          {volist name="stageEightItems" id="item" key="itemIndex"}
+          <div class="spx-stage-eight-panel{if $itemIndex == 1} is-active{/if}" data-stage-eight-panel="{$itemIndex - 1}">
+            {if !empty($item.media)}
+              {if $item.is_video}
+            <video class="spx-stage-eight-video" src="{$item.media}" autoplay muted loop playsinline preload="metadata"></video>
+              {else /}
+            <img class="spx-stage-eight-image" src="{$item.media}" alt="{$title}">
+              {/if}
+            {/if}
+          </div>
+          {/volist}
+        </div>
+
+        <div class="spx-stage-eight-nav" role="tablist" aria-label="第八屏切换标签">
+          {volist name="stageEightItems" id="item" key="itemIndex"}
+          <button class="spx-stage-eight-tab{if $itemIndex == 1} is-active{/if}" type="button" data-stage-eight-tab="{$itemIndex - 1}" role="tab" aria-selected="{if $itemIndex == 1}true{else /}false{/if}">
+            {$item.label|default='标签'}
+          </button>
+          {/volist}
+        </div>
+
+        <div class="spx-stage-eight-content-wrap">
+          {volist name="stageEightItems" id="item" key="itemIndex"}
+          <div class="spx-stage-eight-content{if $itemIndex == 1} is-active{/if}" data-stage-eight-content="{$itemIndex - 1}">
+            {$item.content|default=''}
+          </div>
+          {/volist}
+        </div>
+      </div>
+      {/if}
+    </div>
+  </section>
+
+  <?php
+    $stageNineMedia = !empty($block['thumb_9']) ? (is_string($block['thumb_9']) ? $block['thumb_9'] : '') : '';
+    $stageNineMediaExt = $stageNineMedia ? strtolower(pathinfo(parse_url($stageNineMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageNineMediaIsVideo = in_array($stageNineMediaExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  <section class="spx-stage-nine js-stage-nine">
+    <div class="spx-stage-nine-sticky">
+      <div class="content-1300-wrap">
+        <div class="spx-stage-nine-title-layer">
+          {if !empty($block.title_9)}
+          <h2 class="spx-stage-nine-title spx-reveal">{$block.title_9|nl2br=###|raw}</h2>
+          {/if}
+        </div>
+
+        {if !empty($stageNineMedia)}
+        <div class="spx-stage-nine-media">
+          {if $stageNineMediaIsVideo}
+          <video class="spx-stage-nine-video" src="<?php echo $stageNineMedia; ?>" preload="metadata" muted></video>
+          {else /}
+          <img class="spx-stage-nine-image" src="<?php echo $stageNineMedia; ?>" alt="{$title}">
+          {/if}
+        </div>
+        {/if}
+
+        <div class="spx-stage-nine-overlay-copy">
+          {if !empty($block.title_10_1)}
+          <h3 class="spx-stage-nine-subtitle spx-reveal spx-reveal--delay-1">{$block.title_10_1|nl2br=###|raw}</h3>
+          {/if}
+          {if !empty($block.title_10_2)}
+          <div class="spx-stage-nine-desc spx-reveal spx-reveal--delay-2">{$block.title_10_2|nl2br=###|raw}</div>
+          {/if}
+           {if !empty($block.thumb_10)}
+          <div class="spx-stage-nine-media">
+        
+          <img class="spx-stage-nine-image" src="{$block.thumb_10}">
+     
+            </div>
+              {/if}
+        </div>
+
+      </div>
+    </div>
+  </section>
+
+  <?php
+    $stageTenMediaRaw = $block['thumb_11'] ?? [];
+    $stageTenTitle = !empty($block['title_11_1']) ? $block['title_11_1'] : '';
+    $stageTenLabelsRaw = $block['title_11_2'] ?? [];
+
+    $stageTenMediaList = $spxFlatten($stageTenMediaRaw);
+    $stageTenLabelList = $spxFlatten($stageTenLabelsRaw);
+    $stageTenItems = [];
+    $stageTenCount = max(count($stageTenMediaList), count($stageTenLabelList));
+
+    for ($i = 0; $i < $stageTenCount; $i++) {
+      $media = $stageTenMediaList[$i] ?? '';
+      $label = $stageTenLabelList[$i] ?? '';
+      if ($media === '' && $label === '') {
+        continue;
+      }
+      $ext = $media ? strtolower(pathinfo(parse_url($media, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+      $stageTenItems[] = [
+        'media' => $media,
+        'label' => $label,
+        'is_video' => in_array($ext, ['mp4', 'webm', 'ogg', 'mov', 'm4v']),
+      ];
+    }
+  ?>
+  {if !empty($stageTenItems) || !empty($stageTenTitle)}
+  <section class="spx-stage-ten js-stage-ten">
+    <div class="content-1300-wrap">
+      <div class="spx-stage-ten-container">
+        <div class="spx-stage-ten-media">
+          <div class="spx-stage-ten-media-container">
+            {volist name="stageTenItems" id="item" key="itemIndex"}
+            <div class="spx-stage-ten-panel{if $itemIndex == 1} is-active{/if}" data-stage-ten-panel="{$itemIndex - 1}">
+              {if !empty($item.media)}
+                {if $item.is_video}
+              <video class="spx-stage-ten-video" src="{$item.media}" muted playsinline preload="metadata" loop></video>
+              <button class="spx-stage-ten-sound-toggle" type="button" data-stage-ten-sound aria-label="切换声音">
+                <i class="bi bi-volume-mute-fill" aria-hidden="true"></i>
+              </button>
+                {else /}
+              <img class="spx-stage-ten-image" src="{$item.media}" alt="{$title}">
+                {/if}
+              {/if}
+            </div>
+            {/volist}
+          </div>
+        </div>
+
+        <div class="spx-stage-ten-content">
+          {if !empty($stageTenTitle)}
+          <h2 class="spx-stage-ten-title spx-reveal">{$stageTenTitle|nl2br=###|raw}</h2>
+          {/if}
+
+          {if !empty($stageTenItems)}
+          <div class="spx-stage-ten-tabs" role="tablist" aria-label="第十屏切换标签">
+            {volist name="stageTenItems" id="item" key="itemIndex"}
+            <button class="spx-stage-ten-tab{if $itemIndex == 1} is-active{/if}" type="button" data-stage-ten-tab="{$itemIndex - 1}" role="tab" aria-selected="{if $itemIndex == 1}true{else /}false{/if}">
+              {$item.label|default='选项'|trim}
+            </button>
+            {/volist}
+          </div>
+          {/if}
+        </div>
+      </div>
+    </div>
+  </section>
+  {/if}
+
+  <?php
+    $stageElevenItems = [];
+    $stageElevenSourceMap = [
+      [
+        'title' => trim((string)($block['title_12_1'] ?? '')),
+        'content' => trim((string)($block['title_12_2'] ?? '')),
+        'media' => trim((string)($block['thumb_12_1'] ?? '')),
+      ],
+      [
+        'title' => trim((string)($block['title_12_3'] ?? '')),
+        'content' => trim((string)($block['title_12_4'] ?? '')),
+        'media' => trim((string)($block['thumb_12_2'] ?? '')),
+      ],
+    ];
+
+    foreach ($stageElevenSourceMap as $stageElevenItem) {
+      if ($stageElevenItem['title'] === '' && $stageElevenItem['content'] === '' && $stageElevenItem['media'] === '') {
+        continue;
+      }
+      $ext = $stageElevenItem['media'] ? strtolower(pathinfo(parse_url($stageElevenItem['media'], PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+      $stageElevenItem['is_video'] = in_array($ext, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+      $stageElevenItems[] = $stageElevenItem;
+    }
+  ?>
+  {if !empty($stageElevenItems)}
+  <section class="spx-stage-eleven js-stage-eleven">
+    <div class="spx-stage-eleven-media-shell">
+      {volist name="stageElevenItems" id="item" key="itemIndex"}
+      <div class="spx-stage-eleven-panel{if $itemIndex == 1} is-active{/if}" data-stage-eleven-panel="{$itemIndex - 1}">
+        {if !empty($item.media)}
+          {if $item.is_video}
+        <video class="spx-stage-eleven-video" src="{$item.media}" muted playsinline preload="metadata" loop></video>
+          {else /}
+        <img class="spx-stage-eleven-image" src="{$item.media}" alt="{$item.title|default=$title}">
+          {/if}
+        {/if}
+      </div>
+      {/volist}
+      <div class="spx-stage-eleven-overlay"></div>
+    </div>
+
+    <div class="spx-stage-eleven-content-wrap">
+      <div class="spx-stage-eleven-content">
+        <div class="spx-stage-eleven-tabs" role="tablist" aria-label="第十一屏切换选项">
+          {volist name="stageElevenItems" id="item" key="itemIndex"}
+          <button class="spx-stage-eleven-tab{if $itemIndex == 1} is-active{/if}" type="button" data-stage-eleven-tab="{$itemIndex - 1}" role="tab" aria-selected="{if $itemIndex == 1}true{else /}false{/if}">
+            <span class="spx-stage-eleven-tab-line" aria-hidden="true"></span>
+            <span class="spx-stage-eleven-tab-body">
+              <span class="spx-stage-eleven-tab-title spx-reveal">{$item.title|default='选项'|trim}</span>
+              <span class="spx-stage-eleven-tab-content spx-reveal spx-reveal--delay-1">{$item.content|trim|nl2br=###|raw}</span>
+            </span>
+          </button>
+          {/volist}
+        </div>
+      </div>
+    </div>
+  </section>
+  {/if}
+
+  <?php
+    $stageTwelveTitle = trim((string)($block['title_13_1'] ?? ''));
+    $stageTwelveDesc = trim((string)($block['title_13_2'] ?? ''));
+    $stageTwelveMedia = trim((string)($block['thumb_13'] ?? ''));
+    $stageTwelveExt = $stageTwelveMedia ? strtolower(pathinfo(parse_url($stageTwelveMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageTwelveIsVideo = in_array($stageTwelveExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  {if $stageTwelveTitle !== '' || $stageTwelveDesc !== '' || $stageTwelveMedia !== ''}
+  <section class="spx-stage-twelve">
+    <div class="content-1300-wrap spx-stage-twelve-wrap">
+      <div class="spx-stage-twelve-copy">
+        {if $stageTwelveTitle !== ''}
+        <h2 class="spx-stage-twelve-title spx-reveal">{$stageTwelveTitle|trim}</h2>
+        {/if}
+        {if $stageTwelveDesc !== ''}
+        <div class="spx-stage-twelve-desc spx-reveal spx-reveal--delay-1">{$stageTwelveDesc|trim|nl2br=###|raw}</div>
+        {/if}
+      </div>
+
+      {if $stageTwelveMedia !== ''}
+      <div class="spx-stage-twelve-media">
+        <div class="spx-stage-twelve-media-shell">
+          {if $stageTwelveIsVideo}
+          <video class="spx-stage-twelve-video" src="{$stageTwelveMedia}" autoplay muted playsinline preload="metadata" loop></video>
+          {else /}
+          <img class="spx-stage-twelve-image" src="{$stageTwelveMedia}" alt="{$stageTwelveTitle|default=$title}">
+          {/if}
+        </div>
+      </div>
+      {/if}
+    </div>
+  </section>
+  {/if}
+
+  <?php
+    $stageThirteenTitle = trim((string)($block['title_14_1'] ?? ''));
+    $stageThirteenMedia = trim((string)($block['thumb_14'] ?? ''));
+    $stageThirteenDesc = trim((string)($block['title_14_2'] ?? ''));
+    $stageThirteenExt = $stageThirteenMedia ? strtolower(pathinfo(parse_url($stageThirteenMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageThirteenIsVideo = in_array($stageThirteenExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  {if $stageThirteenTitle !== '' || $stageThirteenMedia !== '' || $stageThirteenDesc !== ''}
+  <section class="spx-stage-thirteen">
+    <div class="content-1300-wrap spx-stage-thirteen-wrap">
+      <div class="spx-stage-thirteen-copy spx-stage-thirteen-copy-top">
+        {if $stageThirteenTitle !== ''}
+        <h2 class="spx-stage-thirteen-title spx-reveal">{$stageThirteenTitle|trim}</h2>
+        {/if}
+      </div>
+
+      {if $stageThirteenMedia !== ''}
+      <div class="spx-stage-thirteen-media">
+        <div class="spx-stage-thirteen-media-shell">
+          {if $stageThirteenIsVideo}
+          <video class="spx-stage-thirteen-video" src="{$stageThirteenMedia}" autoplay muted playsinline preload="metadata" loop></video>
+          {else /}
+          <img class="spx-stage-thirteen-image" src="{$stageThirteenMedia}" alt="{$stageThirteenTitle|default=$title}">
+          {/if}
+        </div>
+      </div>
+      {/if}
+
+      {if $stageThirteenDesc !== ''}
+      <div class="spx-stage-thirteen-copy spx-stage-thirteen-copy-bottom">
+        <div class="spx-stage-thirteen-desc spx-reveal spx-reveal--delay-1">{$stageThirteenDesc|trim|nl2br=###|raw}</div>
+      </div>
+      {/if}
+    </div>
+  </section>
+  {/if}
+
+  <?php
+    $stageFourteenTitle = trim((string)($block['title_15_1'] ?? ''));
+    $stageFourteenDesc = trim((string)($block['title_15_2'] ?? ''));
+    $stageFourteenMedia = trim((string)($block['thumb_15'] ?? ''));
+    $stageFourteenExt = $stageFourteenMedia ? strtolower(pathinfo(parse_url($stageFourteenMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageFourteenIsVideo = in_array($stageFourteenExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  {if $stageFourteenTitle !== '' || $stageFourteenDesc !== '' || $stageFourteenMedia !== ''}
+  <section class="spx-stage-fourteen">
+    <div class="spx-stage-fourteen-media-shell">
+      {if $stageFourteenMedia !== ''}
+        {if $stageFourteenIsVideo}
+      <video class="spx-stage-fourteen-video" src="{$stageFourteenMedia}" autoplay muted playsinline preload="metadata" loop></video>
+        {else /}
+      <img class="spx-stage-fourteen-image" src="{$stageFourteenMedia}" alt="{$stageFourteenTitle|default=$title}">
+        {/if}
+      {/if}
+      <div class="spx-stage-fourteen-overlay"></div>
+    </div>
+
+    <div class="spx-stage-fourteen-content-wrap">
+      <div class="spx-stage-fourteen-content">
+        {if $stageFourteenTitle !== ''}
+        <h2 class="spx-stage-fourteen-title spx-reveal">{$stageFourteenTitle|trim}</h2>
+        {/if}
+        {if $stageFourteenDesc !== ''}
+        <div class="spx-stage-fourteen-desc spx-reveal spx-reveal--delay-1">{$stageFourteenDesc|trim|nl2br=###|raw}</div>
+        {/if}
+      </div>
+    </div>
+  </section>
+  {/if}
+
+  <?php
+    $stageFifteenTitle = trim((string)($block['title_16_1'] ?? ''));
+    $stageFifteenEyebrow = trim((string)($block['title_16_3'] ?? ''));
+    if ($stageFifteenEyebrow === '') {
+      $stageFifteenEyebrow = trim((string)($block['title_5_3'] ?? ''));
+    }
+    $stageFifteenDesc = trim((string)($block['title_16_2'] ?? ''));
+    $stageFifteenMedia = trim((string)($block['thumb_16'] ?? ''));
+    $stageFifteenExt = $stageFifteenMedia ? strtolower(pathinfo(parse_url($stageFifteenMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageFifteenIsVideo = in_array($stageFifteenExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  {if $stageFifteenTitle !== '' || $stageFifteenEyebrow !== '' || $stageFifteenDesc !== '' || $stageFifteenMedia !== ''}
+  <section class="spx-stage-fifteen">
+    <div class="content-1300-wrap spx-stage-fifteen-wrap">
+      <div class="spx-stage-fifteen-head">
+        <div class="spx-stage-fifteen-head-left">
+          {if $stageFifteenEyebrow !== ''}
+          <div class="spx-stage-fifteen-eyebrow spx-reveal">{$stageFifteenEyebrow|trim}</div>
+          {/if}
+          {if $stageFifteenTitle !== ''}
+          <h2 class="spx-stage-fifteen-title spx-reveal spx-reveal--delay-1">{$stageFifteenTitle|trim}</h2>
+          {/if}
+        </div>
+        {if $stageFifteenDesc !== ''}
+        <div class="spx-stage-fifteen-desc spx-reveal spx-reveal--delay-2">{$stageFifteenDesc|trim|nl2br=###|raw}</div>
+        {/if}
+      </div>
+
+      {if $stageFifteenMedia !== ''}
+      <div class="spx-stage-fifteen-media">
+        <div class="spx-stage-fifteen-media-shell">
+          {if $stageFifteenIsVideo}
+          <video class="spx-stage-fifteen-video" src="{$stageFifteenMedia}" autoplay muted playsinline preload="metadata" loop></video>
+          {else /}
+          <img class="spx-stage-fifteen-image" src="{$stageFifteenMedia}" alt="{$stageFifteenTitle|default=$title}">
+          {/if}
+        </div>
+      </div>
+      {/if}
+    </div>
+  </section>
+  {/if}
+
+  <?php
+    $stageSixteenTitle = trim((string)($block['title_17_1'] ?? ''));
+    $stageSixteenMedia = trim((string)($block['thumb_17'] ?? ''));
+    $stageSixteenDesc = trim((string)($block['title_17_2'] ?? ''));
+    $stageSixteenExt = $stageSixteenMedia ? strtolower(pathinfo(parse_url($stageSixteenMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageSixteenIsVideo = in_array($stageSixteenExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  {if $stageSixteenTitle !== '' || $stageSixteenMedia !== '' || $stageSixteenDesc !== ''}
+  <section class="spx-stage-sixteen">
+    <div class="content-1300-wrap spx-stage-sixteen-wrap">
+      <div class="spx-stage-sixteen-copy spx-stage-sixteen-copy-top">
+        {if $stageSixteenTitle !== ''}
+        <h2 class="spx-stage-sixteen-title spx-reveal">{$stageSixteenTitle|trim}</h2>
+        {/if}
+      </div>
+
+      {if $stageSixteenMedia !== ''}
+      <div class="spx-stage-sixteen-media">
+        <div class="spx-stage-sixteen-media-shell">
+          {if $stageSixteenIsVideo}
+          <video class="spx-stage-sixteen-video" src="{$stageSixteenMedia}" autoplay muted playsinline preload="metadata" loop></video>
+          {else /}
+          <img class="spx-stage-sixteen-image" src="{$stageSixteenMedia}" alt="{$stageSixteenTitle|default=$title}">
+          {/if}
+        </div>
+      </div>
+      {/if}
+
+      {if $stageSixteenDesc !== ''}
+      <div class="spx-stage-sixteen-copy spx-stage-sixteen-copy-bottom">
+        <div class="spx-stage-sixteen-desc spx-reveal spx-reveal--delay-1">{$stageSixteenDesc|trim|nl2br=###|raw}</div>
+      </div>
+      {/if}
+    </div>
+  </section>
+  {/if}
+
+  <?php
+    $stageSeventeenTitle = trim((string)($block['title_18_1'] ?? ''));
+    $stageSeventeenDesc = trim((string)($block['title_18_2'] ?? ''));
+    $stageSeventeenMedia = trim((string)($block['thumb_18'] ?? ''));
+    $stageSeventeenNote = trim((string)($block['title_18_3'] ?? ''));
+    $stageSeventeenExt = $stageSeventeenMedia ? strtolower(pathinfo(parse_url($stageSeventeenMedia, PHP_URL_PATH), PATHINFO_EXTENSION)) : '';
+    $stageSeventeenIsVideo = in_array($stageSeventeenExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+  ?>
+  {if $stageSeventeenTitle !== '' || $stageSeventeenDesc !== '' || $stageSeventeenMedia !== '' || $stageSeventeenNote !== ''}
+  <section class="spx-stage-seventeen">
+    <div class="content-1300-wrap spx-stage-seventeen-wrap">
+      <div class="spx-stage-seventeen-copy spx-stage-seventeen-copy-top">
+        {if $stageSeventeenTitle !== ''}
+        <h2 class="spx-stage-seventeen-title spx-reveal">{$stageSeventeenTitle|trim}</h2>
+        {/if}
+        {if $stageSeventeenDesc !== ''}
+        <div class="spx-stage-seventeen-desc spx-reveal spx-reveal--delay-1">{$stageSeventeenDesc|trim|nl2br=###|raw}</div>
+        {/if}
+      </div>
+
+      {if $stageSeventeenMedia !== ''}
+      <div class="spx-stage-seventeen-media">
+        <div class="spx-stage-seventeen-media-shell">
+          {if $stageSeventeenIsVideo}
+          <video class="spx-stage-seventeen-video" src="{$stageSeventeenMedia}" autoplay muted playsinline preload="metadata" loop></video>
+          {else /}
+          <img class="spx-stage-seventeen-image" src="{$stageSeventeenMedia}" alt="{$stageSeventeenTitle|default=$title}">
+          {/if}
+        </div>
+      </div>
+      {/if}
+
+      {if $stageSeventeenNote !== ''}
+      <div class="spx-stage-seventeen-copy spx-stage-seventeen-copy-bottom">
+        <div class="spx-stage-seventeen-note spx-reveal spx-reveal--delay-2">{$stageSeventeenNote|trim|nl2br=###|raw}</div>
+      </div>
+      {/if}
+    </div>
+  </section>
+  {/if}
+  {/volist}
+  {/yzn}
+
+  {yzn module="cms" action="lists" catid="46" where="$where" order="listorder asc,id desc" num="5" return="stageEighteenCards" moreinfo="1"}
+  {if !empty($stageEighteenCards)}
+  <section class="spx-stage-eighteen">
+    <div class="content-1300-wrap spx-stage-eighteen-wrap">
+      <div class="spx-stage-eighteen-grid">
+        {volist name="stageEighteenCards" id="card" key="cardIndex"}
+        <button class="spx-stage-eighteen-card spx-stage-eighteen-card-{$cardIndex}" type="button" aria-label="{$card.title|default='查看详情'|trim}" data-stage-eighteen-trigger="{$card.id}">
+          <span class="spx-stage-eighteen-card-media">
+            {if !empty($card.thumb)}
+            <img class="spx-stage-eighteen-card-image" src="{$card.thumb}" alt="{$card.title|default=$title}">
+            {else /}
+            <span class="spx-stage-eighteen-card-placeholder"></span>
+            {/if}
+            <span class="spx-stage-eighteen-card-overlay"></span>
+          </span>
+          <span class="spx-stage-eighteen-card-title">{$card.title|default='Untitled'|trim}</span>
+          <span class="spx-stage-eighteen-card-plus" aria-hidden="true"><i class="bi bi-plus-lg"></i></span>
+        </button>
+        {/volist}
+      </div>
+    </div>
+  </section>
+
+  <div class="spx-stage-eighteen-modal" id="stageEighteenModal" hidden>
+    <div class="spx-stage-eighteen-modal__backdrop" data-stage-eighteen-close></div>
+    <div class="spx-stage-eighteen-modal__dialog" role="dialog" aria-modal="true" aria-label="{:cms_t('combo_detail','组合详情')}">
+      <button class="spx-stage-eighteen-modal__close" type="button" aria-label="{:cms_t('close','关闭')}" data-stage-eighteen-close>
+        <i class="bi bi-x-lg"></i>
+      </button>
+      <div class="spx-stage-eighteen-modal__body">
+        {volist name="stageEighteenCards" id="card" key="cardIndex"}
+        <?php
+          $normalizeStageEighteenList = function ($value) {
+            if (is_array($value)) {
+              $result = [];
+              foreach ($value as $item) {
+                $text = trim((string)$item);
+                if ($text !== '') $result[] = $text;
+              }
+              return $result;
+            }
+
+            $text = trim((string)$value);
+            if ($text === '') return [];
+
+            $json = json_decode($text, true);
+            if (is_array($json)) {
+              $result = [];
+              foreach ($json as $item) {
+                $itemText = trim((string)$item);
+                if ($itemText !== '') $result[] = $itemText;
+              }
+              return $result;
+            }
+
+            $unserialized = @unserialize($text);
+            if (is_array($unserialized)) {
+              $result = [];
+              foreach ($unserialized as $item) {
+                $itemText = trim((string)$item);
+                if ($itemText !== '') $result[] = $itemText;
+              }
+              return $result;
+            }
+
+            $parts = preg_split('/\r\n|\r|\n|\|\|\||\|/', $text);
+            $result = [];
+            if (is_array($parts)) {
+              foreach ($parts as $item) {
+                $itemText = trim((string)$item);
+                if ($itemText !== '') $result[] = $itemText;
+              }
+            }
+            return $result;
+          };
+
+          $cardTitles = $normalizeStageEighteenList($card['titles'] ?? []);
+          $cardContents = $normalizeStageEighteenList($card['contents'] ?? []);
+          $cardThumbs = $normalizeStageEighteenList($card['thumbs'] ?? []);
+          $cardFeatureCount = max(count($cardTitles), count($cardContents), count($cardThumbs));
+        ?>
+        <div class="spx-stage-eighteen-modal-panel{if $cardIndex == 1} is-active{/if}" data-stage-eighteen-panel="{$card.id}">
+          <div class="spx-stage-eighteen-modal-hero">
+            <div class="spx-stage-eighteen-modal-media">
+              {if !empty($card.thumb)}
+              <img class="spx-stage-eighteen-modal-image" src="{$card.thumb}" alt="{$card.title|default=$title}">
+              {else /}
+              <span class="spx-stage-eighteen-modal-image spx-stage-eighteen-modal-image--placeholder"></span>
+              {/if}
+              <span class="spx-stage-eighteen-modal-hero-overlay"></span>
+              <div class="spx-stage-eighteen-modal-copy">
+                <h3 class="spx-stage-eighteen-modal-title">{$card.title|default='Untitled'|trim}</h3>
+              </div>
+            </div>
+          </div>
+
+          <?php if ($cardFeatureCount > 0): ?>
+          <div class="spx-stage-eighteen-modal-features">
+            <?php for ($featureIndex = 0; $featureIndex < $cardFeatureCount; $featureIndex++): ?>
+            <?php
+              $featureTitle = trim((string)($cardTitles[$featureIndex] ?? ''));
+              $featureContent = trim((string)($cardContents[$featureIndex] ?? ''));
+              $featureThumb = trim((string)($cardThumbs[$featureIndex] ?? ''));
+              $hasFeature = $featureTitle !== '' || $featureContent !== '' || $featureThumb !== '';
+            ?>
+            <?php if ($hasFeature): ?>
+            <?php
+              $featureExt = strtolower(pathinfo(parse_url($featureThumb, PHP_URL_PATH) ?: $featureThumb, PATHINFO_EXTENSION));
+              $featureIsVideo = in_array($featureExt, ['mp4', 'webm', 'ogg', 'mov', 'm4v']);
+            ?>
+            <div class="spx-stage-eighteen-feature<?php echo $featureIndex % 2 === 1 ? ' is-reverse' : ''; ?>">
+              <div class="spx-stage-eighteen-feature-copy">
+                <?php if ($featureTitle !== ''): ?>
+                <h4 class="spx-stage-eighteen-feature-title"><?php echo htmlspecialchars($featureTitle, ENT_QUOTES, 'UTF-8'); ?></h4>
+                <?php endif; ?>
+                <?php if ($featureContent !== ''): ?>
+                <div class="spx-stage-eighteen-feature-desc"><?php echo nl2br(htmlspecialchars($featureContent, ENT_QUOTES, 'UTF-8')); ?></div>
+                <?php endif; ?>
+              </div>
+              <div class="spx-stage-eighteen-feature-media<?php echo $featureThumb === '' ? ' is-empty' : ''; ?>">
+                <?php if ($featureThumb !== ''): ?>
+                  <?php if ($featureIsVideo): ?>
+                  <video class="spx-stage-eighteen-feature-video" src="<?php echo htmlspecialchars($featureThumb, ENT_QUOTES, 'UTF-8'); ?>" autoplay muted loop playsinline preload="metadata"></video>
+                  <?php else: ?>
+                  <img class="spx-stage-eighteen-feature-image" src="<?php echo htmlspecialchars($featureThumb, ENT_QUOTES, 'UTF-8'); ?>" alt="<?php echo htmlspecialchars($featureTitle !== '' ? $featureTitle : trim((string)$card['title']), ENT_QUOTES, 'UTF-8'); ?>">
+                  <?php endif; ?>
+                <?php endif; ?>
+              </div>
+            </div>
+            <?php endif; ?>
+            <?php endfor; ?>
+          </div>
+          <?php endif; ?>
+        </div>
+        {/volist}
+      </div>
+    </div>
+  </div>
+  {/if}
+  {/yzn}
+
+  {include file="footer-links" /}
+</main>
+
+<script src="/assets/xtu/show-product.js?v=20260427-1848"></script>
+{include file="footer" /}

+ 22 - 0
templates/xtu/cms/show_video.html

@@ -0,0 +1,22 @@
+{include file="header" /}
+<link rel="stylesheet" href="/assets/xtu/show-video.css?v=20260422-1002">
+
+<main class="video-show-page">
+  <section class="video-show-hero">
+    <div class="video-show-player-wrap">
+      <article class="video-show-player-card">
+        <header class="video-show-headline">
+          <h1>{$title}</h1>
+        </header>
+
+        {if !empty($video)}
+        <video class="video-show-player" controls playsinline preload="metadata" src="{$video}"></video>
+        {else /}
+        <div class="video-show-empty">{:cms_t('support_video_empty','暂无可播放视频')}</div>
+        {/if}
+      </article>
+    </div>
+  </section>
+</main>
+
+{include file="footer" /}

+ 75 - 0
templates/xtu/cms/support-contact-block.html

@@ -0,0 +1,75 @@
+<section class="support-contact-section">
+  <div class="support-contact-heading">
+    <h2>{:getCategory(58,'catname')}</h2>
+  </div>
+  {yzn module="cms" action="lists" catid="58" cache="3600" order="listorder desc,id ASC" num="5" return="quickServices" moreinfo="1"}
+  <div class="support-contact-grid support-contact-grid-top">
+    {volist name="quickServices" id="vo" key="k"}
+    {if $k<=2}
+    {php}
+      $quickUrl = trim((string)($vo['tourl'] ?? ''));
+      $quickTitle = trim((string)($vo['title'] ?? ''));
+      $quickTitle1 = trim((string)($vo['title1'] ?? ''));
+      $quickTitle2 = trim((string)($vo['title2'] ?? ''));
+    {/php}
+    {if !empty($quickUrl)}
+    <a class="support-contact-tile support-contact-tile-wide" href="{$quickUrl}" target="{$vo.target|default='_self'}">
+    {else /}
+    <div class="support-contact-tile support-contact-tile-wide">
+    {/if}
+      <span class="support-contact-tile-icon {if trim($vo.title)=='微信公众号'}support-contact-tile-icon-wechat{/if}">
+        {if !empty($vo.thumb)}
+        <img src="{$vo.thumb}" alt="{$quickTitle}">
+        {/if}
+      </span>
+      <h3>{$quickTitle}</h3>
+      {if !empty($quickTitle1) || !empty($quickTitle2)}
+      <p>{if !empty($quickTitle1)}{$quickTitle1}{/if}{if !empty($quickTitle1) && !empty($quickTitle2)}<br>{/if}{if !empty($quickTitle2)}{$quickTitle2}{/if}</p>
+      {/if}
+      {if !empty($quickUrl)}
+      <span class="support-contact-tile-link">{$quickTitle} <i class="bi bi-arrow-right-short"></i></span>
+      {/if}
+    {if !empty($quickUrl)}
+    </a>
+    {else /}
+    </div>
+    {/if}
+    {/if}
+    {/volist}
+  </div>
+  <div class="support-contact-grid support-contact-grid-bottom">
+    {volist name="quickServices" id="vo" key="k"}
+    {if $k>2}
+    {php}
+      $quickUrl = trim((string)($vo['tourl'] ?? ''));
+      $quickTitle = trim((string)($vo['title'] ?? ''));
+      $quickTitle1 = trim((string)($vo['title1'] ?? ''));
+      $quickTitle2 = trim((string)($vo['title2'] ?? ''));
+    {/php}
+    {if !empty($quickUrl)}
+    <a class="support-contact-tile" href="{$quickUrl}" target="{$vo.target|default='_self'}">
+    {else /}
+    <div class="support-contact-tile">
+    {/if}
+      <span class="support-contact-tile-icon {if trim($vo.title)=='微信公众号'}support-contact-tile-icon-wechat{/if}">
+        {if !empty($vo.thumb)}
+        <img src="{$vo.thumb}" alt="{$quickTitle}">
+        {/if}
+      </span>
+      <h3>{$quickTitle}</h3>
+      {if !empty($quickTitle1) || !empty($quickTitle2)}
+      <p>{if !empty($quickTitle1)}{$quickTitle1}{/if}{if !empty($quickTitle1) && !empty($quickTitle2)}<br>{/if}{if !empty($quickTitle2)}{$quickTitle2}{/if}</p>
+      {/if}
+      {if !empty($quickUrl)}
+      <span class="support-contact-tile-link">{$quickTitle} <i class="bi bi-arrow-right-short"></i></span>
+      {/if}
+    {if !empty($quickUrl)}
+    </a>
+    {else /}
+    </div>
+    {/if}
+    {/if}
+    {/volist}
+  </div>
+  {/yzn}
+</section>

+ 36 - 0
templates/xtu/cms/support-contact-block.html.bak.20260514161655

@@ -0,0 +1,36 @@
+<section class="support-contact-section">
+  <div class="support-contact-heading">
+    <h2>{:cms_t('support_contact_us','联系我们')}</h2>
+  </div>
+  <div class="support-contact-grid">
+    <a class="support-contact-tile support-contact-tile-wide" href="javascript:;">
+      <span class="support-contact-tile-icon"><i class="bi bi-headset"></i></span>
+      <h3>{:cms_t('support_online_service','在线支持')}</h3>
+      <p>{:cms_t('support_working_hours','工作时间')}<br>{:cms_t('support_working_hours_value','周一至周日:9:00-21:00(北京时间)')}</p>
+      <span class="support-contact-tile-link">{:cms_t('support_start_consulting','开始咨询')} <i class="bi bi-arrow-right-short"></i></span>
+    </a>
+    <a class="support-contact-tile support-contact-tile-wide" href="javascript:;">
+      <span class="support-contact-tile-icon support-contact-tile-icon-box"><i class="bi bi-wechat"></i></span>
+      <h3>{:cms_t('support_wechat_official','微信公众号')}</h3>
+      <p>{:cms_t('support_wechat_official_desc','扫码关注公众号,点击导航栏中的“服务支持”,即可获取帮助')}</p>
+    </a>
+    <a class="support-contact-tile" href="javascript:;">
+      <span class="support-contact-tile-icon"><i class="bi bi-telephone"></i></span>
+      <h3>{:cms_t('support_hotline','热线电话')}</h3>
+      <p>400-833-4360<br>{:cms_t('support_working_hours_value','周一至周日:9:00-21:00(北京时间)')}</p>
+      <span class="support-contact-tile-link">{:cms_t('support_contact_us','联系我们')} <i class="bi bi-arrow-right-short"></i></span>
+    </a>
+    <a class="support-contact-tile" href="javascript:;">
+      <span class="support-contact-tile-icon"><i class="bi bi-chat-square-text"></i></span>
+      <h3>{:cms_t('support_community_forum','社区论坛')}</h3>
+      <p>{:cms_t('support_community_forum_desc','了解最新内容')}</p>
+      <span class="support-contact-tile-link">{:cms_t('support_join_discussion','参与讨论')} <i class="bi bi-arrow-right-short"></i></span>
+    </a>
+    <a class="support-contact-tile" href="javascript:;">
+      <span class="support-contact-tile-icon"><i class="bi bi-envelope-paper"></i></span>
+      <h3>{:cms_t('support_feedback','意见反馈')}</h3>
+      <p>{:cms_t('support_feedback_contact_desc','为您提供更好的产品或服务')}</p>
+      <span class="support-contact-tile-link">{:cms_t('support_start_filling','开始填写')} <i class="bi bi-arrow-right-short"></i></span>
+    </a>
+  </div>
+</section>

+ 45 - 0
templates/xtu/cms/tags.html

@@ -0,0 +1,45 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <h3>标签: #{$tag}</h3>
+            </div>
+            <div class="layui-card-body">
+                <ul class="article-list">
+                    {yzn module="cms" action="tags" tag="$tag" order="listorder DESC" num="10" page="$page" return="data" cache="3"}
+                    {volist name="data" id="vo"}
+                    <li class="d-flex article-item-card">
+                        <a href="{$vo.url}">
+                            <div class="d-flex article-thumb align-items-center justify-content-center">
+                                {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>220 × 200</font>{/if}
+                            </div>
+                        </a>
+                        <div class="article-info">
+                            <h3 class="article-title"><a href="{$vo.url}">{$vo.title}</a></h3>
+                            <div class="article-meta d-flex align-items-center">
+                                <span>{:getCategory($vo['catid'],'catname')}</span>
+                                <span class="meta-dot"></span>
+                                <span>{$vo.publish_time|date="Y-m-d"}</span>
+                                <span class="meta-dot"></span>
+                                <span>{$vo.hits}浏览</span>
+                            </div>
+                            <div class="article-abstract text-ellipsis-2">
+                                {$vo.description|str_cut=###,80}
+                            </div>
+                        </div>
+                    </li>
+                    {/volist}
+                    {/yzn}
+                </ul>
+                <div class="text-center">
+                    {$pages|raw}
+                </div>
+            </div>
+        </div>
+	</div>
+    <div class="layui-col-md3">
+       {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

+ 25 - 0
templates/xtu/cms/tags_list.html

@@ -0,0 +1,25 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+    <div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-header">
+                <h3>标签</h3>
+            </div>
+            <div class="layui-card-body">
+                <div class="tag-cloud tag-cloud-list">
+                    {volist name="list" id="vo"}
+                    <a class="tag" href="{:addon_url('cms/tags/index',[':tag'=>$vo['tag']])}" title="{$vo.usetimes}个话题">
+                        <i class="ri-price-tag-3-line"></i>
+                        <h2>{$vo.tag}</h2>
+                        <span class="count">{$vo.usetimes}</span>
+                    </a>
+                    {/volist}
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-col-md3">
+        {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

+ 98 - 0
templates/xtu/cms/xunsearch_result.html

@@ -0,0 +1,98 @@
+{include file="header" /}
+<div class="layui-row layui-col-space16">
+	<div class="layui-col-md9">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <div class="filter-container">
+                    <div class="filter-row">
+                        <div class="filter-category d-flex">
+                            <div class="filter-category-title">时间搜索:</div>
+                            <div class="filter-options">
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=" {empty name="time"}class="active"{/empty}>全部</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=day" {eq name="time" value="day"}class="active"{/eq}>一天内</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=week" {eq name="time" value="week"}class="active"{/eq}>一周内</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=month" {eq name="time" value="month"}class="active"{/eq}>一月内</a>
+		                        </div>
+		                        <div class="filter-option">
+		                        	<a href="?q={$q}&modelid={$modelid}&time=year" {eq name="time" value="year"}class="active"{/eq}>一年内</a>
+		                        </div>
+                            </div>
+                        </div>
+                    </div>
+                    {if count($hot)>0}
+                    <div class="filter-row">
+                        <div class="filter-category d-flex">
+                            <div class="filter-category-title">热门搜索:</div>
+                            <div class="filter-options">
+		                        {foreach $hot as $key=>$vo } 
+		                        <div class="filter-option">
+		                            <a href="?q={$key}" title="{$key}">{$key}</a>
+		                        </div>
+		                        {/foreach}
+                            </div>
+                        </div>
+                    </div>
+                    {/if}
+                    {if count($related)>0}
+                    <div class="filter-row">
+                        <div class="filter-category d-flex">
+                            <div class="filter-category-title">相关搜索:</div>
+                            <div class="filter-options">
+                                {foreach $related as $vo } 
+                                <div class="filter-option">
+                                    <a href="?q={$vo}" title="{$vo}">{$vo}</a>
+                                </div>
+                                {/foreach}
+                            </div>
+                        </div>
+                    </div>
+                    {/if}
+                </div>
+            </div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-header d-flex justify-content-between align-items-center">
+                <h3>{:sprintf(cms_t('found_results','找到关于 [%s] 的%s条结果'), $q, $count)}</h3>
+                <div class="layui-font-gray">{:sprintf(cms_t('search_used_time','用时%s 秒'), $search_time)}</div>
+            </div>
+            <div class="layui-card-body">
+                <ul class="article-list">
+                    {volist name="list" id="vo" empty="<div class='no-data'>{:cms_t('no_data','无数据')}</div>"}
+                    <li class="d-flex article-item-card">
+                        <a href="{$vo.url}">
+                            <div class="d-flex article-thumb align-items-center justify-content-center">
+                                {if $vo.thumb}<img src="{$vo.thumb}" alt="{$vo.title}">{else}<font>220 × 200</font>{/if}
+                            </div>
+                        </a>
+                        <div class="article-info">
+                            <h3 class="article-title"><a href="{$vo.url}">{$search->highlight($vo['title'])|raw}</a></h3>
+                            <div class="article-meta d-flex align-items-center">
+                                <span>{:getCategory($vo['catid'],'catname')}</span>
+                                <span class="meta-dot"></span>
+                                <span>{$vo.publish_time|date="Y-m-d"}</span>
+                            </div>
+                            <div class="article-abstract text-ellipsis-2">
+                                {$search->highlight($vo['content'])|str_cut=###,60|raw}
+                            </div>
+                        </div>
+                    </li>
+                    {/volist}
+                </ul>
+                <div class="text-center">
+                    {$pages|raw}
+                </div>
+            </div>
+        </div>
+	</div>
+    <div class="layui-col-md3">
+       {include file="common/sider" /}
+    </div>
+</div>
+{include file="footer" /}

Some files were not shown because too many files changed in this diff