欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

小程序云開發(fā)實(shí)現(xiàn)一個(gè)投票應(yīng)用 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 小程序相關(guān) >

小程序云開發(fā)實(shí)現(xiàn)一個(gè)投票應(yīng)用

發(fā)表時(shí)間:2021-4-6

發(fā)布人:葵宇科技

瀏覽次數(shù):76

 因?yàn)樽罱雽?shí)踐一下小程序的云開發(fā)能力,于是設(shè)計(jì)開發(fā)了一個(gè)簡(jiǎn)單的投票應(yīng)用,歡迎感興趣的一起學(xué)習(xí)交流。代碼倉(cāng)庫(kù)https://github.com/luosijie/m...由于小程序【個(gè)人開發(fā)者】不開放【投票】類目,所以就不能在線預(yù)覽 ...

 

 
 
 
因?yàn)樽罱雽?shí)踐一下小程序的云開發(fā)能力,于是設(shè)計(jì)開發(fā)了一個(gè)簡(jiǎn)單的投票應(yīng)用,歡迎感興趣的一起學(xué)習(xí)交流。

代碼倉(cāng)庫(kù) https://github.com/luosijie/m...

由于小程序【個(gè)人開發(fā)者】不開放【投票】類目,所以就不能在線預(yù)覽了,我放幾張應(yīng)用的截圖

數(shù)據(jù)庫(kù)設(shè)計(jì)

總共用到了3個(gè)集合

1. users (用戶集合)

基本上直接保存用用戶的userInfo數(shù)據(jù)

{   "_id":"023ce9555ff068de0314b5521c313ee6",   "OPENID":"oZK45EoiyFzv...7R64I",   "nickName":"LSJ",   "gender":1,   "language":"zh_CN",   "city":"Xiamen",   "province":   "Fujian",   "country":"China",   "avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTL9lhZHZdYsMx3mjhZZYbbE5OZhUqUefNtsibkhdrSTIdpdhzv34lYHXtafMjuoibJ8JwTj5VM76CkA/132" } 

2. votes (投票集合)

