第三段完善 代理商绑定 激活等 正式上线的版本
This commit is contained in:
278
app/manager/view/account/agent_codes.html
Normal file
278
app/manager/view/account/agent_codes.html
Normal file
@@ -0,0 +1,278 @@
|
||||
{extend name="../../admin/view/main"}
|
||||
|
||||
{block name="button"}
|
||||
{if auth("batchDisableCodes")}
|
||||
<button class='layui-btn layui-btn-sm layui-btn-danger' data-batch-confirm="确定要禁用选中的激活码吗?" data-csrf="{:systoken('batchDisableCodes')}" data-action='{:url("batchDisableCodes")}' data-rule="ids#{key}">批量禁用</button>
|
||||
{/if}
|
||||
<button class='layui-btn layui-btn-sm layui-btn-warm' id="batchCopyBtn" data-checkbox="true">批量复制激活码</button>
|
||||
<a class='layui-btn layui-btn-sm layui-btn-normal' href="{:url('exportCodes')}?{:http_build_query($get)}">导出激活码</a>
|
||||
{/block}
|
||||
|
||||
{block name="content"}
|
||||
<div class="think-box-shadow">
|
||||
<form class="layui-form layui-form-pane form-search" action="{:sysuri()}" onsubmit="return false" method="get" autocomplete="off">
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">激活码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="code" value="{$get.code|default=''}" placeholder="请输入激活码" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $Think.admin.is_super}
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">代理商</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name='agent_id' lay-search class='layui-select'>
|
||||
<option value=''>-- 全部 --</option>
|
||||
{foreach $agents as $agent}
|
||||
<option value='{$agent.id}' {if isset($get.agent_id) and $get.agent_id==$agent.id}selected{/if}>
|
||||
{$agent.username} ({if $agent.level==1}一级代理{else}二级代理{/if})
|
||||
</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">使用状态</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name='is_used' lay-search class='layui-select'>
|
||||
<option value=''>-- 全部 --</option>
|
||||
<option value='0' {if isset($get.is_used) and $get.is_used=='0'}selected{/if}>未使用</option>
|
||||
<option value='1' {if isset($get.is_used) and $get.is_used=='1'}selected{/if}>已使用</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">禁用状态</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name='status' lay-search class='layui-select'>
|
||||
<option value=''>-- 全部 --</option>
|
||||
<option value='1' {if isset($get.status) and $get.status=='1'}selected{/if}>正常</option>
|
||||
<option value='0' {if isset($get.status) and $get.status=='0'}selected{/if}>已禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">卡类型</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name='days' lay-search class='layui-select'>
|
||||
<option value=''>-- 全部 --</option>
|
||||
{foreach :app\manager\model\AgentCode::getCardTypes() as $days => $info}
|
||||
<option value='{$days}' {if isset($get.days) and $get.days==$days}selected{/if}>{$info.name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">生成时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input data-date-range name="create_time" value="{$get.create_time|default=''}" placeholder="请选择生成时间" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">使用时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input data-date-range name="use_time" value="{$get.use_time|default=''}" placeholder="请选择使用时间" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="layui-btn layui-btn-primary"><i class="layui-icon"></i> 搜 索</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<table class="layui-table margin-top-10" lay-skin="line">
|
||||
{notempty name='list'}
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='list-table-check-td think-checkbox'>
|
||||
<label><input data-auto-none data-check-target='.list-check-box' type='checkbox'></label>
|
||||
</th>
|
||||
<th class='text-left'>激活码</th>
|
||||
<th class='text-left'>有效天数</th>
|
||||
{if $Think.admin.is_super}
|
||||
<th class='text-left'>代理商</th>
|
||||
<th class='text-left'>代理级别</th>
|
||||
{/if}
|
||||
<th class='text-left'>销售价格</th>
|
||||
<th class='text-left'>佣金</th>
|
||||
<th class='text-left'>使用状态</th>
|
||||
<th class='text-left'>使用时间</th>
|
||||
<th class='text-left'>使用者</th>
|
||||
<th class='text-left'>生成时间</th>
|
||||
<th class='text-left'>状态</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
{/notempty}
|
||||
<tbody>
|
||||
{foreach $list as $key=>$vo}
|
||||
<tr>
|
||||
<td class='list-table-check-td think-checkbox'>
|
||||
<label><input class="list-check-box" value='{$vo.id}' type='checkbox'></label>
|
||||
</td>
|
||||
<td class='text-left'>{$vo.code}</td>
|
||||
<td class='text-left'>{$vo.days} 天</td>
|
||||
{if $Think.admin.is_super}
|
||||
<td class='text-left'>{$vo.agent_name|default='--'}</td>
|
||||
<td class='text-left'>
|
||||
{if $vo.agent_level eq 1}
|
||||
<span class="color-blue">一级代理</span>
|
||||
{elseif $vo.agent_level eq 2}
|
||||
<span class="color-green">二级代理</span>
|
||||
{else}
|
||||
--
|
||||
{/if}
|
||||
</td>
|
||||
{/if}
|
||||
<td class='text-left'>{$vo.price|default='--'}</td>
|
||||
<td class='text-left'>{$vo.commission|default='--'}</td>
|
||||
<td class='text-left'>
|
||||
{if $vo.is_used eq 1}
|
||||
<span class="color-red">已使用</span>
|
||||
{else}
|
||||
<span class="color-green">未使用</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class='text-left'>{$vo.used_at|format_datetime|default='--'}</td>
|
||||
<td class='text-left'>{$vo.used_by|default='--'}</td>
|
||||
<td class='text-left'>{$vo.created_at|format_datetime}</td>
|
||||
<td class='text-left'>
|
||||
{if $vo.status eq 1}
|
||||
<span class="color-green">正常</span>
|
||||
{else}
|
||||
<span class="color-red">已禁用</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class='text-left'>
|
||||
{if auth("disableCode") && $vo.status eq 1}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要禁用该激活码吗?" data-csrf="{:systoken('disableCode')}" data-action='{:url("disableCode")}' data-value="id#{$vo.id}">禁用</a>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
{empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
|
||||
</div>
|
||||
|
||||
<!-- 复制弹窗 -->
|
||||
<div id="copyDialog" style="display:none;">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<textarea id="codeList" class="layui-textarea" style="height: 500px;margin:10px 0;font-size:14px;line-height:1.8;" readonly></textarea>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<button class="layui-btn layui-btn-lg" onclick="copyToClipboard()">一键复制</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 批量复制按钮点击事件
|
||||
$('#batchCopyBtn').click(function(){
|
||||
var codes = [];
|
||||
$('.list-check-box:checked').each(function(){
|
||||
var tr = $(this).closest('tr');
|
||||
var code = tr.find('td:eq(1)').text(); // 激活码
|
||||
var days = tr.find('td:eq(2)').text(); // 天数
|
||||
codes.push(code + ' - ' + days);
|
||||
});
|
||||
|
||||
if(codes.length === 0){
|
||||
layer.msg('请选择要复制的激活码');
|
||||
return;
|
||||
}
|
||||
|
||||
// 格式化激活码列表
|
||||
var formattedCodes = codes.map(function(item){
|
||||
return item.trim();
|
||||
}).join('\n\n');
|
||||
|
||||
// 显示弹窗
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: '复制激活码',
|
||||
area: ['800px', '700px'],
|
||||
content: $('#copyDialog'),
|
||||
offset: '50px',
|
||||
fixed: false,
|
||||
resize: true,
|
||||
shadeClose: true,
|
||||
shade: [0.3, '#000'],
|
||||
maxmin: true,
|
||||
moveOut: true,
|
||||
anim: 1,
|
||||
zIndex: layer.zIndex + 1000, // 增加 zIndex 确保显示在最上层
|
||||
success: function(layero, index){
|
||||
layer.setTop(layero);
|
||||
$('#codeList').val(formattedCodes);
|
||||
|
||||
// 添加自定义样式
|
||||
$(layero).css({
|
||||
'background-color': '#fff',
|
||||
'box-shadow': '0 2px 8px rgba(0,0,0,.1)'
|
||||
}).find('.layui-layer-content').css({
|
||||
'padding': '30px'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 复制到剪贴板
|
||||
function copyToClipboard() {
|
||||
var textarea = document.getElementById('codeList');
|
||||
textarea.select();
|
||||
try {
|
||||
document.execCommand('copy');
|
||||
layer.msg('复制成功!', {icon: 1, zIndex: layer.zIndex + 101});
|
||||
} catch (err) {
|
||||
layer.msg('复制失败,请手动复制', {icon: 2, zIndex: layer.zIndex + 101});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* 美化时间选择器样式 */
|
||||
.layui-laydate {
|
||||
border: none !important;
|
||||
box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
|
||||
}
|
||||
.layui-laydate-header {
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
.layui-laydate-content td:hover,
|
||||
.layui-laydate-content td.laydate-selected {
|
||||
border-radius: 2px;
|
||||
}
|
||||
.layui-laydate-footer {
|
||||
border-top: 1px solid #f0f0f0;
|
||||
}
|
||||
.laydate-time-list>li:hover {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
.layui-laydate-content td.layui-this {
|
||||
border-radius: 2px;
|
||||
}
|
||||
/* 输入框样式优化 */
|
||||
.layui-input[readonly] {
|
||||
background-color: #fff !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
.layui-input:hover {
|
||||
border-color: #D2D2D2 !important;
|
||||
}
|
||||
.layui-input:focus {
|
||||
border-color: #009688 !important;
|
||||
box-shadow: 0 0 0 2px rgba(0,150,136,.2);
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
44
app/manager/view/account/batch_change_agent.html
Normal file
44
app/manager/view/account/batch_change_agent.html
Normal file
@@ -0,0 +1,44 @@
|
||||
{extend name="../../admin/view/main"}
|
||||
|
||||
{block name="content"}
|
||||
<form class="layui-form layui-card" action="{:request()->url()}" data-auto="true" method="post">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">选择代理商</label>
|
||||
<div class="layui-input-block">
|
||||
<select name='agent_id' class='layui-select' lay-search required>
|
||||
<option value=''>请选择代理商</option>
|
||||
{foreach $agents as $agent}
|
||||
<option value='{$agent.id}'>{$agent.username} ({if $agent.level==1}一级代理{else}二级代理{/if})</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">销售价格</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="price" value='' required placeholder="请输入销售价格" class="layui-input">
|
||||
<tip class="help-block">设置激活码的销售价格,用于计算代理商佣金</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type='hidden' name='code_ids' value=''>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="layui-form-item text-center">
|
||||
<button class="layui-btn" type='submit'>保存设置</button>
|
||||
<button class="layui-btn layui-btn-danger" type='button' data-close>取消</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
// 获取选中的激活码ID
|
||||
var ids = [];
|
||||
parent.$('.list-check-box:checked').map(function(){
|
||||
ids.push($(this).val());
|
||||
});
|
||||
// 设置到隐藏字段
|
||||
$('input[name="code_ids"]').val(ids.join(','));
|
||||
</script>
|
||||
{/block}
|
||||
@@ -2,6 +2,13 @@
|
||||
|
||||
{block name="button"}
|
||||
<button class='layui-btn layui-btn-sm layui-btn-primary' data-modal='{:url("generate")}'>生成激活码</button>
|
||||
{if auth("batchRemoveCodes")}
|
||||
<button class='layui-btn layui-btn-sm layui-btn-danger' data-batch-confirm="确定要删除选中的激活码吗?" data-csrf="{:systoken('batchRemoveCodes')}" data-action='{:url("batchRemoveCodes")}' data-rule="ids#{key}">批量删除</button>
|
||||
{/if}
|
||||
{if auth("batchChangeAgent")}
|
||||
<button class='layui-btn layui-btn-sm layui-btn-normal' data-modal='{:url("batchChangeAgent")}' data-title="批量切换代理商" data-checkbox="true">批量切换代理商</button>
|
||||
{/if}
|
||||
<button class='layui-btn layui-btn-sm layui-btn-warm' id="batchCopyBtn" data-checkbox="true">批量复制激活码</button>
|
||||
{/block}
|
||||
|
||||
{block name="content"}
|
||||
@@ -39,6 +46,29 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">禁用状态</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name='status' lay-search class='layui-select'>
|
||||
<option value=''>-- 全部 --</option>
|
||||
<option value='1' {if isset($get.status) and $get.status=='1'}selected{/if}>正常</option>
|
||||
<option value='0' {if isset($get.status) and $get.status=='0'}selected{/if}>已禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">卡类型</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name='days' lay-search class='layui-select'>
|
||||
<option value=''>-- 全部 --</option>
|
||||
{foreach :app\manager\model\AgentCode::getCardTypes() as $days => $info}
|
||||
<option value='{$days}' {if isset($get.days) and $get.days==$days}selected{/if}>{$info.name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="layui-btn layui-btn-primary"><i class="layui-icon"></i> 搜 索</button>
|
||||
</div>
|
||||
@@ -63,6 +93,7 @@
|
||||
<th class='text-left'>使用时间</th>
|
||||
<th class='text-left'>使用者</th>
|
||||
<th class='text-left'>生成时间</th>
|
||||
<th class='text-left'>状态</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -109,9 +140,19 @@
|
||||
<td class='text-left'>{$vo.used_at|format_datetime|default='--'}</td>
|
||||
<td class='text-left'>{$vo.used_by|default='--'}</td>
|
||||
<td class='text-left'>{$vo.created_at|format_datetime}</td>
|
||||
<td class='text-left'>
|
||||
{if $vo.status eq 1}
|
||||
<span class="color-green">正常</span>
|
||||
{else}
|
||||
<span class="color-red">已禁用</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class='text-left'>
|
||||
{if auth("removeCode")}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要删除该激活码吗?" data-csrf="{:systoken('removeCode')}" data-action='{:url("removeCode")}' data-value="id#{$vo.id}">删 除</a>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要删除该激活码吗?" data-csrf="{:systoken('removeCode')}" data-action='{:url("removeCode")}' data-value="id#{$vo.id}">删除</a>
|
||||
{/if}
|
||||
{if auth("disableCode") && $vo.status eq 1}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要禁用该激活码吗?" data-csrf="{:systoken('disableCode')}" data-action='{:url("disableCode")}' data-value="id#{$vo.id}">禁用</a>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
@@ -120,4 +161,91 @@
|
||||
</table>
|
||||
{empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
|
||||
</div>
|
||||
|
||||
<!-- 复制弹窗 -->
|
||||
<div id="copyDialog" style="display:none;">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<textarea id="codeList" class="layui-textarea" style="height: 500px;margin:10px 0;font-size:14px;line-height:1.8;" readonly></textarea>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<button class="layui-btn layui-btn-lg" onclick="copyToClipboard()">一键复制</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 批量复制按钮点击事件
|
||||
$('#batchCopyBtn').click(function(){
|
||||
var codes = [];
|
||||
$('.list-check-box:checked').each(function(){
|
||||
var tr = $(this).closest('tr');
|
||||
var code = tr.find('td:eq(1)').text(); // 激活码
|
||||
var days = tr.find('td:eq(2)').text(); // 天数
|
||||
codes.push(code + ' - ' + days);
|
||||
});
|
||||
|
||||
if(codes.length === 0){
|
||||
layer.msg('请选择要复制的激活码');
|
||||
return;
|
||||
}
|
||||
|
||||
// 格式化激活码列表
|
||||
var formattedCodes = codes.map(function(item){
|
||||
return item.trim();
|
||||
}).join('\n\n');
|
||||
|
||||
// 显示弹窗
|
||||
var index = layer.open({
|
||||
type: 1,
|
||||
title: '复制激活码',
|
||||
area: ['800px', '700px'],
|
||||
content: $('#copyDialog'),
|
||||
offset: '50px',
|
||||
fixed: false,
|
||||
resize: true,
|
||||
shadeClose: true,
|
||||
shade: [0.3, '#000'],
|
||||
maxmin: true,
|
||||
moveOut: true,
|
||||
anim: 1,
|
||||
isOutAnim: false,
|
||||
zIndex: layer.zIndex + 1000, // 增加 zIndex 确保显示在最上层
|
||||
success: function(layero, index){
|
||||
layer.setTop(layero);
|
||||
$('#codeList').val(formattedCodes);
|
||||
|
||||
// 添加自定义样式
|
||||
$(layero).css({
|
||||
'background-color': '#fff',
|
||||
'box-shadow': '0 2px 8px rgba(0,0,0,.1)'
|
||||
}).find('.layui-layer-content').css({
|
||||
'padding': '30px'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 设置最高层级
|
||||
layer.setTop($('.layui-layer[times="' + index + '"]'));
|
||||
});
|
||||
|
||||
// 复制到剪贴板
|
||||
function copyToClipboard() {
|
||||
var textarea = document.getElementById('codeList');
|
||||
textarea.select();
|
||||
try {
|
||||
document.execCommand('copy');
|
||||
layer.msg('复制成功!', {icon: 1, zIndex: layer.zIndex + 1001});
|
||||
} catch (err) {
|
||||
layer.msg('复制失败,请手动复制', {icon: 2, zIndex: layer.zIndex + 1001});
|
||||
}
|
||||
}
|
||||
|
||||
function setDays(days) {
|
||||
document.getElementById('daysInput').value = days;
|
||||
document.querySelector('form.form-search').submit();
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
@@ -26,10 +26,14 @@
|
||||
{notempty name='list'}
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='text-left'>账号邮箱</th>
|
||||
<th class='text-left'>设备ID</th>
|
||||
<th class='text-left'>使用时间</th>
|
||||
<th class='text-left'>注册时间</th>
|
||||
<th class='text-left'>账号邮箱</th>
|
||||
<th class='text-left'>代理商</th>
|
||||
<th class='text-left'>激活码数量</th>
|
||||
<th class='text-left'>总天数</th>
|
||||
<th class='text-left'>首次激活</th>
|
||||
<th class='text-left'>到期时间</th>
|
||||
<th class='text-left'>剩余天数</th>
|
||||
<th class='text-left'>缓存状态</th>
|
||||
<th class='text-left'>冷却状态</th>
|
||||
<th class='text-left'>操作</th>
|
||||
@@ -39,24 +43,30 @@
|
||||
<tbody>
|
||||
{foreach $list as $key=>$vo}
|
||||
<tr>
|
||||
<td class='text-left'>{$vo.email}</td>
|
||||
<td class='text-left'>{$vo.used_by}</td>
|
||||
<td class='text-left'>{$vo.used_at|format_datetime}</td>
|
||||
<td class='text-left'>{$vo.registration_time|format_datetime}</td>
|
||||
<td class='text-left'>{$vo.used_by|default='--'}</td>
|
||||
<td class='text-left'>{if isset($vo.email)}{$vo.email}{else}--{/if}</td>
|
||||
<td class='text-left'>{if isset($vo.agent_names)}{$vo.agent_names}{else}--{/if}</td>
|
||||
<td class='text-left'>{if isset($vo.total_codes)}{$vo.total_codes}{else}0{/if}</td>
|
||||
<td class='text-left'>{if isset($vo.total_days)}{$vo.total_days} 天{else}0 天{/if}</td>
|
||||
<td class='text-left'>{if isset($vo.first_activation)}{$vo.first_activation|format_datetime}{else}--{/if}</td>
|
||||
<td class='text-left'>{if isset($vo.expire_time)}{$vo.expire_time}{else}--{/if}</td>
|
||||
<td class='text-left'>
|
||||
{if $vo.has_cache}
|
||||
{if $vo.cache_match}
|
||||
<span class="color-green">正常</span>
|
||||
{else}
|
||||
<span class="color-red">异常(缓存不匹配)</span>
|
||||
{/if}
|
||||
{if isset($vo.days_left) && $vo.days_left > 0}
|
||||
<span class="color-green">{$vo.days_left} 天</span>
|
||||
{else}
|
||||
<span class="color-red">已过期</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class='text-left'>
|
||||
{if isset($vo.has_cache) && $vo.has_cache}
|
||||
<span class="color-green">已缓存</span>
|
||||
{else}
|
||||
<span class="color-gray">无缓存</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class='text-left'>
|
||||
{if $vo.in_cooldown}
|
||||
<span class="color-red">冷却中 (至 {$vo.cooldown_time})</span>
|
||||
{if isset($vo.in_cooldown) && $vo.in_cooldown}
|
||||
<span class="color-red">冷却中 {if isset($vo.cooldown_time)}(至 {$vo.cooldown_time}){/if}</span>
|
||||
{else}
|
||||
<span class="color-green">可用</span>
|
||||
{/if}
|
||||
|
||||
@@ -6,52 +6,79 @@
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">生成数量</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="count" value="1" required placeholder="请输入要生成的激活码数量" class="layui-input">
|
||||
<tip class="help-block">一次最多可生成100个激活码</tip>
|
||||
<input type="number" name="count" value="1" min="1" max="500" required placeholder="请输入生成数量(1-500)" class="layui-input">
|
||||
<tip class="help-block">单次可生成1-500个激活码</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">有效天数</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="days" value="30" required placeholder="请输入激活码有效天数" class="layui-input">
|
||||
<div class="layui-btn-group-days" style="margin-bottom: 10px;">
|
||||
{foreach :app\manager\model\AgentCode::getCardTypes() as $days => $info}
|
||||
<button type="button" class="layui-btn layui-btn-sm" data-days="{$days}">{$info.name}</button>
|
||||
{/foreach}
|
||||
</div>
|
||||
<input type="number" name="days" value="30" min="1" required placeholder="请输入有效天数" class="layui-input">
|
||||
<tip class="help-block">激活码的有效使用天数</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">选择代理</label>
|
||||
<div class="layui-input-block">
|
||||
<select name='agent_id' class='layui-select' lay-filter='agent_id'>
|
||||
<select name='agent_id' class='layui-select' lay-search>
|
||||
<option value=''>不分配给代理商</option>
|
||||
{foreach $agents as $agent}
|
||||
<option value='{$agent.id}'>{$agent.username} ({if $agent.level==1}一级代理{else}二级代理{/if}) - 佣金比例{$agent.commission_rate}%</option>
|
||||
<option value='{$agent.id}'>{$agent.username} ({if $agent.level==1}一级代理{else}二级代理{/if})</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
<tip class="help-block">如果选择代理商,需要设置销售价格</tip>
|
||||
<tip class="help-block">可以选择直接分配给代理商</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="price_item" style="display:none;">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">销售价格</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="price" value="0" placeholder="请输入销售价格" class="layui-input">
|
||||
<tip class="help-block">设置激活码的销售价格,用于计算佣金</tip>
|
||||
<input type="number" name="price" value="0" min="0" step="0.01" placeholder="请输入销售价格" class="layui-input">
|
||||
<tip class="help-block">设置激活码的销售价格,用于计算代理商佣金(选择代理商时必填)</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="layui-form-item text-center">
|
||||
<button class="layui-btn" type="submit">确定生成</button>
|
||||
<button class="layui-btn layui-btn-danger" type="button" data-close>取消</button>
|
||||
<button class="layui-btn" type='submit'>确定生成</button>
|
||||
<button class="layui-btn layui-btn-danger" type='button' data-close>取消</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
layui.form.on('select(agent_id)', function(data){
|
||||
if(data.value){
|
||||
$('#price_item').show();
|
||||
$('input[name=price]').attr('required', true);
|
||||
}else{
|
||||
$('#price_item').hide();
|
||||
$('input[name=price]').removeAttr('required');
|
||||
}
|
||||
layui.use(['form'], function(){
|
||||
// 快捷选择天数
|
||||
$('.layui-btn-group-days .layui-btn').click(function(){
|
||||
var days = $(this).data('days');
|
||||
$('input[name="days"]').val(days);
|
||||
});
|
||||
|
||||
// 监听代理商选择
|
||||
layui.form.on('select(agent_id)', function(data){
|
||||
var price = $('input[name="price"]');
|
||||
if(data.value){
|
||||
price.attr('required', true);
|
||||
} else {
|
||||
price.removeAttr('required');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.layui-btn-group .layui-btn {
|
||||
margin-right: 5px;
|
||||
}
|
||||
.layui-btn-group .layui-btn:hover {
|
||||
opacity: 0.9;
|
||||
}
|
||||
</style>
|
||||
{/block}
|
||||
70
app/manager/view/account/index_search.html
Normal file
70
app/manager/view/account/index_search.html
Normal file
@@ -0,0 +1,70 @@
|
||||
{include file='../../admin/view/search'}
|
||||
|
||||
<fieldset>
|
||||
<legend>条件搜索</legend>
|
||||
<form class="layui-form layui-form-pane form-search" action="{:sysuri()}" onsubmit="return false" method="get" autocomplete="off">
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">邮箱账号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="email" value="{$get.email|default=''}" placeholder="请输入邮箱账号" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">姓名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="first_name" value="{$get.first_name|default=''}" placeholder="请输入名字" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">机器ID</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="machine_id" value="{$get.machine_id|default=''}" placeholder="请输入机器ID" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">使用状态</label>
|
||||
<div class="layui-input-inline">
|
||||
<select class="layui-select" name="is_used">
|
||||
<option value=''>-- 全部 --</option>
|
||||
<option value='0' {if $get.is_used eq '0'}selected{/if}>未使用</option>
|
||||
<option value='1' {if $get.is_used eq '1'}selected{/if}>已使用</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">使用者</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="used_by" value="{$get.used_by|default=''}" placeholder="请输入使用者" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">注册时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input data-date-range name="registration_time" value="{$get.registration_time|default=''}" placeholder="请选择注册时间" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">创建时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input data-date-range name="created_at" value="{$get.created_at|default=''}" placeholder="请选择创建时间" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">使用时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input data-date-range name="used_at" value="{$get.used_at|default=''}" placeholder="请选择使用时间" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="layui-btn layui-btn-primary"><i class="layui-icon"></i> 搜 索</button>
|
||||
</div>
|
||||
</form>
|
||||
</fieldset>
|
||||
@@ -47,6 +47,19 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">绑定管理员</label>
|
||||
<div class="layui-input-block">
|
||||
<select name='admin_id' class='layui-select'>
|
||||
<option value=''>请选择管理员账号</option>
|
||||
{foreach $admins as $admin}
|
||||
<option value='{$admin.id}'>{$admin.username} ({$admin.nickname})</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
<tip class="help-block">选择要绑定的管理员账号,绑定后该管理员可以作为二级代理</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">佣金比例</label>
|
||||
<div class="layui-input-block">
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">用户名</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="id" type="hidden" value='{$vo.id|default=""}'>
|
||||
<input name="username" value='{$vo.username|default=""}' required placeholder="请输入用户名" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
@@ -13,8 +14,7 @@
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="password" name="password" value='' {if empty($vo)} required {/if} placeholder="请输入密码" class="layui-input">
|
||||
<tip class="help-block">编辑时不填写表示不修改密码</tip>
|
||||
<input type="password" name="password" value='' placeholder="请输入密码,不修改请留空" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -28,25 +28,39 @@
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">代理级别</label>
|
||||
<div class="layui-input-block">
|
||||
<select name='level' class='layui-select' lay-filter='level'>
|
||||
<option value='1' {if isset($vo.level) and $vo.level==1}selected{/if}>一级代理</option>
|
||||
<option value='2' {if isset($vo.level) and $vo.level==2}selected{/if}>二级代理</option>
|
||||
<select name='level' class='layui-select' lay-filter='level' required>
|
||||
<option value=''>请选择代理级别</option>
|
||||
<option value='1' {if isset($vo.level) && $vo.level==1}selected{/if}>一级代理</option>
|
||||
<option value='2' {if isset($vo.level) && $vo.level==2}selected{/if}>二级代理</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item parent-agent" style="display:none;">
|
||||
<div class="layui-form-item parent-agent" style="display:{if isset($vo.level) && $vo.level==2}block{else}none{/if};">
|
||||
<label class="layui-form-label">上级代理</label>
|
||||
<div class="layui-input-block">
|
||||
<select name='parent_id' class='layui-select'>
|
||||
<option value=''>请选择上级代理</option>
|
||||
{foreach $agents as $agent}
|
||||
<option value='{$agent.id}' {if isset($vo.parent_id) and $vo.parent_id==$agent.id}selected{/if}>{$agent.username}</option>
|
||||
<option value='{$agent.id}' {if isset($vo.parent_id) && $vo.parent_id==$agent.id}selected{/if}>{$agent.username}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">绑定管理员</label>
|
||||
<div class="layui-input-block">
|
||||
<select name='admin_id' class='layui-select'>
|
||||
<option value=''>请选择管理员账号</option>
|
||||
{foreach $admins as $admin}
|
||||
<option value='{$admin.id}' {if isset($vo.admin_id) && $vo.admin_id==$admin.id}selected{/if}>{$admin.username} ({$admin.nickname})</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
<tip class="help-block">选择要绑定的管理员账号,绑定后该管理员可以作为二级代理</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">佣金比例</label>
|
||||
<div class="layui-input-block">
|
||||
@@ -59,8 +73,8 @@
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name='status' class='layui-select'>
|
||||
<option value='1' {if isset($vo.status) and $vo.status==1}selected{/if}>正常</option>
|
||||
<option value='0' {if isset($vo.status) and $vo.status==0}selected{/if}>禁用</option>
|
||||
<option value='1' {if isset($vo.status) && $vo.status==1}selected{/if}>正常</option>
|
||||
<option value='0' {if isset($vo.status) && $vo.status==0}selected{/if}>禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -75,7 +89,6 @@
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="layui-form-item text-center">
|
||||
{notempty name='vo.id'}<input type='hidden' value='{$vo.id}' name='id'>{/notempty}
|
||||
<button class="layui-btn" type='submit'>保存数据</button>
|
||||
<button class="layui-btn layui-btn-danger" type='button' data-close>取消编辑</button>
|
||||
</div>
|
||||
@@ -90,13 +103,5 @@ layui.form.on('select(level)', function(data){
|
||||
$('select[name=parent_id]').val('');
|
||||
}
|
||||
});
|
||||
|
||||
// 页面加载完成时检查
|
||||
$(function(){
|
||||
var level = $('select[name=level]').val();
|
||||
if(level == '2'){
|
||||
$('.parent-agent').show();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
122
app/manager/view/version/control.html
Normal file
122
app/manager/view/version/control.html
Normal file
@@ -0,0 +1,122 @@
|
||||
{extend name="../../admin/view/main"}
|
||||
|
||||
{block name="content"}
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<b>版本信息</b>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" value="{$version.version_no}" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" value="{$version.version_name}" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<b>权限控制</b>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-primary pull-right" data-open="{:url('control')}?version_id={$version.id}&mode=add">添加规则</button>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table margin-top-10" lay-skin="line">
|
||||
{notempty name='rules'}
|
||||
<thead>
|
||||
<tr>
|
||||
<th>控制类型</th>
|
||||
<th>目标类型</th>
|
||||
<th>目标ID</th>
|
||||
<th>过期时间</th>
|
||||
<th>创建时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{/notempty}
|
||||
<tbody>
|
||||
{foreach $rules as $rule}
|
||||
<tr>
|
||||
<td>{if $rule.control_type eq 'white_list'}<span class="color-green">白名单</span>{else}<span class="color-red">黑名单</span>{/if}</td>
|
||||
<td>
|
||||
{switch $rule.target_type}
|
||||
{case user}用户{/case}
|
||||
{case agent}代理{/case}
|
||||
{case device}设备{/case}
|
||||
{/switch}
|
||||
</td>
|
||||
<td>{$rule.target_id}</td>
|
||||
<td>{$rule.expire_time}</td>
|
||||
<td>{$rule.create_time}</td>
|
||||
<td>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-sm" data-confirm="确定要删除该规则吗?" data-action='{:url("removeRule")}' data-value="id#{$rule.id}">删 除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
{empty name='rules'}<span class="notdata">没有记录哦</span>{/empty}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if isset($mode) and $mode eq 'add'}
|
||||
<form class="layui-form layui-card" action="{:url('control')}" data-auto="true" method="post">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">控制类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="control_type" value="white_list" title="白名单" checked>
|
||||
<input type="radio" name="control_type" value="black_list" title="黑名单">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">目标类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="target_type" class="layui-select">
|
||||
<option value="user">用户</option>
|
||||
<option value="agent">代理</option>
|
||||
<option value="device">设备</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">目标ID</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="target_id" required class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">过期时间</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="expire_time" required class="layui-input" id="expire_time">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hr-line-dashed"></div>
|
||||
|
||||
<div class="layui-form-item text-center">
|
||||
<input type='hidden' value='{$version.id}' name='version_id'>
|
||||
<button class="layui-btn" type='submit'>保存数据</button>
|
||||
<button class="layui-btn layui-btn-danger" type='button' data-close>取消</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{block name='script'}
|
||||
<script>
|
||||
laydate.render({
|
||||
elem: '#expire_time',
|
||||
type: 'datetime'
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
{/if}
|
||||
210
app/manager/view/version/form.html
Normal file
210
app/manager/view/version/form.html
Normal file
@@ -0,0 +1,210 @@
|
||||
{extend name="../../admin/view/main"}
|
||||
|
||||
{block name="content"}
|
||||
<form class="layui-form layui-card" action="{:request()->url()}" data-auto="true" method="post">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本号</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="version_no" value='{$vo.version_no|default=""}' required placeholder="请输入版本号(x.x.x)" class="layui-input">
|
||||
<tip>版本号格式为: 主版本号.次版本号.修订号,如: 1.0.0</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="version_name" value='{$vo.version_name|default=""}' required placeholder="请输入版本名称" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">更新包</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="hidden" name="download_url" value="{$vo.download_url|default=''}" class="layui-input">
|
||||
|
||||
<div class="layui-upload-drag" id="uploadBtn">
|
||||
<i class="layui-icon layui-icon-upload"></i>
|
||||
<div class="upload-title">点击上传或拖拽文件到此处</div>
|
||||
<div class="upload-tips">支持的文件类型: zip, exe, dmg, pkg, deb, rpm</div>
|
||||
</div>
|
||||
<div class="upload-info" style="margin-top: 10px;display:none;">
|
||||
<div class="layui-progress layui-progress-big" lay-filter="uploadProgress" lay-showpercent="true">
|
||||
<div class="layui-progress-bar" lay-percent="0%"></div>
|
||||
</div>
|
||||
<div class="file-info" style="margin-top: 10px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">平台</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="platform" lay-verify="required">
|
||||
<option value="all" {if isset($vo.platform) and $vo.platform eq 'all'}selected{/if}>全平台</option>
|
||||
<option value="windows" {if isset($vo.platform) and $vo.platform eq 'windows'}selected{/if}>Windows</option>
|
||||
<option value="mac" {if isset($vo.platform) and $vo.platform eq 'mac'}selected{/if}>Mac</option>
|
||||
<option value="linux" {if isset($vo.platform) and $vo.platform eq 'linux'}selected{/if}>Linux</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">强制更新</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_force" value="1" title="是" {if isset($vo.is_force) and $vo.is_force eq 1}checked{/if}>
|
||||
<input type="radio" name="is_force" value="0" title="否" {if empty($vo.is_force) or $vo.is_force eq 0}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">最低要求</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="min_version" value='{$vo.min_version|default=""}' placeholder="请输入最低要求版本号" class="layui-input">
|
||||
<tip>如果设置了最低要求版本,低于此版本的用户需要先更新到此版本</tip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="description" placeholder="请输入版本描述" class="layui-textarea">{$vo.description|default=""}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">更新日志</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div id="logItems">
|
||||
{notempty name="logs"}
|
||||
{foreach $logs as $log}
|
||||
<div class="log-item layui-form-item">
|
||||
<div class="layui-inline" style="width:120px">
|
||||
<select name="logs[type][]" lay-verify="required">
|
||||
<option value="feature" {if $log.type eq 'feature'}selected{/if}>新功能</option>
|
||||
<option value="fix" {if $log.type eq 'fix'}selected{/if}>修复</option>
|
||||
<option value="optimize" {if $log.type eq 'optimize'}selected{/if}>优化</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-inline" style="width:calc(100% - 180px)">
|
||||
<input type="text" name="logs[content][]" value="{$log.content}" required placeholder="请输入更新内容" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-inline" style="width:50px">
|
||||
<a class="layui-btn layui-btn-danger layui-btn-sm" onclick="removeLogItem(this)">删除</a>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
{/notempty}
|
||||
</div>
|
||||
<div class="text-center padding-bottom-15">
|
||||
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" onclick="addLogItem()">添加更新内容</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hr-line-dashed"></div>
|
||||
|
||||
<div class="layui-form-item text-center">
|
||||
{notempty name='id'}<input type='hidden' value='{$id}' name='id'>{/notempty}
|
||||
<button class="layui-btn" type='submit'>保存数据</button>
|
||||
<button class="layui-btn layui-btn-danger" type='button' data-close>取消</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{block name="script"}
|
||||
<script>
|
||||
// 添加更新日志项
|
||||
function addLogItem() {
|
||||
var html = `
|
||||
<div class="log-item layui-form-item">
|
||||
<div class="layui-inline" style="width:120px">
|
||||
<select name="logs[type][]" lay-verify="required">
|
||||
<option value="feature">新功能</option>
|
||||
<option value="fix">修复</option>
|
||||
<option value="optimize">优化</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-inline" style="width:calc(100% - 180px)">
|
||||
<input type="text" name="logs[content][]" required placeholder="请输入更新内容" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-inline" style="width:50px">
|
||||
<a class="layui-btn layui-btn-danger layui-btn-sm" onclick="removeLogItem(this)">删除</a>
|
||||
</div>
|
||||
</div>`;
|
||||
$('#logItems').append(html);
|
||||
layui.form.render();
|
||||
}
|
||||
|
||||
// 删除更新日志项
|
||||
function removeLogItem(obj) {
|
||||
$(obj).closest('.log-item').remove();
|
||||
}
|
||||
|
||||
// 上传更新包
|
||||
layui.use(['upload', 'form', 'element'], function(){
|
||||
var upload = layui.upload;
|
||||
var form = layui.form;
|
||||
var element = layui.element;
|
||||
|
||||
upload.render({
|
||||
elem: '#uploadBtn',
|
||||
url: '{:url("upload")}',
|
||||
accept: 'file',
|
||||
exts: 'zip|exe|dmg|pkg|deb|rpm',
|
||||
drag: true,
|
||||
before: function(){
|
||||
console.log('开始上传...');
|
||||
$('.upload-info').show();
|
||||
element.progress('uploadProgress', '0%');
|
||||
$('.file-info').html('');
|
||||
},
|
||||
progress: function(n){
|
||||
var percent = n + '%';
|
||||
console.log('上传进度:', percent);
|
||||
element.progress('uploadProgress', percent);
|
||||
},
|
||||
done: function(res){
|
||||
console.log('上传响应:', res);
|
||||
if(res.code == 0){
|
||||
// 更新表单值
|
||||
$('input[name=download_url]').val(res.data.url);
|
||||
|
||||
// 更新顶部输入框的值
|
||||
$('input[name="version_no"]').val(res.data.version_no);
|
||||
$('input[name="version_name"]').val(res.data.version_name);
|
||||
|
||||
// 显示文件信息
|
||||
var html = '<div class="layui-badge layui-bg-green">上传成功</div> ';
|
||||
html += '<div class="layui-inline">版本号: ' + res.data.version_no + '</div> ';
|
||||
html += '<div class="layui-inline">版本名称: ' + res.data.version_name + '</div>';
|
||||
$('.file-info').html(html);
|
||||
|
||||
// 重新渲染表单
|
||||
form.render();
|
||||
} else {
|
||||
console.error('上传失败:', res.msg);
|
||||
$('.file-info').html('<div class="layui-badge layui-bg-red">'+res.msg+'</div>');
|
||||
}
|
||||
},
|
||||
error: function(index, upload){
|
||||
console.error('上传错误:', index, upload);
|
||||
$('.file-info').html('<div class="layui-badge layui-bg-red">上传失败</div>');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.upload-title { font-size: 16px; margin-bottom: 5px; }
|
||||
.upload-tips { color: #999; font-size: 12px; }
|
||||
.layui-upload-drag { padding: 30px; }
|
||||
.layui-upload-drag .layui-icon { font-size: 50px; color: #009688; }
|
||||
.file-info .layui-inline { margin-right: 10px; }
|
||||
</style>
|
||||
{/block}
|
||||
{/block}
|
||||
79
app/manager/view/version/index.html
Normal file
79
app/manager/view/version/index.html
Normal file
@@ -0,0 +1,79 @@
|
||||
{extend name="../../admin/view/main"}
|
||||
|
||||
{block name="button"}
|
||||
<button class='layui-btn layui-btn-sm layui-btn-primary' data-open='{:url("add")}'>添加版本</button>
|
||||
{/block}
|
||||
|
||||
{block name="content"}
|
||||
<div class="think-box-shadow">
|
||||
<table class="layui-table margin-top-10" lay-skin="line">
|
||||
{notempty name='list'}
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='text-left nowrap'>版本号</th>
|
||||
<th class='text-left nowrap'>版本名称</th>
|
||||
<th class='text-left nowrap'>平台</th>
|
||||
<th class='text-left nowrap'>下载地址</th>
|
||||
<th class='text-left nowrap'>强制更新</th>
|
||||
<th class='text-left nowrap'>最低要求</th>
|
||||
<th class='text-left nowrap'>状态</th>
|
||||
<th class='text-left nowrap'>创建时间</th>
|
||||
<th class='text-left'>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{/notempty}
|
||||
<tbody>
|
||||
{foreach $list as $key=>$vo}
|
||||
<tr>
|
||||
<td class='text-left nowrap'>{$vo.version_no|default=''}</td>
|
||||
<td class='text-left nowrap'>{$vo.version_name|default=''}</td>
|
||||
<td class='text-left nowrap'>{$vo.platform|default='all'}</td>
|
||||
<td class='text-left nowrap'>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-normal" href="{:sysconf('site_domain')}{$vo.download_url|default=''}" target="_blank">下载</a>
|
||||
<a class="layui-btn layui-btn-sm" data-copy="{:sysconf('site_domain')}{$vo.download_url|default=''}" data-tips-text="复制下载链接">
|
||||
<i class="layui-icon"></i>
|
||||
</a>
|
||||
<input type="text" class="layui-input layui-input-inline" style="width:200px;margin-left:5px;" value="{:sysconf('site_domain')}{$vo.download_url|default=''}" readonly>
|
||||
</td>
|
||||
<td class='text-left nowrap'>{if $vo.is_force}是{else}否{/if}</td>
|
||||
<td class='text-left nowrap'>{$vo.min_version|default=''}</td>
|
||||
<td class='text-left nowrap'>
|
||||
{if $vo.status eq 1}
|
||||
<span class="color-green">已启用</span>
|
||||
{else}
|
||||
<span class="color-red">已禁用</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class='text-left nowrap'>{$vo.create_time|format_datetime}</td>
|
||||
<td class='text-left'>
|
||||
<a class="layui-btn layui-btn-sm" data-open='{:url("edit")}?id={$vo.id}'>编辑</a>
|
||||
{if $vo.status eq 1}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-warm" data-action='{:url("state")}' data-value="id#{$vo.id};status#0">禁用</a>
|
||||
{else}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-warm" data-action='{:url("state")}' data-value="id#{$vo.id};status#1">启用</a>
|
||||
{/if}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-danger" data-confirm="确定要删除该版本吗?" data-action='{:url("remove")}' data-value="id#{$vo.id}">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
{empty name='list'}<span class="notdata">没有记录哦</span>{/empty}
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name="script"}
|
||||
<script>
|
||||
// 注册复制事件
|
||||
$('a[data-copy]').on('click', function () {
|
||||
var text = $(this).data('copy');
|
||||
var input = document.createElement('input');
|
||||
input.value = text;
|
||||
document.body.appendChild(input);
|
||||
input.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(input);
|
||||
$.msg.success('复制成功');
|
||||
});
|
||||
</script>
|
||||
{/block}
|
||||
Reference in New Issue
Block a user