微信小程式開發2

nxy777發表於2020-09-29
  1. 改進:使bindGetUserInfo返回所有使用者資訊,建立app物件是得使用者使用者資訊可以隨時讀取

    user.js

    /// miniprogram/pages/user/user.js
    
    //建立一個app物件,可以用app物件獲取app.js中的userInfo
    const app = getApp()
    
    //建立資料庫,初始化資料庫
    const db = wx.cloud.database()
    
    Page({
    
      /**
       * 頁面的初始資料
       */
      data: {
        userPhoto:"../../images/photo/01.jpg",
        nickName:"小喵喵",
        logged:false,
      },
    
    
      // 返回 登陸資訊,userinfo,插入資料庫
      bindGetUserInfo(ev){
        // console.log(ev);
        let userInfo = ev.detail.userInfo;
        if (!this.data.logged && userInfo){
            db.collection('users').add({
              data:{
                userPhoto:userInfo.avatarUrl,
                nickName:userInfo.nickName,
                signature:'',
                phoneNumber:'',
                weixinNumber:'',
                links:0,
                time:new Date()
              }
            }).then((res)=>{
              // console.log(res)
              //doc可以根據id獲取所有資料
              db.collection('users').doc(res._id).get().then((res)=>{
                // console.log(res.data);
                //拷貝物件
                app.userInfo = Object.assign(app.userInfo, res.data);
                //更新使用者頭像
                this.setData({
                    userPhoto:app.userInfo.userPhoto,
                    nickName:app.userInfo.nickName,
                    logged:true
                });
              });
            });
          }
        }
    })
    

    app.js

    //app.js
    App({
      //初始化生命週期
      onLaunch: function () {
        
        if (!wx.cloud) {
          console.error('請使用 2.2.3 或以上的基礎庫以使用雲能力')
        } else {
          wx.cloud.init({
            // env 引數說明:
            //   env 引數決定接下來小程式發起的雲開發呼叫(wx.cloud.xxx)會預設請求到哪個雲環境的資源
            //   此處請填入環境 ID, 環境 ID 可開啟雲控制檯檢視
            //   如不填則使用預設環境(第一個建立的環境)
            // env: 'my-env-id',
            //配置雲開發環境id
            env:'dev-2gzx8hmu754cbff6',
            //追蹤使用者呼叫(在運營分析,使用者訪問中可以看到)
            traceUser: true,
            
          })
        }
    
        this.globalData = {}
        //定義一個全域性資訊,使各個使用者都可以使用使用者資訊
        this.userInfo={}
      }
    })
    
    
  2. 上傳部署雲函式,實現自動登陸

    右鍵雲函式資料夾,上傳並部署,在雲開發環境檢視雲函式是否上傳

    user.js

    // miniprogram/pages/user/user.js
    
    //建立一個app物件,可以用app物件獲取app.js中的userInfo
    const app = getApp()
    
    //建立資料庫,初始化資料庫
    const db = wx.cloud.database()
    
    Page({
    
      /**
       * 頁面的初始資料
       */
      data: {
        userPhoto:"../../images/photo/01.jpg",
        nickName:"小喵喵",
        logged:false,
        // 一開始使用者無法點選登陸
        disabled:true,
      },
    
      /**
       * 生命週期函式--監聽頁面載入
       */
      onLoad: function (options) {
    
      },
    
      /**
       * 生命週期函式--監聽頁面初次渲染完成
       */
      onReady: function () {
        //如果使用者已經登陸過,利用login函式實現自動登陸
        //如果使用者沒有登陸過,則可以點選登陸
          wx.cloud.callFunction({
            //上傳的資料
            name:'login',
            data:{},
          }).then((res)=>{
            console.log(res);
            db.collection('users').where({
              _openid:res.result._openid
            }).get().then((res)=>{
              if(res.data.length){
                app.userInfo = Object.assign(app.userInfo, res.data[0]);
                this.setData({
                  userPhoto:app.userInfo.userPhoto,
                 nickName:app.userInfo.nickName,
                  logged:true
                });
              }else{
                this.setData({
                  disabled : false
                });
              }
    
            });
          });
      },
    }
    })
    
  3. 登陸後實現個人資訊頁面的跳轉,需要使用路由元件navigator

    1. 在pages下建立好其他頁面

    user.wxml

    <!--miniprogram/pages/user/user.wxml-->
    <view class="user">
      <view class="user-info">
        <image src="{{userPhoto}}" />
        <!-- 需要使用 button 來授權登入 -->
        <text wx:if="{{logged}}"> 歡迎你:{{nickName}}</text>
        <!-- bindgetuserinfo函式需要解除安裝js中 -->
        <button wx:else disabled="{{disabled}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">
          微信登入
        </button>
      </view>
    
      <!-- //登陸狀態下才可以讓使用者看見列表 -->
      <view wx:if="{{logged}}" class="userlist">
        <navigator url="../editUserInfo/editUserInfo" open-type="navigate">
          <view class="user-list-item">
            <text>編輯個人資訊</text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
        <navigator url="../friendList/friendList" open-type="navigate">
          <view class="user-list-item">
            <text>檢視好友列表</text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
        <navigator url="../detail/detail" open-type="navigate">
          <view class="user-list-item">
            <text>個人主頁</text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
      </view>
    </view>
    
    

    editUserInfo

    <!--miniprogram/pages/editUserInfo/editUserInfo.wxml-->
    <view class="editUserInfo">
      <navigator url="../head/head" open-type="navigate">
          <view class="editUserInfo-list-item">
            <text>修改頭像</text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
        <navigator url="../head/head" open-type="navigate">
          <view class="editUserInfo-list-item">
            <text>修改暱稱</text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
        <navigator url="../head/head" open-type="navigate">
          <view class="editUserInfo-list-item">
            <text>修改個性簽名</text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
        <navigator url="../head/head" open-type="navigate">
          <view class="editUserInfo-list-item">
            <text>共享位置</text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
        <navigator url="../head/head" open-type="navigate">
          <view class="editUserInfo-list-item">
            <text>設定手機號 <text class="editUserInfo-list-tips">僅好友可見</text></text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
        <navigator url="../head/head" open-type="navigate">
          <view class="editUserInfo-list-item">
            <text>設定微訊號 <text  class="editUserInfo-list-tips">僅好友可見</text></text>
            <text class="iconfont iconarrowRight"></text>
          </view>
        </navigator>
    </view>
    
  4. 修改個人資訊

    1. 修改簽名

      signature.wxml

      <!--miniprogram/pages/editUserInfo/signature/signature.wxml-->
      <button>設定個性簽名</button>
      <input type="text" value="{{signature}}" />
      

      signature.js

      // miniprogram/pages/editUserInfo/signature/signature.js
      
      const app = getApp()
      
      const db = wx.cloud.database()
      
      Page({
      
        /**
         * 頁面的初始資料
         */
        data: {
          signature:''
      
        },
      
       
        /**
         * 生命週期函式--監聽頁面初次渲染完成
         */
        onReady: function () {
          //拿到使用者資訊的值
          this.setData({
            signature:app.userInfo.signature
          });
        },
      
        
        handleText(ev){
          // value就是表單中輸入的值
          let value = ev.detail.value;
          this.setData({
            signature:value
          });
        },
        handleBtn(){
          this.upDateSignature();
        },
        upDateSignature(){
          wx.showLoading({
            title:'更新中'
          })
          db.collection('users').doc(app.userInfo._id).update({
            data:{
              signature:this.data.signature
            }
          }).then((res)=>{
            wx.hideLoading();
            wx.showToast({
              tiltle:'更新成功'
            })
          });
          //  顯示原來的簽名
          app.userInfo.signature = this.data.signature
        }
      })
      
    2. 修改位置

      location.wxml

      <!--miniprogram/pages/editUserInfo/location/location.wxml-->
      <view>
        <text>開始共享位置</text>
        <!-- bindchange改變了按鈕觸發事件方法 -->
        <switch checked="{{islocation}}" bindchange="switchChange"></switch>
      </view>
      
      

      location.js

      // miniprogram/pages/editUserInfo/location/location.js
      const app = getApp()
      
      const db = wx.cloud.database()
      
      Page({
      
        /**
         * 頁面的初始資料
         */
        data: {
          islocation:true
      
        },
      
        /**
         * 生命週期函式--監聽頁面載入
         */
        onLoad: function (options) {
      
        },
      
        /**
         * 生命週期函式--監聽頁面初次渲染完成
         */
        onReady: function () {
          this.setData({
            islocation:app.userInfo.islocation
          });
        },
      
       
        switchChange(ev){
          // console.log(ev.detail.value);
          let value = ev.detail.value
          db.collection('users').doc(app.userInfo._id).update({
            data:{
              islocation:value
            }
          }).then((res)=>{
      
          });
        }
      })
      
    3. 改進:在修改資訊時,讓外部頁面,我的,也發生變化

      使用js中onshow使每次進入頁面都更新資料

      user.js

      /**
         * 生命週期函式--監聽頁面顯示
         */
        onShow: function () {
          this.setData({
            userInfo:app.userInfo.userPhoto,
            nickName:app.userInfo.nickName
          });
        },
      
      
    4. 修改暱稱可以直接使用微信暱稱

    name.wxml

    <!--miniprogram/pages/editUserInfo/name/name.wxml-->
    <button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">
          使用微信暱稱
    </button>
    <button bindtap="handleBtn">自定義暱稱</button>
    <input type="text" value="{{nickName}}" bindinput="handleText"/>
    
    

    name.js

     //使用微信暱稱的函式
      bindGetUserInfo(ev){
        let userInfo = ev.detail.userInfo;
        if (userInfo) {
          this.setData({
            nickName:userInfo.nickName
            // 回撥UpadteNickName函式,之前已經寫好
          },()=>{
            this.UpdateNickName();
          });
    
        }
    
    1. 修改頭像,使用者可以自己上傳頭像修改,wx.chooseImage,

    上傳圖片到雲資料庫uploadFile

    head.wxml

    <!--miniprogram/pages/editUserInfo/location/location.wxml-->
    <button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">
          使用微信頭像
    </button>
    <button bindtap="handleBtn">自定義頭像</button>
    
    <image src="{{userPhoto}}" bindtap="handleUploadImage" />
    

    head.js

    // miniprogram/pages/editUserInfo/head/head.js
    const app = getApp()
    
    const db = wx.cloud.database()
    
    Page({
    
      /**
       * 頁面的初始資料
       */
      data: {
        userPhoto:''
      },
    
      /**
       * 生命週期函式--監聽頁面載入
       */
      onLoad: function (options) {
    
      },
    
      /**
       * 生命週期函式--監聽頁面初次渲染完成
       */
      onReady: function () {
        this.setData({
          userPhoto:app.userInfo.userPhoto
        });
      },
    
      handleUploadImage(){
        wx.chooseImage({
          count: 1,
          sizeType: ['original', 'compressed'],
          sourceType: ['album', 'camera'],
          success :(res)=>{
            // console.log(res);
            // tempFilePath可以作為img標籤的src屬性顯示圖片
            const tempFilePaths = res.tempFilePaths[0];
            //上傳完圖片後顯示出修改後的圖片
            this.setData({
              userPhoto:tempFilePaths
            });
          }
        })
      },
      handleBtn(){
        wx.showLoading({
          title: '上傳中',
        })
        //每次上傳都是一個新路徑
        let cloudPath = "userPhoto/"+app.userInfo._openid + Date.now()+ ".jpg";
        wx.cloud.uploadFile({
          cloudPath,
          filePath: this.data.userPhoto,      
        }).then((res)=>{
          // console.log(res);
          let fileID = res.fileID;
          if (fileID){
            db.collection('users').doc(app.userInfo._id).update({
              data:{
                userPhoto:fileID
              }
            }).then((res)=>{
              wx.hideLoading();
              wx.showToast({
                title: '上傳並更新成功',
              });
              //返回我的時更新我的頭像
              app.userInfo.userPhoto = fileID;  
            });
          }
        });
      },
      //使用微信暱稱的函式
      bindGetUserInfo(ev){
        let userInfo = ev.detail.userInfo;
        if (userInfo) {
          this.setData({
            nickName:userInfo.avatarUrl
            // 回撥UpadteNickName函式,之前已經寫好
          },()=>{
            wx.showLoading({
              title: '上傳中',
            })
            db.collection('users').doc(app.userInfo._id).update({
              data:{
                userPhoto:userInfo.avatarUrl
              }
            }).then((res)=>{
              wx.hideLoading();
              wx.showToast({
                title: '上傳並更新成功',
              });
              //返回我的時更新我的頭像
              app.userInfo.userPhoto = userInfo.avatarUrl;  
            });
          });
        }
      }
    })
    

相關文章