推送更新

This commit is contained in:
李志强 2025-05-29 17:33:17 +08:00
parent 46e5333864
commit 47cfb7dcaf
5 changed files with 517 additions and 0 deletions

View File

@ -9,6 +9,7 @@ use app\admin\model\AdminSysMenu;
use app\admin\model\AdminUserGroup;
use app\admin\model\AdminUser;
use app\admin\model\Banner;
use app\admin\model\ContentPush;
class YunzeradminController extends Base
@ -451,4 +452,147 @@ class YunzeradminController extends Base
}
return json(['code' => 1, 'msg' => '请求方法无效']);
}
//内容推送
public function contentpush()
{
return View::fetch();
}
// 内容推送列表
public function contentpushlist()
{
if (Request::isGet()) {
$page = intval(input('post.page', 1));
$limit = intval(input('post.limit', 10));
$query = ContentPush::where('delete_time', null)
->field('id, title, type, status, sort, create_time, update_time');
// 获取总记录数
$count = $query->count();
// 获取分页数据
$lists = $query->order(['sort DESC', 'id DESC'])
->page($page, $limit)
->select()
->toArray();
// 处理数据
foreach ($lists as &$item) {
$item['create_time'] = is_numeric($item['create_time']) ? date('Y-m-d H:i:s', $item['create_time']) : $item['create_time'];
$item['update_time'] = is_numeric($item['update_time']) ? date('Y-m-d H:i:s', $item['update_time']) : $item['update_time'];
}
return json([
'code' => 0,
'msg' => '',
'count' => $count,
'data' => $lists
]);
}
return json(['code' => 1, 'msg' => '请求方法无效']);
}
// 添加内容推送
public function contentpushadd()
{
if (Request::isPost()) {
$data = [
'title' => input('post.title'),
'content' => input('post.content'),
'image' => input('post.image'),
'url' => input('post.url'),
'type' => input('post.type', 1),
'status' => input('post.status', 1),
'sort' => input('post.sort', 0),
'create_time' => time()
];
$res = ContentPush::insert($data);
if (!$res) {
Log::record('添加内容推送', 0, '添加内容推送失败', '内容推送管理');
return json(['code' => 1, 'msg' => '添加内容推送失败']);
}
Log::record('添加内容推送', 1, '', '内容推送管理');
return json(['code' => 0, 'msg' => '添加成功']);
}
return json(['code' => 1, 'msg' => '请求方法无效']);
}
// 编辑内容推送
public function contentpushedit()
{
if (Request::isPost()) {
$id = input('post.id');
if (empty($id)) {
Log::record('编辑内容推送', 0, 'ID不能为空', '内容推送管理');
return json(['code' => 1, 'msg' => 'ID不能为空']);
}
$data = [
'title' => input('post.title'),
'content' => input('post.content'),
'image' => input('post.image'),
'url' => input('post.url'),
'type' => input('post.type', 1),
'status' => input('post.status', 1),
'sort' => input('post.sort', 0),
'update_time' => time()
];
$res = ContentPush::where('id', $id)->update($data);
if ($res === false) {
Log::record('编辑内容推送', 0, '更新内容推送失败', '内容推送管理');
return json(['code' => 1, 'msg' => '更新内容推送失败']);
}
Log::record('编辑内容推送', 1, '', '内容推送管理');
return json(['code' => 0, 'msg' => '更新成功']);
}
return json(['code' => 1, 'msg' => '请求方法无效']);
}
// 删除内容推送
public function contentpushdel()
{
if (Request::isPost()) {
$id = input('post.id');
if (empty($id)) {
Log::record('删除内容推送', 0, 'ID不能为空', '内容推送管理');
return json(['code' => 1, 'msg' => 'ID不能为空']);
}
$res = ContentPush::where('id', $id)->update(['delete_time' => time()]);
if (!$res) {
Log::record('删除内容推送', 0, '删除内容推送失败', '内容推送管理');
return json(['code' => 1, 'msg' => '删除内容推送失败']);
}
Log::record('删除内容推送', 1, '', '内容推送管理');
return json(['code' => 0, 'msg' => '删除成功']);
}
return json(['code' => 1, 'msg' => '请求方法无效']);
}
// 修改内容推送状态
public function contentpushstatus()
{
if (Request::isPost()) {
$id = input('post.id');
$status = input('post.status');
if (empty($id)) {
Log::record('修改内容推送状态', 0, 'ID不能为空', '内容推送管理');
return json(['code' => 1, 'msg' => 'ID不能为空']);
}
$res = ContentPush::where('id', $id)->update(['status' => $status]);
if ($res === false) {
Log::record('修改内容推送状态', 0, '更新状态失败', '内容推送管理');
return json(['code' => 1, 'msg' => '更新状态失败']);
}
Log::record('修改内容推送状态', 1, '', '内容推送管理');
return json(['code' => 0, 'msg' => '更新成功']);
}
return json(['code' => 1, 'msg' => '请求方法无效']);
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace app\admin\model;
use think\Model;
class ContentPush extends Model
{
protected $name = 'content_push';
// 自动写入时间戳
protected $autoWriteTimestamp = true;
// 定义时间戳字段名
protected $createTime = 'create_time';
protected $updateTime = 'update_time';
protected $deleteTime = 'delete_time';
}

View File

@ -0,0 +1,135 @@
{include file="public/header" /}
<div class="config-container">
<!-- 页面头部样式 -->
<div class="config-header" style="display: flex;flex-direction: column;flex-wrap: wrap;align-items: flex-start;">
<div class="maintitle">
<i class="layui-icon layui-icon-notice"></i>
<span>内容推送列表</span>
</div>
<div style="display: flex;align-items: flex-start;flex-direction: column;gap: 15px;margin-bottom: 10px;">
<div>
<button class="layui-btn layui-bg-blue" onclick="add()">
<i class="layui-icon layui-icon-add-1"></i>添加推送
</button>
<button type="button" class="layui-btn layui-btn-primary layui-border-blue" onclick="refresh()">
<i class="layui-icon layui-icon-refresh"></i>刷新
</button>
</div>
</div>
</div>
<table id="contentPushTable" lay-filter="contentPushTable"></table>
</div>
<script type="text/javascript">
layui.use(['table', 'layer'], function () {
var table = layui.table;
var layer = layui.layer;
var $ = layui.jquery;
// 初始化表格
table.render({
elem: '#contentPushTable',
url: '{$config["admin_route"]}yunzeradmin/contentpushlist',
page: true,
cols: [[
{field: 'id', title: 'ID', width: 80, sort: true},
{field: 'title', title: '标题', width: 200},
{field: 'type', title: '类型', width: 100, templet: function(d){
return d.type == 1 ? '普通推送' : '重要推送';
}},
{field: 'status', title: '状态', width: 100, templet: function(d){
return d.status == 1 ?
'<span class="layui-badge layui-bg-green">启用</span>' :
'<span class="layui-badge">禁用</span>';
}},
{field: 'sort', title: '排序', width: 100, sort: true},
{field: 'create_time', title: '创建时间', width: 180},
{title: '操作', width: 200, toolbar: '#tableBar', fixed: 'right'}
]],
limit: 10,
limits: [10, 20, 30, 50]
});
// 监听工具条
table.on('tool(contentPushTable)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
edit(data.id);
} else if(obj.event === 'del'){
del(data.id);
} else if(obj.event === 'status'){
changeStatus(data.id, data.status);
}
});
});
// 添加
function add() {
layer.open({
type: 2,
title: '添加内容推送',
shade: 0.3,
area: ['800px', '600px'],
content: "{$config['admin_route']}yunzeradmin/contentpushadd"
});
}
// 编辑
function edit(id) {
layer.open({
type: 2,
title: '编辑内容推送',
shade: 0.3,
area: ['800px', '600px'],
content: "{$config['admin_route']}yunzeradmin/contentpushedit?id=" + id
});
}
// 删除
function del(id) {
layer.confirm('确定要删除这条推送吗?', {
icon: 3,
btn: ['确定', '取消']
}, function () {
$.post("{$config['admin_route']}yunzeradmin/contentpushdel", { 'id': id }, function (res) {
if (res.code > 0) {
layer.msg(res.msg, { icon: 2 });
} else {
layer.msg(res.msg, { icon: 1 });
layui.table.reload('contentPushTable');
}
}, 'json');
});
}
// 修改状态
function changeStatus(id, status) {
var newStatus = status == 1 ? 0 : 1;
$.post("{$config['admin_route']}yunzeradmin/contentpushstatus", {
'id': id,
'status': newStatus
}, function (res) {
if (res.code > 0) {
layer.msg(res.msg, { icon: 2 });
} else {
layer.msg(res.msg, { icon: 1 });
layui.table.reload('contentPushTable');
}
}, 'json');
}
// 刷新列表
function refresh() {
layui.table.reload('contentPushTable');
}
</script>
<!-- 表格操作列模板 -->
<script type="text/html" id="tableBar">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="status">状态</a>
</script>
{include file="public/tail" /}

