小试小程序云开发(小结)


Posted in Javascript onJune 06, 2019

微信小程序刚出没多久时,曾经上手写过demo,但开发体验比较差,所以一直没怎么关注。不过自从诸多适配方案出炉,以及云端的开通,觉得还是有必要上手体验一番的,于是为我的技术博客也写了个小程序版。

原生开发我是不想再试了,那就选一种适配方案,目前比较知名的有基于vue的 mpvue,umi-app,基于react 的 taro,以及TX团体出的全新框架 wepy。个人对 react 的好感 以及 taro 框架的走向成熟,促使我选择了 taro。

云端开发就是将普通小程序的传统后端切换为微信提供的 轻量级云端。而这个云端服务部分的开发其实是针对前端开发的,前端工程师很容易就能全栈开发出一整个小程序。但是这种轻量级解决方案也只是针对业务简单的项目,因为公共平台肯定有各种限制,它的出现只是让我们多了一个选择方案而已。

接着进入主题,项目大体目录结构如下

client #前端目录
├── config #配置
├── dist #输出
├── src #源目录
└── index.html #入口文件
cloud #云目录
├── dao #数据库操作函数集合
├── login #登录云函数
└── ... #其他

前端

小程序的前端部分,想必不用过多讲解,因为这都是前端的基本功。就以首页为样例,使用了typeScript,主要功能是分页加载数据,调用微信提供的触发到达底部的api-onReachBottom即可。

import Taro, { Component, Config } from "@tarojs/taro";
import { View, Text, Navigator } from "@tarojs/components";
import "./index.scss";

interface IState {
 loading: boolean;
 size: number;
 page: number;
 total: number;
 list: Array<{ _id: string; summary: object }>;
 context:object;
}
export default class Index extends Component<{}, IState> {
 state = {
  loading: false,
  size: 10,
  page: 0,
  total: -1,
  list: [],
  context:{}
 };
 config: Config = {
  navigationBarTitleText: "Jeff's Blog",
  onReachBottomDistance: 50
 };

 componentWillMount() {
  this.getList();
  this.getLogin();
 }

 getDbFn(fn, param) {
  return Taro.cloud.callFunction({
   name: "dao",
   data: { fn, param }
  });
 }

 onReachBottom() {
  this.getList();
 }
 
 getList() {
  const { size, page, total, loading } = this.state;
  if (loading) return;
  Taro.showLoading({ title: 'loading', });
  if (total >= 0 && size * page >= total) return;
  this.setState({ loading: true });
  this.getDbFn("getList", { size, page: page + 1 }).then(res => {
   Taro.hideLoading();
   const total = res.result.total;
   const list = this.state.list.concat(res.result.list);
   this.setState({ loading: false, page: page + 1, total, list });
  }).catch(err => {
   Taro.hideLoading();
   this.setState({ loading: false });
  });
 }

 onShareAppMessage (res) {
  return {
   title: "Jeff's Blog",
   path: '/pages/index/index'
  }
 }
 
 render() {
  return (
   <View className='container'>
    {this.state.list.map(l => (
     <View className='item' key={l._id}>
      <Navigator url={'/pages/post/post?id=' + l._id}>
       <Image className='banner' mode='widthFix' src={l.summary.banner} />
       <View className='title'>{l.summary.title}</View>
      </Navigator>
      <View className='sub-title'>
       {l.summary.tags.map(t => (
        <Navigator className='tag' url={'/pages/list/list?tag=' + t}> {t} </Navigator>
       ))}
       <Text className='time'>{l.summary.date}</Text>
      </View>
     </View>
    ))}
   </View>
  );
 }
}

与普通小程序不同的地方就是调用云端,云函数调用如官方样例所示

getLogin(){
  Taro.cloud.callFunction({
   name: "login",
   data: {}
  }).then(res => {
   this.setState({ context: res.result });
  }).catch(err=>{
  });
}

云端

云端数据库是个文档型,操作风格与mongodb如出一辙,格式自然是json。最有用的还是操作数据库的部分,操作方法都已经 Promise 化,调用还是比较方便的。具体内容请查看文档: 小程序云开发

//数据库引用
const db = wx.cloud.database()
//获取数据集合
const todos = db.collection('todos')

