fix: 修正打包脚本插件目录名(addon)、重建框架文件清单、修复 install.sql(sms 表冲突/菜单归属/权限名拼写)
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<!DOCTYPE html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>审核详情 - 应用市场管理</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="/assets/layui/css/layui.css" rel="stylesheet">
|
||||
<link href="/assets/ywxapp/css/wxapp.css" rel="stylesheet">
|
||||
<style>
|
||||
body { background: #f2f3f5; padding: 15px; }
|
||||
.info-card { background: #fff; border-radius: 4px; padding: 15px 20px; margin-bottom: 15px; }
|
||||
.info-card h3 { margin: 0 0 12px; font-size: 15px; border-left: 3px solid #1e9fff; padding-left: 8px; }
|
||||
.info-row { display: flex; flex-wrap: wrap; }
|
||||
.info-item { width: 50%; padding: 6px 0; box-sizing: border-box; }
|
||||
.info-item.full { width: 100%; }
|
||||
.info-item .label { color: #999; margin-right: 6px; }
|
||||
.info-item .value { color: #333; }
|
||||
.step-wrap { background: #fff; border-radius: 4px; padding: 20px; margin-bottom: 15px; }
|
||||
.timeline-empty { color: #999; text-align: center; padding: 20px 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="info-card">
|
||||
<h3>提交信息</h3>
|
||||
<div class="info-row" id="infoRow">
|
||||
<div class="timeline-empty">加载中…</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="step-wrap">
|
||||
<h3 style="margin:0 0 18px;font-size:15px;border-left:3px solid #1e9fff;padding-left:8px;">审核状态流</h3>
|
||||
<div class="layui-row layui-col-space20" id="stepRow">
|
||||
<div class="timeline-empty">加载中…</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info-card">
|
||||
<h3>审核历史时间线</h3>
|
||||
<ul class="layui-timeline" id="timeline">
|
||||
<li class="layui-timeline-item"><i class="layui-icon layui-timeline-axis layui-icon-loading"></i><div class="layui-timeline-content layui-text"><div class="timeline-empty">加载中…</div></div></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<script src="/assets/layui/layui.js"></script>
|
||||
<script src="/assets/ywxapp/ywxapp.js" module="{$site.app}"></script>
|
||||
<script>
|
||||
layui.use(['jquery', 'http', 'util'], function () {
|
||||
var $ = layui.jquery, http = layui.http, util = layui.util;
|
||||
var id = {$id};
|
||||
|
||||
function statusText(s) {
|
||||
switch (parseInt(s, 10)) {
|
||||
case 0: return '待审核';
|
||||
case 1: return '已通过';
|
||||
case 2: return '已驳回';
|
||||
default: return '未知(' + s + ')';
|
||||
}
|
||||
}
|
||||
function actionText(a) {
|
||||
switch (a) {
|
||||
case 'submit': return '提交审核';
|
||||
case 'approve': return '审核通过';
|
||||
case 'reject': return '审核驳回';
|
||||
default: return a;
|
||||
}
|
||||
}
|
||||
function fmt(ts) {
|
||||
if (!ts) return '';
|
||||
return util.toDateString(ts * 1000, 'yyyy-MM-dd HH:mm:ss');
|
||||
}
|
||||
|
||||
http.get('detail', { id: id }).then(function (r) {
|
||||
if (r.code !== 0 || !r.data) { $('#infoRow').html('<div class="timeline-empty">加载失败</div>'); return; }
|
||||
var d = r.data;
|
||||
var html = ''
|
||||
+ '<div class="info-item"><span class="label">ID:</span><span class="value">' + (d.id || '') + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">标识:</span><span class="value">' + (d.name || '') + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">名称:</span><span class="value">' + (d.title || '') + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">类型:</span><span class="value">' + (d.type === 'template' ? '模板' : '插件') + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">作者:</span><span class="value">' + (d.author || '') + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">版本:</span><span class="value">' + (d.version || '') + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">价格:</span><span class="value">' + (d.price > 0 ? '¥' + d.price : '免费') + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">当前状态:</span><span class="value">' + statusText(d.status) + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">提交时间:</span><span class="value">' + fmt(d.create_at) + '</span></div>'
|
||||
+ '<div class="info-item"><span class="label">上架状态:</span><span class="value">' + (d.published ? '已上架' : '未上架') + '</span></div>'
|
||||
+ '<div class="info-item full"><span class="label">简介:</span><span class="value">' + (d.description || '-') + '</span></div>'
|
||||
+ '<div class="info-item full"><span class="label">驳回原因:</span><span class="value">' + (d.reject_reason || '-') + '</span></div>';
|
||||
$('#infoRow').html(html);
|
||||
|
||||
// 步骤条:提交 → 审核(通过/驳回)
|
||||
var steps = [
|
||||
{ title: '提交审核', done: true },
|
||||
{ title: '运营审核', done: true, current: d.status != 0, reject: d.status == 2, pass: d.status == 1 }
|
||||
];
|
||||
var stepHtml = '';
|
||||
steps.forEach(function (s) {
|
||||
var cls = 'layui-bg-blue';
|
||||
if (s.reject) cls = 'layui-bg-red';
|
||||
else if (!s.done) cls = 'layui-bg-gray';
|
||||
var icon = '';
|
||||
if (s.reject) icon = 'ဆ';
|
||||
else if (!s.done) icon = '';
|
||||
stepHtml += ''
|
||||
+ '<div class="layui-col-xs6 layui-col-md6" style="text-align:center;">'
|
||||
+ ' <button class="layui-btn layui-btn-circle ' + cls + '">' + icon + '</button>'
|
||||
+ ' <div style="margin-top:6px;">' + s.title + '</div>'
|
||||
+ '</div>';
|
||||
});
|
||||
$('#stepRow').html('<div class="layui-col-xs12" style="display:flex;align-items:center;justify-content:center;">' + stepHtml + '</div>');
|
||||
}).catch(function () { $('#infoRow').html('<div class="timeline-empty">请求失败</div>'); });
|
||||
|
||||
http.get('history', { id: id }).then(function (r) {
|
||||
var arr = (r.code === 0 && r.data) ? r.data : [];
|
||||
if (!arr.length) {
|
||||
$('#timeline').html('<li class="layui-timeline-item"><i class="layui-icon layui-timeline-axis layui-icon-face-surprised"></i><div class="layui-timeline-content layui-text"><div class="timeline-empty">暂无审核记录</div></div></li>');
|
||||
return;
|
||||
}
|
||||
var html = '';
|
||||
arr.forEach(function (item) {
|
||||
var color = item.action === 'reject' ? '#ff5722' : (item.action === 'approve' ? '#16b777' : '#1e9fff');
|
||||
html += ''
|
||||
+ '<li class="layui-timeline-item">'
|
||||
+ ' <i class="layui-icon layui-timeline-axis" style="color:' + color + ';"></i>'
|
||||
+ ' <div class="layui-timeline-content layui-text">'
|
||||
+ ' <h4>' + actionText(item.action) + ' <span class="layui-badge layui-bg-gray">' + statusText(item.from_status) + ' → ' + statusText(item.to_status) + '</span></h4>'
|
||||
+ ' <p>操作人ID:' + (item.operator_id || 0) + (item.reason ? ';意见:' + item.reason : '') + '</p>'
|
||||
+ ' <p style="color:#999;">' + fmt(item.create_at) + '</p>'
|
||||
+ ' </div>'
|
||||
+ '</li>';
|
||||
});
|
||||
$('#timeline').html(html);
|
||||
}).catch(function () {
|
||||
$('#timeline').html('<li class="layui-timeline-item"><i class="layui-icon layui-timeline-axis layui-icon-face-surprised"></i><div class="layui-timeline-content layui-text"><div class="timeline-empty">请求失败</div></div></li>');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,93 +1,121 @@
|
||||
|
||||
<div class="layui-card" style="margin:20px;">
|
||||
<div class="layui-card-header">插件审核(开发者上架申请)</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form layui-row" style="margin-bottom:12px;">
|
||||
<div class="layui-inline">
|
||||
<select id="statusFilter">
|
||||
<option value="">全部状态</option>
|
||||
<option value="0">待审核</option>
|
||||
<option value="1">已发布</option>
|
||||
<option value="2">已驳回</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" id="searchBtn">搜索</button>
|
||||
</div>
|
||||
</div>
|
||||
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>插件审核 - 应用市场管理</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="/assets/layui/css/layui.css" rel="stylesheet">
|
||||
<link href="/assets/ywxapp/css/wxapp.css" rel="stylesheet">
|
||||
<style>body{background:#f2f3f5;padding:15px;}</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form" lay-filter="filterForm">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-inline" style="width:140px;">
|
||||
<select name="status">
|
||||
<option value="">全部</option>
|
||||
<option value="0">待审核</option>
|
||||
<option value="1">已通过</option>
|
||||
<option value="2">已驳回</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<button class="layui-btn" lay-submit lay-filter="search">搜索</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script type="text/html" id="toolTpl">
|
||||
<table id="dataTable" lay-filter="dataTable"></table>
|
||||
|
||||
<script type="text/html" id="statusTpl">
|
||||
{{# if(d.status == 0){ }}<span class="layui-badge layui-bg-orange">待审核</span>
|
||||
{{# } else if(d.status == 1){ }}<span class="layui-badge layui-bg-green">已通过</span>
|
||||
{{# } else { }}<span class="layui-badge">已驳回</span>{{# } }}
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="operateTpl">
|
||||
<a class="layui-btn layui-btn-xs" href="download?id={{ d.id }}" target="_blank">下载包</a>
|
||||
{{# if(d.status == 0){ }}
|
||||
<a class="layui-btn layui-btn-xs" lay-event="audit">通过</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="approve">通过并发布</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="reject">驳回</a>
|
||||
{{# } else { }}
|
||||
<span class="layui-badge {{ d.status == 1 ? 'layui-bg-green' : '' }}">
|
||||
{{ d.status == 1 ? '已发布' : '已驳回' }}
|
||||
</span>
|
||||
{{# } }}
|
||||
</script>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="price">改价</a>
|
||||
<a class="layui-btn layui-btn-xs" lay-event="detail">查看详情</a>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
layui.use(['table', 'jquery', 'layer'], function () {
|
||||
var table = layui.table, $ = layui.jquery, layer = layui.layer;
|
||||
table.render({
|
||||
<script src="/assets/layui/layui.js"></script>
|
||||
<script src="/assets/ywxapp/ywxapp.js" module="{$site.app}"></script>
|
||||
<script>
|
||||
layui.use(['table', 'form', 'layer', 'jquery', 'http'], function () {
|
||||
var table = layui.table, form = layui.form, layer = layui.layer, $ = layui.jquery, http = layui.http;
|
||||
|
||||
table.render({
|
||||
elem: '#dataTable',
|
||||
url: '{:url("/appmall/backend/addonreview/index")}',
|
||||
url: 'index',
|
||||
page: true,
|
||||
response: { statusName: 'code', msgName: 'message', countName: 'count', dataName: 'data' },
|
||||
parseData: function (res) {
|
||||
return {
|
||||
code: res.code,
|
||||
msg: res.message,
|
||||
count: res.count || 0,
|
||||
data: res.data || []
|
||||
};
|
||||
},
|
||||
where: { status: $('#statusFilter').val() },
|
||||
limits: [10, 20, 50],
|
||||
limit: 10,
|
||||
cols: [[
|
||||
{field: 'id', title: 'ID', width: 70},
|
||||
{field: 'title', title: '插件名称', width: 160},
|
||||
{field: 'name', title: '标识', width: 140},
|
||||
{field: 'version', title: '版本', width: 90},
|
||||
{field: 'developer_id', title: '开发者ID', width: 100},
|
||||
{field: 'price', title: '价格', width: 90, templet: function(d){return d.price ? d.price : '免费';}},
|
||||
{field: 'status', title: '状态', width: 90, templet: function(d){
|
||||
if(d.status==0) return '<span class="layui-badge">待审核</span>';
|
||||
if(d.status==1) return '<span class="layui-badge layui-bg-green">已发布</span>';
|
||||
return '<span class="layui-badge layui-bg-red">已驳回</span>';
|
||||
}},
|
||||
{field: 'reject_reason', title: '驳回原因', width: 160},
|
||||
{field: 'create_at', title: '提交时间', width: 170, templet: function(d){return layui.util.toDateString(d.create_at*1000);}},
|
||||
{title: '操作', width: 160, templet: '#toolTpl', fixed: 'right'}
|
||||
]]
|
||||
});
|
||||
{ field: 'id', title: 'ID', width: 70 },
|
||||
{ field: 'name', title: '标识', width: 120 },
|
||||
{ field: 'type', title: '类型', width: 80, templet: function (d) {
|
||||
return d.type === 'template'
|
||||
? '<span class="layui-badge" style="background:#722ed1;">模板</span>'
|
||||
: '<span class="layui-badge layui-bg-blue">插件</span>';
|
||||
} },
|
||||
{ field: 'title', title: '名称', minWidth: 140 },
|
||||
{ field: 'author', title: '作者', width: 120 },
|
||||
{ field: 'version', title: '版本', width: 90 },
|
||||
{ field: 'price', title: '价格', width: 90, templet: function (d) { return d.price > 0 ? '¥' + d.price : '免费'; } },
|
||||
{ field: 'status', title: '状态', width: 90, templet: '#statusTpl' },
|
||||
{ field: 'reject_reason', title: '驳回原因', minWidth: 160 },
|
||||
{ field: 'create_at', title: '提交时间', width: 170, templet: function (d) { return d.create_at ? new Date(d.create_at * 1000).toLocaleString() : ''; } },
|
||||
{ title: '操作', width: 240, toolbar: '#operateTpl', fixed: 'right' }
|
||||
]],
|
||||
response: { statusName: 'code', statusCode: 0, msgName: 'message', countName: 'count', dataName: 'data' }
|
||||
});
|
||||
|
||||
$('#searchBtn').on('click', function () {
|
||||
table.reload('dataTable', { where: { status: $('#statusFilter').val() }, page: { curr: 1 } });
|
||||
});
|
||||
form.on('submit(search)', function (data) {
|
||||
table.reload('dataTable', { where: data.field, page: { curr: 1 } });
|
||||
return false;
|
||||
});
|
||||
|
||||
table.on('tool(dataTable)', function (obj) {
|
||||
var d = obj.data;
|
||||
if (obj.event === 'audit') {
|
||||
layer.confirm('确认通过该插件上架申请?', function (index) {
|
||||
$.post('{:url("/appmall/backend/addonreview/audit")}', { id: d.id }, function (r) {
|
||||
layer.msg(r.msg || '操作完成');
|
||||
if (r.code === 0) { table.reload('dataTable'); }
|
||||
layer.close(index);
|
||||
}, 'json');
|
||||
});
|
||||
} else if (obj.event === 'reject') {
|
||||
layer.prompt({ title: '填写驳回原因', formType: 2 }, function (val, index) {
|
||||
$.post('{:url("/appmall/backend/addonreview/reject")}', { id: d.id, reason: val }, function (r) {
|
||||
layer.msg(r.msg || '操作完成');
|
||||
if (r.code === 0) { table.reload('dataTable'); }
|
||||
layer.close(index);
|
||||
}, 'json');
|
||||
});
|
||||
table.on('tool(dataTable)', function (elem) {
|
||||
var d = elem.data;
|
||||
if (elem.event === 'approve') {
|
||||
layer.confirm('确认通过该插件并发布到市场?', function () {
|
||||
http.post('approve', { id: d.id }).then(function (r) {
|
||||
if (r.code === 0) { layer.msg('已通过并发布', { icon: 1 }); table.reload('dataTable'); }
|
||||
else { layer.msg(r.message || '操作失败', { icon: 2 }); }
|
||||
}).catch(function () { layer.msg('请求失败', { icon: 2 }); });
|
||||
});
|
||||
} else if (elem.event === 'reject') {
|
||||
layer.prompt({ title: '驳回原因', formType: 2 }, function (val, idx) {
|
||||
http.post('reject', { id: d.id, reason: val }).then(function (r) {
|
||||
if (r.code === 0) { layer.close(idx); layer.msg('已驳回', { icon: 1 }); table.reload('dataTable'); }
|
||||
else { layer.msg(r.message || '操作失败', { icon: 2 }); }
|
||||
}).catch(function () { layer.msg('请求失败', { icon: 2 }); });
|
||||
});
|
||||
} else if (elem.event === 'detail') {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '审核详情 #' + d.id,
|
||||
area: ['720px', '80%'],
|
||||
content: 'detailview?id=' + d.id
|
||||
});
|
||||
} else if (elem.event === 'price') {
|
||||
layer.prompt({ title: '修改「' + d.name + '」价格(0 为免费,同步全部版本)', value: d.price || '0' }, function (val, idx) {
|
||||
var p = parseFloat(val);
|
||||
if (isNaN(p) || p < 0) { layer.msg('请输入不小于 0 的价格', { icon: 2 }); return; }
|
||||
http.post('updatePrice', { name: d.name, price: p }).then(function (r) {
|
||||
if (r.code === 0) { layer.close(idx); layer.msg(r.message || '价格已更新', { icon: 1 }); table.reload('dataTable'); }
|
||||
else { layer.msg(r.message || '操作失败', { icon: 2 }); }
|
||||
}).catch(function () { layer.msg('请求失败', { icon: 2 }); });
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user