优化后端

This commit is contained in:
李志强 2025-05-16 13:04:17 +08:00
parent 4f8f621c2c
commit 9df71d0faf
19 changed files with 1835 additions and 694 deletions

View File

@ -16,12 +16,15 @@ class Article extends Base
if (Request::isPost()) { if (Request::isPost()) {
$category = input('post.category'); $category = input('post.category');
$page = input('post.page', 1); $page = input('post.page', 1);
$limit = input('post.limit', 20); $limit = input('post.limit', 10);
$title = input('post.title');
$author = input('post.author');
$query = Db::table('yz_article') $query = Db::table('yz_article')
->where('delete_time', null) ->where('delete_time', null)
->where('status', '<>', 3); ->where('status', '<>', 3);
// 分类筛选
if (!empty($category)) { if (!empty($category)) {
// 先获取分类ID // 先获取分类ID
$cateInfo = Db::table('yz_article_category') $cateInfo = Db::table('yz_article_category')
@ -35,6 +38,16 @@ class Article extends Base
} }
} }
// 标题搜索
if (!empty($title)) {
$query = $query->where('title', 'like', '%'.$title.'%');
}
// 作者搜索
if (!empty($author)) {
$query = $query->where('author', 'like', '%'.$author.'%');
}
// 获取总记录数 // 获取总记录数
$count = $query->count(); $count = $query->count();

View File

