180 lines
12 KiB
PHP
180 lines
12 KiB
PHP
@extends('admin.layout', [
|
||
'title' => 'Tstore Admin · ' . $package->name,
|
||
'pageTitle' => $package->name,
|
||
'pageSubtitle' => ($package->type === 'plugin' ? '插件' : ($package->type === 'theme' ? '主题' : $package->type)) . ' · ' . $package->slug,
|
||
])
|
||
|
||
@php
|
||
$entityLabel = $package->type === 'plugin' ? '插件' : ($package->type === 'theme' ? '主题' : '扩展');
|
||
@endphp
|
||
|
||
@section('content')
|
||
<div class="grid">
|
||
<div class="split">
|
||
<div class="panel">
|
||
<div class="section-title">
|
||
<div>
|
||
<h2>{{ $entityLabel }}信息</h2>
|
||
<p>编辑基础元数据、分类、图标与发布状态。</p>
|
||
</div>
|
||
</div>
|
||
<form method="post" action="{{ route('webadmin.packages.update', [$package->type, $package->slug]) }}" class="grid">
|
||
@csrf @method('PUT')
|
||
<div class="form-grid">
|
||
<div class="field"><label>类型</label><input class="input" name="type" value="{{ $package->type }}" readonly></div>
|
||
<div class="field"><label>Slug</label><input class="input" name="slug" value="{{ $package->slug }}" readonly></div>
|
||
<div class="field"><label>名称</label><input class="input" name="name" value="{{ $package->name }}" required></div>
|
||
<div class="field"><label>状态</label>
|
||
<select class="select" name="status">
|
||
@foreach (['draft','published','hidden','deprecated'] as $status)
|
||
<option value="{{ $status }}" @selected($package->status === $status)>{{ $status }}</option>
|
||
@endforeach
|
||
</select>
|
||
</div>
|
||
<div class="field"><label>作者</label><input class="input" name="author" value="{{ $package->author }}"></div>
|
||
<div class="field"><label>License</label><input class="input" name="license" value="{{ $package->license }}"></div>
|
||
<div class="field"><label>主页</label><input class="input" name="homepage" value="{{ $package->homepage }}"></div>
|
||
<div class="field"><label>图标 URL</label><input class="input" name="icon_url" value="{{ $package->icon_url }}"></div>
|
||
</div>
|
||
<div class="field"><label>摘要</label><input class="input" name="summary" value="{{ $package->summary }}"></div>
|
||
<div class="field"><label>描述</label><textarea name="description">{{ $package->description }}</textarea></div>
|
||
<div class="field"><label>分类 slug,多个用逗号或空格分隔</label><input class="input" name="categories_text" value="{{ $package->categories->pluck('slug')->implode(', ') }}"></div>
|
||
<div class="form-actions">
|
||
<button class="btn" type="submit">保存{{ $entityLabel }}信息</button>
|
||
<a class="btn secondary" href="{{ route('webadmin.packages', ['type' => $package->type]) }}">返回{{ $entityLabel }}列表</a>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
|
||
<div class="panel">
|
||
<div class="section-title">
|
||
<div>
|
||
<h2>当前状态</h2>
|
||
<p>快速查看分类、版本、下载与截图信息。</p>
|
||
</div>
|
||
</div>
|
||
<div class="list">
|
||
<div class="mini-card"><h3>状态</h3><div class="tags"><span class="chip {{ $package->status === 'published' ? 'ok' : 'warn' }}">{{ $package->status }}</span><span class="chip">下载 {{ $package->download_count }}</span><span class="chip {{ $package->is_featured ? 'ok' : 'muted' }}">{{ $package->is_featured ? '推荐' : '普通' }}</span></div></div>
|
||
<div class="mini-card"><h3>分类</h3><div class="tags">@forelse($package->categories as $category)<span class="chip">{{ $category->name }}</span>@empty<span class="muted">尚未关联分类</span>@endforelse</div></div>
|
||
<div class="mini-card"><h3>截图</h3><div class="muted">{{ $package->screenshots->count() }} 张</div></div>
|
||
<div class="mini-card"><h3>最新版本</h3><div class="muted">{{ $package->latest_version ?: '尚未发布' }}</div></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="split">
|
||
<div class="panel">
|
||
<div class="section-title">
|
||
<div>
|
||
<h2>版本记录</h2>
|
||
<p>查看版本状态,也可以直接删除历史版本。</p>
|
||
</div>
|
||
</div>
|
||
<div class="table-wrap">
|
||
<table class="table">
|
||
<thead>
|
||
<tr>
|
||
<th>版本</th>
|
||
<th>稳定版</th>
|
||
<th>最新</th>
|
||
<th>兼容性</th>
|
||
<th>发布时间</th>
|
||
<th>操作</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
@forelse ($package->versions as $version)
|
||
<tr>
|
||
<td>
|
||
<strong>{{ $version->version }}</strong>
|
||
<div class="muted">{{ $version->package_url ?: '未设置 package_url' }}</div>
|
||
</td>
|
||
<td><span class="chip {{ $version->is_stable ? 'ok' : 'warn' }}">{{ $version->is_stable ? '是' : '否' }}</span></td>
|
||
<td><span class="chip {{ $version->is_latest ? 'ok' : 'muted' }}">{{ $version->is_latest ? '最新' : '历史' }}</span></td>
|
||
<td>
|
||
<div class="muted">Typecho {{ $version->typecho_min ?: '-' }} ~ {{ $version->typecho_max ?: '-' }}</div>
|
||
<div class="muted">PHP {{ $version->php_min ?: '-' }} ~ {{ $version->php_max ?: '-' }}</div>
|
||
</td>
|
||
<td>{{ optional($version->published_at)->format('Y-m-d H:i') }}</td>
|
||
<td>
|
||
<form method="post" action="{{ route('webadmin.packages.versions.destroy', [$package->type, $package->slug, $version->id]) }}" onsubmit="return confirm('确认删除这个版本吗?');">
|
||
@csrf @method('DELETE')
|
||
<button class="btn danger small" type="submit">删除</button>
|
||
</form>
|
||
</td>
|
||
</tr>
|
||
@empty
|
||
<tr><td colspan="6"><div class="empty">当前还没有版本记录。</div></td></tr>
|
||
@endforelse
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel">
|
||
<div class="section-title">
|
||
<div>
|
||
<h2>zip 上传发布</h2>
|
||
<p>优先读取 zip 根目录的 manifest.json;如果没有 manifest.json,则使用下方手动填写的版本和兼容性字段。</p>
|
||
</div>
|
||
</div>
|
||
<form method="post" action="{{ route('webadmin.packages.publish', [$package->type, $package->slug]) }}" class="grid" enctype="multipart/form-data">
|
||
@csrf
|
||
<div class="field"><label>zip 文件</label><input class="input" type="file" name="package_file" accept=".zip" required></div>
|
||
<div class="field"><label>版本号(无 manifest 时必填)</label><input class="input" name="version" value="{{ old('version') }}" placeholder="1.0.0"></div>
|
||
<div class="field"><label>发布说明(可选)</label><textarea name="changelog" placeholder="补充这次发布说明">{{ old('changelog') }}</textarea></div>
|
||
<div class="form-grid">
|
||
<div class="field"><label>Typecho Min</label><input class="input" name="typecho_min" value="{{ old('typecho_min', '1.2.0') }}" placeholder="1.2.0"></div>
|
||
<div class="field"><label>Typecho Max</label><input class="input" name="typecho_max" value="{{ old('typecho_max') }}" placeholder="1.3.*"></div>
|
||
<div class="field"><label>PHP Min</label><input class="input" name="php_min" value="{{ old('php_min', '7.4') }}" placeholder="7.4"></div>
|
||
<div class="field"><label>PHP Max</label><input class="input" name="php_max" value="{{ old('php_max') }}" placeholder="8.3"></div>
|
||
<div class="field"><label>PHP Extensions</label><input class="input" name="php_extensions" value="{{ is_array(old('php_extensions')) ? implode(',', old('php_extensions')) : old('php_extensions') }}" placeholder="curl,json"></div>
|
||
<div class="field"><label>发布时间(可选)</label><input class="input" type="datetime-local" name="published_at" value="{{ old('published_at') }}"></div>
|
||
</div>
|
||
<div class="form-grid">
|
||
<div class="field"><label>发布选项</label>
|
||
<div class="tags">
|
||
<label><input type="checkbox" name="is_stable" value="1" @checked(old('is_stable', 1))> 设为稳定版</label>
|
||
<label><input type="checkbox" name="mark_as_latest" value="1" @checked(old('mark_as_latest', 1))> 设为最新</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="form-actions"><button class="btn" type="submit">上传并发布</button></div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="panel">
|
||
<div class="section-title">
|
||
<div>
|
||
<h2>手动添加版本</h2>
|
||
<p>调试阶段可以快速手动录入版本元数据。</p>
|
||
</div>
|
||
</div>
|
||
<form method="post" action="{{ route('webadmin.packages.versions.store', [$package->type, $package->slug]) }}" class="grid">
|
||
@csrf
|
||
<div class="form-grid">
|
||
<div class="field"><label>版本号</label><input class="input" name="version" placeholder="1.0.0" required></div>
|
||
<div class="field"><label>发布时间</label><input class="input" type="datetime-local" name="published_at"></div>
|
||
<div class="field"><label>Typecho Min</label><input class="input" name="typecho_min" placeholder="1.2.0"></div>
|
||
<div class="field"><label>Typecho Max</label><input class="input" name="typecho_max" placeholder="1.3.*"></div>
|
||
<div class="field"><label>PHP Min</label><input class="input" name="php_min" placeholder="7.4"></div>
|
||
<div class="field"><label>PHP Max</label><input class="input" name="php_max" placeholder="8.3"></div>
|
||
<div class="field"><label>Package URL</label><input class="input" name="package_url" placeholder="https://..."></div>
|
||
<div class="field"><label>Size</label><input class="input" name="package_size" type="number" placeholder="238000"></div>
|
||
<div class="field"><label>SHA256</label><input class="input" name="sha256" placeholder="可选,默认会补 64 位 0"></div>
|
||
<div class="field"><label>PHP Extensions</label><input class="input" name="php_extensions" placeholder="curl,json"></div>
|
||
</div>
|
||
<div class="field"><label>发布说明</label><textarea name="changelog" placeholder="输入更新内容"></textarea></div>
|
||
<div class="form-grid">
|
||
<label><input type="checkbox" name="is_stable" value="1"> 设为稳定版</label>
|
||
<label><input type="checkbox" name="is_latest" value="1"> 设为最新版本</label>
|
||
</div>
|
||
<div class="form-actions">
|
||
<button class="btn" type="submit">添加版本</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
@endsection
|