497 lines
18 KiB
PHP
497 lines
18 KiB
PHP
<?php /*a:2:{s:57:"E:\Demo\PHP\yunzer\app\admin\view\article\articlecate.php";i:1747325751;s:51:"E:\Demo\PHP\yunzer\app\admin\view\public\header.php";i:1746890051;}*/ ?>
|
||
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<title><?php echo htmlentities((string) $config['admin_name']); ?></title>
|
||
<meta name="renderer" content="webkit">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||
<link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css" media="all"/>
|
||
<link rel="stylesheet" type="text/css" href="/static/css/moban.css" media="all"/>
|
||
<link rel="stylesheet" type="text/css" href="/static/css/wangeditor.css" media="all"/>
|
||
<style type="text/css">
|
||
.header span{background:#009688;margin-left:30px;padding:10px;color:#ffffff;}
|
||
.header div{border-bottom:solid 2px #009688;margin-top: 8px;}
|
||
.header button{float:right;margin-top:-5px;}
|
||
.pagination {
|
||
display: inline-block;
|
||
padding-left: 0;
|
||
margin: 20px 0;
|
||
border-radius: 4px;
|
||
}
|
||
.pagination > li {
|
||
display: inline;
|
||
}
|
||
.pagination > li > a,
|
||
.pagination > li > span {
|
||
position: relative;
|
||
float: left;
|
||
padding: 6px 12px;
|
||
margin-left: -1px;
|
||
line-height: 1.42857143;
|
||
color: #337ab7;
|
||
text-decoration: none;
|
||
background-color: #fff;
|
||
border: 1px solid #ddd;
|
||
}
|
||
.pagination > li:first-child > a,
|
||
.pagination > li:first-child > span {
|
||
margin-left: 0;
|
||
border-top-left-radius: 4px;
|
||
border-bottom-left-radius: 4px;
|
||
}
|
||
.pagination > li:last-child > a,
|
||
.pagination > li:last-child > span {
|
||
border-top-right-radius: 4px;
|
||
border-bottom-right-radius: 4px;
|
||
}
|
||
.pagination > li > a:hover,
|
||
.pagination > li > span:hover,
|
||
.pagination > li > a:focus,
|
||
.pagination > li > span:focus {
|
||
z-index: 2;
|
||
color: #23527c;
|
||
background-color: #eee;
|
||
border-color: #ddd;
|
||
}
|
||
.pagination > .active > a,
|
||
.pagination > .active > span,
|
||
.pagination > .active > a:hover,
|
||
.pagination > .active > span:hover,
|
||
.pagination > .active > a:focus,
|
||
.pagination > .active > span:focus {
|
||
z-index: 3;
|
||
color: #fff;
|
||
cursor: default;
|
||
background-color: #337ab7;
|
||
border-color: #337ab7;
|
||
}
|
||
.pagination > .disabled > span,
|
||
.pagination > .disabled > span:hover,
|
||
.pagination > .disabled > span:focus,
|
||
.pagination > .disabled > a,
|
||
.pagination > .disabled > a:hover,
|
||
.pagination > .disabled > a:focus {
|
||
color: #777;
|
||
cursor: not-allowed;
|
||
background-color: #fff;
|
||
border-color: #ddd;
|
||
}
|
||
.close-img { background: url(/static/images/close_img.png); background-size: 20px 20px; width:20px; height: 20px; position: absolute; right: 5px; top: 5px; z-index: 2;}
|
||
</style>
|
||
<script type="text/javascript" src="/static/layui/layui.js"></script>
|
||
<script type="text/javascript">
|
||
layui.use(['layer','form','table','laydate','element','upload'],function(){
|
||
layer = layui.layer; // layui 弹框
|
||
form = layui.form; // layui form表单
|
||
table = layui.table; // layui 表格
|
||
laydate = layui.laydate; // layui 时间框
|
||
element = layui.element; // layui element
|
||
upload = layui.upload; // layui 上传
|
||
$ = layui.jquery; // layui jquery
|
||
})
|
||
</script>
|
||
</head>
|
||
<body style="padding:10px; box-sizing: border-box;">
|
||
<div class="config-container">
|
||
<div class="config-header" style="display:flex;justify-content: space-between;">
|
||
<div style="display: flex; align-items: center;">
|
||
<span>文章分类</span>
|
||
</div>
|
||
<div>
|
||
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm" onclick="add()">
|
||
<i class="layui-icon layui-icon-add-1"></i>添加
|
||
</button>
|
||
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" onclick="refresh()">
|
||
<i class="layui-icon layui-icon-refresh"></i>刷新
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="layui-row" style="margin-top: 15px;">
|
||
<div class="layui-col-md6">
|
||
<div class="layui-card">
|
||
<div class="layui-card-header">分类列表</div>
|
||
<div class="layui-card-body">
|
||
<div id="categoryList"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="layui-col-md4"">
|
||
<div class="layui-card">
|
||
<div class="layui-card-header">分类信息</div>
|
||
<div class="layui-card-body">
|
||
<div id="defaultTip" style="text-align: center; padding: 50px 0; color: #999;">
|
||
<i class="layui-icon layui-icon-face-surprised" style="font-size: 30px;"></i>
|
||
<p style="margin-top: 10px;">请选择左侧分类</p>
|
||
</div>
|
||
<form class="layui-form" lay-filter="categoryForm" style="display: none;">
|
||
<input type="hidden" name="id" id="categoryId">
|
||
<div class="layui-form-item">
|
||
<label class="layui-form-label">分类名称</label>
|
||
<div class="layui-input-block">
|
||
<input type="text" name="name" 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">
|
||
<select name="cid" lay-verify="required">
|
||
<option value="0">顶级分类</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="layui-form-item">
|
||
<label class="layui-form-label">封面图片</label>
|
||
<div class="layui-input-block">
|
||
<input type="text" name="image" placeholder="请输入图片地址" autocomplete="off"
|
||
class="layui-input" id="imageInput">
|
||
<div class="layui-upload" style="margin-top: 20px;">
|
||
<div>
|
||
<button type="button" class="layui-btn" id="uploadImage">上传图片</button>
|
||
<span style="color: #999; margin-left: 10px;">建议尺寸:250px*140px</span>
|
||
</div>
|
||
<div class="layui-upload-list">
|
||
<img class="layui-upload-img" id="imagePreview" style="margin-top: 10px;">
|
||
<i class="layui-icon layui-icon-close delete-image"
|
||
style="display: none; position: absolute; top: 0; right: 0; cursor: pointer; color: #FF5722;"></i>
|
||
</div>
|
||
</div>
|
||
</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">
|
||
</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="saveCategory">保存</button>
|
||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||
<button type="button" class="layui-btn layui-btn-danger" id="deleteBtn"
|
||
style="display: none;">删除</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script type="text/javascript">
|
||
layui.use(['layer', 'form', 'util', 'upload'], function () {
|
||
var layer = layui.layer;
|
||
var $ = layui.jquery;
|
||
var form = layui.form;
|
||
var util = layui.util;
|
||
var upload = layui.upload;
|
||
|
||
// 初始化分类列表
|
||
function initCategoryList() {
|
||
$.ajax({
|
||
url: '/admin/article/articlecate',
|
||
type: 'POST',
|
||
success: function (res) {
|
||
if (res.code === 0) {
|
||
var html = '';
|
||
res.data.forEach(function (item) {
|
||
html += renderCategory(item);
|
||
});
|
||
$('#categoryList').html(html);
|
||
bindEvents();
|
||
} else {
|
||
layer.msg('获取分类数据失败', { icon: 2 });
|
||
}
|
||
},
|
||
error: function () {
|
||
layer.msg('请求失败,请重试', { icon: 2 });
|
||
}
|
||
});
|
||
}
|
||
|
||
// 渲染分类
|
||
function renderCategory(category, level = 0) {
|
||
var html = '<div class="category-item" data-id="' + category.id + '">';
|
||
html += '<div class="category-header">';
|
||
html += '<span class="category-name">' + category.title + '</span>';
|
||
html += '<div class="category-actions">';
|
||
// 只有一级分类才显示添加按钮
|
||
if (level === 0) {
|
||
html += '<i class="layui-icon layui-icon-add-1 add-child" title="添加子分类"></i>';
|
||
}
|
||
html += '</div>';
|
||
html += '</div>';
|
||
|
||
if (category.children && category.children.length > 0) {
|
||
html += '<div class="category-children">';
|
||
category.children.forEach(function (child) {
|
||
html += renderCategory(child, level + 1);
|
||
});
|
||
html += '</div>';
|
||
}
|
||
|
||
html += '</div>';
|
||
return html;
|
||
}
|
||
|
||
// 绑定事件
|
||
function bindEvents() {
|
||
// 点击分类
|
||
$('.category-name').off('click').on('click', function () {
|
||
var id = $(this).closest('.category-item').data('id');
|
||
loadCategoryInfo(id);
|
||
});
|
||
|
||
// 点击添加子分类
|
||
$('.add-child').off('click').on('click', function (e) {
|
||
e.stopPropagation();
|
||
var id = $(this).closest('.category-item').data('id');
|
||
$('#categoryId').val('');
|
||
$('select[name="cid"]').val(id);
|
||
$('#deleteBtn').hide();
|
||
form.render();
|
||
});
|
||
}
|
||
|
||
// 加载分类信息
|
||
function loadCategoryInfo(id) {
|
||
$('#defaultTip').hide();
|
||
$('form.layui-form').show();
|
||
|
||
$.get('/admin/article/cateedit?id=' + id, function (res) {
|
||
if (res.code === 0) {
|
||
// 更新父级分类选项
|
||
var $select = $('select[name="cid"]');
|
||
$select.empty();
|
||
$select.append('<option value="0">顶级分类</option>');
|
||
res.data.parentOptions.forEach(function (item) {
|
||
$select.append('<option value="' + item.id + '">' + item.name + '</option>');
|
||
});
|
||
|
||
// 填充表单数据
|
||
form.val('categoryForm', res.data.info);
|
||
|
||
// 显示图片预览
|
||
if (res.data.info.image) {
|
||
$('#imagePreview').attr('src', res.data.info.image);
|
||
$('.delete-image').show();
|
||
} else {
|
||
$('#imagePreview').attr('src', '');
|
||
$('.delete-image').hide();
|
||
}
|
||
|
||
// 显示删除按钮
|
||
$('#deleteBtn').show();
|
||
|
||
// 重新渲染表单
|
||
form.render();
|
||
}
|
||
});
|
||
}
|
||
|
||
// 初始化
|
||
initCategoryList();
|
||
|
||
// 默认显示提示信息
|
||
$('#defaultTip').show();
|
||
$('form.layui-form').hide();
|
||
|
||
// 监听表单提交
|
||
form.on('submit(saveCategory)', function (data) {
|
||
var url = data.field.id ? '/admin/article/cateedit' : '/admin/article/cateadd';
|
||
$.post(url, data.field, function (res) {
|
||
if (res.code === 0) {
|
||
layer.msg(res.msg, { icon: 1 });
|
||
initCategoryList();
|
||
} else {
|
||
layer.msg(res.msg, { icon: 2 });
|
||
}
|
||
});
|
||
return false;
|
||
});
|
||
|
||
// 监听删除按钮点击
|
||
$('#deleteBtn').on('click', function () {
|
||
var id = $('input[name="id"]').val();
|
||
if (!id) return;
|
||
|
||
layer.confirm('确定要删除该分类吗?', {
|
||
btn: ['确定', '取消']
|
||
}, function () {
|
||
$.post('/admin/article/catedel', { id: id }, function (res) {
|
||
if (res.code == 0) {
|
||
layer.msg(res.msg, { icon: 1 });
|
||
initCategoryList();
|
||
// 重置表单
|
||
form.val('categoryForm', {
|
||
id: '',
|
||
name: '',
|
||
cid: '0',
|
||
image: '',
|
||
sort: 0,
|
||
status: 1
|
||
});
|
||
$('#imagePreview').attr('src', '');
|
||
$('#deleteBtn').hide();
|
||
form.render();
|
||
} else {
|
||
layer.msg(res.msg, { icon: 2 });
|
||
}
|
||
});
|
||
});
|
||
});
|
||
|
||
// 图片上传
|
||
upload.render({
|
||
elem: '#uploadImage',
|
||
url: '/admin/upload/image', // 替换为实际的上传接口
|
||
accept: 'images',
|
||
acceptMime: 'image/*',
|
||
done: function (res) {
|
||
if (res.code === 0) {
|
||
$('#imageInput').val(res.data.url);
|
||
$('#imagePreview').attr('src', res.data.url);
|
||
layer.msg('上传成功');
|
||
} else {
|
||
layer.msg('上传失败');
|
||
}
|
||
}
|
||
});
|
||
|
||
// 监听图片输入框变化
|
||
$('#imageInput').on('input', function () {
|
||
var url = $(this).val();
|
||
if (url) {
|
||
$('#imagePreview').attr('src', url);
|
||
$('.delete-image').show();
|
||
} else {
|
||
$('#imagePreview').attr('src', '');
|
||
$('.delete-image').hide();
|
||
}
|
||
});
|
||
|
||
// 监听图片删除按钮点击
|
||
$(document).on('click', '.delete-image', function () {
|
||
$('#imageInput').val('');
|
||
$('#imagePreview').attr('src', '');
|
||
$(this).hide();
|
||
});
|
||
});
|
||
|
||
function add() {
|
||
$('#defaultTip').hide();
|
||
$('form.layui-form').show();
|
||
|
||
// 重置表单
|
||
layui.form.val('categoryForm', {
|
||
id: '',
|
||
name: '',
|
||
cid: '0',
|
||
image: '',
|
||
sort: 0,
|
||
status: 1
|
||
});
|
||
$('#imagePreview').attr('src', '');
|
||
$('.delete-image').hide();
|
||
$('#deleteBtn').hide();
|
||
layui.form.render();
|
||
}
|
||
|
||
function refresh() {
|
||
initCategoryList();
|
||
}
|
||
</script>
|
||
|
||
<style>
|
||
.category-item {
|
||
margin: 5px 0;
|
||
}
|
||
|
||
.category-header {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
padding: 8px 10px;
|
||
background-color: #f8f8f8;
|
||
border-radius: 2px;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.category-header:hover {
|
||
background-color: #f2f2f2;
|
||
}
|
||
|
||
.category-name {
|
||
flex: 1;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.category-actions {
|
||
display: none;
|
||
}
|
||
|
||
.category-header:hover .category-actions {
|
||
display: block;
|
||
}
|
||
|
||
.category-children {
|
||
margin-left: 20px;
|
||
padding-left: 10px;
|
||
border-left: 1px solid #e6e6e6;
|
||
}
|
||
|
||
.add-child {
|
||
color: #1E9FFF;
|
||
font-size: 14px;
|
||
cursor: pointer;
|
||
margin-left: 10px;
|
||
}
|
||
|
||
.add-child:hover {
|
||
color: #0C7CD5;
|
||
}
|
||
|
||
.layui-upload-list {
|
||
margin-top: 10px;
|
||
position: relative;
|
||
display: inline-block;
|
||
}
|
||
|
||
.delete-image {
|
||
position: absolute;
|
||
top: 0;
|
||
right: 0;
|
||
cursor: pointer;
|
||
color: #FF5722;
|
||
font-size: 20px;
|
||
background: rgba(255, 255, 255, 0.8);
|
||
border-radius: 50%;
|
||
padding: 2px;
|
||
}
|
||
|
||
.delete-image:hover {
|
||
color: #FF0000;
|
||
}
|
||
|
||
.layui-card {
|
||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
|
||
}
|
||
|
||
.layui-col-md4{
|
||
width: 40%;
|
||
}
|
||
|
||
.layui-col-md6{
|
||
width: 60%;
|
||
}
|
||
</style>
|