LiuShu_0203 1 هفته پیش
والد
کامیت
e01af16b32
38فایلهای تغییر یافته به همراه1006 افزوده شده و 322 حذف شده
  1. 2 2
      app.js
  2. 5 2
      app.json
  3. 66 0
      cloud/sendSms/index.js.js
  4. 2 0
      cloud/sendSms/index.js.wxml
  5. 29 18
      pages/groupbuying/groupbuying.js
  6. 1 1
      pages/groupbuying/groupbuying.wxml
  7. 32 45
      pages/index/index.js
  8. 1 1
      pages/index/index.wxml
  9. 141 50
      pages/login/login.js
  10. 15 6
      pages/login/login.wxml
  11. 8 0
      pages/login/login.wxss
  12. 105 0
      pages/logins/logins.js
  13. 4 0
      pages/logins/logins.json
  14. 29 0
      pages/logins/logins.wxml
  15. 60 0
      pages/logins/logins.wxss
  16. 30 7
      subpackages/jxhome/jxhome.js
  17. 1 1
      subpackages/jxhome/jxhome.wxml
  18. 29 7
      subpackages/kchome/kchome.js
  19. 1 1
      subpackages/kchome/kchome.wxml
  20. 29 7
      subpackages/pxhome/pxhome.js
  21. 1 1
      subpackages/pxhome/pxhome.wxml
  22. 29 7
      subpackages/zshome/zshome.js
  23. 1 1
      subpackages/zshome/zshome.wxml
  24. 117 26
      subpackagestow/course/course.js
  25. 7 7
      subpackagestow/course/course.wxml
  26. 1 0
      subpackagestow/course/course.wxss
  27. 48 12
      subpackagestow/details/details.js
  28. 41 30
      subpackagestow/details/details.wxml
  29. 25 31
      subpackagestow/details/details.wxss
  30. 10 1
      subpackagestow/down/down.js
  31. 2 2
      subpackagestow/down/down.wxml
  32. 59 19
      subpackagestow/show/show.js
  33. 15 3
      subpackagestow/show/show.wxml
  34. 28 16
      subpackagestow/teaching/teaching.js
  35. 1 1
      subpackagestow/teaching/teaching.wxml
  36. 28 15
      subpackagestow/training/training.js
  37. 1 1
      subpackagestow/training/training.wxml
  38. 2 1
      utils/cloudbase.js

+ 2 - 2
app.js

