Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
frontend-h5
Project
Project
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
songrui
frontend-h5
Commits
0f6d77b6
Commit
0f6d77b6
authored
7 months ago
by
gengchunlei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
居民端小程序 v1.2 随访详情 组件引入
parent
8861fdc2
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
537 additions
and
1 deletion
+537
-1
generalFU.js
src/api/doctor/generalFU.js
+6
-0
imagePreview.vue
src/doctor/components/imagePreview/imagePreview.vue
+53
-0
Mp3.vue
src/doctor/components/mediaPlay/Mp3.vue
+137
-0
Mp4.vue
src/doctor/components/mediaPlay/Mp4.vue
+93
-0
mp3.js
src/doctor/components/mediaPlay/mp3.js
+145
-0
temDetail.vue
src/doctor/components/template/temDetail.vue
+14
-0
temList.vue
src/doctor/components/template/temList.vue
+21
-0
Detail.vue
src/doctor/followUp/generalFU/detail/Detail.vue
+0
-0
GeneralFUForm.vue
src/doctor/followUp/generalFU/form/GeneralFUForm.vue
+5
-1
common.less
src/doctor/utils/common.less
+63
-0
No files found.
src/api/doctor/generalFU.js
View file @
0f6d77b6
...
@@ -72,4 +72,9 @@ export function upLoadMultifile(params) {
...
@@ -72,4 +72,9 @@ export function upLoadMultifile(params) {
loading
:
false
,
loading
:
false
,
contentType
:
'file'
contentType
:
'file'
})
})
}
//短信重发
export
function
messageResend
(
params
)
{
return
fetchBase
({
url
:
`/chronic-admin/v1/chronic-visit-currency/resend-sms`
,
body
:
params
,
loading
:
true
})
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/doctor/components/imagePreview/imagePreview.vue
0 → 100644
View file @
0f6d77b6
<
template
>
<div>
<div
class=
'list gap-x-2.5 gap-y-1 flex items-center flex-wrap'
>
<div
v-for=
"(url, index) in imgList"
:key=
"index"
@
click=
'toPreview(index)'
>
<img
style=
'width: 1.47rem;height: 2.04rem'
:src=
"url.trueDownloadUrl"
/>
</div>
</div>
<van-overlay
:show=
'imgShow'
@
click=
'imgShow = false'
>
<div
class=
'wrapper'
>
<van-swipe
class=
'block'
:initial-swipe=
'initSwipe'
>
<van-swipe-item
v-for=
'image in imgList'
:key=
'image'
>
<img
:src=
'image.trueDownloadUrl'
style=
'width: 100%;height: 100%'
/>
</van-swipe-item>
</van-swipe>
</div>
</van-overlay>
</div>
</
template
>
<
script
>
export
default
{
name
:
'imagePreview'
,
props
:
{
imgList
:
Array
,
},
data
()
{
return
{
imgShow
:
false
,
initSwipe
:
0
}
},
methods
:
{
//图片预览
toPreview
(
index
)
{
this
.
initSwipe
=
index
this
.
imgShow
=
true
},
}
}
</
script
>
<
style
scoped
lang=
'less'
>
.wrapper {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
.block {
width: 100%;
}
}
</
style
>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/doctor/components/mediaPlay/Mp3.vue
0 → 100644
View file @
0f6d77b6
<
template
>
<div
class=
"p-1 flex flex-col mp3"
>
<div
v-if=
"file.annexFileName"
class=
"text-12 mb-1 text-ellipsis"
>
{{
file
.
annexFileName
}}
</div>
<div
class=
"flex items-center justify-between gap-x-2.5"
>
<div
class=
"shrink-0 play-bt"
@
click=
"start(file)"
>
<doc-icon
type=
"doc-play"
v-if=
"!player.playing"
/>
<doc-icon
type=
"doc-pause"
v-else
/>
</div>
<span
class=
"shrink-0 time"
>
{{
timeFormat
(
player
.
duration
)
}}
</span>
<div
class=
"grow progress"
>
<van-slider
v-model=
"player.currentTime"
:max=
"sliderMax"
:bar-height=
"6"
:button-size=
"0"
@
change=
"onProgress"
/>
<!--
<div
:style=
"`width: $
{progress}%`">
</div>
-->
</div>
<span
class=
"shrink-0 time"
:style=
"`opacity: $
{player.currentTime ? 1 : 0}`">
{{
timeFormat
(
player
.
currentTime
)
}}
</span>
</div>
<audio
ref=
"audio"
type=
"audio/mpeg"
crossOrigin=
"anonymous"
style=
"display: none"
></audio>
</div>
</
template
>
<
script
>
import
{
musicPlayer
}
from
'./mp3.js'
import
{
showToast
}
from
'vant'
export
default
{
props
:
{
file
:
{
default
:
()
=>
({})
},
activeMediaUrl
:
{
default
:
''
}
},
data
()
{
return
{
player
:
{},
// 正在播放的items
activeAudio
:
{},
}
},
computed
:
{
sliderMax
()
{
return
this
.
player
.
duration
?
Math
.
floor
(
this
.
player
.
duration
)
:
100
},
progress
()
{
if
(
!
this
.
player
.
currentTime
)
return
0
const
temp
=
this
.
player
.
currentTime
/
this
.
player
.
duration
return
Math
.
round
(
temp
*
1000
)
/
10
}
},
mounted
()
{
this
.
init
()
},
methods
:
{
init
()
{
this
.
player
=
new
musicPlayer
(
this
.
$refs
.
audio
)
this
.
player
.
init
()
this
.
player
.
setSrc
(
this
.
file
.
annexUrl
)
this
.
player
.
audioEl
.
onended
=
()
=>
{
console
.
log
(
'播放结束'
)
this
.
stop
()
}
},
start
(
item
)
{
if
(
!
item
||
!
item
.
annexUrl
)
{
showToast
(
'文件获取失败'
)
return
}
if
(
!
this
.
player
.
audioCtx
)
{
this
.
player
.
init
()
this
.
player
.
setSrc
(
item
.
annexUrl
)
}
if
(
this
.
player
.
playing
)
{
this
.
stop
()
}
else
{
this
.
player
.
audioEl
.
play
()
this
.
activeAudio
=
item
this
.
player
.
playing
=
true
this
.
$emit
(
'play'
,
item
)
}
console
.
log
(
'this.player'
,
this
.
player
)
},
stop
()
{
this
.
player
.
audioEl
.
pause
()
this
.
player
.
playing
=
false
},
timeFormat
(
value
)
{
if
(
!
value
)
{
return
'00:00'
}
let
date
=
Math
.
ceil
(
value
)
let
minutes
=
Math
.
floor
(
date
/
60
)
let
seconds
=
date
%
60
let
format
=
''
+
(
minutes
>=
10
?
minutes
:
'0'
+
minutes
)
+
':'
+
(
seconds
>=
10
?
seconds
:
'0'
+
seconds
)
return
format
},
onProgress
(
value
)
{
this
.
player
.
progressChange
(
value
)
this
.
player
.
playing
=
true
}
},
watch
:
{
activeMediaUrl
(
val
)
{
console
.
log
(
'activeMediaUrl'
,
val
)
if
(
val
!==
this
.
file
.
annexUrl
)
{
this
.
stop
()
}
}
}
}
</
script
>
<
style
lang=
"less"
scoped
>
.mp3 {
background-color: #fff;
.play-bt {
display: inline-flex;
width: 24px;
height: 24px;
align-items: center;
justify-content: center;
border-radius: 50%;
background-color: #E4F2F0;
font-size: 10px;
padding-left: 2px;
color: var(--van-primary-color);
}
.progress {
// height: 6px;
// border-radius: 4px;
// background: #EFF2F7;
// overflow: hidden;
// text-align: left;
// >div {
// height: 100%;
// background: #54CCBD;
// }
}
}
</
style
>
This diff is collapsed.
Click to expand it.
src/doctor/components/mediaPlay/Mp4.vue
0 → 100644
View file @
0f6d77b6
<
template
>
<div
class=
"mp4"
>
<div
class=
"flex flex-wrap justify-between video-list"
>
<div
v-for=
"item in files"
:key=
"item.annexId"
>
<div
class=
"item"
>
<div
class=
"shrink-0 play-bt"
@
click=
"start(item)"
>
<doc-icon
type=
"doc-play"
/>
</div>
</div>
<div
v-if=
"item.annexFileName"
class=
"text-12 my-1 text-ellipsis"
>
{{
item
.
annexFileName
}}
</div>
</div>
</div>
<!--
<van-popup
v-model:show=
"visible"
:close-on-click-overlay=
"false"
closeable
close-icon-position=
"top-right"
close-icon=
"clear"
>
<video
controls
v-if=
"visible"
style=
"width: calc(100vw - var(--van-padding-md) * 2)"
>
<source
:src=
"activeVideo.annexUrl"
type=
"video/mp4"
/>
播放失败!
</video>
</van-popup>
-->
<van-overlay
:show=
"visible"
>
<div
class=
"h-full flex items-center justify-center wrapper"
@
click
.
stop
>
<video
controls
v-if=
"visible"
>
<source
:src=
"activeVideo.annexUrl"
type=
"video/mp4"
/>
播放失败!
</video>
<van-icon
name=
"close"
class=
"close-icon"
@
click=
"visible = false"
/>
</div>
</van-overlay>
</div>
</
template
>
<
script
>
export
default
{
props
:
{
files
:
{
default
:
()
=>
[]
}
},
data
()
{
return
{
visible
:
false
,
activeVideo
:
{}
}
},
methods
:
{
start
(
item
)
{
this
.
activeVideo
=
item
this
.
visible
=
true
this
.
$emit
(
'play'
,
item
)
}
}
}
</
script
>
<
style
lang=
"less"
scoped
>
.video-list {
>div {
width: calc(50% - 5px);
.item {
background: url('@/assets/image/residentWX/video-default.png') no-repeat;
background-size: 100%;
height: .84rem;
display: flex;
align-items: center;
justify-content: center;
}
}
.play-bt {
display: inline-flex;
width: 36px;
height: 36px;
align-items: center;
justify-content: center;
border-radius: 50%;
background-color: #E4F2F0;
font-size: 15px;
padding-left: 2px;
}
}
.wrapper {
position: relative;
.close-icon {
position: absolute;
top: 16px;
right: 16px;
color: #ccc;
font-size: 24px;
}
video {
width: calc(100vw - var(--van-padding-md) * 2);
background-color: #fff;
}
}
</
style
>
This diff is collapsed.
Click to expand it.
src/doctor/components/mediaPlay/mp3.js
0 → 100644
View file @
0f6d77b6
export
class
musicPlayer
{
constructor
(
audioEl
)
{
this
.
audioEl
=
audioEl
// 音频上下文
this
.
audioCtx
=
null
// 音源
this
.
audioSource
=
null
// 时长
this
.
duration
=
0
// 当前播放时间
this
.
currentTime
=
0
// 播放进度
this
.
progress
=
0
// 声音
this
.
volume
=
20
// AnalyserNode 接口表示了一个可以提供实时频域和时域分析信息的节点
this
.
analyser
=
null
// 音量节点
this
.
gainNode
=
null
// 缓冲进度
this
.
timeRange
=
null
// 是否播放中
this
.
playing
=
false
}
init
()
{
// 音频上下文
this
.
audioCtx
=
new
(
window
.
AudioContext
||
window
.
webkitAudioContext
)()
if
(
!
this
.
audioCtx
)
{
throw
new
Error
(
'audioCtx is null'
)
}
// 获取音频数据的节点
this
.
analyser
=
this
.
audioCtx
.
createAnalyser
()
// 音量节点
this
.
gainNode
=
this
.
audioCtx
.
createGain
()
this
.
gainNode
.
gain
.
value
=
1
this
.
audioEl
.
volume
=
this
.
volume
/
100
// 从<audio>或<video>元素生成的音频源
this
.
audioSource
=
this
.
audioCtx
.
createMediaElementSource
(
this
.
audioEl
)
this
.
audioEl
.
ontimeupdate
=
()
=>
{
this
.
currentTime
=
this
.
audioEl
.
currentTime
if
(
this
.
progress
>=
this
.
duration
)
return
this
.
progress
=
this
.
currentTime
}
this
.
audioEl
.
onloadedmetadata
=
()
=>
{
// 时长
this
.
duration
=
this
.
audioEl
.
duration
console
.
log
(
'onloadedmetadata'
,
this
.
duration
)
}
this
.
audioEl
.
onprogress
=
()
=>
{
// 当浏览器正在下载音频/视频时
this
.
timeRange
=
this
.
audioEl
.
buffered
if
(
this
.
timeRange
&&
this
.
timeRange
.
length
>
0
)
{
console
.
log
(
'buffered'
,
this
.
audioEl
.
buffered
.
start
(
0
),
this
.
audioEl
.
buffered
.
end
(
0
)
)
}
}
this
.
audioEl
.
oncanplay
=
()
=>
{
console
.
log
(
'可播放'
)
setTimeout
(()
=>
{
this
.
getAudioSource
()
},
100
)
}
this
.
audioEl
.
onerror
=
(
e
)
=>
{
console
.
error
(
'加载出现错误'
,
e
)
this
.
onerror
(
e
)
}
}
onerror
()
{}
onended
()
{}
setSrc
(
src
)
{
this
.
progress
=
0
this
.
audioEl
.
src
=
src
}
// 调整进度
progressChange
(
value
)
{
this
.
audioEl
.
currentTime
=
value
}
// 调整音量
volumeChange
(
value
)
{
this
.
volume
=
value
this
.
audioEl
.
volume
=
this
.
volume
/
100
}
// 音频波形处理
getAudioSource
()
{
// 节点链接到音源
this
.
audioSource
.
connect
(
this
.
analyser
)
// 链接音量节点
this
.
analyser
.
connect
(
this
.
gainNode
)
this
.
gainNode
.
connect
(
this
.
audioCtx
.
destination
)
return
// 使用快速傅立叶变换(Fast Fourier Transform (FFT) )来捕获音频数据
// this.analyser.fftSize = 2048
this
.
analyser
.
fftSize
=
256
let
bufferLength
=
this
.
analyser
.
frequencyBinCount
let
dataArray
=
new
Uint8Array
(
bufferLength
)
let
c
=
this
.
boardEl
let
canvasWidth
=
c
.
width
let
canvasHeight
=
c
.
height
let
ctx
=
c
.
getContext
(
'2d'
)
let
left
=
this
ctx
.
strokeStyle
=
'rgba(81,167,255, .5)'
drawBar
()
function
drawBar
()
{
// 波形绘制
ctx
.
clearRect
(
0
,
0
,
canvasWidth
,
canvasHeight
)
let
barWidth
=
(
canvasWidth
/
bufferLength
)
*
1
let
barHeight
=
0
let
x
=
0
left
.
analyser
.
getByteFrequencyData
(
dataArray
)
for
(
let
i
=
0
;
i
<
bufferLength
;
i
++
)
{
barHeight
=
dataArray
[
i
]
/
2
let
tempColor
=
barHeight
*
3
>
255
?
255
:
barHeight
*
3
ctx
.
fillStyle
=
'rgba('
+
tempColor
+
', 160, 255, .5)'
ctx
.
fillRect
(
x
,
canvasHeight
-
barHeight
/
2
,
barWidth
,
barHeight
)
x
+=
barWidth
+
0.1
}
requestAnimationFrame
(
drawBar
)
}
}
}
This diff is collapsed.
Click to expand it.
src/doctor/components/template/temDetail.vue
0 → 100644
View file @
0f6d77b6
<
template
>
</
template
>
<
script
>
export
default
{
name
:
'temDetail'
}
</
script
>
<
style
scoped
>
</
style
>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/doctor/components/template/temList.vue
0 → 100644
View file @
0f6d77b6
<
template
>
<van-popup
v-model:show=
"show"
position=
"right"
:style=
"
{ height: '100%' }" >
<div>
1111111
</div>
</van-popup>
</
template
>
<
script
>
export
default
{
name
:
'temList'
,
data
()
{
return
{
show
:
false
}
}
}
</
script
>
<
style
scoped
>
</
style
>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
src/doctor/followUp/generalFU/detail/Detail.vue
View file @
0f6d77b6
This diff is collapsed.
Click to expand it.
src/doctor/followUp/generalFU/form/GeneralFUForm.vue
View file @
0f6d77b6
...
@@ -26,7 +26,11 @@
...
@@ -26,7 +26,11 @@
/>
/>
</div>
</div>
<div
v-if=
'showTwo'
>
<div
v-if=
'showTwo'
>
<div
class=
'no-req-label mt-5'
>
健康指导
</div>
<div
class=
'flex justify-between items-center'
>
<div
class=
'label-title mt-5'
>
健康指导
</div>
<van-button
class=
'doc-btn-primary'
>
选择内容
</van-button>
</div>
<div
class=
'health mt-2'
>
<div
class=
'health mt-2'
>
<div
class=
'health-cell mt-2'
v-for=
'item in form.visitHealthGuideList'
>
<div
class=
'health-cell mt-2'
v-for=
'item in form.visitHealthGuideList'
>
<div
class=
'no-req-label'
v-if=
"item.name != '无'"
>
{{
item
.
name
}}
</div>
<div
class=
'no-req-label'
v-if=
"item.name != '无'"
>
{{
item
.
name
}}
</div>
...
...
This diff is collapsed.
Click to expand it.
src/doctor/utils/common.less
0 → 100644
View file @
0f6d77b6
:deep(.doc-tabs) {
border-bottom: 1px solid #EBEBEC;
.van-tab {
font-weight: 500;
}
.van-tabs__line {
border-radius: 0;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
}
}
// 顶部导航栏
.doc-nav-bar {
position: relative;
border-bottom: 1px solid #3C3C435C;
font-size: 18px;
font-weight: 600;
.back-bt {
position: absolute;
left: .16rem;
top: 50%;
transform: translateY(-50%);
}
}
// 折叠面板
:deep(.doc-collapse) {
margin-top: .1rem;
&::after {
display: none;
}
.van-cell {
padding: .1rem 0;
color: #8C8C8C;
font-weight: 600;
background: transparent;
&::after {
display: none;
}
.svg-icon {
font-size: .12rem;
transition: all .2s;
}
}
.van-collapse-item {
.van-collapse-item__content {
padding: 0;
color: #262626;
}
&::after {
display: none;
}
}
// 展开
.van-collapse-item__title--expanded {
.svg-icon {
transform: rotate(-180deg);
}
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment