小程序·云开发的数据库,是一个既可在前端操作、也能在云函数中读写的json数据库,对外提供丰富的数据库API。从满足基础可用性到现在,已能够满足中大型小程序的要求。
那么,基于云开发数据库,你做过哪些有意思的小程序实践呢?在这个话题中,我们面向广大开发者(包括个人和企业)征集云开发数据库的使用案例,优秀的案例将有机会获得官方专属访谈与“微信开发者”官方公众号推送宣传分享。
案例分享建议包括云开发数据库使用背景与需求,可提供脱敏的代码示例与数据。
参与#云开发#系列话题并提供高质量回答或建议者即有机会获得微信相框Classic一台,快来参加吧!
*获奖情况将在后续「社区每周」公告中公示,如获访谈机会将有官方运营专员通过社区私信联系作者,请及时留意社区私信
*使用小程序云开发过程中的如有疑问或Bug反馈,可在社区云开发版块发帖交流
我用云数据库就是因为懒! 云数据库省事啊!
云开发刚出来的时候正好在做一个自用的孩子日常行为记录的工具小程序,本来还要自己搭服务器,弄证书,正好就转到了云开发
就不发出来了,完全是自用的,都没申请上线发布
云开发,越用越爽
看了这么多好像没有游戏方面的小程序,分享一下我的第一个完全云开发的小程序:当前版本
前端功能主要是展示英雄联盟(LOL)当前版本信息、历史版本信息、全英雄各版本改动信息以及用户对各版本的投票打分。
后台主要利用云函数操作数据库实现添加/编辑英雄,添加新版本以及用户消息推送等。
后台是集成到了小程序端,因为要用云函数操作数据库录数据。(这里吐槽一下,云开发做后台管理,如果不集成到小程序端,就只能用后端语言去调云函数来操作数据库,这样不就失去了云开发的意义吗。。所以最后选择集成到小程序端然后留一个仅管理员可见的入口。)
数据库部分一共分了三个表(集合):用户表、版本表和英雄表。
然后分享一下我自己觉得比较有意思的代码。
这个页面是一个英雄查询页面,首先可以选择英雄位置查询(如中路),然后查询框可以输入英雄称号(如符文法师)、也可以输入英雄名称(如瑞兹)、也可以输入英雄外号(如光头、流浪)还可以输入英雄的名称、称号、外号的拼音(如liulang、ruizi、guangtou),都可以查到瑞兹这个英雄,这里的查询功能基本上还原了LOL客户端的英雄查询功能。最后再根据最近有改动与英雄称号的拼音来排序。
下面是查询的云函数代码,第一次写操作数据库语句,下面这写代码也不知道还能不能有优化。。
最后总结下,这个小程序前后端加起来虽然一共7、8个页面,但是云开发的增删改查、排序、分页、多条件查询以及消息推送等常用功能基本都使用到了,总的来说云开发对于个人开发者来说确实很棒。
感兴趣的可以扫码体验一下。
做了两款小程序,都是基于【小程序云开发】
1: 吃什么 Today
提供饮食日记(可分享)、查看附近网友分享的日记。
从图片的上传、内容安全的检测,到附近网友分享的记录(重点云数据库),均使用微信提供的服务;
重点:GEO 特性(超级赞),把距离什么的全算好了,非常省事(该小程序于本月才发布上线,是 18 年年底开始开发的,那时还没有此类特性);
代码(为避免无意义的吐槽,已删除注释)
const _ = db.command; const $ = db.command.aggregate; var OPENID = wxcontext.OPENID; var aggregate; var recordId = event['id']; if ( recordId ) { event.tab = TAB_OVERALL; } switch (event.tab) { case TAB_NEARBY: aggregate = db.collection('records').aggregate(); aggregate.geoNear({ distanceField: 'distance', spherical: true, near: db.Geo.Point(event.lng, event.lat), maxDistance: 4 * 5 * 1000, query: { text: _.neq(null), status: STATUS.PASSED, visibility: VISIBILITY.PUBLIC } }); break; case TAB_OVERALL: aggregate = db.collection('records').aggregate(); var conditions = { text: _.neq(null), status: STATUS.PASSED, visibility: VISIBILITY.PUBLIC }; if ( recordId ) { conditions._id = recordId; } aggregate.match( conditions ); break; case TAB_FOLLOWING: var following = await db.collection('wx_users') .where({ followers: _.elemMatch(_.in([ OPENID ])) }) .field({ _openid: true }) .get(); var users; if (following.data.length) { users = []; following.data.forEach(function(x) { users.push(x._openid); }); } else { return { list: [] }; } aggregate = db.collection('records').aggregate(); aggregate.match({ _openid: _.in( users ), text: _.neq(null), status: STATUS.PASSED, visibility: VISIBILITY.PUBLIC }); break; } // -------------------------------------- aggregate .sort({ create_time: -1 }) .skip(20 * (0)) .limit(20); switch (event.tab) { case TAB_NEARBY: case TAB_OVERALL: aggregate.lookup({ from: "wx_users", localField: "_openid", foreignField: "_openid", as: "wx_user" }); break; case TAB_FOLLOWING: aggregate.lookup({ from: "wx_users", localField: "_openid", foreignField: "_openid", as: "wx_user" }); break; } aggregate.replaceRoot({ newRoot: $.mergeObjects([$.arrayElemAt(['$wx_user', 0]), '$$ROOT']) }) .addFields({ is_owner: $.eq(['$_openid', OPENID]), following: $.cond({ if: $.isArray('$followers'), then: $.in([OPENID, '$followers']), else: false, }), liked: $.cond({ if: $.isArray('$likes'), then: $.in([OPENID, '$likes']), else: false, }) }); var shouldRemoveFields = { _openid: false, nick_name: false, gender: false, // ------------------------------------ wx_user: false, followers: false, likes: false, views: false, wx_runtime: false, // ------------------------------------ geo_coord_type: false, address_rough: false, location: false, city: false, province: false, country: false, language: false }; switch (event.tab) { case TAB_FOLLOWING: case TAB_OVERALL: shouldRemoveFields.address_recommend = false; break; } aggregate.project( shouldRemoveFields ); var output = await aggregate.end();
当然最重要的是是真相
2: 汇品栈(废品回收)
同样是基于云开发,重点依然是 GEO 特性(派单时通过 GEO 预筛选出就近的师傅)。
上周末试了下云开发,做了个小程序把我的表情包放里面了,有兴趣的看看~