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}]}],

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81828.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81828.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81828.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

digitalworld.local: VENGEANCE靶場

1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.182&#xff0c;靶場IP192.168.23.3 3&#xff0c;對靶機進行端口服務探測 nmap -sV -T4 -p- -A 192.168.23.3 端口號 協…

微店平臺店鋪商品接口開發指南

微店API獲取店鋪所有商品實現方案 以下是使用微店開放平臺API獲取店鋪所有商品的完整實現代碼&#xff0c;包含請求封裝、分頁處理和錯誤處理機制。 點擊獲取key和secret from weidian_api import WeidianAPI # 配置你的微店應用憑證 APP_KEY "your_app_key" APP_…

Proxmox 主機與虛擬機全部斷網問題排查與解決記錄

Proxmox 主機與虛擬機全部斷網問題排查與解決記錄 關鍵詞&#xff1a;Proxmox、e1000e、板載網卡、斷網、網絡橋接、Hardware Unit Hang、網卡掛死 背景 近期在使用 Proxmox VE 管理服務器時&#xff0c;遇到一個奇怪的問題&#xff1a;每當在某個虛擬機中執行某些操作&#x…

SpringBoot整合MQTT實戰:基于EMQX構建高可靠物聯網通信,從零到一實現設備云端雙向對話

一、引言 隨著物聯網(IoT)技術的快速發展&#xff0c;MQTT(Message Queuing Telemetry Transport)協議因其輕量級、低功耗和高效的特點&#xff0c;已成為物聯網設備通信的事實標準。本文將詳細介紹如何使用SpringBoot框架整合MQTT協議&#xff0c;基于開源MQTT代理EMQX實現設…

zData X zStorage 為什么采用全閃存架構而非混閃架構?

點擊藍字 關注我們 最近有用戶問到 zData X 的存儲底座 zStorage 分布式存儲為什么采用的是全閃存架構而非混閃架構&#xff1f;主要原因還是在于全閃存架構在性能和可靠性方面具有更顯著的優勢。zData X 的上一代產品 zData 的早期版本也使用了SSD盤作為緩存的技術架構&#x…

Fiddler抓包教程->HTTP和HTTPS基礎知識

1.簡介 有的伙伴可能會好奇&#xff0c;不是講解和分享抓包工具,怎么這里開始講解HTTP和HTTPS協議了。這是因為你對HTTP協議越了解&#xff0c;你就能越掌握Fiddler的使用方法&#xff0c;反過來你越使用Fiddler&#xff0c;就越能幫助你了解HTTP協議。 Fiddler無論對開發人員…

虛擬機NAT模式獲取不到ip

虛擬機NAT模式獲取不到ip 如圖所示 解決方案&#xff1a; 先查看NetworkManager是否啟動 systemctl status NetworkManager如果沒啟動就啟動一遍 使用DHCP手動獲取一遍ip sudo dhclient ens33成功得到ip 這是后遇到了另一個問題&#xff0c;ip釋放后&#xff0c;不能自動…

Sass 基礎用法速覽

Sass 基礎用法速覽 目錄 Sass 基礎用法速覽1. 什么是 Sass&#xff1f;2. 安裝 Sass2.1 使用 npm 安裝&#xff08;推薦&#xff09;2.2 使用 Dart Sass&#xff08;官方推薦&#xff09;2.3 使用 GUI 工具 3. Sass 基本用法3.1 編譯 Sass 4. Sass 語法詳解4.1 變量4.2 嵌套4.3…

洛谷B3840 [GESP202306 二級] 找素數

題目描述 小明剛剛學習了素數的概念&#xff1a;如果一個大于 1 的正整數&#xff0c;除了 1 和它自身外&#xff0c;不能被其他正整數整除&#xff0c;則這個正整數是素數。現在&#xff0c;小明想找到兩個正整數 A 和 B 之間&#xff08;包括 A 和 B&#xff09;有多少個素數…

idea部署本地倉庫和連接放送遠程倉庫

1.下載git&#xff0c;安裝好后任意地方又鍵會出現兩個帶git的東西 2.點擊bash here的那個&#xff0c;召喚出git的小黑窗&#xff0c;輸入 git config --global user.name "你自己取名" git config --global user.email "你自己輸入你的郵箱" 3.打開id…

