AI销管
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

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