mall_client/zyhs3_uniapp/pages/merchants/goods/add.vue

361 lines
10 KiB
Vue

<template>
<view class="main">
<view class="header">
<!-- <view class="status-bar-height-height"></view> -->
<!-- <view :style="{height: navHeight + 'px'}"></view> -->
<view class="errMsg" v-if="form.errorMsg && form.status === 2">
<text class="txt">
<text class="iconfont icon">&#xe659;</text>
审核失败:{{form.errorMsg}}
</text>
</view>
<view class="tabs">
<view class="tab" :class="{'active': current === i}" v-for="(item, i) in tabs" :key="i" @click="tabsChange(i)">
<text class="number">{{i+1}}</text>
<text class="name">{{item}}</text>
</view>
</view>
</view>
<one ref="one" v-show="current === 0" :classData="classData" :form="form" @next="onNext" @edit="onEdit"></one>
<two @selectImg="selectImg" ref="two" v-show="current === 1" :form="form" @next="onNext" @prev="onPrev"></two>
<three @selectImg="selectImg" ref="three" v-show="current === 2" :form="form" @next="onNext" @prev="onPrev"></three>
<four ref="four" v-show="current === 3" :loading="loading" :form="form" @next="onNext" @prev="onPrev"></four>
<avatar @upload="myUpload" ref="avatar"></avatar>
</view>
</template>
<script>
import url from "@/common/http/url.js"
import upload from "@/common/http/upload.js"
import publics from "@/common/utils/public.js"
import { sendRequestJson } from "@/common/http/api.js"
import one from "./modules/one.vue"
import two from "./modules/two.vue"
import three from "./modules/three.vue"
import four from "./modules/four.vue"
import avatar from "@/components/yq-avatar/yq-avatar.vue";
export default{
components: { one, two, three, four, avatar },
data(){
return {
navHeight: 0,
loading: false,
tabs: ["商品信息", "商品规格", "商品详情", "商品配送"],
current: 0,
form: {},
classData: {},
isEdit: false,
oldStatus: null,
uploadImgPage: "" // two-第二个页面 three-第三个页面
}
},
onBackPress(e) {
if (e.from !== 'navigateBack' && !this.isEdit) {
this.$showModal("您当前的商品未提交,如果返回则会清空所填内容,是否确认返回", "提示", res =>{
if (res.confirm) {
uni.navigateBack()
}
})
} else {
return false
}
return true
},
onLoad(opt) {
this.navHeight = uni.getSystemInfoSync().windowTop
if (opt.id) {
this.isEdit = true
uni.setNavigationBarTitle({
title: "编辑商品"
})
this.$http("GET", url.store.getGoodsDetailById, {goodsId: opt.id}).then(res =>{
let info = JSON.parse(JSON.stringify(res.data))
this.form = info
if (info.goodsType === 2) {
this.form.deliveryPlatform = 1 // 平台配送
}
this.oldStatus = info.status
this.$refs.two.skuList = info.skuList
delete this.form.updateTime
delete this.form.createTime
// 主图
if (info.mainImage) {
this.$refs.three.mainImage = info.mainImage
}
// 轮播图
if (info.topImgList) {
this.$refs.three.imgList = info.topImgList
}
// 详情图
if (info.detailsImgList) {
this.$refs.three.detailsList = info.detailsImgList
}
// 商家分类
if (info.storeCategoryId) {
this.$http("GET", url.store.getCategoryList).then(res =>{
let data = res.data
data.map(v =>{
if (v.id === info.storeCategoryId) {
this.classData = v
}
})
})
}
// 商品类型
let goodsTypeList = this.$refs.one.goodsTypeList
goodsTypeList.forEach((v, i) =>{
if (info.goodsType === v.value){
this.$refs.one.goodsTypeIndex = i
if (info.goodsType === 12 && info.homeGoodsSeckill) { // 秒杀
let dueDateTime = info.homeGoodsSeckill.dueDateTime
this.$refs.one.endTime = dueDateTime
this.form.dueDateTime = dueDateTime
} else if (info.goodsType === 14 && info.homeGoodsGroupWork) { // 拼团
this.form.groupNumber = info.homeGoodsGroupWork.groupNumber
}
return
}
})
})
} else {
this.form.deliveryNo = 2 // 无需配送
this.form.deliveryExpress = 2 // 快递邮寄
this.form.deliverySelfraising = 2 // 用户自提
this.form.deliveryBusiness = 2 // 商家配送
this.form.deliveryPlatform = 2 // 平台配送
this.form.paymentCombination = 2 // 支付组合
this.form.goodsType = 1 // 商品类型 1-普通 2-精品
this.form.isNewProducts = 1 // 是否是新品 1-不是 2-是
}
},
onShow() {
if (this.classObj) {
this.classData = this.classObj
this.form.storeCategoryId = this.classData.id
}
if (this.addressData){
this.$refs.four.addrData = this.addressData
}
},
methods:{
onEdit(data){
this.form = Object.assign({}, this.form, data)
},
async onNext(val){
let _this = this
if (this.current === 3) {
this.onShowModal()
} else {
this.current++
}
},
onShowModal(){
let _this = this
if (this.oldStatus === 1 || this.oldStatus === 2){
let statusMsg = this.oldStatus === 1 ? '已上架' : '已下架'
this.$showModal(`该商品${statusMsg},如修改则该商品将重新审核,是否确认修改当前商品?`, null, res=>{
if (res.confirm) {
_this.onSubmit()
} else {
this.loading = false
}
})
} else {
this.onSubmit()
}
},
async onSubmit(){
let _this = this
let skuList = this.$refs.two.skuList
let imgList = this.$refs.three.imgList
let detailsList = this.$refs.three.detailsList
let mainImageObj = this.$refs.three.mainImageObj
if (skuList.length === 0) {
return this.$msg("请至少添加一个商品规格")
}
if (imgList.length === 0) {
return this.$msg("请至少上传一张商品轮播图")
}
if (detailsList.length === 0) {
return this.$msg("请至少上传一张商品详情图")
}
this.loading = true
uni.showLoading({
mask: true
});
let uploadList = []
uploadList = uploadList.concat(skuList).concat(imgList).concat(detailsList).concat([mainImageObj])
let uploadArray = []
let topImgList = [] // 轮播图
let detailsImgList = [] // 详情图
imgList.map(v =>{
if (typeof v === "string"){
topImgList.push(v)
}
})
detailsList.map(v =>{
if (typeof v === "string"){
detailsImgList.push(v)
}
})
uploadList.map(v => {
if (v.ossType) {
uploadArray.push(v)
}
})
for(let i = 0; i<uploadArray.length; i++){
let v = uploadArray[i]
let data = await upload.getOssSignature(v.url, v.ossType, 1)
let list = await upload.uploadImageOss(data, false)
let resourceTemporaryUUID = list[0].resourceTemporaryUUID
if (v.ossType === 13) { // 主图
_this.form.mainImage = JSON.stringify({
resourceTemporaryUUID: resourceTemporaryUUID
})
} else if (v.ossType === 16) { // sku
skuList[v.skuIndex].mainImage = JSON.stringify({
resourceTemporaryUUID: resourceTemporaryUUID
})
this.form.skuList = skuList
} else if (v.ossType === 14) { // 轮播图
topImgList.push(JSON.stringify({
resourceTemporaryUUID: resourceTemporaryUUID
}))
this.form.topImgList = topImgList
} else { // 详情图
detailsImgList.push(JSON.stringify({
resourceTemporaryUUID: resourceTemporaryUUID
}))
this.form.detailsImgList = detailsImgList
}
}
console.log(".......end......")
this.httpReq()
},
httpReq(){
let path = this.isEdit ? url.store.updateGoods : url.store.addGoods
console.log("....请求参数", this.form)
sendRequestJson("POST", path, this.form).then(res =>{
uni.hideLoading();
this.$msg(res.data)
this.$navigateBack(1, 500)
}).catch(err=>{
this.loading = false
uni.hideLoading();
})
},
selectImg(type){
this.uploadImgPage = type
upload.showAvatarModal(this, 500, 500)
},
myUpload(rsp){
let _this = this
uni.getImageInfo({
src: rsp.path,
success: function (image) {
if (_this.uploadImgPage === "two") {
let skuIndex = _this.$refs.two.skuIndex
_this.$refs.two.skuList[skuIndex].url = rsp.path
_this.$refs.two.skuList[skuIndex].ossType = 16
_this.$refs.two.skuList[skuIndex].ossWidth = image.width
_this.$refs.two.skuList[skuIndex].ossHeight = image.height
_this.$refs.two.skuList[skuIndex].skuIndex = skuIndex
} else if (_this.uploadImgPage === "three") {
_this.$refs.three.mainImage = rsp.path
_this.$refs.three.mainImageObj = {
url: rsp.path,
ossType: 13,
ossWidth: image.width,
ossHeight: image.height
}
}
}
});
},
onPrev(){
if (this.loading) return
this.current--
},
tabsChange(i){
if (this.loading) return
this.current = i
}
}
}
</script>
<style lang="scss" scoped>
.main{
// margin: 0 20rpx;
padding-top: 150rpx;
.header{
position: fixed;
top: 0;
left: 0rpx;
right: 0rpx;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
z-index: 99;
.errMsg{
padding: 20rpx;
background-color: rgba(#dd524d, .3);
.txt{
font-size: 30rpx;
color: #dd524d;
.icon{
font-size: 34rpx;
color: #dd524d;
// color: #999999;
}
}
}
.tabs{
width: 100%;
display: flex;
height: 150rpx;
align-items: center;
background-color: #F8F8F8;
.tab{
width: 25%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #999999;
.number{
width: 26rpx;
height: 26rpx;
border-radius: 50%;
border: 2rpx solid #999999;
text-align: center;
line-height: 26rpx;
font-size: 24rpx;
margin-bottom: 20rpx;
}
.name{
font-size: 28rpx;
}
}
.active{
background-color: #FFFFFF;
color: #333333;
.number{
width: 32rpx;
height: 32rpx;
line-height: 32rpx;
}
.name{
font-size: 32rpx;
}
}
}
}
}
</style>