Friend.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <template>
  2. <el-container class="friend-page">
  3. <el-aside width="260px" class="friend-list-box">
  4. <div class="friend-list-header">
  5. <el-input class="search-text" size="small" placeholder="搜索" v-model="searchText">
  6. <i class="el-icon-search el-input__icon" slot="prefix"> </i>
  7. </el-input>
  8. <el-button plain class="add-btn" icon="el-icon-plus" title="添加好友"
  9. @click="onShowAddFriend()"></el-button>
  10. <add-friend :dialogVisible="showAddFriend" @close="onCloseAddFriend"></add-friend>
  11. </div>
  12. <el-scrollbar class="friend-list-items">
  13. <div v-for="(friend, index) in $store.state.friendStore.friends" :key="index">
  14. <friend-item v-if="!friend.deleted" v-show="friend.nickName.includes(searchText)" :index="index"
  15. :active="friend === $store.state.friendStore.activeFriend" @chat="onSendMessage(friend)"
  16. @delete="onDelItem(friend)" @click.native="onActiveItem(friend, index)">
  17. </friend-item>
  18. </div>
  19. </el-scrollbar>
  20. </el-aside>
  21. <el-container class="friend-box">
  22. <div class="friend-header" v-show="userInfo.id">
  23. {{ userInfo.nickName }}
  24. </div>
  25. <div v-show="userInfo.id">
  26. <div class="friend-detail">
  27. <head-image :size="160" :name="userInfo.nickName" :url="userInfo.headImage" radius="10%"
  28. @click.native="showFullImage()"></head-image>
  29. <div>
  30. <div class="info-item">
  31. <el-descriptions title="好友信息" class="description" :column="1">
  32. <el-descriptions-item label="用户名">{{ userInfo.userName }}
  33. </el-descriptions-item>
  34. <el-descriptions-item label="昵称">{{ userInfo.nickName }}
  35. </el-descriptions-item>
  36. <el-descriptions-item label="性别">{{ userInfo.sex == 0 ? "男" : "女" }}</el-descriptions-item>
  37. <el-descriptions-item label="签名">{{ userInfo.signature }}</el-descriptions-item>
  38. </el-descriptions>
  39. </div>
  40. <div class="frient-btn-group">
  41. <el-button v-show="isFriend" icon="el-icon-position" type="primary"
  42. @click="onSendMessage(userInfo)">发消息</el-button>
  43. <el-button v-show="!isFriend" icon="el-icon-plus" type="primary"
  44. @click="onAddFriend(userInfo)">加为好友</el-button>
  45. <el-button v-show="isFriend" icon="el-icon-delete" type="danger"
  46. @click="onDelItem(userInfo, activeIdx)">删除好友</el-button>
  47. </div>
  48. </div>
  49. </div>
  50. <!-- <el-divider content-position="center"></el-divider>-->
  51. </div>
  52. </el-container>
  53. </el-container>
  54. </template>
  55. <script>
  56. import FriendItem from "../components/friend/FriendItem.vue";
  57. import AddFriend from "../components/friend/AddFriend.vue";
  58. import HeadImage from "../components/common/HeadImage.vue";
  59. export default {
  60. name: "friend",
  61. components: {
  62. FriendItem,
  63. AddFriend,
  64. HeadImage
  65. },
  66. data() {
  67. return {
  68. searchText: "",
  69. showAddFriend: false,
  70. activeIdx: -1,
  71. userInfo: {},
  72. friend: {}
  73. }
  74. },
  75. methods: {
  76. onShowAddFriend() {
  77. this.showAddFriend = true;
  78. },
  79. onCloseAddFriend() {
  80. this.showAddFriend = false;
  81. },
  82. onActiveItem(friend, idx) {
  83. this.$store.commit("activeFriend", idx);
  84. this.activeIdx = idx
  85. this.friend = friend;
  86. this.loadUserInfo(friend.id);
  87. },
  88. onDelItem(friend) {
  89. this.$confirm(`确认删除'${friend.nickName}',并清空聊天记录吗?`, '确认解除?', {
  90. confirmButtonText: '确定',
  91. cancelButtonText: '取消',
  92. type: 'warning'
  93. }).then(() => {
  94. this.$http({
  95. url: `/friend/delete/${friend.id}`,
  96. method: 'delete'
  97. }).then(() => {
  98. this.$message.success("删除好友成功");
  99. this.$store.commit("removeFriend", friend.id);
  100. this.$store.commit("removePrivateChat", friend.id);
  101. })
  102. })
  103. },
  104. onAddFriend(user) {
  105. this.$http({
  106. url: "/friend/add",
  107. method: "post",
  108. params: {
  109. friendId: user.id
  110. }
  111. }).then(() => {
  112. this.$message.success("添加成功,对方已成为您的好友");
  113. let friend = {
  114. id: user.id,
  115. nickName: user.nickName,
  116. headImage: user.headImage,
  117. online: user.online
  118. }
  119. this.$store.commit("addFriend", friend);
  120. })
  121. },
  122. onSendMessage(user) {
  123. let chat = {
  124. type: 'PRIVATE',
  125. targetId: user.id,
  126. showName: user.nickName,
  127. headImage: user.headImageThumb,
  128. };
  129. console.log("chat:",chat)
  130. this.$store.commit("openChat", chat);
  131. this.$store.commit("activeChat", 0);
  132. this.$router.push("/home/chat");
  133. },
  134. showFullImage() {
  135. if (this.userInfo.headImage) {
  136. this.$store.commit('showFullImageBox', this.userInfo.headImage);
  137. }
  138. },
  139. updateFriendInfo() {
  140. if (this.isFriend) {
  141. // store的数据不能直接修改,深拷贝一份store的数据
  142. let friend = JSON.parse(JSON.stringify(this.friend));
  143. friend.headImage = this.userInfo.headImageThumb;
  144. friend.nickName = this.userInfo.nickName;
  145. this.$store.commit("updateChatFromFriend", friend);
  146. this.$store.commit("updateFriend", friend);
  147. }
  148. },
  149. loadUserInfo(id) {
  150. // 获取好友用户信息
  151. this.$http({
  152. url: `/user/find/${id}`,
  153. method: 'GET'
  154. }).then((userInfo) => {
  155. this.userInfo = userInfo;
  156. this.updateFriendInfo();
  157. })
  158. }
  159. },
  160. computed: {
  161. friendStore() {
  162. return this.$store.state.friendStore;
  163. },
  164. isFriend() {
  165. return this.friendStore.friends.find((f) => f.id == this.userInfo.id);
  166. }
  167. }
  168. }
  169. </script>
  170. <style lang="scss">
  171. .friend-page {
  172. .friend-list-box {
  173. display: flex;
  174. flex-direction: column;
  175. background: var(--im-background);
  176. .friend-list-header {
  177. height: 50px;
  178. display: flex;
  179. align-items: center;
  180. padding: 0 8px;
  181. .add-btn {
  182. padding: 5px !important;
  183. margin: 5px;
  184. font-size: 16px;
  185. border-radius: 50%;
  186. }
  187. }
  188. .friend-list-items {
  189. flex: 1;
  190. }
  191. }
  192. .friend-box {
  193. display: flex;
  194. flex-direction: column;
  195. .friend-header {
  196. height: 50px;
  197. display: flex;
  198. justify-content: space-between;
  199. align-items: center;
  200. padding: 0 12px;
  201. font-size: var(--im-font-size-larger);
  202. border-bottom: var(--im-border);
  203. box-sizing: border-box;
  204. }
  205. .friend-detail {
  206. display: flex;
  207. padding: 50px 80px 20px 80px;
  208. text-align: center;
  209. .info-item {
  210. margin-left: 20px;
  211. background-color: #ffffff;
  212. border: 1px #ddd solid;
  213. }
  214. .description {
  215. padding: 20px 20px 0 20px;
  216. }
  217. }
  218. .frient-btn-group {
  219. text-align: left !important;
  220. padding: 20px;
  221. }
  222. }
  223. }
  224. </style>