直播场次
This commit is contained in:
@@ -1,121 +1,134 @@
|
||||
// pythonBridge.js
|
||||
import { ref, onMounted } from 'vue';
|
||||
|
||||
const bridge = ref(null);
|
||||
|
||||
// 统一安全调用,确保 Qt 响应有回调可执行
|
||||
const callBridge = (method, ...args) => {
|
||||
if (!bridge.value || typeof bridge.value[method] !== 'function') return;
|
||||
const last = args[args.length - 1];
|
||||
const hasCallback = typeof last === 'function';
|
||||
const callback = hasCallback ? args.pop() : () => { };
|
||||
bridge.value[method](...args, callback);
|
||||
};
|
||||
|
||||
// 防御:若 Qt 返回了未知 id,忽略以免 execCallbacks 报错
|
||||
const patchQWebChannel = () => {
|
||||
if (!window.QWebChannel || QWebChannel.__patchedIgnoreMissing) return;
|
||||
const originalHandleResponse = QWebChannel.prototype.handleResponse;
|
||||
QWebChannel.__patchedIgnoreMissing = true;
|
||||
QWebChannel.prototype.handleResponse = function (message) {
|
||||
const cb = this.execCallbacks && this.execCallbacks[message.id];
|
||||
if (message.id && typeof cb !== 'function') {
|
||||
console.warn('忽略未知的 WebChannel 响应', message);
|
||||
return;
|
||||
}
|
||||
return originalHandleResponse.call(this, message);
|
||||
};
|
||||
};
|
||||
|
||||
// 初始化 QWebChannel
|
||||
const initBridge = () => {
|
||||
if (/localhost/.test(window.location.href)) return
|
||||
if (/localhost/.test(window.location.href)) return;
|
||||
patchQWebChannel();
|
||||
new QWebChannel(qt.webChannelTransport, (channel) => {
|
||||
// 兜底:任何缺失的回调都返回空函数,避免 execCallbacks 报错
|
||||
channel.execCallbacks = new Proxy(channel.execCallbacks || {}, {
|
||||
get(target, prop) {
|
||||
const val = target[prop];
|
||||
if (typeof val === 'function') return val;
|
||||
// 返回空函数,确保 handleResponse 可调用
|
||||
return () => {};
|
||||
},
|
||||
set(target, prop, value) {
|
||||
target[prop] = value;
|
||||
return true;
|
||||
},
|
||||
});
|
||||
|
||||
bridge.value = channel.objects.bridge;
|
||||
});
|
||||
};
|
||||
|
||||
export function usePythonBridge() {
|
||||
|
||||
|
||||
|
||||
|
||||
// 调用 Python 方法
|
||||
const fetchDataConfig = (data) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (bridge.value) {
|
||||
bridge.value.fetchDataConfig(data, function (result) {
|
||||
resolve(result);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return new Promise((resolve) => {
|
||||
if (!bridge.value) return resolve(null);
|
||||
callBridge('fetchDataConfig', data, (result) => {
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 查询获取主播的数据
|
||||
const fetchDataCount = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (bridge.value) {
|
||||
bridge.value.fetchDataCount(function (result) {
|
||||
resolve(result);
|
||||
});
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
if (!bridge.value) return resolve(null);
|
||||
callBridge('fetchDataCount', (result) => {
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 打开tk后台
|
||||
// 打开 tk 后台
|
||||
const loginTikTok = () => {
|
||||
if (bridge.value) {
|
||||
bridge.value.loginTikTok(function (result) {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
callBridge('loginTikTok');
|
||||
};
|
||||
|
||||
// 登录tk后台
|
||||
// 登录 tk 后台
|
||||
const loginBackStage = (data) => {
|
||||
if (bridge.value) {
|
||||
if (data.index == 0) {
|
||||
bridge.value.loginBackStage(JSON.stringify(data));
|
||||
} else if (data.index == 1) {
|
||||
bridge.value.loginBackStageCopy(JSON.stringify(data));
|
||||
}
|
||||
|
||||
if (data.index == 0) {
|
||||
callBridge('loginBackStage', JSON.stringify(data));
|
||||
} else if (data.index == 1) {
|
||||
callBridge('loginBackStageCopy', JSON.stringify(data));
|
||||
}
|
||||
};
|
||||
|
||||
//跳转到主播页面
|
||||
// 跳转到主播页面
|
||||
const givePyAnchorId = (id) => {
|
||||
|
||||
if (bridge.value) {
|
||||
bridge.value.givePyAnchorId(id, function (result) {
|
||||
|
||||
});
|
||||
}
|
||||
callBridge('givePyAnchorId', id);
|
||||
};
|
||||
|
||||
//查询登录状态
|
||||
// 查询登录状态
|
||||
const backStageloginStatus = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (bridge.value) {
|
||||
bridge.value.backStageloginStatus(function (result) {
|
||||
resolve(result);
|
||||
});
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
if (!bridge.value) return resolve(null);
|
||||
callBridge('backStageloginStatus', (result) => {
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
|
||||
};
|
||||
//查询登录状态
|
||||
|
||||
// 查询登录状态(副账号)
|
||||
const backStageloginStatusCopy = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (bridge.value) {
|
||||
bridge.value.backStageloginStatusCopy(function (result) {
|
||||
resolve(result);
|
||||
});
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
if (!bridge.value) return resolve(null);
|
||||
callBridge('backStageloginStatusCopy', (result) => {
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
//导出表格
|
||||
// 导出表格
|
||||
const exportToExcel = (data) => {
|
||||
if (bridge.value) {
|
||||
bridge.value.exportToExcel(JSON.stringify(data));
|
||||
}
|
||||
|
||||
callBridge('exportToExcel', JSON.stringify(data));
|
||||
};
|
||||
|
||||
const stopScript = () => {
|
||||
if (bridge.value) {
|
||||
bridge.value.stopScript();
|
||||
}
|
||||
|
||||
callBridge('stopScript');
|
||||
};
|
||||
|
||||
//获取版本号
|
||||
// 获取版本号
|
||||
const getVersion = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (bridge.value) {
|
||||
bridge.value.currentVersion(function (result) {
|
||||
resolve(result);
|
||||
});
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
if (!bridge.value) return resolve(null);
|
||||
callBridge('currentVersion', (result) => {
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 在组件挂载时初始化桥接
|
||||
onMounted(initBridge);
|
||||
|
||||
@@ -129,6 +142,6 @@ export function usePythonBridge() {
|
||||
backStageloginStatusCopy,
|
||||
exportToExcel,
|
||||
stopScript,
|
||||
getVersion
|
||||
getVersion,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user