AI销管
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 

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