index.vue 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601
  1. <template>
  2. <div>
  3. <!-- 聊天 -->
  4. <div class="service" v-if="!knowledge">
  5. <!-- 头部信息 -->
  6. <div class="header row allAlignment item-center">
  7. <div class="row item-center" @click="leftShow = true">
  8. <img class="icon" style="margin-right:.2rem;" src="@/assets/Service1.png">
  9. <p>{{service_info.name}}</p>
  10. </div>
  11. <div class="row">
  12. <img class="icon" v-if="selNum > chatNum" style="width:.34rem;height:.34rem;" src="@/assets/Service2.png">
  13. <img class="icon" style="width:.34rem;height:.34rem" @click="knowledge = true,flag = false" src="@/assets/leaveSwitch.png">
  14. <!-- <img class="icon" style="margin-right:0;" src="@/assets/Service4.png"> -->
  15. </div>
  16. </div>
  17. <div class="main" id="main">
  18. <!-- ********************************************************** -->
  19. <!-- 机器人聊天板块 -->
  20. <div v-if="!link_success">
  21. <!-- 系统欢迎语 -->
  22. <div v-if="welcome.length >0" v-for="(itme,i) in welcome" :key="'w'+i">
  23. <div class="row allAlignment" style="margin-top:.3rem;">
  24. <div class="HeadPortrait row center">
  25. <img :src="require('@/assets/user2.png')">
  26. </div>
  27. <div class="messageWindow dialogueA col-w">
  28. <div class="customerService left">{{itme}}</div>
  29. </div>
  30. </div>
  31. </div>
  32. <!-- 系统消息下拉选择 -->
  33. <div class="artificial" v-if="problem.length > 0">
  34. <div class="row item-center allAlignment" style="height:.75rem;border-bottom:.01rem solid #EEE;"
  35. v-for="(item,index) in problem" :key="index" @click="pushMessage(item.robot_content)">
  36. <span>{{item.robot_name}}</span>
  37. <img style="width:.3rem;height:.3rem;" src="@/assets/addright.png">
  38. </div>
  39. <div class="row item-center" style="height:.72rem;">
  40. <p>以上问题都不是</p>
  41. <div style="color:#5EA0F7;padding-left:.1rem;" @click="connectionService">转人工客服</div>
  42. </div>
  43. </div>
  44. <!-- 和机器人会话 -->
  45. <div v-for="(item,i) in robot" :key="'r'+i">
  46. <!-- 系统提示语 -->
  47. <div v-if="item.type==1001 " class="artificial" >
  48. <div class="row item-center" style="padding-left:.2rem;height:.72rem;">
  49. <p>您的问题小智无法回答请:</p>
  50. <div style="color:#5EA0F7;padding-left:.1rem;" @click="connectionService">转人工客服</div>
  51. </div>
  52. </div>
  53. <!-- 和机器人会话互动 -->
  54. <div v-else-if="item.type == 'service' || item.type == 'user'" class="row allAlignment" style="margin-top:.3rem;">
  55. <div class="HeadPortrait row center">
  56. <img v-if="item.type == 'service'" :src="require('@/assets/user2.png')">
  57. </div>
  58. <div class="messageWindow dialogueA col-w" :style="item.type == 'user'?'text-align: right;':''">
  59. <div v-if="item.type == 'service'" class="customerService left">{{item.content.text}}</div>
  60. <div v-if="item.type == 'user'" class="user right imgSrc">
  61. <yd-lightbox v-if="item.content.img" style="display:inline-block" class="row rightAlignment box-img">
  62. <yd-lightbox-img :src=" img_http + item.content.img"></yd-lightbox-img>
  63. </yd-lightbox>
  64. <span v-else >{{item.content}}</span>
  65. </div>
  66. </div>
  67. <div class="HeadPortrait row center">
  68. <img v-if="item.type == 'user'" :src="user.headPortraitSrc?user.headPortraitSrc:require('@/assets/user1.png')">
  69. </div>
  70. </div>
  71. <!-- 转人工分组 -->
  72. <div class="artificial" v-if="item.type == 'artificial_service' ">
  73. <div @click="turnArtificial(items.id)" v-for="(items,indexs) in item.content" :key="'r'+indexs" class="row item-center allAlignment" style="height:.75rem;border-bottom:.01rem solid #EEE;">
  74. <p>
  75. 人工客服:
  76. <span style="color:#5EA0F7;padding-left:.1rem;">{{items.name}}</span>
  77. </p>
  78. <img style="width:.3rem;height:.3rem;" src="@/assets/addright.png">
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. <!-- ********************************************************** -->
  84. <!-- 人工会话模版 -->
  85. <div v-if="link_success" v-for="(item,index) in chat" :key="index">
  86. <!-- 客服会话 -->
  87. <div v-if="item.type == 'service'" >
  88. <div class="row allAlignment" style="margin-top:.3rem;">
  89. <div class="HeadPortrait row center">
  90. <img :src="require('@/assets/user2.png')" >
  91. </div>
  92. <div class="messageWindow dialogueA col-w" >
  93. <div class="customerService left imgSrc">
  94. <yd-lightbox v-if="item.content.img" style="display:inline-block" class="row rightAlignment">
  95. <yd-lightbox-img :src=" img_http + item.content.img"></yd-lightbox-img>
  96. </yd-lightbox>
  97. <span v-else>{{item.content.text}}</span>
  98. </div>
  99. </div>
  100. <div class="HeadPortrait row center">
  101. </div>
  102. </div>
  103. </div>
  104. <!-- 用户会话 -->
  105. <div v-if="item.type == 'user'" >
  106. <div class="row allAlignment" style="margin-top:.3rem;">
  107. <div class="HeadPortrait row center">
  108. </div>
  109. <div class="messageWindow dialogueA col-w" style="text-align: right;" >
  110. <div class="user right imgSrc">
  111. <yd-lightbox v-if="item.content.img" style="display:inline-block" class="row rightAlignment">
  112. <yd-lightbox-img :src="img_http+item.content.img"></yd-lightbox-img>
  113. </yd-lightbox>
  114. <span v-else>{{item.content.text}}</span>
  115. </div>
  116. </div>
  117. <div class="HeadPortrait row center">
  118. <img :src="require('@/assets/user1.png')">
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. <!-- 常规系统消息 -->
  124. <!-- <div class="row center" v-if="hintSwitch.serviceOffline">
  125. <div class="btn">
  126. 当前客服不在线,如需帮助请
  127. <span
  128. class="click"
  129. style="display: inline-block;margin-left:.1rem;"
  130. @click="flag = true"
  131. >留言</span>
  132. </div>
  133. </div>
  134. <div class="row center" v-if="hintSwitch.queue">
  135. <div class="btn">
  136. 当前客服较忙,需要排队
  137. <span class="click" style="display: inline-block;margin-left:.1rem;">第25位</span> 请稍候,如需取消等待请
  138. <span
  139. class="click"
  140. style="display: inline-block;margin-left:.1rem;"
  141. @click="flag = true,hintSwitch.queue = false"
  142. >留言</span>
  143. </div>
  144. </div>
  145. <div class="row center" v-if="hintSwitch.serviceOn">
  146. <div class="btn">请注意,当前客服已连接</div>
  147. </div>
  148. <div class="row center" v-if="hintSwitch.serviceOff">
  149. <div class="btn">当前客服已中断连接</div>
  150. </div>
  151. <div class="row center" v-if="hintSwitch.connection">
  152. <span class="btn">已联系人工客服</span>
  153. </div>
  154. <div class="row center" v-if="hintSwitch.evaluateOnOff">
  155. <div class="btn">
  156. 您好,您此次的评价为
  157. <span
  158. class="click"
  159. style="display: inline-block;margin-left:.1rem;"
  160. >{{evaluateBox.txt}}</span>
  161. </div>
  162. </div>
  163. <div class="row center" v-if="hintSwitch.welcome">
  164. <div class="btn">欢迎来到客服服务中心</div>
  165. </div>
  166. <div class="row center" v-if="hintSwitch.SessionTimeout">
  167. <div class="btn">您好,我们长时间没有收到您的回复,稍后将自动结束本次会话</div>
  168. </div>
  169. <div class="row center" v-if="hintSwitch.inSessionTimeout">
  170. <div class="btn">您好,未能收到您的回复,本次对话将自动结束 如需继续咨询请 重新连接客服</div>
  171. </div>
  172. <div class="row center" v-if="hintSwitch.serviceSessionTimeout">
  173. <div class="btn">正在查询中,请稍等</div>
  174. </div>
  175. <div class="row center" v-if="hintSwitch.talkTime">
  176. <div class="btn">后台返回的时间戳</div>
  177. </div> -->
  178. <!-- 人工客服系统通知 -->
  179. <!-- <div class="artificial">
  180. <div
  181. class="row item-center allAlignment"
  182. style="height:.75rem;border-bottom:.01rem solid #EEE;"
  183. >
  184. <p>
  185. 人工客服
  186. <span style="color:#5EA0F7;padding-left:.1rem;">红红</span>
  187. </p>
  188. <img style="width:.3rem;height:.3rem;" src="@/assets/addright.png">
  189. </div>
  190. <div
  191. class="row item-center allAlignment"
  192. style="height:.75rem;border-bottom:.01rem solid #EEE;"
  193. >
  194. <p>
  195. 人工客服
  196. <span style="color:#5EA0F7;padding-left:.1rem;">妞妞</span>
  197. </p>
  198. <img style="width:.3rem;height:.3rem;" src="@/assets/addright.png">
  199. </div>
  200. <div
  201. class="row item-center allAlignment"
  202. style="height:.75rem;border-bottom:.01rem solid #EEE;"
  203. >
  204. <p>
  205. 人工客服
  206. <span style="color:#5EA0F7;padding-left:.1rem;">菲菲</span>
  207. </p>
  208. <img style="width:.3rem;height:.3rem;" src="@/assets/addright.png">
  209. </div>
  210. </div> -->
  211. <!-- 评价通知 -->
  212. <!-- <div class="evaluate row center wrap" v-if="evaluateShow">
  213. <p style="width:100%;margin-top:.15rem;" class="row center">欢迎你的咨询,请对我们的服务做出评价</p>
  214. <button class="evaluateBtn" style="margin-bottom:.2rem;" @click="bottomShow = true">评价</button>
  215. </div> -->
  216. <div v-if="box_height" style="height:65px">
  217. </div>
  218. </div>
  219. <!-- 中间弹窗登录 -->
  220. <yd-popup
  221. v-model="centerShow"
  222. position="center"
  223. width="6.9rem"
  224. height="8rem"
  225. :masker-opacity=".2"
  226. >
  227. <div class="row rightAlignment" style="padding-top:.2rem;padding-right:.2rem;">
  228. <img
  229. @click="centerShow = false"
  230. style="width: 0.32rem;height: 0.32rem;"
  231. src="@/assets/Service5.png"
  232. >
  233. </div>
  234. <div class="row center" style="font-size:.56rem;">
  235. <p style="color:#F04992;">HX</p>
  236. <span style="color:#5EA0F7;">669</span>
  237. </div>
  238. <input class="loginInput" type="text" placeholder="姓名">
  239. <input class="loginInput" type="text" placeholder="手机号">
  240. <input class="loginInput" type="email" placeholder="邮箱地址">
  241. <div class="row" style="margin:0 .2rem;">
  242. <input class="loginInput" placeholder="输入验证码" type="text" style="margin:.5rem 0 0 0;">
  243. <p
  244. @click="initialLoginCode"
  245. class="row center"
  246. style="width:100%;height:.8rem;margin-top:.5rem;background:#F1E1E0;border-radius: .1rem;margin-left:.2rem;font-size:.3rem;color:#666;"
  247. >{{loginCode}}</p>
  248. </div>
  249. <div class="row center sub" style="margin:.5rem .2rem .2rem .2rem;">登录</div>
  250. </yd-popup>
  251. <!-- 底部弹窗评价 -->
  252. <yd-popup v-model="bottomShow" position="bottom" height="6.5rem" :masker-opacity=".2">
  253. <div class="row rightAlignment" style="padding-top:.2rem;padding-right:.2rem;">
  254. <img
  255. @click.stop="bottomShow = false"
  256. style="width: 0.32rem;height: 0.32rem;"
  257. src="@/assets/Service5.png"
  258. >
  259. </div>
  260. <div style="color:#666;text-align: center;font-size:.28rem;">感谢您的咨询,请对我们的服务做出评价</div>
  261. <div style="height:2.3rem;" class="row allAlignment evaluatebtn">
  262. <div style="width:33%;height:100%;">
  263. <div class="row wrap center" @click="evaluateClick('satisfaction','满意',1)">
  264. <img
  265. style="width:.66rem;height:.66rem;"
  266. :src="evaluateBox.grade=='satisfaction'?require('@/assets/evaluate1a.png'):require('@/assets/evaluate1.png')"
  267. >
  268. <p>满意</p>
  269. </div>
  270. </div>
  271. <div style="width:33%;height:100%;" @click="evaluateClick('ordinary','一般',2)">
  272. <div class="row wrap center">
  273. <img
  274. style="width:.66rem;height:.66rem;"
  275. :src="evaluateBox.grade=='ordinary'?require('@/assets/evaluate2a.png'):require('@/assets/evaluate2.png')"
  276. >
  277. <p>一般</p>
  278. </div>
  279. </div>
  280. <div style="width:33%;height:100%;" @click="evaluateClick('noSatisfaction','不满意',3)">
  281. <div class="row wrap center">
  282. <img
  283. style="width:.66rem;height:.66rem;"
  284. :src="evaluateBox.grade=='noSatisfaction'?require('@/assets/evaluate3a.png'):require('@/assets/evaluate3.png')"
  285. >
  286. <p>不满意</p>
  287. </div>
  288. </div>
  289. </div>
  290. <div class="evaluateBox">
  291. <textarea placeholder="评价备注" v-model="evalArea"></textarea>
  292. </div>
  293. <div class="row center sub" @click="evaluateEsc">确定</div>
  294. </yd-popup>
  295. <!-- 左侧弹窗客服信息 -->
  296. <yd-popup v-model="leftShow" position="left" width="4.8rem" :masker-opacity=".2">
  297. <div class="leftHader row item-center">
  298. <img @click="leftShow = false" class="icon" src="@/assets/Service4.png">
  299. <p style="color:#FFF;font-size:.34rem;">{{service.serviceCode+service.jobNum}}</p>
  300. </div>
  301. <div>
  302. <div class="leftMain-top row">
  303. <div>
  304. <p>
  305. <!-- 客服名字 -->
  306. <span>姓名:</span>
  307. {{service_info.name}}
  308. </p>
  309. <p>
  310. <!-- 客服工号 -->
  311. <span>工号:</span>
  312. {{service_info.job_name}}
  313. </p>
  314. <p>
  315. <!-- 客服性别 -->
  316. <span>性别:</span>
  317. 保密
  318. </p>
  319. <p>
  320. <!-- 客服职务 -->
  321. <span>职务:</span>
  322. 咨询服务
  323. </p>
  324. </div>
  325. <div class="row center">
  326. <img style="width:1.8rem;height:1.8rem;"
  327. :src="img_http + service_info.avatar" >
  328. </div>
  329. </div>
  330. <div class="leftMain-chenter"
  331. style="padding:0 .3rem;margin-top:.3rem;padding-bottom:.6rem;border-bottom:.01rem solid #ddd;"
  332. >
  333. <!-- 客服个性签名 -->
  334. <span>个性签名:</span>
  335. {{service_info.signature}}
  336. </div>
  337. <!-- 广告图 -->
  338. <div class="leftMain-bottom row center" style="padding:0 .3rem;margin-top:.6rem;">
  339. <a :href="'http://'+advertisement.advertisement_url" target="_blank" rel="noopener noreferrer" >
  340. <img style="width:4.2rem;height:7rem;" :src="img_http+advertisement.advertisement_img">
  341. </a>
  342. </div>
  343. </div>
  344. </yd-popup>
  345. <!-- 底部输入框 -->
  346. <div class="footer row wrap" id='input_box'>
  347. <!-- <textarea
  348. class="input row item-center"
  349. style="-webkit-user-select:auto;user-select:auto;-o-user-select:auto;-ms-user-select:auto;border-bottom:.01rem solid #ddd"
  350. contenteditable="true"
  351. v-model="text_info"
  352. :rows="inputNum"
  353. @focus="inputShow($event)"
  354. @keydown="inputNumFun()"
  355. placeholder="请输入你的问题:"
  356. ></textarea> -->
  357. <yd-cell-group>
  358. <yd-cell-item>
  359. <yd-textarea slot="right" contenteditable="true" v-model="text_info" :rows="inputNum" @keydown="inputNumFun()" placeholder="请输入你的问题:" maxlength="100"></yd-textarea>
  360. </yd-cell-item>
  361. </yd-cell-group>
  362. <div class="send row item-center" style="border-bottom:.01rem solid #ddd">
  363. <img
  364. :src="meme?require('@/assets/faceActive.png'):require('@/assets/face.png')"
  365. @click="faceClick"
  366. style="width:.48rem;height:.48rem"
  367. >
  368. <input type="file" id="file" @change="uploadIMG" accept="image/jpeg,image/jpg,image/png,image/svg" style="display:none">
  369. <label for="file">
  370. <img src="@/assets/imge.png" style="width:.46rem;height:.42rem">
  371. </label>
  372. <div
  373. @click="send()"
  374. style="color:#ccc;border:.02rem solid #ddd;width:1rem;height:.66rem;border-radius:.1rem;"
  375. :style="text_info.length>0?'background:#5EA0F7;color:fff;':''"
  376. class="row center"
  377. >发送</div>
  378. </div>
  379. <!-- 表情包 -->
  380. <div v-show="meme" class="memeBox">
  381. <yd-slider autoplay="0" :loop="false">
  382. <yd-slider-item>
  383. <div>
  384. <ul style="width:100%;padding-bottom:.3rem;" class="row average wrap">
  385. <li v-for="(item,index) in frceArr" :key="index" v-show="index<15">
  386. <img
  387. class="memeImg"
  388. :src="require(`@/assets/${index}.gif`)"
  389. @click="memeImg(index)"
  390. >
  391. </li>
  392. </ul>
  393. </div>
  394. </yd-slider-item>
  395. <yd-slider-item>
  396. <div>
  397. <ul style="width:100%;padding-bottom:.3rem;" class="row average wrap">
  398. <li v-for="(item,index) in frceArr" :key="index" v-show="index>15&&index<=30">
  399. <img
  400. class="memeImg"
  401. :src="require(`@/assets/${index}.gif`)"
  402. @click="memeImg(index)"
  403. >
  404. </li>
  405. </ul>
  406. </div>
  407. </yd-slider-item>
  408. <yd-slider-item>
  409. <div>
  410. <ul style="width:100%;padding-bottom:.3rem;" class="row average wrap">
  411. <li v-for="(item,index) in frceArr" :key="index" v-show="index>30&&index<=45">
  412. <img
  413. class="memeImg"
  414. :src="require(`@/assets/${index}.gif`)"
  415. @click="memeImg(index)"
  416. >
  417. </li>
  418. </ul>
  419. </div>
  420. </yd-slider-item>
  421. <yd-slider-item>
  422. <div>
  423. <ul style="width:100%;padding-bottom:.3rem;" class="row average wrap">
  424. <li v-for="(item,index) in frceArr" :key="index" v-show="index>45&&index<=60">
  425. <img
  426. class="memeImg"
  427. :src="require(`@/assets/${index}.gif`)"
  428. @click="memeImg(index)"
  429. >
  430. </li>
  431. </ul>
  432. </div>
  433. </yd-slider-item>
  434. <yd-slider-item>
  435. <div>
  436. <ul style="width:100%;padding-bottom:.3rem;" class="row average wrap">
  437. <li v-for="(item,index) in frceArr" :key="index" v-show="index>60">
  438. <img
  439. class="memeImg"
  440. :src="require(`@/assets/${index}.gif`)"
  441. @click="memeImg(index)"
  442. >
  443. </li>
  444. </ul>
  445. </div>
  446. </yd-slider-item>
  447. </yd-slider>
  448. </div>
  449. </div>
  450. </div>
  451. <!-- 留言知识库 -->
  452. <div v-if="knowledge">
  453. <!-- 接收返回消息 -->
  454. <knowledgeLibrary @returnIndex="returnIndex" :currentTime="currentTime" />
  455. </div>
  456. </div>
  457. </template>
  458. <script>
  459. import "../css/index.css";
  460. import knowledgeLibrary from './knowledgeLibrary'
  461. import frce from "./frce.js";
  462. export default {
  463. name: "service",
  464. // 模板注册
  465. components: {
  466. knowledgeLibrary
  467. },
  468. data() {
  469. return {
  470. // 数据
  471. data: "", //常规数据
  472. getTime:{ //从服务器获取到的时间
  473. date:'',//年月日
  474. time:'',//时分
  475. },
  476. DialogueData: [ //对话数据
  477. {
  478. type:'service', //消息发送方
  479. content: '你要去哪里啊?', //消息内容
  480. },
  481. {
  482. type:'user',
  483. content: '我想去泰国看人妖。',
  484. }
  485. ],
  486. text_info: "", //输入框内容
  487. evaluate: "", //评论内容
  488. inputLength: 0, //输入框内容length
  489. inputLoginCode: "", //用户输入的登录验证码
  490. // 人工客服信息
  491. service: {
  492. //当前连接的客服详情信息
  493. name: "智能客服", //名字
  494. sex: "保密", //性别
  495. job: "咨询客服", //职务
  496. jobNum: "001", //工号
  497. signature:
  498. "万人在线,万人赛事,告别拼爹,只拼实力!注册就送5000游戏币!", //个性签名
  499. headPortraitSrc:"", //头像连接
  500. serviceId: "", //客服id
  501. serviceCode: "人工客服" //客服类型
  502. },
  503. serviceList: [{}, {}, {}], //后台推送的人工客服列表
  504. // 用户个人信息
  505. user: {
  506. name: "隔壁老樊", //姓名
  507. call: "樊先生", //称呼
  508. sex: "男", //性别
  509. userId: "", //用户id
  510. headPortraitSrc:
  511. "http://img5.imgtn.bdimg.com/it/u=2724886373,3500404552&fm=26&gp=0.jpg", //用户头像连接
  512. phone: "15100000000", //手机号
  513. email: "123456@qq.com" //邮箱
  514. },
  515. // 开关
  516. knowledge:false,//留言知识库开关
  517. inputNum: 1, //input可见行数
  518. leftShow: false, //左侧详细开关
  519. //系统提示开关集
  520. hintSwitch: {
  521. serviceOn: false, //人工客服连接
  522. serviceOff: false, //人工客服中断
  523. evaluateOnOff: false, //人工客服评价通知
  524. connection: false, //转人工客服
  525. queue: false, //人工排队等候
  526. serviceOffline: false, //人工客服不在线
  527. welcome: false, //进入系统时的欢迎语
  528. SessionTimeout: false, //用户会话即将超时
  529. inSessionTimeout: false, //用户会话已经超时
  530. serviceSessionTimeout: false, //客服长时间未回复安抚提示
  531. serviceShowmessage: false, //人工客服连接成功
  532. talkTime:true,//对话时间提示
  533. },
  534. bottomShow: false, //底部评价弹窗开关
  535. evaluateShow: true, //评价通知开关
  536. centerShow: false, //中间登录开关
  537. evaluateBox: { grade: "", txt: "",type : 1}, //评论等级
  538. loginCode: "", //登录时展示的验证码
  539. // 激活
  540. active: "",
  541. imgSrc: "",
  542. // 时间
  543. timers: true, //计时器开关
  544. newtime: "", //当前日期时间
  545. /*-----------------------------------------------*/
  546. meme: false, // 表情包开关
  547. frceArr: [], //表情包代码
  548. // 按钮
  549. websock:null,//创建websock
  550. user_info:'',//用户信息
  551. apiToken:'',//通话调用凭证
  552. currentTime:'',//接口调用服务器时间
  553. problem:[],//机器人问题
  554. welcome:[],//欢迎语
  555. advertisement:'',//广告
  556. // img_http:'http://103.108.43.176:8080',//图片路径域 http://192.168.2.186:8090
  557. img_http:'http://192.168.2.186:8090',//图片路径域 'http://103.108.43.176:8080
  558. robot:[],//和机器人聊天临时数据
  559. chat:[],//人工会话
  560. error_num:1001,//机器人回答超出能力之外编号
  561. isConnection:true,//人工分组列表开关
  562. //客服信息
  563. service_info:{
  564. avatar:'/static/customer/images/robot.png',
  565. job_name:'001',
  566. name:'智能客服',
  567. signature:"万人在线,万人赛事,告别拼爹,只拼实力!注册就送5000游戏币!"
  568. },
  569. link_success:false,//人工链接成功
  570. conversationId:'',//会话工单
  571. chatNum:'', // 留言次数
  572. selNum : 0, // 人工聊天返回的会话次数,自增
  573. evalArea : '', //评价备注
  574. source:{},//来源信息
  575. initData:1,//
  576. isTurnArtifcial:true,
  577. box_height:false,//苹果浏览器增加会话框高度
  578. };
  579. },
  580. // 方法
  581. methods: {
  582. /*******************************************/
  583. //设置token加密
  584. setApiToken(name,controller,time,modules){
  585. let txetVal = name+'customer-service'+controller+time+modules;
  586. let sssd = txetVal.toLowerCase();
  587. return this.$md5(txetVal.toLowerCase());
  588. },
  589. /*******************************************/
  590. //初始化Websocket链接
  591. initWebsocket(){
  592. //let apiToken = this.$md5('customer-service'+this.currentTime+window.location.origin);
  593. // 192.168.2.186
  594. let sock_ip = 'ws://192.168.2.186:9101';
  595. //let sock_ip ='ws://103.108.43.176:9101';
  596. this.websock = new WebSocket(sock_ip+"?apiToken="+this.apiToken);
  597. //
  598. //数据返回
  599. this.websock.onmessage = this.socket_message;
  600. //数据发送
  601. this.websock.onopen = this.socket_open;
  602. //重新链接
  603. this.websock.onerror = this.socket_error;
  604. //关闭链接
  605. this.websock.onclose = this.socket_close;
  606. },
  607. /*******************************************/
  608. //连接建立之后执行send方法发送数据
  609. socket_open(){
  610. // let actions = {"test":"12345"};
  611. console.log('我链接了');
  612. //this.socket_end(JSON.stringify(actions));
  613. },
  614. /*******************************************/
  615. //连接建立失败重连
  616. socket_error(){
  617. this.initWebSocket();
  618. },
  619. /*******************************************/
  620. //数据接收
  621. socket_message(e){
  622. // console.log(e);
  623. if(!e.data) return;
  624. const redata = JSON.parse(e.data);
  625. console.log(redata);
  626. //欢迎语
  627. if(redata.message_type =='helloMessage'){
  628. this.isTurnArtifcial =true;
  629. if(this.initData == 1){
  630. this.welcome.push(redata.data.content);
  631. this.welcome.push('请点击您想咨询的问题,若都不是,请在输入框直接输入');
  632. }
  633. }
  634. //广告语
  635. if(redata.message_type =='advertisement' ){
  636. this.advertisement = redata.data[0]
  637. }
  638. //机器人回复
  639. if(redata.message_type =="robotMessage"){
  640. // console.log(redata);
  641. if(redata.data.content == "error"){
  642. this.robot.push({
  643. type:this.error_num,
  644. })
  645. this.error_num ++;
  646. }else{
  647. this.robot.push({
  648. type:'service',
  649. content:{text:redata.data.content}
  650. })
  651. }
  652. this.automaticRolling();
  653. //data
  654. //this.robot =
  655. }
  656. //系统消息
  657. if(redata.message_type == 'notice'){
  658. this.$dialog.loading.close();
  659. this.isTurnArtifcial = true;
  660. let _this =this;
  661. this.$dialog.alert({mes:redata.content, callback: () => {
  662. this.initData =100;
  663. _this.$dialog.loading.open('数据加载中...');
  664. setTimeout(() => {
  665. _this.$dialog.loading.close();
  666. _this.registered();
  667. }, 2000);
  668. }});
  669. }
  670. //人工链接
  671. if(redata.message_type =='connect'){
  672. this.link_success = true;
  673. this.service_info = redata.data.serverInfo;
  674. this.conversationId = redata.data.conversationId
  675. }
  676. //人工会话欢迎语
  677. if(redata.message_type == "chatMessage"){
  678. this.$dialog.loading.close();
  679. let obj ={};
  680. if (this.$public.isJSON(redata.data.content)){
  681. obj = JSON.parse(redata.data.content);
  682. }else{
  683. obj.text = redata.data.content;
  684. }
  685. // if( content instanceof Object ){
  686. // obj = content
  687. // }else{
  688. // obj.text = content
  689. // }
  690. this.chat.push({
  691. type:'service',
  692. content:obj
  693. })
  694. this.selNum++;
  695. }
  696. this.automaticRolling();
  697. },
  698. /*******************************************/
  699. //数据发送
  700. socket_end(Data){
  701. this.websock.send(Data);
  702. },
  703. /*******************************************/
  704. //关闭
  705. socket_close(e){
  706. console.log('断开连接',e);
  707. this.initData =100;
  708. this.link_success = false;
  709. this.registered();
  710. // this.websock.close()
  711. },
  712. /*****************************************/
  713. //用户匿名注册
  714. registered(){
  715. let token = localStorage.getItem('token');
  716. let data={
  717. token:token != null ? token :'',//
  718. appid:this.source.appid,//
  719. appuid:this.source.appuid,//
  720. }
  721. let obj = {
  722. headers: {
  723. "apiToken":this.setApiToken('autoReg','register',this.currentTime[0],'index')
  724. }
  725. }
  726. this.post('api/index/register/autoReg',data,obj).then(res=>{
  727. if(res.data.code ==1){
  728. this.user_info = res.data.data;
  729. localStorage.setItem("token", res.data.data.token);
  730. //Websocket链接
  731. this.initWebsocket();
  732. //console.log(res.data.data)
  733. }
  734. })
  735. },
  736. /******************************************/
  737. //获取热门问题
  738. getProblem(){
  739. let obj ={
  740. headers: {
  741. // 'Content-Type': 'application/x-www-form-urlencoded',
  742. "apiToken":this.setApiToken('index','robot',this.currentTime[0],'index')
  743. }
  744. }
  745. this.post('api/index/robot/index',{groups_id:1,robotgroups_id:1},obj).then(res=>{
  746. //console.log(res.data.data);
  747. this.problem = res.data.data;
  748. })
  749. },
  750. /*******************************************/
  751. //推送机器人消息
  752. pushMessage(e){
  753. this.robot.push({
  754. type:'service',
  755. content:{text:e}
  756. });
  757. this.automaticRolling();
  758. },
  759. /*******************************************/
  760. //转人工
  761. turnArtificial(e){
  762. //
  763. this.$dialog.loading.open('转接中...')
  764. if(this.isTurnArtifcial){
  765. this.socket_end(JSON.stringify({
  766. type:'userInit',
  767. data:{
  768. uid:this.user_info.id,
  769. name:this.user_info.name,
  770. avatar:'',
  771. group:e,
  772. }
  773. }))
  774. this.isTurnArtifcial =false
  775. }
  776. //let _this =this;
  777. // this.$dialog.loading.open('数据加载中...');
  778. // setTimeout(() => {
  779. // _this.$dialog.loading.close();
  780. // }, 2000);
  781. },
  782. /******************************************/
  783. // 消息发送
  784. send(){
  785. if(this.text_info == '') return
  786. let type = 'toRobot';
  787. let data = {};
  788. let obj = {
  789. text:this.text_info,
  790. img:'',
  791. type:''
  792. }
  793. this.meme =false;
  794. // console.log(JSON.stringify(obj))
  795. //和人工发送消息
  796. if(this.link_success){
  797. data = {
  798. from_name:this.user_info.name,
  799. content:JSON.stringify(obj),
  800. from_id:this.user_info.id,
  801. avatar:'',
  802. to_id:this.service_info.id,
  803. to_name:this.service_info.name,
  804. conversationId:this.conversationId,
  805. }
  806. type = 'chatMessage';
  807. this.chat.push({
  808. type:'user',
  809. content:obj
  810. })
  811. }else{//和机器人聊天
  812. data={
  813. groups_id:'1',
  814. robot_name:this.text_info,
  815. robotgroups_id:'1',
  816. }
  817. type = 'toRobot';
  818. //本地存放数据
  819. obj.text = this.text_info
  820. this.robot.push({
  821. type:'user',
  822. content:this.text_info //obj
  823. })
  824. }
  825. //console.log(JSON.stringify({type,data}));
  826. this.socket_end(JSON.stringify({type,data}))
  827. this.text_info = '';
  828. this.automaticRolling();
  829. // console.log(data)
  830. },
  831. /*******************************************/
  832. //获取转接人工客服列表
  833. connectionService() {
  834. if(!this.isConnection) return
  835. let obj ={
  836. headers: {
  837. "apiToken":this.setApiToken('index','groups',this.currentTime[0],'index')
  838. }
  839. }
  840. this.isConnection = false;
  841. //api
  842. this.get('api/index/groups/index',obj).then(res=>{
  843. if(res.data.code == 1){
  844. this.robot.push({
  845. type:'artificial_service',
  846. content:res.data.data
  847. });
  848. this.automaticRolling();
  849. }
  850. })
  851. //this.hintSwitch.connection = true; //系统提示开关激活
  852. // 此处为请求
  853. },
  854. /*******************************************/
  855. //发送消息后自动滚动高度
  856. automaticRolling(){
  857. this.$nextTick(() => {
  858. let msg = document.getElementById('main') // 获取对象
  859. let input_box = document.getElementById('input_box') // 获取对象
  860. //判断是否是苹果手机自代浏览器
  861. if(/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)){
  862. this.box_height = true; //input_box+'px';
  863. }
  864. msg.scrollTop = msg.scrollHeight // 滚动高度
  865. })
  866. },
  867. /*******************************************/
  868. //图片发送
  869. uploadIMG(e) {
  870. //console.log(e);
  871. let self = this;
  872. let files = e.target.files || e.dataTransfer.files;
  873. if (!files.length) return;
  874. let picavalue = files[0];
  875. //console.log(picavalue);
  876. if (picavalue.size / 1000 > 20000) {
  877. this.$message({
  878. message: "图片过大不支持上传",
  879. type: "warning"
  880. });
  881. } else {
  882. this.$public.imgPreview(picavalue, function(imgSrc,formData) {
  883. // let img = imgSrc;
  884. // 数据结构请求
  885. self.post('api/index/upload/uploadImg',formData).then(res=>{
  886. // console.log(res.data.code)
  887. if(res.data.code == 1){
  888. let type = 'toRobot';
  889. let data = {};
  890. let obj = {
  891. text:'',
  892. img:res.data.data.src,
  893. type:''
  894. }
  895. if(self.link_success){
  896. //和人工聊天发送图片
  897. data = {
  898. from_name:self.user_info.name,
  899. content:JSON.stringify(obj),
  900. from_id:self.user_info.id,
  901. avatar:'',
  902. to_id:self.service_info.id,
  903. to_name:self.service_info.name,
  904. conversationId:self.conversationId,
  905. }
  906. type = 'chatMessage';
  907. //本地储存
  908. self.chat.push({
  909. type:'user',
  910. content:{img:res.data.data.src}
  911. });
  912. }else{
  913. //和机器发送图片
  914. data={
  915. groups_id:'1',
  916. robot_name:res.data.data.src,
  917. robotgroups_id:'1',
  918. }
  919. type = 'toRobot';
  920. //本地储存
  921. self.robot.push({
  922. type:'user',
  923. content:{img:res.data.data.src}
  924. });
  925. }
  926. self.socket_end(JSON.stringify({type,data}))
  927. }
  928. })
  929. });
  930. }
  931. },
  932. /*******************************************/
  933. // 激活
  934. // 时间
  935. // 获取时刻时间
  936. newDateTime(){
  937. let time = new Date()
  938. let year = time.getFullYear();
  939. let month = time.getMonth();
  940. let date = time.getDate();
  941. let hours = time.getHours();
  942. let min = time.getMinutes();
  943. let getSeconds = time.getSeconds();
  944. this.newtime = year + '-'
  945. + (month<10?'0' + month:month) + '-'
  946. + (date<10?"0" + date:date) + ' '
  947. + (hours<10?'0' + hours:hours) + ':'
  948. + (min<10?'0' + min:min)
  949. },
  950. // /*******************************************/
  951. // // 基本功能
  952. // inputNumFun() {
  953. // //input换行判断
  954. // if (this.text_info.length == 0) {
  955. // this.inputNum = 1;
  956. // }
  957. // if (this.text_info.length > this.inputLength) {
  958. // if (this.text_info.length % 24 == 0) {
  959. // this.inputNum++;
  960. // this.inputLength = this.input.length;
  961. // }
  962. // } else if (this.text_info.length < this.inputLength) {
  963. // if (this.text_info.length % 24 == 0) {
  964. // this.inputNum--;
  965. // this.inputLength = this.text_info.length;
  966. // }
  967. // }
  968. // },
  969. /*******************************************/
  970. //手机弹窗处理
  971. inputShow(e) {
  972. console.log('a')
  973. let ua = navigator.userAgent.toLowerCase();
  974. if (ua.match(/iPhone\sOS/i) == "iphone os") {
  975. var nowClientHeight = document.documentElement.clientHeight || document.body.clientHeight;
  976. setTimeout(() => {
  977. document.body.scrollTop = document.body.scrollHeight-(nowClientHeight/2)
  978. }, 200);
  979. } else {
  980. setTimeout(function() {
  981. e.target.scrollIntoView({ behavior: "smooth", block: "end" });
  982. }, 100);
  983. }
  984. },
  985. /*******************************************/
  986. //评价状态
  987. evaluateClick(e, txt,type) {
  988. this.evaluateBox.grade = e;
  989. this.evaluateBox.txt = txt;
  990. this.evaluateBox.type = type
  991. //console.log(this.evaluateBox);
  992. },
  993. /*******************************************/
  994. // 表情包开关
  995. faceClick() {
  996. this.meme = !this.meme;
  997. },
  998. /*******************************************/
  999. //当表情被点击
  1000. memeImg(i) {
  1001. this.text_info = this.text_info + "#" + this.frceArr[i] + "/";
  1002. //this.text_info = this.text_info + '<img :src="' + require(`@/assets/${i}.gif`) +'"/>';
  1003. console.log( this.text_info);
  1004. },
  1005. /*******************************************/
  1006. //验证码
  1007. initialLoginCode() {
  1008. this.loginCode = "";
  1009. for (let i = 1; i <= 4; i++) {
  1010. this.loginCode =
  1011. this.loginCode + frce.arr[Math.floor(Math.random() * 32)];
  1012. }
  1013. },
  1014. /*******************************************/
  1015. //评价框关闭
  1016. evaluateEsc() {
  1017. // 头部
  1018. let obj = {
  1019. headers:{
  1020. 'Content-Type' :'application/x-www-form-urlencoded',
  1021. 'apiToken' : this.setApiToken('putevaluate','evaluate',this.currTime,'index')
  1022. }
  1023. }
  1024. // 参数
  1025. let pram = {
  1026. 'evaluateId' : this.evaluateBox.type ,
  1027. 'conversationId' :'40',
  1028. 'evaluateContent' : this.evalArea
  1029. }
  1030. this.$axios.post('/api/index/evaluate/putEvaluate',pram,obj).then(res =>{
  1031. if(res.data.code == 1){
  1032. this.evaluateShow = false;
  1033. this.bottomShow = false;
  1034. this.hintSwitch.evaluateOnOff = true;
  1035. }
  1036. })
  1037. },
  1038. /* ****************获取聊天次数****************** */
  1039. getChatNum(){
  1040. let obj = {
  1041. headers:{
  1042. 'Content-Type' :'application/x-www-form-urlencoded',
  1043. 'apiToken' : this.setApiToken('minround','evaluate',this.currTime,'index')
  1044. }
  1045. };
  1046. this.$axios.post('/api/index/evaluate/minRound','',obj).then(res =>{
  1047. console.log('r1111es',res)
  1048. if(res.data.code == 1){
  1049. this.chatNum = res.data.data.systemconfig_data
  1050. }
  1051. })
  1052. },
  1053. // 留言知识库返回到主页
  1054. returnIndex(data){
  1055. this.knowledge = data
  1056. }
  1057. },
  1058. /**
  1059. * 组件挂载阶段
  1060. */
  1061. created() {
  1062. this.frceArr = frce.frce;
  1063. this.initialLoginCode();
  1064. },
  1065. /**
  1066. * 视图挂载前
  1067. */
  1068. mounted() {
  1069. this.source.appuid = this.$public.getQueryString('appuid');
  1070. this.source.appid = this.$public.getQueryString('appid');
  1071. //页面初始化获取系统时间第一步
  1072. //console.log(this.$md5('userwordscustomer-servicewords1562169600service'));
  1073. this.get('api/index/index/systime').then(res=>{
  1074. if(res.data.code ==1){
  1075. this.currentTime = res.data.data.time.split(' ')
  1076. // console.log( this.currentTime)
  1077. this.currentTime[0] = (new Date( this.currentTime[0].replace(/-/g,'/')).getTime()) /1000;
  1078. // console.log( this.currentTime[0] );
  1079. this.apiToken = this.$md5('customer-service'+this.currentTime[0]+window.location.origin);
  1080. //匿名注册
  1081. this.registered();
  1082. //获取机器人热门问题
  1083. this.getProblem();
  1084. }
  1085. })
  1086. let _this = this;
  1087. let time = setInterval(time => {
  1088. if (_this.timers) {
  1089. _this.initialLoginCode();
  1090. } else {
  1091. clearInterval(time);
  1092. }
  1093. }, 1000 * 16);
  1094. },
  1095. // 计算
  1096. computed: {
  1097. inputmsg() {
  1098. return this.text_info;
  1099. }
  1100. },
  1101. // 监听
  1102. watch: {},
  1103. // 组件生命周期结束销毁阶段
  1104. beforeDestroy() {
  1105. this.timers = false;
  1106. }
  1107. };
  1108. </script>
  1109. <style scoped>
  1110. /* 聊天 */
  1111. .memeImg {
  1112. width: 0.6rem;
  1113. height: 0.6rem;
  1114. margin: 0.15rem 0.4rem;
  1115. }
  1116. .dialogueA {
  1117. padding-left: 0.3rem;
  1118. padding-right: 0.3rem;
  1119. }
  1120. .dialogueB {
  1121. padding-right: 0.3rem;
  1122. padding-left: 0.3rem;
  1123. }
  1124. .left {
  1125. position: relative;
  1126. z-index: 99;
  1127. background: #fff;
  1128. }
  1129. .left::after {
  1130. position: absolute;
  1131. content: "";
  1132. display: inline-block;
  1133. left: -0.08rem;
  1134. top: 0.2rem;
  1135. width: 0.125rem;
  1136. height: 0.2rem;
  1137. background: #fff;
  1138. transform: skewX(30deg);
  1139. z-index: -1;
  1140. border-left: 0.02rem solid #dfdfdf;
  1141. border-top: 0.02rem solid #dfdfdf;
  1142. }
  1143. .right {
  1144. position: relative;
  1145. z-index: 99;
  1146. background: #5ea0f7;
  1147. border: 0.02rem solid #5ea0f7;
  1148. }
  1149. .right::after {
  1150. position: absolute;
  1151. content: "";
  1152. display: inline-block;
  1153. right: -0.07rem;
  1154. top: 0.2rem;
  1155. width: 0.125rem;
  1156. height: 0.2rem;
  1157. background: #5ea0f7;
  1158. transform: skewX(-30deg);
  1159. z-index: -1;
  1160. border-left: 0.02rem solid #5ea0f7;
  1161. border-top: 0.02rem solid #5ea0f7;
  1162. }
  1163. .service {
  1164. width: 100%;
  1165. color: #555;
  1166. font-size: 0.28rem;
  1167. padding-top: 1rem;
  1168. background: #f5f5f5;
  1169. }
  1170. .header {
  1171. position: fixed;
  1172. left: 0;
  1173. top: 0;
  1174. width: 100%;
  1175. z-index: 999;
  1176. height: 1rem;
  1177. background: linear-gradient(
  1178. 90deg,
  1179. rgba(22, 84, 209, 1) 0%,
  1180. rgba(9, 52, 173, 1) 100%
  1181. );
  1182. box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.2);
  1183. font-size: 0.34rem;
  1184. color: #fff;
  1185. padding: 0 0.3rem;
  1186. }
  1187. .main {
  1188. height: 83vh;
  1189. overflow-x: hidden;
  1190. overflow-y: auto;
  1191. padding: 0 0.3rem;
  1192. }
  1193. .btn {
  1194. display: inline-block;
  1195. padding: 0 0.36rem;
  1196. text-align: center;
  1197. line-height: 0.4rem;
  1198. background: rgba(221, 221, 221, 1);
  1199. border-radius: 0.3rem;
  1200. color: #fff;
  1201. font-size: 0.24rem;
  1202. max-width: 6rem;
  1203. margin: 0 auto;
  1204. margin-top: 0.3rem;
  1205. }
  1206. .btn .click {
  1207. color: #5ea0f7;
  1208. }
  1209. .btnRouter {
  1210. color: #5ea0f7;
  1211. }
  1212. .systemDialogue {
  1213. min-height: 0.8rem;
  1214. width: 100%;
  1215. }
  1216. .manUserDialogue {
  1217. min-height: 1rem;
  1218. }
  1219. .manPlatformDialogue {
  1220. min-height: 1rem;
  1221. }
  1222. .user {
  1223. padding: 0.2rem;
  1224. display: inline-block;
  1225. border-radius: 0.1rem;
  1226. font-size: 0.28rem;
  1227. color: #fff;
  1228. }
  1229. .HeadPortrait {
  1230. width: 1rem;
  1231. height: 1rem;
  1232. /* background: #ddd; */
  1233. border-radius: 0.1rem;
  1234. }
  1235. .HeadPortrait img {
  1236. width: 100%;
  1237. height: 100%;
  1238. }
  1239. .icon {
  1240. width: 0.32rem;
  1241. height: 0.32rem;
  1242. margin-right: 0.4rem;
  1243. }
  1244. .customerService {
  1245. background: #ffffff;
  1246. padding: 0.2rem;
  1247. display: inline-block;
  1248. border-radius: 0.1rem;
  1249. font-size: 0.28rem;
  1250. border: 1px solid rgba(223, 223, 223, 1);
  1251. }
  1252. .customerService {
  1253. /* min-height: 1rem; */
  1254. }
  1255. .system {
  1256. width: 100%;
  1257. border: 0.01rem solid rgba(223, 223, 223, 1);
  1258. border-radius: 0.1rem;
  1259. }
  1260. div /deep/ .yd-accordion-head {
  1261. /* border-radius: 0.1rem; */
  1262. border-bottom: 0.01rem solid rgb(238, 238, 238);
  1263. padding: 0 0.2rem;
  1264. }
  1265. div /deep/ .yd-accordion-title , div /deep/ .yd-accordion-head-arrow{
  1266. min-height: 0.8rem !important;
  1267. }
  1268. div /deep/ .yd-textarea textarea {
  1269. -webkit-user-select: auto;
  1270. }
  1271. .footer {
  1272. min-height: 1.2rem;
  1273. box-shadow: 0px -5px 5px rgba(0, 0, 0, 0.05);
  1274. background: #fff;
  1275. width: 100%;
  1276. position: fixed;
  1277. bottom: 0;
  1278. left: 0;
  1279. z-index: 1000;
  1280. }
  1281. .input {
  1282. width: 60%;
  1283. min-height: 1.2rem;
  1284. padding-top: 0.4rem;
  1285. padding-bottom: 0.4rem;
  1286. border: none;
  1287. padding-right: 0.3rem;
  1288. padding-left: 0.3rem;
  1289. font-size: 0.28rem;
  1290. }
  1291. .send {
  1292. width: 40%;
  1293. position: absolute;
  1294. right: 0;
  1295. top: 0;
  1296. background: #fff;
  1297. height: 1.2rem;
  1298. }
  1299. .memeBox {
  1300. height: 3rem;
  1301. width: 100%;
  1302. }
  1303. .send img {
  1304. margin-right: 0.4rem;
  1305. }
  1306. .artificial {
  1307. margin-top: 0.3rem;
  1308. border: 0.01rem solid #dfdfdf;
  1309. background: #fff;
  1310. border-radius: 0.1rem;
  1311. padding: 0 0.2rem;
  1312. }
  1313. div /deep/ .yd-accordion-head-arrow:after {
  1314. border: none;
  1315. width: 0.3rem;
  1316. height: 0.3rem;
  1317. background: url("../assets/addright.png") no-repeat;
  1318. background-size: 100% 100%;
  1319. transform: rotate(0deg);
  1320. }
  1321. div /deep/ .yd-accordion-head-arrow.yd-accordion-rotated:after {
  1322. transform: rotate(-270deg);
  1323. }
  1324. div /deep/ .yd-accordion {
  1325. border-radius: 0.1rem;
  1326. }
  1327. div /deep/ .yd-accordion-content {
  1328. border-radius: 0.1rem;
  1329. }
  1330. .imgSrc img {
  1331. width: 1.2rem;
  1332. }
  1333. .leftHader {
  1334. height: 1rem;
  1335. background: linear-gradient(
  1336. 90deg,
  1337. rgba(22, 84, 209, 1) 0%,
  1338. rgba(9, 52, 173, 1) 100%
  1339. );
  1340. box-shadow: 0 0.03rem 0.03rem rgba(0, 0, 0, 0.2);
  1341. padding: 0 0.3rem;
  1342. }
  1343. .leftMain-top {
  1344. margin-top: 0.4rem;
  1345. font-size: 0.28rem;
  1346. line-height: 0.45rem;
  1347. padding: 0 0.3rem;
  1348. color: #666;
  1349. }
  1350. .leftMain-top span {
  1351. color: #999;
  1352. }
  1353. .leftMain-top > div {
  1354. width: 50%;
  1355. }
  1356. .leftMain-center {
  1357. margin-top: 0.3rem;
  1358. color: #666;
  1359. line-height: 0.5rem;
  1360. }
  1361. .leftMain-chenter span {
  1362. color: #999;
  1363. font-size: 0.28rem;
  1364. }
  1365. .evaluate {
  1366. height: 1.7rem;
  1367. background: #fff;
  1368. border: 0.01rem solid #ddd;
  1369. border-radius: 0.1rem;
  1370. color: #666;
  1371. margin-top: 0.3rem;
  1372. }
  1373. .evaluateBtn {
  1374. width: 1.4rem;
  1375. height: 0.6rem;
  1376. border: none;
  1377. background: #f04992;
  1378. color: #fff;
  1379. border-radius: 0.1rem;
  1380. }
  1381. div /deep/ .yd-popup {
  1382. border-radius: 0.2rem 0.2rem 0 0;
  1383. }
  1384. div /deep/ .yd-popup-content {
  1385. }
  1386. .evaluatebtn > div p {
  1387. height: 50%;
  1388. width: 100%;
  1389. text-align: center;
  1390. margin-top: 0.14rem;
  1391. }
  1392. .evaluatebtn > div {
  1393. display: flex;
  1394. align-items: center;
  1395. justify-content: center;
  1396. }
  1397. .evaluateBox {
  1398. margin: 0 0.2rem;
  1399. height: 1.5rem;
  1400. border: 0.01rem solid #ddd;
  1401. border-radius: 0.1rem;
  1402. background: #f5f5f5;
  1403. }
  1404. .evaluateBox textarea {
  1405. width: 100%;
  1406. height: 100%;
  1407. background: #f5f5f5;
  1408. border: none;
  1409. border-radius: 0.1rem;
  1410. padding: 0.2rem;
  1411. color: #999;
  1412. font-size: 0.28rem;
  1413. }
  1414. .sub {
  1415. margin: 0 0.2rem;
  1416. background: linear-gradient(
  1417. 90deg,
  1418. rgba(22, 84, 209, 1) 0%,
  1419. rgba(9, 52, 173, 1) 100%
  1420. );
  1421. box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.2);
  1422. height: 1rem;
  1423. font-size: 0.34rem;
  1424. color: #fff;
  1425. border-radius: 0.1rem;
  1426. margin-top: 0.4rem;
  1427. }
  1428. div /deep/ .yd-popup-content {
  1429. background: #fff;
  1430. border-radius: 0.1rem;
  1431. }
  1432. .loginInput {
  1433. height: 0.8rem;
  1434. border: 0.01rem solid #ddd;
  1435. background: #f5f5f5;
  1436. border-radius: 0.1rem;
  1437. margin-top: 0.5rem;
  1438. padding: 0.2rem;
  1439. font-size: 0.28rem;
  1440. margin: 0.2rem;
  1441. margin-top: 0.5rem;
  1442. width: 94%;
  1443. color: #999;
  1444. }
  1445. /* 留言 */
  1446. .leave-header {
  1447. height: 1rem;
  1448. background: linear-gradient(
  1449. 90deg,
  1450. rgba(22, 84, 209, 1) 0%,
  1451. rgba(9, 52, 173, 1) 100%
  1452. );
  1453. box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.2);
  1454. color: #fff;
  1455. font-size: 0.34rem;
  1456. padding: 0 0.3rem;
  1457. }
  1458. .leave-main {
  1459. height: 10rem;
  1460. background: #f5f5f5;
  1461. font-size: 0.28rem;
  1462. padding: 0.3rem 0.3rem 0.2rem 0.3rem;
  1463. }
  1464. .leave-main > div {
  1465. height: 1.3rem;
  1466. margin-bottom: 0.2rem;
  1467. }
  1468. .leave-main > div input {
  1469. height: 0.8rem;
  1470. border: 0.01rem solid #ddd;
  1471. border-radius: 0.1rem;
  1472. background: #fff;
  1473. padding: 0.2rem;
  1474. width: 100%;
  1475. margin-top: 0.1rem;
  1476. }
  1477. .leave-main-txt {
  1478. background: #fff;
  1479. padding: 0.2rem;
  1480. border: 0.01rem solid #ddd;
  1481. border-radius: 0.1rem;
  1482. }
  1483. .imgMsg {
  1484. height: 1.5rem;
  1485. padding: 0 0.2rem;
  1486. margin-top: 0.1rem;
  1487. font-size: 0.24rem;
  1488. background: #fff;
  1489. border: 0.01rem solid #ddd;
  1490. border-radius: 0.1rem;
  1491. }
  1492. .yd-cell-box{
  1493. width: 60%;
  1494. min-height: 1.2rem;
  1495. border: none;
  1496. padding-right: 0.3rem;
  1497. padding-left: 0.3rem;
  1498. }
  1499. div /deep/ .yd-textarea>textarea{
  1500. box-sizing: border-box;
  1501. height: auto;
  1502. min-height:1.2rem;
  1503. font-size: 0.28rem;
  1504. padding-top: 0.4rem;
  1505. }
  1506. .yd-textarea{
  1507. padding: 0;
  1508. }
  1509. .yd-cell-box{
  1510. margin: 0;
  1511. }
  1512. .yd-cell-item{
  1513. padding: 0;
  1514. }
  1515. div /deep/ .yd-cell:after{
  1516. height: 0;
  1517. }
  1518. div /deep/ .yd-textarea-counter{
  1519. display: none;
  1520. }
  1521. /*
  1522. *留言知识库
  1523. */
  1524. </style>