Autosave: 20260224-140315
This commit is contained in:
parent
59edd04074
commit
0398cf54a2
@ -1,264 +1,231 @@
|
||||
:root {
|
||||
--primary-pink: #ff69b4; /* HotPink - softer than DeepPink */
|
||||
--vibrant-pink: #ff85b2;
|
||||
--light-pink: #fff0f5; /* LavenderBlush */
|
||||
--accent-gold: #ffd700;
|
||||
--bg-bright: #fffafa; /* Snow */
|
||||
--text-main: #444;
|
||||
--glass-bg: rgba(255, 255, 255, 0.9);
|
||||
--glass-border: rgba(255, 105, 180, 0.3);
|
||||
--primary-pink: #ff1493;
|
||||
--vibrant-pink: #ff69b4;
|
||||
--soft-pink: #ffb6c1;
|
||||
--royal-gold: #ffd700;
|
||||
--electric-blue: #00d2ff;
|
||||
--neon-green: #39ff14;
|
||||
--glass-bg: rgba(255, 255, 255, 0.95);
|
||||
--dark-text: #2c3e50;
|
||||
}
|
||||
|
||||
body.bg-wealth {
|
||||
background: linear-gradient(135deg, #ffb6c1, #ffc0cb, #fff0f5);
|
||||
background: linear-gradient(45deg, #ff9a9e 0%, #fad0c4 99%, #fad0c4 100%);
|
||||
background-attachment: fixed;
|
||||
color: var(--text-main);
|
||||
font-family: 'Noto Sans SC', 'Inter', -apple-system, sans-serif;
|
||||
color: var(--dark-text);
|
||||
font-family: 'Noto Sans SC', sans-serif;
|
||||
min-height: 100vh;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
/* Glassmorphism Effects */
|
||||
/* Personalized Brand Font */
|
||||
.brand-personalized {
|
||||
font-family: 'Ma Shan Zheng', cursive;
|
||||
font-size: 2.2rem;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
/* Glass Navbar */
|
||||
.glass-nav {
|
||||
background: rgba(255, 255, 255, 0.95) !important;
|
||||
backdrop-filter: blur(10px);
|
||||
border-bottom: 2px solid var(--primary-pink);
|
||||
}
|
||||
|
||||
.glass-card {
|
||||
background: var(--glass-bg);
|
||||
background: var(--glass-bg) !important;
|
||||
backdrop-filter: blur(15px);
|
||||
border: 3px solid var(--primary-pink) !important;
|
||||
border-radius: 24px !important;
|
||||
box-shadow: 0 10px 30px rgba(255, 105, 180, 0.15) !important;
|
||||
border-bottom: 3px solid transparent;
|
||||
border-image: linear-gradient(to right, var(--primary-pink), var(--royal-gold), var(--electric-blue)) 1;
|
||||
}
|
||||
|
||||
.icon-circle.bg-gold {
|
||||
/* Time Badge Fix - More Contrast */
|
||||
.time-badge {
|
||||
background: linear-gradient(135deg, var(--primary-pink), var(--vibrant-pink));
|
||||
box-shadow: 0 0 15px rgba(255, 105, 180, 0.3);
|
||||
color: white;
|
||||
border-radius: 50px;
|
||||
padding: 8px 20px;
|
||||
border: 2px solid white;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
box-shadow: 0 5px 15px rgba(255, 20, 147, 0.4);
|
||||
}
|
||||
|
||||
.time-badge i {
|
||||
color: var(--royal-gold);
|
||||
}
|
||||
|
||||
/* Modern Gradient Cards */
|
||||
.modern-card {
|
||||
background: var(--glass-bg);
|
||||
border-radius: 20px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
||||
}
|
||||
|
||||
.modern-card::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -3px; left: -3px; right: -3px; bottom: -3px;
|
||||
background: linear-gradient(135deg, var(--primary-pink), var(--royal-gold), var(--electric-blue), var(--neon-green));
|
||||
background-size: 400% 400%;
|
||||
z-index: -1;
|
||||
border-radius: 23px;
|
||||
animation: gradient-border 8s ease infinite;
|
||||
}
|
||||
|
||||
@keyframes gradient-border {
|
||||
0% { background-position: 0% 50%; }
|
||||
50% { background-position: 100% 50%; }
|
||||
100% { background-position: 0% 50%; }
|
||||
}
|
||||
|
||||
.modern-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 15px 40px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
/* Area sizing consistency */
|
||||
.fixed-height-area {
|
||||
height: 550px !important;
|
||||
overflow-y: auto;
|
||||
font-size: 1.15rem;
|
||||
}
|
||||
|
||||
.result-display {
|
||||
background: #ffffff;
|
||||
border: 2px dashed var(--soft-pink);
|
||||
border-radius: 15px;
|
||||
padding: 25px;
|
||||
line-height: 1.8;
|
||||
color: #333;
|
||||
font-weight: 600;
|
||||
white-space: pre-wrap; /* Preserve line breaks */
|
||||
}
|
||||
|
||||
/* Personalized Buttons */
|
||||
.btn-personalized {
|
||||
border-radius: 50px;
|
||||
padding: 12px 30px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
transition: all 0.3s ease;
|
||||
border: none;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.btn-parse {
|
||||
background: linear-gradient(to right, #ff1493, #ff69b4);
|
||||
color: white !important;
|
||||
box-shadow: 0 5px 20px rgba(255, 20, 147, 0.4);
|
||||
}
|
||||
|
||||
.btn-parse:hover {
|
||||
box-shadow: 0 10px 30px rgba(255, 20, 147, 0.6);
|
||||
transform: scale(1.03);
|
||||
}
|
||||
|
||||
.btn-clear {
|
||||
background: white;
|
||||
color: var(--primary-pink) !important;
|
||||
border: 2px solid var(--primary-pink);
|
||||
}
|
||||
|
||||
.btn-clear:hover {
|
||||
background: #fff0f5;
|
||||
transform: rotate(-2deg);
|
||||
}
|
||||
|
||||
.btn-copy-alt {
|
||||
background: linear-gradient(135deg, #ffd700, #ff8c00);
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.icon-circle.bg-success {
|
||||
background: linear-gradient(135deg, #00c853, #b2ff59);
|
||||
.btn-copy-alt:hover {
|
||||
filter: brightness(1.1);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* Navbar & Brand */
|
||||
.logo-wrapper {
|
||||
/* Icons */
|
||||
.icon-badge {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 45px;
|
||||
height: 45px;
|
||||
border-radius: 50%;
|
||||
font-size: 1.5rem;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.badge-pink { background: linear-gradient(135deg, #ff1493, #ff69b4); color: white; }
|
||||
.badge-gold { background: linear-gradient(135deg, #ffd700, #daa520); color: white; }
|
||||
|
||||
/* Carousel */
|
||||
.hero-wrapper {
|
||||
border-radius: 25px;
|
||||
overflow: hidden;
|
||||
border: 2px solid var(--primary-pink);
|
||||
box-shadow: 0 0 10px rgba(255, 105, 180, 0.2);
|
||||
border: 5px solid white;
|
||||
box-shadow: 0 20px 50px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
.brand-text {
|
||||
font-size: 1.4rem;
|
||||
background: linear-gradient(135deg, var(--primary-pink) 0%, #ff1493 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
font-weight: 900 !important;
|
||||
.hero-img {
|
||||
height: 250px;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.text-glow {
|
||||
text-shadow: 0 0 10px rgba(255, 105, 180, 0.1);
|
||||
/* Instruction Steps */
|
||||
.step-item {
|
||||
background: white;
|
||||
border-radius: 15px;
|
||||
padding: 15px;
|
||||
margin-bottom: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-left: 5px solid var(--electric-blue);
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
/* Animations */
|
||||
@keyframes rotating {
|
||||
.step-item:hover {
|
||||
background: #f0faff;
|
||||
transform: translateX(5px);
|
||||
}
|
||||
|
||||
.step-digit {
|
||||
background: var(--electric-blue);
|
||||
color: white;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
/* Logo Animation */
|
||||
.logo-spin {
|
||||
animation: spin 20s linear infinite;
|
||||
border: 3px solid var(--primary-pink);
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
.rotating {
|
||||
animation: rotating 15s linear infinite;
|
||||
}
|
||||
|
||||
/* Carousel */
|
||||
#mainCarousel {
|
||||
border: 3px solid var(--primary-pink);
|
||||
}
|
||||
|
||||
.hero-img {
|
||||
height: 220px;
|
||||
object-fit: cover;
|
||||
filter: brightness(0.95);
|
||||
}
|
||||
|
||||
.carousel-overlay {
|
||||
background: linear-gradient(to top, rgba(255, 105, 180, 0.3), transparent);
|
||||
}
|
||||
|
||||
.carousel-caption h2 {
|
||||
font-size: 2.2rem !important;
|
||||
text-shadow: 1px 1px 3px rgba(0,0,0,0.2);
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.slogan-text {
|
||||
color: white !important;
|
||||
font-weight: 700;
|
||||
text-shadow: 1px 1px 2px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Inputs & Outputs */
|
||||
.glass-input {
|
||||
background: #fff !important;
|
||||
border: 2px solid var(--primary-pink) !important;
|
||||
color: var(--primary-pink) !important;
|
||||
border-radius: 12px !important;
|
||||
transition: all 0.3s ease;
|
||||
font-weight: 700 !important;
|
||||
font-size: 1.1rem !important;
|
||||
}
|
||||
|
||||
.glass-input::placeholder {
|
||||
color: #ffb6c1 !important;
|
||||
font-weight: 500;
|
||||
text-shadow: 1px 1px 2px rgba(255, 105, 180, 0.2);
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.glass-input:focus {
|
||||
background: #fff !important;
|
||||
border-color: #ff1493 !important;
|
||||
box-shadow: 0 0 0 4px rgba(255, 105, 180, 0.2) !important;
|
||||
transform: scale(1.01);
|
||||
}
|
||||
|
||||
.form-label {
|
||||
color: var(--primary-pink) !important;
|
||||
font-weight: 800 !important;
|
||||
font-size: 1rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.result-container-dark {
|
||||
background: #fff;
|
||||
border: 3px solid var(--primary-pink);
|
||||
.brand-glow {
|
||||
color: var(--primary-pink);
|
||||
font-family: 'Noto Sans SC', sans-serif;
|
||||
white-space: pre-wrap;
|
||||
line-height: 1.8;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 700;
|
||||
box-shadow: inset 0 2px 8px rgba(255, 105, 180, 0.1);
|
||||
text-shadow: 0 0 15px rgba(255, 20, 147, 0.3);
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.btn-gold {
|
||||
background: linear-gradient(135deg, #ff1493 0%, #ff69b4 100%);
|
||||
border: none;
|
||||
color: white !important;
|
||||
border-radius: 15px;
|
||||
box-shadow: 0 6px 15px rgba(255, 105, 180, 0.3);
|
||||
transition: all 0.3s ease;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.btn-gold:hover {
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 10px 20px rgba(255, 105, 180, 0.4);
|
||||
filter: brightness(1.05);
|
||||
}
|
||||
|
||||
.btn-gold-outline {
|
||||
border: 2px solid var(--primary-pink);
|
||||
color: var(--primary-pink);
|
||||
border-radius: 12px;
|
||||
transition: all 0.2s;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.btn-gold-outline:hover {
|
||||
background: var(--primary-pink);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-outline-light {
|
||||
border: 2px solid var(--primary-pink);
|
||||
color: var(--primary-pink);
|
||||
background: white;
|
||||
}
|
||||
|
||||
.btn-outline-light:hover {
|
||||
background: #fff5f8;
|
||||
color: var(--primary-pink);
|
||||
border-color: #ff1493;
|
||||
}
|
||||
|
||||
.text-light-muted {
|
||||
color: var(--primary-pink);
|
||||
opacity: 0.8;
|
||||
/* Textarea Custom */
|
||||
.custom-textarea {
|
||||
border: none !important;
|
||||
background: #fcfcfc !important;
|
||||
padding: 20px !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Footer & Logo */
|
||||
.footer {
|
||||
border-top: 4px solid var(--primary-pink);
|
||||
color: var(--primary-pink) !important;
|
||||
background: #fff !important;
|
||||
}
|
||||
|
||||
.footer-logo {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
border-radius: 50%;
|
||||
object-fit: cover;
|
||||
border: 3px solid var(--primary-pink);
|
||||
}
|
||||
|
||||
/* Instructions Section */
|
||||
.instruction-card {
|
||||
background: #fff5f8;
|
||||
border-left: 5px solid var(--primary-pink);
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.instruction-step {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.step-number {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
background: var(--primary-pink);
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 900;
|
||||
margin-right: 12px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* Responsive */
|
||||
@media (max-width: 768px) {
|
||||
.hero-img { height: 160px; }
|
||||
.carousel-caption h2 { font-size: 1.5rem !important; }
|
||||
}
|
||||
|
||||
.logo-img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
||||
|
||||
.marked-label {
|
||||
font-weight: 900 !important;
|
||||
font-size: 1.1rem !important;
|
||||
color: #ff1493 !important;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-top: 2px solid var(--primary-pink) !important;
|
||||
opacity: 0.2 !important;
|
||||
}
|
||||
|
||||
#real-time-clock {
|
||||
color: var(--primary-pink) !important;
|
||||
.custom-textarea:focus {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
@ -2,33 +2,14 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
// Elements
|
||||
const clockEl = document.getElementById('real-time-clock');
|
||||
const outputEl = document.getElementById('reportOutput');
|
||||
const btnParse = document.getElementById('btnParse');
|
||||
const btnClear = document.getElementById('btnClear');
|
||||
const btnCopy = document.getElementById('btnCopy');
|
||||
const btnBatchParse = document.getElementById('btnBatchParse');
|
||||
const btnClearBatch = document.getElementById('btnClearBatch');
|
||||
const batchInput = document.getElementById('batchInput');
|
||||
const toastMessage = document.getElementById('toastMessage');
|
||||
const toastEl = document.getElementById('liveToast');
|
||||
const toast = new bootstrap.Toast(toastEl);
|
||||
|
||||
// Input Elements Mapping
|
||||
const inputs = {
|
||||
totalWS: document.getElementById('in_totalWS'),
|
||||
wsBanned: document.getElementById('in_wsBanned'),
|
||||
wsPermBanned: document.getElementById('in_wsPermBanned'),
|
||||
totalXHS: document.getElementById('in_totalXHS'),
|
||||
totalSMS: document.getElementById('in_totalSMS'),
|
||||
xhs: document.getElementById('in_xhs'),
|
||||
xhs_reply: document.getElementById('in_xhs_reply'),
|
||||
ws: document.getElementById('in_ws'),
|
||||
ws_reply: document.getElementById('in_ws_reply'),
|
||||
sms: document.getElementById('in_sms'),
|
||||
sms_reply: document.getElementById('in_sms_reply'),
|
||||
totalGreeting: document.getElementById('in_totalGreeting'),
|
||||
totalReply: document.getElementById('in_totalReply'),
|
||||
rechat: document.getElementById('in_rechat'),
|
||||
traffic: document.getElementById('in_traffic'),
|
||||
voice: document.getElementById('in_voice')
|
||||
};
|
||||
|
||||
// Initialize Real-time Clock
|
||||
const updateClock = () => {
|
||||
const now = new Date();
|
||||
@ -46,69 +27,160 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
// Show Toast Helper
|
||||
const showToast = (msg, isError = false) => {
|
||||
toastMessage.textContent = msg;
|
||||
const icon = isError ? 'fa-circle-xmark text-danger' : 'fa-circle-check text-success';
|
||||
toastMessage.previousElementSibling.className = `fa-solid ${icon} me-2`;
|
||||
const iconContainer = toastMessage.previousElementSibling;
|
||||
if (iconContainer) {
|
||||
const icon = isError ? 'fa-circle-xmark text-danger' : 'fa-circle-check text-success';
|
||||
iconContainer.className = `fa-solid ${icon} me-2`;
|
||||
}
|
||||
toast.show();
|
||||
};
|
||||
|
||||
// Parsing Logic
|
||||
const generateReport = () => {
|
||||
const stats = {};
|
||||
let hasValue = false;
|
||||
// Global button click feedback
|
||||
document.querySelectorAll('button').forEach(btn => {
|
||||
btn.addEventListener('click', (e) => {
|
||||
if (btn.id === 'btnBatchParse' || btn.id === 'btnClearBatch' || btn.id === 'btnCopy') return;
|
||||
|
||||
if (btn.classList.contains('carousel-control-prev') || btn.classList.contains('carousel-control-next')) {
|
||||
showToast('切换轮播图');
|
||||
} else if (btn.hasAttribute('data-bs-slide-to')) {
|
||||
showToast('切换到幻灯片 ' + (parseInt(btn.getAttribute('data-bs-slide-to')) + 1));
|
||||
} else if (!btn.classList.contains('btn-close')) {
|
||||
showToast('功能已触达');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
for (const [key, el] of Object.entries(inputs)) {
|
||||
const val = parseInt(el.value, 10) || 0;
|
||||
stats[key] = val;
|
||||
if (el.value !== '') hasValue = true;
|
||||
}
|
||||
|
||||
if (!hasValue) {
|
||||
showToast('请至少填入一项数据!', true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Generate output in the EXACT order and format requested by the user
|
||||
// We also use the "招呼量" terminology for XHS, WS, SMS in the output for consistency
|
||||
const result = `总WS数量: ${stats.totalWS}
|
||||
// Helper to format the final report (Exact format requested)
|
||||
const formatReport = (stats) => {
|
||||
return `总WS数量: ${stats.totalWS}
|
||||
WS今日封号: ${stats.wsBanned}
|
||||
总永封WS: ${stats.wsPermBanned}
|
||||
总XHS数量: ${stats.totalXHS}
|
||||
总SMS数量: ${stats.totalSMS}
|
||||
XHS招呼量: ${stats.xhs} 回复: ${stats.xhs_reply}
|
||||
WS招呼量: ${stats.ws} 回复: ${stats.ws_reply}
|
||||
SMS招呼量: ${stats.sms} 回复: ${stats.sms_reply}
|
||||
XHS: ${stats.xhs}
|
||||
回复: ${stats.xhs_reply}
|
||||
WS: ${stats.ws}
|
||||
回复: ${stats.ws_reply}
|
||||
SMS: ${stats.sms}
|
||||
回复: ${stats.sms_reply}
|
||||
总招呼量: ${stats.totalGreeting}
|
||||
总回复: ${stats.totalReply}
|
||||
再聊: ${stats.rechat}
|
||||
引流: ${stats.traffic}
|
||||
语音: ${stats.voice}`;
|
||||
};
|
||||
|
||||
outputEl.textContent = result;
|
||||
// Robust Parsing Logic
|
||||
const parseBatchData = () => {
|
||||
const text = batchInput.value.trim();
|
||||
if (!text) {
|
||||
showToast('请先粘贴报表内容!', true);
|
||||
return;
|
||||
}
|
||||
|
||||
const totals = {
|
||||
totalWS: 0, wsBanned: 0, wsPermBanned: 0, totalXHS: 0, totalSMS: 0,
|
||||
xhs: 0, xhs_reply: 0, ws: 0, ws_reply: 0, sms: 0, sms_reply: 0,
|
||||
totalGreeting: 0, totalReply: 0, rechat: 0, traffic: 0, voice: 0
|
||||
};
|
||||
|
||||
// Helper to extract a single value from a chunk
|
||||
const extractVal = (pattern, content) => {
|
||||
const match = content.match(pattern);
|
||||
return match ? parseInt(match[1], 10) : 0;
|
||||
};
|
||||
|
||||
// Identify distinct reports by "总WS数量" delimiter
|
||||
const reportChunks = text.split(/总WS数量/);
|
||||
|
||||
reportChunks.forEach((chunk, index) => {
|
||||
if (!chunk.trim() && index === 0) return;
|
||||
|
||||
const fullChunk = (index === 0 && !text.startsWith('总WS数量')) ? chunk : '总WS数量' + chunk;
|
||||
|
||||
// Basic fields
|
||||
totals.totalWS += extractVal(/总WS数量[::\s]+(\d+)/, fullChunk);
|
||||
totals.wsBanned += extractVal(/WS今日封号[::\s]+(\d+)/, fullChunk);
|
||||
totals.wsPermBanned += extractVal(/总永封WS[::\s]+(\d+)/, fullChunk);
|
||||
totals.totalXHS += extractVal(/总XHS数量[::\s]+(\d+)/, fullChunk);
|
||||
totals.totalSMS += extractVal(/总SMS数量[::\s]+(\d+)/, fullChunk);
|
||||
|
||||
// XHS & Reply (Targeted extraction)
|
||||
const xhsMatch = fullChunk.match(/XHS招呼量[::\s]+(\d+)[\s\S]*?回复[::\s]+(\d+)/);
|
||||
if (xhsMatch) {
|
||||
totals.xhs += parseInt(xhsMatch[1], 10);
|
||||
totals.xhs_reply += parseInt(xhsMatch[2], 10);
|
||||
} else {
|
||||
totals.xhs += extractVal(/XHS(?:招呼量)?[::\s]+(\d+)/, fullChunk);
|
||||
const genericXhsReply = fullChunk.match(/XHS[\s\S]*?回复[::\s]+(\d+)/);
|
||||
if (genericXhsReply) totals.xhs_reply += parseInt(genericXhsReply[1], 10);
|
||||
}
|
||||
|
||||
// WS & Reply
|
||||
const wsMatch = fullChunk.match(/WS招呼量[::\s]+(\d+)[\s\S]*?回复[::\s]+(\d+)/);
|
||||
if (wsMatch) {
|
||||
totals.ws += parseInt(wsMatch[1], 10);
|
||||
totals.ws_reply += parseInt(wsMatch[2], 10);
|
||||
} else {
|
||||
totals.ws += extractVal(/WS(?:招呼量)?[::\s]+(\d+)/, fullChunk);
|
||||
const genericWsReply = fullChunk.match(/WS[\s\S]*?回复[::\s]+(\d+)/);
|
||||
if (genericWsReply) totals.ws_reply += parseInt(genericWsReply[1], 10);
|
||||
}
|
||||
|
||||
// SMS & Reply
|
||||
const smsMatch = fullChunk.match(/SMS招呼量[::\s]+(\d+)[\s\S]*?回复[::\s]+(\d+)/);
|
||||
if (smsMatch) {
|
||||
totals.sms += parseInt(smsMatch[1], 10);
|
||||
totals.sms_reply += parseInt(smsMatch[2], 10);
|
||||
} else {
|
||||
totals.sms += extractVal(/SMS(?:招呼量)?[::\s]+(\d+)/, fullChunk);
|
||||
const genericSmsReply = fullChunk.match(/SMS[\s\S]*?回复[::\s]+(\d+)/);
|
||||
if (genericSmsReply) totals.sms_reply += parseInt(genericSmsReply[1], 10);
|
||||
}
|
||||
|
||||
// Bottom fields
|
||||
totals.totalGreeting += extractVal(/总招呼量[::\s]+(\d+)/, fullChunk);
|
||||
totals.totalReply += extractVal(/总回复[::\s]+(\d+)/, fullChunk);
|
||||
totals.rechat += extractVal(/再聊[::\s]+(\d+)/, fullChunk);
|
||||
totals.traffic += extractVal(/引流[::\s]+(\d+)/, fullChunk);
|
||||
totals.voice += extractVal(/语音[::\s]+(\d+)/, fullChunk);
|
||||
});
|
||||
|
||||
outputEl.textContent = formatReport(totals);
|
||||
btnCopy.disabled = false;
|
||||
showToast('报表生成成功!');
|
||||
showToast('报表汇总成功!');
|
||||
};
|
||||
|
||||
// Events
|
||||
btnParse.addEventListener('click', generateReport);
|
||||
if (btnBatchParse) {
|
||||
btnBatchParse.addEventListener('click', () => {
|
||||
showToast('深度解析中...');
|
||||
setTimeout(parseBatchData, 400);
|
||||
});
|
||||
}
|
||||
|
||||
btnClear.addEventListener('click', () => {
|
||||
for (const el of Object.values(inputs)) {
|
||||
el.value = '';
|
||||
}
|
||||
outputEl.textContent = '数据结果将在此处生成...';
|
||||
btnCopy.disabled = true;
|
||||
showToast('已清空所有内容');
|
||||
});
|
||||
if (btnClearBatch) {
|
||||
btnClearBatch.addEventListener('click', () => {
|
||||
batchInput.value = '';
|
||||
outputEl.textContent = '数据结果将在此处生成...';
|
||||
btnCopy.disabled = true;
|
||||
showToast('输入区域已清空');
|
||||
});
|
||||
}
|
||||
|
||||
btnCopy.addEventListener('click', () => {
|
||||
const text = outputEl.textContent;
|
||||
if (text && !text.includes('在此处生成')) {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
showToast('汇总报表已复制到剪贴板!');
|
||||
}).catch(err => {
|
||||
console.error('Copy failed', err);
|
||||
showToast('复制失败,请手动选择复制', true);
|
||||
});
|
||||
}
|
||||
});
|
||||
if (btnCopy) {
|
||||
btnCopy.addEventListener('click', () => {
|
||||
const text = outputEl.textContent;
|
||||
if (text && !text.includes('在此处生成')) {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
showToast('汇总报表已复制成功!');
|
||||
}).catch(err => {
|
||||
console.error('Copy failed', err);
|
||||
showToast('复制失败', true);
|
||||
});
|
||||
} else {
|
||||
showToast('无可复制内容', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
BIN
assets/pasted-20260224-132125-caa5002a.png
Normal file
BIN
assets/pasted-20260224-132125-caa5002a.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
BIN
assets/pasted-20260224-132641-5b229e68.png
Normal file
BIN
assets/pasted-20260224-132641-5b229e68.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 90 KiB |
BIN
assets/pasted-20260224-133231-aee5dd9c.png
Normal file
BIN
assets/pasted-20260224-133231-aee5dd9c.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 89 KiB |
BIN
assets/pasted-20260224-135812-cffb2f73.png
Normal file
BIN
assets/pasted-20260224-135812-cffb2f73.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 427 KiB |
274
index.php
274
index.php
@ -4,7 +4,7 @@ declare(strict_types=1);
|
||||
@date_default_timezone_set('Asia/Shanghai');
|
||||
|
||||
$projectName = '财神组报表统计系统';
|
||||
$projectDescription = '专业、高效、精准的报表数据汇总解析平台';
|
||||
$projectDescription = '专业、高效、精准...报表数据汇总解析平台';
|
||||
$logoPath = 'assets/pasted-20260224-085211-bb97e8b6.jpg';
|
||||
?>
|
||||
<!doctype html>
|
||||
@ -18,8 +18,8 @@ $logoPath = 'assets/pasted-20260224-085211-bb97e8b6.jpg';
|
||||
|
||||
<!-- Bootstrap 5 CSS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<!-- Google Fonts: Inter & Noto Sans SC -->
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=Noto+Sans+SC:wght@400;700;900&display=swap" rel="stylesheet">
|
||||
<!-- Google Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700;900&family=Ma+Shan+Zheng&display=swap" rel="stylesheet">
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
<!-- Custom CSS -->
|
||||
@ -28,201 +28,113 @@ $logoPath = 'assets/pasted-20260224-085211-bb97e8b6.jpg';
|
||||
<body class="bg-wealth">
|
||||
|
||||
<!-- Navbar -->
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-light sticky-top shadow-lg glass-nav">
|
||||
<nav class="navbar navbar-expand-lg navbar-light sticky-top glass-nav py-3">
|
||||
<div class="container">
|
||||
<a class="navbar-brand d-flex align-items-center" href="#">
|
||||
<div class="logo-wrapper me-3">
|
||||
<img src="<?= $logoPath ?>" alt="Logo" class="logo-img rotating">
|
||||
</div>
|
||||
<span class="fw-bold brand-text text-glow"><?= htmlspecialchars($projectName) ?></span>
|
||||
<img src="<?= $logoPath ?>" alt="Logo" class="rounded-circle logo-spin me-3" width="50" height="50">
|
||||
<span class="brand-personalized brand-glow"><?= htmlspecialchars($projectName) ?></span>
|
||||
</a>
|
||||
<div class="ms-auto d-flex align-items-center">
|
||||
<i class="fa-regular fa-clock text-primary-pink me-2"></i>
|
||||
<span id="real-time-clock" class="small fw-bold"></span>
|
||||
<div class="ms-auto">
|
||||
<div class="time-badge shadow-lg">
|
||||
<i class="fa-regular fa-clock me-2"></i>
|
||||
<span id="real-time-clock" class="fw-bold"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="container py-4">
|
||||
<main class="container py-5">
|
||||
|
||||
<!-- Hero Carousel -->
|
||||
<div id="mainCarousel" class="carousel slide mb-5 rounded-4 overflow-hidden shadow-lg" data-bs-ride="carousel" data-bs-interval="4000">
|
||||
<div class="carousel-indicators">
|
||||
<button type="button" data-bs-target="#mainCarousel" data-bs-slide-to="0" class="active"></button>
|
||||
<button type="button" data-bs-target="#mainCarousel" data-bs-slide-to="1"></button>
|
||||
<button type="button" data-bs-target="#mainCarousel" data-bs-slide-to="2"></button>
|
||||
</div>
|
||||
<div class="carousel-inner">
|
||||
<div class="carousel-item active">
|
||||
<img src="https://images.pexels.com/photos/164501/pexels-photo-164501.jpeg?auto=compress&cs=tinysrgb&w=1200" class="d-block w-100 hero-img" alt="Cash">
|
||||
<div class="carousel-overlay"></div>
|
||||
<div class="carousel-caption">
|
||||
<h2 class="fw-bold mb-1">我们是:财神组...</h2>
|
||||
<p class="slogan-text">我们的口号是...目标赚钱,团结奋进,一股作气,挑战佳绩!</p>
|
||||
</div>
|
||||
<!-- Hero Section -->
|
||||
<div class="row mb-5">
|
||||
<div class="col-12">
|
||||
<div id="mainCarousel" class="carousel slide hero-wrapper" data-bs-ride="carousel">
|
||||
<div class="carousel-inner">
|
||||
<div class="carousel-item active">
|
||||
<img src="https://images.pexels.com/photos/164501/pexels-photo-164501.jpeg?auto=compress&cs=tinysrgb&w=1200" class="d-block w-100 hero-img" alt="1">
|
||||
<div class="carousel-caption d-none d-md-block">
|
||||
<h2 class="fw-black display-5">财神组:目标赚钱,团结奋进</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-item">
|
||||
<img src="https://images.pexels.com/photos/259027/pexels-photo-259027.jpeg?auto=compress&cs=tinysrgb&w=1200" class="d-block w-100 hero-img" alt="2">
|
||||
<div class="carousel-caption d-none d-md-block">
|
||||
<h2 class="fw-black display-5">一股作气,挑战佳绩</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="carousel-control-prev" type="button" data-bs-target="#mainCarousel" data-bs-slide="prev">
|
||||
<span class="carousel-control-prev-icon"></span>
|
||||
</button>
|
||||
<button class="carousel-control-next" type="button" data-bs-target="#mainCarousel" data-bs-slide="next">
|
||||
<span class="carousel-control-next-icon"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-item">
|
||||
<img src="https://images.pexels.com/photos/259027/pexels-photo-259027.jpeg?auto=compress&cs=tinysrgb&w=1200" class="d-block w-100 hero-img" alt="Money">
|
||||
<div class="carousel-overlay"></div>
|
||||
<div class="carousel-caption">
|
||||
<h2 class="fw-bold mb-1">财源广进 · 步步高升</h2>
|
||||
<p class="slogan-text">专业报表分析,助力团队业绩翻倍,共创辉煌!</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-item">
|
||||
<img src="https://images.pexels.com/photos/730547/pexels-photo-730547.jpeg?auto=compress&cs=tinysrgb&w=1200" class="d-block w-100 hero-img" alt="Success">
|
||||
<div class="carousel-overlay"></div>
|
||||
<div class="carousel-caption">
|
||||
<h2 class="fw-bold mb-1">团结奋进 · 挑战佳绩</h2>
|
||||
<p class="slogan-text">一股作气,共筑梦想,财神组与您并肩作战!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-4">
|
||||
<div class="row g-5 align-items-stretch">
|
||||
<!-- Input Section -->
|
||||
<div class="col-lg-7">
|
||||
<div class="card border-0 shadow-lg h-100 glass-card">
|
||||
<div class="card-header border-0 pt-4 pb-2 d-flex align-items-center bg-transparent">
|
||||
<div class="icon-circle bg-gold me-3">
|
||||
<i class="fa-solid fa-pen-to-square"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-0" style="color: #ff1493;">报表数据输入</h5>
|
||||
<p class="text-light-muted small mb-0">请按照顺序填入今日数据</p>
|
||||
<div class="col-lg-6">
|
||||
<div class="card modern-card shadow-lg h-100">
|
||||
<div class="card-header bg-transparent border-0 pt-4 px-4">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="icon-badge badge-pink">
|
||||
<i class="fa-solid fa-file-import"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="fw-black mb-0" style="color: #ff1493;">数据录入区</h4>
|
||||
<p class="text-muted small mb-0">粘贴多份组员报表至下方</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row g-3">
|
||||
<!-- Row 1 & 2: Totals -->
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">总WS数量:</label>
|
||||
<input type="number" id="in_totalWS" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">WS今日封号:</label>
|
||||
<input type="number" id="in_wsBanned" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">总永封WS:</label>
|
||||
<input type="number" id="in_wsPermBanned" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">总XHS数量:</label>
|
||||
<input type="number" id="in_totalXHS" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">总SMS数量:</label>
|
||||
<input type="number" id="in_totalSMS" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
|
||||
<div class="col-12"><hr></div>
|
||||
|
||||
<!-- Section: XHS -->
|
||||
<div class="col-md-6">
|
||||
<label class="form-label marked-label">XHS招呼量:</label>
|
||||
<input type="number" id="in_xhs" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">回复:</label>
|
||||
<input type="number" id="in_xhs_reply" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
|
||||
<!-- Section: WS -->
|
||||
<div class="col-md-6">
|
||||
<label class="form-label marked-label">WS招呼量:</label>
|
||||
<input type="number" id="in_ws" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">回复:</label>
|
||||
<input type="number" id="in_ws_reply" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
|
||||
<!-- Section: SMS -->
|
||||
<div class="col-md-6">
|
||||
<label class="form-label marked-label">SMS招呼量:</label>
|
||||
<input type="number" id="in_sms" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">回复:</label>
|
||||
<input type="number" id="in_sms_reply" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
|
||||
<div class="col-12"><hr></div>
|
||||
|
||||
<!-- Bottom Stats -->
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">总招呼量:</label>
|
||||
<input type="number" id="in_totalGreeting" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">总回复:</label>
|
||||
<input type="number" id="in_totalReply" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">再聊:</label>
|
||||
<input type="number" id="in_rechat" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">引流:</label>
|
||||
<input type="number" id="in_traffic" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">语音:</label>
|
||||
<input type="number" id="in_voice" class="form-control glass-input" placeholder="填入数量">
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body px-4">
|
||||
<textarea id="batchInput" class="form-control custom-textarea fixed-height-area shadow-sm" placeholder="在此粘贴报表,支持多份报表同时录入..."></textarea>
|
||||
</div>
|
||||
<div class="card-footer bg-transparent border-0 pb-4 d-flex gap-3">
|
||||
<button id="btnParse" class="btn btn-gold flex-grow-1 py-3 fw-bold">
|
||||
<i class="fa-solid fa-wand-magic-sparkles me-2"></i>生成报表
|
||||
</button>
|
||||
<button id="btnClear" class="btn btn-outline-light px-4 py-3">
|
||||
<i class="fa-solid fa-trash-can me-2"></i>清空
|
||||
</button>
|
||||
<div class="card-footer bg-transparent border-0 pb-4 px-4">
|
||||
<div class="d-flex gap-3">
|
||||
<button id="btnBatchParse" class="btn btn-personalized btn-parse flex-grow-1">
|
||||
<i class="fa-solid fa-bolt-lightning me-2"></i>开始解析汇总
|
||||
</button>
|
||||
<button id="btnClearBatch" class="btn btn-personalized btn-clear">
|
||||
<i class="fa-solid fa-broom me-2"></i>清空
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Output Section -->
|
||||
<div class="col-lg-5">
|
||||
<div class="card border-0 shadow-lg h-100 glass-card">
|
||||
<div class="card-header border-0 pt-4 pb-2 d-flex justify-content-between align-items-center bg-transparent">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="icon-circle bg-success text-white me-3">
|
||||
<i class="fa-solid fa-chart-line"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h5 class="fw-bold mb-0" style="color: #ff1493;">统计报表</h5>
|
||||
<p class="text-light-muted small mb-0">汇总后的最终数据</p>
|
||||
<div class="col-lg-6">
|
||||
<div class="card modern-card shadow-lg h-100">
|
||||
<div class="card-header bg-transparent border-0 pt-4 px-4">
|
||||
<div class="d-flex align-items-center justify-content-between w-100">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="icon-badge badge-gold">
|
||||
<i class="fa-solid fa-chart-pie"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="fw-black mb-0" style="color: #ff1493;">统计报告区</h4>
|
||||
<p class="text-muted small mb-0">汇总结果实时生成</p>
|
||||
</div>
|
||||
</div>
|
||||
<button id="btnCopy" class="btn btn-personalized btn-copy-alt" disabled>
|
||||
<i class="fa-solid fa-copy me-2"></i>一键复制
|
||||
</button>
|
||||
</div>
|
||||
<button id="btnCopy" class="btn btn-sm btn-gold-outline px-3 py-2 fw-bold" disabled>
|
||||
<i class="fa-regular fa-copy me-2"></i>复制
|
||||
</button>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="reportOutput" class="result-container-dark p-4 rounded-3" style="min-height: 400px;">数据结果将在此处生成...</div>
|
||||
<div class="card-body px-4">
|
||||
<div id="reportOutput" class="result-display fixed-height-area shadow-sm">数据结果将在此处生成...</div>
|
||||
|
||||
<!-- Instructions Section -->
|
||||
<div class="instruction-card mt-4 p-4">
|
||||
<h6 class="fw-bold mb-3" style="color: #ff1493;"><i class="fa-solid fa-circle-info me-2"></i>步骤说明</h6>
|
||||
<div class="instruction-step">
|
||||
<div class="step-number">1</div>
|
||||
<div class="small fw-bold">在左侧区域按顺序填入各项数据。</div>
|
||||
<!-- Dynamic Instructions -->
|
||||
<div class="mt-4">
|
||||
<div class="step-item shadow-sm">
|
||||
<div class="step-digit">1</div>
|
||||
<span class="small fw-bold">复制组员报表并粘贴至左侧。</span>
|
||||
</div>
|
||||
<div class="instruction-step">
|
||||
<div class="step-number">2</div>
|
||||
<div class="small fw-bold">检查无误后点击“生成报表”按钮。</div>
|
||||
</div>
|
||||
<div class="instruction-step">
|
||||
<div class="step-number">3</div>
|
||||
<div class="small fw-bold">点击右上角“复制”按钮获取报表内容。</div>
|
||||
</div>
|
||||
<div class="instruction-step mb-0">
|
||||
<div class="step-number">4</div>
|
||||
<div class="small fw-bold">将复制的内容发送到对应的统计群组。</div>
|
||||
<div class="step-item shadow-sm" style="border-left-color: #ff1493;">
|
||||
<div class="step-digit" style="background: #ff1493;">2</div>
|
||||
<span class="small fw-bold">点击解析,系统自动秒出结果。</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -231,22 +143,20 @@ $logoPath = 'assets/pasted-20260224-085211-bb97e8b6.jpg';
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="footer mt-5 py-5">
|
||||
<footer class="py-5 bg-white mt-5 border-top border-5 border-pink">
|
||||
<div class="container text-center">
|
||||
<div class="mb-4">
|
||||
<img src="<?= $logoPath ?>" alt="Footer Logo" class="footer-logo rotating mb-3">
|
||||
<h5 class="fw-bold" style="color: #ff1493;"><?= htmlspecialchars($projectName) ?></h5>
|
||||
</div>
|
||||
<p class="small mb-0" style="color: #ff1493;">© <?= date('Y') ?> <?= htmlspecialchars($projectName) ?>. 目标赚钱,团结奋进,一股作气,挑战佳绩!</p>
|
||||
<img src="<?= $logoPath ?>" alt="Footer Logo" class="rounded-circle mb-3 logo-spin" width="60" height="60">
|
||||
<h5 class="brand-personalized text-pink fs-4"><?= htmlspecialchars($projectName) ?></h5>
|
||||
<p class="text-muted small mb-0">© <?= date('Y') ?> 专业团队 · 精准统计 · 财神领航</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Toast -->
|
||||
<div class="toast-container position-fixed bottom-0 end-0 p-4">
|
||||
<div id="liveToast" class="toast align-items-center bg-white border-0 shadow-lg" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div id="liveToast" class="toast align-items-center border-0 shadow-lg rounded-4" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="d-flex">
|
||||
<div class="toast-body d-flex align-items-center" style="color: #ff1493;">
|
||||
<i class="fa-solid fa-circle-check text-success me-2"></i>
|
||||
<div class="toast-body d-flex align-items-center fw-bold" style="color: #ff1493;">
|
||||
<i class="fa-solid fa-circle-check me-2 text-success"></i>
|
||||
<span id="toastMessage">操作成功</span>
|
||||
</div>
|
||||
<button type="button" class="btn-close me-3 m-auto" data-bs-dismiss="toast"></button>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user