优化功能
This commit is contained in:
@@ -2,89 +2,176 @@
|
||||
|
||||
@section('title', $item->exists ? '编辑资讯' : '新建资讯')
|
||||
|
||||
@section('head')
|
||||
@include('admin.partials.modern-form-head')
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="card">
|
||||
<div class="card modern-form-card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h3 class="card-title mb-0">{{ $item->exists ? '编辑资讯' : '新建资讯' }}</h3>
|
||||
@if($item->exists)
|
||||
<div class="d-flex gap-2">
|
||||
<form method="post" action="{{ route('admin.articles.publish', $item) }}">@csrf<button class="btn btn-sm btn-success" type="submit">发布</button></form>
|
||||
<form method="post" action="{{ route('admin.articles.mark-stale', $item) }}">@csrf<button class="btn btn-sm btn-warning" type="submit">标记失效</button></form>
|
||||
<form method="post" action="{{ route('admin.articles.publish', $item) }}">
|
||||
@csrf
|
||||
<button class="btn btn-sm btn-success" type="submit">发布</button>
|
||||
</form>
|
||||
<form method="post" action="{{ route('admin.articles.mark-stale', $item) }}">
|
||||
@csrf
|
||||
<button class="btn btn-sm btn-warning" type="submit">标记失效</button>
|
||||
</form>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<p class="required-tip"><span class="required-star">*</span> 为必填项</p>
|
||||
|
||||
<form method="post" action="{{ $submitRoute }}" class="row g-3">
|
||||
@csrf
|
||||
@if($method !== 'POST') @method($method) @endif
|
||||
|
||||
<div class="col-md-8"><label class="form-label">标题</label><input class="form-control" name="title" value="{{ old('title', $item->title) }}" required></div>
|
||||
<div class="col-md-4"><label class="form-label">Slug</label><input class="form-control" name="slug" value="{{ old('slug', $item->slug) }}" required></div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">分类</label>
|
||||
<select class="form-select" name="category_id">
|
||||
<option value="">未分类</option>
|
||||
@foreach($categories as $category)
|
||||
<option value="{{ $category->id }}" @selected((string) old('category_id', $item->category_id) === (string) $category->id)>{{ $category->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">来源</label>
|
||||
<select class="form-select" name="source_id">
|
||||
<option value="">无</option>
|
||||
@foreach($sources as $source)
|
||||
<option value="{{ $source->id }}" @selected((string) old('source_id', $item->source_id) === (string) $source->id)>{{ $source->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3"><label class="form-label">来源名称</label><input class="form-control" name="source_name" value="{{ old('source_name', $item->source_name) }}"></div>
|
||||
<div class="col-md-3"><label class="form-label">来源 URL</label><input class="form-control" name="source_url" value="{{ old('source_url', $item->source_url) }}"></div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">来源等级</label>
|
||||
<select class="form-select" name="source_level">
|
||||
@foreach(['official' => 'official','trusted_media' => 'trusted_media','community' => 'community','unknown' => 'unknown'] as $value => $label)
|
||||
<option value="{{ $value }}" @selected(old('source_level', $item->source_level?->value ?? 'unknown') === $value)>{{ $label }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">状态</label>
|
||||
<select class="form-select" name="status">
|
||||
@foreach($statusOptions as $status)
|
||||
<option value="{{ $status->value }}" @selected(old('status', $item->status?->value) === $status->value)>{{ $status->value }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3"><label class="form-label">发布日期</label><input class="form-control" type="datetime-local" name="published_at" value="{{ old('published_at', optional($item->published_at)->format('Y-m-d\TH:i')) }}"></div>
|
||||
<div class="col-md-3"><label class="form-label">最后校验</label><input class="form-control" type="datetime-local" name="last_verified_at" value="{{ old('last_verified_at', optional($item->last_verified_at)->format('Y-m-d\TH:i')) }}"></div>
|
||||
<div class="col-12"><label class="form-check"><input class="form-check-input" type="checkbox" name="is_stale" value="1" @checked(old('is_stale', $item->is_stale))><span class="form-check-label">标记失效</span></label></div>
|
||||
|
||||
<div class="col-12"><label class="form-label">摘要</label><textarea class="form-control" name="excerpt" rows="2" required>{{ old('excerpt', $item->excerpt) }}</textarea></div>
|
||||
<div class="col-12">
|
||||
<div class="d-flex justify-content-between align-items-center mb-1">
|
||||
<label class="form-label mb-0">正文(Markdown)</label>
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<small class="text-muted">支持图片:`` 或 ``</small>
|
||||
<button class="btn btn-sm btn-outline-primary js-md-upload-btn" type="button" data-target="[name='body']">
|
||||
<i class="bi bi-image me-1"></i>上传图片
|
||||
</button>
|
||||
<section class="form-section">
|
||||
<h4 class="form-section-title">基础信息</h4>
|
||||
<p class="form-section-subtitle">先完成标题、摘要、来源和状态,确保资讯可正确归档。</p>
|
||||
|
||||
<div class="row g-3">
|
||||
<div class="col-md-8 field-required">
|
||||
<label class="form-label">标题<span class="required-star">*</span></label>
|
||||
<input class="form-control" name="title" value="{{ old('title', $item->title) }}" required>
|
||||
</div>
|
||||
<div class="col-md-4 field-required">
|
||||
<label class="form-label">Slug<span class="required-star">*</span></label>
|
||||
<input class="form-control" name="slug" value="{{ old('slug', $item->slug) }}" required>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">分类</label>
|
||||
<select class="form-select" name="category_id">
|
||||
<option value="">未分类</option>
|
||||
@foreach($categories as $category)
|
||||
<option value="{{ $category->id }}" @selected((string) old('category_id', $item->category_id) === (string) $category->id)>{{ $category->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">来源</label>
|
||||
<select class="form-select" name="source_id">
|
||||
<option value="">无</option>
|
||||
@foreach($sources as $source)
|
||||
<option value="{{ $source->id }}" @selected((string) old('source_id', $item->source_id) === (string) $source->id)>{{ $source->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">来源名称</label>
|
||||
<input class="form-control" name="source_name" value="{{ old('source_name', $item->source_name) }}" placeholder="媒体名 / 机构名">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">来源 URL</label>
|
||||
<input class="form-control" name="source_url" value="{{ old('source_url', $item->source_url) }}" placeholder="https://example.com/news/1">
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 field-required">
|
||||
<label class="form-label">来源等级<span class="required-star">*</span></label>
|
||||
<select class="form-select" name="source_level" required>
|
||||
@foreach(['official' => '官方', 'trusted_media' => '可信媒体', 'community' => '社区', 'unknown' => '未知'] as $value => $label)
|
||||
<option value="{{ $value }}" @selected(old('source_level', $item->source_level?->value ?? 'unknown') === $value)>{{ $label }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 field-required">
|
||||
<label class="form-label">状态<span class="required-star">*</span></label>
|
||||
<select class="form-select" name="status" required>
|
||||
@foreach($statusOptions as $status)
|
||||
<option value="{{ $status->value }}" @selected(old('status', $item->status?->value) === $status->value)>{{ $status->value }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">发布时间</label>
|
||||
<input class="form-control" type="datetime-local" name="published_at" value="{{ old('published_at', optional($item->published_at)->format('Y-m-d\TH:i')) }}">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">最后校验时间</label>
|
||||
<input class="form-control" type="datetime-local" name="last_verified_at" value="{{ old('last_verified_at', optional($item->last_verified_at)->format('Y-m-d\TH:i')) }}">
|
||||
</div>
|
||||
|
||||
<div class="col-md-10 field-required">
|
||||
<label class="form-label">摘要<span class="required-star">*</span></label>
|
||||
<textarea class="form-control" name="excerpt" rows="2" required>{{ old('excerpt', $item->excerpt) }}</textarea>
|
||||
</div>
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<label class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="is_stale" value="1" @checked(old('is_stale', $item->is_stale))>
|
||||
<span class="form-check-label">标记失效</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<textarea class="form-control font-monospace js-md-editor" name="body" rows="14" required>{{ old('body', $item->body) }}</textarea>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-12"><label class="form-label">失效说明</label><textarea class="form-control" name="stale_note" rows="2">{{ old('stale_note', $item->stale_note) }}</textarea></div>
|
||||
|
||||
<div class="col-md-6"><label class="form-label">SEO 标题</label><input class="form-control" name="seo_title" value="{{ old('seo_title', $item->seo_title) }}"></div>
|
||||
<div class="col-md-6"><label class="form-label">SEO 描述</label><input class="form-control" name="seo_description" value="{{ old('seo_description', $item->seo_description) }}"></div>
|
||||
<div class="col-md-6"><label class="form-label">H1</label><input class="form-control" name="h1" value="{{ old('h1', $item->h1) }}"></div>
|
||||
<div class="col-md-6"><label class="form-label">Canonical</label><input class="form-control" name="canonical_url" value="{{ old('canonical_url', $item->canonical_url) }}"></div>
|
||||
<div class="col-12">
|
||||
<section class="form-section">
|
||||
<h4 class="form-section-title">内容编辑</h4>
|
||||
<p class="form-section-subtitle">正文为必填,系统会按统一规则渲染 Markdown 并用于前台展示。</p>
|
||||
|
||||
<div class="col-12"><button class="btn btn-primary" type="submit">保存</button></div>
|
||||
@include('admin.partials.markdown-editor', [
|
||||
'field' => 'body',
|
||||
'value' => $item->body,
|
||||
'label' => '正文内容(Markdown)',
|
||||
'required' => true,
|
||||
'rows' => 18,
|
||||
'minlength' => 100,
|
||||
'previewId' => 'article-body-preview',
|
||||
'hint' => '后端要求正文不少于 100 字符,请优先完善结构化内容。',
|
||||
])
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<details class="advanced-panel">
|
||||
<summary>高级设置(SEO 与补充字段)</summary>
|
||||
|
||||
<div class="row g-3 mt-2">
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">失效说明</label>
|
||||
<textarea class="form-control" name="stale_note" rows="2">{{ old('stale_note', $item->stale_note) }}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">SEO 标题</label>
|
||||
<input class="form-control" name="seo_title" value="{{ old('seo_title', $item->seo_title) }}">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">SEO 描述</label>
|
||||
<input class="form-control" name="seo_description" value="{{ old('seo_description', $item->seo_description) }}">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">H1</label>
|
||||
<input class="form-control" name="h1" value="{{ old('h1', $item->h1) }}">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label">Canonical URL</label>
|
||||
<input class="form-control" name="canonical_url" value="{{ old('canonical_url', $item->canonical_url) }}" placeholder="https://example.com/news/slug">
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<div class="col-12">
|
||||
<div class="editor-sticky-actions">
|
||||
<small class="text-muted">正文建议包含结论段,便于前台摘要抓取。</small>
|
||||
<button class="btn btn-primary" type="submit">保存资讯</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('scripts')
|
||||
@include('admin.partials.modern-form-scripts')
|
||||
@endsection
|
||||
|
||||
|
||||
@@ -2,20 +2,27 @@
|
||||
|
||||
@section('title', 'AI 资讯管理')
|
||||
|
||||
@section('head')
|
||||
@include('admin.partials.modern-index-head')
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="card mb-3">
|
||||
<div class="card-body d-flex flex-column flex-lg-row gap-2 align-items-lg-center justify-content-between">
|
||||
<div class="card modern-index-toolbar mb-3">
|
||||
<div class="card-body d-flex flex-column flex-lg-row gap-3 align-items-lg-center justify-content-between">
|
||||
<form method="get" action="{{ route('admin.articles.index') }}" class="d-flex flex-column flex-md-row gap-2 w-100">
|
||||
<input class="form-control" type="text" name="q" value="{{ $filters['q'] ?? '' }}" placeholder="搜索资讯标题 / 正文关键词">
|
||||
<button class="btn btn-primary" type="submit"><i class="bi bi-search me-1"></i>搜索</button>
|
||||
</form>
|
||||
<a class="btn btn-success" href="{{ route('admin.articles.create') }}"><i class="bi bi-plus-circle me-1"></i>新建资讯</a>
|
||||
</div>
|
||||
<div class="card-footer bg-transparent border-0 pt-0">
|
||||
<div class="toolbar-meta">共 {{ number_format($items->total()) }} 条资讯记录</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card modern-index-card">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table modern-index-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>标题</th>
|
||||
@@ -29,16 +36,20 @@
|
||||
@forelse($items as $item)
|
||||
<tr>
|
||||
<td>
|
||||
<div class="fw-semibold">{{ $item->title }}</div>
|
||||
<div class="text-muted small">{{ $item->excerpt }}</div>
|
||||
<div class="modern-index-title">{{ $item->title }}</div>
|
||||
<div class="modern-index-summary">{{ $item->excerpt }}</div>
|
||||
</td>
|
||||
<td><span class="badge bg-azure-lt text-azure-fg">{{ $item->status?->value ?? '-' }}</span></td>
|
||||
<td>@include('admin.partials.status-badge', ['status' => $item->status])</td>
|
||||
<td>{{ $item->source_level?->value ?? '-' }}</td>
|
||||
<td>{{ $item->published_at?->format('Y-m-d H:i') ?: '-' }}</td>
|
||||
<td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('admin.articles.edit', $item) }}">编辑</a></td>
|
||||
<td class="text-end">
|
||||
<a class="btn btn-sm btn-outline-primary" href="{{ route('admin.articles.edit', $item) }}">编辑</a>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr><td colspan="5" class="text-center text-muted py-4">暂无资讯数据</td></tr>
|
||||
<tr>
|
||||
<td colspan="5" class="text-center text-muted py-5">暂无资讯数据,先新增一条内容吧。</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -46,3 +57,4 @@
|
||||
<div class="card-footer">{{ $items->links() }}</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
|
||||
Reference in New Issue
Block a user