AI销管
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

1544 satır
37 KiB

  1. <template>
  2. <view class="translation" @click="changeEditing(false)">
  3. <view class="top" style="margin-top: 30rpx;">
  4. <view class="title">
  5. <view class="call_record_time">{{date}}</view>
  6. <view class="hash" @click="gotoChat" v-if="commentList.length != 0">
  7. 查看全部评论
  8. </view>
  9. </view>
  10. <view class="call_record_time_one" >接待时长 {{alltimeStr}}</view>
  11. <view class="audio-container">
  12. <view class="audio-play" @tap="changePlayState">
  13. <image class="image" mode="widthFix" :src="audioPlay ? 'https://qufang.oss-cn-beijing.aliyuncs.com/upload/icon/xcx/jjycrm/pause.png' : 'https://qufang.oss-cn-beijing.aliyuncs.com/upload/icon/xcx/jjycrm/play.png'"></image>
  14. </view>
  15. <view class="audio-slider">
  16. <view class="audio-time">
  17. <text>{{currentTimeStr}}</text>
  18. </view>
  19. <slider class="slider" min="0" :max="sliderMax" @change="sliderChangeComplate" block-size="14"
  20. :value="sliderValue" activeColor="blue"></slider>
  21. <view class="audio-time">
  22. <text>{{timeStr}}</text>
  23. </view>
  24. </view>
  25. </view>
  26. </view>
  27. <scroll-view :scroll-top="scrollTop" lower-threshold='100px' @scrolltolower="ltolower()"
  28. upper-threshold='40px' @scrolltoupper="rolltoupper()"
  29. :scroll-into-view="scrollId" scroll-y="true" class="text scroll-Y">
  30. <!-- 音频识别模块 -->
  31. <view >
  32. <!-- 聊天记录-->
  33. <view class="dialog-block" v-for="(dialog,i) in dialogList" :key="i">
  34. <view :id="'dialog'+i" class="fileName">录音文件</view>
  35. <view class="text dingweishiy" :id="'dialog'+csdFileindex+'text'+item.bg"
  36. :class="{active: item.bg < playNow && item.ed > playNow && i==0}"
  37. v-for="(item,index) in dialog.message" :key="index" :data-speaker="item.speaker"
  38. >
  39. <view class="avatar">
  40. <view :style="[SPEAKERSTYLE(item.speaker)]">
  41. <image v-if="item.isShow == 0" :src="Aimg.replace(/[\r\n]/g,'')" mode="widthFix"></image>
  42. <text v-else>{{ item.speaker | toCapital }}</text>
  43. </view>
  44. </view>
  45. <view class="content">
  46. <view v-html="item.onebest"></view>
  47. </view>
  48. <view class="tankuangcss" v-if="startTime==item.bg">
  49. <view style="max-width: 85rpx; height: 38rpx;font-size: 24rpx;color: #333333;text-align: center;line-height: 38rpx;
  50. border-radius: 2rpx;border: 1px solid #979797;">标签</view>
  51. <view style="max-width: 171rpx;height: 38rpx;background: #008EF2;border-radius: 2rpx;display: flex;
  52. align-items: center;margin-left: 10rpx;" @click="dianjibiaoqian()">
  53. <view style="width: 126rpx;height: 38rpx;line-height: 38rpx;font-size: 24rpx;color: #FFFFFF;
  54. text-align: center; overflow: hidden;">{{biaoqian}}</view>
  55. <view v-if="biaoqian.length>4" style="width: 37rpx;height: 37rpx;line-height: 37rpx;">
  56. <u-icon name="chat-fill" color="#ffffff" size="32rpx"></u-icon>
  57. </view>
  58. </view>
  59. </view>
  60. <view class="biaoqianya" v-if="startTime==item.bg">
  61. <view class="biaoqianyaisshow" v-if="biaoqianyaisshow">
  62. {{biaoqian}}
  63. </view>
  64. </view>
  65. </view>
  66. </view>
  67. <!-- 点赞 -->
  68. <view class="likeArea" :class="{'liked':isLiked}">
  69. <image :src="isLiked?'/static/images/recordingManagement/likeActive.png':'/static/images/recordingManagement/like_gray.png'"
  70. mode=""></image>
  71. </view>
  72. <view class="hash" id="hash">
  73. </view>
  74. <!-- 评语列表 -->
  75. <view class="chat" v-if="commentList.length != 0">
  76. <view class="total">
  77. 全部评论(共{{commentList.length}}条)
  78. </view>
  79. <view class="list">
  80. <view class="message" v-for="(item,index) in commentList" :key="index">
  81. <u-avatar class="avator" size="72" :src="item.commentPic ||'https://qufang.oss-cn-beijing.aliyuncs.com/upload/icon/xcx/jjycrm/my/headPicture.png'"></u-avatar>
  82. <view class="right">
  83. <view class="name">
  84. {{item.commentName||"未知昵称"}}
  85. </view>
  86. <view class="subtitle" v-if="item.commentAutoGraph">
  87. {{item.commentAutoGraph}}
  88. </view>
  89. <view class="answer" v-if="item.replyName">
  90. 回复@{{item.replyName}}
  91. </view>
  92. <view class="content" v-if="item.content">
  93. {{item.content}}
  94. </view>
  95. <view class="pic" v-if="item.picUrl">
  96. <image style="width: 100%;max-width: 240px;" :src="item.picUrl" mode="widthFix"></image>
  97. </view>
  98. <view class="bottom">
  99. <view class="time">
  100. {{item.createTime}}
  101. </view>
  102. <view class="button" v-if="myId != item.commentUser" @click.stop="answer(item.commentUser,item.id)">
  103. 回复
  104. </view>
  105. </view>
  106. </view>
  107. </view>
  108. </view>
  109. </view>
  110. </view>
  111. </scroll-view>
  112. <!-- 写评价 -->
  113. <view class="bottomArea">
  114. <image class="voice" @click.stop="changeVoiceShow" src="/static/images/recordingManagement/voice.png" mode=""></image>
  115. <view class="inputArea">
  116. <textarea :value="content" :focus="textareaFocus" type="text" @input="changeContent" :auto-height="true" class="editor"
  117. :class="{'active':editing}" @click.stop="changeEditing(true)" @confirm="sendComment">
  118. </textarea>
  119. <view class="placeholder" :class="{'editing':editing}" v-if="!content && !editing">写评价</view>
  120. <image class="edit" v-if="!editing && content == ''" src="/static/images/recordingManagement/edit.png" mode=""></image>
  121. </view>
  122. <image class="like" v-if="myId != createUser && !editing" @click="changeLike" src="/static/images/recordingManagement/like.png"
  123. mode=""></image>
  124. <image class="add" @click.stop="uploadImage" v-if="!editing && content == ''" src="/static/images/recordingManagement/add.png"
  125. mode=""></image>
  126. <view class="send" @click="sendComment" v-if="content!=''">
  127. 发送
  128. </view>
  129. </view>
  130. <!-- 回到顶部 -->
  131. <!-- <view class="backTop" @click="gotoTop">
  132. <image src="/static/images/backTop.png" mode=""></image>
  133. </view> -->
  134. <!-- 语音输入 -->
  135. <cover-view class="voiceContent" v-if="voiceShow" @click="changeVoiceShow">
  136. <cover-view class="box" @click.stop="" @touchstart="voiceStart" @touchend="voiceEnd">
  137. <cover-view class="center">
  138. <cover-image class="voice" src="/static/images/voice.png" mode="widthFix"></cover-image>
  139. <cover-view class="text">
  140. {{isRecording?'正在输入':'长按语音输入'}}
  141. </cover-view>
  142. </cover-view>
  143. </cover-view>
  144. </cover-view>
  145. </view>
  146. </template>
  147. <script>
  148. var app = getApp();
  149. var util = require("../../../utils/util.js");
  150. var config = require("../../../config");
  151. var plugin = requirePlugin("WechatSI")
  152. let manager = plugin.getRecordRecognitionManager();
  153. export default {
  154. data() {
  155. return {
  156. Aimg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAACqVBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3////9/f39/f3////////9/f3////////////9/f3////9/f39/f3////9/f3////////9/f3////9/f3////////////////9/f39/f3////////9/f39/f3////9/f39/f3////////9/f39/f3////////9/f39/f39/f3////////////////+/v7+/v7////+/v7////+/v7////+/v7+/v7////////+/v7+/v7////+/v7////+/v7////////////////////////////+/v7////+/v7////+/v7+/v7////////////+/v7////+/v7////+/v7+/v7////////+/v7////+/v7////////+/v7////////+/v7////+/v7+/v7+/v7////////+/v7+/v7////+/v7+/v7////+/v7////+/v7////+/v7////+/v7+/v7////+/v7+/v7////+/v7////+/v7////+/v7+/v7////+/v5jdC9iAAAA4nRSTlMAAQIDBAUGBwgLDA0ODxARExQVFhgbHB4fICEiIyQmJygpKy4wMTIzNDY3ODk6Oz0+P0BBQkRGR0lKTE5PUFFTVFVXWFlcXV9gYWJjZWZnaGlqa2xtbm9wcXJzdHV2d3h6e319foGBgoODh4mKiouMjI2QkZKSk5OUlpeYmZmam5ycnZ+foKGio6SmqKmpq6yur7CwsbGytba5uru8wMDBwcLCw8XGx8jJysrLzM7P0dLT1dXW1tfY2drc3N7f4OHh5Obm5+jp6uvs7vDx8vLz8/T09fX29/f4+fn6+vz8/f7+RVDt+wAAA55JREFUGBntwf9/1HMAB/DX7XYbuXWV1cyMoixfugrRGNXytW33pbVdJ83XkiMLSb4LJd/zZUi0SKT5FmGS77HUVaixnHP2+kt8vt3Zbp/3+7P3XR5+8XziP1E4uiYcrh1bjMNi6NzXumnoeX3eSOSrpHUv+zi0ogJ5qd3JLN1XuJGzwqW0sW4oclT0Im19XIqcuNdQ4D0vcnEDhdYgB2f+SbFZUHbEdkrsLYeqFko9CEVH7qJUohxqLqODO6BmLR18XwAVRQfpZDxUnExHjVBRR0eroGIZHX0AFe10tA8qdtNZIRR00VEPVLxLRzuh4jk62gIVy+joSaiI0tECqPDT0blQ4f6RDpI+KHmYDjZBzWQ6aIaibZSK+6BoOqViUOXqoER8BJSdlqJYFDm4h0LveJAD7+cUiFciJ1U/01aiGjk65zfaSF6EnE3azQEO1iAPFZuZZes45MUT3cM+emLFyNfwK3fQ8k1sFA6L0cElTzx9d1OVC/8bNG/gzY+GQaKk461gCQZr8iMHSNZD4nySv6wYj0EYFv2UhqcgcTsN70ePhtzER3+lJe6BxXP9jTctvrl1yS1jkLaNlkTbBR6IlF3dyT78sHh+oqkSlrJe/uOH1jGw4apem2I/1yLtGRo6kRZiP73t57mQxb+Z2dqRdikNtyLtBWb78Cz05bomyQH+KIGljIYaWNxxDtC72ouMgsdpZzosHhqqYDmFdraOQNpttHUfLKU0TITlKtra6IZpCu3tgMVPQx0sG2ivDqaVFDgOppk0LIbJm6C9DTB1UCAMU4SGZ2GqocAumL6jQBtMMRq2wLScAik3dMV/UWB/EQwrafgSpk6KlEJ3LIXOgGE9DQdgqKDQSdBNoNAiGL6i6SjowhSaAt1UCm2CzpOk6QTonqfQJdBdSKGkD5pKWqZCU7iHQtdB10KxWmjOpqUJmtMp9gB091LsIWiCtCyFZiHFXoZuHcW+hiZGy0vQvE2xT6DbTolKAI/R8hmA4SmKdUG3jxIhAG/QkigAZlAi6QJQTJk2AF1MGwXcRRkfgJGU2V8EHzP8wBeUqQQwllKTcCozpuFESk0AMJNSC3AxM8KYT6lpAFootRGLmLEQ6ynVCCBAqcSQ1cy4f8ghSs0HcMzvlKp+lRmvVFMqNQ6aaIoyd3Yy49vllOmuh+H4WZFIpFnTpJmjadTM1oQ1oVAgFNQENA0N9f01BIKh8OzGOU3NkbmXzwuV41/wNztgHKhu7WKTAAAAAElFTkSuQmCC",
  157. dialogList: [], // 录音对话转移列表
  158. isshowFile: false, // 录音文件默认隐藏
  159. luyinList: [], //录音文件列表
  160. newluyinList:[],
  161. fileIndex: 0, //文件索引
  162. fileId: '', //选中的录音ID
  163. id: "",
  164. audioStop: false,
  165. customerId: '',
  166. date: "",
  167. time: "",
  168. message: "", //聊天记录表
  169. durationTimeStr: "",
  170. autoLoad: true,
  171. playNow: 0,
  172. scrollTop: 0,
  173. scrollId: "",
  174. editing: false,
  175. isLiked: null,
  176. createUser: null,
  177. commentList: [], //评论列表
  178. content: "",
  179. voiceShow: false,
  180. isRecording: false,
  181. answerUserId: null,
  182. answerId: null,
  183. textareaFocus: false,
  184. myId: uni.getStorageSync("weapp_session_userInfo_data").accountId,
  185. startTime:"",
  186. alltimeStr:"00:00",
  187. audioPlay: false, //当前的播放状态控制
  188. sliderValue: 0, //进度条最小值
  189. end: false,
  190. sliderMax: 0, //进度条最大值
  191. innerAudioContext: "", //播放实例
  192. currentTimeStr: "00:00", //当前进度的时间
  193. timeStr: "00:00", //总的时间
  194. recordPath: "",
  195. csdFileindex:0,
  196. biaoqian:"",
  197. biaoqianyaisshow:false,
  198. startFile:'',
  199. textindex:0,//下拉 转写文件下标
  200. toptextindex:0,//上拉 转写文件下标
  201. roleindex:0,
  202. };
  203. },
  204. onLoad: function(options) {
  205. this.startTime=options.startTime
  206. this.customerId=options.customerId,
  207. this.biaoqian=options.biaoqian;
  208. this.startFile=options.startFile;
  209. this.getdianzan()
  210. this.getCommentList();
  211. this.getView()
  212. },
  213. onShow: function() {
  214. this.initRecord();
  215. this.innerAudioContext = uni.createInnerAudioContext();
  216. this.innerAudioContext.autoplay = false;
  217. this.innerAudioContext.title = '音频';
  218. this.onPlay()
  219. this.onPause()
  220. this.onCanplay()
  221. this.onEnded()
  222. this.onSeeking()
  223. this.onSeeked()
  224. this.TimeUpdate()
  225. this.getluyinList();
  226. },
  227. // 在组件实例被从页面节点树移除时执行
  228. destroyed: function() {
  229. if (this.innerAudioContext) {
  230. this.innerAudioContext.destroy();
  231. }
  232. },
  233. onUnload:function(){
  234. this.innerAudioContext.destroy();
  235. },
  236. methods: {
  237. getView(){
  238. this.$u.get('/autoSR/api/addtodigest/addPageviews',{
  239. id:this.customerId
  240. })
  241. .then(res=>{
  242. // console.log(res)
  243. })
  244. },
  245. onPlay(){
  246. this.innerAudioContext.onPlay(() => {
  247. // 播放监听
  248. console.log('播放!');
  249. this.audioPlay = true;
  250. });
  251. },
  252. onPause(){
  253. this.innerAudioContext.onPause(() => {
  254. // 暂停监听
  255. console.log('暂停播放!');
  256. this.audioPlay = false
  257. });
  258. },
  259. onCanplay() {
  260. this.innerAudioContext.onCanplay((callback) => {
  261. console.log("缓冲回调",this.innerAudioContext.duration);
  262. })
  263. },
  264. onEnded(){
  265. this.innerAudioContext.onEnded(() => {
  266. // 结束播放监听
  267. console.log('播放结束!');
  268. this.audioPlay = false;
  269. });
  270. },
  271. onSeeking(){
  272. this.innerAudioContext.onSeeking((res) => {
  273. console.log("进行跳转", res);
  274. })
  275. },
  276. onSeeked(){
  277. this.innerAudioContext.onSeeked((res) => {
  278. console.log("结束跳转", res);
  279. this.$forceUpdate()
  280. });
  281. },
  282. TimeUpdate(){
  283. this.innerAudioContext.onTimeUpdate(() => {
  284. const {
  285. currentTime,
  286. duration
  287. } = this.innerAudioContext;
  288. this.playNow = parseInt(currentTime * 1000)
  289. if (this.dialogList.length == 0) {
  290. } else {
  291. const message = this.dialogList[0].message
  292. for (let i = 0; i < message.length; i++) {
  293. if (Number(message[i].bg) < this.playNow && Number(message[i].ed) > this.playNow) {
  294. this.scrollId = "dialog" + this.csdFileindex + "text" + i;
  295. break;
  296. }
  297. }
  298. }
  299. const currTimeStr = this.formatTime(currentTime);
  300. this.sliderValue = parseInt(currentTime);
  301. // 变动的时间
  302. this.currentTimeStr = currTimeStr;
  303. //进度条最大值
  304. this.sliderMax = this.luyinList[this.csdFileindex].recordDuration;
  305. this.$forceUpdate()
  306. });
  307. },
  308. //下一页
  309. ltolower() {
  310. var lengthcz=this.newluyinList.length-1;
  311. if (this.textindex >= lengthcz) {
  312. uni.showToast({
  313. title: '到底了',
  314. icon: 'none',
  315. duration: 2000
  316. });
  317. return
  318. }else {
  319. this.textindex=this.textindex+1;
  320. this.newluyinList[this.textindex].message.forEach(item=>{
  321. this.dialogList[0].message.push(item)
  322. })
  323. }
  324. console.log("下一页",this.textindex)
  325. },
  326. //上一页
  327. rolltoupper() {
  328. if(this.toptextindex == 0){
  329. // uni.showToast({
  330. // title: '到头了',
  331. // duration: 2000
  332. // });
  333. return
  334. }else {
  335. if(this.dialogList[0]==undefined ){
  336. return
  337. }else{
  338. this.toptextindex=this.toptextindex-1;
  339. let reverselist=this.newluyinList[this.toptextindex].message;
  340. let runlist=reverselist.reverse();
  341. runlist.forEach(item=>{
  342. this.dialogList[0].message.unshift(item)
  343. })
  344. }
  345. }
  346. console.log("上一页",this.toptextindex)
  347. },
  348. //点击标签
  349. dianjibiaoqian(){
  350. if(this.biaoqian.length>4){
  351. this.biaoqianyaisshow= !this.biaoqianyaisshow;
  352. }
  353. },
  354. //获取点赞列表isLiked likegetLike
  355. getdianzan(){
  356. uni.request({
  357. url: config.service.likegetLike + '?targetId=' + this.customerId, //仅为示例,并非真实接口地址。
  358. method:"GET",
  359. header: {
  360. 'content-type': 'application/json',
  361. 'Authorization': 'Bearer '+uni.getStorageSync('weapp_session_login_data').token
  362. },
  363. success: (data) => {
  364. if(data.data.code==10000){
  365. this.isLiked=data.data.data.like;
  366. }else{
  367. uni.hideLoading();
  368. uni.showModal({
  369. title: '提示',
  370. content: '请求数据失败,请重新尝试',
  371. showCancel: false
  372. });
  373. }
  374. },
  375. fail(error) {
  376. uni.hideLoading();
  377. uni.showModal({
  378. title: '提示',
  379. content: '网络异常,请重新尝试',
  380. showCancel: false
  381. });
  382. return false;
  383. }
  384. });
  385. },
  386. // 获取评论列表
  387. getCommentList() {
  388. const that = this;
  389. util.getRequestPromise(config.service.cmmentList + '?targetId=' + this.customerId, {}, false, "GET").then(data => {
  390. let tmp = data;
  391. tmp.reverse();
  392. that.commentList = tmp;
  393. });
  394. },
  395. // 获取录音记录列表
  396. getluyinList() {
  397. this.sliderMax = 0; //进度条最大值
  398. this.timeStr = "00:00"; //总的时间
  399. const parames = {
  400. pageNum: 1,
  401. pageSize: 100,
  402. query: {
  403. whetherFinish: 1,
  404. customerId: this.customerId,
  405. id:this.startFile
  406. }
  407. }
  408. this.$u.post("/corpus/fendianFindByPage", parames).then(res => {
  409. if (res && res.length) {
  410. let alltime = res[0].recordDuration;
  411. this.alltimeStr = this.getTime(alltime)
  412. this.luyinList = res;
  413. this.recordPath = res[0].recordPath
  414. this.sliderMax = this.getTime(res[0].recordDuration)
  415. this.timeStr = this.getTime(res[0].recordDuration)
  416. this.date = res[0].receptionTime;
  417. this.getCorpusAnalysis();
  418. this.creatAudio()
  419. }
  420. })
  421. },
  422. //首次跳转
  423. adasdasdasd(e) {
  424. const currTimeStr = this.formatTime(e)
  425. this.currentTimeStr = currTimeStr
  426. this.innerAudioContext.seek(e);
  427. this.innerAudioContext.play();
  428. },
  429. //录音文件切换隐藏
  430. showFile() {
  431. this.isshowFile = !this.isshowFile
  432. },
  433. changeVoiceShow() {
  434. this.voiceShow = !this.voiceShow;
  435. },
  436. voiceStart: function() {
  437. manager.start({
  438. lang: "zh_CN"
  439. });
  440. },
  441. voiceEnd: function() {
  442. // uni.showToast();
  443. if (this.isRecording) {
  444. uni.showLoading({
  445. title: "识别中"
  446. })
  447. }
  448. this.voiceShow = false;
  449. this.isRecording = false;
  450. manager.stop();
  451. },
  452. // 语音初始化
  453. initRecord() {
  454. const that = this;
  455. manager.onStart = function(res) {
  456. that.isRecording = true;
  457. // this.voiceState = "onStart:" + res.msg + "正在录音"
  458. };
  459. //有新的识别内容返回,则会调用此事件
  460. manager.onRecognize = (res) => {
  461. console.log('ing' + res.result);
  462. }
  463. // 识别结束事件
  464. manager.onStop = (res) => {
  465. uni.hideLoading();
  466. let newText = that.content + res.result;
  467. if (newText.length > 140) {
  468. newText = newText.substring(0, 140)
  469. }
  470. that.content = newText;
  471. that.textareaFocus = true;
  472. }
  473. // 识别错误事件
  474. manager.onError = (res) => {
  475. uni.hideLoading();
  476. }
  477. },
  478. // 录音暂停播放
  479. changePlayState() {
  480. if (this.audioPlay == false) {
  481. this.innerAudioContext.play();
  482. } else {
  483. this.innerAudioContext.pause()
  484. }
  485. },
  486. //音频前进回退
  487. sliderChangeComplate(e) {
  488. let platetime=e.detail.value*1000;
  489. this.dialogList=[]
  490. uni.request({
  491. url: config.service.fastForward + '?corpusId=' + this.luyinList[this.csdFileindex].id+"&bg="+platetime, //仅为示例,并非真实接口地址。
  492. method: "GET",
  493. header: {
  494. 'content-type': 'application/json',
  495. 'Authorization': 'Bearer '+uni.getStorageSync('weapp_session_login_data').token
  496. },
  497. success: (data) => {
  498. this.textindex=data.data.data.index;
  499. this.toptextindex=data.data.data.index;
  500. this.dialogList.push(this.newluyinList[data.data.data.index])
  501. const currTimeStr = this.formatTime(e.detail.value)
  502. this.currentTimeStr = currTimeStr
  503. this.innerAudioContext.seek(e.detail.value);
  504. this.innerAudioContext.play();
  505. }
  506. })
  507. },
  508. // 获取转义后的对话结果
  509. getCorpusAnalysis(){
  510. this.dialogList = [];
  511. uni.request({
  512. url: config.service.getCorpusAnal + '?corpusId=' + this.luyinList[this.csdFileindex].id+"&bg="+this.startTime+"&speaker="+this.roleindex, //仅为示例,并非真实接口地址。
  513. method: "GET",
  514. header: {
  515. 'content-type': 'application/json',
  516. 'Authorization': 'Bearer '+uni.getStorageSync('weapp_session_login_data').token
  517. },
  518. success: (data) => {
  519. const jsonInfo = JSON.parse(data.data.data.audioContent);
  520. //上拉标记点
  521. this.textindex=data.data.data.index;
  522. //下拉标记点
  523. this.toptextindex=data.data.data.index;
  524. jsonInfo.forEach(item=>{
  525. item.message=JSON.parse(item.onebest)
  526. item.backindex=this.csdFileindex
  527. })
  528. console.log(jsonInfo)
  529. this.newluyinList=jsonInfo;
  530. this.dialogList.push(jsonInfo[this.textindex]);
  531. var itc=parseInt(this.startTime/1000)
  532. this.adasdasdasd(itc)
  533. }
  534. })
  535. },
  536. getTime(time) {
  537. return util.formatSecond(time)
  538. },
  539. //录音实例
  540. creatAudio() {
  541. this.innerAudioContext = uni.createInnerAudioContext();
  542. this.innerAudioContext.autoplay = true;
  543. this.innerAudioContext.src = this.recordPath;
  544. this.innerAudioContext.title = '音频';
  545. this.onPlay()
  546. this.onPause()
  547. this.onCanplay()
  548. this.onEnded()
  549. this.onSeeking()
  550. this.onSeeked()
  551. this.TimeUpdate()
  552. },
  553. formatTime(num) {
  554. //格式化时间格式
  555. num = num.toFixed(0);
  556. let second = num % 60;
  557. if (second < 10) second = '0' + second;
  558. let min = Math.floor(num / 60);
  559. if (min < 10) min = '0' + min;
  560. return min + ":" + second;
  561. },
  562. changeContent(e) {
  563. this.content = e.detail.value;
  564. },
  565. answer(userId, tid) {
  566. this.answerId = tid;
  567. this.answerUserId = userId;
  568. this.editing = true;
  569. this.textareaFocus = true;
  570. },
  571. // 保存评论
  572. sendComment() {
  573. if (this.content == "") {
  574. uni.showToast({
  575. icon: "none",
  576. title: "请输入标题"
  577. })
  578. return;
  579. }
  580. let parames = {
  581. targetId: this.customerId,
  582. content: this.content,
  583. commentType: 1
  584. };
  585. if (this.answerUserId) {
  586. parames.replyCommentId = this.answerId;
  587. parames.replyUser = this.answerUserId;
  588. }
  589. const that = this;
  590. util.getRequestPromise(config.service.saveCmment, parames, false).then(data => {
  591. that.getCommentList();
  592. uni.showToast({
  593. title: "评论成功",
  594. icon: "none"
  595. })
  596. that.textareaFocus = false;
  597. that.content = "";
  598. });
  599. },
  600. uploadImage() {
  601. const that = this;
  602. var parames = {
  603. targetId: that.id,
  604. commentType: 1
  605. };
  606. if (this.answerUserId) {
  607. parames.replyCommentId = this.answerId;
  608. parames.replyUser = this.answerUserId;
  609. }
  610. uni.chooseImage({
  611. count: 1, //默认9
  612. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  613. sourceType: ['album', 'camera'],
  614. success: function(res) {
  615. uni.showLoading({
  616. title: "上传中"
  617. })
  618. uni.uploadFile({
  619. url: config.service.saveCmmentUpload,
  620. filePath: res.tempFilePaths[0],
  621. name: 'file',
  622. header: {
  623. 'Authorization': 'Bearer '+uni.getStorageSync('weapp_session_login_data').token
  624. },
  625. formData: parames,
  626. success: (uploadFileRes) => {
  627. that.getCommentList();
  628. uni.hideLoading();
  629. uni.showToast({
  630. icon: "none",
  631. title: "上传成功"
  632. })
  633. console.log(uploadFileRes.data);
  634. }
  635. });
  636. }
  637. });
  638. },
  639. changeLike() {
  640. uni.showLoading({
  641. title: "请求中",
  642. mask: true
  643. })
  644. if (this.isLiked) {
  645. this.cancelLike();
  646. } else {
  647. this.saveLike();
  648. }
  649. },
  650. // 点赞
  651. saveLike() {
  652. const that = this;
  653. util.getRequestPromise(config.service.saveLike, {
  654. targetId: this.customerId
  655. }, false).then(data => {
  656. that.isLiked = true;
  657. uni.hideLoading();
  658. uni.showToast({
  659. icon: "none",
  660. title: "点赞成功"
  661. })
  662. });
  663. },
  664. // 取消点赞
  665. cancelLike() {
  666. const that = this;
  667. util.getRequestPromise(config.service.cancelLike, {
  668. targetId: this.customerId
  669. }, false).then(data => {
  670. that.isLiked = false;
  671. uni.hideLoading();
  672. uni.showToast({
  673. icon: "none",
  674. title: "取消点赞成功"
  675. })
  676. });
  677. },
  678. gotoChat() {
  679. this.scrollId = null;
  680. this.$nextTick(() => {
  681. this.scrollId = "hash";
  682. })
  683. },
  684. gotoTop() {
  685. this.scrollId = null;
  686. this.$nextTick(() => {
  687. this.scrollId = "top";
  688. })
  689. },
  690. changeEditing(type) {
  691. this.editing = type;
  692. this.answerId = null;
  693. this.answerUserId = null;
  694. this.textareaFocus = false;
  695. this.dialogList.forEach(res=>{
  696. res.message.forEach(asd=>{
  697. asd.isshow=false;
  698. })
  699. })
  700. }
  701. }
  702. };
  703. </script>
  704. <style lang="scss" scoped>
  705. .audio-container {
  706. width: 100%;
  707. display: flex;
  708. justify-content: space-between;
  709. align-items: center;
  710. .audio-head {
  711. width: 60rpx;
  712. height: 60rpx;
  713. flex-shrink: 0;
  714. }
  715. .audio-head .image {
  716. width: 100%;
  717. height: 100%;
  718. }
  719. .audio-slider {
  720. width: 96%;
  721. position: relative;
  722. padding: 2px 0rpx 0px 20px;
  723. display: flex;
  724. justify-content: space-between;
  725. align-items: center;
  726. }
  727. .audio-slider .slider {
  728. width: 100%;
  729. padding: 0px 15rpx;
  730. box-sizing: border-box;
  731. }
  732. .audio-time {
  733. width: 110rpx;
  734. text-align: right;
  735. font-size: 24rpx;
  736. line-height: 28rpx;
  737. color: #70798D;
  738. display: flex;
  739. justify-content: space-between;
  740. }
  741. .audio-play {
  742. width: 40rpx;
  743. height: 40rpx;
  744. flex-shrink: 0;
  745. }
  746. .audio-play .image {
  747. width: 100%;
  748. height: 100%;
  749. }
  750. }
  751. .biaoqiantom{
  752. background-color: #008EF2;
  753. color: #FFFFFF;
  754. border: none;
  755. }
  756. // 表单
  757. .tian-view{
  758. width: 570rpx;
  759. background-color: #FFFFFF;
  760. border-bottom: 1px solid #ededee;
  761. display: flex;
  762. min-height: 96rpx;
  763. .tian-view-t1{
  764. width: 20rpx;
  765. font-size: 34rpx;
  766. height: 34rpx;
  767. line-height: 110rpx;
  768. letter-spacing: 0px;
  769. color: red;
  770. }
  771. .tian-view-t2{
  772. width:30%;
  773. min-height: 96rpx;
  774. line-height: 96rpx;
  775. font-size: 34rpx;
  776. color: #333;
  777. }
  778. .tian-view-t3{
  779. width: 61%;
  780. padding-top: 31rpx;
  781. padding-bottom:31rpx;
  782. display:flex;
  783. .tian-input{
  784. width:98%;
  785. font-size: 34rpx;
  786. border: none;
  787. }
  788. }
  789. }
  790. .zhezhoa {
  791. position: fixed;
  792. top: 0;
  793. left: 0;
  794. z-index: 999;
  795. width: 100%;
  796. height: 100vh;
  797. opacity: 0.5;
  798. background-color: #666666;
  799. }
  800. .bounced {
  801. width: 570rpx;
  802. background: #FFFFFF;
  803. z-index: 1000;
  804. border-radius: 10rpx;
  805. position: fixed;
  806. left: 50%;
  807. top: 50%;
  808. transform: translate(-50%, -50%);
  809. /* 50%为自身尺寸的一半 */
  810. .jiajinghuatit{
  811. width: 100%;
  812. height: 68rpx;
  813. font-size: 30rpx;
  814. text-align: center;
  815. line-height: 68rpx;
  816. }
  817. .jiajinghuaview{
  818. padding: 18rpx 18rpx 18rpx 18rpx;
  819. display: flex;
  820. flex-wrap:wrap;
  821. .jiajinghuaview1{
  822. padding: 8rpx 8rpx 8rpx 8rpx;
  823. font-size: 26rpx;
  824. border-radius: 12rpx;
  825. border: 1px solid #979797;
  826. margin-left: 8rpx;
  827. }
  828. .jighuaview2{
  829. padding: 8rpx 8rpx 8rpx 8rpx;
  830. font-size: 26rpx;
  831. border-radius: 12rpx;
  832. border: 1px solid #979797;
  833. margin-left: 8rpx;
  834. display: flex;
  835. .view1-text{
  836. text-align: center;
  837. // border-right: 1rpx solid red;
  838. }
  839. .view1-img{
  840. width: 50rpx;
  841. }
  842. }
  843. }
  844. .bounced3 {
  845. height: 100rpx;
  846. width: 100%;
  847. margin-top: 40rpx;
  848. border-top: 1px solid #dddddd;
  849. display: flex;
  850. }
  851. .bounced3-1 {
  852. width: 50%;
  853. height: 100%;
  854. text-align: center;
  855. line-height: 100rpx;
  856. border-right: 1px solid #dddddd;
  857. font-size: 36rpx;
  858. color: #999999;
  859. }
  860. .bounced3-2 {
  861. width: 50%;
  862. height: 100%;
  863. text-align: center;
  864. line-height: 100rpx;
  865. font-size: 36rpx;
  866. color: #108ee9;
  867. }
  868. }
  869. .bosdttom{
  870. color: #008EF2;
  871. }
  872. .tab-box {
  873. width: 100%;
  874. display: flex;
  875. justify-content: center;
  876. align-items: center;
  877. .yinpinshibie {
  878. width: 156rpx;
  879. height: 50rpx;
  880. font-size: 36rpx;
  881. font-weight: 400;
  882. color: #333333;
  883. text-align: center;
  884. line-height: 50rpx;
  885. letter-spacing: 2rpx;
  886. margin-right: 188rpx;
  887. &.active {
  888. position: relative;
  889. &::after {
  890. position: absolute;
  891. content: '';
  892. width: 119rpx;
  893. height: 8rpx;
  894. background: #008EF2;
  895. border-radius: 4rpx;
  896. top: 50rpx;
  897. right: 0;
  898. left: 0;
  899. margin: 0 auto;
  900. }
  901. }
  902. }
  903. .rate {
  904. width: 156rpx;
  905. height: 50rpx;
  906. font-size: 36rpx;
  907. font-weight: 400;
  908. color: #333333;
  909. line-height: 50rpx;
  910. letter-spacing: 2rpx;
  911. text-align: center;
  912. &.active {
  913. position: relative;
  914. &::after {
  915. position: absolute;
  916. content: '';
  917. width: 119rpx;
  918. height: 8rpx;
  919. background: #008EF2;
  920. border-radius: 4rpx;
  921. top: 50rpx;
  922. right: 0;
  923. left: 0;
  924. margin: 0 auto;
  925. }
  926. }
  927. }
  928. }
  929. .dialog-block {
  930. margin: 20rpx 0;
  931. border-bottom: 1px solid #ccc;
  932. .fileName {
  933. text-align: center;
  934. margin: 10rpx auto;
  935. width: 115rpx;
  936. height: 42rpx;
  937. line-height: 42rpx;
  938. background: #EFEFEF;
  939. border-radius: 4rpx;
  940. font-size: 20rpx;
  941. font-weight: 400;
  942. color: #333333;
  943. }
  944. }
  945. // 评分
  946. .rate-box {
  947. padding: 10rpx 20rpx;
  948. .date {
  949. width: 300rpx;
  950. height: 33rpx;
  951. font-size: 24rpx;
  952. font-weight: 400;
  953. color: #333333;
  954. line-height: 33rpx;
  955. letter-spacing: 1rpx;
  956. margin-bottom: 8rpx;
  957. }
  958. .title {
  959. width: 100%;
  960. height: 42rpx;
  961. font-size: 30rpx;
  962. font-weight: 500;
  963. color: #333333;
  964. line-height: 42rpx;
  965. letter-spacing: 2rpx;
  966. margin-bottom: 20rpx;
  967. }
  968. .level1 {
  969. display: flex;
  970. align-items: center;
  971. .level-name {
  972. width: 104rpx;
  973. height: 33rpx;
  974. font-size: 24rpx;
  975. font-weight: 500;
  976. color: #333333;
  977. line-height: 33rpx;
  978. letter-spacing: 1rpx;
  979. margin-right: 10rpx;
  980. }
  981. .level-progress {
  982. flex: 1;
  983. border-radius: 11rpx;
  984. height: 21rpx;
  985. background-color: #BEE4FF;
  986. position: relative;
  987. .color {
  988. width: 0;
  989. position: absolute;
  990. top: 0;
  991. left: 0;
  992. height: 21rpx;
  993. border-radius: 11rpx 0 0 11rpx;
  994. background-color: #008EF2;
  995. }
  996. }
  997. .level-rate {
  998. width: 65rpx;
  999. height: 33rpx;
  1000. font-size: 24rpx;
  1001. font-weight: 500;
  1002. color: #333333;
  1003. line-height: 33rpx;
  1004. letter-spacing: 1rpx;
  1005. margin: 0 20rpx 0 15rpx;
  1006. }
  1007. .arrow {
  1008. width: 37rpx;
  1009. height: 21rpx;
  1010. padding: 5rpx 20rpx;
  1011. }
  1012. .rotatearrow {
  1013. transform: rotate(270deg);
  1014. }
  1015. }
  1016. .level1-subbox {
  1017. display: flex;
  1018. margin-top: 20rpx;
  1019. flex-wrap: wrap;
  1020. .sub-name {
  1021. width: 50%;
  1022. display: flex;
  1023. margin-bottom: 18rpx;
  1024. .subitem-name {
  1025. width: 104rpx;
  1026. height: 33rpx;
  1027. font-size: 24rpx;
  1028. font-weight: 400;
  1029. color: #999999;
  1030. line-height: 33rpx;
  1031. letter-spacing: 1rpx;
  1032. margin-right: 12rpx;
  1033. }
  1034. .checkimg {
  1035. width: 27rpx;
  1036. height: 27rpx;
  1037. }
  1038. }
  1039. }
  1040. }
  1041. .luyin {
  1042. height: 100rpx;
  1043. width: 100%;
  1044. }
  1045. .translation {
  1046. padding-left: 30rpx;
  1047. padding-right: 30rpx;
  1048. background: #FFFFFF;
  1049. display: flex;
  1050. flex-direction: column;
  1051. height: 100vh;
  1052. }
  1053. .translation .top {
  1054. margin: 0 -30rpx;
  1055. padding: 0 30rpx;
  1056. background: #ffffff;
  1057. border-bottom: 1rpx solid #F2F2F2;
  1058. padding-bottom: 10rpx;
  1059. }
  1060. .translation .top .title {
  1061. display: flex;
  1062. justify-content: space-between;
  1063. .hash {
  1064. color: rgba(21, 144, 233, 1);
  1065. font-size: 24rpx;
  1066. }
  1067. }
  1068. .call_record_time {
  1069. height: 44rpx;
  1070. font-size: 28rpx;
  1071. font-weight: 600;
  1072. color: #008EF2;
  1073. line-height: 44rpx;
  1074. }
  1075. .call_record_time_one {
  1076. height: 48rpx;
  1077. font-size: 24rpx;
  1078. font-weight: 500;
  1079. color: #70798d;
  1080. line-height: 48rpx;
  1081. display: flex;
  1082. justify-content: space-between;
  1083. position: relative;
  1084. .diangweitupian{
  1085. width: 46rpx;
  1086. height: 46rpx;
  1087. // border: 1px solid red;
  1088. position: absolute;
  1089. top: 0rpx;
  1090. right: 75rpx;
  1091. }
  1092. .file-change {
  1093. position: absolute;
  1094. top: 50rpx;
  1095. right: 0rpx;
  1096. width: 184rpx;
  1097. background: #FFFFFF;
  1098. box-shadow: 0rpx 0rpx 6rpx 2rpx rgba(230, 230, 230, 0.5);
  1099. border-radius: 4rpx;
  1100. z-index: 99;
  1101. height: auto;
  1102. max-height: 600rpx;
  1103. overflow: auto;
  1104. }
  1105. .file-item {
  1106. width: 184rpx;
  1107. height: 60rpx;
  1108. line-height: 60rpx;
  1109. text-align: center;
  1110. font-size: 30rpx;
  1111. font-weight: 400;
  1112. color: #333333;
  1113. border-bottom: 1rpx solid #E2E2E2;
  1114. }
  1115. .file-item:last-child {
  1116. border: 0
  1117. }
  1118. .fileactive {
  1119. color: #008EF2
  1120. }
  1121. }
  1122. .dingweishiy{
  1123. position: relative;
  1124. .tankuangcss{
  1125. position: absolute;
  1126. bottom: -50rpx;
  1127. left:0rpx;
  1128. width: 100%;
  1129. // border: 1rpx solid red;
  1130. font-size: 24rpx;
  1131. color: #FFFFFF;
  1132. padding-top: 4rpx;
  1133. padding-bottom:4rpx;
  1134. display: flex;
  1135. justify-content: center;
  1136. border-radius: 15rpx;
  1137. z-index: 1000;
  1138. }
  1139. .biaoqianya{
  1140. width: 631rpx;
  1141. margin: 0 auto;
  1142. position: absolute;
  1143. bottom: -120rpx;
  1144. left:0rpx;
  1145. z-index: 2000;
  1146. color: #FFFFFF;
  1147. .biaoqianyaisshow{
  1148. background-image: url(../../../static/images/biaoqianya.png);
  1149. background-size: 100% 100%;
  1150. text-align: left;
  1151. text-indent: 20rpx;
  1152. }
  1153. }
  1154. }
  1155. .scroll-Y {
  1156. font-size: 36rpx;
  1157. color: #999999;
  1158. background: #FFFFFF;
  1159. margin-top: 30rpx;
  1160. flex: 1;
  1161. overflow-y: scroll;
  1162. width: 100%;
  1163. }
  1164. .scroll-Y .text {
  1165. margin: 80rpx 30rpx;
  1166. line-height: 80rpx;
  1167. display: flex;
  1168. align-items: center;
  1169. }
  1170. .scroll-Y .text[data-speaker="2"],
  1171. .scroll-Y .text[data-speaker="4"],
  1172. .scroll-Y .text[data-speaker="6"] {
  1173. flex-direction: row-reverse;
  1174. text-align: right;
  1175. .content {
  1176. margin-left: 0;
  1177. margin-right: 30rpx;
  1178. background: #F6F6F6;
  1179. color: #999999;
  1180. }
  1181. }
  1182. .scroll-Y .text .avatar {
  1183. width: 64rpx;
  1184. height: 64rpx;
  1185. line-height: 64rpx;
  1186. text-align: center;
  1187. // border: 1rpx solid red;
  1188. font-size: 36rpx;
  1189. border-radius: 50%;
  1190. background: #F2F2F2;
  1191. color: #008EF2;
  1192. // display: flex;
  1193. // justify-content: center;
  1194. // align-items: center;
  1195. image {
  1196. width: 40rpx;
  1197. }
  1198. }
  1199. .scroll-Y .text .content {
  1200. margin-left: 30rpx;
  1201. line-height: 60rpx;
  1202. text-align: left;
  1203. padding: 0 5px;
  1204. background: #2BC805;
  1205. border-radius: 8rpx;
  1206. max-width: 442rpx;
  1207. color: #FFFFFF;
  1208. }
  1209. .scroll-Y .text.active .content {
  1210. color: #FF7538 !important;
  1211. position: relative;
  1212. }
  1213. .scroll-Y .text.active[data-speaker="2"] .content,
  1214. .scroll-Y .text.active[data-speaker="4"] .content,
  1215. .scroll-Y .text.active[data-speaker="6"] .content {
  1216. color: #FF7538 !important;
  1217. position: relative;
  1218. }
  1219. .likeArea {
  1220. width: 86rpx;
  1221. height: 84rpx;
  1222. margin: 20rpx auto 38rpx auto;
  1223. border-radius: 50%;
  1224. display: flex;
  1225. justify-content: center;
  1226. align-items: center;
  1227. border: 1rpx solid #C1C2C1;
  1228. &.liked {
  1229. border: 1rpx solid rgba(21, 144, 233, 1);
  1230. }
  1231. image {
  1232. width: 38rpx;
  1233. height: 39rpx;
  1234. }
  1235. }
  1236. .chat {
  1237. display: flex;
  1238. flex-direction: column;
  1239. border-top: 1rpx solid rgba(151, 151, 151, 0.4);
  1240. padding-top: 20rpx;
  1241. .total {
  1242. color: rgba(21, 144, 233, 1);
  1243. font-size: 24rpx;
  1244. }
  1245. .list {
  1246. display: flex;
  1247. flex-direction: column;
  1248. .message {
  1249. display: flex;
  1250. margin-top: 20rpx;
  1251. border-bottom: 1rpx solid rgba(151, 151, 151, 0.4);
  1252. padding-bottom: 20rpx;
  1253. &:last-child {
  1254. border-bottom: 0;
  1255. }
  1256. .avator {
  1257. margin-left: 120rpx;
  1258. }
  1259. &:first-child {
  1260. .avator {
  1261. margin-left: 0;
  1262. }
  1263. }
  1264. .right {
  1265. display: flex;
  1266. flex-direction: column;
  1267. margin-left: 20rpx;
  1268. flex: 1;
  1269. .name {
  1270. color: rgba(16, 16, 16, 1);
  1271. font-size: 30rpx;
  1272. }
  1273. .subtitle {
  1274. color: rgba(120, 120, 120, 1);
  1275. font-size: 24rpx;
  1276. margin-top: 16rpx;
  1277. }
  1278. .answer {
  1279. font-size: 24rpx;
  1280. color: #787878;
  1281. }
  1282. .content {
  1283. color: rgba(49, 48, 48, 1);
  1284. font-size: 30rpx;
  1285. margin-top: 20rpx;
  1286. position: relative;
  1287. }
  1288. .bottom {
  1289. margin-top: 16rpx;
  1290. display: flex;
  1291. justify-content: space-between;
  1292. .time {
  1293. color: rgba(185, 185, 185, 1);
  1294. font-size: 20rpx;
  1295. }
  1296. .button {
  1297. color: rgba(144, 144, 144, 1);
  1298. font-size: 30rpx;
  1299. width: 111rpx;
  1300. height: 44rpx;
  1301. border-radius: 22rpx;
  1302. border: 1rpx solid rgba(151, 151, 151, 1);
  1303. text-align: center;
  1304. }
  1305. }
  1306. }
  1307. }
  1308. }
  1309. }
  1310. .bottomArea {
  1311. min-height: 90rpx;
  1312. background: #F0F2F5;
  1313. width: 100vw;
  1314. margin: 0 -30rpx;
  1315. display: flex;
  1316. align-items: center;
  1317. border-top: 1rpx solid rgba(151, 151, 151, 0.25);
  1318. .voice {
  1319. width: 44rpx;
  1320. height: 44rpx;
  1321. margin-left: 38rpx;
  1322. }
  1323. .inputArea {
  1324. margin-left: 38rpx;
  1325. margin-right: 38rpx;
  1326. flex: 1;
  1327. display: flex;
  1328. position: relative;
  1329. .edit {
  1330. width: 30rpx;
  1331. height: 28rpx;
  1332. position: absolute;
  1333. top: 31rpx;
  1334. left: 27rpx;
  1335. }
  1336. .editor {
  1337. background: rgba(0, 139, 245, 0.17);
  1338. border-radius: 29rpx;
  1339. flex: 1;
  1340. min-height: 58rpx;
  1341. width: unset;
  1342. padding: 0 32rpx;
  1343. font-size: 30rpx;
  1344. margin: 16rpx 0;
  1345. line-height: 29px;
  1346. }
  1347. .placeholder {
  1348. position: absolute;
  1349. left: 70rpx;
  1350. top: 22rpx;
  1351. color: #26A2FF;
  1352. &.editing {
  1353. left: 36rpx;
  1354. }
  1355. }
  1356. }
  1357. .download {
  1358. width: 41rpx;
  1359. height: 35rpx;
  1360. margin-right: 36rpx;
  1361. }
  1362. .like {
  1363. width: 38rpx;
  1364. height: 39rpx;
  1365. margin-right: 38rpx;
  1366. }
  1367. .add {
  1368. width: 50rpx;
  1369. height: 50rpx;
  1370. margin-right: 38rpx;
  1371. }
  1372. .send {
  1373. background: #1590e9;
  1374. color: white;
  1375. padding: 10rpx 20rpx;
  1376. margin: 5px;
  1377. border-radius: 8rpx;
  1378. }
  1379. }
  1380. .backTop {
  1381. width: 60rpx;
  1382. height: 60rpx;
  1383. background: rgba(211, 235, 253, 1);
  1384. box-shadow: 0rpx 0rpx 2rpx 4rpx rgba(38, 161, 255, 0.04);
  1385. border-radius: 50%;
  1386. position: fixed;
  1387. bottom: 200rpx;
  1388. right: 8rpx;
  1389. display: flex;
  1390. justify-content: center;
  1391. align-items: center;
  1392. image {
  1393. width: 26rpx;
  1394. height: 34rpx;
  1395. }
  1396. }
  1397. .voiceContent {
  1398. position: fixed;
  1399. top: 0;
  1400. bottom: 0;
  1401. left: 0;
  1402. right: 0;
  1403. width: 100vw;
  1404. height: 100vh;
  1405. display: flex;
  1406. justify-content: center;
  1407. align-items: center;
  1408. background: rgba(30, 30, 30, 0.4592);
  1409. z-index: 10001;
  1410. }
  1411. .box {
  1412. background: rgba(21, 144, 233, 0.299);
  1413. width: 524rpx;
  1414. height: 524rpx;
  1415. border-radius: 50%;
  1416. display: flex;
  1417. align-items: center;
  1418. justify-content: center;
  1419. .center {
  1420. width: 412rpx;
  1421. height: 412rpx;
  1422. background: #1590E9;
  1423. border-radius: 50%;
  1424. display: flex;
  1425. align-items: center;
  1426. justify-content: center;
  1427. flex-direction: column;
  1428. .voice {
  1429. width: 110rpx;
  1430. height: 133rpx;
  1431. }
  1432. .text {
  1433. color: #FFFFFF;
  1434. font-size: 36rpx;
  1435. margin-top: 24rpx;
  1436. }
  1437. }
  1438. }
  1439. </style>