feat(B2): verifier + verification + seat_template admin views
parent
d8c45fbb87
commit
a104f16f01
|
|
@ -0,0 +1,107 @@
|
|||
{{:ModuleInclude('public/header')}}
|
||||
|
||||
<div class="right-content">
|
||||
<div class="content-nav">
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'index')}}" class="am-btn am-btn-secondary am-btn-xs">
|
||||
<i class="am-icon-angle-left"></i> 返回
|
||||
</a>
|
||||
<span>座位模板</span>
|
||||
</div>
|
||||
|
||||
<!-- 搜索栏 -->
|
||||
<div class="am-scrollable-horizontal">
|
||||
<div class="am-margin-bottom-sm">
|
||||
<form action="{{:PluginsAdminUrl('vr_ticket', 'admin', 'SeatTemplateList')}}" method="GET" class="am-form-inline">
|
||||
<div class="am-input-group am-input-group-sm am-fl" style="width: 200px;">
|
||||
<input type="text" name="name" value="{{$name|default=''}}" placeholder="搜索模板名称" class="am-radius" />
|
||||
</div>
|
||||
<div class="am-input-group am-input-group-sm am-fl am-margin-left-sm" style="width: 120px;">
|
||||
<select name="status" class="am-radius">
|
||||
<option value="">全部状态</option>
|
||||
<option value="1" {{if isset($status) && $status==1}}selected{{/if}}>启用</option>
|
||||
<option value="0" {{if isset($status) && $status==0}}selected{{/if}}>禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="am-btn am-btn-default am-btn-xs am-radius am-fl am-margin-left-sm">
|
||||
<i class="am-icon-search"></i> 搜索
|
||||
</button>
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'SeatTemplateSave')}}" class="am-btn am-btn-primary am-btn-xs am-radius am-fr">
|
||||
<i class="am-icon-plus"></i> 添加模板
|
||||
</a>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<table class="am-table am-table-striped am-table-hover am-text-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>模板名称</th>
|
||||
<th>座位数</th>
|
||||
<th>状态</th>
|
||||
<th>添加时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{if !empty($list)}}
|
||||
{{foreach $list as $item}}
|
||||
<tr>
|
||||
<td>{{$item.id}}</td>
|
||||
<td>{{$item.name}}</td>
|
||||
<td>{{$item.seat_count|default=0}}</td>
|
||||
<td>
|
||||
{{if $item.status == 1}}
|
||||
<span class="am-badge am-badge-success">启用</span>
|
||||
{{else}}
|
||||
<span class="am-badge am-badge-danger">禁用</span>
|
||||
{{/if}}
|
||||
</td>
|
||||
<td>{{if !empty($item.created_at)}}{{date('Y-m-d H:i', $item.created_at)}}{{/if}}</td>
|
||||
<td>
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'SeatTemplateSave', ['id'=>$item.id])}}" class="am-btn am-btn-default am-btn-xs am-radius">
|
||||
<i class="am-icon-edit"></i> 编辑
|
||||
</a>
|
||||
<button type="button" class="am-btn am-btn-danger am-btn-xs am-radius" onclick="toggleTemplate({{$item.id}}, {{$item.status}})">
|
||||
{{if $item.status == 1}}<i class="am-icon-ban"></i> 禁用{{else}}<i class="am-icon-check"></i> 启用{{/if}}
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
{{/foreach}}
|
||||
{{else}}
|
||||
<tr>
|
||||
<td colspan="6" class="am-text-center">暂无数据</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- 分页 -->
|
||||
{{if !empty($page)}}{{$page|raw}}{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function toggleTemplate(id, currentStatus) {
|
||||
var action = currentStatus == 1 ? '禁用' : '启用';
|
||||
if (!confirm('确定' + action + '该模板?')) return;
|
||||
var url = currentStatus == 1
|
||||
? '{{:PluginsAdminUrl("vr_ticket", "admin", "SeatTemplateDelete")}}'
|
||||
: '{{:PluginsAdminUrl("vr_ticket", "admin", "SeatTemplateEnable")}}';
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'POST',
|
||||
data: {id: id},
|
||||
dataType: 'json',
|
||||
success: function(res) {
|
||||
if (res.code >= 0) {
|
||||
location.reload();
|
||||
} else {
|
||||
alert(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
{{:ModuleInclude('public/footer')}}
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
{{:ModuleInclude('public/header')}}
|
||||
|
||||
<style>
|
||||
.venue-editor {
|
||||
background: #fff;
|
||||
padding: 30px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,0.05);
|
||||
}
|
||||
.section-title {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin: 30px 0 20px 0;
|
||||
padding-left: 10px;
|
||||
border-left: 4px solid #1677ff;
|
||||
}
|
||||
.seat-preview {
|
||||
background: #fdfdfd;
|
||||
border: 2px dashed #eee;
|
||||
padding: 60px 20px 40px 20px;
|
||||
min-height: 200px;
|
||||
position: relative;
|
||||
overflow: auto;
|
||||
}
|
||||
.seat-row {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-bottom: 5px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.seat-col {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin: 2px;
|
||||
border-radius: 4px;
|
||||
background: #eee;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 10px;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
.seat-col:hover {
|
||||
transform: scale(1.2);
|
||||
z-index: 10;
|
||||
}
|
||||
.seat-empty {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin: 2px;
|
||||
background: transparent;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="right-content">
|
||||
<div class="content-nav">
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'SeatTemplateList')}}" class="am-btn am-btn-secondary am-btn-xs">
|
||||
<i class="am-icon-angle-left"></i> 返回
|
||||
</a>
|
||||
<span>{{if !empty($info)}}编辑模板{{else}}添加座位模板{{/if}}</span>
|
||||
</div>
|
||||
|
||||
<div class="venue-editor">
|
||||
<form class="am-form form-validation" action="{{:PluginsAdminUrl('vr_ticket', 'admin', 'SeatTemplateSave')}}" method="POST" request-type="ajax-url" request-value="{{:PluginsAdminUrl('vr_ticket', 'admin', 'SeatTemplateList')}}">
|
||||
{{if !empty($info)}}
|
||||
<input type="hidden" name="id" value="{{$info.id}}" />
|
||||
{{/if}}
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>模板名称 <span class="am-text-danger">*</span></label>
|
||||
<input type="text" name="name" value="{{if !empty($info)}}{{$info.name}}{{/if}}" placeholder="请输入模板名称" data-validation-message="模板名称不能为空" required class="am-radius" />
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>关联分类 <span class="am-text-danger">*</span></label>
|
||||
<select name="category_id" data-validation-message="请选择关联分类" required>
|
||||
<option value="">请选择分类</option>
|
||||
{{if !empty($categories)}}
|
||||
{{foreach $categories as $c}}
|
||||
<option value="{{$c.id}}" {{if !empty($info.category_id) && $info.category_id==$c.id}}selected{{/if}}>{{$c.name}}</option>
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>状态</label>
|
||||
<select name="status">
|
||||
<option value="1" {{if !empty($info) && $info.status==1}}selected{{/if}}>启用</option>
|
||||
<option value="0" {{if !empty($info) && $info.status==0}}selected{{/if}}>禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>座位地图 JSON</label>
|
||||
<textarea name="seat_map" rows="8" placeholder='示例: [{"row":"A","seats":[{"char":"1","price":380},{"char":"2","price":380}]}]' class="am-radius">{{if !empty($info)}}{{$info.seat_map}}{{/if}}</textarea>
|
||||
<div class="am-alert am-alert-secondary am-margin-top-xs am-text-xs">
|
||||
请填写符合规范的 JSON 格式座位数据。编辑模式下此字段将更新。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group am-margin-top-lg">
|
||||
<button type="submit" class="am-btn am-btn-primary am-btn-block am-radius" data-am-loading="{spinner: 'circle-o-notch', loadingText: '保存中...'}">
|
||||
{{if !empty($info)}}保存修改{{else}}添加模板{{/if}}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{:ModuleInclude('public/footer')}}
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
{{:ModuleInclude('public/header')}}
|
||||
|
||||
<div class="right-content">
|
||||
<div class="content-nav">
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'index')}}" class="am-btn am-btn-secondary am-btn-xs">
|
||||
<i class="am-icon-angle-left"></i> 返回
|
||||
</a>
|
||||
<span>核销记录</span>
|
||||
</div>
|
||||
|
||||
<!-- 搜索栏 -->
|
||||
<div class="am-scrollable-horizontal">
|
||||
<div class="am-margin-bottom-sm">
|
||||
<form action="{{:PluginsAdminUrl('vr_ticket', 'admin', 'VerificationList')}}" method="GET" class="am-form-inline">
|
||||
<div class="am-input-group am-input-group-sm am-fl" style="width: 200px;">
|
||||
<input type="text" name="keywords" value="{{$keywords|default=''}}" placeholder="搜索票码/核销员" class="am-radius" />
|
||||
</div>
|
||||
<div class="am-input-group am-input-group-sm am-fl am-margin-left-sm" style="width: 150px;">
|
||||
<select name="verifier_id">
|
||||
<option value="">全部核销员</option>
|
||||
{{if !empty($verifiers)}}
|
||||
{{foreach $verifiers as $vid=>$vname}}
|
||||
<option value="{{$vid}}" {{if !empty($verifier_id) && $verifier_id==$vid}}selected{{/if}}>{{$vname}}</option>
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="am-input-group am-input-group-sm am-fl am-margin-left-sm" style="width: 140px;">
|
||||
<input type="text" name="start_date" value="{{$start_date|default=''}}" placeholder="开始日期" class="am-radius" autocomplete="off" data-date-format="yyyy-mm-dd" />
|
||||
</div>
|
||||
<div class="am-input-group am-input-group-sm am-fl" style="width: 140px;">
|
||||
<input type="text" name="end_date" value="{{$end_date|default=''}}" placeholder="结束日期" class="am-radius" autocomplete="off" data-date-format="yyyy-mm-dd" />
|
||||
</div>
|
||||
<button type="submit" class="am-btn am-btn-default am-btn-xs am-radius am-fl am-margin-left-sm">
|
||||
<i class="am-icon-search"></i> 搜索
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<table class="am-table am-table-striped am-table-hover am-text-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>票码</th>
|
||||
<th>核销员</th>
|
||||
<th>商品</th>
|
||||
<th>座位信息</th>
|
||||
<th>观演人</th>
|
||||
<th>核销时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{if !empty($list)}}
|
||||
{{foreach $list as $item}}
|
||||
<tr>
|
||||
<td>{{$item.id}}</td>
|
||||
<td>{{$item.ticket_code}}</td>
|
||||
<td>{{$item.verifier_name|default='-'}}</td>
|
||||
<td>{{$item.goods_title|default='-'}}</td>
|
||||
<td>{{$item.seat_info|default='-'}}</td>
|
||||
<td>{{$item.real_name|default='-'}}</td>
|
||||
<td>{{if !empty($item.created_at)}}{{date('Y-m-d H:i', $item.created_at)}}{{/if}}</td>
|
||||
</tr>
|
||||
{{/foreach}}
|
||||
{{else}}
|
||||
<tr>
|
||||
<td colspan="7" class="am-text-center">暂无数据</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- 分页 -->
|
||||
{{if !empty($page)}}{{$page|raw}}{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{:ModuleInclude('public/footer')}}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
{{:ModuleInclude('public/header')}}
|
||||
|
||||
<div class="right-content">
|
||||
<div class="content-nav">
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'index')}}" class="am-btn am-btn-secondary am-btn-xs">
|
||||
<i class="am-icon-angle-left"></i> 返回
|
||||
</a>
|
||||
<span>核销员管理</span>
|
||||
</div>
|
||||
|
||||
<!-- 搜索栏 -->
|
||||
<div class="am-scrollable-horizontal">
|
||||
<div class="am-margin-bottom-sm">
|
||||
<form action="{{:PluginsAdminUrl('vr_ticket', 'admin', 'VerifierList')}}" method="GET" class="am-form-inline">
|
||||
<div class="am-input-group am-input-group-sm am-fl" style="width: 200px;">
|
||||
<input type="text" name="keywords" value="{{$keywords|default=''}}" placeholder="搜索名称/用户ID" class="am-radius" />
|
||||
</div>
|
||||
<div class="am-input-group am-input-group-sm am-fl am-margin-left-sm" style="width: 120px;">
|
||||
<select name="status" class="am-radius">
|
||||
<option value="">全部状态</option>
|
||||
<option value="1" {{if isset($status) && $status==1}}selected{{/if}}>启用</option>
|
||||
<option value="0" {{if isset($status) && $status==0}}selected{{/if}}>禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="am-btn am-btn-default am-btn-xs am-radius am-fl am-margin-left-sm">
|
||||
<i class="am-icon-search"></i> 搜索
|
||||
</button>
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'VerifierSave')}}" class="am-btn am-btn-primary am-btn-xs am-radius am-fr">
|
||||
<i class="am-icon-plus"></i> 添加核销员
|
||||
</a>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<table class="am-table am-table-striped am-table-hover am-text-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>核销员名称</th>
|
||||
<th>关联用户</th>
|
||||
<th>状态</th>
|
||||
<th>添加时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{if !empty($list)}}
|
||||
{{foreach $list as $item}}
|
||||
<tr>
|
||||
<td>{{$item.id}}</td>
|
||||
<td>{{$item.name}}</td>
|
||||
<td>{{$item.user_name|default='-'}}</td>
|
||||
<td>
|
||||
{{if $item.status == 1}}
|
||||
<span class="am-badge am-badge-success">启用</span>
|
||||
{{else}}
|
||||
<span class="am-badge am-badge-danger">禁用</span>
|
||||
{{/if}}
|
||||
</td>
|
||||
<td>{{if !empty($item.created_at)}}{{date('Y-m-d H:i', $item.created_at)}}{{/if}}</td>
|
||||
<td>
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'VerifierSave', ['id'=>$item.id])}}" class="am-btn am-btn-default am-btn-xs am-radius">
|
||||
<i class="am-icon-edit"></i> 编辑
|
||||
</a>
|
||||
<button type="button" class="am-btn am-btn-danger am-btn-xs am-radius" onclick="toggleVerifier({{$item.id}}, {{$item.status}})">
|
||||
{{if $item.status == 1}}<i class="am-icon-ban"></i> 禁用{{else}}<i class="am-icon-check"></i> 启用{{/if}}
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
{{/foreach}}
|
||||
{{else}}
|
||||
<tr>
|
||||
<td colspan="6" class="am-text-center">暂无数据</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- 分页 -->
|
||||
{{if !empty($page)}}{{$page|raw}}{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function toggleVerifier(id, currentStatus) {
|
||||
var action = currentStatus == 1 ? '禁用' : '启用';
|
||||
if (!confirm('确定' + action + '该核销员?')) return;
|
||||
$.ajax({
|
||||
url: '{{:PluginsAdminUrl("vr_ticket", "admin", "VerifierDelete")}}',
|
||||
type: 'POST',
|
||||
data: {id: id},
|
||||
dataType: 'json',
|
||||
success: function(res) {
|
||||
if (res.code >= 0) {
|
||||
location.reload();
|
||||
} else {
|
||||
alert(res.msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
{{:ModuleInclude('public/footer')}}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
{{:ModuleInclude('public/header')}}
|
||||
|
||||
<div class="right-content">
|
||||
<div class="content-nav">
|
||||
<a href="{{:PluginsAdminUrl('vr_ticket', 'admin', 'VerifierList')}}" class="am-btn am-btn-secondary am-btn-xs">
|
||||
<i class="am-icon-angle-left"></i> 返回
|
||||
</a>
|
||||
<span>{{if !empty($info)}}编辑核销员{{else}}添加核销员{{/if}}</span>
|
||||
</div>
|
||||
|
||||
<div class="content-body">
|
||||
<form class="am-form form-validation" action="{{:PluginsAdminUrl('vr_ticket', 'admin', 'VerifierSave')}}" method="POST" request-type="ajax-url" request-value="{{:PluginsAdminUrl('vr_ticket', 'admin', 'VerifierList')}}">
|
||||
{{if !empty($info)}}
|
||||
<input type="hidden" name="id" value="{{$info.id}}" />
|
||||
{{/if}}
|
||||
|
||||
<div class="am-panel am-panel-default">
|
||||
<div class="am-panel-hd">核销员信息</div>
|
||||
<div class="am-panel-bd">
|
||||
<div class="am-form-group">
|
||||
<label>关联用户 <span class="am-text-danger">*</span></label>
|
||||
<select name="user_id" data-validation-message="请选择关联用户" required>
|
||||
<option value="">请选择用户</option>
|
||||
{{if !empty($users)}}
|
||||
{{foreach $users as $u}}
|
||||
<option value="{{$u.id}}" {{if !empty($info.user_id) && $info.user_id==$u.id}}selected{{/if}}>{{$u.nickname|default='-'}}/{{$u.username}}</option>
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>核销员名称 <span class="am-text-danger">*</span></label>
|
||||
<input type="text" name="name" value="{{if !empty($info)}}{{$info.name}}{{/if}}" placeholder="请输入核销员名称" data-validation-message="核销员名称不能为空" required class="am-radius" />
|
||||
</div>
|
||||
|
||||
<div class="am-form-group">
|
||||
<label>状态</label>
|
||||
<select name="status">
|
||||
<option value="1" {{if !empty($info) && $info.status==1}}selected{{/if}}>启用</option>
|
||||
<option value="0" {{if !empty($info) && $info.status==0}}selected{{/if}}>禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="am-form-group am-margin-top-lg">
|
||||
<button type="submit" class="am-btn am-btn-primary am-btn-block am-radius" data-am-loading="{spinner: 'circle-o-notch', loadingText: '保存中...'}">
|
||||
{{if !empty($info)}}保存修改{{else}}添加核销员{{/if}}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{:ModuleInclude('public/footer')}}
|
||||
Loading…
Reference in New Issue