手把手云开发小程序-(四)-uniclould增删改查业务开发

news2024/11/18 23:35:11

一,导入uView

在开发小程序的时候,我习惯使用uView这个ui库。主要是直接用当然比自己写省时间。

它的官网:uView - 多平台快速开发的UI框架 - uni-app UI框架 (gitee.io)

导入:

npm install uview-ui@2.0.31

然后按照官网进行配置:

1. 引入uView主JS库

在项目根目录中的main.js中,引入并使用uView的JS库,注意这两行要放在import Vue之后。

// main.js
import uView from "uview-ui";
Vue.use(uView);
2. 在引入uView的全局SCSS主题文件

在项目根目录的uni.scss中引入此文件。

/* uni.scss */
@import 'uview-ui/theme.scss';
3. 引入uView基础样式

注意!

在App.vue中首行的位置引入,注意给style标签加入lang="scss"属性
<style lang="scss">
  /* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
  @import "uview-ui/index.scss";
</style>
4. 配置easycom组件模式

easycom功能可以让用户无需安装、引用、注册,三个步骤后才能使用组。uni-app为了调试性能的原因,修改easycom规则不会实时生效,配置完后,需要重启HX或者重新编译项目才能正常使用uView的功能。

// pages.json
{
  "easycom": {
    "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
  },
  
  // 此为本身已有的内容
  "pages": [
    // ......
  ]
}

二,使用unicluld完成增删改查的业务功能

页面开发就不说了,无非就是html+css,这里主要讲讲如何使用uniclould进行增删改查.

为了简化篇幅,我拿我小程序的标签来做讲解,增删改查各讲一个例子,通过这四个例子,大家也能很快学会uniclould的云对象使用,其他业务开发大差不差的.

2.1,新建标签数据表

第一步肯定是需要在云服务器新建数据表,如下图所示,新建一个即可:

2-1.png

啥也不用选,初始空表就行,就取名为tabsTable.

2.2,增加标签

新建完数据表,就需要往数据库中新增标签.

于是先画好前端ui,然后新建云对象tab:

2-2.png

前端调用接口:

async addTabs(){
  let num=Number(this.tabsNum)
  if(!num ||typeof num != 'number'){
    uni.showToast({
      title: "请输入有效值",
      icon:'error',
      duration: 1500
    });
    return 
  }
  const tabs = uniCloud.importObject('tab') // 导入云对象
  const res2 = await tabs.addTabs({
    token:this.token,
    tabsName:this.tabsName,
    tabsNum:num
  })
  this.tabsName=''
  this.tabsNum=''
  this.getTabs()
  uni.showToast({
    title: res2.msg,
    icon:'error',
    duration: 2000
  });
},

主要就是这两行代码:

  const tabs = uniCloud.importObject('tab') // 导入云对象
  const res2 = await tabs.addTabs({
    token:this.token,
    tabsName:this.tabsName,
    tabsNum:num
  })

不用去纠结uniCloud从哪来的,编译的时候,框架会给我们自己引入的.这里直接这么用就行了,可以暂时把它理解成一个全局的对象.只要这样引入tab云对象,就能调用该云对象的addTabs方法啦.

前端调用这个接口后,我们的后端也就是我们的tab云对象就需要去接收,它的写法如下:

// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程:https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
const db = uniCloud.database();
const userTable = db.collection('user');
const notesTable = db.collection('notes');
const tabsTable = db.collection('tabsTable');//这几个是在引入数据表,因为要对数据表做增删改查
const dbCmd = db.command
const {encrypt,decrypt} =require("common-object");
module.exports = {
  _before: function () { // 通用预处理器},
  /**
   * method1方法描述
   * @param {string} param1 参数1描述
   * @returns {object} 返回值描述
   */
  
  async addTabs(param) {
    // 业务逻辑
    const {token,tabsName,tabsNum}=param
    let result=JSON.parse(decrypt(token))
    const openId=result.openid
    //增加标签,首先要用该账户来判断有没有同名的标签
    let res=await tabsTable.where({openId:dbCmd.eq(openId)}).get()
    let res2=res.data.filter(item=>{
      return item.tabsName==tabsName
    })
    if(res2.length>0){
      return {
        code:10001,
        msg:'该标签名已存在'
      }
    }else{
      //新增标签
      await tabsTable.add({tabsName:tabsName,openId:openId,tabsNum:tabsNum})
      return {
        code:10000,
        msg:'新增成功'
      }
    }
  }
}

