Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-dml
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-dml
Commits
339f967c
提交
339f967c
authored
7月 06, 2023
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 新增公众号授权
上级
4ad890e2
显示空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
421 行增加
和
378 行删除
+421
-378
ConnectionIcon.vue
src/components/ConnectionIcon.vue
+0
-0
api.ts
src/modules/connect/api.ts
+17
-2
FormDialog.vue
src/modules/connect/components/FormDialog.vue
+200
-70
ListItem.vue
src/modules/connect/components/ListItem.vue
+5
-1
StepOne.vue
src/modules/connect/components/StepOne.vue
+19
-40
StepTwo.vue
src/modules/connect/components/StepTwo.vue
+17
-130
types.ts
src/modules/connect/types.ts
+14
-0
View.vue
src/modules/connect/views/View.vue
+140
-93
Index.vue
src/modules/home/views/Index.vue
+4
-17
BindConnection.vue
src/modules/trip/template/components/BindConnection.vue
+3
-23
Image.vue
src/modules/user/views/Image.vue
+1
-1
vite.config.ts
vite.config.ts
+1
-1
没有找到文件。
src/components/ConnectionIcon.vue
浏览文件 @
339f967c
This source diff could not be displayed because it is too large. You can
view the blob
instead.
src/modules/connect/api.ts
浏览文件 @
339f967c
...
@@ -6,7 +6,7 @@ export function getConnectionList(params: { created_operator?: string; type?: st
...
@@ -6,7 +6,7 @@ export function getConnectionList(params: { created_operator?: string; type?: st
}
}
// 创建链接
// 创建链接
export
function
createConnection
(
data
:
{
type
:
string
;
config_attributes
:
string
})
{
export
function
createConnection
(
data
:
{
type
:
string
;
config_attributes
:
any
})
{
return
httpRequest
.
post
(
'/api/lab/v1/experiment/connection/create'
,
data
)
return
httpRequest
.
post
(
'/api/lab/v1/experiment/connection/create'
,
data
)
}
}
...
@@ -16,7 +16,7 @@ export function getConnectionDetails(params: { id?: string }) {
...
@@ -16,7 +16,7 @@ export function getConnectionDetails(params: { id?: string }) {
}
}
// 更新链接
// 更新链接
export
function
updateConnection
(
data
:
{
id
:
string
;
config_attributes
:
string
})
{
export
function
updateConnection
(
data
:
{
id
:
string
;
config_attributes
:
any
})
{
return
httpRequest
.
post
(
'/api/lab/v1/experiment/connection/update'
,
data
)
return
httpRequest
.
post
(
'/api/lab/v1/experiment/connection/update'
,
data
)
}
}
...
@@ -39,3 +39,18 @@ export function getSurveyForm(params: { form_id: string }) {
...
@@ -39,3 +39,18 @@ export function getSurveyForm(params: { form_id: string }) {
export
function
submitSurveyForm
(
data
:
{
id
:
string
;
form_id
:
string
;
form
:
string
})
{
export
function
submitSurveyForm
(
data
:
{
id
:
string
;
form_id
:
string
;
form
:
string
})
{
return
httpRequest
.
post
(
'/api/lab/v1/experiment/connection/save-survey-form-view'
,
data
)
return
httpRequest
.
post
(
'/api/lab/v1/experiment/connection/save-survey-form-view'
,
data
)
}
}
// 获取公众号第三方授权操作地址
export
function
getWechatAuth
(
params
:
{
connection_id
:
string
;
auth_type
?:
1
|
2
|
3
;
redirect_uri
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/experiment/wechat-platform/auth'
,
{
params
})
}
// 同步授权方公众号信息到本地
export
function
asyncOfficialAccountInfo
(
params
:
{
connection_id
:
string
;
appid
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/experiment/wechat-platform/async-official-account'
,
{
params
})
}
// 同步微信公众号用户到本地
export
function
asyncOfficialAccountUsers
(
params
:
{
connection_id
:
string
;
appid
:
string
})
{
return
httpRequest
.
get
(
'/api/lab/v1/experiment/wechat-platform/async-official-account'
,
{
params
})
}
src/modules/connect/components/FormDialog.vue
浏览文件 @
339f967c
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
StepOne
from
'../components/StepOne.vue'
import
StepTwo
from
'../components/StepTwo.vue'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
{
createConnection
,
updateConnection
}
from
'../api'
import
{
createConnection
,
updateConnection
,
getWechatAuth
}
from
'../api'
import
type
{
DetailsProp
}
from
'../types'
import
type
{
DetailsProp
,
PlatformItem
,
ConfigAttribute
}
from
'../types'
const
props
=
defineProps
<
{
data
:
DetailsProp
|
undefined
}
>
()
const
StepOne
=
defineAsyncComponent
(()
=>
import
(
'../components/StepOne.vue'
))
const
StepTwo
=
defineAsyncComponent
(()
=>
import
(
'../components/StepTwo.vue'
))
const
props
=
defineProps
<
{
data
?:
DetailsProp
}
>
()
const
emit
=
defineEmits
<
{
const
emit
=
defineEmits
<
{
(
e
:
'update'
):
void
(
e
:
'update'
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
(
e
:
'update:modelValue'
,
visible
:
boolean
):
void
}
>
()
}
>
()
// 请求参数
const
platformList
:
PlatformItem
[]
=
[
const
params
=
$ref
({
type
:
''
,
config_attributes
:
''
})
{
type
:
'1'
,
type_name
:
'公众号'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
}
// { label: '公众号类型', prop: 'type', value: '' },
// { label: '授权方昵称', prop: 'nikeName', value: '' }
],
async
onBeforeNext
(
stepActive
)
{
if
(
stepActive
===
2
)
{
const
res
=
await
handleSubmit
()
const
{
data
}
=
await
getWechatAuth
({
connection_id
:
res
.
id
,
redirect_uri
:
location
.
href
,
auth_type
:
1
})
location
.
href
=
data
.
url
return
false
}
return
true
}
},
{
type
:
'2'
,
type_name
:
'钉钉'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AgentId'
,
prop
:
'agentId'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'3'
,
type_name
:
'小鹅通'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'app_id'
,
prop
:
'app_id'
,
value
:
''
},
{
label
:
'client_id'
,
prop
:
'client_id'
,
value
:
''
},
{
label
:
'secret_key'
,
prop
:
'secret_key'
,
value
:
''
}
]
},
{
type
:
'4'
,
type_name
:
'问卷星'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'5'
,
type_name
:
'今日头条'
,
config_attributes
:
[{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
}]
},
{
type
:
'6'
,
type_name
:
'抖音'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'应用类别'
,
prop
:
'dyInput1'
,
value
:
''
},
{
label
:
'授权域回调'
,
prop
:
'dyInput2'
,
value
:
''
},
{
label
:
'网站应用简介'
,
prop
:
'dyInput3'
,
value
:
''
},
{
label
:
'应用官网'
,
prop
:
'dyInput4'
,
value
:
''
},
{
label
:
'联系人姓名'
,
prop
:
'dyInput5'
,
value
:
''
}
]
},
{
type
:
'7'
,
type_name
:
'微博'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'8'
,
type_name
:
'小红书'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'9'
,
type_name
:
'邮箱'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'client_id'
,
prop
:
'client_id'
,
value
:
''
},
{
label
:
'client_secret'
,
prop
:
'client_secret'
,
value
:
''
},
{
label
:
'token URL'
,
prop
:
'token'
,
value
:
''
},
{
label
:
'API URL'
,
prop
:
'apiUrl'
,
value
:
''
}
]
},
{
type
:
'10'
,
type_name
:
'短信'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'client_id'
,
prop
:
'client_id'
,
value
:
''
},
{
label
:
'SdkAppId'
,
prop
:
'sdkAppId'
,
value
:
''
},
{
label
:
'token URL'
,
prop
:
'token'
,
value
:
''
},
{
label
:
'API URL'
,
prop
:
'apiUrl'
,
value
:
''
}
]
},
{
type_name
:
'内部消息'
,
type
:
'11'
,
config_attributes
:
[{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
}]
},
{
type
:
'12'
,
type_name
:
'自定义'
,
config_attributes
:
[
{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'APP类型'
,
prop
:
'appType'
,
value
:
''
},
{
label
:
'AppId'
,
prop
:
'appId'
,
value
:
''
}
]
},
{
type
:
'13'
,
type_name
:
'卷王'
,
icon
:
'99'
,
config_attributes
:
[{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
}]
},
{
type
:
'14'
,
type_name
:
'小程序'
,
icon
:
'100'
,
config_attributes
:
[{
label
:
'连接名称'
,
prop
:
'name'
,
value
:
''
}],
async
onBeforeNext
(
stepActive
)
{
if
(
stepActive
===
2
)
{
const
res
=
await
handleSubmit
()
const
{
data
}
=
await
getWechatAuth
({
connection_id
:
res
.
id
,
redirect_uri
:
location
.
href
,
auth_type
:
2
})
location
.
href
=
data
.
url
return
false
}
return
true
}
}
]
// 提交
// 请求参数
function
handleSubmit
()
{
const
params
:
{
type
:
string
;
config_attributes
:
ConfigAttribute
[]
}
=
reactive
({
type
:
'1'
,
config_attributes
:
[]
})
if
(
props
.
data
?.
id
)
{
watchEffect
(()
=>
{
const
updateParams
=
{
id
:
props
.
data
?.
id
,
config_attributes
:
stepTwo
.
value
.
formItem
}
if
(
!
props
.
data
)
return
updateConnection
(
updateParams
).
then
(()
=>
{
const
{
type
,
config_attributes
}
=
props
.
data
emit
(
'update'
)
let
attributes
=
[]
emit
(
'update:modelValue'
,
false
)
if
(
Array
.
isArray
(
config_attributes
))
{
ElMessage
({
message
:
'保修改成功'
,
type
:
'success'
})
attributes
=
config_attributes
})
}
else
if
(
typeof
config_attributes
===
'string'
)
{
}
else
{
attributes
=
JSON
.
parse
(
config_attributes
)
createConnection
(
params
).
then
(()
=>
{
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
ElMessage
({
message
:
'保存成功'
,
type
:
'success'
})
})
}
}
Object
.
assign
(
params
,
{
type
,
config_attributes
:
attributes
})
})
const
selectedItem
=
computed
(()
=>
platformList
.
find
(
item
=>
item
.
type
===
params
.
type
))
const
defaultStepActive
=
props
.
data
?.
id
?
2
:
1
const
stepActive
=
ref
(
defaultStepActive
)
const
stepLength
=
3
function
handleChange
(
data
:
PlatformItem
)
{
params
.
config_attributes
=
data
.
config_attributes
||
[]
}
}
// tabs
// 上一步
let
activeName
=
$ref
(
props
.
data
?.
id
?
2
:
1
)
function
handlePrev
()
{
stepActive
.
value
--
}
// 第三步成功弹窗
// 下一步
const
openMsg
=
()
=>
{
async
function
handleNext
()
{
ElMessageBox
.
alert
(
`成功链接
${
stepOneValue
.
name
}
`
,
'提示'
,
{
const
isEmpty
=
params
.
config_attributes
.
find
(
item
=>
item
.
value
===
''
)
// if you want to disable its autofocus
if
(
isEmpty
&&
stepActive
.
value
===
2
)
{
// autofocus: false,
ElMessage
(
'请填写完整'
)
confirmButtonText
:
'OK'
return
})
}
if
(
selectedItem
.
value
?.
onBeforeNext
)
{
const
next
=
await
selectedItem
.
value
?.
onBeforeNext
(
stepActive
.
value
,
selectedItem
.
value
)
if
(
!
next
)
return
}
stepActive
.
value
++
}
}
// 第一步的值
// 第三步成功弹窗
const
stepOneValue
=
$ref
({
function
handleTest
()
{
type
:
props
.
data
?.
type
||
''
,
const
typeName
=
selectedItem
.
value
?.
type_name
name
:
props
.
data
?.
type_name
||
''
,
if
(
typeName
)
ElMessageBox
.
alert
(
`成功连接
${
typeName
}
`
,
'提示'
,
{
confirmButtonText
:
'OK'
})
value
:
props
.
data
?.
config_attributes
})
const
stepOne
=
ref
()
const
handleStepOneNext
=
function
()
{
const
data
=
stepOne
.
value
.
getData
()
params
.
type
=
data
.
name
stepOneValue
.
type
=
data
.
name
stepOneValue
.
name
=
data
.
label
activeName
++
}
}
// 第二步
// 提交
const
stepTwo
=
ref
()
async
function
handleSubmit
()
{
const
handleStepTwoNext
=
function
()
{
if
(
props
.
data
?.
id
)
{
const
data
=
stepTwo
.
value
.
formItem
await
updateConnection
({
id
:
props
.
data
.
id
,
...
params
})
const
isData
=
data
.
find
((
item
:
{
label
:
string
;
value
:
string
;
prop
:
string
})
=>
item
.
value
===
''
)
return
props
.
data
if
(
!
isData
)
{
activeName
++
params
.
config_attributes
=
data
}
else
{
}
else
{
ElMessage
(
'请填写完整'
)
const
res
=
await
createConnection
(
params
)
return
res
.
data
.
detail
}
}
}
}
async
function
handleSave
()
{
await
handleSubmit
()
ElMessage
({
message
:
props
.
data
?.
id
?
'保存成功'
:
'修改成功'
,
type
:
'success'
})
emit
(
'update'
)
emit
(
'update:modelValue'
,
false
)
}
</
script
>
</
script
>
<
template
>
<
template
>
<el-dialog
class=
"connect-form"
:title=
"props.data?.id ? '编辑
链接' : '新建链
接'"
:close-on-click-modal=
"false"
width=
"1050px"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-dialog
class=
"connect-form"
:title=
"props.data?.id ? '编辑
连接' : '新建连
接'"
:close-on-click-modal=
"false"
width=
"1050px"
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-tabs
v-model=
"
activeNam
e"
class=
"demo-tabs"
>
<el-tabs
v-model=
"
stepActiv
e"
class=
"demo-tabs"
>
<!-- 第一步 -->
<!-- 第一步 -->
<el-tab-pane
disabled
la
bel=
"选择链
接类型"
:name=
"1"
v-if=
"!props.data?.id"
>
<el-tab-pane
disabled
la
zy
label=
"选择连
接类型"
:name=
"1"
v-if=
"!props.data?.id"
>
<StepOne
ref=
"stepOn
e"
></StepOne>
<StepOne
:platformList=
"platformList"
v-model=
"params.type"
@
change=
"handleChang
e"
></StepOne>
</el-tab-pane>
</el-tab-pane>
<!-- 第二步 -->
<!-- 第二步 -->
<el-tab-pane
disabled
la
bel=
"配置链
接信息"
:name=
"2"
>
<el-tab-pane
disabled
la
zy
label=
"配置连
接信息"
:name=
"2"
>
<StepTwo
ref=
"stepTwo"
:data=
"stepOneValue
"
></StepTwo>
<StepTwo
:platform=
"selectedItem"
v-model=
"params.config_attributes"
v-if=
"selectedItem
"
></StepTwo>
</el-tab-pane>
</el-tab-pane>
<el-tab-pane
disabled
la
bel=
"测试链
接"
:name=
"3"
>
<el-tab-pane
disabled
la
zy
label=
"测试连
接"
:name=
"3"
>
<el-button
type=
"primary"
@
click=
"
openMsg"
>
测试链
接
</el-button>
<el-button
type=
"primary"
@
click=
"
handleTest"
>
测试连
接
</el-button>
</el-tab-pane>
</el-tab-pane>
</el-tabs>
</el-tabs>
<div
class=
"button-flex"
>
<div
class=
"button-flex"
>
<template
v-if=
"props.data?.id"
>
<el-button
type=
"primary"
@
click=
"handlePrev"
v-if=
"stepActive !== defaultStepActive"
>
上一步
</el-button>
<el-button
type=
"primary"
@
click=
"activeName--"
v-if=
"activeName === 3"
>
上一步
</el-button>
<el-button
type=
"primary"
@
click=
"handleNext"
v-if=
"stepActive
<
stepLength
"
>
下一步
</el-button>
</
template
>
<el-button
type=
"primary"
@
click=
"handleSave"
v-if=
"stepActive === stepLength"
>
保存
</el-button>
<
template
v-else
>
<el-button
type=
"primary"
@
click=
"activeName--"
v-if=
"activeName === 2 || activeName === 3"
>
上一步
</el-button>
<el-button
type=
"primary"
@
click=
"handleStepOneNext"
v-if=
"activeName === 1"
>
下一步
</el-button>
<el-button
type=
"primary"
@
click=
"handleStepTwoNext"
v-if=
"activeName === 2"
>
下一步
</el-button>
<el-button
type=
"primary"
v-if=
"activeName === 3"
@
click=
"handleSubmit"
>
保存
</el-button>
</
template
>
</div>
</div>
</el-dialog>
</el-dialog>
</
template
>
</
template
>
...
@@ -109,6 +238,7 @@ const handleStepTwoNext = function () {
...
@@ -109,6 +238,7 @@ const handleStepTwoNext = function () {
}
}
}
}
.button-flex
{
.button-flex
{
margin-top
:
40px
;
display
:
flex
;
display
:
flex
;
justify-content
:
center
;
justify-content
:
center
;
}
}
...
...
src/modules/connect/components/ListItem.vue
浏览文件 @
339f967c
...
@@ -27,6 +27,10 @@ const routerView = function () {
...
@@ -27,6 +27,10 @@ const routerView = function () {
const
edit
=
function
()
{
const
edit
=
function
()
{
emits
(
'edit'
,
props
.
data
.
id
)
emits
(
'edit'
,
props
.
data
.
id
)
}
}
const
iconMap
=
{
'13'
:
'99'
,
'14'
:
'100'
}
</
script
>
</
script
>
<
template
>
<
template
>
...
@@ -40,7 +44,7 @@ const edit = function () {
...
@@ -40,7 +44,7 @@ const edit = function () {
<el-icon
size=
"20"
color=
"#333"
><Delete
/></el-icon>
<el-icon
size=
"20"
color=
"#333"
><Delete
/></el-icon>
</div>
</div>
<div
class=
"connect-item__icon"
>
<div
class=
"connect-item__icon"
>
<Icon
w=
"40"
h=
"40"
:multi
colour=
"true"
class=
"svg"
:name=
"
data.type"
></Icon>
<Icon
w=
"40"
h=
"40"
:multi
Color=
"true"
class=
"svg"
:name=
"iconMap[data.type] ||
data.type"
></Icon>
</div>
</div>
<p>
<p>
{{
data
.
type
===
'12'
?
data
.
config_attributes
[
0
].
value
:
data
.
type_name
}}
{{
data
.
type
===
'12'
?
data
.
config_attributes
[
0
].
value
:
data
.
type_name
}}
...
...
src/modules/connect/components/StepOne.vue
浏览文件 @
339f967c
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
type
{
IconProp
}
from
'../types'
import
type
{
PlatformItem
}
from
'../types'
import
Icon
from
'@/components/ConnectionIcon.vue'
import
Icon
from
'@/components/ConnectionIcon.vue'
// icon
defineProps
<
{
platformList
:
PlatformItem
[]
}
>
()
const
iconItems
=
$ref
<
IconProp
[]
>
([
const
modelValue
=
defineModel
<
string
>
({
default
:
'1'
})
{
label
:
'公众号'
,
name
:
'1'
,
checkbox
:
true
},
{
label
:
'钉钉'
,
name
:
'2'
,
checkbox
:
false
},
{
label
:
'小鹅通'
,
name
:
'3'
,
checkbox
:
false
},
{
label
:
'问卷星'
,
name
:
'4'
,
checkbox
:
false
},
{
label
:
'今日头条'
,
name
:
'5'
,
checkbox
:
false
},
{
label
:
'抖音'
,
name
:
'6'
,
checkbox
:
false
},
{
label
:
'微博'
,
name
:
'7'
,
checkbox
:
false
},
{
label
:
'小红书'
,
name
:
'8'
,
checkbox
:
false
},
{
label
:
'邮箱'
,
name
:
'9'
,
checkbox
:
false
},
{
label
:
'短信'
,
name
:
'10'
,
checkbox
:
false
},
{
label
:
'内部消息'
,
name
:
'11'
,
checkbox
:
false
},
{
label
:
'自定义'
,
name
:
'12'
,
checkbox
:
false
},
{
label
:
'卷王'
,
name
:
'13'
,
checkbox
:
false
}
])
let
typeValue
=
ref
<
IconProp
>
({
label
:
'公众号'
,
name
:
'1'
,
checkbox
:
true
})
const
emit
=
defineEmits
<
{
change
:
[
data
:
PlatformItem
]
}
>
()
const
handleIcon
=
function
(
data
:
IconProp
)
{
function
handleChange
(
item
:
PlatformItem
)
{
iconItems
.
forEach
((
item
:
IconProp
)
=>
(
item
.
checkbox
=
false
))
modelValue
.
value
=
item
.
type
data
.
checkbox
=
true
emit
(
'change'
,
item
)
typeValue
.
value
=
data
}
}
const
getData
=
function
()
{
return
typeValue
.
value
}
defineExpose
({
getData
})
</
script
>
</
script
>
<
template
>
<
template
>
<div
class=
"connect-from_icon__box"
>
<div
class=
"connect-from_icon__box"
>
<div
v-for=
"item in iconItems"
:key=
"item.name"
:class=
"item.checkbox ? 'mr20-mt20 active box' : 'mr20-mt20 box'
"
>
<div
class=
"box"
v-for=
"item in platformList"
:key=
"item.type"
:class=
"
{ active: item.type === modelValue }" @click="handleChange(item)
">
<div
@
click=
"handleIcon(item)"
class=
"connect-form_icon"
:style=
"`background: $
{item.checkbox ? '#AA1941' : ''}`
">
<div
class=
"connect-form_icon
"
>
<Icon
:multi
colour=
"!item.checkbox"
:color=
"item.checkbox ? '#fff' : ''"
class=
"svg"
:name=
"item.nam
e"
></Icon>
<Icon
:multi
Color=
"item.type !== modelValue"
:color=
"item.type === modelValue ? '#fff' : ''"
class=
"svg"
:name=
"item.icon || item.typ
e"
></Icon>
</div>
</div>
<div
class=
"name"
>
{{
item
.
label
}}
</div>
<div
class=
"name"
>
{{
item
.
type_name
}}
</div>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
.connect-from_icon__box
{
.connect-from_icon__box
{
display
:
grid
;
grid-template-columns
:
repeat
(
4
,
1fr
);
row-gap
:
20px
;
column-gap
:
20px
;
.box
{
.box
{
padding
:
10px
20px
;
padding
:
10px
20px
;
width
:
180px
;
height
:
100px
;
height
:
100px
;
border
:
1px
dashed
#ddd
;
border
:
1px
dashed
#ddd
;
}
cursor
:
pointer
;
padding
:
10px
;
display
:
flex
;
flex-wrap
:
wrap
;
.mr20-mt20
{
margin-right
:
20px
;
margin-bottom
:
20px
;
&
.active
{
&
.active
{
.name
{
.name
{
color
:
#ba143e
;
color
:
#ba143e
;
}
}
.connect-form_icon
{
.connect-form_icon
{
background
:
#aa1941
;
box-shadow
:
2px
2px
10px
0px
rgba
(
0
,
0
,
0
,
0
.2
);
box-shadow
:
2px
2px
10px
0px
rgba
(
0
,
0
,
0
,
0
.2
);
}
}
}
}
...
...
src/modules/connect/components/StepTwo.vue
浏览文件 @
339f967c
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
type
{
FormInstance
}
from
'element-plus'
import
type
{
FormInstance
}
from
'element-plus'
import
type
{
PlatformItem
,
ConfigAttribute
}
from
'../types'
const
props
=
defineProps
<
{
data
:
{
type
:
string
;
name
:
string
;
value
?:
string
|
Array
<
any
>
}
}
>
()
const
props
=
defineProps
<
{
platform
:
PlatformItem
}
>
()
const
modelValue
=
defineModel
<
ConfigAttribute
[]
>
()
// 用户需知
// 用户需知
const
checked
=
$
ref
(
true
)
const
checked
=
ref
(
true
)
// form
// form
const
formRef
=
$
ref
<
FormInstance
>
()
const
formRef
=
ref
<
FormInstance
>
()
const
formAll
=
ref
([
const
configList
=
computed
(()
=>
{
{
return
props
.
platform
.
config_attributes
||
[]
type
:
'1'
,
})
form
:
[
onMounted
(()
=>
{
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
modelValue
.
value
=
modelValue
.
value
?
Object
.
assign
([],
configList
.
value
,
modelValue
.
value
)
:
configList
.
value
{
label
:
'公众号类型'
,
prop
:
'type'
,
value
:
''
},
{
label
:
'授权方昵称'
,
prop
:
'nikeName'
,
value
:
''
}
]
},
{
type
:
'2'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AgentId'
,
prop
:
'agentId'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'3'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'app_id'
,
prop
:
'app_id'
,
value
:
''
},
{
label
:
'client_id'
,
prop
:
'client_id'
,
value
:
''
},
{
label
:
'secret_key'
,
prop
:
'secret_key'
,
value
:
''
}
]
},
{
type
:
'4'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'5'
,
form
:
[{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
}]
},
{
type
:
'6'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'应用类别'
,
prop
:
'dyInput1'
,
value
:
''
},
{
label
:
'授权域回调'
,
prop
:
'dyInput2'
,
value
:
''
},
{
label
:
'网站应用简介'
,
prop
:
'dyInput3'
,
value
:
''
},
{
label
:
'应用官网'
,
prop
:
'dyInput4'
,
value
:
''
},
{
label
:
'联系人姓名'
,
prop
:
'dyInput5'
,
value
:
''
}
]
},
{
type
:
'6'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'应用类别'
,
prop
:
'dyInput1'
,
value
:
''
},
{
label
:
'授权域回调'
,
prop
:
'dyInput2'
,
value
:
''
},
{
label
:
'网站应用简介'
,
prop
:
'dyInput3'
,
value
:
''
},
{
label
:
'应用官网'
,
prop
:
'dyInput4'
,
value
:
''
},
{
label
:
'联系人姓名'
,
prop
:
'dyInput5'
,
value
:
''
}
]
},
{
type
:
'7'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'8'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'AppKey'
,
prop
:
'appKey'
,
value
:
''
},
{
label
:
'AppSecret'
,
prop
:
'appSecret'
,
value
:
''
}
]
},
{
type
:
'9'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'client_id'
,
prop
:
'client_id'
,
value
:
''
},
{
label
:
'client_secret'
,
prop
:
'client_secret'
,
value
:
''
},
{
label
:
'token URL'
,
prop
:
'token'
,
value
:
''
},
{
label
:
'API URL'
,
prop
:
'apiUrl'
,
value
:
''
}
]
},
{
type
:
'10'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'client_id'
,
prop
:
'client_id'
,
value
:
''
},
{
label
:
'SdkAppId'
,
prop
:
'sdkAppId'
,
value
:
''
},
{
label
:
'token URL'
,
prop
:
'token'
,
value
:
''
},
{
label
:
'API URL'
,
prop
:
'apiUrl'
,
value
:
''
}
]
},
{
type
:
'11'
,
form
:
[{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
}]
},
{
type
:
'12'
,
form
:
[
{
label
:
'链接名称'
,
prop
:
'name'
,
value
:
''
},
{
label
:
'APP类型'
,
prop
:
'appType'
,
value
:
''
},
{
label
:
'AppId'
,
prop
:
'appId'
,
value
:
''
}
]
},
{
type
:
'13'
,
form
:
[{
label
:
'名称'
,
prop
:
'name'
,
value
:
''
}]
}
])
const
formItem
=
computed
(()
=>
{
const
[
data
]
=
formAll
.
value
.
filter
(
item
=>
item
.
type
===
props
.
data
.
type
)
let
dataValue
=
[]
try
{
dataValue
=
Array
.
isArray
(
props
.
data
?.
value
)
?
props
.
data
?.
value
:
JSON
.
parse
(
props
.
data
?.
value
||
''
)
}
catch
(
error
)
{
console
.
log
(
error
)
}
return
props
.
data
?.
value
?
Object
.
assign
(
data
?.
form
,
dataValue
)
:
data
?.
form
})
})
defineExpose
({
formItem
})
function
showItem
(
data
:
ConfigAttribute
)
{
return
!!
configList
.
value
.
find
(
item
=>
item
.
prop
===
data
.
prop
)
}
</
script
>
</
script
>
<
template
>
<
template
>
...
@@ -154,11 +39,13 @@ defineExpose({ formItem })
...
@@ -154,11 +39,13 @@ defineExpose({ formItem })
<div
class=
"content-right"
>
<div
class=
"content-right"
>
<el-form
ref=
"formRef"
label-suffix=
":"
label-width=
"122px"
>
<el-form
ref=
"formRef"
label-suffix=
":"
label-width=
"122px"
>
<el-form-item
label=
"链接类型"
>
<el-form-item
label=
"链接类型"
>
<span>
{{
p
rops
.
data
.
name
}}
</span>
<span>
{{
p
latform
.
type_
name
}}
</span>
</el-form-item>
</el-form-item>
<el-form-item
:label=
"item.label"
:prop=
"item.prop"
v-for=
"item in formItem"
:key=
"item.prop"
>
<template
v-for=
"item in modelValue"
:key=
"item.prop"
>
<el-form-item
:label=
"item.label"
:prop=
"item.prop"
v-if=
"showItem(item)"
>
<el-input
v-model=
"item.value"
placeholder=
"请输入"
></el-input>
<el-input
v-model=
"item.value"
placeholder=
"请输入"
></el-input>
</el-form-item>
</el-form-item>
</
template
>
</el-form>
</el-form>
</div>
</div>
</div>
</div>
...
...
src/modules/connect/types.ts
浏览文件 @
339f967c
...
@@ -10,3 +10,17 @@ export interface DetailsProp {
...
@@ -10,3 +10,17 @@ export interface DetailsProp {
type
:
string
type
:
string
type_name
:
string
type_name
:
string
}
}
export
interface
ConfigAttribute
{
label
:
string
prop
:
string
value
:
string
}
export
interface
PlatformItem
{
type
:
string
type_name
:
string
icon
?:
string
config_attributes
?:
ConfigAttribute
[]
onBeforeNext
?:
(
index
:
number
,
data
:
PlatformItem
)
=>
Promise
<
boolean
>
|
boolean
}
src/modules/connect/views/View.vue
浏览文件 @
339f967c
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
type
{
ConfigAttribute
}
from
'../types'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
Icon
from
'@/components/ConnectionIcon.vue'
import
Icon
from
'@/components/ConnectionIcon.vue'
// import { ElMessageBox } from 'element-plus'
import
{
getConnectionDetails
,
asyncOfficialAccountInfo
,
asyncOfficialAccountUsers
}
from
'../api'
import
{
getConnectionDetails
}
from
'../api'
const
router
=
useRouter
()
const
router
=
useRouter
()
const
route
=
useRoute
()
const
route
=
useRoute
()
// 点击标签弹出详情文案(产品还没提供)
const
connectId
=
computed
<
string
>
(()
=>
(
route
.
query
.
id
as
string
)
||
''
)
// const openMsg = () => {
// // ElMessageBox.alert('成功链接xxxx', '提示', {
// // confirmButtonText: '关闭'
// // })
// }
let
dataDetail
=
$ref
<
any
>
()
let
detail
=
ref
<
any
>
()
onMounted
(()
=>
{
getConnectionDetails
({
id
:
route
.
query
.
id
as
''
}).
then
(
res
=>
{
async
function
fetchInfo
()
{
dataDetail
=
res
.
data
const
res
=
await
getConnectionDetails
({
id
:
connectId
.
value
})
})
detail
.
value
=
res
.
data
}
onMounted
(
fetchInfo
)
const
attributes
=
computed
<
ConfigAttribute
[]
>
(()
=>
{
const
config_attributes
=
detail
.
value
.
config_attributes
||
[]
if
(
typeof
config_attributes
===
'string'
)
{
return
JSON
.
parse
(
config_attributes
)
}
else
{
return
config_attributes
||
[]
}
})
})
function
getAttributeValueByProp
(
prop
:
string
)
{
return
attributes
.
value
.
find
(
item
=>
item
.
prop
===
prop
)?.
value
||
''
}
const
ability
=
[
const
platformList
=
[
{
{
type
:
1
,
type
:
1
,
type_name
:
'公众号'
,
data
:
[
data
:
[
{
{
title
:
'1.从公众号同步'
,
title
:
'1.从公众号同步'
,
child
:
[
children
:
[
{
title
:
'重新获取公众号信息'
,
msg
:
''
},
{
{
title
:
'重新获取公众号粉丝'
,
msg
:
''
},
title
:
'重新获取公众号信息'
,
{
title
:
'获取公众号统计数据'
,
msg
:
''
},
async
onClick
()
{
{
title
:
'获取图文群发评论数据'
,
msg
:
''
}
await
asyncOfficialAccountInfo
({
connection_id
:
connectId
.
value
,
appid
:
getAttributeValueByProp
(
'appid'
)
})
ElMessage
.
success
(
'重新获取公众号信息成功'
)
}
},
{
title
:
'重新获取公众号粉丝'
,
async
onClick
()
{
const
nikeName
=
getAttributeValueByProp
(
'nikeName'
)
await
ElMessageBox
.
confirm
(
`同步微信公众号粉丝能够将微信粉丝的最新信息同步到本系统中,您确定现在要开始同步公众号“
${
nikeName
}
”的粉丝吗?`
,
'同步微信公众号粉丝'
)
await
asyncOfficialAccountUsers
({
connection_id
:
connectId
.
value
,
appid
:
getAttributeValueByProp
(
'appid'
)
})
ElMessage
.
success
(
`已经开始同步公众号“
${
nikeName
}
”的粉丝,完成时间取决于您公众号的粉丝数量,请耐心等待。`
)
}
}
// { title: '获取公众号统计数据', msg: '' },
// { title: '获取图文群发评论数据', msg: '' }
]
]
},
},
{
{
title
:
'2.向公众号同步'
,
title
:
'2.向公众号同步'
,
child
:
[{
title
:
'批量为用户打标签'
,
msg
:
''
}]
child
ren
:
[{
title
:
'批量为用户打标签'
,
msg
:
''
}]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[
child
ren
:
[
{
title
:
'客服会话设置'
,
msg
:
''
},
{
title
:
'客服会话设置'
,
msg
:
''
},
{
title
:
'删除GDPR数据'
,
msg
:
''
}
{
title
:
'删除GDPR数据'
,
msg
:
''
}
]
]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[
child
ren
:
[
{
title
:
'注公众号'
,
msg
:
''
},
{
title
:
'
关
注公众号'
,
msg
:
''
},
{
title
:
'留言文本'
,
msg
:
''
},
{
title
:
'留言文本'
,
msg
:
''
},
{
title
:
'留言图片'
,
msg
:
''
},
{
title
:
'留言图片'
,
msg
:
''
},
{
title
:
'留言语音'
,
msg
:
''
},
{
title
:
'留言语音'
,
msg
:
''
},
...
@@ -64,7 +88,7 @@ const ability = [
...
@@ -64,7 +88,7 @@ const ability = [
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[
child
ren
:
[
{
title
:
'发送文本'
,
msg
:
''
},
{
title
:
'发送文本'
,
msg
:
''
},
{
title
:
'发送模版消息'
,
msg
:
''
},
{
title
:
'发送模版消息'
,
msg
:
''
},
{
title
:
'发送菜单会话'
,
msg
:
''
},
{
title
:
'发送菜单会话'
,
msg
:
''
},
...
@@ -82,35 +106,37 @@ const ability = [
...
@@ -82,35 +106,37 @@ const ability = [
},
},
{
{
type
:
2
,
type
:
2
,
type_name
:
'钉钉'
,
data
:
[
data
:
[
{
{
title
:
'1.从钉钉同步'
,
title
:
'1.从钉钉同步'
,
child
:
[{
title
:
'获取用户信息'
,
msg
:
''
}]
child
ren
:
[{
title
:
'获取用户信息'
,
msg
:
''
}]
},
},
{
{
title
:
'2.向钉钉同步'
,
title
:
'2.向钉钉同步'
,
child
:
[{
title
:
'导入用户信息'
,
msg
:
''
}]
child
ren
:
[{
title
:
'导入用户信息'
,
msg
:
''
}]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[{
title
:
'访问钉钉官方网站'
,
msg
:
''
}]
child
ren
:
[{
title
:
'访问钉钉官方网站'
,
msg
:
''
}]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[{
title
:
'发送消息'
,
msg
:
''
}]
child
ren
:
[{
title
:
'发送消息'
,
msg
:
''
}]
}
}
]
]
},
},
{
{
type
:
3
,
type
:
3
,
type_name
:
'小鹅通'
,
data
:
[
data
:
[
{
{
title
:
'1.从小鹅通同步'
,
title
:
'1.从小鹅通同步'
,
child
:
[
child
ren
:
[
{
title
:
'消息推送'
,
msg
:
''
},
{
title
:
'消息推送'
,
msg
:
''
},
{
title
:
'同步历史用户'
,
msg
:
''
},
{
title
:
'同步历史用户'
,
msg
:
''
},
{
title
:
'同步直播学员签到事件'
,
msg
:
''
}
{
title
:
'同步直播学员签到事件'
,
msg
:
''
}
...
@@ -118,11 +144,11 @@ const ability = [
...
@@ -118,11 +144,11 @@ const ability = [
},
},
{
{
title
:
'2.向小鹅通同步'
,
title
:
'2.向小鹅通同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[
child
ren
:
[
{
title
:
'访问小鹅通官方网站'
,
msg
:
''
},
{
title
:
'访问小鹅通官方网站'
,
msg
:
''
},
{
title
:
'配置用户属性字段映射'
,
msg
:
''
},
{
title
:
'配置用户属性字段映射'
,
msg
:
''
},
{
title
:
'配置事件属性字段映射'
,
msg
:
''
},
{
title
:
'配置事件属性字段映射'
,
msg
:
''
},
...
@@ -131,82 +157,85 @@ const ability = [
...
@@ -131,82 +157,85 @@ const ability = [
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[{
title
:
'新用户注册'
,
msg
:
''
}]
child
ren
:
[{
title
:
'新用户注册'
,
msg
:
''
}]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[]
child
ren
:
[]
}
}
]
]
},
},
{
{
type
:
4
,
type
:
4
,
type_name
:
'问卷星'
,
data
:
[
data
:
[
{
{
title
:
'1.从问卷星同步'
,
title
:
'1.从问卷星同步'
,
child
:
[{
title
:
'同步填写者信息'
,
msg
:
''
}]
child
ren
:
[{
title
:
'同步填写者信息'
,
msg
:
''
}]
},
},
{
{
title
:
'2.向问卷星同步'
,
title
:
'2.向问卷星同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[
child
ren
:
[
{
title
:
'访问问卷星官方网站'
,
msg
:
''
},
{
title
:
'访问问卷星官方网站'
,
msg
:
''
},
{
title
:
'管理表单字段映射'
,
msg
:
''
}
{
title
:
'管理表单字段映射'
,
msg
:
''
}
]
]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[{
title
:
'提交表单'
,
msg
:
''
}]
child
ren
:
[{
title
:
'提交表单'
,
msg
:
''
}]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[]
child
ren
:
[]
}
}
]
]
},
},
{
{
type
:
5
,
type
:
5
,
type_name
:
'今日头条'
,
data
:
[
data
:
[
{
{
title
:
'1.从今日头条同步'
,
title
:
'1.从今日头条同步'
,
child
:
[
child
ren
:
[
{
title
:
'同步头条推广基础数据'
,
msg
:
''
},
{
title
:
'同步头条推广基础数据'
,
msg
:
''
},
{
title
:
'同步头条推广展点消数据'
,
msg
:
''
}
{
title
:
'同步头条推广展点消数据'
,
msg
:
''
}
]
]
},
},
{
{
title
:
'2.向今日头条同步'
,
title
:
'2.向今日头条同步'
,
child
:
[
child
ren
:
[
{
title
:
'飞鱼线索表格导入'
,
msg
:
''
},
{
title
:
'飞鱼线索表格导入'
,
msg
:
''
},
{
title
:
'设置返点系数'
,
msg
:
''
}
{
title
:
'设置返点系数'
,
msg
:
''
}
]
]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[
child
ren
:
[
{
title
:
'访问今日头条投放管理平台'
,
msg
:
''
},
{
title
:
'访问今日头条投放管理平台'
,
msg
:
''
},
{
title
:
'广告效果分析'
,
msg
:
''
}
{
title
:
'广告效果分析'
,
msg
:
''
}
]
]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[]
child
ren
:
[]
}
}
]
]
},
},
{
{
type
:
6
,
type
:
6
,
type_name
:
'抖音'
,
data
:
[
data
:
[
{
{
title
:
'1.从抖音同步'
,
title
:
'1.从抖音同步'
,
child
:
[
child
ren
:
[
{
title
:
'获取用户视频情况'
,
msg
:
''
},
{
title
:
'获取用户视频情况'
,
msg
:
''
},
{
title
:
'获取用户粉丝数'
,
msg
:
''
},
{
title
:
'获取用户粉丝数'
,
msg
:
''
},
{
title
:
'获取用户点赞数'
,
msg
:
''
},
{
title
:
'获取用户点赞数'
,
msg
:
''
},
...
@@ -217,15 +246,15 @@ const ability = [
...
@@ -217,15 +246,15 @@ const ability = [
},
},
{
{
title
:
'2.向抖音同步'
,
title
:
'2.向抖音同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[
child
ren
:
[
{
title
:
'用户发送文本私信'
,
msg
:
''
},
{
title
:
'用户发送文本私信'
,
msg
:
''
},
{
title
:
'用户发送表情私信'
,
msg
:
''
},
{
title
:
'用户发送表情私信'
,
msg
:
''
},
{
title
:
'用户发送卡片私信'
,
msg
:
''
},
{
title
:
'用户发送卡片私信'
,
msg
:
''
},
...
@@ -234,7 +263,7 @@ const ability = [
...
@@ -234,7 +263,7 @@ const ability = [
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[
child
ren
:
[
{
title
:
'向用户发送文本私信'
,
msg
:
''
},
{
title
:
'向用户发送文本私信'
,
msg
:
''
},
{
title
:
'向用户发送图片私信'
,
msg
:
''
},
{
title
:
'向用户发送图片私信'
,
msg
:
''
},
{
title
:
'向用户发送视频私信'
,
msg
:
''
}
{
title
:
'向用户发送视频私信'
,
msg
:
''
}
...
@@ -244,10 +273,11 @@ const ability = [
...
@@ -244,10 +273,11 @@ const ability = [
},
},
{
{
type
:
7
,
type
:
7
,
type_name
:
'微博'
,
data
:
[
data
:
[
{
{
title
:
'1.从微博同步'
,
title
:
'1.从微博同步'
,
child
:
[
child
ren
:
[
{
title
:
'获取用户信息'
,
msg
:
''
},
{
title
:
'获取用户信息'
,
msg
:
''
},
{
title
:
'获取用户私信数'
,
msg
:
''
},
{
title
:
'获取用户私信数'
,
msg
:
''
},
{
title
:
'获取用户关注数'
,
msg
:
''
}
{
title
:
'获取用户关注数'
,
msg
:
''
}
...
@@ -255,22 +285,22 @@ const ability = [
...
@@ -255,22 +285,22 @@ const ability = [
},
},
{
{
title
:
'2.向微博同步'
,
title
:
'2.向微博同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[
child
ren
:
[
{
title
:
'关注微博'
,
msg
:
''
},
{
title
:
'关注微博'
,
msg
:
''
},
{
title
:
'发送私信'
,
msg
:
''
}
{
title
:
'发送私信'
,
msg
:
''
}
]
]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[
child
ren
:
[
{
title
:
'发送私信'
,
msg
:
''
},
{
title
:
'发送私信'
,
msg
:
''
},
{
title
:
'发送图片'
,
msg
:
''
}
{
title
:
'发送图片'
,
msg
:
''
}
]
]
...
@@ -279,10 +309,11 @@ const ability = [
...
@@ -279,10 +309,11 @@ const ability = [
},
},
{
{
type
:
8
,
type
:
8
,
type_name
:
'小红书'
,
data
:
[
data
:
[
{
{
title
:
'1.从小红书同步'
,
title
:
'1.从小红书同步'
,
child
:
[
child
ren
:
[
{
title
:
'获取小红书用户信息'
,
msg
:
''
},
{
title
:
'获取小红书用户信息'
,
msg
:
''
},
{
title
:
'获取主页粉丝数'
,
msg
:
''
},
{
title
:
'获取主页粉丝数'
,
msg
:
''
},
{
title
:
'获取主页赞藏数'
,
msg
:
''
},
{
title
:
'获取主页赞藏数'
,
msg
:
''
},
...
@@ -295,15 +326,15 @@ const ability = [
...
@@ -295,15 +326,15 @@ const ability = [
},
},
{
{
title
:
'2.向小红书同步'
,
title
:
'2.向小红书同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[
child
ren
:
[
{
title
:
'被用户关注'
,
msg
:
''
},
{
title
:
'被用户关注'
,
msg
:
''
},
{
title
:
'主页被点赞'
,
msg
:
''
},
{
title
:
'主页被点赞'
,
msg
:
''
},
{
title
:
'主页被收藏'
,
msg
:
''
},
{
title
:
'主页被收藏'
,
msg
:
''
},
...
@@ -314,94 +345,98 @@ const ability = [
...
@@ -314,94 +345,98 @@ const ability = [
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[]
child
ren
:
[]
}
}
]
]
},
},
{
{
type
:
9
,
type
:
9
,
type_name
:
'邮箱'
,
data
:
[
data
:
[
{
{
title
:
'1.从邮件同步'
,
title
:
'1.从邮件同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'2.向邮件同步'
,
title
:
'2.向邮件同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[{
title
:
'发送邮件'
,
msg
:
''
}]
child
ren
:
[{
title
:
'发送邮件'
,
msg
:
''
}]
}
}
]
]
},
},
{
{
type
:
10
,
type
:
10
,
type_name
:
'短信'
,
data
:
[
data
:
[
{
{
title
:
'1.从短信同步'
,
title
:
'1.从短信同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'2.向短信同步'
,
title
:
'2.向短信同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[
child
ren
:
[
{
title
:
'管理签名'
,
msg
:
''
},
{
title
:
'管理签名'
,
msg
:
''
},
{
title
:
'管理模板'
,
msg
:
''
}
{
title
:
'管理模板'
,
msg
:
''
}
]
]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[{
title
:
'发送短信'
,
msg
:
''
}]
child
ren
:
[{
title
:
'发送短信'
,
msg
:
''
}]
}
}
]
]
},
},
{
{
type
:
11
,
type
:
11
,
type_name
:
'内部消息'
,
data
:
[
data
:
[
{
{
title
:
'1.从内部消息同步'
,
title
:
'1.从内部消息同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'2.向内部消息同步'
,
title
:
'2.向内部消息同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[{
title
:
'发送内部消息'
,
msg
:
''
}]
child
ren
:
[{
title
:
'发送内部消息'
,
msg
:
''
}]
}
}
]
]
},
},
{
{
type
:
12
,
type
:
12
,
type_name
:
'自定义'
,
data
:
[
data
:
[
{
{
title
:
'1.从自定义同步'
,
title
:
'1.从自定义同步'
,
child
:
[
child
ren
:
[
{
title
:
'IOS移动应用接入'
,
msg
:
''
},
{
title
:
'IOS移动应用接入'
,
msg
:
''
},
{
title
:
'安卓移动应用接入'
,
msg
:
''
},
{
title
:
'安卓移动应用接入'
,
msg
:
''
},
{
title
:
'JS SDK接入'
,
msg
:
''
},
{
title
:
'JS SDK接入'
,
msg
:
''
},
...
@@ -411,11 +446,11 @@ const ability = [
...
@@ -411,11 +446,11 @@ const ability = [
},
},
{
{
title
:
'2.向自定义同步'
,
title
:
'2.向自定义同步'
,
child
:
[]
child
ren
:
[]
},
},
{
{
title
:
'3.其他设置'
,
title
:
'3.其他设置'
,
child
:
[
child
ren
:
[
{
title
:
'自定义图元'
,
msg
:
''
},
{
title
:
'自定义图元'
,
msg
:
''
},
{
title
:
'事件元数据'
,
msg
:
''
},
{
title
:
'事件元数据'
,
msg
:
''
},
{
title
:
'删除用户'
,
msg
:
''
}
{
title
:
'删除用户'
,
msg
:
''
}
...
@@ -423,7 +458,7 @@ const ability = [
...
@@ -423,7 +458,7 @@ const ability = [
},
},
{
{
title
:
'4.客户旅程能力:触发条件'
,
title
:
'4.客户旅程能力:触发条件'
,
child
:
[
child
ren
:
[
{
title
:
'访问网页'
,
msg
:
''
},
{
title
:
'访问网页'
,
msg
:
''
},
{
title
:
'激活APP'
,
msg
:
''
},
{
title
:
'激活APP'
,
msg
:
''
},
{
title
:
'启动APP'
,
msg
:
''
},
{
title
:
'启动APP'
,
msg
:
''
},
...
@@ -437,16 +472,17 @@ const ability = [
...
@@ -437,16 +472,17 @@ const ability = [
{
{
title
:
'5.客户旅程能力:执行动作'
,
title
:
'5.客户旅程能力:执行动作'
,
child
:
[]
child
ren
:
[]
}
}
]
]
},
},
{
{
type
:
13
,
type
:
13
,
type_name
:
'卷王'
,
data
:
[
data
:
[
{
{
title
:
''
,
title
:
''
,
child
:
[
child
ren
:
[
{
{
title
:
'访问卷王表单网站'
,
title
:
'访问卷王表单网站'
,
onClick
()
{
onClick
()
{
...
@@ -462,39 +498,50 @@ const ability = [
...
@@ -462,39 +498,50 @@ const ability = [
]
]
}
}
]
]
},
{
type
:
14
,
type_name
:
'小程序'
,
data
:
[]
}
}
]
]
const
abilityItem
=
computed
(()
=>
{
const
platformDataList
=
computed
(()
=>
{
const
[
data
]
=
ability
.
filter
(
item
=>
item
.
type
===
parseInt
(
dataDetail
?.
type
))
return
platformList
.
find
(
item
=>
item
.
type
==
detail
.
value
?.
type
)?.
data
||
[]
return
data
?.
data
})
})
function
handleClick
(
item
:
any
)
{
function
handleClick
(
item
:
any
)
{
item
.
onClick
&&
item
.
onClick
()
item
.
onClick
&&
item
.
onClick
()
}
}
const
iconMap
:
any
=
{
'13'
:
'99'
,
'14'
:
'100'
}
</
script
>
</
script
>
<
template
>
<
template
>
<AppCard
title=
"查看链接"
>
<AppCard
title=
"查看链接"
>
<div
class=
"view-info"
>
<div
class=
"view-info"
v-if=
"detail"
>
<div
class=
"view-info_icon"
>
<div
class=
"view-info_icon"
>
<Icon
:multi
colour=
"true"
:name=
"dataDetail?.type || '0'"
w=
"50"
h=
"50"
></Icon
>
<Icon
:multi
Color=
"true"
:name=
"iconMap[detail.type] || detail.type"
w=
"50"
h=
"50"
/
>
</div>
</div>
<div
class=
"view-info_content"
>
<div
class=
"view-info_content"
>
<p>
链接名称:
{{
dataDetail
?.
type_name
}}
</p>
<p>
连接名称:
{{
getAttributeValueByProp
(
'name'
)
||
detail
.
type_name
}}
</p>
<!--
<p>
公众号类型:订阅号
</p>
-->
<template
v-if=
"detail.type === '1' || detail.type === '14'"
>
<p>
创始人:
{{
dataDetail
?.
created_operator_name
}}
</p>
<p>
公众号类型:
{{
getAttributeValueByProp
(
'level'
)
}}
</p>
<!--
<p>
授权方:xxxxxxxx
</p>
-->
<p>
授权方:
{{
getAttributeValueByProp
(
'nikeName'
)
}}
</p>
<p>
创建时间:
{{
dataDetail
?.
created_time
}}
</p>
</
template
>
<p>
创建人:{{ detail.created_operator_name }}
</p>
<p>
创建时间:{{ detail.created_time }}
</p>
</div>
</div>
</div>
</div>
</AppCard>
</AppCard>
<AppCard
title=
"链接能力"
>
<AppCard
title=
"链接能力"
>
<el-tabs
class=
"tabs-box"
v-for=
"(item, index) in
abilityItem
"
:key=
"index"
>
<el-tabs
class=
"tabs-box"
v-for=
"(item, index) in
platformDataList
"
:key=
"index"
>
<el-tab-pane
:label=
"item.title"
>
<el-tab-pane
:label=
"item.title"
>
<div
class=
"tag-box"
v-if=
"item.child.length"
>
<div
class=
"tag-box"
v-if=
"item.child
ren
.length"
>
<div
class=
"tag"
v-for=
"cItem in item.child"
:key=
"cItem.title"
@
click=
"handleClick(cItem)"
>
{{
cItem
.
title
}}
</div>
<div
class=
"tag"
v-for=
"cItem in item.child
ren
"
:key=
"cItem.title"
@
click=
"handleClick(cItem)"
>
{{ cItem.title }}
</div>
</div>
</div>
<div
class=
"tag-null"
v-else
>
无数据
</div>
<div
class=
"tag-null"
v-else
>
无数据
</div>
</el-tab-pane>
</el-tab-pane>
...
...
src/modules/home/views/Index.vue
浏览文件 @
339f967c
...
@@ -96,17 +96,8 @@ function handleViewEvent(item: any) {
...
@@ -96,17 +96,8 @@ function handleViewEvent(item: any) {
<div
class=
"home-right_content"
>
<div
class=
"home-right_content"
>
<AppCard
class=
"card"
title=
"最近活跃用户跟踪"
>
<AppCard
class=
"card"
title=
"最近活跃用户跟踪"
>
<div
class=
"content-user"
>
<div
class=
"content-user"
>
<div
<div
:class=
"item.isActive ? 'content-user_item active' : 'content-user_item'"
v-for=
"item in userList"
:key=
"item.id"
@
click=
"handleUser(item)"
>
:class=
"item.isActive ? 'content-user_item active' : 'content-user_item'"
<img
:src=
"item.gender === '1' ? 'https://webapp-pub.ezijing.com/pages/assa/dml_boy.png' : 'https://webapp-pub.ezijing.com/pages/assa/dml_girl.png'"
/>
v-for=
"item in userList"
:key=
"item.id"
@
click=
"handleUser(item)"
>
<img
:src=
"
item.gender === '1'
? 'https://webapp-pub.ezijing.com/pages/assa/dml_boy.png'
: 'https://webapp-pub.ezijing.com/pages/assa/dml_girl.png'
"
/>
<div
class=
"name"
>
{{
item
.
name
}}
</div>
<div
class=
"name"
>
{{
item
.
name
}}
</div>
</div>
</div>
</div>
</div>
...
@@ -120,7 +111,7 @@ function handleViewEvent(item: any) {
...
@@ -120,7 +111,7 @@ function handleViewEvent(item: any) {
</div>
</div>
<!--
<Icon
:name=
"item.connection_type"
w=
"30"
h=
"30"
></Icon>
-->
<!--
<Icon
:name=
"item.connection_type"
w=
"30"
h=
"30"
></Icon>
-->
<div
class=
"event"
>
<div
class=
"event"
>
<Icon
class=
"icon"
:name=
"item.connection_type"
:multi
colou
r=
"true"
w=
"24"
h=
"24"
></Icon>
<Icon
class=
"icon"
:name=
"item.connection_type"
:multi
Colo
r=
"true"
w=
"24"
h=
"24"
></Icon>
在
在
<span>
"
{{
item
.
connection_name
}}
"
</span>
上
<span>
"
{{
item
.
connection_name
}}
"
</span>
上
<span
style=
"cursor: pointer"
@
click=
"handleViewEvent(item)"
>
"
{{
item
.
event_name
}}
"
</span>
<span
style=
"cursor: pointer"
@
click=
"handleViewEvent(item)"
>
"
{{
item
.
event_name
}}
"
</span>
...
@@ -131,11 +122,7 @@ function handleViewEvent(item: any) {
...
@@ -131,11 +122,7 @@ function handleViewEvent(item: any) {
</div>
</div>
</div>
</div>
<!-- 事件详情 -->
<!-- 事件详情 -->
<ViewEvent
<ViewEvent
v-model=
"viewEventVisible"
:event=
"currentViewEvent"
:user=
"currentUser"
v-if=
"viewEventVisible && currentViewEvent"
></ViewEvent>
v-model=
"viewEventVisible"
:event=
"currentViewEvent"
:user=
"currentUser"
v-if=
"viewEventVisible && currentViewEvent"
></ViewEvent>
</
template
>
</
template
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
...
src/modules/trip/template/components/BindConnection.vue
浏览文件 @
339f967c
...
@@ -49,31 +49,11 @@ function handleSave() {
...
@@ -49,31 +49,11 @@ function handleSave() {
<
template
>
<
template
>
<el-dialog
title=
"配置连接"
width=
"800px"
append-to-body
@
update:modelValue=
"$emit('update:modelValue')"
>
<el-dialog
title=
"配置连接"
width=
"800px"
append-to-body
@
update:modelValue=
"$emit('update:modelValue')"
>
<div
class=
"connection-list"
>
<div
class=
"connection-list"
>
<div
<div
class=
"connection-item"
v-for=
"item in connectionList"
:key=
"item.id"
:class=
"
{ 'is-active': isActive(item) }" @click="toggleSelection(item)">
class=
"connection-item"
v-for=
"item in connectionList"
:key=
"item.id"
:class=
"
{ 'is-active': isActive(item) }"
@click="toggleSelection(item)"
>
<el-checkbox
@
change=
"toggleSelection(item)"
:model-value=
"isActive(item)"
/>
<el-checkbox
@
change=
"toggleSelection(item)"
:model-value=
"isActive(item)"
/>
<div
:class=
"isActive(item) ? 'connection-item__icon active' : 'connection-item__icon'"
>
<div
:class=
"isActive(item) ? 'connection-item__icon active' : 'connection-item__icon'"
>
<ConnectionIcon
<ConnectionIcon
style=
"transform: translateY(3px)"
v-if=
"isActive(item)"
color=
"#fff"
:name=
"item.type + ''"
w=
"20"
h=
"20"
/>
style=
"transform: translateY(3px)"
<ConnectionIcon
style=
"transform: translateY(3px)"
v-else
:multiColor=
"true"
:name=
"item.type + ''"
w=
"20"
h=
"20"
/>
v-if=
"isActive(item)"
color=
"#fff"
:name=
"item.type + ''"
w=
"20"
h=
"20"
/>
<ConnectionIcon
style=
"transform: translateY(3px)"
v-else
:multicolour=
"true"
:name=
"item.type + ''"
w=
"20"
h=
"20"
/>
</div>
</div>
<p
:style=
"`color: $
{isActive(item)
&&
'#ba143e'}`">
{{
item
.
name
}}
</p>
<p
:style=
"`color: $
{isActive(item)
&&
'#ba143e'}`">
{{
item
.
name
}}
</p>
</div>
</div>
...
...
src/modules/user/views/Image.vue
浏览文件 @
339f967c
...
@@ -130,7 +130,7 @@ function handleViewEvent(item: any) {
...
@@ -130,7 +130,7 @@ function handleViewEvent(item: any) {
{{
item
.
updated_time
?.
slice
(
item
.
updated_time
.
indexOf
(
' '
),
item
.
updated_time
.
length
-
3
)
}}
{{
item
.
updated_time
?.
slice
(
item
.
updated_time
.
indexOf
(
' '
),
item
.
updated_time
.
length
-
3
)
}}
{{
getDate
(
item
.
updated_time
)
}}
{{
getDate
(
item
.
updated_time
)
}}
</div>
</div>
<Icon
class=
"icon"
:multi
colou
r=
"true"
:name=
"item.connection_type"
w=
"20"
h=
"20"
></Icon>
<Icon
class=
"icon"
:multi
Colo
r=
"true"
:name=
"item.connection_type"
w=
"20"
h=
"20"
></Icon>
<div
class=
"event"
>
<div
class=
"event"
>
在
<span>
"
{{
item
.
connection_name
}}
"
</span>
上
在
<span>
"
{{
item
.
connection_name
}}
"
</span>
上
<span
style=
"cursor: pointer"
@
click=
"handleViewEvent(item)"
>
"
{{
item
.
event_name
}}
"
</span>
<span
style=
"cursor: pointer"
@
click=
"handleViewEvent(item)"
>
"
{{
item
.
event_name
}}
"
</span>
...
...
vite.config.ts
浏览文件 @
339f967c
...
@@ -10,7 +10,7 @@ import AutoImport from 'unplugin-auto-import/vite'
...
@@ -10,7 +10,7 @@ import AutoImport from 'unplugin-auto-import/vite'
export
default
defineConfig
(({
mode
})
=>
({
export
default
defineConfig
(({
mode
})
=>
({
base
:
mode
===
'prod'
?
'https://webapp-pub.ezijing.com/website/prod/saas-dml/'
:
'/'
,
base
:
mode
===
'prod'
?
'https://webapp-pub.ezijing.com/website/prod/saas-dml/'
:
'/'
,
plugins
:
[
plugins
:
[
vue
({
reactivityTransform
:
true
}),
vue
({
script
:
{
defineModel
:
true
},
reactivityTransform
:
true
}),
AutoImport
({
AutoImport
({
imports
:
[
'vue'
,
'vue/macros'
,
'vue-router'
,
'@vueuse/core'
],
imports
:
[
'vue'
,
'vue/macros'
,
'vue-router'
,
'@vueuse/core'
],
dts
:
true
,
dts
:
true
,
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论