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
c486dfd8
authored
Sep 03, 2024
by
卢越
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【功能优化】重构拼团装修(仍需优化)
parent
18880c71
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
366 additions
and
126 deletions
+366
-126
src/api/mall/promotion/combination/combinationActivity.ts
+35
-27
src/components/DiyEditor/components/ComponentContainer.vue
+1
-1
src/components/DiyEditor/components/mobile/PromotionCombination/config.ts
+84
-52
src/components/DiyEditor/components/mobile/PromotionCombination/index.vue
+0
-0
src/components/DiyEditor/components/mobile/PromotionCombination/property.vue
+99
-46
src/views/mall/promotion/combination/components/CombinationShowcase.vue
+147
-0
src/views/mall/promotion/combination/components/CombinationTableSelect.vue
+0
-0
No files found.
src/api/mall/promotion/combination/combinationActivity.ts
View file @
c486dfd8
import
request
from
'@/config/axios'
import
{
Sku
,
Spu
}
from
'@/api/mall/product/spu'
import
{
Sku
,
Spu
}
from
'@/api/mall/product/spu'
export
interface
CombinationActivityVO
{
id
?:
number
name
?:
string
spuId
?:
number
totalLimitCount
?:
number
singleLimitCount
?:
number
startTime
?:
Date
endTime
?:
Date
userSize
?:
number
totalCount
?:
number
successCount
?:
number
orderUserCount
?:
number
virtualGroup
?:
number
status
?:
number
limitDuration
?:
number
products
:
CombinationProductVO
[]
id
?:
number
name
?:
string
spuId
?:
number
totalLimitCount
?:
number
singleLimitCount
?:
number
startTime
?:
Date
endTime
?:
Date
userSize
?:
number
totalCount
?:
number
successCount
?:
number
orderUserCount
?:
number
virtualGroup
?:
number
status
?:
number
limitDuration
?:
number
products
:
CombinationProductVO
[]
spuName
?:
string
picUrl
?:
string
marketPrice
?:
number
}
// 拼团活动所需属性
export
interface
CombinationProductVO
{
spuId
:
number
skuId
:
number
combinationPrice
:
number
// 拼团价格
spuId
:
number
skuId
:
number
combinationPrice
:
number
// 拼团价格
}
// 扩展 Sku 配置
export
type
SkuExtension
=
Sku
&
{
productConfig
:
CombinationProductVO
productConfig
:
CombinationProductVO
}
export
interface
SpuExtension
extends
Spu
{
skus
:
SkuExtension
[]
// 重写类型
skus
:
SkuExtension
[]
// 重写类型
}
// 查询拼团活动列表
export
const
getCombinationActivityPage
=
async
(
params
)
=>
{
return
await
request
.
get
({
url
:
'/promotion/combination-activity/page'
,
params
})
return
await
request
.
get
({
url
:
'/promotion/combination-activity/page'
,
params
})
}
// 查询拼团活动详情
export
const
getCombinationActivity
=
async
(
id
:
number
)
=>
{
return
await
request
.
get
({
url
:
'/promotion/combination-activity/get?id='
+
id
})
return
await
request
.
get
({
url
:
'/promotion/combination-activity/get?id='
+
id
})
}
// 查询拼团活动详情列表
export
const
getCombinationActivityDetailList
=
(
ids
:
number
[])
=>
{
return
request
.
get
({
url
:
`/promotion/combination-activity/list?combinationActivityIds=
${
ids
}
`
})
}
// 新增拼团活动
export
const
createCombinationActivity
=
async
(
data
:
CombinationActivityVO
)
=>
{
return
await
request
.
post
({
url
:
'/promotion/combination-activity/create'
,
data
})
return
await
request
.
post
({
url
:
'/promotion/combination-activity/create'
,
data
})
}
// 修改拼团活动
export
const
updateCombinationActivity
=
async
(
data
:
CombinationActivityVO
)
=>
{
return
await
request
.
put
({
url
:
'/promotion/combination-activity/update'
,
data
})
return
await
request
.
put
({
url
:
'/promotion/combination-activity/update'
,
data
})
}
// 关闭拼团活动
export
const
closeCombinationActivity
=
async
(
id
:
number
)
=>
{
return
await
request
.
put
({
url
:
'/promotion/combination-activity/close?id='
+
id
})
return
await
request
.
put
({
url
:
'/promotion/combination-activity/close?id='
+
id
})
}
// 删除拼团活动
export
const
deleteCombinationActivity
=
async
(
id
:
number
)
=>
{
return
await
request
.
delete
({
url
:
'/promotion/combination-activity/delete?id='
+
id
})
return
await
request
.
delete
({
url
:
'/promotion/combination-activity/delete?id='
+
id
})
}
src/components/DiyEditor/components/ComponentContainer.vue
View file @
c486dfd8
...
...
@@ -5,7 +5,7 @@
...style
}"
>
<component
:is=
"component.id"
:property=
"component.property"
/>
<component
:is=
"component.id"
:property=
"component.property"
:component=
"component"
/>
</div>
<div
class=
"component-wrap"
>
<!-- 左侧:组件名(悬浮的小贴条) -->
...
...
src/components/DiyEditor/components/mobile/PromotionCombination/config.ts
View file @
c486dfd8
import
{
ComponentStyle
,
DiyComponent
}
from
'@/components/DiyEditor/util'
import
{
ComponentStyle
,
DiyComponent
}
from
'@/components/DiyEditor/util'
/** 拼团属性 */
export
interface
PromotionCombinationProperty
{
// 布局类型:单列 | 三列
layoutType
:
'oneCol'
|
'threeCol'
// 商品字段
fields
:
{
// 商品名称
name
:
PromotionCombinationFieldProperty
// 商品价格
price
:
PromotionCombinationFieldProperty
}
// 角标
badge
:
{
// 是否显示
show
:
boolean
// 角标图片
imgUrl
:
string
}
// 上圆角
borderRadiusTop
:
number
// 下圆角
borderRadiusBottom
:
number
// 间距
space
:
number
// 拼团活动编号
activityId
:
number
// 组件样式
style
:
ComponentStyle
// 布局类型:单列 | 三列
layoutType
:
'oneColBigImg'
|
'oneColSmallImg'
|
'twoCol'
;
// 商品字段
fields
:
{
// 商品名称
name
:
PromotionCombinationFieldProperty
// 商品简介
introduction
:
PromotionCombinationFieldProperty
// 商品价格
price
:
PromotionCombinationFieldProperty
// 市场价
marketPrice
:
PromotionCombinationFieldProperty
// 商品销量
salesCount
:
PromotionCombinationFieldProperty
// 商品库存
stock
:
PromotionCombinationFieldProperty
}
// 角标
badge
:
{
// 是否显示
show
:
boolean
// 角标图片
imgUrl
:
string
}
// 按钮
btnBuy
:
{
// 类型:文字 | 图片
type
:
'text'
|
'img'
// 文字
text
:
string
// 文字按钮:背景渐变起始颜色
bgBeginColor
:
string
// 文字按钮:背景渐变结束颜色
bgEndColor
:
string
// 图片按钮:图片地址
imgUrl
:
string
}
// 上圆角
borderRadiusTop
:
number
// 下圆角
borderRadiusBottom
:
number
// 间距
space
:
number
// 拼团活动编号
activityIds
:
number
[]
// 组件样式
style
:
ComponentStyle
}
// 商品字段
export
interface
PromotionCombinationFieldProperty
{
// 是否显示
show
:
boolean
// 颜色
color
:
string
// 是否显示
show
:
boolean
// 颜色
color
:
string
}
// 定义组件
export
const
component
=
{
id
:
'PromotionCombination'
,
name
:
'拼团'
,
icon
:
'mdi:account-group'
,
property
:
{
layoutType
:
'oneCol'
,
fields
:
{
name
:
{
show
:
true
,
color
:
'#000'
},
price
:
{
show
:
true
,
color
:
'#ff3000'
}
},
badge
:
{
show
:
false
,
imgUrl
:
''
},
borderRadiusTop
:
8
,
borderRadiusBottom
:
8
,
space
:
8
,
style
:
{
bgType
:
'color'
,
bgColor
:
''
,
marginLeft
:
8
,
marginRight
:
8
,
marginBottom
:
8
}
as
ComponentStyle
}
id
:
'PromotionCombination'
,
name
:
'拼团'
,
icon
:
'mdi:account-group'
,
property
:
{
layoutType
:
'oneColSmallImg'
,
fields
:
{
name
:
{
show
:
true
,
color
:
'#000'
},
introduction
:
{
show
:
true
,
color
:
'#999'
},
price
:
{
show
:
true
,
color
:
'#ff3000'
},
marketPrice
:
{
show
:
true
,
color
:
'#c4c4c4'
},
salesCount
:
{
show
:
true
,
color
:
'#c4c4c4'
},
stock
:
{
show
:
false
,
color
:
'#c4c4c4'
}
},
badge
:
{
show
:
false
,
imgUrl
:
''
},
btnBuy
:
{
type
:
'text'
,
text
:
'去拼团'
,
bgBeginColor
:
'#FF6000'
,
bgEndColor
:
'#FE832A'
,
imgUrl
:
''
},
borderRadiusTop
:
8
,
borderRadiusBottom
:
8
,
space
:
8
,
style
:
{
bgType
:
'color'
,
bgColor
:
''
,
marginLeft
:
8
,
marginRight
:
8
,
marginBottom
:
8
}
as
ComponentStyle
}
}
as
DiyComponent
<
PromotionCombinationProperty
>
src/components/DiyEditor/components/mobile/PromotionCombination/index.vue
View file @
c486dfd8
This diff is collapsed.
Click to expand it.
src/components/DiyEditor/components/mobile/PromotionCombination/property.vue
View file @
c486dfd8
...
...
@@ -2,84 +2,135 @@
<ComponentContainerProperty
v-model=
"formData.style"
>
<el-form
label-width=
"80px"
:model=
"formData"
>
<el-card
header=
"拼团活动"
class=
"property-group"
shadow=
"never"
>
<el-form-item
label=
"拼团活动"
prop=
"activityId"
>
<el-select
v-model=
"formData.activityId"
>
<el-option
v-for=
"activity in activityList"
:key=
"activity.id"
:label=
"activity.name"
:value=
"activity.id"
/>
</el-select>
</el-form-item>
<CombinationShowcase
v-model=
"formData.activityIds"
/>
</el-card>
<el-card
header=
"商品样式"
class=
"property-group"
shadow=
"never"
>
<el-form-item
label=
"布局"
prop=
"type"
>
<el-radio-group
v-model=
"formData.layoutType"
>
<el-tooltip
class=
"item"
content=
"单列"
placement=
"bottom"
>
<el-radio-button
value=
"oneCol"
>
<Icon
icon=
"fluent:text-column-one-24-filled"
/>
<el-tooltip
class=
"item"
content=
"单列大图"
placement=
"bottom"
>
<el-radio-button
value=
"oneColBigImg"
>
<Icon
icon=
"fluent:text-column-one-24-filled"
/>
</el-radio-button>
</el-tooltip>
<el-tooltip
class=
"item"
content=
"单列小图"
placement=
"bottom"
>
<el-radio-button
value=
"oneColSmallImg"
>
<Icon
icon=
"fluent:text-column-two-left-24-filled"
/>
</el-radio-button>
</el-tooltip>
<el-tooltip
class=
"item"
content=
"三列"
placement=
"bottom"
>
<el-tooltip
class=
"item"
content=
"双列"
placement=
"bottom"
>
<el-radio-button
value=
"twoCol"
>
<Icon
icon=
"fluent:text-column-two-24-filled"
/>
</el-radio-button>
</el-tooltip>
<!--
<el-tooltip
class=
"item"
content=
"三列"
placement=
"bottom"
>
<el-radio-button
value=
"threeCol"
>
<Icon
icon=
"fluent:text-column-three-24-filled"
/>
</el-radio-button>
</el-tooltip>
</el-tooltip>
-->
</el-radio-group>
</el-form-item>
<el-form-item
label=
"商品名称"
prop=
"fields.name.show"
>
<div
class=
"flex gap-8px"
>
<ColorInput
v-model=
"formData.fields.name.color"
/>
<el-checkbox
v-model=
"formData.fields.name.show"
/>
<ColorInput
v-model=
"formData.fields.name.color"
/>
<el-checkbox
v-model=
"formData.fields.name.show"
/>
</div>
</el-form-item>
<el-form-item
label=
"商品简介"
prop=
"fields.introduction.show"
>
<div
class=
"flex gap-8px"
>
<ColorInput
v-model=
"formData.fields.introduction.color"
/>
<el-checkbox
v-model=
"formData.fields.introduction.show"
/>
</div>
</el-form-item>
<el-form-item
label=
"商品价格"
prop=
"fields.price.show"
>
<div
class=
"flex gap-8px"
>
<ColorInput
v-model=
"formData.fields.price.color"
/>
<el-checkbox
v-model=
"formData.fields.price.show"
/>
<ColorInput
v-model=
"formData.fields.price.color"
/>
<el-checkbox
v-model=
"formData.fields.price.show"
/>
</div>
</el-form-item>
<el-form-item
label=
"市场价"
prop=
"fields.marketPrice.show"
>
<div
class=
"flex gap-8px"
>
<ColorInput
v-model=
"formData.fields.marketPrice.color"
/>
<el-checkbox
v-model=
"formData.fields.marketPrice.show"
/>
</div>
</el-form-item>
<el-form-item
label=
"商品销量"
prop=
"fields.salesCount.show"
>
<div
class=
"flex gap-8px"
>
<ColorInput
v-model=
"formData.fields.salesCount.color"
/>
<el-checkbox
v-model=
"formData.fields.salesCount.show"
/>
</div>
</el-form-item>
<el-form-item
label=
"商品库存"
prop=
"fields.stock.show"
>
<div
class=
"flex gap-8px"
>
<ColorInput
v-model=
"formData.fields.stock.color"
/>
<el-checkbox
v-model=
"formData.fields.stock.show"
/>
</div>
</el-form-item>
</el-card>
<el-card
header=
"角标"
class=
"property-group"
shadow=
"never"
>
<el-form-item
label=
"角标"
prop=
"badge.show"
>
<el-switch
v-model=
"formData.badge.show"
/>
<el-switch
v-model=
"formData.badge.show"
/>
</el-form-item>
<el-form-item
label=
"角标"
prop=
"badge.imgUrl"
v-if=
"formData.badge.show"
>
<UploadImg
v-model=
"formData.badge.imgUrl"
height=
"44px"
width=
"72px"
>
<template
#
tip
>
建议尺寸:36 * 22
</
template
>
<template
#
tip
>
建议尺寸:36 * 22
</
template
>
</UploadImg>
</el-form-item>
</el-card>
<el-card
header=
"按钮"
class=
"property-group"
shadow=
"never"
>
<el-form-item
label=
"按钮类型"
prop=
"btnBuy.type"
>
<el-radio-group
v-model=
"formData.btnBuy.type"
>
<el-radio-button
value=
"text"
>
文字
</el-radio-button>
<el-radio-button
value=
"img"
>
图片
</el-radio-button>
</el-radio-group>
</el-form-item>
<
template
v-if=
"formData.btnBuy.type === 'text'"
>
<el-form-item
label=
"按钮文字"
prop=
"btnBuy.text"
>
<el-input
v-model=
"formData.btnBuy.text"
/>
</el-form-item>
<el-form-item
label=
"左侧背景"
prop=
"btnBuy.bgBeginColor"
>
<ColorInput
v-model=
"formData.btnBuy.bgBeginColor"
/>
</el-form-item>
<el-form-item
label=
"右侧背景"
prop=
"btnBuy.bgEndColor"
>
<ColorInput
v-model=
"formData.btnBuy.bgEndColor"
/>
</el-form-item>
</
template
>
<
template
v-else
>
<el-form-item
label=
"图片"
prop=
"btnBuy.imgUrl"
>
<UploadImg
v-model=
"formData.btnBuy.imgUrl"
height=
"56px"
width=
"56px"
>
<template
#
tip
>
建议尺寸:56 * 56
</
template
>
</UploadImg>
</el-form-item>
</template>
</el-card>
<el-card
header=
"商品样式"
class=
"property-group"
shadow=
"never"
>
<el-form-item
label=
"上圆角"
prop=
"borderRadiusTop"
>
<el-slider
v-model=
"formData.borderRadiusTop"
:max=
"100"
:min=
"0"
show-input
input-size=
"small"
:show-input-controls=
"false"
v-model=
"formData.borderRadiusTop"
:max=
"100"
:min=
"0"
show-input
input-size=
"small"
:show-input-controls=
"false"
/>
</el-form-item>
<el-form-item
label=
"下圆角"
prop=
"borderRadiusBottom"
>
<el-slider
v-model=
"formData.borderRadiusBottom"
:max=
"100"
:min=
"0"
show-input
input-size=
"small"
:show-input-controls=
"false"
v-model=
"formData.borderRadiusBottom"
:max=
"100"
:min=
"0"
show-input
input-size=
"small"
:show-input-controls=
"false"
/>
</el-form-item>
<el-form-item
label=
"间隔"
prop=
"space"
>
<el-slider
v-model=
"formData.space"
:max=
"100"
:min=
"0"
show-input
input-size=
"small"
:show-input-controls=
"false"
v-model=
"formData.space"
:max=
"100"
:min=
"0"
show-input
input-size=
"small"
:show-input-controls=
"false"
/>
</el-form-item>
</el-card>
...
...
@@ -88,24 +139,26 @@
</template>
<
script
setup
lang=
"ts"
>
import
{
PromotionCombinationProperty
}
from
'./config'
import
{
usePropertyForm
}
from
'@/components/DiyEditor/util'
import
{
PromotionCombinationProperty
}
from
'./config'
import
{
usePropertyForm
}
from
'@/components/DiyEditor/util'
import
*
as
CombinationActivityApi
from
'@/api/mall/promotion/combination/combinationActivity'
import
{
CommonStatusEnum
}
from
'@/utils/constants'
import
{
CommonStatusEnum
}
from
'@/utils/constants'
import
CombinationShowcase
from
"@/views/mall/promotion/combination/components/CombinationShowcase.vue"
;
// 拼团属性面板
defineOptions
({
name
:
'PromotionCombinationProperty'
})
defineOptions
({
name
:
'PromotionCombinationProperty'
})
const
props
=
defineProps
<
{
modelValue
:
PromotionCombinationProperty
}
>
()
const
emit
=
defineEmits
([
'update:modelValue'
])
const
{
formData
}
=
usePropertyForm
(
props
.
modelValue
,
emit
)
const
{
formData
}
=
usePropertyForm
(
props
.
modelValue
,
emit
)
// 活动列表
const
activityList
=
ref
<
CombinationActivityApi
.
CombinationActivityVO
>
([])
const
activityList
=
ref
<
CombinationActivityApi
.
CombinationActivityVO
[]
>
([])
onMounted
(
async
()
=>
{
const
{
list
}
=
await
CombinationActivityApi
.
getCombinationActivityPage
({
const
{
list
}
=
await
CombinationActivityApi
.
getCombinationActivityPage
({
status
:
CommonStatusEnum
.
ENABLE
})
activityList
.
value
=
list
console
.
log
(
"formDa"
,
props
);
})
</
script
>
...
...
src/views/mall/promotion/combination/components/CombinationShowcase.vue
0 → 100644
View file @
c486dfd8
<
template
>
<div
class=
"flex flex-wrap items-center gap-8px"
>
<div
v-for=
"(combinationActivity, index) in Activitys"
:key=
"combinationActivity.id"
class=
"select-box spu-pic"
>
<el-tooltip
:content=
"combinationActivity.name"
>
<div
class=
"relative h-full w-full"
>
<el-image
:src=
"combinationActivity.picUrl"
class=
"h-full w-full"
/>
<Icon
v-show=
"!disabled"
class=
"del-icon"
icon=
"ep:circle-close-filled"
@
click=
"handleRemoveActivity(index)"
/>
</div>
</el-tooltip>
</div>
<el-tooltip
content=
"选择活动"
v-if=
"canAdd"
>
<div
class=
"select-box"
@
click=
"openCombinationActivityTableSelect"
>
<Icon
icon=
"ep:plus"
/>
</div>
</el-tooltip>
</div>
<!-- 拼团活动选择对话框(表格形式) -->
<CombinationTableSelect
ref=
"combinationActivityTableSelectRef"
:multiple=
"limit != 1"
@
change=
"handleActivitySelected"
/>
</
template
>
<
script
lang=
"ts"
setup
>
import
*
as
CombinationActivityApi
from
'@/api/mall/promotion/combination/combinationActivity'
import
{
propTypes
}
from
'@/utils/propTypes'
import
{
oneOfType
}
from
'vue-types'
import
{
isArray
}
from
'@/utils/is'
import
CombinationTableSelect
from
"@/views/mall/promotion/combination/components/CombinationTableSelect.vue"
;
// 活动橱窗,一般用于装修时使用
// 提供功能:展示活动列表、添加活动、删除活动
defineOptions
({
name
:
'CombinationShowcase'
})
const
props
=
defineProps
({
modelValue
:
oneOfType
<
number
|
Array
<
number
>>
([
Number
,
Array
]).
isRequired
,
// 限制数量:默认不限制
limit
:
propTypes
.
number
.
def
(
Number
.
MAX_VALUE
),
disabled
:
propTypes
.
bool
.
def
(
false
)
})
// 计算是否可以添加
const
canAdd
=
computed
(()
=>
{
// 情况一:禁用时不可以添加
if
(
props
.
disabled
)
return
false
// 情况二:未指定限制数量时,可以添加
if
(
!
props
.
limit
)
return
true
// 情况三:检查已添加数量是否小于限制数量
return
Activitys
.
value
.
length
<
props
.
limit
})
// 拼团活动列表
const
Activitys
=
ref
<
CombinationActivityApi
.
CombinationActivityVO
[]
>
([])
watch
(
()
=>
props
.
modelValue
,
async
()
=>
{
const
ids
=
isArray
(
props
.
modelValue
)
?
// 情况一:多选
props
.
modelValue
:
// 情况二:单选
props
.
modelValue
?
[
props
.
modelValue
]
:
[]
// 不需要返显
if
(
ids
.
length
===
0
)
{
Activitys
.
value
=
[]
return
}
// 只有活动发生变化之后,才会查询活动
if
(
Activitys
.
value
.
length
===
0
||
Activitys
.
value
.
some
((
combinationActivity
)
=>
!
ids
.
includes
(
combinationActivity
.
id
!
)))
{
Activitys
.
value
=
await
CombinationActivityApi
.
getCombinationActivityDetailList
(
ids
)
}
},
{
immediate
:
true
}
)
/** 活动表格选择对话框 */
const
combinationActivityTableSelectRef
=
ref
()
// 打开对话框
const
openCombinationActivityTableSelect
=
()
=>
{
combinationActivityTableSelectRef
.
value
.
open
(
Activitys
.
value
)
}
/**
* 选择活动后触发
* @param activityVOs 选中的活动列表
*/
const
handleActivitySelected
=
(
activityVOs
:
CombinationActivityApi
.
CombinationActivityVO
|
CombinationActivityApi
.
CombinationActivityVO
[])
=>
{
Activitys
.
value
=
isArray
(
activityVOs
)
?
activityVOs
:
[
activityVOs
]
emitActivityChange
()
}
/**
* 删除活动
* @param index 活动索引
*/
const
handleRemoveActivity
=
(
index
:
number
)
=>
{
Activitys
.
value
.
splice
(
index
,
1
)
emitActivityChange
()
}
const
emit
=
defineEmits
([
'update:modelValue'
,
'change'
])
const
emitActivityChange
=
()
=>
{
if
(
props
.
limit
===
1
)
{
const
combinationActivity
=
Activitys
.
value
.
length
>
0
?
Activitys
.
value
[
0
]
:
null
emit
(
'update:modelValue'
,
combinationActivity
?.
id
||
0
)
emit
(
'change'
,
combinationActivity
)
}
else
{
emit
(
'update:modelValue'
,
Activitys
.
value
.
map
((
combinationActivity
)
=>
combinationActivity
.
id
)
)
emit
(
'change'
,
Activitys
.
value
)
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.select-box
{
display
:
flex
;
width
:
60px
;
height
:
60px
;
border
:
1px
dashed
var
(
--el-border-color-darker
);
border-radius
:
8px
;
align-items
:
center
;
justify-content
:
center
;
cursor
:
pointer
;
}
.spu-pic
{
position
:
relative
;
}
.del-icon
{
position
:
absolute
;
top
:
-10px
;
right
:
-10px
;
z-index
:
1
;
width
:
20px
!important
;
height
:
20px
!important
;
}
</
style
>
src/views/mall/promotion/combination/components/CombinationTableSelect.vue
0 → 100644
View file @
c486dfd8
This diff is collapsed.
Click to expand it.
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