AI销管
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

1558 rader
34 KiB

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