commit cfb1f866b58385010c320c77b2b4ae18fb2599ab
Author: Basyc <1120815294@qq.com>
Date:   Sat Dec 7 10:20:50 2024 +0800

    Initial Commit

diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..115cc02
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,31 @@
+/*
+ * Eslint config file
+ * Documentation: https://eslint.org/docs/user-guide/configuring/
+ * Install the Eslint extension before using this feature.
+ */
+module.exports = {
+  env: {
+    es6: true,
+    browser: true,
+    node: true,
+  },
+  ecmaFeatures: {
+    modules: true,
+  },
+  parserOptions: {
+    ecmaVersion: 2018,
+    sourceType: 'module',
+  },
+  globals: {
+    wx: true,
+    App: true,
+    Page: true,
+    getCurrentPages: true,
+    getApp: true,
+    Component: true,
+    requirePlugin: true,
+    requireMiniProgram: true,
+  },
+  // extends: 'eslint:recommended',
+  rules: {},
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..14ea590
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+# Windows
+[Dd]esktop.ini
+Thumbs.db
+$RECYCLE.BIN/
+
+# macOS
+.DS_Store
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+
+# Node.js
+node_modules/
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..1efbf53
--- /dev/null
+++ b/app.js
@@ -0,0 +1,35 @@
+// app.js
+App({
+  onLaunch() {
+
+    // 登录
+    wx.login({
+      success: res => {
+        // 发送 res.code 到后台换取 openId, sessionKey, unionId
+      }
+    })
+  },
+
+  routeSafer(hasUserInfo){
+    hasUserInfo=this.globalData.hasUserInfo
+    if (hasUserInfo != true) {
+        wx.showToast({
+          title: '请先登录!',
+          icon:'error',
+          duration:1000,
+          success(){
+              setTimeout(() => {
+                wx.redirectTo({
+                    url: '/pages/index/index',
+                })
+              }, 1000);
+          }
+        })
+    }
+  },
+  
+  globalData: {
+    userInfo:{},
+    hasUserInfo:false
+  }
+})
diff --git a/app.json b/app.json
new file mode 100644
index 0000000..4dd1f5b
--- /dev/null
+++ b/app.json
@@ -0,0 +1,49 @@
+{
+  "pages": [
+    "pages/index/index",
+    "pages/intro/intro",
+    "pages/shop/shop",
+    "pages/main/main",
+    "pages/shop/goods/goods",
+    "pages/shop/buycar/buycar",
+    "pages/shop/goods/evaluate/evaluate",
+    "pages/person/person"
+  ],
+  "tabBar": {
+      "list": [
+        {
+            "pagePath": "pages/intro/intro",
+            "text": "首页",
+            "iconPath": "/data/icon/shouye-copy.png",
+            "selectedIconPath":"/data/icon/shouye.png"
+        },
+          {
+          "pagePath": "pages/main/main",
+          "text": "赛事报名",
+          "iconPath": "/data/icon/saishi1.png",
+          "selectedIconPath":"/data/icon/saishi1-copy.png"
+      },
+      {
+        "pagePath": "pages/shop/shop",
+        "text": "教学教辅",
+        "iconPath": "/data/icon/read.png",
+        "selectedIconPath": "/data/icon/read-copy.png"
+    },
+    {
+        "pagePath": "pages/person/person",
+        "text": "个人中心",
+        "iconPath": "/data/icon/icon-.png",
+        "selectedIconPath": "/data/icon/icon--copy.png"
+    }
+    ]
+  },
+  "window": {
+    "backgroundTextStyle": "dark",
+    "navigationBarBackgroundColor": "#325395",
+    "navigationBarTitleText": "ZJCF青少年人工智能",
+    "navigationBarTextStyle": "white"
+  },
+  "componentFramework": "glass-easel",
+  "sitemapLocation": "sitemap.json",
+  "lazyCodeLoading": "requiredComponents"
+}
diff --git a/app.wxss b/app.wxss
new file mode 100644
index 0000000..c7ecf74
--- /dev/null
+++ b/app.wxss
@@ -0,0 +1,22 @@
+/**app.wxss**/
+@font-face {
+    font-family: 'iconfont';
+    src: url('iconfont.ttf?t=1731926234801') format('truetype');
+  }
+  
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 200rpx 0;
+  box-sizing: border-box;
+} 
+button{
+    border-radius: 0;
+    margin: 0;
+    padding: 0;
+}
+button::after{ border: none; }
+
diff --git a/data/icon/icon--copy.png b/data/icon/icon--copy.png
new file mode 100644
index 0000000..b37c3cb
Binary files /dev/null and b/data/icon/icon--copy.png differ
diff --git a/data/icon/icon-.png b/data/icon/icon-.png
new file mode 100644
index 0000000..3a92d48
Binary files /dev/null and b/data/icon/icon-.png differ
diff --git a/data/icon/read-copy.png b/data/icon/read-copy.png
new file mode 100644
index 0000000..eb5f412
Binary files /dev/null and b/data/icon/read-copy.png differ
diff --git a/data/icon/read.png b/data/icon/read.png
new file mode 100644
index 0000000..f4660e6
Binary files /dev/null and b/data/icon/read.png differ
diff --git a/data/icon/saishi1-copy.png b/data/icon/saishi1-copy.png
new file mode 100644
index 0000000..4b68ab0
Binary files /dev/null and b/data/icon/saishi1-copy.png differ
diff --git a/data/icon/saishi1.png b/data/icon/saishi1.png
new file mode 100644
index 0000000..bbcf1f7
Binary files /dev/null and b/data/icon/saishi1.png differ
diff --git a/data/icon/shouye-copy.png b/data/icon/shouye-copy.png
new file mode 100644
index 0000000..3959385
Binary files /dev/null and b/data/icon/shouye-copy.png differ
diff --git a/data/icon/shouye.png b/data/icon/shouye.png
new file mode 100644
index 0000000..a3fd676
Binary files /dev/null and b/data/icon/shouye.png differ
diff --git a/data/image/shouye.jpg b/data/image/shouye.jpg
new file mode 100644
index 0000000..f40db89
Binary files /dev/null and b/data/image/shouye.jpg differ
diff --git a/data/image/star.webp b/data/image/star.webp
new file mode 100644
index 0000000..f423a7f
Binary files /dev/null and b/data/image/star.webp differ
diff --git a/pages/index/index.js b/pages/index/index.js
new file mode 100644
index 0000000..0c5699c
--- /dev/null
+++ b/pages/index/index.js
@@ -0,0 +1,59 @@
+// index.js
+const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
+const app=getApp()
+
+Page({
+    data: {
+        userInfo: {
+            avatarUrl: defaultAvatarUrl,
+            nickName: '',
+        },
+        userName: '',
+    },
+    onChooseAvatar(e) {
+        const {
+            avatarUrl
+        } = e.detail
+        this.setData({
+            userInfo: {
+                avatarUrl
+            },
+        })
+    },
+    iptHandler(e) {
+        const nickName = e.detail.value
+        this.setData({
+            // 通过e.detail.value获取到文本框最新的值
+            userName: nickName,
+        })
+    },
+    onLogin() {
+        if (this.data.userInfo.avatarUrl != defaultAvatarUrl && this.data.userName != '') {
+            wx.clearStorageSync('userInfo')
+            var userInfo = {
+                avatarUrl: '',
+                nickName: ''
+            }
+            userInfo.avatarUrl = this.data.userInfo.avatarUrl
+            userInfo.nickName = this.data.userName
+            wx.showToast({
+                title: '登录中',
+                icon: "loading",
+                duration: 800,
+                complete() {
+                    app.globalData.userInfo=userInfo
+                    app.globalData.hasUserInfo=true;
+                    wx.switchTab({
+                        url: '/pages/intro/intro'
+                    })
+                }
+            });
+        } else {
+            wx.showToast({
+                title: '请输入用户头像及昵称',
+                icon: "error",
+                duration: 2000
+            });
+        }
+    }
+})
\ No newline at end of file
diff --git a/pages/index/index.wxml b/pages/index/index.wxml
new file mode 100644
index 0000000..43c5f3e
--- /dev/null
+++ b/pages/index/index.wxml
@@ -0,0 +1,16 @@
+<scroll-view scroll-y type="list" style="height: 100vh;">
+  <view class="container">
+    <view class="userinfo">
+        <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
+          <image class="avatar" src="{{userInfo.avatarUrl}}"></image>
+        </button>
+        <view class="nickname-wrapper">
+          <text class="nickname-label">昵称</text>
+          <input type="nickname" class="nickname-input"  placeholder="请输入昵称" model:value="{{userName}}"  bindinput="iptHandler"/>
+        </view>
+    </view>
+    <view class="usermotto">
+        <button type="primary"  bind:tap="onLogin" class="login">登录</button>
+    </view>
+  </view>
+</scroll-view>
diff --git a/pages/index/index.wxss b/pages/index/index.wxss
new file mode 100644
index 0000000..2b7eb47
--- /dev/null
+++ b/pages/index/index.wxss
@@ -0,0 +1,61 @@
+/**index.wxss**/
+.userinfo {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    color: #aaa;
+    width: 80%;
+  }
+  
+  .userinfo-avatar {
+    overflow: hidden;
+    width: 128rpx;
+    height: 128rpx;
+    margin: 20rpx;
+    border-radius: 50%;
+  }
+  
+  .usermotto {
+    margin-top: 200px;
+    width: 100px;
+  }
+  
+  .avatar-wrapper {
+    padding: 0;
+    width: 56px ;
+    height: 56px;
+    border-radius: 8px;
+    margin-top: 40px;
+    margin-bottom: 40px;
+  }
+  
+  .avatar {
+    display: block;
+    width: 56px;
+    height: 56px;
+  }
+  
+  .nickname-wrapper {
+    display: flex;
+    width: 100%;
+    padding: 16px;
+    box-sizing: border-box;
+    border-top: .5px solid rgba(0, 0, 0, 0.1);
+    border-bottom: .5px solid rgba(0, 0, 0, 0.1);
+    color: black;
+  }
+  
+  .nickname-label {
+    width: 105px;
+  }
+  
+  .nickname-input {
+    flex: 1;
+  }
+  
+  .login{
+      width: 200rpx;
+      height: 80rpx;
+      line-height: 80rpx;
+      border-radius: 10%;
+  }
\ No newline at end of file
diff --git a/pages/intro/intro.js b/pages/intro/intro.js
new file mode 100644
index 0000000..d9ff605
--- /dev/null
+++ b/pages/intro/intro.js
@@ -0,0 +1,65 @@
+// pages/intro/intro.js
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad(options) {
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})
\ No newline at end of file
diff --git a/pages/intro/intro.json b/pages/intro/intro.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/pages/intro/intro.json
@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/pages/intro/intro.wxml b/pages/intro/intro.wxml
new file mode 100644
index 0000000..1589ca2
--- /dev/null
+++ b/pages/intro/intro.wxml
@@ -0,0 +1,10 @@
+<!-- pages/intro/intro.wxml -->
+<view class="intro_container">
+    <view class="shouye">
+    <image src="../../data/image/shouye.jpg" mode="aspectFill" class="original-image"/>
+</view>
+
+<view class="card"style="font-size:18px;color:white;">
+<view style="font-size:18px;font-weight:700;">学会简介</view>
+    </view>
+</view>
diff --git a/pages/intro/intro.wxss b/pages/intro/intro.wxss
new file mode 100644
index 0000000..cab5884
--- /dev/null
+++ b/pages/intro/intro.wxss
@@ -0,0 +1,39 @@
+/* pages/intro/intro.wxss */
+.intro_container{
+    width: 100%;
+    height: 100vh;
+    position: relative;
+    background-color: #15042f;
+}
+.shouye {
+    width: 100%;
+    height: 200px;
+    position: relative;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+
+.shouye image {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+
+
+.card {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    margin: -25vh 0  0 -45vmin;
+    width: 90vmin; /* 调整宽度以适应需求 */
+    height: 50vh;
+    background-color: white;
+    border-radius: 10px;
+    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+    text-align: center;
+    background-color: #342c5293;
+    backdrop-filter: blur(10px);
+}
\ No newline at end of file
diff --git a/pages/main/main.js b/pages/main/main.js
new file mode 100644
index 0000000..7bf3205
--- /dev/null
+++ b/pages/main/main.js
@@ -0,0 +1,65 @@
+// pages/main/main.js
+const app=getApp()
+Page({
+
+    /**
+     * 页面的初始数据
+     */
+    data: {
+        hasUserInfo:false,
+    },
+
+    /**
+     * 生命周期函数--监听页面加载
+     */
+    onLoad(options) {
+    app.routeSafer(this.data.hasUserInfo)
+},
+
+    /**
+     * 生命周期函数--监听页面初次渲染完成
+     */
+    onReady() {
+    },
+
+    /**
+     * 生命周期函数--监听页面显示
+     */
+    onShow() {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面隐藏
+     */
+    onHide() {
+    },
+
+    /**
+     * 生命周期函数--监听页面卸载
+     */
+    onUnload() {
+
+    },
+
+    /**
+     * 页面相关事件处理函数--监听用户下拉动作
+     */
+    onPullDownRefresh() {
+
+    },
+
+    /**
+     * 页面上拉触底事件的处理函数
+     */
+    onReachBottom() {
+
+    },
+
+    /**
+     * 用户点击右上角分享
+     */
+    onShareAppMessage() {
+
+    }
+})
\ No newline at end of file
diff --git a/pages/main/main.json b/pages/main/main.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/pages/main/main.json
@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/pages/main/main.wxml b/pages/main/main.wxml
new file mode 100644
index 0000000..140ade1
--- /dev/null
+++ b/pages/main/main.wxml
@@ -0,0 +1,45 @@
+<!--pages/main/main.wxml-->
+<block>
+    <swiper  autoplay="true" duration='600'  indicator-dots="true" circular="true" indicator-color="white" indicator-active-color="#777676" interval="3000">
+    
+        <swiper-item item-id='1' style="background-color: aquamarine;">
+            <image class="swiper_image" mode="aspectFill" src="https://publicqn.saikr.com/saikr/contest/1723087930763/1723087930763dja0vqm18p.png"></image>
+        </swiper-item>
+        <swiper-item item-id='2' style="background-color:cadetblue;">
+            <image class="swiper_image" mode="aspectFill" src="https://publicqn.saikr.com/saikr/contest/1727607762864/172760776286423as7i16pno.png"></image>
+        </swiper-item>
+        <swiper-item item-id='3' style="background-color:rgb(160, 95, 151);">
+            <image class="swiper_image" mode="aspectFill" src="https://publicqn.saikr.com/2024/10/26/contest671c4d9ad2c442.851856601729908129695.png?imageView2/2/w/2160"></image>
+        </swiper-item>
+    </swiper>
+</block>
+
+<block>
+    <view class="cont match-item">
+        <view class="card">
+            <image class="image" src="https://publicqn.saikr.com/saikr/contest/1723087930763/1723087930763dja0vqm18p.png"></image>
+            <view class="info">
+                <text class="name">2024年第四届《英语世界》杯全国大学生翻译大赛</text>
+                <text class="date">报名日期:2024.09.08 ~ 2024.11.23</text>
+            </view>
+        </view>
+    </view>
+    <view class="cont match-item">
+        <view class="card" bindtap="">
+            <image class="image" src="https://publicqn.saikr.com/saikr/contest/1727607762864/172760776286423as7i16pno.png"></image>
+            <view class="info">
+                <text class="name">2024年第五届“中译国青杯”国际组织文件翻译大赛</text>
+                <text class="date">报名日期:2024.09.30 ~ 2024.11.29</text>
+            </view>
+        </view>
+    </view>
+    <view class="cont match-item">
+        <view class="card">
+            <image class="image" src="https://publicqn.saikr.com/2024/10/26/contest671c4d9ad2c442.851856601729908129695.png?imageView2/2/w/2160"></image>
+            <view class="info">
+                <text class="name">第二届“数学周报” 全国大学生数学能力大赛</text>
+                <text class="date">报名日期:2024年08月20日-2024年11月30日</text>
+            </view>
+        </view>
+    </view>
+</block>
\ No newline at end of file
diff --git a/pages/main/main.wxss b/pages/main/main.wxss
new file mode 100644
index 0000000..a262291
--- /dev/null
+++ b/pages/main/main.wxss
@@ -0,0 +1,49 @@
+/* pages/main/main.wxss */
+swiper{
+    height: 60vmin;
+}
+.swiper_image{
+    width: 100%;
+}
+.cont {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    padding: 20px; /* 可根据需要调整内边距 */
+    box-sizing: border-box;
+  }
+  
+  .card {
+    width: 90vmin;
+    border-radius: 10px;
+    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+    overflow: hidden;
+    background-color: #fff; /* 背景颜色 */
+  }
+  
+  .image {
+    width: 100%;
+    height: 25vh;
+    border-top-left-radius: 10px;
+    border-top-right-radius: 10px;
+  }
+  
+  .info {
+    padding: 10px;
+    display: flex;
+    flex-flow: column;
+  }
+  
+  .name {
+    font-size: 18px;
+    color: #333;
+    margin-bottom: 5px; /* 为名称和日期之间添加一些间距 */
+    white-space: nowrap; /* 防止名称换行 */
+    overflow: hidden; /* 隐藏溢出的文本 */
+    text-overflow: ellipsis; /* 显示省略号 */
+  }
+  
+  .date {
+    font-size: 14px;
+    color: #666;
+  }
\ No newline at end of file
diff --git a/pages/person/person.js b/pages/person/person.js
new file mode 100644
index 0000000..47f3296
--- /dev/null
+++ b/pages/person/person.js
@@ -0,0 +1,84 @@
+// pages/person/person.js
+const app = getApp()
+
+Page({
+
+    /**
+     * 页面的初始数据
+     */
+    data: {
+        userInfo: app.globalData.userInfo
+    },
+
+    /**
+     * 生命周期函数--监听页面加载
+     */
+    onLoad(options) {
+        
+    },
+
+    /**
+     * 生命周期函数--监听页面初次渲染完成
+     */
+    onReady() {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面显示
+     */
+    onShow() {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面隐藏
+     */
+    onHide() {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面卸载
+     */
+    onUnload() {
+
+    },
+
+    /**
+     * 页面相关事件处理函数--监听用户下拉动作
+     */
+    onPullDownRefresh() {
+
+    },
+
+    /**
+     * 页面上拉触底事件的处理函数
+     */
+    onReachBottom() {
+
+    },
+
+    /**
+     * 用户点击右上角分享
+     */
+    onShareAppMessage() {
+
+    },
+    talkOnline() {
+        wx.showToast({
+            title: '还没写这里的代码',
+            icon: 'none'
+        })
+    },
+    quitOut() {
+        app.globalData.userInfo = {}
+        app.globalData.hasUserInfo = false
+        this.setData({
+            userInfo: {}
+        })
+        wx.redirectTo({
+            url: '/pages/index/index',
+        })
+    }
+})
\ No newline at end of file
diff --git a/pages/person/person.json b/pages/person/person.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/pages/person/person.json
@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/pages/person/person.wxml b/pages/person/person.wxml
new file mode 100644
index 0000000..8922a7b
--- /dev/null
+++ b/pages/person/person.wxml
@@ -0,0 +1,17 @@
+<view class="avatar-container">
+    <block>
+        <view class="usrinfo">
+            <view class="avatarcon">
+                <image class="avatar" src="{{userInfo.avatarUrl}}" mode="aspectFill" />
+            </view>
+            <view class="nickName">{{userInfo.nickName}}</view>
+        </view>
+    </block>
+    <block>
+        <view class="list">
+            <button class="btn1" bind:tap="talkOnline">在线客服</button>
+            <button class="btn2" bind:tap="talkOnline">个人资料</button>
+            <button class="btn3" bind:tap="quitOut">退出登录</button>
+        </view>
+    </block>
+</view>
\ No newline at end of file
diff --git a/pages/person/person.wxss b/pages/person/person.wxss
new file mode 100644
index 0000000..db5542d
--- /dev/null
+++ b/pages/person/person.wxss
@@ -0,0 +1,63 @@
+.usrinfo{
+    width: 100%;
+    height: 35vh;
+    background-color: #325395;
+}
+.avatarcon{
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 150px; 
+}
+.avatar{
+    width: 100px;
+    height: 100px;
+    border-radius: 50%;
+    justify-content: center;
+    align-items: center;
+    border: 3px solid white;
+    box-shadow: 0 0 10px;
+}
+
+.nickName{
+    width: 100%;
+    text-align: center;
+    font-weight: 700;
+    color: white;
+    font-family:'Times New Roman', Times, serif;
+    font-size: 25px;
+}
+
+/* 列表容器样式 */
+.list {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    margin-top: 20px; /* 根据需要调整 */
+  }
+  
+  /* 按钮样式 */
+  .btn1, .btn2, .btn3 {
+    width: 80%; /* 按钮宽度 */
+    height: 50px;
+    line-height: 50px;
+    margin: 10px 0; /* 按钮外边距 */
+    background-color: #1AAD19; /* 按钮背景颜色 */
+    color: white; /* 按钮文字颜色 */
+    text-align: center; /* 文字居中 */
+    border-radius: 5px; /* 按钮圆角 */
+    font-size: 16px; /* 文字大小 */
+  }
+  
+  /* 为不同的按钮添加不同的样式,如果需要的话 */
+  .btn1 {
+    background-color: #007aff; /* 在线客服按钮背景颜色 */
+  }
+  
+  .btn2 {
+    background-color: #ff9900; /* 个人资料按钮背景颜色 */
+  }
+  
+  .btn3 {
+    background-color: #ff3b30; /* 退出登录按钮背景颜色 */
+  }
\ No newline at end of file
diff --git a/pages/shop/buycar/buycar.js b/pages/shop/buycar/buycar.js
new file mode 100644
index 0000000..b89b01c
--- /dev/null
+++ b/pages/shop/buycar/buycar.js
@@ -0,0 +1,107 @@
+Page({
+    data: {
+      cartItems: [
+        { id: 1, name: '商品A', price: 100, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner1.png', selected: false },
+        { id: 2, name: '商品B', price: 200, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner2.png', selected: false },
+        { id: 3, name: '商品C', price: 300, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner3.png', selected: false },
+        { id: 4, name: '商品D', price: 400, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner4.png', selected: false },
+        { id: 5, name: '商品E', price: 500, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner5.png', selected: false }
+      ],
+      total: 0,
+      total_goods: 0,
+      allSelected: false
+    },
+  
+    onLoad: function() {
+      this.calculateTotal();
+      this.calculateTotal_goods();
+    },
+  
+    toggleSelection: function(e) {
+      const id = e.currentTarget.dataset.id;
+      const index = this.data.cartItems.findIndex(item => item.id === id);
+      if (index !== -1) {
+        let updatedItem = this.data.cartItems[index];
+        updatedItem.selected = !updatedItem.selected;
+        this.setData({
+          ['cartItems[' + index + ']']: updatedItem
+        });
+        this.calculateTotal();
+        this.calculateTotal_goods();
+        this.updateAllSelected();
+      }
+    },
+  
+    toggleAllSelection: function() {
+      const newSelection = !this.data.allSelected;
+      const updatedCartItems = this.data.cartItems.map(item => ({
+        ...item,
+        selected: newSelection
+      }));
+      this.setData({
+        cartItems: updatedCartItems,
+        allSelected: newSelection
+      });
+      this.calculateTotal();
+      this.calculateTotal_goods();
+    },
+  
+    increaseQuantity: function(e) {
+      const id = e.currentTarget.dataset.id;
+      const index = this.data.cartItems.findIndex(item => item.id === id);
+      if (index !== -1) {
+        let updatedItem = this.data.cartItems[index];
+        updatedItem.quantity += 1;
+        this.setData({
+          ['cartItems[' + index + ']']: updatedItem
+        });
+        this.calculateTotal();
+      }
+    },
+  
+    decreaseQuantity: function(e) {
+      const id = e.currentTarget.dataset.id;
+      const index = this.data.cartItems.findIndex(item => item.id === id);
+      if (index !== -1) {
+        let updatedItem = this.data.cartItems[index];
+        if (updatedItem.quantity > 1) {
+          updatedItem.quantity -= 1;
+          this.setData({
+            ['cartItems[' + index + ']']: updatedItem
+          });
+          this.calculateTotal();
+        }
+      }
+    },
+  
+    calculateTotal: function() {
+      let total = 0;
+      this.data.cartItems.forEach(item => {
+        if (item.selected) {
+          total += item.price * item.quantity;
+        }
+      });
+      this.setData({ total: total });
+    },
+  
+    calculateTotal_goods: function() {
+      let total_goods = this.data.cartItems.reduce((acc, item) => {
+        return acc + (item.selected ? 1 : 0);
+      }, 0);
+  
+      this.setData({ total_goods: total_goods });
+    },
+  
+    updateAllSelected: function() {
+      const allSelected = this.data.cartItems.every(item => item.selected);
+      this.setData({ allSelected: allSelected });
+    },
+  
+    checkout: function() {
+      wx.showToast({
+        title: '结算成功',
+        icon: 'success',
+        duration: 2000
+      });
+    }
+  });
\ No newline at end of file
diff --git a/pages/shop/buycar/buycar.json b/pages/shop/buycar/buycar.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/pages/shop/buycar/buycar.json
@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/pages/shop/buycar/buycar.wxml b/pages/shop/buycar/buycar.wxml
new file mode 100644
index 0000000..f277258
--- /dev/null
+++ b/pages/shop/buycar/buycar.wxml
@@ -0,0 +1,29 @@
+<view class="cart-container">
+  <block wx:for="{{ cartItems }}" wx:key="id">
+    <view class="cart-item">
+      <checkbox class="item-checkbox" checked="{{ item.selected }}" data-id="{{ item.id }}" bindtap="toggleSelection"></checkbox>
+      <image src="{{ item.image }}" class="item-image"></image>
+      <view class="item-details">
+        <text class="item-name">{{ item.name }}</text>
+        <view class="item-footer">
+          <text class="item-price">¥{{ item.price }}</text>
+          <view class="quantity-control">
+            <button bindtap="decreaseQuantity" data-id="{{ item.id }}">-</button>
+            <text>{{ item.quantity }}</text>
+            <button bindtap="increaseQuantity" data-id="{{ item.id }}">+</button>
+          </view>
+        </view>
+      </view>
+    </view>
+  </block>
+  <view class="checkout-bar">
+    <view class="select-all">
+      <checkbox class="select-all-checkbox" checked="{{ allSelected }}" bindtap="toggleAllSelection"></checkbox>
+      <text>全选</text>
+    </view>
+    <view class="total-and-checkout">
+      <text>总计: ¥{{ total }}</text>
+      <button bindtap="checkout">去结算({{ total_goods }})</button>
+    </view>
+  </view>
+</view>
\ No newline at end of file
diff --git a/pages/shop/buycar/buycar.wxss b/pages/shop/buycar/buycar.wxss
new file mode 100644
index 0000000..62f12c1
--- /dev/null
+++ b/pages/shop/buycar/buycar.wxss
@@ -0,0 +1,123 @@
+.cart-container {
+    padding: 20px;
+    background-color: #f9f9f9;
+    border-radius: 10px;
+    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+    min-height: 100vh;
+    display: flex;
+    flex-direction: column;
+    padding-bottom: 60px; /* 为底部结算栏留出空间 */
+  }
+  
+  .cart-item {
+    display: flex;
+    align-items: center;
+    padding: 20px;
+    background-color: #fff;
+    border-radius: 8px;
+    margin-bottom: 20px;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+  }
+  
+  .item-checkbox {
+    margin-right: 10px;
+  }
+  
+  .item-image {
+    width: 80px;
+    height: 80px;
+    margin-right: 20px;
+    border-radius: 8px;
+  }
+  
+  .item-details {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+  }
+  
+  .item-name {
+    font-size: 14px;
+    color: #333;
+    margin-bottom: 10px;
+  }
+  
+  .item-footer {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+  
+  .item-price {
+    font-size: 16px;
+    color: red;
+  }
+  
+  .quantity-control {
+    display: flex;
+    align-items: center;
+  }
+  
+  .quantity-control button {
+    width: 30px;
+    height: 30px;
+    line-height: 30px;
+    margin: 0 5px;
+
+  }
+  
+  .quantity-control button:active {
+    background-color: #d0d0d0;
+  }
+  
+  .checkout-bar {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    background-color: #fff;
+    padding: 10px 20px;
+    box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05);
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    z-index: 100;
+    box-sizing: border-box; /* 确保内边距不会影响宽度 */
+  }
+  
+  .select-all {
+    display: flex;
+    align-items: center;
+  }
+  
+  .select-all-checkbox {
+    margin-right: 10px;
+  }
+  
+  .total-and-checkout {
+    display: flex;
+    align-items: center;
+  }
+  
+  .total-and-checkout text {
+    font-size: 16px;
+    font-weight: bold;
+    color: #333;
+    margin-right: 10px;
+  }
+  
+  .checkout-bar button {
+      width: 100px;
+      height: 40px;
+      line-height: 40px;
+    background-color: #1aad19;
+    color: #fff;
+    border: none;
+    border-radius: 40px;
+    font-size: 16px;
+  }
+  
+  .checkout-bar button:hover {
+    background-color: #179a16;
+  }
\ No newline at end of file
diff --git a/pages/shop/goods/evaluate/evaluate.js b/pages/shop/goods/evaluate/evaluate.js
new file mode 100644
index 0000000..b6255fa
--- /dev/null
+++ b/pages/shop/goods/evaluate/evaluate.js
@@ -0,0 +1,46 @@
+// pages/reviews/reviews.js
+
+Page({
+    data: {
+      reviews: [
+        {
+          username: '用户A',
+          rating: 5,
+          comment: '非常满意,质量非常好!',
+          timestamp: '2023-10-01 10:00'
+        },
+        {
+          username: '用户B',
+          rating: 4,
+          comment: '不错,值得推荐!',
+          timestamp: '2023-10-02 11:00'
+        },
+        {
+          username: '用户C',
+          rating: 3,
+          comment: '一般般,还可以吧。',
+          timestamp: '2023-10-03 12:00'
+        },
+        {
+          username: '用户D',
+          rating: 2,
+          comment: '不太满意,有些问题。',
+          timestamp: '2023-10-04 13:00'
+        },
+        {
+          username: '用户E',
+          rating: 1,
+          comment: '非常不满意,不推荐购买!',
+          timestamp: '2023-10-05 14:00'
+        }
+      ]
+    },
+  
+    onLoad: function () {
+      console.log('Reviews page loaded');
+    },
+  
+    onBack: function () {
+      wx.navigateBack();
+    }
+  });
\ No newline at end of file
diff --git a/pages/shop/goods/evaluate/evaluate.json b/pages/shop/goods/evaluate/evaluate.json
new file mode 100644
index 0000000..8835af0
--- /dev/null
+++ b/pages/shop/goods/evaluate/evaluate.json
@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/pages/shop/goods/evaluate/evaluate.wxml b/pages/shop/goods/evaluate/evaluate.wxml
new file mode 100644
index 0000000..429c069
--- /dev/null
+++ b/pages/shop/goods/evaluate/evaluate.wxml
@@ -0,0 +1,23 @@
+
+  <!-- 顶部导航栏 -->
+
+  <!-- 评价列表 -->
+  <view class="reviews-list">
+    <block wx:for="{{reviews}}" wx:key="index">
+      <view class="review-item">
+        <view class="user-info">
+          <view class="username">{{item.username}}</view>
+          <view class="rating">
+            <block wx:for="{{item.rating}}" wx:key="star">
+              <image class="star" src="/data/image/star.webp" mode="widthFix"></image>
+            </block>
+            <block wx:for="{{5 - item.rating}}" wx:key="emptyStar">
+              <image class="star" src="/data/image/star.webp" mode="widthFix"></image>
+            </block>
+          </view>
+        </view>
+        <view class="comment">{{item.comment}}</view>
+        <view class="timestamp">{{item.timestamp}}</view>
+      </view>
+    </block>
+  </view>
\ No newline at end of file
diff --git a/pages/shop/goods/evaluate/evaluate.wxss b/pages/shop/goods/evaluate/evaluate.wxss
new file mode 100644
index 0000000..9595b6f
--- /dev/null
+++ b/pages/shop/goods/evaluate/evaluate.wxss
@@ -0,0 +1,74 @@
+/* pages/reviews/reviews.wxss */
+
+/* 全局样式 */
+.container {
+    background-color: #f5f5f5;
+    padding: 20rpx;
+  }
+  
+  /* 顶部导航栏 */
+  .navbar {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    background-color: #007aff;
+    padding: 20rpx;
+    color: #ffffff;
+    font-size: 32rpx;
+  }
+  
+  .back-btn {
+    color: #ffffff;
+    font-size: 28rpx;
+  }
+  
+  .title {
+    font-weight: bold;
+  }
+  
+  /* 评价列表 */
+  .reviews-list {
+    margin-top: 20rpx;
+  }
+  
+  .review-item {
+    background-color: #ffffff;
+    border-radius: 10rpx;
+    padding: 20rpx;
+    margin-bottom: 20rpx;
+    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
+  }
+  
+  .user-info {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 10rpx;
+  }
+  
+  .username {
+    font-weight: bold;
+    font-size: 28rpx;
+  }
+  
+  .rating {
+    display: flex;
+    align-items: center;
+  }
+  
+  .star {
+    width: 32rpx;
+    height: 32rpx;
+    margin-left: 5rpx;
+  }
+  
+  .comment {
+    font-size: 28rpx;
+    color: #333333;
+    margin-bottom: 10rpx;
+  }
+  
+  .timestamp {
+    font-size: 24rpx;
+    color: #999999;
+  }
\ No newline at end of file
diff --git a/pages/shop/goods/goods.js b/pages/shop/goods/goods.js
new file mode 100644
index 0000000..861044b
--- /dev/null
+++ b/pages/shop/goods/goods.js
@@ -0,0 +1,56 @@
+// pages/product/product.js
+
+Page({
+    data: {
+      // 可以在这里添加更多的数据
+      goods_item:[
+        { id: 1, name: '商品A', price: 100, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner1.png', selected: false },
+        { id: 2, name: '商品B', price: 200, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner2.png', selected: false },
+        { id: 3, name: '商品C', price: 300, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner3.png', selected: false },
+        { id: 4, name: '商品D', price: 400, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner4.png', selected: false },
+        { id: 5, name: '商品E', price: 500, quantity: 1, image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner5.png', selected: false }
+      ],
+      user: {
+        avatar: 'https://ts3.cn.mm.bing.net/th?id=OIP-C.y6rdSCGpxbfeb8Rd1CpSuwAAAA&w=250&h=250&c=8&rs=1&qlt=90&o=6&pid=3.1&rm=2', // 默认头像路径
+        nickname: '匿名用户' // 默认昵称
+      },
+      comment: {
+        text: '这是一个很棒的产品,我非常喜欢!', // 默认评语
+        purchaseTime: '2024-11-20' // 默认购买时间
+      }
+    },
+  
+    onLoad: function () {
+      console.log('Product page loaded');
+      wx.setNavigationBarTitle({
+        title: '商品详情',
+      })
+    },
+  
+    onSearch: function (e) {
+      console.log('Search clicked', e.detail.value);
+      // 处理搜索逻辑
+    },
+  
+    onBuyNow: function () {
+      console.log('Buy now clicked');
+      // 处理立即购买逻辑
+    },
+  
+    onAddToCart: function () {
+      console.log('Add to cart clicked');
+      // 处理加入购物车逻辑
+    },
+  
+    onViewReviews: function () {
+      console.log('View reviews clicked');
+      wx.navigateTo({
+        url: '/pages/shop/goods/evaluate/evaluate',
+      })
+    },
+  
+    onContactCustomerService: function () {
+      console.log('Contact customer service clicked');
+      // 处理联系客服逻辑
+    }
+  });
\ No newline at end of file
diff --git a/pages/shop/goods/goods.json b/pages/shop/goods/goods.json
new file mode 100644
index 0000000..a97367d
--- /dev/null
+++ b/pages/shop/goods/goods.json
@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}
diff --git a/pages/shop/goods/goods.wxml b/pages/shop/goods/goods.wxml
new file mode 100644
index 0000000..780ec56
--- /dev/null
+++ b/pages/shop/goods/goods.wxml
@@ -0,0 +1,62 @@
+<!-- pages/product/product.wxml -->
+<!-- 商品展示区 -->
+<view class="product-display">
+    <swiper class="swiper" indicator-dots="true" interval="3000" duration="500">
+        <swiper-item wx:for="{{goods_item}}" wx:key="*this">
+            <image class="swiper-image" src="{{item.image}}" mode="aspectFill"></image>
+        </swiper-item>
+    </swiper>
+    <view class="product-info">
+        <view class="box-top">
+            <view class="price-info">
+                <view class="discount-price">¥1798</view>
+                <view class="original-price">¥1998</view>
+            </view>
+            <view style="font-size:12px;color:gray;">已售1000+</view>
+        </view>
+        <view class="product-name">海产大礼包包含生蚝三文鱼波士顿龙虾扇贝蛤蜊海虾</view>
+        <view class="promotion-info">
+            <view class="countdown">距离活动结束还有8小时8分48秒</view>
+        </view>
+        <view class="review-info">
+            <view style="font-size:16px;">商品评价(1)</view>
+            <button class="view-reviews-btn" bindtap="onViewReviews">查看全部评价></button>
+        </view>
+        <view class="comment-card">
+            <!-- 用户信息 -->
+            <view class="user-info">
+                <image class="avatar" src="{{user.avatar}}" mode="aspectFit"></image>
+                <text class="nickname">{{user.nickname}}</text>
+            </view>
+            <!-- 评语 -->
+            <view class="comment">
+                <text>{{comment.text}}</text>
+            </view>
+            <!-- 购买时间 -->
+            <view class="purchase-time">
+                <text>购买时间:{{comment.purchaseTime}}</text>
+            </view>
+        </view>
+    </view>
+
+    <view class="goods_intro">
+        <view class="intro_top">
+            商品详情
+        </view>
+
+        <view wx:for="{{goods_item}}" wx:key="*this">
+            <image class="intro_image" src="{{item.image}}" mode="aspectFill"></image>
+        </view>
+
+        <view class="bottom">
+            相关支持由湛江市计算机协会提供
+        </view>
+    </view>
+</view>
+
+
+
+<view class="purchase-buttons">
+        <button class="buy-now-btn" bindtap="onBuyNow">立即购买</button>
+        <button class="add-to-cart-btn" bindtap="onAddToCart">加入购物车</button>
+    </view>
\ No newline at end of file
diff --git a/pages/shop/goods/goods.wxss b/pages/shop/goods/goods.wxss
new file mode 100644
index 0000000..bdae064
--- /dev/null
+++ b/pages/shop/goods/goods.wxss
@@ -0,0 +1,164 @@
+/* 商品展示区 */
+.product-display {
+    background-color: #ffffff;
+    border-radius: 10rpx;
+    padding: 10rpx;
+    margin-top: 20rpx;
+    margin: 20rpx 5px;
+}
+
+.swiper {
+    width: 100%;
+    height: 600rpx;
+    overflow: hidden;
+}
+
+.swiper-image {
+    width: 100%;
+    height: 100%;
+}
+
+.product-info {
+    font-size: 28rpx;
+    color: #333333;
+    margin-top: 20rpx;
+}
+
+.product-name {
+    margin-bottom: 10rpx;
+    font-size: 18px;
+}
+
+.price-info {
+    display: flex;
+    align-items: baseline;
+}
+
+.original-price {
+    text-decoration: line-through;
+    color: #999999;
+    margin-right: 10rpx;
+}
+
+.discount-price {
+    color: #ff5722;
+    font-size: 25px;
+}
+
+.box-top {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    height: 100rpx;
+}
+
+.promotion-info {
+    margin-bottom: 20px;
+}
+
+.countdown {
+    color: #999999;
+}
+
+.review-info {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+.view-reviews-btn {
+    width: 250rpx;
+    height: 30px;
+    background-color: transparent;
+    color: #7c7c7c;
+    font-size: 14px;
+    line-height: 30px;
+}
+
+.comment-card {
+    background-color: #fff;
+    padding: 16px;
+  }
+  
+  .user-info {
+    display: flex;
+    align-items: center;
+    margin-bottom: 8px;
+  }
+  
+  .avatar {
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+    margin-right: 12px;
+  }
+  
+  .nickname {
+    font-size: 14px;
+    color: #333;
+  }
+  
+  .comment {
+    margin-bottom: 8px;
+    font-size: 14px;
+    color: #666;
+  }
+  
+  .purchase-time {
+    font-size: 12px;
+    color: #999;
+  }
+
+.goods_intro{
+    width: 100%;
+}
+
+  .intro_top{
+    width: 100%;
+    height: 60px;
+    text-align: center;
+    line-height: 60px;
+    border-top: 1px solid #666;
+  }
+
+  .intro_image{
+      width: 100%;
+  }
+/* 购买操作区 */
+.purchase-buttons {
+    display: flex;
+    align-items: center;
+    position: fixed;
+    bottom: -20px;
+    height: 60px;
+    left: 0;
+    width: 100%;
+    z-index: 100;
+    margin: 15px 0;
+    background-color: white;
+    justify-content: space-around;
+    margin-top: 20rpx;
+}
+
+.buy-now-btn,
+.add-to-cart-btn {
+    background-color: #ff5722;
+    color: #ffffff;
+    border: none;
+    border-radius: 5px;
+    font-size: 28rpx;
+    width: 45%;
+    height: 40px;
+    line-height: 40px;
+}
+
+.add-to-cart-btn {
+    background-color: #007aff;
+}
+
+.bottom{
+    height: 100px;
+    text-align: center;
+    font-size: 14px;
+    line-height: 50px;
+}
\ No newline at end of file
diff --git a/pages/shop/shop.js b/pages/shop/shop.js
new file mode 100644
index 0000000..7898aff
--- /dev/null
+++ b/pages/shop/shop.js
@@ -0,0 +1,113 @@
+Page({
+    data: {
+        // 轮播图图片列表
+        imageList: [
+            'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner1.png',
+            'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner2.png',
+            'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner3.png',
+            'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner4.png',
+            'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner5.png',
+            'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner6.png',
+            // 更多图片路径...
+        ],
+
+        // 商品分类
+        categories: ['全部', '教材','课程资源包'],
+
+        // 当前选中的分类索引
+        currentCategoryIndex: 0,
+
+        // 商品列表
+        productList: [
+            {
+                image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner1.png',
+                name: '商品名称1',
+                price: 99.99,
+                category: '教材'
+            },
+            {
+                image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner2.png',
+                name: '商品名称2',
+                price: 199.99,
+                category: '教材'
+            },
+            {
+                image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner3.png',
+                name: '商品名称3',
+                price: 199.99,
+                category: '课程资源包'
+            },
+            {
+                image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner4.png',
+                name: '商品名称4',
+                price: 199.99,
+                category: '课程资源包'
+            },
+            {
+                image: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner5.png',
+                name: '商品名称5',
+                price: 199.99,
+                category: '课程资源包'
+            },
+            // 更多商品数据...
+        ],
+
+        // 过滤后的商品列表
+        filteredProductList: []
+    },
+
+    onPullDownRefresh: function() {
+        // 执行下拉刷新操作,如重新加载数据
+        // 模拟数据加载
+        wx.showNavigationBarLoading(); // 在标题栏中显示加载
+        
+        // 假设这里进行了数据刷新
+        setTimeout(() => {
+            // 数据刷新完毕,停止加载
+            wx.hideNavigationBarLoading();
+            wx.stopPullDownRefresh(); // 停止下拉动作
+        }, 1500);
+    },
+
+    onLoad: function(options) {
+        // 页面加载时执行的初始化操作
+        this.filterProductsByCategory(this.data.currentCategoryIndex);
+    },
+
+    // 切换分类
+    switchCategory: function(e) {
+        const index = e.currentTarget.dataset.index;
+        this.setData({
+            currentCategoryIndex: index
+        });
+        this.filterProductsByCategory(index);
+    },
+
+    // 根据分类过滤商品列表
+    filterProductsByCategory: function(categoryIndex) {
+        let filteredList = [];
+        if (categoryIndex === 0) {
+            // 全部分类
+            filteredList = this.data.productList;
+        } else {
+            const selectedCategory = this.data.categories[categoryIndex];
+            filteredList = this.data.productList.filter(item => item.category === selectedCategory);
+        }
+        this.setData({
+            filteredProductList: filteredList
+        });
+    },
+
+    // 其他页面事件处理函数...
+    to_car() {
+        wx.navigateTo({
+            url: '/pages/shop/buycar/buycar',
+        })
+    },
+
+    to_goods() {
+        wx.navigateTo({
+            url: '/pages/shop/goods/goods',
+        })
+    }
+});
\ No newline at end of file
diff --git a/pages/shop/shop.json b/pages/shop/shop.json
new file mode 100644
index 0000000..7360326
--- /dev/null
+++ b/pages/shop/shop.json
@@ -0,0 +1,4 @@
+{
+  "usingComponents": {},
+  "enablePullDownRefresh": true
+}
\ No newline at end of file
diff --git a/pages/shop/shop.wxml b/pages/shop/shop.wxml
new file mode 100644
index 0000000..b435a52
--- /dev/null
+++ b/pages/shop/shop.wxml
@@ -0,0 +1,32 @@
+<view class="container">
+    <!-- 顶部轮播图 -->
+    <swiper class="swiper" indicator-dots="true" autoplay="true" interval="3000" duration="500">
+        <swiper-item wx:for="{{imageList}}" wx:key="*this" bind:tap="to_goods">
+            <image src="{{item}}" class="slide-image" mode="aspectFill"></image>
+        </swiper-item>
+    </swiper>
+
+    <!-- 商品分类Tab栏 -->
+    <view class="tabs">
+    <view class="tab {{currentCategoryIndex === index ? 'active' : ''}}" wx:for="{{categories}}" wx:key="*this" data-index="{{index}}" bind:tap="switchCategory">
+        {{item}}
+    </view>
+</view>
+
+    <!-- 商品列表 -->
+    <view class="product-list">
+        <view class="product-column" wx:for="{{filteredProductList}}" wx:key="*this">
+            <view class="product-item" bind:tap="to_goods">
+                <image src="{{item.image}}" class="product-image" mode="aspectFill"></image>
+                <view class="product-info">
+                    <text class="product-name">{{item.name}}</text>
+                    <view class="contain">
+                        <text class="product-price">¥{{item.price}}</text>
+                        <button class="addcar" catchtap="add_to_car">💖</button>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+</view>
+<button class="tocar" bind:tap="to_car">😎</button>
\ No newline at end of file
diff --git a/pages/shop/shop.wxss b/pages/shop/shop.wxss
new file mode 100644
index 0000000..9f1c795
--- /dev/null
+++ b/pages/shop/shop.wxss
@@ -0,0 +1,139 @@
+/* 首页容器 */
+.container {
+    padding: 10px;
+}
+
+/* 轮播图样式 */
+.swiper {
+    width: 100%;
+    height: 200px; /* 根据实际需求调整高度 */
+    margin: 20px;
+}
+
+.slide-image {
+    width: 100%;
+    height: 100%;
+    border-radius: 10px; /* 圆角 */
+}
+
+/* 商品分类Tab栏样式 */
+.tabs {
+    display: flex;
+    width: 100%;
+    flex-wrap: nowrap;
+    background-color: #f8f8f8;
+    border-radius: 5px;
+    height: 40px;
+    margin: 0 0 10px 0;
+}
+
+.tab {
+    text-align: center;
+    width: 100%;
+    height: 100%;
+    line-height: 40px;
+    font-size: 14px;
+    color: #333;
+    cursor: pointer;
+    border-radius: 5px;
+}
+
+.tab.active {
+    color: #ff5722;
+    border-bottom: 2px solid #ff5722;
+}
+
+/* 商品列表样式 */
+.product-list {
+    width: 100%;
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+}
+
+.product-column {
+    width: 48%; /* 两列布局,留出间隙 */
+    box-sizing: border-box;
+    margin-bottom: 20px;
+}
+
+.product-item {
+    width: 100%;
+    border-radius: 10px; /* 圆角 */
+    overflow: hidden;
+    box-shadow: 0 4px 8px rgba(0,0,0,0.1);
+    background-color: #fff;
+}
+
+.product-image {
+    width: 100%;
+    height: 40vmin;
+    object-fit: cover;
+}
+
+.product-info {
+    padding: 15px;
+    display: flex;
+    flex-wrap: wrap;
+    flex-flow: column;
+}
+
+.product-name {
+    font-size: 16px;
+    color: #333;
+    margin-bottom: 10px;
+    white-space: nowrap; /* 防止名称换行 */
+    overflow: hidden; /* 隐藏溢出的文本 */
+    text-overflow: ellipsis; /* 显示省略号 */
+}
+
+.product-price {
+    font-size: 15px;
+    color: #f00;
+}
+
+.contain {
+    height: 100%;
+    width: 100%;
+    display: flex;
+    flex-wrap: nowrap;
+    justify-content: space-between;
+    align-items: center;
+}
+
+/* 定义一个圆形按钮的样式 */
+.addcar {
+    text-align: center;
+    line-height: 30px;
+    width: 30px; /* 按钮宽度 */
+    height: 30px; /* 按钮高度 */
+    background-color: #ffffff; /* 按钮背景颜色 */
+    border-radius: 10px; /* 圆角为50%,使其成为圆形 */
+    color: rgb(255, 255, 255); /* 文字颜色 */
+    font-size: 16px; /* 文字大小 */
+    box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.2); /* 按钮阴影 */
+}
+
+/* 按钮点击时的样式 */
+.addcar:active {
+    background-color: #c9c9c9; /* 点击时的背景颜色 */
+}
+
+.tocar {
+    position: fixed;
+    bottom: 12vh;
+    right: 7vmin;
+    width: 50px;
+    height: 50px;
+    text-align: center;
+    line-height: 50px;
+    background-color: #ffffff; /* 按钮背景颜色 */
+    border-radius: 50%; /* 圆角为50%,使其成为圆形 */
+    color: rgb(255, 0, 0); /* 文字颜色 */
+    font-size: 20px; /* 文字大小 */
+    box-shadow: 0 0px 10px 1px rgba(0, 0, 0, 0.2); /* 按钮阴影 */
+}
+
+.tocar:active {
+    background-color: #c9c9c9; /* 点击时的背景颜色 */
+}
\ No newline at end of file
diff --git a/project.config.json b/project.config.json
new file mode 100644
index 0000000..68baf63
--- /dev/null
+++ b/project.config.json
@@ -0,0 +1,29 @@
+{
+  "compileType": "miniprogram",
+  "libVersion": "trial",
+  "setting": {
+    "coverView": true,
+    "es6": true,
+    "postcss": true,
+    "minified": true,
+    "enhance": true,
+    "showShadowRootInWxmlPanel": true,
+    "packNpmRelationList": [],
+    "babelSetting": {
+      "ignore": [],
+      "disablePlugins": [],
+      "outputPath": ""
+    },
+    "ignoreUploadUnusedFiles": true
+  },
+  "condition": {},
+  "editorSetting": {
+    "tabIndent": "auto",
+    "tabSize": 2
+  },
+  "packOptions": {
+    "ignore": [],
+    "include": []
+  },
+  "appid": "wx8ae8ce848baae8a9"
+}
\ No newline at end of file
diff --git a/project.private.config.json b/project.private.config.json
new file mode 100644
index 0000000..657f0a0
--- /dev/null
+++ b/project.private.config.json
@@ -0,0 +1,7 @@
+{
+  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+  "projectname": "miniprogram-2",
+  "setting": {
+    "compileHotReLoad": true
+  }
+}
\ No newline at end of file
diff --git a/sitemap.json b/sitemap.json
new file mode 100644
index 0000000..ca02add
--- /dev/null
+++ b/sitemap.json
@@ -0,0 +1,7 @@
+{
+  "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
+  "rules": [{
+  "action": "allow",
+  "page": "*"
+  }]
+}
\ No newline at end of file
diff --git a/utils/util.js b/utils/util.js
new file mode 100644
index 0000000..764bc2c
--- /dev/null
+++ b/utils/util.js
@@ -0,0 +1,19 @@
+const formatTime = date => {
+  const year = date.getFullYear()
+  const month = date.getMonth() + 1
+  const day = date.getDate()
+  const hour = date.getHours()
+  const minute = date.getMinutes()
+  const second = date.getSeconds()
+
+  return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
+}
+
+const formatNumber = n => {
+  n = n.toString()
+  return n[1] ? n : `0${n}`
+}
+
+module.exports = {
+  formatTime
+}