diff --git a/package.json b/package.json index c62a1dd..b62c0e7 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "serve": "vue-cli-service serve", - "build": "vue-cli-service build", + "build": "vue-cli-service build && sh ./build/deploy.sh", "lint": "vue-cli-service lint" }, "dependencies": { diff --git a/src/api/circle.js b/src/api/circle.js index 0708beb..2f322f1 100644 --- a/src/api/circle.js +++ b/src/api/circle.js @@ -35,3 +35,12 @@ export function sendMessage(data) { data, }); } + +// APP保存消息已读 +export function readMessage(data) { + return request({ + url: "/app/group/message/readMessage", + method: "post", + data, + }); +} diff --git a/src/views/Circle/hooks/storage.js b/src/views/Circle/hooks/storage.js new file mode 100644 index 0000000..a81159b --- /dev/null +++ b/src/views/Circle/hooks/storage.js @@ -0,0 +1,62 @@ +import { readMessage } from "@/api/circle"; + +// type 1 公共互动 2私聊 +function getStorageTeacherMsg({ + productId, + productType = 41, + type = 1, + userId, +}) { + const getMsgIds = localStorage.getItem( + `read-msg-${productType}-${productId}-${userId}-${type}` + ); + if (getMsgIds) { + return JSON.parse(getMsgIds); + } else { + return []; + } +} + +// 老师发的言,并且已经上报的缓存起来 +export function setStorageTeacherMsg({ + productId, + productType = 41, + userId, + type = 1, // type 1 公共互动 2私聊 + msg, // 单条消息 + msgArr, // 多条消息 +}) { + const storageMsgIds = getStorageTeacherMsg({ + productId, + productType, + type, + userId, + }); + + let messageIds = []; + // userType用户类型:1投顾;2用户;3助教;4运营人员 + if (msg) { + if (!storageMsgIds.includes(msg.id) && msg.userType !== 2) { + messageIds = [msg.id]; + } + } else if (msgArr && msgArr.length) { + msgArr.forEach((msg) => { + if (msg.userType !== 2 && !storageMsgIds.includes(msg.id)) { + messageIds.push(msg.id); + } + }); + } else { + return; + } + if (messageIds.length) { + setTimeout(async () => { + let ret = await readMessage({ messageIds }).catch(() => {}); + if (ret && ret.code === 0) { + localStorage.setItem( + `read-msg-${productType}-${productId}-${userId}-${type}`, + JSON.stringify(messageIds.concat(storageMsgIds)) + ); + } + }, Math.random() * 3); + } +} diff --git a/src/views/Circle/hooks/useChatData.js b/src/views/Circle/hooks/useChatData.js index 0018408..f4740bf 100644 --- a/src/views/Circle/hooks/useChatData.js +++ b/src/views/Circle/hooks/useChatData.js @@ -4,6 +4,8 @@ import BScroll from "@better-scroll/core"; import PullDown from "@better-scroll/pull-down"; import MouseWheel from "@better-scroll/mouse-wheel"; import useDisableScroll from "@/hooks/useDisableScroll"; +import { setStorageTeacherMsg } from "./storage"; +import store from "@/store/index"; BScroll.use(PullDown); BScroll.use(MouseWheel); @@ -27,7 +29,7 @@ export default function useChatData({ id, className, type }) { groupId: id, lastId: msgList.value[0]?.id, size: 10, - type, + type, // 查询类型:1全部;2投顾;3用户;4精选;5私聊 }); if (ret.code === 0) { let list = ret.data.list.reverse() || []; @@ -40,6 +42,12 @@ export default function useChatData({ id, className, type }) { if (!hasNext.value) { bs.value && bs.value.closePullDown(); } + setStorageTeacherMsg({ + productId: id, + userId: store.state.userInfo.account, + msgArr: list, + type: type === 5 ? 2 : 1, + }); } isPullingDown.value = false; finishPullDown(preHisHeight); @@ -67,6 +75,12 @@ export default function useChatData({ id, className, type }) { bs.value && bs.value.scrollTo(0, bs.value.maxScrollY, 0); } }); + setStorageTeacherMsg({ + productId: id, + userId: store.state.userInfo.account, + msg, + type: type === 5 ? 2 : 1, + }); }; // 刷新消息 diff --git a/src/views/Circle/hooks/useWebSocket.js b/src/views/Circle/hooks/useWebSocket.js index 6c5bf6f..5470926 100644 --- a/src/views/Circle/hooks/useWebSocket.js +++ b/src/views/Circle/hooks/useWebSocket.js @@ -70,10 +70,16 @@ export default function ({ id, privateMessage, chatMessage }) { emitter.emit("cancelGetNewMsg"); // 接收群聊接收消息路径 chatMessage && - (await stompClient.value.subscribe(`/app/group/topic/${id}`, chatMessage)); + (await stompClient.value.subscribe( + `/app/group/topic/${id}`, + chatMessage + )); // APP端私聊消息 privateMessage && - (await stompClient.value.subscribe(`/app/private/topic/${id}/${store.state.userInfo.account}`, privateMessage)); + (await stompClient.value.subscribe( + `/app/private/topic/${id}/${store.state.userInfo.account}`, + privateMessage + )); }; stompClient.value.onStompError = (error) => { console.log(error.body); @@ -115,7 +121,7 @@ export default function ({ id, privateMessage, chatMessage }) { stompClient.value.activate(); }; - connect() + connect(); window.addEventListener("unload", function (event) { stompClient.value && stompClient.value.deactivate(); diff --git a/src/views/VideoPlay/hComponents/TgInteract.vue b/src/views/VideoPlay/hComponents/TgInteract.vue index 7236b36..6afdf8b 100644 --- a/src/views/VideoPlay/hComponents/TgInteract.vue +++ b/src/views/VideoPlay/hComponents/TgInteract.vue @@ -141,7 +141,8 @@ import { useRoute } from "vue-router"; import { showToast } from "vant"; import Share from "@/components/Share"; -import { likeVideo, queryLiveCoupon } from "@/api/video"; +// import { likeVideo, queryLiveCoupon } from "@/api/video"; +import { likeVideo } from "@/api/video"; import emitter from "@/utils/emitter"; import useGetLiveStatusObj from "@/hooks/useGetLiveStatusObj"; import QuestionnairePopup from "../components/QuestionnairePopup.vue"; @@ -392,19 +393,19 @@ const showDiscountCoupon = () => { emitter.emit("showDiscountCoupon", couponDetail.value); }; -const getLiveCoupon = async () => { - let ret = await queryLiveCoupon({ - liveId: props.detail.id, - }); - if (ret.code === 0 && ret.data && ret.data.length) { - couponDetail.value = ret.data[0]; - couponDetail.value.couponType = Number(couponDetail.value.couponType); - couponDetail.value.sendCouponId = couponDetail.value.id; - } -}; +// const getLiveCoupon = async () => { +// let ret = await queryLiveCoupon({ +// liveId: props.detail.id, +// }); +// if (ret.code === 0 && ret.data && ret.data.length) { +// couponDetail.value = ret.data[0]; +// couponDetail.value.couponType = Number(couponDetail.value.couponType); +// couponDetail.value.sendCouponId = couponDetail.value.id; +// } +// }; // 获取优惠券 -getLiveCoupon(); +// getLiveCoupon(); let tipLook = false; const userInTip = (name) => {