Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
H
haoban-3
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
office
haoban-3
Commits
74f36a89
Commit
74f36a89
authored
Jul 17, 2022
by
crushh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update: 链接
parent
df4c1fea
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
723 additions
and
153 deletions
+723
-153
actCode.js
src/api/actCode.js
+9
-0
api.js
src/api/api.js
+0
-2
timeFormat.js
src/common/js/timeFormat.js
+14
-15
util.js
src/common/js/util.js
+68
-51
selectShop.vue
src/components/common/selectShop.vue
+62
-6
attractFlowLinkRouter.js
src/router/actCodeManageRouter/attractFlowLinkRouter.js
+1
-1
validate.js
src/utils/validate.js
+28
-12
salutatorySet.vue
src/views/enterprise/salutatorySet.vue
+1
-1
detail.vue
...views/salesleads/actCodeManage/attractFlowLink/detail.vue
+275
-53
index.vue
src/views/salesleads/actCodeManage/attractFlowLink/index.vue
+2
-1
info.vue
src/views/salesleads/actCodeManage/attractFlowLink/info.vue
+239
-0
detail.vue
...eads/actCodeManage/attractFlowLink/landingPage/detail.vue
+10
-6
list.vue
...sleads/actCodeManage/attractFlowLink/landingPage/list.vue
+1
-1
actCodeDetail.vue
...s/salesleads/actCodeManage/staffActCode/actCodeDetail.vue
+1
-1
actCodeDetailInfo.vue
src/views/salesleads/components/actCodeDetailInfo.vue
+9
-3
public.css
static/css/public.css
+3
-0
No files found.
src/api/actCode.js
View file @
74f36a89
...
...
@@ -41,3 +41,12 @@ export const detailClerkList = params => postJsonRequest('/haoban-manage3-web/hm
//【欢迎语】-- 特殊欢迎语关联详情列表
export
const
welcomeRelationList
=
params
=>
getRequest
(
'/haoban-manage3-web/welcome/relation/list'
,
params
);
// 【活码链接】-- 新增
export
const
linkAdd
=
params
=>
postJsonRequest
(
'/haoban-manage3-web/hm/link/add'
,
params
);
// 【活码链接】-- 编辑
export
const
linkUpdate
=
params
=>
postJsonRequest
(
'/haoban-manage3-web/hm/link/update'
,
params
);
// 【活码链接】-- 详情
export
const
linkDetail
=
params
=>
postJsonRequest
(
'/haoban-manage3-web/hm/link/detail'
,
params
);
src/api/api.js
View file @
74f36a89
...
...
@@ -64,8 +64,6 @@ Vue.axios.interceptors.request.use(
let
haobanSign
=
sessionStorage
.
getItem
(
'userInfoBrandId'
);
haobanSign
?
(
config
.
headers
.
enterpriseId
=
haobanSign
)
:
''
;
}
console
.
log
(
config
);
return
config
;
},
err
=>
{
...
...
src/common/js/timeFormat.js
View file @
74f36a89
...
...
@@ -14,25 +14,24 @@
export
default
{
/*
* var storeBusinessTime="10:00-22:00" to
*/
* var storeBusinessTime="10:00-22:00" to
*/
timeToDate
:
function
(
val
)
{
var
date
=
new
Date
()
var
date
=
new
Date
()
;
var
y
=
date
.
getFullYear
();
var
m
=
date
.
getMonth
()
+
1
;
var
m
=
date
.
getMonth
()
+
1
;
var
day
=
date
.
getDate
();
var
d
=
[],
newArr
=
[];
var
d
=
[],
newArr
=
[];
var
dArr
=
val
.
split
(
'-'
);
dArr
.
forEach
(
function
(
ele
,
index
)
{
newArr
.
push
(
ele
.
split
(
':'
))
})
d
=
[
new
Date
(
y
,
m
,
day
,
newArr
[
0
][
0
],
newArr
[
0
][
1
]),
new
Date
(
y
,
m
,
day
,
newArr
[
1
][
0
],
newArr
[
1
][
1
])]
dArr
.
forEach
(
function
(
ele
,
index
)
{
newArr
.
push
(
ele
.
split
(
':'
))
;
})
;
d
=
[
new
Date
(
y
,
m
,
day
,
newArr
[
0
][
0
],
newArr
[
0
][
1
]),
new
Date
(
y
,
m
,
day
,
newArr
[
1
][
0
],
newArr
[
1
][
1
])];
return
d
;
},
dateToTime
(
val
)
{
// console.log(val)
// (0-9)年月数字的显示
...
...
@@ -40,9 +39,9 @@ export default {
return
num
>
9
?
''
+
num
:
'0'
+
num
;
}
var
t
;
var
t1
=
formatDig
(
new
Date
(
val
[
0
]).
getHours
())
+
':'
+
formatDig
(
new
Date
(
val
[
0
]).
getMinutes
())
var
t2
=
formatDig
(
new
Date
(
val
[
1
]).
getHours
())
+
':'
+
formatDig
(
new
Date
(
val
[
1
]).
getMinutes
())
t
=
t1
+
'-'
+
t2
var
t1
=
formatDig
(
new
Date
(
val
[
0
]).
getHours
())
+
':'
+
formatDig
(
new
Date
(
val
[
0
]).
getMinutes
());
var
t2
=
formatDig
(
new
Date
(
val
[
1
]).
getHours
())
+
':'
+
formatDig
(
new
Date
(
val
[
1
]).
getMinutes
());
t
=
t1
+
'-'
+
t2
;
return
t
;
}
}
}
;
src/common/js/util.js
View file @
74f36a89
var
SIGN_REGEXP
=
/
([
yMdhsm
])(\1
*
)
/g
;
var
DEFAULT_PATTERN
=
'yyyy-MM-dd'
;
function
padding
(
s
,
len
)
{
var
len
=
len
-
(
s
+
''
).
length
;
for
(
var
i
=
0
;
i
<
len
;
i
++
)
{
s
=
'0'
+
s
;
}
return
s
;
};
var
len
=
len
-
(
s
+
''
).
length
;
for
(
var
i
=
0
;
i
<
len
;
i
++
)
{
s
=
'0'
+
s
;
}
return
s
;
}
export
default
{
getQueryStringByName
:
function
(
name
)
{
var
reg
=
new
RegExp
(
"(^|&)"
+
name
+
"=([^&]*)(&|$)"
,
"i"
);
var
r
=
window
.
location
.
search
.
substr
(
1
).
match
(
reg
);
var
context
=
""
;
if
(
r
!=
null
)
context
=
r
[
2
];
reg
=
null
;
r
=
null
;
return
context
==
null
||
context
==
""
||
context
==
"undefined"
?
""
:
context
;
getQueryStringByName
:
function
(
name
)
{
var
reg
=
new
RegExp
(
'(^|&)'
+
name
+
'=([^&]*)(&|$)'
,
'i'
);
var
r
=
window
.
location
.
search
.
substr
(
1
).
match
(
reg
);
var
context
=
''
;
if
(
r
!=
null
)
context
=
r
[
2
];
reg
=
null
;
r
=
null
;
return
context
==
null
||
context
==
''
||
context
==
'undefined'
?
''
:
context
;
},
formatDate
:
{
format
:
function
(
date
,
pattern
)
{
pattern
=
pattern
||
DEFAULT_PATTERN
;
return
pattern
.
replace
(
SIGN_REGEXP
,
function
(
$0
)
{
switch
(
$0
.
charAt
(
0
))
{
case
'y'
:
return
padding
(
date
.
getFullYear
(),
$0
.
length
);
case
'M'
:
return
padding
(
date
.
getMonth
()
+
1
,
$0
.
length
);
case
'd'
:
return
padding
(
date
.
getDate
(),
$0
.
length
);
case
'w'
:
return
date
.
getDay
()
+
1
;
case
'h'
:
return
padding
(
date
.
getHours
(),
$0
.
length
);
case
'm'
:
return
padding
(
date
.
getMinutes
(),
$0
.
length
);
case
's'
:
return
padding
(
date
.
getSeconds
(),
$0
.
length
);
}
});
},
formatDate
:
{
format
:
function
(
date
,
pattern
)
{
pattern
=
pattern
||
DEFAULT_PATTERN
;
return
pattern
.
replace
(
SIGN_REGEXP
,
function
(
$0
)
{
switch
(
$0
.
charAt
(
0
))
{
case
'y'
:
return
padding
(
date
.
getFullYear
(),
$0
.
length
);
case
'M'
:
return
padding
(
date
.
getMonth
()
+
1
,
$0
.
length
);
case
'd'
:
return
padding
(
date
.
getDate
(),
$0
.
length
);
case
'w'
:
return
date
.
getDay
()
+
1
;
case
'h'
:
return
padding
(
date
.
getHours
(),
$0
.
length
);
case
'm'
:
return
padding
(
date
.
getMinutes
(),
$0
.
length
);
case
's'
:
return
padding
(
date
.
getSeconds
(),
$0
.
length
);
}
});
},
parse
:
function
(
dateString
,
pattern
)
{
var
matchs1
=
pattern
.
match
(
SIGN_REGEXP
);
var
matchs2
=
dateString
.
match
(
/
(\d)
+/g
);
if
(
matchs1
.
length
==
matchs2
.
length
)
{
var
_date
=
new
Date
(
1970
,
0
,
1
);
for
(
var
i
=
0
;
i
<
matchs1
.
length
;
i
++
)
{
var
_int
=
parseInt
(
matchs2
[
i
]);
var
sign
=
matchs1
[
i
];
switch
(
sign
.
charAt
(
0
))
{
case
'y'
:
_date
.
setFullYear
(
_int
);
break
;
case
'M'
:
_date
.
setMonth
(
_int
-
1
);
break
;
case
'd'
:
_date
.
setDate
(
_int
);
break
;
case
'h'
:
_date
.
setHours
(
_int
);
break
;
case
'm'
:
_date
.
setMinutes
(
_int
);
break
;
case
's'
:
_date
.
setSeconds
(
_int
);
break
;
}
}
return
_date
;
}
return
null
;
parse
:
function
(
dateString
,
pattern
)
{
var
matchs1
=
pattern
.
match
(
SIGN_REGEXP
);
var
matchs2
=
dateString
.
match
(
/
(\d)
+/g
);
if
(
matchs1
.
length
==
matchs2
.
length
)
{
var
_date
=
new
Date
(
1970
,
0
,
1
);
for
(
var
i
=
0
;
i
<
matchs1
.
length
;
i
++
)
{
var
_int
=
parseInt
(
matchs2
[
i
]);
var
sign
=
matchs1
[
i
];
switch
(
sign
.
charAt
(
0
))
{
case
'y'
:
_date
.
setFullYear
(
_int
);
break
;
case
'M'
:
_date
.
setMonth
(
_int
-
1
);
break
;
case
'd'
:
_date
.
setDate
(
_int
);
break
;
case
'h'
:
_date
.
setHours
(
_int
);
break
;
case
'm'
:
_date
.
setMinutes
(
_int
);
break
;
case
's'
:
_date
.
setSeconds
(
_int
);
break
;
}
}
return
_date
;
}
return
null
;
}
}
};
src/components/common/selectShop.vue
View file @
74f36a89
<
template
>
<el-popover
placement=
"bottom"
style=
"min-width: 357px"
v-model=
"departmentVisible"
>
<dm-simple-transfer
v-model=
"checked"
:
data=
"data"
:item-size=
"56"
:titles=
"['选择门店', '已选门店']"
filterable
filter-placeholder=
"请输入门店名称/cod
e"
>
<dm-simple-transfer
v-model=
"checked"
:
props=
"props"
:data=
"data"
:item-size=
"56"
:titles=
"['选择门店', '已选门店']"
filterable
filter-placeholder=
"请输入门店名称/code"
@
change=
"chang
e"
>
<div
slot-scope=
"
{ option }">
<p>
{{
option
.
label
}}
</p>
<p
style=
"font-size: 12px;line-height: 18px"
>
{{
option
.
key
}}
</p>
<p
style=
"font-size: 12px;line-height: 18px"
>
{{
option
.
code
}}
</p>
</div>
</dm-simple-transfer>
<div
class=
"flex-column item-cell-select inline-block "
slot=
"reference"
>
<el-input></el-input>
<div
class=
"show-select-num cursor-pointer w-250"
slot=
"reference"
>
已经选择
{{
checked
.
length
}}
家门店
<span
class=
"el-input__suffix"
><span
class=
"el-input__suffix-inner"
><i
:class=
"['el-select__caret el-input__icon el-icon-arrow-up', departmentVisible ? 'is-reverse' : '']"
></i></span
></span>
</div>
</el-popover>
</
template
>
<
script
>
import
{
getRequest
}
from
'@/api/api'
;
export
default
{
data
()
{
return
{
departmentVisible
:
false
,
checked
:
[],
data
:
[]
data
:
[],
props
:
{
key
:
'storeId'
,
label
:
'storeName'
},
form
:
{
storeSearchParams
:
''
,
pageSize
:
20
,
pageNum
:
1
}
};
},
mounted
()
{
this
.
getList
();
},
methods
:
{
getList
()
{
getRequest
(
'/haoban-manage3-web/hm/store-list'
,
{}).
then
(
res
=>
{
console
.
log
(
res
);
const
{
result
}
=
res
.
data
;
this
.
data
=
result
||
[];
});
},
change
(
val
)
{
this
.
$emit
(
'change'
,
val
);
}
}
};
</
script
>
<
style
></
style
>
<
style
lang=
"scss"
scoped
>
.show-select-num
{
position
:
relative
;
display
:
inline-block
;
font-size
:
inherit
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
10px
;
-webkit-appearance
:
none
;
background-color
:
#fff
;
background-image
:
none
;
border-radius
:
4px
;
border
:
1px
solid
#dcdfe6
;
-webkit-box-sizing
:
border-box
;
box-sizing
:
border-box
;
color
:
#606266
;
.el-select__caret
{
color
:
#c0c4cc
;
font-size
:
14px
;
transition
:
transform
0.3s
;
transform
:
rotate
(
180deg
);
cursor
:
pointer
;
&.is-reverse
{
transform
:
rotate
(
0deg
);
}
}
}
</
style
>
src/router/actCodeManageRouter/attractFlowLinkRouter.js
View file @
74f36a89
...
...
@@ -28,7 +28,7 @@ const attractFlowLinkRouter = [
meta
:
{
type
:
'info'
},
component
:
_import
(
'salesleads/actCodeManage/attractFlowLink'
,
'
detail
'
)
component
:
_import
(
'salesleads/actCodeManage/attractFlowLink'
,
'
info
'
)
},
{
path
:
'/ladingPageList'
,
...
...
src/utils/validate.js
View file @
74f36a89
...
...
@@ -3,32 +3,32 @@
*/
export
function
isvalidUsername
(
str
)
{
const
valid_map
=
[
'admin'
,
'editor'
]
return
valid_map
.
indexOf
(
str
.
trim
())
>=
0
const
valid_map
=
[
'admin'
,
'editor'
]
;
return
valid_map
.
indexOf
(
str
.
trim
())
>=
0
;
}
/* 合法uri*/
export
function
validateURL
(
textval
)
{
const
urlregex
=
/^
(
https
?
|ftp
)
:
\/\/([
a-zA-Z0-9.-
]
+
(
:
[
a-zA-Z0-9.&%$-
]
+
)
*@
)
*
((
25
[
0-5
]
|2
[
0-4
][
0-9
]
|1
[
0-9
]{2}
|
[
1-9
][
0-9
]?)(\.(
25
[
0-5
]
|2
[
0-4
][
0-9
]
|1
[
0-9
]{2}
|
[
1-9
]?[
0-9
])){3}
|
([
a-zA-Z0-9-
]
+
\.)
*
[
a-zA-Z0-9-
]
+
\.(
com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|
[
a-zA-Z
]{2}))(
:
[
0-9
]
+
)
*
(\/(
$|
[
a-zA-Z0-9.,?'
\\
+&%$#=~_-
]
+
))
*$/
return
urlregex
.
test
(
textval
)
const
urlregex
=
/^
(
https
?
|ftp
)
:
\/\/([
a-zA-Z0-9.-
]
+
(
:
[
a-zA-Z0-9.&%$-
]
+
)
*@
)
*
((
25
[
0-5
]
|2
[
0-4
][
0-9
]
|1
[
0-9
]{2}
|
[
1-9
][
0-9
]?)(\.(
25
[
0-5
]
|2
[
0-4
][
0-9
]
|1
[
0-9
]{2}
|
[
1-9
]?[
0-9
])){3}
|
([
a-zA-Z0-9-
]
+
\.)
*
[
a-zA-Z0-9-
]
+
\.(
com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|
[
a-zA-Z
]{2}))(
:
[
0-9
]
+
)
*
(\/(
$|
[
a-zA-Z0-9.,?'
\\
+&%$#=~_-
]
+
))
*$/
;
return
urlregex
.
test
(
textval
)
;
}
/* 小写字母*/
export
function
validateLowerCase
(
str
)
{
const
reg
=
/^
[
a-z
]
+$/
return
reg
.
test
(
str
)
const
reg
=
/^
[
a-z
]
+$/
;
return
reg
.
test
(
str
)
;
}
/* 大写字母*/
export
function
validateUpperCase
(
str
)
{
const
reg
=
/^
[
A-Z
]
+$/
return
reg
.
test
(
str
)
const
reg
=
/^
[
A-Z
]
+$/
;
return
reg
.
test
(
str
)
;
}
/* 大小写字母*/
export
function
validateAlphabets
(
str
)
{
const
reg
=
/^
[
A-Za-z
]
+$/
return
reg
.
test
(
str
)
const
reg
=
/^
[
A-Za-z
]
+$/
;
return
reg
.
test
(
str
)
;
}
/**
...
...
@@ -37,7 +37,23 @@ export function validateAlphabets(str) {
* @returns {boolean}
*/
export
function
validateEmail
(
email
)
{
const
re
=
/^
(([^
<>()
\[\]\\
.,;:
\s
@"
]
+
(\.[^
<>()
\[\]\\
.,;:
\s
@"
]
+
)
*
)
|
(
".+"
))
@
((\[[
0-9
]{1,3}\.[
0-9
]{1,3}\.[
0-9
]{1,3}\.[
0-9
]{1,3}\])
|
(([
a-zA-Z
\-
0-9
]
+
\.)
+
[
a-zA-Z
]{2,}))
$/
return
re
.
test
(
email
)
const
re
=
/^
(([^
<>()
\[\]\\
.,;:
\s
@"
]
+
(\.[^
<>()
\[\]\\
.,;:
\s
@"
]
+
)
*
)
|
(
".+"
))
@
((\[[
0-9
]{1,3}\.[
0-9
]{1,3}\.[
0-9
]{1,3}\.[
0-9
]{1,3}\])
|
(([
a-zA-Z
\-
0-9
]
+
\.)
+
[
a-zA-Z
]{2,}))
$/
;
return
re
.
test
(
email
)
;
}
/** 表单校验滚动到第一个错误项
* @param {Object} that vue实例
* this.scrollToError(this);
*/
export
const
scrollToError
=
that
=>
{
that
.
$nextTick
(
_
=>
{
const
isError
=
document
.
getElementsByClassName
(
'is-error'
);
isError
[
0
].
scrollIntoView
({
// 滚动到指定节点
// 值有start,center,end,nearest,当前显示在视图区域中间
block
:
'center'
,
// 值有auto、instant,smooth,缓动动画(当前是慢速的)
behavior
:
'smooth'
});
});
};
src/views/enterprise/salutatorySet.vue
View file @
74f36a89
...
...
@@ -2,7 +2,7 @@
<div
class=
"daily-set-wrap"
>
<div
class=
"daily-set-content border-box"
>
<div
class=
"salutatory-set-wrap m-t-20"
>
<el-form
label-width=
"117px"
ref=
"form"
:model=
"form"
:rules=
"rules"
refs=
"form"
class=
"form"
>
<el-form
label-width=
"117px"
ref=
"form"
:model=
"form"
:rules=
"rules"
class=
"form"
>
<el-form-item
label=
"欢迎语标题"
prop=
"title"
>
<el-input
show-word-limit
placeholder=
"请输入欢迎语标题"
type=
"text"
v-model=
"form.title"
maxlength=
"20"
class=
"w-384"
></el-input>
</el-form-item>
...
...
src/views/salesleads/actCodeManage/attractFlowLink/detail.vue
View file @
74f36a89
<
template
>
<div
class=
"p-20"
>
<el-form
label-width=
"100px"
size=
"small
"
>
<el-form
label-width=
"100px"
:model=
"form"
size=
"small"
:rules=
"rules"
ref=
"form
"
>
<dm-sub-title
type=
"line"
>
基础信息
</dm-sub-title>
<div
class=
"section"
>
<el-form-item
label=
"链接类型"
required
>
...
...
@@ -11,15 +11,16 @@
<p
class=
"tips"
v-if=
"form.linkType == 1"
>
仅用于在GIC系统中创建“短信模板”时直接添加引用,便于系统根据会员手机号为该引流链接带上特定会员参数,常用于通过短信的方式来促进存量会员的私域转化。
</p>
<p
class=
"tips"
v-else
>
可复制此引流链接或下载链接二维码,通过不同营销活动、渠道等引导客户添加导购企微号,转化成私域流量。
</p>
</el-form-item>
<el-form-item
label=
"链接名称"
required
>
<el-form-item
label=
"链接名称"
required
prop=
"name"
>
<el-input
placeholder=
"请输入链接名称"
class=
"w-340"
:maxlength=
"30"
show-word-limit
v-model=
"form.name"
></el-input>
</el-form-item>
<el-form-item
label=
"链接描述"
>
<el-form-item
label=
"链接描述"
prop=
"remark"
>
<el-input
placeholder=
"请输入链接描述"
type=
"textarea"
class=
"w-340"
:maxlength=
"100"
:autosize=
"
{ minRow: 3, maxRow: 5 }" show-word-limit v-model="form.remark">
</el-input>
</el-form-item>
<el-form-item
label=
"链接标签"
required
>
<el-button
plain
@
click=
"tagsDialogVisible = true"
><i
class=
"iconfont-components3 icon-cp-PlusOutlined addPic"
></i>
添加标签
</el-button>
<dm-memberTag-group
:visiable
.
sync=
"tagsDialogVisible"
projectName=
"haobao-3"
></dm-memberTag-group>
<el-form-item
label=
"链接标签"
required
prop=
"memberLabelId"
>
<el-button
plain
v-if=
"!form.memberLabelName"
@
click=
"tagsDialogVisible = true"
><i
class=
"iconfont-components3 icon-cp-PlusOutlined addPic"
></i>
添加标签
</el-button>
<el-tag
v-else
closable
@
close=
"handleTagCloseTag"
>
{{
form
.
memberLabelName
}}
</el-tag>
<!--
<dm-memberTag-group
:visiable
.
sync=
"tagsDialogVisible"
projectName=
"haobao-3"
@
save=
"saveTagPop"
></dm-memberTag-group>
-->
</el-form-item>
</div>
<dm-sub-title
type=
"line"
>
分配规则
</dm-sub-title>
...
...
@@ -33,32 +34,32 @@
<div
class=
"level"
>
<div
class=
"title m-b-20"
>
<span>
层级一:服务门店
</span>
<el-switch
v-model=
"form.
fw_store.open
"
:disabled=
"true"
></el-switch>
<el-switch
v-model=
"form.
customRuleJson.fw_store.open"
:active-value=
"1"
:inactive-value=
"0
"
:disabled=
"true"
></el-switch>
</div>
<div
class=
"content"
>
<el-checkbox
v-model=
"form.
fw_store.zs"
:true-label=
"1"
:false-label=
"0
"
>
专属导购
</el-checkbox>
<el-checkbox
v-model=
"form.
fw_store.dz"
:true-label=
"1"
:false-label=
"0
"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.
fw_store.dy"
:true-label=
"1"
:false-label=
"0
"
>
其他导购
</el-checkbox>
<el-checkbox
v-model=
"form.
customRuleJson.fw_store.zs"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.customRuleJson.fw_store.zs, form.customRuleJson.fw_store.dz, form.customRuleJson.fw_store.dy) && form.customRuleJson.fw_store.zs
"
>
专属导购
</el-checkbox>
<el-checkbox
v-model=
"form.
customRuleJson.fw_store.dz"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.customRuleJson.fw_store.zs, form.customRuleJson.fw_store.dz, form.customRuleJson.fw_store.dy) && form.customRuleJson.fw_store.dz
"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.
customRuleJson.fw_store.dy"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.customRuleJson.fw_store.zs, form.customRuleJson.fw_store.dz, form.customRuleJson.fw_store.dy) && form.customRuleJson.fw_store.dy
"
>
其他导购
</el-checkbox>
</div>
</div>
<div
class=
"level"
>
<div
class=
"title"
>
<span>
层级二:协管门店
</span>
<el-switch
v-model=
"form.
xg_store.open"
:disabled=
"true
"
></el-switch>
<el-switch
v-model=
"form.
customRuleJson.xg_store.open"
:active-value=
"1"
:inactive-value=
"0
"
></el-switch>
</div>
<p
class=
"tips margin-num"
>
当客户在多个协管门店下都有协管导购时,随机取一个协管门店导购
</p>
<div
class=
"content"
>
<el-checkbox
v-model=
"form.
xg_store.zs"
:true-label=
"1"
:false-label=
"0
"
>
协管门店导购
</el-checkbox>
<el-checkbox
v-model=
"form.
xg_store.dz"
:true-label=
"1"
:false-label=
"0
"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.
xg_store.dy"
:true-label=
"1"
:false-label=
"0
"
>
其他导购
</el-checkbox>
<div
class=
"content"
v-if=
"form.customRuleJson.xg_store.open"
>
<el-checkbox
v-model=
"form.
customRuleJson.xg_store.zs"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.customRuleJson.xg_store.zs, form.customRuleJson.xg_store.dz, form.customRuleJson.xg_store.dy) && form.customRuleJson.xg_store.zs
"
>
协管门店导购
</el-checkbox>
<el-checkbox
v-model=
"form.
customRuleJson.xg_store.dz"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.customRuleJson.xg_store.zs, form.customRuleJson.xg_store.dz, form.customRuleJson.xg_store.dy) && form.customRuleJson.xg_store.dz
"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.
customRuleJson.xg_store.dy"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.customRuleJson.xg_store.zs, form.customRuleJson.xg_store.dz, form.customRuleJson.xg_store.dy) && form.customRuleJson.xg_store.dy
"
>
其他导购
</el-checkbox>
</div>
</div>
<div
class=
"level"
>
<div
class=
"title"
>
<span>
层级三:其他门店
</span>
<el-switch
v-model=
"form.
xg_store.open"
:disabled=
"true
"
></el-switch>
<el-switch
v-model=
"form.
storeRuleJson.open"
:active-value=
"1"
:inactive-value=
"0
"
></el-switch>
</div>
<div
class=
"level3-1"
>
<div
class=
"level3-1"
v-if=
"form.storeRuleJson.open"
>
<el-radio-group
v-model=
"form.storeRuleJson.store_type"
>
<el-radio
:label=
"1"
>
推荐门店
</el-radio>
<el-radio
:label=
"2"
>
附近门店
</el-radio>
...
...
@@ -66,68 +67,125 @@
<p
class=
"tips m-t-6"
v-if=
"form.storeRuleJson.store_type == 1"
>
可配置最多20个门店作为推荐门店让客户自主选择要添加的门店好友
</p>
<p
class=
"tips m-t-6"
v-else
>
需客户同意授权当前定位信息,才可展示客户附近最多20家门店供客户选择,否则只能在指定门店下选择
</p>
</div>
<div
class=
"level3-2"
>
<div
class=
"level3-2"
v-if=
"form.storeRuleJson.open"
>
<div
class=
"level3-2-content"
v-if=
"form.storeRuleJson.store_type == 1"
>
<el-form-item
label=
"选择门店"
required
label-width=
"92px"
>
<
el-select></el-select
>
<
selectShop
@
change=
"handleTransferChange"
/
>
</el-form-item>
<el-checkbox
v-model=
"form.storeRuleJson.store.dz"
:true-label=
"1"
:false-label=
"0"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.dy"
:true-label=
"1"
:false-label=
"0"
>
导购
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.dz"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.store.dz, form.storeRuleJson.store.dy) && form.storeRuleJson.store.dz"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.dy"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.store.dz, form.storeRuleJson.store.dy) && form.storeRuleJson.store.dy"
>
导购
</el-checkbox>
</div>
<div
class=
"level3-2-content"
v-else
>
<p
class=
"content-tips"
>
客户同意授权当前定位信息,可在“附近门店”中自主选择要添加的门店好友
</p>
<div
class=
"level3-2-content-check"
>
<el-checkbox
v-model=
"form.storeRuleJson.store.dz"
:true-label=
"1"
:false-label=
"0"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.dy"
:true-label=
"1"
:false-label=
"0"
>
导购
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.dz"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.store.dz, form.storeRuleJson.store.dy) && form.storeRuleJson.store.dz"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.dy"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.store.dz, form.storeRuleJson.store.dy) && form.storeRuleJson.store.dy"
>
导购
</el-checkbox>
</div>
<p
class=
"content-tips m-b-10"
>
客户拒绝授权当前定位信息,可在下方指定的门店范围中(最多20家)自主选择要添加的门店好友
</p>
<el-form-item
label=
"选择门店"
required
label-width=
"92px"
>
<
el-select></el-select
>
<
selectShop
@
change=
"handleTransferChange"
/
>
</el-form-item>
<el-checkbox
v-model=
"form.storeRuleJson.store.ndz"
:true-label=
"1"
:false-label=
"0"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.ndy"
:true-label=
"1"
:false-label=
"0"
>
导购
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.ndz"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.store.ndz, form.storeRuleJson.store.ndy) && form.storeRuleJson.store.ndz"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.store.ndy"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.store.ndz, form.storeRuleJson.store.ndy) && form.storeRuleJson.store.ndy"
>
导购
</el-checkbox>
</div>
</div>
<div
class=
"level3-3"
>
<div
class=
"level3-3"
v-if=
"form.storeRuleJson.open"
>
<el-checkbox
v-model=
"form.storeRuleJson.city_store.open"
:true-label=
"1"
:false-label=
"0"
>
除附近门店/指定门店之外,允许客户按照省市区自由筛选商户所有门店进行添加
</el-checkbox>
<div
class=
"level3-3-content"
>
<el-checkbox
v-model=
"form.storeRuleJson.city_store.dz"
:true-label=
"1"
:false-label=
"0"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.city_store.dy"
:true-label=
"1"
:false-label=
"0"
>
导购
</el-checkbox>
<div
class=
"level3-3-content"
v-if=
"form.storeRuleJson.city_store.open"
>
<el-checkbox
v-model=
"form.storeRuleJson.city_store.dz"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.city_store.dz, form.storeRuleJson.city_store.dy) && form.storeRuleJson.city_store.dz"
>
店长
</el-checkbox>
<el-checkbox
v-model=
"form.storeRuleJson.city_store.dy"
:true-label=
"1"
:false-label=
"0"
:disabled=
"disabledProperty(form.storeRuleJson.city_store.dz, form.storeRuleJson.city_store.dy) && form.storeRuleJson.city_store.dy"
>
导购
</el-checkbox>
</div>
</div>
</div>
</div>
<dm-sub-title
type=
"line"
>
欢迎语设置
</dm-sub-title>
<div
class=
"section"
></div>
<dm-sub-title
type=
"line"
>
欢迎语设置
</dm-sub-title>
<div
class=
"section"
></div>
<div
class=
"section"
>
<welcomeItem
@
getWelcomeId=
"getWelcomeId"
:welcomeIdP=
"form.welcomeId"
></welcomeItem>
</div>
<dm-sub-title
type=
"line"
>
落地页配置
</dm-sub-title>
<div
class=
"section flex"
style=
"margin-bottom: 40px;"
>
<el-form-item
label=
"选择模板"
>
<div
class=
"table"
>
<div
class=
"search"
>
<el-input
class=
"w-260"
placeholder=
"请输入标题"
v-model=
"landingPage.pageSearchText"
@
keyup
.
native=
"toInput"
clearable
@
clear=
"getList"
></el-input>
<el-button
plain
class=
"ylbtn"
@
click=
"addTemp"
>
新建模板
</el-button>
</div>
<el-table
:data=
"landingData"
height=
"426"
:loading=
"landingLoading"
>
<el-table-column
width=
"55"
>
<template
slot-scope=
"
{ row }">
<el-radio
:label=
"row.pageId"
v-model=
"form.pageId"
@
change
.
native=
"getCurrentRow(row)"
>
</el-radio>
</
template
>
</el-table-column>
<el-table-column
prop=
"pageCode"
label=
"模板ID"
minWidth=
"148"
></el-table-column>
<el-table-column
prop=
"pageName"
label=
"模板名称"
minWidth=
"172"
show-overflow-tooltip
></el-table-column>
<el-table-column
prop=
"pageTitle"
label=
"页面标题"
minWidth=
"156"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop=
"guideComment"
label=
"引导语"
show-overflow-tooltip
></el-table-column>
</el-table>
<el-pagination
class=
"paginationBox"
background
@
current-change=
"getList"
:current-page=
"landingPage.pageNum"
layout=
"prev, pager,next "
:page-size=
"landingPage.pageSize"
:total=
"total"
></el-pagination>
</div>
</el-form-item>
<div
class=
"preview"
>
<p
class=
"previewTitle"
>
落地页预览
</p>
<previewPage
:data=
"landingForm"
/>
<p
class=
"previewBottom"
>
此二维码只是样式预览效果,请勿直接使用
</p>
</div>
</div>
<div
class=
"footBtn"
>
<el-button
type=
"primary"
@
click=
"save"
:loading=
"btnLoading"
>
保存
</el-button>
</div>
</el-form>
</div>
</template>
<
script
>
import
{
guidePageList
,
linkAdd
,
linkUpdate
,
linkDetail
}
from
'@/api/actCode'
;
import
selectShop
from
'@/components/common/selectShop'
;
import
welcomeItem
from
'@/views/salesleads/components/welcomesItem.vue'
;
import
previewPage
from
'@/components/preview-page.vue'
;
import
{
_debounce
}
from
'@/common/js/public'
;
import
{
scrollToError
}
from
'@/utils/validate'
;
export
default
{
data
()
{
return
{
scrollToError
,
tagsDialogVisible
:
false
,
landingPage
:
{
pageSearchText
:
''
,
pageNum
:
1
,
pageSize
:
20
},
landingLoading
:
false
,
landingData
:
[],
total
:
0
,
landingForm
:
{},
isEdit
:
this
.
$route
.
meta
.
type
==
'edit'
,
isAdd
:
this
.
$route
.
meta
.
type
==
'add'
,
rules
:
{
name
:
{
required
:
true
,
message
:
'请输入链接名称'
},
memberLabelId
:
{
required
:
true
,
message
:
'请选择链接标签'
}
},
form
:
{
linkType
:
1
,
memberLabelId
:
''
,
memberLabelName
:
'测试121212-木瑾0630测试标签值50'
,
memberLabelId
:
'fd6b44967aa647bcadfad10706244c56'
,
storeList
:
[],
name
:
''
,
pageId
:
''
,
welcomeId
:
''
,
remark
:
''
,
fw_store
:
{
open
:
1
,
//是否开启 1是0否
zs
:
1
,
//专属导购
dz
:
1
,
//店长
dy
:
1
// 其他导购
},
xg_store
:
{
open
:
1
,
zs
:
1
,
dz
:
1
,
dy
:
1
customRuleJson
:
{
fw_store
:
{
open
:
1
,
//是否开启 1是0否
zs
:
1
,
//专属导购
dz
:
0
,
//店长
dy
:
0
// 其他导购
},
xg_store
:
{
open
:
1
,
zs
:
1
,
dz
:
0
,
dy
:
0
}
},
storeRuleJson
:
{
//其他门店
...
...
@@ -135,28 +193,134 @@ export default {
store_type
:
1
,
// 1推荐门店 2附近门店,
store
:
{
dz
:
1
,
//店长
dy
:
1
,
// 店员
dy
:
0
,
// 导购
ndz
:
1
,
// 拒绝后店长
ndy
:
1
//拒绝后店员
ndy
:
0
//拒绝后导购
},
//省市筛选
city_store
:
{
open
:
1
,
//是否开启1是0否
dz
:
1
,
//店长
dy
:
1
//店员
dy
:
0
//导购
}
}
}
},
wxEnterpriseId
:
sessionStorage
.
getItem
(
'userInfos'
)
?
JSON
.
parse
(
sessionStorage
.
getItem
(
'userInfos'
)).
wxEnterpriseId
:
''
,
btnLoading
:
false
};
},
components
:
{
selectShop
,
welcomeItem
,
previewPage
},
mounted
()
{
this
.
getList
();
document
.
addEventListener
(
'visibilitychange'
,
()
=>
{
if
(
document
.
visibilityState
==
'visible'
)
{
this
.
getList
();
}
});
if
(
this
.
isEdit
)
{
this
.
getDetail
();
}
},
methods
:
{
toInput
:
_debounce
(
function
(
e
,
value
)
{
this
.
getList
();
},
500
),
getDetail
()
{
linkDetail
({
linkId
:
this
.
$route
.
params
.
id
}).
then
(
res
=>
{
const
{
result
}
=
res
.
data
;
if
(
result
)
{
result
.
link
.
storeRuleJson
=
JSON
.
parse
(
result
.
link
.
storeRuleJson
);
result
.
link
.
customRuleJson
=
JSON
.
parse
(
result
.
link
.
customRuleJson
);
this
.
form
=
result
.
link
;
}
console
.
log
(
result
);
});
},
saveTagPop
(
data
)
{
const
{
tagItemId
,
tagItemName
}
=
data
;
this
.
form
.
memberLabelName
=
tagItemName
;
this
.
form
.
memberLabelId
=
tagItemId
;
},
handleTagCloseTag
()
{
this
.
form
.
memberLabelName
=
''
;
this
.
form
.
memberLabelId
=
''
;
},
handleTransferChange
(
val
)
{
console
.
log
(
val
);
},
getWelcomeId
(
e
)
{
this
.
form
.
welcomeId
=
e
;
},
getList
()
{
this
.
landingLoading
=
true
;
guidePageList
(
this
.
landingPage
)
.
then
(
res
=>
{
const
{
result
,
totalCount
}
=
res
.
data
.
result
;
if
(
result
)
{
this
.
total
=
totalCount
;
this
.
landingData
=
result
;
this
.
landingForm
=
result
?
result
[
0
]
:
{};
this
.
form
.
pageId
=
result
?
result
[
0
].
pageId
:
''
;
}
})
.
finally
(
_
=>
{
this
.
landingLoading
=
false
;
});
},
getCurrentRow
(
row
)
{
console
.
log
(
row
);
this
.
landingForm
=
row
;
},
addTemp
()
{
this
.
$router
.
push
(
'/ladingPageAdd'
);
},
disabledProperty
(
a
,
b
,
c
,
d
)
{
const
args
=
[...
arguments
];
return
args
.
filter
(
i
=>
i
==
1
).
length
<=
1
;
},
save
()
{
const
data
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
form
));
data
.
customRuleJson
=
JSON
.
stringify
(
data
.
customRuleJson
);
data
.
storeRuleJson
=
JSON
.
stringify
(
data
.
storeRuleJson
);
data
.
wxEnterpriseId
=
this
.
wxEnterpriseId
;
this
.
$refs
.
form
.
validate
(
val
=>
{
if
(
!
val
)
{
this
.
scrollToError
(
this
);
return
;
}
this
.
btnLoading
=
true
;
if
(
this
.
isAdd
)
{
linkAdd
(
data
)
.
then
(
res
=>
{
console
.
log
(
res
);
})
.
finally
(
_
=>
{
this
.
btnLoading
=
false
;
});
}
else
{
linkUpdate
(
data
)
.
then
(
res
=>
{
console
.
log
(
res
);
})
.
finally
(
_
=>
{
this
.
btnLoading
=
false
;
});
}
});
}
}
};
</
script
>
<
style
lang=
"
sc
ss"
scoped
>
<
style
lang=
"
le
ss"
scoped
>
.section
{
padding
:
20px
0
40px
0
;
.level
{
width
:
1
194px
;
width
:
1
00%
;
min-height
:
94px
;
background
:
#f7f8fa
;
border-radius
:
2px
;
...
...
@@ -185,9 +349,9 @@ export default {
margin
:
16px
0
16px
56px
;
}
.level3-2
{
width
:
1106px
;
width
:
calc
(
100%
-
56px
)
;
margin-left
:
56px
;
border-bottom
:
1px
soli
d
#dcdfe6
;
border-bottom
:
1px
dashe
d
#dcdfe6
;
padding-bottom
:
16px
;
.level3-2-content
{
margin-left
:
20px
;
...
...
@@ -211,6 +375,10 @@ export default {
margin-top
:
12px
;
}
}
.flex
{
display
:
flex
;
justify-content
:
flex-start
;
}
.tips-info
{
font-size
:
12px
;
color
:
#909399
;
...
...
@@ -225,4 +393,58 @@ export default {
display
:
inline-block
;
}
}
.table
{
width
:
720px
;
height
:
560px
;
border
:
1px
solid
#dcdfe6
;
padding
:
12px
;
position
:
relative
;
box-sizing
:
border-box
;
.search
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
12px
;
}
.paginationBox
{
float
:
right
;
}
}
.preview
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
margin-left
:
40px
;
/deep/
.pageTitle
{
position
:
absolute
!important
;
top
:
44px
!important
;
}
.previewTitle
{
font-weight
:
500
;
color
:
#303133
;
line-height
:
20px
;
font-size
:
14px
;
width
:
70px
;
text-align
:
center
;
margin-bottom
:
20px
;
}
.previewBottom
{
font-size
:
12px
;
text-align
:
center
;
width
:
228px
;
color
:
#909399
;
line-height
:
17px
;
}
}
.footBtn
{
width
:
100%
;
height
:
56px
;
background
:
#ffffff
;
box-shadow
:
1px
-2px
8px
0px
rgba
(
220
,
223
,
230
,
0.6
);
position
:
fixed
;
bottom
:
0
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
z-index
:
100
;
}
</
style
>
src/views/salesleads/actCodeManage/attractFlowLink/index.vue
View file @
74f36a89
...
...
@@ -255,7 +255,7 @@ export default {
console
.
log
(
row
);
},
goDetail
(
row
)
{
console
.
log
(
row
);
this
.
$router
.
push
(
`attractFlowLinkInfo/
${
row
.
linkId
}
`
);
},
goLink
(
row
)
{
this
.
linkUrl
=
row
.
linkUrl
;
...
...
@@ -265,6 +265,7 @@ export default {
},
goEdit
(
row
)
{
console
.
log
(
row
);
this
.
$router
.
push
(
`attractFlowLinkEdit/
${
row
.
linkId
}
`
);
}
}
};
...
...
src/views/salesleads/actCodeManage/attractFlowLink/info.vue
0 → 100644
View file @
74f36a89
<
template
>
<div
class=
"app-detail-wrap p-20"
v-loading=
"loading"
>
<div
class=
"flex p-b-40"
>
<vue-qr
id=
"qrImg"
:text=
"link.linkUrl"
:size=
"200"
:margin=
"5"
v-if=
"link.linkType == 2"
></vue-qr>
<div
class=
"m-l-30"
>
<el-descriptions
:title=
"link.name"
>
<el-descriptions-item
label=
"ID"
>
{{
link
.
linkId
}}
</el-descriptions-item>
<el-descriptions-item
label=
"code"
>
{{
link
.
linkCode
}}
</el-descriptions-item>
<el-descriptions-item
label=
"链接类型"
>
<el-tag
size=
"mini"
>
{{
link
.
linkType
==
1
?
'专用链接'
:
'通用链接'
}}
</el-tag></el-descriptions-item
>
<el-descriptions-item
label=
"创建人"
>
{{
link
.
creatorName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"创建时间"
>
{{
link
.
createTime
}}
</el-descriptions-item>
<el-descriptions-item
label=
"链接标签"
>
<el-tag
size=
"mini"
>
{{
link
.
memberLabelName
}}
</el-tag>
</el-descriptions-item>
<el-descriptions-item
label=
"链接描述"
>
{{
link
.
remark
}}
</el-descriptions-item>
</el-descriptions>
<div>
<el-button
icon=
"el-icon-download"
plain
@
click=
"downloadQR"
>
下载二维码
</el-button>
<el-button
v-if=
"link.linkType == 2"
v-clipboard:text=
"link.linkUrl"
plain
>
复制链接
</el-button>
<el-button
v-if=
"link.linkType == 2"
plain
@
click=
"goEdit"
>
修改
</el-button>
</div>
</div>
</div>
<div
class=
"fixed-tab"
v-if=
"scrollTop > 300"
>
<el-tabs
v-model=
"activeName"
type=
"card"
>
<el-tab-pane
label=
"详情信息"
name=
"first"
>
<div></div>
</el-tab-pane>
<el-tab-pane
label=
"数据统计"
name=
"second"
>
<div></div>
</el-tab-pane>
</el-tabs>
</div>
<el-tabs
v-model=
"activeName"
type=
"card"
>
<el-tab-pane
label=
"详情信息"
name=
"first"
>
<act-code-detail-info
type=
"actLink"
:enterprise-id=
"link.enterpriseId"
:welcome-id=
"link.welcomeId"
></act-code-detail-info>
<dm-sub-title
type=
"line"
>
落地页配置
</dm-sub-title>
<div>
<div
class=
"flex"
>
<div
class=
"welcome-left-view"
>
<el-descriptions
:column=
"1"
>
<el-descriptions-item
label=
"页面标题"
>
{{
page
.
pageTitle
}}
</el-descriptions-item>
<el-descriptions-item
label=
"商户名称"
>
{{
page
.
merchantName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"商户电话"
>
{{
page
.
merchantPhoneNumber
}}
</el-descriptions-item>
<el-descriptions-item
label=
"商户LOGO"
>
<img
:src=
"page.merchantLogo"
class=
"merchantLogo"
/>
</el-descriptions-item>
<el-descriptions-item
label=
"引导语"
>
{{
page
.
linkCode
}}
</el-descriptions-item>
</el-descriptions>
</div>
<div
class=
"preview"
>
<p
class=
"previewTitle"
>
落地页预览
</p>
<previewPage
:data=
"page"
/>
<p
class=
"previewBottom"
>
此二维码只是样式预览效果,请勿直接使用
</p>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane
label=
"数据统计"
name=
"second"
>
</el-tab-pane>
</el-tabs>
</div>
</
template
>
<
script
>
import
{
linkDetail
}
from
'@/api/actCode'
;
import
actCodeDetailInfo
from
'../../components/actCodeDetailInfo.vue'
;
import
previewPage
from
'@/components/preview-page.vue'
;
import
{
_throttle
}
from
'@/common/js/public'
;
import
VueQr
from
'vue-qr'
;
export
default
{
name
:
'actCodeDetail'
,
components
:
{
actCodeDetailInfo
,
previewPage
,
VueQr
},
props
:
{
hmId
:
{
type
:
String
,
default
:
''
}
},
data
()
{
return
{
loading
:
false
,
activeName
:
'first'
,
codeStatusLis
:
[
{
value
:
''
,
style
:
''
},
{
value
:
'正常'
,
style
:
'success'
},
{
value
:
'已作废'
,
style
:
'danger'
},
{
value
:
'待生效'
,
style
:
'info'
},
{
value
:
'正常-今日已达上限'
,
style
:
'warning'
}
],
link
:
{
linkId
:
419648718594129960
,
customRuleJson
:
'{"fw_store":{"open":1,"zs":1,"dz":1,"dy":1},"xg_store":{"open":1,"zs":1,"dz":1,"dy":0}}'
,
linkType
:
2
,
memberLabelId
:
'fd6b44967aa647bcadfad10706244c56'
,
name
:
'活码链接-711'
,
pageId
:
418460224953786370
,
remark
:
'说明'
,
linkUrl
:
'www.baidu.com'
,
storeList
:
[
{
storeId
:
'ff80808181e0effb0181e26a674c000e'
,
storeName
:
'测试有赞商城'
,
storeCode
:
'991001'
},
{
storeId
:
'ff80808181e0effb0181e128d0b70000'
,
storeName
:
'达达店铺'
,
storeCode
:
'DADA'
}
],
storeRuleJson
:
'{"store_type":2,"open":0,"store":{"dz":0,"dy":1,"ndz":0,"ndy":1}, "city_store":{"open":1,"dz":1,"dy":1}}'
,
welcomeId
:
'025867b7a01541979617229a4aca9551'
,
enterpriseId
:
'ff8080815dacd3a2015dacd3ef5c0000'
,
wxEnterpriseId
:
'ca66a01b79474c40b3e7c7f93daf1a3b'
},
page
:
{},
welcome
:
{},
scrollTop
:
0
};
},
methods
:
{
downloadQR
()
{
const
qrcode
=
document
.
getElementById
(
'qrImg'
);
console
.
log
(
qrcode
);
let
img
=
qrcode
.
getElementsByTagName
(
'img'
)[
0
];
let
link
=
document
.
createElement
(
'a'
);
let
url
=
img
.
getAttribute
(
'src'
);
link
.
setAttribute
(
'href'
,
url
);
link
.
setAttribute
(
'download'
,
`
${
this
.
link
.
linkId
}
_
${
this
.
link
.
name
}
.png`
);
link
.
click
();
},
goEdit
()
{
this
.
$router
.
push
(
`attractFlowLinkEdit/
${
this
.
link
.
linkId
}
`
);
},
async
getDetail
()
{
this
.
loading
=
true
;
linkDetail
({
linkId
:
this
.
$route
.
params
.
id
})
.
then
(
res
=>
{
const
{
result
}
=
res
.
data
;
if
(
result
)
{
const
{
link
,
page
,
welcome
}
=
result
;
this
.
link
=
link
;
this
.
page
=
page
;
this
.
welcome
=
welcome
;
}
})
.
catch
(
function
(
error
)
{
this
.
$message
.
error
({
duration
:
1000
,
message
:
error
.
message
});
})
.
finally
(
_
=>
{
this
.
loading
=
false
;
});
},
scrollMethod
:
_throttle
(
function
()
{
// 节流会不自然 左右不滑动
this
.
scrollTop
=
document
.
getElementById
(
'hb-layout-pager-one'
).
scrollTop
;
},
100
)
},
mounted
()
{
this
.
getDetail
();
document
.
getElementById
(
'hb-layout-pager-one'
).
addEventListener
(
'scroll'
,
this
.
scrollMethod
);
},
destroyed
()
{
document
.
getElementById
(
'hb-layout-pager-one'
).
removeEventListener
(
'scroll'
,
this
.
scrollMethod
);
}
};
</
script
>
<
style
lang=
"less"
scoped
>
.app-detail-wrap
{
//
height
:
100%
;
background
:
#fff
;
.p-b-40
{
padding-bottom
:
40px
;
}
}
.img-200
{
width
:
200px
;
height
:
200px
;
border-radius
:
8px
;
padding-right
:
30px
;
}
.height-22
{
height
:
22px
;
}
.text-ellipsis-white
{
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
}
.fixed-tab
{
position
:
absolute
;
top
:
80px
;
z-index
:
1
;
padding-bottom
:
0
;
height
:
40px
;
background
:
white
;
width
:
100%
;
//
left
:
50px
;
}
.welcome-left-view
{
width
:
639px
;
//
margin-right
:
120px
;
}
.merchantLogo
{
width
:
120px
;
height
:
120px
;
background
:
#ffffff
;
border-radius
:
2px
;
border
:
1px
solid
#dcdfe6
;
}
.preview
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
margin-left
:
40px
;
/deep/
.pageTitle
{
position
:
absolute
!important
;
top
:
44px
!important
;
}
.previewTitle
{
font-weight
:
500
;
color
:
#303133
;
line-height
:
20px
;
font-size
:
14px
;
width
:
70px
;
text-align
:
center
;
margin-bottom
:
20px
;
}
.previewBottom
{
font-size
:
12px
;
text-align
:
center
;
width
:
228px
;
color
:
#909399
;
line-height
:
17px
;
}
}
</
style
>
src/views/salesleads/actCodeManage/attractFlowLink/landingPage/detail.vue
View file @
74f36a89
<
template
>
<div>
<div
class=
"daily-set-content"
>
<el-form
label-width=
"100px"
ref=
"form"
:model=
"form"
:rules=
"rules"
refs=
"form"
class=
"form"
>
<el-form
label-width=
"100px"
ref=
"form"
:model=
"form"
:rules=
"rules"
class=
"form"
>
<el-form-item
label=
"模板名称"
prop=
"pageName"
required
>
<el-input
show-word-limit
placeholder=
"请输入模板名称"
type=
"text"
v-model=
"form.pageName"
maxlength=
"20"
class=
"w-340"
></el-input>
</el-form-item>
...
...
@@ -41,6 +41,7 @@
import
singleUpload
from
'@/components/single-upload.vue'
;
import
previewPage
from
'@/components/preview-page.vue'
;
import
{
guidePageDetail
,
guidePageEdit
,
guidePageSave
,
wxEnterpriseList
}
from
'@/api/actCode'
;
export
default
{
components
:
{
previewPage
,
...
...
@@ -132,11 +133,14 @@ export default {
});
},
save
()
{
if
(
this
.
isEdit
)
{
this
.
guidePageEdit
();
}
else
{
this
.
guidePageSave
();
}
this
.
$refs
.
form
.
validate
(
val
=>
{
if
(
!
val
)
return
;
if
(
this
.
isEdit
)
{
this
.
guidePageEdit
();
}
else
{
this
.
guidePageSave
();
}
});
}
}
};
...
...
src/views/salesleads/actCodeManage/attractFlowLink/landingPage/list.vue
View file @
74f36a89
...
...
@@ -2,7 +2,7 @@
<div
class=
"daily-set-content"
>
<div
class=
"flex flex-space-between m-b-16"
>
<div
class=
"flex flex-align-center"
>
<el-input
placeholder=
"请输入模板ID/名称、创建人"
class=
"w-260"
v-model=
"form.pageSearchText"
@
keyup
.
native=
"
value => toInput(value, searchInput)
"
clearable
@
clear=
"getList"
>
<i
slot=
"prefix"
class=
"el-input__icon el-icon-search"
></i>
</el-input>
<el-input
placeholder=
"请输入模板ID/名称、创建人"
class=
"w-260"
v-model=
"form.pageSearchText"
@
keyup
.
native=
"
toInput
"
clearable
@
clear=
"getList"
>
<i
slot=
"prefix"
class=
"el-input__icon el-icon-search"
></i>
</el-input>
<span
style=
"font-size:14px;"
class=
"m-l-10"
>
模板创建时间:
</span>
<el-date-picker
class=
"m-l-10 w-256"
v-model=
"form.dateRange"
@
change=
"getList"
type=
"daterange"
:value-format=
"'yyyy-MM-dd'"
clearable
@
clear=
"getList"
range-separator=
"~"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
>
</el-date-picker>
</div>
...
...
src/views/salesleads/actCodeManage/staffActCode/actCodeDetail.vue
View file @
74f36a89
...
...
@@ -56,7 +56,7 @@
</div>
</
template
>
<
script
>
import
actCodeDetailInfo
from
'./actCodeDetailInfo.vue'
;
import
actCodeDetailInfo
from
'.
./../components
/actCodeDetailInfo.vue'
;
import
actCodeDetailStatistics
from
'./actCodeDetailStatistics.vue'
;
import
{
_throttle
}
from
'@/common/js/public'
;
import
{
getRequest
,
deleteRequest
}
from
'@/api/api'
;
...
...
src/views/salesleads/
actCodeManage/staffActCode
/actCodeDetailInfo.vue
→
src/views/salesleads/
components
/actCodeDetailInfo.vue
View file @
74f36a89
...
...
@@ -31,7 +31,7 @@
<preview-welcome
:welcomeContent=
"welcomeData.welcomeContent"
:mediaList=
"welcomeData.welcomeMediaList"
></preview-welcome>
</div>
</div>
<div>
<div
v-if=
"type == 'actCode'"
>
<div
class=
"title flex"
>
<div
class=
"blue-block"
></div>
<span
class=
"font-w-500 color-303133"
>
使用成员
</span>
...
...
@@ -89,6 +89,10 @@ export default {
hmId
:
{
type
:
String
,
default
:
''
},
type
:
{
type
:
String
,
default
:
'actCode'
}
},
data
()
{
...
...
@@ -183,8 +187,10 @@ export default {
}
},
mounted
()
{
let
that
=
this
;
that
.
getUseTableList
();
if
(
this
.
type
==
'actCode'
)
{
this
.
getUseTableList
();
}
this
.
getwelcomeInfo
();
},
watch
:
{
welcomeId
:
function
(
newData
,
oldData
)
{
...
...
static/css/public.css
View file @
74f36a89
...
...
@@ -481,6 +481,9 @@ input:focus {
.m-l-16
{
margin-left
:
16px
;
}
.m-l-30
{
margin-left
:
30px
;
}
.m-t-6
{
margin-top
:
6px
;
}
...
...
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