uniapp-商城-64-后台 商品列表(商品修改---页面跳转,深浅copy应用,递归调用等)
完成了商品的添加和展示,下面的文字将继续进行商品页面的处理,主要为商品信息的修改的页面以及后天逻辑的处理。
本文主要介绍了商品信息修改页面的实现过程。首先,页面布局包括编辑和删除功能,未来还可添加上架和下架按钮。通过clickEdit
函数,用户点击商品ID后可跳转到修改页面,页面加载时根据传入的ID获取商品信息。商品数据的获取和更新通过云对象goodsCloudObj
实现,包括获取单个商品信息、更新商品数据等操作。此外,还涉及SKU数据的获取和表单提交后的数据处理,确保数据能够正确更新到数据库中。整个流程涵盖了从页面跳转、数据获取到数据库更新的完整逻辑。
1、页面布局
存在 删除和修改,以后还可以添加上架和下架的按钮。下面进行修改页面的处理和实现。
2、主要的页面布局
<!-- 编辑修改 -->
<view class="icon" @click="clickEdit(row._id)">
<u-icon name="edit-pen" size="25"></u-icon>
</view>
<!-- 删除该商品 -->
<view class="icon" @click="clickRemove(row._id)">
<u-icon name="trash" size="25"></u-icon>
</view>
3、页面修改函数 clickEdit 传入 参数是点击商品的 id
clickEdit
//点击跳转到修改页面
clickEdit(id){
uni.navigateTo({
url:"./add?id="+id
})
},
4、去到add页面上,处理带有id的页面路径
onLoad(e) { //进入页面就需要执行, e 就是传过来的值,如果是添加这个e 就是空
this.isManage();
goodID = e?.id ?? null // 如果 e 存在就获取 id 给goodID ,如果e不存在, goodID 就是null
if (goodID) this.getGoodsOne() //如果 goodID存在(也就是e存在),就执行
this.getSkuData(); //获取 sku的 数据
},
4.1 this.getGoodsOne 的函数接口,当然需要云对象,该云对象前面已经创建了。
const goodsCloudObj = uniCloud.importObject("green-mall-goods", {
"customUI": true
})
上面云对象,定义在页面上的。
//获取一个商品
async getGoodsOne() {
let res = await goodsCloudObj.getOne(goodID);
console.log(res);
this.goodsFormData = res.data[0] //数据中是一个数组,数组中也就一个值,所以[0]就是数组的第一个值
},
4.1.1 数据库的处理
async getOne(id) {
let res = await db.collection("green-mall-goods").doc(id).get();
res.data[0].price = res.data[0].price / 100
res.data[0].before_price = res.data[0].before_price ? res.data[0].before_price / 100 : null
return res
},
4.2 this.getSkuData 获取sku的数据 当然要云对象
const skuCloudObj = uniCloud.importObject("green-mall-sku", {
"customUI": true
});
//获取sku列表
async getSkuData() {
let res = await skuCloudObj.get();
this.skuArr = res.data
console.log(res);
},
4.3 更新数据和提交
//点击提交表单
onSubmit() {
this.$refs.goodsForm.validate().then(res => {
this.toDataBase();
}).catch(err => {
console.log(err);
})
},
4.3.1 toDataBase 将数据更新到数据库 根据goodID 存在否,存在就更新,不存在就添加
//上传到云数据库
async toDataBase() {
//这里缺少一个更新的按钮,需要在list中去实现,list跳转过来实现
// console.log(this.goodsFormData.thumb); //这里的数据太多了,需要处理一下
this.goodsFormData.thumb = this.goodsFormData.thumb.map(item => {
return {
url: item.url,
name: item.name,
extname: item.extname
}
})
let toastTit;
if (goodID) {
toastTit = "修改成功"
await goodsCloudObj.update(this.goodsFormData)
} else {
toastTit = "新增成功"
await goodsCloudObj.add(this.goodsFormData)
}
uni.showToast({
title: toastTit
})
setTimeout(() => {
uni.navigateBack()
}, 1500)
}
4.3.2 goodsCloudObj.update 更新数据 在green-mall-goods中
const goodsCloudObj = uniCloud.importObject("green-mall-goods", {
"customUI": true
})
async update(params) {
if (!this.userInfo.uid) return {
msg: "没有权限",
code: -1
};
if (!this.userInfo.role.includes('manage')) return {
msg: "没有权限",
code: -1
};
//深copy的应用 只有这样才能删除 id
let _params = {
...params
};
delete _params._id; //删除id id是不能更新
_params.price = Number(_params.price).toFixed(2) * 100
_params.before_price = _params.before_price ? Number(_params.before_price).toFixed(2) * 100 : null
//这里是用了深copy,删除了id ,但是params 中还有 id
await db.collection("green-mall-goods").doc(params._id).update(_params);
},
5、属性的修改(递归调用)
上面讲的是普通的修改,没有说属性这个修改。且在我们添加商品的时候,没有关注更新时,对属性修改的需要。
5.1 先看看,点击属性的界面需要
我们需要添加一个函数,来读取商品信息中,是否选中那些商品属性。 使用了arrSetCheck来实现。
当我们点击属性框,弹窗出来,就应该标识出 用√ 表示 被选中的属性父级
属性的子级 子选项, 用颜色来表示出来 被选中的子级。
如下图的界面
//点击选择属性
clickSelect() {
this.$refs.attrWrapPop.open(); //使用open方法弹出来
this.arrSetCheck(this.skuArr, this.goodsFormData.sku_select, "_id")
},
5.2 实现选中比对 ,使用递归的方式,也就是自己调用自己,数据查看最后的附录
参数是:二个数组,一个比对tag
this.skuArr, 默认的属性父级值
this.goodsFormData.sku_select, 商品选中的属性选项
"_id" 比对表示
如果 商品选中的属性选项 中 属性 id 和 默认的属性父级值 的 属性id 一样就给这个属性的check给一个true
//选中项的数组格式化
arrSetCheck(arr1, arr2, key) {
arr1.forEach(item => {
arr2.forEach(row => {
if (item[key] == row[key]) {
item.checked = true
if (item?.children?.length) this.arrSetCheck(item.children, row.children,
"name")
}
})
})
},
下面是比对 选中的子级:
item.children, 属性父级中的子级选项
row.children, 商品属性的子级选项(具有的子级属性)
"name":子级属性obj的键:name
如果 属性父级中的子级选项 的name 和 商品属性的子级选项(具有的子级属性) name 对应的值相等就给 这个选项的 check 一个true。
if (item?.children?.length) this.arrSetCheck(item.children, row.children,"name")
附录:
skuArr: [{_id:1,skuName:"颜色",checked:false,children:[{name:"红",checked:false},{name:"蓝",checked:false}]},{_id:2,skuName:"规格",checked:false,children:[{name:"M",checked:false},{name:"S",checked:false}]}],
相关文章:

