微信小程序——操作数据库

案例一:统计用户的访问次数

业务需求:

  • 统计每个用户对程序的访问次数
  • 将访问次数存储到数据库中
  • 访问次数应该与用户进行关联

业务逻辑:

  • 如果用户是第一次访问此程序,向数据库添加一条记录:{openid:45454545,count:1}
  • 如果用户不是第一次访问,首先获取数据库中改用户的访问次数然后+1,再保存到数据库中,然后更新页面中的访问次数

实现步骤:

在项目的pages中创建count_demo

在项目的pages中创建count_demo文件夹 在count_demo文件夹中创建page命名为count_demo

在这里插入图片描述

设置程序的主显示页面
  • 将程序主页设置为刚添加的count_demo

  • 将app.json中刚添加的"pages/count_demo/count_demo"放到开始位置
    在这里插入图片描述

  • 查看刚刚创建的count_demo中的count_demo.js文件

      /*** 生命周期函数--监听页面加载*/onLoad: function (options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady: function () {},/*** 生命周期函数--监听页面显示*/onShow: function () {},/*** 生命周期函数--监听页面隐藏*/onHide: function () {},/*** 生命周期函数--监听页面卸载*/onUnload: function () {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh: function () {},/*** 页面上拉触底事件的处理函数*/onReachBottom: function () {},/*** 用户点击右上角分享*/onShareAppMessage: function () {}
    
    • 页面编译时执行的下面函数
      • onload函数—onshow函数–onready
    • 当页面切换时执行
      • onhide函数 切换回来时执行 onshow函数
创建数据库(counters)

在这里插入图片描述

编辑count_demo.wxml

在这里插入图片描述

编辑count_dome.js
  • 在count_demo.js中定义变量实现数据的绑定

    Page({data: {count:0},})
    
  • 在onload函数中 查询登录用户的访问次数

    • 获取数据库的引用

      const db=wx.cloud.database()

    • 获取要操作的集合

      const counters=db.collection(‘counters’)

    • 查询用户在counters集合中的数据

      //查询用户在counters集合中的数据db.collection('counters').get().then(res=>{console.log(res)})
      
    • 输出结果
      在这里插入图片描述

    • 可以根据返回data数组的长度来判断用户是否是第一次访问

      • 如果长度大于0说明已经登陆过就更新数据
        • 创建更新指令
          在这里插入图片描述
        • 更新访问次数
           if(res.data.length>0){//更新访问次数db.collection('counters').doc(res.data[0]._id).update({data:{count:_.inc(1)}})//在页面上显示的访问次数this.setData({count:++res.data[0].count})}else
          
      • 如果没有数据说明未访问过就插入数据 并更新本地数据
        else{//新增数据db.collection('counters').add({data:{count:1}}).then(res=>{this.setData({count:1})})}
        

案例二:查询并展示数据

业务需求:

  • 查询数据库中的数据并展示
  • 页面加载时查询第一页的数据
  • 向上拉动页面到底部时查询下一页数据
  • 如果数据库中没有更多数据时,向上拉动不进行查询

实现步骤:

创建集和导入数据(demo_list)为集合设置权限

在这里插入图片描述
在这里插入图片描述

创建demo_list
  • 之间在app.json中的pages配置中的第一行写入保存即可创建并且访问主页也为该页面
    在这里插入图片描述
编辑demo_list.js文件
  • 自定义函数getListData分页查询数据

    // pages/demo_list/demo_list.js
    Page({data: {page_size: 8, //每页显示的数量page_count: 0, //页码dataList: [],isRequest:true,//是否请求,放数据库中没有更多数据时不再请求},onLoad() {this.getListData()},//分页获取数据getListData() {if(!this.data.isRequest){return}//获取数据库const db = wx.cloud.database()//计算skip函数的参数值let offset = this.data.page_count * this.data.page_size//查询集合中的数据db.collection('demo_list').skip(offset).limit(this.data.page_size).get().then(res => {this.setData({dataList:this.data.dataList.length===0 ? res.data :this.data.dataList.concat(res.data)})res.data.length!==this.data.page_size?this.setData({isRequest:false}):true})},/*** 页面上拉触底事件的处理函数*/onReachBottom: function () {this.setData({page_count:++this.data.page_count})this.getListData()}
    })
    
    1. 获取数据库
    2. 查询数据 skip是查询时跳过的条数 limit是查询时要查询的条数
    3. skip的参数值就是定义的查询的条数*页码数=已经查询出来的条数
    4. 当用户第一次访问时(dataList中没有数据)将数据赋值给dataList变量 如果有数据将两个数组进行合并。
    5. 当请求数组返回时数据的数量不等于我们的设置值时 说明数据没有更多了,我们将isRequest的值设置为false,当他的值为true的时候才允许查询数据
  • 页面刷新时调用

      onLoad() {this.getListData()},
    
  • 当用户下拉到底部时(onReachBottom事件触发)调用 并且请求页码累加

    /*** 页面上拉触底事件的处理函数*/onReachBottom: function () {this.setData({page_count:++this.data.page_count})this.getListData()}
    
编辑demo_list.wxml文件

点我进入下载压缩包
在这里插入图片描述

  • 压缩包中找到dis目录进入example\panel\panel.wxml文件中复制代码

    <view class="page"><view class="weui-panel weui-panel_access"><view class="weui-panel__bd"><view class="weui-media-box weui-media-box_text" wx:for="{{dataList}}" wx:key="_id"><h4 class="weui-media-box__title">{{item.title}}</h4><view class="weui-media-box__desc">{{item.description}}</view></view></view></view>
    </view>
    
  • 将style文件夹中的样式文件复制到我们的项目中并且全局引用
    在这里插入图片描述

  • 最后遍历数据即可
    在这里插入图片描述

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

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

相关文章

shop--12.阿里云部署以及域名绑定

一、申请阿里云服务器&#xff08;1&#xff09;PC访问阿里云https://www.aliyun.com/&#xff0c;申请阿里云帐号&#xff08;可以用您的支付宝帐号登录&#xff0c;因为支付宝帐号已经进行了实名认证&#xff0c;使用起来更方便&#xff09;并登录&#xff08;2&#xff09;找…

微信小程序——获取用户的运动步数

程序获取用户信息步骤 点击参考微信文档中的授权首先程序先向用户申请访问哪些权限用户做出选择后返回给程序程序携带权限访问服务器如果用户允许则返回信息如果用户为允许则不返回 自定义函数getUserRun 为获取用户的微信运动数据 页面加载调用此函数函数中执行下面操作 1…

C++之前置自增与后置自增

关于前置自增与后置自增的区别我是参考这里&#xff1a;http://bbs.bccn.net/thread-454977-1-1.html 简单复述下&#xff0c;比如x; 与 x; 在C中&#xff0c;x这个表达式的值为原先x的值1&#xff0c;副作用是x的值增加了1&#xff1b;&#xff08;C中不是这样定义的&#xff…

第一次个人作业

该作业所属课程&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2作业要求地址&#xff1a;https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340团队名称&#xff1a;脑壳痛 作业的目标 1.通过测试其他组的软件项目学习其…

微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。 (7f2d9d2d-5eac-4575-9n57-acd66cfa587g

1. 上传部署我们的云函数 2. 报错 错误信息为&#xff1a;Error: ResourceNotFound.Function, 未找到函数版本&#xff0c;请创建后再试。 (7f2d9d2d-5eac-4575-9b57-acd66cfa587e) 3. 原因 原因是可能我们在调试的时候不小心将我们开发控制台中的云函数删除了 4. 解决办法…

前端面试题——HTML基础篇

如何进行网站的性能优化 content方面 减少http请求 合并文件 css精灵图减少 DNS 查询 DNS缓存 将资源分布到恰当数量的主机名减少 DOM 元素的数量 Server方面 使用CDN配置Etag对组件使用 Gzip 压缩 Cookie方面 减小cookie大小 css方面 将样式表放到页面顶部不使用css表…

【IT界的厨子】酱香鲈鱼

食材: 前世曾经回眸的鲈鱼一条(主要选刺少的鱼&#xff0c;适合孩子吃&#xff0c;大人吃随意&#xff0c;草鱼比较大) 五花肉少许(肥一些的) 豆腐 辅料: 葱姜 蒜(选) 大料 香菜 调味: 啤酒(两罐) 黄豆酱或豆瓣酱(选) 老抽 生抽 料酒 盐 步骤: 1、鱼肉划开&#xff0c;方便炖的…

第二章:09流程控制[3for]

①格式for(初始化语句;判断条件语句;控制条件语句) { 循环体语句; } ②注意事项A:判断条件语句无论简单还是复杂结果是boolean类型。 B:循环体语句如果是一条语句,大括号可以省略&#xff1b;如果是多条语句,大括号不能省略。建议永远不要省略。 C:一般来说&#xff1a;有左大括…

LeetCode,第377场周赛,个人题解

目录 100148.最小数字游戏 题目描述 思路分析 代码详解 100169.移除栅栏得到的正方形田地的最大面积 题目描述 思路分析 代码详解 100156.转换字符串的最小成本I 题目描述 思路分析 代码详解 100158.转换字符串的最小成本II 题目描述 思路分析 代码详解 100148.…

for each....in、for in、for of

一、一般的遍历数组的方法: var array [1,2,3,4,5,6,7]; for (var i 0; i < array.length; i) { console.log(i,array[i]); } 二、用for in的方遍历数组 for(let index in array) { console.log(index,array[index]); }; 三、forEach array.forEach(v>{ cons…

Vue cli3.0创建Vue项目

创建Vue项目 在要创建项目的文件夹下面打开Powershell窗口 输入命令 vue create 项目名称 选择第二项 回车后 选择是否使用历史路由 no 回车 选择 Less 回车 选择第三个 回车 选择第一个 回车 选择第一个 回车 是否保存模板 选择no 完成啦 完成

文件内容的输出io

package bbb; import java.io.*; public class ccc {public static void main(String[]args) throws IOException{ File filenew File("d:/1data.txt"); FileOutputStream outnew FileOutputStream(file); byte buy[]"12345abcdef#%&*软件工程".getByt…

看完后完全了解 Vue 2.0 和 Vue 3.0 的区别

1.数据的双向绑定 Vue2.0使用Object.defineProperty 原理&#xff1a;通过使用 Object.defineProperty 来劫持对象属性的 geter 和 seter 操作&#xff0c;当数据发生改变发出通知 代码&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4…

channels2.X 学习笔记

- No module named asgiref.sync 报错解决&#xff1a; # 报错原因&#xff1a; """ django版本过低&#xff0c; 卸载最新版本的 channels 使用2.x 版本的 """ pip3 uninstall channels - 安装&#xff1a; """ Django 1.11.15 …

风格迁移学习笔记

风格迁移大作业 学习规划 跑通一份代码&#xff01;&#xff01;&#xff01;&#xff08;done&#xff09;对照代码、Blog和论文理解相应的算法过程规划下一步&#xff0c;修改代码&#xff08;done&#xff09;&#xff0c;实现预计功能&#xff08;done&#xff09;调参&…

Netty源码分析第5章(ByteBuf)----第5节: directArena分配缓冲区概述

Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述 Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上一小节简单分析了PooledByteBufAllocator中, 线程局部缓存和arean的相关逻辑, 这一小节简单分析下directArena分配缓冲区的相关过程 …

uni-app(从零开始)

uni-app&#xff08;从零开始&#xff09; uni-app 是什么&#xff1f; uniapp 就是使用Vue.js技术开发所有前端框架的跨端框架uniapp 就是可以将一套代码 发布到多个平台 uniapp 和 Vue 的关系&#xff1f; uniapp是基于vue进行开发&#xff0c;继承了Vue的特性和语法在开…

Remote desktop manager共享账号

因为多个远程机器&#xff0c;是会用了域账号进行登录的。而域账号的密码&#xff0c;三个月之后&#xff0c;密码强制过期 添加一个新的entry&#xff0c;类型是Credential Entry&#xff0c;然后选择用户名/密码 在remote desktop编辑的页面&#xff0c;Credentials选择Crede…

bzoj4403:序列统计

我好傻啊 题目 先来看看长度只能为\(n\)的情况 那么答案非常显然是\(\binom{mn-1}{n}\) 其中\(mR-L1\) 因为我们要构造一个非降序列&#xff0c;显然可能一个数会被选择多次&#xff0c;组合非常不好做&#xff0c;于是我们可以把每一个数的下标加上其对应的下标那么现在的值域…

Mui常用的方法

中对话框 语法&#xff1a;mui.confirm 用法 mui.confirm("确认要切换角色&#xff1f;", "提示", btnArray, function(e) {if(e.index 1) {} else {}});组件名作用alert警告框confirm确认框prompt输入对话框toast消息提示框&#xff08;自动消失&#x…