chat-room.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. <template>
  2. <div class="chat-room common-container">
  3. <!-- 顶部 -->
  4. <div class="chat-room-head">
  5. <div class="head-title">
  6. <span>监控中心</span>
  7. </div>
  8. <div class="head-btn parent">
  9. <el-button
  10. type="danger"
  11. class="vertical-center exitBtn"
  12. size="medium"
  13. @click="goBack()"
  14. >退出</el-button>
  15. <!--<el-switch
  16. class="vertical-center head-switch"
  17. v-model="busy"
  18. active-color="#13ce66"
  19. inactive-color="#ccc"
  20. active-text="示忙"
  21. ></el-switch>-->
  22. </div>
  23. </div>
  24. <!-- 主体内容部分 -->
  25. <div class="chat-room-body">
  26. <!-- 聊天框 -->
  27. <div class="body-centre">
  28. <div class="centre-top">
  29. <div class="centre-top-title">{{name}}-<span v-if="dataTable == 1">问诊</span><span v-else>出诊</span></div>
  30. <el-scrollbar style="background-color:#fff; height: 400px;" ref="scrollbar">
  31. <div class="centre-top-content clearfix">
  32. <div>
  33. <button type="button" class="btn-history" v-if="isShowHistory" id="btnhistory" @click="showHistoryDesc($event)">查看历史记录</button>
  34. </div>
  35. <div
  36. class="chat-records"
  37. v-for="(item,index) in chatList"
  38. :key="index"
  39. :class="item.fromUser === customerServiceId ? 'reverse' : 'row' "
  40. >
  41. <div class="chat-records-icon">
  42. <el-image
  43. :src="item.avatarUrl | pathPipe"
  44. style="width:35px;height:35px"
  45. fit="cover"
  46. ></el-image>
  47. </div>
  48. <div class="chat-records-content" v-if="(item.msg.substr(item.msg.lastIndexOf('.')+1)!='jpg') && (item.msg.substr(item.msg.lastIndexOf('.')+1)!='png')">{{item.msg}}</div>
  49. <div class="chat-records-content" v-else>
  50. <span @click="imgOpen(item.msg)" style="cursor:pointer;">
  51. <el-image :src="item.msg | pathPipe" style="width:100px;height:100px;">
  52. </el-image>
  53. </span>
  54. </div>
  55. </div>
  56. </div>
  57. </el-scrollbar>
  58. </div>
  59. <div class="centre-bottom">
  60. <div class="bottom-top">
  61. <!-- <i class="el-icon-setting"></i>
  62. <i class="el-icon-warning-outline"></i>
  63. <i class="el-icon-remove-outline"></i>
  64. <i class="el-icon-circle-check"></i> -->
  65. </div>
  66. <div class="bottom-text clearfix">
  67. <el-input
  68. type="textarea"
  69. resize="none"
  70. placeholder="请输入内容..."
  71. v-model="content"
  72. ></el-input>
  73. <el-button
  74. type="success"
  75. class="fr send"
  76. size="medium"
  77. @click="sendMessage()"
  78. >发送</el-button>
  79. </div>
  80. </div>
  81. </div>
  82. <!-- 右边聊天成员击专家成员-->
  83. <div class="body-rignt">
  84. <!-- 隐藏聊天成员 -->
  85. <div v-show="false" class="member">
  86. <div class="member-head">聊天成员({{this.memberList.length || 0}}人)</div>
  87. <div class="member-box">
  88. <el-scrollbar>
  89. <div
  90. class="membei-list"
  91. v-for="(item,index) in memberList"
  92. :key="index"
  93. >
  94. <!-- <div class="circle" :class="item.flag === true?'active':'inactive'"></div> -->
  95. <div class="membei-icon">
  96. <el-image
  97. :src="item.avatarUrl | pathPipe"
  98. style="width:43px;height:43px"
  99. fit="cover"
  100. ></el-image>
  101. </div>
  102. <div class="member-people">
  103. <div class="people-name">{{item.name}}</div>
  104. <div class="people-time">{{item.createTime | formatTimePipe}}</div>
  105. </div>
  106. </div>
  107. </el-scrollbar>
  108. </div>
  109. </div>
  110. <div class="expert-list-bigbox">
  111. <div class="expert-title">专家列表</div>
  112. <el-scrollbar class="expert-scrollbar">
  113. <div class="expert-list">
  114. <el-scrollbar>
  115. <div
  116. class="membei-list pointer"
  117. v-for="(item,index) in expertList"
  118. :key="index"
  119. >
  120. <div class="left-side">
  121. <div style="margin-top:20px;">
  122. <i
  123. class="el-icon-success"
  124. :class="item.userId === checkId?'check-active':'check-inactive'"
  125. @click="selectExpert(item)"
  126. ></i>
  127. </div>
  128. <div class="membei-icon">
  129. <el-image
  130. :src="item.avatarUrl | pathPipe"
  131. style="width:43px;height:43px"
  132. fit="cover"
  133. ></el-image>
  134. </div>
  135. <div class="member-people">
  136. <div class="people-name txt-ovehid">
  137. <span>{{item.name}}</span>
  138. <span class="expert-label">
  139. <span v-if="item.platformInvitedFlag !== 0">普通专家</span>
  140. <span v-if="item.platformInvitedFlag === 0">特邀专家</span>
  141. </span>
  142. <span class="expert-level">
  143. <span v-if="item.expertLevel === 1">一级</span>
  144. <span v-if="item.expertLevel === 2">二级</span>
  145. <span v-if="item.expertLevel === 3">三级</span>
  146. <span v-if="item.expertLevel === 4">四级</span>
  147. <span v-if="item.expertLevel === 5">五级</span>
  148. </span>
  149. </div>
  150. <div
  151. class="people-time"
  152. >{{item.createTime | formatTimePipe}}</div>
  153. <div class="people-phone">{{item.mobile}}</div>
  154. </div>
  155. </div>
  156. <div class="member-people-btn">
  157. <el-button
  158. type="primary"
  159. class
  160. size="mini"
  161. disabled
  162. @click="callExpert(item)"
  163. >呼叫</el-button>
  164. </div>
  165. </div>
  166. </el-scrollbar>
  167. </div>
  168. </el-scrollbar>
  169. <div class="Invite-experts clearfix">
  170. <el-button
  171. type="success"
  172. class="fr Invite-experts-btn"
  173. size="medium"
  174. @click="inviteExpert()"
  175. >邀请专家</el-button>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. </template>
  182. <script>
  183. import { webSocketUrl } from '../../../../../config';
  184. import { queryLiftCasesList, queryChatHistoryList, invitationExpert, queryMsgHistoryList } from '@/apps/mobile/api/monitoring-center/index';
  185. import { queryAllExpert } from '@/apps/mobile/api/expert/index';
  186. import { isArray, chatUnique, chatUnique2 } from '@/apps//mobile/utils/util';
  187. export default {
  188. data() {
  189. return {
  190. id: null, // 诊单id
  191. sessionId: null, // 房间id
  192. customerServiceId: null, // 平台客服id
  193. expertId: null, // 专家id
  194. statuz: null, // 诊单状态
  195. busy: false,
  196. masterList: [],
  197. memberList: [],
  198. expertList: [],
  199. chatList: [],
  200. content: '',
  201. page: {
  202. pageNum: 1,
  203. pageSize: 500,
  204. sort: {
  205. order: 'desc',
  206. orderBy: 'create_time',
  207. },
  208. },
  209. chatPage: {
  210. pageNum: 1,
  211. pageSize: 500,
  212. },
  213. checkId: -1,
  214. name: null,
  215. dataTable: null,
  216. $ws: null,
  217. timer: '',
  218. isShowHistory: true
  219. };
  220. },
  221. created() {
  222. this.id = this.$route.query.id;
  223. this.name = this.$route.query.name;
  224. this.sessionId = this.$route.query.sessionId;
  225. this.customerServiceId = this.$route.query.customerServiceId;
  226. this.dataTable = this.$route.query.dataTable;
  227. // this.queryChatHistoryData();
  228. this.queryExpertData();
  229. if (!this.id) {
  230. this.queryLiftCaseData();
  231. console.log('NoId...');
  232. }
  233. },
  234. mounted() {
  235. this.initWebSocket();
  236. },
  237. beforeDestroy() {
  238. clearInterval(this.timer);
  239. },
  240. methods: {
  241. imgOpen(item) {
  242. window.open(item);
  243. },
  244. // 诊单---------------------------------------------------------
  245. queryLiftCaseData() {
  246. let obj = {
  247. ...this.page,
  248. type: 'BACKQUERY',
  249. sessionId: this.sessionId,
  250. // customerServiceId: this.customerServiceId,
  251. };
  252. queryLiftCasesList(obj)
  253. .then(res => {
  254. if (res.data && res.data.records && res.data.records.length > 0) {
  255. this.id = res.data.records[0].id;
  256. }
  257. })
  258. .catch();
  259. },
  260. // 聊天开始-------------------------------------------------------
  261. initWebSocket() {
  262. if (window.WebSocket) {
  263. this.$ws = new WebSocket(webSocketUrl);
  264. this.$ws.onopen = this.wsOpen;
  265. this.$ws.onclose = this.wsClose;
  266. this.$ws.onmessage = this.wsMessage;
  267. this.$ws.onerror = this.wsError;
  268. } else {
  269. this.$message.warning('浏览器暂不支持WebSocket服务');
  270. }
  271. },
  272. wsOpen(e) {
  273. console.log('WebSocket连接成功...........');
  274. this.initSeeionLogin();
  275. this.initLogin();
  276. this.timer = setInterval(this.initLoopLogin, 10000);
  277. },
  278. wsClose: function(e) {
  279. console.log('WebSocket连接关闭...........');
  280. clearInterval(this.timer);
  281. },
  282. wsError: function(e) {
  283. console.log('WebSocket连接出现错误............');
  284. },
  285. wsMessage: function(e) {
  286. let msgData = JSON.parse(e.data);
  287. console.log('...消息...', msgData);
  288. if (msgData && msgData.cmd === 'INITROOM') {
  289. let msgs = JSON.parse(msgData.msg);
  290. if (msgs && msgs.length > 0) {
  291. for (let index = 0; index < msgs.length; index++) {
  292. msgs[index] = JSON.parse(msgs[index]);
  293. }
  294. this.chatList = msgs;
  295. }
  296. } else if (msgData && msgData.cmd === 'CHAT') {
  297. this.content = '';
  298. this.chatList.push(msgData);
  299. if (this.chatList && this.chatList.length > 0) {
  300. this.keepChattingTop();
  301. }
  302. } else {
  303. }
  304. },
  305. initLogin() {
  306. let obj = {};
  307. // obj.cmd = 'LOGINALL';
  308. obj.cmd = 'INITROOM';
  309. obj.type = 1;
  310. obj.avatarUrl = JSON.parse(sessionStorage.getItem('avatarUrl'));
  311. obj.time = new Date().getTime();
  312. obj.fromUser = this.customerServiceId;
  313. obj.userId = this.customerServiceId;
  314. obj.name = '管理员';
  315. obj.sessionid = this.sessionId;
  316. obj.msg = '管理员进入该房间了!';
  317. this.$ws.send(JSON.stringify(obj));
  318. },
  319. initSeeionLogin() {
  320. let obj = {};
  321. obj.cmd = 'LOGINALL';
  322. obj.type = 1;
  323. obj.avatarUrl = JSON.parse(sessionStorage.getItem('avatarUrl'));
  324. obj.time = new Date().getTime();
  325. obj.fromUser = this.customerServiceId;
  326. obj.userId = this.customerServiceId;
  327. obj.name = '管理员';
  328. obj.sessionid = this.sessionId;
  329. obj.msg = '管理员进入该房间了!';
  330. this.$ws.send(JSON.stringify(obj));
  331. },
  332. initLoopLogin() {
  333. let obj = {};
  334. obj.cmd = 'LOOP';
  335. obj.userId = this.customerServiceId;
  336. this.$ws.send(JSON.stringify(obj));
  337. },
  338. sendMessage() {
  339. if (!window.WebSocket) {
  340. return;
  341. }
  342. if (this.content.replace(/\s/gi, '') == '') {
  343. return;
  344. }
  345. let obj = {};
  346. obj.cmd = 'CHAT';
  347. obj.type = 1;
  348. obj.avatarUrl = JSON.parse(sessionStorage.getItem('avatarUrl'));
  349. obj.time = new Date().getTime();
  350. obj.fromUser = this.customerServiceId;
  351. obj.userId = this.customerServiceId;
  352. obj.name = '管理员';
  353. obj.sessionid = this.sessionId;
  354. obj.msg = this.content;
  355. this.$ws.send(JSON.stringify(obj));
  356. },
  357. // 聊天结束-------------------------------------------------------
  358. // queryChatHistoryData() {
  359. // let obj = {
  360. // ...this.chatPage,
  361. // sessionid: this.sessionId,
  362. // };
  363. // queryChatHistoryList(obj)
  364. // .then(res => {
  365. // // console.log('聊天历史记录', res);
  366. // if (res.data && res.data.records && res.data.records.length > 0) {
  367. // this.chatList = res.data.records;
  368. // let chatData = [...res.data.records];
  369. // this.chatList = chatData.reverse();
  370. // if (this.chatList && this.chatList.length > 0) {
  371. // this.keepChattingTop();
  372. // }
  373. // }
  374. // })
  375. // .catch();
  376. // },
  377. // 专家 -------------------------------------------------
  378. queryExpertData() {
  379. let obj = {
  380. sort: {
  381. order: 'desc',
  382. orderBy: 'platform_invited_flag',
  383. }
  384. };
  385. queryAllExpert(obj)
  386. .then(res => {
  387. console.log('专家列表', res);
  388. this.expertList = res.data;
  389. })
  390. .catch();
  391. },
  392. selectExpert(data) {
  393. console.log(data);
  394. this.checkId = data.userId;
  395. this.expertId = data.userId;
  396. this.statuz = data.statuz;
  397. },
  398. inviteExpert() {
  399. if (!this.expertId) {
  400. this.$message({
  401. type: 'warning',
  402. message: '请先选择一个专家',
  403. });
  404. return false;
  405. }
  406. //问诊
  407. if(this.statuz == 1 || this.statuz == 8){
  408. let obj = {
  409. id: this.id,
  410. chargerId: this.expertId,
  411. };
  412. invitationExpert(obj)
  413. .then(res => {
  414. if(res.statusCode==="1"){
  415. this.$message.success('已邀请此专家,请耐心等候!');
  416. this.queryLiftCaseData();
  417. this.checkId = -1;
  418. this.expertId = null;
  419. }
  420. else{
  421. this.$message.error(res.message);
  422. }
  423. })
  424. .catch();
  425. }
  426. //出诊
  427. else if(this.statuz == 0 || this.statuz == 8){
  428. let obj = {
  429. id: this.id,
  430. chargerId: this.expertId,
  431. };
  432. invitationExpert(obj)
  433. .then(res => {
  434. if(res.statusCode==="1"){
  435. this.$message.success('已邀请此专家,请耐心等候!');
  436. this.queryLiftCaseData();
  437. this.checkId = -1;
  438. this.expertId = null;
  439. }
  440. else{
  441. this.$message.error(data.message);
  442. }
  443. })
  444. .catch();
  445. }
  446. else{
  447. this.$message.warning('该专家已接单,请选择其他专家!');
  448. }
  449. },
  450. callExpert(data) {
  451. // console.log(data);
  452. },
  453. goBack() {
  454. this.$router.go(-1);
  455. },
  456. // 聊天消息置顶
  457. keepChattingTop() {
  458. this.$nextTick(() => {
  459. let scrollRef = this.$refs['scrollbar'].$refs['wrap'];
  460. if (scrollRef && scrollRef.scrollHeight) {
  461. scrollRef.scrollTop = scrollRef.scrollHeight;
  462. }
  463. });
  464. },
  465. showHistoryDesc(e){
  466. let el = e.currentTarget;
  467. console.warn(el);
  468. let obj = {
  469. ...this.chatPage,
  470. sessionid: this.sessionId,
  471. };
  472. queryMsgHistoryList(obj)
  473. .then(res => {
  474. console.log('聊天历史记录', res);
  475. if (res.data && res.data.length > 0) {
  476. this.chatList = this.chatList.concat(res.data);
  477. }
  478. })
  479. .catch();
  480. this.isShowHistory = false;
  481. }
  482. },
  483. destroyed() {
  484. this.$ws.onclose();
  485. },
  486. };
  487. </script>
  488. <style lang="stylus" scoped>
  489. .chat-room {
  490. width: 100%;
  491. margin: 0 auto;
  492. }
  493. .chat-room-head {
  494. display: flex;
  495. height: 64px;
  496. .head-title {
  497. background-color: rgba(0, 40, 77, 1);
  498. span {
  499. display: block;
  500. width: 256px;
  501. height: 64px;
  502. line-height: 64px;
  503. text-align: center;
  504. font-weight: 700;
  505. font-style: normal;
  506. font-size: 20px;
  507. color: rgba(255, 255, 255, 0.847058823529412);
  508. }
  509. }
  510. .head-btn {
  511. width: calc(100% - 256px);
  512. .exitBtn {
  513. left: 80px;
  514. font-size: 16px;
  515. }
  516. .head-switch {
  517. right: 20px;
  518. }
  519. }
  520. }
  521. .chat-room-body {
  522. display: flex;
  523. justify-content: space-around;
  524. padding: 20px 10px;
  525. background-color: rgba(240, 242, 245, 1);
  526. .body-centre {
  527. width: 700px;
  528. .centre-top {
  529. .centre-top-title {
  530. height: 20px;
  531. line-height: 20px;
  532. font-size: 16px;
  533. color: #000000;
  534. text-indent: 10px;
  535. background-color: #f5f5f5;
  536. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
  537. }
  538. .centre-top-content {
  539. width: 100%;
  540. background-color: #fff;
  541. .left-side {
  542. width: 350px;
  543. border: 1px solid green;
  544. padding-left: 8px;
  545. }
  546. .left-item {
  547. width: 100%;
  548. display: flex;
  549. margin-bottom: 10px;
  550. }
  551. .left-chat-content {
  552. max-width: 160px;
  553. padding: 8px;
  554. margin-top: 4px;
  555. border-radius: 5px;
  556. background-color: #f5f5f5;
  557. height: auto;
  558. }
  559. .right-side {
  560. display: flex;
  561. width: 350px;
  562. border: 1px solid yellow;
  563. padding-right: 8px;
  564. }
  565. .right-item {
  566. width: 100%;
  567. display: flex;
  568. margin-bottom: 10px;
  569. flex-direction: row-reverse;
  570. }
  571. .right-chat-content {
  572. max-width: 160px;
  573. padding: 8px;
  574. margin-top: 4px;
  575. border-radius: 5px;
  576. background-color: #f5f5f5;
  577. height: auto;
  578. }
  579. .chat-records {
  580. display: flex;
  581. min-height: 76px;
  582. padding: 20px;
  583. .chat-records-icon {
  584. margin: 0 5px;
  585. width: 35px;
  586. height: 35px;
  587. .el-image {
  588. border-radius: 50%;
  589. }
  590. }
  591. .chat-records-content {
  592. max-width: 160px;
  593. padding: 8px;
  594. margin-top: 3px;
  595. border-radius: 5px;
  596. background-color: #f5f5f5;
  597. }
  598. }
  599. .row {
  600. flex-direction: row;
  601. }
  602. .reverse {
  603. flex-direction: row-reverse;
  604. }
  605. }
  606. }
  607. .centre-bottom {
  608. .bottom-top {
  609. height: 30px;
  610. padding-left: 10px;
  611. i {
  612. margin-right: 5px;
  613. height: 30px;
  614. line-height: 30px;
  615. }
  616. i:before {
  617. font-size: 16px;
  618. }
  619. }
  620. .bottom-text {
  621. background-color: #fff;
  622. padding-bottom: 20px;
  623. .send {
  624. margin-right: 10px;
  625. }
  626. }
  627. }
  628. }
  629. .body-rignt {
  630. width: 350px;
  631. background-color: #fff;
  632. .member {
  633. padding: 0 20px;
  634. .member-head {
  635. height: 40px;
  636. line-height: 40px;
  637. font-size: 16px;
  638. font-weight: 700;
  639. }
  640. .member-box {
  641. height: 180px;
  642. }
  643. .membei-list {
  644. display: flex;
  645. position: relative;
  646. padding: 2px 0;
  647. border-bottom: 1px solid #f2f2f2;
  648. margin-bottom: 10px;
  649. .membei-icon {
  650. padding: 5px;
  651. .el-image {
  652. border-radius: 50%;
  653. }
  654. }
  655. .member-people {
  656. div {
  657. height: 25px;
  658. line-height: 25px;
  659. font-size: 14px;
  660. }
  661. .people-name {
  662. color: rgba(24, 210, 94, 1);
  663. font-size: 16px;
  664. }
  665. .people-time {
  666. color: #7f7f7f;
  667. }
  668. .people-phone {
  669. color: rgba(24, 210, 94, 1);
  670. }
  671. }
  672. .member-people-btn {
  673. position: absolute;
  674. top: 10px;
  675. right: 10px;
  676. }
  677. .circle {
  678. width: 8px;
  679. height: 8px;
  680. border-radius: 50%;
  681. background-color: red;
  682. }
  683. .active {
  684. background-color: #67C23A;
  685. }
  686. .inactive {
  687. background-color: #ccc;
  688. }
  689. }
  690. }
  691. .expert-list-bigbox {
  692. .expert-title {
  693. text-indent: 20px;
  694. font-size: 16px;
  695. font-weight: 700;
  696. height: 40px;
  697. line-height: 40px;
  698. background-color: #f0f2f5;
  699. }
  700. .expert-scrollbar {
  701. height: 100%;
  702. }
  703. .expert-list {
  704. padding: 20px;
  705. height: 370px;
  706. }
  707. .el-icon-success {
  708. font-size: 18px;
  709. }
  710. .check-active {
  711. color: #85ce61;
  712. }
  713. .check-inactive {
  714. color: #ccc;
  715. }
  716. .membei-list {
  717. display: flex;
  718. position: relative;
  719. padding: 2px 0;
  720. border-bottom: 1px solid #f2f2f2;
  721. margin-bottom: 10px;
  722. .left-side {
  723. display: flex;
  724. }
  725. .membei-icon {
  726. padding: 5px;
  727. .el-image {
  728. border-radius: 50%;
  729. }
  730. }
  731. .member-people {
  732. div {
  733. height: 25px;
  734. line-height: 25px;
  735. font-size: 14px;
  736. }
  737. .people-name {
  738. color: rgba(24, 210, 94, 1);
  739. font-size: 16px;
  740. }
  741. .people-time {
  742. color: #7f7f7f;
  743. }
  744. .people-phone {
  745. color: rgba(24, 210, 94, 1);
  746. }
  747. .expert-label {
  748. margin-left: 4px;
  749. font-size: 10px;
  750. color: #E6A23C;
  751. }
  752. .expert-level {
  753. margin-left: 4px;
  754. font-size: 8px;
  755. color: #409EFF;
  756. }
  757. }
  758. .member-people-btn {
  759. position: absolute;
  760. top: 10px;
  761. right: 10px;
  762. }
  763. }
  764. .Invite-experts {
  765. .Invite-experts-btn {
  766. margin-right: 10px;
  767. }
  768. }
  769. }
  770. }
  771. }
  772. ::v-deep .el-switch__label {
  773. width: 30px;
  774. }
  775. ::v-deep .el-button {
  776. border: none;
  777. }
  778. .el-scrollbar {
  779. height: 100%;
  780. }
  781. ::v-deep .el-scrollbar__wrap {
  782. overflow-x: hidden;
  783. background-color: #fff;
  784. }
  785. ::v-deep .el-textarea__inner {
  786. height: 130px;
  787. }
  788. .btn-history {
  789. border:0;
  790. outline:none;
  791. background-color: transparent;
  792. cursor: pointer;
  793. color: #5383E7;
  794. margin-top: 5px;
  795. margin-left: 300px;
  796. font-size: 12px;
  797. }
  798. </style>