uniapp-商城-52-后台 商家信息(商家信息数据,云对象使用)

news2025/7/19 4:18:28

1、概述

        已经通过好几个篇幅来说明商家信息,包括logo、商家名称,地址,电话以及商家简介。通过表单组件和标签,以及我们的文件上传标签,都做了说明。(logo上传,用的文件上传组件是上传到公共的数据库,并没有整合上传到项目定义或需要的数据库)

        下面就是关键的步骤,如何将数据上传到我们自己的数据库。前面的分类我们直接在页面中进行的数据上传和使用。但一般不这样使用,一般是采用云对象的方式来处理数据的交互,页面上主要做业务逻辑的实现,以此来实现前后对分离。

2、创建云对象

        云对象是把云函数实现的方法集中放在一起,然后通过一个接口进行调用,比如所有逻辑层的增删改查一起实现,管理和使用都较为方便。

        2.1 到项目中的云数据库中,cloudfunction--->创建云对象

        2.2 创建一个云对象 green-mall-brand

        2.3 基本样式

创建一个云对象 green-mall-brand,包含不同的数据库操作。

生成重要的文件index.obj.js 这个就是云对象,在该文件中,需要引入数据库,对数据库进行增删改查等。

3、调试和使用

3.1 green-mall-brand下进行调试

在这里进行调试就会生成green-mall-brand.parm.js的调试文件,可以在这里进行调用相应的方法,比如这里的add get update等等,但是一般用的比较少。

3.2 将该云对象调用到业务逻辑页面

一般用本地调试的较少,大多数都是用到逻辑页面进行使用,使用前需要将该云对象定义到业务逻辑页面,这里将green-mall-brand 引入了brand的页面。

const brandCloudObj = uniCloud.importObject("green-mall-brand")

3.3 使用云对象提供的方法

green-mall-brand中的index.obj.js 提供add get update几种方法,我们可以在这里编写方法进行调用。

3.3.1 get

3.3.2 add和update

3.4 传递页面逻辑的值给云对象中的接口

3.4.1 在云对象中处理

预处理定义一个参数变量  

this.params = this.getParams()[0]

如下:

	_before: async function () { // 通用预处理器
		this.userInfo =await utils.getUserInfo(this);
		this.params = this.getParams()[0]
	},

3.4.2 在不同接口中进行参数值的调用

在接口中使用定义的参数params

	async get(){		
		return await db.collection("green-mall-brand").get()
	},
	async add(){
		//需要登录
		if(!this.userInfo.uid) return {msg:"没有权限",code:-1};
		//需要管理权限
		if(!this.userInfo.role.includes('manage')) return {msg:"没有权限",code:-1};	  
		return await db.collection("green-mall-brand").add(this.params)
	},
	async update(){
		if(!this.userInfo.uid) return {msg:"没有权限",code:-1};
		if(!this.userInfo.role.includes('manage')) return {msg:"没有权限",code:-1};	
		let params = {...this.params};
		delete params._id
		return await db.collection("green-mall-brand").doc(this.params._id).update(params)
	}

3.4.3 云对象整体的参数使用代码

这里我们可以看到,当云对象执行了其中的接口,也会进行结果的返回

3.4.4 页面逻辑对参数的值的传递

3.4.4.1 页面逻辑在定义表单组件就进行了双向绑定,这样就把数据传给这里的参数变量 brandFromData,都用了v-model

3.4.4.2 logo数据的处理 在提交时 onsubmit 进行了抽取,减少了很多不需要的属性值,通过执行addAndUpdate 判断是否有id值来判断该操作添加还是刷新。

3.4.5 进入页面应该是先获取数据 get 和onload

3.4.5.1 页面逻辑 onload

获取到数据就显示res.data[0]的值,没有就直接返回。

3.4.5.2 数据库获取数据  云对象中实现get 记得return

return 页面才能获取到数据。

3.5 数据库的创建

藏这里,你找到了吗?

说了很多了,但是一直没有说数据库创建,前面我们都有用schema进行表结构定义

这里没有进行表结构定义,直接就是云对象需要使用时,页面逻辑来调用云对象会自己自动创建green-mall-brand这个数据库。

4、完整的代码

4.1 云对象代码

其中package.json 为自动生成

green-mall-brand.parm.js 本地调试

下面只是云对象的代码(indexobj.js)

