Просмотр исходного кода

优化后的获取网站所有文章接口;获取商品分类-商品栏目排序问题;封装处理文章的路由问题-扩展到栏目能够得到对应的路由

15313670163 1 неделя назад
Родитель
Сommit
46fafb41e1
1 измененных файлов с 280 добавлено и 232 удалено
  1. 280 232
      app/JsonRpc/NewsService.php

+ 280 - 232
app/JsonRpc/NewsService.php

@@ -1439,214 +1439,256 @@ class NewsService implements NewsServiceInterface
         return Result::success($category);
     }
     /**
-     * 模块新闻加强plus版
-     * @param array $data
-     * @return array
+     * 优化后的获取网站所有文章接口
+     * 
+     * @param array $data 请求数据
+     * @return array 处理结果
      */
     public function getWebsiteAllArticle(array $data): array
     {
-        // 修正传入的字符串,将单引号替换为双引号
-        $input['id'] = $data['id'];
-        $input['website_id'] = $data['website_id'];
-        // 将 JSON 字符串转换为 PHP 数组
-        $data = json_decode($input['id'], true);
-        // 使用 array_map 处理每个元素
-        $result = array_map(function ($item) use ($input) {
-            // 检查parent元素是否存在且不是undefined
-            if (isset($item['parent']) && $item['parent'] != 'undefined' && $item['parent'] != "") {
-                $count = explode(',', $item['parent']);
-                if (count($count) != 3) {
-                    return Result::error("父级栏目:缺少必需参数错误", 0);
-                }
-                list($parentCatId, $parentImgNum, $parentTextNum) = explode(',', $item['parent']);
-                $website = [
-                    'website_id' => $input['website_id'],
-                ];
-                // 查询栏目名称
-                $categroy = WebsiteCategory::where('category_id', $parentCatId)->where($website)->first(['alias', 'category_id', 'aLIas_pinyin', 'type']);
-                // 查询图片新闻
-                if (isset($parentImgNum) && $parentImgNum != 0 && !empty($categroy)) {
-                    $imgArticles = Article::where('article.status', 1)
-                        ->where(function ($query) use ($parentCatId) {
-                            $query->whereRaw("JSON_CONTAINS(cat_arr_id, '\"$parentCatId\"')")
-                                ->orWhereRaw("JSON_CONTAINS(cat_arr_id, '$parentCatId')");
-                        })
-                        ->where(function ($query) use ($website) {
-                            $query->where(function ($subQuery) use ($website) {
-                                $subQuery->whereRaw("JSON_CONTAINS(ignore_ids, '" . intval($website['website_id']) . "') = 0")
-                                    ->orWhereNull("ignore_ids");
-                            });
-                        })
-                        ->where('imgurl', '!=', '')
-                        ->leftJoin('website_category', function ($join) use ($website) {
-                            $join->on('article.catid', '=', 'website_category.category_id')
-                                ->where('website_category.website_id', '=', $website['website_id']);
-                        })
-                        ->select(
-                            'article.id',
-                            'article.title',
-                            'article.imgurl',
-                            'article.author',
-                            'article.updated_at',
-                            'article.introduce',
-                            'article.islink',
-                            'article.linkurl',
-                            'article.copyfrom',
-                            'article.cat_arr_id',
-                            'article.catid',
-                            'website_category.alias as category_name',
-                        )
-                        ->orderBy('updated_at', 'desc')
-                        ->limit($parentImgNum)
-                        ->get();
-                    //调取封装路由的方法,处理新闻路由   
-                    if (!empty($imgArticles)) {
-                        $imgArticles = $this->processArticles($imgArticles, $website);
+        try {
+            // 解析输入数据
+            $input = [
+                'id' => $data['id'] ?? '',
+                'website_id' => $data['website_id'] ?? 0
+            ];
+            
+            // 验证必要参数
+            if (empty($input['website_id'])) {
+                return Result::error("缺少网站ID参数", 0);
+            }
+            
+            // 将 JSON 字符串转换为 PHP 数组
+            $items = json_decode($input['id'], true);
+            
+            if (json_last_error() !== JSON_ERROR_NONE || !is_array($items)) {
+                return Result::error("无效的JSON格式", 0);
+            }
+            
+            // 提取所有需要查询的分类ID
+            $parentCatIds = [];
+            $childCatIds = [];
+            
+            foreach ($items as $item) {
+                if (isset($item['parent']) && $item['parent'] && $item['parent'] !== 'undefined') {
+                    $parts = explode(',', $item['parent']);
+                    if (count($parts) === 3) {
+                        $parentCatIds[] = $parts[0];
                     }
                 }
-                // 查询文字新闻
-                if (isset($parentTextNum) && $parentTextNum != 0 && !empty($categroy)) {
-                    $textArticles = [];
-                    $textArticles = Article::where('article.status', 1)
-                        ->where(function ($query) use ($parentCatId) {
-                            $query->whereRaw("JSON_CONTAINS(cat_arr_id, '\"$parentCatId\"')")
-                                ->orWhereRaw("JSON_CONTAINS(cat_arr_id, '$parentCatId')");
-                        })
-                        ->where(function ($query) use ($website) {
-                            $query->where(function ($subQuery) use ($website) {
-                                $subQuery->whereRaw("JSON_CONTAINS(ignore_ids, '" . intval($website['website_id']) . "') = 0")
-                                    ->orWhereNull("ignore_ids");
-                            });
-                        })
-                        ->leftJoin('website_category', function ($join) use ($website) {
-                            $join->on('article.catid', '=', 'website_category.category_id')
-                                ->where('website_category.website_id', '=', $website['website_id']);
-                        })
-                        ->select(
-                            'article.id',
-                            'article.title',
-                            'article.author',
-                            'article.updated_at',
-                            'article.cat_arr_id',
-                            'article.introduce',
-                            'article.islink',
-                            'article.linkurl',
-                            'article.copyfrom',
-                            'article.catid',
-                            'website_category.alias as category_name',
-                        )
-                        ->orderBy('updated_at', 'desc')
-                        ->limit($parentTextNum)
-                        ->get();
-                    if (!empty($textArticles)) {
-                        $textArticles = $this->processArticles($textArticles, $website);
+                
+                if (isset($item['child']) && $item['child'] && $item['child'] !== 'undefined') {
+                    $parts = explode(',', $item['child']);
+                    if (count($parts) === 3) {
+                        $childCatIds[] = $parts[0];
                     }
                 }
             }
-            $resultItem = [
-                'alias' =>  $categroy ? $categroy->alias : null,
-                'category_id' =>  $categroy ? $categroy->category_id : null,
-                'pinyin' =>  $categroy ? $categroy->aLIas_pinyin : null,
-                'imgnum' => $imgArticles ?? [],
-                'textnum' => $textArticles ?? [],
-            ];
-            // 子级栏目
-            if (isset($item['child']) && $item['child'] != 'undefined' && $item['child'] != "") {
-                $count = explode(',', $item['child']);
-                if (count($count) != 3) {
-                    return Result::error("子级栏目:缺少必需参数错误", 0);
+            
+            // 去重分类ID
+            $parentCatIds = array_unique($parentCatIds);
+            $childCatIds = array_unique($childCatIds);
+            
+            // 批量查询分类信息
+            $websiteCondition = ['website_id' => $input['website_id']];
+            $categories = $this->getCategoriesByIds(array_merge($parentCatIds, $childCatIds), $websiteCondition);
+            
+            // 处理每个项目
+            $result = [];
+            foreach ($items as $item) {
+                $resultItem = [
+                    'alias' => null,
+                    'category_id' => null,
+                    'pinyin' => null,
+                    'imgnum' => [],
+                    'textnum' => [],
+                    'child' => []
+                ];
+                
+                // 处理父级栏目
+                if (isset($item['parent']) && $item['parent'] && $item['parent'] !== 'undefined') {
+                    $parts = explode(',', $item['parent']);
+                    
+                    if (count($parts) !== 3) {
+                        return Result::error("父级栏目:缺少必需参数错误", 0);
+                    }
+                    
+                    list($parentCatId, $parentImgNum, $parentTextNum) = $parts;
+                    
+                    // 从已查询的分类中获取信息
+                    $category = $categories[$parentCatId] ?? null;
+                    
+                    if ($category) {
+                        $resultItem['alias'] = $category->alias;
+                        $resultItem['category_id'] = $category->category_id;
+                        $resultItem['pinyin'] = $category->alias_pinyin;
+                        
+                        // 查询图片新闻
+                        if ($parentImgNum > 0) {
+                            $resultItem['imgnum'] = $this->getArticles(
+                                $parentCatId, 
+                                $input['website_id'], 
+                                (int) $parentImgNum, 
+                                true
+                            );
+                        }
+                        
+                        // 查询文字新闻
+                        if ($parentTextNum > 0) {
+                            $resultItem['textnum'] = $this->getArticles(
+                                $parentCatId, 
+                                $input['website_id'], 
+                                (int) $parentTextNum, 
+                                false
+                            );
+                        }
+                    }
                 }
-                list($childCatId, $childImgNum, $childTextNum) = explode(',', $item['child']);
-                $childCategory = WebsiteCategory::where($website)
-                    ->where("category_id", $childCatId)
-                    ->whereRaw("JSON_CONTAINS(category_arr_id, '" . intval($childCatId) . "') = 1")
-                    ->first(['alias', 'category_id', 'aLIas_pinyin', 'pid', 'category_arr_id as cat_arr_id']);
-                if (!empty($childCategory)) {
-                    $childCategory = $this->processArticles($childCategory, $website);
-                    // 查询此层级的所有子栏目
-                    $all_childcat = WebsiteCategory::where($website)
-                        ->where("pid", $childCategory['pid'])
-                        // ->whereRaw("JSON_CONTAINS(category_arr_id, '".intval($childCatId)."') = 1")
-                        ->get(['alias', 'category_id', 'aLIas_pinyin', 'pid', 'category_arr_id as cat_arr_id']);
-                    $all_childcat = $this->processArticles($all_childcat, $website);
-                    // 查询子栏目图片新闻
-                    if (isset($childImgNum) && $childImgNum != 0) {
-                        $childImgArticles = Article::where(function ($query) use ($childCatId) {
-                            $query->whereRaw("JSON_CONTAINS(cat_arr_id, '\"$childCatId\"')")
-                                ->orWhereRaw("JSON_CONTAINS(cat_arr_id, '$childCatId')");
-                        })
-                            ->where('status', 1)
-                            ->where(function ($query) use ($website) {
-                                $query->where(function ($subQuery) use ($website) {
-                                    $subQuery->whereRaw("JSON_CONTAINS(ignore_ids, '" . intval($website['website_id']) . "') = 0");
-                                })->orWhereNull("ignore_ids");
-                            })
-                            ->select(
-                                'article.id',
-                                'article.title',
-                                'article.imgurl',
-                                'article.author',
-                                'article.updated_at',
-                                'article.introduce',
-                                'article.islink',
-                                'article.linkurl',
-                                'article.catid',
-                                'article.cat_arr_id',
-                                'article.copyfrom',
-                            )
-                            ->where('imgurl', '!=', '')
-                            ->orderBy('updated_at', 'desc')
-                            ->limit($childImgNum)
-                            ->get();
-                        $childImgArticles = $this->processArticles($childImgArticles, $website);
+                // 处理子级栏目
+                if (isset($item['child']) && $item['child'] && $item['child'] !== 'undefined') {
+                    $parts = explode(',', $item['child']);
+                    
+                    if (count($parts) !== 3) {
+                        return Result::error("子级栏目:缺少必需参数错误", 0);
                     }
-                    // 查询子栏目文字新闻
-                    if (isset($childTextNum) && $childTextNum != 0) {
-                        $childTextArticles = Article::where(function ($query) use ($childCatId) {
-                            $query->whereRaw("JSON_CONTAINS(cat_arr_id, '\"$childCatId\"')")
-                                ->orWhereRaw("JSON_CONTAINS(cat_arr_id, '$childCatId')");
-                        })
-                            ->where('status', 1)
-                            ->where(function ($query) use ($website) {
-                                $query->where(function ($subQuery) use ($website) {
-                                    $subQuery->whereRaw("JSON_CONTAINS(ignore_ids, '" . intval($website['website_id']) . "') = 0");
-                                })->orWhereNull("ignore_ids");
-                            })
-                            ->select(
-                                'article.id',
-                                'article.title',
-                                'article.author',
-                                'article.updated_at',
-                                'article.introduce',
-                                'article.islink',
-                                'article.linkurl',
-                                'article.catid',
-                                'article.cat_arr_id',
-                                'article.copyfrom',
-                            )
-                            ->orderBy('updated_at', 'desc')
-                            ->limit($childTextNum)
-                            ->get();
-                        $childTextArticles = $this->processArticles($childTextArticles, $website);
+                    
+                    list($childCatId, $childImgNum, $childTextNum) = $parts;
+                    
+                    // 从已查询的分类中获取信息
+                    $childCategory = $categories[$childCatId] ?? null;
+                    
+                    if ($childCategory) {
+                        $childData = [
+                            'alias' => $childCategory->alias,
+                            'category_id' => $childCategory->category_id,
+                            'pinyin' => $childCategory->alias_pinyin,
+                            'all_childcat' => [],
+                            'imgnum' => [],
+                            'textnum' => []
+                        ];
+                        // 查询此层级的所有子栏目
+                        $childData['all_childcat'] = $this->getChildCategories(
+                            $childCategory->pid,
+                            $input['website_id']
+                        );
+                        
+                        // 查询子栏目图片新闻
+                        if ($childImgNum > 0) {
+                            $childData['imgnum'] = $this->getArticles(
+                                $childCatId, 
+                                $input['website_id'], 
+                                (int) $childImgNum, 
+                                true
+                            );
+                        }
+                        // 查询子栏目文字新闻
+                        if ($childTextNum > 0) {
+                            $childData['textnum'] = $this->getArticles(
+                                $childCatId, 
+                                $input['website_id'], 
+                                (int) $childTextNum, 
+                                false
+                            );
+                        }
+                        
+                        $resultItem['child'] = $childData;
                     }
                 }
-                $resultItem['child'] = [
-                    'alias' => $childCategory ? $childCategory->alias : null,
-                    'category_id' => $childCategory ? $childCategory->category_id : null,
-                    'pinyin' => $childCategory ? $childCategory->pinyin : null,
-                    'all_childcat' => $all_childcat ?? [],
-                    'imgnum' => $childImgArticles ?? [],
-                    'textnum' => $childTextArticles ?? [],
-                ];
-            } else {
-                $resultItem['child'] = [];
+                
+                $result[] = $resultItem;
             }
-            return $resultItem;
-        }, $data);
-        return Result::success($result);
-        // return Result::success($data);
+            
+            return Result::success($result);
+        } catch (\Exception $e) {
+            return Result::error("处理请求时出错: " . $e->getMessage(), 0);
+        }
     }
-
+    
+    /**
+     * 批量获取分类信息
+     * 
+     * @Cacheable(prefix="categories", value="#{ids}_{website['website_id']}", ttl=3600)
+     */
+    protected function getCategoriesByIds(array $ids, array $website): array
+    {
+        if (empty($ids)) {
+            return [];
+        }
+        
+        $categories = WebsiteCategory::whereIn('category_id', $ids)
+            ->where($website)
+            ->get(['alias', 'category_id', 'alias_pinyin', 'type', 'pid', 'category_arr_id']);
+            
+        $result = [];
+        foreach ($categories as $category) {
+            $result[$category->category_id] = $category;
+        }
+        
+        return $result;
+    }
+    
+    /**
+     * 获取文章列表
+     * 
+     * @Cacheable(prefix="articles", value="#{catId}_{websiteId}_{limit}_{isImage}", ttl=300)
+     */
+    protected function getArticles(int $catId, int $websiteId, int $limit, bool $isImage = false): array
+    {
+        $query = Article::where('article.status', 1)
+            ->where(function($query) use ($catId) {
+                $query->whereRaw("JSON_CONTAINS(cat_arr_id, '\"$catId\"')")
+                    ->orWhereRaw("JSON_CONTAINS(cat_arr_id, '$catId')");
+            })
+            ->where(function ($query) use ($websiteId) {
+                $query->where(function ($subQuery) use ($websiteId) {
+                    $subQuery->whereRaw("JSON_CONTAINS(ignore_ids, '$websiteId') = 0")
+                        ->orWhereNull("ignore_ids");
+                });
+            })
+            ->leftJoin('website_category', function($join) use ($websiteId) {
+                $join->on('article.catid', '=', 'website_category.category_id')
+                    ->where('website_category.website_id', '=', $websiteId);
+            })
+            ->select(
+                'article.id', 'article.title', 'article.imgurl', 'article.author', 'article.updated_at',
+                'article.introduce', 'article.islink', 'article.linkurl', 'article.copyfrom', 'article.cat_arr_id',
+                'article.catid', 'website_category.alias as category_name',
+            )
+            ->orderBy('updated_at', 'desc')
+            ->limit($limit);
+            
+        if ($isImage) {
+            $query->where('imgurl', '!=', '');
+        }
+        
+        $articles = $query->get();
+        
+        // 处理文章路由
+        if (!empty($articles)) {
+            $articles = $this->processArticles($articles, ['website_id' => $websiteId]);
+        }
+        
+        return $articles->toArray();
+    }
+    
+    /**
+     * 获取子分类
+     * 
+     * @Cacheable(prefix="child_categories", value="#{pid}_{websiteId}", ttl=3600)
+     */
+    protected function getChildCategories(int $pid, int $websiteId): array
+    {
+        $categories = WebsiteCategory::where('website_id', $websiteId)
+            ->where("pid", $pid)
+            ->get(['alias', 'category_id', 'alias_pinyin', 'pid', 'category_arr_id']);
+            
+        // 处理分类路由
+        if (!empty($categories)) {
+            $categories = $this->processArticles($categories, ['website_id' => $websiteId]);
+        }
+        
+        return $categories->toArray();
+    }     
     /**
      * 乡村网-获取特殊新闻模块
      * @param array $data
@@ -1951,43 +1993,43 @@ class NewsService implements NewsServiceInterface
      *  */
     public function getWebsiteshopCat(array $data): array
     {
-        $website = $data['website_id'];
-        $category = WebsiteCategory::where('website_id', $website)
-            ->whereRaw("JSON_CONTAINS(category_arr_id, '" . intval($data['id']) . "') = 1")
-            ->orWhereRaw("JSON_CONTAINS(category_arr_id, '\"" . intval($data['id']) . "\"') = 1")
-            ->select('category_id', 'alias', 'aLIas_pinyin', 'pid', 'category_arr_id')
-            ->orderBy('sort')
-            ->get();
-        $cat =  $category->map(function ($item) use ($website) {
-            $cat_arr_id = json_decode($item->category_arr_id, true) ?? [];
-            $pid = $item->pid ?? 0;
-            if (!empty($cat_arr_id) && is_array($cat_arr_id) && $pid != 0) {
-                $pinyin = WebsiteCategory::whereIn('category_id', $cat_arr_id)
-                    ->where('website_id', $website)
-                    ->orderByRaw('FIELD(category_id, ' . implode(',', $cat_arr_id) . ')')
-                    ->get(['aLIas_pinyin'])
-                    ->pluck('aLIas_pinyin')
-                    ->implode('/');
-            } else {
-                $pinyin = $item->aLIas_pinyin ?? '';
-            }
-            $item->pinyin = $pinyin;
-        });
-        if (empty($category)) {
-            return Result::error("栏目查询失败", 0);
-        }
-        $cat_tree = Result::buildMenuTree($category);
-        $web['website_id'] = $website;
-        $goods = Good::where('website_id', $website)
-            ->where('status', 2)
-            ->select('good.id as good_id', 'name', 'imgurl', 'description', 'updated_at', 'catid', 'type_id', 'website_id')
-            ->latest('updated_at')
-            ->offset(($data['page'] - 1) * $data['pageSize'])
-            ->limit($data['pageSize'])
-            ->get();
-        if (!empty($goods)) {
-            if ($goods->count() > 1 && !empty($goods)) {
-                $goods = $this->processGoods($goods, $web);
+        $website = $data['website_id']; 
+        $category = WebsiteCategory::where('website_id', $website) 
+            ->whereRaw("JSON_CONTAINS(category_arr_id, '". intval($data['id']). "') = 1") 
+            ->orWhereRaw("JSON_CONTAINS(category_arr_id, '\"". intval($data['id']). "\"') = 1") 
+            ->select('category_id', 'alias','aLIas_pinyin','pid','category_arr_id' ,'sort') 
+            ->orderBy('sort') 
+            ->get(); 
+        $cat =  $category->map(function ($item) use ($website) { 
+                $cat_arr_id = json_decode($item->category_arr_id, true) ?? []; 
+                $pid = $item->pid?? 0; 
+                if(!empty($cat_arr_id) && is_array($cat_arr_id) && $pid != 0){ 
+                    $pinyin = WebsiteCategory::whereIn('category_id', $cat_arr_id) 
+                        ->where('website_id', $website) 
+                        ->orderByRaw('FIELD(category_id, '. implode(',', $cat_arr_id). ')') 
+                        ->get(['aLIas_pinyin']) 
+                        ->pluck('aLIas_pinyin') 
+                        ->implode('/'); 
+                }else{ 
+                    $pinyin = $item->aLIas_pinyin ?? ''; 
+                } 
+                $item->pinyin = $pinyin; 
+            }); 
+        if(empty($category)){ 
+            return Result::error("栏目查询失败", 0); 
+        } 
+        $cat_tree = Result::buildMenuTree($category); 
+        $web['website_id'] = $website; 
+        $goods = Good::where('website_id', $website) 
+            ->where('status', 2) 
+            ->select('good.id as good_id', 'name','imgurl','description','updated_at','catid','type_id','website_id') 
+            ->latest('updated_at') 
+            ->offset(($data['page']-1)*$data['pageSize']) 
+            ->limit($data['pageSize']) 
+            ->get(); 
+        if(!empty($goods)){
+            if($goods->count() > 1 && !empty($goods)){ 
+                $goods = $this->processGoods($goods, $web); 
             }
         } else {
             $goods = [];
@@ -2113,7 +2155,13 @@ class NewsService implements NewsServiceInterface
         // 检查 $articles 是否为数组或可迭代对象
         if (is_array($articles) || is_iterable($articles) && !empty($articles)) {
             return $articles->map(function ($article) use ($data) {
-                $catid = $article->cat_arr_id ?? '';
+                if(isset($article->cat_arr_id) &&!empty($article->cat_arr_id)){
+                    $catid = $article->cat_arr_id?? '';
+                }
+                if(isset($article->category_arr_id) &&!empty($article->category_arr_id)){
+                    $catid = $article->category_arr_id?? '';
+                }
+                // $catid = $article->cat_arr_id ||  $article->category_arr_id ?? '';
                 $level = json_decode($catid, true);
                 if (!is_array($level)) {
                     return $article;