uniapp-商城-64-后台 商品列表(商品修改---页面跳转,深浅copy应用,递归调用等)
完成了商品的添加和展示,下面的文字将继续进行商品页面的处理,主要为商品信息的修改的页面以及后天逻辑的处理。 本文主要介绍了商品信息修改页面的实现过程。首先,页面布局包括编辑和删除功能,未来还可添加上架和下架按钮。通过c…...

Dify的大语言模型(LLM) AI 应用开发平台-本地部署
前言 今天闲着,捣鼓一下 Dify 这个开源平台,在 mac 系统上,本地部署并运行 Dify 平台,下面记录个人在本地部署Dify 的过程。 Dify是什么? Dify是一个开源的大语言模型(LLM)应用开发平台&#…...

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线
以下通过点亮LED进行基本使用流程演示,实际可以连接复杂外设(SPI、CAN、ADC等) 单模块使用 RX、TX、5V和GND接到串口模块;X5接5V;Y2接LED;LED-接GND 串口模块插上电脑后,LED没有亮;因为此时模…...
移动端前端调试调研纪实:从痛点出发,到 WebDebugX 的方案落地
这个月我接到一个内部调研任务:为公司的新一代 Hybrid 框架选型合适的前端调试解决方案。初衷其实很简单——以前的调试方式效率太低,影响开发和测试协同,产品问题总是复现难、修复慢。 于是我花了两周时间,试用了包括 Eruda、Re…...

