uniapp-商城-61-后臺 新增商品(添加商品到數據庫)

完成商品的布局,完成商品的屬性添加,最后的目的還是要完成數據添加,將我們前臺的數據添加后臺的數據庫。

1、界面

2、點擊提交完成商品添加

點擊下方的提交按鈕,將數據添加到數據庫。

onSubmit? 使用該函數---見3

??????????? <view class="btnView">
??????????????? <button type="primary" @click="onSubmit">確認提交</button>
??????????? </view>

3、提交按鈕的處理邏輯

3.1?onSubmit接口

??????????? //點擊提交表單
??????????? onSubmit() {
??????????????? this.$refs.goodsForm.validate().then(res => {
??????????????????? this.toDataBase();?? //調用toDataBase?? ---見 3.2

??????????????? }).catch(err => {
??????????????????? console.log(err);
??????????????? })
??????????? },

這里看出,先找到了?goodsForm的表單名,進行驗證,通過驗證就執行?toDataBase

表單?goodsForm 在代碼的開始部分已經定義了

驗證采用的規則也在前面講過了

3.2?toDataBase 接口到數據庫保存

??????????? //上傳到云數據庫
??????????? async toDataBase() {
??????????????? //這里缺少一個更新的按鈕,需要在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 res = await goodsCloudObj.add(this.goodsFormData)? //使用云對象處理
??????????????? uni.showToast({
??????????????????? title: "新增商品成功"
??????????????? })
??????????????? setTimeout(() => {
??????????????????? uni.navigateBack()
??????????????? }, 1500)

??????????? }

3.2.1 處理圖片??this.goodsFormData.thumb

前面商家信息 也遇到這個問題,商家信息也要處理 ,主要默認上傳的圖片的數據太多了,需要清理一下,截取我們需要的數據。

??????????????? //這里缺少一個更新的按鈕,需要在list中去實現
??????????????? // console.log(this.goodsFormData.thumb);?? //這里的數據太多了,需要處理一下
??????????????? this.goodsFormData.thumb = this.goodsFormData.thumb.map(item => {
??????????????????? return {
??????????????????????? url: item.url,
??????????????????????? name: item.name,
??????????????????????? extname: item.extname
??????????????????? }
??????????????? })

?3.2.2 云對象上傳商品數據

3.2.2.1、 創建云對象?green-mall-goods

???

代碼:

const db = uniCloud.database();

async add(params){
??????? params.price = Number(params.price).toFixed(2)*100
??????? params.before_price = params.before_price ? Number(params.before_price).toFixed(2)*100 : null
??????? return await db.collection("green-mall-goods").add(params);?????? ?
??? },

3.2.2.2 頁面邏輯引入

在頁面引入:

??? const goodsCloudObj = uniCloud.importObject("green-mall-goods", {
??????? "customUI": true
??? })

4、整體代碼

