Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
f8a86cbc
authored
Apr 19, 2023
by
dhb52
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: mp/WxReply重构,拆分组件
parent
cddf1ee8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
763 additions
and
56 deletions
+763
-56
src/views/mp/components/wx-msg/main.vue
+5
-8
src/views/mp/components/wx-reply/components/TabImage.vue
+172
-0
src/views/mp/components/wx-reply/components/TabMusic.vue
+121
-0
src/views/mp/components/wx-reply/components/TabNews.vue
+78
-0
src/views/mp/components/wx-reply/components/TabText.vue
+29
-0
src/views/mp/components/wx-reply/components/TabVideo.vue
+132
-0
src/views/mp/components/wx-reply/components/TabVoice.vue
+162
-0
src/views/mp/components/wx-reply/components/types.ts
+25
-0
src/views/mp/components/wx-reply/main.vue
+0
-0
src/views/mp/components/wx-video-play/main.vue
+30
-44
src/views/mp/components/wx-voice-play/main.vue
+8
-3
src/views/mp/menu/index.vue
+1
-1
No files found.
src/views/mp/components/wx-msg/main.vue
View file @
f8a86cbc
...
@@ -126,7 +126,7 @@
...
@@ -126,7 +126,7 @@
</div>
</div>
<div
class=
"msg-send"
v-loading=
"sendLoading"
>
<div
class=
"msg-send"
v-loading=
"sendLoading"
>
<WxReplySelect
ref=
"replySelectRef"
:objData=
"objData"
/>
<WxReplySelect
ref=
"replySelectRef"
:objData=
"objData"
/>
<el-button
type=
"success"
size=
"small"
class=
"send-but"
@
click=
"sendMsg"
>
发送(S)
</el-button>
<el-button
type=
"success"
class=
"send-but"
@
click=
"sendMsg"
>
发送(S)
</el-button>
</div>
</div>
</ContentWrap>
</ContentWrap>
</
template
>
</
template
>
...
@@ -231,12 +231,8 @@ const sendMsg = async () => {
...
@@ -231,12 +231,8 @@ const sendMsg = async () => {
list
.
value
=
[...
list
.
value
,
...[
data
]]
list
.
value
=
[...
list
.
value
,
...[
data
]]
scrollToBottom
()
scrollToBottom
()
//ts检查的時候会判断这个组件可能是空的,所以需要进行断言。
// 发送后清空数据
//避免 tab 的数据未清理
replySelectRef
.
value
?.
clear
()
const
deleteObj
=
replySelectRef
.
value
?.
deleteObj
if
(
deleteObj
)
{
deleteObj
()
}
}
}
const
loadingMore
=
()
=>
{
const
loadingMore
=
()
=>
{
...
@@ -333,6 +329,7 @@ const scrollToBottom = () => {
...
@@ -333,6 +329,7 @@ const scrollToBottom = () => {
.send-but
{
.send-but
{
float
:
right
;
float
:
right
;
margin-top
:
8px
!important
;
margin-top
:
8px
;
margin-bottom
:
8px
;
}
}
</
style
>
</
style
>
src/views/mp/components/wx-reply/components/TabImage.vue
0 → 100644
View file @
f8a86cbc
<
template
>
<el-tab-pane
name=
"image"
>
<template
#
label
>
<el-row
align=
"middle"
><Icon
icon=
"ep:picture"
class=
"mr-5px"
/>
图片
</el-row>
</
template
>
<!-- 情况一:已经选择好素材、或者上传好图片 -->
<div
class=
"select-item"
v-if=
"objData.url"
>
<img
class=
"material-img"
:src=
"objData.url"
/>
<p
class=
"item-name"
v-if=
"objData.name"
>
{{ objData.name }}
</p>
<el-row
class=
"ope-row"
justify=
"center"
>
<el-button
type=
"danger"
circle
@
click=
"onDelete"
>
<Icon
icon=
"ep:delete"
/>
</el-button>
</el-row>
</div>
<!-- 情况二:未做完上述操作 -->
<el-row
v-else
style=
"text-align: center"
align=
"middle"
>
<!-- 选择素材 -->
<el-col
:span=
"12"
class=
"col-select"
>
<el-button
type=
"success"
@
click=
"showDialog = true"
>
素材库选择
<Icon
icon=
"ep:circle-check"
/>
</el-button>
<el-dialog
title=
"选择图片"
v-model=
"showDialog"
width=
"90%"
append-to-body
destroy-on-close
>
<WxMaterialSelect
:objData=
"objData"
@
select-material=
"selectMaterial"
/>
</el-dialog>
</el-col>
<!-- 文件上传 -->
<el-col
:span=
"12"
class=
"col-add"
>
<el-upload
:action=
"UPLOAD_URL"
:headers=
"HEADERS"
multiple
:limit=
"1"
:file-list=
"fileList"
:data=
"uploadData"
:before-upload=
"beforeImageUpload"
:on-success=
"onUploadSuccess"
>
<el-button
type=
"primary"
>
上传图片
</el-button>
<
template
#
tip
>
<span>
<div
class=
"el-upload__tip"
>
支持 bmp/png/jpeg/jpg/gif 格式,大小不超过 2M
</div>
</span>
</
template
>
</el-upload>
</el-col>
</el-row>
</el-tab-pane>
</template>
<
script
setup
lang=
"ts"
>
import
WxMaterialSelect
from
'@/views/mp/components/wx-material-select/main.vue'
import
{
MaterialType
,
useBeforeUpload
}
from
'@/views/mp/hooks/useUpload'
import
type
{
UploadRawFile
}
from
'element-plus'
import
{
getAccessToken
}
from
'@/utils/auth'
import
{
ObjData
}
from
'./types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
// 设置上传的请求头部
const
props
=
defineProps
<
{
modelValue
:
ObjData
}
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
ObjData
)
}
>
()
const
objData
=
computed
<
ObjData
>
({
get
:
()
=>
props
.
modelValue
,
set
:
(
val
)
=>
emit
(
'update:modelValue'
,
val
)
})
const
showDialog
=
ref
(
false
)
const
fileList
=
ref
([])
const
uploadData
=
reactive
({
accountId
:
objData
.
value
.
accountId
,
type
:
'image'
,
title
:
''
,
introduction
:
''
})
const
beforeImageUpload
=
(
rawFile
:
UploadRawFile
)
=>
useBeforeUpload
(
MaterialType
.
Image
,
2
)(
rawFile
)
const
onUploadSuccess
=
(
res
:
any
)
=>
{
if
(
res
.
code
!==
0
)
{
message
.
error
(
'上传出错:'
+
res
.
msg
)
return
false
}
// 清空上传时的各种数据
fileList
.
value
=
[]
uploadData
.
title
=
''
uploadData
.
introduction
=
''
// 上传好的文件,本质是个素材,所以可以进行选中
selectMaterial
(
res
.
data
)
}
const
onDelete
=
()
=>
{
objData
.
value
.
mediaId
=
null
objData
.
value
.
url
=
null
objData
.
value
.
name
=
null
}
const
selectMaterial
=
(
item
)
=>
{
showDialog
.
value
=
false
objData
.
value
.
type
=
'image'
objData
.
value
.
mediaId
=
item
.
mediaId
objData
.
value
.
url
=
item
.
url
objData
.
value
.
name
=
item
.
name
}
</
script
>
<
style
lang=
"scss"
scoped
>
.select-item
{
width
:
280px
;
padding
:
10px
;
margin
:
0
auto
10px
auto
;
border
:
1px
solid
#eaeaea
;
.material-img
{
width
:
100%
;
}
.item-name
{
font-size
:
12px
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
text-align
:
center
;
.item-infos
{
width
:
30%
;
margin
:
auto
;
}
.ope-row
{
padding-top
:
10px
;
text-align
:
center
;
}
}
.col-select
{
border
:
1px
solid
rgb
(
234
,
234
,
234
);
padding
:
50px
0px
;
height
:
160px
;
width
:
49.5%
;
}
.col-add
{
border
:
1px
solid
rgb
(
234
,
234
,
234
);
padding
:
50px
0px
;
height
:
160px
;
width
:
49.5%
;
float
:
right
;
.el-upload__tip
{
line-height
:
18px
;
text-align
:
center
;
}
}
}
</
style
>
src/views/mp/components/wx-reply/components/TabMusic.vue
0 → 100644
View file @
f8a86cbc
<
template
>
<el-tab-pane
name=
"music"
>
<template
#
label
>
<el-row
align=
"middle"
><Icon
icon=
"ep:service"
/>
音乐
</el-row>
</
template
>
<el-row
align=
"middle"
justify=
"center"
>
<el-col
:span=
"6"
>
<el-row
align=
"middle"
justify=
"center"
class=
"thumb-div"
>
<el-col
:span=
"24"
>
<el-row
align=
"middle"
justify=
"center"
>
<img
style=
"width: 100px"
v-if=
"objData.thumbMediaUrl"
:src=
"objData.thumbMediaUrl"
/>
<icon
v-else
icon=
"ep:plus"
/>
</el-row>
<el-row
align=
"middle"
justify=
"center"
style=
"margin-top: 2%"
>
<div
class=
"thumb-but"
>
<el-upload
:action=
"UPLOAD_URL"
:headers=
"HEADERS"
multiple
:limit=
"1"
:file-list=
"fileList"
:data=
"uploadData"
:before-upload=
"beforeImageUpload"
:on-success=
"onUploadSuccess"
>
<
template
#
trigger
>
<el-button
type=
"primary"
link
>
本地上传
</el-button>
</
template
>
<el-button
type=
"primary"
link
@
click=
"showDialog = true"
style=
"margin-left: 5px"
>
素材库选择
</el-button>
</el-upload>
</div>
</el-row>
</el-col>
</el-row>
<el-dialog
title=
"选择图片"
v-model=
"showDialog"
width=
"80%"
append-to-body
destroy-on-close
>
<WxMaterialSelect
:objData=
"{ type: 'image', accountId: objData.accountId }"
@
select-material=
"selectMaterial"
/>
</el-dialog>
</el-col>
<el-col
:span=
"18"
>
<el-input
v-model=
"objData.title"
placeholder=
"请输入标题"
/>
<div
style=
"margin: 20px 0"
></div>
<el-input
v-model=
"objData.description"
placeholder=
"请输入描述"
/>
</el-col>
</el-row>
<div
style=
"margin: 20px 0"
></div>
<el-input
v-model=
"objData.musicUrl"
placeholder=
"请输入音乐链接"
/>
<div
style=
"margin: 20px 0"
></div>
<el-input
v-model=
"objData.hqMusicUrl"
placeholder=
"请输入高质量音乐链接"
/>
</el-tab-pane>
</template>
<
script
setup
lang=
"ts"
>
import
WxMaterialSelect
from
'@/views/mp/components/wx-material-select/main.vue'
import
type
{
UploadRawFile
}
from
'element-plus'
import
{
MaterialType
,
useBeforeUpload
}
from
'@/views/mp/hooks/useUpload'
import
{
getAccessToken
}
from
'@/utils/auth'
import
{
ObjData
}
from
'./types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
// 设置上传的请求头部
const
props
=
defineProps
<
{
modelValue
:
ObjData
}
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
ObjData
)
}
>
()
const
objData
=
computed
<
ObjData
>
({
get
:
()
=>
props
.
modelValue
,
set
:
(
val
)
=>
emit
(
'update:modelValue'
,
val
)
})
const
showDialog
=
ref
(
false
)
const
fileList
=
ref
([])
const
uploadData
=
reactive
({
accountId
:
objData
.
value
.
accountId
,
type
:
'thumb'
,
// 音乐类型为thumb
title
:
''
,
introduction
:
''
})
const
beforeImageUpload
=
(
rawFile
:
UploadRawFile
)
=>
useBeforeUpload
(
MaterialType
.
Image
,
2
)(
rawFile
)
const
onUploadSuccess
=
(
res
:
any
)
=>
{
if
(
res
.
code
!==
0
)
{
message
.
error
(
'上传出错:'
+
res
.
msg
)
return
false
}
// 清空上传时的各种数据
fileList
.
value
=
[]
uploadData
.
title
=
''
uploadData
.
introduction
=
''
// 上传好的文件,本质是个素材,所以可以进行选中
selectMaterial
(
res
.
data
)
}
const
selectMaterial
=
(
item
:
any
)
=>
{
showDialog
.
value
=
false
objData
.
value
.
thumbMediaId
=
item
.
mediaId
objData
.
value
.
thumbMediaUrl
=
item
.
url
}
</
script
>
<
style
scoped
></
style
>
src/views/mp/components/wx-reply/components/TabNews.vue
0 → 100644
View file @
f8a86cbc
<
template
>
<el-tab-pane
name=
"news"
>
<template
#
label
>
<el-row
align=
"middle"
><Icon
icon=
"ep:reading"
/>
图文
</el-row>
</
template
>
<el-row>
<div
class=
"select-item"
v-if=
"objData.articles?.length > 0"
>
<WxNews
:articles=
"objData.articles"
/>
<el-col
class=
"ope-row"
>
<el-button
type=
"danger"
circle
@
click=
"onDelete"
>
<Icon
icon=
"ep:delete"
/>
</el-button>
</el-col>
</div>
<!-- 选择素材 -->
<el-col
:span=
"24"
v-if=
"!objData.content"
>
<el-row
style=
"text-align: center"
align=
"middle"
>
<el-col
:span=
"24"
>
<el-button
type=
"success"
@
click=
"showDialog = true"
>
{{ newsType === NewsType.Published ? '选择已发布图文' : '选择草稿箱图文' }}
<icon
icon=
"ep:circle-check"
/>
</el-button>
</el-col>
</el-row>
</el-col>
<el-dialog
title=
"选择图文"
v-model=
"showDialog"
width=
"90%"
append-to-body
destroy-on-close
>
<WxMaterialSelect
:objData=
"objData"
@
select-material=
"selectMaterial"
:newsType=
"newsType"
/>
</el-dialog>
</el-row>
</el-tab-pane>
</template>
<
script
setup
lang=
"ts"
>
import
WxNews
from
'@/views/mp/components/wx-news/main.vue'
import
WxMaterialSelect
from
'@/views/mp/components/wx-material-select/main.vue'
import
{
ObjData
,
NewsType
}
from
'./types'
const
props
=
defineProps
<
{
modelValue
:
ObjData
newsType
:
NewsType
}
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
ObjData
)
}
>
()
const
objData
=
computed
<
ObjData
>
({
get
:
()
=>
props
.
modelValue
,
set
:
(
val
)
=>
emit
(
'update:modelValue'
,
val
)
})
const
showDialog
=
ref
(
false
)
const
selectMaterial
=
(
item
:
any
)
=>
{
showDialog
.
value
=
false
objData
.
value
.
articles
=
item
.
content
.
newsItem
}
const
onDelete
=
()
=>
{
objData
.
value
.
articles
=
[]
}
</
script
>
<
style
lang=
"scss"
scoped
>
.select-item
{
width
:
280px
;
padding
:
10px
;
margin
:
0
auto
10px
auto
;
border
:
1px
solid
#eaeaea
;
.ope-row
{
padding-top
:
10px
;
text-align
:
center
;
}
}
</
style
>
src/views/mp/components/wx-reply/components/TabText.vue
0 → 100644
View file @
f8a86cbc
<
template
>
<el-tab-pane
name=
"text"
>
<template
#
label
>
<el-row
align=
"middle"
><Icon
icon=
"ep:document"
/>
文本
</el-row>
</
template
>
<el-input
type=
"textarea"
:rows=
"5"
placeholder=
"请输入内容"
v-model=
"content"
/>
</el-tab-pane>
</template>
<
script
setup
lang=
"ts"
>
const
props
=
defineProps
<
{
modelValue
:
string
|
null
}
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
string
|
null
)
(
e
:
'input'
,
v
:
string
|
null
)
}
>
()
const
content
=
computed
<
string
|
null
>
({
get
:
()
=>
props
.
modelValue
,
set
:
(
val
:
string
|
null
)
=>
{
emit
(
'update:modelValue'
,
val
)
emit
(
'input'
,
val
)
}
})
</
script
>
<
style
scoped
></
style
>
src/views/mp/components/wx-reply/components/TabVideo.vue
0 → 100644
View file @
f8a86cbc
<
template
>
<el-tab-pane
name=
"video"
>
<template
#
label
>
<el-row
align=
"middle"
><Icon
icon=
"ep:share"
/>
视频
</el-row>
</
template
>
<el-row>
<el-input
v-model=
"objData.title"
class=
"input-margin-bottom"
placeholder=
"请输入标题"
/>
<el-input
class=
"input-margin-bottom"
v-model=
"objData.description"
placeholder=
"请输入描述"
/>
<el-row
class=
"ope-row"
justify=
"center"
>
<WxVideoPlayer
v-if=
"objData.url"
:url=
"objData.url"
/>
</el-row>
<el-col>
<el-row
style=
"text-align: center"
align=
"middle"
>
<!-- 选择素材 -->
<el-col
:span=
"12"
>
<el-button
type=
"success"
@
click=
"showDialog = true"
>
素材库选择
<Icon
icon=
"ep:circle-check"
/>
</el-button>
<el-dialog
title=
"选择视频"
v-model=
"showDialog"
width=
"90%"
append-to-body
destroy-on-close
>
<WxMaterialSelect
:objData=
"objData"
@
select-material=
"selectMaterial"
/>
</el-dialog>
</el-col>
<!-- 文件上传 -->
<el-col
:span=
"12"
>
<el-upload
:action=
"UPLOAD_URL"
:headers=
"HEADERS"
multiple
:limit=
"1"
:file-list=
"fileList"
:data=
"uploadData"
:before-upload=
"beforeVideoUpload"
:on-success=
"onUploadSuccess"
>
<el-button
type=
"primary"
>
新建视频
<Icon
icon=
"ep:upload"
/></el-button>
</el-upload>
</el-col>
</el-row>
</el-col>
</el-row>
</el-tab-pane>
</template>
<
script
setup
lang=
"ts"
>
import
WxVideoPlayer
from
'@/views/mp/components/wx-video-play/main.vue'
import
WxMaterialSelect
from
'@/views/mp/components/wx-material-select/main.vue'
import
type
{
UploadRawFile
}
from
'element-plus'
import
{
MaterialType
,
useBeforeUpload
}
from
'@/views/mp/hooks/useUpload'
import
{
getAccessToken
}
from
'@/utils/auth'
import
{
ObjData
}
from
'./types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
const
props
=
defineProps
<
{
modelValue
:
ObjData
}
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
ObjData
)
}
>
()
const
objData
=
computed
<
ObjData
>
({
get
:
()
=>
props
.
modelValue
,
set
:
(
val
)
=>
emit
(
'update:modelValue'
,
val
)
})
const
showDialog
=
ref
(
false
)
const
fileList
=
ref
([])
const
uploadData
=
reactive
({
accountId
:
objData
.
value
.
accountId
,
type
:
'video'
,
title
:
''
,
introduction
:
''
})
const
beforeVideoUpload
=
(
rawFile
:
UploadRawFile
)
=>
useBeforeUpload
(
MaterialType
.
Video
,
10
)(
rawFile
)
const
onUploadSuccess
=
(
res
:
any
)
=>
{
if
(
res
.
code
!==
0
)
{
message
.
error
(
'上传出错:'
+
res
.
msg
)
return
false
}
// 清空上传时的各种数据
fileList
.
value
=
[]
uploadData
.
title
=
''
uploadData
.
introduction
=
''
selectMaterial
(
res
.
data
)
}
/** 选择素材后设置 */
const
selectMaterial
=
(
item
:
any
)
=>
{
showDialog
.
value
=
false
objData
.
value
.
mediaId
=
item
.
mediaId
objData
.
value
.
url
=
item
.
url
objData
.
value
.
name
=
item
.
name
// title、introduction:从 item 到 tempObjItem,因为素材里有 title、introduction
if
(
item
.
title
)
{
objData
.
value
.
title
=
item
.
title
||
''
}
if
(
item
.
introduction
)
{
objData
.
value
.
description
=
item
.
introduction
||
''
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.input-margin-bottom
{
margin-bottom
:
2%
;
}
.ope-row
{
width
:
100%
;
padding-top
:
10px
;
text-align
:
center
;
}
</
style
>
src/views/mp/components/wx-reply/components/TabVoice.vue
0 → 100644
View file @
f8a86cbc
<
template
>
<el-tab-pane
name=
"voice"
>
<template
#
label
>
<el-row
align=
"middle"
><Icon
icon=
"ep:phone"
/>
语音
</el-row>
</
template
>
<div
class=
"select-item2"
v-if=
"objData.url"
>
<p
class=
"item-name"
>
{{ objData.name }}
</p>
<el-row
class=
"ope-row"
justify=
"center"
>
<WxVoicePlayer
:url=
"objData.url"
/>
</el-row>
<el-row
class=
"ope-row"
justify=
"center"
>
<el-button
type=
"danger"
circle
@
click=
"onDelete"
><Icon
icon=
"ep:delete"
/></el-button>
</el-row>
</div>
<el-row
v-else
style=
"text-align: center"
>
<!-- 选择素材 -->
<el-col
:span=
"12"
class=
"col-select"
>
<el-button
type=
"success"
@
click=
"showDialog = true"
>
素材库选择
<Icon
icon=
"ep:circle-check"
/>
</el-button>
<el-dialog
title=
"选择语音"
v-model=
"showDialog"
width=
"90%"
append-to-body
destroy-on-close
>
<WxMaterialSelect
:objData=
"objData"
@
select-material=
"selectMaterial"
/>
</el-dialog>
</el-col>
<!-- 文件上传 -->
<el-col
:span=
"12"
class=
"col-add"
>
<el-upload
:action=
"UPLOAD_URL"
:headers=
"HEADERS"
multiple
:limit=
"1"
:file-list=
"fileList"
:data=
"uploadData"
:before-upload=
"beforeVoiceUpload"
:on-success=
"onUploadSuccess"
>
<el-button
type=
"primary"
>
点击上传
</el-button>
<
template
#
tip
>
<div
class=
"el-upload__tip"
>
格式支持 mp3/wma/wav/amr,文件大小不超过 2M,播放长度不超过 60s
</div>
</
template
>
</el-upload>
</el-col>
</el-row>
</el-tab-pane>
</template>
<
script
setup
lang=
"ts"
>
import
WxMaterialSelect
from
'@/views/mp/components/wx-material-select/main.vue'
import
WxVoicePlayer
from
'@/views/mp/components/wx-voice-play/main.vue'
import
{
MaterialType
,
useBeforeUpload
}
from
'@/views/mp/hooks/useUpload'
import
type
{
UploadRawFile
}
from
'element-plus'
import
{
getAccessToken
}
from
'@/utils/auth'
import
{
ObjData
}
from
'./types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
// 设置上传的请求头部
const
props
=
defineProps
<
{
modelValue
:
ObjData
}
>
()
const
emit
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
ObjData
)
}
>
()
const
objData
=
computed
<
ObjData
>
({
get
:
()
=>
props
.
modelValue
,
set
:
(
val
)
=>
emit
(
'update:modelValue'
,
val
)
})
const
showDialog
=
ref
(
false
)
const
fileList
=
ref
([])
const
uploadData
=
reactive
({
accountId
:
objData
.
value
.
accountId
,
type
:
'voice'
,
title
:
''
,
introduction
:
''
})
const
beforeVoiceUpload
=
(
rawFile
:
UploadRawFile
)
=>
useBeforeUpload
(
MaterialType
.
Voice
,
10
)(
rawFile
)
const
onUploadSuccess
=
(
res
:
any
)
=>
{
if
(
res
.
code
!==
0
)
{
message
.
error
(
'上传出错:'
+
res
.
msg
)
return
false
}
// 清空上传时的各种数据
fileList
.
value
=
[]
uploadData
.
title
=
''
uploadData
.
introduction
=
''
// 上传好的文件,本质是个素材,所以可以进行选中
selectMaterial
(
res
.
data
)
}
const
onDelete
=
()
=>
{
objData
.
value
.
mediaId
=
null
objData
.
value
.
url
=
null
objData
.
value
.
name
=
null
}
const
selectMaterial
=
(
item
:
ObjData
)
=>
{
showDialog
.
value
=
false
objData
.
value
.
type
=
'voice'
objData
.
value
.
mediaId
=
item
.
mediaId
objData
.
value
.
url
=
item
.
url
objData
.
value
.
name
=
item
.
name
}
</
script
>
<
style
lang=
"scss"
scoped
>
.select-item2
{
padding
:
10px
;
margin
:
0
auto
10px
auto
;
border
:
1px
solid
#eaeaea
;
.item-name
{
font-size
:
12px
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
text-align
:
center
;
.ope-row
{
width
:
100%
;
padding-top
:
10px
;
text-align
:
center
;
}
}
.col-select
{
border
:
1px
solid
rgb
(
234
,
234
,
234
);
padding
:
50px
0px
;
height
:
160px
;
width
:
49.5%
;
}
.col-add
{
border
:
1px
solid
rgb
(
234
,
234
,
234
);
padding
:
50px
0px
;
height
:
160px
;
width
:
49.5%
;
float
:
right
;
.el-upload__tip
{
line-height
:
18px
;
text-align
:
center
;
}
}
}
</
style
>
src/views/mp/components/wx-reply/components/types.ts
0 → 100644
View file @
f8a86cbc
type
ReplyType
=
''
|
'news'
|
'image'
|
'voice'
|
'video'
|
'music'
|
'text'
interface
ObjData
{
accountId
:
number
type
:
ReplyType
name
:
string
|
null
content
:
string
|
null
mediaId
:
string
|
null
url
:
string
|
null
title
:
string
|
null
description
:
string
|
null
thumbMediaId
:
string
|
null
thumbMediaUrl
:
string
|
null
musicUrl
:
string
|
null
hqMusicUrl
:
string
|
null
introduction
:
string
|
null
articles
:
any
[]
}
enum
NewsType
{
Published
=
'1'
,
Draft
=
'2'
}
export
{
ObjData
,
NewsType
}
src/views/mp/components/wx-reply/main.vue
View file @
f8a86cbc
This diff is collapsed.
Click to expand it.
src/views/mp/components/wx-video-play/main.vue
View file @
f8a86cbc
...
@@ -14,26 +14,24 @@
...
@@ -14,26 +14,24 @@
<div
@
click=
"playVideo()"
>
<div
@
click=
"playVideo()"
>
<!-- 提示 -->
<!-- 提示 -->
<div>
<div>
<Icon
icon=
"ep:video-play"
class=
"mr-5px"
/>
<Icon
icon=
"ep:video-play"
:size=
"32"
class=
"mr-5px"
/>
<p>
点击播放视频
</p>
<p
class=
"text-sm"
>
点击播放视频
</p>
</div>
</div>
<!-- 弹窗播放 -->
<!-- 弹窗播放 -->
<el-dialog
v-model=
"dialogVideo"
title=
"视频播放"
width=
"40%"
append-to-body
>
<el-dialog
v-model=
"dialogVideo"
title=
"视频播放"
append-to-body
>
<template
#
footer
>
<video-player
<video-player
v-if=
"dialogVideo"
v-if=
"dialogVideo"
class=
"video-player vjs-big-play-centered"
class=
"video-player vjs-big-play-centered"
:src=
"props.url"
:src=
"url"
poster=
""
poster=
""
crossorigin=
"anonymous"
crossorigin=
"anonymous"
playsinline
playsinline
controls
controls
:volume=
"0.6"
:volume=
"0.6"
:width=
"800"
:height=
"320"
:playback-rates=
"[0.7, 1.0, 1.5, 2.0]"
:playback-rates=
"[0.7, 1.0, 1.5, 2.0]"
/>
/>
</
template
>
<!-- 事件,暫時沒用
<!-- 事件,暫時沒用
@mounted="handleMounted"-->
@mounted="handleMounted"-->
<!-- @ready="handleEvent($event)"-->
<!-- @ready="handleEvent($event)"-->
...
@@ -50,36 +48,24 @@
...
@@ -50,36 +48,24 @@
</div>
</div>
</
template
>
</
template
>
<
script
lang=
"ts"
name=
"WxVideoPlayer"
>
<
script
setup
lang=
"ts"
name=
"WxVideoPlayer"
>
//升级videojs6.0版本,重寫6.0版本
import
'video.js/dist/video-js.css'
import
'video.js/dist/video-js.css'
import
{
defineComponent
}
from
'vue'
import
{
VideoPlayer
}
from
'@videojs-player/vue'
import
{
VideoPlayer
}
from
'@videojs-player/vue'
import
'video.js/dist/video-js.css'
export
default
defineComponent
({
components
:
{
VideoPlayer
},
props
:
{
url
:
{
// 视频地址,例如说:https://vjs.zencdn.net/v/oceans.mp4
type
:
String
,
required
:
true
}
},
setup
()
{
// const videoPlayerRef = ref(null)
const
dialogVideo
=
ref
(
false
)
const
handleEvent
=
(
log
)
=>
{
console
.
log
(
'Basic player event'
,
log
)
}
const
playVideo
=
()
=>
{
dialogVideo
.
value
=
true
}
return
{
handleEvent
,
playVideo
,
dialogVideo
}
const
props
=
defineProps
({
url
:
{
type
:
String
,
required
:
true
}
}
})
})
const
dialogVideo
=
ref
(
false
)
// const handleEvent = (log) => {
// console.log('Basic player event', log)
// }
const
playVideo
=
()
=>
{
dialogVideo
.
value
=
true
}
</
script
>
</
script
>
src/views/mp/components/wx-voice-play/main.vue
View file @
f8a86cbc
...
@@ -12,8 +12,8 @@
...
@@ -12,8 +12,8 @@
<
template
>
<
template
>
<div
class=
"wx-voice-div"
@
click=
"playVoice"
>
<div
class=
"wx-voice-div"
@
click=
"playVoice"
>
<el-icon>
<el-icon>
<Icon
v-if=
"playing !== true"
icon=
"ep:video-play"
/>
<Icon
v-if=
"playing !== true"
icon=
"ep:video-play"
:size=
"32"
/>
<Icon
v-else
icon=
"ep:video-pause"
/>
<Icon
v-else
icon=
"ep:video-pause"
:size=
"32"
/>
<span
class=
"amr-duration"
v-if=
"duration"
>
{{
duration
}}
秒
</span>
<span
class=
"amr-duration"
v-if=
"duration"
>
{{
duration
}}
秒
</span>
</el-icon>
</el-icon>
<div
v-if=
"content"
>
<div
v-if=
"content"
>
...
@@ -25,7 +25,6 @@
...
@@ -25,7 +25,6 @@
<
script
setup
lang=
"ts"
name=
"WxVoicePlayer"
>
<
script
setup
lang=
"ts"
name=
"WxVoicePlayer"
>
// 因为微信语音是 amr 格式,所以需要用到 amr 解码器:https://www.npmjs.com/package/benz-amr-recorder
// 因为微信语音是 amr 格式,所以需要用到 amr 解码器:https://www.npmjs.com/package/benz-amr-recorder
import
BenzAMRRecorder
from
'benz-amr-recorder'
import
BenzAMRRecorder
from
'benz-amr-recorder'
const
props
=
defineProps
({
const
props
=
defineProps
({
...
@@ -90,6 +89,12 @@ const amrStop = () => {
...
@@ -90,6 +89,12 @@ const amrStop = () => {
padding
:
5px
;
padding
:
5px
;
background-color
:
#eaeaea
;
background-color
:
#eaeaea
;
border-radius
:
10px
;
border-radius
:
10px
;
width
:
40px
;
height
:
40px
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
}
.amr-duration
{
.amr-duration
{
font-size
:
11px
;
font-size
:
11px
;
...
...
src/views/mp/menu/index.vue
View file @
f8a86cbc
...
@@ -333,7 +333,7 @@ div {
...
@@ -333,7 +333,7 @@ div {
}
}
.public-account-management
{
.public-account-management
{
//
width
:
1200px
;
width
:
1200px
;
//
min-width
:
1200px
;
//
min-width
:
1200px
;
margin
:
0
auto
;
margin
:
0
auto
;
...
...
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