yolo助手AI ui 1.5.0
BIN
src/assets/video/chatMes.png
Normal file
|
After Width: | Height: | Size: 932 B |
BIN
src/assets/video/leftBg.png
Normal file
|
After Width: | Height: | Size: 325 KiB |
BIN
src/assets/video/leftBtn1-1.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/video/leftBtn1.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/assets/video/leftBtn2-2.png
Normal file
|
After Width: | Height: | Size: 525 B |
BIN
src/assets/video/leftBtn2.png
Normal file
|
After Width: | Height: | Size: 680 B |
BIN
src/assets/video/leftBtn3-3.png
Normal file
|
After Width: | Height: | Size: 811 B |
BIN
src/assets/video/leftBtn3.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/video/leftBtn4-4.png
Normal file
|
After Width: | Height: | Size: 720 B |
BIN
src/assets/video/leftBtn4.png
Normal file
|
After Width: | Height: | Size: 902 B |
BIN
src/assets/video/leftBtn5-5.png
Normal file
|
After Width: | Height: | Size: 596 B |
BIN
src/assets/video/leftBtn5.png
Normal file
|
After Width: | Height: | Size: 754 B |
BIN
src/assets/video/leftBtn6-6.png
Normal file
|
After Width: | Height: | Size: 799 B |
BIN
src/assets/video/leftBtn6.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/video/leftBtn7-7.png
Normal file
|
After Width: | Height: | Size: 581 B |
BIN
src/assets/video/leftBtn7.png
Normal file
|
After Width: | Height: | Size: 728 B |
BIN
src/assets/video/leftBtn8-8.png
Normal file
|
After Width: | Height: | Size: 714 B |
BIN
src/assets/video/leftBtn8.png
Normal file
|
After Width: | Height: | Size: 900 B |
BIN
src/assets/video/leftBtn9-9.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/video/leftBtn9.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/video/mainBg.png
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
@@ -1,7 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="visible" class="dialog-overlay" @click.self="close">
|
<div v-if="visible" class="dialog-overlay" @click.self="close">
|
||||||
<div class="dialog-content">
|
<div class="dialog-content">
|
||||||
<h3 class="text-lg font-bold mb-4">最近一条的消息翻译</h3>
|
<h3 class="text-lg font-bold mb-4">
|
||||||
|
<img style="margin: 0px 15px;" src="@/assets/video/chatMes.png"></img>
|
||||||
|
最近一条的消息翻译
|
||||||
|
</h3>
|
||||||
<el-scrollbar class="chat-box">
|
<el-scrollbar class="chat-box">
|
||||||
<div v-for="(msg, index) in messages" :key="index"
|
<div v-for="(msg, index) in messages" :key="index"
|
||||||
:class="msg.position === 'left' ? 'left-message' : 'right-message'">
|
:class="msg.position === 'left' ? 'left-message' : 'right-message'">
|
||||||
@@ -126,4 +129,10 @@ function fallbackCopyTextToClipboard(index, text) {
|
|||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.center-justify {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-dialog draggable :title="title" v-model="visibleLocal" width="600px" @close="handleCancel">
|
|
||||||
|
|
||||||
<template #footer>
|
|
||||||
<el-button @click="handleCancel">取消</el-button>
|
|
||||||
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
|
||||||
</template>
|
|
||||||
</el-dialog>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { ref, computed, watch } from 'vue';
|
|
||||||
|
|
||||||
// 定义接收的 props
|
|
||||||
const props = defineProps({
|
|
||||||
/** 对话框可见性,外部通过 v-model:visible 绑定 */
|
|
||||||
visible: {
|
|
||||||
type: Boolean,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
/** 对话框标题 */
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
/** 文本框初始内容,可选 */
|
|
||||||
initialText: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
/** 文本框行数 */
|
|
||||||
type: {
|
|
||||||
type: Number,
|
|
||||||
default: 10,
|
|
||||||
},
|
|
||||||
/** index */
|
|
||||||
index: {
|
|
||||||
type: Number,
|
|
||||||
default: 999,
|
|
||||||
},
|
|
||||||
/** 文本框占位符 */
|
|
||||||
placeholder: {
|
|
||||||
type: String,
|
|
||||||
default: '每行一条,支持粘贴多行后自动拆分',
|
|
||||||
},
|
|
||||||
/** 是否去重,默认 true */
|
|
||||||
dedupe: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// 定义 emits
|
|
||||||
const emit = defineEmits(['update:visible', 'confirm', 'cancel']);
|
|
||||||
|
|
||||||
// 本地 rawText,用于绑定 textarea
|
|
||||||
const rawText = ref(props.initialText);
|
|
||||||
|
|
||||||
// 当 props.initialText 变化时,更新 rawText
|
|
||||||
watch(
|
|
||||||
() => props.initialText,
|
|
||||||
(newVal) => {
|
|
||||||
rawText.value = newVal;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// 计算属性,用于 v-model:visible 绑定 el-dialog
|
|
||||||
const visibleLocal = computed({
|
|
||||||
get() {
|
|
||||||
return props.visible;
|
|
||||||
},
|
|
||||||
set(val) {
|
|
||||||
emit('update:visible', val);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
/** 解析 rawText 为数组:按行拆分,trim,去空,去重(如 dedupe=true) */
|
|
||||||
function parseLines() {
|
|
||||||
const lines = rawText.value
|
|
||||||
.split(/\r?\n/)
|
|
||||||
.map((line) => line.trim())
|
|
||||||
.filter((line) => line.length > 0);
|
|
||||||
if (props.dedupe) {
|
|
||||||
return Array.from(new Set(lines));
|
|
||||||
}
|
|
||||||
return lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 点击确定按钮 */
|
|
||||||
function handleConfirm() {
|
|
||||||
const items = parseLines();
|
|
||||||
emit('confirm', items, props.title, props.index);
|
|
||||||
// 关闭对话框
|
|
||||||
emit('update:visible', false);
|
|
||||||
rawText.value = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 点击取消或对话框关闭 */
|
|
||||||
function handleCancel() {
|
|
||||||
emit('update:visible', false);
|
|
||||||
emit('cancel');
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
/* 可根据项目风格调整 */
|
|
||||||
</style>
|
|
||||||
@@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
<el-input type="textarea" v-model="rawText" :rows="10" :placeholder="placeholder" clearable></el-input>
|
<el-input type="textarea" v-model="rawText" :rows="10" :placeholder="placeholder" clearable></el-input>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
|
<span v-if="title == '私信'">自动回复
|
||||||
|
<el-switch style="margin-right: 20px;" v-model="value1" />
|
||||||
|
</span>
|
||||||
<el-button v-if="title !== '主播ID'" type="success" @click="exportPrologue(title)">导入{{ title }}</el-button>
|
<el-button v-if="title !== '主播ID'" type="success" @click="exportPrologue(title)">导入{{ title }}</el-button>
|
||||||
<el-button @click="handleCancel">取消</el-button>
|
<el-button @click="handleCancel">取消</el-button>
|
||||||
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
||||||
@@ -13,7 +16,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, watch } from 'vue';
|
import { ref, computed, watch } from 'vue';
|
||||||
import { prologue, comment } from '@/api/account';
|
import { prologue, comment } from '@/api/account';
|
||||||
|
let value1 = ref(false);
|
||||||
// 定义接收的 props
|
// 定义接收的 props
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
/** 对话框可见性,外部通过 v-model:visible 绑定 */
|
/** 对话框可见性,外部通过 v-model:visible 绑定 */
|
||||||
@@ -92,7 +95,7 @@ function parseLines() {
|
|||||||
/** 点击确定按钮 */
|
/** 点击确定按钮 */
|
||||||
function handleConfirm() {
|
function handleConfirm() {
|
||||||
const items = parseLines();
|
const items = parseLines();
|
||||||
emit('confirm', items, props.title, props.index);
|
emit('confirm', items, props.title, props.index, value1.value);
|
||||||
// 关闭对话框
|
// 关闭对话框
|
||||||
emit('update:visible', false);
|
emit('update:visible', false);
|
||||||
rawText.value = '';
|
rawText.value = '';
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-dialog draggable :title="title" v-model="visibleLocal" width="600px" @close="handleCancel">
|
|
||||||
<el-input type="textarea" v-model="rawText" :rows="10" :placeholder="placeholder" clearable></el-input>
|
|
||||||
<template #footer>
|
|
||||||
<el-button @click="handleCancel">取消</el-button>
|
|
||||||
<el-button type="primary" @click="handleConfirm">确定</el-button>
|
|
||||||
</template>
|
|
||||||
</el-dialog>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { ref, computed, watch } from 'vue';
|
|
||||||
|
|
||||||
// 定义接收的 props
|
|
||||||
const props = defineProps({
|
|
||||||
/** 对话框可见性,外部通过 v-model:visible 绑定 */
|
|
||||||
visible: {
|
|
||||||
type: Boolean,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
/** 对话框标题 */
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
/** 文本框初始内容,可选 */
|
|
||||||
initialText: {
|
|
||||||
type: String,
|
|
||||||
default: '',
|
|
||||||
},
|
|
||||||
/** 文本框行数 */
|
|
||||||
type: {
|
|
||||||
type: Number,
|
|
||||||
default: 10,
|
|
||||||
},
|
|
||||||
/** index */
|
|
||||||
index: {
|
|
||||||
type: Number,
|
|
||||||
default: 999,
|
|
||||||
},
|
|
||||||
/** 文本框占位符 */
|
|
||||||
placeholder: {
|
|
||||||
type: String,
|
|
||||||
default: '每行一条,支持粘贴多行后自动拆分',
|
|
||||||
},
|
|
||||||
/** 是否去重,默认 true */
|
|
||||||
dedupe: {
|
|
||||||
type: Boolean,
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// 定义 emits
|
|
||||||
const emit = defineEmits(['update:visible', 'confirm', 'cancel']);
|
|
||||||
|
|
||||||
// 本地 rawText,用于绑定 textarea
|
|
||||||
const rawText = ref(props.initialText);
|
|
||||||
|
|
||||||
// 当 props.initialText 变化时,更新 rawText
|
|
||||||
watch(
|
|
||||||
() => props.initialText,
|
|
||||||
(newVal) => {
|
|
||||||
rawText.value = newVal;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// 计算属性,用于 v-model:visible 绑定 el-dialog
|
|
||||||
const visibleLocal = computed({
|
|
||||||
get() {
|
|
||||||
return props.visible;
|
|
||||||
},
|
|
||||||
set(val) {
|
|
||||||
emit('update:visible', val);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
/** 解析 rawText 为数组:按行拆分,trim,去空,去重(如 dedupe=true) */
|
|
||||||
function parseLines() {
|
|
||||||
const lines = rawText.value
|
|
||||||
.split(/\r?\n/)
|
|
||||||
.map((line) => line.trim())
|
|
||||||
.filter((line) => line.length > 0);
|
|
||||||
if (props.dedupe) {
|
|
||||||
return Array.from(new Set(lines));
|
|
||||||
}
|
|
||||||
return lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 点击确定按钮 */
|
|
||||||
function handleConfirm() {
|
|
||||||
const items = parseLines();
|
|
||||||
emit('confirm', items, props.title, props.index);
|
|
||||||
// 关闭对话框
|
|
||||||
emit('update:visible', false);
|
|
||||||
rawText.value = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 点击取消或对话框关闭 */
|
|
||||||
function handleCancel() {
|
|
||||||
emit('update:visible', false);
|
|
||||||
emit('cancel');
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
/* 可根据项目风格调整 */
|
|
||||||
</style>
|
|
||||||
@@ -18,7 +18,7 @@ app.use(store); // 注册 store
|
|||||||
app.use(router);
|
app.use(router);
|
||||||
app.config.globalProperties.Buffer = Buffer; // 注册 Buffer
|
app.config.globalProperties.Buffer = Buffer; // 注册 Buffer
|
||||||
|
|
||||||
window.addEventListener('unhandledrejection', event => event.preventDefault());
|
// window.addEventListener('unhandledrejection', event => event.preventDefault());
|
||||||
window.addEventListener('error', event => event.preventDefault()); // 阻止错误和未处overlay理的 Promise 拒绝事件冒泡到 window 对象
|
// window.addEventListener('error', event => event.preventDefault()); // 阻止错误和未处overlay理的 Promise 拒绝事件冒泡到 window 对象
|
||||||
app.mount('#app');
|
app.mount('#app');
|
||||||
|
|
||||||
|
|||||||
@@ -8,26 +8,39 @@ body {
|
|||||||
width: 100vw;
|
width: 100vw;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
background: #222;
|
background: #222;
|
||||||
|
background-image: url('../../assets/video/mainBg.png');
|
||||||
|
background-size: 100% 100%;
|
||||||
|
/* 或其他适合的值,例如contain */
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
.left {
|
.left {
|
||||||
background: #191c23;
|
background-image: url('../../assets/video/leftBg.png');
|
||||||
|
background-size: 100% 100%;
|
||||||
|
/* 或其他适合的值,例如contain */
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
width: 20vw;
|
width: 20vw;
|
||||||
box-sizing: content-box;
|
box-sizing: border-box;
|
||||||
|
box-shadow: 0px 0px 10px #b3b3b3;
|
||||||
|
border-radius: 0px 40px 40px 0px;
|
||||||
|
|
||||||
|
padding: 53px 31px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
width: 50vw;
|
width: 60vw;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, minmax(160px, 320px));
|
grid-template-columns: repeat(3, minmax(160px, 320px));
|
||||||
|
padding: 0 5vw;
|
||||||
/* 每行 3 个,宽度自适应 */
|
/* 每行 3 个,宽度自适应 */
|
||||||
/* gap: 10px; */
|
/* gap: 10px; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.right {
|
.right {
|
||||||
width: 30vw;
|
width: 30vw;
|
||||||
background-color: #272727;
|
// background-color: #272727;
|
||||||
}
|
}
|
||||||
|
|
||||||
.video-container {
|
.video-container {
|
||||||
@@ -52,6 +65,10 @@ body {
|
|||||||
background-color: #424242;
|
background-color: #424242;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
|
padding: 15px;
|
||||||
|
background: linear-gradient(0deg, #EEFFFF 0%, #FFFFFF 100%);
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 4px 3px 14px 2px rgba(174, 174, 174, 0.5)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,13 +139,69 @@ video {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-button {
|
.app-button {
|
||||||
width: 200px;
|
|
||||||
margin: 20px;
|
|
||||||
// background-color: darkcyan;
|
// background-color: darkcyan;
|
||||||
// color: white;
|
// color: white;
|
||||||
|
width: 260px;
|
||||||
|
height: 50px;
|
||||||
|
background: linear-gradient(0deg, #4FCACD 0%, #5FDBDE 100%);
|
||||||
|
border-radius: 10px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: center;
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 999;
|
z-index: 999;
|
||||||
|
|
||||||
|
|
||||||
|
font-family: Source Han Sans SC;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 16px;
|
||||||
|
|
||||||
|
margin: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 鼠标按下时效果 */
|
||||||
|
.app-button:active {
|
||||||
|
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||||
|
transform: translateY(1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-button {
|
||||||
|
position: relative;
|
||||||
|
z-index: 999;
|
||||||
|
margin-bottom: 19px;
|
||||||
|
width: 100%;
|
||||||
|
height: 72px;
|
||||||
|
// background: #32C9CD;
|
||||||
|
border-radius: 10px;
|
||||||
|
|
||||||
|
font-family: Source Han Sans SC;
|
||||||
|
font-weight: 800;
|
||||||
|
font-size: 20px;
|
||||||
|
color: #7A8B97;
|
||||||
|
line-height: 16px;
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 30px;
|
||||||
|
margin: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-button:hover {
|
||||||
|
background: #32C9CD;
|
||||||
|
color: #F9FAFE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 鼠标按下时效果 */
|
||||||
|
.left-button:active {
|
||||||
|
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||||
|
transform: translateY(1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.center-justify {
|
.center-justify {
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ export function setphoneXYinfo(data) {
|
|||||||
export function getphoneXYinfo() {
|
export function getphoneXYinfo() {
|
||||||
return JSON.parse(localStorage.getItem('XYinfo'));
|
return JSON.parse(localStorage.getItem('XYinfo'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 用于获取主播信息
|
// 用于获取主播信息
|
||||||
export function getHostList() {
|
export function getHostList() {
|
||||||
return JSON.parse(localStorage.getItem('hostList'));
|
return JSON.parse(localStorage.getItem('hostList'));
|
||||||
@@ -51,6 +53,23 @@ export function getHostList() {
|
|||||||
export function setHostList(data) {
|
export function setHostList(data) {
|
||||||
localStorage.setItem('hostList', JSON.stringify(data));
|
localStorage.setItem('hostList', JSON.stringify(data));
|
||||||
}
|
}
|
||||||
|
export function clearHostList() {
|
||||||
|
// 清空存储的数组
|
||||||
|
localStorage.setItem('hostList', JSON.stringify([]));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addToHostList(newItem) {
|
||||||
|
// 获取当前的数组
|
||||||
|
const currentList = JSON.parse(localStorage.getItem('hostList') || '[]');
|
||||||
|
|
||||||
|
// 向数组添加新元素
|
||||||
|
currentList.push(newItem);
|
||||||
|
|
||||||
|
// 更新存储的数组
|
||||||
|
localStorage.setItem('hostList', JSON.stringify(currentList));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 用于获取私信信息
|
// 用于获取私信信息
|
||||||
export function getContentpriList() {
|
export function getContentpriList() {
|
||||||
@@ -72,12 +91,11 @@ export function setContentList(data) {
|
|||||||
localStorage.setItem('Content', JSON.stringify(data));
|
localStorage.setItem('Content', JSON.stringify(data));
|
||||||
}
|
}
|
||||||
// 用于绘画信息
|
// 用于绘画信息
|
||||||
// export function setContentList(data) {
|
export function setsessionId(data) {
|
||||||
// sessionStorage.setItem('Content', JSON.stringify(data));
|
sessionStorage.setItem('sessionList', JSON.stringify(data));
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // 用于获取评论信息
|
// 用于获取评论信息
|
||||||
// export function getContentList() {
|
export function getsessionId() {
|
||||||
// const arr = JSON.parse(sessionStorage.getItem('Content'))
|
return JSON.parse(sessionStorage.getItem('sessionList'));
|
||||||
// return [arr, arr, arr, arr, arr, arr, arr, arr];
|
}
|
||||||
// }
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* https://rudon.blog.csdn.net/
|
* https://rudon.blog.csdn.net/
|
||||||
*/
|
*/
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { getToken, getUser } from '@/utils/storage'
|
import { getToken, getUser } from '@/stores/storage'
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
|
|
||||||
import { ElMessage } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
||||||
|
|||||||
@@ -1,12 +1,23 @@
|
|||||||
// src/utils/wsActions.js
|
// src/utils/wsActions.js
|
||||||
|
import { toBuffer } from '@/utils/bufferUtils';
|
||||||
|
|
||||||
|
const mouseData = {
|
||||||
|
type: 2,
|
||||||
|
action: 0,
|
||||||
|
pointerId: 0,
|
||||||
|
position: {
|
||||||
|
point: { x: 0, y: 0 },
|
||||||
|
screenSize: { width: 320, height: 720 },
|
||||||
|
},
|
||||||
|
pressure: 1,
|
||||||
|
buttons: 1,
|
||||||
|
};
|
||||||
// 传入 wslist、isStopLike 等需要依赖的外部变量
|
// 传入 wslist、isStopLike 等需要依赖的外部变量
|
||||||
export function createWsActions(wslist) {
|
export function createWsActions(wslist) {
|
||||||
// 通用 ws 发送方法
|
// 通用 ws 发送方法
|
||||||
function send(index, payload) {
|
function send(index, payload) {
|
||||||
if (wslist[index]) {
|
if (wslist[index]) {
|
||||||
|
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
mouseData.action = 1;
|
mouseData.action = 1;
|
||||||
wslist[index].send(toBuffer(mouseData));
|
wslist[index].send(toBuffer(mouseData));
|
||||||
@@ -39,7 +50,7 @@ export function createWsActions(wslist) {
|
|||||||
getmesNum: (udid, index) => send(index, { udid, action: 'dump', type: 'getmesNum', index, resourceId: 'com.zhiliaoapp.musically:id/jyv' }), //获取收件箱消息数量
|
getmesNum: (udid, index) => send(index, { udid, action: 'dump', type: 'getmesNum', index, resourceId: 'com.zhiliaoapp.musically:id/jyv' }), //获取收件箱消息数量
|
||||||
clickMesage: (udid, index) => send(index, { udid, action: 'click', type: 'clickMesage', index, resourceId: 'com.zhiliaoapp.musically:id/e3_' }), //点击有消息的私信
|
clickMesage: (udid, index) => send(index, { udid, action: 'click', type: 'clickMesage', index, resourceId: 'com.zhiliaoapp.musically:id/e3_' }), //点击有消息的私信
|
||||||
clickSysMesage: (udid, index) => send(index, { udid, action: 'click', type: 'clickSysMesage', index, resourceId: 'com.zhiliaoapp.musically:id/j7s' }), //点击有消息的系统通知
|
clickSysMesage: (udid, index) => send(index, { udid, action: 'click', type: 'clickSysMesage', index, resourceId: 'com.zhiliaoapp.musically:id/j7s' }), //点击有消息的系统通知
|
||||||
// isVideoAndLive: (udid, index) => send(index, { udid, action: 'click', type: 'isVideoAndLive', index, resourceId: 'com.zhiliaoapp.musically:id/long_press_layout' }), //获取是视频还是直播
|
isVideoAndLive: (udid, index) => send(index, { udid, action: 'click', type: 'isVideoAndLive', index, resourceId: 'com.zhiliaoapp.musically:id/long_press_layout' }), //获取是视频还是直播
|
||||||
addHost: (udid, index) => send(index, { udid, action: 'click', type: 'addHost', index, resourceId: 'com.zhiliaoapp.musically:id/fuq' }), //视频页面的关注
|
addHost: (udid, index) => send(index, { udid, action: 'click', type: 'addHost', index, resourceId: 'com.zhiliaoapp.musically:id/fuq' }), //视频页面的关注
|
||||||
isHost: (udid, index) => send(index, { udid, action: 'click', type: 'isHost', index, resourceId: 'com.zhiliaoapp.musically:id/fuq' }), //判断视频页面的关注
|
isHost: (udid, index) => send(index, { udid, action: 'click', type: 'isHost', index, resourceId: 'com.zhiliaoapp.musically:id/fuq' }), //判断视频页面的关注
|
||||||
search: (udid, index) => send(index, { udid, action: 'click', type: 'search', index, resourceId: 'com.zhiliaoapp.musically:id/gtz' }), //搜索页面
|
search: (udid, index) => send(index, { udid, action: 'click', type: 'search', index, resourceId: 'com.zhiliaoapp.musically:id/gtz' }), //搜索页面
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
import { ref, reactive, onMounted } from 'vue';
|
import { ref, reactive, onMounted } from 'vue';
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
import { login, getIdByName } from '@/api/account';
|
import { login, getIdByName } from '@/api/account';
|
||||||
import { getToken, setToken, setUser, setUserPass, getUserPass } from '@/utils/storage';
|
import { getToken, setToken, setUser, setUserPass, getUserPass } from '@/stores/storage';
|
||||||
import { ElLoading, ElMessage } from 'element-plus';
|
import { ElLoading, ElMessage } from 'element-plus';
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,72 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<el-scrollbar class="left">
|
<el-scrollbar class="left"> <!-- 左边栏 -->
|
||||||
<div class=" center-line">
|
<div class="center-line"> <!-- 左边栏按钮 -->
|
||||||
<!-- <el-button class="open" @click="wsActions.open(device.udid, index)"></el-button>
|
<div v-for="(btn, index) in buttons" :key="index" style="width: 100%;">
|
||||||
<el-button class="Back" @click="Back(device.udid, index)"></el-button>
|
<div v-if="btn.show?.()" class="left-button" :style="{
|
||||||
<el-button class="Home" @click="Home(device.udid, index)"></el-button>
|
backgroundColor: btn.label == '关闭监测消息' ? 'red' : '',
|
||||||
<el-button class="Overview" @click="Overview(device.udid, index)"></el-button> -->
|
}" @click="btn.onClick" @mouseenter="hoverIndex = index" @mouseleave="hoverIndex = null">
|
||||||
<!-- <el-button @click="play(device.udid, index)">play</el-button> -->
|
<img :src="hoverIndex === index ? btn.img.hover : btn.img.normal" alt="">
|
||||||
<!-- <el-button class="open" @click="slideDown(device.udid, index)"></el-button>
|
{{ btn.label }}
|
||||||
<el-button class="open" @click="slideUp(device.udid, index)"></el-button>
|
</div>
|
||||||
<el-button class="open" @click="clickLike(device.udid, index)"></el-button> -->
|
</div>
|
||||||
<div></div>
|
|
||||||
<!-- <el-button @click="clickLikes(device.udid, index)">点赞</el-button> -->
|
|
||||||
<!-- <el-button @click="stopLike(index)">停止点赞</el-button> -->
|
|
||||||
<!-- <div></div>
|
|
||||||
<el-button @click="clickComment(device.udid, index)">评论</el-button>
|
|
||||||
<el-button @click="clickComtext(device.udid, index)">评论框</el-button>
|
|
||||||
<el-button @click="clickComPush(device.udid, index)">发布评论</el-button>
|
|
||||||
<div></div>
|
|
||||||
<el-button @click="clicktomy(device.udid, index)">主页</el-button> -->
|
|
||||||
<!-- <el-button @click="wsActions.clickAttention(device.udid, index)">关注/私信</el-button> -->
|
|
||||||
<!-- <div></div>
|
|
||||||
<el-button @click="clickPrivatetext(device.udid, index)">私信输入</el-button>
|
|
||||||
<el-button @click="clickPrivatePush(device.udid, index)">私信发送</el-button> -->
|
|
||||||
<el-button type="warning" @click="reload()">刷新</el-button>
|
|
||||||
<!-- <el-button type="warning" @click="opentanchuan()">123</el-button> -->
|
|
||||||
<div></div>
|
|
||||||
<!-- <el-button @click="wsActions.clickCopy(device.udid, index)">找私信</el-button> -->
|
|
||||||
<!-- <el-button @click="wsActions.clickCopyList(device.udid, index)">私信列表</el-button> -->
|
|
||||||
<div></div>
|
|
||||||
<!-- <el-button @click="wsActions.getmesNum(device.udid, index)">获取收件箱</el-button> -->
|
|
||||||
<!-- <el-button @click="wsActions.getSize(device.udid, index)">获取屏幕尺寸</el-button> -->
|
|
||||||
<!-- <el-button @click="wsActions.slideRight(device.udid, index)">右滑</el-button> -->
|
|
||||||
<!-- <el-button @click="wsActions.isHost(device.udid, index)">一键养号</el-button> -->
|
|
||||||
<el-button type="success" @click="openTk()">打开tiktok</el-button>
|
|
||||||
<el-button type="success" @click="resetTk()">重置tiktok</el-button>
|
|
||||||
<el-button type="success" @click="brushLive()">打开直播</el-button>
|
|
||||||
|
|
||||||
<el-button :type="runType[0] == 'like' ? 'danger' : 'success'" @click="parentNum()">{{ runType[0] == 'like' ?
|
|
||||||
'养号中' : '一键养号' }}</el-button>
|
|
||||||
<el-button type="success"
|
|
||||||
@click="showDialog = true; dialogTitle = '主播ID'; selectedDevice = 999">一键关注并打招呼</el-button>
|
|
||||||
<el-button type="success" v-if="!isShowMes" @click="openMonitor()">开启监测消息</el-button>
|
|
||||||
<el-button type="danger" v-else @click="cloesMonitor()">关闭监测消息</el-button>
|
|
||||||
<el-button type="danger" @click="stop()">全部停止</el-button>
|
|
||||||
<el-button type="danger" @click="router.push('/')">登出</el-button>
|
|
||||||
<div></div>
|
|
||||||
<!-- <div style="display: flex;">
|
|
||||||
<div style="width: 150px;">主播id</div>
|
|
||||||
<el-input style="border: 1px solid #000;" v-model="hostIdContent[index]" type="text"></el-input>
|
|
||||||
<el-button @click="setHostId(index)">发送</el-button>
|
|
||||||
</div>
|
|
||||||
<div style="display: flex;">
|
|
||||||
<div style="width: 150px;">评论内容:</div>
|
|
||||||
<el-input style="border: 1px solid #000;" v-model="textContent[index]" type="text"></el-input>
|
|
||||||
<el-button @click="setComText(index)">发送</el-button>
|
|
||||||
</div> -->
|
|
||||||
<!-- <div style="display: flex;">
|
|
||||||
<div style="width: 150px;">私信内容:</div>
|
|
||||||
<el-input style="border: 1px solid #000;" v-model="textContentpri[index]" type="text"></el-input>
|
|
||||||
<el-button @click="setPrivateText(index)">发送</el-button>
|
|
||||||
</div> -->
|
|
||||||
<div></div>
|
|
||||||
<!-- <el-button @click="getText(index)">获取粘贴板内容</el-button> -->
|
|
||||||
<div></div>
|
|
||||||
<!-- <el-button @click="wsActions.isVideoAndLive(device.udid, index)">判断视频还是直播</el-button> -->
|
|
||||||
</div>
|
</div>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
|
<!-- 中间手机区域 -->
|
||||||
<div class="content" @click.self="selectedDevice = 999">
|
<div class="content" @click.self="selectedDevice = 999">
|
||||||
<div class="video-container" @click.self="selectedDevice = 999" v-for="(device, index) in deviceInformation"
|
<div class="video-container" @click.self="selectedDevice = 999" v-for="(device, index) in deviceInformation"
|
||||||
:key="device.udid" @mouseup="(e) => handleCanvasup(device.udid, e, index)">
|
:key="device.udid" @mouseup="(e) => handleCanvasup(device.udid, e, index)">
|
||||||
@@ -75,50 +21,42 @@
|
|||||||
:style="getVideoStyle(index)" @click.stop="selectedDevice = index"></video>
|
:style="getVideoStyle(index)" @click.stop="selectedDevice = index"></video>
|
||||||
<canvas class="canvas" v-show="selectedDevice == index" :ref="(el) => (canvasRef[device.udid] = el)"
|
<canvas class="canvas" v-show="selectedDevice == index" :ref="(el) => (canvasRef[device.udid] = el)"
|
||||||
@mousemove.stop="(e) => handleMouseMove(device.udid, e, index)"
|
@mousemove.stop="(e) => handleMouseMove(device.udid, e, index)"
|
||||||
@mousedown.stop="(e) => handleCanvasdown(device.udid, e, index)">
|
@mousedown.stop="(e) => handleCanvasdown(device.udid, e, index)" :style="{
|
||||||
|
transform: getTransformStyle(index)
|
||||||
|
}">
|
||||||
</canvas>
|
</canvas>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-info" v-show="selectedDevice == index" :style="{ left: phone.width * 1.4 + 4 + '0px' }">
|
<div class="input-info" v-show="selectedDevice == index"
|
||||||
<!-- <div class="input-info" v-show="false"> -->
|
:style="{ left: phone.width * 1.4 + 4 + '0px', transform: getTransformStyle(index), }">
|
||||||
<!-- <el-button @click="showDialog = true; dialogTitle = '主播ID';">批量关注</el-button> -->
|
|
||||||
<div></div>
|
<div class="app-button" @click="resetApp(device.udid, index)">重置应用</div>
|
||||||
<!-- <el-button @click="showDialog = true; dialogTitle = '评论';">导入评论</el-button> -->
|
<div class="app-button"
|
||||||
<div></div>
|
@click="wsActions.clickCopyList(device.udid, index); openShowChat = true; istranslate = true">
|
||||||
<el-button @click="getComArr(index, '评论')">查看评论</el-button>
|
翻译本页对话</div>
|
||||||
<div></div>
|
<div class="app-button" @click="wsActions.clickCopyList(device.udid, index); openShowChat = true;">
|
||||||
<!-- <el-button @click="showDialog = true; dialogTitle = '私信';">导入私信</el-button> -->
|
回复消息</div>
|
||||||
<div></div>
|
<!-- <div class="app-button" @click="wsActions.getSize(device.udid, index)">获取屏幕尺寸</div> -->
|
||||||
<el-button @click="getComArr(index, '私信')">查看私信</el-button>
|
|
||||||
<!-- <el-button @click="wsActions.search(device.udid, index)">搜索</el-button> -->
|
<div class="app-button" @click="wsActions.test(device.udid, index)">打印ui节点树</div>
|
||||||
<!-- <el-button @click="wsActions.getmesNum(device.udid, index)">检测消息</el-button> -->
|
<div class="app-button" @click="wsActions.isOneLive(device.udid, index)">判断单人还是双人</div>
|
||||||
<!-- <el-button @click="wsActions.clickMesage(device.udid, index)">进入消息</el-button> -->
|
<div class="app-button" @click="wsActions.slideDown(device.udid, index)">下滑</div>
|
||||||
<el-button @click="wsActions.clickSysMesage(device.udid, index)">进入消息</el-button>
|
<div class="app-button" @click="wsActions.killNow(device.udid, index)">关闭当前应用</div>
|
||||||
<el-button @click="resetApp(device.udid, index)">重置应用</el-button>
|
<div class="app-button" @click="chooseFile(device.udid, index, 1, wsActions)">安装 APK
|
||||||
<el-button
|
文件</div>
|
||||||
@click="wsActions.clickCopyList(device.udid, index); openShowChat = true; istranslate = true">翻译本页对话</el-button>
|
<div class="app-button" @click="chooseFile(device.udid, index, 2, wsActions)">
|
||||||
<!-- <el-button @click="wsActions.getSize(device.udid, index)">获取屏幕尺寸</el-button> -->
|
传送文件</div>
|
||||||
<div style="display: flex;">
|
<div style="display: flex;">
|
||||||
<el-input style="border: 1px solid #000;" v-model="textContent[index]" type="text"></el-input>
|
<input style="border: 1px solid #000;margin:0px 14px;" v-model="textContent[index]" type="text"></input>
|
||||||
<el-button @click="setComText(index)">发送</el-button>
|
<div class="app-button" style="margin: 0px;height: 40px;width: 60px;font-size: 14px;"
|
||||||
|
@click="setComText(index)">发送
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-button @click="wsActions.test(device.udid, index)">打印ui节点树</el-button>
|
<!-- <div class="app-button" @click="wsActions.isHost(device.udid, index)">一键养号</div> -->
|
||||||
<el-button @click="wsActions.isOneLive(device.udid, index)">判断单人还是双人</el-button>
|
|
||||||
<el-button @click="wsActions.slideDown(device.udid, index)">下滑</el-button>
|
|
||||||
<el-button @click="wsActions.killNow(device.udid, index)">关闭当前应用</el-button>
|
|
||||||
<el-button @click="chooseFile(device.udid, index, 1, wsActions)">安装 APK 文件</el-button>
|
|
||||||
<el-button @click="chooseFile(device.udid, index, 2, wsActions)">传送文件</el-button>
|
|
||||||
<!-- <el-button @click="wsActions.isHost(device.udid, index)">一键养号</el-button> -->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!--
|
|
||||||
<div class="video-container" @click.self="selectedDevice = 999" v-for="item in 4" :style="getVideoStyle()"
|
|
||||||
:class="{ 'bottom-row': item >= 2 }">
|
|
||||||
<div style="position: relative;box-sizing: border-box; ">
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right" @click.self="selectedDevice = 999">
|
||||||
<!-- <el-button @click="openShowChat = !openShowChat">聊天</el-button> -->
|
<div style="margin: 14px;"></div>
|
||||||
<ChatDialog :visible="openShowChat" :messages="chatList" />
|
<ChatDialog :visible="openShowChat" :messages="chatList" />
|
||||||
</div>
|
</div>
|
||||||
<MultiLineInputDialog v-model:visible="showDialog" :initialText='""' :title="dialogTitle" :index="selectedDevice"
|
<MultiLineInputDialog v-model:visible="showDialog" :initialText='""' :title="dialogTitle" :index="selectedDevice"
|
||||||
@@ -130,7 +68,12 @@
|
|||||||
import { ref, onMounted, onUnmounted, onBeforeUnmount, watch, inject } from "vue";
|
import { ref, onMounted, onUnmounted, onBeforeUnmount, watch, inject } from "vue";
|
||||||
import VideoConverter from "h264-converter";
|
import VideoConverter from "h264-converter";
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
import { setphoneXYinfo, getphoneXYinfo, getUser, getHostList, setHostList, getContentpriList, setContentpriList, getContentList, setContentList } from '@/utils/storage'
|
import {
|
||||||
|
setphoneXYinfo, getphoneXYinfo, getUser,
|
||||||
|
getHostList, setHostList, getContentpriList,
|
||||||
|
setContentpriList, getContentList, setContentList,
|
||||||
|
setsessionId, getsessionId
|
||||||
|
} from '@/stores/storage'
|
||||||
import { toBufferBtn, stringToUtf8ByteArray, getClipboard, setClipboard, bufferToString, startsWithHeader, trimLongArray, base64ToBinary, toBuffer } from '@/utils/bufferUtils';
|
import { toBufferBtn, stringToUtf8ByteArray, getClipboard, setClipboard, bufferToString, startsWithHeader, trimLongArray, base64ToBinary, toBuffer } from '@/utils/bufferUtils';
|
||||||
import { createWsActions } from '@/utils/wsActions';
|
import { createWsActions } from '@/utils/wsActions';
|
||||||
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'
|
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'
|
||||||
@@ -162,7 +105,7 @@ let dialogTitle = ref('');
|
|||||||
//评论文本内容
|
//评论文本内容
|
||||||
let textContent = ref(['', '', '', '', '', '', '', '']);
|
let textContent = ref(['', '', '', '', '', '', '', '']);
|
||||||
let textContentArr = ref([[], [], [], [], [], [], [], [], []]);
|
let textContentArr = ref([[], [], [], [], [], [], [], [], []]);
|
||||||
//主播id内容
|
//当前主播id内容
|
||||||
let hostIdArr = ref([{}, {}, {}, {}, {}, {}, {}, {}]);
|
let hostIdArr = ref([{}, {}, {}, {}, {}, {}, {}, {}]);
|
||||||
// let hostIdContentArr = ref([[], [], [], [], [], [], [], [], []]);
|
// let hostIdContentArr = ref([[], [], [], [], [], [], [], [], []]);
|
||||||
//私信文本内容
|
//私信文本内容
|
||||||
@@ -185,6 +128,7 @@ let instanceList = ref([{}, {}, {}, {}, {}, {}, {}, {}]);
|
|||||||
//是否是在关注主播
|
//是否是在关注主播
|
||||||
let runType = ref(['', '', '', '', '', '', '', '']);
|
let runType = ref(['', '', '', '', '', '', '', '']);
|
||||||
//屏幕尺寸系数
|
//屏幕尺寸系数
|
||||||
|
let isMonitor = ref(false);
|
||||||
let iponeCoefficient = ref([{ width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }]);
|
let iponeCoefficient = ref([{ width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }, { width: 1, height: 1 }]);
|
||||||
//是否是发送的内容
|
//是否是发送的内容
|
||||||
let isSend = ref(false)
|
let isSend = ref(false)
|
||||||
@@ -207,11 +151,113 @@ const mouseData = {
|
|||||||
buttons: 1,
|
buttons: 1,
|
||||||
};
|
};
|
||||||
//打开聊天窗口的状态
|
//打开聊天窗口的状态
|
||||||
let openShowChat = ref(false);
|
let openShowChat = ref(true);
|
||||||
let istranslate = ref(false); //是否是翻译本页
|
let istranslate = ref(false); //是否是翻译本页
|
||||||
let phoneXYinfo = ref(getphoneXYinfo() == null ? [{}, {}, {}, {}, {}, {}, {}, {}] : getphoneXYinfo());
|
let phoneXYinfo = ref(getphoneXYinfo() == null ? [{}, {}, {}, {}, {}, {}, {}, {}] : getphoneXYinfo());
|
||||||
console.log('phoneXYinfo.value', phoneXYinfo.value)
|
// 当前悬浮的按钮索引
|
||||||
|
const hoverIndex = ref(null)
|
||||||
|
|
||||||
|
// 你可以用这种方式声明按钮们
|
||||||
|
const buttons = [
|
||||||
|
{
|
||||||
|
label: '刷新',
|
||||||
|
onClick: () => reload(),
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn1.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn1-1.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '打开tiktok',
|
||||||
|
onClick: () => openTk(),
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn2.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn2-2.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '重置tiktok',
|
||||||
|
onClick: () => resetTk(),
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn3.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn3-3.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '打开直播',
|
||||||
|
onClick: () => brushLive(),
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn4.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn4-4.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '一键养号',
|
||||||
|
onClick: () => parentNum(),
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn5.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn5-5.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '一键关注并打招呼',
|
||||||
|
onClick: () => {
|
||||||
|
showDialog.value = true
|
||||||
|
dialogTitle.value = '主播ID'
|
||||||
|
selectedDevice.value = 999
|
||||||
|
},
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn6.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn6-6.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '开启监测消息',
|
||||||
|
onClick: () => openMonitor(),
|
||||||
|
show: () => !isShowMes.value, // 只有在未开启时显示
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn1.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn1-1.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '关闭监测消息',
|
||||||
|
onClick: () => cloesMonitor(),
|
||||||
|
show: () => isShowMes.value, // 只有在已开启时显示
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn1.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn1-1.png', import.meta.url).href
|
||||||
|
},
|
||||||
|
style: { backgroundColor: 'red' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '全部停止',
|
||||||
|
onClick: () => stop(),
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn8.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn8-8.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '登出',
|
||||||
|
onClick: () => router.push('/'),
|
||||||
|
show: () => true,
|
||||||
|
img: {
|
||||||
|
normal: new URL('@/assets/video/leftBtn9.png', import.meta.url).href,
|
||||||
|
hover: new URL('@/assets/video/leftBtn9-9.png', import.meta.url).href
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
const wsCache = new Map();
|
const wsCache = new Map();
|
||||||
|
|
||||||
//``````````````````````````````````````````````````````````````````````````````````
|
//``````````````````````````````````````````````````````````````````````````````````
|
||||||
// 初始化 手机显示WebSocket 和视频流
|
// 初始化 手机显示WebSocket 和视频流
|
||||||
const initVideoStream = (udid, index) => {
|
const initVideoStream = (udid, index) => {
|
||||||
@@ -296,9 +342,11 @@ const initVideoStream = (udid, index) => {
|
|||||||
//点击进入新消息页面以后,获取页面信息
|
//点击进入新消息页面以后,获取页面信息
|
||||||
wsActions.clickCopyList(deviceInformation.value[index].udid, index)
|
wsActions.clickCopyList(deviceInformation.value[index].udid, index)
|
||||||
} else if (resData.type == 'clickSysMesage') {
|
} else if (resData.type == 'clickSysMesage') {
|
||||||
|
Back('', index)
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
Back('', index)
|
Back('', index)
|
||||||
}, 3000)
|
}, 1000)
|
||||||
|
|
||||||
} else if (resData.type == 'isVideoAndLive') {
|
} else if (resData.type == 'isVideoAndLive') {
|
||||||
console.log(resData.message)
|
console.log(resData.message)
|
||||||
} else if (resData.type == 'clickCopyList') { //获取到的消息列表
|
} else if (resData.type == 'clickCopyList') { //获取到的消息列表
|
||||||
@@ -314,11 +362,13 @@ const initVideoStream = (udid, index) => {
|
|||||||
if (mesBox.position == 'right') return
|
if (mesBox.position == 'right') return
|
||||||
openShowChat.value = true
|
openShowChat.value = true
|
||||||
console.log("执行ai")
|
console.log("执行ai")
|
||||||
|
|
||||||
chat({ msg: mesBox.text }).then(res => {
|
chat({ msg: mesBox.text }).then(res => {
|
||||||
console.log("ai返回", res)
|
console.log("ai返回", res)
|
||||||
textContentpri.value[index] = res.result
|
textContentpri.value[index] = res.result
|
||||||
PrivatetexToPrivatePush(deviceInformation.value[index].udid, index)
|
PrivatetexToPrivatePush(deviceInformation.value[index].udid, index)
|
||||||
})
|
})
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
console.log("翻译本页")
|
console.log("翻译本页")
|
||||||
istranslate.value = false
|
istranslate.value = false
|
||||||
@@ -396,9 +446,13 @@ const initVideoStream = (udid, index) => {
|
|||||||
Back('', index);
|
Back('', index);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
Back('', index);
|
Back('', index);
|
||||||
//正常没有消息,发送完私信以后,返回六次,然后继续下一个任务
|
if (isMonitor.value) {
|
||||||
wsActions.getmesNum(deviceInformation.value[index].udid, index)
|
//正常没有消息,发送完私信以后,返回六次,然后继续下一个任务
|
||||||
// LikesToLikesToLikes(deviceInformation.value[index].udid, index)
|
wsActions.getmesNum(deviceInformation.value[index].udid, index)
|
||||||
|
} else {
|
||||||
|
LikesToLikesToLikes(deviceInformation.value[index].udid, index)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
@@ -506,7 +560,7 @@ const initVideoStream = (udid, index) => {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// ----------------------------------------------------------------------------------------------------报错处理
|
// ----------------------------------------------------------------------------------------------------报错处理
|
||||||
//如果该视频无法被评论,返回刷下一条视频
|
//如果该视频无法被评论,或者没有评论,返回刷下一条视频
|
||||||
if (resData.type == 'Comtext' || resData.type == 'CommentText') {
|
if (resData.type == 'Comtext' || resData.type == 'CommentText') {
|
||||||
if (runType.value[index] == 'follow') {
|
if (runType.value[index] == 'follow') {
|
||||||
|
|
||||||
@@ -533,7 +587,7 @@ const initVideoStream = (udid, index) => {
|
|||||||
LikesToLikesToLikes(deviceInformation.value[index].udid, index)
|
LikesToLikesToLikes(deviceInformation.value[index].udid, index)
|
||||||
}, 1000)
|
}, 1000)
|
||||||
}, 1000)
|
}, 1000)
|
||||||
} else if (resData.type == 'Privatetex' || resData.type == 'hostVideo' || resData.type == 'search') {
|
} else if (resData.type == 'Privatetex' || resData.type == 'hostVideo' || resData.type == 'search' || resData.type == 'Attention' || resData.type == 'Comment') {
|
||||||
if (runType.value[index] == 'follow') {
|
if (runType.value[index] == 'follow') {
|
||||||
//关注的时候出现无法私信和没有视频的情况 错误重置
|
//关注的时候出现无法私信和没有视频的情况 错误重置
|
||||||
resetApp(udid, index)
|
resetApp(udid, index)
|
||||||
@@ -756,6 +810,7 @@ onMounted(() => {
|
|||||||
if (data === 'start') {
|
if (data === 'start') {
|
||||||
if (!isMsgPop.value) {
|
if (!isMsgPop.value) {
|
||||||
isMsgPop.value = true;
|
isMsgPop.value = true;
|
||||||
|
|
||||||
ElMessageBox.confirm(
|
ElMessageBox.confirm(
|
||||||
'检测到YOLO助手正在爬取主播,是否进行操作?',
|
'检测到YOLO助手正在爬取主播,是否进行操作?',
|
||||||
'消息提醒',
|
'消息提醒',
|
||||||
@@ -767,7 +822,6 @@ onMounted(() => {
|
|||||||
)
|
)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
//开启sse版follow任务
|
//开启sse版follow任务
|
||||||
|
|
||||||
ElMessage({
|
ElMessage({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
message: '任务开启成功',
|
message: '任务开启成功',
|
||||||
@@ -807,75 +861,26 @@ onMounted(() => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
stroageHost.value = getHostList()
|
// stroageHost.value = getHostList()
|
||||||
stroageHost.value.push(({ country: data.country, text: data.hostsId, state: false }))
|
stroageHost.value.push(({ country: data.country, text: data.hostsId, state: false }))
|
||||||
if (isMsgPop.value) {
|
if (runType.value[0] == 'follow') {
|
||||||
setHostList(stroageHost.value)
|
setHostList(stroageHost.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//更新状态
|
|
||||||
// update(
|
|
||||||
// {
|
|
||||||
// id: data.id,
|
|
||||||
// operationStatus: 1,
|
|
||||||
// }
|
|
||||||
// ).then(() => {
|
|
||||||
|
|
||||||
// })
|
|
||||||
|
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
//更新状态
|
||||||
|
// update(
|
||||||
|
// {
|
||||||
|
// id: data.id,
|
||||||
|
// operationStatus: 1,
|
||||||
|
// }
|
||||||
|
// ).then(() => {
|
||||||
|
|
||||||
function opentanchuan() {
|
// })
|
||||||
ElMessageBox.confirm(
|
|
||||||
'接收到YOLO爬虫爬取到的主播,开始进行操作?',
|
|
||||||
'消息提醒',
|
|
||||||
{
|
|
||||||
confirmButtonText: '开始',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'success',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
.then(() => {
|
|
||||||
ElMessage({
|
|
||||||
type: 'success',
|
|
||||||
message: '任务开启成功',
|
|
||||||
})
|
|
||||||
resetTk()
|
|
||||||
comment().then((resA) => {
|
|
||||||
console.log('resA:', resA);
|
|
||||||
setContentList(resA)
|
|
||||||
//评论
|
|
||||||
textContentArr.value.forEach((item, indexA) => {
|
|
||||||
textContent.value[indexA] = resA[getRandomNumber(resA.length - 1)];
|
|
||||||
})
|
|
||||||
|
|
||||||
prologue().then((resB) => {
|
|
||||||
|
|
||||||
console.log('resB:', resB);
|
|
||||||
setContentpriList(resB)
|
|
||||||
//私信
|
|
||||||
textContentpriArr.value.forEach((item, indexA) => {
|
|
||||||
textContentpri.value[indexA] = resB[getRandomNumber(resB.length - 1)];
|
|
||||||
runType.value[indexA] = 'follow'
|
|
||||||
console.log('runType', runType.value[indexA])
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
deviceInformation.value.forEach((device, indexB) => {
|
|
||||||
if (getHostList().length <= 0) return;
|
|
||||||
|
|
||||||
// LikesToLikesToLikes(device.udid, indexB)
|
|
||||||
wsActions.getmesNum(device.udid, indexB)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
||||||
@@ -1313,7 +1318,7 @@ function getVideoStyle(index) {
|
|||||||
const isSelected = selectedDevice.value === index;
|
const isSelected = selectedDevice.value === index;
|
||||||
const baseWidth = phone.value.width;
|
const baseWidth = phone.value.width;
|
||||||
const baseHeight = phone.value.height;
|
const baseHeight = phone.value.height;
|
||||||
// console.log(isSelected, '是否相等')
|
|
||||||
return {
|
return {
|
||||||
width: isSelected ? baseWidth * 1.4 + 'px' : baseWidth + 'px',
|
width: isSelected ? baseWidth * 1.4 + 'px' : baseWidth + 'px',
|
||||||
height: isSelected ? baseHeight * 1.4 + 'px' : baseHeight + 'px',
|
height: isSelected ? baseHeight * 1.4 + 'px' : baseHeight + 'px',
|
||||||
@@ -1323,6 +1328,8 @@ function getVideoStyle(index) {
|
|||||||
left: isSelected ? '0' : 'unset',
|
left: isSelected ? '0' : 'unset',
|
||||||
zIndex: isSelected ? 1000 : 1,
|
zIndex: isSelected ? 1000 : 1,
|
||||||
pointerEvents: isSelected ? 'none' : 'auto',
|
pointerEvents: isSelected ? 'none' : 'auto',
|
||||||
|
transform: getTransformStyle(index),
|
||||||
|
transition: 'all 0.3s ease',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1400,20 +1407,9 @@ function brushLive() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
//确认多行文本框内容
|
//确认多行文本框内容
|
||||||
function onDialogConfirm(result, type, index) {
|
function onDialogConfirm(result, type, index, isMon) {
|
||||||
console.log(result, type, index);
|
console.log(type, index, isMon);
|
||||||
if (type == '评论') {
|
if (type == '评论') {
|
||||||
//index ==999 表示批量养号,输入完评论后 即可直接执行脚本
|
|
||||||
// if (index == 999) {
|
|
||||||
// getContentList().forEach((item, indexA) => {
|
|
||||||
// // textContentArr.value[indexA] = result;
|
|
||||||
// textContent.value[indexA] = result[getRandomNumber(result.length - 1)];
|
|
||||||
// })
|
|
||||||
// setContentList(result)
|
|
||||||
// console.log(getContentList())
|
|
||||||
// parentNum()
|
|
||||||
// //index==998是批量关注主播 输入完评论后 还需要输入私信内容
|
|
||||||
// } else
|
|
||||||
if (index == 998) {
|
if (index == 998) {
|
||||||
textContentArr.value.forEach((item, indexA) => {
|
textContentArr.value.forEach((item, indexA) => {
|
||||||
textContent.value[indexA] = result[getRandomNumber(result.length - 1)];
|
textContent.value[indexA] = result[getRandomNumber(result.length - 1)];
|
||||||
@@ -1433,17 +1429,26 @@ function onDialogConfirm(result, type, index) {
|
|||||||
} else if (type == '私信') {
|
} else if (type == '私信') {
|
||||||
//index ==999 表示全部
|
//index ==999 表示全部
|
||||||
if (index == 999) {
|
if (index == 999) {
|
||||||
|
isMonitor.value = isMon //是否自动回复
|
||||||
textContentpriArr.value.forEach((item, indexA) => {
|
textContentpriArr.value.forEach((item, indexA) => {
|
||||||
textContentpri.value[indexA] = result[getRandomNumber(result.length - 1)];
|
textContentpri.value[indexA] = result[getRandomNumber(result.length - 1)];
|
||||||
runType.value[indexA] = 'follow'
|
runType.value[indexA] = 'follow'
|
||||||
})
|
})
|
||||||
|
// isStop.value = true; //停止所有任务
|
||||||
setContentpriList(result)
|
setContentpriList(result)
|
||||||
deviceInformation.value.forEach((device, indexB) => {
|
deviceInformation.value.forEach((device, indexB) => {
|
||||||
if (getHostList().length <= 0) return;
|
if (getHostList().length <= 0) return;
|
||||||
|
|
||||||
|
if (isMon) {
|
||||||
|
console.log(isMon)
|
||||||
|
console.error('自动回复');
|
||||||
|
wsActions.getmesNum(device.udid, indexB)
|
||||||
|
} else {
|
||||||
|
console.error('开始关注');
|
||||||
|
LikesToLikesToLikes(device.udid, indexB)
|
||||||
|
}
|
||||||
// LikesToLikesToLikes(device.udid, indexB)
|
// LikesToLikesToLikes(device.udid, indexB)
|
||||||
wsActions.getmesNum(device.udid, indexB)
|
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
textContentpriArr.value[index] = result;
|
textContentpriArr.value[index] = result;
|
||||||
@@ -1465,15 +1470,6 @@ function onDialogConfirm(result, type, index) {
|
|||||||
showDialog.value = true;
|
showDialog.value = true;
|
||||||
}, 600)
|
}, 600)
|
||||||
}
|
}
|
||||||
// else {
|
|
||||||
// hostIdContentArr.value[index] = result;
|
|
||||||
// hostIdContent.value[index] = result[0];
|
|
||||||
// deviceInformation.value.forEach((device, indexA) => {
|
|
||||||
// if (index == indexA) {
|
|
||||||
// LikesToLikesToLikes(device.udid, index)
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1495,8 +1491,16 @@ function markFirstFalseAsTrue(hostList) {
|
|||||||
}
|
}
|
||||||
return null; // 没有找到 false 的项
|
return null; // 没有找到 false 的项
|
||||||
}
|
}
|
||||||
|
//计算手机canvas是否需要偏移
|
||||||
|
function getTransformStyle(index) {
|
||||||
|
return selectedDevice.value === index && index >= 3
|
||||||
|
? 'translateY(-30%)'
|
||||||
|
: 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
function manualGc() {
|
||||||
|
window.electronAPI.manualGc()
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
|
|||||||