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

update

上级 d287bf9d
......@@ -12,13 +12,18 @@ export function getGoodsList(data) {
export function addGoods(data) {
return httpRequest.post('/api/shop/commodity/spu/add', data)
}
/**
* 更新商品
*/
export function updateGoods(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) {
export function getSkuNameList(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) {
return httpRequest.post('/api/shop/spec/value/search', data)
}
/**
* 创建商品规格
* 创建商品规格
*/
export function addSku(data) {
return httpRequest.post('/api/shop/spec/add', data)
export function addSkuValue(data) {
return httpRequest.post('/api/shop/spec/value/add', data)
}
/**
* 创建商品规格
* 删除商品规格值
*/
export function addSkuValue(data) {
return httpRequest.post('/api/shop/spec/value/add', data)
export function deleteSkuValue(data) {
return httpRequest.post('/api/shop/spec/value/delete', data)
}
import httpRequest from '@/utils/axios'
/**
* 获取商品列表
* 获取订单列表
*/
export function getGoodsList(data) {
return httpRequest.post('/api/shop/commodity/spu/search', data)
export function getOrderList(data) {
return httpRequest.post('/api/shop/order/search', data)
}
/**
* 创建商品
* 创建订单
*/
export function addGoods(data) {
return httpRequest.post('/api/shop/commodity/spu/add', data)
}
/**
* 更新商品
*/
export function updateGoods(data) {
return httpRequest.post('/api/shop/commodity/spu/modify', data)
export function addOrder(data) {
return httpRequest.post('/api/shop/order/add', data)
}
......@@ -13,7 +13,12 @@ export function getShopList(data) {
export function addShop(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 {
this.page.total = parseInt(pageInfo.total_number || '')
this.dataList = callback ? callback(data) : data
})
.catch(() => {
this.page.total = 0
this.dataList = []
})
.finally(() => {
this.loading = false
})
......
<template>
<div class="upload-wrapper">
<div class="app-upload">
<el-upload
class="avatar-uploader"
action="https://webapp-pub.oss-cn-beijing.aliyuncs.com"
type="drag"
:before-upload="beforeUpload"
:on-success="handleSuccess"
:on-preview="handlePreview"
:data="data"
:file-list="fileList"
v-bind="$attrs"
v-on="$listeners"
>
<div v-if="value" class="avatar"><img :src="value" /></div>
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
<slot>
<i class="el-icon-plus"></i>
</slot>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="previewFile.url" />
</el-dialog>
</div>
</template>
<script>
......@@ -21,12 +26,34 @@ import md5 from 'blueimp-md5'
export default {
name: 'AppUpload',
props: {
value: { type: String },
value: { type: [String, Array] },
prefix: { type: String, default: 'upload/shop-admin/' }
},
data() {
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: {
......@@ -38,7 +65,7 @@ export default {
.then(response => {
const { accessid, policy, signature, host } = response
this.data = { key, OSSAccessKeyId: accessid, policy, signature, success_action_status: '200' }
file.src = `${host}/${key}`
file.url = `${host}/${key}`
resolve(true)
})
.catch(err => {
......@@ -48,45 +75,47 @@ export default {
})
},
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>
<style>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
.el-upload-list--picture-card .el-upload-list__item-thumbnail {
object-fit: cover;
}
.el-upload-list__item {
transition: none !important;
}
/* .el-upload--text {
background-color: #fbfdff;
border: 1px dashed #c0ccda;
border-radius: 6px;
box-sizing: border-box;
width: 148px;
height: 148px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #20a0ff;
line-height: 146px;
vertical-align: top;
}
.avatar-uploader-icon {
.el-upload--text i {
font-size: 28px;
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>
<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 {
},
data() {
return {
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' }
]
}
] // 规格名称列表
skuNameList: [] // 规格名称列表
}
},
computed: {
......
......@@ -40,8 +40,8 @@
<span>批量设置:</span>
<div class="batch-buttons" v-if="!showBatchInput">
<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('stock')">库存</el-button>
<el-button type="text" @click="batchUpdate('prime_price')">成本价</el-button>
</div>
<div class="batch-input" v-else>
......@@ -93,7 +93,6 @@ export default {
skuValueList: {
handler: function (newValue) {
newValue.forEach((item, index) => {
console.log(item)
// 规格
const values = item.reduce(
(result, item) => {
......
......@@ -50,7 +50,7 @@ export default {
children: [
{ name: '店铺信息', path: '/setting/info' },
{ name: '联系我们', path: '/setting/contact' },
{ name: '通用设置', path: '/setting/base' },
{ name: '通用设置', path: '/setting/general' },
{ name: '商品设置', path: '/setting/goods' }
]
}
......
......@@ -39,7 +39,7 @@
</template>
<script>
import { addSkuValue } from '@/api/goods'
import { addSkuValue, deleteSku, deleteSkuValue } from '@/api/goods'
export default {
props: {
......@@ -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>
......
<template>
<app-card>
<!--列表-->
<table-list v-bind="tableOptions" ref="list">
<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>
......@@ -12,6 +11,9 @@
</template>
<template v-slot:table-x="{ row }">
<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="handleCopy(row)">复制</el-button>
</template>
......@@ -24,18 +26,18 @@
import TableList from '@/components/base/tableList'
import AppCard from '@/components/base/card'
// 接口
import { getGoodsList } from '@/api/goods'
import { getGoodsList, deleteGoods } from '@/api/goods'
export default {
components: { AppCard, TableList },
data() {
return {
activeName: '1',
activeName: '0',
tabList: [
{ label: '全部', name: '1' },
{ label: '全部', name: '0' },
{ label: '销售中', name: '2' },
{ label: '已售罄', name: '3' },
{ label: '仓库中', name: '4' }
{ label: '仓库中', name: '1' }
]
}
},
......@@ -51,7 +53,8 @@ export default {
return {
remote: {
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: [
{
......@@ -88,15 +91,29 @@ export default {
}
},
methods: {
beforeRequest(params) {
params.status = this.activeName === '0' ? '' : this.activeName
return params
},
handleClick() {
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() {
// 获取商品分组
......
......@@ -10,6 +10,10 @@
<el-button type="primary">新增订单</el-button>
</router-link>
</template>
<template v-slot:table-price="{ row }">
<p>{{ row.product_price }}</p>
<p>{{ row.buy_count }}</p>
</template>
<template v-slot:table-x="{ row }">
<el-button type="text" @click="handleUpdate(row)">编辑</el-button>
<el-button type="text" @click="handlePromote(row)">推广</el-button>
......@@ -24,15 +28,15 @@
import TableList from '@/components/base/tableList'
import AppCard from '@/components/base/card'
// 接口
import { getGoodsList } from '@/api/goods'
import { getOrderList } from '@/api/order'
export default {
components: { AppCard, TableList },
data() {
return {
activeName: '1',
activeName: '0',
tabList: [
{ label: '全部', name: '1' },
{ label: '全部', name: '0' },
{ label: '代付款', name: '2' },
{ label: '待发货', name: '3' },
{ label: '已发货', name: '4' },
......@@ -47,8 +51,9 @@ export default {
tableOptions() {
return {
remote: {
httpRequest: getGoodsList,
params: { shop_id: this.$store.state.shopId }
httpRequest: getOrderList,
params: { shop_id: this.$store.state.shopId },
beforeRequest: this.beforeRequest
},
filters: [
{
......@@ -68,19 +73,23 @@ export default {
}
],
columns: [
{ label: '商品', prop: 'name' },
{ label: '单价(元)/数量', prop: 'sellPrice' },
{ label: '商品', prop: 'shop_name' },
{ label: '单价(元)/数量', prop: 'product_price', slots: 'table-price' },
{ label: '售后', prop: 'sellPrice' },
{ label: '买家 / 收货人', prop: 'balanceCount' },
{ label: '买家 / 收货人', prop: 'shipping_user' },
{ label: '配送方式', prop: 'sellCount' },
{ label: '实收金额(元)', prop: 'createTime' },
{ label: '订单状态', prop: 'createTime' },
{ label: '实收金额(元)', prop: 'payment_money' },
{ label: '订单状态', prop: 'order_status' },
{ label: '操作', slots: 'table-x' }
]
}
}
},
methods: {
beforeRequest(params) {
params.status = this.activeName === '0' ? '' : this.activeName
return params
},
handleClick() {
this.$refs.list.refetch(true)
},
......
<template>
<app-card>
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" style="width: 400px">
<el-form-item label="客户电话" prop="tel">
<el-input v-model="ruleForm.tel"></el-input>
<el-form-item label="客户电话" prop="shop_tel">
<el-input v-model="ruleForm.shop_tel"></el-input>
</el-form-item>
<el-form-item label="详细地址" prop="address">
<el-input v-model="ruleForm.address">
<el-form-item label="详细地址" prop="shop_address">
<el-input v-model="ruleForm.shop_address">
<template #append>
<el-button>搜索地图</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">保存</el-button>
</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: { tel: '', address: '' },
ruleForm: { shop_tel: '', shop_address: '' },
rules: {
tel: [{ required: true, message: '必填', trigger: 'blur' }],
address: [{ required: true, message: '必填', trigger: 'blur' }]
shop_tel: [{ 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>
......
<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 @@
<label class="label">创建时间:</label><span class="content">{{ shop.create_time }}</span>
</div>
<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>
......@@ -23,7 +23,7 @@
<el-input v-model="ruleForm.shop_name" placeholder="请输入店铺、品牌、机构的全称"></el-input>
</el-form-item>
<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 label="店铺有效期" prop="end_time">
<el-date-picker
......@@ -52,7 +52,7 @@
<script>
import AppCard from '@/components/base/card'
import AppUpload from '@/components/base/upload'
import { updateShop } from '@/api/shop'
export default {
components: { AppCard, AppUpload },
data() {
......@@ -80,7 +80,13 @@ export default {
onSubmit() {
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>
......
......@@ -38,13 +38,16 @@ export default [
meta: { title: '商品列表' }
},
{
name: 'goodsAdd',
path: 'add',
component: () => import(/* webpackChunkName: "goods" */ '@/pages/goods/goods/edit'),
meta: { title: '发布商品' }
},
{
name: 'goodsEdit',
path: 'edit/:id',
component: () => import(/* webpackChunkName: "goods" */ '@/pages/goods/goods/edit'),
props: { isEdit: true },
meta: { title: '编辑商品' }
},
{
......@@ -84,6 +87,11 @@ export default [
component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/info'),
meta: { title: '店铺信息' }
},
{
path: 'general',
component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/general'),
meta: { title: '通用设置' }
},
{
path: 'contact',
component: () => import(/* webpackChunkName: "setting" */ '@/pages/setting/contact'),
......
......@@ -35,7 +35,9 @@ httpRequest.interceptors.response.use(
function(response) {
const { data } = response
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 data
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论