定制版功能出版
This commit is contained in:
@@ -2,47 +2,32 @@
|
||||
<div class="grid grid-cols-1 lg:grid-cols-12 gap-4 mb-4">
|
||||
<!-- Stat Cards -->
|
||||
<!-- 总数量 (较小) -->
|
||||
<div class="lg:col-span-2 bg-white dark:bg-slate-900 p-4 rounded-xl shadow-sm border border-slate-100 dark:border-slate-800">
|
||||
<div
|
||||
class="lg:col-span-2 bg-white dark:bg-slate-900 p-4 rounded-xl shadow-sm border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-1">
|
||||
<span class="text-xs font-medium text-slate-500">{{ $t('workbenches.totalnumber') }}</span>
|
||||
<span class="material-icons-round text-primary/40 text-lg">analytics</span>
|
||||
</div>
|
||||
<div class="text-xl font-bold text-slate-900 dark:text-white">{{ hostData.totalCount }}</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 新建主播 (较小) -->
|
||||
<div class="lg:col-span-2 bg-white dark:bg-slate-900 p-4 rounded-xl shadow-sm border border-slate-100 dark:border-slate-800">
|
||||
<div
|
||||
class="lg:col-span-2 bg-white dark:bg-slate-900 p-4 rounded-xl shadow-sm border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-1">
|
||||
<span class="text-xs font-medium text-slate-500">{{ $t('workbenches.createHost') }}</span>
|
||||
<span class="material-icons-round text-secondary/40 text-lg">person_add</span>
|
||||
</div>
|
||||
<div class="text-xl font-bold text-slate-900 dark:text-white">{{ hostData.validAnchorsCount }}</div>
|
||||
</div>
|
||||
|
||||
<!-- 查询 (较小) -->
|
||||
<div class="lg:col-span-2 bg-white dark:bg-slate-900 p-4 rounded-xl shadow-sm border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-1">
|
||||
<span class="text-xs font-medium text-slate-500">{{ $t('workbenches.query') }}</span>
|
||||
<span class="material-icons-round text-amber-400/60 text-lg">search</span>
|
||||
</div>
|
||||
<div class="text-xl font-bold text-slate-900 dark:text-white">{{ hostData.checkedDataCount }}</div>
|
||||
</div>
|
||||
|
||||
<!-- 邀请 (较大,突出显示) -->
|
||||
<div class="lg:col-span-3 bg-gradient-to-br from-primary to-blue-600 p-5 rounded-xl shadow-lg shadow-primary/20 text-white relative overflow-hidden">
|
||||
<div class="absolute top-0 right-0 w-24 h-24 bg-white/10 rounded-full -translate-y-1/2 translate-x-1/2"></div>
|
||||
<div class="flex items-center justify-between mb-2 relative z-10">
|
||||
<span class="text-sm font-medium text-white/80">{{ $t('workbenches.invite') }}</span>
|
||||
<span class="material-icons-round text-white/60">mail_outline</span>
|
||||
</div>
|
||||
<div class="text-3xl font-bold text-white relative z-10">{{ hostData.canInvitationCount }}</div>
|
||||
<div class="text-xs text-white/60 mt-1">可邀请主播</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- 运行时间 (较大) -->
|
||||
<div class="lg:col-span-3 bg-white dark:bg-slate-900 p-5 rounded-xl shadow-sm border border-slate-100 dark:border-slate-800 flex flex-col justify-center">
|
||||
<div
|
||||
class="lg:col-span-3 bg-white dark:bg-slate-900 p-5 rounded-xl shadow-sm border border-slate-100 dark:border-slate-800 flex flex-col justify-center">
|
||||
<div class="flex items-center justify-between">
|
||||
<!-- <span class="w-4 h-4 rounded-full" :class="1 ? 'bg-red-500' : 'bg-emerald-500'"></span> -->
|
||||
<!-- <span class="w-4 h-4 rounded-full" :class="1 ? 'bg-red-500' : 'bg-emerald-500'"></span> -->
|
||||
<div>
|
||||
<span class="text-xs font-semibold text-slate-400 uppercase tracking-wider block mb-1">{{
|
||||
$t('workbenches.runTime') }}</span>
|
||||
@@ -56,43 +41,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Guild Accounts -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4">
|
||||
<div v-for="(item, index) in 2" :key="index" class="bg-white border border-slate-100 p-5 rounded-xl shadow-sm">
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="w-4 h-4 rounded-full" :class="tkData[index].code == 1 ? 'bg-emerald-500' : 'bg-red-500'"></span>
|
||||
<h3 class="font-bold text-slate-800 dark:text-white">{{ $t('workbenches.guildAccount') }} {{ index === 0 ? 'A'
|
||||
: 'B' }}</h3>
|
||||
</div>
|
||||
<span class=" text-slate-700 text-size" >{{ $t('workbenches.queriedNum') }}: {{ tkData[index].num }}</span>
|
||||
</div>
|
||||
<div class="space-y-4">
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="text-xs font-semibold text-slate-500 mb-1 block">{{ $t('workbenches.guildAccount') }}</label>
|
||||
<input
|
||||
class="w-full bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg px-4 py-2 text-sm focus:ring-2 focus:ring-primary/20 outline-none transition-all disabled:opacity-50"
|
||||
type="text" v-model="tkData[index].account" :placeholder="$t('workbenches.guildAccountPlace')"
|
||||
:disabled="!(tkData[index].code == 0 && !isLogin[index])" />
|
||||
</div>
|
||||
<div>
|
||||
<label class="text-xs font-semibold text-slate-500 mb-1 block">{{ $t('workbenches.guildPass') }}</label>
|
||||
<div class="relative">
|
||||
<input
|
||||
class="w-full bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg px-4 py-2 text-sm focus:ring-2 focus:ring-primary/20 outline-none transition-all disabled:opacity-50"
|
||||
type="password" v-model="tkData[index].password" :placeholder="$t('workbenches.guildPassPlace')"
|
||||
:disabled="!(tkData[index].code == 0 && !isLogin[index])" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button @click="loginTK(index)" :disabled="!(tkData[index].code == 0 && !isLogin[index])"
|
||||
class="w-full bg-slate-900 dark:bg-slate-700 hover:bg-black text-white py-2.5 rounded-lg font-medium transition-all disabled:opacity-50 disabled:cursor-not-allowed">
|
||||
{{ $t('workbenches.loginBackend') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Configuration Panel -->
|
||||
<div
|
||||
@@ -118,7 +67,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-4 gap-6 mb-6">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
|
||||
<!-- Coins -->
|
||||
<div>
|
||||
<h4 class="text-sm font-bold text-slate-800 dark:text-white mb-4 flex items-center gap-2">
|
||||
@@ -171,101 +120,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Frequency -->
|
||||
<div>
|
||||
<h4 class="text-sm font-bold text-slate-800 dark:text-white mb-4 flex items-center gap-2">
|
||||
<span class="w-1 h-4 bg-emerald-500 rounded-full"></span>
|
||||
{{ $t('workbenchesSetup.setQuery') }}
|
||||
</h4>
|
||||
<div class="space-y-3">
|
||||
<div class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<input
|
||||
class="flex-1 px-4 py-2 text-sm bg-white dark:bg-slate-900 border-none outline-none focus:ring-0 disabled:bg-slate-100"
|
||||
type="number" v-model="pyData.frequency.hour" :disabled="!pyData.isStart" />
|
||||
<span
|
||||
class="bg-slate-100 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-24 flex items-center justify-center border-l border-slate-200 dark:border-slate-700">{{
|
||||
$t('workbenchesSetup.hour') }}</span>
|
||||
</div>
|
||||
<div class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<input
|
||||
class="flex-1 px-4 py-2 text-sm bg-white dark:bg-slate-900 border-none outline-none focus:ring-0 disabled:bg-slate-100"
|
||||
type="number" v-model="pyData.frequency.day" :disabled="!pyData.isStart" />
|
||||
<span
|
||||
class="bg-slate-100 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-24 flex items-center justify-center border-l border-slate-200 dark:border-slate-700">{{
|
||||
$t('workbenchesSetup.hour24') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Quantity Limit -->
|
||||
<div>
|
||||
<h4 class="text-sm font-bold text-slate-800 dark:text-white mb-4 flex items-center gap-2">
|
||||
<span class="w-1 h-4 bg-orange-400 rounded-full"></span>
|
||||
{{ $t('workbenchesSetup.setNum') }}
|
||||
<span class="text-[10px] text-slate-400 font-normal ml-1">({{ $t('workbenchesSetup.prompt') }})</span>
|
||||
</h4>
|
||||
<div class="space-y-3">
|
||||
<div class="flex gap-2">
|
||||
<button @click="isLimit = true" :disabled="!pyData.isStart"
|
||||
class="flex-1 px-3 py-2 text-xs font-semibold rounded-md border transition-colors"
|
||||
:class="isLimit ? 'bg-primary text-white border-primary' : 'bg-white text-slate-600 border-slate-200 hover:border-primary/50'">
|
||||
{{ $t('workbenchesSetup.setHostNum') }}
|
||||
</button>
|
||||
<button @click="isLimit = false" :disabled="!pyData.isStart"
|
||||
class="flex-1 px-3 py-2 text-xs font-semibold rounded-md border transition-colors"
|
||||
:class="!isLimit ? 'bg-slate-500 text-white border-slate-500' : 'bg-white text-slate-600 border-slate-200 hover:border-slate-400'">
|
||||
{{ $t('workbenchesSetup.unlimitedQuantity') }}
|
||||
</button>
|
||||
</div>
|
||||
<div v-if="isLimit"
|
||||
class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<input
|
||||
class="flex-1 px-4 py-2 text-sm bg-white dark:bg-slate-900 border-none outline-none focus:ring-0 disabled:bg-slate-100"
|
||||
type="number" v-model="hostNum" :disabled="!pyData.isStart" />
|
||||
<span
|
||||
class="bg-slate-100 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-16 flex items-center justify-center border-l border-slate-200 dark:border-slate-700">{{
|
||||
$t('workbenchesSetup.num') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="flex flex-col lg:flex-row items-center justify-between gap-6 pt-4 border-t border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center gap-6">
|
||||
<div class="flex items-center gap-2 cursor-pointer group" @click="toggleFilter('filterGame')">
|
||||
<span
|
||||
class="w-4 h-4 rounded border-2 flex items-center justify-center transition-all"
|
||||
:class="pyData.filterGame ? 'bg-primary border-primary' : 'bg-white border-slate-300'"
|
||||
>
|
||||
<span v-if="pyData.filterGame" class="material-icons-round text-white text-xs">check</span>
|
||||
</span>
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤游戏主播</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 cursor-pointer group" @click="toggleFilter('filterSelling')">
|
||||
<span
|
||||
class="w-4 h-4 rounded border-2 flex items-center justify-center transition-all"
|
||||
:class="pyData.filterSelling ? 'bg-primary border-primary' : 'bg-white border-slate-300'"
|
||||
>
|
||||
<span v-if="pyData.filterSelling" class="material-icons-round text-white text-xs">check</span>
|
||||
</span>
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤带货主播</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 cursor-pointer group" @click="toggleFilter('rankingList')">
|
||||
<span
|
||||
class="w-4 h-4 rounded border-2 flex items-center justify-center transition-all"
|
||||
:class="pyData.rankingList ? 'bg-primary border-primary' : 'bg-white border-slate-300'"
|
||||
>
|
||||
<span v-if="pyData.rankingList" class="material-icons-round text-white text-xs">check</span>
|
||||
</span>
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤排行榜单</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="mt-6 text-center">
|
||||
<button v-if="pyData.isStart" @click="submit"
|
||||
@@ -313,8 +172,7 @@ let getNumTimer = ref(null);
|
||||
let hostData = ref({
|
||||
totalCount: 0,
|
||||
validAnchorsCount: 0,
|
||||
canInvitationCount: 0,
|
||||
checkedDataCount: 0,
|
||||
|
||||
});
|
||||
//是否开启tk
|
||||
// let isTk = ref(true);
|
||||
@@ -477,17 +335,7 @@ const submit = () => {
|
||||
ElMessage.error('请输入正确的区间值');
|
||||
return;
|
||||
}
|
||||
if (Number(pyData.value.frequency.hour) <= 0 || Number(pyData.value.frequency.day) <= 0 || pyData.value.frequency.hour == '' || pyData.value.frequency.day == '') {
|
||||
ElMessage.error('请输入正确的频率区间值');
|
||||
return;
|
||||
}
|
||||
//是否限制爬取数量
|
||||
if (isLimit.value) {
|
||||
if (hostNum.value <= 0) {
|
||||
ElMessage.error('请输入正确的可邀请数量');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
ElMessageBox.confirm(
|
||||
@@ -525,12 +373,7 @@ const submit = () => {
|
||||
getHostTimer.value = setInterval(() => {
|
||||
fetchDataCount().then((res) => {
|
||||
hostData.value = JSON.parse(res);
|
||||
if (isLimit.value) {
|
||||
if (hostData.value.canInvitationCount >= hostNum.value) {
|
||||
unsubmit();
|
||||
alert('爬取完毕')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
}, 1000);
|
||||
@@ -674,7 +517,7 @@ function tkaccountuse(id, index) {
|
||||
}).catch((err) => {
|
||||
console.log('账号使用次数', err)
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
const isRunning = ref(false);
|
||||
@@ -823,7 +666,7 @@ const checkVPN = async () => {
|
||||
We can keep specific overrides or custom animations here if needed.
|
||||
*/
|
||||
|
||||
.text-size{
|
||||
text-size:50px!important;
|
||||
.text-size {
|
||||
text-size: 50px !important;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user