小程序云开发实战 - 口袋工具之历史上的今天

前言

本项目是一个基于云开发的小程序。

本文选取项目中的一个页面 -- 历史上的今天 来做一个云开发的分享,会涉及云函数和云数据库。

由于是实战项目,关于小程序的基础知识请移步官方文档,本文不再赘述。

项目地址

https://github.com/GoKu-gaga/today

项目预览

  • 微信搜索: 口袋工具y
  • 扫一扫:


前期遇到的问题

  • 数据来源: 没有数据,寸步难行呀

如何解决数据来源

本项目选择第二种方式,并最终选择了聚合数据平台API。

项目开始

新建项目

  • 新建项目,配置好名称、目录、AppID等信息,后端服务选择小程序·云开发,点击新建。

    关于AppID: 请自行修改为你注册的小程序AppID。

  • 点击新建即可完成项目初始化,得到一个云开发模板:

    项目目录.png

目录结构:

   +-- cloudfunctions|[指定的环境]  // 存放云函数的目录
   +-- miniprogram                 // 小程序代码编写目录
   |-- README.md                   // 项目描述文件
   |-- project.config.json         // 项目配置文件

新建云开发环境

  • 点击左上角菜单项 云开发

  • 点击创建资源环境,环境名称及环境ID请自行设置:

  • 点击确定即可完成创建

编写云函数

1. 新建云函数

在目录 cloudfunctions 上右键
新建云函数,填入新建云函数的名称(如todayInHistory
回车或失去焦点即会自动创建并上传。

2. 安装依赖

云函数目前执行环境仅支持node,所以需要使用js来编写云函数的逻辑。
在控制台中进入该云函数的目录,执行

npm i -S axios

本项目使用axios来执行请求的发送,可以使用其他如request-promise等等的库来替换

3. 编写云函数

  • 新建config.js文件,添加代码如下:
exports.key = YOUR_JUHE_KEY // 在聚合数据平台申请的key
exports.baseUrl = 'http://v.juhe.cn/todayOnhistory/queryEvent.php'
  • 打开index.js文件,编写代码:
// 云函数入口文件
const cloud = require('wx-server-sdk')
const axios = require('axios')

cloud.init()
const db = cloud.database()

// 聚合数据
const { baseUrl, key } = require('./config')

// 云函数入口函数
exports.main = async(event, context) => {
  const {
    month,
    day
  } = event
 
  const resp = await axios.get(baseUrl, {
    params: {
      key,
      date: `${month}/${day}`
    }
  }).then(res => {
    return res.data
  })

  return resp.result
}

编写页面

1. 新建页面

在开发小程序的过程中,新建一个页面是很常见的操作,有两个非常方便的方式

  • app.json 文件中,在pages项添加我们需要的页面路径,直接保存即可。如:

    "pages": [
      "pages/today-in-history/index"
    ]
    
  • pages 目录下新建目录 today-in-history ,在新建的目录上 右键 -> 新建page, 填入名称如index, 回车即可完成页面下四个文件的创建

2. 编写 index.wxml

<view class="container">
  <view class="header full-width">
    <view>{{year}}年{{month}}月{{day}}日</view>
  </view>
  <view class="content full-width">
    <view class="list-view">
      <block wx:for="{{list}}" wx:key="index">
          <view class="item-title">{{item.title}}</view>
          <view class="item-date">{{item.date}}</view>
      </block>
    </view>
  </view>
</view>

3. 编写 index.js

// pages/today-in-history/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    year: 1990,
    month: 1,
    day: 1,
    list: []
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function() {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const day = now.getDate();
    this.setData({
      year,
      month,
      day
    });
    this.doGetList();
  },

  /**
   * 执行数据获取
   */
  doGetList: function() {
    const {
      month,
      day
    } = this.data;
    wx.cloud.callFunction({
        name: 'todayInHistory',
        data: {
          month,
          day
        }
      }).then(res => {
        let list = res.result.reverse();
        this.setData({
          list
        });
      })
      .catch(console.error)
  }
})

4. 编写 index.wxss

/* pages/today-in-history/index.wxss */
.container {
  padding-bottom: 20rpx;
  background-color: #E8D3A9;
}

.header {
  display: flex;
  justify-content: space-around;
  align-items: center;
  height: 80rpx;
  color: #FFF;
}

.content {
  flex: 1;
}