//获取记录数
todos.count();
//条件查找
todos.where({done: false,progress: 50}).get()

//插入
todos.add({data: {content:'11',time:new Date()}},success:(res){});

//更新
todos.doc('todo').update({ data: { done: true}},success:(res){});

//删除
todos.where({done:true}).remove();

//分页查找
todos.orderBy('time','desc')
  .skip(start)
  .limit(size)
  .get();

云函数

调用云端的方式就要使用云函数,就以下面数据库操作库为例

// 云函数入口文件
const cloud = require("wx-server-sdk");
cloud.init();

// 云函数入口函数
exports.main = async (event, context) => {
  const { fn, param } = event;
  return dao[fn](param);
};
// 调用数据库
const db = cloud.database();
// 表
const posts = db.collection("posts");
const tags = db.collection("tags");
const dao = {
  async getList({ page = 1, size = 10 }) {
    const start = (page - 1) * size;
    try {
      const { total } = await posts.count();
      const { data } = await posts
        .field({ summary: true })
        .orderBy('num','desc')
        .skip(start)
        .limit(size)
        .get();
      return {
        code: 0,
        list: data,
        total,
        message: "sucess"
      };
    } catch (err) {
      return {
        code: -1,
        list: [],
        total: -1,
        err: err,
        message: "error"
      };
    }
  },
  getPost({ id }) {
    return posts.doc(id).get();
  },
  async getTagList({ tag }) {
    try{
      const { data } = await tags.where({ name: tag }).get();
      if(!data.length){ 
        return {
          code:0,
          list:[],
          message: "success"
        };
      } 
      const list = data[0].list.sort((a,b) => b.num - a.num);
      return {
        code:0,
        list:list,
        message: "success"
      };
    } catch(err){
      return {
        code: -1,
        list:[],
        err: err,
        message: "error"
      };
    }
  }
}

将操作数据库的所有云函数合并成一个文件,将云函数入口封装一下,即把函数名字和参数都做为参数

exports.main = async (event, context) => {
  const { fn, param } = event;
  return dao[fn](param);
};

对应前端部分也封装出一个调用数据库的方法

getDbFn(fn, param) {
  return Taro.cloud.callFunction({
   name: "dao",
   data: { fn, param }
  });
 }

云端部分开发完之后,在微信开发者工具里面上传云端代码即可,而其余部分的流程和普通小程序一样,这里也不再介绍。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 Javascript
鼠标选择动态改变网页背景颜色的JS代码
Dec 10 Javascript
[原创]推荐10款最热门jQuery UI框架
Aug 19 Javascript
JQuery基础语法小结
Feb 27 Javascript
微信小程序 欢迎页面的制作(源码下载)
Jan 09 Javascript
jQuery实现拖拽可编辑模块功能代码
Jan 12 Javascript
jQuery简单实现遍历单选框的方法
Mar 06 Javascript
javascript填充默认头像方法
Feb 22 Javascript
JS实现可用滑块滑动的缓动图代码
Sep 01 Javascript
Vue.js实现大屏数字滚动翻转效果
Nov 29 Javascript
详解微信小程序动画Animation执行过程
Sep 23 Javascript
React实现todolist功能
Dec 28 Javascript
怎么使用javascript深度拷贝一个数组
Jun 06 #Javascript
微信小程序如何使用globalData的方法
Jun 06 #Javascript
详解微信小程序开发(项目从零开始)
Jun 06 #Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 #Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 #jQuery
JS根据json数组多个字段排序及json数组常用操作
Jun 06 #Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 #Javascript
You might like
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
JS字符串函数扩展代码
2011/09/13 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
使用python3构建文件传输的方法
2019/02/13 Python
python如何制作缩略图
2019/04/30 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
python实现的生成word文档功能示例
2019/08/23 Python
pytest中文文档之编写断言
2019/09/12 Python
python实现翻译word表格小程序
2020/02/27 Python
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
J2EE面试题
2016/03/14 面试题
司机辞职报告范文
2014/01/20 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
银行催款通知书
2015/04/17 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
2015中学教学工作总结
2015/07/22 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
PO模式在selenium自动化测试框架的优势
2022/03/20 Python