1.厂商-商品库

master
panqihua 1 year ago
parent f9a045e8e2
commit a315ccd185
  1. 277
      src/views/components/inventory/components/add_product.vue
  2. 135
      src/views/components/inventory/components/form.vue
  3. 95
      src/views/components/inventory/components/tag_list.vue
  4. 41
      src/views/components/inventory/index.vue
  5. 7
      src/views/platform/self-operated-mall/index.vue

@ -0,0 +1,277 @@
<template>
<div class="app-container">
<el-tabs v-model="activeName" type="border-card">
<el-tab-pane label="基本信息" name="base">
<div class="title">基本信息</div>
<el-divider/>
<el-form :inline="true">
<el-form-item label="商品名称">
<el-input placeholder="请输入商品名称"/>
</el-form-item>
<el-form-item label="商品编码">
<el-input placeholder="请输入商品编码"/>
</el-form-item>
<el-form-item>
<el-cascader placeholder="请选择商品分类" :options="categoryOptions"></el-cascader>
</el-form-item>
</el-form>
<el-form :inline="true">
<el-form-item label="计量单位">
<el-select placeholder="请选择计量单位" v-model="form.unit"/>
</el-form-item>
<el-form-item label="库存预警">
<el-input-number placeholder="请输入最低库存数量" v-model="form.num" controls-position="right"
:step="100" :min="0"></el-input-number>
</el-form-item>
<br/>
<el-form-item label="是否上架">
<el-switch v-model="form.isOnShelf" active-color="#adbcf9" inactive-color="#adbc00">
</el-switch>
</el-form-item>
</el-form>
<div class="title">商品主图</div>
<el-divider/>
<el-row>
<el-col :span="4" v-for="(item, index) in form.fileList" :key="index">
<div class="img" :style="{
backgroundImage: `url(${item.blobURL})`
}">
<i class="el-icon-check" v-if="item.primary"></i>
</div>
<div style="text-align: center;">
<el-button type="text" @click="setPrimary(index)">设为主图</el-button>
<el-button type="text" @click="handleRemove(index)">删除图片</el-button>
</div>
</el-col>
</el-row>
<el-upload action="#" accept="image/png, image/jpeg" :limit="maxFileCount" :show-file-list="false"
:auto-upload="false" :file-list="form.fileList" :on-change="handleChange">
<el-button type="primary" v-if="form.fileList.length < maxFileCount">上传图片</el-button>
<span
class="upload-tip">145*145单张图片大小不超过{{ maxFileSizeM }}支持格式jpgpng最多上传8张</span>
</el-upload>
<div class="title">商品详情</div>
<h1>富文本编辑器</h1>
<el-divider/>
<el-button type="primary" @click="save">保存</el-button>
<el-button @click="$emit('close')">关闭</el-button>
</el-tab-pane>
<el-tab-pane label="库存规格" name="spec">
<el-row type="flex" justify="center">
<el-col :span="2">
<div class="left-title">库存/规格</div>
</el-col>
<el-col :span="16">
<el-input placeholder="输入规格名称">
<template slot="append">
<el-button>添加规格</el-button>
</template>
</el-input>
<div class="top">
<tag-list label="尺寸" @change-tags="(tags) => { console.info(tags) }"/>
<tag-list label="颜色" @change-tags="(tags) => { console.info(tags) }"/>
</div>
<el-table class="spec-table" :data="specList" :span-method="arraySpanMethod" border>
<el-table-column label="尺寸" align="center">
<template slot-scope="scope">
<span v-if="scope.row === undefined">批量设置</span>
</template>
</el-table-column>
<el-table-column label="颜色" align="center">
</el-table-column>
<el-table-column label="价格" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row === undefined">
<template slot="append">
<el-button>设置</el-button>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="吊牌 价格" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row === undefined">
<template slot="append">
<el-button>设置</el-button>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="库存" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row === undefined">
<template slot="append">
<el-button>设置</el-button>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="图片" align="center"></el-table-column>
</el-table>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import { mapState } from 'vuex'
import TagList from './tag_list'
export default {
name: 'AddProduct',
components: { TagList },
data() {
return {
//
specList: [undefined],
//
maxFileCount: 2,
//
maxFileSize: 1024 * 1024 * 5,
form: {
//
num: 100,
//
isOnShelf: true,
//
unit: undefined,
fileList: []
},
activeName: 'base'
}
},
methods: {
arraySpanMethod({ row, column, rowIndex, columnIndex }) {
if (rowIndex === this.specList.length - 1) {
switch (columnIndex) {
case 0:
return [1, 2]
case 1:
return [0, 0]
default:
return [1, 1]
}
} else {
return [1, 1]
}
},
//
setPrimary(index) {
let _index = this.form.fileList.findIndex(item => item.primary)
let old = this.form.fileList[_index]
old.primary = false
this.form.fileList.splice(_index, 1, old)
let _new = this.form.fileList[index]
_new.primary = true
this.form.fileList.splice(index, 1, _new)
},
handleChange(file, fileList) {
if (file.size > this.maxFileSize) {
this.$modal.msgWarning(`单张图片大小不能超过${this.maxFileSizeM}`)
return
}
file.blobURL = URL.createObjectURL(file.raw)
file.primary = false
if (this.form.fileList.length === 0) {
file.primary = true
}
this.form.fileList.push(file)
},
handleRemove(index) {
let del = this.form.fileList[index]
this.form.fileList.splice(index, 1)
//
if (this.form.fileList.length > 0 && del.primary) {
let defaultPrimary = this.form.fileList[0]
defaultPrimary.primary = true
this.form.fileList.splice(0, 1, defaultPrimary)
}
},
handlePreview(file) {
console.log(file)
},
save() {
this.$modal.msgSuccess('保存成功')
this.$emit('close')
}
},
computed: {
...mapState({
categoryOptions: state => state.platformShop.categoryOptions
}),
maxFileSizeM() {
return `${this.maxFileSize / 1024 / 1024}M`
}
}
}
</script>
<style lang="scss">
.spec-table {
margin-top: 10px;
thead th {
background-color: #fff !important;
}
}
.top {
margin-top: 5px;
background-color: #f5f5f5;
border-radius: 5px;
border: 1px solid rgba(0, 0, 0, 0.2);
}
.img {
width: 145px;
height: 145px;
background-position: center;
background-size: cover;
margin: auto;
display: flex;
align-items: center;
justify-content: center;
font-size: 50px;
}
.left-title {
font-size: 16px;
}
.title {
color: rgba(16, 16, 16, 1);
font-size: 16px;
text-align: left;
font-family: SourceHanSansSC-regular;
margin-top: 20px;
}
.el-switch__core:after {
content: "";
position: absolute;
top: 1px;
left: 1px;
border-radius: 100%;
-webkit-transition: all 0.3s;
transition: all 0.3s;
width: 16px;
height: 16px;
background-color: #5a7bf4 !important;
}
.upload-tip {
font-size: 14px;
text-align: left;
font-family: SourceHanSansSC-regular;
margin-left: 10px;
}
</style>

