亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

微信小程序+云開發實現歡迎登錄注冊

2019-11-19 11:28:34
字體:
來源:轉載
供稿:網友

前段時間和同學一起做了一個小程序,用來參加學校的比賽,完成后把項目內容分割一下,貼到博客上面,算是學習記錄和總結吧。

因為是學生黨,而且并沒有很大的需要,所以選擇了微信小程序為開發者提供的“云開發”選項。

開發者可以使用云開發開發微信小程序、小游戲,無需搭建服務器,即可使用云端能力。
按照微信的說法:

云開發為開發者提供完整的云端支持,弱化后端和運維概念,無需搭建服務器,使用平臺提供的 API 進行核心業務開發,即可實現快速上線和迭代,同時這一能力,同開發者已經使用的云服務相互兼容,并不互斥。
目前提供三大基礎能力支持:

  • 云函數:在云端運行的代碼,微信私有協議天然鑒權,開發者只需編寫自身業務邏輯代碼
  • 數據庫:一個既可在小程序前端操作,也能在云函數中讀寫的 JSON 數據庫
  • 存儲:在小程序前端直接上傳/下載云端文件,在云開發控制臺可視化管理

首先,開通云開發功能是第一步(默認你已經注冊好了微信小程序賬號而且申請好了一個AppId),經測試,云開發并不能使用測試號,只能使用真實的AppId。

注:AppID 首次開通云環境后,需等待大約 10 分鐘方可正常使用云 API,在此期間官方后臺服務正在做準備服務,如嘗試在小程序中調用云 API 則會報 cloud init error:{ errMsg: “invalid scope” } 的錯誤

新建一個項目

之后新建就行了。

新建的項目已經包含了一個快速開發的Demo,而且含有云函數示例,初始化函數等等,最好可以先看看,熟悉一下。

自帶Demo

首先看一下app.js這個文件:

//app.jsApp({ onLaunch: function () {if (!wx.cloud) { console.error('請使用 2.2.3 或以上的基礎庫以使用云能力')} else { wx.cloud.init({traceUser: true, })}})

wx.cloud.init()為云端環境初始化函數,如果有多個云開發環境則需要指定env參數,如下:

wx.cloud.init({ env: 'test-x1dzi'})

具體可以查看官方文檔:

developers.weixin.qq.com

接下來聲明一些全局數據

//全局數據globalData: {  //用戶ID  userId: '',  //用戶信息  userInfo: null,  //授權狀態  auth: {   'scope.userInfo': false  },  //登錄狀態  logged: false}

最后的樣子是這樣:

//app.jsApp({	//全局數據	globalData: {  	//用戶ID	  userId: '',	  //用戶信息	  userInfo: null,	  //授權狀態	  auth: {	   'scope.userInfo': false	  },	  //登錄狀態	  logged: false	},	onLaunch: function() {		if (!wx.cloud) {			console.error('請使用 2.2.3 或以上的基礎庫以使用云能力')		} else {			wx.cloud.init({				traceUser: true,				env: 'winbin-2hand'			})		}	}})

注意將env參數換成你自己的云開發環境。

把Pages目錄下的除index外的文件夾刪除。

并且在app.json中的Pages字段中下僅保留index項:

app.json

{	"pages": [	"pages/index/index"	],	"window": {		"backgroundColor": "#F6F6F6",		"backgroundTextStyle": "light",		"navigationBarBackgroundColor": "#F6F6F6",		"navigationBarTitleText": "云開發 QuickStart",		"navigationBarTextStyle": "black",		"navigationStyle": "custom"	},	"sitemapLocation": "sitemap.json"}

頁面文件內容如下:

index.wxml

<view class='container'> <open-data class="avs" type="userAvatarUrl"></open-data> <view class='username'>  <text>Hello </text>  <open-data type="userNickName"></open-data> </view> <button hidden='{{hiddenButton}}' class='moto-container' open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="onGotUserInfo">  <text class='moto'> 開啟小程序之旅</text> </button></view> 

因為微信小程序聲稱wx.getUserInfo(Object object)在以后將不再支持,這里使用另一種方式來顯示用戶的信息。

標簽<open-data type=""></open-data>可以用來顯示用戶的一些信息

