App.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. <template>
  2. <div id="app">
  3. <div class="imui-center">
  4. <lemon-imui
  5. :user="user"
  6. ref="IMUI"
  7. :hide-menu="hideMenu"
  8. :hide-menu-avatar="hideMenuAvatar"
  9. @change-menu="handleChangeMenu"
  10. @change-contact="handleChangeContact"
  11. @pull-messages="handlePullMessages"
  12. @message-click="handleMessageClick"
  13. @menu-avatar-click="handleMenuAvatarClick"
  14. @send="handleSend"
  15. >
  16. <template #cover>
  17. <div class="cover">
  18. <i class="lemon-icon-message"></i>
  19. <p><b>Lemon</b> IMUI</p>
  20. </div>
  21. </template>
  22. <!-- <template #contact-info="contact">
  23. <span style="color:blue">contact-info {{ contact }}</span>
  24. </template> -->
  25. <template #contact-title="contact">
  26. <span>{{ contact.displayName }}</span>
  27. <small class="more" @click="changeDrawer(contact)">&#8230;</small>
  28. </template>
  29. <!-- <template #contact-info="contact">
  30. 自定义联系人信息 {{ contact.displayName }}
  31. </template> -->
  32. <template #message-sidebar>
  33. <div class="bar">自定义消息顶部</div>
  34. </template>
  35. <template #contact-sidebar>
  36. <div class="bar">自定义联系人顶部</div>
  37. </template>
  38. </lemon-imui>
  39. <div class="action">
  40. <lemon-button @click="appendMessage">发送消息</lemon-button>
  41. <lemon-button @click="updateContact">修改联系人信息</lemon-button>
  42. <lemon-button @click="changeMenuVisible">切换导航显示</lemon-button>
  43. <lemon-button @click="changeMenuAvatarVisible"
  44. >切换头像显示</lemon-button
  45. >
  46. </div>
  47. <div class="link">
  48. <a target="_blank" href="https://github.com/fanjyy/lemon-imui">Github</a>
  49. <a target="_blank" href="https://gitee.com/june000/lemon-im">Gitee</a>
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <script>
  55. const getTime = () => {
  56. return new Date().getTime();
  57. };
  58. const generateRandId = () => {
  59. return Math.random()
  60. .toString(36)
  61. .substr(-8);
  62. };
  63. const generateRandWord = () => {
  64. return Math.random()
  65. .toString(36)
  66. .substr(2);
  67. };
  68. const generateMessage = (toContactId = "", fromUser) => {
  69. if (!fromUser) {
  70. fromUser = {
  71. id: "system",
  72. displayName: "系统测试",
  73. avatar: "http://upload.qqbodys.com/allimg/1710/1035512943-0.jpg"
  74. };
  75. }
  76. return {
  77. id: generateRandId(),
  78. status: "succeed",
  79. type: "text",
  80. sendTime: getTime(),
  81. content: generateRandWord(),
  82. //fileSize: 1231,
  83. //fileName: "asdasd.doc",
  84. toContactId,
  85. fromUser
  86. };
  87. };
  88. export default {
  89. name: "app",
  90. data() {
  91. return {
  92. hideMenuAvatar: false,
  93. hideMenu: false,
  94. user: {
  95. id: "superadmin",
  96. displayName: "June",
  97. avatar:
  98. "https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268%3Bg%3D0/sign=69e1a1a4b78f8c54e3d3c22902124ac8/060828381f30e9247e29fb7b4f086e061c95f7ef.jpg"
  99. }
  100. };
  101. },
  102. mounted() {
  103. const contactData1 = {
  104. id: "contact-1",
  105. displayName: "工作协作群",
  106. avatar: "http://upload.qqbodys.com/img/weixin/20170804/ji5qxg1am5ztm.jpg",
  107. type: "single",
  108. index: "A",
  109. unread: 0,
  110. lastSendTime: 1566047865417,
  111. lastContent: "2"
  112. };
  113. const contactData2 = {
  114. id: "contact-2",
  115. displayName: "自定义内容",
  116. avatar: "http://upload.qqbodys.com/img/weixin/20170807/jibfvfd00npin.jpg",
  117. type: "single",
  118. //index: "Z",
  119. click(next) {
  120. next();
  121. },
  122. renderContainer: () => {
  123. return <h1 style="text-indent:20px">自定义页面</h1>;
  124. },
  125. lastSendTime: 1345209465000,
  126. lastContent: "12312",
  127. unread: 2
  128. };
  129. const contactData3 = {
  130. id: "contact-3",
  131. displayName: "铁牛",
  132. avatar: "http://upload.qqbodys.com/img/weixin/20170803/jiq4nzrkrnd0e.jpg",
  133. type: "many",
  134. index: "C",
  135. unread: 32,
  136. lastSendTime: 3,
  137. lastContent: "你好123"
  138. };
  139. const { IMUI } = this.$refs;
  140. let data = [
  141. { ...contactData1 },
  142. { ...contactData2 },
  143. { ...contactData3 }
  144. //...Array(100).fill(contactData1)
  145. ];
  146. IMUI.initContacts(data);
  147. IMUI.initMenus([
  148. {
  149. name: "lastMessages"
  150. },
  151. {
  152. name: "contacts"
  153. },
  154. {
  155. name: "custom1",
  156. title: "自定义按钮1",
  157. unread: 0,
  158. render: menu => {
  159. return <i class="lemon-icon-attah" />;
  160. },
  161. renderContainer: () => {
  162. return (
  163. <div class="article">
  164. <ul>
  165. <li class="article-item">
  166. <h2>人民日报谈网红带货:产品真的值得买吗?</h2>
  167. </li>
  168. <li class="article-item">
  169. 甘肃夏河县发生5.7级地震 暂未接到人员伤亡报告
  170. </li>
  171. <li class="article-item">
  172. 北方多地风力仍强沙尘相伴,东北内蒙古等地迎雨雪
  173. </li>
  174. <li class="article-item">
  175. 英货车案:越南警方采集疑死者家属DNA作比对
  176. </li>
  177. <li class="article-item">
  178. 知名连锁咖啡店的蛋糕吃出活虫 曝光内幕太震惊
  179. </li>
  180. </ul>
  181. <lemon-contact
  182. props={{ contact: contactData1 }}
  183. style="margin:20px"
  184. />
  185. <lemon-contact
  186. props={{ contact: contactData3 }}
  187. style="margin:20px"
  188. />
  189. </div>
  190. );
  191. },
  192. isBottom: true
  193. },
  194. {
  195. name: "custom2",
  196. title: "自定义按钮2",
  197. unread: 0,
  198. click: () => {
  199. alert("拦截导航点击事件");
  200. },
  201. render: menu => {
  202. return <i class="lemon-icon-group" />;
  203. },
  204. isBottom: true
  205. }
  206. ]);
  207. IMUI.initEmoji([
  208. {
  209. label: "表情",
  210. children: [
  211. {
  212. name: "1f600",
  213. title: "微笑",
  214. src: "https://twemoji.maxcdn.com/2/72x72/1f600.png"
  215. },
  216. {
  217. name: "1f62c",
  218. title: "微笑",
  219. src: "https://twemoji.maxcdn.com/2/72x72/1f62c.png"
  220. },
  221. {
  222. name: "1f601",
  223. title: "微笑",
  224. src: "https://twemoji.maxcdn.com/2/72x72/1f601.png"
  225. },
  226. {
  227. name: "1f602",
  228. title: "微笑",
  229. src: "https://twemoji.maxcdn.com/2/72x72/1f602.png"
  230. },
  231. {
  232. name: "1f923",
  233. title: "微笑",
  234. src: "https://twemoji.maxcdn.com/2/72x72/1f923.png"
  235. },
  236. {
  237. name: "1f973",
  238. title: "微笑",
  239. src: "https://twemoji.maxcdn.com/2/72x72/1f973.png"
  240. },
  241. {
  242. name: "1f603",
  243. title: "微笑",
  244. src: "https://twemoji.maxcdn.com/2/72x72/1f603.png"
  245. },
  246. {
  247. name: "1f604",
  248. title: "微笑",
  249. src: "https://twemoji.maxcdn.com/2/72x72/1f604.png"
  250. },
  251. {
  252. name: "1f605",
  253. title: "微笑",
  254. src: "https://twemoji.maxcdn.com/2/72x72/1f605.png"
  255. },
  256. {
  257. name: "1f606",
  258. title: "微笑",
  259. src: "https://twemoji.maxcdn.com/2/72x72/1f606.png"
  260. },
  261. {
  262. name: "1f607",
  263. title: "微笑",
  264. src: "https://twemoji.maxcdn.com/2/72x72/1f607.png"
  265. },
  266. {
  267. name: "1f609",
  268. title: "微笑",
  269. src: "https://twemoji.maxcdn.com/2/72x72/1f609.png"
  270. },
  271. {
  272. name: "1f60a",
  273. title: "微笑",
  274. src: "https://twemoji.maxcdn.com/2/72x72/1f60a.png"
  275. },
  276. {
  277. name: "1f642",
  278. title: "微笑",
  279. src: "https://twemoji.maxcdn.com/2/72x72/1f642.png"
  280. },
  281. {
  282. name: "1f643",
  283. title: "微笑",
  284. src: "https://twemoji.maxcdn.com/2/72x72/1f643.png"
  285. },
  286. {
  287. name: "1263a",
  288. title: "微笑",
  289. src: "https://twemoji.maxcdn.com/2/72x72/263a.png"
  290. },
  291. {
  292. name: "1f60b",
  293. title: "微笑",
  294. src: "https://twemoji.maxcdn.com/2/72x72/1f60b.png"
  295. },
  296. {
  297. name: "1f60c",
  298. title: "微笑",
  299. src: "https://twemoji.maxcdn.com/2/72x72/1f60c.png"
  300. },
  301. {
  302. name: "1f60d",
  303. title: "微笑",
  304. src: "https://twemoji.maxcdn.com/2/72x72/1f60d.png"
  305. },
  306. {
  307. name: "1f970",
  308. title: "微笑",
  309. src: "https://twemoji.maxcdn.com/2/72x72/1f970.png"
  310. },
  311. {
  312. name: "1f618",
  313. title: "微笑",
  314. src: "https://twemoji.maxcdn.com/2/72x72/1f618.png"
  315. },
  316. {
  317. name: "1f617",
  318. title: "微笑",
  319. src: "https://twemoji.maxcdn.com/2/72x72/1f617.png"
  320. },
  321. {
  322. name: "1f619",
  323. title: "微笑",
  324. src: "https://twemoji.maxcdn.com/2/72x72/1f619.png"
  325. },
  326. {
  327. name: "1f61a",
  328. title: "微笑",
  329. src: "https://twemoji.maxcdn.com/2/72x72/1f61a.png"
  330. },
  331. {
  332. name: "1f61c",
  333. title: "微笑",
  334. src: "https://twemoji.maxcdn.com/2/72x72/1f61c.png"
  335. },
  336. {
  337. name: "1f92a",
  338. title: "微笑",
  339. src: "https://twemoji.maxcdn.com/2/72x72/1f92a.png"
  340. },
  341. {
  342. name: "1f928",
  343. title: "微笑",
  344. src: "https://twemoji.maxcdn.com/2/72x72/1f928.png"
  345. },
  346. {
  347. name: "1f9d0",
  348. title: "微笑",
  349. src: "https://twemoji.maxcdn.com/2/72x72/1f9d0.png"
  350. },
  351. {
  352. name: "1f61d",
  353. title: "微笑",
  354. src: "https://twemoji.maxcdn.com/2/72x72/1f61d.png"
  355. },
  356. {
  357. name: "1f61b",
  358. title: "微笑",
  359. src: "https://twemoji.maxcdn.com/2/72x72/1f61b.png"
  360. },
  361. {
  362. name: "1f911",
  363. title: "微笑",
  364. src: "https://twemoji.maxcdn.com/2/72x72/1f911.png"
  365. },
  366. {
  367. name: "1f913",
  368. title: "微笑",
  369. src: "https://twemoji.maxcdn.com/2/72x72/1f913.png"
  370. },
  371. {
  372. name: "1f60e",
  373. title: "微笑",
  374. src: "https://twemoji.maxcdn.com/2/72x72/1f60e.png"
  375. },
  376. {
  377. name: "1f929",
  378. title: "微笑",
  379. src: "https://twemoji.maxcdn.com/2/72x72/1f929.png"
  380. },
  381. {
  382. name: "1f921",
  383. title: "微笑",
  384. src: "https://twemoji.maxcdn.com/2/72x72/1f921.png"
  385. },
  386. {
  387. name: "1f920",
  388. title: "微笑",
  389. src: "https://twemoji.maxcdn.com/2/72x72/1f920.png"
  390. },
  391. {
  392. name: "1f917",
  393. title: "微笑",
  394. src: "https://twemoji.maxcdn.com/2/72x72/1f917.png"
  395. },
  396. {
  397. name: "1f60f",
  398. title: "微笑",
  399. src: "https://twemoji.maxcdn.com/2/72x72/1f60f.png"
  400. },
  401. {
  402. name: "1f636",
  403. title: "微笑",
  404. src: "https://twemoji.maxcdn.com/2/72x72/1f636.png"
  405. },
  406. {
  407. name: "1f610",
  408. title: "微笑",
  409. src: "https://twemoji.maxcdn.com/2/72x72/1f610.png"
  410. },
  411. {
  412. name: "1f611",
  413. title: "微笑",
  414. src: "https://twemoji.maxcdn.com/2/72x72/1f611.png"
  415. },
  416. {
  417. name: "1f612",
  418. title: "微笑",
  419. src: "https://twemoji.maxcdn.com/2/72x72/1f612.png"
  420. },
  421. {
  422. name: "1f644",
  423. title: "微笑",
  424. src: "https://twemoji.maxcdn.com/2/72x72/1f644.png"
  425. },
  426. {
  427. name: "1f914",
  428. title: "微笑",
  429. src: "https://twemoji.maxcdn.com/2/72x72/1f914.png"
  430. },
  431. {
  432. name: "1f925",
  433. title: "微笑",
  434. src: "https://twemoji.maxcdn.com/2/72x72/1f925.png"
  435. },
  436. {
  437. name: "1f92d",
  438. title: "微笑",
  439. src: "https://twemoji.maxcdn.com/2/72x72/1f92d.png"
  440. },
  441. {
  442. name: "1f92b",
  443. title: "微笑",
  444. src: "https://twemoji.maxcdn.com/2/72x72/1f92b.png"
  445. },
  446. {
  447. name: "1f92c",
  448. title: "微笑",
  449. src: "https://twemoji.maxcdn.com/2/72x72/1f92c.png"
  450. },
  451. {
  452. name: "1f92f",
  453. title: "微笑",
  454. src: "https://twemoji.maxcdn.com/2/72x72/1f92f.png"
  455. },
  456. {
  457. name: "1f633",
  458. title: "微笑",
  459. src: "https://twemoji.maxcdn.com/2/72x72/1f633.png"
  460. },
  461. {
  462. name: "1f61e",
  463. title: "微笑",
  464. src: "https://twemoji.maxcdn.com/2/72x72/1f61e.png"
  465. },
  466. {
  467. name: "1f61f",
  468. title: "微笑",
  469. src: "https://twemoji.maxcdn.com/2/72x72/1f61f.png"
  470. },
  471. {
  472. name: "1f620",
  473. title: "微笑",
  474. src: "https://twemoji.maxcdn.com/2/72x72/1f620.png"
  475. },
  476. {
  477. name: "1f621",
  478. title: "微笑",
  479. src: "https://twemoji.maxcdn.com/2/72x72/1f621.png"
  480. }
  481. ]
  482. },
  483. {
  484. label: "收藏",
  485. children: [
  486. {
  487. name: "1f62c",
  488. title: "微笑",
  489. src: "https://twemoji.maxcdn.com/2/72x72/1f62c.png"
  490. },
  491. {
  492. name: "1f621",
  493. title: "微笑",
  494. src: "https://twemoji.maxcdn.com/2/72x72/1f621.png"
  495. }
  496. ]
  497. }
  498. ]);
  499. },
  500. methods: {
  501. handleMenuAvatarClick() {
  502. console.log("Event:menu-avatar-click");
  503. },
  504. handleMessageClick(e, key, message) {
  505. const { IMUI } = this.$refs;
  506. if (key == "status") {
  507. IMUI.updateMessage(message.id, message.toContactId, {
  508. status: "going",
  509. content: "正在重新发送消息..."
  510. });
  511. setTimeout(() => {
  512. IMUI.updateMessage(message.id, message.toContactId, {
  513. status: "succeed",
  514. content: "发送成功"
  515. });
  516. }, 2000);
  517. }
  518. },
  519. changeMenuAvatarVisible() {
  520. this.hideMenuAvatar = !this.hideMenuAvatar;
  521. },
  522. changeMenuVisible() {
  523. this.hideMenu = !this.hideMenu;
  524. },
  525. appendMessage() {
  526. const { IMUI } = this.$refs;
  527. const contact = IMUI.currentContact;
  528. const message = generateMessage();
  529. message.fromUser = {
  530. ...message.fromUser,
  531. ...this.user
  532. };
  533. IMUI.appendMessage(message);
  534. IMUI.updateContact(contact.id, {
  535. unread: "+1",
  536. lastSendTime: getTime(),
  537. lastContent: IMUI.lastContentRender(message)
  538. });
  539. },
  540. updateContact() {
  541. this.$refs.IMUI.updateContact("contact-3", {
  542. unread: 10,
  543. displayName: generateRandWord(),
  544. lastSendTime: getTime(),
  545. lastContent: "修改昵称为随机字母"
  546. });
  547. },
  548. changeDrawer(contact) {
  549. this.$refs.IMUI.changeDrawer(() => {
  550. return (
  551. <div class="drawer-content">
  552. <p>
  553. <b>自定义抽屉</b>
  554. </p>
  555. <p>{contact.displayName}</p>
  556. </div>
  557. );
  558. });
  559. },
  560. handleChangeContact(contact) {
  561. console.log("Event:change-contact");
  562. this.$refs.IMUI.updateContact(contact.id, {
  563. //displayName: "123",
  564. unread: 0
  565. });
  566. this.$refs.IMUI.closeDrawer();
  567. },
  568. handleSend(message, next, file) {
  569. //console.log("Event:send");
  570. console.log(message,next,file)
  571. setTimeout(() => {
  572. next();
  573. }, 1000);
  574. },
  575. handlePullMessages(contact, next) {
  576. const { IMUI } = this.$refs;
  577. const otheruser = {
  578. id: "hehe",
  579. displayName: "I KNOEW",
  580. avatar:
  581. "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4085009425,1005454674&fm=26&gp=0.jpg"
  582. };
  583. console.log("Event:pull-messages");
  584. const messages = [
  585. generateMessage(IMUI.currentContactId, this.user),
  586. generateMessage(IMUI.currentContactId, otheruser),
  587. generateMessage(IMUI.currentContactId, this.user),
  588. generateMessage(IMUI.currentContactId, otheruser),
  589. generateMessage(IMUI.currentContactId, this.user),
  590. generateMessage(IMUI.currentContactId, this.user),
  591. generateMessage(IMUI.currentContactId, otheruser),
  592. {
  593. ...generateMessage(IMUI.currentContactId, this.user),
  594. ...{ status: "failed" }
  595. }
  596. ];
  597. console.log(messages);
  598. let isEnd = false;
  599. if (IMUI.getMessages(IMUI.currentContactId).length > 20) isEnd = true;
  600. next(messages, isEnd);
  601. },
  602. handleChangeMenu() {
  603. console.log("Event:change-menu");
  604. },
  605. openCustomContainer() {}
  606. }
  607. };
  608. </script>
  609. <style lang="stylus">
  610. body
  611. background #3d495c !important
  612. .link
  613. padding 15px 0
  614. a
  615. display inline-block
  616. font-size 16px
  617. color #ccd3dc
  618. text-decoration none
  619. border-radius 5px
  620. margin-right 15px
  621. &:hover
  622. color #85acda
  623. .action
  624. margin-top 30px
  625. button
  626. margin-right 10px
  627. .imui-center
  628. position absolute
  629. top 50%
  630. left 50%
  631. transform translate(-50%,-50%)
  632. .drawer-content
  633. padding 15px
  634. .more
  635. font-size 32px
  636. line-height 18px
  637. height 32px
  638. position absolute
  639. top 6px
  640. right 14px
  641. cursor pointer
  642. user-select none
  643. color #999
  644. &:active
  645. color #000
  646. .bar
  647. text-align center
  648. line-height 30px
  649. background #fff
  650. margin 15px
  651. color #666
  652. user-select none
  653. font-size 12px
  654. .cover
  655. text-align center
  656. user-select none
  657. position absolute
  658. top 50%
  659. left 50%
  660. transform translate(-50%,-50%)
  661. i
  662. font-size 84px
  663. color #e6e6e6
  664. p
  665. font-size 18px
  666. color #ddd
  667. line-height 50px
  668. .article-item
  669. line-height 34px
  670. cursor pointer
  671. &:hover
  672. text-decoration underline
  673. color #318efd
  674. </style>