diff --git a/app/admin/controller/YunzeradminController.php b/app/admin/controller/YunzeradminController.php index bce79c7..b35ea19 100644 --- a/app/admin/controller/YunzeradminController.php +++ b/app/admin/controller/YunzeradminController.php @@ -30,6 +30,8 @@ use app\admin\model\User\UsersGroup; use app\admin\model\Banner; use app\admin\model\ContentPush\ContentPush; use app\admin\model\ContentPush\ContentPushSetting; +use app\admin\model\Resource\Resource; +use app\admin\model\Article\Articles; class YunzeradminController extends Base @@ -685,32 +687,57 @@ class YunzeradminController extends Base public function contentpushlist() { if (Request::isGet()) { - $page = intval(input('post.page', 1)); - $limit = intval(input('post.limit', 10)); + // 获取分页参数 + $page = (int) input('get.page', 1); + $limit = (int) input('get.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) + // 1. 获取 Articles 表(delete_time为空,status=2) + $articles = Articles::where('delete_time', null) + ->where('status', 2) + ->field('id, title, push, create_time') ->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']; + foreach ($articles as &$a) { + $a['type'] = 'article'; + $a['create_time'] = is_numeric($a['create_time']) ? date('Y-m-d H:i:s', $a['create_time']) : $a['create_time']; } + unset($a); + + // 2. 获取 Resource 表(delete_time为空,status=1) + $resources = Resource::where('delete_time', null) + ->where('status', 1) + ->field('id, title, push, create_time') + ->select() + ->toArray(); + foreach ($resources as &$r) { + $r['type'] = 'resource'; + $r['create_time'] = is_numeric($r['create_time']) ? date('Y-m-d H:i:s', $r['create_time']) : $r['create_time']; + } + unset($r); + + // 3. 合并 + $lists = array_merge($articles, $resources); + + // 4. 优先显示push为0的数据,再按create_time倒序排序 + usort($lists, function ($a, $b) { + // push为0的排在前面 + if ($a['push'] != $b['push']) { + return $a['push'] - $b['push']; + } + // push相同则按create_time倒序 + return strtotime($b['create_time']) <=> strtotime($a['create_time']); + }); + + // 5. 分页 + $total = count($lists); + $offset = ($page - 1) * $limit; + $data = array_slice($lists, $offset, $limit); return json([ 'code' => 0, 'msg' => '', - 'count' => $count, - 'data' => $lists + 'count' => $total, + 'data' => $data ]); } return json(['code' => 1, 'msg' => '请求方法无效']); @@ -827,7 +854,7 @@ class YunzeradminController extends Base $limit = intval(input('get.limit', 10)); $query = ContentPushSetting::where('delete_time', null) - ->field('id, title, value, status, sort, create_time'); + ->field('id, title, value, platformType, status, sort, create_time'); $count = $query->count(); @@ -851,6 +878,43 @@ class YunzeradminController extends Base } } + //选择列出推送内容列表 + public function selectpushcontent() + { + $pushcate = strtolower(trim(input('get.pushcate', ''))); + $where = ['push' => 0]; + + $modelMap = [ + 'article' => Articles::class, + 'resource' => Resource::class, + ]; + + if (!isset($modelMap[$pushcate])) { + return json(['code' => 1, 'msg' => '参数错误: pushcate']); + } + + $model = $modelMap[$pushcate]; + + $query = $model::where($where)->field('title,id'); + $count = $query->count(); + $list = $query->order('id', 'desc')->select()->toArray(); + + // 判断是接口请求还是页面请求 + if (request()->isAjax() || request()->isJson()) { + return json([ + 'code' => 0, + 'msg' => '获取成功', + 'count' => $count, + 'data' => $list + ]); + } else { + // 这里传递变量到模板 + return View::fetch('', [ + 'data' => $list + ]); + } + } + //推送配置添加和编辑通用方法 public function contentpushsettingadd() { @@ -1054,11 +1118,92 @@ class YunzeradminController extends Base return json(['code' => 1, 'msg' => '请求方法无效']); } - //获取推送内容Articles和Resources - //https://www.yunzer.cn/index/articles/detail?id=30 - //https://www.yunzer.cn/index/program/index?cateid=2 - //https://www.yunzer.cn/index/game/index?cateid=8 - //https://www.yunzer.cn/index/resources/detail?id=3 + + public function gopush() + { + $platformType = input('post.platformType'); + $urls = input('post.urls/a', []); + + if (empty($platformType)) { + return json(['code' => 1, 'msg' => '平台参数缺失']); + } + if (empty($urls)) { + return json(['code' => 1, 'msg' => '推送内容url为空']); + } + + // 查找推送平台配置 + $setting = ContentPushSetting::where('platformType', $platformType)->find(); + if (!$setting) { + return json(['code' => 1, 'msg' => '未找到该平台的推送配置']); + } + if ($setting['status'] == 0) { + return json(['code' => 1, 'msg' => '该平台推送已禁用']); + } + $api = $setting['value']; + if (empty($api)) { + return json(['code' => 1, 'msg' => '推送API地址未配置']); + } + + // 推送 + $ch = curl_init(); + $options = array( + CURLOPT_URL => $api, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => implode("\n", $urls), // 多行文本,每行一个url + CURLOPT_HTTPHEADER => array('Content-Type: text/plain'), + ); + curl_setopt_array($ch, $options); + $result = curl_exec($ch); + $error = curl_error($ch); + curl_close($ch); + + if ($error) { + return json(['code' => 1, 'msg' => $error, 'result' => $result]); + } + + // 解析推送返回结果 + $resultArr = json_decode($result, true); + + // 判断返回是否有error字段 + if (is_array($resultArr) && isset($resultArr['error'])) { + return json([ + 'code' => 1, + 'msg' => '推送失败: ' . (isset($resultArr['message']) ? $resultArr['message'] : '未知错误'), + 'result' => $resultArr + ]); + } + + // 判断是否有success字段,只有有success字段才认为推送成功 + if (is_array($resultArr) && isset($resultArr['success'])) { + // 推送成功后,更新对应数据的push字段为1 + // 解析urls,分别更新Articles或Resource表 + foreach ($urls as $url) { + // 匹配文章 + if (preg_match('/\/index\/articles\/detail\?id=(\d+)/', $url, $matches)) { + $id = intval($matches[1]); + if ($id > 0) { + Articles::where('id', $id)->update(['push' => 1]); + } + } + // 匹配资源 + elseif (preg_match('/\/index\/resources\/detail\?id=(\d+)/', $url, $matches)) { + $id = intval($matches[1]); + if ($id > 0) { + Resource::where('id', $id)->update(['push' => 1]); + } + } + } + return json(['code' => 0, 'msg' => '推送成功', 'result' => $resultArr]); + } else { + // 没有success字段,视为推送失败,把失败的result反馈给前端 + return json([ + 'code' => 1, + 'msg' => '推送失败', + 'result' => $resultArr !== null ? $resultArr : $result + ]); + } + } } \ No newline at end of file diff --git a/app/admin/view/yunzeradmin/contentpush.php b/app/admin/view/yunzeradmin/contentpush.php index 09c9b64..58d8279 100644 --- a/app/admin/view/yunzeradmin/contentpush.php +++ b/app/admin/view/yunzeradmin/contentpush.php @@ -1,27 +1,30 @@ {include file="public/header" /}
-
-
- - 内容推送列表 -
-
-
- +
+
+ + 内容推送列表 +
+
+
+ - -
-
-
+ 推送配置 + + + +
+
+
-
+
- --> {include file="public/tail" /} \ No newline at end of file diff --git a/app/admin/view/yunzeradmin/contentpushadd.php b/app/admin/view/yunzeradmin/contentpushadd.php index c879de6..4a7dc0e 100644 --- a/app/admin/view/yunzeradmin/contentpushadd.php +++ b/app/admin/view/yunzeradmin/contentpushadd.php @@ -1,26 +1,35 @@ {include file="public/header" /}
-
+ +
- +
- + +
+
+ +
+ +
+
-
- -
-
- -
- -
- -
@@ -32,28 +41,38 @@
-
+ + + -
+ -
+
@@ -64,50 +83,92 @@
- -{include file="public/tail" /} +{include file="public/tail" /} \ No newline at end of file diff --git a/app/admin/view/yunzeradmin/selectpushcontent.php b/app/admin/view/yunzeradmin/selectpushcontent.php new file mode 100644 index 0000000..af55c76 --- /dev/null +++ b/app/admin/view/yunzeradmin/selectpushcontent.php @@ -0,0 +1,29 @@ +{include file="public/header" /} +
+ + + + + + + + + + + + + +
标题
+ + + +
+
+ +{include file="public/tail" /} \ No newline at end of file