| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <template>
- <page-meta :page-font-size="fontValue+'px'" :root-font-size="fontValue+'px'"></page-meta>
- <view>
- <z-paging class="cu-chat" ref="paging" v-model="messageList" use-chat-record-mode safe-area-inset-bottom bottom-bg-color="#f8f8f8"
- @query="queryList" >
- <!-- 底部聊天输入框 -->
- <template #top>
- <cu-custom bgImage="/static/bg.png" :isBack="true">
- <template v-slot:content>
- <text class="text-black">{{ chatName }}</text>
- </template>
- </cu-custom>
- <scroll-view scroll-x class="bg-white nav" >
- <view class="flex text-center">
- <view class="cu-item flex-sub" :class="index===tabCur?'text-orange cur text-bold':'text-black text-bold'" v-for="(item,index) in options"
- :key="index" @tap="tabSelect($event,item)" :data-id="index">
- {{ item.label }}
- </view>
- </view>
- </scroll-view>
- </template>
- <view v-for='(item,index) in messageList' :id="`z-paging-${index}`" :key="item.id" class="paging-item">
- <view v-if="item.messageType === MessageType.event" class="text-center" style="transform: scaleY(-1)">
- <MessageEvent :message="decryptMsg(item)"></MessageEvent>
- </view>
- <template v-else>
- <view v-if='item.fromId === currentUser!.id' class='cu-item self' style="transform: scaleY(-1)">
- <view class='main' style='display: block;'>
- <view class='text-gray text-sm padding-bottom-sm'>
- <view class='margin-right inline'>
- <Time :time='item.timestamp'></Time>
- </view>
- <text>{{ chatUsers.get(item!.fromId)?.name }}</text>
- </view>
- <view class='content shadow'>
- <message-view :item='decryptMsg(item)'></message-view>
- </view>
- </view>
- <view>
- <image class='cu-avatar radius' :src='chatUsers.get(item.fromId)?.avatar'></image>
- </view>
- </view>
- <view v-if='item.fromId !== currentUser!.id' class='cu-item' :id="'m-'+index" style="transform: scaleY(-1)">
- <view class='flex flex-direction'>
- <image class='cu-avatar radius' :src='chatUsers.get(item.fromId)?.avatar'></image>
- </view>
- <view class='main' style='display: block;'>
- <view class='text-gray text-sm padding-bottom-sm'>
- <text>{{ chatUsers.get(item!.fromId)?.name }}</text>
- <view class='margin-left inline'>
- <Time :time='item.timestamp'></Time>
- </view>
- </view>
- <view class='content shadow'>
- <message-view :item='decryptMsg(item)'></message-view>
- </view>
- </view>
- </view>
- </template>
- </view>
- </z-paging>
- </view>
- </template>
- <script setup lang="ts">
- import {ref} from "vue";
- import {onLoad, onPageScroll} from '@dcloudio/uni-app';
- import {useUserStore} from "@/store/userStore";
- import MessageApi from "@/api/MessageApi";
- import MessageView from '@/components/MessageView.vue';
- import Time from '@/components/Time.vue';
- import type ChatSimple from "@/mode/ChatSimple";
- import CuCustom from '@/colorui/components/cu-custom.vue';
- import ChatType from "@/utils/ChatType";
- import GroupApi from "@/api/GroupApi";
- import UserApi from "@/api/UserApi";
- import type User from "@/mode/User";
- import MessageType from "@/utils/MessageType";
- import MessageEvent from "@/components/messages/MessageEvent.vue";
- import ZPaging from "@/uni_modules/z-paging/components/z-paging/z-paging.vue";
- import type Message from '@/mode/Message';
- import {decryptLong2 } from '@/store/cryptoAES';
- import Auth from "@/api/Auth";
- import dbApi from '@/api/DBactApi';
- const fontValue=ref(Auth.getfontSize());
- //聊天对象,
- const userStore = useUserStore();
- const messageList = ref([]);
- const chatId = ref('');
- const keyword = ref('');
- const messageType = ref('');
- const chatName = ref('');
- const type = ref('');
- const tabCur = ref(0);
- const scrollLeft = ref(0);
- const paging = ref();
- const chatUsers = ref<Map<string, ChatSimple>>(new Map());
- const currentUser = userStore.getUser();
- const dateRange = ref([])
- const options = [
- {value: '', label: '全部'},
- {value: '0', label: '文本'},
- {value: '1', label: '图片'},
- {value: '2', label: '文件'},
- {value: '3', label: '语音'},
- {value: '5', label: '视频'}
- ]
- const tabSelect = (e: TouchEvent, item: any) => {
- tabCur.value = e.currentTarget!.dataset.id;
- messageType.value = item.value;
- uni.redirectTo({
- url: '/pages/chat/history?chatId=' + chatId.value + '&type=' + type.value + '&messageType=' + messageType.value + '&tabCur=' + tabCur.value
- })
- }
- let dataList=[];
- //获取聊天室id
- onLoad((opt) => {
- chatId.value = opt?.chatId;
- type.value = opt?.type;
- if(opt?.tabCur){
- tabCur.value = Number(opt?.tabCur)
- }
- if(opt?.messageType){
- messageType.value = opt?.messageType
- }
- dataList=[];
- loadUsers()
- })
- onPageScroll((e) => {
- if (e.scrollTop < 1) {
- paging.value.doChatRecordLoadMore();
- }
- })
- const loadUsers = () => {
- if (currentUser) {
- chatUsers.value.set(currentUser.id, {avatar: currentUser.avatar, name: currentUser.name});
- if (type.value === ChatType.FRIEND) {
- UserApi.getUser(chatId.value)
- .then((res) => {
- const chatUser = res.data;
- chatName.value = chatUser.name
- chatUsers.value.set(chatUser.id, {avatar: chatUser.avatar, name: chatUser.name});
- })
- } else {
- GroupApi.users(chatId.value)
- .then((res) => {
- res.data.forEach((item: User) => {
- chatUsers.value.set(item.id, {avatar: item.avatar, name: item.name});
- })
- return GroupApi.get(chatId.value)
- })
- .then((res) => {
- chatName.value = res.data.name
- })
- }
- }
- }
- /**
- * 加载数据
- * @param pageNum
- * @param pageSize
- */
- const queryList = (pageNum: number, pageSize: number) => {
- if (currentUser) {
- console.log('queryList',messageType.value,pageNum,pageSize);
- getHistoryMsg(pageNum,pageSize,messageType.value);
- return;
- // uni.showLoading();
- // console.log('pageSize',pageSize);
- // MessageApi.search(
- // chatId.value,
- // currentUser!.id,
- // keyword.value,
- // type.value,
- // messageType.value,
- // pageNum,
- // dateRange.value ? dateRange.value[0] : '',
- // dateRange.value ? dateRange.value[1] : '',
- // pageSize
- // ).then(
- // (res: any) => {
- // //数据反转
- // const dataList: [] = res.data.records;
- // console.log(dataList);
- // paging.value.complete(dataList)
- // }
- // )
- // .catch(() => {
- // paging.value.complete(false);
- // })
- // .finally(() => {
- // uni.hideLoading()
- // })
- }
- }
- const getHistoryMsg=(pageNum: number, pageSize: number,messageType:string)=>{
- uni.showLoading();
- dbApi.selectLocalmsgType(chatId.value,messageType,pageNum).then((res:any)=>{
- if(res){
- console.log(res);
- dataList=[];
- for (var i=0;i<res.length;i++) {
- const msg = JSON.parse(res[i].Message);
- dataList.push(msg);
- }
- console.log(dataList);
- if(dataList.length==0){
- paging.value.complete(false);
- }
- else{
- paging.value.complete(dataList)
- }
- }
- });
- uni.hideLoading()
- }
- const decryptMsg=(msg:Message)=>{
- var content=decryptLong2(msg.content);
- if(content){
- msg.content=content;
- }
- return msg;
- }
- </script>
- <style scoped>
- .inline {
- display: inline-block;
- }
- .cu-chat {
- background-color: #eeeeee;
- }
- .cu-chat .cu-item{
- padding: 0 0.625rem;
- }
- .paging-item{
- padding: 0.5rem 0 ;
- }
- </style>
|