查了很多资料,自己写的,功能实现了,但是代码比较冗余。第一次写小程序,不太了解商品上传这里的思路。我是先把图片上传到云存储,然后把云存储的图片地址和其他商品信息一起传到云数据库的。轮播图和详情图分开上传,写了两次上传图片,编辑功能很麻烦也是,大家有什么好的方法吗?交流一下。
// pages/main/shopping/shopping.js
Page({
/**
* 页面的初始数据
*/
data: {
newAddLbt:[], // 编辑时新增轮播图列表
newAddXqt:[], // 编辑时新增详情图列表
lbbd: true, // 编辑时轮播图点击选择图片标的
xqbd: true, // 编辑时详情图点击选择图片标的
imageList: [], // 轮播图列表
xqList: [], // 详情图列表
shopTitle: '', // 商品标题
shopIntroduce: '', // 商品介绍
shopPrice: '', // 商品价格
integral: '', // 积分
shopStock: '', // 库存
postage: '', // 邮费
imgOneSwitch: true,
imgTwoSwitch: true,
imgOne: [], // 发布商品轮播图片
imgTwo: [], // 发布商品详情图片
exitLbtList: [], // 修改上传图片的临时链接列表 轮播图
exitxqList: [], // 修改上传图片的临时链接列表 详情图
MAXCOUNTIMAGE: 6,
detailsData: {}, // 详情页数据
_id: '' // 被编辑商品的id
},
getShopTitle(e){
this.data.shopTitle = e.detail
},
getShopIntroduce(e){
this.data.shopIntroduce = e.detail
},
getShopStock(e){
this.data.shopStock = e.detail
},
getShopPostage(e){
this.data.postage = e.detail
},
getShopPrice(e){
this.data.shopPrice = e.detail
},
getIntegral(e){
this.data.integral = e.detail
},
// 轮播图选择图片 + 回显
onChooseOne: function () {
let that = this
wx.chooseImage({
count: this.data.MAXCOUNTIMAGE - this.data.imgOne.length,
sourceType: ['album', 'camera'],
sizeType: ['compressed'],
success(res) {
if(that.data._id){
// 修改
let tempArr = that.data.exitLbtList.concat(res.tempFilePaths)
let newArr = that.data.imgOne.concat(res.tempFilePaths)
that.setData({
'exitLbtList': tempArr,
'imgOne': newArr
})
console.log(that.data.exitLbtList);
} else {
// 添加
let tempArr = that.data.imgOne.concat(res.tempFilePaths)
// 将零时链接保存在imgOne
that.setData({
'imgOne': tempArr
})
}
// 将轮播图保存到云存储
that.onSave()
if (that.data.imgOne.length >= that.data.MAXCOUNTIMAGE) {
that.setData({
imgOneSwitch: false
})
}
}
})
},
// 轮播图保存到 存储 & 数据库的提示
onSave: function () {
if (this.data.imgOne.length == 0) {
wx.showToast({
title: '请添加图片',
icon: 'none'
})
return
}
console.log('通过 ---空--- 校验')
this.OnUpImg() // 上传到云存储
},
// 将轮播图上传到云存储
OnUpImg: function () {
let promiseArr = []
let fileIds = [] // 将图片的fileId存放到一个数组中
if(this.data._id) {
// 修改
var imgLength = this.data.exitLbtList.length;
} else {
// 添加
var imgLength = this.data.imgOne.length;
}
// 图片上传
for (let i = 0; i < imgLength; i++) {
let p = new Promise((resolve, reject) => {
if(this.data._id) {
// 修改
var item = this.data.exitLbtList[i]
} else {
// 添加
var item = this.data.imgOne[i]
}
let suffix = /\.\w+$/.exec(item)[0]
wx.cloud.uploadFile({
cloudPath: 'carouselMap/' + Date.now() + '-' + Math.random() * 1000000 + suffix,
filePath: item,
success: (res) => {
fileIds = fileIds.concat(res.fileID) // 拼接
if(this.data._id) {
// 修改
var onePic = this.data.imgOne // 编辑-原本已经上传到云存储的图片列表
fileIds.push(...onePic)
let newArr = []
fileIds.forEach(item => {
if(!item.startsWith("http")){
newArr.push(item)
}
})
// 去重
newArr = [...new Set(newArr)]
// imageList 传云数据库的图片url集合
this.setData({
imageList: newArr,
newAddLbt: newArr,
lbbd: false
})
console.log(this.data.imageList);
} else {
// 添加
this.setData({
imageList: fileIds
})
}
console.log(this.data.imageList); // 2次
resolve()
},
fail: (err) => {
console.error(err)
reject()
}
})
})
promiseArr.push(p)
}
Promise.all(promiseArr)
.then((res) => {
console.log('轮播图上传到云存储成功');
})
.catch((err) => {
console.error(err) // 上传图片失败
wx.showToast({
title: '上传失败 请再次点击发布',
icon: 'none',
duration: 3000
})
})
},
// 详情图选择图片 + 回显
onChooseTwo: function () {
let that = this
wx.chooseImage({
count: this.data.MAXCOUNTIMAGE - this.data.imgTwo.length,
sourceType: ['album', 'camera'],
sizeType: ['compressed'],
success(res) {
if(that.data._id){
// 修改
let tempArr = that.data.exitxqList.concat(res.tempFilePaths)
let newArrTwo = that.data.imgTwo.concat(res.tempFilePaths)
that.setData({
'exitxqList': tempArr,
'imgTwo': newArrTwo
})
console.log(that.data.exitxqList);
} else {
// 添加
let tempArr = that.data.imgTwo.concat(res.tempFilePaths)
// 将临时链接保存在imgTwo
that.setData({
'imgTwo': tempArr
})
}
// 将详情图保存到云存储
that.onSaveTwo()
if (that.data.imgTwo.length >= that.data.MAXCOUNTIMAGE) {
that.setData({
imgTwoSwitch: false
})
}
}
})
},
// 将详情图保存到 存储 & 数据库的提示
onSaveTwo: function () {
if (this.data.imgTwo.length == 0) {
wx.showToast({
title: '请添加图片',
icon: 'none'
})
return
}
this.OnUpImgTwo()
},
// 将详情图上传到云存储
OnUpImgTwo: function () {
let promiseArr = []
let fileIds = [] // 将图片的fileId存放到一个数组中
if(this.data._id) {
// 修改
var imgLength = this.data.exitxqList.length;
} else {
// 添加
var imgLength = this.data.imgTwo.length;
}
// 图片上传
for (let i = 0; i < imgLength; i++) {
let p = new Promise((resolve, reject) => {
if(this.data._id) {
// 修改
var item = this.data.exitxqList[i]
} else {
// 添加
var item = this.data.imgTwo[i]
}
let suffix = /\.\w+$/.exec(item)[0]
wx.cloud.uploadFile({
cloudPath: 'detailsMap/' + Date.now() + '-' + Math.random() * 1000000 + suffix,
filePath: item,
success: (res) => {
fileIds = fileIds.concat(res.fileID) // 拼接
if(this.data._id) {
// 修改
var twoPic = this.data.imgTwo // 编辑-原本已经上传到云存储的图片列表
fileIds.push(...twoPic)
let newArr1 = []
fileIds.forEach(item => {
if(!item.startsWith("http")){
newArr1.push(item)
}
})
// 去重
newArr1 = [...new Set(newArr1)]
this.setData({
xqList: newArr1,
newAddXqt: newArr1,
xqbd: false
})
} else {
// 添加
this.setData({
xqList: fileIds
})
}
console.log(this.data.xqList); // 2次
resolve()
},
fail: (err) => {
console.error(err)
reject()
}
})
})
promiseArr.push(p)
}
Promise.all(promiseArr)
.then((res) => {
console.log('详情图上传到云存储成功');
})
.catch((err) => {
console.error(err) // 上传图片失败
wx.showToast({
title: '上传失败 请再次点击发布',
icon: 'none',
duration: 3000
})
})
},
// 点击发布商品
releaseshop(){
this.addshops() // 调用添加商品方法,将商品所有数据传入云数据库
},
dataFun(){
if (this.data.lbbd === false && this.data.xqbd === true) {
// 如果编辑时点击了选择轮播图
var arr = this.data.imgTwo
var arr1 = []
arr.forEach(item => {
console.log(item);
if(item.indexOf('wxfile') === -1) {
arr1.push(item)
}
})
this.setData({
xqList: [...new Set(arr1)]
})
} else if(this.data.xqbd === false && this.data.lbbd === true) {
var arr = this.data.imgOne
var arr2 = []
arr.forEach(item => {
if(item.indexOf('wxfile') === -1) {
arr2.push(item)
}
})
// 如果编辑时点击了选择详情图
this.setData({
imageList: [...new Set(arr2)]
})
}
else if(this.data.xqbd === false && this.data.lbbd === false) {
var arr = this.data.newAddLbt;
var arrn = []
var arr2 = this.data.newAddXqt
var arrnn = []
arr.forEach(item => {
if(item.indexOf('wxfile') === -1) {
arrn.push(item)
}
})
arr2.forEach(item => {
if(item.indexOf('wxfile') === -1) {
arrnn.push(item)
}
})
// 如果编辑时轮播图和详情图都点击了
this.setData({
imageList: [...new Set(arrn)],
xqList: [...new Set(arrnn)]
})
}
else if (this.data.xqbd === true && this.data.lbbd === true) {
var arr = this.data.imgTwo
var arr1 = []
arr.forEach(item => {
if(item.indexOf('wxfile') === -1) {
arr1.push(item)
}
})
var arr = this.data.imgOne
var arr2 = []
arr.forEach(item => {
if(item.indexOf('wxfile') === -1) {
arr2.push(item)
}
})
// 如果编辑时都没点击
this.setData({
imageList: [...new Set(arr2)],
xqList: [...new Set(arr1)]
})
}
},
// 将商品添加到云数据库
addshops(){
if(this.data._id){
this.dataFun()
// 去掉wxfile图片文件
let arr = this.data.imageList;
var arr1 = []
arr.forEach(item => {
if(item.indexOf('wxfile') === -1) {
arr1.push(item)
}
})
let arrr = this.data.xqList;
var arr2 = []
arrr.forEach(item => {
if(item.indexOf('wxfile') === -1) {
arr2.push(item)
}
})
// 修改商品
wx.cloud.database().collection('releaseProduct')
.doc(this.data._id)
.update({
data: {
shopTitle: this.data.shopTitle,
shopIntroduce: this.data.shopIntroduce,
shopPrice: this.data.shopPrice,
shopStock: this.data.shopStock,
postage: this.data.postage,
integral: this.data.integral,
lbtImg: arr1,
xqList: arr2
}
}).then(res => {
console.log('修改成功',res);
// 跳转到我的店铺
wx.navigateTo({
url: '../myshop/myshop'
})
// 修改成功提示的方法
wx.showToast({
title: '修改成功',
})
}).catch(err => {
wx.showToast({
title: '修改失败',
icon: 'none',
duration: 3000
})
})
} else {
// 添加数据
wx.cloud.database().collection('releaseProduct')
.add({
data: {
shopTitle: this.data.shopTitle,
shopIntroduce: this.data.shopIntroduce,
shopPrice: this.data.shopPrice,
shopStock: this.data.shopStock,
postage: this.data.postage,
integral: this.data.integral,
lbtImg: this.data.imageList,
xqList: this.data.xqList
}
}).then(res => {
// 跳转到我的店铺
wx.navigateTo({
url: '../myshop/myshop'
})
// 发布成功提示的方法
wx.showToast({
title: '发布成功',
})
}).catch(err => {
wx.showToast({
title: '发布失败',
icon: 'none',
duration: 3000
})
})
}
},
// 轮播图删除图片功能
reBackImg: function (e) {
let dataset = e.currentTarget.dataset
let index = dataset.index
console.log(index)
let arr = this.data.imgOne
let arr1 = this.data.imageList
if(this.data._id) {
// 修改时点击删除
arr1.splice(index,1)
arr.splice(index, 1)
} else {
// 添加时点击删除
arr.splice(index, 1)
}
// 编辑时删除已经上传云存储的图片
wx.cloud.deleteFile({
fileList: [e.currentTarget.dataset.main],
success(res){
console.log(res,'删除文件11111')
},
fail(err){
console.log(err)
}
})
// 添加图片icon是否显示
if (arr.length < this.data.MAXCOUNTIMAGE && this.data.imgOneSwitch === false) {
this.setData({
imgOneSwitch: true
})
}
this.setData({
imgOne: arr,
})
},
// 预览图片
previewImg: function (e) {
console.log('放大图片')
let index = e.currentTarget.dataset.index
let item = this.data.imgOne[index]
console.log(item)
wx.previewImage({
current: item, // 当前显示图片的http链接
urls: this.data.imgOne // 需要预览的图片http链接列表
})
},
// 删除图片功能
reBackImgTwo: function (e) {
console.log(e.currentTarget.dataset.main);
let dataset = e.currentTarget.dataset
let index = dataset.index
console.log(index)
let arr = this.data.imgTwo
let arr2 = this.data.xqList
if(this.data._id) {
// 修改时点击删除
arr2.splice(index,1)
arr.splice(index, 1)
} else {
// 添加时点击删除
arr.splice(index, 1)
}
// 编辑/添加时删除已经上传云存储的图片
wx.cloud.deleteFile({
fileList: [e.currentTarget.dataset.main],
success(res){
console.log(res,'删除文件11111')
},
fail(err){
console.log(err)
}
})
if (arr.length < this.data.MAXCOUNTIMAGE && this.data.imgTwoSwitch === false) {
this.setData({
imgTwoSwitch: true
})
}
this.setData({
imgTwo: arr
})
},
// 预览图片
previewImgTwo: function (e) {
console.log('放大图片')
let index = e.currentTarget.dataset.index
let item = this.data.imgTwo[index]
console.log(item)
wx.previewImage({
current: item, // 当前显示图片的http链接
urls: this.data.imgTwo // 需要预览的图片http链接列表
})
},
onLoad: function (options) {
if(!options.queryBean) {
return false
}
var queryBean = JSON.parse(options.queryBean)
// detailsData: queryBean
this.setData({
integral: queryBean.integral,
shopTitle: queryBean.shopTitle,
shopIntroduce: queryBean.shopIntroduce,
shopStock: queryBean.shopStock,
shopPrice: queryBean.shopPrice,
postage: queryBean.postage,
imgOne: queryBean.lbtImg,
imgTwo: queryBean.xqList,
_id: queryBean._id
})
console.log(this.data.detailsData);
}
})