Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
marketing
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
marketing-web
marketing
Commits
f10cc142
Commit
f10cc142
authored
Jun 08, 2022
by
crushh
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature/游戏营销' into dev
parents
1647c4d1
c90d88d6
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
70 additions
and
33 deletions
+70
-33
mould_rule_page.png
src/assets/img/template1/mould_rule_page.png
+0
-0
form.js
src/views/ecm/form.js
+36
-7
form.vue
src/views/ecm/form.vue
+16
-8
base-config.vue
src/views/game/cmh/base-config.vue
+11
-8
form.vue
src/views/game/cmh/form.vue
+2
-2
info.vue
src/views/game/cmh/info.vue
+2
-3
prize-config.vue
src/views/game/cmh/prize-config.vue
+3
-5
No files found.
src/assets/img/template1/mould_rule_page.png
View replaced file @
1647c4d1
View file @
f10cc142
144 KB
|
W:
|
H:
146 KB
|
W:
|
H:
2-up
Swipe
Onion skin
src/views/ecm/form.js
View file @
f10cc142
...
...
@@ -88,7 +88,10 @@ export default {
storedLowest
:
0
,
storedMax
:
0
,
consum_type
:
1
,
gift_flag
:
0
gift_flag
:
0
,
consumer_store_type
:
0
,
store_filter_id
:
''
,
store_filter_id_new
:
''
},
template
:
{
headerColor
:
'#173177'
,
...
...
@@ -176,6 +179,7 @@ export default {
payment
:
false
},
storedChecked
:
false
,
storedShopChecked
:
false
,
discount_limit
:
{
type
:
1
,
count
:
undefined
,
flag
:
false
},
// 适用商品折扣
useStoredFlag
:
0
,
//显示储值触发和会员卡升级事件
analyseConfig
:
{
...
...
@@ -584,9 +588,17 @@ export default {
if
(
this
.
form
.
effectAction
===
'stored'
&&
result
.
effectTriggerJson
)
{
let
cost
=
JSON
.
parse
(
result
.
effectTriggerJson
)
||
{};
this
.
storedChecked
=
true
;
this
.
form
.
storedLowest
=
cost
.
lowest_cost
;
this
.
form
.
storedMax
=
cost
.
max_cost
;
this
.
storedChecked
=
cost
.
hasOwnProperty
(
'lowest_cost'
)
||
cost
.
hasOwnProperty
(
'max_cost'
);
if
(
this
.
storedChecked
)
{
this
.
form
.
storedLowest
=
cost
.
lowest_cost
;
this
.
form
.
storedMax
=
cost
.
max_cost
;
}
this
.
storedShopChecked
=
cost
.
hasOwnProperty
(
'consumer_store_type'
);
if
(
this
.
storedShopChecked
)
{
this
.
form
.
consumer_store_type
=
cost
.
consumer_store_type
;
cost
.
consumer_store_type
==
0
?
(
this
.
form
.
store_filter_id
=
cost
.
store_filter_id
)
:
(
this
.
form
.
store_filter_id_new
=
cost
.
store_filter_id
);
}
}
}
if
(
!
this
.
form
.
templateUseEnable
)
return
;
...
...
@@ -806,7 +818,7 @@ export default {
// 如果是消费触发
if
(
this
.
form
.
effectAction
===
'consume'
)
{
// 这里判断部分门店是否为空
if
(
this
.
consumeChecked
.
store
&&
this
.
consumeChecked
.
store
)
{
if
(
this
.
consumeChecked
.
store
)
{
let
data
=
this
.
form
.
consumerStoreType
===
1
?
await
this
.
$refs
.
newStoreCard
.
getList
()
:
await
this
.
$refs
.
storeCard
.
getRightList
();
if
(
!
data
.
length
)
{
this
.
$tips
({
type
:
'warning'
,
message
:
'门店不能为空'
});
...
...
@@ -870,6 +882,14 @@ export default {
this
.
$tips
({
type
:
'warning'
,
message
:
'储值金额区间值填写错误'
});
return
;
}
// 这里判断部分门店是否为空
if
(
this
.
storedShopChecked
)
{
let
data
=
this
.
form
.
consumer_store_type
===
1
?
await
this
.
$refs
.
newStoreCard2
.
getList
()
:
await
this
.
$refs
.
storeCard2
.
getRightList
();
if
(
!
data
.
length
)
{
this
.
$tips
({
type
:
'warning'
,
message
:
'门店不能为空'
});
return
;
}
}
}
// 会员卡升降级
// if (this.form.effectAction === 'degrade' || this.form.effectAction === 'upgrade') {
...
...
@@ -1005,8 +1025,17 @@ export default {
params
=
Object
.
assign
(
params
,
consumeObj
);
// 合并消费触发数据
}
if
(
this
.
form
.
effectAction
===
'stored'
&&
this
.
storedChecked
)
{
params
.
effectTriggerJson
=
JSON
.
stringify
({
lowest_cost
:
this
.
form
.
storedLowest
||
undefined
,
max_cost
:
this
.
form
.
storedMax
||
undefined
});
if
(
this
.
form
.
effectAction
===
'stored'
)
{
let
storedObj
=
{};
if
(
this
.
storedChecked
)
{
storedObj
.
lowest_cost
=
this
.
form
.
storedLowest
||
undefined
;
storedObj
.
max_cost
=
this
.
form
.
storedMax
||
undefined
;
}
if
(
this
.
storedShopChecked
)
{
storedObj
.
consumer_store_type
=
this
.
form
.
consumer_store_type
;
storedObj
.
store_filter_id
=
this
.
form
.
consumer_store_type
===
0
?
this
.
form
.
store_filter_id
:
this
.
form
.
store_filter_id_new
;
}
Object
.
keys
(
storedObj
).
length
?
(
params
.
effectTriggerJson
=
JSON
.
stringify
(
storedObj
))
:
''
;
}
}
params
.
marketingActivityId
=
this
.
form
.
marketingActivityId
||
''
;
// 否 String 营销场景
...
...
src/views/ecm/form.vue
View file @
f10cc142
...
...
@@ -297,6 +297,22 @@
</div>
</div>
</el-form-item>
<el-form-item>
<div
class=
"no_label_form_label"
>
<el-checkbox
class=
"el-form-item__label align-left"
:disabled=
"!isAdd"
v-model=
"storedShopChecked"
>
储值门店
</el-checkbox>
<div>
<span
class=
"fz14 gray"
v-show=
"!storedShopChecked"
>
所有储值门店
</span>
</div>
<div
v-show=
"storedShopChecked"
>
<el-radio-group
:disabled=
"!isAdd"
v-model=
"form.consumer_store_type"
>
<el-radio
:label=
"0"
>
固定门店
</el-radio>
<el-radio
:label=
"1"
>
按门店条件
</el-radio>
</el-radio-group>
<vue-gic-store-card
style=
"margin:20px 0 0 35px"
v-if=
"form.consumer_store_type === 0"
v-bind=
"storeParams"
:readonly=
"!isAdd"
ref=
"storeCard2"
:uuid
.
sync=
"form.store_filter_id"
></vue-gic-store-card>
<dm-store-selector
style=
"margin:20px 0 0 35px"
v-if=
"form.consumer_store_type === 1"
ref=
"newStoreCard2"
:readonly=
"!isAdd"
:uuid
.
sync=
"form.store_filter_id_new"
></dm-store-selector>
</div>
</div>
</el-form-item>
</section>
<!-- 营销次数配置 重复 -->
<section
class=
"dm-form__wrap"
v-if=
"form.effectType == 1"
>
...
...
@@ -325,14 +341,6 @@
<span
class=
"vertical-middle"
v-if=
"form.marketingTimesType !== -1"
><el-input-number
:disabled=
"!isAdd"
controls-position=
"right"
class=
"w150"
:min=
"1"
v-model=
"form.marketingTimes"
></el-input-number>
次
</span>
<span
class=
"pl20 fz13 gray"
>
* 该营销计划{{ marketingTimesTips }}
</span>
</el-form-item>
<!-- <div v-else>
<div class="ecm-title">消费触发配置</div>
<div class="ecm-content">
<el-radio :label="1">每天触发一次</el-radio>
<el-radio :label="-1">每天叠加触发</el-radio>
</div>
</div> -->
<el-form-item
label=
"营销次数配置"
prop=
"marketingTimesType"
v-else
>
<div
class=
"ecm-content"
style=
"margin:8px 0 0 0;"
>
<el-radio
:disabled=
"!isAdd"
:label=
"1"
v-model=
"form.marketingTimesType"
>
每天触发一次
<span
class=
"gray fz13 ml58"
>
客户当天累计消费金额满足所配置的消费金额就会触发,只触发一次
</span></el-radio>
...
...
src/views/game/cmh/base-config.vue
View file @
f10cc142
...
...
@@ -141,11 +141,11 @@ export default {
baseForm
:
{
gameName
:
''
,
gameTime
:
[],
gameRule
:
'1、幸运盲盒大抽奖,惊喜好礼抽不停。2、活动最终解释权归品牌方所有。'
,
gameRule
:
'1、幸运盲盒大抽奖,惊喜好礼抽不停。
\
n
2、活动最终解释权归品牌方所有。'
,
templateId
:
''
,
backMusicFlag
:
1
,
adsFlag
:
1
,
bulletFlag
:
1
,
backMusicFlag
:
0
,
adsFlag
:
0
,
bulletFlag
:
0
,
backMusicUrlObj
:
''
},
gameExt
:
{},
...
...
@@ -227,14 +227,18 @@ export default {
}
const
currentTemp
=
this
.
templateData
.
filter
(
item
=>
item
.
templateId
==
this
.
baseForm
.
templateId
)[
0
];
let
obj
=
{};
let
arr
=
[
'backMusicUrl'
];
// let arr = ['backMusicUrl'];
let
keys
=
Object
.
keys
(
gameExt
);
console
.
log
(
keys
);
currentTemp
.
gameTemplateMaterialList
.
forEach
(
item
=>
{
if
(
item
.
materialKey
==
'backMusicUrl'
)
{
this
.
backMusicOptions
.
push
(
item
);
}
if
(
!
arr
.
includes
(
item
.
materialKey
)
&&
item
.
materialValue
)
{
}
else
if
(
!
keys
.
includes
(
item
.
materialKey
))
{
obj
[
item
.
materialKey
]
=
item
;
}
// if (!arr.includes(item.materialKey) && !keys.includes(item.materialKey)) {
// obj[item.materialKey] = item;
// }
});
obj
=
Object
.
assign
(
obj
,
gameExt
);
// 详情的素材库与模板接口的默认有值的素材库取交集
this
.
handleTemplateArr
(
Object
.
values
(
obj
),
'echo'
);
...
...
@@ -300,7 +304,6 @@ export default {
return
true
;
},
handleTemplateArr
(
data
,
type
)
{
console
.
log
(
type
);
this
.
gameExt
=
data
;
const
materialKeys
=
[
'mpUrlView'
,
'adsLinkUrl'
,
'adsImageUrl'
];
// 模板切换时 保留广告位
data
.
forEach
(
item
=>
{
...
...
src/views/game/cmh/form.vue
View file @
f10cc142
...
...
@@ -43,7 +43,7 @@
</div>
<links
:show
.
sync=
"linkShow"
:obj=
"linksObj"
gameTypeName=
"幸运盲盒"
:isNew=
"true"
:showFooter=
"true"
:showClose=
"false"
>
<el-button
@
click=
"editRenew"
>
重新编辑
</el-button>
<el-button
type=
"primary"
@
click=
"$router.
push('/game/cmh'
)"
>
进入游戏列表
</el-button>
<el-button
type=
"primary"
@
click=
"$router.
go(-1
)"
>
进入游戏列表
</el-button>
</links>
</div>
</
template
>
...
...
@@ -235,7 +235,7 @@ export default {
type
:
'warning'
})
.
then
(()
=>
{
this
.
$router
.
push
(
'/game/cmh'
);
this
.
$router
.
go
(
-
1
);
})
.
catch
(()
=>
{});
},
...
...
src/views/game/cmh/info.vue
View file @
f10cc142
...
...
@@ -150,7 +150,7 @@
<
p
>
邀请机制
:
每成功邀请
{{
item
.
conditionJson
.
inviteNum
}}
人可获得
{{
item
.
conditionJson
.
value
}}
次游戏
<
/p
>
<
p
>
成功邀请条件
:{{
item
.
conditionJson
.
type
==
11
?
'注册新会员'
:
'首次关注服务号'
}}
<
/p
>
<
div
v
-
show
=
"item.conditionJson.type == 11"
class
=
"shareApp"
>
<
div
class
=
"shareApp"
>
<
div
class
=
"shareTitle"
>
邀请分享样式
<
/div
>
<
p
>
小程序卡片标题
:
{{
item
.
conditionJson
.
shareTitle
}}
<
/p
>
<
p
class
=
"flex"
>
小程序卡片图片
:
<
img
:
src
=
"item.conditionJson.shareCard"
alt
=
"游戏背景"
style
=
"width: 100px;height: 75px;margin-left: 10px;"
/><
/p
>
...
...
@@ -285,10 +285,9 @@ export default {
item
.
prizeRate
=
prizeRate
.
toFixed
(
2
);
}
}
);
const
rateTotal
=
this
.
form
.
gamePrizeList
.
map
(
item
=>
(
item
.
prizeType
!=
0
?
item
.
prizeRate
:
0
)).
reduce
((
pre
,
current
)
=>
Number
(
pre
)
+
Number
(
current
));
let
prizeArr
=
this
.
form
.
gamePrizeList
.
filter
(
item
=>
item
.
prizeType
==
0
);
prizeArr
.
forEach
(
item
=>
{
const
prizeRate
=
(
100
-
rateTotal
)
/
prizeArr
.
length
||
0
;
const
prizeRate
=
(
100
-
this
.
form
.
gameRuleInfo
.
winChance
)
/
prizeArr
.
length
||
0
;
item
.
prizeRate
=
prizeRate
.
toFixed
(
2
);
}
);
this
.
form
.
gamePrizeList
=
this
.
form
.
gamePrizeList
.
splice
(
0
);
...
...
src/views/game/cmh/prize-config.vue
View file @
f10cc142
...
...
@@ -2,7 +2,7 @@
<el-form
size=
"small"
class=
"tableForm"
:model=
"prizeForm"
:rules=
"rules"
ref=
"prizeForm"
label-width=
"80px"
>
<dm-sub-title
type=
"line"
class=
"mb20"
>
奖项配置
</dm-sub-title>
<el-form-item
label=
"总中奖率"
prop=
"winChance"
>
<el-input
class=
"w180"
v-model
.
number=
"prizeForm.winChance"
:disabled=
"isDisabled"
@
change=
"calculateRate"
>
<el-input
class=
"w180"
v-model
.
number=
"prizeForm.winChance"
@
change=
"calculateRate"
>
<template
slot=
"append"
>
%
</
template
>
</el-input>
</el-form-item>
...
...
@@ -52,7 +52,7 @@
<
template
slot-scope=
"{ row, $index }"
>
<div
v-if=
"row.prizeType == 1 || row.prizeType == 2"
>
<el-form-item
:prop=
"'gamePrizeList.' + $index + '.' + 'prizeName'"
:rules=
"rules.prizeName"
label-width=
"0"
>
<el-input
v-model=
"row.prizeName"
maxlength=
"10"
/>
<el-input
v-model=
"row.prizeName"
maxlength=
"10"
:disabled=
"isDisabled && row.isOld"
/>
</el-form-item>
</div>
<el-form-item
label-width=
"0"
v-else
>
...
...
@@ -72,7 +72,7 @@
<
template
slot-scope=
"{ row, $index }"
>
<div
v-if=
"row.prizeType == 1 || row.prizeType == 2"
style=
"width:60px;height:62px"
>
<el-form-item
:prop=
"'gamePrizeList.' + $index + '.' + 'prizeImageUrl'"
:rules=
"rules.prizeImageUrl"
label-width=
"0"
>
<dm-upload-avatar
class=
"upload-avatar"
width=
"60"
height=
"60"
:limit=
"
{ type: false, maxSize: 1 }" fileType="img" :model.sync="row.prizeImageUrl" tips="" :unused="
row.isInfo
">
</dm-upload-avatar>
<dm-upload-avatar
class=
"upload-avatar"
width=
"60"
height=
"60"
:limit=
"
{ type: false, maxSize: 1 }" fileType="img" :model.sync="row.prizeImageUrl" tips="" :unused="
isDisabled
&&
row.isOld ? true : false
">
</dm-upload-avatar>
</el-form-item>
</div>
<el-form-item
label-width=
"0"
v-else
>
...
...
@@ -401,10 +401,8 @@ export default {
item
.
prizeRate
=
prizeRate
.
toFixed
(
2
);
}
});
let
prizeArr
=
this
.
prizeForm
.
gamePrizeList
.
filter
(
item
=>
item
.
prizeType
==
0
);
prizeArr
.
forEach
(
item
=>
{
console
.
log
(
item
);
const
prizeRate
=
(
100
-
this
.
prizeForm
.
winChance
)
/
prizeArr
.
length
||
0
;
item
.
prizeRate
=
prizeRate
.
toFixed
(
2
);
});
...
...
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