history.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <template>
  2. <page-meta :page-font-size="fontValue+'px'" :root-font-size="fontValue+'px'"></page-meta>
  3. <view>
  4. <z-paging class="cu-chat" ref="paging" v-model="messageList" use-chat-record-mode safe-area-inset-bottom bottom-bg-color="#f8f8f8"
  5. @query="queryList" >
  6. <!-- 底部聊天输入框 -->
  7. <template #top>
  8. <cu-custom bgImage="/static/bg.png" :isBack="true">
  9. <template v-slot:content>
  10. <text class="text-black">{{ chatName }}</text>
  11. </template>
  12. </cu-custom>
  13. <scroll-view scroll-x class="bg-white nav" >
  14. <view class="flex text-center">
  15. <view class="cu-item flex-sub" :class="index===tabCur?'text-orange cur text-bold':'text-black text-bold'" v-for="(item,index) in options"
  16. :key="index" @tap="tabSelect($event,item)" :data-id="index">
  17. {{ item.label }}
  18. </view>
  19. </view>
  20. </scroll-view>
  21. </template>
  22. <view v-for='(item,index) in messageList' :id="`z-paging-${index}`" :key="item.id" class="paging-item">
  23. <view v-if="item.messageType === MessageType.event" class="text-center" style="transform: scaleY(-1)">
  24. <MessageEvent :message="decryptMsg(item)"></MessageEvent>
  25. </view>
  26. <template v-else>
  27. <view v-if='item.fromId === currentUser!.id' class='cu-item self' style="transform: scaleY(-1)">
  28. <view class='main' style='display: block;'>
  29. <view class='text-gray text-sm padding-bottom-sm'>
  30. <view class='margin-right inline'>
  31. <Time :time='item.timestamp'></Time>
  32. </view>
  33. <text>{{ chatUsers.get(item!.fromId)?.name }}</text>
  34. </view>
  35. <view class='content shadow'>
  36. <message-view :item='decryptMsg(item)'></message-view>
  37. </view>
  38. </view>
  39. <view>
  40. <image class='cu-avatar radius' :src='chatUsers.get(item.fromId)?.avatar'></image>
  41. </view>
  42. </view>
  43. <view v-if='item.fromId !== currentUser!.id' class='cu-item' :id="'m-'+index" style="transform: scaleY(-1)">
  44. <view class='flex flex-direction'>
  45. <image class='cu-avatar radius' :src='chatUsers.get(item.fromId)?.avatar'></image>
  46. </view>
  47. <view class='main' style='display: block;'>
  48. <view class='text-gray text-sm padding-bottom-sm'>
  49. <text>{{ chatUsers.get(item!.fromId)?.name }}</text>
  50. <view class='margin-left inline'>
  51. <Time :time='item.timestamp'></Time>
  52. </view>
  53. </view>
  54. <view class='content shadow'>
  55. <message-view :item='decryptMsg(item)'></message-view>
  56. </view>
  57. </view>
  58. </view>
  59. </template>
  60. </view>
  61. </z-paging>
  62. </view>
  63. </template>
  64. <script setup lang="ts">
  65. import {ref} from "vue";
  66. import {onLoad, onPageScroll} from '@dcloudio/uni-app';
  67. import {useUserStore} from "@/store/userStore";
  68. import MessageApi from "@/api/MessageApi";
  69. import MessageView from '@/components/MessageView.vue';
  70. import Time from '@/components/Time.vue';
  71. import type ChatSimple from "@/mode/ChatSimple";
  72. import CuCustom from '@/colorui/components/cu-custom.vue';
  73. import ChatType from "@/utils/ChatType";
  74. import GroupApi from "@/api/GroupApi";
  75. import UserApi from "@/api/UserApi";
  76. import type User from "@/mode/User";
  77. import MessageType from "@/utils/MessageType";
  78. import MessageEvent from "@/components/messages/MessageEvent.vue";
  79. import ZPaging from "@/uni_modules/z-paging/components/z-paging/z-paging.vue";
  80. import type Message from '@/mode/Message';
  81. import {decryptLong2 } from '@/store/cryptoAES';
  82. import Auth from "@/api/Auth";
  83. import dbApi from '@/api/DBactApi';
  84. const fontValue=ref(Auth.getfontSize());
  85. //聊天对象,
  86. const userStore = useUserStore();
  87. const messageList = ref([]);
  88. const chatId = ref('');
  89. const keyword = ref('');
  90. const messageType = ref('');
  91. const chatName = ref('');
  92. const type = ref('');
  93. const tabCur = ref(0);
  94. const scrollLeft = ref(0);
  95. const paging = ref();
  96. const chatUsers = ref<Map<string, ChatSimple>>(new Map());
  97. const currentUser = userStore.getUser();
  98. const dateRange = ref([])
  99. const options = [
  100. {value: '', label: '全部'},
  101. {value: '0', label: '文本'},
  102. {value: '1', label: '图片'},
  103. {value: '2', label: '文件'},
  104. {value: '3', label: '语音'},
  105. {value: '5', label: '视频'}
  106. ]
  107. const tabSelect = (e: TouchEvent, item: any) => {
  108. tabCur.value = e.currentTarget!.dataset.id;
  109. messageType.value = item.value;
  110. uni.redirectTo({
  111. url: '/pages/chat/history?chatId=' + chatId.value + '&type=' + type.value + '&messageType=' + messageType.value + '&tabCur=' + tabCur.value
  112. })
  113. }
  114. let dataList=[];
  115. //获取聊天室id
  116. onLoad((opt) => {
  117. chatId.value = opt?.chatId;
  118. type.value = opt?.type;
  119. if(opt?.tabCur){
  120. tabCur.value = Number(opt?.tabCur)
  121. }
  122. if(opt?.messageType){
  123. messageType.value = opt?.messageType
  124. }
  125. dataList=[];
  126. loadUsers()
  127. })
  128. onPageScroll((e) => {
  129. if (e.scrollTop < 1) {
  130. paging.value.doChatRecordLoadMore();
  131. }
  132. })
  133. const loadUsers = () => {
  134. if (currentUser) {
  135. chatUsers.value.set(currentUser.id, {avatar: currentUser.avatar, name: currentUser.name});
  136. if (type.value === ChatType.FRIEND) {
  137. UserApi.getUser(chatId.value)
  138. .then((res) => {
  139. const chatUser = res.data;
  140. chatName.value = chatUser.name
  141. chatUsers.value.set(chatUser.id, {avatar: chatUser.avatar, name: chatUser.name});
  142. })
  143. } else {
  144. GroupApi.users(chatId.value)
  145. .then((res) => {
  146. res.data.forEach((item: User) => {
  147. chatUsers.value.set(item.id, {avatar: item.avatar, name: item.name});
  148. })
  149. return GroupApi.get(chatId.value)
  150. })
  151. .then((res) => {
  152. chatName.value = res.data.name
  153. })
  154. }
  155. }
  156. }
  157. /**
  158. * 加载数据
  159. * @param pageNum
  160. * @param pageSize
  161. */
  162. const queryList = (pageNum: number, pageSize: number) => {
  163. if (currentUser) {
  164. console.log('queryList',messageType.value,pageNum,pageSize);
  165. getHistoryMsg(pageNum,pageSize,messageType.value);
  166. return;
  167. // uni.showLoading();
  168. // console.log('pageSize',pageSize);
  169. // MessageApi.search(
  170. // chatId.value,
  171. // currentUser!.id,
  172. // keyword.value,
  173. // type.value,
  174. // messageType.value,
  175. // pageNum,
  176. // dateRange.value ? dateRange.value[0] : '',
  177. // dateRange.value ? dateRange.value[1] : '',
  178. // pageSize
  179. // ).then(
  180. // (res: any) => {
  181. // //数据反转
  182. // const dataList: [] = res.data.records;
  183. // console.log(dataList);
  184. // paging.value.complete(dataList)
  185. // }
  186. // )
  187. // .catch(() => {
  188. // paging.value.complete(false);
  189. // })
  190. // .finally(() => {
  191. // uni.hideLoading()
  192. // })
  193. }
  194. }
  195. const getHistoryMsg=(pageNum: number, pageSize: number,messageType:string)=>{
  196. uni.showLoading();
  197. dbApi.selectLocalmsgType(chatId.value,messageType,pageNum).then((res:any)=>{
  198. if(res){
  199. console.log(res);
  200. dataList=[];
  201. for (var i=0;i<res.length;i++) {
  202. const msg = JSON.parse(res[i].Message);
  203. dataList.push(msg);
  204. }
  205. console.log(dataList);
  206. if(dataList.length==0){
  207. paging.value.complete(false);
  208. }
  209. else{
  210. paging.value.complete(dataList)
  211. }
  212. }
  213. });
  214. uni.hideLoading()
  215. }
  216. const decryptMsg=(msg:Message)=>{
  217. var content=decryptLong2(msg.content);
  218. if(content){
  219. msg.content=content;
  220. }
  221. return msg;
  222. }
  223. </script>
  224. <style scoped>
  225. .inline {
  226. display: inline-block;
  227. }
  228. .cu-chat {
  229. background-color: #eeeeee;
  230. }
  231. .cu-chat .cu-item{
  232. padding: 0 0.625rem;
  233. }
  234. .paging-item{
  235. padding: 0.5rem 0 ;
  236. }
  237. </style>