<template> <view class="goods"> <!-- <view class="goods-top"> <input type="textarea" v-model="content" placeholder="输入SKU直接导入获取商品信息" /> <view class="btn" :style="{'opacity': content?1:0.6 }" @click="onClickAccess">一键获取</view> </view> --> <view class="goods-hd"> <view class="item"> <view class="a">商品名称<text>*</text></view> <view class="b"> <input type="text" v-model="from.goods_name" placeholder="请输入商品价格,最低0.1元" />元 </view> </view> <view class="item"> <view class="a">商品分类</view> <view class="b" @click="openPage(1)"> <view class="select">请选择商品分类<u-icon name="arrow-right"></u-icon> </view> </view> </view> <view class="items"> <view class="a">商品照片<text>*</text> <view class="tip">最多上传100张</view> </view> <view class="c"> <u-upload :action="action" :header="header" @on-uploaded="goosSuccess" @on-remove="goodsRemove" width="180" height="180" :file-list="goodsImageList" :custom-btn="true" max-count="100"> <template v-slot:addBtn> <view class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150"> <image :src="$picUrl+'/static/news/icon-upload.png'"></image> <view class="1">上传图片</view> </view> </template> </u-upload> </view> </view> <view class="items"> <view class="a" style="align-items: flex-start">商品详情<text>*</text> <view class="input"> <textarea placeholder="可输入商品的详细描述" v-model="from.goods_details" class="t"></textarea> </view> </view> <view class="c"> <u-upload :action="action" :header="header" @on-uploaded="detailSuccess" @on-remove="detailsRemove" width="180" height="180" :file-list="goodsDetailImageList" :custom-btn="true" max-count="6"> <template v-slot:addBtn> <view class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150"> <image :src="$picUrl+'/static/news/icon-upload.png'"></image> <view class="1">上传图片</view> </view> </template> </u-upload> </view> </view> <view class="items"> <view class="a">商品素材<text>*</text></view> <view class="c"> <u-upload :action="action" :header="header" @on-uploaded="sourceSuccess" @on-remove="sourceRemove" width="180" height="180" :file-list="goodSourceImageList" :custom-btn="true" max-count="6"> <template v-slot:addBtn> <view class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150"> <image :src="$picUrl+'/static/news/icon-upload.png'"></image> <view class="1">上传图片</view> </view> </template> </u-upload> </view> </view> </view> <view class="goods-hd"> <view class="items"> <view class="a" style="justify-content: space-between;">多规格<u-switch v-model="skuchecked" active-color="#55BD6A"></u-switch> </view> <view class="b"> 最多添加3个商品规格组,生成SKU数量不能超出50个 </view> </view> <view class="item"> <view class="a">商品价格<text>*</text></view> <view class="b"> <input type="text" @input="keyGoodsPrice" v-model="from.goods_price" placeholder="请输入商品价格,最低0.1元" />元 </view> </view> <view class="item"> <view class="a">商品原价</view> <view class="b"> <input type="text" @input="keyOriginalPrice" v-model="from.goods_original_price" placeholder="请输入商品划线价格" />元 </view> </view> <view class="item"> <view class="a">商品库存<text>*</text></view> <view class="b"> <input type="number" v-model="from.goods_stock" placeholder="请输入商品库存" />件 </view> </view> <view class="item"> <view class="a">商品重量<text>*</text></view> <view class="b"> <input type="text" v-model="from.goods_weight" placeholder="请输入商品重量" />kg </view> </view> </view> <view class="goods-hd"> <view class="item"> <view class="a">配送方式<text>*</text></view> <view class="b" style="width: 350rpx;height: 40rpx;text-align: right;"> <picker @change="changeDelivery" mode="selector" placeholder="请选择配送方式" style="width: 350rpx;height: 40rpx;" range-key="text" :value="index" :range="deliveryList"> <text :style="{color: from.delivery_name? '#303030' : '#C7C7C7'}"> {{from.delivery_name?from.delivery_name:'请选择配送方式'}}</text> <u-icon name="arrow-right" color="#C7C7C7"></u-icon> </picker> </view> </view> <view class="item"> <view class="a">运费模版<text>*</text></view> <view class="b" style="width: 350rpx;height: 40rpx;text-align: right;"> <picker @change="changeDeliveryTemplate" mode="selector" placeholder="请选择运费模版" style="width: 350rpx;height: 40rpx;" range-key="text" :value="index" :range="deliveryTemplate"> <text :style="{color: from.template_name? '#303030' : '#C7C7C7'}"> {{from.template_name?from.template_name:'请选择运费模版'}}</text> <u-icon name="arrow-right" color="#C7C7C7"></u-icon> </picker> </view> </view> <view class="item"> <view class="a">销售状态<text>*</text></view> <view class="b"> <u-switch v-model="salesChecked" active-color="#55BD6A"></u-switch> </view> </view> </view> <view class="goods-fd"> <view class="btn" @click="onSubmit">确认</view> </view> <u-popup v-model="isShow" mode="bottom" border-radius="12" mask-close-able="false" closeable> <view class="goods-classify"> <view class="goods-classify-hd"> <view class="a" @click="openPage(2)"> <u-icon name="plus"></u-icon>新增分类 </view> 商品分类 </view> <view class="goods-classify-bd"> <scroll-view scroll-y class="l"> <view class="item" @click="tabLItem(0)"> <view :class="tabLIndex == 0?'item-on':''">数码</view> </view> <view class="item" @click="tabLItem(1)"> <view :class="tabLIndex == 0?'item-on':''">食品</view> </view> <view class="item" @click="tabLItem(2)"> <view :class="tabLIndex == 0?'item-on':''">服饰鞋包</view> </view> <view class="item" @click="tabLItem(3)"> <view :class="tabLIndex == 0?'item-on':''">家居百货</view> </view> <view class="item" @click="tabLItem(4)"> <view :class="tabLIndex == 0?'item-on':''">美妆/个户</view> </view> <view class="item" @click="tabLItem(5)"> <view :class="tabLIndex == 0?'item-on':''">家居百货</view> </view> <view class="item" @click="tabLItem(6)"> <view :class="tabLIndex == 0?'item-on':''">美妆/个户</view> </view> <view class="item" @click="tabLItem(7)"> <view :class="tabLIndex == 0?'item-on':''">食品</view> </view> <view class="item" @click="tabLItem(8)"> <view :class="tabLIndex == 0?'item-on':''">服饰鞋包</view> </view> <view class="item" @click="tabLItem(9)"> <view :class="tabLIndex == 0?'item-on':''">家居百货</view> </view> <view class="item" @click="tabLItem(10)"> <view :class="tabLIndex == 0?'item-on':''">美妆/个户</view> </view> </scroll-view> <scroll-view scroll-y class="r"> <view class="item" v-for="(a,i) in 10" @click="tabRItem(i)"> <view :class="tabRIndex == i?'item-on':''">水产肉类/新鲜水果</view> </view> </scroll-view> </view> </view> </u-popup> </view> </template> <script> import Config from '@/core/config' import * as newFunApi from '@/api/newFun' export default { data() { return { from: { goods_name: '', goods_class: '', goods_image_id: '', details_image_id: '', source_image_id: '', goods_details: '', goods_price: '', goods_original_price: '', goods_stock: '', goods_weight: '', delivery_id: '', delivery_name: '', template_name: '', template_id: '', }, content: '', skuchecked: false, salesChecked: false, goodSourceImageList: [], goodsDetailImageList: [], goodsImageList: [], deliveryTemplate: [{ text: '南京市', id: 0 }, { text: '西藏', id: 1 }], deliveryList: [{ text: '物流', id: 0 }, { text: '送货上门', id: 1 }], isShow: false, value: "", tabLIndex: 0, tabRIndex: 0, action: '', header: '', }; }, onReady() { this.action = (Config.get('apiUrl') + 'upload/image').replace("index.php?s=/", "") this.header = { 'Storeid': uni.getStorageSync('Store').storeInfo.store_id, 'Access-Token': uni.getStorageSync('AccessToken'), 'platform': "MP-WEIXIN", } }, methods: { // 提交信息 async onSubmit() { const that = this; console.log(that.from) return if (!that.from.goods_name) { return that.$toast('请输入商品名称') } let { status, message, data } = await newFunApi.addTransfer(that.form); if (status == 200) { uni.showToast({ title: "上架成功" }) setTimeout(function() { uni.$emit('refreshData'); uni.navigateBack({ delta: 1 }) }, 2000); } }, // 原价 keyOriginalPrice(e) { if (Number(e.detail.value) == 0 || Number(e.detail.value) < 0) { this.from.goods_original_price = '' return this.$toast('商品价不能低于0.1元') } this.from.goods_original_price = this.blurAmount(e.detail.value) }, // 商品价 keyGoodsPrice(e) { if (Number(e.detail.value) == 0 || Number(e.detail.value) < 0) { this.from.goods_price = '' return this.$toast('商品价不能低于0.1元') } this.from.goods_price = this.blurAmount(e.detail.value) }, // 价格规则 blurAmount(amount) { let num = null num = amount.replace(new RegExp('^(\\d+\\.\\d{2}).+'), '$1') const startPoint = /^\./g if (startPoint.test(num)) { num = amount.replace(startPoint, '0.') } if (num && !num.includes('.') && num !== '0') { num = +num } const morePoint = /\.+(\d*|\.+)\./g if (morePoint.test(num)) { num = amount .replace(/\.{2,}/g, ".") .replace(".", "$#$") .replace(/\./g, "") .replace("$#$", ".") } return num }, // 获取配送方式 changeDelivery(e) { this.from.delivery_name = this.deliveryList[e.detail.value].text; this.from.delivery_id = this.deliveryList[e.detail.value].id; }, // 运费模板 changeDeliveryTemplate(e) { this.from.template_name = this.deliveryTemplate[e.detail.value].text; this.from.template_id = this.deliveryTemplate[e.detail.value].id; }, // 一键获取 onClickAccess() { }, //接受上传返回的数据商品 goosSuccess(list) { if (list.length > 0) { const { response } = list[0]; if (response.status == 200) { uni.showToast({ title: "上传成功" }) this.from.goods_image_id = this.handleRemove('', list) } } }, // 详情 detailSuccess(list) { if (list.length > 0) { const { response } = list[0]; if (response.status == 200) { uni.showToast({ title: "上传成功" }) this.from.details_image_id = this.handleRemove('', list) } } }, // 素材 sourceSuccess(list) { if (list.length > 0) { const { response } = list[0]; if (response.status == 200) { uni.showToast({ title: "上传成功" }) this.from.source_image_id = this.handleRemove('', list) } } }, goodsRemove: function(file, fileList) { this.from.goods_image_id = this.handleRemove(file, fileList) }, detailsRemove: function(file, fileList) { this.from.details_image_id = this.handleRemove(file, fileList) }, sourceRemove: function(file, fileList) { this.from.source_image_id = this.handleRemove(file, fileList) }, handleRemove: function(file, fileList) { console.log(file, fileList) let idList = [] fileList.forEach(item => { idList.push(item.response.data.fileInfo.file_id) }); return idList.join(',') }, openPage(i) { if (i == 1) { this.isShow = true; } else if (i == 2) { this.isShow = false; uni.navigateTo({ url: "/pages/news/goods/classify" }) } }, tabLItem(i) { this.tabLIndex = i console.log(this.tabLIndex) }, tabRItem(i) { this.tabRIndex = i console.log(this.tabRIndex) } } } </script> <style lang="scss" scoped> .goods { padding: 0 0 130rpx; overflow: hidden; margin-top: 12rpx; &-top { background-color: #fff; padding: 40rpx 25rpx; overflow: hidden; margin-bottom: 20rpx; input { display: block; line-height: 60rpx; font-size: 28rpx; color: #212121; } .btn { width: 158rpx; line-height: 50rpx; background: #FF5050; border-radius: 50rpx; text-align: center; font-size: 24rpx; font-weight: 500; color: #FFFFFF; float: right; } } &-hd { background-color: #fff; padding: 0 25rpx 0; overflow: hidden; margin-bottom: 20rpx; .item { padding: 20rpx 30rpx; line-height: 50rpx; font-size: 28rpx; color: #212121; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #F7F7F7; .a { text { color: #F34A40; margin-left: 5rpx; } } .b { font-size: 28rpx; color: #212121; display: flex; align-items: center; justify-content: flex-end; flex: 1; input { font-size: 28rpx; color: #6D6D6D; flex: 1; line-height: 50rpx; font-size: 28rpx; text-align: right; margin-right: 10rpx; } .select { width: 100%; display: flex; align-items: center; color: #C7C7C7; justify-content: flex-end; &-on { color: #212121; } } } } .items { padding: 20rpx 30rpx; line-height: 50rpx; font-size: 28rpx; color: #212121; border-bottom: 1px solid #F7F7F7; .t { width: 480rpx; height: 40rpx; padding-left: 30rpx; font-size: 28rpx; color: #212121; margin-top: 5rpx; } .a { flex: 1; display: flex; align-items: center; input { flex: 1; font-size: 26rpx; color: #212121; line-height: 50rpx; margin-left: 20rpx; } text { color: #F34A40; margin-left: 5rpx; } .select { flex: 1; } .tip { margin-left: 15rpx; font-size: 24rpx; font-weight: 500; color: #9F9F9F; } } .b { padding-top: 20rpx; font-size: 24rpx; font-weight: 400; color: #C7C7C7; } .c { padding-top: 20rpx; overflow: hidden; .slot-btn { width: 180rpx; height: 180rpx; background: #F6F6F6; border-radius: 10rpx; border: 1px solid #C0C0C0; text-align: center; font-size: 28rpx; font-weight: 500; color: #6D6D6D; image { width: 50rpx; height: 50rpx; margin-top: 30rpx; } } } } } &-fd { width: 100%; position: fixed; left: 0; bottom: 0; padding: 30rpx; z-index: 99; background-color: #fafafa; box-sizing: border-box; .btn { width: 630rpx; line-height: 88rpx; background: #F34A40; border-radius: 88rpx; text-align: center; font-size: 28rpx; font-weight: 500; color: #FFFFFF; } } &-classify { width: 100%; overflow: hidden; &-hd { padding: 30rpx 60rpx; position: relative; font-size: 32rpx; font-weight: 500; color: #303030; text-align: center; .a { display: flex; align-items: center; font-size: 28rpx; font-weight: 500; color: #FF624F; position: absolute; top: 30rpx; left: 40rpx; z-index: 2; } } &-bd { overflow: hidden; display: flex; align-items: flex-start; .l { width: 210rpx; height: 560rpx; background-color: #fff; .item { text-overflow: ellipsis; overflow: hidden; height: 80rpx; font-size: 28rpx; font-weight: 400; color: #303030; white-space: nowrap; line-height: 80rpx; padding-left: 30rpx; box-sizing: border-box; &-on { background-color: #fff; font-weight: 500; } } } .m { width: 100%; text-align: center; max-height: 560rpx; .item { text-overflow: ellipsis; overflow: hidden; height: 70rpx; font-size: 28rpx; font-weight: 400; color: #303030; white-space: nowrap; line-height: 70rpx; box-sizing: border-box; &-on { color: #FF624F; } } } .r { width: 540rpx; height: 560rpx; .item { text-overflow: ellipsis; overflow: hidden; height: 80rpx; font-size: 28rpx; font-weight: 400; color: #303030; white-space: nowrap; line-height: 80rpx; padding-left: 80rpx; box-sizing: border-box; &-on { color: #FF624F; } } } } } } ::v-deep .u-list-item { margin: 10rpx 20rpx 10rpx 0 !important; } ::v-deep .uni-textarea { max-height: 100rpx !important; } ::v-deep .uni-input-placeholder { color: #C7C7C7 !important; } </style>