学习:uniCloud云开发Vue3版本(5)

14.云对象使用JQL语法databaseForJQL

主要区别

特性 uniCloud.database() (MongoDB) uniCloud.databaseForJQL() (JQL)
语法 MongoDB 原生语法 JQL(类似 GraphQL)
权限控制 需要手动配置 默认集成 uni-id 权限系统
联合查询 需要手动实现 支持 getTemp 和联合查询
代码量 较多(需手动写查询条件) 较少(链式调用,语法简洁)
适用场景 复杂查询、精细控制 快速开发、权限集成、多表查询

/uniCloud-alipay/cloudfunctions/demoObj/index.obj.js

复制代码
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
module.exports = {
	_before: function() { // 通用预处理器

	},
	// 不传值时默认size=3
	async getUser(size = 3) {
		let res = await dbJQL.collection("demo-user")
			.limit(size)
			.get()
		return res;
	},
	async addUser(params = {}) {
		let res = await dbJQL.collection("demo-user").add(params)
		return res;
		console.log(res);
	},
}

/pages/demo4/demo4

复制代码
<script setup>
	import {
		ref
	} from 'vue';
	// 导入云对象
	const demoObj = uniCloud.importObject("demoObj");

	const dataList = ref([])

	// 获取数据
	const getData = async () => {
		let {
			data
		} = await demoObj.getUser(7);
		dataList.value = data;
		console.log(data);
	}
	// 新增用户
	const handleAddUser = async () => {
		let res = await demoObj.addUser({
			name: "小黑",
			age: "22",
			gender: 1
		});
		console.log(res);
	}

	getData();
</script>
<template>
	<view class="">
		<button @click="handleAddUser">新增用户</button>

		<view class="item" v-for="item in dataList" :key="item._id">
			<view>{{item.name}}</view>
			<view>{{item.age}}</view>
			<view>-------</view>
		</view>
	</view>
</template>
<style lang="scss" scoped>

</style>

15.JQL不支持的方法可以使用传统云函数解决

云函数通过传统方式操作数据库 | uniCloud

复制代码
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
	_before: function() { // 通用预处理器

	},
	// 不传值时默认size=3
	async getUser(size = 3) {
		let res = await dbJQL.collection("demo-user")
			.limit(size)
			.get()
		return res;
	},
	async addUser(params = {}) {
		let res = await dbJQL.collection("demo-user")
			.add(params)
		return res;
		console.log(res);
	},
	async updateUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.update({
				like: ["唱", "跳", "rap", "篮球"]
			})
		// let res = await db.collection("demo-user")
		// 	.doc(id)
		// 	.update({
		// 		like: dbCmd.push(["踢足球"]),
		// 	})
		console.log(res);
	},
}

16.内置特殊方法预处理_before和后处理_after

内置特殊方法 | uniCloud

目前有3个内置特殊方法:_before_after_timing

预处理 _before

云对象内可以创建一个特殊的方法_before,用来在调用常规方法之前进行预处理,一般用于拦截器、统一的身份验证、参数校验等。

复制代码
_before: function() { // 通用预处理器
		this.params = {
			name: "ABC"
		};
		this.clientInfo = this.getClientInfo();
		//  主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
		if (false) {
			throw new Error("没有权限");
		}
	},

后处理 _after

与预处理_before对应的是后处理_after。云对象内可以创建一个特殊的方法_after用来再加工处理本次调用方法的返回结果或者抛出的错误

复制代码
_after(error, result) {
		if (error) {
			throw error
		}
	    // 追加
		// result.author="ABC"
		return result;
	},

const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
	_before: function() { // 通用预处理器
		// 开始的时间
		this.startTime = Date.now()
		this.params = {
			name: "ABC"
		};
		this.clientInfo = this.getClientInfo();
		//  主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
		if (false) {
			throw new Error("没有权限");
		}
	},
	// 不传值时默认size=3
	async getUser(size = 3) {
		let res = await dbJQL.collection("demo-user")
			.limit(size)
			.get()
		return res;
	},
	async addUser(params = {}) {
		let res = await dbJQL.collection("demo-user")
			.add(params)
		return res;
		console.log(res);
	},
	async updateUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.update({
				like: ["唱", "跳", "rap", "篮球"]
			})
		// let res = await db.collection("demo-user")
		// 	.doc(id)
		// 	.update({
		// 		like: dbCmd.push(["踢足球"]),
		// 	})
		console.log(res);
	},
	async removeUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.remove();
		console.log(res);
	},
	_after(error, result) {
		if (error) {
			throw error
		}
		// 追加
		// result.author="ABC"

		// 查询数据用了多少时间
		// result.timeCost = Date.now() - this.startTime

		return result;
	},
}