@ -14,23 +14,28 @@ use app\admin\model\YzAdminConfig;
use think\exception\HttpResponseException; use think\exception\HttpResponseException;
use think\facade\Request; use think\facade\Request;
use think\facade\Route; use think\facade\Route;
use think\App;
class Base{ class Base
{
protected $app;
protected $request;
public $adminId = null; public $adminId = null;
public $config = []; public $config = [];
public $aUser = []; public $aUser = [];
public function __construct(){ public function __construct()
{
date_default_timezone_set('PRC'); date_default_timezone_set('PRC');
# 获取配置 # 获取配置
$YzAdminConfig = new YzAdminConfig(); $YzAdminConfig = new YzAdminConfig();
$this->config = $YzAdminConfig->getAll(); $this->config = $YzAdminConfig->getAll();
# 获取账户,账户判断 # 获取账户,账户判断
$this->adminId = Cookie::get('admin_id'); $this->adminId = Cookie::get('admin_id');
if(empty($this->adminId)){ if (empty($this->adminId)) {
header('Location:'.$this->config['admin_route'].'Login/index'); header('Location:' . $this->config['admin_route'] . 'Login/index');
exit; exit;
} }
$this->aUser = Db::table('yz_admin_user')->where('uid',$this->adminId)->find(); $this->aUser = Db::table('yz_admin_user')->where('uid', $this->adminId)->find();
if (empty($this->aUser)) { if (empty($this->aUser)) {
Cookie::delete('admin_id'); Cookie::delete('admin_id');
@ -41,14 +46,14 @@ class Base{
$this->error('管理员已被禁用'); $this->error('管理员已被禁用');
} }
# 获取用户组权限 # 获取用户组权限
$group = Db::table('yz_admin_user_group')->where(['group_id'=>$this->aUser['group_id']])->find(); $group = Db::table('yz_admin_user_group')->where(['group_id' => $this->aUser['group_id']])->find();
if(empty($group)){ if (empty($group)) {
$this->error('对不起,您没有权限'); $this->error('对不起,您没有权限');
} }
# 获取当前链接,查询是否有权限 # 获取当前链接,查询是否有权限
$controller = request()->controller(); $controller = request()->controller();
$action = request()->action(); $action = request()->action();
$key = $controller.'/'.$action; $key = $controller . '/' . $action;
View::assign([ View::assign([
'aUser' => $this->aUser, 'aUser' => $this->aUser,
'config' => $this->config 'config' => $this->config
@ -57,78 +62,103 @@ class Base{
/** /**
* 返回json对象 * 返回json对象
*/ */
protected function returnCode($code,$data=[],$count=10){ protected function returnCode($code, $data = [], $count = 10)
{
header('Content-type:application/json'); header('Content-type:application/json');
if($code == 0){ if ($code == 0) {
$arr = array( $arr = array(
'code'=>$code, 'code' => $code,
'msg'=>'操作成功', 'msg' => '操作成功',
'count'=> $count, 'count' => $count,
'data' => $data 'data' => $data
); );
}else if($code >= 1 && $code <= 100){ } else if ($code >= 1 && $code <= 100) {
$arr = array( $arr = array(
'code' => $code, 'code' => $code,
'msg' => $data 'msg' => $data
); );
}else{ } else {
$appapi = new AppApi(); $appapi = new AppApi();
$arr = array( $arr = array(
'code'=>$code, 'code' => $code,
'msg'=>$appapi::errorTip($code) 'msg' => $appapi::errorTip($code)
); );
} }
echo json_encode($arr); echo json_encode($arr);
if($code != 0){ if ($code != 0) {
exit; exit;
} }
} }
/** /**
* 操作成功跳转的快捷方法 * 操作成功跳转的快捷方法
* @access protected * @access protected
* @param mixed $msg 提示信息 * @param mixed $msg 提示信息
* @return void * @return void
*/ */
protected function success($msg = '') protected function success($msg = '')
{ {
$result = [ $result = [
'code' => 1, 'code' => 1,
'msg' => $msg 'msg' => $msg
]; ];
$type = $this->getResponseType(); $type = $this->getResponseType();
if ($type == 'html'){ if ($type == 'html') {
$response = view(Config::get('app.dispatch_success_tmpl'), $result); $response = view(Config::get('app.dispatch_success_tmpl'), $result);
} else if ($type == 'json') { } else if ($type == 'json') {
$response = json($result); $response = json($result);
} }
throw new HttpResponseException($response); throw new HttpResponseException($response);
} }
/** /**
* 操作错误跳转的快捷方法 * 操作错误跳转的快捷方法
* @access protected * @access protected
* @param mixed $msg 提示信息 * @param mixed $msg 提示信息
* @return void * @return void
*/ */
protected function error($msg = '') protected function error($msg = '')
{ {
$result = [ $result = [
'code' => 0, 'code' => 0,
'msg' => $msg 'msg' => $msg
]; ];
$response = view(Config::get('app.dispatch_error_tmpl'), $result); $response = view(Config::get('app.dispatch_error_tmpl'), $result);
throw new HttpResponseException($response); throw new HttpResponseException($response);
} }
/** /**
* 获取当前的response 输出类型 * 获取当前的response 输出类型
* @access protected * @access protected
* @return string * @return string
*/ */
protected function getResponseType() protected function getResponseType()
{ {
return Request::isJson() || Request::isAjax() ? 'json' : 'html'; return Request::isJson() || Request::isAjax() ? 'json' : 'html';
} }
public function initialize(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 检查是否是直接访问具体页面
$controller = $this->request->controller();
$action = $this->request->action();
// 如果不是访问index控制器且不是通过iframe加载且不是ajax请求
if (
$controller != 'Index' &&
!$this->request->isAjax() &&
!$this->request->header('X-Requested-With') &&
!$this->request->param('iframe')
) { // 添加iframe参数检查
// 重定向到index页面并带上当前页面参数
$currentUrl = $controller . '/' . $action;
redirect(url('index/index', ['page' => $currentUrl]))->send();
exit;
}
}
} }

View File

@ -1,324 +1,186 @@
{include file="public/header" /} {include file="public/header" /}
<div class="config-container"> <div class="config-container">
<div class="config-header" style="display:flex;justify-content: space-between;"> <!-- 页面头部 -->
<div style="display: flex; align-items: center;"> <div class="page-header">
<span>文章分类</span> <div class="header-title">
<i class="layui-icon layui-icon-app"></i>
<span>文章分类管理</span>
</div> </div>
<div> <div class="header-actions">
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm" onclick="add()"> <button type="button" class="layui-btn layui-btn-normal layui-btn-sm" onclick="add()">
<i class="layui-icon layui-icon-add-1"></i>添加 <i class="layui-icon layui-icon-add-1"></i>新增分类
</button> </button>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" onclick="refresh()"> <button type="button" class="layui-btn layui-btn-primary layui-btn-sm" onclick="refresh()">
<i class="layui-icon layui-icon-refresh"></i>刷新 <i class="layui-icon layui-icon-refresh"></i>刷新
</button> </button>
</div> </div>
</div> </div>
<div class="layui-row" style="margin-top: 15px;"> <!-- 主要内容区 -->
<div class="layui-col-md6"> <div class="main-content">
<div class="layui-card"> <div class="layui-row layui-col-space20">
<div class="layui-card-header">分类列表</div> <!-- 左侧分类列表 -->
<div class="layui-card-body"> <div class="layui-col-md7">
<div id="categoryList"></div> <div class="layui-card">
<div class="layui-card-header">
<span>分类列表</span>
<small class="text-muted">支持两级分类结构</small>
</div>
<div class="layui-card-body">
<div id="categoryList" class="category-tree"></div>
</div>
</div> </div>
</div> </div>
</div>
<div class="layui-col-md4""> <!-- 右侧分类信息 -->
<div class="layui-card"> <div class="layui-col-md5">
<div class="layui-card-header">分类信息</div> <div class="layui-card">
<div class="layui-card-body"> <div class="layui-card-header">
<div id="defaultTip" style="text-align: center; padding: 50px 0; color: #999;"> <span>分类信息</span>
<i class="layui-icon layui-icon-face-surprised" style="font-size: 30px;"></i>
<p style="margin-top: 10px;">请选择左侧分类</p>
</div> </div>
<form class="layui-form" lay-filter="categoryForm" style="display: none;"> <div class="layui-card-body">
<input type="hidden" name="id" id="categoryId"> <!-- 默认提示 -->
<div class="layui-form-item"> <div id="defaultTip" class="empty-tip">
<label class="layui-form-label">分类名称</label> <i class="layui-icon layui-icon-face-surprised"></i>
<div class="layui-input-block"> <p>请选择左侧分类或点击新增按钮</p>
<input type="text" name="name" required lay-verify="required" placeholder="请输入分类名称"
autocomplete="off" class="layui-input">
</div>
</div> </div>
<div class="layui-form-item">
<label class="layui-form-label">父级分类</label> <!-- 分类表单 -->
<div class="layui-input-block"> <form class="layui-form category-form" lay-filter="categoryForm" style="display: none;">
<select name="cid" lay-verify="required"> <input type="hidden" name="id" id="categoryId">
<option value="0">顶级分类</option>
</select> <div class="layui-form-item">
</div> <label class="layui-form-label">分类名称</label>
</div> <div class="layui-input-block">
<div class="layui-form-item"> <input type="text" name="name" required lay-verify="required" placeholder="请输入分类名称"
<label class="layui-form-label">封面图片</label> autocomplete="off" class="layui-input">
<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>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">排序</label> <label class="layui-form-label">父级分类</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="number" name="sort" value="0" class="layui-input"> <select name="cid" lay-verify="required">
<option value="0">顶级分类</option>
</select>
</div>
</div> </div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">状态</label> <label class="layui-form-label">封面图片</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="radio" name="status" value="1" title="正常" checked> <div class="layui-upload-drag" id="uploadImage">
<input type="radio" name="status" value="0" title="禁用"> <i class="layui-icon layui-icon-upload"></i>
<p>点击上传或拖拽图片至此处</p>
<div class="layui-hide" id="uploadPreview">
<hr>
<img src="" alt="封面图片" style="max-width: 100%">
</div>
</div>
<input type="hidden" name="image" id="imageInput">
<div class="layui-form-mid layui-word-aux">建议尺寸250px * 140px</div>
</div>
</div> </div>
</div>
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-block"> <label class="layui-form-label">排序</label>
<button class="layui-btn" lay-submit lay-filter="saveCategory">保存</button> <div class="layui-input-block">
<button type="reset" class="layui-btn layui-btn-primary">重置</button> <input type="number" name="sort" value="0" class="layui-input"
<button type="button" class="layui-btn layui-btn-danger" id="deleteBtn" placeholder="数字越大越靠前">
style="display: none;">删除</button> </div>
</div> </div>
</div>
</form> <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 form-actions">
<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>
</div> </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> <style>
/* 页面整体样式 */
.config-container {
padding: 15px;
background: #f2f2f2;
}
/* 页面头部样式 */
.page-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding: 10px 15px;
background: #fff;
border-radius: 2px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
.header-title {
display: flex;
align-items: center;
font-size: 16px;
font-weight: 500;
}
.header-title .layui-icon {
margin-right: 8px;
font-size: 18px;
}
.header-actions .layui-btn {
margin-left: 8px;
}
/* 主要内容区样式 */
.main-content {
min-height: calc(100vh - 170px);
}
.layui-card {
margin-bottom: 0;
border-radius: 2px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.layui-card-header {
display: flex;
align-items: center;
height: auto;
padding: 12px 15px;
font-size: 15px;
font-weight: 500;
}
.text-muted {
margin-left: 10px;
font-size: 12px;
font-weight: normal;
color: #999;
}
/* 分类树样式 */
.category-tree {
padding: 10px 0;
}
.category-item { .category-item {
margin: 5px 0; margin: 5px 0;
} }
@ -327,9 +189,10 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 8px 10px; padding: 10px 15px;
background-color: #f8f8f8; background-color: #f8f8f8;
border-radius: 2px; border-radius: 2px;
transition: all 0.3s;
cursor: pointer; cursor: pointer;
} }
@ -337,67 +200,292 @@
background-color: #f2f2f2; background-color: #f2f2f2;
} }
.category-header.active {
background-color: #e6f7ff;
border-right: 3px solid #1890ff;
}
.category-name { .category-name {
flex: 1; flex: 1;
font-size: 14px; font-size: 14px;
} }
.category-actions { .category-actions {
display: none; /* opacity: 0; */
transition: opacity 0.3s;
} }
.category-header:hover .category-actions { .category-header:hover .category-actions {
display: block; opacity: 1;
} }
.category-children { .category-children {
margin-left: 20px; margin-left: 20px;
padding-left: 10px; padding-left: 15px;
border-left: 1px solid #e6e6e6; border-left: 1px dashed #e6e6e6;
} }
.add-child { .add-child {
color: #1E9FFF; padding: 3px 8px;
font-size: 14px; font-size: 12px;
}
.add-child .layui-icon {
font-size: 12px;
margin-right: 3px;
}
/* 空状态提示 */
.empty-tip {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 0;
color: #999;
}
.empty-tip .layui-icon {
font-size: 32px;
margin-bottom: 10px;
}
/* 表单样式优化 */
.category-form {
padding: 10px 0;
}
.layui-form-label {
width: 100px;
}
.layui-input-block {
margin-left: 130px;
}
.form-actions {
margin-top: 30px;
}
.layui-upload-drag {
padding: 20px;
border: 1px dashed #e2e2e2;
background-color: #fff;
text-align: center;
cursor: pointer; cursor: pointer;
margin-left: 10px;
} }
.add-child:hover { .layui-upload-drag:hover {
color: #0C7CD5; border-color: #009688;
} }
.layui-upload-list { .layui-upload-drag img {
margin-top: 10px; max-width: 100%;
position: relative; margin: 10px 0;
display: inline-block;
} }
.delete-image { .layui-btn-xs {
position: absolute; height: 30px;
top: 0; line-height: 25px;
right: 0; font-size: 12px;
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> </style>
<script>
// 定义全局变量和函数
var categoryManager = {
init: function () {
this.initLayui();
},
initLayui: function () {
var that = this;
layui.use(['layer', 'form', 'upload'], function () {
var layer = layui.layer;
var form = layui.form;
var upload = layui.upload;
var $ = layui.jquery;
// 初始化分类列表
that.initCategoryList = function () {
$.ajax({
url: '/admin/article/articlecate',
type: 'POST',
success: function (res) {
if (res.code === 0) {
var html = '';
res.data.forEach(function (item) {
html += that.renderCategory(item);
});
$('#categoryList').html(html);
that.bindEvents();
} else {
layer.msg('获取分类数据失败', { icon: 2 });
}
}
});
};
// 渲染分类项
that.renderCategory = function (category, level = 0) {
var html = '<div class="category-item" data-id="' + category.id + '">';
html += '<div class="category-header">';
html += '<div class="category-name">' + category.title + '</div>';
if (level === 0) {
html += '<div class="category-actions">';
html += '<button type="button" class="layui-btn layui-btn-primary layui-btn-xs add-child">';
html += '<i class="layui-icon layui-icon-add-1"></i>添加子分类</button>';
html += '</div>';
}
html += '</div>';
if (category.children && category.children.length > 0) {
html += '<div class="category-children">';
category.children.forEach(function (child) {
html += that.renderCategory(child, level + 1);
});
html += '</div>';
}
html += '</div>';
return html;
};
// 绑定事件
that.bindEvents = function () {
// 点击分类项加载编辑信息
$('.category-header').off('click').on('click', function (e) {
if (!$(e.target).closest('.add-child').length) {
var id = $(this).closest('.category-item').data('id');
that.loadCategoryInfo(id);
// 添加选中效果
$('.category-header').removeClass('active');
$(this).addClass('active');
}
});
// 添加子分类
$('.add-child').off('click').on('click', function (e) {
e.stopPropagation();
var parentId = $(this).closest('.category-item').data('id');
that.showCategoryForm(parentId);
});
};
// 加载分类信息
that.loadCategoryInfo = function (id) {
$.get('/admin/article/cateedit?id=' + id, function (res) {
if (res.code === 0) {
that.showCategoryForm(0, res.data);
}
});
};
// 显示分类表单
that.showCategoryForm = function (parentId = 0, data = null) {
$('#defaultTip').hide();
$('.category-form').show();
// 重置表单
form.val('categoryForm', {
id: data ? data.info.id : '',
name: data ? data.info.name : '',
cid: data ? data.info.cid : parentId,
sort: data ? data.info.sort : 0,
status: data ? data.info.status : 1
});
// 更新父级分类选项
var $select = $('select[name="cid"]');
$select.empty().append('<option value="0">顶级分类</option>');
if (data && data.parentOptions) {
data.parentOptions.forEach(function (item) {
$select.append('<option value="' + item.id + '">' + item.name + '</option>');
});
}
// 更新图片预览
if (data && data.info.image) {
$('#uploadPreview').removeClass('layui-hide').find('img').attr('src', data.info.image);
$('#imageInput').val(data.info.image);
} else {
$('#uploadPreview').addClass('layui-hide').find('img').attr('src', '');
$('#imageInput').val('');
}
// 显示/隐藏删除按钮
$('#deleteBtn')[data ? 'show' : 'hide']();
form.render();
};
// 初始化上传组件
upload.render({
elem: '#uploadImage',
url: '/admin/upload/image',
accept: 'images',
acceptMime: 'image/*',
done: function (res) {
if (res.code === 0) {
$('#uploadPreview').removeClass('layui-hide').find('img').attr('src', res.data.url);
$('#imageInput').val(res.data.url);
layer.msg('上传成功');
} else {
layer.msg('上传失败');
}
}
});
// 监听表单提交
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 });
that.initCategoryList();
} else {
layer.msg(res.msg, { icon: 2 });
}
});
return false;
});
// 监听删除按钮
$('#deleteBtn').on('click', function () {
var id = $('#categoryId').val();
if (!id) return;
layer.confirm('确定要删除该分类吗?', function (index) {
$.post('/admin/article/catedel', { id: id }, function (res) {
if (res.code === 0) {
layer.msg(res.msg, { icon: 1 });
that.initCategoryList();
$('#defaultTip').show();
$('.category-form').hide();
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
});
// 初始化页面
that.initCategoryList();
});
}
};
// 初始化
categoryManager.init();
// 新增分类
function add() {
categoryManager.showCategoryForm();
}
// 刷新列表
function refresh() {
categoryManager.initCategoryList();
}
</script>

View File

@ -1,11 +1,13 @@
{include file="public/header" /} {include file="public/header" /}
<div class="config-container"> <div class="config-container">
<div class="config-header" style="display:flex;justify-content: space-between;"> <div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
<div style="display: flex; align-items: center;"> <div class="maintitle">
<span>文章列表</span> <span>文章列表</span>
</div>
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;">
<div class="shaixuan"> <div class="shaixuan">
<label>筛选:</label> <label>筛选:</label>
<div class="layui-form"> <div class="layui-form" style="display: flex; gap: 10px;">
<div class="layui-input-inline"> <div class="layui-input-inline">
<select id="categoryFilter" lay-filter="categoryFilter" lay-verify=""> <select id="categoryFilter" lay-filter="categoryFilter" lay-verify="">
<option value="">全部分类</option> <option value="">全部分类</option>
@ -18,16 +20,28 @@
{/volist} {/volist}
</select> </select>
</div> </div>
<div class="layui-input-inline">
<input type="text" id="titleSearch" placeholder="搜索标题" class="layui-input">
</div>
<div class="layui-input-inline">
<input type="text" id="authorSearch" placeholder="搜索作者" class="layui-input">
</div>
<button type="button" class="layui-btn layui-btn-normal" onclick="doSearch()">
<i class="layui-icon layui-icon-search"></i>搜索
</button>
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="doRefresh()">
<i class="layui-icon layui-icon-refresh"></i>重置
</button>
</div> </div>
</div> </div>
</div> <div>
<div> <button type="button" class="layui-btn layui-btn-normal" onclick="add()">
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm" onclick="add()"> <i class="layui-icon layui-icon-add-1"></i>添加文章
<i class="layui-icon layui-icon-add-1"></i>添加 </button>
</button> <button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refresh()">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" onclick="refresh()"> <i class="layui-icon layui-icon-refresh"></i>刷新
<i class="layui-icon layui-icon-refresh"></i>刷新 </button>
</button> </div>
</div> </div>
</div> </div>
@ -53,7 +67,7 @@
</script> </script>
<script type="text/html" id="operationBar"> <script type="text/html" id="operationBar">
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit"> <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">
<i class="layui-icon layui-icon-edit"></i>编辑 <i class="layui-icon layui-icon-edit"></i>编辑
</button> </button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" lay-event="del"> <button type="button" class="layui-btn layui-btn-primary layui-btn-xs" lay-event="del">
@ -74,52 +88,82 @@
url: '/admin/article/articlelist', url: '/admin/article/articlelist',
method: 'post', method: 'post',
cols: [[ cols: [[
{field: 'id', title: 'ID', align:'center', width: 80}, { field: 'id', title: 'ID', align: 'center', width: 80 },
{field: 'title', title: '标题'}, { field: 'title', title: '标题' },
{field: 'cate', title: '分类', align:'center', width: 180}, { field: 'cate', title: '分类', align: 'center', width: 180 },
{field: 'image', title: '封面', templet: '#imageTemplate', align:'center', width: 180}, { field: 'image', title: '封面', templet: '#imageTemplate', align: 'center', width: 180 },
{field: 'author', title: '作者', align:'center', width: 120}, { field: 'author', title: '作者', align: 'center', width: 120 },
{field: 'status', title: '状态', templet: '#statusTemplate', align:'center', width: 80}, { field: 'status', title: '状态', templet: '#statusTemplate', align: 'center', width: 80 },
{field: 'publishdate', title: '发布时间', align:'center', width: 180}, { field: 'publishdate', title: '发布时间', align: 'center', width: 180 },
{title: '操作', toolbar: '#operationBar', align:'center', width: 150} { title: '操作', toolbar: '#operationBar', align: 'center', width: 150 }
]], ]],
page: true, page: true,
limit: 20, limit: 10,
limits: [10, 20, 30, 50], limits: [10, 50, 100],
//height: 'full-220' //height: 'full-220'
}); });
// 监听工具条事件 // 监听工具条事件
table.on('tool(articleTable)', function(obj){ table.on('tool(articleTable)', function (obj) {
var data = obj.data; var data = obj.data;
if(obj.event === 'edit'){ if (obj.event === 'edit') {
edit(data.id); edit(data.id);
} else if(obj.event === 'del'){ } else if (obj.event === 'del') {
del(data.id); del(data.id);
} }
}); });
// 监听分类筛选变化 // 监听分类筛选变化
form.on('select(categoryFilter)', function(data){ form.on('select(categoryFilter)', function (data) {
filterByCategory(data.value); filterByCategory(data.value);
}); });
}); });
function filterByCategory(categoryId) { function filterByCategory(categoryId) {
if (!categoryId) { reloadTable();
layui.table.reload('articleTable', { }
where: {},
page: { function doSearch() {
curr: 1 var titleKeyword = $('#titleSearch').val().trim();
} var authorKeyword = $('#authorSearch').val().trim();
});
if (!titleKeyword && !authorKeyword && !$('#categoryFilter').val()) {
layer.msg('请输入搜索条件', { icon: 0 });
return; return;
} }
var categoryName = $('#categoryFilter option[value="' + categoryId + '"]').text(); reloadTable();
}
function doRefresh() {
// 清空搜索条件
$('#titleSearch').val('');
$('#authorSearch').val('');
$('#categoryFilter').val('');
layui.form.render('select'); // 重新渲染select
// 重新加载表格,不带任何筛选条件
layui.table.reload('articleTable', {
where: {},
page: {
curr: 1
}
});
layer.msg('已重置', { icon: 1 });
}
function reloadTable() {
var categoryId = $('#categoryFilter').val();
var categoryName = categoryId ? $('#categoryFilter option[value="' + categoryId + '"]').text() : '';
var titleKeyword = $('#titleSearch').val().trim();
var authorKeyword = $('#authorSearch').val().trim();
layui.table.reload('articleTable', { layui.table.reload('articleTable', {
where: { where: {
category: categoryName category: categoryName,
title: titleKeyword,
author: authorKeyword
}, },
page: { page: {
curr: 1 curr: 1
@ -156,3 +200,12 @@
layui.table.reload('articleTable'); layui.table.reload('articleTable');
} }
</script> </script>
<style>
.maintitle {
font-size: 20px;
font-weight: bold;
color: #333;
margin-bottom: 10px;
}
</style>

View File

@ -17,6 +17,43 @@
width: 60px; width: 60px;
background-image: url("/static/images/logob32.jpg"); background-image: url("/static/images/logob32.jpg");
} }
.main-content {
height: 100%;
background: #fff;
}
#mainWorkspace {
height: 100%;
}
#mainTabs.layui-tab {
margin: 0;
height: 100%;
}
.layui-tab-content {
padding: 0;
height: calc(100% - 41px);
}
.layui-tab-item {
height: 100%;
}
.main-iframe {
width: 100%;
height: 100%;
border: none;
/* background-color: #f2f2f2; */
}
.layui-tab-title {
background: #fff;
box-shadow: 0 1px 2px 0 rgba(0,0,0,.1);
}
.layui-tab-title .layui-this:after {
border-bottom-color: #009688;
}
#LAY_app_body {
overflow: hidden;
}
.layui-tab-content .layui-tab-item {
position: relative;
}
</style> </style>
</head> </head>
@ -68,9 +105,20 @@
</div> </div>
<ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu"
lay-filter="layadmin-system-side-menu"> lay-filter="layadmin-system-side-menu">
<!-- 固定的工作台菜单项 -->
<li class="layui-nav-item" data-name="index/welcome">
<a href="javascript:;" lay-tips="工作台" lay-direction="2"
onclick="menuFire('index/welcome',1)">
<i class="layui-icon layui-icon-home" style="margin-top: -30px;"></i>
<cite>工作台</cite>
</a>
</li>
<!-- 下面是原有的菜单循环 -->
{volist name="menu" id="vo"} {volist name="menu" id="vo"}
<li data-name="" data-jump="" class="layui-nav-item"> <li data-name="{$vo.src}" data-jump="" class="layui-nav-item">
<a href="javascript:;" lay-tips="{$vo['label']}" lay-direction="2"> <!-- 修改一级菜单的点击事件只有当有src时才跳转 -->
<a href="javascript:;" lay-tips="{$vo['label']}" lay-direction="2" {if isset($vo['src']) &&
$vo['src']}onclick="menuFire('{$vo.src}',1)" {/if}>
<i class="layui-icon layui-icons {$vo['icon_class']}"></i> <i class="layui-icon layui-icons {$vo['icon_class']}"></i>
<cite>{$vo['label']}</cite> <cite>{$vo['label']}</cite>
</a> </a>
@ -101,12 +149,15 @@
</div> </div>
<!-- 主体内容 --> <!-- 主体内容 -->
<div class="layui-body" id="LAY_app_body"> <div class="layui-body" id="LAY_app_body">
<div class="layadmin-tabsbody-item layui-show"> <div class="main-content">
<div class="layui-fluid"> <!-- 默认工作台界面 -->
<div class="layui-card"> <div id="mainWorkspace">
<iframe src="{$config['admin_route']}index/welcome" onload="resetMainHeight(this)" <iframe src="{$config['admin_route']}index/welcome" class="main-iframe" frameborder="0" scrolling="0"></iframe>
style="width:100%;height:100%;" frameborder="0" scrolling="0"></iframe> </div>
</div> <!-- 动态标签页 -->
<div id="mainTabs" class="layui-tab" lay-allowClose="true" lay-filter="mainTabs" style="margin-top: 10px;">
<ul class="layui-tab-title"></ul>
<div class="layui-tab-content"></div>
</div> </div>
</div> </div>
</div> </div>
@ -124,38 +175,228 @@
$ = layui.jquery; $ = layui.jquery;
layer = layui.layer; layer = layui.layer;
setter = layui.setter; setter = layui.setter;
$('#clearcache').on('click', function () {
$.ajax({ // 保存标签状态
url: "{$config['admin_route']}index/clear", function saveTabState(layid, title, url) {
success: function (res) { var tabState = {
if (res.code > 0) { layid: layid,
layer.msg(res.msg, { 'icon': 2 }); title: title,
} else { url: url
layer.msg(res.msg, { 'icon': 1 }); };
setTimeout(function () { parent.window.location.reload(); }, 1000); sessionStorage.setItem('currentTab', JSON.stringify(tabState));
}
// 恢复标签状态
function restoreTabState() {
var tabState = sessionStorage.getItem('currentTab');
if (tabState) {
try {
var tab = JSON.parse(tabState);
if (tab.url && tab.title) {
addTab(tab.title, tab.url, tab.layid);
} }
} catch (e) {
console.error('Failed to restore tab state:', e);
} }
}
}
// 在页面加载完成后执行
$(document).ready(function () {
// 获取URL参数
var urlParams = new URLSearchParams(window.location.search);
var page = urlParams.get('page');
if (page) {
// 如果有page参数加载对应页面到iframe
$('iframe').attr('src', "{$config['admin_route']}" + page);
} else {
// 否则加载默认页面
$('iframe').attr('src', "{$config['admin_route']}index/welcome");
}
// 恢复标签状态
restoreTabState();
});
// 添加或切换到标签页
window.addTab = function(title, url, id) {
var element = layui.element;
var $ = layui.jquery;
var layid = id || url.replace(/\//g, '_');
// 如果是首页/工作台,直接显示主工作区
if(url.indexOf('index/welcome') > -1 || url.indexOf('welcome') > -1) {
$('#mainTabs').hide();
$('#mainWorkspace').show();
$('#mainWorkspace iframe').attr('src', url);
sessionStorage.removeItem('currentTab');
return;
}
// 显示标签区域
$('#mainWorkspace').hide();
$('#mainTabs').show();
// 如果标签已存在,直接切换
if($('.layui-tab-title li[lay-id="'+ layid +'"]').length > 0) {
element.tabChange('mainTabs', layid);
saveTabState(layid, title, url);
return;
}
// 添加新标签
element.tabAdd('mainTabs', {
title: title,
content: '<iframe src="' + url + '" class="main-iframe" frameborder="0"></iframe>',
id: layid
});
// 切换到新标签页
element.tabChange('mainTabs', layid);
// 保存当前标签状态
saveTabState(layid, title, url);
};
// 监听标签切换事件
element.on('tab(mainTabs)', function(data){
var layid = $(this).attr('lay-id');
// 确保当前标签页内容可见
$('.layui-tab-content .layui-tab-item').eq(data.index).addClass('layui-show')
.siblings().removeClass('layui-show');
// 更新保存的标签状态
var title = $(this).text();
var url = $('.layui-tab-content .layui-tab-item').eq(data.index).find('iframe').attr('src');
saveTabState(layid, title, url);
});
// 监听标签删除事件
element.on('tabDelete(mainTabs)', function(data){
// 如果没有标签了,显示工作台
if($('.layui-tab-title li').length === 0) {
$('#mainTabs').hide();
$('#mainWorkspace').show();
sessionStorage.removeItem('currentTab');
}
});
// 左侧菜单点击事件
$('.left-nav #nav li').click(function (event) {
if ($(this).children('.sub-menu').length) {
if ($(this).hasClass('open')) {
$(this).removeClass('open');
$(this).find('.nav_right').html('&#xe697;');
$(this).children('.sub-menu').stop().slideUp();
$(this).siblings().children('.sub-menu').slideUp();
} else {
$(this).addClass('open');
$(this).children('a').find('.nav_right').html('&#xe6a6;');
$(this).children('.sub-menu').stop().slideDown();
$(this).siblings().children('.sub-menu').stop().slideUp();
$(this).siblings().find('.nav_right').html('&#xe697;');
$(this).siblings().removeClass('open');
}
} else {
var url = $(this).children('a').attr('_href');
var title = $(this).children('a').html();
title = title.replace(/<[^>]+>/g, "").trim(); // 移除HTML标签
if (url) {
window.addTab(title, url);
}
}
event.stopPropagation();
})
// 修改resetMainHeight函数
function resetMainHeight(iframe) {
if (!iframe) return;
try {
// 获取视口高度
var clientHeight = document.documentElement.clientHeight;
// 计算iframe应该的高度减去头部和tab标签的高度
var iframeHeight = clientHeight - 60 - 40; // 60px是头部高度40px是tab标签高度
$(iframe).css({
'height': iframeHeight + 'px',
'width': '100%',
'display': 'block'
});
} catch(e) {
console.error('Reset iframe height failed:', e);
}
}
// 在窗口大小改变时重置所有iframe高度
$(window).on('resize', function() {
$('.main-iframe').each(function() {
resetMainHeight(this);
}); });
return false;
}); });
}); });
// 重新设置主操作页面高度
function resetMainHeight(obj) {
// parent 上级
// clientHeight 元素的像素高度,包含元素的高度+内边距,不包含水平滚动条,边框和外边距
var height = parent.document.documentElement.clientHeight - 80;
$(obj).parent('div').height(height);
}
// 菜单点击 // 菜单点击
function menuFire(obj, num) { function menuFire(obj, num) {
if (num == 1) { if (num == 1) {
$('iframe').attr('src', "{$config['admin_route']}" + obj); var title = '';
// 获取菜单标题
$('.layui-nav-item a').each(function() {
if($(this).attr('onclick') && $(this).attr('onclick').indexOf(obj) > -1) {
title = $(this).text().trim();
return false;
}
});
// 如果没找到标题,使用子菜单查找
if(!title) {
$('.layui-nav-child a').each(function() {
if($(this).attr('onclick') && $(this).attr('onclick').indexOf(obj) > -1) {
title = $(this).text().trim();
return false;
}
});
}
// 添加或切换到标签页
window.addTab(title || '新页面', "{$config['admin_route']}" + obj, obj.replace(/\//g, '_'));
// 更新浏览器URL但保持在index页面
window.history.pushState({}, '', "{$config['admin_route']}index/index?page=" + obj);
// 如果是子菜单,确保父菜单展开
if (obj.indexOf('/') > -1) {
var parentMenu = obj.split('/')[0];
$('.layui-nav-item').each(function () {
var menuSrc = $(this).find('a').attr('onclick');
if (menuSrc && menuSrc.indexOf(parentMenu) > -1) {
$(this).addClass('layui-nav-itemed');
}
});
}
} }
var width = screen(); var width = screen();
if (width < 2) { if (width < 2) {
shrink(); shrink();
} }
} }
// 监听浏览器前进后退按钮
window.addEventListener('popstate', function (event) {
// 获取URL参数
var urlParams = new URLSearchParams(window.location.search);
var page = urlParams.get('page');
if (page) {
// 如果有page参数通过标签系统加载页面
var title = '新页面';
window.addTab(title, "{$config['admin_route']}" + page, page.replace(/\//g, '_'));
} else {
// 否则加载默认页面
element.tabChange('mainTabs', 'welcome');
}
});
// 退出 // 退出
function logout() { function logout() {
layer.confirm('确定要退出吗?', { layer.confirm('确定要退出吗?', {
@ -174,7 +415,7 @@
} }
//跳转前端站点 //跳转前端站点
function gotoFront(){ function gotoFront() {
window.open("//{$config['admin_domain']}", "_blank"); window.open("//{$config['admin_domain']}", "_blank");
} }
</script> </script>

View File

@ -4,7 +4,7 @@
padding: 20px; padding: 20px;
background-color: #fff; background-color: #fff;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); /* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); */
} }
.config-header { .config-header {
display: flex; display: flex;

View File

@ -4,7 +4,7 @@
padding: 20px; padding: 20px;
background-color: #fff; background-color: #fff;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); /* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); */
} }
.config-header { .config-header {
display: flex; display: flex;

View File

@ -4,7 +4,10 @@ html #layuicss-layuiAdmin{display:none; position: absolute; width: 1989px;}
::-webkit-input-placeholder{color:#ccc} ::-webkit-input-placeholder{color:#ccc}
/* 全局 */ /* 全局 */
html{background-color: #f2f2f2; color: #666;} html{
/* background-color: #f2f2f2; */
color: #666;
}
*[template], *[template],
.layadmin-tabsbody-item{display: none;} .layadmin-tabsbody-item{display: none;}
*[lay-href], *[lay-href],

View File

@ -3,7 +3,7 @@
padding: 20px; padding: 20px;
background-color: #fff; background-color: #fff;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); /* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); */
} }
.config-header { .config-header {
display: flex; display: flex;
@ -34,7 +34,7 @@
color: #409eff; color: #409eff;
} }
.shaixuan { .shaixuan {
margin-left: 20px; /* margin-left: 20px; */
display: flex; display: flex;
align-items: center; align-items: center;
} }

View File

@ -1,4 +1,4 @@
<?php /*a:3:{s:63:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzer\menuinfo.php";i:1746709977;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746709977;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?> <?php /*a:3:{s:63:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzer\menuinfo.php";i:1746709977;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -6,8 +6,9 @@
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/moban.css" media="all"/>
<link rel="stylesheet" type="text/css" href="/static/third/layui/css/layui.css" media="all"/> <link rel="stylesheet" type="text/css" href="/static/css/wangeditor.css" media="all"/>
<style type="text/css"> <style type="text/css">
.header span{background:#009688;margin-left:30px;padding:10px;color:#ffffff;} .header span{background:#009688;margin-left:30px;padding:10px;color:#ffffff;}
.header div{border-bottom:solid 2px #009688;margin-top: 8px;} .header div{border-bottom:solid 2px #009688;margin-top: 8px;}
@ -78,7 +79,7 @@
} }
.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;} .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> </style>
<script type="text/javascript" src="/static/third/layui/layui.js"></script> <script type="text/javascript" src="/static/layui/layui.js"></script>
<script type="text/javascript"> <script type="text/javascript">
layui.use(['layer','form','table','laydate','element','upload'],function(){ layui.use(['layer','form','table','laydate','element','upload'],function(){
layer = layui.layer; // layui 弹框 layer = layui.layer; // layui 弹框

View File

@ -98,7 +98,7 @@
padding: 20px; padding: 20px;
background-color: #fff; background-color: #fff;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); /* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); */
} }
.config-header { .config-header {
display: flex; display: flex;

View File

@ -1,4 +1,4 @@
<?php /*a:1:{s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\index\index.php";i:1746709977;}*/ ?> <?php /*a:1:{s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\index\index.php";i:1747370724;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@ -18,6 +18,43 @@
width: 60px; width: 60px;
background-image: url("/static/images/logob32.jpg"); background-image: url("/static/images/logob32.jpg");
} }
.main-content {
height: 100%;
background: #fff;
}
#mainWorkspace {
height: 100%;
}
#mainTabs.layui-tab {
margin: 0;
height: 100%;
}
.layui-tab-content {
padding: 0;
height: calc(100% - 41px);
}
.layui-tab-item {
height: 100%;
}
.main-iframe {
width: 100%;
height: 100%;
border: none;
/* background-color: #f2f2f2; */
}
.layui-tab-title {
background: #fff;
box-shadow: 0 1px 2px 0 rgba(0,0,0,.1);
}
.layui-tab-title .layui-this:after {
border-bottom-color: #009688;
}
#LAY_app_body {
overflow: hidden;
}
.layui-tab-content .layui-tab-item {
position: relative;
}
</style> </style>
</head> </head>
@ -69,9 +106,20 @@
</div> </div>
<ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu"
lay-filter="layadmin-system-side-menu"> lay-filter="layadmin-system-side-menu">
<!-- 固定的工作台菜单项 -->
<li class="layui-nav-item" data-name="index/welcome">
<a href="javascript:;" lay-tips="工作台" lay-direction="2"
onclick="menuFire('index/welcome',1)">
<i class="layui-icon layui-icon-home" style="margin-top: -30px;"></i>
<cite>工作台</cite>
</a>
</li>
<!-- 下面是原有的菜单循环 -->
<?php if(is_array($menu) || $menu instanceof \think\Collection || $menu instanceof \think\Paginator): $i = 0; $__LIST__ = $menu;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$vo): $mod = ($i % 2 );++$i;?> <?php if(is_array($menu) || $menu instanceof \think\Collection || $menu instanceof \think\Paginator): $i = 0; $__LIST__ = $menu;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$vo): $mod = ($i % 2 );++$i;?>
<li data-name="" data-jump="" class="layui-nav-item"> <li data-name="<?php echo htmlentities((string) $vo['src']); ?>" data-jump="" class="layui-nav-item">
<a href="javascript:;" lay-tips="<?php echo htmlentities((string) $vo['label']); ?>" lay-direction="2"> <!-- 修改一级菜单的点击事件只有当有src时才跳转 -->
<a href="javascript:;" lay-tips="<?php echo htmlentities((string) $vo['label']); ?>" lay-direction="2" <?php if(isset($vo['src']) &&
$vo['src']): ?>onclick="menuFire('<?php echo htmlentities((string) $vo['src']); ?>',1)" <?php endif; ?>>
<i class="layui-icon layui-icons <?php echo htmlentities((string) $vo['icon_class']); ?>"></i> <i class="layui-icon layui-icons <?php echo htmlentities((string) $vo['icon_class']); ?>"></i>
<cite><?php echo htmlentities((string) $vo['label']); ?></cite> <cite><?php echo htmlentities((string) $vo['label']); ?></cite>
</a> </a>
@ -102,12 +150,15 @@
</div> </div>
<!-- 主体内容 --> <!-- 主体内容 -->
<div class="layui-body" id="LAY_app_body"> <div class="layui-body" id="LAY_app_body">
<div class="layadmin-tabsbody-item layui-show"> <div class="main-content">
<div class="layui-fluid"> <!-- 默认工作台界面 -->
<div class="layui-card"> <div id="mainWorkspace">
<iframe src="<?php echo htmlentities((string) $config['admin_route']); ?>index/welcome" onload="resetMainHeight(this)" <iframe src="<?php echo htmlentities((string) $config['admin_route']); ?>index/welcome" class="main-iframe" frameborder="0" scrolling="0"></iframe>
style="width:100%;height:100%;" frameborder="0" scrolling="0"></iframe> </div>
</div> <!-- 动态标签页 -->
<div id="mainTabs" class="layui-tab" lay-allowClose="true" lay-filter="mainTabs" style="margin-top: 10px;">
<ul class="layui-tab-title"></ul>
<div class="layui-tab-content"></div>
</div> </div>
</div> </div>
</div> </div>
@ -125,38 +176,228 @@
$ = layui.jquery; $ = layui.jquery;
layer = layui.layer; layer = layui.layer;
setter = layui.setter; setter = layui.setter;
$('#clearcache').on('click', function () {
$.ajax({ // 保存标签状态
url: "<?php echo htmlentities((string) $config['admin_route']); ?>index/clear", function saveTabState(layid, title, url) {
success: function (res) { var tabState = {
if (res.code > 0) { layid: layid,
layer.msg(res.msg, { 'icon': 2 }); title: title,
} else { url: url
layer.msg(res.msg, { 'icon': 1 }); };
setTimeout(function () { parent.window.location.reload(); }, 1000); sessionStorage.setItem('currentTab', JSON.stringify(tabState));
}
// 恢复标签状态
function restoreTabState() {
var tabState = sessionStorage.getItem('currentTab');
if (tabState) {
try {
var tab = JSON.parse(tabState);
if (tab.url && tab.title) {
addTab(tab.title, tab.url, tab.layid);
} }
} catch (e) {
console.error('Failed to restore tab state:', e);
} }
}
}
// 在页面加载完成后执行
$(document).ready(function () {
// 获取URL参数
var urlParams = new URLSearchParams(window.location.search);
var page = urlParams.get('page');
if (page) {
// 如果有page参数加载对应页面到iframe
$('iframe').attr('src', "<?php echo htmlentities((string) $config['admin_route']); ?>" + page);
} else {
// 否则加载默认页面
$('iframe').attr('src', "<?php echo htmlentities((string) $config['admin_route']); ?>index/welcome");
}
// 恢复标签状态
restoreTabState();
});
// 添加或切换到标签页
window.addTab = function(title, url, id) {
var element = layui.element;
var $ = layui.jquery;
var layid = id || url.replace(/\//g, '_');
// 如果是首页/工作台,直接显示主工作区
if(url.indexOf('index/welcome') > -1 || url.indexOf('welcome') > -1) {
$('#mainTabs').hide();
$('#mainWorkspace').show();
$('#mainWorkspace iframe').attr('src', url);
sessionStorage.removeItem('currentTab');
return;
}
// 显示标签区域
$('#mainWorkspace').hide();
$('#mainTabs').show();
// 如果标签已存在,直接切换
if($('.layui-tab-title li[lay-id="'+ layid +'"]').length > 0) {
element.tabChange('mainTabs', layid);
saveTabState(layid, title, url);
return;
}
// 添加新标签
element.tabAdd('mainTabs', {
title: title,
content: '<iframe src="' + url + '" class="main-iframe" frameborder="0"></iframe>',
id: layid
});
// 切换到新标签页
element.tabChange('mainTabs', layid);
// 保存当前标签状态
saveTabState(layid, title, url);
};
// 监听标签切换事件
element.on('tab(mainTabs)', function(data){
var layid = $(this).attr('lay-id');
// 确保当前标签页内容可见
$('.layui-tab-content .layui-tab-item').eq(data.index).addClass('layui-show')
.siblings().removeClass('layui-show');
// 更新保存的标签状态
var title = $(this).text();
var url = $('.layui-tab-content .layui-tab-item').eq(data.index).find('iframe').attr('src');
saveTabState(layid, title, url);
});
// 监听标签删除事件
element.on('tabDelete(mainTabs)', function(data){
// 如果没有标签了,显示工作台
if($('.layui-tab-title li').length === 0) {
$('#mainTabs').hide();
$('#mainWorkspace').show();
sessionStorage.removeItem('currentTab');
}
});
// 左侧菜单点击事件
$('.left-nav #nav li').click(function (event) {
if ($(this).children('.sub-menu').length) {
if ($(this).hasClass('open')) {
$(this).removeClass('open');
$(this).find('.nav_right').html('&#xe697;');
$(this).children('.sub-menu').stop().slideUp();
$(this).siblings().children('.sub-menu').slideUp();
} else {
$(this).addClass('open');
$(this).children('a').find('.nav_right').html('&#xe6a6;');
$(this).children('.sub-menu').stop().slideDown();
$(this).siblings().children('.sub-menu').stop().slideUp();
$(this).siblings().find('.nav_right').html('&#xe697;');
$(this).siblings().removeClass('open');
}
} else {
var url = $(this).children('a').attr('_href');
var title = $(this).children('a').html();
title = title.replace(/<[^>]+>/g, "").trim(); // 移除HTML标签
if (url) {
window.addTab(title, url);
}
}
event.stopPropagation();
})
// 修改resetMainHeight函数
function resetMainHeight(iframe) {
if (!iframe) return;
try {
// 获取视口高度
var clientHeight = document.documentElement.clientHeight;
// 计算iframe应该的高度减去头部和tab标签的高度
var iframeHeight = clientHeight - 60 - 40; // 60px是头部高度40px是tab标签高度
$(iframe).css({
'height': iframeHeight + 'px',
'width': '100%',
'display': 'block'
});
} catch(e) {
console.error('Reset iframe height failed:', e);
}
}
// 在窗口大小改变时重置所有iframe高度
$(window).on('resize', function() {
$('.main-iframe').each(function() {
resetMainHeight(this);
}); });
return false;
}); });
}); });
// 重新设置主操作页面高度
function resetMainHeight(obj) {
// parent 上级
// clientHeight 元素的像素高度,包含元素的高度+内边距,不包含水平滚动条,边框和外边距
var height = parent.document.documentElement.clientHeight - 80;
$(obj).parent('div').height(height);
}
// 菜单点击 // 菜单点击
function menuFire(obj, num) { function menuFire(obj, num) {
if (num == 1) { if (num == 1) {
$('iframe').attr('src', "<?php echo htmlentities((string) $config['admin_route']); ?>" + obj); var title = '';
// 获取菜单标题
$('.layui-nav-item a').each(function() {
if($(this).attr('onclick') && $(this).attr('onclick').indexOf(obj) > -1) {
title = $(this).text().trim();
return false;
}
});
// 如果没找到标题,使用子菜单查找
if(!title) {
$('.layui-nav-child a').each(function() {
if($(this).attr('onclick') && $(this).attr('onclick').indexOf(obj) > -1) {
title = $(this).text().trim();
return false;
}
});
}
// 添加或切换到标签页
window.addTab(title || '新页面', "<?php echo htmlentities((string) $config['admin_route']); ?>" + obj, obj.replace(/\//g, '_'));
// 更新浏览器URL但保持在index页面
window.history.pushState({}, '', "<?php echo htmlentities((string) $config['admin_route']); ?>index/index?page=" + obj);
// 如果是子菜单,确保父菜单展开
if (obj.indexOf('/') > -1) {
var parentMenu = obj.split('/')[0];
$('.layui-nav-item').each(function () {
var menuSrc = $(this).find('a').attr('onclick');
if (menuSrc && menuSrc.indexOf(parentMenu) > -1) {
$(this).addClass('layui-nav-itemed');
}
});
}
} }
var width = screen(); var width = screen();
if (width < 2) { if (width < 2) {
shrink(); shrink();
} }
} }
// 监听浏览器前进后退按钮
window.addEventListener('popstate', function (event) {
// 获取URL参数
var urlParams = new URLSearchParams(window.location.search);
var page = urlParams.get('page');
if (page) {
// 如果有page参数通过标签系统加载页面
var title = '新页面';
window.addTab(title, "<?php echo htmlentities((string) $config['admin_route']); ?>" + page, page.replace(/\//g, '_'));
} else {
// 否则加载默认页面
element.tabChange('mainTabs', 'welcome');
}
});
// 退出 // 退出
function logout() { function logout() {
layer.confirm('确定要退出吗?', { layer.confirm('确定要退出吗?', {
@ -175,7 +416,7 @@
} }
//跳转前端站点 //跳转前端站点
function gotoFront(){ function gotoFront() {
window.open("//<?php echo htmlentities((string) $config['admin_domain']); ?>", "_blank"); window.open("//<?php echo htmlentities((string) $config['admin_domain']); ?>", "_blank");
} }
</script> </script>

View File

@ -1,4 +1,4 @@
<?php /*a:2:{s:67:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\article\articlelist.php";i:1746841528;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;}*/ ?> <?php /*a:2:{s:67:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\article\articlelist.php";i:1747366479;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -94,87 +94,194 @@
</head> </head>
<body style="padding:10px; box-sizing: border-box;"> <body style="padding:10px; box-sizing: border-box;">
<div class="config-container"> <div class="config-container">
<div class="config-header" style="display:flex;justify-content: space-between;"> <div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
<div> <div class="maintitle">
<span>文章列表</span> <span>文章列表</span>
</div> </div>
<div> <div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;">
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm" onclick="add()"> <div class="shaixuan">
<i class="layui-icon layui-icon-add-1"></i>添加 <label>筛选:</label>
</button> <div class="layui-form" style="display: flex; gap: 10px;">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" onclick="refresh()"> <div class="layui-input-inline">
<i class="layui-icon layui-icon-refresh"></i>刷新 <select id="categoryFilter" lay-filter="categoryFilter" lay-verify="">
</button> <option value="">全部分类</option>
<?php if(is_array($categories) || $categories instanceof \think\Collection || $categories instanceof \think\Paginator): $i = 0; $__LIST__ = $categories;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$category): $mod = ($i % 2 );++$i;?>
<optgroup label="<?php echo htmlentities((string) $category['name']); ?>">
<?php if(is_array($category['children']) || $category['children'] instanceof \think\Collection || $category['children'] instanceof \think\Paginator): $i = 0; $__LIST__ = $category['children'];if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$subCategory): $mod = ($i % 2 );++$i;?>
<option value="<?php echo htmlentities((string) $subCategory['id']); ?>"><?php echo htmlentities((string) $subCategory['name']); ?></option>
<?php endforeach; endif; else: echo "" ;endif; ?>
</optgroup>
<?php endforeach; endif; else: echo "" ;endif; ?>
</select>
</div>
<div class="layui-input-inline">
<input type="text" id="titleSearch" placeholder="搜索标题" class="layui-input">
</div>
<div class="layui-input-inline">
<input type="text" id="authorSearch" placeholder="搜索作者" class="layui-input">
</div>
<button type="button" class="layui-btn layui-btn-normal" onclick="doSearch()">
<i class="layui-icon layui-icon-search"></i>搜索
</button>
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="doRefresh()">
<i class="layui-icon layui-icon-refresh"></i>重置
</button>
</div>
</div>
<div>
<button type="button" class="layui-btn layui-btn-normal" 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>
</div> </div>
<table class="layui-table"> <table id="articleTable" lay-filter="articleTable"></table>
<thead>
<tr>
<th width="20">ID</th>
<th>标题</th>
<th>分类</th>
<th>封面</th>
<th>作者</th>
<th>状态</th>
<th>发布时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php if(is_array($lists) || $lists instanceof \think\Collection || $lists instanceof \think\Paginator): $i = 0; $__LIST__ = $lists;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$vo): $mod = ($i % 2 );++$i;?>
<tr>
<td><?php echo htmlentities((string) $vo['id']); ?></td>
<td><?php echo htmlentities((string) $vo['title']); ?></td>
<td><?php echo htmlentities((string) $vo['cate']); ?></td>
<td>
<?php if($vo['image']): ?>
<img src="<?php echo htmlentities((string) $vo['image']); ?>" style="max-width: 50px; max-height: 50px;">
<?php endif; ?>
</td>
<td><?php echo htmlentities((string) $vo['author']); ?></td>
<td>
<?php switch($vo['status']): case "0": ?><span style="color:red;">草稿</span><?php break; case "1": ?><span style="color:orange;">待审核</span><?php break; case "2": ?><span style="color:green;">已发布</span><?php break; case "3": ?><span style="color:gray;">隐藏</span><?php break; ?>
<?php endswitch; ?>
</td>
<td><?php echo htmlentities((string) $vo['publishdate']); ?></td>
<td>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="edit(<?php echo htmlentities((string) $vo['id']); ?>)">
<i class="layui-icon layui-icon-edit"></i>编辑
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="del(<?php echo htmlentities((string) $vo['id']); ?>)">
<i class="layui-icon layui-icon-delete"></i>删除
</button>
</td>
</tr>
<?php endforeach; endif; else: echo "" ;endif; ?>
</tbody>
</table>
</div> </div>
<script type="text/html" id="imageTemplate">
{{# if(d.image){ }}
<img src="{{ d.image }}" style="max-width: 50px; max-height: 50px;">
{{# } }}
</script>
<script type="text/html" id="statusTemplate">
{{# if(d.status === 0){ }}
<span style="color:red;">草稿</span>
{{# } else if(d.status === 1){ }}
<span style="color:orange;">待审核</span>
{{# } else if(d.status === 2){ }}
<span style="color:green;">已发布</span>
{{# } else if(d.status === 3){ }}
<span style="color:gray;">隐藏</span>
{{# } }}
</script>
<script type="text/html" id="operationBar">
<button type="button" class="layui-btn layui-btn-normal 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>
<script type="text/javascript"> <script type="text/javascript">
layui.use(['layer'], function () { layui.use(['layer', 'form', 'table'], function () {
layer = layui.layer; var layer = layui.layer;
$ = layui.jquery; var $ = layui.jquery;
var form = layui.form;
var table = layui.table;
// 初始化表格
table.render({
elem: '#articleTable',
url: '/admin/article/articlelist',
method: 'post',
cols: [[
{ field: 'id', title: 'ID', align: 'center', width: 80 },
{ field: 'title', title: '标题' },
{ field: 'cate', title: '分类', align: 'center', width: 180 },
{ field: 'image', title: '封面', templet: '#imageTemplate', align: 'center', width: 180 },
{ field: 'author', title: '作者', align: 'center', width: 120 },
{ field: 'status', title: '状态', templet: '#statusTemplate', align: 'center', width: 80 },
{ field: 'publishdate', title: '发布时间', align: 'center', width: 180 },
{ title: '操作', toolbar: '#operationBar', align: 'center', width: 150 }
]],
page: true,
limit: 10,
limits: [10, 50, 100],
//height: 'full-220'
});
// 监听工具条事件
table.on('tool(articleTable)', function (obj) {
var data = obj.data;
if (obj.event === 'edit') {
edit(data.id);
} else if (obj.event === 'del') {
del(data.id);
}
});
// 监听分类筛选变化
form.on('select(categoryFilter)', function (data) {
filterByCategory(data.value);
});
}); });
function filterByCategory(categoryId) {
reloadTable();
}
function doSearch() {
var titleKeyword = $('#titleSearch').val().trim();
var authorKeyword = $('#authorSearch').val().trim();
if (!titleKeyword && !authorKeyword && !$('#categoryFilter').val()) {
layer.msg('请输入搜索条件', { icon: 0 });
return;
}
reloadTable();
}
function doRefresh() {
// 清空搜索条件
$('#titleSearch').val('');
$('#authorSearch').val('');
$('#categoryFilter').val('');
layui.form.render('select'); // 重新渲染select
// 重新加载表格,不带任何筛选条件
layui.table.reload('articleTable', {
where: {},
page: {
curr: 1
}
});
layer.msg('已重置', { icon: 1 });
}
function reloadTable() {
var categoryId = $('#categoryFilter').val();
var categoryName = categoryId ? $('#categoryFilter option[value="' + categoryId + '"]').text() : '';
var titleKeyword = $('#titleSearch').val().trim();
var authorKeyword = $('#authorSearch').val().trim();
layui.table.reload('articleTable', {
where: {
category: categoryName,
title: titleKeyword,
author: authorKeyword
},
page: {
curr: 1
}
});
}
function add() { function add() {
window.location.href = '<?php echo url("article/add"); ?>'; window.location.href = '/admin/article/add';
} }
function edit(id) { function edit(id) {
window.location.href = '<?php echo url("article/edit"); ?>?id=' + id; window.location.href = '/admin/article/edit?id=' + id;
} }
function del(id) { function del(id) {
layer.confirm('确定要删除该文章吗?', { layer.confirm('确定要删除该文章吗?', {
btn: ['确定', '取消'] btn: ['确定', '取消']
}, function () { }, function () {
$.post('<?php echo url("article/delete"); ?>', { id: id }, function (res) { $.post('/admin/article/delete', { id: id }, function (res) {
if (res.code == 0) { if (res.code == 0) {
layer.msg(res.msg, { icon: 1 }); layer.msg(res.msg, { icon: 1 });
setTimeout(function () { setTimeout(function () {
window.location.reload(); layui.table.reload('articleTable');
}, 1000); }, 1000);
} else { } else {
layer.msg(res.msg, { icon: 2 }); layer.msg(res.msg, { icon: 2 });
@ -184,6 +291,15 @@
} }
function refresh() { function refresh() {
window.location.reload(); layui.table.reload('articleTable');
} }
</script> </script>
<style>
.maintitle {
font-size: 20px;
font-weight: bold;
color: #333;
margin-bottom: 10px;
}
</style>

View File

@ -1,4 +1,4 @@
<?php /*a:3:{s:69:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzeradmin\groupinfo.php";i:1746709977;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746709977;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?> <?php /*a:3:{s:69:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzeradmin\groupinfo.php";i:1746709977;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -6,8 +6,9 @@
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/moban.css" media="all"/>
<link rel="stylesheet" type="text/css" href="/static/third/layui/css/layui.css" media="all"/> <link rel="stylesheet" type="text/css" href="/static/css/wangeditor.css" media="all"/>
<style type="text/css"> <style type="text/css">
.header span{background:#009688;margin-left:30px;padding:10px;color:#ffffff;} .header span{background:#009688;margin-left:30px;padding:10px;color:#ffffff;}
.header div{border-bottom:solid 2px #009688;margin-top: 8px;} .header div{border-bottom:solid 2px #009688;margin-top: 8px;}
@ -78,7 +79,7 @@
} }
.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;} .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> </style>
<script type="text/javascript" src="/static/third/layui/layui.js"></script> <script type="text/javascript" src="/static/layui/layui.js"></script>
<script type="text/javascript"> <script type="text/javascript">
layui.use(['layer','form','table','laydate','element','upload'],function(){ layui.use(['layer','form','table','laydate','element','upload'],function(){
layer = layui.layer; // layui 弹框 layer = layui.layer; // layui 弹框

View File

@ -1,4 +1,4 @@
<?php /*a:3:{s:65:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzer\buttoninfo.php";i:1746709977;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746709977;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?> <?php /*a:3:{s:65:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzer\buttoninfo.php";i:1746709977;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -6,8 +6,9 @@
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <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"> <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/moban.css" media="all"/>
<link rel="stylesheet" type="text/css" href="/static/third/layui/css/layui.css" media="all"/> <link rel="stylesheet" type="text/css" href="/static/css/wangeditor.css" media="all"/>
<style type="text/css"> <style type="text/css">
.header span{background:#009688;margin-left:30px;padding:10px;color:#ffffff;} .header span{background:#009688;margin-left:30px;padding:10px;color:#ffffff;}
.header div{border-bottom:solid 2px #009688;margin-top: 8px;} .header div{border-bottom:solid 2px #009688;margin-top: 8px;}
@ -78,7 +79,7 @@
} }
.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;} .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> </style>
<script type="text/javascript" src="/static/third/layui/layui.js"></script> <script type="text/javascript" src="/static/layui/layui.js"></script>
<script type="text/javascript"> <script type="text/javascript">
layui.use(['layer','form','table','laydate','element','upload'],function(){ layui.use(['layer','form','table','laydate','element','upload'],function(){
layer = layui.layer; // layui 弹框 layer = layui.layer; // layui 弹框

View File

@ -1,4 +1,4 @@
<?php /*a:3:{s:66:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzer\configvalue.php";i:1747361534;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?> <?php /*a:3:{s:66:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\yunzer\configvalue.php";i:1747370939;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\tail.php";i:1746709977;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -98,7 +98,7 @@
padding: 20px; padding: 20px;
background-color: #fff; background-color: #fff;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); /* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); */
} }
.config-header { .config-header {
display: flex; display: flex;

View File

@ -1,4 +1,4 @@
<?php /*a:1:{s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\login\index.php";i:1746709977;}*/ ?> <?php /*a:1:{s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\login\index.php";i:1747362104;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-CN"> <html lang="zh-CN">
@ -25,11 +25,11 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layadmin-user-login-icon layui-icon layui-icon-username" for="account"></label> <label class="layadmin-user-login-icon layui-icon layui-icon-username" for="account"></label>
<input type="text" id="account" name="account" placeholder="邮箱" class="layui-input" <input type="text" id="account" name="account" placeholder="邮箱" class="layui-input"
value="357099073@qq.com"> value="">
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layadmin-user-login-icon layui-icon layui-icon-password" for="password"></label> <label class="layadmin-user-login-icon layui-icon layui-icon-password" for="password"></label>
<input type="password" name="password" class="layui-input" placeholder="密码" class="layui-input" <input type="password" name="password" lay-affix="eye" class="layui-input" placeholder="密码" class="layui-input"
value=""> value="">
</div> </div>
<div class="layui-form-item"> <div class="layui-form-item">

View File

@ -1,4 +1,4 @@
<?php /*a:2:{s:67:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\article\articlecate.php";i:1746861621;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;}*/ ?> <?php /*a:2:{s:67:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\article\articlecate.php";i:1747371803;s:61:"E:\Demos\DemoOwns\PHP\yunzer\app\admin\view\public\header.php";i:1746849526;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -94,139 +94,492 @@
</head> </head>
<body style="padding:10px; box-sizing: border-box;"> <body style="padding:10px; box-sizing: border-box;">
<div class="config-container"> <div class="config-container">
<div class="config-header" style="display:flex;justify-content: space-between;"> <!-- 页面头部 -->
<div> <div class="page-header">
<span>文章分类列表</span> <div class="header-title">
<i class="layui-icon layui-icon-app"></i>
<span>文章分类管理</span>
</div> </div>
<div> <div class="header-actions">
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm" onclick="add()"> <button type="button" class="layui-btn layui-btn-normal layui-btn-sm" onclick="add()">
<i class="layui-icon layui-icon-add-1"></i>添加 <i class="layui-icon layui-icon-add-1"></i>新增分类
</button> </button>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" onclick="refresh()"> <button type="button" class="layui-btn layui-btn-primary layui-btn-sm" onclick="refresh()">
<i class="layui-icon layui-icon-refresh"></i>刷新 <i class="layui-icon layui-icon-refresh"></i>刷新
</button> </button>
</div> </div>
</div> </div>
<table class="layui-table"> <!-- 主要内容区 -->
<thead> <div class="main-content">
<tr> <div class="layui-row layui-col-space20">
<th width="20">ID</th> <!-- 左侧分类列表 -->
<th width="120">分类名称</th> <div class="layui-col-md7">
<th width="120">分类图片</th> <div class="layui-card">
<th>描述</th> <div class="layui-card-header">
<th width="80">排序</th> <span>分类列表</span>
<th width="80">状态</th> <small class="text-muted">支持两级分类结构</small>
<th width="180">创建时间</th> </div>
<th width="240">操作</th> <div class="layui-card-body">
</tr> <div id="categoryList" class="category-tree"></div>
</thead> </div>
<tbody> </div>
<?php if(is_array($lists) || $lists instanceof \think\Collection || $lists instanceof \think\Paginator): $i = 0; $__LIST__ = $lists;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$vo): $mod = ($i % 2 );++$i;if($vo['cid'] == 0): ?> </div>
<tr>
<td><?php echo htmlentities((string) $vo['id']); ?></td> <!-- 右侧分类信息 -->
<td><?php echo htmlentities((string) $vo['name']); ?></td> <div class="layui-col-md5">
<td><img src="<?php echo htmlentities((string) $vo['image']); ?>" style="width: 100px;height: auto;"></td> <div class="layui-card">
<td></td><?php echo htmlentities((string) $vo['desc']); ?></td> <div class="layui-card-header">
<td><?php echo htmlentities((string) $vo['sort']); ?></td> <span>分类信息</span>
<td><?php echo $vo['status']==1 ? '开启' : '<span style="color:red;">禁用</span>'; ?></td> </div>
<td><?php echo htmlentities((string) $vo['create_time']); ?></td> <div class="layui-card-body">
<td> <!-- 默认提示 -->
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" <div id="defaultTip" class="empty-tip">
onclick="addchanel(<?php echo htmlentities((string) $vo['id']); ?>)"> <i class="layui-icon layui-icon-face-surprised"></i>
<i class="layui-icon layui-icon-add-1"></i>添加子栏目 <p>请选择左侧分类或点击新增按钮</p>
</button> </div>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="edit(<?php echo htmlentities((string) $vo['id']); ?>)">
<i class="layui-icon layui-icon-edit"></i>编辑 <!-- 分类表单 -->
</button> <form class="layui-form category-form" lay-filter="categoryForm" style="display: none;">
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="del(<?php echo htmlentities((string) $vo['id']); ?>)"> <input type="hidden" name="id" id="categoryId">
<i class="layui-icon layui-icon-delete"></i>删除
</button> <div class="layui-form-item">
</td> <label class="layui-form-label">分类名称</label>
</tr> <div class="layui-input-block">
<?php if(is_array($lists) || $lists instanceof \think\Collection || $lists instanceof \think\Paginator): $i = 0; $__LIST__ = $lists;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$sub): $mod = ($i % 2 );++$i;if($sub['cid'] == $vo['id']): ?> <input type="text" name="name" required lay-verify="required" placeholder="请输入分类名称"
<tr> autocomplete="off" class="layui-input">
<td><?php echo htmlentities((string) $sub['id']); ?></td> </div>
<td style="padding-left: 30px;">├─ <?php echo htmlentities((string) $sub['name']); ?></td> </div>
<td><img src="<?php echo htmlentities((string) $sub['image']); ?>" style="width: 100px;height: auto;"></td>
<td><?php echo htmlentities((string) $sub['desc']); ?></td> <div class="layui-form-item">
<td><?php echo htmlentities((string) $sub['sort']); ?></td> <label class="layui-form-label">父级分类</label>
<td><?php echo $sub['status']==1 ? '开启' : '<span style="color:red;">禁用</span>'; ?></td> <div class="layui-input-block">
<td><?php echo htmlentities((string) $sub['create_time']); ?></td> <select name="cid" lay-verify="required">
<td> <option value="0">顶级分类</option>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="edit(<?php echo htmlentities((string) $sub['id']); ?>)"> </select>
<i class="layui-icon layui-icon-edit"></i>编辑 </div>
</button> </div>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs" onclick="del(<?php echo htmlentities((string) $sub['id']); ?>)">
<i class="layui-icon layui-icon-delete"></i>删除 <div class="layui-form-item">
</button> <label class="layui-form-label">封面图片</label>
</td> <div class="layui-input-block">
</tr> <div class="layui-upload-drag" id="uploadImage">
<?php endif; ?> <i class="layui-icon layui-icon-upload"></i>
<?php endforeach; endif; else: echo "" ;endif; ?> <p>点击上传或拖拽图片至此处</p>
<?php endif; ?> <div class="layui-hide" id="uploadPreview">
<?php endforeach; endif; else: echo "" ;endif; ?> <hr>
</tbody> <img src="" alt="封面图片" style="max-width: 100%">
</table> </div>
</div>
<input type="hidden" name="image" id="imageInput">
<div class="layui-form-mid layui-word-aux">建议尺寸250px * 140px</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"
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 form-actions">
<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>
</div> </div>
<script type="text/javascript"> <style>
layui.use(['layer'], function () { /* 页面整体样式 */
layer = layui.layer; .config-container {
$ = layui.jquery; padding: 15px;
}); background: #f2f2f2;
function add() {
layer.open({
type: 2,
title: '添加分类',
shadeClose: true,
shade: 0.8,
area: ['800px', '600px'],
content: '<?php echo url("article/cateadd"); ?>'
});
} }
function edit(id) { /* 页面头部样式 */
layer.open({ .page-header {
type: 2, display: flex;
title: '编辑分类', justify-content: space-between;
shadeClose: true, align-items: center;
shade: 0.8, margin-bottom: 15px;
area: ['800px', '800px'], padding: 10px 15px;
content: '<?php echo url("article/cateedit"); ?>?id=' + id background: #fff;
}); border-radius: 2px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
} }
function del(id) { .header-title {
layer.confirm('确定要删除该分类吗?', { display: flex;
btn: ['确定', '取消'] align-items: center;
}, function () { font-size: 16px;
$.post('<?php echo url("article/catedel"); ?>', { id: id }, function (res) { font-weight: 500;
if (res.code == 0) { }
layer.msg(res.msg, { icon: 1 });
setTimeout(function () { .header-title .layui-icon {
window.location.reload(); margin-right: 8px;
}, 1000); font-size: 18px;
} else { }
layer.msg(res.msg, { icon: 2 });
} .header-actions .layui-btn {
margin-left: 8px;
}
/* 主要内容区样式 */
.main-content {
min-height: calc(100vh - 170px);
}
.layui-card {
margin-bottom: 0;
border-radius: 2px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.layui-card-header {
display: flex;
align-items: center;
height: auto;
padding: 12px 15px;
font-size: 15px;
font-weight: 500;
}
.text-muted {
margin-left: 10px;
font-size: 12px;
font-weight: normal;
color: #999;
}
/* 分类树样式 */
.category-tree {
padding: 10px 0;
}
.category-item {
margin: 5px 0;
}
.category-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 15px;
background-color: #f8f8f8;
border-radius: 2px;
transition: all 0.3s;
cursor: pointer;
}
.category-header:hover {
background-color: #f2f2f2;
}
.category-header.active {
background-color: #e6f7ff;
border-right: 3px solid #1890ff;
}
.category-name {
flex: 1;
font-size: 14px;
}
.category-actions {
/* opacity: 0; */
transition: opacity 0.3s;
}
.category-header:hover .category-actions {
opacity: 1;
}
.category-children {
margin-left: 20px;
padding-left: 15px;
border-left: 1px dashed #e6e6e6;
}
.add-child {
padding: 3px 8px;
font-size: 12px;
}
.add-child .layui-icon {
font-size: 12px;
margin-right: 3px;
}
/* 空状态提示 */
.empty-tip {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 0;
color: #999;
}
.empty-tip .layui-icon {
font-size: 32px;
margin-bottom: 10px;
}
/* 表单样式优化 */
.category-form {
padding: 10px 0;
}
.layui-form-label {
width: 100px;
}
.layui-input-block {
margin-left: 130px;
}
.form-actions {
margin-top: 30px;
}
.layui-upload-drag {
padding: 20px;
border: 1px dashed #e2e2e2;
background-color: #fff;
text-align: center;
cursor: pointer;
}
.layui-upload-drag:hover {
border-color: #009688;
}
.layui-upload-drag img {
max-width: 100%;
margin: 10px 0;
}
.layui-btn-xs {
height: 30px;
line-height: 25px;
font-size: 12px;
}
</style>
<script>
// 定义全局变量和函数
var categoryManager = {
init: function () {
this.initLayui();
},
initLayui: function () {
var that = this;
layui.use(['layer', 'form', 'upload'], function () {
var layer = layui.layer;
var form = layui.form;
var upload = layui.upload;
var $ = layui.jquery;
// 初始化分类列表
that.initCategoryList = function () {
$.ajax({
url: '/admin/article/articlecate',
type: 'POST',
success: function (res) {
if (res.code === 0) {
var html = '';
res.data.forEach(function (item) {
html += that.renderCategory(item);
});
$('#categoryList').html(html);
that.bindEvents();
} else {
layer.msg('获取分类数据失败', { icon: 2 });
}
}
});
};
// 渲染分类项
that.renderCategory = function (category, level = 0) {
var html = '<div class="category-item" data-id="' + category.id + '">';
html += '<div class="category-header">';
html += '<div class="category-name">' + category.title + '</div>';
if (level === 0) {
html += '<div class="category-actions">';
html += '<button type="button" class="layui-btn layui-btn-primary layui-btn-xs add-child">';
html += '<i class="layui-icon layui-icon-add-1"></i>添加子分类</button>';
html += '</div>';
}
html += '</div>';
if (category.children && category.children.length > 0) {
html += '<div class="category-children">';
category.children.forEach(function (child) {
html += that.renderCategory(child, level + 1);
});
html += '</div>';
}
html += '</div>';
return html;
};
// 绑定事件
that.bindEvents = function () {
// 点击分类项加载编辑信息
$('.category-header').off('click').on('click', function (e) {
if (!$(e.target).closest('.add-child').length) {
var id = $(this).closest('.category-item').data('id');
that.loadCategoryInfo(id);
// 添加选中效果
$('.category-header').removeClass('active');
$(this).addClass('active');
}
});
// 添加子分类
$('.add-child').off('click').on('click', function (e) {
e.stopPropagation();
var parentId = $(this).closest('.category-item').data('id');
that.showCategoryForm(parentId);
});
};
// 加载分类信息
that.loadCategoryInfo = function (id) {
$.get('/admin/article/cateedit?id=' + id, function (res) {
if (res.code === 0) {
that.showCategoryForm(0, res.data);
}
});
};
// 显示分类表单
that.showCategoryForm = function (parentId = 0, data = null) {
$('#defaultTip').hide();
$('.category-form').show();
// 重置表单
form.val('categoryForm', {
id: data ? data.info.id : '',
name: data ? data.info.name : '',
cid: data ? data.info.cid : parentId,
sort: data ? data.info.sort : 0,
status: data ? data.info.status : 1
});
// 更新父级分类选项
var $select = $('select[name="cid"]');
$select.empty().append('<option value="0">顶级分类</option>');
if (data && data.parentOptions) {
data.parentOptions.forEach(function (item) {
$select.append('<option value="' + item.id + '">' + item.name + '</option>');
});
}
// 更新图片预览
if (data && data.info.image) {
$('#uploadPreview').removeClass('layui-hide').find('img').attr('src', data.info.image);
$('#imageInput').val(data.info.image);
} else {
$('#uploadPreview').addClass('layui-hide').find('img').attr('src', '');
$('#imageInput').val('');
}
// 显示/隐藏删除按钮
$('#deleteBtn')[data ? 'show' : 'hide']();
form.render();
};
// 初始化上传组件
upload.render({
elem: '#uploadImage',
url: '/admin/upload/image',
accept: 'images',
acceptMime: 'image/*',
done: function (res) {
if (res.code === 0) {
$('#uploadPreview').removeClass('layui-hide').find('img').attr('src', res.data.url);
$('#imageInput').val(res.data.url);
layer.msg('上传成功');
} else {
layer.msg('上传失败');
}
}
});
// 监听表单提交
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 });
that.initCategoryList();
} else {
layer.msg(res.msg, { icon: 2 });
}
});
return false;
});
// 监听删除按钮
$('#deleteBtn').on('click', function () {
var id = $('#categoryId').val();
if (!id) return;
layer.confirm('确定要删除该分类吗?', function (index) {
$.post('/admin/article/catedel', { id: id }, function (res) {
if (res.code === 0) {
layer.msg(res.msg, { icon: 1 });
that.initCategoryList();
$('#defaultTip').show();
$('.category-form').hide();
} else {
layer.msg(res.msg, { icon: 2 });
}
});
layer.close(index);
});
});
// 初始化页面
that.initCategoryList();
}); });
}); }
} };
function addchanel(id) { // 初始化
layer.open({ categoryManager.init();
type: 2,
title: '添加子栏目', // 新增分类
shadeClose: true, function add() {
shade: 0.8, categoryManager.showCategoryForm();
area: ['800px', '600px'],
content: '<?php echo url("article/cateadd"); ?>?cid=' + id
});
} }
// 刷新列表
function refresh() { function refresh() {
window.location.reload(); categoryManager.initCategoryList();
} }
</script> </script>

View File

@ -1,4 +1,4 @@
<?php /*a:4:{s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\index\index.php";i:1746865108;s:64:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\component\header.php";i:1747361734;s:62:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\component\main.php";i:1747033370;s:64:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\component\footer.php";i:1747360756;}*/ ?> <?php /*a:4:{s:59:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\index\index.php";i:1746865108;s:64:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\component\header.php";i:1747361734;s:62:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\component\main.php";i:1747362104;s:64:"E:\Demos\DemoOwns\PHP\yunzer\app\index\view\component\footer.php";i:1747360756;}*/ ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@ -397,7 +397,7 @@
<div class="module-header"> <div class="module-header">
<div> <div>
<div class="ModuleTitle_titleWrapper"> <div class="ModuleTitle_titleWrapper">
<h3 class="ModuleTitle_title">技术文章</h3> <h3 class="ModuleTitle_title">技术文章11</h3>
<div class="tab-container"> <div class="tab-container">
<div class="tab-header"> <div class="tab-header">
<div class="tab-item active" data-tab="all">全部</div> <div class="tab-item active" data-tab="all">全部</div>