Files
vue3-element-admin/src/views/pms/goods/components/GoodsInfo.vue

199 lines
5.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="components-container">
<div class="components-container__main">
<el-form
ref="goodsForm"
:rules="rules"
:model="modelValue"
label-width="120px"
>
<el-form-item label="商品名称" prop="name">
<el-input style="width: 400px" v-model="modelValue.name"/>
</el-form-item>
<el-form-item label="原价" prop="originPrice">
<el-input style="width: 400px" v-model="modelValue.originPrice"/>
</el-form-item>
<el-form-item label="现价" prop="price">
<el-input style="width: 400px" v-model="modelValue.price"/>
</el-form-item>
<el-form-item label="商品品牌" prop="brandId">
<el-select
v-model="modelValue.brandId"
style="width:400px"
clearable
>
<el-option
v-for="item in brandOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="商品简介">
<el-input
type="textarea"
v-model="modelValue.description"
style="width: 400px"
/>
</el-form-item>
<el-form-item label="商品相册">
<el-row :gutter="10">
<el-col style="width: 180px" v-for="(item,index) in pictures">
<el-card :body-style="{ padding: '10px' }">
<single-upload v-model="item.url"/>
<div class="bottom" v-if="item.url">
<el-button type="text" class="button" v-if="item.main==true" style="color:#ff4d51">商品主图</el-button>
<el-button type="text" class="button" v-else @click="changeMainPicture(index)">设为主图</el-button>
<el-button type="text" class="button" @click="removePicture(index)">删除图片</el-button>
</div>
<div class="bottom" v-else>
<el-button type="text" class="button"/>
</div>
</el-card>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="商品详情" prop="detail">
<tinymce v-model="modelValue.detail" :height="400"/>
</el-form-item>
</el-form>
</div>
<div class="components-container__footer">
<el-button @click="handlePrev">上一步选择商品分类</el-button>
<el-button type="primary" @click="handleNext">下一步设置商品属性</el-button>
</div>
</div>
</template>
<script setup lang="ts">
import {listBrands} from "@/api/pms/brand"
import SingleUpload from '@/components/Upload/SingleUpload.vue'
import Tinymce from '@/components/Tinymce/index.vue'
import {onMounted, reactive, ref, toRefs, unref} from "vue"
import {ElForm} from "element-plus"
const emit = defineEmits(['prev', 'next'])
const dataForm = ref(ElForm)
const props = defineProps({
modelValue: {
type: Object,
default: {}
}
})
const state = reactive({
brandOptions: [],
// 商品图册
pictures: [] as Array<any>,
rules: {
name: [{required: true, message: '请填写商品名称', trigger: 'blur'}],
originPrice: [{required: true, message: '请填写原价', trigger: 'blur'}],
price: [{required: true, message: '请填写现价', trigger: 'blur'}],
brandId: [{required: true, message: '请选择商品品牌', trigger: 'blur'}],
}
})
const {brandOptions, pictures, rules} = toRefs(state)
function loadData() {
listBrands({}).then(response => {
state.brandOptions = response.data
})
const goodsId = props.modelValue.id
if (goodsId) {
const mainPicUrl = props.modelValue.picUrl
if (mainPicUrl) {
state.pictures.filter(item => item.main)[0].url = mainPicUrl
}
const subPicUrls = props.modelValue.subPicUrls
if (subPicUrls && subPicUrls.length > 0) {
for (let i = 1; i <= subPicUrls.length; i++) {
state.pictures[i].url = subPicUrls[i - 1]
}
}
}
}
function resetForm() {
state.pictures = [
{url: undefined, main: true},
{url: undefined, main: false},
{url: undefined, main: false},
{url: undefined, main: false},
{url: undefined, main: false},
]
}
/**
* 切换主图
*/
function changeMainPicture(changeIndex: number) {
const currMainPicture = JSON.parse(JSON.stringify(state.pictures[0]))
const nextMainPicture = JSON.parse(JSON.stringify(state.pictures[changeIndex]))
state.pictures[0].url = nextMainPicture.url
state.pictures[changeIndex].url = currMainPicture.url
}
function removePicture(index: number) {
state.pictures[index].url = undefined
}
function handlePrev() {
emit('prev')
}
function handleNext() {
const form = unref(dataForm)
form.validate((valid: any) => {
if (valid) {
// 商品图片
const mainPicUrl = state.pictures.filter(item => item.main == true && item.url).map(item => item.url)
if (mainPicUrl && mainPicUrl.length > 0) {
props.modelValue.picUrl = mainPicUrl[0]
}
const subPicUrl = state.pictures.filter(item => item.main == false && item.url).map(item => item.url)
if (subPicUrl && subPicUrl.length > 0) {
props.modelValue.subPicUrls = subPicUrl
}
emit('next')
}
})
}
onMounted(() => {
loadData()
resetForm()
})
</script>
<style lang="scss" scoped>
.components-container {
&__main {
margin: 20px auto;
.button {
margin-left: 10px;
}
}
&__footer {
position: fixed;
bottom: 20px;
right: 20px;
}
}
</style>