// 云对象教程: 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 utils = require("self-utils")
module.exports = {
	_before: async function () { // 通用预处理器
		this.userInfo =await utils.getUserInfo(this);
		this.params = this.getParams()[0]
	},
	async get(){		
		return await db.collection("green-mall-brand").get()
	},
	async add(){
		//需要登录
		if(!this.userInfo.uid) return {msg:"没有权限",code:-1};
		//需要管理权限
		if(!this.userInfo.role.includes('manage')) return {msg:"没有权限",code:-1};	  
		return await db.collection("green-mall-brand").add(this.params)
	},
	async update(){
		if(!this.userInfo.uid) return {msg:"没有权限",code:-1};
		if(!this.userInfo.role.includes('manage')) return {msg:"没有权限",code:-1};	
		let params = {...this.params};
		delete params._id
		return await db.collection("green-mall-brand").doc(this.params._id).update(params)
	}
}

	
	
	
	/**
	 * method1方法描述
	 * @param {string} param1 参数1描述
	 * @returns {object} 返回值描述
	 */
	/* 
	method1(param1) {
		// 参数校验,如无参数则不需要
		if (!param1) {
			return {
				errCode: 'PARAM_IS_NULL',
				errMsg: '参数不能为空'
			}
		}
		// 业务逻辑
		
		// 返回结果
		return {
			param1 //请根据实际需要返回值
		}
	}
	*/
}

4.2、页面逻辑

<template>
	<view class="brand">
		<!-- <uni-forms ref="brandRef" :model="brandFormData" :rules="brandRules" :label-width="100" label-align="right"> -->
		<uni-forms ref="brandRef" :model="brandFormData" :label-width="100" label-align="right">
			<!--
			https://uniapp.dcloud.net.cn/component/uniui/uni-forms.html
			ref 就是定义这个表单的标识 
			model:数据
			rules:校验规则
			label-width 加冒号绑定就数字,不加冒号就要写成100px,不能rpx
			label-align 对齐方式
			-->
			<uni-forms-item label="品牌招牌" required name="thumb">
				<uni-file-picker v-model="brandFormData.thumb" fileMediatype="image" mode="grid" :limit="1" />
				<!-- 
				 v-model="brandFormData.thumb"   双向绑定 所里略图  这里默认是一个数组 下面定义data 就一个数组
				 fileMediatype  文件类型是图像
				 mode  文件呈现的样式 要不是list 列表 要不是九宫格的grid 
				 上面是三个基本的属性
				 limit 限制传几个文件  一般logo就一张。
				 -->
			</uni-forms-item>


			<uni-forms-item label="品牌名称" name="name" required>
				<!-- name 是标签名字 后面借来标识是哪一个被验证  required 是强制输入项目 必填-->
				<uni-easyinput type="text" v-model="brandFormData.name" placeholder="请输入品牌名称" />
			</uni-forms-item>

			<uni-forms-item label="商户电话" name="mobile" required>
				<uni-easyinput type="text" v-model="brandFormData.mobile" placeholder="请输入商户电话" />
			</uni-forms-item>

			<uni-forms-item label="商户地址" name="address" required>
				<uni-easyinput v-model="brandFormData.address" placeholder="请输入商户地址" />
			</uni-forms-item>

			<uni-forms-item label="商家介绍" name="about">
				<uni-easyinput v-model="brandFormData.about" placeholder="请输入商家介绍" type="textarea" />
			</uni-forms-item>


			<button type="primary" @click="onSubmit">提交信息</button>
			<!-- type 按钮样式选择  -->
		</uni-forms>
	</view>
</template>

<script>
	import {
		mapMutations
	} from "vuex"
	const brandCloudObj = uniCloud.importObject("green-mall-brand")
	export default {
		data() {
			return {
				brandFormData: {
					thumb: [],   //数组
					name: "", //品牌名称
					mobile: "",
					address: "",
					about: ""
				},
				brandRules: {
					thumb: {
						rules: [{
							required: true,
							errorMessage: "品牌招聘需要上传"
						}]
					},
					name: {
						rules: [{
							required: true,
							errorMessage: "请输入正确的品牌名称"
						}, {
							minLength: 3,
							maxLength: 20,
							errorMessage: '长度在{minLength}到{maxLength}的字符'
						}]
					},
					mobile: {
						rules: [{
							required: true,
							errorMessage: "请输入正确的手机号码"
						}, {
							validateFunction: function(rule, value, data, callback) {
								let res = /^1[3-9]\d{9}$/.test(value);
								if (!res) {
									callback("手机格式不正确")
								}
								return;
							}
						}]
					},
					address: {
						rules: [{
							required: true,
							errorMessage: "请输入正确的商户地址"
						}, {
							minLength: 6,
							maxLength: 100,
							errorMessage: '长度在{minLength}到{maxLength}的字符'
						}]
					}

				}
			};
		},

		onLoad() {
			this.isManage();
			this.getBrand();
		},
		
		//这是日狗了,它大爷的
		onReady() {
			this.$nextTick(() => {
				this.$refs.brandRef.setRules(this.brandRules);
			});
		},




		methods: {
			...mapMutations(["SET_BRAND"]),
			//获取数据库中的品牌信息
			getBrand() {
				brandCloudObj.get().then(res => {
					if (!res.data.length) return;
					this.brandFormData = res.data[0]
				})
			},


			//点击提交按钮
			onSubmit() {
				this.$refs.brandRef.validate().then(res => {
					let arr = this.brandFormData.thumb.map(item => {
						return {
							extname: item.extname,
							url: item.url,
							name: item.name,
							size: item.size
						}
					})
					this.brandFormData.thumb = arr;
					this.addAndUpdate();
				}).catch(err => {
					// console.log(err);
				})
			},
			//新增或者修改品牌啊信息
			async addAndUpdate() {
				let title;
				if (this.brandFormData._id) {
					let res = await brandCloudObj.update(this.brandFormData)
					title = "修改成功"
				} else {
					//新增
					await brandCloudObj.add(this.brandFormData)
					title = "新增成功"
				}
				uni.showToast({
					title,
					mask: true
				})

				setTimeout(() => {
					uni.navigateBack();
				}, 1500)

				this.SET_BRAND(this.brandFormData);
			}
		}
	}