@@ -6,7 +6,7 @@ App({
 
   // 检查登录状态并弹出提示框
   checkLoginStatus() {
-    const isLoggedIn = wx.getStorageSync('isLoggedIn') || false;
+    const isLoggedIn = wx.getStorageSync('userInfo') || false;
     if (!isLoggedIn) {
       wx.showModal({
         title: '绑定手机号',
@@ -17,7 +17,7 @@ App({
           if (res.confirm) {
             // 跳转到绑定手机号页面
             wx.navigateTo({
-              url: '/pages/login/login',
+              url: '/pages/logins/logins',
             });
           }
         },

+ 5 - 2
app.json

@@ -2,14 +2,17 @@
   "usingComponents": {
     "van-button": "vant-weapp/button",
     "van-stepper": "vant-weapp/stepper/index",
-    "van-dialog": "vant-weapp/dialog/index"
+    "van-dialog": "vant-weapp/dialog/index",
+    "van-icon": "vant-weapp/icon/index"
   },
   "pages": [
     "pages/index/index",
     "pages/groupbuying/groupbuying",
     "pages/shoppingcart/shoppingcart",
     "pages/me/me",
-    "pages/login/login"
+    "pages/login/login",
+    "pages/logins/logins",
+    "cloud/sendSms/index.js"
   ],
   "window": {
     "navigationBarTextStyle": "black",

+ 66 - 0
cloud/sendSms/index.js.js

@@ -0,0 +1,66 @@
+// cloud/sendSms/index.js.js
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 2 - 0
cloud/sendSms/index.js.wxml

@@ -0,0 +1,2 @@
+<!--cloud/sendSms/index.js.wxml-->
+<text>cloud/sendSms/index.js.wxml</text>

+ 29 - 18
pages/groupbuying/groupbuying.js

@@ -1,24 +1,8 @@
+import { models, db } from '../../utils/cloudbase.js'
 Page({
   data: {
     categoriesindex: 1,
-    categories: [
-      {
-        title: '全部',
-        type: 1,
-      },{
-        title: '益智玩具',
-        type: 2,
-      },{
-        title: '绘本图书',
-        type: 3,
-      },{
-        title: '文具用品',
-        type: 4,
-      },{
-        title: '健康零食',
-        type: 5,
-      }
-    ],
+    categories: [],
     goods: [
       {
         image: 'https://img1.baidu.com/it/u=2052658756,3021621759&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500',
@@ -54,6 +38,8 @@ Page({
     // xiazi: '',
   },
   onLoad(options) {
+    // 获取tab数据
+    this.getTabdata();
     // const title = options.title ? decodeURIComponent(options.title) : '商品列表';
     // this.setData({ title });
     // wx.setNavigationBarTitle({ title });
@@ -80,6 +66,31 @@ Page({
       console.error('有文件下载失败:', err);
     });
   },
+
+  // tab数据
+  async getTabdata() {
+    const { data } = await models.tab.list({
+      filter: {
+        where: {
+          position: 4, // 显示位置
+          // layout_type: 0, // 布局类型
+        },
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    console.log(data);
+
+    const sortedRecords = data.records.sort((a, b) => {
+      return a.sort - b.sort; // 升序排列
+    });
+    this.setData({
+      categories: sortedRecords
+    })
+  },
+
   tabcategories(e) {
     const type = e.currentTarget.dataset.type;
     this.setData({

+ 1 - 1
pages/groupbuying/groupbuying.wxml

@@ -7,7 +7,7 @@
     <view class="title_1">商品分类</view>
     <view class="category-tabs">
       <view wx:for="{{categories}}" wx:key="index">
-        <view class="category-tab {{item.type === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.type}}">{{item.title}}</view>
+        <view class="category-tab {{item.sort === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.sort}}">{{item.name}}</view>
       </view>
     </view>
     <view class="goods-list">

+ 32 - 45
pages/index/index.js

@@ -1,8 +1,8 @@
 // index.js
 // const db=wx.cloud.database()
 import { models, db } from '../../utils/cloudbase.js'
-// import Dialog from '/vant-weapp/dialog/dialog';
-// const app = getApp();
+import Dialog from '/vant-weapp/dialog/dialog';
+const app = getApp();
 
 Page({
   data: {
@@ -17,12 +17,14 @@ Page({
 
   onShow() {
     // 检查登录状态
-    // app.checkLoginStatus();
-
+    app.checkLoginStatus();
+    // 获取轮播图数据
+    this.getBanner();
+    // 获取图片
     const fileIDs = [
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_4.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_3.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_2.png',
@@ -38,50 +40,35 @@ Page({
       const tempFilePaths = results.map(r => r.tempFilePath);
       console.log('全部下载成功:', tempFilePaths);
       this.setData({
-        carousellist: tempFilePaths.slice(0, 2),
-        homepage_4: tempFilePaths[3],
-        homepage_3: tempFilePaths[4],
-        homepage_2: tempFilePaths[5],
-        homepage_1: tempFilePaths[6],
-        souimg: tempFilePaths[7]
+        // carousellist: tempFilePaths.slice(0, 2),
+        homepage_4: tempFilePaths[0],
+        homepage_3: tempFilePaths[1],
+        homepage_2: tempFilePaths[2],
+        homepage_1: tempFilePaths[3],
+        souimg: tempFilePaths[4]
       });
     }).catch(err => {
       console.error('有文件下载失败:', err);
     });
   },
 
-  // // 页面加载时判断登录状态
-  // onLoad() {
-  //   this.checkLoginStatus();
-  // },
-
-  // // 检查登录状态
-  // checkLoginStatus() {
-  //   // 假设登录状态存储在全局变量或缓存中
-  //   const isLoggedIn = wx.getStorageSync('isLoggedIn') || false;
-  //   if (!isLoggedIn) {
-  //     this.showLoginDialog();
-  //   }
-  // },
-
-  // // 显示登录弹框
-  // showLoginDialog() {
-  //   Dialog.confirm({
-  //     title: '提示',
-  //     message: '您还未登录,请先绑定手机号',
-  //     confirmButtonText: '立即绑定',
-  //     cancelButtonText: '取消',
-  //   })
-  //     .then(() => {
-  //       // 用户点击“立即绑定”,跳转到绑定手机号页面
-  //       wx.navigateTo({
-  //         url: '/pages/me/me', // 绑定手机号页面路径
-  //       });
-  //     })
-  //     .catch(() => {
-  //       // 用户点击“取消”,不做任何操作
-  //     });
-  // },
+    // 轮播数据
+    async getBanner() {
+      const { data } = await models.banner.list({
+        filter: {
+          where: {
+            position: 0
+          }
+        },
+        // envType: pre 体验环境, prod 正式环境
+        envType: "prod",
+      });
+      
+      // 返回查询到的数据
+      this.setData({
+        carousellist: data.records
+      })
+    },
 
   // 页面跳转  二级页面
   selectGroupOption(e) {

+ 1 - 1
pages/index/index.wxml

@@ -11,7 +11,7 @@
       <swiper style="width: 100%; height: 100%;" autoplay="true" interval="3000" circular>
         <block wx:for="{{carousellist}}" wx:key="index">
           <swiper-item>
-            <image style="width: 100%; height: 100%;" src="{{item}}" mode="aspectFill" />
+            <image style="width: 100%; height: 100%;" src="{{item.url}}" mode="aspectFill" />
           </swiper-item>
         </block>
       </swiper>

+ 141 - 50
pages/login/login.js

@@ -1,66 +1,157 @@
-// pages/login/login.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
-  /**
-   * 页面的初始数据
-   */
   data: {
-
-  },
-
-  /**
-   * 生命周期函数--监听页面加载
-   */
-  onLoad(options) {
-
-  },
-
-  /**
-   * 生命周期函数--监听页面初次渲染完成
-   */
-  onReady() {
-
+    phone: '',
+    gardenList: [], // 这里替换为实际园所名称数组
+    gardenIndex: null,
+    contactsname: '',
+    selected: {}
   },
 
-  /**
-   * 生命周期函数--监听页面显示
-   */
-  onShow() {
-
+  // 监听手机号输入框
+  onPhoneInput(e) {
+    this.setData({
+      phone: e.detail.value
+    });
   },
 
-  /**
-   * 生命周期函数--监听页面隐藏
-   */
-  onHide() {
-
+  // 监听姓名输入框
+  onContactsInput(e) {
+    this.setData({
+      contactsname: e.detail.value
+    });
   },
 
-  /**
-   * 生命周期函数--监听页面卸载
-   */
-  onUnload() {
-
+  onLoad(options) {
+    this.onScholl();
+    this.setData({
+      phone: options.phone || ''
+    });
   },
 
-  /**
-   * 页面相关事件处理函数--监听用户下拉动作
-   */
-  onPullDownRefresh() {
-
+  // 获取学校数据
+  async onScholl() {
+    try {
+      let allRecords = [];
+      let pageNumber = 1;
+      const pageSize = 100; // 每次查询 100 条
+  
+      while (true) {
+        const { data } = await models.wx_school.list({
+          filter: {
+            where: {}
+          },
+          pageSize: pageSize,
+          pageNumber: pageNumber,
+          getCount: true,
+          envType: "prod",
+        });
+  
+        if (data.records.length === 0) {
+          break; // 没有更多数据,退出循环
+        }
+  
+        allRecords = allRecords.concat(data.records); // 将当前页数据添加到全部数据中
+        pageNumber++; // 查询下一页
+      }
+  
+      this.setData({
+        gardenList: allRecords // 按实际字段替换
+      });
+      console.log(this.data.gardenList, 'gardenList');
+    } catch (error) {
+      console.error('获取数据失败:', error);
+      wx.showToast({
+        title: '获取数据失败,请稍后再试',
+        icon: 'none'
+      });
+    }
   },
-
-  /**
-   * 页面上拉触底事件的处理函数
-   */
-  onReachBottom() {
-
+  
+  // 选择学校下拉框
+  async onGardenChange(e) {
+    const index = parseInt(e.detail.value);
+    this.setData({
+      gardenIndex: index
+    });
+    const selected = this.data.gardenList[index];
+    this.setData({
+      selected: selected
+    })
   },
 
-  /**
-   * 用户点击右上角分享
-   */
-  onShareAppMessage() {
-
+  // 确定
+  async bindingevents() {
+    const { phone, contactsname, selected } = this.data;
+
+    if (!phone || !contactsname || !selected) {
+      wx.showToast({
+        title: '请填写完整信息',
+        icon: 'none'
+      });
+      return;
+    }
+
+    try {
+      // 查询校验
+      const { data } = await models.wx_teacher_user.get({
+        filter: {
+          where: {
+            phone: phone,
+            school_id: selected._id,
+            name: contactsname
+          }
+        },
+        envType: "prod",
+      });
+
+      if (data && Object.keys(data).length > 0) {
+        const user = Array.isArray(data) ? data[0] : data;
+        // 更新
+        await models.wx_teacher_user.update({
+          filter: {
+            where: {
+              $and: [
+                {
+                  _id: {
+                    $eq: user._id, // 推荐传入_id数据标识进行操作
+                  },
+                },
+              ]
+            }
+          },
+          data: {
+            bound: 1
+          },
+          envType: "prod"
+        });
+        // 登录成功,保存用户信息
+        wx.setStorageSync('userInfo', user);
+        wx.showToast({
+          title: '绑定成功',
+          icon: 'success',
+          duration: 1500
+        });
+
+        setTimeout(() => {
+          wx.reLaunch({
+            url: '/pages/index/index'
+          });
+        }, 1500);
+      } else {
+        wx.showToast({
+          title: '绑定失败,请确认信息是否正确',
+          icon: 'none'
+        });
+      }
+
+    } catch (error) {
+      console.error('绑定失败:', error);
+      wx.showToast({
+        title: '请求失败,请稍后再试',
+        icon: 'none'
+      });
+    }
   }
 })

+ 15 - 6
pages/login/login.wxml

@@ -2,27 +2,36 @@
   <view class="goodslist_boxs">
     <view class="input-group">
       <label>园所</label>
-      <input type="text" placeholder="请输入园所名称" />
+      <!-- <input type="text" placeholder="请输入园所名称" /> -->
+      <picker mode="selector"
+      range="{{gardenList}}"
+      range-key="name"
+      value="{{gardenIndex}}"
+      bindchange="onGardenChange">
+        <view class="picker">
+          {{gardenIndex !== null ? gardenList[gardenIndex].name : '请选择园所'}}
+        </view>
+      </picker>
     </view>
     <view class="input-group">
       <label>姓名</label>
       <view>
-        <input type="text" placeholder="请输入姓名" />
+        <input bindinput="onContactsInput" type="text" placeholder="请输入姓名" />
       </view>
     </view>
     <view class="input-group">
       <label>手机号码</label>
       <view>
-        <input type="text" placeholder="请输入常用的手机号码" />
+        <input value="{{phone}}" bindinput="onPhoneInput" type="text" placeholder="请输入常用的手机号码" />
       </view>
     </view>
-    <view class="input-group">
+    <!-- <view class="input-group">
       <label>验证码</label>
       <view style="display: flex;">
         <input style="width: 95%;margin-right: 3%;" type="text" placeholder="请输入验证码" />
         <button class="get-code-btn">获取验证码</button>
       </view>
-    </view>
-    <button class="confirm-btn">确定</button>
+    </view> -->
+    <button class="confirm-btn" bindtap="bindingevents">确定</button>
   </view>
 </view>

+ 8 - 0
pages/login/login.wxss

@@ -50,4 +50,12 @@
   margin-top: 50rpx;
   position: fixed;
   bottom: 40rpx;
+}
+
+picker {
+  width: calc( 100% - 40rpx);
+  padding: 20rpx;
+  border: 1rpx solid #dcdfe6;
+  border-radius: 12rpx;
+  background: #fff;
 }

+ 105 - 0
pages/logins/logins.js

@@ -0,0 +1,105 @@
+import { models, db } from '../../utils/cloudbase.js'
+Page({
+  data: {
+    phone: '', // 用户输入的手机号码
+    code: ''   // 用户输入的验证码
+  },
+
+  // 监听手机号码输入
+  onInputPhone(e) {
+    this.setData({
+      phone: e.detail.value
+    });
+  },
+
+  // 监听验证码输入
+  onInputCode(e) {
+    this.setData({
+      code: e.detail.value
+    });
+  },
+
+  // 获取验证码
+  getCode() {
+    const { phone } = this.data;
+    if (!phone || !/^1[3-9]\d{9}$/.test(phone)) {
+      wx.showToast({
+        title: '请输入有效的手机号码',
+        icon: 'none'
+      });
+      return;
+    }
+
+    const code = this.generateCode(); // 本地生成验证码(用于发送)
+
+    // 保存验证码到 data
+    this.setData({ code });
+
+    console.log(code, 'codecode');
+
+  },
+
+  
+  generateCode() {
+    return Math.floor(100000 + Math.random() * 900000).toString();
+  },
+
+  // 确定按钮点击事件
+  async onConfirm() {
+    const { phone, code } = this.data;
+    if (!phone || !code) {
+      wx.showToast({
+        title: '请输入手机号码和验证码',
+        icon: 'none'
+      });
+      return;
+    }
+
+    const { data } = await models.wx_teacher_user.get({
+      filter: {
+        where: {
+          phone: this.data.phone
+        }
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    console.log('data',data);
+    if (!data || Object.keys(data).length === 0) {
+      wx.showToast({
+        title: '该手机号未注册,请换其他手机号进行登录',
+        icon: 'none'
+      });
+      return;
+    }
+
+    const user = data; // 取第一条用户数据
+    
+    if (user.bound === 0) {
+      // 第一次登录去绑定
+      wx.showToast({
+        title: '首次登录,请先绑定信息',
+        icon: 'none',
+        duration: 1500
+      });
+      
+      setTimeout(() => {
+        wx.navigateTo({
+          url: `/pages/login/login?phone=${encodeURIComponent(this.data.phone)}`
+        });
+      }, 1500); // 等提示展示完再跳转
+    } else {
+      // 登录成功,存储用户信息
+      wx.setStorageSync('userInfo', user);
+    
+      wx.showToast({
+        title: '登录成功',
+        icon: 'success'
+      });
+    
+      wx.switchTab({
+        url: '/pages/index/index'
+      });
+    }
+  }
+})

+ 4 - 0
pages/logins/logins.json

@@ -0,0 +1,4 @@
+{
+  "usingComponents": {},
+  "navigationBarTitleText": "登录"
+}

+ 29 - 0
pages/logins/logins.wxml

@@ -0,0 +1,29 @@
+<view style="background: #f5f5f5; padding: 20rpx 0;">
+  <view class="goodslist_boxs">
+    <!-- <view class="input-group">
+      <label>园所</label>
+      <input type="text" placeholder="请输入园所名称" />
+    </view>
+    <view class="input-group">
+      <label>姓名</label>
+      <view>
+        <input type="text" placeholder="请输入姓名" />
+      </view>
+    </view> -->
+    <view class="input-group">
+      <label>手机号码</label>
+      <view>
+        <input bindinput="onInputPhone" type="text" placeholder="请输入常用的手机号码" />
+      </view>
+    </view>
+    <view class="input-group">
+      <label>验证码</label>
+      <view style="display: flex;">
+        <input style="width: 95%;margin-right: 3%;" type="text" placeholder="请输入验证码" bindinput="onInputCode"/>
+        <button bindtap="getCode" class="get-code-btn">获取验证码</button>
+      </view>
+    </view>
+    <navigator url="/pages/login/login" open-type="navigate">您还没有账号,去注册</navigator>
+    <button bindtap="onConfirm" class="confirm-btn">登录</button>
+  </view>
+</view>

+ 60 - 0
pages/logins/logins.wxss

@@ -0,0 +1,60 @@
+.goodslist_boxs {
+  margin: 0rpx 30rpx;
+  width: calc(100% - 60rpx);
+  height: calc( 100vh - 40rpx);
+}
+.input-group {
+  display: flex;
+  flex-direction: column;
+  margin-bottom: 20rpx;
+}
+
+.input-group label {
+  font-size: 32rpx;
+  color: #333;
+  margin-bottom: 10rpx;
+}
+
+.input-group input {
+  height: 80rpx;
+  background: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4rpx;
+  padding: 0 20rpx;
+  font-size: 28rpx;
+  border-radius: 12rpx;
+}
+
+.get-code-btn {
+  width: 300rpx !important;
+  height: 80rpx;
+  background-color: #fff;
+  color: #409eff;
+  border: 1rpx solid #409eff;
+  border-radius: 4rpx;
+  padding: 20rpx 0rpx;
+  /* margin-left: 20rpx; */
+  margin-top: 1rpx;
+  font-size: 28rpx;
+  border-radius: 12rpx;
+}
+
+.confirm-btn {
+  background-color: #409eff;
+  color: white;
+  border: none;
+  border-radius: 40rpx;
+  width: calc( 100% - 60rpx) !important;
+  height: 80rpx;
+  font-size: 30rpx;
+  margin-top: 50rpx;
+  position: fixed;
+  bottom: 40rpx;
+}
+
+navigator {
+  text-align: center;
+  font-size: 24rpx;
+  color: #007aff;
+  margin-top: 50rpx;
+}

+ 30 - 7
subpackages/jxhome/jxhome.js

@@ -1,4 +1,5 @@
 // subpackages/jxhome/jxhome.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -12,10 +13,13 @@ Page({
   },
 
   onShow() {
+    // 获取轮播图数据
+    this.getBanner();
+    // 获取图片
     const fileIDs = [
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_7.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_6.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_5.png',
@@ -29,15 +33,34 @@ Page({
       const tempFilePaths = results.map(r => r.tempFilePath);
       console.log('全部下载成功:', tempFilePaths);
       this.setData({
-        carousellist: tempFilePaths.slice(0, 2),
-        homepage_7: tempFilePaths[3],
-        homepage_6: tempFilePaths[4],
-        homepage_5: tempFilePaths[5],
+        // carousellist: tempFilePaths.slice(0, 2),
+        homepage_7: tempFilePaths[0],
+        homepage_6: tempFilePaths[1],
+        homepage_5: tempFilePaths[2],
       });
     }).catch(err => {
       console.error('有文件下载失败:', err);
     });
   },
+
+  // 轮播数据
+  async getBanner() {
+    const { data } = await models.banner.list({
+      filter: {
+        where: {
+          position: 3
+        }
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    this.setData({
+      carousellist: data.records
+    })
+  },
+
   // 页面跳转  三级页面
   goToGoodsList(e) {
     const type = e.currentTarget.dataset.type;

+ 1 - 1
subpackages/jxhome/jxhome.wxml

@@ -6,7 +6,7 @@
       <swiper style="width: 100%; height: 100%;" autoplay="true" interval="3000" circular>
         <block wx:for="{{carousellist}}" wx:key="index">
           <swiper-item>
-            <image style="width: 100%; height: 100%;" src="{{item}}" mode="aspectFill" />
+            <image style="width: 100%; height: 100%;" src="{{item.url}}" mode="aspectFill" />
           </swiper-item>
         </block>
       </swiper>

+ 29 - 7
subpackages/kchome/kchome.js

@@ -1,4 +1,5 @@
 // subpackages/kchome/kchome.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -12,10 +13,13 @@ Page({
   },
 
   onShow() {
+    // 获取轮播图数据
+    this.getBanner();
+    // 获取图片
     const fileIDs = [
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_7.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_6.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_5.png',
@@ -29,16 +33,34 @@ Page({
       const tempFilePaths = results.map(r => r.tempFilePath);
       console.log('全部下载成功:', tempFilePaths);
       this.setData({
-        carousellist: tempFilePaths.slice(0, 2),
-        homepage_7: tempFilePaths[3],
-        homepage_6: tempFilePaths[4],
-        homepage_5: tempFilePaths[5],
+        // carousellist: tempFilePaths.slice(0, 2),
+        homepage_7: tempFilePaths[0],
+        homepage_6: tempFilePaths[1],
+        homepage_5: tempFilePaths[2],
       });
     }).catch(err => {
       console.error('有文件下载失败:', err);
     });
   },
 
+    // 轮播数据
+    async getBanner() {
+      const { data } = await models.banner.list({
+        filter: {
+          where: {
+            position: 1
+          }
+        },
+        // envType: pre 体验环境, prod 正式环境
+        envType: "prod",
+      });
+      
+      // 返回查询到的数据
+      this.setData({
+        carousellist: data.records
+      })
+    },
+
   // 页面跳转  三级页面
   goToGoodsList(e) {
     const type = e.currentTarget.dataset.type;

+ 1 - 1
subpackages/kchome/kchome.wxml

@@ -6,7 +6,7 @@
       <swiper style="width: 100%; height: 100%;" autoplay="true" interval="3000" circular>
         <block wx:for="{{carousellist}}" wx:key="index">
           <swiper-item>
-            <image style="width: 100%; height: 100%;" src="{{item}}" mode="aspectFill" />
+            <image style="width: 100%; height: 100%;" src="{{item.url}}" mode="aspectFill" />
           </swiper-item>
         </block>
       </swiper>

+ 29 - 7
subpackages/pxhome/pxhome.js

@@ -1,4 +1,5 @@
 // subpackages/pxhome/pxhome.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -12,10 +13,13 @@ Page({
   },
 
   onShow() {
+    // 获取轮播图数据
+    this.getBanner();
+    // 获取图片
     const fileIDs = [
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_7.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_6.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_5.png',
@@ -29,16 +33,34 @@ Page({
       const tempFilePaths = results.map(r => r.tempFilePath);
       console.log('全部下载成功:', tempFilePaths);
       this.setData({
-        carousellist: tempFilePaths.slice(0, 2),
-        homepage_7: tempFilePaths[3],
-        homepage_6: tempFilePaths[4],
-        homepage_5: tempFilePaths[5],
+        // carousellist: tempFilePaths.slice(0, 2),
+        homepage_7: tempFilePaths[0],
+        homepage_6: tempFilePaths[1],
+        homepage_5: tempFilePaths[2],
       });
     }).catch(err => {
       console.error('有文件下载失败:', err);
     });
   },
 
+  // 轮播数据
+  async getBanner() {
+    const { data } = await models.banner.list({
+      filter: {
+        where: {
+          position: 2
+        }
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    this.setData({
+      carousellist: data.records
+    })
+  },
+
   // 页面跳转  三级页面
   goToGoodsList(e) {
     const type = e.currentTarget.dataset.type;

+ 1 - 1
subpackages/pxhome/pxhome.wxml

@@ -6,7 +6,7 @@
       <swiper style="width: 100%; height: 100%;" autoplay="true" interval="3000" circular>
         <block wx:for="{{carousellist}}" wx:key="index">
           <swiper-item>
-            <image style="width: 100%; height: 100%;" src="{{item}}" mode="aspectFill" />
+            <image style="width: 100%; height: 100%;" src="{{item.url}}" mode="aspectFill" />
           </swiper-item>
         </block>
       </swiper>

+ 29 - 7
subpackages/zshome/zshome.js

@@ -1,4 +1,5 @@
 // subpackages/zshome/zshome.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -12,10 +13,13 @@ Page({
   },
 
   onShow() {
+    // 获取轮播图数据
+    this.getBanner();
+    // 获取图片
     const fileIDs = [
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
-      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_2.jpg',
+      // 'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_3.jpg',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_7.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_6.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_5.png',
@@ -29,16 +33,34 @@ Page({
       const tempFilePaths = results.map(r => r.tempFilePath);
       console.log('全部下载成功:', tempFilePaths);
       this.setData({
-        carousellist: tempFilePaths.slice(0, 2),
-        homepage_7: tempFilePaths[3],
-        homepage_6: tempFilePaths[4],
-        homepage_5: tempFilePaths[5],
+        // carousellist: tempFilePaths.slice(0, 2),
+        homepage_7: tempFilePaths[0],
+        homepage_6: tempFilePaths[1],
+        homepage_5: tempFilePaths[2],
       });
     }).catch(err => {
       console.error('有文件下载失败:', err);
     });
   },
 
+  // 轮播数据
+  async getBanner() {
+    const { data } = await models.banner.list({
+      filter: {
+        where: {
+          position: 4
+        }
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    this.setData({
+      carousellist: data.records
+    })
+  },
+
   // 页面跳转  三级页面
   goToGoodsList(e) {
     const type = e.currentTarget.dataset.type;

+ 1 - 1
subpackages/zshome/zshome.wxml

@@ -6,7 +6,7 @@
       <swiper style="width: 100%; height: 100%;" autoplay="true" interval="3000" circular>
         <block wx:for="{{carousellist}}" wx:key="index">
           <swiper-item>
-            <image style="width: 100%; height: 100%;" src="{{item}}" mode="aspectFill" />
+            <image style="width: 100%; height: 100%;" src="{{item.url}}" mode="aspectFill" />
           </swiper-item>
         </block>
       </swiper>

+ 117 - 26
subpackagestow/course/course.js

@@ -1,4 +1,5 @@
 // subpackages/course/course.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -6,39 +7,29 @@ Page({
    */
   data: {
     categoriesindex: 1,
-    categories: [
-      {
-        title: '阅读',
-        type: 1,
-      },{
-        title: '思维',
-        type: 2,
-      },{
-        title: '动手动脑',
-        type: 3,
-      }
-    ],
+    categories: [],
     viewType: 'grid',
     courseList: [
-      { id: 1, title: '趣味识字 – 动物世界', type: 'PDF', grade: '小班', subject: '语文', views: 128 },
-      { id: 2, title: '数字王国探险记', type: '视频', grade: '中班', subject: '数学', views: 128 },
-      { id: 3, title: '儿歌大全 – 春天在哪里', type: '音频', grade: '大班', subject: '音乐', views: 128 },
-      { id: 4, title: '创意绘画 – 我的小房子', type: 'PPT', grade: '中班', subject: '美术', views: 128 }
+      // { id: 1, title: '趣味识字 – 动物世界', type: 'PDF', grade: '小班', subject: '语文', views: 128 },
+      // { id: 2, title: '数字王国探险记', type: '视频', grade: '中班', subject: '数学', views: 128 },
+      // { id: 3, title: '儿歌大全 – 春天在哪里', type: '音频', grade: '大班', subject: '音乐', views: 128 },
+      // { id: 4, title: '创意绘画 – 我的小房子', type: 'PPT', grade: '中班', subject: '美术', views: 128 }
     ],
     sou: '',
     show_1: '',
     xiazi: '',
     goods_9: '',
+    categorieslist: {}
   },
 
   onLoad(options) {
-    const type = Number(options.type) || 1;
-    console.log('收到的 type 参数:', type);
-    // 根据 type 加载数据
-    this.setData({
-      categoriesindex: type
-    });
+    // 存储 options 到 this 中
+    this.options = options;
 
+    // 获取tab数据
+    this.getTabdata();
+
+    // 获取图片
     const fileIDs = [
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/sou.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/show_1.png',
@@ -65,8 +56,69 @@ Page({
 
   },
 
+  // tab数据 async
+  async getTabdata() {
+    const { data } = await models.tab.list({
+      filter: {
+        where: {
+          position: 0, // 显示位置
+          // layout_type: 0, // 布局类型
+        },
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    // console.log(data);
+    const sortedRecords = data.records.sort((a, b) => {
+      return a.sort - b.sort; // 升序排列
+    });
+    this.setData({
+      categories: sortedRecords
+    }, () => {
+      // 在 setData 回调中执行逻辑,确保 categories 已经更新
+      const type = Number(this.options.type) || 1;
+      this.data.categories.forEach((item, index) => {
+        if (item.sort === type) {
+          this.setData({
+            categorieslist: item,
+            categoriesindex: type
+          });
+          // 获取列表数据
+          this.getdatalist()
+        }
+      });
+    })
+  },
+
+  // 列表数据
+  async getdatalist() {
+    console.log(this.data.categorieslist, '123123');
+    const { data } = await models.file_manage.list({
+      filter: {
+        where: {
+          tag_id: this.data.categorieslist._id,
+
+        }
+      },
+      pageSize: 10, // 分页大小,建议指定,如需设置为其它值,需要和 pageNumber 配合使用,两者同时指定才会生效
+      pageNumber: 1, // 第几页
+      getCount: true, // 开启用来获取总数
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据列表 records 和 总数 total
+    console.log(data, '123123');
+    this.setData({
+      courseList: data.records
+    })
+  },
+
+  // async
   tabcategories(e) {
-    const type = e.currentTarget.dataset.type;
+    const types = e.currentTarget.dataset.type;
 
     // if (type === 2) {
     //   this.setData({ viewType: 'list' });
@@ -75,13 +127,52 @@ Page({
     // }
     
     this.setData({
-      categoriesindex: type
+      categoriesindex: types
+    }, () => {
+      // 在 setData 回调中执行逻辑,确保 categories 已经更新
+      const type = Number(types) || 1;
+      this.data.categories.forEach((item, index) => {
+        if (item.sort === type) {
+          this.setData({
+            categorieslist: item,
+            categoriesindex: type
+          });
+          // 获取列表数据
+          this.getdatalist()
+        }
+      });
     });
+
+    // const { data } = await models.file_manage.create({
+    //   data: {
+    //       level: 1,  // 级别
+    //       range: ['中班'],  // 适用范围
+    //       remark: "备注文本字段",  // 备注
+    //       type: 3,  // 文件类型  0-视频 1-音频 2-pdf 3-ppt 4-图文
+    //       url: ['cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/newfile.ppt'],  // 路径
+    //       download_count: 1,  // 下载人数
+    //       dan: 0,  // 段位
+    //       cover: "cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/未命名的设计.png",  // 封面
+    //       size: "123.12KB",  // 文件大小
+    //       name: "PPT-文件名33",  // 文件名
+    //       tag_id: "BT6QJSE5RS",  // 标签id
+    //       describe: "描述文本字段",  // 描述
+    //     },
+    //   // envType: pre 体验环境, prod 正式环境
+    //   envType: "prod",
+    // });
+    
+    // // 返回创建的数据 id
+    // console.log(data, '234234');
   },
 
-  goToGoodsList() {
+  goToGoodsList(event) {
+    // 获取绑定的数据
+    const item = event.currentTarget.dataset.item;
+    // 将数据转换为 JSON 字符串并传递
+    const itemStr = encodeURIComponent(JSON.stringify(item));
     wx.navigateTo({
-      url: '/subpackagestow/details/details'
+      url: `/subpackagestow/details/details?item=${itemStr}`
     });
   }
 })

+ 7 - 7
subpackagestow/course/course.wxml

@@ -12,26 +12,26 @@
     <!-- 分类 -->
     <view class="category-tabs">
       <view wx:for="{{categories}}" wx:key="index">
-        <view class="category-tab {{item.type === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.type}}">{{item.title}}</view>
+        <view class="category-tab {{item.sort === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.sort}}">{{item.name}}</view>
       </view>
     </view>
 
     <!-- 列表 -->
     <view class="course-list">
       <block wx:for="{{courseList}}" wx:key="id">
-        <view class="card"  bindtap="goToGoodsList">
+        <view class="card"  bindtap="goToGoodsList" data-item="{{item}}">
           <view class="cardimg">
-            <image style="width: 100%; height: 100%;" src="{{goods_9}}" />
-            <view class="label {{item.type}} labelwg" >{{item.type}}</view>
+            <image style="width: 100%; height: 100%;" src="{{item.cover}}" />
+            <view class="label {{item.type === 0 ? 'shipin' : item.type === 1 ? 'yinpin' : item.type === 2 ? 'PDF' : item.type === 3 ? 'PPT' : '图文'}} labelwg" >{{item.type === 0 ? '视频' : item.type === 1 ? '音频' : item.type === 2 ? 'PDF' : item.type === 3 ? 'PPT' : '图文'}}</view>
           </view>
           <view class="item-content">
-            <view class="item-title">{{item.title}}</view>
+            <view class="item-title">{{item.name}}</view>
             <view style="display: flex; justify-content: space-between;">
               <view class="item-subtitle">
-                {{item.grade}}
+                {{item.range}}
               </view>
               <view class="item-download-count">
-               已有{{item.views}}人下载
+               已有{{item.download_count}}人下载
               </view>
             </view>
             <view class="item-buttons">

+ 1 - 0
subpackagestow/course/course.wxss

@@ -55,6 +55,7 @@
 }
 
 .course-list{
+  width: 100%;
   margin-top: 20rpx;
   display: flex;
   flex-wrap: wrap;

+ 48 - 12
subpackagestow/details/details.js

@@ -1,4 +1,5 @@
 // subpackagestow/details/details.js
+import { models, db, _ } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -6,28 +7,34 @@ Page({
    */
   data: {
     fileType: 'video',
-    fileUrl: '../../image/mimi.mp4',
     viewType: 'grid',
-    courseList: [
-      { id: 1, title: '趣味识字 – 动物世界', type: 'PDF', grade: '小班', subject: '语文', views: 128 },
-      { id: 2, title: '数字王国探险记', type: '视频', grade: '中班', subject: '数学', views: 128 },
-      { id: 3, title: '儿歌大全 – 春天在哪里', type: '音频', grade: '大班', subject: '音乐', views: 128 },
-      { id: 4, title: '创意绘画 – 我的小房子', type: 'PPT', grade: '中班', subject: '美术', views: 128 }
-    ],
+    courseList: [],
     shouchang: '',
     show_1: '',
     xiazi: '',
     xia: '',
+    itemlist: {}
   },
 
   onLoad(options) {
+    // 获取传递过来的数据
+    const itemStr = decodeURIComponent(options.item);
+    const item = JSON.parse(itemStr);
+    // 设置到页面数据中
+    this.setData({
+      itemlist: item
+    }, () => {
+      // 相关推荐
+      this.getcourseList()
+    });
+    
+    // 获取图片
     const fileIDs = [
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/shouchang.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/show_1.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/xiazi.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/xia_1.png'
     ];
-    
     // 并发下载多个 fileID
     Promise.all(
       fileIDs.map(fileID => wx.cloud.downloadFile({ fileID }))
@@ -46,15 +53,44 @@ Page({
     });
   },
 
-  goToGoodsLists() {
+  // 相关课件推荐
+  async getcourseList() {
+    console.log(this.data.itemlist.range, 'this.data.itemlist.range');
+    const { data } = await models.file_manage.list({
+      filter: {
+        where: {
+          range: db.command.in(['小班', '中班']),
+          tag_id: this.data.itemlist.tag_id
+        }
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据列表 records 和 总数 total
+    console.log(data);
+    this.setData({
+      courseList: data.records
+    })
+  },
+
+  goToGoodsLists(event) {
+    // 获取绑定的数据
+    const item = event.currentTarget.dataset.item;
+    // 将数据转换为 JSON 字符串并传递
+    const itemStr = encodeURIComponent(JSON.stringify(item));
     wx.navigateTo({
-      url: '/subpackagestow/down/down'
+      url: `/subpackagestow/down/down?item=${itemStr}`
     });
   },
 
-  goToGoodsList() {
+  goToGoodsList(event) {
+    // 获取绑定的数据
+    const item = event.currentTarget.dataset.item;
+    // 将数据转换为 JSON 字符串并传递
+    const itemStr = encodeURIComponent(JSON.stringify(item));
     wx.navigateTo({
-      url: '/subpackages/goodslist/goodslist'
+      url: `/subpackagestow/details/details?item=${itemStr}`
     });
   }
 })

+ 41 - 30
subpackagestow/details/details.wxml

@@ -1,51 +1,62 @@
 <view style="background: #f5f5f5; padding: 20rpx 0;">
   <view class="container">
     <view class="header">
-      <text>认识数字1-10</text>
-      <text>张雨晴老师 • 2023-11-15</text>
-      <text>视频 适用于小班、中班</text>
+      <text>{{ itemlist.name }}</text>
+      <text>{{itemlist.publisher}} • {{ itemlist.createdAt }}</text>
+      <text>{{itemlist.type === 0 ? '视频' : itemlist.type === 1 ? '音频' : itemlist.type === 2 ? 'PDF' : itemlist.type === 3 ? 'PPT' : '图文'}} 适用于 {{ itemlist.range }}</text>
     </view>
     <!-- 预览 -->
-    <!-- <view class="file-preview showboxs"> -->
-      <block wx:if="{{fileType === 'video'}}">
-        <video src="{{fileUrl}}" controls></video>
-        <!-- <text class="play-button">点击下方按钮预览课件</text> -->
-      </block>
-      <block wx:elif="{{fileType === 'audio'}}">
-        <audio style="width: 100%; height: 100%;" src="{{fileUrl}}" controls></audio>
-      </block>
-      <block wx:elif="{{fileType === 'pdf'}}">
-        <iframe style="width: 100%; height: 100%;" src="{{fileUrl}}"></iframe>
-      </block>
-      <block wx:elif="{{fileType === 'ppt'}}">
-        <iframe style="width: 100%; height: 100%;" src="https://www.mgtv.com/s/6832117.html"></iframe>
-      </block>
-      <block wx:else>
-        <image style="width: 100%; height: 100%;" src="{{fileUrl}}" alt="" class="file-placeholder"/>
-      </block>
-    <!-- </view> -->
+    <view class="file-preview">
+      <view class="file-preview" wx:if="{{itemlist.type === 0}}">
+        <video class="course-videos" src="{{itemlist.url}}" controls></video>
+      </view>
+      <view class="file-previews" wx:elif="{{itemlist.type === 1}}">
+        <audio
+          class="course-videos"
+          src="{{itemlist.url}}"
+          controls
+          autoplay
+          loop
+          poster="{{itemlist.cover}}"
+          name="{{itemlist.name}}"
+          author="作者"
+        />
+      </view>
+      <view class="file-preview" wx:elif="{{itemlist.type === 2}}">
+        <image style="width: 100%; height: 100%;" src="{{itemlist.cover}}" alt="" class="file-placeholder"/>
+        <!-- <web-view src="{{itemlist.url}}"/> -->
+        <view class="play-button">点击下方按钮预览课件</view>
+      </view>
+      <view class="file-preview" wx:elif="{{itemlist.type === 3}}">
+        <image style="width: 100%; height: 100%;" src="{{itemlist.cover}}" alt="" class="file-placeholder"/>
+        <view class="play-button">点击下方按钮预览课件</view>
+      </view>
+      <view class="file-preview" wx:else>
+        <image style="width: 100%; height: 100%;" src="{{itemlist.cover}}" alt="" class="file-placeholder"/>
+      </view>
+    </view>
     <view class="buttons">
-      <button class="preview-btn yulan"><image class="download-iconss" src="{{show_1}}" />在线预览</button>
-      <button class="preview-btn shoucang"><image class="download-iconss" src="{{shouchang}}" />收藏</button>
-      <button bindtap="goToGoodsLists" class="download-btn xiazai"><image class="download-iconss" src="{{xia}}" />下载</button>
+      <button class="preview-btns yulan"><image class="download-iconss" src="{{show_1}}" />在线预览</button>
+      <button class="preview-btns shoucang"><image class="download-iconss" src="{{shouchang}}" />收藏</button>
+      <button bindtap="goToGoodsLists" data-item="{{itemlist}}" class="download-btn xiazai"><image class="download-iconss" src="{{xia}}" />下载</button>
     </view>
     <view class="related-courses">相关课件推荐</view>
     <!-- 列表 -->
     <view class="course-list">
       <block wx:for="{{courseList}}" wx:key="id">
-        <view class="card"  bindtap="goToGoodsList">
+        <view class="card"  bindtap="goToGoodsList" data-item="{{item}}">
           <view class="cardimg">
-            <image style="width: 100%; height: 100%;" src="{{goods_9}}" />
-            <view class="label {{item.type}} labelwg" >{{item.type}}</view>
+            <image style="width: 100%; height: 100%;" src="{{item.cover}}" />
+            <view class="label {{item.type === 0 ? 'shipin' : item.type === 1 ? 'yinpin' : item.type === 2 ? 'PDF' : item.type === 3 ? 'PPT' : '图文'}} labelwg" >{{item.type === 0 ? '视频' : item.type === 1 ? '音频' : item.type === 2 ? 'PDF' : item.type === 3 ? 'PPT' : '图文'}}</view>
           </view>
           <view class="item-content">
-            <view class="item-title">{{item.title}}</view>
+            <view class="item-title">{{item.name}}</view>
             <view style="display: flex; justify-content: space-between;">
               <view class="item-subtitle">
-                {{item.grade}}
+                {{item.describe}}
               </view>
               <view class="item-download-count">
-               已有{{item.views}}人下载
+               已有{{item.download_count}}人下载
               </view>
             </view>
             <view class="item-buttons">

+ 25 - 31
subpackagestow/details/details.wxss

@@ -12,32 +12,40 @@
   margin-bottom: 20rpx;
 }
 
-/* .file-preview {
+.file-preview {
   width: 100%;
+  height: 400rpx;
   margin-bottom: 20rpx;
-  border-radius: 16rpx;
-  overflow: hidden;
+  position: relative;
+}
+
+.file-previews {
+  width: 100%;
+  margin-bottom: 20rpx;
+  position: relative;
 }
 
-.showboxs {
-  height: 500rpx;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-} */
-/* 
 .play-button {
+  width: 100%;
+  text-align: center;
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
-  font-size: 30rpx;
-  color: #fff;
-} */
+  font-size: 38rpx;
+  font-weight: bold;
+  color: #333333;
+}
+
+.course-videos {
+  width: 100%;
+  height: 100%;
+  text-align: center;
+}
 
-video, audio, iframe {
+video, audio {
   width: 100%;
-  height: 300rpx !important;
+  height: 100%;
   object-fit: cover;
   margin-bottom: 20rpx;
 }
@@ -61,15 +69,6 @@ video, audio, iframe {
   object-fit: cover;
 }
 
-.play-button {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  font-size: 30rpx;
-  color: #fff;
-}
-
 .buttons {
   width: 100%;
   display: flex;
@@ -77,7 +76,7 @@ video, audio, iframe {
   margin-bottom: 20rpx;
 }
 
-.preview-btn, .download-btn {
+.preview-btns, .download-btn {
   /* background-color: #409eff; */
   /* color: white; */
   border: none;
@@ -120,6 +119,7 @@ video, audio, iframe {
 }
 
 .course-list{
+  width: 100%;
   margin-top: 20rpx;
   display: flex;
   flex-wrap: wrap;
@@ -274,12 +274,6 @@ video, audio, iframe {
   overflow: hidden;
 }
 
-.course-videos {
-  width: 100%;
-  height: 385rpx;
-  object-fit: cover;
-}
-
 .course-infos {
   padding: 20rpx;
 }

+ 10 - 1
subpackagestow/down/down.js

@@ -6,9 +6,18 @@ Page({
    */
   data: {
     fuzhi: '',
+    itemlist: {},
   },
 
-  onLoad() {
+  onLoad(options) {
+
+    // 获取传递过来的数据
+    const itemStr = decodeURIComponent(options.item);
+    const item = JSON.parse(itemStr);
+    // 设置到页面数据中
+    this.setData({
+      itemlist: item
+    });
 
     const fileIDs = [
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/fuzhi.png',

+ 2 - 2
subpackagestow/down/down.wxml

@@ -1,8 +1,8 @@
 <view style="background: #f5f5f5; padding: 20rpx 0;">
   <view class="container">
     <view class="top_boxs">
-     <view class="title">认识数字1 —— 10</view>
-     <view>文件大小:9.9M</view>
+     <view class="title">{{itemlist.name}}</view>
+     <view>文件大小:{{itemlist.size}}</view>
      <view class="item_boxs">连接有效期剩余:00:05:00</view>
     </view>
     <view style="width: 100%;">

+ 59 - 19
subpackagestow/show/show.js

@@ -1,4 +1,5 @@
 // subpackages/show/show.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -6,35 +7,20 @@ Page({
    */
   data: {
     categoriesindex: 1,
-    categories: [
-      {
-        title: '展示活动',
-        type: 1,
-      },{
-        title: '竞赛活动',
-        type: 2,
-      }
-      ,{
-        title: '汇报活动',
-        type: 3,
-      },{
-        title: '家园共育',
-        type: 4,
-      }
-    ],
+    categories: [],
     courses: [
       {
-        videoUrl: '"https://www.bilibili.com/video/BV17iCgY3EUY?t=3.6"',
+        videoUrl: 'image/123123.mp4',
         title: '活动名称',
         description: '课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍'
       },
       {
-        videoUrl: '"https://www.bilibili.com/video/BV17iCgY3EUY?t=3.6"',
+        videoUrl: '"image/123123.mp4"',
         title: '活动名称',
         description: '课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍'
       },
       {
-        videoUrl: '"https://www.bilibili.com/video/BV17iCgY3EUY?t=3.6"',
+        videoUrl: '"image/123123.mp4"',
         title: '活动名称',
         description: '课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍'
       }
@@ -42,9 +28,16 @@ Page({
     sou: '',
     show_1: '',
     xiazi: '',
+    url: '',
+    pdfurl: '',
+    ppturl: '',
+    audioUrl: '',
+    carousel: ''
   },
 
   onLoad(options) {
+    // 获取tab数据
+    this.getTabdata();
     const type = Number(options.type) || 1;
     console.log('收到的 type 参数:', type);
     // 根据 type 加载数据
@@ -56,6 +49,11 @@ Page({
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/sou.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/show_1.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/xiazi.png',
+      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/123123.mp4',
+      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/硬盘发票.pdf',
+      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/newfile.ppt',
+      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/许嵩 - 有何不可.mp3',
+      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/banner/carousel_1.jpg'
     ];
     
     // 并发下载多个 fileID
@@ -69,17 +67,59 @@ Page({
         sou: tempFilePaths[0],
         show_1: tempFilePaths[1],
         xiazi: tempFilePaths[2],
+        url: tempFilePaths[3],
+        pdfurl: tempFilePaths[4],
+        ppturl: tempFilePaths[5],
+        audioUrl: tempFilePaths[6],
+        carousel: tempFilePaths[7]
       });
     }).catch(err => {
       console.error('有文件下载失败:', err);
     });
   },
 
+  // tab数据
+  async getTabdata() {
+    const { data } = await models.tab.list({
+      filter: {
+        where: {
+          position: 3, // 显示位置
+          // layout_type: 0, // 布局类型
+        },
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    console.log(data);
+
+    const sortedRecords = data.records.sort((a, b) => {
+      return a.sort - b.sort; // 升序排列
+    });
+    this.setData({
+      categories: sortedRecords
+    })
+  },
+
   tabcategories(e) {
     const type = e.currentTarget.dataset.type;
 
     this.setData({
       categoriesindex: type
     });
+  },
+
+  previewPDF() {
+    wx.openDocument({
+      filePath: this.data.ppturl,
+      fileType: 'ppt',
+      success(res) {
+        console.log('打开 PDF 成功');
+      },
+      fail(err) {
+        console.error('打开 PDF 失败', err);
+      }
+    });
   }
 })

+ 15 - 3
subpackagestow/show/show.wxml

@@ -11,7 +11,7 @@
     <!-- 分类 -->
     <view class="category-tabs">
       <view wx:for="{{categories}}" wx:key="index">
-        <view class="category-tab {{item.type === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.type}}">{{item.title}}</view>
+        <view class="category-tab {{item.sort === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.sort}}">{{item.name}}</view>
       </view>
     </view>
 
@@ -20,8 +20,20 @@
       <block wx:for="{{courses}}" wx:key="index">
         <view class="course-items">
           <!-- 视频播放器 -->
-          <video class="course-videos" src="{{item.videoUrl}}" controls></video>
-          
+          <!-- <video class="course-videos" src="{{item.videoUrl}}" controls></video> -->
+          <!-- <video class="course-videos" src="{{url}}" controls></video> -->
+          <web-view src="{{pdfurl}}"/>
+          <button bindtap="previewPDF">预览 PDF 文件</button>
+          <!-- <audio
+            src="{{audioUrl}}"
+            controls
+            autoplay
+            loop
+            poster="{{carousel}}"
+            name="语音标题"
+            author="作者"
+          /> -->
+
           <!-- 课程名称和介绍 -->
           <view class="course-infos">
             <view class="course-titles">{{item.title}}</view>

+ 28 - 16
subpackagestow/teaching/teaching.js

@@ -1,4 +1,5 @@
 // subpackages/teaching/teaching.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -6,22 +7,7 @@ Page({
    */
   data: {
     categoriesindex: 1,
-    categories: [
-      {
-        title: '课件',
-        type: 1,
-      },{
-        title: '教学计划',
-        type: 2,
-      }
-      ,{
-        title: '目标说明',
-        type: 3,
-      },{
-        title: '棋类游戏',
-        type: 4,
-      }
-    ],
+    categories: [],
     viewType: 'grid',
     courseList: [
       { id: 1, title: '趣味识字 – 动物世界', type: 'PDF', grade: '小班', subject: '语文', views: 128 },
@@ -35,6 +21,8 @@ Page({
   },
 
   onLoad(options) {
+    // 获取tab数据
+    this.getTabdata();
     const type = Number(options.type) || 1;
     console.log('收到的 type 参数:', type);
     if (type === 2 || type === 3) {
@@ -70,6 +58,30 @@ Page({
     });
   },
 
+  // tab数据
+  async getTabdata() {
+    const { data } = await models.tab.list({
+      filter: {
+        where: {
+          position: 2, // 显示位置
+          // layout_type: 0, // 布局类型
+        },
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    console.log(data);
+
+    const sortedRecords = data.records.sort((a, b) => {
+      return a.sort - b.sort; // 升序排列
+    });
+    this.setData({
+      categories: sortedRecords
+    })
+  },
+
   tabcategories(e) {
     const type = e.currentTarget.dataset.type;
 

+ 1 - 1
subpackagestow/teaching/teaching.wxml

@@ -12,7 +12,7 @@
     <!-- 分类 -->
     <view class="category-tabs">
       <view wx:for="{{categories}}" wx:key="index">
-        <view class="category-tab {{item.type === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.type}}">{{item.title}}</view>
+        <view class="category-tab {{item.sort === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.sort}}">{{item.name}}</view>
       </view>
     </view>
 

+ 28 - 15
subpackagestow/training/training.js

@@ -1,4 +1,5 @@
 // subpackages/training/training.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -6,21 +7,7 @@ Page({
    */
   data: {
     categoriesindex: 1,
-    categories: [
-      {
-        title: '课程培训',
-        type: 1,
-      },{
-        title: '示范视频',
-        type: 2,
-      },{
-        title: '示范课',
-        type: 3,
-      },{
-        title: '用课建议',
-        type: 4,
-      }
-    ],
+    categories: [],
     viewType: 'list',
     courseList: [
       { id: 1, title: '趣味识字 – 动物世界', type: 'PDF', grade: '小班', subject: '语文', views: 128 },
@@ -34,6 +21,8 @@ Page({
   },
 
   onLoad(options) {
+    // 获取tab数据
+    this.getTabdata();
     const type = Number(options.type) || 1;
     console.log('收到的 type 参数:', type);
     if (type === 4) {
@@ -69,6 +58,30 @@ Page({
     });
   },
 
+  // tab数据
+  async getTabdata() {
+    const { data } = await models.tab.list({
+      filter: {
+        where: {
+          position: 1, // 显示位置
+          // layout_type: 0, // 布局类型
+        },
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    console.log(data);
+
+    const sortedRecords = data.records.sort((a, b) => {
+      return a.sort - b.sort; // 升序排列
+    });
+    this.setData({
+      categories: sortedRecords
+    })
+  },
+
   tabcategories(e) {
     const type = e.currentTarget.dataset.type;
 

+ 1 - 1
subpackagestow/training/training.wxml

@@ -12,7 +12,7 @@
     <!-- 分类 -->
     <view class="category-tabs">
       <view wx:for="{{categories}}" wx:key="index">
-        <view class="category-tab {{item.type === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.type}}">{{item.title}}</view>
+        <view class="category-tab {{item.sort === categoriesindex ? 'active' : ''}}" bindtap="tabcategories" data-type="{{item.sort}}">{{item.name}}</view>
       </view>
     </view>
 

+ 2 - 1
utils/cloudbase.js

@@ -9,5 +9,6 @@ wx.cloud.init({
 const client = init(wx.cloud)
 const db = client.database()
 const models = client.models
+const _ = db.command // ✅ 添加这行,导出查询操作符
 
-export { db, models }
+export { db, models, _ }