C++(20): 文件輸入輸出庫 —— <fstream>

目錄 一、 的核心功能 二、核心類及功能 三、核心操作示例 1. 文本文件寫入&#xff08;ofstream&#xff09; 2. 文本文件讀取&#xff08;ifstream&#xff09; 3. 二進制文件操作&#xff08;fstream&#xff09; 四、文件打開模式 五、文件指針操作 六、錯誤處理技巧…

elementUI 循環出來的表單,怎么做表單校驗?

數據結構如下&#xff1a; diversionParamList: [ { length: null, positionNumber: null, value: null, } ] 思路&#xff1a;可根據 index 動態綁定 :props 屬性值&#xff0c;校驗規則寫在:rules <div class"config-item" v-for"(item, index) in form.…

x-cmd install | Pillager:Go 語言打造的敏感信息文件系統掃描利器

目錄 Pillager 的獨特優勢安裝Pillager 的應用場景Pillager 的核心功能 還在為文件系統中潛在的敏感信息泄露而擔憂嗎&#xff1f;Pillager 是一款由 Go 語言編寫的強大工具&#xff0c;旨在幫助你輕松掃描文件系統&#xff0c;發現隱藏的密鑰、密碼、API 令牌等敏感信息。 Pil…

大模型(2)——提示工程(Prompt Engineering)

文章目錄 一、提示工程的核心概念為什么需要提示工程&#xff1f; 二、提示設計的基本原則三、實用提示工程技巧1. 角色設定法2. 示例引導法&#xff08;Few-Shot Learning&#xff09;3. 分階段提問4. 負面約束5. 溫度&#xff08;Temperature&#xff09;控制 四、不同任務類…

環境搭建

一個簡單的請求在加入spring security之前的樣子, 在瀏覽器中輸入地址就可以直接訪問 <!--引入spring security依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>&…

院校機試刷題第六天:1134矩陣翻轉、1052學生成績管理、1409對稱矩陣

一、1134矩陣翻轉 1.題目描述 2.解題思路 很簡單的模擬題&#xff0c;甚至只是上下翻轉&#xff0c;遍歷輸出的時候先把最下面那一行輸出即可。 3.代碼 #include <iostream> #include <vector> using namespace std;int main() {int n;cin >> n;vector&l…

軟件架構風格系列(5):數據共享架構

數據共享架構&#xff1a;如何讓數據在系統間自由“流淌”&#xff1f; 引言 在企業數字化轉型的浪潮中&#xff0c;“數據孤島”成為橫在業務創新面前的大山&#xff1a;營銷系統的用戶畫像無法同步到客服系統&#xff0c;供應鏈的庫存數據難以為銷售決策提供支撐…… 此時&…

SAP-13-內表與工作區

內表 作用&#xff1a; 內表是 ABAP 程序中一種非常重要的數據結構&#xff0c;它類似于數據庫表&#xff0c;用于在程序運行時存儲和處理數據。與數據庫表不同的是&#xff0c;內表存在于程序的內存中&#xff0c;數據的讀寫速度比從數據庫中讀取要快很多。它可以存儲多條具有…

dali本地安裝和使用

Dali&#xff08;Distance-matrix ALIgnment&#xff09;是一種廣泛使用的蛋白質結構比對工具&#xff0c;主要用于比較蛋白質三維結構之間的相似性。它通過計算蛋白質結構之間的距離矩陣來評估結構之間的相似性&#xff0c;并生成比對結果。 1. 安裝 wget http://ekhidna2.b…

Unreal 從入門到精通之SceneCaptureComponent2D實現UI層3D物體360°預覽

文章目錄 前言SceneCaptureComponent2D實現步驟新建渲染目標新建材質UI控件激活3DPreview鼠標拖動旋轉模型最后前言 我們在(電商展示/角色預覽/裝備查看)等應用場景中,經常會看到這種3D展示的頁面。 即使用相機捕獲一個3D的模型的視圖,然后把這個視圖顯示在一個UI畫布上,…