435 lines
12 KiB
PHP
435 lines
12 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace app\index\controller;
|
||
|
||
use app\index\BaseController;
|
||
use Symfony\Component\VarDumper\VarDumper;
|
||
use think\exception\ValidateException;
|
||
use think\facade\Request;
|
||
use think\facade\Session;
|
||
use think\response\Json;
|
||
use think\db\exception\DbException;
|
||
|
||
use app\model\Articles;
|
||
use app\model\ArticlesCategory;
|
||
|
||
|
||
class NewsCenterController extends BaseController
|
||
{
|
||
/**
|
||
* 根据分类获取文章
|
||
* @param string $category 分类名称
|
||
* @return Json
|
||
*/
|
||
public function getNewsByCategory(string $category): Json
|
||
{
|
||
// 查询分类
|
||
$categoryInfo = ArticlesCategory::where('name', $category)
|
||
->where('delete_time', null)
|
||
->find();
|
||
|
||
if (!$categoryInfo) {
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => [],
|
||
]);
|
||
}
|
||
|
||
// 查询文章
|
||
$articles = Articles::published()
|
||
->where('cate', $categoryInfo['id'])
|
||
->order('publish_date', 'desc')
|
||
->limit(4)
|
||
->select();
|
||
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => $articles,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 获取企业新闻
|
||
* @return Json
|
||
*/
|
||
public function getCompanyNews(): Json
|
||
{
|
||
// 获取分页参数
|
||
$page = Request::param('page', 1);
|
||
$limit = Request::param('limit', 10);
|
||
$page = max(1, intval($page));
|
||
$limit = max(1, min(50, intval($limit))); // 限制每页最多50条
|
||
|
||
// 查询分类
|
||
$categoryInfo = ArticlesCategory::where('name', '企业新闻')
|
||
->where('delete_time', null)
|
||
->find();
|
||
|
||
if (!$categoryInfo) {
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => [],
|
||
'total' => 0,
|
||
'page' => $page,
|
||
'limit' => $limit,
|
||
]);
|
||
}
|
||
|
||
// 查询总数
|
||
$total = Articles::where('cate', $categoryInfo['id'])
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->count();
|
||
|
||
// 查询文章
|
||
$articles = Articles::where('cate', $categoryInfo['id'])
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->order('top', 'desc')
|
||
->order('recommend', 'desc')
|
||
->order('sort', 'desc')
|
||
->order('publish_date', 'desc')
|
||
->page($page, $limit)
|
||
->select();
|
||
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => $articles,
|
||
'total' => $total,
|
||
'page' => $page,
|
||
'limit' => $limit,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 获取金蝶新闻
|
||
* @return Json
|
||
*/
|
||
public function getKingdeeNews(): Json
|
||
{
|
||
// 获取分页参数
|
||
$page = Request::param('page', 1);
|
||
$limit = Request::param('limit', 10);
|
||
$page = max(1, intval($page));
|
||
$limit = max(1, min(50, intval($limit))); // 限制每页最多50条
|
||
|
||
// 查询分类
|
||
$categoryInfo = ArticlesCategory::where('name', '金蝶新闻')
|
||
->where('delete_time', null)
|
||
->find();
|
||
|
||
if (!$categoryInfo) {
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => [],
|
||
'total' => 0,
|
||
'page' => $page,
|
||
'limit' => $limit,
|
||
]);
|
||
}
|
||
|
||
// 查询总数
|
||
$total = Articles::where('cate', $categoryInfo['id'])
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->count();
|
||
|
||
// 查询文章
|
||
$articles = Articles::where('cate', $categoryInfo['id'])
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->order('top', 'desc')
|
||
->order('recommend', 'desc')
|
||
->order('sort', 'desc')
|
||
->order('publish_date', 'desc')
|
||
->page($page, $limit)
|
||
->select();
|
||
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => $articles,
|
||
'total' => $total,
|
||
'page' => $page,
|
||
'limit' => $limit,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 获取技术中心子分类
|
||
* @return Json
|
||
*/
|
||
public function getTechnologyCategories(): Json
|
||
{
|
||
// 获取"技术中心"主分类
|
||
$parentCategory = ArticlesCategory::where('name', '技术中心')
|
||
->where('delete_time', null)
|
||
->find();
|
||
|
||
if (!$parentCategory) {
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'data' => []
|
||
]);
|
||
}
|
||
|
||
// 查找所有子分类
|
||
$subCategories = ArticlesCategory::where('cid', $parentCategory['id'])
|
||
->where('delete_time', null)
|
||
->field('id,name,desc,sort,image')
|
||
->order('sort', 'desc')
|
||
->select();
|
||
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'data' => $subCategories
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 获取技术中心
|
||
* @return Json
|
||
*/
|
||
public function getTechnologyCenter(): Json
|
||
{
|
||
// 1. 分页参数规范化
|
||
$page = max(1, intval(Request::param('page', 1)));
|
||
$limit = max(1, min(50, intval(Request::param('limit', 10))));
|
||
|
||
// 获取分类ID参数(可选)
|
||
$categoryId = Request::param('category_id', null);
|
||
|
||
// 2. 第一步:获取“技术中心”主分类的 id
|
||
$parentCategory = ArticlesCategory::where('name', '技术中心')
|
||
->where('delete_time', null)
|
||
->find();
|
||
|
||
// print_r($parentCategory['id']);
|
||
|
||
if (!$parentCategory) {
|
||
return $this->emptyResponse($page, $limit);
|
||
}
|
||
|
||
// 3. 第二步:查找 cid 等于主分类 id 的所有子分类 id
|
||
$subCategoryQuery = ArticlesCategory::where('cid', $parentCategory['id'])
|
||
->where('delete_time', null);
|
||
|
||
// print_r($subCategoryQuery->select());
|
||
|
||
// 如果指定了分类ID,则只查询该分类
|
||
if ($categoryId) {
|
||
$subCategoryQuery->where('id', $categoryId);
|
||
}
|
||
|
||
$subCategoryIds = $subCategoryQuery->column('id');
|
||
|
||
// print_r($subCategoryIds);
|
||
|
||
if (empty($subCategoryIds)) {
|
||
return $this->emptyResponse($page, $limit);
|
||
}
|
||
|
||
// 5. 第三步:查询 Articles 表,并限定字段
|
||
$articleQuery = Articles::whereIn('cate', $subCategoryIds)
|
||
->where('delete_time', null)
|
||
->where('status', 2);
|
||
|
||
// 获取总数
|
||
$total = (clone $articleQuery)->count();
|
||
|
||
// 获取列表:限定返回 id, title, desc, publish_date, image, likes, views
|
||
$articles = $articleQuery->field('id,title,desc,publish_date,image,likes,views,cate')
|
||
->order([
|
||
'top' => 'desc',
|
||
'recommend' => 'desc',
|
||
'sort' => 'desc',
|
||
'publish_date' => 'desc'
|
||
])
|
||
->page($page, $limit)
|
||
->select();
|
||
|
||
// 如果文章没有image,查询对应分类的image
|
||
$categoryImages = ArticlesCategory::whereIn('id', $subCategoryIds)->column('image', 'id');
|
||
|
||
foreach ($articles as &$article) {
|
||
if (empty($article['image']) && isset($categoryImages[$article['cate']])) {
|
||
$article['image'] = $categoryImages[$article['cate']];
|
||
}
|
||
}
|
||
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => $articles,
|
||
'total' => $total,
|
||
'page' => $page,
|
||
'limit' => $limit,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 统一空返回
|
||
*/
|
||
private function emptyResponse($page, $limit): Json
|
||
{
|
||
return json([
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => [],
|
||
'total' => 0,
|
||
'page' => $page,
|
||
'limit' => $limit,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 获取金蝶新闻详情
|
||
*/
|
||
public function getKingdeeNewsDetail(int $id): Json
|
||
{
|
||
$article = Articles::where('id', $id)
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->field('id,title,cate,image,desc,author,content,publisher,publish_date,views,likes,is_trans,transurl')
|
||
->find();
|
||
|
||
if (!$article) {
|
||
return json(['code' => 404, 'msg' => '文章不存在', 'data' => null]);
|
||
}
|
||
|
||
$cate = (int) $article['cate'];
|
||
|
||
// 转换为数组再处理
|
||
$articleData = $article->toArray();
|
||
// $articleData['catename'] = $this->getCategoryName($cate);
|
||
|
||
// 获取相关文章
|
||
$articleData['relatedArticles'] = $this->getRelatedArticles($id, $cate);
|
||
|
||
// 获取上一篇下一篇
|
||
$articleData['nextPreviousArticles'] = $this->getNextPreviousArticles($id, $cate);
|
||
|
||
// 增加浏览量
|
||
Articles::where('id', $id)->inc('views')->update();
|
||
|
||
return json(['code' => 200, 'msg' => 'success', 'data' => $articleData]);
|
||
}
|
||
|
||
/**
|
||
* 获取企业新闻详情
|
||
*/
|
||
public function getCompanyNewsDetail(int $id): Json
|
||
{
|
||
$article = Articles::where('id', $id)
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->find();
|
||
|
||
if (!$article) {
|
||
return json(['code' => 404, 'msg' => '文章不存在', 'data' => null]);
|
||
}
|
||
|
||
$cate = (int) $article['cate'];
|
||
|
||
// 转换为数组再处理
|
||
$articleData = $article->toArray();
|
||
$articleData['catename'] = $this->getCategoryName($cate);
|
||
|
||
// 获取相关文章
|
||
$articleData['relatedArticles'] = $this->getRelatedArticles($id, $cate);
|
||
|
||
// 获取上一篇下一篇
|
||
$articleData['nextPreviousArticles'] = $this->getNextPreviousArticles($id, $cate);
|
||
|
||
// 增加浏览量
|
||
Articles::where('id', $id)->inc('views')->update();
|
||
|
||
return json(['code' => 200, 'msg' => 'success', 'data' => $articleData]);
|
||
}
|
||
|
||
/**
|
||
* 获取上一篇下一篇
|
||
* @param int $id 文章ID
|
||
* @param int $cate 分类ID
|
||
* @return array
|
||
*/
|
||
private function getNextPreviousArticles(int $id, int $cate): array
|
||
{
|
||
$nextArticle = Articles::where('id', '<', $id)
|
||
->where('cate', $cate)
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->field('id,title')
|
||
->find();
|
||
|
||
$previousArticle = Articles::where('id', '>', $id)
|
||
->where('cate', $cate)
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->field('id,title')
|
||
->find();
|
||
|
||
return [
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'next' => $nextArticle,
|
||
'previous' => $previousArticle,
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 通过分类 ID 获取分类名称
|
||
* @param int $cateId 分类ID
|
||
* @return string
|
||
*/
|
||
private function getCategoryName(int $id): string
|
||
{
|
||
$categoryInfo = ArticlesCategory::where('id', $id)
|
||
->where('delete_time', null)
|
||
->find();
|
||
|
||
if (!$categoryInfo) {
|
||
return '未分类';
|
||
}
|
||
|
||
return $categoryInfo['name'];
|
||
}
|
||
|
||
/**
|
||
* 获取相关文章
|
||
*/
|
||
private function getRelatedArticles(int $id, int $cate): array
|
||
{
|
||
$articles = Articles::where('id', '<>', $id)
|
||
->where('cate', $cate)
|
||
->where('delete_time', null)
|
||
->where('status', 2)
|
||
->order('top', 'desc')
|
||
->order('recommend', 'desc')
|
||
->order('sort', 'desc')
|
||
->order('id', 'desc')
|
||
->limit(5)
|
||
->select();
|
||
|
||
foreach ($articles as &$article) {
|
||
$article['cate'] = $this->getCategoryName($article['cate']);
|
||
}
|
||
|
||
return [
|
||
'code' => 200,
|
||
'msg' => 'success',
|
||
'list' => $articles,
|
||
];
|
||
}
|
||
|
||
}
|