8 种快速易用的Python Matplotlib数据可视化方法
你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python 的 Matplotlib 库是你数据可视化的最佳伙伴!它简单易用、功能强大,能将枯燥的数字变成引人入胜的图表。无论是学生、数据分析师还是程序员&…...
【android bluetooth 协议分析 02】【bluetooth hal 层详解 3】【高通蓝牙hal主要流程介绍-上】
1. 背景 本节主要讨论 高通 蓝牙 hal 中,的一些流程。 看看你是否都清楚如下问题: 高通芯片电如何控制?串口是在哪里控制的?固件如何下载?初始化流程是怎么样的? 如果你已经对上述讨论的问题,…...

C# 深入理解类(实例构造函数)
实例构造函数 实例构造函数是一个特殊的方法,它在创建类的每个新实例时执行。 构造函数用于初始化类实例的状态。如果希望能从类的外部创建类的实例,需要将构造函数声明为public。 图7-2阐述了构造函数的语法。除了下面这几点,构造函数看起…...

RabbitMQ——消息确认
一、消息确认机制 生产者发送的消息,可能有以下两种情况: 1> 消息消费成功 2> 消息消费失败 为了保证消息可靠的到达消费者(!!!注意:消息确认机制和前面的工作模式中的publisher confi…...

测试W5500的第2步_使用ioLibrary库创建TCP客户端
ioLibrary库下载地址:文件下载地址:https://gitee.com/wiznet-hk/STM32F10x_W5500_Examples 源文件下载地址:https://gitee.com/wiznet-hk 没有注册的,只能复制粘贴了。 本文介绍了如何初始化STM32的硬件资源,配置W5500的网络参数ÿ…...

深度学习之用CelebA_Spoof数据集搭建一个活体检测-训练好的模型用MNN来推理
一、模型转换准备 首先确保已完成PyTorch到ONNX的转换:深度学习之用CelebA_Spoof数据集搭建活体检测系统:模型验证与测试。这里有将PyTorch到ONNX格式的模型转换。 二、ONNX转MNN 使用MNN转换工具进行格式转换:具体的编译过程可以参考MNN的…...
【Java】泛型在 Java 中是怎样实现的?
先说结论 , Java 的泛型是伪泛型 , 在运行期间不存在泛型的概念 , 泛型在 Java 中是 编译检查 运行强转 实现的 泛型是指 允许在定义类 , 接口和方法时使用的类型参数 , 使得代码可以在不指定具体类型的情况下操作不同的数据类型 , 从而实现类型安全的代码复用 的语言机制 . …...

开源安全大模型Foundation-Sec-8B实操
一、兴奋时刻 此时此刻,晚上22点55分,从今天早上6点左右开始折腾,花费了接近10刀的环境使用费,1天的休息时间,总算是把Foundation-Sec-8B模型跑起来了,中间有两次胜利就在眼前,但却总在远程端口转发环节出问题,让人难受。直到晚上远程Jupyter访问成功那一刻,眉开眼笑,…...

【JavaWeb】MySQL
1 引言 1.1 为什么学? 在学习SpringBootWeb基础知识(IOC、DI等)时,在web开发中,为了应用程序职责单一,方便维护,一般将web应用程序分为三层,即:Controller、Service、Dao 。 之前的案例中&am…...

微信小游戏流量主广告自动化浏览功能案例5
功能需求: 支持APP单行文本框输入1个小程序链接,在“文件传输助手”界面发送小程序链接并进入。 主要有“文章列表首页”和“文章内容”页面。每个页面支持点击弹窗广告、槽位广告、视频广告入口、视频广告内第三方广告。 弹窗广告、槽位广告、视频广…...
【C++ Primer 学习札记】函数传参问题
参考博文: https://blog.csdn.net/weixin_40026739/article/details/121582395 什么是形参(parameter),什么是实参(argument) 1. 形参 在函数定义中出现的参数可以看做是一个占位符,它没有数据…...

软件的技术架构、应用架构、业务架构、数据架构、部署架构
一、各架构定义 1. 技术架构(Technical Architecture) 定义:技术架构关注的是支撑系统运行的底层技术基础设施和软件平台,包括硬件、操作系统、中间件、编程语言、框架、数据库管理系统等技术组件的选择和组合方式。它描述了系统…...

CSS 文字样式全解析:从基础排版到视觉层次设计
CSS 文字样式目录 一、字体家族(font-family) 二、字体大小(font-size) 三、字体粗细(font-weight) 四、字体样式(font-style) 五、文本转换(text-transform…...

【高德开放平台-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
[特殊字符] React Fiber架构与Vue设计哲学撕逼实录
1. React这逼为什么搞Fiber? 他妈的DOM树太深:16版本前递归遍历组件树就像便秘,卡得页面直接阳痿调度器不给力:老子要打断渲染过程搞优先级调度,旧架构跟智障一样只会死循环增量渲染需求:Fiber链表结构让老…...

RabbitMQ的简介
三个概念 生产者:生产消息的服务消息代理:消息中间件,如RabbitMQ消费者:获取使用消息的服务 消息队列到达消费者的两种形式 队列(queue):点对点消息通信(point-to-point) 消息进入队…...
混合学习:Bagging与Boosting的深度解析与实践指南
引言 在机器学习的世界里,模型的性能优化一直是研究的核心问题。无论是分类任务还是回归任务,我们都希望模型能够在新的数据上表现出色,即具有良好的泛化能力。然而,实际应用中常常遇到模型过拟合(高方差)…...

使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第一部分)
第一部分:数据处理 import kagglehub# Download latest version path kagglehub.dataset_download("dylanjcastillo/7k-books-with-metadata")print("Path to dataset files:", path)自动下载该数据集的 最新版本 并返回本地保存的路径 impo…...

大语言模型 16 - Manus 超强智能体 Prompt分析 原理分析 包含工具列表分析
写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体(AI Agent),旨在实现“知行合一”,即不仅具备强大的语言理解和推理能力,还能自主执行复杂任务,直接交付完整成…...
物联网赋能7×24H无人值守共享自习室系统设计与实践!
随着"全民学习"浪潮的兴起,共享自习室市场也欣欣向荣,今天就带大家了解下在物联网的加持下,无人共享自习室系统的设计与实际方法。 一、物联网系统整体架构 1.1 系统分层设计 层级技术组成核心功能用户端微信小程序/H5预约选座、…...

以太联Intellinet带您深度解析PoE交换机的上行链路端口(Uplink Ports)
在当今网络技术日新月异的时代,以太网供电(PoE)交换机已然成为现代网络连接解决方案中不可或缺的“利器”。它不仅能够出色地完成数据传输任务,还能为所连接的设备提供电力支持,彻底摆脱了单独电源适配器的束缚,让网络部署更加简洁…...
浏览器播放 WebRTC 视频流
源码(vue) <template><video ref"videoElement" class"video" autoplay muted playsinline></video> </template><script setup lang"ts">import { onBeforeUnmount, onMounted, ref } fr…...
从零开始:使用 PyTorch 构建深度学习网络
从零开始:使用 PyTorch 构建深度学习网络 目录 PyTorch 简介环境配置PyTorch 基础构建神经网络训练模型评估与测试案例实战:手写数字识别进阶技巧常见问题解答 PyTorch 简介 PyTorch 是一个开源的深度学习框架,由 Facebook(现…...

分类算法 Kmeans、KNN、Meanshift 实战
任务 1、采用 Kmeans 算法实现 2D 数据自动聚类,预测 V180,V260 数据类别; 2、计算预测准确率,完成结果矫正 3、采用 KNN、Meanshift 算法,重复步骤 1-2 代码工具:jupyter notebook 视频资料 无监督学习ÿ…...
【razor】回环结构导致的控制信令错位:例如发送端收到 SR的问题
一、razor的echo程序 根据对 yuanrongxi/razor 仓库的代码和 echo 测试程序相关实现的分析,下面详细解读 echo 程序中 RTCP sender report(SR)、receiver report(RR)回显的问题及项目的解决方式。 1. 问题背景 在 RTP/RTCP 体系下,SR(Sender Report)由发送端周期性发…...

网络安全之身份验证绕过漏洞
漏洞简介 CrushFTP 是一款由 CrushFTP LLC 开发的强大文件传输服务器软件,支持FTP、SFTP、HTTP、WebDAV等多种协议,为企业和个人用户提供安全文件传输服务。近期,一个被编号为CVE-2025-2825的严重安全漏洞被发现,该漏洞影响版本1…...