.list-view {
  height: 100%;
  display: flex;
  flex-direction: column;
  padding: 0 20rpx;
}

.list-item {
  display: flex;
  flex-direction: column;
  border-radius: 10rpx;
  padding: 16rpx 0;
  box-sizing: border-box;
  margin-top: 20rpx;
  background-color: #fff;
  text-align: center;
  box-shadow: 1px 1px 5px 1px rgb(207, 207, 207);
}

.item-title {
  font-size: 36rpx;
  padding: 10rpx 16rpx;
  color: #262626;
  line-height: 48rpx;
}

5. 效果预览

到这里我们完成了 历史上的今天 的列表页,效果如下:

添加日期选择器

1. 引入 vantweapp

项目中使用 wantweapp 的部分组件

  • 安装
  # npm
  npm i vant-weapp -S --production

  # yarn
  yarn add vant-weapp --production
  • 构建npm

    点击开发者工具菜单项 工具 -> 构建npm
    程序将自动构建已安装的依赖

2. 在app.json引入组件

  "usingComponents": {
    "van-datetime-picker": "/miniprogram_npm/vant-weapp/datetime-picker/index",
    "van-popup": "/miniprogram_npm/vant-weapp/popup/index",
    "van-toast": "/miniprogram_npm/vant-weapp/toast/index"
  }

3. 修改 index.wxml

添加下面的代码

<view class="full-width">
  <van-popup show="{{ show }}" position="bottom">
    <van-datetime-picker
      type="date"
      value="{{ currentDate }}"
      bind:cancel="onCancel"
      bind:confirm="onConfirm"
    />
  </van-popup>
</view>
<van-toast id="van-toast" />
  1. 修改 index.js
  • 引入 Toast
    import Toast from '../../miniprogram_npm/vant-weapp/toast/toast';
    
  • data 添加 属性
    data: {
     year: 1990,
      month: 1,
      day: 1,
      list: [],
      show: false,
      currentDate: Date.now()
    }
    
  • 添加 监听方法
    /**
     * 监听日期选择
     */
    onChangeDate: function() {
      this.setData({
        show: true
      });
    },
    
    /**
     * 监听取消
     */
    onCancel: function() {
      this.setData({
        show: false
      });
    },
    
    /**
     * 监听确定
     */
    onConfirm: function(event) {
      const date = new Date(event.detail);
      const year = date.getFullYear();
      const month = date.getMonth() + 1;
      const day = date.getDate();
      this.setData({
        year,
        month,
        day,
        show: false
      });
      this.doGetList();
    }
    
  • 最后修改 doGetList ,添加loading
    /**
     * 执行数据获取
     */
    doGetList: function() {
      const {
        month,
        day
      } = this.data;
      Toast.loading({
        mask: true,
        message: '加载中...'
      });
      wx.cloud.callFunction({
          name: 'todayInHistory',
          data: {
            month,
            day
          }
        }).then(res => {
          let list = res.result.reverse();
          this.setData({
            list
          });
    
          Toast.clear();
        })
        .catch(console.error)
    }
    

5. 效果如下

列表
切换日期

补充

  • 由于聚合数据平台API非会员调用次数有限(100次/天),明显是不太够用的。因此,我们可以考虑在请求到数据时,将数据存在云数据库中,其实也就实现了一个类似爬虫的功能啦。流程如下:

代码实现:

  • 修改 cloudfunctions/todayInHistory/index.js

    // ... 省略其他无需改动的代码
    exports.main = async(event, context) => {
      const {
        month,
        day
      } = event
    
      const ret = await db.collection('todayInHistory').where({
        date: `${month}/${day}`
      }).get()
    
      if (ret.data.length > 0) {
        return ret.data[0].result
      }
    
      const resp = await axios.get(baseUrl, {
        params: {
          key,
          date: `${month}/${day}`
        }
      }).then(res => {
        return res.data
      })
      
      await db.collection('todayInHistory').add({
        data: {
          date: `${month}/${day}`,
          result: resp.result
        }
      })
    
      return resp.result
    }
     ```
    
    
    

结语

目前只开发了两个小功能 历史上的今天周公解梦,后续会继续开发新的功能,希望可以做成一个小工具集合,这也是口袋工具这个名称的由来。

感谢各位读者的阅读,由于本人水平有限,文章中如有错误或不妥之处,请不吝赐教!

如果你喜欢这篇文章或是这个项目,不妨进去点个Star支持下 today

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容