@ -0,0 +1,135 @@
<template>
<div class="app-container">
<el-row>
<el-form :inline="true">
<el-form-item>
<el-input v-model="queryParams.productName" placeholder="请输入商品名称"/>
</el-form-item>
<el-form-item>
<el-input v-model="queryParams.productCode" placeholder="请输入商品编码"/>
</el-form-item>
<el-form-item>
<el-cascader placeholder="请选择商品分类" v-model="queryParams.productCategory"
:options="categoryOptions"></el-cascader>
</el-form-item>
<el-form-item>
<el-select v-model="queryParams.productStatus" placeholder="状态" clearable>
<el-option v-for="dict in dict.type.product_status" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-date-picker v-model="queryParams.dateRange" style="width: 240px" value-format="yyyy-MM-dd"
type="daterange" range-separator="-" start-placeholder="开始日期"
end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini">查询</el-button>
<el-button icon="el-icon-refresh" size="mini">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row type="flex" justify="space-between">
<el-col :span="12">
<el-button type="primary" @click="$emit('show-add')">新增商品</el-button>
<el-button>批量上架</el-button>
<el-button>批量下架</el-button>
<el-button>批量删除</el-button>
</el-col>
<el-col :span="6">
<el-button type="text">下载模板</el-button>
<el-button>导入</el-button>
<el-button>导出</el-button>
</el-col>
</el-row>
<el-row class="table">
<el-table :data="dataList">
<el-table-column type="selection" width="50" align="center"/>
<el-table-column type="index" label="序号" align="center">
</el-table-column>
<el-table-column label="商品编码" align="center">
DS000001
</el-table-column>
<el-table-column label="商品名称" align="center">
联想笔记本
</el-table-column>
<el-table-column label="商品图片" align="center">
<img src="http://www.dummyimage.com/50x50"/>
</el-table-column>
<el-table-column label="商品分类" align="center">
电子产品
</el-table-column>
<el-table-column label="单位" align="center">
</el-table-column>
<el-table-column label="销售价" align="center">
120.00
</el-table-column>
<el-table-column label="吊牌价" align="center">
120.00
</el-table-column>
<el-table-column label="销量" align="center">
1000
</el-table-column>
<el-table-column label="库存" align="center">
100
</el-table-column>
<el-table-column label="状态" align="center">
上架
</el-table-column>
<el-table-column label="创建时间" align="center">
2022-12-31 12:31
</el-table-column>
<el-table-column label="操作" align="center">
<el-button type="text">编辑</el-button>
<el-button type="text" @click="change(true,123)">上架</el-button>
<el-button type="text" @click="change(false,123)">下架</el-button>
</el-table-column>
</el-table>
</el-row>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'BaseForm',
dicts: ['product_status'],
data() {
return {
dataList: [{}],
//
queryParams: {
pageNum: 1,
pageSize: 10,
productName: undefined,
productCode: undefined,
productCategory: undefined,
productStatus: undefined,
dateRange: undefined
}
}
},
methods: {
change(status, id) {
if (status) {
this.$modal.confirm('商品上架后不可删除,确定上架?')
} else {
this.$modal.confirm('确定下架该商品')
}
}
},
computed: {
...mapState({
categoryOptions: state => state.platformShop.categoryOptions
})
}
}
</script>
<style scoped lang="scss">
.table {
margin-top: 20px;
}
</style>

