This commit is contained in:
pengxiaolong
2025-07-18 13:06:06 +08:00
parent 6dec463705
commit 31527ba8a6
1853 changed files with 65500 additions and 98288 deletions

21
components/ChatId.js Normal file
View File

@@ -0,0 +1,21 @@
export function generateId() {
// 1. 随机首字母(大写或小写)
const isUpperCase = Math.random() >= 0.5;
const randomLetter = String.fromCharCode(
Math.floor(Math.random() * 26) + (isUpperCase ? 65 : 97)
);
// 2. 生成随机字符部分(包含字母和数字)
const randomPart = Array.from({ length: 5 }, () => {
const type = Math.random();
if (type < 0.3) return String.fromCharCode(Math.floor(Math.random() * 26) + 97); // 小写字母
else if (type < 0.6) return String.fromCharCode(Math.floor(Math.random() * 26) + 65); // 大写字母
else return Math.floor(Math.random() * 10); // 数字
}).join('');
// 3. 时间戳处理(取后四位十六进制)
const timestamp = Date.now().toString(16).slice(-4);
// 4. 组合成最终 ID
return `${randomLetter}${randomPart}${timestamp}`;
}

View File

@@ -1,19 +0,0 @@
import { TUILogin } from "@tencentcloud/tui-core";
function TUIlogin(
chatInfo,
info,
userSig,
) {
uni.$SDKAppID = chatInfo; // Your SDKAppID
uni.$userID = String(info); // Your userID
uni.$userSig = userSig; // Your userSig
TUILogin.login({
SDKAppID: uni.$SDKAppID,
userID: uni.$userID,
userSig: uni.$userSig,
useUploadPlugin: true, // If you need to send rich media messages, please set to true.
framework: `vue3`, // framework used vue2 / vue3
}).catch(() => {});
}
export default TUIlogin;

View File

@@ -1,12 +1,12 @@
function TimeFormatting(timestamp) {
const date = new Date(timestamp * 1000); // 秒级转毫秒级
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hour = String(date.getHours()).padStart(2, '0');
const minute = String(date.getMinutes()).padStart(2, '0');
const second = String(date.getSeconds()).padStart(2, '0');
return `${month}-${day} ${hour}:${minute}`;
}
export default TimeFormatting;
const date = new Date(timestamp); // 直接使用毫秒级时间戳
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hour = String(date.getHours()).padStart(2, '0');
const minute = String(date.getMinutes()).padStart(2, '0');
const second = String(date.getSeconds()).padStart(2, '0');
return `${month}-${day} ${hour}:${minute}`;
}
export default TimeFormatting;

View File