<template><view class="goodsView"><!-- 添加商品 --><uni-forms ref="goodsForm" :model="goodsFormData" :rules="goodsRules" :label-width="100" label-align="right"><uni-forms-item label="商品圖片" required="true"><uni-file-picker v-model="goodsFormData.thumb" fileMediatype="image" mode="grid" ></uni-file-picker></uni-forms-item><uni-forms-item label="商品名稱" required name="name" ><!-- trim 去空格 --><uni-easyinput v-model="goodsFormData.name" placeholder="請輸入商品名稱" trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="產品分類" required name="category_id"><!-- 云端數據  下拉框獲取  field 就是獲取的內容  一定要寫成 value text 這是官方定義的  value選中的值,text顯示的文本,也就是value后臺用,text前臺用 --><!-- 利用這個組件就實現了后端數據庫的讀取 --><uni-data-select collection="green-mall-categories" field="_id as value, name as text"v-model="goodsFormData.category_id"></uni-data-select></uni-forms-item><uni-forms-item label="商品價格" required name="price"><!-- trim 去空格 --><uni-easyinput type="number" v-model="goodsFormData.price" placeholder="請輸入商品價格"trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="商品原價"><!-- trim 去空格 --><uni-easyinput type="number" v-model="goodsFormData.before_price" placeholder="請輸入原價"trim="both"></uni-easyinput></uni-forms-item><uni-forms-item label="商品屬性" ><u-cell :title="skuTitle" isLink :border="false" @click="clickSelect"></u-cell><view class="skuList"><view class="item" v-for="item in goodsFormData.sku_select" @click="clickSelect"><view class="left">{{item.skuName}}:</view><view class="right">{{skuChildName(item.children)}}</view></view></view></uni-forms-item><uni-forms-item label="商品描述"><!-- type 是類型  textarea 就是大框 --><uni-easyinput type="textarea" placeholder="請輸入詳細的描述信息"v-model="goodsFormData.description"></uni-easyinput></uni-forms-item><view class="btnView"><button type="primary" @click="onSubmit">確認提交</button></view></uni-forms><uni-popup ref="attrWrapPop" type="bottom"><!-- 底部彈出 type ref 是一個名字屬性,便于被調用 給 clickSelect 在 clickSelect 函數中調用了該接口--><view class="attrWrapper"><!-- 分三部分  就是上中下 頭身體和尾部 --><view class="head"><view class="title">商品屬性</view><!-- clickAddAttr函數  添加屬性的--><view class="addAttr" @click="clickAddAttr()">+ 添加屬性</view></view><view class="body"><!-- 讀取 skuArr 循環顯示 分兩部分顯示 top 和 btngroup--><view class="item" v-for="(item,index) in skuArr"><view class="top"><checkbox :checked="item.checked" @click="changeCheckbox(index)"></checkbox><!-- changeCheckbox  選中就做這個操作 --><!-- checked 是否被選中的屬性標識 --><view class="font">{{item.skuName}}</view></view><view class="btnGroup" v-if="item.checked"><!-- 需要判斷checked 是不是true  是不是選中,選中了就展示--><view class="btn" :class="child.checked?'active':''" v-for="(child,cIdx) in item.children"@click="clickChlidBtn(index,cIdx)">{{child.name}}</view><!-- btn 讀取skuArr ,循環顯示選中就加class 為active  點擊 就執行 clickChlidBtn函數--><view class="btn" @click="clickAddAttr(index)"><!-- btn 該盒子就是一個 + 號,用來添加該屬性下的選項 clickAddAttr 點就執行uicon就一個 + 號圖標  --><u-icon name="plus"></u-icon></view></view></view></view><view class="foot"><button type="primary" @click="clickConfirmSelect">確認選擇</button><!-- 按鈕 ,藍色提交按鈕type 就是顏色格式點擊就是確認該商品的屬性clickConfirmSelect--></view></view><view class="safe-area-bottom"></view><!--防止被蘋果虛擬home鍵 擋住 --><!-- 這里就是直接調用的app.vue的全局樣式。什么是全局樣式:就是樣式那里沒有scoped 的,所以在以前老是要寫一個表示局部樣式,就怕vue 中class名字一樣了如果你不些scoped ,就要把全局的view 的class 寫在最前面。不知道懂不懂,慢慢悟吧--></uni-popup><!-- 這里是點擊的添加屬性的彈窗 --><!-- 你可能懵逼了那個添加屬性的彈窗?兩個彈窗都要用一個是第一個彈窗中的右上角的添加屬性  class名字 addAttr一個是屬性規格下的選項中的 + class的名字就是btn--><uni-popup ref="addAttrPop"><uni-popup-dialog mode="input" title="新增" placeholder="請輸入新增的內容"@confirm="dialogConfirm"></uni-popup-dialog><!-- dialogConfirm 是一個確認后處理邏輯 --></uni-popup></view>
</template><script>const skuCloudObj = uniCloud.importObject("green-mall-sku", {"customUI": true});const goodsCloudObj = uniCloud.importObject("green-mall-goods", {"customUI": true})export default {data() {return {goodsFormData: {thumb: [],name: "",category_id: null,price: null,before_price: null,description: "",sku_select: []},addAttrType: "parent", //parent代表父,child代表子goodsRules: {name: {rules: [{required: true,errorMessage: "請輸入產品名稱"}]},price: {rules: [{required: true,errorMessage: "請輸入產品價格"}]},category_id: {rules: [{required: true,errorMessage: "請輸入產品分類"}]}},/*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}]}],*/// 上面是一個數據結構例子,后臺數據就應該著這樣存// 實際是下面的[]skuArr: [],};},onLoad() {},computed: {skuTitle() {if (this.goodsFormData.sku_select.length) {let arr = this.goodsFormData.sku_select.map(item => {return item.skuName})console.log(arr);return arr.join("/")} else {return "點擊添加屬性"}}},methods: {//屬性返回子元素的名稱skuChildName(arr) {let nsArr = arr.map(item => {return item.name})return nsArr.join("/")},//點擊確認選擇 是在彈出框上選//some 數組至少有一個滿足 沒有就是false   every就是每一個都要滿足,不滿足就是false// 這里filter 選出父級屬性 checked =true 被選中的 且子級屬性有一個被選中的數組對象;// 然后再對選中的對象,逐一進行map運算//運算就是filter 過濾出來選中的子級元素//返回一個 數組 arr 且元素為一個對象,對象展開了item ,然后將children的值放到里面,覆蓋item中的childrenclickConfirmSelect() {let arr = this.skuArr.filter(item => {let state = item.children.some(child => child.checked)  return item.checked && state}).map(item => {let children = item.children.filter(child => {return child.checked})// console.log(item,11111111);// console.log(children,2222222);return {...item,// children   //覆蓋了item中children}})this.goodsFormData.sku_select = arr   //賦值后,頁面在使用這個數組來顯示  立即回顯this.$refs.attrWrapPop.close();   //關閉掉彈窗},//獲取sku列表async getSkuData() {let res = await skuCloudObj.get();this.skuArr = res.data// console.log(res);},//點擊添加屬性 index 存在就是嵌套下 父類屬性的子類選項 ,不存在就是添加父類屬性clickAddAttr(index = null) {if (index == null) {this.addAttrType = "parent"this.attrIndex = null} else {this.addAttrType = "child"this.attrIndex = index}this.$refs.addAttrPop.open();},//添加屬性彈窗的確認按鈕async dialogConfirm(e) {if (!e) return;if (this.addAttrType == "parent") {let obj = {skuName: e,checked: true,children: []}let res = await skuCloudObj.add(obj)obj._id = res.id;this.skuArr.push(obj)//向數組中添加一個元素,就彈窗的確認按鈕} else if (this.addAttrType == "child") {let obj = {name: e,checked: true}let id = this.skuArr[this.attrIndex]._id;let res = await skuCloudObj.updateChild(id, obj)this.skuArr[this.attrIndex].children.push(obj)}},//點擊屬性的復選框	改變了值,也相應改變了顯示 后面也把值存到了數據庫changeCheckbox(index) {this.skuArr[index].checked = !this.skuArr[index].checked},//點擊屬性值的子元素  改變了值,也相應改變了顯示 后面也把值存到了數據庫clickChlidBtn(index, cIdx) {this.skuArr[index].children[cIdx].checked = !this.skuArr[index].children[cIdx].checked},//點擊選擇屬性clickSelect() {this.$refs.attrWrapPop.open(); //使用open方法彈出來if (this.skuArr.length) return;this.getSkuData();},//點擊提交表單onSubmit() {this.$refs.goodsForm.validate().then(res => {this.toDataBase();}).catch(err => {console.log(err);})},//上傳到云數據庫async toDataBase() {//這里缺少一個更新的按鈕,需要在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 res = await goodsCloudObj.add(this.goodsFormData)uni.showToast({title: "新增商品成功"})setTimeout(() => {uni.navigateBack()}, 1500)}}}
</script><style lang="scss" scoped>.goodsView {padding: 30rpx;.skuList {.item {padding: 30rpx;background: $page-bg-color;margin: 15rpx 0;@include flex-box-set(start);}}}.attrWrapper {padding: 30rpx;background: #fff;border-radius: 20rpx 20rpx 0 0;.head {@include flex-box();font-size: 34rpx;margin-bottom: 30rpx;.title {font-weight: bold;}.addAttr {color: $brand-theme-color-aux;}}.body {.item {border-top: 1px solid $border-color-light;&:last-child {border-bottom: 1px solid $border-color-light;}.top {padding: 30rpx 0;@include flex-box-set(start);.font {padding-left: 10rpx;font-weight: bold;}}.btnGroup {padding: 10rpx 0 30rpx;@include flex-box-set(start);flex-wrap: wrap;.btn {padding: 0rpx 25rpx;height: 60rpx;border: 1rpx solid $border-color-light;margin-right: 20rpx;border-radius: 10rpx;color: $text-font-color-2;margin-bottom: 20rpx;@include flex-box-set();&.active {border-color: $brand-theme-color;color: $brand-theme-color;background: rgba(236, 87, 79, 0.1);}}}}}.foot {padding: 50rpx 200rpx;}}
</style>

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

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

相關文章

A級、B級弱電機房數據中心建設運營匯報方案

該方案圍繞A 級、B 級弱電機房數據中心建設與運營展開,依據《數據中心設計規范》等標準,施工范圍涵蓋 10 類機房及配套設施,采用專業化施工團隊與物資調配體系,強調標簽規范、線纜隱藏等細節管理。運營階段建立三方協同運維模式,針對三級故障制定30 分鐘至 1 小時響應機制…

RAG數據處理:PDF/HTML

RAG而言用戶輸入的數據通常是各種各樣文檔&#xff0c;本文主要采用langchain實現PDF/HTML文檔的處理方法 PDF文檔解析 PDF文檔很常見格式&#xff0c;但內部結構常常較復雜&#xff1a; 復雜的版式布局多樣的元素&#xff08;段落、表格、公式、圖片等&#xff09;文本流無…

時源芯微| KY鍵盤接口靜電浪涌防護方案

KY鍵盤接口靜電浪涌防護方案通過集成ESD保護元件、電阻和連接鍵&#xff0c;形成了一道有效的防護屏障。當鍵盤接口受到靜電放電或其他浪涌沖擊時&#xff0c;該方案能夠迅速將過電壓和過電流引導至地&#xff0c;從而保護后續電路免受損害。 ESD保護元件是方案中的核心部分&a…

Java 原生網絡編程(BIO | NIO | Reactor 模式)

1、基本常識 Socket 是應用層與 TCP/IP 協議族通信的中間軟件抽象層&#xff0c;是一組接口&#xff0c;使用了門面模式對應用層隱藏了傳輸層以下的實現細節。TCP 用主機的 IP 地址加上主機端口號作為 TCP 連接的端點&#xff0c;該端點叫做套接字 Socket。 比如三次握手&…

OpenCV透視變換

概念 OpenCV 透視變換是將圖像從一個視平面投影到另一個視平面的過程&#xff0c;也叫投影映射 &#xff0c;屬于空間立體三維變換。它基于透視原理&#xff0c;通過 33 的變換矩陣作用于圖像像素坐標來實現映射轉換 &#xff0c;能模擬人眼或相機鏡頭觀看三維空間物體時的透視…

STM32F103定時器1每毫秒中斷一次

定時器溢出中斷&#xff0c;在程序設計中經常用到。在使用TIM1和TIM8溢出中斷時&#xff0c;需要注意“TIM_TimeBaseStructure.TIM_RepetitionCounter0;”&#xff0c;它表示溢出一次&#xff0c;并可以設置中斷標志位。 TIM1_Interrupt_Initializtion(1000,72); //當arr1…

數據庫——SQL約束窗口函數介紹

4.SQL約束介紹 &#xff08;1&#xff09;主鍵約束 A、基本內容 基本內容 p r i m a r y primary primary k e y key key約束唯一表示數據庫中的每條記錄主鍵必須包含唯一的值&#xff08;UNIQUE&#xff09;主鍵不能包含NULL值&#xff08;NOT NULL&#xff09;每個表都應…

【typenum】 8 常量文件(consts.rs)

一、源碼 這段代碼通過類型級編程&#xff08;type-level programming&#xff09;在編譯期實現數值計算。以下是常量定義部分&#xff1a; // THIS IS GENERATED CODE #![allow(missing_docs)] use crate::int::{NInt, PInt}; /** Type aliases for many constants.This fil…

第8講、Multi-Head Attention 的核心機制與實現細節

&#x1f914; 為什么要有 Multi-Head Attention&#xff1f; 單個 Attention 機制雖然可以捕捉句子中不同詞之間的關系&#xff0c;但它只能關注一種角度或模式。 Multi-Head 的作用是&#xff1a; 多個頭 多個視角同時觀察序列的不同關系。 例如&#xff1a; 一個頭可能專…

百度智能云千帆攜手聯想,共創MCP生態宇宙

5月7日&#xff0c;2025聯想創新科技大會&#xff08;Tech World&#xff09;在上海世博中心舉行&#xff0c;本屆大會以“讓AI成為創新生產力”為主題。會上&#xff0c;聯想集團董事長兼CEO楊元慶展示了包括覆蓋全場景的超級智能體矩陣&#xff0c;包括個人超級智能體、企業超…

【OpenCV】幀差法、級聯分類器、透視變換

一、幀差法&#xff08;移動目標識別&#xff09;&#xff1a; 好處&#xff1a;開銷小&#xff0c;不怎么消耗CPU的算力&#xff0c;對硬件要求不高&#xff0c;但只適合固定攝像頭 1、優點 計算效率高&#xff0c;硬件要求 響應速度快&#xff0c;實時性強 直接利用連續幀…

數據庫遷移的藝術:團隊協作中的沖突預防與解決之道

title: 數據庫遷移的藝術:團隊協作中的沖突預防與解決之道 date: 2025/05/17 00:13:50 updated: 2025/05/17 00:13:50 author: cmdragon excerpt: 在團隊協作中,數據庫遷移腳本沖突是常見問題。通過Alembic工具,可以有效地管理和解決這些沖突。沖突預防的四原則包括功能分…

Linux常用命令43——bunzip2解壓縮bz2文件

在使用Linux或macOS日常開發中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;bunzip2可解壓縮.bz2格式的壓縮文件。bunzip2實際上是bzip2的符號連接&#xff0c;執行bunzip2與bzip2 -d的效果相同。本篇學習記錄bunzip2命令的基本使用。 首先查看幫助文檔&#…

盲盒:拆開未知的驚喜,收藏生活的儀式感

一、什么是盲盒&#xff1f;—— 一場關于“未知”的浪漫冒險 盲盒&#xff0c;是一種充滿神秘感的消費體驗&#xff1a; &#x1f381; 盒中藏驚喜——每個盲盒外觀相同&#xff0c;但內含隨機商品&#xff0c;可能是普通款、稀有款&#xff0c;甚至是“隱藏款”&#xff1b;…

Android 中使用通知(Kotlin 版)

1. 前置條件 Android Studio&#xff1a;確保使用最新版本&#xff08;2023.3.1&#xff09;目標 API&#xff1a;最低 API 21&#xff0c;兼容 Android 8.0&#xff08;渠道&#xff09;和 13&#xff08;權限&#xff09;依賴庫&#xff1a;使用 WorkManager 和 Notificatio…

使用大模型預測急性結石性疾病技術方案

目錄 1. 數據預處理與特征工程偽代碼 - 數據清洗與特征處理數據預處理流程圖2. 大模型構建與訓練偽代碼 - 模型訓練模型訓練流程圖3. 術前預測系統偽代碼 - 術前風險評估術前預測流程圖4. 術中實時調整系統偽代碼 - 術中風險預警術中調整流程圖5. 術后護理系統偽代碼 - 并發癥預…

每日Prompt:生成自拍照

提示詞 幫我生成一張圖片&#xff1a;圖片風格為「人像攝影」&#xff0c;請你畫一張及其平凡無奇的iPhone對鏡自拍照&#xff0c;主角是穿著JK風格cos服的可愛女孩&#xff0c;在自己精心布置的可按風格的房間內的落地鏡前用后置攝像頭隨手一拍的快照。照片開啟了閃光燈&…

動態規劃-64.最小路徑和-力扣(LetCode)

一、題目解析 從左上角到右下角使得數字總和最小且只能向下或向右移動 二、算法原理 1.狀態表示 我們需要求到達[i,j]位置時數字總和的最小值&#xff0c;所以dp[i][j]表示&#xff1a;到達[i,j]位置時&#xff0c;路徑數字總和的最小值。 2.狀態轉移方程 到達[i,j]之前要先…

LeetCode LCR 010 和為 K 的子數組 (Java)

兩種解法詳解&#xff1a;暴力枚舉與前綴和哈希表尋找和為k的子數組 在解決數組中和為k的連續子數組個數的問題時&#xff0c;我們可以采用不同的方法。本文將詳細解析兩種常見的解法&#xff1a;暴力枚舉法和前綴和結合哈希表的方法&#xff0c;分析它們的思路、優缺點及適用…

OpenVLA (2) 機器人環境和環境數據

文章目錄 [TOC](文章目錄) 前言1 BridgeData V21.1 概述1.2 硬件環境 2 數據集2.1 場景與結構2.2 數據結構2.2.1 images02.2.2 obs_dict.pkl2.2.3 policy_out.pkl 3 close question3.1 英偉達環境3.2 LIBERO 環境更適合仿真3.3 4090 運行問題 前言 按照筆者之前的行業經驗, 數…