Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
372e2215
authored
Aug 12, 2024
by
黄兆琦
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【功能优化】添加商品属性时允许选择已有的属性值
Fixes #47
parent
a7c37fa2
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
92 additions
and
10 deletions
+92
-10
src/views/mall/product/spu/components/SkuList.vue
+3
-3
src/views/mall/product/spu/components/index.ts
+1
-0
src/views/mall/product/spu/form/ProductAttributes.vue
+22
-3
src/views/mall/product/spu/form/ProductPropertyAddForm.vue
+40
-1
src/views/mall/product/spu/form/SkuForm.vue
+26
-3
No files found.
src/views/mall/product/spu/components/SkuList.vue
View file @
372e2215
...
...
@@ -24,7 +24,7 @@
>
<template
#
default=
"
{ row }">
<span
style=
"font-weight: bold; color: #40aaff"
>
{{
row
.
properties
[
index
]?.
valueName
}}
{{
row
.
properties
?.
[
index
]?.
valueName
}}
</span>
</
template
>
</el-table-column>
...
...
@@ -168,7 +168,7 @@
>
<template
#
default=
"
{ row }">
<span
style=
"font-weight: bold; color: #40aaff"
>
{{
row
.
properties
[
index
]?.
valueName
}}
{{
row
.
properties
?.
[
index
]?.
valueName
}}
</span>
</
template
>
</el-table-column>
...
...
@@ -248,7 +248,7 @@
>
<template
#
default=
"
{ row }">
<span
style=
"font-weight: bold; color: #40aaff"
>
{{
row
.
properties
[
index
]?.
valueName
}}
{{
row
.
properties
?.
[
index
]?.
valueName
}}
</span>
</
template
>
</el-table-column>
...
...
src/views/mall/product/spu/components/index.ts
View file @
372e2215
...
...
@@ -5,6 +5,7 @@ interface PropertyAndValues {
id
:
number
name
:
string
values
?:
PropertyAndValues
[]
propertyOpts
?:
PropertyAndValues
[]
}
interface
RuleConfig
{
...
...
src/views/mall/product/spu/form/ProductAttributes.vue
View file @
372e2215
...
...
@@ -18,16 +18,28 @@
>
{{
value
.
name
}}
</el-tag>
<el-input
v-show=
"inputVisible(index)"
<el-select
:id=
"`input$
{index}`"
:ref="setInputRef"
v-show="inputVisible(index)"
v-model="inputValue"
class="!w-20"
filterable
allow-create
default-first-option
:reserve-keyword="false"
size="small"
class="!w-30"
@blur="handleInputConfirm(index, item.id)"
@keyup.enter="handleInputConfirm(index, item.id)"
>
<el-option
v-for=
"item2 in item.propertyOpts"
:key=
"item2.id"
:label=
"item2.name"
:value=
"item2.name"
/>
</el-select>
<!--
<el-input
:id=
"`input$
{index}`" v-model="inputValue" class="!w-20" /> -->
<el-button
v-show=
"!inputVisible(index)"
class=
"button-new-tag ml-1"
...
...
@@ -109,6 +121,13 @@ const showInput = async (index) => {
const
emit
=
defineEmits
([
'success'
])
// 定义 success 事件,用于操作成功后的回调
const
handleInputConfirm
=
async
(
index
:
number
,
propertyId
:
number
)
=>
{
if
(
inputValue
.
value
)
{
// 重复添加校验
if
(
attributeList
.
value
[
index
].
values
.
find
((
item
)
=>
item
.
name
===
inputValue
.
value
))
{
message
.
warning
(
'已存在相同属性值,请重试'
)
attributeIndex
.
value
=
null
inputValue
.
value
=
''
return
}
// 保存属性值
try
{
const
id
=
await
PropertyApi
.
createPropertyValue
({
propertyId
,
name
:
inputValue
.
value
})
...
...
src/views/mall/product/spu/form/ProductPropertyAddForm.vue
View file @
372e2215
...
...
@@ -10,7 +10,22 @@
@
keydown
.
enter
.
prevent=
"submitForm"
>
<el-form-item
label=
"属性名称"
prop=
"name"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入名称"
/>
<el-select
v-model=
"formData.name"
filterable
allow-create
default-first-option
:reserve-keyword=
"false"
placeholder=
"请选择属性名称"
style=
"width: 240px"
>
<el-option
v-for=
"item in attrOption"
:key=
"item.id"
:label=
"item.name"
:value=
"item.name"
/>
</el-select>
</el-form-item>
</el-form>
<template
#
footer
>
...
...
@@ -24,6 +39,7 @@ import * as PropertyApi from '@/api/mall/product/property'
defineOptions
({
name
:
'ProductPropertyForm'
})
const
emit
=
defineEmits
([
'success'
])
// 定义 success 事件,用于操作成功后的回调
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
...
...
@@ -37,6 +53,7 @@ const formRules = reactive({
})
const
formRef
=
ref
()
// 表单 Ref
const
attributeList
=
ref
([])
// 商品属性列表
const
attrOption
=
ref
([])
// 属性名称下拉框
const
props
=
defineProps
({
propertyList
:
{
type
:
Array
,
...
...
@@ -59,6 +76,7 @@ watch(
/** 打开弹窗 */
const
open
=
async
()
=>
{
dialogVisible
.
value
=
true
getAttrOption
()
resetForm
()
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
...
...
@@ -80,6 +98,16 @@ const submitForm = async () => {
...
formData
.
value
,
values
:
[]
})
// 判断最终提交的属性名称是否是选择的 自己手动输入的属性名称不执行emit
attrOption
.
value
.
forEach
((
item
)
=>
{
if
(
item
.
name
===
formData
.
value
.
name
)
{
emit
(
'success'
,
propertyId
,
item
.
id
)
message
.
success
(
t
(
'common.createSuccess'
))
dialogVisible
.
value
=
false
// 中断循环
throw
new
Error
()
}
})
message
.
success
(
t
(
'common.createSuccess'
))
dialogVisible
.
value
=
false
}
finally
{
...
...
@@ -94,4 +122,15 @@ const resetForm = () => {
}
formRef
.
value
?.
resetFields
()
}
/** 获取商品属性下拉选项 */
const
getAttrOption
=
async
()
=>
{
formLoading
.
value
=
true
try
{
const
data
=
await
PropertyApi
.
getPropertyPage
({
pageNo
:
1
,
pageSize
:
100
})
attrOption
.
value
=
data
.
list
}
finally
{
formLoading
.
value
=
false
}
}
</
script
>
src/views/mall/product/spu/form/SkuForm.vue
View file @
372e2215
<!-- 商品发布 - 库存价格 -->
<
template
>
<el-form
ref=
"formRef"
:disabled=
"isDetail"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
>
<el-form
ref=
"formRef"
:disabled=
"isDetail"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
v-loading=
"formLoading"
>
<el-form-item
label=
"分销类型"
props=
"subCommissionType"
>
<el-radio-group
v-model=
"formData.subCommissionType"
...
...
@@ -51,9 +58,14 @@
</el-form>
<!-- 商品属性添加 Form 表单 -->
<ProductPropertyAddForm
ref=
"attributesAddFormRef"
:propertyList=
"propertyList"
/>
<ProductPropertyAddForm
ref=
"attributesAddFormRef"
:propertyList=
"propertyList"
@
success=
"getPropertyValueList"
/>
</template>
<
script
lang=
"ts"
setup
>
import
*
as
PropertyApi
from
'@/api/mall/product/property'
import
{
PropType
}
from
'vue'
import
{
copyValueToTarget
}
from
'@/utils'
import
{
propTypes
}
from
'@/utils/propTypes'
...
...
@@ -94,7 +106,7 @@ const ruleConfig: RuleConfig[] = [
]
const
message
=
useMessage
()
// 消息弹窗
const
formLoading
=
ref
(
false
)
const
props
=
defineProps
({
propFormData
:
{
type
:
Object
as
PropType
<
Spu
>
,
...
...
@@ -184,4 +196,15 @@ const onChangeSpec = () => {
const
generateSkus
=
(
propertyList
:
any
[])
=>
{
skuListRef
.
value
.
generateTableData
(
propertyList
)
}
/* 获取属性值列表 */
const
getPropertyValueList
=
async
(
id
,
propertyId
)
=>
{
formLoading
.
value
=
true
try
{
const
data
=
await
PropertyApi
.
getPropertyValuePage
({
pageNo
:
1
,
pageSize
:
100
,
propertyId
})
propertyList
.
value
.
find
((
item
)
=>
item
.
id
===
id
).
propertyOpts
=
data
.
list
}
finally
{
formLoading
.
value
=
false
}
}
</
script
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment