提交 1eb24e70 authored 作者: 王鹏飞's avatar 王鹏飞

update

上级 d287bf9d
...@@ -12,13 +12,18 @@ export function getGoodsList(data) { ...@@ -12,13 +12,18 @@ export function getGoodsList(data) {
export function addGoods(data) { export function addGoods(data) {
return httpRequest.post('/api/shop/commodity/spu/add', data) return httpRequest.post('/api/shop/commodity/spu/add', data)
} }
/** /**
* 更新商品 * 更新商品
*/ */
export function updateGoods(data) { export function updateGoods(data) {
return httpRequest.post('/api/shop/commodity/spu/modify', data) return httpRequest.post('/api/shop/commodity/spu/modify', data)
} }
/**
* 删除商品
*/
export function deleteGoods(data) {
return httpRequest.post('/api/shop/commodity/spu/delete', data)
}
/** /**
* 获取商品分组 * 获取商品分组
...@@ -51,6 +56,19 @@ export function deleteGroup(data) { ...@@ -51,6 +56,19 @@ export function deleteGroup(data) {
export function getSkuNameList(data) { export function getSkuNameList(data) {
return httpRequest.post('/api/shop/spec/search', data) return httpRequest.post('/api/shop/spec/search', data)
} }
/**
* 创建商品规格
*/
export function addSku(data) {
return httpRequest.post('/api/shop/spec/add', data)
}
/**
* 删除商品规格
*/
export function deleteSku(data) {
return httpRequest.post('/api/shop/spec/delete', data)
}
/** /**
* 获取商品规格值 * 获取商品规格值
*/ */
...@@ -58,14 +76,14 @@ export function getSkuValueList(data) { ...@@ -58,14 +76,14 @@ export function getSkuValueList(data) {
return httpRequest.post('/api/shop/spec/value/search', data) return httpRequest.post('/api/shop/spec/value/search', data)
} }
/** /**
* 创建商品规格 * 创建商品规格
*/ */
export function addSku(data) { export function addSkuValue(data) {
return httpRequest.post('/api/shop/spec/add', data) return httpRequest.post('/api/shop/spec/value/add', data)
} }
/** /**
* 创建商品规格 * 删除商品规格值
*/ */
export function addSkuValue(data) { export function deleteSkuValue(data) {
return httpRequest.post('/api/shop/spec/value/add', data) return httpRequest.post('/api/shop/spec/value/delete', data)
} }
import httpRequest from '@/utils/axios' import httpRequest from '@/utils/axios'
/** /**
* 获取商品列表 * 获取订单列表
*/ */
export function getGoodsList(data) { export function getOrderList(data) {
return httpRequest.post('/api/shop/commodity/spu/search', data) return httpRequest.post('/api/shop/order/search', data)
} }
/** /**
* 创建商品 * 创建订单
*/ */
export function addGoods(data) { export function addOrder(data) {
return httpRequest.post('/api/shop/commodity/spu/add', data) return httpRequest.post('/api/shop/order/add', data)
}
/**
* 更新商品
*/
export function updateGoods(data) {
return httpRequest.post('/api/shop/commodity/spu/modify', data)
} }
...@@ -13,7 +13,12 @@ export function getShopList(data) { ...@@ -13,7 +13,12 @@ export function getShopList(data) {
export function addShop(data) { export function addShop(data) {
return httpRequest.post('/api/shop/shop/add', data) return httpRequest.post('/api/shop/shop/add', data)
} }
/**
* 更新店铺
*/
export function updateShop(data) {
return httpRequest.post('/api/shop/shop/modify', data)
}
/** /**
* 删除店铺 * 删除店铺
*/ */
......
...@@ -140,6 +140,10 @@ export default { ...@@ -140,6 +140,10 @@ export default {
this.page.total = parseInt(pageInfo.total_number || '') this.page.total = parseInt(pageInfo.total_number || '')
this.dataList = callback ? callback(data) : data this.dataList = callback ? callback(data) : data
}) })
.catch(() => {
this.page.total = 0
this.dataList = []
})
.finally(() => { .finally(() => {
this.loading = false this.loading = false
}) })
......
<template> <template>
<div class="upload-wrapper"> <div class="app-upload">
<el-upload <el-upload
class="avatar-uploader"
action="https://webapp-pub.oss-cn-beijing.aliyuncs.com" action="https://webapp-pub.oss-cn-beijing.aliyuncs.com"
type="drag" type="drag"
:before-upload="beforeUpload" :before-upload="beforeUpload"
:on-success="handleSuccess" :on-success="handleSuccess"
:on-preview="handlePreview"
:data="data" :data="data"
:file-list="fileList"
v-bind="$attrs" v-bind="$attrs"
v-on="$listeners" v-on="$listeners"
> >
<div v-if="value" class="avatar"><img :src="value" /></div> <slot>
<i v-else class="el-icon-plus avatar-uploader-icon"></i> <i class="el-icon-plus"></i>
</slot>
</el-upload> </el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="previewFile.url" />
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
...@@ -21,12 +26,34 @@ import md5 from 'blueimp-md5' ...@@ -21,12 +26,34 @@ import md5 from 'blueimp-md5'
export default { export default {
name: 'AppUpload', name: 'AppUpload',
props: { props: {
value: { type: String }, value: { type: [String, Array] },
prefix: { type: String, default: 'upload/shop-admin/' } prefix: { type: String, default: 'upload/shop-admin/' }
}, },
data() { data() {
return { return {
data: {} data: {}, // 请求参数
fileList: [], // 文件列表
dialogVisible: false,
previewFile: {}
}
},
watch: {
value: {
immediate: true,
handler(value) {
if (!value) {
return
}
let fileList = []
if (Array.isArray(value)) {
fileList = value.map(item => {
return { name: item.name || item, url: item.url || item }
})
} else {
fileList.push({ name: '附件', url: value })
}
this.fileList = [...fileList]
}
} }
}, },
methods: { methods: {
...@@ -38,7 +65,7 @@ export default { ...@@ -38,7 +65,7 @@ export default {
.then(response => { .then(response => {
const { accessid, policy, signature, host } = response const { accessid, policy, signature, host } = response
this.data = { key, OSSAccessKeyId: accessid, policy, signature, success_action_status: '200' } this.data = { key, OSSAccessKeyId: accessid, policy, signature, success_action_status: '200' }
file.src = `${host}/${key}` file.url = `${host}/${key}`
resolve(true) resolve(true)
}) })
.catch(err => { .catch(err => {
...@@ -48,45 +75,47 @@ export default { ...@@ -48,45 +75,47 @@ export default {
}) })
}, },
handleSuccess(response, file) { handleSuccess(response, file) {
this.$emit('input', file.raw.src) if (Array.isArray(this.value)) {
this.fileList.push({ name: file.name, url: file.raw.url })
this.$emit('input', this.fileList)
} else {
this.fileList = [file.raw.url]
this.$emit('input', file.raw.url)
}
},
// 删除
handleRemove(index) {
this.fileList.splice(index, 1)
this.$emit('input', Array.isArray(this.value) ? this.fileList : '')
},
// 预览
handlePreview(file) {
this.previewFile = file
this.dialogVisible = true
} }
} }
} }
</script> </script>
<style> <style>
.avatar-uploader .el-upload { .el-upload-list--picture-card .el-upload-list__item-thumbnail {
border: 1px dashed #d9d9d9; object-fit: cover;
}
.el-upload-list__item {
transition: none !important;
}
/* .el-upload--text {
background-color: #fbfdff;
border: 1px dashed #c0ccda;
border-radius: 6px; border-radius: 6px;
box-sizing: border-box;
width: 148px;
height: 148px;
cursor: pointer; cursor: pointer;
position: relative; line-height: 146px;
overflow: hidden; vertical-align: top;
}
.avatar-uploader .el-upload:hover {
border-color: #20a0ff;
} }
.el-upload--text i {
.avatar-uploader-icon {
font-size: 28px; font-size: 28px;
color: #8c939d; color: #8c939d;
width: 178px; } */
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
.avatar img {
max-width: 100%;
max-height: 100%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
</style> </style>
<template>
<div class="goods-message">
<message-item v-for="(item, index) in list" :data="item" :key="index" @remove="handleRemove(index)"></message-item>
<el-button type="text" @click="handleAdd">
<i class="el-icon-circle-plus-outline"></i>&nbsp;&nbsp;添加字段
</el-button>
</div>
</template>
<script>
import MessageItem from './messageItem'
export default {
props: { data: { type: Array, default: () => [] } },
components: { MessageItem },
data() {
return {
list: [{ filed: '手机号', type: 'text', required: true }]
}
},
methods: {
handleAdd() {
this.list.push({ filed: '留言' + (this.list.length + 1), type: 'text', required: false })
},
handleRemove(index) {
this.list.splice(index, 1)
}
}
}
</script>
<style>
</style>
<template>
<div class="goods-message-item">
<el-input v-model="data.filed" style="width: 200px" />
<el-select v-model="data.type" style="width: 120px; margin: 0 20px">
<el-option v-for="item in list" :label="item.name" :value="item.type" :key="item.type"></el-option>
</el-select>
<el-checkbox v-model="data.multiple" v-if="data.type === 'text'">多行</el-checkbox>
<el-checkbox v-model="data.datetime" v-if="data.type === 'time'">含日期</el-checkbox>
<el-checkbox v-model="data.required">必填</el-checkbox>
<el-button type="text" style="margin-left: 20px" @click="$emit('remove')">删除</el-button>
</div>
</template>
<script>
export default {
props: { data: { type: Object, default: () => [] } },
data() {
return {
list: [
{ type: 'text', name: '文本格式' },
{ type: 'number', name: '数字格式' },
{ type: 'email', name: '邮件' },
{ type: 'date', name: '日期' },
{ type: 'time', name: '时间' },
{ type: 'id', name: '身份证号' },
{ type: 'image', name: '图片' },
{ type: 'phone', name: '手机号' }
]
}
},
methods: {
handleAdd() {}
}
}
</script>
<style lang="scss">
.goods-message-item {
display: flex;
align-items: center;
}
.goods-message-item + .goods-message-item {
margin-top: 10px;
}
</style>
...@@ -27,25 +27,7 @@ export default { ...@@ -27,25 +27,7 @@ export default {
}, },
data() { data() {
return { return {
skuNameList: [ skuNameList: [] // 规格名称列表
{
spec_id: '1',
spec_name: '颜色',
spec_values: [
{ spec_value_id: '1', spec_value: '红' },
{ spec_value_id: '2', spec_value: '黄' },
{ spec_value_id: '3', spec_value: '蓝' }
]
},
{
spec_id: '2',
spec_name: '大小',
spec_values: [
{ spec_value_id: '1', spec_value: 'L' },
{ spec_value_id: '2', spec_value: 'M' }
]
}
] // 规格名称列表
} }
}, },
computed: { computed: {
......
...@@ -40,8 +40,8 @@ ...@@ -40,8 +40,8 @@
<span>批量设置:</span> <span>批量设置:</span>
<div class="batch-buttons" v-if="!showBatchInput"> <div class="batch-buttons" v-if="!showBatchInput">
<el-button type="text" @click="batchUpdate('price')">价格</el-button> <el-button type="text" @click="batchUpdate('price')">价格</el-button>
<el-button type="text" @click="batchUpdate('stock')">库存</el-button>
<el-button type="text" @click="batchUpdate('mark_price')">划线价</el-button> <el-button type="text" @click="batchUpdate('mark_price')">划线价</el-button>
<el-button type="text" @click="batchUpdate('stock')">库存</el-button>
<el-button type="text" @click="batchUpdate('prime_price')">成本价</el-button> <el-button type="text" @click="batchUpdate('prime_price')">成本价</el-button>
</div> </div>
<div class="batch-input" v-else> <div class="batch-input" v-else>
...@@ -93,7 +93,6 @@ export default { ...@@ -93,7 +93,6 @@ export default {
skuValueList: { skuValueList: {
handler: function (newValue) { handler: function (newValue) {
newValue.forEach((item, index) => { newValue.forEach((item, index) => {
console.log(item)
// 规格 // 规格
const values = item.reduce( const values = item.reduce(
(result, item) => { (result, item) => {
......
...@@ -50,7 +50,7 @@ export default { ...@@ -50,7 +50,7 @@ export default {
children: [ children: [
{ name: '店铺信息', path: '/setting/info' }, { name: '店铺信息', path: '/setting/info' },
{ name: '联系我们', path: '/setting/contact' }, { name: '联系我们', path: '/setting/contact' },
{ name: '通用设置', path: '/setting/base' }, { name: '通用设置', path: '/setting/general' },
{ name: '商品设置', path: '/setting/goods' } { name: '商品设置', path: '/setting/goods' }
] ]
} }
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
</template> </template>
<script> <script>
import { addSkuValue } from '@/api/goods' import { addSkuValue, deleteSku, deleteSkuValue } from '@/api/goods'
export default { export default {
props: { props: {
...@@ -82,9 +82,21 @@ export default { ...@@ -82,9 +82,21 @@ export default {
}) })
}, },
// 删除规格 // 删除规格
removeSku(item) {}, removeSku(data) {
deleteSku({ shop_id: this.shopId, spec_id: data.spec_id }).then(response => {
this.$message({ type: 'success', message: '删除成功' })
this.$emit('update')
})
},
// 删除规格值 // 删除规格值
removeSkuValue(item) {} removeSkuValue(data) {
deleteSkuValue({ shop_id: this.shopId, spec_id: this.data.spec_id, spec_value_id: data.spec_value_id }).then(
response => {
this.$message({ type: 'success', message: '删除成功' })
this.$emit('update')
}
)
}
} }
} }
</script> </script>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<el-form :model="ruleForm" :rules="rules" label-position="top" ref="ruleForm" @submit.native.prevent> <el-form :model="ruleForm" :rules="rules" label-position="top" ref="ruleForm" @submit.native.prevent>
<app-card title="商品类型"> <app-card title="商品类型">
<el-radio-group v-model="ruleForm.category_id"> <el-radio-group v-model="ruleForm.category_id">
<el-radio :label="item.id" border v-for="item in goodsType" :key="item.id">{{ item.name }}</el-radio> <el-radio :label="item.id" border v-for="item in categoryList" :key="item.id">{{ item.name }}</el-radio>
</el-radio-group> </el-radio-group>
</app-card> </app-card>
...@@ -26,11 +26,13 @@ ...@@ -26,11 +26,13 @@
<p class="form-tips">在商品详情页标题下面展示卖点信息,建议60字以内</p> <p class="form-tips">在商品详情页标题下面展示卖点信息,建议60字以内</p>
</el-form-item> </el-form-item>
<el-form-item label="商品图片" prop="chart_oss"> <el-form-item label="商品图片" prop="chart_oss">
<app-upload v-model="ruleForm.chart_oss"></app-upload> <app-upload v-model="ruleForm.chart_oss" multiple list-type="picture-card" accept="image/*"></app-upload>
<p class="form-tips">建议尺寸:800*800像素,你可以拖拽图片调整顺序,最多上传15张</p> <p class="form-tips">建议尺寸:800*800像素,你可以拖拽图片调整顺序,最多上传15张</p>
</el-form-item> </el-form-item>
<el-form-item label="主图视频" prop="main_chart_oss"> <el-form-item label="主图视频" prop="main_chart_oss">
<app-upload v-model="ruleForm.main_chart_oss"></app-upload> <app-upload v-model="ruleForm.main_chart_oss" accept="video/*">
<el-button size="small" type="primary">点击上传</el-button>
</app-upload>
<p class="form-tips"> <p class="form-tips">
添加主图视频可提升成交转化,有利于获取更多新流量;建议视频突出商品核心卖点,时长 9-30 秒,宽高比 16:9 添加主图视频可提升成交转化,有利于获取更多新流量;建议视频突出商品核心卖点,时长 9-30 秒,宽高比 16:9
</p> </p>
...@@ -55,20 +57,35 @@ ...@@ -55,20 +57,35 @@
</el-form-item> </el-form-item>
</app-card> </app-card>
<app-card title="其他信息"> <app-card title="其他信息">
<el-form-item label="留言" prop="sales_type">
<message></message>
</el-form-item>
<el-form-item label="开售方式" prop="sales_type"> <el-form-item label="开售方式" prop="sales_type">
<el-radio-group v-model="ruleForm.sales_type"> <el-radio-group v-model="ruleForm.sales_type">
<el-radio label="1">立即开售</el-radio> <el-radio label="1">立即开售</el-radio>
<el-radio label="2">定时开售</el-radio>
<el-radio label="3">放入仓库</el-radio> <el-radio label="3">放入仓库</el-radio>
<el-radio label="2">定时开售</el-radio>
<el-date-picker
v-model="ruleForm.sales_time"
type="datetime"
size="mini"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择开售时间"
v-if="ruleForm.sales_type === '2'"
/>
</el-radio-group> </el-radio-group>
<el-input v-model="ruleForm.sales_time" v-if="ruleForm.sales_type === '2'" />
</el-form-item> </el-form-item>
<el-form-item label="立即购买按钮" prop="buy_button_text"> <el-form-item label="购买按钮" prop="buy_button_text">
<el-radio-group v-model="ruleForm.buy_button_text"> <el-radio-group v-model="buyButtonTextRadio" @change="onBuyButtonTextRadioChange">
<el-radio label="1">默认名称</el-radio> <el-radio label="1">默认名称</el-radio>
<el-radio label="2">自定义名称</el-radio> <el-radio label="2">自定义名称</el-radio>
<el-input
v-model="ruleForm.buy_button_text"
v-if="buyButtonTextRadio === '2'"
size="mini"
class="buy-button-input"
/>
</el-radio-group> </el-radio-group>
<el-input v-model="ruleForm.buy_button_text" />
</el-form-item> </el-form-item>
<el-form-item label="售后服务" prop="after_sales_mode"> <el-form-item label="售后服务" prop="after_sales_mode">
<el-radio-group v-model="ruleForm.after_sales_mode"> <el-radio-group v-model="ruleForm.after_sales_mode">
...@@ -80,7 +97,7 @@ ...@@ -80,7 +97,7 @@
<div class="form-footer"> <div class="form-footer">
<div class="inner"> <div class="inner">
<el-button type="primary" @click="onSubmit">保存并查看</el-button> <el-button type="primary" @click="onSubmit">保存并查看</el-button>
<el-button @click="onCancel">下一步</el-button> <el-button @click="onSubmit">下一步</el-button>
</div> </div>
</div> </div>
</el-form> </el-form>
...@@ -91,49 +108,42 @@ ...@@ -91,49 +108,42 @@
// 组件 // 组件
import AppCard from '@/components/base/card' import AppCard from '@/components/base/card'
import AppUpload from '@/components/base/upload' import AppUpload from '@/components/base/upload'
import sku from '@/components/goods/sku' import Sku from '@/components/goods/sku'
import skuView from '@/components/goods/skuView' import SkuView from '@/components/goods/skuView'
import Message from '@/components/goods/message'
// 接口 // 接口
import { addGoods, updateGoods, getGoodsList } from '@/api/goods' import { addGoods, updateGoods, getGoodsList } from '@/api/goods'
export default { export default {
components: { AppCard, AppUpload, sku, skuView }, components: { AppCard, AppUpload, Sku, SkuView, Message },
props: { isEdit: { type: Boolean, default: false } },
data() { data() {
return { return {
pid: '', // ID
loading: false, // 加载中 loading: false, // 加载中
isEdit: false, // 是否修改 categoryList: [{ id: '1', name: '虚拟商品' }], // 商品类型
goodsType: [{ id: '1', name: '虚拟商品' }], // 商品类型
goodsGroup: [], // 商品分组
goodsGroupValue: [], // 商品分组value
disabledInput: false,
ruleForm: { ruleForm: {
category_id: '1', category_id: '1', // 商品类型
spu_name: '标题', spu_name: '', // 商品标题
describe: '分享描述', describe: '', // 分享描述
charact: '商品卖点', charact: '', // 商品卖点
chart_oss: 'https://webapp-pub.ezijing.com/upload/shop-admin/aafa464602ae315e56534e81b687522b.jpg', chart_oss: [],
main_chart_oss: 'https://webapp-pub.ezijing.com/upload/shop-admin/95500a48092218bb7805eb31701ce209.jpg', main_chart_oss: '',
group_id: '6800703015822032896', group_id: '', // 商品分组
startTime: null, sales_type: '1', // 开售方式 1、立即开售 2、定时开售 3、放入仓库
sales_type: '1', buy_button_text: '立即购买', // 购买按钮文字
buy_button_text: '1', spu_context: '', // 商品详情
goodStockList: [], // 规格明细 stock_sub_method: '', // 库存扣减方式
spu_context: '', after_sales_mode: '2', // 售后服务方式 1、支持买家申请退款 2、不支持买家申请退款
skuKeyValueList: [],
stock_sub_method: '2',
after_sales_mode: '2',
app_button_text: '', app_button_text: '',
sales_time: '', sales_time: '', // 开售时间
buy_limit: '1' buy_limit: '', // 限购
goodStockList: [], // 规格明细
skuKeyValueList: []
}, },
buyButtonTextRadio: '1',
rules: { rules: {
spu_name: [{ required: true, message: '商品名称不可为空', trigger: 'blur' }] spu_name: [{ required: true, message: '商品名称不可为空', trigger: 'blur' }],
// goodPhotoList: [{ required: true, message: '最少需要添加一张商品图', trigger: 'blur' }], chart_oss: [{ required: true, message: '最少需要添加一张商品图', trigger: 'blur' }]
// sellPrice: [{ required: true, message: '请输入价格', trigger: 'blur' }],
// balanceCount: [{ required: true, message: '请输入库存', trigger: 'blur' }],
// startTime: [{ required: true, message: '请选择售卖开始时间', trigger: 'blur' }],
// endTime: [{ required: true, message: '请选择售卖结束时间', trigger: 'blur' }]
} }
} }
}, },
...@@ -143,103 +153,54 @@ export default { ...@@ -143,103 +153,54 @@ export default {
}, },
groupList() { groupList() {
return this.$store.state.groups return this.$store.state.groups
}
},
watch: {
// 商品分组value
goodsGroupValue(ids) {
if (this.goodsGroup && this.goodsGroup.length) {
this.ruleForm.goodGroupToList = ids.map(id => {
return this.goodsGroup.find(item => item.id === id)
})
}
}, },
// 商品规格 pid() {
'ruleForm.skuKeyValueList': function (value) { return this.$route.params.id || this.$route.query.id
if (value && value.length) {
this.disabledInput = true
} else {
this.disabledInput = false
}
} }
}, },
methods: { methods: {
// 初始化 // 初始化
init() { init() {
this.pid = this.$route.params.id // 商品渲染
this.isEdit = !!this.pid if (this.pid) {
// 获取商品分组
this.$store.dispatch('getGroups')
if (this.isEdit) {
// 修改渲染
this.editRender() this.editRender()
} else {
const query = this.$route.query
if (query.params) {
try {
const params = JSON.parse(decodeURIComponent(query.params))
Object.assign(this.ruleForm, params)
if (params.goodTypeId === '21') {
this.isTicket = true
}
} catch (error) {
console.log(error)
}
}
this.loading = false
} }
// 获取商品分组
this.$store.dispatch('getGroups')
}, },
// 修改渲染 // 修改渲染
editRender(data) { editRender() {
// 请求接口 this.loading = true
getGoodsList({ id: this.pid }).then(response => { getGoodsList({ shop_id: this.shopId, spu_id: this.pid }).then(response => {
const data = response.data const [data] = response.data
Object.assign(this.ruleForm, data) Object.assign(this.ruleForm, data)
// 商品分组 // 图片
this.goodsGroupValue = data.goodGroupToList.map(item => item.id) try {
this.ruleForm.chart_oss = JSON.parse(data.chart_oss)
// 隐藏加载动画 } catch (error) {}
// 购买按钮
this.buyButtonTextRadio = data.buy_button_text === '立即购买' ? '1' : '2'
this.loading = false this.loading = false
}) })
}, },
// 确定 // 确定
onSubmit() { onSubmit() {
let isPass = true
// 基本信息表单校验 // 基本信息表单校验
this.$refs.ruleForm.validate(valid => { this.$refs.ruleForm.validate().then(valid => {
if (!valid) { // 规格明细校验
isPass = false // if (this.ruleForm.goodStockList && this.ruleForm.goodStockList.length) {
return false // this.$lodash.forEach(this.ruleForm.goodStockList, item => {
} // if (isNaN(parseFloat(item.sellPrice)) || isNaN(parseFloat(item.balanceCount))) {
}) // this.$message({ message: '请完善规格明细表单', type: 'error' })
// return false
// 规格明细校验 // }
// if ( // })
// isPass && // }
// this.ruleForm.skuKeyValueList && const params = Object.assign({ shop_id: this.shopId }, this.ruleForm)
// this.ruleForm.skuKeyValueList.length && params.chart_oss = JSON.stringify(params.chart_oss)
// this.ruleForm.goodStockList && params.spec = JSON.stringify(params.goodStockList)
// this.ruleForm.goodStockList.length
// ) {
// this.$lodash.forEach(this.ruleForm.goodStockList, item => {
// if (isNaN(parseFloat(item.sellPrice)) || isNaN(parseFloat(item.balanceCount))) {
// this.$message({ message: '请完善规格明细表单', type: 'error' })
// isPass = false
// return false
// }
// })
// if (!isPass) {
// return false
// }
// }
const params = Object.assign({ shop_id: this.shopId }, this.ruleForm)
params.spec = JSON.stringify(params.goodStockList)
if (isPass) {
this.isEdit ? this.onEdit(params) : this.onAdd(params) this.isEdit ? this.onEdit(params) : this.onAdd(params)
} else { })
this.$message({ message: '请完善表单信息', type: 'error' })
}
}, },
// 取消 // 取消
onCancel() { onCancel() {
...@@ -275,12 +236,10 @@ export default { ...@@ -275,12 +236,10 @@ export default {
this.onSuccess(response.data) this.onSuccess(response.data)
}) })
}, },
imageListUploaded(file) { onBuyButtonTextRadioChange(value) {
this.ruleForm.goodPhotoList.push(file) if (value === '1') {
}, this.ruleForm.buy_button_text = '立即购买'
imageListRemove(url) { }
const index = this.ruleForm.goodPhotoList.findIndex(item => item.imageUrl === url)
this.ruleForm.goodPhotoList.splice(index, 1)
} }
}, },
beforeMount() { beforeMount() {
...@@ -311,4 +270,9 @@ export default { ...@@ -311,4 +270,9 @@ export default {
align-items: center; align-items: center;
} }
} }
.buy-button-input {
display: inline-block;
width: 220px;
}
</style> </style>
<template> <template>
<app-card> <app-card>
<!--列表-->
<table-list v-bind="tableOptions" ref="list"> <table-list v-bind="tableOptions" ref="list">
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane :label="item.label" :name="item.name" v-for="item in tabList" :key="item.name"></el-tab-pane> <el-tab-pane :label="item.label" :name="item.name" v-for="item in tabList" :key="item.name"></el-tab-pane>
...@@ -12,6 +11,9 @@ ...@@ -12,6 +11,9 @@
</template> </template>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<el-button type="text" @click="handleUpdate(row)">编辑</el-button> <el-button type="text" @click="handleUpdate(row)">编辑</el-button>
<!-- <el-popconfirm confirm-button-text="确认" title="确定要删除该商品吗?" @confirm="handleRemove(row)">
<el-button type="text" slot="reference">删除</el-button>
</el-popconfirm> -->
<el-button type="text" @click="handlePromote(row)">推广</el-button> <el-button type="text" @click="handlePromote(row)">推广</el-button>
<el-button type="text" @click="handleCopy(row)">复制</el-button> <el-button type="text" @click="handleCopy(row)">复制</el-button>
</template> </template>
...@@ -24,18 +26,18 @@ ...@@ -24,18 +26,18 @@
import TableList from '@/components/base/tableList' import TableList from '@/components/base/tableList'
import AppCard from '@/components/base/card' import AppCard from '@/components/base/card'
// 接口 // 接口
import { getGoodsList } from '@/api/goods' import { getGoodsList, deleteGoods } from '@/api/goods'
export default { export default {
components: { AppCard, TableList }, components: { AppCard, TableList },
data() { data() {
return { return {
activeName: '1', activeName: '0',
tabList: [ tabList: [
{ label: '全部', name: '1' }, { label: '全部', name: '0' },
{ label: '销售中', name: '2' }, { label: '销售中', name: '2' },
{ label: '已售罄', name: '3' }, { label: '已售罄', name: '3' },
{ label: '仓库中', name: '4' } { label: '仓库中', name: '1' }
] ]
} }
}, },
...@@ -51,7 +53,8 @@ export default { ...@@ -51,7 +53,8 @@ export default {
return { return {
remote: { remote: {
httpRequest: getGoodsList, httpRequest: getGoodsList,
params: { shop_id: this.shopId, spu_id: '', spu_name: '', group_id: '' } params: { shop_id: this.shopId, spu_id: '', spu_name: '', group_id: '' },
beforeRequest: this.beforeRequest
}, },
filters: [ filters: [
{ {
...@@ -88,15 +91,29 @@ export default { ...@@ -88,15 +91,29 @@ export default {
} }
}, },
methods: { methods: {
beforeRequest(params) {
params.status = this.activeName === '0' ? '' : this.activeName
return params
},
handleClick() { handleClick() {
this.$refs.list.refetch(true) this.$refs.list.refetch(true)
}, },
// 编辑 // 编辑
handleUpdate() {}, handleUpdate(data) {
this.$router.push({ name: 'goodsEdit', params: { id: data.spu_id } })
},
// 删除
handleRemove(row) {
deleteGoods({ shop_id: this.shopId, spu_id: row.spu_id }).then(res => {
this.$refs.list.refetch()
})
},
// 推广 // 推广
handlePromote() {}, handlePromote(data) {},
// 复制 // 复制
handleCopy() {} handleCopy(data) {
this.$router.push({ name: 'goodsAdd', query: { id: data.spu_id } })
}
}, },
beforeMount() { beforeMount() {
// 获取商品分组 // 获取商品分组
......
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
<el-button type="primary">新增订单</el-button> <el-button type="primary">新增订单</el-button>
</router-link> </router-link>
</template> </template>
<template v-slot:table-price="{ row }">
<p>{{ row.product_price }}</p>
<p>{{ row.buy_count }}</p>
</template>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<el-button type="text" @click="handleUpdate(row)">编辑</el-button> <el-button type="text" @click="handleUpdate(row)">编辑</el-button>
<el-button type="text" @click="handlePromote(row)">推广</el-button> <el-button type="text" @click="handlePromote(row)">推广</el-button>
...@@ -24,15 +28,15 @@ ...@@ -24,15 +28,15 @@
import TableList from '@/components/base/tableList' import TableList from '@/components/base/tableList'
import AppCard from '@/components/base/card' import AppCard from '@/components/base/card'
// 接口 // 接口
import { getGoodsList } from '@/api/goods' import { getOrderList } from '@/api/order'
export default { export default {
components: { AppCard, TableList }, components: { AppCard, TableList },
data() { data() {
return { return {
activeName: '1', activeName: '0',
tabList: [ tabList: [
{ label: '全部', name: '1' }, { label: '全部', name: '0' },
{ label: '代付款', name: '2' }, { label: '代付款', name: '2' },
{ label: '待发货', name: '3' }, { label: '待发货', name: '3' },
{ label: '已发货', name: '4' }, { label: '已发货', name: '4' },
...@@ -47,8 +51,9 @@ export default { ...@@ -47,8 +51,9 @@ export default {
tableOptions() { tableOptions() {
return { return {
remote: { remote: {
httpRequest: getGoodsList, httpRequest: getOrderList,
params: { shop_id: this.$store.state.shopId } params: { shop_id: this.$store.state.shopId },
beforeRequest: this.beforeRequest
}, },
filters: [ filters: [
{ {
...@@ -68,19 +73,23 @@ export default { ...@@ -68,19 +73,23 @@ export default {
} }
], ],
columns: [ columns: [
{ label: '商品', prop: 'name' }, { label: '商品', prop: 'shop_name' },
{ label: '单价(元)/数量', prop: 'sellPrice' }, { label: '单价(元)/数量', prop: 'product_price', slots: 'table-price' },
{ label: '售后', prop: 'sellPrice' }, { label: '售后', prop: 'sellPrice' },
{ label: '买家 / 收货人', prop: 'balanceCount' }, { label: '买家 / 收货人', prop: 'shipping_user' },
{ label: '配送方式', prop: 'sellCount' }, { label: '配送方式', prop: 'sellCount' },
{ label: '实收金额(元)', prop: 'createTime' }, { label: '实收金额(元)', prop: 'payment_money' },
{ label: '订单状态', prop: 'createTime' }, { label: '订单状态', prop: 'order_status' },
{ label: '操作', slots: 'table-x' } { label: '操作', slots: 'table-x' }
] ]
} }
} }
}, },
methods: { methods: {
beforeRequest(params) {
params.status = this.activeName === '0' ? '' : this.activeName
return params
},
handleClick() { handleClick() {
this.$refs.list.refetch(true) this.$refs.list.refetch(true)
}, },
......
<template> <template>
<app-card> <app-card>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" style="width: 400px"> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" style="width: 400px">
<el-form-item label="客户电话" prop="tel"> <el-form-item label="客户电话" prop="shop_tel">
<el-input v-model="ruleForm.tel"></el-input> <el-input v-model="ruleForm.shop_tel"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="详细地址" prop="address"> <el-form-item label="详细地址" prop="shop_address">
<el-input v-model="ruleForm.address"> <el-input v-model="ruleForm.shop_address">
<template #append> <template #append>
<el-button>搜索地图</el-button> <el-button>搜索地图</el-button>
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">保存</el-button>
</el-form-item>
</el-form> </el-form>
</app-card> </app-card>
</template> </template>
<script> <script>
import AppCard from '@/components/base/card' import AppCard from '@/components/base/card'
import { updateShop } from '@/api/shop'
export default { export default {
components: { AppCard }, components: { AppCard },
data() { data() {
return { return {
ruleForm: { tel: '', address: '' }, ruleForm: { shop_tel: '', shop_address: '' },
rules: { rules: {
tel: [{ required: true, message: '必填', trigger: 'blur' }], shop_tel: [{ required: true, message: '必填', trigger: 'blur' }],
address: [{ required: true, message: '必填', trigger: 'blur' }] shop_address: [{ required: true, message: '必填', trigger: 'blur' }]
}
}
},
computed: {
shop() {
return this.$store.state.shop
}
},
watch: {
shop: {
immediate: true,
handler(data) {
this.ruleForm = Object.assign({}, data)
} }
} }
}, },
methods: {} methods: {
onSubmit() {
this.$refs.ruleForm.validate().then(this.updateShop)
},
updateShop() {
updateShop(this.ruleForm).then(resp => {
this.$message({ type: 'success', message: '修改成功' })
this.dialogVisible = false
this.$store.dispatch('getShop')
})
}
}
} }
</script> </script>
......
<template>
<app-card>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px">
<el-form-item label="店铺有效期" prop="shop_name">
<el-date-picker
v-model="ruleForm.end_time"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择店铺有效期"
>
</el-date-picker>
</el-form-item>
</el-form>
</app-card>
</template>
<script>
import AppCard from '@/components/base/card'
import { updateShop } from '@/api/shop'
export default {
components: { AppCard },
data() {
return {
ruleForm: {
end_time: ''
},
rules: {
end_time: [{ required: true, message: '必填', trigger: 'blur' }]
}
}
},
computed: {
shop() {
return this.$store.state.shop
}
},
watch: {
shop: {
immediate: true,
handler(data) {
this.ruleForm = Object.assign({}, data)
}
}
},
methods: {
onSubmit() {
this.$refs.ruleForm.validate().then(this.updateShop)
},
updateShop() {
updateShop(this.ruleForm).then(resp => {
this.$message({ type: 'success', message: '修改成功' })
this.$store.dispatch('getShop')
})
}
}
}
</script>
<style>
</style>
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<label class="label">创建时间:</label><span class="content">{{ shop.create_time }}</span> <label class="label">创建时间:</label><span class="content">{{ shop.create_time }}</span>
</div> </div>
<div class="item"> <div class="item">
<label class="label">联系电话:</label><span class="content">{{ shop.tel }}</span> <label class="label">联系电话:</label><span class="content">{{ shop.shop_tel }}</span>
</div> </div>
</div> </div>
</div> </div>
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<el-input v-model="ruleForm.shop_name" placeholder="请输入店铺、品牌、机构的全称"></el-input> <el-input v-model="ruleForm.shop_name" placeholder="请输入店铺、品牌、机构的全称"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="店铺头像" prop="shop_logo"> <el-form-item label="店铺头像" prop="shop_logo">
<app-upload v-model="ruleForm.shop_logo"></app-upload> <app-upload v-model="ruleForm.shop_logo" accept="image/*" :show-file-list="false"></app-upload>
</el-form-item> </el-form-item>
<el-form-item label="店铺有效期" prop="end_time"> <el-form-item label="店铺有效期" prop="end_time">
<el-date-picker <el-date-picker
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
<script> <script>
import AppCard from '@/components/base/card' import AppCard from '@/components/base/card'
import AppUpload from '@/components/base/upload' import AppUpload from '@/components/base/upload'
import { updateShop } from '@/api/shop'
export default { export default {
components: { AppCard, AppUpload }, components: { AppCard, AppUpload },
data() { data() {
...@@ -80,7 +80,13 @@ export default { ...@@ -80,7 +80,13 @@ export default {
onSubmit() { onSubmit() {
this.$refs.ruleForm.validate().then(this.updateShop) this.$refs.ruleForm.validate().then(this.updateShop)
}, },
updateShop() {} updateShop() {
updateShop(this.ruleForm).then(resp => {
this.$message({ type: 'success', message: '修改成功' })
this.dialogVisible = false
this.$store.dispatch('getShop')
})
}
} }
} }
</script> </script>
......
...@@ -38,13 +38,16 @@ export default [ ...@@ -38,13 +38,16 @@ export default [
meta: { title: '商品列表' } meta: { title: '商品列表' }
}, },
{ {
name: 'goodsAdd',
path: 'add', path: 'add',
component: () => import(/* webpackChunkName: "goods" */ '@/pages/goods/goods/edit'), component: () => import(/* webpackChunkName: "goods" */ '@/pages/goods/goods/edit'),
meta: { title: '发布商品' } meta: { title: '发布商品' }
}, },
{ {
name: 'goodsEdit',
path: 'edit/:id', path: 'edit/:id',
component: () => import(/* webpackChunkName: "goods" */ '@/pages/goods/goods/edit'), component: () => import(/* webpackChunkName: "goods" */ '@/pages/goods/goods/edit'),
props: { isEdit: true },
meta: { title: '编辑商品' } meta: { title: '编辑商品' }
}, },
{ {
...@@ -84,6 +87,11 @@ export default [ ...@@ -84,6 +87,11 @@ export default [
component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/info'), component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/info'),
meta: { title: '店铺信息' } meta: { title: '店铺信息' }
}, },
{
path: 'general',
component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/general'),
meta: { title: '通用设置' }
},
{ {
path: 'contact', path: 'contact',
component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/contact'), component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/contact'),
......
...@@ -35,7 +35,9 @@ httpRequest.interceptors.response.use( ...@@ -35,7 +35,9 @@ httpRequest.interceptors.response.use(
function(response) { function(response) {
const { data } = response const { data } = response
if (data.code) { if (data.code) {
Message.error(data.msg || data.message) if (![1010].includes(data.code)) {
Message.error(data.msg || data.message)
}
return Promise.reject(data) return Promise.reject(data)
} }
return data return data
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论