@@ -1,64 +0,0 @@
import LibGenerateTestUserSig from './lib-generate-test-usersig-es.min.js';
/**
* 腾讯云 SDKAppId需要替换为您自己账号下的 SDKAppId。
*
* 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId
* 它是腾讯云用于区分客户的唯一标识。
*/
// const SDKAPPID = 0;
/**
* 签名过期时间,建议不要设置的过短
* <p>
* 时间单位:秒
* 默认时间7 x 24 x 60 x 60 = 604800 = 7 天
*/
/**
* 计算签名用的加密密钥,获取步骤如下:
*
* step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,
* step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。
* step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
*
* 注意该方案仅适用于调试Demo正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
* 文档https://cloud.tencent.com/document/product/647/17275#Server
*/
// const SECRETKEY = '';
/*
* Module: GenerateTestUserSig
*
* Function: 用于生成测试用的 UserSigUserSig 是腾讯云为其云服务设计的一种安全保护签名。
* 其计算方法是对 SDKAppID、UserID 和 EXPIRETIME 进行加密,加密算法为 HMAC-SHA256。
*
* Attention: 请不要将如下代码发布到您的线上正式版本的 App 中,原因如下:
*
* 本文件中的代码虽然能够正确计算出 UserSig但仅适合快速调通 SDK 的基本功能,不适合线上产品,
* 这是因为客户端代码中的 SECRETKEY 很容易被反编译逆向破解,尤其是 Web 端的代码被破解的难度几乎为零。
* 一旦您的密钥泄露,攻击者就可以计算出正确的 UserSig 来盗用您的腾讯云流量。
*
* 正确的做法是将 UserSig 的计算代码和加密密钥放在您的业务服务器上,然后由 App 按需向您的服务器获取实时算出的 UserSig。
* 由于破解服务器的成本要高于破解客户端 App所以服务器计算的方案能够更好地保护您的加密密钥。
*
* Referencehttps://cloud.tencent.com/document/product/647/17275#Server
*/
export default function genTestUserSig(config) {
const { SDKAPPID, SECRETKEY,userID } = config;
const EXPIRETIME = 604800;
const generator = new LibGenerateTestUserSig(SDKAPPID, SECRETKEY, EXPIRETIME);
const userSig = generator.genTestUserSig(userID);
return {
sdkAppID: SDKAPPID,
userSig,
};
}
// module.exports = {
// genTestUserSig,
// };

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,113 @@
import GoEasy from 'goeasy'
//IM登录
export function goEasylogin(goeasy,id,avatar,nickname) {
console.log("`````````````````goEasylogin`````````````````",id,avatar,nickname);
goeasy.connect({
id:id, //im必填最大长度60字符
data:{"avatar":avatar,"nickname":nickname}, //必须是一个对象im必填最大长度300字符显示在会话列表中
onSuccess: function () { //连接成功
console.log("IM连接成功") //连接成功
},
onFailed: function (error) { //连接失败
console.log("IM连接失败, code:"+error.code+ ",error:"+error.content);
},
onProgress:function(attempts) { //连接或自动重连中
console.log("IM连接或自动重连中", attempts);
}
});
}
//退出登录
export function goEasylogout(goeasy) {
goeasy.disconnect({
onSuccess: function(){
console.log("IM断开成功")
},
onFailed: function(error){
console.log("IM断开失败, code:"+error.code+ ",error:"+error.content);
}
});
}
//获取会话列表
export function getConversationList(goeasy) {
return new Promise((resolve, reject) => {
var im = goeasy.im;
im.latestConversations({
onSuccess: function (result) {
console.log("获取会话列表成功", result);
resolve(result.content);
},
onFailed: function (error) { //获取失败
console.log("获取会话列表失败, code:" + error.code + " content:" + error.content);
},
});
});
}
//获取指定会话的消息列表
export function getConversationMessages(goeasy,userid,imestamp) {
return new Promise((resolve, reject) => {
var im = goeasy.im;
im.history({
id: userid, //用户id或者群id
type: GoEasy.IM_SCENE.PRIVATE, //群聊GoEasy.IM_SCENE.GROUP, 客服GoEasy.IM_SCENE.CS,
lastTimestamp:imestamp, //上次查询结果里最后一条消息的时间戳首次查询传入null即可
limit: 30, //可选项返回的消息条数默认为10条最多30条
onSuccess: function (result) {
console.log("获取消息列表成功", result);
resolve(result.content);
}, //查询成功
onFailed: function (error) {
console.log("获取消息列表失败, code:" + error.code + " content:" + error.content);
}, //查询失败
});
});
}
//发送消息
export function sendMessage(goeasy,userid,message,avatar,nickname) {
return new Promise((resolve, reject) => {
var im = goeasy.im;
//创建消息, 内容最长不超过3K可以发送字符串对象和json格式字符串
let textMessage = im.createTextMessage({
text: message, //消息内容
to: {
type: GoEasy.IM_SCENE.PRIVATE, //私聊还是群聊群聊为GoEasy.IM_SCENE.GROUP
id: userid, //接收方用户id
data: {"avatar": avatar, "nickname":nickname} //接收方用户扩展数据, 任意格式的字符串或者对象用于更新会话列表conversation.data
}
});
//发送消息
im.sendMessage({
message: textMessage,
onSuccess: function () { //发送成功
resolve(textMessage);
},
onFailed: function (error) { //发送失败
console.log('发送消息失败code:' + error.code + ' ,error ' + error.content);
reject(error);
}
});
});
}
//消息已读
export function messageRead(goeasy,userid) {
return new Promise((resolve, reject) => {
var im = goeasy.im;
im.markMessageAsRead({
id: userid,
type: GoEasy.IM_SCENE.PRIVATE, //群聊GoEasy.IM_SCENE.GROUP, 客服消息GoEasy.IM_SCENE.CS,
onSuccess: function () {
resolve()
},
onFailed: function (error) {
console.log('标记私聊已读失败', error);
},
});
});
}

View File

