first commit
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
{include file="public/header" /}
|
||||
<form class="layui-form" style="padding:0 20%;">
|
||||
<div class="layui-tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">个人信息</li>
|
||||
<li>密码信息</li>
|
||||
<li>其它信息</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">账户</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-form-label" style="color:#3881fd;text-align:left;width:100%;">{$aUser['account']}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">说明</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-form-label" style="width:100%;text-align:left;color:#999;">账户用于登录系统的账号,不能修改</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">姓名</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="name" placeholder="请输入真实姓名" value="{$aUser['name']}">
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">手机号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="phone" placeholder="请输入手机号" value="{$aUser['phone']}">
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">QQ号</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="qq" placeholder="请输入QQ号" value="{$aUser['qq']}">
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="1" title="男" {$aUser['status']==1?'checked':''}>
|
||||
<input type="radio" name="sex" value="2" title="女" {$aUser['status']==2?'checked':''}>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">老密码</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="old_pw" placeholder="请输入老密码,不修改不填写">
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">新密码</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="new_pw" placeholder="请输入新密码,不修改不填写">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">登陆次数</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-form-label" style="text-align:left;width:100%;">{$aUser['login_count']}次</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">注册时间</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-form-label" style="text-align:left;width:100%;">{:date('Y-m-d H:i:s',$aUser['create_time'])}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="padding:15px;">
|
||||
<label class="layui-form-label">登陆时间</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-form-label" style="text-align:left;width:100%;">{:date('Y-m-d H:i:s',$aUser['update_time'])}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-form-item" style="margin-top:10px;">
|
||||
<div class="layui-input-block" style="text-align:center;">
|
||||
<button type="button" class="layui-btn" onclick="save()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer','form','element'],function(){
|
||||
var form = layui.form;
|
||||
element = layui.element;
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
function save(){
|
||||
$.post("{$config['admin_route']}yunzeradmin/admininfo",$('form').serialize(),function(res){
|
||||
if(res.code>0){
|
||||
layer.msg(res.msg,{'icon':2});
|
||||
}else{
|
||||
layer.msg(res.msg,{'icon':1});
|
||||
setTimeout(function(){parent.window.location.reload();},1000);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,249 @@
|
||||
{include file="public/header" /}
|
||||
<!-- 主体内容 -->
|
||||
<div class="config-container">
|
||||
<!-- 页面头部样式 -->
|
||||
<div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
|
||||
<div class="maintitle">
|
||||
<i class="layui-icon layui-icon-picture"></i>
|
||||
<span>Banner管理</span>
|
||||
</div>
|
||||
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;margin-bottom: 10px;">
|
||||
<div>
|
||||
<button class="layui-btn layui-bg-blue" id="addBanner">
|
||||
<i class="layui-icon layui-icon-add-1"></i>添加Banner
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refresh()">
|
||||
<i class="layui-icon layui-icon-refresh"></i>刷新
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<table id="bannerTable" lay-filter="bannerTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Banner表单 -->
|
||||
<div id="bannerForm" style="display: none;">
|
||||
<form class="layui-form banner-form">
|
||||
<input type="hidden" name="id">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" required lay-verify="required" placeholder="请输入标题"
|
||||
class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">图片</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-upload-drag" id="uploadImage">
|
||||
<i class="layui-icon layui-icon-upload"></i>
|
||||
<p>点击上传或拖拽图片至此处</p>
|
||||
<div id="uploadPreview" style="display: none;">
|
||||
<img src="" alt="Banner图片" class="banner-upload-preview">
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="image" id="imageInput">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">链接</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="url" placeholder="请输入链接地址" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="0" class="layui-input" placeholder="数字越大越靠前">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="启用" checked>
|
||||
<input type="radio" name="status" value="0" title="禁用">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBanner">保存</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['table', 'form', 'upload', 'layer'], function () {
|
||||
var table = layui.table,
|
||||
form = layui.form,
|
||||
upload = layui.upload,
|
||||
layer = layui.layer;
|
||||
|
||||
// 表格列配置
|
||||
var tableColumns = [[
|
||||
{ field: 'id', title: 'ID', width: 80, align: 'center' },
|
||||
{ field: 'title', title: '标题', align: 'center' },
|
||||
{
|
||||
field: 'image', title: '图片', width: 180, align: 'center', templet: function (d) {
|
||||
return '<img src="' + d.image + '" class="banner-preview-img" onclick="previewImage(\'' + d.image + '\')">';
|
||||
}
|
||||
},
|
||||
{ field: 'url', title: '链接', align: 'center', width: 300 },
|
||||
{ field: 'sort', title: '排序', align: 'center', width: 100, sort: true },
|
||||
{ field: 'create_time', title: '创建时间', align: 'center', width: 180, sort: true },
|
||||
{
|
||||
title: '操作', align: 'center', width: 240, templet: function (d) {
|
||||
return '<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>' +
|
||||
'<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
}
|
||||
}
|
||||
]];
|
||||
|
||||
// 初始化表格
|
||||
table.render({
|
||||
elem: '#bannerTable',
|
||||
url: '/admin/yunzeradmin/bannerlist',
|
||||
method: 'get',
|
||||
page: true,
|
||||
cols: tableColumns,
|
||||
limit: 10,
|
||||
limits: [10, 20, 30, 50],
|
||||
text: { none: '暂无相关数据' }
|
||||
});
|
||||
|
||||
// 上传组件配置
|
||||
var uploadConfig = {
|
||||
elem: '#uploadImage',
|
||||
url: '/admin/upload/image',
|
||||
accept: 'images',
|
||||
acceptMime: 'image/*',
|
||||
done: function (res) {
|
||||
if (res.code === 0) {
|
||||
$('#uploadPreview').show().find('img').attr('src', res.data.url);
|
||||
$('#imageInput').val(res.data.url);
|
||||
layer.msg('上传成功');
|
||||
} else {
|
||||
layer.msg('上传失败');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 初始化上传组件
|
||||
upload.render(uploadConfig);
|
||||
|
||||
// 监听表格工具条事件
|
||||
table.on('tool(bannerTable)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
showBannerForm(data);
|
||||
} else if (obj.event === 'del') {
|
||||
layer.confirm('确定删除此Banner?', function (index) {
|
||||
deleteBanner(data.id, obj);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 添加Banner按钮点击事件
|
||||
$('#addBanner').on('click', function () {
|
||||
showBannerForm();
|
||||
});
|
||||
|
||||
// 监听表单提交
|
||||
form.on('submit(saveBanner)', function (data) {
|
||||
var url = data.field.id ? '/admin/yunzeradmin/banneredit' : '/admin/yunzeradmin/banneradd';
|
||||
$.post(url, data.field, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.closeAll('page');
|
||||
table.reload('bannerTable');
|
||||
layer.msg('保存成功');
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
// 显示Banner表单
|
||||
function showBannerForm(data) {
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: data ? '编辑Banner' : '添加Banner',
|
||||
content: $('#bannerForm'),
|
||||
area: ['800px', '600px'],
|
||||
success: function (layero) {
|
||||
form.render();
|
||||
if (data) {
|
||||
form.val('bannerForm', data);
|
||||
if (data.image) {
|
||||
$('#uploadPreview').show().find('img').attr('src', data.image);
|
||||
$('#imageInput').val(data.image);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 删除Banner
|
||||
function deleteBanner(id, obj) {
|
||||
$.post('/admin/yunzeradmin/bannerdel', { id: id }, function (res) {
|
||||
if (res.code === 0) {
|
||||
obj.del();
|
||||
layer.msg('删除成功');
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 预览图片
|
||||
function previewImage(url) {
|
||||
layer.photos({
|
||||
photos: {
|
||||
"data": [{
|
||||
"src": url
|
||||
}]
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<!-- 页面样式 -->
|
||||
<style>
|
||||
.layui-table-cell {
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.layui-table-cell img {
|
||||
height: 36px;
|
||||
width: auto;
|
||||
max-width: 80px;
|
||||
}
|
||||
|
||||
.banner-preview-img {
|
||||
max-width: 80px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.banner-form {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.banner-upload-preview {
|
||||
max-width: 100%;
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,231 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<!-- 页面头部样式 -->
|
||||
<div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
|
||||
<div class="maintitle">
|
||||
<i class="layui-icon layui-icon-notice"></i>
|
||||
<span>内容推送列表</span>
|
||||
</div>
|
||||
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;margin-bottom: 10px;">
|
||||
<div>
|
||||
<!-- <button class="layui-btn layui-bg-blue" onclick="add()">
|
||||
<i class="layui-icon layui-icon-add-1"></i>添加推送
|
||||
</button> -->
|
||||
<button class="layui-btn layui-bg-blue" onclick="setting()">
|
||||
<i class="layui-icon layui-icon-set-fill"></i>推送配置
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-border-green" onclick="pushSelected()">
|
||||
<i class="layui-icon layui-icon-release"></i>推送
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refresh()">
|
||||
<i class="layui-icon layui-icon-refresh"></i>刷新
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table id="contentPushTable" lay-filter="contentPushTable"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['table', 'layer'], function () {
|
||||
var table = layui.table;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.jquery;
|
||||
|
||||
// 初始化表格
|
||||
table.render({
|
||||
elem: '#contentPushTable',
|
||||
url: '{$config["admin_route"]}yunzeradmin/contentpushlist',
|
||||
page: true,
|
||||
cols: [[
|
||||
{ type: 'checkbox', fixed: 'left' }, // 多选全选
|
||||
// {field: 'id', title: 'ID', width: 80, sort: true},
|
||||
{
|
||||
field: 'type', title: '类型', width: 80, templet: function (d) {
|
||||
return d.type == 'article' ? '文章' : '资源';
|
||||
}
|
||||
},
|
||||
{ field: 'title', title: '标题' },
|
||||
{
|
||||
field: 'url', title: '链接', templet: function (d) {
|
||||
if (d.type == 'article') {
|
||||
return '<a href="https://www.yunzer.cn/index/articles/detail?id=' + d.id + '" target="_blank">https://www.yunzer.cn/index/articles/detail?id=' + d.id + '</a>';
|
||||
} else if (d.type == 'resource') {
|
||||
return '<a href="https://www.yunzer.cn/index/resources/detail?id=' + d.id + '" target="_blank">https://www.yunzer.cn/index/resources/detail?id=' + d.id + '</a>';
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'push', title: '推送状态', width: 100, templet: function (d) {
|
||||
return d.push == 1 ?
|
||||
'<span class="layui-badge layui-bg-green">已推送</span>' :
|
||||
'<span class="layui-badge">未推送</span>';
|
||||
}
|
||||
},
|
||||
// {field: 'sort', title: '排序', width: 100, sort: true},
|
||||
{ field: 'create_time', title: '创建时间', width: 180 },
|
||||
// {title: '操作', width: 200, toolbar: '#tableBar', fixed: 'right'}
|
||||
]],
|
||||
limit: 10,
|
||||
limits: [10, 20, 30, 50]
|
||||
});
|
||||
|
||||
// 监听工具条
|
||||
table.on('tool(contentPushTable)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
edit(data.id);
|
||||
} else if (obj.event === 'del') {
|
||||
del(data.id);
|
||||
} else if (obj.event === 'status') {
|
||||
changeStatus(data.id, data.status);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 添加
|
||||
function add() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '添加内容推送',
|
||||
shade: 0.3,
|
||||
area: ['800px', '600px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/contentpushadd"
|
||||
});
|
||||
}
|
||||
|
||||
// 编辑
|
||||
function edit(id) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '编辑内容推送',
|
||||
shade: 0.3,
|
||||
area: ['800px', '600px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/contentpushedit?id=" + id
|
||||
});
|
||||
}
|
||||
|
||||
// 删除
|
||||
function del(id) {
|
||||
layer.confirm('确定要删除这条推送吗?', {
|
||||
icon: 3,
|
||||
btn: ['确定', '取消']
|
||||
}, function () {
|
||||
$.post("{$config['admin_route']}yunzeradmin/contentpushdel", { 'id': id }, function (res) {
|
||||
if (res.code > 0) {
|
||||
layer.msg(res.msg, { icon: 2 });
|
||||
} else {
|
||||
layer.msg(res.msg, { icon: 1 });
|
||||
layui.table.reload('contentPushTable');
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
}
|
||||
|
||||
// 修改状态
|
||||
function changeStatus(id, status) {
|
||||
var newStatus = status == 1 ? 0 : 1;
|
||||
$.post("{$config['admin_route']}yunzeradmin/contentpushstatus", {
|
||||
'id': id,
|
||||
'status': newStatus
|
||||
}, function (res) {
|
||||
if (res.code > 0) {
|
||||
layer.msg(res.msg, { icon: 2 });
|
||||
} else {
|
||||
layer.msg(res.msg, { icon: 1 });
|
||||
layui.table.reload('contentPushTable');
|
||||
}
|
||||
}, 'json');
|
||||
}
|
||||
|
||||
//配置
|
||||
function setting() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '推送配置',
|
||||
shade: 0.3,
|
||||
area: ['1000px', '800px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/contentpushsetting"
|
||||
});
|
||||
}
|
||||
|
||||
//推送数据
|
||||
function pushSelected() {
|
||||
var checkStatus = layui.table.checkStatus('contentPushTable');
|
||||
var data = checkStatus.data;
|
||||
if (data.length === 0) {
|
||||
layer.msg('请先选择要推送的数据', { icon: 2 });
|
||||
return;
|
||||
}
|
||||
|
||||
$.getJSON("{$config['admin_route']}yunzeradmin/contentpushsetting", function (res) {
|
||||
if (res.code !== 0 || !res.data || res.data.length === 0) {
|
||||
layer.msg('暂无可用推送平台');
|
||||
return;
|
||||
}
|
||||
|
||||
var html = '<div style="padding:10px;"><table class="layui-table"><thead><tr><th>ID</th><th>平台名称</th><th>类型标识</th></tr></thead><tbody>';
|
||||
res.data.forEach(function (item) {
|
||||
if (item.status == 1) {
|
||||
html += '<tr style="cursor:pointer" data-type="' + item.platformType + '" data-title="' + item.title.replace(/'/g, "\\'") + '">';
|
||||
html += '<td>' + item.id + '</td>';
|
||||
html += '<td>' + item.title + '</td>';
|
||||
html += '<td>' + item.platformType + '</td>';
|
||||
html += '</tr>';
|
||||
}
|
||||
});
|
||||
html += '</tbody></table></div>';
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: '选择推送平台',
|
||||
area: ['500px', '350px'],
|
||||
content: html,
|
||||
success: function (layero, index) {
|
||||
// 事件委托,避免全局变量
|
||||
$(layero).find('tr[data-type]').on('click', function () {
|
||||
var platformType = $(this).data('type');
|
||||
var platformTitle = $(this).data('title');
|
||||
layer.close(index);
|
||||
|
||||
var urls = [];
|
||||
data.forEach(function (item) {
|
||||
urls.push('https://www.yunzer.cn/index/' + (item.type === 'resource' ? 'resources' : 'articles') + '/detail?id=' + item.id);
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
url: "{$config['admin_route']}yunzeradmin/gopush",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({
|
||||
platformType: platformType,
|
||||
urls: urls
|
||||
}),
|
||||
dataType: "json",
|
||||
success: function (res) {
|
||||
layer.msg(res.msg, { icon: res.code === 0 ? 1 : 2, time: 5000 });
|
||||
layui.table.reload('contentPushTable');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 刷新列表
|
||||
function refresh() {
|
||||
layui.table.reload('contentPushTable');
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- 表格操作列模板 -->
|
||||
<!-- <script type="text/html" id="tableBar">
|
||||
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a>
|
||||
</script> -->
|
||||
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,174 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<form class="layui-form" action="{$config['admin_route']}yunzeradmin/contentpushsave" method="post"
|
||||
lay-filter="contentPushForm">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">推送平台</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="push_platform" id="pushPlatformSelect" required lay-verify="required">
|
||||
<option value="">请选择推送平台</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">推送分类</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="pushcate" required lay-verify="required">
|
||||
<option value="article">文章分类</option>
|
||||
<option value="resource">资源分类</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">推送内容</label>
|
||||
<div class="layui-input-block" style="display: flex; align-items: center;">
|
||||
<input type="text" name="title" id="pushTitleInput" required lay-verify="required" placeholder="请输入推送标题"
|
||||
autocomplete="off" class="layui-input" style="flex:1;">
|
||||
<button type="button" class="layui-btn layui-btn-primary" id="selectPushContent"
|
||||
style="margin-left: 8px;">
|
||||
<i class="layui-icon layui-icon-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">跳转链接</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="url" placeholder="请输入跳转链接" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="layui-form-item">
|
||||
<label class="layui-form-label">推送图片</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="image" id="image" placeholder="请上传推送图片" autocomplete="off" class="layui-input">
|
||||
<button type="button" class="layui-btn" id="uploadImage">
|
||||
<i class="layui-icon"></i>上传图片
|
||||
</button>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- <div class="layui-form-item">
|
||||
<label class="layui-form-label">推送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="type" value="1" title="普通推送" checked>
|
||||
<input type="radio" name="type" value="2" title="重要推送">
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- <div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="启用" checked>
|
||||
<input type="radio" name="status" value="0" title="禁用">
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- <div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="0" placeholder="请输入排序值" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="contentPushForm">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['layer', 'jquery', 'form', 'upload'], function () {
|
||||
var $ = layui.jquery,
|
||||
layer = layui.layer,
|
||||
form = layui.form,
|
||||
upload = layui.upload;
|
||||
|
||||
// 动态加载推送平台
|
||||
$.getJSON("{$config['admin_route']}yunzeradmin/contentpushsetting", function (res) {
|
||||
if (res.data.length > 0) {
|
||||
var $select = $('#pushPlatformSelect');
|
||||
res.data.forEach(function (item) {
|
||||
if (item.status == 1) {
|
||||
$select.append(
|
||||
$('<option>', {
|
||||
value: item.id,
|
||||
text: item.title
|
||||
})
|
||||
);
|
||||
}
|
||||
});
|
||||
form.render('select');
|
||||
}
|
||||
});
|
||||
|
||||
// 选择推送内容
|
||||
$('#selectPushContent').on('click', function () {
|
||||
var pushCate = $('select[name="pushcate"]').val();
|
||||
|
||||
// 弹窗选择内容
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '选择推送内容',
|
||||
area: ['800px', '500px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/selectpushcontent?pushcate=" + pushCate,
|
||||
success: function (layero, index) {
|
||||
// 可在弹窗页面通过父页面回调选中内容
|
||||
window.setPushContent = function (title, url) {
|
||||
$('#pushTitleInput').val(title);
|
||||
// 如果需要同步设置跳转链接
|
||||
if (url) {
|
||||
$('input[name="url"]').val(url);
|
||||
}
|
||||
layer.close(index);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 图片上传
|
||||
upload.render({
|
||||
elem: '#uploadImage',
|
||||
url: '{$config["admin_route"]}yunzeradmin/upload',
|
||||
accept: 'images',
|
||||
acceptMime: 'image/*',
|
||||
done: function (res) {
|
||||
if (res.code == 0) {
|
||||
$('#image').val(res.data.src);
|
||||
layer.msg('上传成功');
|
||||
} else {
|
||||
layer.msg('上传失败');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 表单提交
|
||||
form.on('submit(contentPushForm)', function (data) {
|
||||
$.ajax({
|
||||
url: data.form.action,
|
||||
type: 'POST',
|
||||
data: data.field,
|
||||
success: function (res) {
|
||||
if (res.code == 0) {
|
||||
layer.msg(res.msg, { icon: 1 }, function () {
|
||||
var index = parent.layer.getFrameIndex(window.name);
|
||||
parent.layer.close(index);
|
||||
parent.layui.table.reload('contentPushTable');
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.msg, { icon: 2 });
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,108 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<form class="layui-form" action="{$config['admin_route']}yunzeradmin/contentpushsave" method="post" lay-filter="contentPushForm">
|
||||
<input type="hidden" name="id" value="{$info.id}">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">推送标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" value="{$info.title}" required lay-verify="required" placeholder="请输入推送标题" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">推送内容</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="content" placeholder="请输入推送内容" class="layui-textarea" required lay-verify="required">{$info.content}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">推送图片</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="image" id="image" value="{$info.image}" placeholder="请上传推送图片" autocomplete="off" class="layui-input">
|
||||
<button type="button" class="layui-btn" id="uploadImage">
|
||||
<i class="layui-icon"></i>上传图片
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">跳转链接</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="url" value="{$info.url}" placeholder="请输入跳转链接" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">推送类型</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="type" value="1" title="普通推送" {if $info.type==1}checked{/if}>
|
||||
<input type="radio" name="type" value="2" title="重要推送" {if $info.type==2}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="启用" {if $info.status==1}checked{/if}>
|
||||
<input type="radio" name="status" value="0" title="禁用" {if $info.status==0}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="contentPushForm">保存</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['form', 'upload', 'layer'], function(){
|
||||
var form = layui.form;
|
||||
var upload = layui.upload;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.jquery;
|
||||
|
||||
// 图片上传
|
||||
upload.render({
|
||||
elem: '#uploadImage',
|
||||
url: '{$config["admin_route"]}yunzeradmin/upload',
|
||||
accept: 'images',
|
||||
acceptMime: 'image/*',
|
||||
done: function(res){
|
||||
if(res.code == 0){
|
||||
$('#image').val(res.data.src);
|
||||
layer.msg('上传成功');
|
||||
} else {
|
||||
layer.msg('上传失败');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 表单提交
|
||||
form.on('submit(contentPushForm)', function(data){
|
||||
$.ajax({
|
||||
url: data.form.action,
|
||||
type: 'POST',
|
||||
data: data.field,
|
||||
success: function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg, {icon: 1}, function(){
|
||||
var index = parent.layer.getFrameIndex(window.name);
|
||||
parent.layer.close(index);
|
||||
parent.layui.table.reload('contentPushTable');
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,109 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
|
||||
<div class="maintitle">
|
||||
<i class="layui-icon layui-icon-set-fill"></i>
|
||||
<span>推送配置列表</span>
|
||||
</div>
|
||||
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;margin-bottom: 10px;">
|
||||
<div>
|
||||
<button class="layui-btn layui-bg-blue" onclick="addSetting()">
|
||||
<i class="layui-icon layui-icon-add-1"></i>添加配置
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refreshSetting()">
|
||||
<i class="layui-icon layui-icon-refresh"></i>刷新
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table id="contentPushSettingTable" lay-filter="contentPushSettingTable"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="settingTableBar">
|
||||
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['table', 'layer'], function () {
|
||||
var table = layui.table;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.jquery;
|
||||
|
||||
// 渲染表格
|
||||
table.render({
|
||||
elem: '#contentPushSettingTable',
|
||||
url: '{$config["admin_route"]}yunzeradmin/contentpushsetting',
|
||||
page: true,
|
||||
cols: [[
|
||||
{field: 'id', title: 'ID', width: 80, sort: true},
|
||||
{field: 'title', title: '配置标题', width: 200},
|
||||
{field: 'value', title: '配置值', width: 300},
|
||||
{field: 'status', title: '状态', width: 100, templet: function(d){
|
||||
return d.status == 1 ?
|
||||
'<span class="layui-badge layui-bg-green">启用</span>' :
|
||||
'<span class="layui-badge">禁用</span>';
|
||||
}},
|
||||
{field: 'sort', title: '排序', width: 100, sort: true},
|
||||
{field: 'create_time', title: '创建时间', width: 180},
|
||||
{title: '操作', width: 160, toolbar: '#settingTableBar', fixed: 'right'}
|
||||
]],
|
||||
limit: 10,
|
||||
limits: [10, 20, 30, 50]
|
||||
});
|
||||
|
||||
// 工具条事件
|
||||
table.on('tool(contentPushSettingTable)', function(obj){
|
||||
var data = obj.data;
|
||||
if(obj.event === 'edit'){
|
||||
editSetting(data.id);
|
||||
} else if(obj.event === 'del'){
|
||||
layer.confirm('确定要删除该配置吗?', function(index){
|
||||
$.post('{$config["admin_route"]}yunzeradmin/contentpushsettingdel', {id: data.id}, function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg('删除成功', {icon: 1});
|
||||
table.reload('contentPushSettingTable');
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
});
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 刷新
|
||||
window.refreshSetting = function(){
|
||||
table.reload('contentPushSettingTable');
|
||||
};
|
||||
|
||||
// 添加
|
||||
window.addSetting = function(){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '添加推送配置',
|
||||
area: ['800px', '600px'],
|
||||
content: '{$config["admin_route"]}yunzeradmin/contentpushsettingadd',
|
||||
end: function(){
|
||||
table.reload('contentPushSettingTable');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// 编辑
|
||||
window.editSetting = function(id){
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '编辑推送配置',
|
||||
area: ['600px', '400px'],
|
||||
content: '{$config["admin_route"]}yunzeradmin/contentpushsettingadd?id=' + id,
|
||||
end: function(){
|
||||
table.reload('contentPushSettingTable');
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,75 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<form class="layui-form" action="{$config['admin_route']}yunzeradmin/contentpushsettingadd" method="post" lay-filter="contentPushForm">
|
||||
{if isset($info.id)}
|
||||
<input type="hidden" name="id" value="{$info.id}">
|
||||
{/if}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">配置标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" required lay-verify="required" placeholder="请输入配置标题" autocomplete="off" class="layui-input" value="{$info.title|default=''}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">配置值</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="value" placeholder="请输入配置值" class="layui-textarea" required lay-verify="required">{$info.value|default=''}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="启用" {if !isset($info.status) || $info.status==1}checked{/if}>
|
||||
<input type="radio" name="status" value="0" title="禁用" {if isset($info.status) && $info.status==0}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="{$info.sort|default='0'}" placeholder="请输入排序值" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="contentPushForm">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['form', 'upload', 'layer'], function(){
|
||||
var form = layui.form;
|
||||
var upload = layui.upload;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.jquery;
|
||||
|
||||
// 表单提交
|
||||
form.on('submit(contentPushForm)', function(data){
|
||||
$.ajax({
|
||||
url: data.form.action,
|
||||
type: 'POST',
|
||||
data: data.field,
|
||||
success: function(res){
|
||||
if(res.code == 0){
|
||||
layer.msg(res.msg, {icon: 1}, function(){
|
||||
var index = parent.layer.getFrameIndex(window.name);
|
||||
parent.layer.close(index);
|
||||
parent.layui.table.reload('contentPushTable');
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,181 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<!-- 页面头部样式 -->
|
||||
<div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
|
||||
<div class="maintitle">
|
||||
<i class="layui-icon layui-icon-user"></i>
|
||||
<span>用户列表</span>
|
||||
</div>
|
||||
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;margin-bottom: 10px;">
|
||||
<div>
|
||||
<button class="layui-btn layui-bg-blue" onclick="add()">
|
||||
<i class="layui-icon layui-icon-add-1"></i>添加
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refresh()">
|
||||
<i class="layui-icon layui-icon-refresh"></i>刷新
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table id="userTable" lay-filter="userTable"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['table', 'layer'], function () {
|
||||
var table = layui.table;
|
||||
var layer = layui.layer;
|
||||
|
||||
table.render({
|
||||
elem: '#userTable',
|
||||
url: '{$config['admin_route']}yunzeradmin/frontuser', // 数据接口
|
||||
page: true,
|
||||
cols: [[
|
||||
{ field: 'uid', title: '用户ID', width: 80, align: 'center', fixed: 'left' },
|
||||
{
|
||||
field: 'avatar',
|
||||
title: '头像',
|
||||
width: 80,
|
||||
align: 'center',
|
||||
templet: function (d) {
|
||||
if (d.avatar && d.avatar !== '') {
|
||||
return '<img src="' + d.avatar + '" style="width:36px;height:36px;border-radius:50%;object-fit:cover;" />';
|
||||
} else {
|
||||
return '<span style="color:#aaa;">无</span>';
|
||||
}
|
||||
}
|
||||
},
|
||||
{ field: 'name', title: '真实姓名', width: 120 },
|
||||
{ field: 'name', title: '真实姓名', width: 120 },
|
||||
{ field: 'account', title: '账户', width: 200 },
|
||||
{ field: 'phone', title: '手机', width: 120 },
|
||||
{ field: 'qq', title: 'QQ', width: 130 },
|
||||
{
|
||||
field: 'wechat',
|
||||
title: '微信',
|
||||
width: 100,
|
||||
templet: function (d) {
|
||||
if (d.openid && d.openid !== '') {
|
||||
return '<span style="color: #52c41a;">已绑定</span>';
|
||||
} else {
|
||||
return '<span style="color: #aaa;">未绑定</span>';
|
||||
}
|
||||
}
|
||||
},
|
||||
{ field: 'group_id', title: '角色', width: 200 },
|
||||
{
|
||||
field: 'sex', title: '性别', width: 80, templet: function (d) {
|
||||
if (d.sex == 1) return '男';
|
||||
if (d.sex == 2) return '女';
|
||||
return '未选择';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
width: 100,
|
||||
templet: function (d) {
|
||||
if (d.status == 1) {
|
||||
return '<span style="color: #52c41a;">开启</span>';
|
||||
} else {
|
||||
return '<span style="color: #f5222d;">禁用</span>';
|
||||
}
|
||||
}
|
||||
},
|
||||
{ field: 'login_count', title: '登陆次数', width: 100 },
|
||||
{
|
||||
field: 'update_time',
|
||||
title: '登陆时间',
|
||||
width: 180,
|
||||
templet: function (d) {
|
||||
if (!d.update_time) return '';
|
||||
var t = d.update_time;
|
||||
// 如果是时间戳(数字),转为int
|
||||
if (/^\d+$/.test(t)) t = parseInt(t) * (t.toString().length == 10 ? 1000 : 1);
|
||||
var date = new Date(t);
|
||||
var Y = date.getFullYear();
|
||||
var M = ('0' + (date.getMonth() + 1)).slice(-2);
|
||||
var D = ('0' + date.getDate()).slice(-2);
|
||||
var h = ('0' + date.getHours()).slice(-2);
|
||||
var m = ('0' + date.getMinutes()).slice(-2);
|
||||
var s = ('0' + date.getSeconds()).slice(-2);
|
||||
return Y + '-' + M + '-' + D + ' ' + h + ':' + m + ':' + s;
|
||||
}
|
||||
},
|
||||
{ title: '操作', toolbar: '#operationBar', width: 160, fixed: 'right' }
|
||||
]]
|
||||
});
|
||||
|
||||
// 工具条事件
|
||||
table.on('tool(userTable)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
edit(data.uid);
|
||||
} else if (obj.event === 'del') {
|
||||
del(data.uid);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 添加
|
||||
function add() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '添加用户',
|
||||
shade: 0.3,
|
||||
area: ['450px', '550px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/frontuseradd"
|
||||
});
|
||||
}
|
||||
// 编辑
|
||||
function edit(uid) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '编辑用户',
|
||||
shade: 0.3,
|
||||
area: ['450px', '550px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/frontuseredit?uid=" + uid
|
||||
});
|
||||
}
|
||||
// 删除
|
||||
function del(uid) {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
btn: ['确定', '取消']
|
||||
}, function () {
|
||||
$.post("{$config['admin_route']}yunzeradmin/frontuserdel", { 'uid': uid }, function (res) {
|
||||
if (res.code > 0) {
|
||||
layer.alert(res.msg, { icon: 2 });
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
setTimeout(function () { window.location.reload(); }, 1000);
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
}
|
||||
//刷新列表
|
||||
function refresh() {
|
||||
window.location.reload();
|
||||
}
|
||||
</script>
|
||||
<script type="text/html" id="operationBar">
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">
|
||||
<i class="layui-icon layui-icon-edit"></i>编辑
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" lay-event="del">
|
||||
<i class="layui-icon layui-icon-delete"></i>删除
|
||||
</button>
|
||||
</script>
|
||||
<style>
|
||||
.layui-table-view .layui-table td,
|
||||
.layui-table-view .layui-table th {
|
||||
height: 60px !important;
|
||||
line-height: 60px !important;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.layui-table-cell{
|
||||
height: auto !important;
|
||||
}
|
||||
</style>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,84 @@
|
||||
{include file="public/header" /}
|
||||
<form class="layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账户</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="account" placeholder="账户请用邮箱">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">姓名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="name" placeholder="请输入真实姓名">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手机号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="phone" placeholder="请输入手机号">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">QQ号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="qq" placeholder="请输入QQ号">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="group_id">
|
||||
<option value=0></option>
|
||||
{volist name="group" id="vo"}
|
||||
<option value="{$vo.group_id}">{$vo.group_name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="password" placeholder="请输入密码">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="1" title="男" checked="">
|
||||
<input type="radio" name="sex" value="2" title="女">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="开启" checked="">
|
||||
<input type="radio" name="status" value="0" title="禁用">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button type="button" class="layui-btn" onclick="save()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer','form'],function(){
|
||||
form = layui.form;
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
// 保存管理员
|
||||
function save(){
|
||||
$.post("{$config['admin_route']}yunzeradmin/useradd",$('form').serialize(),function(res){
|
||||
if(res.code>0){
|
||||
layer.alert(res.msg,{icon:2});
|
||||
}else{
|
||||
layer.msg(res.msg);
|
||||
setTimeout(function(){parent.window.location.reload();},1000);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,76 @@
|
||||
{include file="public/header" /}
|
||||
<form class="layui-form">
|
||||
<input type="hidden" name="uid" value="{$lists.uid}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账户</label>
|
||||
<div class="layui-input-inline"><input type="text" class="layui-input" value="{$lists.account}" readonly></div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">姓 名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="name" placeholder="请输入真实姓名" value="{$lists.name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手机号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="phone" placeholder="请输入手机号" value="{$lists.phone}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">QQ号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="qq" placeholder="请输入QQ号" value="{$lists.qq}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="group_id">
|
||||
<option value=0></option>
|
||||
{volist name="group" id="vo"}
|
||||
<option value="{$vo.group_id}" {$vo.group_id == $lists.group_id ? 'selected' : ''}>{$vo.group_name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="1" title="男" {$lists.sex==1?'checked':''}>
|
||||
<input type="radio" name="sex" value="2" title="女" {$lists.sex==2?'checked':''}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="开启" {$lists.status==1?'checked':''}>
|
||||
<input type="radio" name="status" value="0" title="禁用" {$lists.status==0?'checked':''}>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" onclick="save()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer','form'],function(){
|
||||
form = layui.form;
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
// 保存管理员
|
||||
function save(){
|
||||
$.post("{$config['admin_route']}yunzeradmin/frontuseredit",$('form').serialize(),function(res){
|
||||
if(res.code>0){
|
||||
layer.alert(res.msg,{icon:2});
|
||||
}else{
|
||||
layer.msg(res.msg);
|
||||
setTimeout(function(){parent.window.location.reload();},1000);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,53 @@
|
||||
{include file="public/header" /}
|
||||
<form class="layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="group_name" placeholder="请输入角色名称">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="开启" checked="">
|
||||
<input type="radio" name="status" value="0" title="禁用">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-itme">
|
||||
<label class="layui-form-label">权限菜单</label>
|
||||
{volist name="menus" id="vo"}
|
||||
<hr>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="menu[{$vo.smid}]" lay-skin="primary" title="{$vo.label}">
|
||||
<hr>
|
||||
{volist name="vo.children" id="cvo"}
|
||||
<input type="checkbox" name="menu[{$cvo.smid}]" lay-skin="primary" title="{$cvo.label}">
|
||||
{/volist}
|
||||
</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-form-item" style="margin-top:10px;">
|
||||
<div class="layui-input-block">
|
||||
<button type="button" class="layui-btn" onclick="save()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer','form'],function(){
|
||||
var form = layui.form;
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
|
||||
function save(){
|
||||
$.post("{$config['admin_route']}yunzeradmin/groupadd",$('form').serialize(),function(res){
|
||||
if(res.code>0){
|
||||
layer.msg(res.msg,{'icon':2});
|
||||
}else{
|
||||
layer.msg(res.msg,{'icon':1});
|
||||
setTimeout(function(){parent.window.location.reload();},1000);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,54 @@
|
||||
{include file="public/header" /}
|
||||
<form class="layui-form">
|
||||
<input type="hidden" name="group_id" value="{$group.group_id}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" class="layui-input" name="group_name" placeholder="请输入角色名称" value="{$group.group_name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="开启" {$group.status==1?'checked':''}>
|
||||
<input type="radio" name="status" value="0" title="禁用" {$group.status==0?'checked':''}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-itme">
|
||||
<label class="layui-form-label">权限菜单</label>
|
||||
{volist name="menus" id="vo"}
|
||||
<hr>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="menu[{$vo.smid}]" lay-skin="primary" title="{$vo.label}" {:isset($group['rights']) && $group['rights'] && in_array($vo.smid,$group['rights'])?'checked':''}>
|
||||
<hr>
|
||||
{volist name="vo.children" id="cvo"}
|
||||
<input type="checkbox" name="menu[{$cvo.smid}]" lay-skin="primary" title="{$cvo.label}" {:isset($group['rights']) && $group['rights'] && in_array($cvo.smid,$group['rights'])?'checked':''}>
|
||||
{/volist}
|
||||
</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-form-item" style="margin-top:10px;">
|
||||
<div class="layui-input-block">
|
||||
<button type="button" class="layui-btn" onclick="save()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer','form'],function(){
|
||||
var form = layui.form;
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
|
||||
function save(){
|
||||
$.post("{$config['admin_route']}yunzeradmin/groupedit",$('form').serialize(),function(res){
|
||||
if(res.code>0){
|
||||
layer.msg(res.msg,{'icon':2});
|
||||
}else{
|
||||
layer.msg(res.msg,{'icon':1});
|
||||
setTimeout(function(){parent.window.location.reload();},1000);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,100 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<!-- 页面头部样式 -->
|
||||
<div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
|
||||
<div class="maintitle">
|
||||
<i class="layui-icon layui-icon-group"></i>
|
||||
<span>角色列表</span>
|
||||
</div>
|
||||
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;margin-bottom: 10px;">
|
||||
<div>
|
||||
<button class="layui-btn layui-bg-blue" onclick="add()">
|
||||
<i class="layui-icon layui-icon-add-1"></i>添加
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refresh()">
|
||||
<i class="layui-icon layui-icon-refresh"></i>刷新
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>角色名</th>
|
||||
<th>状态</th>
|
||||
<th>添加时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{volist name="group" id='vo'}
|
||||
<tr>
|
||||
<td>{$vo.group_name}</td>
|
||||
<td>{$vo.status==1?'开启':'<span style="color:red;">禁用</span>'}</td>
|
||||
<td>{:date('Y-m-d H:i:s',$vo.create_time)}</td>
|
||||
<td>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs"
|
||||
onclick="edit({$vo.group_id})">
|
||||
<i class="layui-icon layui-icon-edit"></i>编辑
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs"
|
||||
onclick="del({$vo.group_id})">
|
||||
<i class="layui-icon layui-icon-delete"></i>删除
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer'], function () {
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
// 添加
|
||||
function add() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '添加角色',
|
||||
shade: 0.3,
|
||||
area: ['450px', '550px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/groupadd"
|
||||
});
|
||||
}
|
||||
// 编辑
|
||||
function edit(group_id) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '编辑角色',
|
||||
shade: 0.3,
|
||||
area: ['450px', '550px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/groupedit?group_id=" + group_id
|
||||
});
|
||||
}
|
||||
// 删除
|
||||
function del(group_id) {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
btn: ['确定', '取消']
|
||||
}, function () {
|
||||
$.post("{$config['admin_route']}yunzeradmin/groupdel", { 'group_id': group_id }, function (res) {
|
||||
if (res.code > 0) {
|
||||
layer.alert(res.msg, { icon: 2 });
|
||||
} else {
|
||||
layer.msg(res.msg, { icon: 1 });
|
||||
setTimeout(function () { window.location.reload(); }, 1000);
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
}
|
||||
//刷新列表
|
||||
function refresh() {
|
||||
window.location.reload();
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,363 @@
|
||||
{include file="public/header" /}
|
||||
<div class="material-tabs">
|
||||
<div class="tabs-header">
|
||||
<div class="tab active" data-type="image">图片</div>
|
||||
<div class="tab" data-type="video">视频</div>
|
||||
<div class="tab" data-type="file">文件</div>
|
||||
</div>
|
||||
<div class="tabs-content">
|
||||
<!-- 图片Tab内容 -->
|
||||
<div class="tab-panel" id="tab-image" style="display:block;">
|
||||
<div class="material-center">
|
||||
<!-- 左侧分组树 -->
|
||||
<div class="sidebar">
|
||||
<ul class="group-list" id="groupList">
|
||||
<li class="active">全部</li>
|
||||
<!-- ... -->
|
||||
</ul>
|
||||
<div class="sidebar-header">
|
||||
<button class="layui-btn layui-btn-normal" onclick="addGroup()">添加分组</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 右侧内容 -->
|
||||
<div class="main-content">
|
||||
<div class="toolbar">
|
||||
<div class="material-actions">
|
||||
<button class="layui-btn layui-btn-normal" id="uploadBtn">上传</button>
|
||||
<button class="layui-btn layui-btn-danger" id="batchDeleteBtn">批量删除</button>
|
||||
</div>
|
||||
<button class="layui-btn" onclick="moveMaterial()">移动</button>
|
||||
<label class="select-all">
|
||||
<input type="checkbox" id="selectAll" /> 全选
|
||||
</label>
|
||||
</div>
|
||||
<div class="image-grid" id="imageGrid">
|
||||
<div class="image-item">
|
||||
<input type="checkbox" class="img-checkbox" />
|
||||
<img src="https://placekitten.com/120/120" alt="示例图片" />
|
||||
<div class="img-name">示例图片.jpg</div>
|
||||
<div class="img-actions">
|
||||
<button class="layui-btn layui-btn-xs" onclick="renameImg(this)">重命名</button>
|
||||
<button class="layui-btn layui-btn-xs layui-btn-primary" onclick="viewImg(this)">查看</button>
|
||||
<button class="layui-btn layui-btn-xs layui-btn-warm" onclick="copyUrl(this)">地址</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ... -->
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<button class="layui-btn layui-btn-xs">上一页</button>
|
||||
<span>1 / 10</span>
|
||||
<button class="layui-btn layui-btn-xs">下一页</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 视频Tab内容 -->
|
||||
<div class="tab-panel" id="tab-video" style="display:none;">
|
||||
<div class="material-center">
|
||||
<div style="padding:40px;text-align:center;color:#bbb;">这里是视频管理内容</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 文件Tab内容 -->
|
||||
<div class="tab-panel" id="tab-file" style="display:none;">
|
||||
<div class="material-center">
|
||||
<div style="padding:40px;text-align:center;color:#bbb;">这里是文件管理内容</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Tab切换
|
||||
document.querySelectorAll('.material-tabs .tab').forEach(function (tab) {
|
||||
tab.onclick = function () {
|
||||
document.querySelectorAll('.material-tabs .tab').forEach(t => t.classList.remove('active'));
|
||||
tab.classList.add('active');
|
||||
var type = tab.getAttribute('data-type');
|
||||
document.querySelectorAll('.tab-panel').forEach(panel => panel.style.display = 'none');
|
||||
document.getElementById('tab-' + type).style.display = 'block';
|
||||
}
|
||||
});
|
||||
|
||||
// 分组高亮切换
|
||||
document.getElementById('groupList').addEventListener('click', function (e) {
|
||||
if (e.target.tagName === 'LI' || e.target.closest('li')) {
|
||||
document.querySelectorAll('#groupList li').forEach(li => li.classList.remove('active'));
|
||||
(e.target.tagName === 'LI' ? e.target : e.target.closest('li')).classList.add('active');
|
||||
// TODO: 根据分组加载图片
|
||||
}
|
||||
});
|
||||
|
||||
// 其它功能函数(示例)
|
||||
function addGroup() {
|
||||
alert('添加分组功能待实现');
|
||||
}
|
||||
function uploadMaterial() {
|
||||
alert('上传功能待实现');
|
||||
}
|
||||
function batchDelete() {
|
||||
alert('批量删除功能待实现');
|
||||
}
|
||||
function moveMaterial() {
|
||||
alert('移动功能待实现');
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.material-tabs {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
background: #f6f7fb;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.tabs-header {
|
||||
display: flex;
|
||||
border-bottom: 2px solid #e6e6e6;
|
||||
background: #fff;
|
||||
padding-left: 32px;
|
||||
height: 52px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.tab {
|
||||
padding: 0 32px;
|
||||
height: 52px;
|
||||
line-height: 52px;
|
||||
font-size: 16px;
|
||||
color: #666;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
|
||||
.tab.active {
|
||||
color: #409eff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.tab.active::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 16px;
|
||||
right: 16px;
|
||||
bottom: 0;
|
||||
height: 3px;
|
||||
background: #409eff;
|
||||
border-radius: 2px 2px 0 0;
|
||||
}
|
||||
|
||||
.tabs-content {
|
||||
flex: 1;
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
background: #f6f7fb;
|
||||
}
|
||||
|
||||
.tab-panel {
|
||||
width: 100%;
|
||||
/* height: 100%; */
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tab-panel:target,
|
||||
.tab-panel.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.material-center {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
background: #fafbfc;
|
||||
font-family: "Microsoft YaHei", Arial, sans-serif;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
width: 220px;
|
||||
background: #fff;
|
||||
border-right: 1px solid #e6e6e6;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.sidebar-header {
|
||||
display: flex;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
justify-content: center;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
.add-group-btn {
|
||||
background: #409eff;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
font-size: 18px;
|
||||
cursor: pointer;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.add-group-btn:hover {
|
||||
background: #66b1ff;
|
||||
}
|
||||
|
||||
.group-list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 10px 0 0 0;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.group-list li {
|
||||
padding: 10px 24px;
|
||||
color: #444;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-radius: 4px 0 0 4px;
|
||||
transition: background 0.2s, color 0.2s;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.group-list li .iconfont {
|
||||
font-size: 16px;
|
||||
margin-right: 8px;
|
||||
color: #b2b2b2;
|
||||
}
|
||||
|
||||
.group-list li.active,
|
||||
.group-list li:hover {
|
||||
background: #f2f6fc;
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
.main-content {
|
||||
flex: 1;
|
||||
padding: 32px 36px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.toolbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.select-all {
|
||||
margin-left: auto;
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.image-grid {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 22px;
|
||||
min-height: 320px;
|
||||
}
|
||||
|
||||
.image-item {
|
||||
width: 140px;
|
||||
background: #fff;
|
||||
border: 1px solid #eaeaea;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 14px 8px 10px 8px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
transition: box-shadow 0.2s, border 0.2s;
|
||||
}
|
||||
|
||||
.image-item:hover {
|
||||
border: 1px solid #409eff;
|
||||
box-shadow: 0 4px 16px rgba(64, 158, 255, 0.10);
|
||||
}
|
||||
|
||||
.image-item img {
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
object-fit: cover;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 8px;
|
||||
background: #f5f7fa;
|
||||
border: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.img-name {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
text-align: center;
|
||||
margin-bottom: 6px;
|
||||
word-break: break-all;
|
||||
height: 32px;
|
||||
line-height: 16px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.img-checkbox {
|
||||
position: absolute;
|
||||
top: 12px;
|
||||
left: 12px;
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
.img-actions {
|
||||
display: none;
|
||||
margin-top: 6px;
|
||||
text-align: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.image-item.active .img-actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.img-actions .layui-btn-xs {
|
||||
margin: 0 2px;
|
||||
font-size: 12px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
margin-top: 28px;
|
||||
text-align: center;
|
||||
font-size: 15px;
|
||||
color: #888;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
.main-content {
|
||||
padding: 12px 4px;
|
||||
}
|
||||
|
||||
.image-item {
|
||||
width: 100px;
|
||||
padding: 8px 4px 8px 4px;
|
||||
}
|
||||
|
||||
.image-item img {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,29 @@
|
||||
{include file="public/header" /}
|
||||
<div style="padding: 20px;">
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>标题</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($data as $item): ?>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="javascript:;" onclick="selectThis('<?php echo addslashes($item['title']); ?>', '<?php echo isset($item['url']) ? addslashes($item['url']) : ''; ?>')">
|
||||
<?php echo htmlspecialchars($item['title']); ?>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<script>
|
||||
function selectThis(title, url) {
|
||||
if (window.parent && window.parent.setPushContent) {
|
||||
window.parent.setPushContent(title, url || '');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,84 @@
|
||||
{include file="public/header" /}
|
||||
<form class="layui-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账户</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="account" placeholder="账户请用邮箱">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">姓名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="name" placeholder="请输入真实姓名">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手机号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="phone" placeholder="请输入手机号">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">QQ号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="qq" placeholder="请输入QQ号">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="group_id">
|
||||
<option value=0></option>
|
||||
{volist name="group" id="vo"}
|
||||
<option value="{$vo.group_id}">{$vo.group_name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">密码</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="password" placeholder="请输入密码">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="1" title="男" checked="">
|
||||
<input type="radio" name="sex" value="2" title="女">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="开启" checked="">
|
||||
<input type="radio" name="status" value="0" title="禁用">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button type="button" class="layui-btn" onclick="save()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer','form'],function(){
|
||||
form = layui.form;
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
// 保存管理员
|
||||
function save(){
|
||||
$.post("{$config['admin_route']}yunzeradmin/useradd",$('form').serialize(),function(res){
|
||||
if(res.code>0){
|
||||
layer.alert(res.msg,{icon:2});
|
||||
}else{
|
||||
layer.msg(res.msg);
|
||||
setTimeout(function(){parent.window.location.reload();},1000);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,76 @@
|
||||
{include file="public/header" /}
|
||||
<form class="layui-form">
|
||||
<input type="hidden" name="uid" value="{$lists.uid}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">账户</label>
|
||||
<div class="layui-input-inline"><input type="text" class="layui-input" value="{$lists.account}" readonly></div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">姓 名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="name" placeholder="请输入真实姓名" value="{$lists.name}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手机号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="phone" placeholder="请输入手机号" value="{$lists.phone}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">QQ号</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="qq" placeholder="请输入QQ号" value="{$lists.qq}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="group_id">
|
||||
<option value=0></option>
|
||||
{volist name="group" id="vo"}
|
||||
<option value="{$vo.group_id}" {$vo.group_id == $lists.group_id ? 'selected' : ''}>{$vo.group_name}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">性别</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sex" value="1" title="男" {$lists.sex==1?'checked':''}>
|
||||
<input type="radio" name="sex" value="2" title="女" {$lists.sex==2?'checked':''}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="status" value="1" title="开启" {$lists.status==1?'checked':''}>
|
||||
<input type="radio" name="status" value="0" title="禁用" {$lists.status==0?'checked':''}>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" onclick="save()">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer','form'],function(){
|
||||
form = layui.form;
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
// 保存管理员
|
||||
function save(){
|
||||
$.post("{$config['admin_route']}yunzeradmin/useredit",$('form').serialize(),function(res){
|
||||
if(res.code>0){
|
||||
layer.alert(res.msg,{icon:2});
|
||||
}else{
|
||||
layer.msg(res.msg);
|
||||
setTimeout(function(){parent.window.location.reload();},1000);
|
||||
}
|
||||
},'json');
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
@@ -0,0 +1,116 @@
|
||||
{include file="public/header" /}
|
||||
<div class="config-container">
|
||||
<!-- 页面头部样式 -->
|
||||
<div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
|
||||
<div class="maintitle">
|
||||
<i class="layui-icon layui-icon-user"></i>
|
||||
<span>用户列表</span>
|
||||
</div>
|
||||
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;margin-bottom: 10px;">
|
||||
<div>
|
||||
<button class="layui-btn layui-bg-blue" onclick="add()">
|
||||
<i class="layui-icon layui-icon-add-1"></i>添加
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refresh()">
|
||||
<i class="layui-icon layui-icon-refresh"></i>刷新
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="layui-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>真实姓名</th>
|
||||
<th>账户</th>
|
||||
<th>手机</th>
|
||||
<th>QQ</th>
|
||||
<th>角色</th>
|
||||
<th>性别</th>
|
||||
<th>状态</th>
|
||||
<th>登陆次数</th>
|
||||
<th>登陆时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{volist name="lists" id='vo'}
|
||||
<tr>
|
||||
<td>{$vo.name}</td>
|
||||
<td>{$vo.account}</td>
|
||||
<td>{$vo.phone}</td>
|
||||
<td>{$vo.qq}</td>
|
||||
<td>{:isset($group[$vo.group_id])?$group[$vo.group_id]['group_name']:''}</td>
|
||||
<td>
|
||||
{if $vo['sex']==1}
|
||||
<span style="color:red;">男</span>
|
||||
{elseif $vo['sex'] == 2 /}
|
||||
<span style="color:green;">女</span>
|
||||
{else /}
|
||||
未知
|
||||
{/if}
|
||||
</td>
|
||||
<td>{$vo.status==1?'开启':'<span style="color:red;">禁用</span>'}</td>
|
||||
<td>{$vo.login_count}</td>
|
||||
<td>{:date('Y-m-d H:i:s',$vo.update_time)}</td>
|
||||
<td>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="edit({$vo.uid})">
|
||||
<i class="layui-icon layui-icon-edit"></i>编辑
|
||||
</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="del({$vo.uid})">
|
||||
<i class="layui-icon layui-icon-delete"></i>删除
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
layui.use(['layer'], function () {
|
||||
layer = layui.layer;
|
||||
$ = layui.jquery;
|
||||
});
|
||||
// 添加
|
||||
function add() {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '添加管理员',
|
||||
shade: 0.3,
|
||||
area: ['450px', '550px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/useradd"
|
||||
});
|
||||
}
|
||||
// 编辑
|
||||
function edit(uid) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '编辑管理员',
|
||||
shade: 0.3,
|
||||
area: ['450px', '550px'],
|
||||
content: "{$config['admin_route']}yunzeradmin/useredit?uid=" + uid
|
||||
});
|
||||
}
|
||||
// 删除
|
||||
function del(uid) {
|
||||
layer.confirm('确定要删除吗?', {
|
||||
icon: 3,
|
||||
btn: ['确定', '取消']
|
||||
}, function () {
|
||||
$.post("{$config['admin_route']}yunzeradmin/userdel", { 'uid': uid }, function (res) {
|
||||
if (res.code > 0) {
|
||||
layer.alert(res.msg, { icon: 2 });
|
||||
} else {
|
||||
layer.msg(res.msg);
|
||||
setTimeout(function () { window.location.reload(); }, 1000);
|
||||
}
|
||||
}, 'json');
|
||||
});
|
||||
}
|
||||
//刷新列表
|
||||
function refresh() {
|
||||
window.location.reload();
|
||||
}
|
||||
</script>
|
||||
{include file="public/tail" /}
|
||||
Reference in New Issue
Block a user