<open-data type="userAvatarUrl"></open-data>顯示用戶的頭像

<open-data type="userNickName"></open-data>顯示用戶的昵稱

詳情可以查看:wx.getUserInfo中的示例代碼部分

頁面樣式如下:

index.wxss

page { width: 100%; height: 100%;}.container { background: url('https://wallpapers.wallhaven.cc/wallpapers/full/wallhaven-758991.png'); background-size: 400vw 100vh; width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center;}.avs { opacity: 0.9; width: 200rpx; height: 200rpx; margin-top: 160rpx;}.username { font-size: 32rpx; font-weight: bold; margin-top: 200rpx;}.moto-container { line-height: normal; border: 1px solid #450f80; width: 200rpx; height: 80rpx; border-radius: 5px; text-align: center; margin-top: 200rpx; padding: 0px; outline: none;}.moto { font-size: 22rpx; font-weight: bold; line-height: 80rpx; text-align: center; color: #450f80;}

這里使用了全屏背景

效果如下:

在這里插入圖片描述

#接下來是js腳本#

首先說一下思路

流程圖如下

在這里插入圖片描述

接下來是index.js

const app = getApp();Page({ /**  * 頁面的初始數據  */ data: {  hiddenButton: true }, /**  *從云端獲取資料  *如果沒有獲取到則嘗試新建用戶資料  */ onGotUserInfo: function(e) {  var _this = this  //需要用戶同意授權獲取自身相關信息  if (e.detail.errMsg == "getUserInfo:ok") {   //將授權結果寫入app.js全局變量   app.globalData.auth['scope.userInfo'] = true   //嘗試獲取云端用戶信息   wx.cloud.callFunction({    name: 'get_setUserInfo',    data: {     getSelf: true    },    success: res => {     if (res.errMsg == "cloud.callFunction:ok")      if (res.result) {       //如果成功獲取到       //將獲取到的用戶資料寫入app.js全局變量       console.log(res)       app.globalData.userInfo = res.result.data.userData       app.globalData.userId = res.result.data._id       wx.switchTab({        url: '/pages/home/home'       })      } else {       //未成功獲取到用戶信息       //調用注冊方法       console.log("未注冊")       _this.register({        nickName: e.detail.userInfo.nickName,        gender: e.detail.userInfo.gender,        avatarUrl: e.detail.userInfo.avatarUrl,        region: ['none', 'none', 'none'],        campus: "none",        studentNumber: "none",       })      }    },    fail: err => {     wx.showToast({      title: '請檢查網絡您的狀態',      duration: 800,      icon: 'none'     })     console.error("get_setUserInfo調用失敗", err.errMsg)    }   })  } else   console.log("未授權") }, /**  * 注冊用戶信息  */ register: function(e) {  let _this = this  wx.cloud.callFunction({   name: 'get_setUserInfo',   data: {    setSelf: false,    userData: e   },   success: res => {    if (res.errMsg == "cloud.callFunction:ok" && res.result) {     _this.setData({      hiddenButton: true     })     app.globalData.userInfo = e     app.globalData.userId = res.result._id     _this.data.registered = true     app.getLoginState()     console.log(res)     wx.navigateTo({      url: '/pages/mine/info/info'     })    } else {     console.log("注冊失敗", res)     wx.showToast({      title: '請檢查網絡您的狀態',      duration: 800,      icon: 'none'     })    }   },   fail: err => {    wx.showToast({     title: '請檢查網絡您的狀態',     duration: 800,     icon: 'none'    })    console.error("get_setUserInfo調用失敗", err.errMsg)   }  }) }, /**  * 生命周期函數--監聽頁面加載  */ onLoad: function() {  let _this = this  //需要用戶同意授權獲取自身相關信息  wx.getSetting({   success: function(res) {    if (res.authSetting['scope.userInfo']) {     //將授權結果寫入app.js全局變量     app.globalData.auth['scope.userInfo'] = true     //從云端獲取用戶資料     wx.cloud.callFunction({      name: 'get_setUserInfo',      data: {       getSelf: true      },      success: res => {       if (res.errMsg == "cloud.callFunction:ok" && res.result) {        //如果成功獲取到        //將獲取到的用戶資料寫入app.js全局變量        console.log(res)        app.globalData.userInfo = res.result.data.userData        app.globalData.userId = res.result.data._id        wx.switchTab({         url: '/pages/home/home'        })       } else {        _this.setData({         hiddenButton: false        })        console.log("未注冊")       }      },      fail: err => {       _this.setData({        hiddenButton: false       })       wx.showToast({        title: '請檢查網絡您的狀態',        duration: 800,        icon: 'none'       })       console.error("get_setUserInfo調用失敗", err.errMsg)      }     })    } else {     _this.setData({      hiddenButton: false     })     console.log("未授權")    }   },   fail(err) {    _this.setData({     hiddenButton: false    })    wx.showToast({     title: '請檢查網絡您的狀態',     duration: 800,     icon: 'none'    })    console.error("wx.getSetting調用失敗", err.errMsg)   }  }) }})

下面是云函數配置

根據傳入的參數:update ,getSelf ,setSelf ,getOthers

分別執行:更新用戶信息,獲取自身信息,設置自身信息,獲取其他用戶信息 四種操作。

此函數需要使用npm添加md5模塊,用來加密用戶openid并將其存放在數據庫中

// clouldfunctions/get_setUserInfo/package.json{ "name": "get_setUserInfo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": {  "test": "echo /"Error: no test specified/" && exit 1" }, "author": "", "license": "ISC", "dependencies": {  "wx-server-sdk": "latest",  "md5-node": "latest" }} 
// clouldfunctions/get_setUserInfo/index.jsconst cloud = require('wx-server-sdk')const md5 = require('md5-node')//cloud.init()cloud.init({ traceUser: true, env: 'winbin-2hand'})const db = cloud.database()const usersTable = db.collection("users")const _ = db.command// 云函數入口函數exports.main = async(event, context) => { console.log(event) const wxContext = cloud.getWXContext() //更新當前信息 if (event.update == true) {  try {   return await usersTable.doc(md5(wxContext.OPENID)).update({    data: {     userData: _.set(event.userData)    },   })  } catch (e) {   console.error(e)  } } else if (event.getSelf == true) {  //獲取當前用戶信息  try {   return await usersTable.doc(md5(wxContext.OPENID)).field({    openid: false   }).get()  } catch (e) {   console.error(e)  } } else if (event.setSelf == true) {  //添加當前用戶信息  try {   return await usersTable.add({    data: {     _id: md5(wxContext.OPENID),     openid: wxContext.OPENID,     userData: event.userData,     boughtList: [],     messageList: [],     ontransList: []    }   })  } catch (e) {   console.error(e)  } } else if (event.getOthers == true) {  //獲取指定用戶信息  try {   return await usersTable.doc(event.userId).field({    userData: true   }).get()  } catch (e) {   console.error(e)  } }}

數據庫數據形式:

在這里插入圖片描述

至此就全部完成了。有需要的可以到github上查看:github:john-tito

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久app| 国产精品jvid在线观看蜜臀| 国产一级揄自揄精品视频| 亚洲韩国日本中文字幕| 国产婷婷色综合av蜜臀av| 欧美午夜激情小视频| 亚洲人成啪啪网站| 91精品久久久久久久久不口人| 少妇高潮久久77777| 欧美黑人一级爽快片淫片高清| 久久精品福利视频| 亚洲精品福利在线| 欧美性xxxxx极品| 欧美在线精品免播放器视频| 欧美裸体视频网站| 亚洲va欧美va国产综合剧情| 日韩高清欧美高清| 亚洲影视九九影院在线观看| 欧美性猛交xxxx免费看| 久久亚洲精品中文字幕冲田杏梨| 日韩成人中文字幕在线观看| 日韩资源在线观看| 欧洲亚洲免费在线| 成人免费视频a| 日本三级韩国三级久久| 精品人伦一区二区三区蜜桃网站| 久久夜色撩人精品| 国产精品色悠悠| 欧美性xxxx极品hd满灌| 最新91在线视频| 一区二区三区视频免费在线观看| 亚洲影影院av| 中文在线资源观看视频网站免费不卡| 日韩电影免费在线观看中文字幕| 一区二区国产精品视频| 亚洲精品美女网站| 亚洲成人精品久久久| 亚洲国产精品嫩草影院久久| 国产在线拍偷自揄拍精品| 日本久久久久亚洲中字幕| 高跟丝袜一区二区三区| 久久人人爽人人| 国产91免费观看| 日韩国产高清污视频在线观看| 国产精品日日做人人爱| 欧美成人手机在线| 欧美资源在线观看| 色婷婷久久一区二区| 亚洲精品国产拍免费91在线| 亚洲第一区中文99精品| 亚洲欧洲激情在线| 成人h片在线播放免费网站| 久久精品91久久香蕉加勒比| 精品久久久久久久久中文字幕| 成人激情电影一区二区| 国产99久久精品一区二区 夜夜躁日日躁| 欧美视频二区36p| 亚洲欧美日韩一区二区在线| 日韩69视频在线观看| 精品久久久久久久久久久久久久| 中日韩美女免费视频网址在线观看| 欧美日韩国产一区在线| 午夜精品一区二区三区在线视频| 日韩av中文在线| 91精品国产电影| 国产精品国模在线| 欧洲s码亚洲m码精品一区| xxx一区二区| 欧美一级电影免费在线观看| 日韩va亚洲va欧洲va国产| 日韩av综合网| 成人国内精品久久久久一区| 国产在线日韩在线| 91精品国产成人| 欧美国产亚洲精品久久久8v| 91亚洲国产成人久久精品网站| 91日本在线视频| 秋霞av国产精品一区| 中文国产成人精品| 国产ts一区二区| 国产精品久久久久久久久男| 欧美日韩国产在线看| 日韩欧美在线视频免费观看| 国内精品久久久久伊人av| 久久久久国产精品一区| 亚洲自拍偷拍在线| 国产精品久久久久久久午夜| 国产日韩在线一区| 社区色欧美激情 | 精品少妇v888av| 亚洲一区第一页| 久久中文字幕在线视频| 久久久久久久久91| 亚洲欧美国产va在线影院| 国产综合香蕉五月婷在线| 一区二区三区视频免费在线观看| 国产精品高清在线| 亚洲欧美色婷婷| 国产精品爱久久久久久久| 国产色婷婷国产综合在线理论片a| 国产一区二区精品丝袜| 日韩一区二区久久久| 国产日韩欧美中文在线播放| 福利视频导航一区| 69av在线视频| 亚洲国产成人精品一区二区| 欧美午夜精品久久久久久久| 亚洲精品视频在线播放| 少妇激情综合网| 日韩精品视频观看| 色老头一区二区三区在线观看| 2020国产精品视频| 91精品久久久久久久久| 欧美成人午夜视频| 亚洲欧美精品在线| 国产一区二区三区在线观看视频| 韩日欧美一区二区| 美女av一区二区三区| 91av在线网站| 亚洲视频免费一区| 北条麻妃99精品青青久久| 欧美乱人伦中文字幕在线| 欧美精品一本久久男人的天堂| 最近2019中文字幕第三页视频| 中文字幕日韩欧美精品在线观看| 欧美专区福利在线| 啪一啪鲁一鲁2019在线视频| 亚洲欧洲在线视频| 日韩国产欧美精品在线| 欧美大奶子在线| 日韩视频免费中文字幕| 久久久999精品视频| 精品动漫一区二区| 久久深夜福利免费观看| 日本成人黄色片| 欧洲精品在线视频| 欧美韩日一区二区| 日韩欧美国产中文字幕| 亚洲精品xxxx| 欧美裸体xxxx| 国产精品日韩在线观看| 91在线观看免费观看| 日韩美女视频免费看| 国产日韩在线免费| 亚洲第一二三四五区| 亚洲精品美女久久久久| 国内精品久久久久影院优| 色av吧综合网| 国产精品久久久久国产a级| 久久久久久久久久久久久久久久久久av| 亚洲奶大毛多的老太婆| 91在线观看免费观看| 亚洲精品国精品久久99热一| 国产在线高清精品| 庆余年2免费日韩剧观看大牛| 亚洲欧美三级在线| 欧美视频在线观看免费网址| 日本成人精品在线| 91精品国产91久久久久福利| 久久久视频精品| 亚洲乱码av中文一区二区| 日韩视频永久免费观看| 亚洲精品自产拍| 亚洲福利视频网|