用小程序·云开发两天搭建mini论坛丨实战

笔者最近涉猎了小程序相关的知识,于是利用周末时间开发了一款类似于同事的小程序,深度体验了小程序云开发模式提供的云函数、数据库、存储三大能力。关于云开发,可参考文档:小程序·云开发。

个人感觉云开发带来的最大好处是鉴权流程的简化和对后端的弱化,所以像笔者这种从未接触过小程序开发的人也能够在周末两天时间内开发出一个功能完备、体验闭环的勉强能用的产品。

最后,本文并不是搬运官方文档,也不会详细介绍开发工具和云开发后台的使用,所以建议结合上面给出文档链接一起消化本文。

功能分析

FkduQg.gif

该小程序功能目前较为简单(发布帖子、浏览帖子、发布评论),可用下图表示,无需赘述:

FkdVFP.png

由架构图可知,云开发的数据库(存帖子、存评论)、存储(图片)、云函数(读、写、更新数据库等)都将涉及,很好地达到了练手的目的

发布帖子

如果帖子不带图片,直接写数据库即可,如果带图片则需要先存入图片到云开发提供的存储中,拿到返回的fileId(可理解为图片的url)再一并写入数据库,核心代码:

    for (let i = 0; i < img_url.length; i++) {var str = img_url[i];var obj = str.lastIndexOf("/");var fileName = str.substr(obj + 1)console.log(fileName)wx.cloud.uploadFile({cloudPath: 'post_images/' + fileName,//必须指定文件名,否则返回的文件id不对filePath: img_url[i], // 小程序临时文件路径success: res => {// get resource ID: console.log(res)//把上传成功的图片的地址放入数组中img_url_ok.push(res.fileID)//如果全部传完,则可以将图片路径保存到数据库if (img_url_ok.length == img_url.length) {console.log(img_url_ok)that.publish(img_url_ok)}},fail: err => {// handle errorconsole.log('fail: ' + err.errMsg)}})}  

通过img_url_ok.length == img_url.length我们确定所有图片已经上传完成并返回了对应的id,然后执行写入数据库的操作:

/*** 执行发布时图片已经上传完成,写入数据库的是图片的fileId*/publish: function(img_url_ok) {wx.cloud.init()wx.cloud.callFunction({name: 'publish_post',data: {openid: app.globalData.openId,// 这个云端其实能直接拿到author_name: app.globalData.userInfo.nickName,content: this.data.content,image_url: img_url_ok,publish_time: "",update_time: ""//目前让服务器自己生成这两个时间},success: function (res) {// 强制刷新,这个传参很粗暴var pages = getCurrentPages();             //  获取页面栈var prevPage = pages[pages.length - 2];    // 上一个页面prevPage.setData({update: true})wx.hideLoading()wx.navigateBack({delta: 1})},fail: console.error})},

通过wx.cloud.callFunction我们调用了一个云函数(通过name指定函数名),并将帖子内容content和图片image_url以及其他信息(发布者昵称、id等)一并传到云端。然后再看看这个云函数:

exports.main = async (event, context) => {try {return await db.collection('post_collection').add({// data 字段表示需新增的 JSON 数据data: {// 发布时小程序传入//author_id: event.openid,不要自己传,用sdk自带的author_id: event.userInfo.openId,author_name: event.author_name,content: event.content,image_url: event.image_url,// 服务器时间和本地时间会造成什么影响,需要评估publish_time: new Date(),// update_time: event.update_time,// 最近一次更新时间,发布或者评论触发更新,目前用服务器端时间update_time: new Date(),// 默认值,一些目前还没开发,所以没设置// comment_count: 0,//评论数,直接读数据库,避免两个数据表示同一含义watch_count: 3,//浏览数// star_count: 0,//TODO:收藏人数}})} catch (e) {console.error(e)}
}

可以看到,云函数写入了一条数据库记录,我们的参数通过event这个变量带了进来。

获取帖子列表

所谓获取帖子列表其实就是读上一节写入的数据库,但是我们并不需要全部信息(例如图片url),并且要求按照时间排序,如果熟悉数据库的话,会发现这又是一条查询语句罢了:

exports.main = async (event, context) => {return {postlist: await db.collection('post_collection').field({// 指定需要返回的字段_id: true,author_name: true,content: true,title: true,watch_count: true}).orderBy('update_time', 'desc').get(),//指定排序依据}
}

浏览帖子内容

浏览帖子内容及给定一个帖子的id,由帖子列表点击时带入:

  onItemClick: function (e) {console.log(e.currentTarget.dataset.postid)wx.navigateTo({url: '../postdetail/postdetail?postid=' + e.currentTarget.dataset.postid,})},

然后在云函数中根据这个id拿到全部数据:

exports.main = async (event, context) => {return {postdetail: await db.collection('post_collection').where({_id: event.postid}).get(),}
}

拿到全部数据后,再根据图片id去加载贴子的图片:

    // 获取内容wx.cloud.callFunction({// 云函数名称 name: 'get_post_detail',data: {postid: options.postid},success: function (res) {var postdetail = res.result.postdetail.data[0];that.setData({detail: postdetail,contentLoaded: true})that.downloadImages(postdetail.image_url)},fail: console.error})

这里that.downloadImages(postdetail.image_url)即加载图片:

  /*** 从数据库获取图片的fileId,然后去云存储下载,最后加载出来*/downloadImages: function(image_urls){var that = thisif(image_urls.length == 0){return} else {var urls = []for(let i = 0; i < image_urls.length; i++) {wx.cloud.downloadFile({fileID: image_urls[i],success: res => {// get temp file pathconsole.log(res.tempFilePath)urls.push(res.tempFilePath)if (urls.length == image_urls.length) {console.log(urls)that.setData({imageUrls: urls,imagesLoaded: true})}},fail: err => {// handle error}})}}},

发表评论

发表评论和发布帖子逻辑类似,只是写入的数据不同,不做赘述。

总结

前面说过,云开发弱化了后端(简化鉴权本质也是弱化后端),这样带来的好处就是提高了开发效率,因为前后端联调向来都是一件耗时间的事情,而且小程序本身主打的就
是小型应用,实在没有必要引入过多的开发人员。但云开发也不是万能的,例如我一开始想做RSS阅读器,那么后端就需要聚合信息,目前云开发还做不了。

个人感觉只要是信息类的小程序,如新闻类、视频类,云开发目前都很乏力,因为数据库的支持还过于简陋(也可能是我太菜,没发现很好的解决办法,欢迎拍砖)。但如果是本文提及的这种用户自己也会产生信息的小程序,那么云开发则会有开发效率上的优势。

最后就是云开发目前提供的2G数据库和5G存储,对于一些用户量较多的小程序是否足够也是个问题,目前也没见有付费版。

总的类说,初次接触小程序开发,还是发现有不少值得借鉴学习之处。

源码链接

https://github.com/TencentCloudBase/Good-practice-tutorial-recommended

如果你有关于使用云开发CloudBase相关的技术故事/技术实战经验想要跟大家分享,欢迎留言联系我们哦~比心!

1649686-20190823143946565-224460038.png

转载于:https://www.cnblogs.com/CloudBase/p/11399923.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shiro学习(14):springMVC结合shiro完成认证

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3…

mysql聚合函数rollup和cube

转:https://blog.csdn.net/liuxiao723846/article/details/48970443 一、with rollup&#xff1a; with rollup 通常和group by 语句一起使用&#xff0c;是根据维度在分组的结果集中进行聚合操作。——对group by的分组进行汇总。 假设用户需要对N个纬度进行聚合查询操作&am…

在C#里,如何执行cmd里的常用dos命令 (转)

http://blogger.org.cn/blog/more.asp?namenrzj&id4280 using System; using System.Diagnostics; namespace Tipo.Tools.Utility { /// <summary> /// 常用Dos命令操作 /// </summary> public class DosCommand { private Process processnull; pri…

Spring Boot----监控管理

用来监控spring 项目信息的 1、创建项目 1.1 启动项目 转载于:https://www.cnblogs.com/yanxiaoge/p/11400734.html

shiro学习(15):使用注解实现权限认证和后台管理

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3…

什么是索引?索引类型有几种,各有什么特点?

转发: 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;例如 employee 表的姓&#xff08;name&#xff09;列。如果要按姓查找特定职员&#xff0c;与必须搜索表中的所有行相比&#xff0c;索引会帮助您更快地获得该信息。 索引是一个单独的、物理的数据库结…

设置Netbeans 6.5为英文界面

进入netbeans 6.5/etc目录&#xff0c;编辑netbeans.conf文件&#xff0c;将其中的#command line switchs下面那行添加启动参数&#xff1a; -J-Duser.languagezh -J-Duser.countryUS变为&#xff1a;netbeans_default_options"-J-client -J-Xss2m -J-Xms32m -J-XX:PermSi…

用小程序·云开发打造功能全面的博客小程序丨实战

用小程序云开发将博客小程序常用功能“一网打尽” 本文介绍mini博客小程序的详情页的功能按钮如何实现&#xff0c;具体包括评论、点赞、收藏和海报功能&#xff0c;这里记录下整个实现过程和实际编码中的一些坑。 评论、点赞、收藏功能 实现思路 实现文章的一些操作功能&#…

shiro学习(16):使用注解实现权限认证和后台管理二

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

Javascript玩转Prototype(一)——先谈C#原型模式

在《Javascript玩转继承&#xff08;二&#xff09;》中&#xff0c;我使用了原型继承法来实现Javascript的继承&#xff0c;那原型究竟奥秘何在。在这篇文章中&#xff0c;我就主要针对原型来展开讨论。 抛开Javascript&#xff0c;我们先来看我们熟悉的常规的面向对象语言。…

hive的row_number()、rank()和dense_rank()的区别以及具体使用

参考:https://blog.csdn.net/qq_20641565/article/details/52841345?locationNum5&fps1 2016年10月17日 20:05:21 阅读数&#xff1a;4931 row_number()、rank()和dense_rank()这三个是hive内置的分析函数&#xff0c;下面我们来看看他们的区别和具体的使用案例。 首先…

HDU 1176 免费馅饼 (动态规划、另类数塔)

免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 76293 Accepted Submission(s): 26722 Problem Description 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉…

shiro学习(17):easyui布局测试

工具sublime <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><link href"themes/black/easyui.css" rel"stylesheet" /><link href"themes…

细节差距

2008年过去的了&#xff0c;到现在还是没有空出时间来好好的来写下日志&#xff0c;不是自己没有时间而是自己知道可是由于自己的懒惰一直在推&#xff0c;导致的结果是所有需要做的时间一直在推。 人生路上也许很多时候你有很多的选择&#xff0c;在面临选择的时候怎么样作出选…

对比Oracle和Mysql在锁机制上的类似和差异点

转:https://blog.csdn.net/c332472988/article/details/52804078 InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的&#xff0c;这一点MySQL与Oracle不同&#xff0c;后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着&#xff1…

BUUOJ reverse 刮开有奖

刮开有奖 这是一个赌博程序&#xff0c;快去赚钱吧&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

正则表达式测试工具

这个工具最开始是年前写的&#xff0c;原文见如下地址&#xff1a;写了一个测试正则表达式的小工具 后来快过年的时候一直忙着给票贩子送钱去了&#xff0c;没有把它写完&#xff0c;今天抽空把一些细节的功能完成了一下&#xff0c;感兴趣的朋友可以下载试用&#xff1a;点击…

快速排序的原理以及Java代码

package com.asiainfo.test;import java.util.Arrays;import sun.misc.Sort;public class QKSORT {//基本思路是&#xff1a;选择一个值为key 一般是选择左边第一个为key//先是从右向左找到小于 key 的值 将此值与 key 进行交换&#xff0c;由于key 是一个标记先不用交换 &…

BUUOJ reverse 不一样的flag

不一样的flag 是不是做习惯了常规的逆向题目&#xff1f;试试这道题&#xff0c;看你在能不能在程序中找到真正的flag&#xff01;注意&#xff1a;flag并非是flag{XXX}形式&#xff0c;就是一个’字符串‘&#xff0c;考验眼力的时候到了&#xff01; 注意&#xff1a;得到的 …

shiro学习(18):使用注解实现权限认证和后台管理三

工具idea 先看看数据库 shiro_role_permission 数据 shiro_user shiro_user_role 数据 目录结构 在pom.xml里面添加 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…