View File

@ -0,0 +1,113 @@
{include file="public/header" /}
<div class="config-container">
<form class="layui-form" action="{$config['admin_route']}yunzeradmin/contentpushsave" method="post" lay-filter="contentPushForm">
<div class="layui-form-item">
<label class="layui-form-label">推送标题</label>
<div class="layui-input-block">
<input type="text" name="title" required lay-verify="required" placeholder="请输入推送标题" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">推送内容</label>
<div class="layui-input-block">
<textarea name="content" placeholder="请输入推送内容" class="layui-textarea" required lay-verify="required"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">推送图片</label>
<div class="layui-input-block">
<input type="text" name="image" id="image" placeholder="请上传推送图片" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn" id="uploadImage">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">跳转链接</label>
<div class="layui-input-block">
<input type="text" name="url" placeholder="请输入跳转链接" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">推送类型</label>
<div class="layui-input-block">
<input type="radio" name="type" value="1" title="普通推送" checked>
<input type="radio" name="type" value="2" title="重要推送">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="1" title="启用" checked>
<input type="radio" name="status" value="0" title="禁用">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input type="number" name="sort" value="0" placeholder="请输入排序值" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="contentPushForm">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script type="text/javascript">
layui.use(['form', 'upload', 'layer'], function(){
var form = layui.form;
var upload = layui.upload;
var layer = layui.layer;
var $ = layui.jquery;
// 图片上传
upload.render({
elem: '#uploadImage',
url: '{$config["admin_route"]}yunzeradmin/upload',
accept: 'images',
acceptMime: 'image/*',
done: function(res){
if(res.code == 0){
$('#image').val(res.data.src);
layer.msg('上传成功');
} else {
layer.msg('上传失败');
}
}
});
// 表单提交
form.on('submit(contentPushForm)', function(data){
$.ajax({
url: data.form.action,
type: 'POST',
data: data.field,
success: function(res){
if(res.code == 0){
layer.msg(res.msg, {icon: 1}, function(){
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
parent.layui.table.reload('contentPushTable');
});
} else {
layer.msg(res.msg, {icon: 2});
}
}
});
return false;
});
});
</script>
{include file="public/tail" /}

