新版ui
This commit is contained in:
@@ -9,6 +9,67 @@
|
||||
<title>
|
||||
<%= webpackConfig.name %>
|
||||
</title>
|
||||
|
||||
<!-- Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
|
||||
rel="stylesheet" />
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Round" rel="stylesheet" />
|
||||
|
||||
<!-- Tailwind CSS -->
|
||||
<script src="https://cdn.tailwindcss.com?plugins=forms,typography"></script>
|
||||
<script>
|
||||
tailwind.config = {
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: "#0066FF", // Cyber Blue
|
||||
secondary: "#6366F1", // Electric Indigo
|
||||
"background-light": "#F8FAFC",
|
||||
"background-dark": "#0F172A",
|
||||
},
|
||||
fontFamily: {
|
||||
display: ["Inter", "sans-serif"],
|
||||
},
|
||||
borderRadius: {
|
||||
DEFAULT: "12px",
|
||||
'xl': '20px',
|
||||
},
|
||||
boxShadow: {
|
||||
'premium': '0 4px 20px -2px rgba(0, 0, 0, 0.05), 0 2px 10px -2px rgba(0, 0, 0, 0.02)',
|
||||
'glass': 'inset 0 0 0 1px rgba(255, 255, 255, 0.4)',
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<!-- Global Styles -->
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
|
||||
.glass-card {
|
||||
background: rgba(255, 255, 255, 0.7);
|
||||
backdrop-filter: blur(12px);
|
||||
-webkit-backdrop-filter: blur(12px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
.sidebar-active {
|
||||
background: linear-gradient(90deg, #F0F7FF 0%, #FFFFFF 100%);
|
||||
border-right: 3px solid #0066FF;
|
||||
box-shadow: 4px 0 15px -5px rgba(0, 102, 255, 0.15);
|
||||
}
|
||||
|
||||
.subtle-grid {
|
||||
background-image: radial-gradient(#E2E8F0 0.5px, transparent 0.5px);
|
||||
background-size: 24px 24px;
|
||||
}
|
||||
|
||||
/* QT WebChannel */
|
||||
</style>
|
||||
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
|
||||
</head>
|
||||
|
||||
|
||||
@@ -1,148 +1,63 @@
|
||||
<template>
|
||||
<div class="sidebar">
|
||||
<div class="logo">
|
||||
<!-- <img style="margin-right: 10px;" src="@/assets/logo.png"> -->
|
||||
<img src="@/assets/logotext.png">
|
||||
<aside class="w-64 bg-white dark:bg-slate-900 border-r border-slate-200 dark:border-slate-800 flex flex-col z-20 h-full">
|
||||
<div class="p-8 flex items-center gap-3">
|
||||
<div class="w-10 h-10 bg-primary rounded-xl flex items-center justify-center shadow-lg shadow-primary/20">
|
||||
<span class="text-white font-bold text-xl">TK
|
||||
</span>
|
||||
</div>
|
||||
<h1 class="text-xl font-bold tracking-tight text-slate-900 dark:text-white">Yolo <span class="text-primary">助手</span>
|
||||
</h1>
|
||||
</div>
|
||||
<ul>
|
||||
<li @click="updateActiveIndex(1)">
|
||||
<div>
|
||||
<img v-show="activeIndex == 1" src="@/assets/navAction.png" autoplay loop muted class="background-img">
|
||||
<div style="display: flex;">
|
||||
<img v-show="activeIndex == 1" src="@/assets/workAction.png" style="margin-right: 10px;">
|
||||
<img v-show="activeIndex == 2" src="@/assets/workAction.png" style="margin-right: 10px;">
|
||||
<div :style="activeIndex == 1 ? 'color: #000' : 'color: #fff'" class="center-justify">{{
|
||||
$t('menu.workbenches')
|
||||
}}</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li @click="updateActiveIndex(2)">
|
||||
<div>
|
||||
<img v-show="activeIndex == 2" src="@/assets/navAction.png" autoplay loop muted class="background-img">
|
||||
|
||||
<div style="display: flex;">
|
||||
<img v-show="activeIndex == 2" src="@/assets/listAction.png" style="margin-right: 10px;">
|
||||
<img v-show="activeIndex == 1" src="@/assets/listAction.png" style="margin-right: 10px;">
|
||||
<div :style="activeIndex == 2 ? 'color: #000' : 'color: #fff'" class="center-justify">{{
|
||||
$t('menu.hostList')
|
||||
}}</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<a @click="$router.push('/')" href="javascript:void(0);"
|
||||
style="position: absolute; bottom: 30px; color: aliceblue; font-size: 20px; font-weight: 500;">
|
||||
{{
|
||||
$t('menu.logout')
|
||||
}}
|
||||
<nav class="flex-1 px-4 space-y-2">
|
||||
<a
|
||||
class="flex items-center gap-3 px-4 py-3 rounded-lg font-medium cursor-pointer transition-colors"
|
||||
:class="activeIndex == 1 ? 'sidebar-active text-primary' : 'text-slate-500 hover:bg-slate-50 dark:hover:bg-slate-800'"
|
||||
@click="updateActiveIndex(1)"
|
||||
>
|
||||
<span class="material-icons-round">grid_view</span>
|
||||
{{ $t('menu.workbenches') }}
|
||||
</a>
|
||||
|
||||
<a
|
||||
class="flex items-center gap-3 px-4 py-3 rounded-lg font-medium cursor-pointer transition-colors"
|
||||
:class="activeIndex == 2 ? 'sidebar-active text-primary' : 'text-slate-500 hover:bg-slate-50 dark:hover:bg-slate-800'"
|
||||
@click="updateActiveIndex(2)"
|
||||
>
|
||||
<span class="material-icons-round">person_search</span>
|
||||
{{ $t('menu.hostList') }}
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
|
||||
<div class="p-6 border-t border-slate-100 dark:border-slate-800">
|
||||
<button
|
||||
class="flex items-center gap-3 text-slate-500 hover:text-red-500 transition-colors w-full px-4 py-2"
|
||||
@click="$router.push('/')"
|
||||
>
|
||||
<span class="material-icons-round text-lg">logout</span>
|
||||
<span class="font-medium">{{ $t('menu.logout') }}</span>
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { ref } from 'vue';
|
||||
import { getUser } from '@/utils/storage'
|
||||
import { defineEmits } from 'vue';
|
||||
|
||||
|
||||
|
||||
const userInfo = ref(getUser())
|
||||
|
||||
let activeIndex = ref(1);
|
||||
|
||||
const emit = defineEmits(['activeIndex']);
|
||||
|
||||
|
||||
const updateActiveIndex = (index) => {
|
||||
activeIndex.value = index;
|
||||
emit('activeIndex', index);
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
height: 900px;
|
||||
width: 280px;
|
||||
background-color: @bg-color;
|
||||
padding: 20px;
|
||||
box-sizing: border-box;
|
||||
|
||||
.logo {
|
||||
border-bottom: 1px solid #fff;
|
||||
padding-top: 20px;
|
||||
|
||||
img:nth-of-type(1) {
|
||||
height: 66px;
|
||||
}
|
||||
|
||||
img:nth-of-type(2) {
|
||||
height: 29px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
|
||||
}
|
||||
|
||||
.sidebar li {
|
||||
margin-top: 50px;
|
||||
padding-top: 30px;
|
||||
padding-left: 30px;
|
||||
margin-bottom: 50px;
|
||||
height: 64px;
|
||||
position: relative;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
|
||||
}
|
||||
|
||||
.sidebar a {
|
||||
text-decoration: none;
|
||||
color: #000000;
|
||||
display: block;
|
||||
padding: 8px;
|
||||
border-radius: 4px;
|
||||
|
||||
font-family: Source Han Sans SC;
|
||||
font-weight: 400;
|
||||
font-size: 22px;
|
||||
|
||||
}
|
||||
|
||||
/* .sidebar a:hover {
|
||||
background-color: #e0e0e0;
|
||||
} */
|
||||
|
||||
|
||||
.background-img {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 13px;
|
||||
width: 247px;
|
||||
height: 126px;
|
||||
object-fit: cover;
|
||||
z-index: -1;
|
||||
/* 确保视频在内容之下 */
|
||||
}
|
||||
|
||||
.center-justify {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
}
|
||||
<style scoped>
|
||||
/* Scoped styles are minimal now as we use Tailwind */
|
||||
</style>
|
||||
@@ -1,347 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
|
||||
<title>Yolo Assistant - Elite Workstation</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
|
||||
rel="stylesheet" />
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Round" rel="stylesheet" />
|
||||
<script src="https://cdn.tailwindcss.com?plugins=forms,typography"></script>
|
||||
<script>
|
||||
tailwind.config = {
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: "#0066FF", // Cyber Blue
|
||||
secondary: "#6366F1", // Electric Indigo
|
||||
"background-light": "#F8FAFC",
|
||||
"background-dark": "#0F172A",
|
||||
},
|
||||
fontFamily: {
|
||||
display: ["Inter", "sans-serif"],
|
||||
},
|
||||
borderRadius: {
|
||||
DEFAULT: "12px",
|
||||
'xl': '20px',
|
||||
},
|
||||
boxShadow: {
|
||||
'premium': '0 4px 20px -2px rgba(0, 0, 0, 0.05), 0 2px 10px -2px rgba(0, 0, 0, 0.02)',
|
||||
'glass': 'inset 0 0 0 1px rgba(255, 255, 255, 0.4)',
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
|
||||
.glass-card {
|
||||
background: rgba(255, 255, 255, 0.7);
|
||||
backdrop-filter: blur(12px);
|
||||
-webkit-backdrop-filter: blur(12px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
.sidebar-active {
|
||||
background: linear-gradient(90deg, #F0F7FF 0%, #FFFFFF 100%);
|
||||
border-right: 3px solid #0066FF;
|
||||
box-shadow: 4px 0 15px -5px rgba(0, 102, 255, 0.15);
|
||||
}
|
||||
|
||||
.subtle-grid {
|
||||
background-image: radial-gradient(#E2E8F0 0.5px, transparent 0.5px);
|
||||
background-size: 24px 24px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="bg-background-light dark:bg-background-dark text-slate-800 dark:text-slate-200 subtle-grid min-h-screen">
|
||||
<div class="flex h-screen overflow-hidden">
|
||||
<aside
|
||||
class="w-64 bg-white dark:bg-slate-900 border-r border-slate-200 dark:border-slate-800 flex flex-col z-20">
|
||||
<div class="p-8 flex items-center gap-3">
|
||||
<div
|
||||
class="w-10 h-10 bg-primary rounded-xl flex items-center justify-center shadow-lg shadow-primary/20">
|
||||
<span class="text-white font-bold text-xl">y</span>
|
||||
</div>
|
||||
<h1 class="text-xl font-bold tracking-tight text-slate-900 dark:text-white">Yolo <span
|
||||
class="text-primary">助手</span></h1>
|
||||
</div>
|
||||
<nav class="flex-1 px-4 space-y-2">
|
||||
<a class="sidebar-active flex items-center gap-3 px-4 py-3 rounded-lg text-primary font-medium"
|
||||
href="#">
|
||||
<span class="material-icons-round">grid_view</span>
|
||||
工作台
|
||||
</a>
|
||||
<a class="flex items-center gap-3 px-4 py-3 rounded-lg text-slate-500 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors"
|
||||
href="#">
|
||||
<span class="material-icons-round">person_search</span>
|
||||
主播列表
|
||||
</a>
|
||||
</nav>
|
||||
<div class="p-6 border-t border-slate-100 dark:border-slate-800">
|
||||
<button
|
||||
class="flex items-center gap-3 text-slate-500 hover:text-red-500 transition-colors w-full px-4 py-2">
|
||||
<span class="material-icons-round text-lg">logout</span>
|
||||
<span class="font-medium">退出登录</span>
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
<main class="flex-1 overflow-y-auto p-8 relative">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-4 gap-6 mb-8">
|
||||
<div
|
||||
class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-slate-500">总数量</span>
|
||||
<span class="material-icons-round text-primary/40">analytics</span>
|
||||
</div>
|
||||
<div class="text-3xl font-bold text-slate-900 dark:text-white">0</div>
|
||||
</div>
|
||||
<div
|
||||
class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-slate-500">新建主播</span>
|
||||
<span class="material-icons-round text-secondary/40">person_add</span>
|
||||
</div>
|
||||
<div class="text-3xl font-bold text-slate-900 dark:text-white">0</div>
|
||||
</div>
|
||||
<div
|
||||
class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-slate-500">查询 / 邀请</span>
|
||||
<span class="material-icons-round text-slate-400">compare_arrows</span>
|
||||
</div>
|
||||
<div class="text-3xl font-bold text-slate-900 dark:text-white">0 <span
|
||||
class="text-slate-300 text-lg mx-2">/</span> 0</div>
|
||||
</div>
|
||||
<div
|
||||
class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800 flex flex-col justify-center">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<span
|
||||
class="text-xs font-semibold text-slate-400 uppercase tracking-wider block mb-1">运行时间</span>
|
||||
<div class="text-2xl font-mono font-bold text-primary">00:00:00</div>
|
||||
</div>
|
||||
<button
|
||||
class="bg-primary hover:bg-blue-700 text-white px-4 py-2 rounded-lg text-sm font-semibold transition-all shadow-lg shadow-primary/25">
|
||||
开启TK
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
|
||||
<div class="glass-card p-6 rounded-xl shadow-premium">
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="w-2 h-2 rounded-full bg-red-500"></span>
|
||||
<h3 class="font-bold text-slate-800 dark:text-white">公会账号 A</h3>
|
||||
</div>
|
||||
<span class="text-xs text-slate-500">今日查询: 0</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">账号</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"
|
||||
type="text" value="11111" />
|
||||
</div>
|
||||
<div>
|
||||
<label class="text-xs font-semibold text-slate-500 mb-1 block">密码</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"
|
||||
type="password" value="******" />
|
||||
<span
|
||||
class="material-icons-round absolute right-3 top-2 text-slate-400 text-sm cursor-pointer">visibility_off</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
class="w-full bg-slate-900 dark:bg-slate-700 hover:bg-black text-white py-2.5 rounded-lg font-medium transition-all">登录后台</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="glass-card p-6 rounded-xl shadow-premium">
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="w-2 h-2 rounded-full bg-red-500"></span>
|
||||
<h3 class="font-bold text-slate-800 dark:text-white">公会账号 B</h3>
|
||||
</div>
|
||||
<span class="text-xs text-slate-500">今日查询: 0</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">账号</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"
|
||||
type="text" value="22222" />
|
||||
</div>
|
||||
<div>
|
||||
<label class="text-xs font-semibold text-slate-500 mb-1 block">密码</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"
|
||||
placeholder="请输入登录密码" type="password" />
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
class="w-full bg-slate-900 dark:bg-slate-700 hover:bg-black text-white py-2.5 rounded-lg font-medium transition-all">登录后台</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="bg-white dark:bg-slate-900 rounded-2xl shadow-premium border border-slate-100 dark:border-slate-800 overflow-hidden">
|
||||
<div class="p-6 border-b border-slate-100 dark:border-slate-800 flex justify-between items-center">
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-8 h-8 bg-slate-100 dark:bg-slate-800 rounded-lg flex items-center justify-center">
|
||||
<span
|
||||
class="material-icons-round text-slate-600 dark:text-slate-400 text-lg">settings</span>
|
||||
</div>
|
||||
<h2 class="font-bold text-slate-800 dark:text-white">任务工作台配置</h2>
|
||||
</div>
|
||||
<div class="flex items-center gap-4 text-sm">
|
||||
<div class="text-slate-500">当前网络: <span class="text-primary font-bold">日本</span></div>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-slate-500">指定国家:</span>
|
||||
<select
|
||||
class="bg-slate-50 dark:bg-slate-800 border-none rounded-lg text-xs font-medium focus:ring-0">
|
||||
<option>全部</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-8">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-12 mb-10">
|
||||
<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-primary rounded-full"></span>
|
||||
设置金币数量
|
||||
</h4>
|
||||
<div class="space-y-3">
|
||||
<div
|
||||
class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">最小金币</span>
|
||||
<input
|
||||
class="flex-1 px-4 py-2 text-sm bg-white dark:bg-slate-900 border-none outline-none focus:ring-0"
|
||||
type="number" value="0" />
|
||||
</div>
|
||||
<div
|
||||
class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">最大金币</span>
|
||||
<input
|
||||
class="flex-1 px-4 py-2 text-sm bg-white dark:bg-slate-900 border-none outline-none focus:ring-0"
|
||||
type="number" value="0" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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-secondary rounded-full"></span>
|
||||
设置粉丝数量
|
||||
</h4>
|
||||
<div class="space-y-3">
|
||||
<div
|
||||
class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">最小粉丝</span>
|
||||
<input
|
||||
class="flex-1 px-4 py-2 text-sm bg-white dark:bg-slate-900 border-none outline-none focus:ring-0"
|
||||
type="number" value="0" />
|
||||
</div>
|
||||
<div
|
||||
class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">最大粉丝</span>
|
||||
<input
|
||||
class="flex-1 px-4 py-2 text-sm bg-white dark:bg-slate-900 border-none outline-none focus:ring-0"
|
||||
type="number" value="0" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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>
|
||||
后台查询频率
|
||||
</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"
|
||||
type="number" value="0" />
|
||||
<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">次/小时</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"
|
||||
type="number" value="0" />
|
||||
<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">次/24小时</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="flex flex-col lg:flex-row items-center justify-between gap-8 pt-8 border-t border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center gap-6">
|
||||
<label class="flex items-center gap-2 cursor-pointer group">
|
||||
<input class="w-4 h-4 rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤游戏主播</span>
|
||||
</label>
|
||||
<label class="flex items-center gap-2 cursor-pointer group">
|
||||
<input class="w-4 h-4 rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤带货主播</span>
|
||||
</label>
|
||||
<label class="flex items-center gap-2 cursor-pointer group">
|
||||
<input class="w-4 h-4 rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">排行榜模式</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="flex items-center gap-3">
|
||||
<span class="text-xs font-bold text-slate-500 uppercase tracking-widest">期望邀请上限:</span>
|
||||
<div class="flex p-1 bg-slate-100 dark:bg-slate-800 rounded-lg">
|
||||
<button
|
||||
class="px-4 py-1.5 text-xs font-semibold rounded-md bg-white dark:bg-slate-700 text-primary shadow-sm">设置爬取数量</button>
|
||||
<button
|
||||
class="px-4 py-1.5 text-xs font-semibold rounded-md text-slate-500 hover:text-slate-700">不限爬取数量</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-12 text-center">
|
||||
<button
|
||||
class="bg-slate-900 dark:bg-primary hover:scale-[1.02] active:scale-[0.98] text-white px-12 py-4 rounded-xl font-bold text-lg shadow-xl shadow-slate-900/10 dark:shadow-primary/20 transition-all flex items-center gap-3 mx-auto">
|
||||
<span class="material-icons-round">bolt</span>
|
||||
开始获取数据
|
||||
</button>
|
||||
<p class="mt-4 text-xs font-medium text-emerald-600 dark:text-emerald-400">
|
||||
到期时间: 2036-08-01 00:00:00
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="absolute -top-24 -right-24 w-64 h-64 bg-primary/5 rounded-full blur-3xl pointer-events-none">
|
||||
</div>
|
||||
<div
|
||||
class="absolute -bottom-24 -left-24 w-64 h-64 bg-secondary/5 rounded-full blur-3xl pointer-events-none">
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,176 +1,261 @@
|
||||
<template>
|
||||
<div class="center-line workbenches">
|
||||
<div class="center-align" style="width: 100%; margin: 0 20px;">
|
||||
<div class="box-card-num1 center-line">
|
||||
<div>{{ $t('workbenches.totalnumber') }}: <span>{{ hostData.totalCount }}</span></div>
|
||||
<div>{{ $t('workbenches.createHost') }}: <span>{{ hostData.validAnchorsCount }}</span></div>
|
||||
<div> {{ $t('workbenches.query') }}: <span>{{ hostData.checkedDataCount }}</span></div>
|
||||
<div>{{ $t('workbenches.invite') }}: <span>{{ hostData.canInvitationCount }}</span></div>
|
||||
<div>{{ $t('workbenches.runTime') }}: <span>{{ formattedTime }}</span></div>
|
||||
<div class="grid grid-cols-1 lg:grid-cols-4 gap-4 mb-4">
|
||||
<!-- Stat Cards -->
|
||||
<div class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-slate-500">{{ $t('workbenches.totalnumber') }}</span>
|
||||
<span class="material-icons-round text-primary/40">analytics</span>
|
||||
</div>
|
||||
<div class="center-line" style="padding-top: 15vh;">
|
||||
<el-button class="open-login" type="primary" @click="openTK">{{ $t('workbenches.openTK') }}</el-button>
|
||||
<!-- <el-button class="open-login" type="primary" @click="startTimer">计时开始</el-button> -->
|
||||
<div class="text-3xl font-bold text-slate-900 dark:text-white">{{ hostData.totalCount }}</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-slate-500">{{ $t('workbenches.createHost') }}</span>
|
||||
<span class="material-icons-round text-secondary/40">person_add</span>
|
||||
</div>
|
||||
<div class="text-3xl font-bold text-slate-900 dark:text-white">{{ hostData.validAnchorsCount }}</div>
|
||||
</div>
|
||||
<div class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-slate-500">{{ $t('workbenches.query') }} / {{ $t('workbenches.invite')
|
||||
}}</span>
|
||||
<span class="material-icons-round text-slate-400">compare_arrows</span>
|
||||
</div>
|
||||
<div class="text-3xl font-bold text-slate-900 dark:text-white">{{ hostData.checkedDataCount }} <span
|
||||
class="text-slate-300 text-lg mx-2">/</span> {{ hostData.canInvitationCount }}</div>
|
||||
</div>
|
||||
<div
|
||||
class="bg-white dark:bg-slate-900 p-6 rounded-xl shadow-premium border border-slate-100 dark:border-slate-800 flex flex-col justify-center">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
|
||||
<el-card class="box-card-num" v-for="(item, index) in 2" :key="index">
|
||||
<div class="center-justify">
|
||||
<div class="from-input-item">
|
||||
<div class="from-input-item-title center-justify">
|
||||
{{ $t('workbenches.guildAccount') }}:
|
||||
<span class="text-xs font-semibold text-slate-400 uppercase tracking-wider block mb-1">{{
|
||||
$t('workbenches.runTime') }}</span>
|
||||
<div class="text-2xl font-mono font-bold text-primary">{{ formattedTime }}</div>
|
||||
</div>
|
||||
<el-input :disabled="!(tkData[index].code == 0 && !isLogin[index])"
|
||||
v-model="tkData[index].account" :placeholder="$t('workbenches.guildAccountPlace')"
|
||||
clearable />
|
||||
<button @click="openTK"
|
||||
class="bg-primary hover:bg-blue-700 text-white px-4 py-2 rounded-lg text-sm font-semibold transition-all shadow-lg shadow-primary/25">
|
||||
{{ $t('workbenches.openTK') }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="from-input-item">
|
||||
<div class="from-input-item-title center-justify">
|
||||
{{ $t('workbenches.guildPass') }}:
|
||||
</div>
|
||||
<el-input :disabled="!(tkData[index].code == 0 && !isLogin[index])"
|
||||
v-model="tkData[index].password" type="password"
|
||||
:placeholder="$t('workbenches.guildPassPlace')" show-password />
|
||||
</div>
|
||||
|
||||
<el-button class="open-login" style="margin-left: 60px;"
|
||||
:disabled="!(tkData[index].code == 0 && !isLogin[index])" type="primary"
|
||||
@click="loginTK(index)">{{ $t('workbenches.loginBackend') }}</el-button>
|
||||
<div v-if="tkData[index].code == 0" class="loginState"></div>
|
||||
<div v-if="tkData[index].code == 1" class="loginState" style="background-color: green;"></div>
|
||||
|
||||
</div>
|
||||
<div class="todayCount"> {{ $t('workbenches.queriedNum') }}:{{ tkData[index].num }}</div>
|
||||
</el-card>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container ">
|
||||
<!-- 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="glass-card p-5 rounded-xl shadow-premium">
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="w-2 h-2 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-xs text-slate-500">{{ $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>
|
||||
|
||||
<el-card class="box-card">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="center-justify"><img src="@/assets/worklogo.png">
|
||||
{{ $t('workbenchesSetup.workbenches') }} </span>
|
||||
<div class="card-header-right">
|
||||
<!-- Configuration Panel -->
|
||||
<div
|
||||
class="bg-white dark:bg-slate-900 rounded-2xl shadow-premium border border-slate-100 dark:border-slate-800 overflow-hidden">
|
||||
<div class="p-6 border-b border-slate-100 dark:border-slate-800 flex justify-between items-center">
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-8 h-8 bg-slate-100 dark:bg-slate-800 rounded-lg flex items-center justify-center">
|
||||
<span class="material-icons-round text-slate-600 dark:text-slate-400 text-lg">settings</span>
|
||||
</div>
|
||||
<h2 class="font-bold text-slate-800 dark:text-white">{{ $t('workbenchesSetup.workbenches') }}</h2>
|
||||
</div>
|
||||
<div class="flex items-center gap-4 text-sm">
|
||||
<div class="text-slate-500">{{ $t('workbenchesSetup.network') }}: <span class="text-primary font-bold">{{ locale
|
||||
== 'zh' ? countryData : countryDataEN }}</span></div>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-slate-500">指定国家:</span>
|
||||
<select v-model="country_info"
|
||||
class="bg-slate-50 dark:bg-slate-800 border-none rounded-lg text-xs font-medium focus:ring-0">
|
||||
<option value="全部">全部</option>
|
||||
<option v-for="(item, index) in country_Lst" :key="index" :value="item">{{ item }}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-4 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">
|
||||
<span class="w-1 h-4 bg-primary rounded-full"></span>
|
||||
{{ $t('workbenchesSetup.setCoinsNum') }}
|
||||
</h4>
|
||||
<div class="space-y-3">
|
||||
<div class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">{{
|
||||
$t('workbenchesSetup.minCoinsNum') }}</span>
|
||||
<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.gold.min" :disabled="!pyData.isStart" />
|
||||
</div>
|
||||
<div class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">{{
|
||||
$t('workbenchesSetup.maxCoinsNum') }}</span>
|
||||
<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.gold.max" :disabled="!pyData.isStart" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span>
|
||||
{{ $t('workbenchesSetup.network') }}:{{ locale == 'zh' ? countryData : countryDataEN }}
|
||||
</span>
|
||||
<!-- Fans -->
|
||||
<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-secondary rounded-full"></span>
|
||||
{{ $t('workbenchesSetup.setFansNum') }}
|
||||
</h4>
|
||||
<div class="space-y-3">
|
||||
<div class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">{{
|
||||
$t('workbenchesSetup.minFansNum') }}</span>
|
||||
<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.fans.min" :disabled="!pyData.isStart" />
|
||||
</div>
|
||||
<div class="flex shadow-sm rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700">
|
||||
<span
|
||||
class="bg-slate-50 dark:bg-slate-800 px-3 py-2 text-xs font-medium text-slate-500 w-28 flex items-center border-r border-slate-200 dark:border-slate-700">{{
|
||||
$t('workbenchesSetup.maxFansNum') }}</span>
|
||||
<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.fans.max" :disabled="!pyData.isStart" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<img style="height: 20px;" v-if="isWifi" src="@/assets/wifi.png">
|
||||
<!-- 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>
|
||||
|
||||
<span class="inline-country">
|
||||
<span style="color: black;">指定国家</span>
|
||||
<el-select v-model="country_info" class="country-select" placeholder="全部" size="small">
|
||||
<el-option :label="'全部'" :value="'地区全部'" />
|
||||
<el-option v-for="(item, index) in country_Lst" :key="index" :label="item"
|
||||
:value="item" />
|
||||
</el-select>
|
||||
</span>
|
||||
<!-- 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">
|
||||
<label class="flex items-center gap-2 cursor-pointer group">
|
||||
<input class="w-4 h-4 rounded border-slate-300 text-primary focus:ring-primary/20" type="checkbox"
|
||||
v-model="pyData.filterGame" :disabled="!pyData.isStart" />
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤游戏主播</span>
|
||||
</label>
|
||||
<label class="flex items-center gap-2 cursor-pointer group">
|
||||
<input class="w-4 h-4 rounded border-slate-300 text-primary focus:ring-primary/20" type="checkbox"
|
||||
v-model="pyData.filterSelling" :disabled="!pyData.isStart" />
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤带货主播</span>
|
||||
</label>
|
||||
<label class="flex items-center gap-2 cursor-pointer group">
|
||||
<input class="w-4 h-4 rounded border-slate-300 text-primary focus:ring-primary/20" type="checkbox"
|
||||
v-model="pyData.rankingList" :disabled="!pyData.isStart" />
|
||||
<span
|
||||
class="text-sm text-slate-600 dark:text-slate-400 group-hover:text-primary transition-colors">过滤排行榜单</span>
|
||||
</label>
|
||||
</div>
|
||||
</template>
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="6">
|
||||
<div class="input-group">
|
||||
<label>{{ $t('workbenchesSetup.setCoinsNum') }}</label>
|
||||
<el-input type='number' v-model="pyData.gold.min" :min="0" :max="pyData.gold.max - 1"
|
||||
:placeholder="$t('workbenchesSetup.minCoinsNum')" style="width: 100%"
|
||||
:disabled="!pyData.isStart">
|
||||
<template #prepend>{{ $t('workbenchesSetup.minCoinsNum') }}</template>
|
||||
</el-input>
|
||||
<el-input type='number' v-model="pyData.gold.max" :min="pyData.gold.min + 1" :max="100"
|
||||
:placeholder="$t('workbenchesSetup.maxCoinsNum')" style="width: 100%; margin-top: 10px"
|
||||
:disabled="!pyData.isStart">
|
||||
<template #prepend>{{ $t('workbenchesSetup.maxCoinsNum') }}</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<div class="input-group">
|
||||
<label>{{ $t('workbenchesSetup.setFansNum') }}</label>
|
||||
<el-input type='number' v-model="pyData.fans.min" :min="0" :max="pyData.fans.max - 1"
|
||||
:placeholder="$t('workbenchesSetup.minFansNum')" style="width: 100%"
|
||||
:disabled="!pyData.isStart">
|
||||
<template #prepend>{{ $t('workbenchesSetup.minFansNum') }}</template>
|
||||
</el-input>
|
||||
<el-input type='number' v-model="pyData.fans.max" :min="pyData.fans.min + 1" :max="100"
|
||||
:placeholder="$t('workbenchesSetup.maxFansNum')" style="width: 100%; margin-top: 10px"
|
||||
:disabled="!pyData.isStart">
|
||||
<template #prepend>{{ $t('workbenchesSetup.maxFansNum') }}</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<div class="input-group">
|
||||
<label>{{ $t('workbenchesSetup.setQuery') }}</label>
|
||||
<!-- <el-input type='number' v-model="pyData.frequency.hour" @input="handleInputHour" -->
|
||||
<el-input type='number' v-model="pyData.frequency.hour"
|
||||
:placeholder="$t('workbenchesSetup.hour')" style="width: 100%"
|
||||
:disabled="!pyData.isStart">
|
||||
<template #append>{{ $t('workbenchesSetup.hour') }}</template>
|
||||
</el-input>
|
||||
<!-- <el-input type='number' v-model="pyData.frequency.day" @input="handleInputDay" -->
|
||||
<el-input type='number' v-model="pyData.frequency.day"
|
||||
:placeholder="$t('workbenchesSetup.hour24')" style="width: 100%; margin-top: 10px"
|
||||
:disabled="!pyData.isStart">
|
||||
<template #append>{{ $t('workbenchesSetup.hour24') }}</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<div class="input-group">
|
||||
<label>{{ $t('workbenchesSetup.setNum') }}</label>
|
||||
<label style="color: #00000070; font-size: 15px;">({{ $t('workbenchesSetup.prompt')
|
||||
}})</label>
|
||||
<el-button type="primary" @click="isLimit = true" :disabled="!pyData.isStart">{{
|
||||
$t('workbenchesSetup.setHostNum')
|
||||
}}</el-button>
|
||||
<el-button type="info" @click="isLimit = false" :disabled="!pyData.isStart">{{
|
||||
$t('workbenchesSetup.unlimitedQuantity')
|
||||
}}</el-button>
|
||||
<!-- <el-input type='number' v-model="pyData.frequency.hour" @input="handleInputHour" -->
|
||||
<div v-if="isLimit" class="center-justify">
|
||||
<el-input type='number' v-model="hostNum" :placeholder="$t('workbenchesSetup.num')"
|
||||
style="width: 100% ;" :disabled="!pyData.isStart">
|
||||
<template #append>{{ $t('workbenchesSetup.num') }}</template>
|
||||
</el-input>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div class="center-line" style="margin-top: 0px; text-align: center">
|
||||
<div class="center-justify">
|
||||
<el-checkbox @click="console.log(pyData)" :disabled="!pyData.isStart"
|
||||
v-model="pyData.filterGame" label="过滤游戏主播" border />
|
||||
<el-checkbox @click="console.log(pyData)" :disabled="!pyData.isStart"
|
||||
v-model="pyData.filterSelling" label="过滤带货主播" border />
|
||||
<el-checkbox @click="console.log(pyData)" :disabled="!pyData.isStart"
|
||||
v-model="pyData.rankingList" label="排行榜" border />
|
||||
</div>
|
||||
<el-button class="submit-button" :disabled="false" v-show="pyData.isStart" type="primary"
|
||||
@click="submit">{{
|
||||
$t('workbenchesSetup.start') }}</el-button>
|
||||
<el-button v-show="!pyData.isStart" type="danger" @click="unsubmit">{{
|
||||
$t('workbenchesSetup.stop') }}</el-button>
|
||||
|
||||
</div>
|
||||
|
||||
</el-card>
|
||||
</div>
|
||||
<div style="color: green;">
|
||||
<div class="mt-6 text-center">
|
||||
<button v-if="pyData.isStart" @click="submit"
|
||||
class="bg-slate-900 dark:bg-primary hover:scale-[1.02] active:scale-[0.98] text-white px-10 py-3 rounded-xl font-bold text-lg shadow-xl shadow-slate-900/10 dark:shadow-primary/20 transition-all flex items-center gap-2 mx-auto">
|
||||
<span class="material-icons-round">bolt</span>
|
||||
{{ $t('workbenchesSetup.start') }}
|
||||
</button>
|
||||
<button v-else @click="unsubmit"
|
||||
class="bg-red-500 hover:bg-red-600 hover:scale-[1.02] active:scale-[0.98] text-white px-12 py-4 rounded-xl font-bold text-lg shadow-xl shadow-red-500/20 transition-all flex items-center gap-3 mx-auto">
|
||||
<span class="material-icons-round">stop</span>
|
||||
{{ $t('workbenchesSetup.stop') }}
|
||||
</button>
|
||||
<p class="mt-4 text-xs font-medium text-emerald-600 dark:text-emerald-400">
|
||||
到期时间: {{ timestampToTime(expiredTime) }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@@ -400,7 +485,7 @@ const submit = () => {
|
||||
isStart: true,
|
||||
filterSelling: pyData.value.filterSelling,
|
||||
filterGame: pyData.value.filterGame,
|
||||
rankingList: pyData.value.rankingList,
|
||||
rankingList: !pyData.value.rankingList,
|
||||
country: countryData.value,
|
||||
tenantId: getUser().tenantId,
|
||||
userId: getUser().id,
|
||||
@@ -452,7 +537,7 @@ const unsubmit = () => {
|
||||
isStart: false,
|
||||
filterSelling: pyData.value.filterSelling,
|
||||
filterGame: pyData.value.filterGame,
|
||||
rankingList: pyData.value.rankingList,
|
||||
rankingList: !pyData.value.rankingList,
|
||||
country: countryData.value,
|
||||
tenantId: getUser().tenantId,
|
||||
userId: getUser().id,
|
||||
@@ -696,257 +781,9 @@ const checkVPN = async () => {
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="less">
|
||||
.container {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.workbenches {
|
||||
padding: 45px 29px 22px 27px;
|
||||
|
||||
/* 页面无法选中 */
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.box-card {
|
||||
// width: 1240px;
|
||||
height: 436px;
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0px 0px 21px 0px rgba(183, 183, 183, 0.33);
|
||||
border-radius: 24px;
|
||||
}
|
||||
|
||||
.box-card-num1 {
|
||||
|
||||
width: 197px;
|
||||
height: 321px;
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0px 0px 21px 0px rgba(183, 183, 183, 0.33);
|
||||
border-radius: 24px;
|
||||
// padding-top: 60px;
|
||||
box-sizing: border-box;
|
||||
|
||||
div {
|
||||
height: 20%;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
|
||||
color: #8D8E8E;
|
||||
|
||||
span {
|
||||
color: #000;
|
||||
padding-left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.box-card-num {
|
||||
width: 897px;
|
||||
height: 145px;
|
||||
background: #FFFFFF;
|
||||
box-shadow: 0px 0px 21px 0px rgba(183, 183, 183, 0.33);
|
||||
border-radius: 24px;
|
||||
margin-bottom: 30px;
|
||||
|
||||
padding-top: 18px;
|
||||
box-sizing: border-box;
|
||||
|
||||
.todayCount {
|
||||
padding: 15px 21px;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.from-input-item {
|
||||
display: flex;
|
||||
|
||||
.from-input-item-title {
|
||||
color: #000000;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
width: 100px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.loginButton {
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.loginState {
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
border-radius: 50%;
|
||||
background-color: #b90000;
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.card-header-right {
|
||||
margin-right: 70px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
/* 各个块之间的间距 */
|
||||
white-space: nowrap;
|
||||
|
||||
|
||||
|
||||
/* 整个右侧区域不换行 */
|
||||
span {
|
||||
color: #0013b9;
|
||||
}
|
||||
}
|
||||
|
||||
.inline-country {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
/* “指定国家” 和 select 的间距 */
|
||||
}
|
||||
|
||||
.country-select {
|
||||
min-width: 120px;
|
||||
/* 防止 select 太窄,文字被挤没 */
|
||||
}
|
||||
|
||||
span {
|
||||
font-family: Source Han Sans SC;
|
||||
font-weight: 400;
|
||||
font-size: 20px;
|
||||
color: #2D2727;
|
||||
line-height: 37px;
|
||||
|
||||
img {
|
||||
margin-right: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.input-group {
|
||||
margin-bottom: 20px;
|
||||
height: 100%;
|
||||
|
||||
.el-input {
|
||||
margin: 22px 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
.open-login {
|
||||
width: 100px;
|
||||
height: 47px;
|
||||
background: @btn-bg-color;
|
||||
border-radius: 10px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.reset-button {
|
||||
width: 132px;
|
||||
height: 47px;
|
||||
background: @btn-bg-color;
|
||||
border-radius: 10px;
|
||||
|
||||
font-family: Source Han Sans SC;
|
||||
font-weight: 400;
|
||||
font-size: 18px;
|
||||
color: #FFFFFF;
|
||||
|
||||
margin-left: 50px;
|
||||
}
|
||||
|
||||
.submit-button {
|
||||
width: 160px;
|
||||
height: 47px;
|
||||
background: @bg-color;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.center-line {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
// justify-content: center;
|
||||
}
|
||||
|
||||
.center-justify {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.center-align {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
|
||||
}
|
||||
|
||||
.center-flex {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<style scoped lang="less">
|
||||
::v-deep(.el-input-group__prepend) {
|
||||
background: @bg-color-light;
|
||||
border-radius: 10px 0px 0px 10px;
|
||||
border: 1px solid #B7CEC5;
|
||||
font-family: Source Han Sans SC;
|
||||
font-weight: 400;
|
||||
font-size: 18px;
|
||||
color: #FFFFFF;
|
||||
line-height: 37px;
|
||||
}
|
||||
|
||||
::v-deep(.el-input-group__append) {
|
||||
background: @bg-color-light;
|
||||
border-radius: 0px 10px 10px 0px;
|
||||
border: 1px solid #B7CEC5;
|
||||
font-family: Source Han Sans SC;
|
||||
font-weight: 400;
|
||||
font-size: 18px;
|
||||
color: #FFFFFF;
|
||||
line-height: 37px;
|
||||
}
|
||||
|
||||
::v-deep(.el-input__wrapper) {
|
||||
width: 218px;
|
||||
height: 44px;
|
||||
}
|
||||
|
||||
.el-input {
|
||||
width: 200px;
|
||||
height: 48px;
|
||||
background: #FFFFFF;
|
||||
border-radius: 10px;
|
||||
border: 1px solid #B7CEC5;
|
||||
}
|
||||
|
||||
.el-checkbox {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
/* 水平居中 */
|
||||
align-items: center;
|
||||
/* 垂直居中 */
|
||||
/* 示例高度,根据需要调整 */
|
||||
}
|
||||
<style scoped>
|
||||
/*
|
||||
Most styles are replaced by Tailwind utility classes.
|
||||
We can keep specific overrides or custom animations here if needed.
|
||||
*/
|
||||
</style>
|
||||
440
src/views/hosttest.html
Normal file
440
src/views/hosttest.html
Normal file
@@ -0,0 +1,440 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
|
||||
<title>Yolo Assistant - Modern Light-Tech Dashboard</title>
|
||||
<link href="https://fonts.googleapis.com" rel="preconnect" />
|
||||
<link crossorigin="" href="https://fonts.gstatic.com" rel="preconnect" />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
|
||||
rel="stylesheet" />
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Round" rel="stylesheet" />
|
||||
<script src="https://cdn.tailwindcss.com?plugins=forms,typography"></script>
|
||||
<script>
|
||||
tailwind.config = {
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: "#0052CC",
|
||||
"background-light": "#F4F7FA",
|
||||
"background-dark": "#0B1120",
|
||||
"tech-blue": "#E3F2FD",
|
||||
"tech-green": "#E8F5E9",
|
||||
"tech-orange": "#FFF3E0",
|
||||
},
|
||||
fontFamily: {
|
||||
display: ["Inter", "system-ui", "sans-serif"],
|
||||
},
|
||||
borderRadius: {
|
||||
DEFAULT: "12px",
|
||||
'xl': '20px',
|
||||
},
|
||||
boxShadow: {
|
||||
'soft-inner': 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.05)',
|
||||
'premium': '0 10px 25px -5px rgba(0, 0, 0, 0.04), 0 8px 10px -6px rgba(0, 0, 0, 0.04)',
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
|
||||
.glass-card {
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
backdrop-filter: blur(12px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.sidebar-active {
|
||||
background: white;
|
||||
color: #0052CC !important;
|
||||
border-radius: 40px 0 0 40px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.sidebar-active::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: -20px;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 20px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.sidebar-active::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: -40px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
box-shadow: 20px 20px 0 0 white;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.sidebar-active-footer::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: -40px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
box-shadow: 20px -20px 0 0 white;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #CBD5E1;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: #94A3B8;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="bg-slate-900 font-display text-slate-900 antialiased overflow-hidden">
|
||||
<div class="flex h-screen">
|
||||
<aside class="w-64 flex flex-col pt-8 pb-10 bg-slate-900 shrink-0">
|
||||
<div class="px-8 mb-12">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-3xl font-bold tracking-tighter text-white">yolo</span>
|
||||
<span
|
||||
class="px-2 py-0.5 text-xs font-semibold tracking-wider text-slate-900 bg-white rounded uppercase">助手</span>
|
||||
</div>
|
||||
</div>
|
||||
<nav class="flex-1 space-y-2 pl-4">
|
||||
<a class="flex items-center gap-4 px-6 py-4 text-slate-400 hover:text-slate-200 transition-all duration-200 group"
|
||||
href="#">
|
||||
<span class="material-icons-round text-2xl">grid_view</span>
|
||||
<span class="font-medium">工作台</span>
|
||||
</a>
|
||||
<div class="relative">
|
||||
<a class="sidebar-active flex items-center gap-4 px-6 py-4 text-primary transition-all duration-200"
|
||||
href="#">
|
||||
<span class="material-icons-round text-2xl">person_search</span>
|
||||
<span class="font-medium">主播列表</span>
|
||||
</a>
|
||||
<div class="sidebar-active-footer"></div>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="px-8 mt-auto">
|
||||
<button
|
||||
class="flex items-center gap-3 text-slate-400 hover:text-red-400 transition-colors duration-200 group">
|
||||
<span class="material-icons-round text-xl group-hover:rotate-12 transition-transform">logout</span>
|
||||
<span class="font-medium">退出登录</span>
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
<main class="flex-1 bg-white dark:bg-slate-50 m-2 rounded-3xl shadow-2xl flex flex-col overflow-hidden">
|
||||
<header class="px-8 py-6 border-b border-slate-100 dark:border-slate-200/60 bg-white/50 backdrop-blur-md">
|
||||
<div class="flex flex-wrap items-center gap-4">
|
||||
<div class="relative flex-1 min-w-[200px]">
|
||||
<select
|
||||
class="w-full bg-slate-50 border-none rounded-xl py-3 pl-4 pr-10 text-sm text-slate-600 appearance-none focus:ring-2 focus:ring-primary/20 shadow-soft-inner">
|
||||
<option>选择国家</option>
|
||||
<option>哈萨克斯坦</option>
|
||||
<option>土库曼斯坦</option>
|
||||
<option>摩尔多瓦</option>
|
||||
</select>
|
||||
<span
|
||||
class="material-icons-round absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none">expand_more</span>
|
||||
</div>
|
||||
<div class="relative flex-1 min-w-[200px]">
|
||||
<span
|
||||
class="material-icons-round absolute left-3 top-1/2 -translate-y-1/2 text-slate-400 text-sm">calendar_today</span>
|
||||
<input
|
||||
class="w-full bg-slate-50 border-none rounded-xl py-3 pl-10 pr-4 text-sm text-slate-600 focus:ring-2 focus:ring-primary/20 shadow-soft-inner"
|
||||
placeholder="选择查询时间" type="text" />
|
||||
</div>
|
||||
<div class="relative flex-[1.5] min-w-[240px]">
|
||||
<input
|
||||
class="w-full bg-slate-50 border-none rounded-xl py-3 px-4 text-sm text-slate-600 focus:ring-2 focus:ring-primary/20 shadow-soft-inner"
|
||||
placeholder="请输入主播id" type="text" />
|
||||
</div>
|
||||
<div class="flex items-center gap-2 ml-auto">
|
||||
<button
|
||||
class="bg-primary hover:bg-blue-700 text-white px-8 py-3 rounded-xl font-medium text-sm transition-all shadow-lg shadow-primary/20 flex items-center gap-2">
|
||||
<span class="material-icons-round text-sm">search</span>
|
||||
查询
|
||||
</button>
|
||||
<button class="bg-slate-100 hover:bg-slate-200 text-slate-600 p-3 rounded-xl transition-all">
|
||||
<span class="material-icons-round">tune</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="flex-1 overflow-auto p-8">
|
||||
<table class="w-full text-left border-separate border-spacing-0">
|
||||
<thead>
|
||||
<tr class="text-slate-400 text-xs font-semibold uppercase tracking-wider">
|
||||
<th class="pb-4 pl-4 font-normal"><input
|
||||
class="rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" /></th>
|
||||
<th class="pb-4 font-semibold">主播ID</th>
|
||||
<th class="pb-4 font-semibold">等级</th>
|
||||
<th class="pb-4 font-semibold">邀请类型</th>
|
||||
<th class="pb-4 font-semibold">数据查看</th>
|
||||
<th class="pb-4 font-semibold">国家</th>
|
||||
<th class="pb-4 font-semibold">创建时间</th>
|
||||
<th class="pb-4 font-semibold">主播金币</th>
|
||||
<th class="pb-4 font-semibold text-right pr-4">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-sm text-slate-600">
|
||||
<tr class="group hover:bg-slate-50/80 transition-colors">
|
||||
<td class="py-5 pl-4 border-b border-slate-50 group-last:border-none">
|
||||
<input class="rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="font-medium text-slate-900 border-b border-transparent group-hover:border-primary/30 transition-all cursor-pointer">kisimisi1990</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">D5</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="px-3 py-1 bg-green-50 text-green-600 text-[10px] font-bold uppercase rounded-full">普票</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex gap-2">
|
||||
<button
|
||||
class="px-3 py-1.5 bg-blue-50 text-blue-600 hover:bg-blue-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看场次</button>
|
||||
<button
|
||||
class="px-3 py-1.5 bg-sky-50 text-sky-600 hover:bg-sky-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看收益</button>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">哈萨克斯坦</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex flex-col">
|
||||
<span>2026-01-13</span>
|
||||
<span class="text-[10px] text-slate-400">20:23:52</span>
|
||||
</div>
|
||||
</td>
|
||||
<td
|
||||
class="py-5 border-b border-slate-50 group-last:border-none font-semibold text-slate-900">
|
||||
1260</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none text-right pr-4">
|
||||
<button class="p-1 hover:bg-slate-200 rounded transition-colors text-slate-400">
|
||||
<span class="material-icons-round text-lg">more_horiz</span>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="group hover:bg-slate-50/80 transition-colors">
|
||||
<td class="py-5 pl-4 border-b border-slate-50 group-last:border-none">
|
||||
<input class="rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="font-medium text-slate-900 border-b border-transparent group-hover:border-primary/30 transition-all cursor-pointer">maga44458</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">D5</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="px-3 py-1 bg-green-50 text-green-600 text-[10px] font-bold uppercase rounded-full">普票</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex gap-2">
|
||||
<button
|
||||
class="px-3 py-1.5 bg-blue-50 text-blue-600 hover:bg-blue-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看场次</button>
|
||||
<button
|
||||
class="px-3 py-1.5 bg-sky-50 text-sky-600 hover:bg-sky-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看收益</button>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">土库曼斯坦</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex flex-col">
|
||||
<span>2026-01-13</span>
|
||||
<span class="text-[10px] text-slate-400">20:23:52</span>
|
||||
</div>
|
||||
</td>
|
||||
<td
|
||||
class="py-5 border-b border-slate-50 group-last:border-none font-semibold text-slate-900">
|
||||
3006</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none text-right pr-4">
|
||||
<button class="p-1 hover:bg-slate-200 rounded transition-colors text-slate-400">
|
||||
<span class="material-icons-round text-lg">more_horiz</span>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="group hover:bg-slate-50/80 transition-colors">
|
||||
<td class="py-5 pl-4 border-b border-slate-50 group-last:border-none">
|
||||
<input class="rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="font-medium text-slate-900 border-b border-transparent group-hover:border-primary/30 transition-all cursor-pointer">erke_700</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">B5</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="px-3 py-1 bg-amber-50 text-amber-600 text-[10px] font-bold uppercase rounded-full">金票</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex gap-2">
|
||||
<button
|
||||
class="px-3 py-1.5 bg-blue-50 text-blue-600 hover:bg-blue-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看场次</button>
|
||||
<button
|
||||
class="px-3 py-1.5 bg-sky-50 text-sky-600 hover:bg-sky-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看收益</button>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">哈萨克斯坦</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex flex-col">
|
||||
<span>2026-01-13</span>
|
||||
<span class="text-[10px] text-slate-400">20:23:49</span>
|
||||
</div>
|
||||
</td>
|
||||
<td
|
||||
class="py-5 border-b border-slate-50 group-last:border-none font-semibold text-slate-900">
|
||||
5572</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none text-right pr-4">
|
||||
<button class="p-1 hover:bg-slate-200 rounded transition-colors text-slate-400">
|
||||
<span class="material-icons-round text-lg">more_horiz</span>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="group hover:bg-slate-50/80 transition-colors">
|
||||
<td class="py-5 pl-4 border-b border-slate-50 group-last:border-none">
|
||||
<input class="rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="font-medium text-slate-900 border-b border-transparent group-hover:border-primary/30 transition-all cursor-pointer">luckystar1458</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">D1</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="px-3 py-1 bg-green-50 text-green-600 text-[10px] font-bold uppercase rounded-full">普票</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex gap-2">
|
||||
<button
|
||||
class="px-3 py-1.5 bg-blue-50 text-blue-600 hover:bg-blue-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看场次</button>
|
||||
<button
|
||||
class="px-3 py-1.5 bg-sky-50 text-sky-600 hover:bg-sky-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看收益</button>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">摩尔多瓦</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex flex-col">
|
||||
<span>2026-01-13</span>
|
||||
<span class="text-[10px] text-slate-400">20:23:50</span>
|
||||
</div>
|
||||
</td>
|
||||
<td
|
||||
class="py-5 border-b border-slate-50 group-last:border-none font-semibold text-slate-900">
|
||||
15107</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none text-right pr-4">
|
||||
<button class="p-1 hover:bg-slate-200 rounded transition-colors text-slate-400">
|
||||
<span class="material-icons-round text-lg">more_horiz</span>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="group hover:bg-slate-50/80 transition-colors">
|
||||
<td class="py-5 pl-4 border-b border-slate-50 group-last:border-none">
|
||||
<input class="rounded border-slate-300 text-primary focus:ring-primary/20"
|
||||
type="checkbox" />
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="font-medium text-slate-900 border-b border-transparent group-hover:border-primary/30 transition-all cursor-pointer">boss.667b1</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">C5</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<span
|
||||
class="px-3 py-1 bg-amber-50 text-amber-600 text-[10px] font-bold uppercase rounded-full">金票</span>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex gap-2">
|
||||
<button
|
||||
class="px-3 py-1.5 bg-blue-50 text-blue-600 hover:bg-blue-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看场次</button>
|
||||
<button
|
||||
class="px-3 py-1.5 bg-sky-50 text-sky-600 hover:bg-sky-600 hover:text-white rounded-lg text-xs font-medium transition-all">查看收益</button>
|
||||
</div>
|
||||
</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">哈萨克斯坦</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none">
|
||||
<div class="flex flex-col">
|
||||
<span>2026-01-13</span>
|
||||
<span class="text-[10px] text-slate-400">20:23:49</span>
|
||||
</div>
|
||||
</td>
|
||||
<td
|
||||
class="py-5 border-b border-slate-50 group-last:border-none font-semibold text-slate-900">
|
||||
4815</td>
|
||||
<td class="py-5 border-b border-slate-50 group-last:border-none text-right pr-4">
|
||||
<button class="p-1 hover:bg-slate-200 rounded transition-colors text-slate-400">
|
||||
<span class="material-icons-round text-lg">more_horiz</span>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<footer
|
||||
class="px-8 py-6 border-t border-slate-100 dark:border-slate-200/60 bg-white/50 backdrop-blur-md flex flex-wrap items-center justify-between gap-4">
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="relative">
|
||||
<select
|
||||
class="bg-slate-50 border-none rounded-lg py-2 pl-4 pr-10 text-sm text-slate-600 appearance-none focus:ring-2 focus:ring-primary/20 shadow-soft-inner">
|
||||
<option>10/page</option>
|
||||
<option>20/page</option>
|
||||
<option>50/page</option>
|
||||
</select>
|
||||
<span
|
||||
class="material-icons-round absolute right-2 top-1/2 -translate-y-1/2 text-slate-400 text-sm pointer-events-none">expand_more</span>
|
||||
</div>
|
||||
<span class="text-xs text-slate-400 font-medium">到期时间: <span class="text-green-600">2036-08-01
|
||||
00:00:00</span></span>
|
||||
</div>
|
||||
<div class="flex items-center gap-1">
|
||||
<button class="p-2 text-slate-400 hover:bg-slate-100 rounded-lg transition-colors">
|
||||
<span class="material-icons-round text-lg">chevron_left</span>
|
||||
</button>
|
||||
<button
|
||||
class="w-8 h-8 rounded-lg bg-slate-900 text-white text-xs font-bold transition-all shadow-md">1</button>
|
||||
<button
|
||||
class="w-8 h-8 rounded-lg hover:bg-slate-100 text-slate-600 text-xs font-semibold transition-all">2</button>
|
||||
<button
|
||||
class="w-8 h-8 rounded-lg hover:bg-slate-100 text-slate-600 text-xs font-semibold transition-all">3</button>
|
||||
<button
|
||||
class="w-8 h-8 rounded-lg hover:bg-slate-100 text-slate-600 text-xs font-semibold transition-all">4</button>
|
||||
<button
|
||||
class="w-8 h-8 rounded-lg hover:bg-slate-100 text-slate-600 text-xs font-semibold transition-all">5</button>
|
||||
<button
|
||||
class="w-8 h-8 rounded-lg hover:bg-slate-100 text-slate-600 text-xs font-semibold transition-all">6</button>
|
||||
<span class="px-2 text-slate-400 text-xs font-bold">...</span>
|
||||
<button
|
||||
class="w-8 h-8 rounded-lg hover:bg-slate-100 text-slate-600 text-xs font-semibold transition-all">46</button>
|
||||
<button class="p-2 text-slate-400 hover:bg-slate-100 rounded-lg transition-colors">
|
||||
<span class="material-icons-round text-lg">chevron_right</span>
|
||||
</button>
|
||||
</div>
|
||||
</footer>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,89 +1,48 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<Sidebar class="noneText" @activeIndex="activeIndexFn" />
|
||||
<div class="content ">
|
||||
<div v-show="activeIndexA == 1">
|
||||
<div class="bg-background-light dark:bg-background-dark text-slate-800 dark:text-slate-200 subtle-grid shadow-2xl overflow-hidden mx-auto" style="width: 1600px; height: 900px;">
|
||||
<div class="flex h-full overflow-hidden">
|
||||
<Sidebar class="flex-none h-full" @activeIndex="activeIndexFn" />
|
||||
<main class="flex-1 overflow-y-auto p-4 relative flex flex-col h-full bg-[#f3f5f9]">
|
||||
<div v-show="activeIndexA == 1" class="h-full">
|
||||
<workbenches />
|
||||
</div>
|
||||
<div v-show="activeIndexA == 2">
|
||||
<div v-show="activeIndexA == 2" class="h-full">
|
||||
<hostsList />
|
||||
</div>
|
||||
<div style="position: absolute; bottom: 0; right: 0;">{{ version }}</div>
|
||||
|
||||
<!-- Decorative blobs -->
|
||||
<!-- <div class="absolute -top-24 -right-24 w-64 h-64 bg-primary/5 rounded-full blur-3xl pointer-events-none"></div> -->
|
||||
<!-- <div class="absolute -bottom-24 -left-24 w-64 h-64 bg-secondary/5 rounded-full blur-3xl pointer-events-none"></div> -->
|
||||
|
||||
<!-- <div class="absolute bottom-2 right-4 text-xs text-slate-400">{{ version }}</div> -->
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Sidebar from '../components/Sidebar.vue';
|
||||
import { RouterLink, RouterView } from 'vue-router'
|
||||
import hostsList from '@/views/hosts/hostsList.vue'
|
||||
import workbenches from '@/views/hosts/workbenches.vue'
|
||||
import { ref } from 'vue'
|
||||
import { getUser } from '@/utils/storage'
|
||||
// import { usePythonBridge } from '@/utils/pythonBridge'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
let activeIndexA = ref(1)
|
||||
const version = ref('v0.1.0')
|
||||
|
||||
function activeIndexFn(data) {
|
||||
activeIndexA.value = data
|
||||
console.log(data)
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
body,
|
||||
html {
|
||||
<style>
|
||||
/* Global resets if needed, but Tailwind handles most */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.app-container {
|
||||
background-color: #f3f5f9; /* Match background */
|
||||
display: flex;
|
||||
width: 1600px;
|
||||
height: 900px;
|
||||
background-color: @bg-color;
|
||||
position: relative;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.noneText {
|
||||
/* 页面无法选中 */
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
width: 200px;
|
||||
background-color: @bg-color;
|
||||
padding: 20px;
|
||||
/* box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1); */
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-left: 280px;
|
||||
width: 1304px;
|
||||
height: 868px;
|
||||
background: #FFFFFF;
|
||||
border-radius: 36px;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.center-justify {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user