@ -0,0 +1,95 @@
<template>
<div>
<div class="size">
<i class="el-icon-delete"></i>
<span>{{ this.label }}</span>
<i class="el-icon-delete" @click="tags = []"></i>
</div>
<el-row class="add" type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="value">
<template slot="append">
<el-button @click="addTag">添加</el-button>
</template>
</el-input>
</el-col>
<el-col :span="11">
<el-tag v-for="(tag, index) in tags" :key="tag.name" closable :type="tag.type"
@close="tags.splice(index, 1)">
{{ tag.name }}
</el-tag>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: 'TagList',
props: {
label: String
},
data() {
return {
//
value: '',
tags: []
}
},
methods: {
addTag() {
let value = this.value
if (value) {
if (this.tags.find(item => item.name === value)) {
this.$modal.msgWarning(`请问重复添加${value}`)
} else {
this.tags.push({ name: value, type: '' })
this.value = ''
}
}
}
},
watch: {
tags(value) {
this.$emit('change-tags', value)
}
}
}
</script>
<style scoped lang="scss">
.add {
background-color: #ffffff;
padding: 5px;
& > div:last-child {
display: flex;
align-items: center;
overflow-x: auto;
& > span {
margin-left: 5px;
}
}
}
.size {
font-size: 16px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 15px 10px;
& > span {
font-weight: bold;
}
& > i:first-child {
visibility: hidden;
}
& > i:last-child {
color: red;
}
}
</style>

@ -0,0 +1,41 @@
<template>
<div v-if="showList">
<el-tabs v-model="activeName" type="card" class="custom-tab">
<el-tab-pane label="全部商品(120)" name="all">
全部商品
</el-tab-pane>
<el-tab-pane label="上架商品(120)" name="on-shelf">
上架商品
</el-tab-pane>
<el-tab-pane label="下架商品(120)" name="off-shelf">
下架商品
</el-tab-pane>
<el-tab-pane label="库存预警(120)" name="warn">
库存预警
</el-tab-pane>
</el-tabs>
<base-form @show-add="showList = false"/>
</div>
<add-product v-else @close="showList = true"/>
</template>
<script>
import BaseForm from './components/form'
import AddProduct from './components/add_product'
//TODO:/使
export default {
name: 'Index',
components: { BaseForm, AddProduct },
data() {
return {
activeName: 'all',
showList: true
}
},
methods: {}
}
</script>
<style scoped lang="scss">
div[role='tablist'] > div {
background-color: #1684fc;
}
</style>

@ -20,8 +20,9 @@
<add-product v-else @close="showList = true" />
</template>
<script>
import BaseForm from "./components/form"
import AddProduct from "./components/add_product"
import BaseForm from './components/form'
import AddProduct from './components/add_product'
//TODO:/使
export default {
name: "Index",
components: { BaseForm, AddProduct },
@ -40,4 +41,4 @@ export default {
div[role='tablist']>div {
background-color: #1684fc;
}
</style>
</style>

Loading…
Cancel
Save