View File

@ -0,0 +1,108 @@
{include file="public/header" /}
<div class="config-container">
<form class="layui-form" action="{$config['admin_route']}yunzeradmin/contentpushsave" method="post" lay-filter="contentPushForm">
<input type="hidden" name="id" value="{$info.id}">
<div class="layui-form-item">
<label class="layui-form-label">推送标题</label>
<div class="layui-input-block">
<input type="text" name="title" value="{$info.title}" required lay-verify="required" placeholder="请输入推送标题" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">推送内容</label>
<div class="layui-input-block">
<textarea name="content" placeholder="请输入推送内容" class="layui-textarea" required lay-verify="required">{$info.content}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">推送图片</label>
<div class="layui-input-block">
<input type="text" name="image" id="image" value="{$info.image}" placeholder="请上传推送图片" autocomplete="off" class="layui-input">
<button type="button" class="layui-btn" id="uploadImage">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">跳转链接</label>
<div class="layui-input-block">
<input type="text" name="url" value="{$info.url}" placeholder="请输入跳转链接" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">推送类型</label>
<div class="layui-input-block">
<input type="radio" name="type" value="1" title="普通推送" {if $info.type==1}checked{/if}>
<input type="radio" name="type" value="2" title="重要推送" {if $info.type==2}checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="radio" name="status" value="1" title="启用" {if $info.status==1}checked{/if}>
<input type="radio" name="status" value="0" title="禁用" {if $info.status==0}checked{/if}>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="contentPushForm">保存</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script type="text/javascript">
layui.use(['form', 'upload', 'layer'], function(){
var form = layui.form;
var upload = layui.upload;
var layer = layui.layer;
var $ = layui.jquery;
// 图片上传
upload.render({
elem: '#uploadImage',
url: '{$config["admin_route"]}yunzeradmin/upload',
accept: 'images',
acceptMime: 'image/*',
done: function(res){
if(res.code == 0){
$('#image').val(res.data.src);
layer.msg('上传成功');
} else {
layer.msg('上传失败');
}
}
});
// 表单提交
form.on('submit(contentPushForm)', function(data){
$.ajax({
url: data.form.action,
type: 'POST',
data: data.field,
success: function(res){
if(res.code == 0){
layer.msg(res.msg, {icon: 1}, function(){
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
parent.layui.table.reload('contentPushTable');
});
} else {
layer.msg(res.msg, {icon: 2});
}
}
});
return false;
});
});
</script>
{include file="public/tail" /}