Files
chatroom/resources/views/admin/holiday-events/index.blade.php
T

249 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{-- 文件功能:后台节日福利活动列表页,展示节日福利模板并提供启用、立即触发、编辑、删除等操作。 --}}
@extends('admin.layouts.app')
@section('title', '节日福利管理')
@section('content')
@php require resource_path('views/admin/partials/list-theme.php'); @endphp
@php
$visibleEvents = $events->getCollection();
$enabledCount = $visibleEvents->where('enabled', true)->count();
$yearlyCount = $visibleEvents->where('repeat_type', 'yearly')->count();
$statusMap = [
'pending' => ['待触发', 'bg-amber-100 text-amber-700'],
'active' => ['领取中', 'bg-emerald-100 text-emerald-700'],
'completed' => ['已结束', 'bg-slate-100 text-slate-600'],
'cancelled' => ['已取消', 'bg-rose-100 text-rose-700'],
];
$repeatLabels = [
'once' => '一次',
'daily' => '每天',
'weekly' => '每周',
'monthly' => '每月',
'yearly' => '每年',
'cron' => 'CRON',
];
@endphp
<div class="{{ $adminListPageClass }}">
<div class="{{ $adminListHeaderCardClass }}">
<div class="flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between">
<div class="space-y-2">
<div>
<h2 class="{{ $adminListHeaderTitleClass }}">节日福利管理</h2>
<p class="{{ $adminListHeaderSubtitleClass }}">统一维护节日福利模板与触发计划。</p>
</div>
<div class="flex flex-wrap gap-2 text-xs font-semibold">
<span class="rounded-full bg-slate-100 px-3 py-1 text-slate-600">当前页 {{ $visibleEvents->count() }} 个活动</span>
<span class="rounded-full bg-emerald-100 px-3 py-1 text-emerald-700">已启用 {{ $enabledCount }} </span>
<span class="rounded-full bg-amber-100 px-3 py-1 text-amber-700">年度模板 {{ $yearlyCount }} </span>
</div>
</div>
<a href="{{ route('admin.holiday-events.create') }}"
class="inline-flex items-center justify-center gap-2 rounded-lg bg-amber-500 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:bg-amber-600">
<span class="text-base leading-none"></span>
<span>创建活动</span>
</a>
</div>
</div>
<div class="{{ $adminListCardClass }}">
<div class="{{ $adminListSectionHeadClass }}">
<div class="flex flex-col gap-1 lg:flex-row lg:items-center lg:justify-between">
<div>
<h3 class="{{ $adminListSectionTitleClass }}">福利模板列表</h3>
<p class="{{ $adminListSectionDescClass }}">列表按关键信息压缩展示,适合批量查看。</p>
</div>
<div class="text-xs text-slate-400">年度模板额外显示月日、持续天数、轮次与轮次间隔</div>
</div>
</div>
<div class="{{ $adminListTableWrapClass }}">
<table class="min-w-[1120px] w-full table-fixed text-sm">
<thead>
<tr class="{{ $adminListTableHeadRowClass }}">
<th class="{{ $adminListTableHeadCellClass }} w-14">编号</th>
<th class="{{ $adminListTableHeadCellClass }} w-[25%]">活动信息</th>
<th class="{{ $adminListTableHeadCellClass }} w-[10%]">奖池</th>
<th class="{{ $adminListTableHeadCellClass }} w-[10%]">分配</th>
<th class="{{ $adminListTableHeadCellClass }} w-[11%]">限额 / 重复</th>
<th class="{{ $adminListTableHeadCellClass }} w-[15%]">触发计划</th>
<th class="{{ $adminListTableHeadCellClass }} w-[13%]">运行状态</th>
<th class="{{ $adminListTableHeadCellClass }} w-[16%] text-right">操作</th>
</tr>
</thead>
<tbody class="{{ $adminListTableBodyClass }}">
@forelse ($events as $event)
@php
[$statusLabel, $statusClass] = $statusMap[$event->status] ?? ['未知', 'bg-slate-100 text-slate-600'];
$repeatLabel = $repeatLabels[$event->repeat_type] ?? '-';
$isRandomDistribute = $event->distribute_type === 'random';
$yearlyScheduleText =
data_get($event, 'schedule_month', $event->send_at?->format('n')) .
'月' .
data_get($event, 'schedule_day', $event->send_at?->format('j')) .
'日 · ' .
data_get($event, 'duration_days', 1) .
'天 · 每天' .
data_get($event, 'daily_occurrences', 1) .
'次 · 间隔' .
data_get($event, 'occurrence_interval_minutes', 60) .
'分钟';
@endphp
<tr class="align-top transition hover:bg-slate-50/70 {{ !$event->enabled ? 'opacity-60' : '' }}">
<td class="px-4 py-4">
<div class="flex h-9 w-9 items-center justify-center rounded-lg bg-slate-100 text-sm font-bold text-slate-600">
{{ $event->id }}
</div>
</td>
<td class="px-4 py-4">
<div class="space-y-1.5">
<div class="text-base font-bold tracking-tight text-slate-800">{{ $event->name }}</div>
<div class="flex flex-wrap gap-2 text-[11px] font-semibold">
<span class="rounded-full bg-slate-100 px-2.5 py-1 text-slate-600">{{ $repeatLabel }}</span>
@if ($event->repeat_type === 'yearly')
<span class="rounded-full bg-amber-50 px-2.5 py-1 text-amber-700">年度固定节日模板</span>
@endif
</div>
<div class="max-w-md text-xs leading-6 text-slate-500">
{{ Str::limit($event->description ?: '未填写节日祝福语,当前活动将广播默认福利提示。', 32) }}
</div>
</div>
</td>
<td class="px-4 py-4">
<div class="font-black text-2xl tracking-tight text-amber-600">{{ number_format($event->total_amount) }}</div>
<div class="mt-1 text-xs text-slate-500">金币奖池</div>
</td>
<td class="px-4 py-4">
<div class="space-y-1.5">
<span
class="inline-flex rounded-full px-2.5 py-1 text-xs font-bold {{ $isRandomDistribute ? 'bg-fuchsia-100 text-fuchsia-700' : 'bg-sky-100 text-sky-700' }}">
{{ $isRandomDistribute ? '随机分配' : '固定金额' }}
</span>
<div class="text-xs leading-5 text-slate-500">
@if ($isRandomDistribute)
按本轮人数拆分
@else
每人 {{ number_format($event->fixed_amount) }} 金币
@endif
</div>
</div>
</td>
<td class="px-4 py-4">
<div class="space-y-2 text-xs leading-5 text-slate-500">
<div>
<div class="font-medium text-slate-700">限额人数</div>
<div class="mt-0.5 text-sm font-bold text-slate-800">
{{ $event->max_claimants === 0 ? '不限人数' : $event->max_claimants . ' 人' }}
</div>
</div>
<div>
<div class="font-medium text-slate-700">重复策略</div>
<div class="mt-0.5">{{ $repeatLabel }}</div>
</div>
</div>
</td>
<td class="px-4 py-4">
<div class="space-y-2 text-xs leading-5 text-slate-500">
<div>
<div class="font-medium text-slate-700">最近计划时间</div>
<div class="mt-0.5 text-xl font-black tracking-tight text-slate-800">{{ $event->send_at->format('m-d H:i') }}</div>
<div class="mt-0.5">{{ $event->send_at->format('Y-m-d') }}</div>
</div>
@if ($event->repeat_type === 'yearly')
<div class="rounded-lg bg-amber-50 px-2.5 py-2 text-amber-700">
{{ Str::limit($yearlyScheduleText, 22) }}
</div>
@endif
</div>
</td>
<td class="px-4 py-4">
<div class="space-y-2">
<div class="flex flex-wrap gap-2">
<span class="inline-flex rounded-full px-2.5 py-1 text-xs font-bold {{ $statusClass }}">
{{ $statusLabel }}
</span>
<span data-role="enabled-badge"
class="inline-flex rounded-full px-2.5 py-1 text-xs font-bold {{ $event->enabled ? 'bg-emerald-100 text-emerald-700' : 'bg-slate-100 text-slate-500' }}">
{{ $event->enabled ? '已启用' : '已停用' }}
</span>
</div>
<button type="button"
data-holiday-event-toggle-url="{{ route('admin.holiday-events.toggle', $event) }}"
class="inline-flex items-center gap-2 rounded-lg px-3 py-2 text-xs font-bold transition {{ $event->enabled ? 'bg-emerald-500 text-white hover:bg-emerald-600' : 'bg-slate-200 text-slate-600 hover:bg-slate-300' }}"
data-enabled="{{ $event->enabled ? '1' : '0' }}">
<span data-role="toggle-dot"
class="h-2 w-2 rounded-full {{ $event->enabled ? 'bg-white' : 'bg-slate-500' }}"></span>
<span data-role="toggle-label">{{ $event->enabled ? '切换为停用' : '重新启用模板' }}</span>
</button>
<div class="text-xs leading-5 text-slate-500">
@if ($event->triggered_at)
最近触发:{{ $event->triggered_at->format('m-d H:i') }}
@else
尚未产生发放批次
@endif
</div>
</div>
</td>
<td class="px-4 py-4">
<div class="flex flex-wrap justify-end gap-2">
@if ($event->status === 'pending')
<form action="{{ route('admin.holiday-events.trigger-now', $event) }}"
method="POST" data-holiday-event-confirm="确定立即触发此活动吗?">
@csrf
<button type="submit"
class="{{ $adminListActionButtonClass }} inline-flex items-center justify-center bg-amber-500 text-white hover:bg-amber-600">
立即触发
</button>
</form>
@endif
<a href="{{ route('admin.holiday-events.edit', $event) }}"
class="{{ $adminListActionButtonClass }} inline-flex items-center justify-center bg-indigo-50 text-indigo-700 hover:bg-indigo-100">
编辑
</a>
<form action="{{ route('admin.holiday-events.destroy', $event) }}" method="POST"
data-holiday-event-confirm="确定删除此活动吗?">
@csrf
@method('DELETE')
<button type="submit"
class="{{ $adminListActionButtonClass }} inline-flex items-center justify-center bg-rose-50 text-rose-600 hover:bg-rose-100">
删除
</button>
</form>
</div>
</td>
</tr>
@empty
<tr>
<td colspan="8" class="{{ $adminListEmptyClass }}">
暂无节日福利活动,<a href="{{ route('admin.holiday-events.create') }}"
class="font-bold text-amber-500 hover:text-amber-600">立即创建一个</a>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
@if ($events->hasPages())
<div class="{{ $adminListPaginationClass }}">
{{ $events->links() }}
</div>
@endif
</div>
</div>
@endsection