Procházet zdrojové kódy

新增 home-v2 首页页面并替换图片域名

- 新增 pages/home-v2/index 与 pages/home-v2/info/index 页面
- diypage 组件递归替换 cloud.file.futurestack.cn 为 file-cloud.fmode.cn
- 更新 app.json 页面注册与本地调试条件

Co-Authored-By: Claude Code <noreply@anthropic.com>
zys před 1 týdnem
rodič
revize
876827c941

+ 3 - 1
app.json

@@ -1,6 +1,8 @@
 {
   "pages": [
-    "index"
+    "index",
+    "pages/home-v2/index",
+    "pages/home-v2/info/index"
   ],
   "subpackages": [
     {

+ 23 - 1
components/diypage/diypage.js

@@ -87,10 +87,16 @@ Component({
         let query = new Parse.Query("DiyPage");
         let tab = await query.get(pageid);
         if (tab && tab.id) {
+          let blocks = tab.get("blocks");
+          // 把 cloud.file.futurestack.cn 的图片地址换为 file-cloud.fmode.cn(https 白名单已配)
+          if (blocks && blocks.length) {
+            blocks = JSON.parse(JSON.stringify(blocks));
+            this._fixImageDomain(blocks);
+          }
           this.setData({
             titleName: tab.get("titleBar") && tab.get("titleBar").title,
             titleType: tab.get("titleBar") && tab.get("titleBar").type,
-            blocks: tab.get("blocks"),
+            blocks: blocks,
             background: tab.get("titleBar") && tab.get("titleBar").backgroundColor
           })
         }
@@ -101,6 +107,22 @@ Component({
       }
     },
 
+    // 递归替换 blocks 中所有 cloud.file.futurestack.cn → file-cloud.fmode.cn
+    _fixImageDomain: function (obj) {
+      if (!obj || typeof obj !== 'object') return;
+      if (Array.isArray(obj)) {
+        obj.forEach(item => this._fixImageDomain(item));
+      } else {
+        for (var key in obj) {
+          if (typeof obj[key] === 'string' && obj[key].indexOf('cloud.file.futurestack.cn') !== -1) {
+            obj[key] = obj[key].replace(/http:\/\/cloud\.file\.futurestack\.cn/g, 'https://file-cloud.fmode.cn');
+          } else if (typeof obj[key] === 'object') {
+            this._fixImageDomain(obj[key]);
+          }
+        }
+      }
+    },
+
     async getActiveColor() {
       let tabbarOption = await getTabs.getDiyTabs()
       let activeColor = tabbarOption.activeColor && tabbarOption.activeColor

+ 114 - 0
pages/home-v2/index.js

@@ -0,0 +1,114 @@
+Page({
+  data: {
+    statusBarHeight: 20,
+    heroImage: "https://file-cloud.fmode.cn/AxlFLpzGx6/20220307/3tk1de040957.png",
+    school: {
+      name: "江西生物科技职业学院",
+      meta: ["建校:1952年", "性质:公办高职", "类型:农林类", "坐标:江西南昌"],
+      tags: [
+        "全国乡村振兴人才培养优质校",
+        "江西省示范性高职院校",
+        "江西省优质专科高等职业院校",
+        "省双高建设院校",
+      ],
+    },
+    quickLinks: [
+      { name: "学院官网", icon: "flower-o", url: "/nova-biotechnology/pages/home/website/index" },
+      { name: "招生章程", icon: "description", url: "https://zsw.jxswkj.com/zszn/zszc.htm" },
+      { name: "招生政策", icon: "desktop-o", url: "https://zsw.jxswkj.com/zszc.htm" },
+      { name: "统招", icon: "medal-o", url: "https://zsw.jxswkj.com/ptgktzzl.htm" },
+      { name: "单招", icon: "edit", url: "https://zsw.jxswkj.com/ddzszl.htm" },
+      { name: "中高职一体化长学制专栏", icon: "exchange", url: "https://zsw.jxswkj.com/sdx/zgzythcxzl.htm" },
+      { name: "图书馆", icon: "bookmark-o", url: "/nova-diypage/pages/index/index?id=Y8O3sUmXOS" },
+      { name: "教室", icon: "hotel-o", url: "/nova-diypage/pages/index/index?id=jUmxyW865r" },
+      { name: "学生公寓", icon: "like-o", url: "/nova-diypage/pages/index/index?id=HwsMSIlTZa" },
+    ],
+    notice: "@高考生,我省2026年普通高考志愿填报及投档规则发布",
+    colleges: [
+      {
+        name: "动物科学系",
+        icon: "friends-o",
+        url: "/nova-diypage/pages/index/index?id=91PaGyHaA4",
+        majors: ["畜牧兽医", "动物医学", "宠物医疗技术", "水产养殖技术"],
+      },
+      {
+        name: "生物工程系",
+        icon: "flower-o",
+        url: "/nova-diypage/pages/index/index?id=91PaGyHaA4",
+        majors: ["生物产品检验", "食品智能加工技术", "药品生产技术", "食品检验检测技术"],
+      },
+      {
+        name: "园林工程系",
+        icon: "map-marked",
+        url: "/nova-diypage/pages/index/index?id=91PaGyHaA4",
+        majors: ["园林技术", "园艺技术", "环境工程技术", "风景园林设计"],
+      },
+      {
+        name: "VR仿真实训室",
+        icon: "setting-o",
+        url: "/nova-diypage/pages/index/index?id=91PaGyHaA4",
+        majors: ["VR虚拟仿真", "机电实训", "数控加工", "智能产线"],
+      },
+      {
+        name: "信息工程系",
+        icon: "desktop-o",
+        url: "/nova-diypage/pages/index/index?id=91PaGyHaA4",
+        majors: ["计算机应用技术", "软件技术", "大数据技术", "网络营销与直播电商"],
+      },
+      {
+        name: "农产品检测实训中心",
+        icon: "chart-trending-o",
+        url: "/nova-diypage/pages/index/index?id=91PaGyHaA4",
+        majors: ["农产品检测", "食品检验", "质量认证", "电商直播"],
+      },
+      {
+        name: "教育艺术系",
+        icon: "smile-comment-o",
+        url: "/nova-diypage/pages/index/index?id=91PaGyHaA4",
+        majors: ["学前教育", "艺术设计", "广告艺术设计"],
+      },
+    ],
+    videos: [
+      { src: "https://file-cloud.fmode.cn/storage/company/AxlFLpzGx6/20250512/104633175.mp4" },
+    ],
+    scenery: [
+      { name: "银杏大道", img: "https://file-cloud.fmode.cn/AxlFLpzGx6/20220311/81dum1103035.jpg" },
+      { name: "教学楼", img: "https://file-cloud.fmode.cn/AxlFLpzGx6/20220311/ggh17v103051.jpg" },
+      { name: "智慧教室", img: "https://zsw.jxswkj.com/images/26/01/12/1mq579252b/85efb1d41b17068757e14cf88f428cf3.png" },
+      { name: "林荫大道", img: "https://file-cloud.fmode.cn/AxlFLpzGx6/20220311/4t1cse103017.jpg" },
+    ],
+    tabbar: [
+      { text: "首页", icon: "wap-home", url: "" },
+      { text: "校园", icon: "video-o", url: "/nova-diypage/pages/index/index?id=eaZxkrrXOz" },
+      { text: "录取查询", icon: "search", url: "/nova-biotechnology/pages/home/enroll/index" },
+    ],
+  },
+  // ===== 统一跳转方法 goLink =====
+  // http 开头走 web-view 壳;/ 开头走内部页面;空则提示建设中
+  goLink: function (e) {
+    var url = e.currentTarget.dataset.url;
+    if (!url) {
+      wx.showToast({ title: "功能建设中", icon: "none" });
+      return;
+    }
+    if (url.indexOf("http") === 0) {
+      wx.navigateTo({
+        url: "/common-page/pages/web-view/index?path=" + url,
+        fail: function () { wx.showToast({ title: "打开失败", icon: "none" }); },
+      });
+      return;
+    }
+    wx.navigateTo({
+      url: url,
+      fail: function () {
+        wx.showToast({ title: "页面不存在", icon: "none" });
+        console.error("navigateTo fail:", url);
+      },
+    });
+  },
+
+  onLoad: function () {
+    var info = wx.getWindowInfo ? wx.getWindowInfo() : wx.getSystemInfoSync();
+    this.setData({ statusBarHeight: info.statusBarHeight || 20 });
+  },
+});

+ 5 - 0
pages/home-v2/index.json

@@ -0,0 +1,5 @@
+{
+  "navigationStyle": "custom",
+  "backgroundColor": "#F4F8DC",
+  "backgroundTextStyle": "dark"
+}

+ 117 - 0
pages/home-v2/index.wxml

@@ -0,0 +1,117 @@
+<view class="page">
+  <view class="navbar" style="padding-top:{{statusBarHeight}}px;">
+    <view class="navbar-left">
+      <van-icon name="location-o" size="28rpx" color="#183c25" />
+      <text class="navbar-loc-text">江西省</text>
+      <van-icon name="arrow-down" size="18rpx" color="#7d8c78" />
+    </view>
+    <view class="navbar-title">{{school.name}}</view>
+    <view class="navbar-right"></view>
+  </view>
+
+  <view class="hero">
+    <image class="hero-img" src="{{heroImage}}" mode="aspectFill" />
+    <view class="hero-shade"></view>
+    <view class="hero-copy">
+      <text class="hero-kicker">智慧农业 · 阳光招生</text>
+      <text class="hero-title">{{school.name}}</text>
+      <view class="hero-desc"><text>修身敬业求实创新</text><text class="hero-desc-sep">,</text><text class="hero-desc-right">培养生物科技与农业人才</text></view>
+    </view>
+  </view>
+
+  <view class="school-panel">
+    <view class="school-badge">
+      <view class="badge-ring">
+        <van-icon name="flower-o" size="48rpx" color="#0b7a3c" />
+      </view>
+    </view>
+    <view class="school-name">{{school.name}}</view>
+    <view class="school-meta">
+      <text wx:for="{{school.meta}}" wx:key="*this">{{item}}</text>
+    </view>
+    <view class="school-tags">
+      <view class="school-tag" wx:for="{{school.tags}}" wx:key="*this">{{item}}</view>
+    </view>
+  </view>
+
+  <view class="quick-panel">
+    <view class="quick-item" wx:for="{{quickLinks}}" wx:key="name" bindtap="goLink" data-url="{{item.url}}">
+      <view class="quick-icon quick-icon-{{index}}">
+        <van-icon name="{{item.icon}}" size="42rpx" color="#0b7a3c" />
+      </view>
+      <text class="quick-name">{{item.name}}</text>
+    </view>
+  </view>
+
+  <view class="notice-banner" bindtap="goLink">
+    <view class="notice-mark">通知</view>
+    <view class="notice-content">{{notice}}</view>
+    <view class="notice-action">订阅</view>
+  </view>
+
+  <view class="section-head section-between">
+    <view>
+      <view class="section-title">实训场馆</view>
+      <view class="section-desc">场馆一览 · 身临其境</view>
+    </view>
+    <view class="more" bindtap="goLink" data-url="/nova-diypage/pages/index/index?id=91PaGyHaA4">更多 <van-icon name="arrow" size="20rpx" color="#9ba891" /></view>
+  </view>
+
+  <view class="college-grid">
+    <view class="college-card" wx:for="{{colleges}}" wx:key="name" bindtap="goLink" data-url="{{item.url}}">
+      <view class="building-lines"></view>
+      <view class="college-head">
+        <view class="college-icon"><van-icon name="{{item.icon}}" size="28rpx" color="#ffffff" /></view>
+        <view class="college-name">{{item.name}}</view>
+      </view>
+      <view class="college-tags">
+        <text class="college-tag" wx:for="{{item.majors}}" wx:for-item="major" wx:key="*this">{{major}}</text>
+      </view>
+    </view>
+  </view>
+
+  <view class="section-head section-between">
+    <view>
+      <view class="section-title">宣传视频</view>
+      <view class="section-desc">校园故事与招生动态</view>
+    </view>
+    <view class="more">更多 <van-icon name="arrow" size="20rpx" color="#9ba891" /></view>
+  </view>
+
+  <view class="videos-grid">
+    <view class="video-card" wx:for="{{videos}}" wx:key="src">
+      <video class="video-player" src="{{item.src}}" controls show-center-play-btn show-play-btn object-fit="cover"></video>
+    </view>
+  </view>
+
+  <view class="section-head section-between">
+    <view>
+      <view class="section-title">校园风光</view>
+      <view class="section-desc">在南昌遇见四季校园</view>
+    </view>
+    <view class="more">更多 <van-icon name="arrow" size="20rpx" color="#9ba891" /></view>
+  </view>
+
+  <view class="scenery-grid">
+    <view class="scenery-card scenery-card-{{index}}" wx:for="{{scenery}}" wx:key="name" bindtap="goLink" data-url="/nova-diypage/pages/index/index?id=91PaGyHaA4">
+      <block wx:if="{{item.img}}">
+        <image class="scenery-img" src="{{item.img}}" mode="aspectFill" />
+      </block>
+      <block wx:else>
+        <view class="scenery-sun"></view>
+        <view class="scenery-hill scenery-hill-a"></view>
+        <view class="scenery-hill scenery-hill-b"></view>
+      </block>
+      <view class="scenery-overlay"></view>
+      <van-icon wx:if="{{item.icon}}" class="scenery-icon" name="{{item.icon}}" size="56rpx" color="#ffffff" />
+      <text class="scenery-name">{{item.name}}</text>
+    </view>
+  </view>
+
+  <view class="tabbar">
+    <view class="tabbar-item {{index === 0 ? 'tabbar-active' : ''}}" wx:for="{{tabbar}}" wx:key="text" bindtap="goLink" data-url="{{item.url}}">
+      <van-icon name="{{item.icon}}" size="42rpx" color="{{index === 0 ? '#0b7a3c' : '#9aa39a'}}" />
+      <text>{{item.text}}</text>
+    </view>
+  </view>
+</view>

+ 696 - 0
pages/home-v2/index.wxss

@@ -0,0 +1,696 @@
+page {
+  background: #f4f8dc;
+  color: #193524;
+}
+
+.page {
+  min-height: 100vh;
+  padding-bottom: 152rpx;
+  background:
+    linear-gradient(180deg, rgba(255, 255, 255, 0.72) 0, rgba(244, 248, 220, 0) 360rpx),
+    #f4f8dc;
+}
+
+.navbar {
+  position: relative;
+  z-index: 20;
+  height: 88rpx;
+  display: flex;
+  align-items: center;
+  padding-left: 24rpx;
+  padding-right: 196rpx;
+  background: rgba(255, 255, 255, 0.92);
+  box-shadow: 0 1rpx 0 rgba(18, 78, 42, 0.08);
+}
+
+.navbar-left {
+  display: flex;
+  align-items: center;
+  min-width: 128rpx;
+}
+
+.navbar-loc-text {
+  margin: 0 4rpx 0 6rpx;
+  font-size: 24rpx;
+  color: #183c25;
+}
+
+.navbar-title {
+  position: absolute;
+  left: 156rpx;
+  right: 196rpx;
+  text-align: center;
+  font-size: 28rpx;
+  font-weight: 700;
+  color: #111812;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.navbar-right {
+  width: 1rpx;
+}
+
+.hero {
+  position: relative;
+  height: 430rpx;
+  overflow: hidden;
+  background: #dcefb7;
+}
+
+.hero-img,
+.video-cover {
+  width: 100%;
+  height: 100%;
+  display: block;
+}
+
+.hero-shade {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  height: 230rpx;
+  background: linear-gradient(180deg, rgba(16, 72, 43, 0) 0%, rgba(9, 55, 29, 0.72) 100%);
+}
+
+.hero-copy {
+  position: absolute;
+  left: 28rpx;
+  right: 28rpx;
+  bottom: 72rpx;
+  color: #ffffff;
+}
+
+.hero-kicker {
+  display: inline-flex;
+  padding: 8rpx 18rpx;
+  border-radius: 999rpx;
+  background: rgba(255, 248, 192, 0.88);
+  color: #0b7a3c;
+  font-size: 22rpx;
+  font-weight: 700;
+}
+
+.hero-title {
+  display: block;
+  margin-top: 18rpx;
+  font-size: 42rpx;
+  line-height: 1.2;
+  font-weight: 800;
+  text-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.28);
+}
+
+.hero-desc {
+  display: flex;
+  width: 100%;
+  align-items: baseline;
+  justify-content: space-between;
+  margin-top: 10rpx;
+  font-size: 24rpx;
+  color: rgba(255, 255, 255, 0.9);
+}
+
+.hero-desc-sep {
+  flex-shrink: 0;
+}
+
+.hero-desc-right {
+  text-align: right;
+}
+
+.school-panel {
+  position: relative;
+  z-index: 3;
+  margin: -48rpx 20rpx 0;
+  padding: 34rpx 24rpx 28rpx;
+  border-radius: 16rpx;
+  background: rgba(255, 255, 255, 0.96);
+  box-shadow: 0 16rpx 42rpx rgba(38, 90, 45, 0.12);
+}
+
+.school-badge {
+  position: absolute;
+  left: 50%;
+  top: -52rpx;
+  width: 104rpx;
+  height: 104rpx;
+  margin-left: -52rpx;
+  padding: 8rpx;
+  border-radius: 50%;
+  background: #ffffff;
+  box-shadow: 0 8rpx 24rpx rgba(11, 122, 60, 0.18);
+}
+
+.badge-ring {
+  width: 88rpx;
+  height: 88rpx;
+  border-radius: 50%;
+  border: 4rpx solid #0b7a3c;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: #faffdf;
+}
+
+.school-name {
+  margin-top: 32rpx;
+  text-align: center;
+  font-size: 38rpx;
+  line-height: 1.25;
+  font-weight: 800;
+  color: #101711;
+}
+
+.school-meta {
+  margin-top: 18rpx;
+  display: flex;
+  justify-content: center;
+  flex-wrap: wrap;
+  gap: 8rpx 18rpx;
+  font-size: 22rpx;
+  color: #798777;
+}
+
+.school-tags {
+  margin-top: 20rpx;
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 10rpx;
+}
+
+.school-tag {
+  min-height: 44rpx;
+  padding: 7rpx 10rpx;
+  border-radius: 8rpx;
+  background: #e8ef38;
+  color: #076636;
+  font-size: 20rpx;
+  line-height: 30rpx;
+  text-align: center;
+}
+
+.quick-panel {
+  margin: 20rpx 20rpx 0;
+  padding: 22rpx 8rpx 6rpx;
+  border-radius: 16rpx;
+  background: #ffffff;
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  box-shadow: 0 10rpx 30rpx rgba(35, 91, 42, 0.08);
+}
+
+.quick-item {
+  min-width: 0;
+  margin-bottom: 24rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.quick-icon {
+  width: 74rpx;
+  height: 74rpx;
+  border-radius: 50%;
+  border: 2rpx solid #0b7a3c;
+  background: linear-gradient(135deg, #fbffe6, #f1f76a);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.quick-icon-1,
+.quick-icon-5 {
+  background: linear-gradient(135deg, #f5ffe1, #bee7df);
+}
+
+.quick-icon-2,
+.quick-icon-6 {
+  background: linear-gradient(135deg, #fff7c4, #d9ef5a);
+}
+
+.quick-name {
+  margin-top: 12rpx;
+  max-width: 200rpx;
+  font-size: 24rpx;
+  color: #3e493f;
+  line-height: 1.25;
+  text-align: center;
+}
+
+.notice-banner {
+  margin: 28rpx 20rpx 0;
+  height: 82rpx;
+  border-radius: 16rpx;
+  display: flex;
+  align-items: center;
+  overflow: hidden;
+  background:
+    linear-gradient(110deg, rgba(250, 232, 62, 0.94) 0%, rgba(245, 255, 202, 0.94) 43%, rgba(164, 223, 151, 0.94) 100%),
+    #eef7c9;
+  box-shadow: 0 8rpx 22rpx rgba(62, 116, 39, 0.12);
+}
+
+.notice-mark {
+  flex-shrink: 0;
+  margin-left: 20rpx;
+  font-size: 34rpx;
+  line-height: 1;
+  font-weight: 900;
+  color: #0b7a3c;
+}
+
+.notice-content {
+  flex: 1;
+  min-width: 0;
+  margin: 0 18rpx;
+  font-size: 24rpx;
+  color: #286039;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.notice-action {
+  flex-shrink: 0;
+  margin-right: 14rpx;
+  padding: 12rpx 24rpx;
+  border-radius: 999rpx;
+  background: #0b7a3c;
+  color: #ffffff;
+  font-size: 24rpx;
+  font-weight: 700;
+}
+
+.section-head {
+  margin: 36rpx 20rpx 18rpx;
+}
+
+.section-between {
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+}
+
+.section-title {
+  font-size: 34rpx;
+  line-height: 1.12;
+  font-weight: 800;
+  color: #0b7a3c;
+}
+
+.section-desc {
+  margin-top: 6rpx;
+  font-size: 22rpx;
+  color: #87937f;
+}
+
+.more {
+  display: flex;
+  align-items: center;
+  color: #88947f;
+  font-size: 22rpx;
+}
+
+.admission-scroll {
+  width: 100%;
+  white-space: nowrap;
+}
+
+.admission-row {
+  display: inline-flex;
+  padding: 0 20rpx 4rpx;
+}
+
+.admission-card {
+  width: 306rpx;
+  margin-right: 18rpx;
+  border-radius: 14rpx;
+  overflow: hidden;
+  background: #ffffff;
+  box-shadow: 0 10rpx 26rpx rgba(35, 91, 42, 0.09);
+}
+
+.admission-head {
+  min-height: 86rpx;
+  padding: 18rpx 18rpx 14rpx;
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-between;
+  background:
+    linear-gradient(165deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0) 45%),
+    #edf043;
+}
+
+.admission-name {
+  font-size: 28rpx;
+  font-weight: 800;
+  color: #111811;
+}
+
+.admission-label {
+  margin-top: 4rpx;
+  font-size: 20rpx;
+  color: rgba(17, 24, 17, 0.58);
+}
+
+.bell {
+  width: 44rpx;
+  height: 44rpx;
+  border-radius: 50%;
+  background: rgba(255, 255, 255, 0.48);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.admission-list {
+  padding: 4rpx 18rpx 2rpx;
+}
+
+.admission-item,
+.news-item {
+  display: flex;
+}
+
+.admission-item {
+  margin-top: 20rpx;
+}
+
+.line-dot {
+  width: 10rpx;
+  height: 10rpx;
+  margin: 10rpx 14rpx 0 0;
+  border-radius: 50%;
+  background: #0b7a3c;
+  flex-shrink: 0;
+}
+
+.article-body {
+  flex: 1;
+  min-width: 0;
+}
+
+.article-date {
+  font-size: 20rpx;
+  color: #8c9688;
+}
+
+.article-title {
+  margin-top: 5rpx;
+  color: #2c322e;
+  font-size: 25rpx;
+  line-height: 1.35;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.card-foot {
+  height: 58rpx;
+  margin-top: 20rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 4rpx;
+  background: #f5f6ef;
+  color: #83907d;
+  font-size: 22rpx;
+}
+
+.college-grid {
+  margin: 0 20rpx;
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 18rpx;
+}
+
+.college-card {
+  position: relative;
+  min-height: 208rpx;
+  overflow: hidden;
+  padding: 20rpx 18rpx;
+  border-radius: 16rpx;
+  background: #ffffff;
+  box-shadow: 0 10rpx 24rpx rgba(35, 91, 42, 0.08);
+}
+
+.building-lines {
+  position: absolute;
+  right: -14rpx;
+  bottom: -10rpx;
+  width: 180rpx;
+  height: 112rpx;
+  opacity: 0.22;
+  background:
+    linear-gradient(#93cf8d 0 0) 0 88rpx / 180rpx 4rpx no-repeat,
+    repeating-linear-gradient(90deg, transparent 0 21rpx, #93cf8d 22rpx 24rpx),
+    repeating-linear-gradient(0deg, transparent 0 25rpx, #93cf8d 26rpx 28rpx);
+}
+
+.college-head {
+  position: relative;
+  display: flex;
+  align-items: center;
+}
+
+.college-icon {
+  width: 42rpx;
+  height: 42rpx;
+  border-radius: 50%;
+  background: #0b7a3c;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+}
+
+.college-name {
+  min-width: 0;
+  margin-left: 10rpx;
+  color: #222a23;
+  font-size: 26rpx;
+  font-weight: 800;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.college-tags {
+  position: relative;
+  margin-top: 18rpx;
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 9rpx 16rpx;
+}
+
+.college-tag {
+  justify-self: start;
+  max-width: 100%;
+  padding: 6rpx 10rpx;
+  border-radius: 4rpx;
+  background: #eef5a4;
+  color: #0b7a3c;
+  font-size: 20rpx;
+  line-height: 28rpx;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.videos-grid {
+  margin: 0 20rpx;
+}
+
+.video-card {
+  border-radius: 16rpx;
+  overflow: hidden;
+  background: #ffffff;
+  box-shadow: 0 12rpx 30rpx rgba(35, 91, 42, 0.1);
+}
+
+.video-player {
+  width: 100%;
+  height: 380rpx;
+  display: block;
+}
+
+.scenery-grid {
+  margin: 0 20rpx;
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 18rpx;
+}
+
+.scenery-card {
+  position: relative;
+  height: 176rpx;
+  overflow: hidden;
+  border-radius: 14rpx;
+  box-shadow: 0 8rpx 20rpx rgba(35, 91, 42, 0.12);
+}
+
+/* 卡1 银杏大道:暖金天 + 金黄山丘 */
+.scenery-card-0 {
+  background: linear-gradient(180deg, #ffe9a8 0%, #ffd977 100%);
+}
+
+.scenery-card-0 .scenery-hill-a {
+  background: #f4b942;
+}
+
+.scenery-card-0 .scenery-hill-b {
+  background: #e39a2d;
+}
+
+/* 卡2 教学楼:青蓝天 + 墨绿山丘 */
+.scenery-card-1 {
+  background: linear-gradient(180deg, #cdeaf5 0%, #9ed3e8 100%);
+}
+
+.scenery-card-1 .scenery-hill-a {
+  background: #4d9e7f;
+}
+
+.scenery-card-1 .scenery-hill-b {
+  background: #2f7d63;
+}
+
+/* 卡3 智慧教室:淡紫天 + 蓝紫山丘 */
+.scenery-card-2 {
+  background: linear-gradient(180deg, #e4dcf6 0%, #c3b4ea 100%);
+}
+
+.scenery-card-2 .scenery-hill-a {
+  background: #7a6fc9;
+}
+
+.scenery-card-2 .scenery-hill-b {
+  background: #5d54a8;
+}
+
+/* 卡4 林荫大道:晨雾绿 + 深绿山丘 */
+.scenery-card-3 {
+  background: linear-gradient(180deg, #d8f0c8 0%, #a9dba2 100%);
+}
+
+.scenery-card-3 .scenery-hill-a {
+  background: #59a86b;
+}
+
+.scenery-card-3 .scenery-hill-b {
+  background: #3a8a4e;
+}
+
+/* 有 img 时显示真图,覆盖卡片背景 */
+.scenery-img {
+  position: absolute;
+  inset: 0;
+  width: 100%;
+  height: 100%;
+  display: block;
+}
+
+/* 太阳:右上角圆 */
+.scenery-sun {
+  position: absolute;
+  right: 18rpx;
+  top: 14rpx;
+  width: 36rpx;
+  height: 36rpx;
+  border-radius: 50%;
+  background: rgba(255, 255, 255, 0.75);
+  box-shadow: 0 0 0 10rpx rgba(255, 255, 255, 0.25);
+}
+
+/* 山丘:两个错位的椭圆叠出层次 */
+.scenery-hill {
+  position: absolute;
+  border-radius: 50%;
+}
+
+.scenery-hill-a {
+  left: -30%;
+  bottom: -52rpx;
+  width: 110%;
+  height: 110rpx;
+}
+
+.scenery-hill-b {
+  right: -35%;
+  bottom: -70rpx;
+  width: 120%;
+  height: 128rpx;
+  opacity: 0.9;
+}
+
+.scenery-overlay {
+  position: absolute;
+  inset: 0;
+  background: linear-gradient(180deg, rgba(255, 255, 255, 0) 40%, rgba(20, 60, 35, 0.28) 100%);
+}
+
+.scenery-icon {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  margin-left: -28rpx;
+  margin-top: -44rpx;
+  text-shadow: 0 4rpx 10rpx rgba(0, 0, 0, 0.18);
+}
+
+.scenery-name {
+  position: absolute;
+  left: 18rpx;
+  bottom: 12rpx;
+  color: #ffffff;
+  font-size: 25rpx;
+  font-weight: 800;
+  text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.28);
+}
+
+.tabbar {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 38;
+  min-height: 98rpx;
+  padding-bottom: constant(safe-area-inset-bottom);
+  padding-bottom: env(safe-area-inset-bottom);
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  background: rgba(255, 255, 255, 0.97);
+  box-shadow: 0 -8rpx 24rpx rgba(22, 58, 29, 0.08);
+}
+
+.tabbar-item {
+  position: relative;
+  padding-top: 12rpx;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-start;
+  color: #9aa39a;
+  font-size: 20rpx;
+}
+
+.tabbar-item text {
+  margin-top: 4rpx;
+}
+
+.tabbar-active {
+  color: #0b7a3c;
+  font-weight: 800;
+}
+
+.tabbar-active::before {
+  content: "";
+  position: absolute;
+  top: 5rpx;
+  width: 52rpx;
+  height: 6rpx;
+  border-radius: 999rpx;
+  background: #e8ef38;
+}

+ 96 - 0
pages/home-v2/info/index.js

@@ -0,0 +1,96 @@
+// 静态信息页:按 type 参数展示 学生公寓/招生章程/招生政策
+// 内容为静态占位文案,正式接入时替换为后台数据
+var INFO = {
+  apartment: {
+    title: "学生公寓",
+    desc: "住宿条件与生活配套",
+    sections: [
+      {
+        heading: "宿舍配置",
+        lines: ["4 人间为主,上床下桌", "独立卫生间、空调、全天热水", "校园网全覆盖"],
+      },
+      {
+        heading: "生活配套",
+        lines: ["多栋食堂、大礼堂", "图书馆藏书 71 万+", "标准塑胶运动场、篮球场"],
+      },
+      {
+        heading: "相关费用",
+        lines: ["住宿费约 1000 元 / 年"],
+      },
+    ],
+  },
+  charter: {
+    title: "招生章程",
+    desc: "办学性质与报考信息",
+    sections: [
+      {
+        heading: "办学概况",
+        lines: ["公办全日制普通高职专科", "主管单位:江西省农业农村厅", "教育部备案院校"],
+      },
+      {
+        heading: "报考代码",
+        lines: ["院校代码:13426", "江西报考代码:8616"],
+      },
+      {
+        heading: "校址",
+        lines: [
+          "主校区:南昌市南昌县莲塘北大道 1636 号",
+          "金溪产业学院(抚州金溪,五年制高职)",
+        ],
+      },
+      {
+        heading: "收费标准",
+        lines: [
+          "普通专业 5000 元 / 年",
+          "水产养殖技术专业免学费(定向除外)",
+          "住宿费约 1000 元 / 年",
+        ],
+      },
+    ],
+  },
+  policy: {
+    title: "招生政策",
+    desc: "招生类型与奖助升学",
+    sections: [
+      {
+        heading: "招生类型",
+        lines: [
+          "三年制统招高职(高考普高生)",
+          "五年一贯制高职(初中起点,主校区+金溪产业学院)",
+          "单独招生(江西高职单招,每年 3 月)",
+          "三定向(涉农定向培养,免学费,毕业回地方就业)",
+        ],
+      },
+      {
+        heading: "奖助体系",
+        lines: [
+          "国家奖学金最高 8000 元 / 年",
+          "国家励志奖学金 5000 元 / 年",
+          "国家助学金 2000-4000 元 / 年",
+          "校内奖学金、勤工助学岗位、涉农专项补贴",
+        ],
+      },
+      {
+        heading: "升学通道",
+        lines: [
+          "统招专升本:大三报考省内本科院校,校内设辅导班",
+          "自考 / 成人本科:校内设自考考点,可套读华中农大、东北农大",
+        ],
+      },
+    ],
+  },
+};
+
+Page({
+  data: {
+    title: "",
+    desc: "",
+    sections: [],
+  },
+
+  onLoad: function (options) {
+    var info = INFO[options.type] || INFO.charter;
+    this.setData(info);
+    wx.setNavigationBarTitle({ title: info.title });
+  },
+});

+ 5 - 0
pages/home-v2/info/index.json

@@ -0,0 +1,5 @@
+{
+  "navigationStyle": "default",
+  "navigationBarTitleText": "详情",
+  "backgroundColor": "#F6F9E8"
+}

+ 8 - 0
pages/home-v2/info/index.wxml

@@ -0,0 +1,8 @@
+<!-- 静态信息页:按 type 参数展示 学生公寓/招生章程/招生政策 -->
+<view class="info-page">
+  <view class="info-desc">{{desc}}</view>
+  <view class="info-card" wx:for="{{sections}}" wx:key="heading">
+    <view class="info-heading">{{item.heading}}</view>
+    <view class="info-line" wx:for="{{item.lines}}" wx:for-item="line" wx:key="*this">{{line}}</view>
+  </view>
+</view>

+ 43 - 0
pages/home-v2/info/index.wxss

@@ -0,0 +1,43 @@
+/* 静态信息页样式(与首页 V2 风格统一) */
+page {
+  background: #F6F9E8;
+}
+.info-page {
+  padding: 24rpx 32rpx 60rpx;
+}
+.info-desc {
+  font-size: 24rpx;
+  color: #768878;
+  margin-bottom: 24rpx;
+}
+.info-card {
+  background: #ffffff;
+  border-radius: 20rpx;
+  padding: 28rpx;
+  margin-bottom: 24rpx;
+  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
+}
+.info-heading {
+  font-size: 30rpx;
+  font-weight: bold;
+  color: #2f7d33;
+  margin-bottom: 16rpx;
+}
+.info-line {
+  font-size: 26rpx;
+  color: #4a4a44;
+  line-height: 1.8;
+  padding-left: 24rpx;
+  position: relative;
+}
+.info-line::before {
+  content: "";
+  position: absolute;
+  left: 4rpx;
+  top: 50%;
+  margin-top: -4rpx;
+  width: 8rpx;
+  height: 8rpx;
+  border-radius: 50%;
+  background: #2f7d33;
+}

+ 13 - 1
project.private.config.json

@@ -28,6 +28,18 @@
     "list": []
   },
   "libVersion": "3.17.2",
-  "condition": {},
+  "condition": {
+    "miniprogram": {
+      "list": [
+        {
+          "name": "pages/home-v2/index",
+          "pathName": "pages/home-v2/index",
+          "query": "",
+          "scene": null,
+          "launchMode": "default"
+        }
+      ]
+    }
+  },
   "projectname": "nova-demo-real"
 }