17.向数据库增加随机用户信息

复制代码
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
	_before: function() { // 通用预处理器
		// 开始的时间
		this.startTime = Date.now()
		this.params = {
			name: "ABC"
		};
		this.clientInfo = this.getClientInfo();
		//  主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
		if (false) {
			throw new Error("没有权限");
		}
	},
	// 不传值时默认size=3
	async getUser(size = 3) {
		let res = await dbJQL.collection("demo-user")
			.limit(size)
			.get()
		return res;
	},
	async addUser(params = {}) {
		let res = await dbJQL.collection("demo-user")
			.add(params)
		return res;
		console.log(res);
	},
	async updateUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.update({
				like: ["唱", "跳", "rap", "篮球"]
			})
		// let res = await db.collection("demo-user")
		// 	.doc(id)
		// 	.update({
		// 		like: dbCmd.push(["踢足球"]),
		// 	})
		console.log(res);
	},
	async removeUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.remove();
		console.log(res);
	},
	
	async demo() {
		let username = "匿名" + Math.random().toString(36).substring(3, 9);
		let rdmage = Math.floot(Math.random() * (50 - 10 + 1) + 10)+"";
		let res = await dbJQL.collection("demo-user")
			.add({
				name: username,
				age: rdmage
			});
		return res
	},
	_after(error, result) {
		if (error) {
			throw error
		}
		// 追加
		result.author = "ABC"

		// 查询数据用了多少时间
		result.timeCost = Date.now() - this.startTime

		return result;
	},
}

定时运行 _timing

在 uniCloud web控制台可以配置定时任务。给一个云对象配置后,将定时执行该云对象的内置方法 _timing

定时触发 | uniCloud

云函数package.json | uniCloud

cloudfunction-config

其中cloudfunction-config字段是云函数配置,支持的配置如下

复制代码
{
  "concurrency": 10, // 单个云函数实例最大并发量,不配置的情况下默认是1
  "memorySize": 512, // 函数的最大可用内存,单位MB,可选值: 128|256|512|1024|2048,默认值256,阿里云正式版默认512
  "timeout": 60, // 函数的超时时间,单位秒,默认值5。阿里云最长为120秒,阿里云在定时触发时最长可以是7200秒
  // triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
  "triggers": [{ // 阿里云腾讯云均为此形式,请阅读下方说明
      // name: 触发器的名字,规则见https://uniapp.dcloud.net.cn/uniCloud/trigger,name不对阿里云生效
      "name": "myTrigger",
      // type: 触发器类型,目前仅支持 timer (即 定时触发器),type不对阿里云生效
      "type": "timer",
      // config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见https://uniapp.dcloud.net.cn/uniCloud/trigger。使用阿里云时会自动忽略最后一位,即代表年份的一位在阿里云不生效
      "config": "0 0 2 1 * * *"
  }],
  // 云函数Url化path部分
  "path": "",
  "runtime": "", // nodejs版本,可选Nodejs8、Nodejs12、Nodejs14、Nodejs16、Nodejs18、Nodejs20
  "keepRunningAfterReturn": true // 是否在云函数return之后继续执行,仅腾讯云nodejs12生效,详情见下方说明
}

定时任务triggers

支付宝云与阿里云定时触发的cron表达式不支持代表年的第七位,但是在package.json内配置时仍需将第七位设置为*。

/uniCloud-alipay/cloudfunctions/demoObj/package.json

复制代码
{
	"name": "demoObj",
	"dependencies": {},
	"extensions": {
		"uni-cloud-jql": {}
	},
	"cloudfunction-config": {
		"memorySize": 256,
		"timeout": 60,//超时时间
		"triggers": [{

		}],
		"path": "",
		"runtime": "Nodejs18"
	}
}

/uniCloud-alipay/cloudfunctions/demoObj/package.json