这样就完成了增加标签的业务逻辑啦.

2.3,删除标签

删除标签也是类似的操作流程,先画好页面:

2-3.png

在页面调用接口:

      //删除标签
      deleteTabs(){
        const that=this
        uni.showModal({
          title: '提示',
          content: '删除该标签的同时会删除该标签下的笔记,确定要继续?',
          success:async  function (res) {
            if (res.confirm) {
              let params={
                token:that.token,
                tabsSelect:that.deletetabsSelect
              }
              const tabs = uniCloud.importObject('tab')
              const res = await tabs.delTabs(params)
              that.deletetabsSelect=''
              that.getTabs()
              uni.showToast({//提示
                title:res.msg
              })  
            } else if (res.cancel) {
              console.log('用户点击取消');
              return
            }
          }
        });
      }

对应的云对象删除标签接口:

// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程:https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
const db = uniCloud.database();
const userTable = db.collection('user');
const notesTable = db.collection('notes');
const tabsTable = db.collection('tabsTable');
const dbCmd = db.command
const {encrypt,decrypt} =require("common-object");
module.exports = {
  _before: function () { // 通用预处理器},
  //删除标签
  async delTabs(param){
    const {token,tabsSelect}=param
    let result=JSON.parse(decrypt(token))
    const openId=result.openid
    //先删除该标签下的所有笔记
    let res = await notesTable.where({
      openId:dbCmd.eq(openId),
      tabsSelect:tabsSelect
    }).remove()
    //然后删除对应的标签
    let res2=await tabsTable.where({
      openId:dbCmd.eq(openId),
      tabsName:tabsSelect
    }).remove()
    return {
      code:10000,
      msg:'更新成功'
    }
  },
}
2.4,修改标签

先画好页面:

2-4.png

前端的接口调用:

      //更新标签名
      async updateTabs(){
        let num=Number(this.newTabsNum)
        let params={
          token:this.token,
          oldTabsName:this.updatetabsSelect,
          newTabsName:this.newTabsName,
          newTabsNum:num
        }
        if(this.updatetabsSelect||!this.newTabsName || typeof num != 'number'){
          uni.showToast({
            title: "请输入合法值",
            duration: 1500
          });
        }
        const tabs = uniCloud.importObject('tab') // 导入云对象
        const res = await tabs.updateTabs(params)
        this.updatetabsSelect=this.newTabsName=this.newTabsNum=''
        this.getTabs()
        uni.showToast({
          title: res.msg,
          duration: 1500
        });
      },

后端对应的接口,当然这个updateTabs方法和前文两个接口一样,我为了统一管理,放在同一个云对象里面了,这里为了减少篇幅,只复制了该方法出来.

  //更新标签名
  async updateTabs(param){
    const {token,oldTabsName,newTabsName,newTabsNum}=param
    let result=JSON.parse(decrypt(token))
    const openId=result.openid
    let res=await tabsTable.where({openId:dbCmd.eq(openId)}).get()
    let res2=res.data.filter(item=>{
      return item.tabsName==newTabsName
    })
    if(res2.length>0&&newTabsName!=oldTabsName){
      return {
        code:10001,
        msg:'该标签名已存在'
      }
    }else{
      //更新标签对应的文本为新标签
      //第一步:先找到该用户该标签的所有数据
      let resTabnotes = await notesTable.where({
        openId:dbCmd.eq(openId),
        tabsSelect:oldTabsName
      }).update(
        {
          tabsSelect:newTabsName
        }
      )
      //更新-标签
      let resTabs = await tabsTable.where({
        openId:dbCmd.eq(openId),
        tabsName:oldTabsName
      }).update(
        {
          tabsName:newTabsName,
          tabsNum:newTabsNum
        }
      )
      return {
        code:10000,
        msg:'更新成功'
      }
    }
  }
2.5,查询标签

前端的接口调用:

//获取所有的标签
async getTabs(){
  const tabs = uniCloud.importObject('tab') // 导入云对象
  const res = await tabs.getTabs({
     token:this.token
  })
  this.tabsList=res.data
  this.columns[0]=res.data.map(item=>item.tabsName)
},

后端的接口调用:

  async getTabs(param){
    const {token}=param
    let result=JSON.parse(decrypt(token))
    let openId=result.openid
    //需要排序
    let res=await tabsTable.where({openId:dbCmd.eq(openId)}).orderBy('tabsNum','asc').get()
    let result2=res.data.map(item=>{
      return {
        tabsName:item.tabsName,
        tabsNum:item.tabsNum
      }
    })
    return {
      code:10000,
      data:result2
    }
  },

其他的业务开发大同小异,就不多说啦.其他功能可以扫描我文章开头的二维码,体验一下,这个小程序是我自己将一直使用的,这里就当打个小广告吧,也会持续维护迭代.有啥优化意见大家也可以提哈.

三,我的小程序体验

我对应这个教程的小程序,可以看下图,扫码体验:

01.jpg

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

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

相关文章

数据库基础入门 — SQL运算符

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

Qt 软件开发框架(主要几个部分)

目录 1、 一个软件基本要素 &#xff08;1&#xff09;UI模块 &#xff08;2&#xff09;网络模块 &#xff08;3&#xff09;业务逻辑模块 &#xff08;4&#xff09;中间层 &#xff08;5&#xff09;独立模块&#xff08;守护进程、更新模块、日志收集模块…&#xff…

CodeWhisperer 体验总结

CodeWhisperer 体验总结 | CodeWhisperer 是一款亚马逊新推出的通用代码生成器 可以实时进行代码数据的提供 还可以定义安全问题 CodeWhisperer 对个人用户是免费使用 企业用户需要订阅使用 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例…

电商数据API接口接入|获取京东商品详情数据价格主图描述

企业前台研发部包含了企业业务大部分的对外前台系统&#xff0c;其中京东VOP平台(开放平台)适合于自建内网采购商城平台的企业客户。京东为这类客户专门开发API接口&#xff0c;对接到客户内网的网上商城&#xff0c;将产品SKU直接推送到客户内网&#xff0c;客户内部采购人员可…

华中科技大学李松课题组,利用机器学习预测多孔材料水吸附等温线

By 超神经 多孔材料的水吸附等温线是一个非常重要的参数&#xff0c;但这一参数的获得并不容易。这是因为多孔材料种类过多、结构多元&#xff0c;通过实验和计算的方式获得水吸附等温线数据成本过高&#xff0c;耗时过长。 华中科技大学的李松课题组&#xff0c;建立了一个两步…

开发板启动进入系统以后再挂载 NFS 文件系统, 这里的NFS文件系统是根据正点原子教程制作的ubuntu_rootfs

如果是想开发板启动进入系统以后再挂载 NFS 文件系统&#xff0c;开发板启动进入文件系统&#xff0c;开发板和 ubuntu 能互相 ping 通&#xff0c;在开发板文件系统下新建一个目录 you&#xff0c;然后执行如下指令进行挂载&#xff1a; mkdir mi mount -t nfs -o nolock,nfsv…

MySQL中自增id用完怎么办?

MySQL中自增id用完怎么办&#xff1f; MySQL里有很多自增的id&#xff0c;每个自增id都是定义了初始值&#xff0c;然后不停地往上加步长。虽然自然数是没有上限的&#xff0c;但是在计算机里&#xff0c;只要定义了表示这个数的字节长度&#xff0c;那它就有上限。比如&#…

【LeetCode二叉树进阶题目】606. 根据二叉树创建字符串,102. 二叉树的层序遍历,107. 二叉树的层序遍历 II

二叉树进阶题目 606. 根据二叉树创建字符串解题思路及实现 102. 二叉树的层序遍历解题思路及实现 107. 二叉树的层序遍历 II解题思路及实现 606. 根据二叉树创建字符串 描述 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号…

1553. 吃掉 N 个橘子的最少天数(记忆化+贪心优化)

Problem: 1553. 吃掉 N 个橘子的最少天数 文章目录 题目思路Code 题目 使得 n 变成0的操作有三种方式 &#xff1a; 吃掉一个橘子。如果剩余橘子数 n 能被 2 整除&#xff0c;那么你可以吃掉 n/2 个橘子。如果剩余橘子数 n 能被 3 整除&#xff0c;那么你可以吃掉 2*(n/3) 个…

xorm源码学习

文章目录 XORM源码浅析及实践ORMORM vs. SQLXORM软件架构 ORM 引擎 Engine——DBM*core.DB Golang&#xff1a;database/sql 源码基本结构连接复用&#xff0c;提高性能。增加数据库连接池数量连接管理 database/sql主要内容&#xff1a;sql.DB创建数据库连接sql.Open()DB.conn…

python数据结构与算法-15_堆与堆排序

堆(heap) 前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序&#xff0c;中间又穿插了一把树和二叉树&#xff0c; 本章我们开始介绍另一种有用的数据结构堆(heap)&#xff0c; 以及借助堆来实现的堆排序&#xff0c;相比前两种排序算法要稍难实现一些。 最后我…

《DApp开发:开启全新数字时代篇章》

随着区块链技术的日益成熟&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为数字世界的新焦点。在这个充满无限可能的全新领域&#xff0c;DApp开发为创新者们提供了开启数字时代新篇章的钥匙。 一、DApp&#xff1a;区块链创新成果 DApp是建立在区块链技术基础之…

vue el-table (固定列+滚动列)【横向滚动条】确定滚动条是在列头还是列尾

效果图&#xff1a; 代码实现&#xff1a; html&#xff1a; <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//unpkg.com/element-ui2.15.14/lib/index.js"></script> <div id"app" style&quo…

OpenGL YUV 和 RGB 图像相互转换出现的偏色问题怎么解决?

未经作者(微信ID:Byte-Flow)允许,禁止转载 文章首发于公众号:字节流动 早上知识星球里的一位同学,遇到 yuv2rgb 偏色问题,这个问题比较典型,今天展开说一下。 省流版 首先 yuv2rgb 和 rgb2yuv 之间的转换要基于相同的标准,转换使用不同的标准肯定会引起偏色,常见的…

监控员工上网有什么软件丨三款好用的员工上网管理软件推荐

监控员工上网行为是企业管理中不可或缺的一部分&#xff0c;因此&#xff0c;选择一款好的监控员工上网的软件至关重要。目前市场上存在多种监控员工上网的软件&#xff0c;它们具有各种特点和功能&#xff0c;但企业需要仔细评估和选择。 一、域之盾软件 这是一款优秀的监控员…

数据结构-leetcode(设计循环队列)

1.学习内容&#xff1a; 今天 我们讲解一道能够很好的总结所学队列知识的题目---设计循环队列 622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 2.题目描述&#xff1a; 让我们设计一个队列 要求是循环的 这和我们的双向链表有些类似 让我们按要求设计出这些相对…

【C++】特殊类设计 {不能被拷贝的类;只能在堆上创建的类;只能在栈上创建的类;不能被继承的类;单例模式:懒汉模式,饿汉模式}

一、不能被拷贝的类 设计思路&#xff1a; 拷贝只会发生在两个场景中&#xff1a;拷贝构造和赋值重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造以及赋值重载即可。 C98方案&#xff1a; 将拷贝构造与赋值重载只声明不定义&#xff0c;并…

重生奇迹mu迹辅助什么好

主流辅助一号选手&#xff1a;弓箭手 智弓作为最老、最有资历的辅助职业&#xff0c;一直都是各类玩家的首要选择。因为智力MM提供的辅助能力都是最基础、最有效、最直观的辅助。能够减少玩家对于装备的渴求度&#xff0c;直接提升人物的攻防&#xff0c;大大降低了玩家升级打…

当当网获得dangdang商品详情商品列表API 测试请求入口

item_get-获得dangdang商品详情 获取商品详情 item_search-按关键字搜索dangdang商品 获取商品列表 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请…

单片机调试技巧--栈回溯

在启动文件中修改 IMPORT rt_hw_hard_fault_exceptionEXPORT HardFault_Handler HardFault_Handler PROC; get current contextTST lr, #0x04 ; if(!EXC_RETURN[2])ITE EQMRSEQ r0, msp ; [2]0 > Z1, get fault context from h…