index.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <template>
  2. <el-container class="lemon-container lemon-container--center"
  3. ref="container">
  4. <el-aside class="lemon-sidebar"
  5. width="240px">
  6. <ul class="lemon-tab">
  7. <li v-for="item in tabList"
  8. :key="item.name"
  9. :tab-name="item.name"
  10. :class="['lemon-tab__item', item.name == currentTab && 'lemon-tab__item--active']"
  11. @click="tabChange(item.name)">
  12. <span :class="item.icon"></span>
  13. </li>
  14. </ul>
  15. <div class="lemon-tabview">
  16. <div class="lemon-tabview__item"
  17. v-for="item in tabList"
  18. v-show="item.name == currentTab"
  19. :key="item.name"
  20. :tabview-name="item.name">
  21. <component :is="item.componentName"
  22. @changeMessageView="_changeMessageView"></component>
  23. </div>
  24. </div>
  25. </el-aside>
  26. <el-container class="lemon-main">
  27. <el-header class="lemon-header"
  28. height="48px">
  29. 宜宾劲越二手车市场(上江北) (500)
  30. </el-header>
  31. <el-main>
  32. <lemon-message-view></lemon-message-view>
  33. </el-main>
  34. <el-main>工具欄</el-main>
  35. </el-container>
  36. </el-container>
  37. </template>
  38. <script>
  39. import LemonContactList from '../contact-list'
  40. import LemonGroupList from '../group-list'
  41. import LemonMessageList from '../message-list'
  42. import LemonMessageView from '../message-view'
  43. const components = {
  44. LemonContactList,
  45. LemonGroupList,
  46. LemonMessageList,
  47. LemonMessageView
  48. }
  49. export default {
  50. name: 'LemonIm',
  51. components,
  52. provide () {
  53. return {
  54. control: this
  55. }
  56. },
  57. props: {
  58. friends: {
  59. type: Array,
  60. default: () => []
  61. },
  62. groups: {
  63. type: Array,
  64. default: () => []
  65. }
  66. },
  67. data () {
  68. this.tabList = [{
  69. name: 'message',
  70. icon: 'el-icon-s-comment',
  71. componentName: 'lemon-message-list',
  72. }, {
  73. name: 'contact',
  74. icon: 'el-icon-user-solid',
  75. componentName: 'lemon-contact-list',
  76. }, {
  77. name: 'group',
  78. icon: 'el-icon-message-solid',
  79. componentName: 'lemon-group-list',
  80. }]
  81. return {
  82. //当前会话对象的ID 根据 currentTab
  83. currentTab: 'contact',
  84. //当前聊天用户ID 根据聊天类型不一样 代表用户ID 群组ID 讨论组ID
  85. currentMessageId: null,
  86. //聊天视图是否加载中
  87. messageViewloading: true,
  88. //群聊天记录 groupId => [message]
  89. groupMessageData: {
  90. },
  91. //好友聊天记录 friendId => [message]
  92. friendMessageData: {
  93. }
  94. };
  95. },
  96. created () {
  97. },
  98. mounted () {
  99. this._initialize()
  100. },
  101. computed: {
  102. //聊天窗口中的数据
  103. messageViewData () {
  104. return this.friendMessageData[this.currentMessageId]
  105. }
  106. },
  107. watch: {},
  108. methods: {
  109. //左侧选项卡切换
  110. tabChange (name) {
  111. this.currentTab = name;
  112. this.findNode(`.lemon-tabview`).scrollTop = '0px'
  113. },
  114. //打开一个群组聊天窗口
  115. openGroupMessageView (group) {
  116. this._changeMessageViewComplete(group.id)
  117. },
  118. //打开普通聊天窗口
  119. openFriendMessageView (friend) {
  120. if (!this.friendMessageData[friend.id]) {
  121. this.$emit('pull-friends-message', friend, (newData) => {
  122. this._changeMessageViewComplete(friend.id)
  123. this.friendMessageData[friend.id] = [...newData]
  124. })
  125. } else {
  126. this._changeMessageViewComplete(friend.id)
  127. }
  128. },
  129. _changeMessageViewComplete (id) {
  130. this.messageViewloading = false
  131. this.currentMessageId = id
  132. },
  133. _changeMessageView (item) {
  134. this.openFriendMessageView(item)
  135. /**
  136. const resolve = (newData) => {
  137. this.messageViewloading = false
  138. this.
  139. }
  140. const reject = () => {
  141. this.messageViewloading = false
  142. }
  143. this.$emit('pullFriendsMessage', item, {
  144. resolve,
  145. reject
  146. })
  147. */
  148. },
  149. _openMessageView () {
  150. },
  151. findNode (query) {
  152. return this.$refs.container.$el.querySelector(query)
  153. },
  154. _initialize () {
  155. },
  156. //将左侧的滚动条重置到顶部
  157. _tabviewScrollToTop () {
  158. },
  159. }
  160. }
  161. </script>
  162. <style lang='scss'>
  163. @import '~styles/utils/index';
  164. body {
  165. background: #8d9198;
  166. }
  167. @include b(container) {
  168. width: 900px;
  169. height: 700px;
  170. @include m(center) {
  171. @include position-center(fixed);
  172. }
  173. }
  174. @include b(sidebar) {
  175. background: #1f252d;
  176. display: flex;
  177. flex-direction: column;
  178. color: #fff;
  179. overflow: hidden;
  180. .el-tabs--card {
  181. .el-tabs__nav,
  182. .el-tabs__item,
  183. .el-tabs__header {
  184. border: none;
  185. }
  186. }
  187. }
  188. @include b(tab) {
  189. display: flex;
  190. width: 100%;
  191. @include e(item) {
  192. cursor: pointer;
  193. line-height: 56px;
  194. text-align: center;
  195. flex: 1;
  196. transition: all ease-in-out 0.3s;
  197. font-size: 22px;
  198. color: #6d6d6d;
  199. @include m(active) {
  200. color: #11d207;
  201. }
  202. }
  203. }
  204. @include b(tabview) {
  205. flex: 1;
  206. overflow-y: auto;
  207. @include scrollbar-dark();
  208. @include e(item) {
  209. }
  210. }
  211. @include b(main) {
  212. background: #eceef1;
  213. }
  214. @include b(header) {
  215. line-height: 48px;
  216. }
  217. </style>