复制代码
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
	_before: function() { // 通用预处理器
		// 开始的时间
		this.startTime = Date.now()
		this.params = {
			name: "ABC"
		};
		this.clientInfo = this.getClientInfo();
		//  主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
		if (false) {
			throw new Error("没有权限");
		}
	},
	// 不传值时默认size=3
	async getUser(size = 3) {
		let res = await dbJQL.collection("demo-user")
			.limit(size)
			.get()
		return res;
	},
	async addUser(params = {}) {
		let res = await dbJQL.collection("demo-user")
			.add(params)
		return res;
		console.log(res);
	},
	async updateUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.update({
				like: ["唱", "跳", "rap", "篮球"]
			})
		// let res = await db.collection("demo-user")
		// 	.doc(id)
		// 	.update({
		// 		like: dbCmd.push(["踢足球"]),
		// 	})
		console.log(res);
	},
	async removeUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.remove();
		console.log(res);
	},

	async demo() {
	/* 	let username = "匿名" + Math.random().toString(36).substring(3, 9);
		let rdmage = Math.floot(Math.random() * (50 - 10 + 1) + 10) + "";
		let res = await dbJQL.collection("demo-user")
			.add({
				name: username,
				age: rdmage
			});
		return res */
	},

	_after(error, result) {
		if (error) {
			throw error
		}
		// 追加
		result.author = "ABC"

		// 查询数据用了多少时间
		result.timeCost = Date.now() - this.startTime

		return result;
	},

	async _timing() {
		let username = "匿名" + Math.random().toString(36).substring(3, 9);
		let rdmage = Math.floor(Math.random() * (50 - 10 + 1)) + 10 + "";
		let res = await dbJQL.collection("demo-user").add({
			name: username,
			age: rdmage
		})
		console.log(res);
		return res;
	}
	
}

18.云对象url化可以自主开发api接口

url化 | uniCloud

复制代码
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
	_before: function() { // 通用预处理器
		// 开始的时间
		this.startTime = Date.now()
		this.params = {
			name: "ABC"
		};
		this.clientInfo = this.getClientInfo();
		//  主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
		if (false) {
			throw new Error("没有权限");
		}
	},
	// 不传值时默认size=3
	async getUser({size = 3} = params) {
		// !isNaN(size) :
		// 取反操作,表示 "如果 size 是有效数字"
		if (!isNaN(size)) {
			size = Number(size)
		} else {
			return {
				errMsg: "参数格式有误,需要number类型"
			}
		}
		let res = await dbJQL.collection("demo-user")
			.limit(size)
			.get()
		return res;
	},
	async addUser(params = {}) {
		let res = await dbJQL.collection("demo-user")
			.add(params)
		return res;
		console.log(res);
	},
	async updateUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.update({
				like: ["唱", "跳", "rap", "篮球"]
			})
		console.log(res);
	},
	async removeUser(id = "") {
		let res = await dbJQL.collection("demo-user")
			.doc(id)
			.remove();
		console.log(res);
	},

	async demo() {
		/* 	let username = "匿名" + Math.random().toString(36).substring(3, 9);
			let rdmage = Math.floot(Math.random() * (50 - 10 + 1) + 10) + "";
			let res = await dbJQL.collection("demo-user")
				.add({
					name: username,
					age: rdmage
				});
			return res */
	},

	_after(error, result) {
		if (error) {
			throw error
		}
		// 追加
		// result.author = "ABC"

		// 查询数据用了多少时间
		// result.timeCost = Date.now() - this.startTime

		return result;
	},

	async _timing() {
		let username = "匿名" + Math.random().toString(36).substring(3, 9);
		let rdmage = Math.floor(Math.random() * (50 - 10 + 1)) + 10 + "";
		let res = await dbJQL.collection("demo-user").add({
			name: username,
			age: rdmage
		})
		console.log(res);
		return res;
	}

}

19.内置云存储介绍uni.chooselmage本地选择图片

内置云存储的上传方式有3种:

  1. web界面:即在uniCloud控制台 web控制台,点击云存储,通过web界面进行文件上传。该管理界面同时提供了资源浏览、删除等操作界面。
  2. 客户端API或组件上传:在前端js中编写uniCloud.uploadFile,或者使用uni ui的FilePicker组件,文件选择+上传均封装完毕。
  3. 云函数上传文件到云存储:即在云函数js中编写uniCloud.uploadFile

uni.chooseImage(OBJECT) | uni-app官网

布局

相关推荐
KFCgrandpahhh5 分钟前
从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.13
linux·c语言·学习
CDA数据分析师干货分享8 分钟前
【CDA 新一级】学习笔记第1篇:数据分析的时代背景
大数据·笔记·学习·数据分析·cda证书·cda数据分析师
月盈缺3 小时前
学习嵌入式的第十九天——Linux——文件编程
学习
梦幻精灵_cq4 小时前
《书写范式》——代码如诗,诗娟代码(Python)(附精巧“九九表”生成代码)
学习
菜菜子爱学习4 小时前
Nginx学习笔记(七)——Nginx负载均衡
笔记·学习·nginx·负载均衡·运维开发
Laplaces Demon5 小时前
Spring 源码学习(十)—— DispatcherServlet
java·后端·学习·spring
栈溢出了5 小时前
go学习笔记-结构体
笔记·学习
努力自学的小夏8 小时前
RK3568 Linux驱动学习——新字符设备驱动
linux·arm开发·驱动开发·笔记·学习
蓝澈11219 小时前
jvm学习笔记之jvm的生命周期和发展历程
jvm·笔记·学习