</script>

<style lang="scss" scoped>
	.brand {
		padding: 30rpx;
		//间距是30rpx, 每一个标签之 标签内部 需要label-width 来调整
	}
</style>

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

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

相关文章

MySQL 索引设计宝典:原理、原则与实战案例深度解析

目录 前言第一章&#xff1a;索引设计的基础原则 (知其然&#xff0c;更要知其所以然)第二章&#xff1a;实战案例&#xff1a;电商订单系统的索引设计第三章&#xff1a;索引设计的实践流程总结结语 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜…

C#上传文件到腾讯云的COS

测试环境&#xff1a; vs2022 .net 6控制台应用程序 测试步骤如下&#xff1a; 1 添加子用户&#xff0c;目前是为了拿到secretId和secretKey&#xff0c;打开添加子用户界面链接&#xff1a;https://console.cloud.tencent.com/cam 并为子用户添加API 密钥 2 通过链接htt…

C PRIMER PLUS——第9节:动态内存分配、存储类别、链接和内存管理

目录 1.动态内存分配 1.1 malloc 函数 1.2 calloc 函数 1.3 realloc 函数 1.4 free 函数 1.5常见错误 1.6综合例题 2.C语言的内存结构 3.存储类别 3.1作用域&#xff08;Scope&#xff09; 3.2链接&#xff08;Linkage&#xff09; 3.3存储期&#xff08;Storage Du…

作业...

基础配置 RI R2 R3 R4 R5 例如R1 BGP配置 1,R1和R2之间使用直连接口IP地址来建立EBGP对等体关系 2、R2、R3、R4之间配置OSPF协议&#xff0c;保证各设备之间的网络互通&#xff0c;且通过重发布的方式发布路由 查看R2、R3、R4的OSPF路由表&#xff1a; \ R2、R3、R4使用环…

IC ATE集成电路测试学习——电流测试的原理和方法

电流测试 我们可以通过电流来判断芯片的工作状态时&#xff0c;首先先了解下芯片的电流是如何产生的。 静态电流 理论上&#xff0c;CMOS结构的芯片静态时几乎不耗电 CMOS基本结构&#xff1a;Pmos Nmos 串联当逻辑电平稳定时&#xff1a; ➜ 要么Pmos导通&#xff0c;Nmo…

快速理解动态代理

什么是动态代理(Java核心技术卷1的解释) 动态代理是一种运行时生成代理对象的技术&#xff0c;其本质是通过字节码增强在不修改原始类代码的前提下&#xff0c;动态拦截并扩展目标对象的行为。它通过代理对象对原始方法的调用进行拦截&#xff0c;并在方法执行前后注入自定义逻…

AugmentCode 非常昂贵的新定价

AugmentCode 现在的价格比 Cursor 和 Windsurf 的总和还要贵。 AugmentCode 曾是我开发工作流程的常用工具。出乎意料的是,他们改变了定价结构,让开发者们震惊不已。 原来的30 美元月费已经增长为50 美元月费,这是一个67%的增长。 改变我看法的不仅仅是价格上涨,还有他…

前端面试2

1. 面试准备 1. 建立自己的知识体系 思维导图ProcessOn框架Vue elementUI自查 https://zh.javascript.info/ 借鉴 https://juejin.cn/post/6844904103504527374http://conardli.top/blog/article/https://github.com/mqyqingfeng/Bloghttp://47.98.159.95/my_blog/#html 2.技能…

大疆卓驭嵌入式面经及参考答案

FreeRTOS 有哪 5 种内存管理方式&#xff1f; heap_1.c&#xff1a;这种方式简单地在编译时分配一块固定大小的内存&#xff0c;在整个运行期间不会进行内存的动态分配和释放。它适用于那些对内存使用需求非常明确且固定&#xff0c;不需要动态分配内存的场景&#xff0c;优点是…

架构进阶:74页数据架构设计总体规划方案【附全文阅读】

本文讨论了数据资源规划在信息化战略规划中的重要性&#xff0c;详细阐述了数据资源规划的方法与过程&#xff0c;包括系统架构、业务能力模型、数据架构等。 文章指出&#xff0c;数据资源规划需要梳理企业级数据模型&#xff0c;明确数据分布和流向&#xff0c;建立统一的数据…

情书大全v3.0.1

《情书大全》是一款致力于情书写作的手机应用程序&#xff0c;内置了丰富的情书范本及定制化服务。用户无论是想要倾诉爱意、交流友情还是传递亲情&#xff0c;都能在这款应用中寻得合适的情书样本。用户还可以根据自己的需求对模板进行编辑和调整&#xff0c;轻松创作出感人至…

基于OpenCV的人脸识别:LBPH算法

文章目录 引言一、概述二、代码实现1. 代码整体结构2. 导入库解析3. 训练数据准备4. 标签系统5. 待识别图像加载6. LBPH识别器创建7. 模型训练8. 预测执行9. 结果输出 三、 LBPH算法原理解析四、关键点解析五、改进方向总结 引言 人脸识别是计算机视觉领域的一个重要应用&…

鸿蒙 使用动画 简单使用

鸿蒙 使用动画 简单使用 动画就两个&#xff0c;属性动画和转场动画 属性动画只是组件的属性发生变化&#xff0c;而转场动画是指对将要出现或消失的组件做动画&#xff0c;而文档的其他动画只是给这两个动画效果锦上添花罢了 这篇文章简单介绍这两个动画&#xff0c;其他的…

arcgis和ENVI中如何将数据输出为tif

一、arcgis中转换为tif 右键图层&#xff1a; Data -> Export Data, 按照图示进行选择&#xff0c;选择tiff格式导出即可&#xff0c;还可以选择其他类型的格式&#xff0c;比如envi。 二、 ENVI中转换为tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

RagFlow 完全指南(一):从零搭建开源大模型应用平台(Ollama、VLLM本地模型接入实战)

文章目录 1. 相关资源2. 核心特性3. 安装与部署3.1 环境准备3.2 部署RagFlow3.3 更新RagFlow3.4 系统配置 4. 接入本地模型4.1 接入 Ollama 本地模型4.1.1 步骤4.1.2 常见问题 4.2 接入 VLLM 模型 5. 应用场景6. 总结 1. 相关资源 官网GitHub文档中心 2. 核心特性 &#x1f…

计算机网络 4-2-1 网络层(IPv4)

2 IPv4分组 各协议之间的关系 IP协议(Internet Protocol, 网际协议)是互联网的核心&#xff01; ARP协议用于查询同一网络中的<主机IP地址&#xff0c;MAC地址>之间的映射关系 ICMP协议用于网络层实体之间相互通知“异常事件” IGMP协议用于实现IP组播 2.1 结构<首…

Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)

一、模型评估 1. 准确率&#xff08;Accuracy&#xff09;&#xff1a;这是最基本的评估指标之一&#xff0c;表示模型在测试集上正确 分类样本的比例。对于分类任务而言&#xff0c;准确率是衡量模型性能的直观标准。 2. 损失函数值&#xff08;Loss&#xff09;&#xff1…

Linux工作台文件操作命令全流程解析(高级篇之vim和nano精讲)

全文目录 1 简单易用的 Nano (入门之选)1.1 适用场景1.2 安装命令1.3 基础操作1.4 优点 2 功能强大的 Vim2.1 适用场景2.2 安装命令2.3 模式说明‌2.4 常用命令2.4.1 普通模式2.4.2 编辑模式2.4.3 可视模式2.4.4 命令行模式 3 参考文献 写在前面 作为运维或者研发&#xff0c;日…

大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现

文章目录 大数据产品销售数据分析&#xff1a;基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构数据可视化模块设计图后台管理模块设计数据库设计 五、开发技术介绍Flask框架Python爬…

VS2022 Qt配置Qxlsx

目录 1、下载QXlsx&#xff0c;并解压文件夹 ​编辑2、打开VS2022配置QXlsx 3、VS配置Qxslx库 方法一&#xff1a;常规方法 方法二&#xff1a;直接使用源码 方法三&#xff1a;将QXlsx添加到Qt安装目录&#xff08;暂时尝试未成功&#xff09; 1、下载QXlsx&#xff0c;…