kenan 1 年之前
父节点
当前提交
43e7c63854

+ 67 - 0
Modules/Api/Controllers/PostsController.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace Modules\Api\Controllers;
+
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use App\Constants\CommonConstant;
+use App\Model\PostsModel;
+use App\Repositories\Utils\M3u8CacheRepository;
+
+class PostsController extends BaseController
+{
+    public function lists(ValidatorFactoryInterface $validatorFactory)
+    {
+        $inputData = $this->getJsonData();
+        $rules = [
+            'is_hot' => 'nullable|int',
+            'page' => 'nullable|int',
+            'page_size' => 'nullable|int',
+        ];
+
+        $validator = $validatorFactory->make($inputData, $rules);
+        if ($validator->fails()) {
+            // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
+            return json_fail($validator->errors()->first());
+        }
+
+        $page = $inputData['page'] ?? 1;
+        $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
+        if ($pageSize > 100) {
+            $pageSize = CommonConstant::PAGE_SIZE;
+        }
+        $page = format_page($page);
+        $pageSize = intval($pageSize);
+        if ($pageSize <= 0) {
+            $pageSize = CommonConstant::PAGE_SIZE;
+        }
+
+        $columns = ['uid','title', 'content', 'image', 'video_cover_url', 'views','created_at', 'id'];
+        $query = PostsModel::query()->where('status', 1);
+        if (isset($inputData['is_hot']) && $inputData['is_hot'] == 1) {
+            $query = $query->where('is_hot', 1)->orderByDesc('views');
+        }
+
+        $arrData = $query->orderByDesc('created_at')->paginate($pageSize, $columns, 'page', $page);
+
+        $imgInt = 3;
+        foreach($arrData->items() as &$v) {
+            $aImage = explode(',',$v->image);
+            $sImage = '';
+            if (!empty($v->video_cover_url)) {
+                $v->video_cover_url = M3u8CacheRepository::getVideoUrl($v['video_cover_url']);
+                $imgInt = 2;
+            }
+            $v->user->avatar =  M3u8CacheRepository::getImageUrl($v->user->avatar);
+            $v['user'] = $v->user;
+            for ($i = 0; $i < $imgInt; $i++) {
+                $sImage = M3u8CacheRepository::getImageUrl($aImage[$i]);
+            }
+            $v->is_like = $v->likes($this->getUserId())->count();
+            $v->is_favorites = $v->favorites($this->getUserId())->count();
+            $v->comment_count = $v->comments()->count();
+            $v->content = truncateText($v->content, 30);
+            $v->image = $sImage;
+        }
+        return json_success($arrData);
+    }
+}

+ 1 - 1
README.md

@@ -26,7 +26,7 @@
 .env APP_ENV=prod 表示生产环境.(hyperf约定prod)
 1. 【第一次】cp .env.example .env
 2. 【第一次】修改好.env里的配置
-3. 【第一次】mkdir ./runtime && chmod -R 777 ./runtime ./storage
+3. 【第一次】mkdir ./runtime/logs && chmod -R 777 ./runtime ./storage
 4. 【每次】rm -f ./composer.lock
 5. 【每次】composer install -vvv
 

+ 7 - 0
app/Helpers/common.func.php

@@ -669,3 +669,10 @@ function checkPayUrl($payUrl) {
 
     return $payUrl;
 }
+
+function truncateText($text, $max_length = 100, $suffix = '...') {
+    if (mb_strlen($text, 'UTF-8') <= $max_length) {
+        return $text;
+    }
+    return mb_substr($text, 0, $max_length, 'UTF-8') . $suffix;
+}

+ 13 - 0
app/Model/PostCommentsModel.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Model;
+
+class PostCommentsModel extends BaseModel
+{
+    /**
+     * 表名.
+     *zcq
+     * @var string
+     */
+    protected $table = 'post_comments';
+}

+ 13 - 0
app/Model/PostFavoritesModel.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Model;
+
+class PostFavoritesModel extends BaseModel
+{
+    /**
+     * 表名.
+     *zcq
+     * @var string
+     */
+    protected $table = 'post_favorites';
+}

+ 13 - 0
app/Model/PostLikesModel.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Model;
+
+class PostLikesModel extends BaseModel
+{
+    /**
+     * 表名.
+     *zcq
+     * @var string
+     */
+    protected $table = 'post_likes';
+}

+ 37 - 0
app/Model/PostsModel.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Model;
+
+class PostsModel extends BaseModel
+{
+    /**
+     * 表名.
+     *zcq
+     * @var string
+     */
+    protected $table = 'posts';
+
+    public function user()
+    {
+        return $this->hasOne(UserModel::class, 'code', 'uid')->select(['code','nick','avatar']);
+    }
+
+    // 点赞
+    public function likes($uid)
+    {
+        return $this->hasOne(PostLikesModel::class, 'post_id', 'id')->where(['state' => 1, 'uid' => $uid]);
+    }
+
+    // 收藏
+    public function favorites($uid)
+    {
+        return $this->hasOne(PostLikesModel::class, 'post_id', 'id')->where(['state' => 1, 'uid' => $uid]);
+    }
+
+    // 评论
+    public function comments()
+    {
+        return $this->hasOne(PostCommentsModel::class, 'post_id', 'id')->where('state', 1);
+    }
+    
+}

+ 11 - 1
routes/api.php

@@ -357,6 +357,17 @@ Router::addGroup(
             }
         );
 
+        // 帖子
+        Router::addGroup(
+            '/posts',
+            function () use ($namespace) {
+               // 帖子列表
+               Router::post('/lists', $namespace . 'PostsController@lists');
+               // 评论列表
+               
+            }
+        );
+
         // 精华页
         Router::addGroup(
             '/perfect',
@@ -365,7 +376,6 @@ Router::addGroup(
                 Router::post('/home', $namespace . 'PerfectController@home');
                 // 精选首页
                 Router::post('/home/cases', $namespace . 'PerfectController@homeCases');
-                // 分类别名下的视频分页(有缓存)
                 Router::post('/video/pages/category', $namespace . 'PerfectController@videoPagesByCategoryName');
             }
         );

文件差异内容过多而无法显示
+ 19627 - 0
storage/sql/video_2025-04-11.sql


部分文件因为文件数量过多而无法显示