{   "_id":"21ded5cb5ff5f0530407988a4e8f18a5", // 唯一id   "creator":"o-ZK45EoiyFzvevQyQTSZUV7R64I", // 發(fā)起人   "title":"阿斯頓大的as da", // 標(biāo)題   "desc":"阿斯頓阿斯頓", // 描述   "startTime":"2021-1-7", // 開始日期   "endTime":"2021-1-8", // 結(jié)束日期   "state":"ing" // 狀態(tài) }

3. options (選項(xiàng)集合)

{   "_id":"be7fb3985ff5f05403068303431d580b", // 唯一id   "vote_id":"21ded5cb5ff5f0530407988a4e8f18a5", // 選項(xiàng)對(duì)應(yīng)的投票_id   "title":"阿斯頓大的大的", // 標(biāo)題   "desc":"撒打算的灑大地上阿斯頓", // 描述   "image":"http://tmp/2jVXjjLScAyNf0dffe2c5fc6479bee73fe954b64a3e7.png", // 配圖   "users":["o-ZK45EoiyFzvevQyQTSZUV7R64I"] // 該選項(xiàng)的投票者 }

云函數(shù)開發(fā)

總共寫了6個(gè)云函數(shù)

1. addRecord 新增投票記錄

/**  * 新增投票記錄  * @param {String} title 標(biāo)題  * @param {String} desc 描述  * @param {String} startTime 開始日期  * @param {String} endTime 結(jié)束日期  * @param {String} anonymous 匿名  * @param {String} min 允許小投票數(shù)  * @param {String} max 允許最大投票數(shù)  * @param {String} type 投票類型:normal; pk  * @returns {Object} 包含投票_id  */ const cloud = require('wx-server-sdk') cloud.init({   env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database()  exports.main = async (event, context) => {   const wxContext = cloud.getWXContext()   const voteCollection = db.collection('votes')   const data = {     creator: wxContext.OPENID, // 發(fā)起人     title: event.title,     desc: event.desc,     startTime: event.startTime,     endTime: event.endTime,     anonymous: event.anonymous,     min: event.min,     max: event.max,     type: event.type,     state: 'ing'   }   // 集合投票votes:新增記錄   const res = await voteCollection.add({     data   })   // 集合選項(xiàng)options: 新增記錄   const options = event.options   const optionCollection = db.collection('options')   const optionPromise = options.map( ele => {     const option = {       vote_id: res._id,       ...ele     }     return optionCollection.add({       data: option     })   })   let resOptions = await Promise.all(optionPromise)   resOptions = resOptions.map(e =>  e._id)   // 返回投票結(jié)果   return {     success: true,     message: '新增投票成功',     ...res   } } 

2.getRecordDetail 獲取投票詳情

/**  * 獲取投票詳情  * @param {String} _id 投票_id  * @return {Object} 投票數(shù)據(jù)  */ const cloud = require('wx-server-sdk') cloud.init({   env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database()  exports.main = async (event, context) => {   const _id = event._id   const OPENID = cloud.getWXContext().OPENID   // 查找集合中的投票數(shù)據(jù)   const voteCollection = db.collection('votes')   // 聚合聯(lián)表查詢   const voteQuery = await voteCollection   .aggregate()   .match({ _id })   .lookup({     from: 'users',     localField: 'creator',     foreignField: 'OPENID',     as: 'creator'   })   .end()   let vote = {}   if (voteQuery && voteQuery.list.length) {     vote = voteQuery.list[0]     vote.creator = vote.creator[0]     // 判斷是否當(dāng)前投票的發(fā)起人     vote.isOwner = vote.creator.OPENID === OPENID      // 查找集合中的選項(xiàng)數(shù)據(jù)     const optionsCollection = db.collection('options')     const optionsQuary = await optionsCollection     .aggregate()     .match({ vote_id: _id })     .lookup({       from: 'users',       localField: 'users',       foreignField: 'OPENID',       as: 'users'     })     .end()     vote.options = optionsQuary.list     // 統(tǒng)計(jì)已經(jīng)投票的人數(shù)     let votedTotal = 0     vote.options.forEach(e => {       if (e.users && e.users.length) {         votedTotal += e.users.length       }     })     vote.votedTotal = votedTotal     // 計(jì)算當(dāng)前投票的狀態(tài)     if (vote.state !== 'end') {       // 未開始       if (new Date().getTime() < new Date(vote.startTime).getTime()) {         vote.state = 'pre'       }       // 已過(guò)期 = 已結(jié)束       if (new Date().getTime() > new Date(vote.endTime).getTime()) {         vote.state = 'end'       }     }     return {       success: true,       data: vote     }   } else {     return {       success: false,       message: '找不到投票信息'     }   } } 

3. vote 投票操作

/**  * 投票操作  * @param {String} voteId 投票_id  * @param {String} optionId 選項(xiàng)_id  * @return {Object} 投票結(jié)果  */ const cloud = require('wx-server-sdk') cloud.init({   env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database()  exports.main = async (event, context) => {   const _id = event.optionId   const vote_id = event.voteId   const OPENID = cloud.getWXContext().OPENID   // 獲取當(dāng)前投票數(shù)據(jù)對(duì)應(yīng)的所有選項(xiàng)數(shù)據(jù)   const options = db.collection('options')   let voteOptions = await options.where({ vote_id }).get()   voteOptions = voteOptions.data   // 判斷用戶是否投過(guò)票   let curOptionUsers = []   for (let i = 0; i < voteOptions.length; i++) {     // 找到選項(xiàng)中所有投過(guò)票的用戶     const users = voteOptions[i].users     if (users && users.length) {       if (voteOptions[i]._id === _id) {         curOptionUsers = users       }       if (users && users.length) {         // OPENID重復(fù)-說(shuō)明已經(jīng)投過(guò)票->直接返回         if (users.indexOf(OPENID) > -1) {           return {             success: false,             message: '您已經(jīng)投過(guò)票了'           }         }       }     }   }   // 沒有投票->將當(dāng)前用戶OPENID插入到對(duì)應(yīng)的字段   curOptionUsers.push(OPENID)   const res = await options.where({ _id }).update({     data: {       users: curOptionUsers     }   })   return {     success: true,     data: res,     message: '投票成功'   } } 

4. getRecordPage 獲取我的投票記錄分頁(yè)

/**  * 獲取我的投票記錄分頁(yè)  * @param {Number} no 頁(yè)碼  * @param {Number} size 頁(yè)數(shù)  * @return {Object} 投票數(shù)據(jù)列表和總數(shù)  */ const cloud = require('wx-server-sdk') cloud.init({   env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database()  exports.main = async (event, context) => {   const wxContext = cloud.getWXContext()   const size = event.size   //獲取接口參數(shù)   const no = event.no   const OPENID = wxContext.OPENID   const voteCollection = db.collection('votes')   // 查找集合中的投票數(shù)據(jù)   const votes = await voteCollection.aggregate()   .match({     creator: OPENID   })   .lookup({     from: 'options',     localField: '_id',     foreignField: 'vote_id',     as: 'options'   })   .sort({     _id: -1   })   .skip((no - 1) * size)   .limit(size)   .end()   // 計(jì)算總數(shù)   const total = await voteCollection.count()   let data = votes.list   // 計(jì)算投票狀態(tài)   if (data.length) {     data = data.map(e => {       if (e.state !== 'end') {         // 未開始         if (new Date().getTime() < new Date(e.startTime).getTime()) {           e.state = 'pre'         }         // 已過(guò)期 = 已結(jié)束         if (new Date().getTime() > new Date(e.endTime).getTime()) {           e.state = 'end'         }       }       // 統(tǒng)計(jì)已投票人數(shù)       let votedTotal = 0       const options = e.options       options.forEach(o => {         if (o.users && o.users.length) {           votedTotal += o.users.length         }       })       delete e.options       return {         ...e,         votedTotal       }     })   }   return {     total,     data   } } 

5. login 登錄注冊(cè)

/**  * 登錄注冊(cè)  * @param {String} OPENID 從cloud.getWXContext()中獲取  * @return {Object} 用書數(shù)據(jù)  */ const cloud = require('wx-server-sdk') cloud.init({   env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database()  exports.main = async (event, context) => {   const wxContext = cloud.getWXContext()   // 查找集合中的用戶數(shù)據(jù)   const userCollection = db.collection('users')   const users = await userCollection.where({ OPENID: wxContext.OPENID }).get()   let user   if (users && users.data.length) {     // 用戶已經(jīng)存在-直接賦值用戶數(shù)據(jù)     user = users.data[0]   } else {     // 新用戶-向數(shù)據(jù)庫(kù)插入用戶數(shù)據(jù)     user = {       OPENID: wxContext.OPENID,       ...event.userInfo     }     await userCollection.add({       data: user     })   }   // 返回用戶數(shù)據(jù)-前端用來(lái)緩存   return {     ...user   } } 

6. checkImage 校驗(yàn)圖片合法性

 /**  * 校驗(yàn)圖片合法性  * @param {*} event.fileID 微信云存儲(chǔ)的圖片ID  * @return {Number} 0:校驗(yàn)失敗;1:校驗(yàn)通過(guò)  */ const cloud = require('wx-server-sdk') cloud.init({   env: cloud.DYNAMIC_CURRENT_ENV }) exports.main = async (event, context) => {   const contentType = 'image/png'   const fileID = event.fileID   try {     // 根據(jù)fileID下載圖片     const file = await cloud.downloadFile({       fileID     })     const value = file.fileContent     // 調(diào)用 imgSecCheck 借口,校驗(yàn)不通過(guò)接口會(huì)拋錯(cuò)     // 必要參數(shù) media { contentType, value }     const result = await cloud.openapi.security.imgSecCheck({       media: {         contentType,         value       }     })     return 1   } catch (err) {     return 0   } }

前端開發(fā)

這次小程序端的開發(fā)

采用的是 滴滴前端團(tuán)隊(duì)出品的 mpx 框架

因?yàn)閁I比較簡(jiǎn)單

這里就不貼代碼了

感興趣的歡迎前往 https://github.com/luosijie/m... 了解

相關(guān)案例查看更多