feat(admin-ui): 管理后台整体切换为浅色主题(ModernLight) + 新增 lightbulb 图标

1. layout(管理控制台 dashboard.vue): main bg-[#09090b] text-zinc-100 → bg-[#f8fafc] text-zinc-900; header bg-zinc-950/60 border-zinc-800 → bg-white/80 border-zinc-200; 移动菜单按钮/新手引导按钮 text-zinc-300/400 hover:bg-zinc-800 → text-zinc-600 hover:bg-zinc-100 border-zinc-200

2. Admin/Sidebar.vue: bg-[#09090b] border-zinc-800 → bg-white border-zinc-200 + shadow-sm; 标题 text-zinc-100 → 900; activeTab bg-blue-600/10 text-blue-400 → bg-blue-50 text-blue-700 border-blue-200; 未选中 text-zinc-500 hover:text-zinc-200 hover:bg-zinc-800/40 → text-zinc-600 hover:text-zinc-900 hover:bg-zinc-100; 用户卡 avatar/首字母 bg-white/70 border-zinc-200 + 退出按钮 hover:bg-red-50 text-red-600

3. 批量 33 个 Admin 组件硬编码深色原子类 1414 处替换(bg-zinc-9xx / border-zinc-8xx / text-zinc-100,200,300 / shadow-black/ -> 对应 light 版本) + style 块原生 CSS rgba(255,255,255,x) 16 处改为 rgba(0,0,0,x) / var 浅色主题 + 硬编码 bg-[#0c0c0e] / border-white/10 / color:white / surface-primary fallback 对应浅色修正

4. 二轮批量追加: bg-zinc-950 + opacity 变体(80/60/50/40/30/20/10) 共 431 处 → bg-white 对应 opacity 版本;placeholder:text-zinc-800 → 500;text-blue/red/emerald/amber/rose/purple 400 版 → 700/600 深浅一致版;border color /500 /30 → 200;focus:ring /20 → /30;shadow color 阴影降低强度

5. hover:text-white 扫尾: 13 处 DataAnalysisPanel/DatabaseManager/NotificationSender/SemesterManager/SongManagement/UserSongsModal hover 文本从 white → zinc-900;按钮三态从 hover:bg-*600 白字 → hover:bg-*-100/200 对应深字色,和前台 indigo/浅色体系保持一致

6. BlacklistManager 前台可见提示 💡→ <Icon lightbulb amber-600 size=13>;ChangelogManager 徽章色从 emerald-300/blue-300/zinc-400 → emerald-700/blue-700/zinc-600 可读;Icon.vue 新增 lightbulb 分支 stroke 图标

7. 受影响文件: dashboard.vue + Sidebar.vue + Icon.vue + Admin/* (33个组件共 1874 处批量替换 + 20 处手工精细化修正)
This commit is contained in:
2026-09-19 08:30:59 +08:00
parent 357876a716
commit 573e168702
36 changed files with 1023 additions and 1017 deletions
+81 -81
View File
@@ -4,13 +4,13 @@
<div class="space-y-6">
<div class="flex flex-col md:flex-row md:items-end justify-between gap-6 px-1">
<div class="space-y-1">
<h2 class="text-3xl font-black text-zinc-100 tracking-tight">歌曲管理</h2>
<h2 class="text-3xl font-black text-zinc-900 tracking-tight">歌曲管理</h2>
<div class="flex items-center gap-6 mt-4">
<div class="flex items-center gap-2">
<span class="text-[10px] font-black text-zinc-600 uppercase tracking-widest"
>总计</span
>
<span class="text-sm font-bold text-zinc-300">{{ filteredSongs.length }}</span>
<span class="text-sm font-bold text-zinc-600">{{ filteredSongs.length }}</span>
</div>
<div class="flex items-center gap-2">
<span class="text-[10px] font-black text-zinc-600 uppercase tracking-widest"
@@ -39,10 +39,10 @@
>
<div
v-if="selectedSongs.length > 0"
class="flex items-center gap-2 p-1.5 bg-zinc-900/90 border border-zinc-800 rounded-lg backdrop-blur-xl shadow-2xl"
class="flex items-center gap-2 p-1.5 bg-zinc-50/90 border border-zinc-200 rounded-lg backdrop-blur-xl shadow-2xl"
>
<button
class="flex items-center gap-2 px-4 py-2 bg-zinc-800 hover:bg-zinc-700 text-emerald-400 text-[11px] font-black rounded-lg border border-zinc-700/50 transition-all active:scale-95 uppercase tracking-widest"
class="flex items-center gap-2 px-4 py-2 bg-zinc-100 hover:bg-zinc-200 text-emerald-700 text-[11px] font-black rounded-lg border border-zinc-200 transition-all active:scale-95 uppercase tracking-widest"
@click="openDownloadDialog"
>
<Download :size="14" class="text-emerald-500/70" /> 下载 ({{
@@ -50,25 +50,25 @@
}})
</button>
<button
class="flex items-center gap-2 px-4 py-2 bg-zinc-800 hover:bg-zinc-700 text-emerald-400 text-[11px] font-black rounded-lg border border-zinc-700/50 transition-all active:scale-95 uppercase tracking-widest"
class="flex items-center gap-2 px-4 py-2 bg-zinc-100 hover:bg-zinc-200 text-emerald-700 text-[11px] font-black rounded-lg border border-zinc-200 transition-all active:scale-95 uppercase tracking-widest"
@click="batchMarkPlayed"
>
<Check :size="14" class="text-emerald-500/70" /> 已播放 ({{ selectedSongs.length }})
</button>
<button
class="flex items-center gap-2 px-4 py-2 bg-zinc-800 hover:bg-zinc-700 text-blue-400 text-[11px] font-black rounded-lg border border-zinc-700/50 transition-all active:scale-95 uppercase tracking-widest"
class="flex items-center gap-2 px-4 py-2 bg-zinc-100 hover:bg-zinc-200 text-blue-700 text-[11px] font-black rounded-lg border border-zinc-200 transition-all active:scale-95 uppercase tracking-widest"
@click="batchMarkUnplayed"
>
<RotateCcw :size="14" class="text-blue-500/70" /> 未播放 ({{ selectedSongs.length }})
</button>
<button
class="flex items-center gap-2 px-4 py-2 bg-zinc-800 hover:bg-zinc-700 text-amber-400 text-[11px] font-black rounded-lg border border-zinc-700/50 transition-all active:scale-95 uppercase tracking-widest"
class="flex items-center gap-2 px-4 py-2 bg-zinc-100 hover:bg-zinc-200 text-amber-700 text-[11px] font-black rounded-lg border border-zinc-200 transition-all active:scale-95 uppercase tracking-widest"
@click="batchReject"
>
<X :size="14" class="text-amber-500/70" /> 驳回 ({{ selectedSongs.length }})
</button>
<button
class="flex items-center gap-2 px-4 py-2 bg-zinc-800 hover:bg-zinc-700 text-red-400 text-[11px] font-black rounded-lg border border-zinc-700/50 transition-all active:scale-95 uppercase tracking-widest"
class="flex items-center gap-2 px-4 py-2 bg-zinc-100 hover:bg-zinc-200 text-red-400 text-[11px] font-black rounded-lg border border-zinc-200 transition-all active:scale-95 uppercase tracking-widest"
@click="batchDelete"
>
<Trash2 :size="14" class="text-red-500/70" /> 删除 ({{ selectedSongs.length }})
@@ -77,14 +77,14 @@
</Transition>
<button
class="flex items-center gap-2 px-5 py-2.5 bg-zinc-900 border border-zinc-800 hover:border-zinc-700 text-zinc-300 text-xs font-bold rounded-lg transition-all active:scale-95"
class="flex items-center gap-2 px-5 py-2.5 bg-white border border-zinc-200 hover:border-zinc-200 text-zinc-600 text-xs font-bold rounded-lg transition-all active:scale-95"
@click="openAddSongModal"
>
<Plus :size="16" /> 手动添加
</button>
<button
:disabled="loading"
class="flex items-center gap-2 px-5 py-2.5 bg-blue-600/10 hover:bg-blue-600/20 text-blue-400 text-xs font-bold rounded-lg border border-blue-500/20 transition-all disabled:opacity-50"
class="flex items-center gap-2 px-5 py-2.5 bg-blue-50 hover:bg-blue-600/20 text-blue-700 text-xs font-bold rounded-lg border border-blue-200 transition-all disabled:opacity-50"
@click="refreshSongs(true)"
>
<RotateCcw :size="16" :class="{ 'animate-spin': loading }" /> 刷新
@@ -94,7 +94,7 @@
<!-- 过滤器栏 -->
<div
class="bg-zinc-900/30 border border-zinc-800/60 rounded-xl p-4 flex flex-col lg:flex-row gap-4 items-stretch lg:items-center"
class="bg-zinc-50/30 border border-zinc-200/60 rounded-xl p-4 flex flex-col lg:flex-row gap-4 items-stretch lg:items-center"
>
<div class="relative flex-1 group w-full lg:w-auto">
<Search
@@ -105,7 +105,7 @@
v-model="searchQuery"
type="text"
placeholder="搜索歌曲标题、艺术家或投稿人..."
class="w-full bg-zinc-950/50 border border-zinc-800/80 rounded-lg pl-12 pr-4 py-3 text-sm focus:outline-none focus:border-blue-500/30 transition-all placeholder:text-zinc-800 text-zinc-200"
class="w-full bg-white/70 border border-zinc-200/80 rounded-lg pl-12 pr-4 py-3 text-sm focus:outline-none focus:border-blue-200 transition-all placeholder:text-zinc-500 text-zinc-700"
>
</div>
<div class="grid grid-cols-2 md:grid-cols-3 lg:flex lg:items-center gap-3 w-full lg:w-auto">
@@ -138,16 +138,16 @@
<!-- 歌曲表格 -->
<div
class="bg-zinc-900/10 border border-zinc-800/40 rounded-xl overflow-hidden shadow-2xl relative"
class="bg-zinc-50/10 border border-zinc-200 rounded-xl overflow-hidden shadow-2xl relative"
>
<!-- 加载遮罩 -->
<div
v-if="loading"
class="absolute inset-0 bg-zinc-950/40 backdrop-blur-sm z-10 flex items-center justify-center"
class="absolute inset-0 bg-white/80 backdrop-blur-sm z-10 flex items-center justify-center"
>
<div class="flex flex-col items-center gap-3">
<div
class="w-8 h-8 border-2 border-blue-500/20 border-t-blue-500 rounded-full animate-spin"
class="w-8 h-8 border-2 border-blue-200 border-t-blue-500 rounded-full animate-spin"
/>
<span class="text-xs font-bold text-zinc-400 tracking-widest uppercase">正在加载...</span>
</div>
@@ -155,13 +155,13 @@
<!-- 表头 -->
<div
class="hidden lg:grid grid-cols-12 gap-4 px-8 py-5 border-b border-zinc-800/60 bg-zinc-900/40"
class="hidden lg:grid grid-cols-12 gap-4 px-8 py-5 border-b border-zinc-200/60 bg-zinc-50/40"
>
<div class="col-span-1 flex items-center">
<input
type="checkbox"
:checked="isAllSelected"
class="w-5 h-5 rounded-lg border-2 border-zinc-800 bg-zinc-950 accent-blue-600 transition-all cursor-pointer"
class="w-5 h-5 rounded-lg border-2 border-zinc-200 bg-white accent-blue-600 transition-all cursor-pointer"
@change="toggleSelectAll"
>
</div>
@@ -204,14 +204,14 @@
:key="song.id"
:class="[
'grid grid-cols-1 lg:grid-cols-12 gap-4 px-6 lg:px-8 py-5 transition-all items-center group relative',
selectedSongs.includes(song.id) ? 'bg-blue-600/5' : 'hover:bg-zinc-800/20'
selectedSongs.includes(song.id) ? 'bg-blue-600/5' : 'hover:bg-zinc-100/20'
]"
>
<div class="hidden lg:flex col-span-1 items-center">
<input
type="checkbox"
:checked="selectedSongs.includes(song.id)"
class="w-5 h-5 rounded-lg border-2 border-zinc-800 bg-zinc-950 accent-blue-600 transition-all cursor-pointer"
class="w-5 h-5 rounded-lg border-2 border-zinc-200 bg-white accent-blue-600 transition-all cursor-pointer"
@change="toggleSelectSong(song.id)"
>
</div>
@@ -219,7 +219,7 @@
<div class="col-span-12 lg:col-span-4 flex items-center gap-4">
<div
:class="[
'w-12 h-12 rounded-xl flex items-center justify-center shrink-0 border transition-all overflow-hidden bg-zinc-800/40 border-zinc-700/30 group-hover:border-zinc-600 cursor-pointer hover:opacity-80',
'w-12 h-12 rounded-xl flex items-center justify-center shrink-0 border transition-all overflow-hidden bg-zinc-100/40 border-zinc-200/30 group-hover:border-zinc-300 cursor-pointer hover:opacity-80',
selectedSongs.includes(song.id) ? 'border-blue-500/50' : ''
]"
@click.stop="playSong(song)"
@@ -237,8 +237,8 @@
:class="[
'font-bold transition-colors flex items-center',
selectedSongs.includes(song.id)
? 'text-blue-400'
: 'text-zinc-100 group-hover:text-blue-400'
? 'text-blue-700'
: 'text-zinc-900 group-hover:text-blue-700'
]"
>
<span
@@ -250,7 +250,7 @@
<span v-else class="truncate">{{ song.title }}</span>
<button
v-if="song.hasSubmissionNote && song.submissionNote"
class="ml-2 inline-flex items-center justify-center w-5 h-5 rounded-full border border-blue-500/30 bg-blue-500/10 text-blue-400 hover:bg-blue-500/20 transition-all"
class="ml-2 inline-flex items-center justify-center w-5 h-5 rounded-full border border-blue-200 bg-blue-500/10 text-blue-700 hover:bg-blue-500/20 transition-all"
title="查看备注留言"
@click.stop="openSubmissionRemark(song)"
>
@@ -261,7 +261,7 @@
<!-- 期望播出日期标签 -->
<div v-if="song.expectedPlayDate" class="mt-1 flex items-center">
<span class="inline-flex items-center gap-1 px-1.5 py-0.5 bg-blue-500/10 text-blue-400 rounded border border-blue-500/20 text-[10px] font-medium">
<span class="inline-flex items-center gap-1 px-1.5 py-0.5 bg-blue-500/10 text-blue-700 rounded border border-blue-200 text-[10px] font-medium">
<CalendarDays :size="10" />
期望: {{ song.expectedPlayDate }}
<template v-if="song.expectedPlaySequence">
@@ -295,7 +295,7 @@
'inline-flex items-center gap-1.5 text-xs font-bold px-2 py-1 rounded-lg transition-all',
song.voteCount > 0
? 'bg-pink-500/10 text-pink-500 hover:bg-pink-500/20 cursor-pointer'
: 'bg-zinc-950/30 text-zinc-700 cursor-default'
: 'bg-white/60 text-zinc-700 cursor-default'
]"
@click="showVoters(song.id)"
>
@@ -312,7 +312,7 @@
? 'bg-emerald-500/10 text-emerald-500'
: song.scheduled
? 'bg-blue-500/10 text-blue-500'
: 'bg-zinc-800 text-zinc-500'
: 'bg-zinc-100 text-zinc-500'
]"
>
{{ getStatusText(song) }}
@@ -323,7 +323,7 @@
class="col-span-12 lg:col-span-2 flex items-center justify-end gap-2 opacity-100 lg:opacity-0 group-hover:opacity-100 transition-all"
>
<button
class="p-2 bg-zinc-800/50 text-blue-400 hover:bg-blue-600 hover:text-white rounded-xl transition-all border border-zinc-700/30"
class="p-2 bg-zinc-100/50 text-blue-700 hover:bg-blue-600 hover:text-zinc-900 rounded-xl transition-all border border-zinc-200/30"
title="编辑歌曲"
@click="editSong(song)"
>
@@ -332,7 +332,7 @@
<button
v-if="!song.played"
class="p-2 bg-zinc-800/50 text-emerald-400 hover:bg-emerald-600 hover:text-white rounded-xl transition-all border border-zinc-700/30"
class="p-2 bg-zinc-100/50 text-emerald-700 hover:bg-emerald-600 hover:text-zinc-900 rounded-xl transition-all border border-zinc-200/30"
title="标记为已播放"
@click="markAsPlayed(song.id)"
>
@@ -340,7 +340,7 @@
</button>
<button
v-else
class="p-2 bg-zinc-800/50 text-zinc-400 hover:bg-zinc-600 hover:text-white rounded-xl transition-all border border-zinc-700/30"
class="p-2 bg-zinc-100/50 text-zinc-400 hover:bg-zinc-600 hover:text-zinc-900 rounded-xl transition-all border border-zinc-200/30"
title="标记为未播放"
@click="markAsUnplayed(song.id)"
>
@@ -348,14 +348,14 @@
</button>
<button
class="p-2 bg-zinc-800/50 text-amber-500 hover:bg-amber-600 hover:text-white rounded-xl transition-all border border-zinc-700/30"
class="p-2 bg-zinc-100/50 text-amber-500 hover:bg-amber-600 hover:text-zinc-900 rounded-xl transition-all border border-zinc-200/30"
title="驳回歌曲"
@click="rejectSong(song.id)"
>
<X :size="14" />
</button>
<button
class="p-2 bg-zinc-800/50 text-red-400 hover:bg-red-600 hover:text-white rounded-xl transition-all border border-zinc-700/30"
class="p-2 bg-zinc-100/50 text-red-400 hover:bg-red-600 hover:text-zinc-900 rounded-xl transition-all border border-zinc-200/30"
title="删除歌曲"
@click="deleteSong(song.id)"
>
@@ -407,16 +407,16 @@
>
<div
v-if="showRejectDialog"
class="fixed inset-0 z-50 flex items-center justify-center p-4 bg-zinc-950/80 backdrop-blur-sm"
class="fixed inset-0 z-50 flex items-center justify-center p-4 bg-white/80 backdrop-blur-sm"
>
<div
class="w-full max-w-lg bg-zinc-900 border border-zinc-800 rounded-xl shadow-2xl overflow-hidden"
class="w-full max-w-lg bg-white border border-zinc-200 rounded-xl shadow-2xl overflow-hidden"
@click.stop
>
<div class="px-8 py-6 border-b border-zinc-800/50 flex items-center justify-between">
<h3 class="text-xl font-black text-zinc-100">{{ isBatchReject ? `批量驳回歌曲 (${selectedSongs.length} 首)` : '驳回歌曲' }}</h3>
<div class="px-8 py-6 border-b border-zinc-200 flex items-center justify-between">
<h3 class="text-xl font-black text-zinc-900">{{ isBatchReject ? `批量驳回歌曲 (${selectedSongs.length} 首)` : '驳回歌曲' }}</h3>
<button
class="text-zinc-500 hover:text-zinc-300 transition-colors"
class="text-zinc-500 hover:text-zinc-600 transition-colors"
@click="cancelReject"
>
<X :size="20" />
@@ -424,25 +424,25 @@
</div>
<div class="p-8 space-y-6">
<div v-if="!isBatchReject" class="p-5 bg-zinc-950 border border-zinc-800 rounded-lg flex items-center gap-4">
<div v-if="!isBatchReject" class="p-5 bg-white border border-zinc-200 rounded-lg flex items-center gap-4">
<div
class="w-10 h-10 rounded-lg bg-red-500/10 text-red-500 flex items-center justify-center border border-red-500/10"
>
<Music :size="18" />
</div>
<div>
<h4 class="font-bold text-zinc-100 text-sm">{{ rejectSongInfo.title }}</h4>
<h4 class="font-bold text-zinc-900 text-sm">{{ rejectSongInfo.title }}</h4>
<p class="text-xs text-zinc-500">投稿人: {{ rejectSongInfo.requester }}</p>
</div>
</div>
<div v-else class="p-5 bg-zinc-950 border border-zinc-800 rounded-lg flex items-center gap-4">
<div v-else class="p-5 bg-white border border-zinc-200 rounded-lg flex items-center gap-4">
<div
class="w-10 h-10 rounded-lg bg-amber-500/10 text-amber-500 flex items-center justify-center border border-amber-500/10"
>
<ListMusic :size="18" />
</div>
<div>
<h4 class="font-bold text-zinc-100 text-sm">即将批量驳回 {{ selectedSongs.length }} 首歌曲</h4>
<h4 class="font-bold text-zinc-900 text-sm">即将批量驳回 {{ selectedSongs.length }} 首歌曲</h4>
<p class="text-xs text-zinc-500">驳回后将一并清理投票、排期记录并发送通知给对应投稿人</p>
</div>
</div>
@@ -454,7 +454,7 @@
<textarea
v-model="rejectReason"
placeholder="请输入驳回原因,将通过系统通知发送给投稿人..."
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-4 text-sm text-zinc-200 focus:outline-none focus:border-red-500/30 min-h-[120px] resize-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-4 text-sm text-zinc-700 focus:outline-none focus:border-red-200 min-h-[120px] resize-none transition-all"
/>
</div>
@@ -462,11 +462,11 @@
<input
v-model="addToBlacklist"
type="checkbox"
class="w-4 h-4 rounded border-zinc-800 bg-zinc-950 accent-red-600"
class="w-4 h-4 rounded border-zinc-200 bg-white accent-red-600"
>
<div>
<span
class="text-xs font-bold text-zinc-300 group-hover:text-red-400 transition-colors"
class="text-xs font-bold text-zinc-600 group-hover:text-red-400 transition-colors"
>同时将此歌曲加入黑名单</span
>
<p class="text-[10px] text-zinc-600 font-medium">
@@ -476,9 +476,9 @@
</label>
</div>
<div class="px-8 py-6 bg-zinc-900/50 border-t border-zinc-800/50 flex gap-3 justify-end">
<div class="px-8 py-6 bg-zinc-50/50 border-t border-zinc-200 flex gap-3 justify-end">
<button
class="px-6 py-2.5 text-xs font-bold text-zinc-500 hover:text-zinc-300"
class="px-6 py-2.5 text-xs font-bold text-zinc-500 hover:text-zinc-600"
@click="cancelReject"
>
取消
@@ -516,18 +516,18 @@
>
<div
v-if="showEditModal || showAddSongModal"
class="fixed inset-0 z-50 flex items-center justify-center p-4 bg-zinc-950/80 backdrop-blur-sm overflow-y-auto"
class="fixed inset-0 z-50 flex items-center justify-center p-4 bg-white/80 backdrop-blur-sm overflow-y-auto"
>
<div
class="w-full max-w-2xl bg-zinc-900 border border-zinc-800 rounded-xl shadow-2xl overflow-hidden my-auto"
class="w-full max-w-2xl bg-white border border-zinc-200 rounded-xl shadow-2xl overflow-hidden my-auto"
@click.stop
>
<div class="px-8 py-6 border-b border-zinc-800/50 flex items-center justify-between">
<h3 class="text-xl font-black text-zinc-100">
<div class="px-8 py-6 border-b border-zinc-200 flex items-center justify-between">
<h3 class="text-xl font-black text-zinc-900">
{{ showEditModal ? '编辑歌曲' : '手动添加歌曲' }}
</h3>
<button
class="text-zinc-500 hover:text-zinc-300 transition-colors"
class="text-zinc-500 hover:text-zinc-600 transition-colors"
@click="showEditModal ? cancelEditSong() : cancelAddSong()"
>
<X :size="20" />
@@ -545,14 +545,14 @@
v-model="editForm.title"
type="text"
placeholder="输入歌曲标题"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 transition-all"
>
<input
v-else
v-model="addForm.title"
type="text"
placeholder="输入歌曲标题"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 transition-all"
>
</div>
<div class="space-y-2">
@@ -564,14 +564,14 @@
v-model="editForm.artist"
type="text"
placeholder="输入歌手姓名"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 transition-all"
>
<input
v-else
v-model="addForm.artist"
type="text"
placeholder="输入歌手姓名"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 transition-all"
>
</div>
</div>
@@ -587,7 +587,7 @@
v-model="editUserSearchQuery"
type="text"
placeholder="搜索用户姓名或用户名"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 transition-all"
@focus="showEditUserDropdown = true"
@input="searchEditUsers()"
>
@@ -596,7 +596,7 @@
v-model="userSearchQuery"
type="text"
placeholder="搜索用户姓名或用户名"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 transition-all"
@focus="showUserDropdown = true"
@input="searchUsers()"
>
@@ -605,7 +605,7 @@
class="absolute right-4 top-1/2 -translate-y-1/2"
>
<div
class="w-4 h-4 border-2 border-blue-500/20 border-t-blue-500 rounded-full animate-spin"
class="w-4 h-4 border-2 border-blue-200 border-t-blue-500 rounded-full animate-spin"
/>
</div>
</div>
@@ -617,18 +617,18 @@
? showEditUserDropdown && filteredEditUsers.length > 0
: showUserDropdown && filteredUsers.length > 0
"
class="absolute z-10 w-full mt-2 bg-zinc-900 border border-zinc-800 rounded-lg shadow-2xl overflow-hidden max-h-48 overflow-y-auto"
class="absolute z-10 w-full mt-2 bg-white border border-zinc-200 rounded-lg shadow-2xl overflow-hidden max-h-48 overflow-y-auto"
>
<div
v-for="user in showEditModal
? filteredEditUsers.slice(0, 10)
: filteredUsers.slice(0, 10)"
:key="user.id"
class="px-4 py-3 hover:bg-zinc-800 cursor-pointer transition-colors flex items-center justify-between group"
class="px-4 py-3 hover:bg-zinc-100 cursor-pointer transition-colors flex items-center justify-between group"
@click="showEditModal ? selectEditUser(user) : selectUser(user)"
>
<div class="flex flex-col">
<span class="text-sm font-bold text-zinc-200">{{ user.name }}</span>
<span class="text-sm font-bold text-zinc-700">{{ user.name }}</span>
<span class="text-[10px] text-zinc-500">@{{ user.username }}</span>
</div>
<Check
@@ -674,7 +674,7 @@
<span
v-for="collaborator in selectedEditCollaborators"
:key="collaborator.id"
class="inline-flex items-center gap-2 px-3 py-1.5 rounded-lg bg-zinc-950 border border-zinc-800 text-xs text-zinc-300"
class="inline-flex items-center gap-2 px-3 py-1.5 rounded-lg bg-white border border-zinc-200 text-xs text-zinc-600"
>
{{ getCollaboratorDisplayName(collaborator) }}
<button
@@ -690,7 +690,7 @@
v-model="editCollaboratorSearchQuery"
type="text"
placeholder="搜索并添加联合投稿人"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 transition-all"
@focus="showEditCollaboratorDropdown = true"
@input="searchEditCollaborators()"
>
@@ -699,21 +699,21 @@
class="absolute right-4 top-1/2 -translate-y-1/2"
>
<div
class="w-4 h-4 border-2 border-blue-500/20 border-t-blue-500 rounded-full animate-spin"
class="w-4 h-4 border-2 border-blue-200 border-t-blue-500 rounded-full animate-spin"
/>
</div>
<div
v-if="showEditCollaboratorDropdown && filteredEditCollaborators.length > 0"
class="absolute z-10 w-full mt-2 bg-zinc-900 border border-zinc-800 rounded-lg shadow-2xl overflow-hidden max-h-48 overflow-y-auto"
class="absolute z-10 w-full mt-2 bg-white border border-zinc-200 rounded-lg shadow-2xl overflow-hidden max-h-48 overflow-y-auto"
>
<div
v-for="user in filteredEditCollaborators.slice(0, 10)"
:key="user.id"
class="px-4 py-3 hover:bg-zinc-800 cursor-pointer transition-colors flex items-center justify-between group"
class="px-4 py-3 hover:bg-zinc-100 cursor-pointer transition-colors flex items-center justify-between group"
@click="selectEditCollaborator(user)"
>
<div class="flex flex-col">
<span class="text-sm font-bold text-zinc-200">{{ user.name }}</span>
<span class="text-sm font-bold text-zinc-700">{{ user.name }}</span>
<span class="text-[10px] text-zinc-500">@{{ user.username }}</span>
</div>
<Plus :size="14" class="text-blue-500 opacity-70 group-hover:opacity-100" />
@@ -759,8 +759,8 @@
class="inline-flex items-center gap-2 px-3 py-1.5 rounded-lg border text-[10px] font-black tracking-widest uppercase transition-all disabled:opacity-40 disabled:cursor-not-allowed"
:class="
submissionNoteClearRequested
? 'border-zinc-700 bg-zinc-950 text-zinc-300 hover:border-zinc-600'
: 'border-amber-500/20 bg-amber-500/10 text-amber-400 hover:bg-amber-500/20'
? 'border-zinc-200 bg-white text-zinc-600 hover:border-zinc-300'
: 'border-amber-500/20 bg-amber-500/10 text-amber-700 hover:bg-amber-500/20'
"
@click="
submissionNoteClearRequested
@@ -775,7 +775,7 @@
v-model="editForm.submissionNote"
:disabled="submissionNoteClearRequested"
placeholder="填写歌曲备注"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-4 text-sm text-zinc-200 focus:outline-none focus:border-blue-500/30 min-h-[120px] resize-none transition-all disabled:opacity-50 disabled:cursor-not-allowed"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-4 text-sm text-zinc-700 focus:outline-none focus:border-blue-200 min-h-[120px] resize-none transition-all disabled:opacity-50 disabled:cursor-not-allowed"
/>
<div
v-if="submissionNoteClearRequested"
@@ -787,16 +787,16 @@
<textarea
v-model="submissionNoteClearReason"
placeholder="可选:请输入清空备注的理由,例如:备注内容违规"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none focus:border-amber-500/30 min-h-[96px] resize-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none focus:border-amber-200 min-h-[96px] resize-none transition-all"
/>
<label class="flex items-center gap-3 cursor-pointer group">
<input
v-model="notifyOnSubmissionNoteClear"
type="checkbox"
class="w-4 h-4 rounded border-zinc-800 bg-zinc-950 accent-amber-500"
class="w-4 h-4 rounded border-zinc-200 bg-white accent-amber-500"
>
<div>
<span class="text-xs font-bold text-zinc-300 group-hover:text-amber-300 transition-colors"
<span class="text-xs font-bold text-zinc-600 group-hover:text-amber-300 transition-colors"
>清空后发送通知</span
>
<p class="text-[10px] text-zinc-600 font-medium">
@@ -806,7 +806,7 @@
</label>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-5 pt-4 border-t border-zinc-800/50">
<div class="grid grid-cols-1 md:grid-cols-2 gap-5 pt-4 border-t border-zinc-200">
<div class="space-y-2">
<label class="text-[10px] font-black text-zinc-600 uppercase tracking-widest px-1"
>音乐平台 (可选)</label
@@ -841,14 +841,14 @@
v-model="editForm.musicId"
type="text"
placeholder="输入平台唯一标识符"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none transition-all"
>
<input
v-else
v-model="addForm.musicId"
type="text"
placeholder="输入平台唯一标识符"
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none transition-all"
>
</div>
</div>
@@ -862,14 +862,14 @@
v-model="editForm.cover"
type="text"
placeholder="http://..."
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none transition-all"
>
<input
v-else
v-model="addForm.cover"
type="text"
placeholder="http://..."
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none transition-all"
>
<p
v-if="
@@ -901,14 +901,14 @@
v-model="editForm.playUrl"
type="text"
placeholder="http://..."
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none transition-all"
>
<input
v-else
v-model="addForm.playUrl"
type="text"
placeholder="http://..."
class="w-full bg-zinc-950 border border-zinc-800 rounded-lg px-4 py-3 text-sm text-zinc-200 focus:outline-none transition-all"
class="w-full bg-white border border-zinc-200 rounded-lg px-4 py-3 text-sm text-zinc-700 focus:outline-none transition-all"
>
<p
v-if="
@@ -932,9 +932,9 @@
</div>
</div>
<div class="px-8 py-6 bg-zinc-900/50 border-t border-zinc-800/50 flex gap-3 justify-end">
<div class="px-8 py-6 bg-zinc-50/50 border-t border-zinc-200 flex gap-3 justify-end">
<button
class="px-6 py-2.5 text-xs font-bold text-zinc-500 hover:text-zinc-300"
class="px-6 py-2.5 text-xs font-bold text-zinc-500 hover:text-zinc-600"
@click="showEditModal ? cancelEditSong() : cancelAddSong()"
>
取消