@@ -2,8 +2,8 @@ import addPrefixToHeaderIcon from './addPrefixToHeaderIcon.js'
export default function request(urldata) {
const { url, data, method, header, userInfo } = urldata;
// const baseUrl = "http://49.235.115.212:8086/"+ url;
const baseUrl = "https://pk.zhukeping.com/"+ url;
// const baseUrl = "http://120.26.251.180:8086/"+ url;
// const baseUrl = "https://pk.zhukeping.com/"+ url;
const baseUrl = "http://120.26.251.180:8086/"+ url;
// const baseUrl = "http://192.168.1.218:8086/"+ url;
if (userInfo) {
return new Promise((resolve, reject) => {
@@ -18,8 +18,8 @@ export default function request(urldata) {
method: method,
header: header,
success: function (res) {
console.log("请求成功", res);
resolve(addPrefixToHeaderIcon(res.data));
// resolve(res.data);
},
fail: function (res) {
reject(res);
@@ -49,7 +49,7 @@ export default function request(urldata) {
method: method,
header: header,
success: function (res) {
// resolve(res.data);
console.log("请求成功", res);
resolve(addPrefixToHeaderIcon(res.data));
},
fail: function (res) {

View File

@@ -33,54 +33,26 @@
import NewAddedPk from "../../pages/NewAddedPk/NewAddedPk.vue";
import VerifyLogin from "../VerifyLogin.js";
import { getCurrentInstance, defineProps, onMounted,onUnmounted,reactive, ref } from "vue";
import { TUIStore,StoreName } from '@tencentcloud/chat-uikit-engine';
require.async('../../TUIKit/components/TUIConversation/entry.js');
let showMiddleButton = ref(false);
const conversationList = ref([]);
let Unread = ref(0);
// 监听会话列表变化
onMounted(() => {
TUIStore.watch(StoreName.CONV, {
conversationList: onConversationListUpdated,
});
});
//conversationList[0].unreadCount
// 组件销毁时取消监听
onUnmounted(() => {
TUIStore.unwatch(StoreName.CONV, {
conversationList: onConversationListUpdated,
});
});
// 监听会话列表变化
function onConversationListUpdated(list) {
conversationList.value = list;
Unread.value = calculateUnreadCount(list);
}
const emit = defineEmits(['publishSucces']);
function publishSuccesss() {
emit('publishSucces');
}
// 计算未读消息总数
function calculateUnreadCount(arr) {
let total = 0;
for (const item of arr) {
// 检查对象是否包含 unreadCount 属性
if (!item.hasOwnProperty('unreadCount')) {
return null;
}
const count = item.unreadCount;
// 检查值是否为有效数值类型
if (typeof count !== 'number' || !Number.isFinite(count)) {
return null;
}
total += count;
}
return total;
import GoEasy from 'goeasy'
import {
getConversationList,
} from "../../components/goEasyTool/tool.js";
const instance = getCurrentInstance();
const $goeasy = instance.appContext.config.globalProperties.$goeasy;
const Unread = ref(0);
var im = $goeasy.im;
function onConversationsUpdated(conversations) {
console.log("监听会话列表", conversations);
Unread.value = conversations.unreadTotal;
}
let showMiddleButton = ref(false);
const props = defineProps({
tabIndex: Number,
tabIndex: Number,//当前tab索引
});
let tabList = reactive([
{
@@ -108,6 +80,8 @@ let tabList = reactive([
iconPath: "https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Message.png",
selectedIconPath: "https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Messageclick.png",
text: "消息",
pagePath: "/pages/index/index",
middleClass: "",
},
{
iconPath: "https://vv-1317974657.cos.ap-shanghai.myqcloud.com/util/Mine.png",
@@ -119,7 +93,12 @@ let tabList = reactive([
]);
onMounted(() => {
setTabBar();
// getSystemInfo()
setTimeout(() => {
getConversationList($goeasy).then((conversations) => {
Unread.value = conversations.unreadTotal;
});
im.on(GoEasy.IM_EVENT.CONVERSATIONS_UPDATED,onConversationsUpdated);
}, 1000);
});
uni.getSystemInfo({
@@ -153,16 +132,7 @@ const disabledScroll = () => {
};
//tab点击事件
function handlePush(item, index) {
if (index === 3) {
VerifyLogin().then((res) => {
if (res) {
uni.redirectTo({
url: "/TUIKit/components/TUIConversation/index",
animationType: "none",
});
}
});
} else if (index === 2) {
if (index === 2) {
//打开弹窗
VerifyLogin().then((res) => {
if (res) {