zbH5/src/store/index.js
2025-02-15 17:49:35 +08:00

372 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { createStore } from "vuex";
import router from "@/router/index";
import dayjs from "dayjs";
import { terminalType } from "@/utils/index";
console.log("process.env.NODE_ENV", process.env.NODE_ENV);
export default createStore({
state: {
// token:
// process.env.NODE_ENV !== "development"
// ? terminalType === "Browser" && localStorage.getItem("token")
// : "",
token: terminalType === "Browser" && localStorage.getItem("token"),
// userInfo:
// process.env.NODE_ENV !== "development"
// ? terminalType === "Browser" && localStorage.getItem("userInfo")
// ? JSON.parse(localStorage.getItem("userInfo"))
// : {}
// : {
// account: "csht003",
// userName: "csht003",
// imgUrl:
// "https://thirdwx.qlogo.cn/mmopen/vi_32/t5O6btVlibCehoxtZWXc4AYefp92pxGWorCNskBo6hLsj3MJclkPpyoI0d5OW5QDsqfanS5IdicfPfEvYvQ6S7uQ/132",
// },
userInfo:
terminalType === "Browser" && localStorage.getItem("userInfo")
? JSON.parse(localStorage.getItem("userInfo"))
: {},
authorityList:
process.env.NODE_ENV !== "development"
? terminalType === "Browser" && localStorage.getItem("authorityList")
? JSON.parse(localStorage.getItem("authorityList"))
: []
: // : [{ starttime: 0, endtime: Number.MAX_SAFE_INTEGER, mid: 2 }] // mockData
[1212],
// endtime 权限结束时间 integer(int64) mid 权限id string starttime 权限开始时间 integer(int64)
interactMsgObj: {
retainMsgNum: 100, // 保留消息条数
// 直播间互动消息
msgListIds: [], // 所有互动消息的id集合
msgListIdObj: {}, // 所有互动消息key为互动消息idvalue为消息对象
replyBasicInformMsgObj: {}, // 所有回复消息的集合
isScrollToBottom: true, // 用户互动区滚动条是否滚动到底部
temUserInteractMsgList: [], // 用户互动区滚动条没有滚动到底部,将其他用户新发的互动消息暂时存起来
temUserInteractShowNum: 0, // 用户互动区需要展示还未展示的消息数
userInteractMsgList: [], // 用户互动消息
isTgScrollToBottom: true, // 讲师互动区滚动条是否滚动到底部
temTgInteractMsgList: [], // 讲师区滚动条没有滚动到底部,将其他用户新发的互动消息暂时存起来
temTgInteractShowNum: 0, // 讲师需要展示还未展示的消息数
tgInteractMsgList: [], // 讲师互动消息
newTreeMsg: [], // 最新的三条互动消息
msgTimeList: [], // 互动区时间汇总
tgMsgTimeList: [], // 投顾互动区时间汇总
msgTimeObj: {}, // 用户互动区区消息以发言时间为keyvalue为消息对象
tgMsgTimeObj: {}, // 讲师互动区消息以发言时间为keyvalue为消息对象
hasHisMsg: true, // 用户是否有历史消息
tgHasHisMsg: true, // 讲师互动区否有历史消息
},
forbidLogin: false, // 是否禁止用户登录
},
getters: {
authorityIdList: (state) => {
const now = Date.now();
return state.authorityList
.filter((item) => {
return item.starttime < now && item.endtime > now;
})
.map((item) => item.mid);
},
},
mutations: {
setIsScrollToBottom(state, payload) {
let key = payload.isTg ? "isTgScrollToBottom" : "isScrollToBottom";
state.interactMsgObj[key] = payload.data;
},
setReplyMsgObj(state, payload) {
state.interactMsgObj.replyBasicInformMsgObj[payload.id] = payload;
},
setInteractMsg(state, payload) {
let isST = state.interactMsgObj.isScrollToBottom; // 讲师互动区是否滚动到底部了
let isTgST = state.interactMsgObj.isTgScrollToBottom; // 用户互动区是否滚动到底部了
let msgArr = Array.isArray(payload.data) ? payload.data : [payload.data];
let tgMsgArr = [];
msgArr.forEach((item) => {
let chatTime = dayjs(item.createTime).format("MM-DD HH:mm");
item.show =
(!item.replyBasic && item.isOpen !== 2) ||
state.userInfo.userId === item.phone ||
(item.replyBasic &&
(item.replyBasic.isOpen === 1 ||
state.userInfo.userId === item.replyBasic.userId));
if (payload.type === 1) {
// 新消息
// 公开的或者是本人发的文本消息
if (
((item.userId && item.isOpen === 1) ||
item.phone === state.userInfo.userId) &&
item.type === 1
) {
state.interactMsgObj.newTreeMsg.push(item);
}
// 用户互动区最新消息数量提醒
if (item.show && !isST) state.interactMsgObj.temUserInteractShowNum++;
// 讲师互动区新消息数量提醒
if (item.show && !isTgST) state.interactMsgObj.temTgInteractShowNum++;
// 将全部评论按1s为维度进行汇总
if (
!state.interactMsgObj.msgTimeList.includes(chatTime) &&
item.show
) {
state.interactMsgObj.msgTimeList.push(chatTime);
item.chatTime = chatTime;
state.interactMsgObj.msgTimeObj[chatTime] = item;
} else {
delete item.chatTime;
}
// 将讲师评论按1s为维度进行汇总
if (
!state.interactMsgObj.tgMsgTimeList.includes(chatTime) &&
item.show
) {
state.interactMsgObj.tgMsgTimeList.push(chatTime);
item.tgChatTime = chatTime;
state.interactMsgObj.tgMsgTimeObj[chatTime] = item;
} else {
delete item.tgChatTime;
}
} else {
// 历史
if (payload.isTg) {
// 将讲师评论按1s为维度进行汇总
if (
!state.interactMsgObj.tgMsgTimeList.includes(chatTime) &&
item.show
) {
state.interactMsgObj.tgMsgTimeList.push(chatTime);
item.tgChatTime = chatTime;
state.interactMsgObj.tgMsgTimeObj[chatTime] = item;
} else if (
state.interactMsgObj.tgMsgTimeList.includes(chatTime) &&
item.show
) {
item.tgChatTime = chatTime;
delete state.interactMsgObj.tgMsgTimeObj[chatTime].tgChatTime;
state.interactMsgObj.tgMsgTimeObj[chatTime] = item;
}
} else {
// 将全部评论按1s为维度进行汇总
if (
!state.interactMsgObj.msgTimeList.includes(chatTime) &&
item.show
) {
state.interactMsgObj.msgTimeList.push(chatTime);
item.chatTime = chatTime;
state.interactMsgObj.msgTimeObj[chatTime] = item;
} else if (
state.interactMsgObj.msgTimeList.includes(chatTime) &&
item.show
) {
item.chatTime = chatTime;
delete state.interactMsgObj.msgTimeObj[chatTime].chatTime;
state.interactMsgObj.msgTimeObj[chatTime] = item;
}
}
}
state.interactMsgObj.msgListIds.push(item.id);
state.interactMsgObj.msgListIdObj[item.id] = item;
// 筛选出讲师的发言
if (item.advisorId) {
tgMsgArr.push(item);
}
});
if (payload.type === 1) {
// 新消息
if (isST) {
// 用户互动区新消息处理
state.interactMsgObj.userInteractMsgList =
state.interactMsgObj.userInteractMsgList.concat(msgArr);
if (
state.interactMsgObj.userInteractMsgList.length >
state.interactMsgObj.retainMsgNum
) {
state.interactMsgObj.userInteractMsgList =
state.interactMsgObj.userInteractMsgList.slice(
state.interactMsgObj.userInteractMsgList.length -
state.interactMsgObj.retainMsgNum
);
state.interactMsgObj.msgListIds =
state.interactMsgObj.msgListIds.slice(
state.interactMsgObj.msgListIds.length -
state.interactMsgObj.retainMsgNum
);
state.interactMsgObj.hasHisMsg = true;
state.interactMsgObj.msgTimeList = [];
state.interactMsgObj.msgTimeObj = {};
state.interactMsgObj.userInteractMsgList.forEach((item) => {
// 互动消息按秒重新归类
const chatTime = dayjs(item.createTime).format("MM-DD HH:mm");
if (
!state.interactMsgObj.msgTimeList.includes(chatTime) &&
item.show
) {
state.interactMsgObj.msgTimeList.push(chatTime);
item.chatTime = chatTime;
state.interactMsgObj.msgTimeObj[chatTime] = item;
} else {
delete item.chatTime;
}
});
}
} else {
state.interactMsgObj.temUserInteractMsgList =
state.interactMsgObj.temUserInteractMsgList.concat(msgArr);
}
if (isTgST) {
// 讲师互动区新消息处理
state.interactMsgObj.tgInteractMsgList =
state.interactMsgObj.tgInteractMsgList.concat(tgMsgArr);
if (
state.interactMsgObj.tgInteractMsgList.length >
state.interactMsgObj.retainMsgNum
) {
state.interactMsgObj.tgInteractMsgList =
state.interactMsgObj.tgInteractMsgList.slice(
state.interactMsgObj.tgInteractMsgList.length -
state.interactMsgObj.retainMsgNum
);
state.interactMsgObj.tgHasHisMsg = true;
state.interactMsgObj.tgMsgTimeList = [];
state.interactMsgObj.tgMsgTimeObj = {};
state.interactMsgObj.tgInteractMsgList.forEach((item) => {
// 互动消息按秒重新归类
const chatTime = dayjs(item.createTime).format("MM-DD HH:mm");
if (
!state.interactMsgObj.tgMsgTimeList.includes(chatTime) &&
item.show
) {
state.interactMsgObj.tgMsgTimeList.push(chatTime);
item.tgChatTime = chatTime;
state.interactMsgObj.tgMsgTimeObj[chatTime] = item;
} else {
delete item.tgChatTime;
}
});
}
} else {
state.interactMsgObj.temTgInteractMsgList =
state.interactMsgObj.temTgInteractMsgList.concat(tgMsgArr);
}
} else {
// 历史消息
if (payload.isTg) {
state.interactMsgObj.tgHasHisMsg = payload.hasNext;
state.interactMsgObj.tgInteractMsgList = tgMsgArr
.reverse()
.concat(state.interactMsgObj.tgInteractMsgList);
} else {
state.interactMsgObj.hasHisMsg = payload.hasNext;
state.interactMsgObj.userInteractMsgList = msgArr
.reverse()
.concat(state.interactMsgObj.userInteractMsgList);
}
}
},
interactMsgMerge(state, payload) {
let key1, key2, key3, numKey, timeKey, childTimeKey, msgTimeObjKey;
if (payload.isTg) {
key1 = "tgInteractMsgList";
key2 = "temTgInteractMsgList";
key3 = "tgHasHisMsg";
numKey = "temTgInteractShowNum";
timeKey = "tgMsgTimeList";
childTimeKey = "tgChatTime";
msgTimeObjKey = "tgMsgTimeObj";
} else {
key1 = "userInteractMsgList";
key2 = "temUserInteractMsgList";
key3 = "hasHisMsg";
numKey = "temUserInteractShowNum";
timeKey = "msgTimeList";
childTimeKey = "chatTime";
msgTimeObjKey = "msgTimeObj";
}
state.interactMsgObj[key1] = state.interactMsgObj[key1].concat(
state.interactMsgObj[key2]
);
if (
state.interactMsgObj[key1].length > state.interactMsgObj.retainMsgNum
) {
state.interactMsgObj[key1] = state.interactMsgObj[key1].slice(
state.interactMsgObj[key1].length - state.interactMsgObj.retainMsgNum
);
state.interactMsgObj.msgListIds = state.interactMsgObj.msgListIds.slice(
state.interactMsgObj.msgListIds.length -
state.interactMsgObj.retainMsgNum
);
state.interactMsgObj[key3] = true;
state.interactMsgObj[timeKey] = [];
state.interactMsgObj[msgTimeObjKey] = {};
state.interactMsgObj[key1].forEach((item) => {
let chatTime = dayjs(item.createTime).format("MM-DD HH:mm");
if (!state.interactMsgObj[timeKey].includes(chatTime) && item.show) {
state.interactMsgObj[timeKey].push(chatTime);
item[childTimeKey] = chatTime;
state.interactMsgObj[msgTimeObjKey][chatTime] = item;
} else {
delete item[childTimeKey];
}
});
}
state.interactMsgObj[key2] = [];
state.interactMsgObj[numKey] = 0;
},
resetInteractMsgObj(state) {
state.interactMsgObj = {
retainMsgNum: 100, // 保留消息条数
// 直播间互动消息
msgListIds: [], // 所有互动消息的id集合
msgListIdObj: {}, // 所有互动消息key为互动消息idvalue为消息对象
replyBasicInformMsgObj: {}, // 所有回复消息的集合
isScrollToBottom: true, // 用户互动区滚动条是否滚动到底部
temUserInteractMsgList: [], // 用户互动区滚动条没有滚动到底部,将其他用户新发的互动消息暂时存起来
temUserInteractShowNum: 0, // 用户互动区需要展示还未展示的消息数
userInteractMsgList: [], // 用户互动消息
isTgScrollToBottom: true, // 讲师互动区滚动条是否滚动到底部
temTgInteractMsgList: [], // 讲师区滚动条没有滚动到底部,将其他用户新发的互动消息暂时存起来
temTgInteractShowNum: 0, // 讲师需要展示还未展示的消息数
tgInteractMsgList: [], // 讲师互动消息
newTreeMsg: [], // 最新的三条互动消息
msgTimeList: [], // 互动区时间汇总
tgMsgTimeList: [], // 投顾互动区时间汇总
msgTimeObj: {}, // 用户互动区区消息以发言时间为keyvalue为消息对象
tgMsgTimeObj: {}, // 讲师互动区消息以发言时间为keyvalue为消息对象
hasHisMsg: true, // 用户是否有历史消息
tgHasHisMsg: true, // 讲师互动区否有历史消息
};
},
setToken(state, payload) {
localStorage.setItem("token", payload);
state.token = payload;
},
setUserInfo(state, payload) {
localStorage.setItem("userInfo", JSON.stringify(payload));
state.userInfo = payload;
},
setAuthorityList(state, payload) {
localStorage.setItem("authorityList", JSON.stringify(payload));
state.authorityList = payload;
},
outLogin(state) {
state.token = "";
state.userInfo = {};
localStorage.clear();
router.push("/");
},
setForbidLogin(state) {
state.forbidLogin = true;
},
},
actions: {},
modules: {},
});