LiuShu_0203 vor 1 Woche
Ursprung
Commit
1224430be8

+ 2 - 2
app.js

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

+ 4 - 2
app.json

@@ -2,14 +2,16 @@
   "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"
   ],
   "window": {
     "navigationBarTextStyle": "black",

+ 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',
@@ -53,6 +37,8 @@ Page({
     gouwucimg: '',
   },
   onLoad(options) {
+    // 获取tab数据
+    this.getTabdata();
     // const title = options.title ? decodeURIComponent(options.title) : '商品列表';
     // this.setData({ title });
     // wx.setNavigationBarTitle({ title });
@@ -77,6 +63,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">

+ 117 - 14
pages/index/index.js

@@ -13,14 +13,17 @@ Page({
 
   onShow() {
     // 检查登录状态
-    // app.checkLoginStatus();
+    app.checkLoginStatus();
   },
 
   onLoad() {
+    // 获取轮播图数据
+    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_8.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/homepage/homepage_9.png',
       'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/sou.png',
@@ -34,16 +37,34 @@ Page({
       const tempFilePaths = results.map(r => r.tempFilePath);
       console.log('全部下载成功:', tempFilePaths);
       this.setData({
-        carousellist: tempFilePaths.slice(0, 2),
-        homepage_8: tempFilePaths[3],
-        homepage_9: tempFilePaths[4],
-        souimg: tempFilePaths[5]
+        // carousellist: tempFilePaths.slice(0, 2),
+        homepage_8: tempFilePaths[0],
+        homepage_9: tempFilePaths[1],
+        souimg: tempFilePaths[2]
       });
     }).catch(err => {
       console.error('有文件下载失败:', err);
     });
   },
 
+  // 轮播数据
+  async getBanner() {
+    const { data } = await models.banner.list({
+      filter: {
+        where: {
+          position: 0
+        }
+      },
+      // envType: pre 体验环境, prod 正式环境
+      envType: "prod",
+    });
+    
+    // 返回查询到的数据
+    this.setData({
+      carousellist: data.records
+    })
+  },
+
   // 页面跳转  二级页面
   selectGroupOption(e) {
     const option = e.currentTarget.dataset.option;
@@ -71,8 +92,80 @@ Page({
     });
   },
 
+  // 上传轮播图  存储轮播图图片地址 和展示位置  后续需要存一个上传的图片名字
+  // async getData() {
+  //   try {
+  //     // 上传文件到云存储
+  //     const uploadRes = await wx.cloud.uploadFile({
+  //       cloudPath: "imgs/banner/carousel_3.jpg", // 上传至云端的路径
+  //       filePath: "image/imgs/carousel_3.jpg" // 小程序临时文件路径
+  //     });
+  
+  //     // 获取上传文件的 fileID
+  //     const fileID = uploadRes.fileID;
+  //     console.log("文件 ID:", fileID);
+  
+  //     // 将文件路径存入 banner 表
+  //     const { data } = await models.banner.create({
+  //       data: {
+  //         remark: "", // 备注
+  //         position: 4, // 展示位置
+  //         describe: "", // 描述
+  //         url: fileID, // 路径
+  //       },
+  //       envType: "prod", // 正式环境
+  //     });
+  
+  //     // 返回创建的数据 id
+  //     console.log("创建的数据:", data);
+  //   } catch (error) {
+  //     console.error("操作失败:", error);
+  //     wx.showToast({
+  //       title: '操作失败,请稍后再试',
+  //       icon: 'none',
+  //     });
+  //   }
+  // }
+
   // async 
-  getData() {
+  // async getData() {
+
+    // wx.cloud
+    // .uploadFile({
+    //   cloudPath: "imgs/banner/carousel_1.jpg", // 上传至云端的路径
+    //   filePath: "image/imgs/carousel_1.jpg" // 小程序临时文件路径,需结合小程序相关 API 获取
+    // })
+    // .then((res) => {
+    //   // 返回文件 ID
+    //   const fileID = res.fileID;
+    //   console.log("文件 ID:", fileID);
+
+    //    // 下载文件
+    //   wx.cloud.downloadFile({
+    //     fileID: fileID,
+    //   })
+    //   .then((res) => {
+    //     const tempFilePath = res.tempFilePath;
+    //     console.log("临时文件路径:", tempFilePath);
+
+    //     // 获取文件大小
+    //     wx.getFileInfo({
+    //       filePath: tempFilePath,
+    //     })
+    //     .then((info) => {
+    //       console.log("文件大小:", info.size, "字节");
+    //       const fileSizeInBytes = info.size; // 文件大小(字节)
+    //       const fileSizeInMB = fileSizeInBytes / (1024 * 1024); // 转换为 MB
+    //       console.log("文件大小:", fileSizeInMB.toFixed(2), "MB");
+    //     })
+    //     .catch((err) => {
+    //       console.error("获取文件大小失败:", err);
+    //     });
+    //   })
+    //   .catch((err) => {
+    //     console.error("文件下载失败:", err);
+    //   });
+    // });
     // const { data } = await models.login.list({
     //   filter: {
     //     where: {}
@@ -86,21 +179,31 @@ Page({
     
     // // 返回查询到的数据列表 records 和 总数 total
     // console.log(data);
-    // const { data } = await models.login.create({
-    //   data: {
-    //       name: "王五",  // 名字
-    //     },
+    
+    // const { data } = await models.file_manage.get({
+    //   filter: {
+    //     where: {
+    //       $and: [
+    //         {
+    //           _id: {
+    //             $eq: 'BT7HKJ5Z2Y', // 推荐传入_id数据标识进行操作
+    //           },
+    //         },
+    //       ]
+    //     }
+    //   },
     //   // envType: pre 体验环境, prod 正式环境
     //   envType: "prod",
     // });
     
     // // 返回创建的数据 id
     // console.log(data);
+    // { id: "7d8ff72c665eb6c30243b6313aa8539e"}
 
     // db.collection("homelist").get().then(res => {
     //   console.log(res);
     // }).catch(err => {
     //   console.log(err);
     // })
-  },
+  // },
 })

+ 3 - 1
pages/index/index.wxml

@@ -1,5 +1,6 @@
 <view style="background: #f5f5f5; padding: 20rpx 0;">
   <view class="container">
+  <!-- <button bindtap="getData">点击</button> -->
     <!-- 搜索 -->
     <view class="search-bar">
       <input class="search-input" placeholder="搜索课件" />
@@ -11,7 +12,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>
@@ -54,5 +55,6 @@
         </view>
       </view> -->
     </view>
+    <!-- <button bindtap="getData">提交图片</button> -->
   </view>
 </view>

+ 149 - 41
pages/login/login.js

@@ -1,4 +1,4 @@
-// pages/login/login.js
+import { models, db } from '../../utils/cloudbase.js'
 Page({
 
   /**
@@ -7,61 +7,169 @@ Page({
   data: {
     levelOptions: ['小班', '中班', '大班'],
     selectedLevelIndex: 0,
+    xiala: '',
+    phone: '',
+    gardenList: [], // 这里替换为实际园所名称数组
+    gardenIndex: null,
+    contactsname: '',
+    selected: {},
+    code: ''   // 用户输入的验证码
   },
 
-  /**
-   * 生命周期函数--监听页面加载
-   */
-  onLoad(options) {
-
+  // 监听手机号输入框
+  onPhoneInput(e) {
+    this.setData({
+      phone: e.detail.value
+    });
   },
 
-  /**
-   * 生命周期函数--监听页面初次渲染完成
-   */
-  onReady() {
-
+  // 监听姓名输入框
+  onContactsInput(e) {
+    this.setData({
+      contactsname: e.detail.value
+    });
   },
 
-  /**
-   * 生命周期函数--监听页面显示
-   */
-  onShow() {
-
+  // 监听验证码输入
+  onInputCode(e) {
+    this.setData({
+      code: e.detail.value
+    });
   },
 
-  /**
-   * 生命周期函数--监听页面隐藏
-   */
-  onHide() {
-
+  onLoad(options) {
+    this.onScholl();
+    const fileIDs = [
+      'cloud://cloud1-6g98iw7i28b01747.636c-cloud1-6g98iw7i28b01747-1367995226/images/icon/xiala.png',
+    ]
+
+    // 并发下载多个 fileID
+    Promise.all(
+      fileIDs.map(fileID => wx.cloud.downloadFile({ fileID }))
+    ).then(results => {
+      // 每个 result 对应一个下载结果
+      const tempFilePaths = results.map(r => r.tempFilePath);
+      console.log('全部下载成功:', tempFilePaths);
+      this.setData({
+        xiala: tempFilePaths[0],
+      });
+    }).catch(err => {
+      console.error('有文件下载失败:', err);
+    });
   },
 
-  /**
-   * 生命周期函数--监听页面卸载
-   */
-  onUnload() {
-
+  // 获取学校数据
+  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'
+      });
+    }
   },
-
-  /**
-   * 页面相关事件处理函数--监听用户下拉动作
-   */
-  onPullDownRefresh() {
-
+  
+  // 选择学校下拉框
+  async onGardenChange(e) {
+    const index = parseInt(e.detail.value);
+    this.setData({
+      gardenIndex: index
+    });
+    const selected = this.data.gardenList[index];
+    this.setData({
+      selected: selected
+    })
   },
 
-  /**
-   * 页面上拉触底事件的处理函数
-   */
-  onReachBottom() {
-
+  // 获取验证码
+  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');
   },
 
-  /**
-   * 用户点击右上角分享
-   */
-  onShareAppMessage() {
+  generateCode() {
+    return Math.floor(100000 + Math.random() * 900000).toString();
+  },
 
+  // 注册
+  async bindingevents() {
+    try {
+      const { data } = await models.wx_user.create({
+        data: {
+          img: "",  // 头像
+          gender: 1,  // 性别
+          teacher_id: "",  // 老师id
+          user_name: this.data.contactsname,  // 用户名
+          remark: "",  // 备注
+          delete: 0,  // 逻辑删除
+          school_id: this.data.selected._id,  // 学校id
+          phone: this.data.phone,  // 手机号
+          grade: this.data.selectedLevelIndex,  // 班级
+          log_off: "",  // 注销原因
+          name: this.data.contactsname,  // 姓名
+        },
+        envType: "prod",
+      });
+  
+      // 注册成功提示
+      wx.showToast({
+        title: '注册成功,去登录',
+        icon: 'success',
+        duration: 1500, // 提示显示 1.5 秒
+      });
+  
+      // 提示消失后跳转到登录页面
+      setTimeout(() => {
+        wx.reLaunch({
+          url: '/pages/logins/logins', // 替换为你的登录页面路径
+        });
+      }, 1500);
+  
+    } catch (error) {
+      console.error('注册失败:', error);
+      wx.showToast({
+        title: '注册失败,请稍后再试',
+        icon: 'none',
+      });
+    }
   }
+
 })

+ 16 - 7
pages/login/login.wxml

@@ -2,31 +2,40 @@
   <view class="goodslist_boxs">
     <view class="input-group">
       <label>园所</label>
-      <input type="text" placeholder="请输入园所名称" />
+      <picker mode="selector"
+      class="picker"
+      range="{{gardenList}}"
+      range-key="name"
+      value="{{gardenIndex}}"
+      bindchange="onGardenChange">
+        <view>
+          {{gardenIndex !== null ? gardenList[gardenIndex].name : '请选择园所'}}
+        </view>
+      </picker>
     </view>
     <view class="input-group">
       <view style="display: flex;">
         <view style="width: 40%;">
           <picker mode="selector" range="{{levelOptions}}" value="{{selectedLevelIndex}}" bindchange="handleLevelChange">
-            <view class="dropdown-item">{{levelOptions[selectedLevelIndex]}} <image class="xiala_boxs" src="../../image/imgs/xiala.png" /></view>
+            <view class="dropdown-item">{{levelOptions[selectedLevelIndex]}} <image class="xiala_boxs" src="{{xiala}}" /></view>
           </picker>
         </view>
-        <input style="width: 60%;margin-left: 3%;" type="text" placeholder="请输入姓名" />
+        <input bindinput="onContactsInput" style="width: 60%;margin-left: 3%;" 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">
       <label>验证码</label>
       <view style="display: flex;">
-        <input style="width: 95%;margin-right: 3%;" type="text" placeholder="请输入验证码" />
-        <button class="get-code-btn">获取验证码</button>
+        <input bindinput="onInputCode" style="width: 95%;margin-right: 3%;" type="text" placeholder="请输入验证码" />
+        <button bindtap="getCode" class="get-code-btn">获取验证码</button>
       </view>
     </view>
-    <button class="confirm-btn">确定</button>
+    <button bindtap="bindingevents" class="confirm-btn">确定</button>
   </view>
 </view>

+ 8 - 0
pages/login/login.wxss

@@ -70,4 +70,12 @@
   height: 45rpx;
   margin: 0;
   padding: 0rpx;
+}
+
+.picker {
+  width: calc( 100% - 40rpx);
+  padding: 20rpx;
+  border: 1rpx solid #dcdfe6;
+  border-radius: 12rpx;
+  background: #fff;
 }

+ 89 - 0
pages/logins/logins.js

@@ -0,0 +1,89 @@
+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_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; // 取第一条用户数据
+    // 登录成功,存储用户信息
+    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;
+}