57 changed files with 351 additions and 885 deletions
@ -0,0 +1,3 @@ |
|||
<template> |
|||
<router-view /> |
|||
</template> |
@ -1,235 +0,0 @@ |
|||
<template> |
|||
<div class="luyin"> |
|||
<p>录音时长:</p> |
|||
<div style="margin-top:10px;"> |
|||
<el-button type="primary" size="small" @click="startRecorder">开始录音</el-button> |
|||
<el-button type="primary" size="small" @click="pauseRecorder">暂停录音</el-button> |
|||
<el-button type="primary" size="small" @click="endRecorder">停止录音</el-button> |
|||
</div> |
|||
<div style="margin-top:10px;"> |
|||
<el-button type="primary" size="small" @click="playRecorder">播放</el-button> |
|||
<el-button type="primary" size="small" @click="pausePlayRecorder">暂停播放</el-button> |
|||
<el-button type="primary" size="small" @click="resumePlayRecorder">恢复播放</el-button> |
|||
</div> |
|||
<div style="margin-top:10px;"> |
|||
<canvas id="canvas" /> |
|||
<span style="padding: 0 10%;" /> |
|||
<canvas id="playChart" /> |
|||
</div> |
|||
<div style="margin-top:10px;"> |
|||
<el-button type="primary" size="small" @click="getMp3Data()">下载MP3</el-button> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import lamejs from 'lamejs' |
|||
export default { |
|||
data() { |
|||
return { |
|||
// 波浪图-录音 |
|||
drawRecordId: null, |
|||
oCanvas: null, |
|||
ctx: null, |
|||
// 波浪图-播放 |
|||
drawPlayId: null, |
|||
pCanvas: null, |
|||
pCtx: null |
|||
} |
|||
}, |
|||
mounted() { |
|||
this.startCanvas() |
|||
}, |
|||
methods: { |
|||
// 波浪图配置 |
|||
startCanvas() { |
|||
// 录音波浪 |
|||
this.oCanvas = document.getElementById('canvas') |
|||
this.ctx = this.oCanvas.getContext('2d') |
|||
// 播放波浪 |
|||
this.pCanvas = document.getElementById('playChart') |
|||
this.pCtx = this.pCanvas.getContext('2d') |
|||
}, |
|||
// 开始录音 |
|||
startRecorder() { |
|||
this.$recorder.start().then(() => { |
|||
// 开始录音 |
|||
this.drawRecord() // 开始绘制波浪图 |
|||
}, (error) => { |
|||
// 出错了 |
|||
console.log(`${error.name} : ${error.message}`) |
|||
}) |
|||
}, |
|||
// 暂停录音 |
|||
pauseRecorder() { |
|||
this.$recorder.pause() |
|||
this.drawRecordId && cancelAnimationFrame(this.drawRecordId) |
|||
this.drawRecordId = null |
|||
}, |
|||
// 结束录音 |
|||
endRecorder() { |
|||
this.$recorder.stop() |
|||
this.drawRecordId && cancelAnimationFrame(this.drawRecordId) |
|||
this.drawRecordId = null |
|||
this.uploadFile() |
|||
}, |
|||
// 上传录音 |
|||
async uploadFile() { |
|||
const mp3Name = encodeURIComponent('audio_recording_' + new Date().getTime() + '.mp3') |
|||
const formData = new FormData() |
|||
let file = this.convertToMp3(this.$recorder.getWAV()) |
|||
file = new File([file], mp3Name) |
|||
formData.append('file', file) |
|||
formData.append('mp3Name', mp3Name) |
|||
const { data: res } = this.$http({ |
|||
method: 'post', |
|||
url: '', |
|||
headers: { |
|||
'Content-Type': 'multipart/form-data' |
|||
}, |
|||
data: formData |
|||
}) |
|||
console.log(res) |
|||
}, |
|||
// 播放录音 |
|||
playRecorder() { |
|||
this.$recorder.play() |
|||
this.drawPlay() // 绘制波浪图 |
|||
}, |
|||
// 暂停播放 |
|||
pausePlayRecorder() { |
|||
this.$recorder.pausePlay() |
|||
}, |
|||
// 恢复录音播放 |
|||
resumePlayRecorder() { |
|||
this.$recorder.resumePlay() |
|||
this.drawPlay() // 绘制波浪图 |
|||
}, |
|||
// 绘制波浪图-录音 |
|||
drawRecord() { |
|||
// 用requestAnimationFrame稳定60fps绘制 |
|||
this.drawRecordId = requestAnimationFrame(this.drawRecord) |
|||
|
|||
// 实时获取音频大小数据 |
|||
const dataArray = this.$recorder.getRecordAnalyseData() |
|||
const bufferLength = dataArray.length |
|||
|
|||
// 填充背景色 |
|||
this.ctx.fillStyle = 'rgb(255, 255, 255)' |
|||
this.ctx.fillRect(0, 0, this.oCanvas.width, this.oCanvas.height) |
|||
|
|||
// 设定波形绘制颜色 |
|||
this.ctx.lineWidth = 2 |
|||
this.ctx.strokeStyle = 'rgb(152, 199, 255)' |
|||
|
|||
this.ctx.beginPath() |
|||
|
|||
var sliceWidth = this.oCanvas.width * 1.0 / bufferLength // 一个点占多少位置,共有bufferLength个点要绘制 |
|||
var x = 0 // 绘制点的x轴位置 |
|||
|
|||
for (var i = 0; i < bufferLength; i++) { |
|||
var v = dataArray[i] / 128.0 |
|||
var y = v * this.oCanvas.height / 2 |
|||
|
|||
if (i === 0) { |
|||
// 第一个点 |
|||
this.ctx.moveTo(x, y) |
|||
} else { |
|||
// 剩余的点 |
|||
this.ctx.lineTo(x, y) |
|||
} |
|||
// 依次平移,绘制所有点 |
|||
x += sliceWidth |
|||
} |
|||
|
|||
this.ctx.lineTo(this.oCanvas.width, this.oCanvas.height / 2) |
|||
this.ctx.stroke() |
|||
}, |
|||
// 绘制波浪图-播放 |
|||
drawPlay() { |
|||
// 用requestAnimationFrame稳定60fps绘制 |
|||
this.drawPlayId = requestAnimationFrame(this.drawPlay) |
|||
|
|||
// 实时获取音频大小数据 |
|||
const dataArray = this.$recorder.getPlayAnalyseData() |
|||
const bufferLength = dataArray.length |
|||
|
|||
// 填充背景色 |
|||
this.pCtx.fillStyle = 'rgb(255, 255, 255)' |
|||
this.pCtx.fillRect(0, 0, this.pCanvas.width, this.pCanvas.height) |
|||
|
|||
// 设定波形绘制颜色 |
|||
this.pCtx.lineWidth = 2 |
|||
this.pCtx.strokeStyle = 'rgb(152, 199, 255)' |
|||
|
|||
this.pCtx.beginPath() |
|||
|
|||
var sliceWidth = this.pCanvas.width * 1.0 / bufferLength // 一个点占多少位置,共有bufferLength个点要绘制 |
|||
var x = 0 // 绘制点的x轴位置 |
|||
|
|||
for (var i = 0; i < bufferLength; i++) { |
|||
var v = dataArray[i] / 128.0 |
|||
var y = v * this.pCanvas.height / 2 |
|||
|
|||
if (i === 0) { |
|||
// 第一个点 |
|||
this.pCtx.moveTo(x, y) |
|||
} else { |
|||
// 剩余的点 |
|||
this.pCtx.lineTo(x, y) |
|||
} |
|||
// 依次平移,绘制所有点 |
|||
x += sliceWidth |
|||
} |
|||
|
|||
this.pCtx.lineTo(this.pCanvas.width, this.pCanvas.height / 2) |
|||
this.pCtx.stroke() |
|||
}, |
|||
// 下载mp3 |
|||
getMp3Data() { |
|||
const mp3Blob = this.convertToMp3(this.$recorder.getWAV()) |
|||
this.$recorder.download(mp3Blob, 'recorder', 'mp3') |
|||
}, |
|||
// 转mp3 |
|||
convertToMp3(wavDataView) { |
|||
// 获取wav头信息 |
|||
const wav = lamejs.WavHeader.readHeader(wavDataView) // 此处其实可以不用去读wav头信息,毕竟有对应的config配置 |
|||
const { channels, sampleRate } = wav |
|||
const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128) |
|||
// 获取左右通道数据 |
|||
const result = this.$recorder.getChannelData() |
|||
const buffer = [] |
|||
|
|||
const leftData = result.left && new Int16Array(result.left.buffer, 0, result.left.byteLength / 2) |
|||
const rightData = result.right && new Int16Array(result.right.buffer, 0, result.right.byteLength / 2) |
|||
const remaining = leftData.length + (rightData ? rightData.length : 0) |
|||
|
|||
const maxSamples = 1152 |
|||
for (let i = 0; i < remaining; i += maxSamples) { |
|||
const left = leftData.subarray(i, i + maxSamples) |
|||
let right = null |
|||
let mp3buf = null |
|||
|
|||
if (channels === 2) { |
|||
right = rightData.subarray(i, i + maxSamples) |
|||
mp3buf = mp3enc.encodeBuffer(left, right) |
|||
} else { |
|||
mp3buf = mp3enc.encodeBuffer(left) |
|||
} |
|||
|
|||
if (mp3buf.length > 0) { |
|||
buffer.push(mp3buf) |
|||
} |
|||
} |
|||
|
|||
const enc = mp3enc.flush() |
|||
|
|||
if (enc.length > 0) { |
|||
buffer.push(enc) |
|||
} |
|||
|
|||
return new Blob(buffer, { type: 'audio/mp3' }) |
|||
} |
|||
} |
|||
} |
|||
</script> |
@ -1,81 +0,0 @@ |
|||
<template> |
|||
<div /> |
|||
</template> |
|||
|
|||
<script> |
|||
import Cookies from 'js-cookie' |
|||
export default { |
|||
data() { |
|||
return { |
|||
returnParam: {}, |
|||
currentUser: {}, |
|||
patientInfo: {} |
|||
} |
|||
}, |
|||
created() { |
|||
var searchHref = decodeURIComponent(window.location.search).replace('?', '') |
|||
console.log(searchHref) |
|||
var params = searchHref.split('&') |
|||
params.forEach(param => { |
|||
var paramSplit = param.split('=') |
|||
this.returnParam[paramSplit[0]] = paramSplit[1] |
|||
}) |
|||
console.log(this.returnParam) |
|||
if (this.returnParam.doctorId) { |
|||
this.noPasswordLogin() |
|||
} |
|||
}, |
|||
methods: { |
|||
noPasswordLogin() { |
|||
// https://quguang.huimu.cloud/transfer?patientIdNumber=140108201204070077&doctorId=liucan&hisToken=123456 |
|||
this.$http.post('/noPasswordLogin', { |
|||
doctorId: this.returnParam.doctorId, |
|||
hisToken: this.returnParam.hisToken |
|||
}).then(({ data: res }) => { |
|||
if (res.code !== 0) { |
|||
// this.getCaptcha() |
|||
return this.$message.error(res.msg) |
|||
} |
|||
this.currentUser = res.data.currentUser |
|||
Cookies.set('xa-token', res.data.token) |
|||
window.localStorage.setItem('qg-userData', JSON.stringify(res.data.currentUser)) |
|||
this.getHisPatientInfo() |
|||
}).catch(() => { }) |
|||
}, |
|||
// HIS查询患者详情 |
|||
getHisPatientInfo() { |
|||
this.$http.get(`/patient/manage/getHisPatientInfo/${this.returnParam.patientIdNumber}`).then(({ data: res }) => { |
|||
if (res.code !== 0) { |
|||
return this.$message.error(res.msg) |
|||
} |
|||
this.patientInfo = res.data |
|||
this.savePatientInfo() |
|||
}).catch(() => {}) |
|||
}, |
|||
async savePatientInfo() { |
|||
const { data: res } = await this.$http.post('/patient/manage', this.patientInfo) |
|||
if (res.code !== 0) { |
|||
return this.$message.error(res.msg) |
|||
} |
|||
this.$router.push({ |
|||
path: '/seeDoctor', |
|||
query: { |
|||
info: this.$Base64.encode(JSON.stringify({ |
|||
patientIdNumber: this.returnParam.patientIdNumber, |
|||
patientCentreId: this.currentUser.centreId, |
|||
doctorId: this.returnParam.doctorId, |
|||
title: this.currentUser.position === '医生' ? '门诊' : '分诊' |
|||
})) |
|||
} |
|||
}) |
|||
const findMenuListInterval = setInterval(() => { |
|||
const menuList = window.SITE_CONFIG['menuList'] |
|||
menuList.length > 0 ? clearInterval(findMenuListInterval) : '' |
|||
// 设置菜单激活所在位置 |
|||
window.SITE_CONFIG.menuList.length > 0 ? this.$store.commit('activeIndexFun', res.data[0].id) : '' |
|||
}, 500) |
|||
} |
|||
} |
|||
} |
|||
|
|||
</script> |
Loading…
Reference in new issue