当前位置: 首页 > article >正文

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

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._idreturn 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._idreturn 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.htmlref 就是定义这个表单的标识 model:数据rules:校验规则label-width 加冒号绑定就数字,不加冒号就要写成100px,不能rpxlabel-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>

相关文章:

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

1、概述 已经通过好几个篇幅来说明商家信息&#xff0c;包括logo、商家名称&#xff0c;地址&#xff0c;电话以及商家简介。通过表单组件和标签&#xff0c;以及我们的文件上传标签&#xff0c;都做了说明。&#xff08;logo上传&#xff0c;用的文件上传组件是上传到公共的数…...

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…...

java的Stream流处理

Java Stream 流处理详解 Stream 是 Java 8 引入的一个强大的数据处理抽象&#xff0c;它允许你以声明式方式处理数据集合&#xff08;类似于 SQL 语句&#xff09;&#xff0c;支持并行操作&#xff0c;提高了代码的可读性和处理效率。 一、Stream 的核心概念 1. 什么是 Str…...

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…...

redis数据结构-03 (HMSET、HGET、HGETALL)

Redis 哈希介绍&#xff1a;HMSET、HGET、HGETALL Redis 哈希是一种强大的数据结构&#xff0c;允许您在单个键内存储字段值对的集合。它们对于表示对象、配置或任何可以自然分组到字段中的数据非常有用。本课将向您介绍使用 Redis 哈希的基本命令&#xff1a; HMSET 、 HGET …...

2025年01月09日德美医疗前端面试

目录 vue2 的双向绑定的原理vue3 的双向绑定原理vue 的生命周期vue 子组件为何不能修改父组件的值js delete 删除数组的某一个值会怎么样vue 和 react 的 diff 算法什么是闭包原型链this指向 vue2 的双向绑定的原理 以下是 Vue 2 双向绑定的原理&#xff1a; 1. 核心概念 …...

快速理解动态代理

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

实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API

实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API 理论千遍,不如动手一遍!在前面几篇文章中,我们了解了 Serverless 的概念、FaaS 的核心原理以及 BaaS 的重要作用。现在,是时候把这些知识运用起来,亲手构建一个简单但完整的 Serverless 应用了。 …...

spark算子介绍

目录 1. 转换算子&#xff08;Transformation&#xff09;1.1 常用转换算子 2. 行动算子&#xff08;Action&#xff09;2.1 常用行动算子 3. 转换算子与行动算子的区别4. 示例代码5. 总结 在Spark中&#xff0c;算子&#xff08;Operator&#xff09;是对数据集&#xff08;RD…...

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;优点是…...

RAID磁盘阵列的概念(自用留档)

概念 RAID磁盘阵列是由若干个磁盘组成的磁盘组。 磁盘组可以恢复意外丢失的数据&#xff0c;保证了数据的安全性。 种类 根据实际情况的不同&#xff0c;RAID有若干种&#xff0c;以一个具有三块硬盘的硬盘组为例&#xff1a; RAID 0&#xff1a;将文件拆分成三份分别放到三…...

设计模式简述(十八)享元模式

享元模式 描述基本组件使用 描述 当内存中存在大量类似的对象时&#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;其他的…...

MySQL数据库迁移SQL语句指南

MySQL数据库迁移SQL语句指南 一、基础迁移方法 1. 使用mysqldump进行全量迁移 -- 导出源数据库&#xff08;在命令行执行&#xff09; mysqldump -u [源用户名] -p[源密码] --single-transaction --routines --triggers --events --master-data2 [数据库名] > migration…...

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赋能自动驾驶:如何打造高效的环境感知系统

Python赋能自动驾驶:如何打造高效的环境感知系统 大家好,我是 Echo_Wish,今天我们来聊聊自动驾驶里的“眼睛”——环境感知系统,以及如何用 Python 实现它。 自动驾驶的核心目标是让车辆在没有人工干预的情况下安全行驶,而要做到这一点,环境感知系统必须实时获取并理解…...

ST表(稀疏表)

对ST表进行一个简单的总结&#xff0c;它可以实现O(1)的静态区间查询&#xff0c;可以适用于查询操作频繁但数据不修改的场景 题目来源 https://www.luogu.com.cn/problem/P3865 题目介绍 给定一个长度为 N 的数列&#xff0c;和 M 次询问&#xff0c;求出每一次询问的区间…...

Java常用类-比较器

目录 一、为什么需要比较器&#xff1f;二、核心差异速记表三、Comparable&#xff1a;对象自带的 “默认规则”1. 核心作用2. 源码定义3. 实战&#xff1a;给Student类加默认规则4. 源码验证&#xff08;以Integer为例&#xff09; 四、Comparator&#xff1a;临时的 “外部规…...

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;日…...