Jelajahi Sumber

Merge branch 'wangzq-yy' into stable

zqwang 1 tahun lalu
induk
melakukan
51fe5cf2bc

+ 39 - 0
modules/Common/Services/BaseService.php

@@ -0,0 +1,39 @@
+<?php
+/**
+ *
+ * @file:BaseService.php
+ * @Date: 2023/6/7
+ * @Time: 14:28
+ */
+
+
+namespace Modules\Common\Services;
+
+use Catch\Exceptions\FailedException;
+
+class BaseService
+{
+    public static function getMiniProgramType()
+    {
+        return [
+            ['value' => 1, 'name' => "微信小程序"],
+            ['value' => 2, 'name' => "抖音小程序"],
+        ];
+    }
+
+    public static function getNavPagesType()
+    {
+        return [
+            ['value' => 1, 'name' => "排行榜"],
+            ['value' => 2, 'name' => "最新"],
+        ];
+    }
+
+    protected static function throwErrMsg($msg, $code = "")
+    {
+        if ($code) {
+            throw  new FailedException($msg, $code);
+        }
+        throw  new FailedException($msg);
+    }
+}

+ 67 - 0
modules/Operation/Http/Controllers/BannerController.php

@@ -0,0 +1,67 @@
+<?php
+/**
+ *
+ * @file:BannerController.php
+ * @Date: 2023/6/7
+ * @Time: 14:04
+ */
+
+
+namespace Modules\Operation\Http\Controllers;
+
+use Catch\Base\CatchController;
+use Catch\Exceptions\FailedException;
+use Illuminate\Http\Request;
+use Modules\Operation\Http\Requests\BannerRequest;
+use Modules\Operation\Service\BannerService;
+
+class BannerController extends CatchController
+{
+
+    /**
+     *  轮播图类列表
+     * name: list
+     */
+    public function list(Request $request)
+    {
+        $param  = $request->all();
+        return BannerService::getBannerLists($param);
+    }
+    /*
+     * 添加
+     */
+    public function add(BannerRequest $request){
+        $param = $request->all();
+        return BannerService::addBanner($param);
+    }
+
+    /*
+     * 编辑
+     */
+    public function edit($id,BannerRequest $request)
+    {
+        return BannerService::updateBanner($id,$request->all());
+    }
+
+    /*
+     *  更新状态
+     */
+    public function updateStatus($id,Request $request)
+    {
+        if (!$request->has('status')){
+            throw  new FailedException("参数错误");
+        }
+        $status = $request->input('status');
+        if (!in_array($status,[1,0])){
+            throw  new FailedException("状态值不正确");
+        }
+        return BannerService::updateBanner($id,['status' => $status]);
+    }
+
+    /*
+     *  删除
+     */
+    public function del($id){
+        return BannerService::delBannerById($id);
+    }
+}

+ 71 - 0
modules/Operation/Http/Controllers/ChannelController.php

@@ -0,0 +1,71 @@
+<?php
+/**
+ *
+ * @file:ChannelController.php
+ * @Date: 2023/6/8
+ * @Time: 11:16
+ */
+
+
+namespace Modules\Operation\Http\Controllers;
+
+use Catch\Base\CatchController;
+use Catch\Exceptions\FailedException;
+use Illuminate\Contracts\Pagination\LengthAwarePaginator;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Http\Request;
+use Modules\Operation\Http\Requests\AddChannelRequest;
+use Modules\Operation\Service\ChannelServic;
+
+class ChannelController extends CatchController
+{
+    /**
+     *   频道列表
+     * name: list
+     * @param Request $request
+     * @return LengthAwarePaginator|Builder[]|Collection
+     * date 2023/06/08 14:03
+     */
+    public function list(Request $request)
+    {
+        $param = $request->all();
+        return ChannelServic::ChannelList($param);
+    }
+
+    /**
+     *  编辑
+     * name: add
+     * @param AddChannelRequest $request
+     * @return string|void
+     * date 2023/06/08 15:18
+     */
+    public function add(AddChannelRequest $request)
+    {
+        $param = $request->validated();
+        return ChannelServic::addChannel($param);
+    }
+
+    /*
+    *  更新状态
+    */
+    public function enableStatus($id)
+    {
+        if ($id <  1){
+            throw  new  FailedException("id不正确");
+        }
+        return ChannelServic::enableChannel($id);
+    }
+
+
+    public function setting($id,Request $request){
+        if ($id <  1){
+            throw  new  FailedException("id不正确");
+        }
+        if(!$request->has('duanjus')){
+            throw  new  FailedException("配置项必填");
+        }
+        $set = $request->input('duanjus', []);
+        return ChannelServic::setChannel($id,$set);
+    }
+}

+ 63 - 0
modules/Operation/Http/Requests/AddChannelRequest.php

@@ -0,0 +1,63 @@
+<?php
+/**
+ *
+ * @file:AddChannelRequest.php
+ * @Date: 2023/6/8
+ * @Time: 14:50
+ */
+
+
+namespace Modules\Operation\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+use Modules\Operation\Service\ChannelServic;
+
+class AddChannelRequest extends FormRequest
+{
+
+    public function rules(): array
+    {
+        return [
+            'status' => 'required|in:0,1',
+            'type' => [
+                'required',
+                'Integer',
+                "gt:0",
+                function ($attribute, $value, $fail) {
+                    $types = array_column(ChannelServic::getNavPagesType(),'value');
+                    if (!in_array($value,$types)) {
+                        $fail("频道类型不正确");
+                    }
+                },
+            ],
+            'miniprogram_type' => [
+                'required',
+                'Integer',
+                "gt:0",
+                function ($attribute, $value, $fail) {
+                    $types = array_column(ChannelServic::getNavPagesType(),'value');
+                    if (!in_array($value,$types)) {
+                        $fail("小程序类型不正确");
+                    }
+                },
+            ],
+
+
+        ];
+    }
+
+    /**
+     * messages
+     *
+     * @return string[]
+     */
+    public function messages(): array
+    {
+        return [
+            'type' => '频道类型不正确',
+            'miniprogram_type' => '小程序类型不正确',
+            'status' => '状态值不正确',
+        ];
+    }
+
+}

+ 67 - 0
modules/Operation/Http/Requests/BannerRequest.php

@@ -0,0 +1,67 @@
+<?php
+/**
+ *
+ * @file:BannerRequest.php
+ * @Date: 2023/6/7
+ * @Time: 14:54
+ */
+
+
+namespace Modules\Operation\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\DB;
+use Modules\OrderRefund\Models\OrdersRefundVerify;
+
+class BannerRequest extends FormRequest
+{
+
+    /**
+     * rules
+     *
+     * @return array
+     */
+    public function rules(): array
+    {
+        return [
+            'video_id' => [
+                'required',
+                'Integer',
+                "gt:0",
+                function ($attribute, $value, $fail) {
+                    $has = DB::table('videos')->where('id', $value)->first();
+                    if (empty($has)) {
+                        $fail("剧集不不正确");
+                    }
+                    if ($has->shelf_type != 2){
+                        $fail("短剧未上架");
+                    }
+                }
+            ],
+            'title' => ['required'] ,
+            'miniprogram_type' => ['required','Integer',"in:1,2"] ,
+            'status' => ['required','Integer',"in:0,1"] ,
+            "sort" =>  ['Integer',"gte:0"],
+            'img_url'=>[
+                'required'
+            ]
+        ];
+    }
+
+    /**
+     * messages
+     *
+     * @return string[]
+     */
+    public function messages(): array
+    {
+        return [
+            'video_id' => '请选择短剧',
+            'title' => '名称必填',
+            'miniprogram_type' => '小程序类型不正确',
+            'img_url' => '请上传图片',
+            'status' => '状态值不正确',
+        ];
+    }
+
+}

+ 8 - 7
modules/Operation/Installer.php

@@ -1,8 +1,9 @@
 <?php
 
-namespace Modules\Video;
+namespace Modules\Operation;
 
 use Catch\Support\Module\Installer as ModuleInstaller;
+use Modules\Operation\Providers\OperationServiceProvider;
 use Modules\Video\Providers\VideoServiceProvider;
 
 class Installer extends ModuleInstaller
@@ -11,12 +12,12 @@ class Installer extends ModuleInstaller
     {
         // TODO: Implement info() method.
         return [
-            'title' => '视频管理',
-            'name' => 'video',
-            'path' => 'video',
-            'keywords' => '视频管理',
-            'description' => '视频管理模块',
-            'provider' => VideoServiceProvider::class
+            'title' => '运营管理',
+            'name' => 'operation',
+            'path' => 'operation',
+            'keywords' => '运营管理',
+            'description' => '运营管理模块',
+            'provider' => OperationServiceProvider::class,
         ];
     }
 

+ 17 - 0
modules/Operation/Models/DuanJuBanner.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace Modules\Operation\Models;
+
+
+
+use Modules\Common\Models\BaseModel;
+
+class DuanJuBanner extends BaseModel
+{
+    protected $table = 'duanju_banner';
+
+    protected $fillable = [
+        'id', 'title', 'video_id','miniprogram_type', 'sort','gender', 'img_url', 'status', 'created_at', 'updated_at',
+    ];
+
+}

+ 16 - 0
modules/Operation/Models/NavPages.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace Modules\Operation\Models;
+
+use Modules\Common\Models\BaseModel;
+
+
+class NavPages extends BaseModel
+{
+    protected $table = 'nav_pages';
+
+    protected $fillable = [
+        'id', 'type', 'status', 'duanjus', 'created_at', 'updated_at', 'miniprogram_type',
+    ];
+    protected  $casts = ['duanjus' =>  'array'];
+}

+ 137 - 0
modules/Operation/Service/BannerService.php

@@ -0,0 +1,137 @@
+<?php
+/**
+ *
+ * @file:BannerService.php
+ * @Date: 2023/6/7
+ * @Time: 14:29
+ */
+
+
+namespace Modules\Operation\Service;
+
+use Illuminate\Support\Facades\DB;
+use Modules\Common\Services\BaseService;
+use Modules\Operation\Models\DuanJuBanner;
+
+class BannerService extends BaseService
+{
+
+    /**
+     *  轮播图列表
+     * name: getBannerLists
+     * @param array $param
+     * date 2023/06/07 14:40
+     */
+    public static function getBannerLists(array $param)
+    {
+        $isAll = getProp($param,'is_all',false);
+        $list = self::getQuerySql($param)->orderBy('sort','desc')->orderBy('status','desc')->orderBy('id','desc');
+
+        if ($isAll){
+             $list =  $list->get();
+        }else{
+           $list = $list->paginate(getProp($param,'limit',15));
+        }
+        if (!$list->isEmpty()){
+            $types = self::getMiniProgramType();
+            $types = array_column($types,null,'value');
+            $videoIds = array_unique(array_column($list->items(),'video_id'));
+            $videoInfo = DB::table('videos')->whereIn('id',$videoIds)->select('id','name','cover_image')->get();
+
+            if ($videoInfo){
+                $videoInfo  = json_decode(json_encode($videoInfo),true);
+
+                $videoInfo = array_column($videoInfo,null,'id');
+            }else{
+                $videoInfo = [];
+            }
+
+            foreach ($list as $value){
+                $value->miniprogram_type_text = $types[$value->miniprogram_type]['name'] ?? "-";
+                $value->videoInfo = $videoInfo[$value->video_id] ?? [];
+            }
+        }
+        return $list;
+    }
+
+    /**
+     *  查询构建
+     * name: getQuery
+     * @param array $param
+     * date 2023/06/07 14:41
+     */
+    private static function getQuerySql(array $param)
+    {
+        $sql = DuanJuBanner::query();
+
+        if (getProp($param,'title')){
+            $sql->where("title","like","%{$param['title']}%");
+        }
+        if (getProp($param,'miniprogram_type')){
+            $sql->where("miniprogram_type",$param['miniprogram_type']);
+        }
+        return $sql;
+    }
+
+    /**
+     *  添加轮播图
+     * name: addBanner
+     * @param array $param
+     * date 2023/06/07 15:53
+     */
+    public static function addBanner(array $param)
+    {
+
+        $res = DuanJuBanner::create($param);
+        if ($res){
+            return "操作成功";
+        }
+        self::throwErrMsg("添加失败");
+    }
+
+    /**
+     *  更新banner
+     * name: updateBanner
+     * @param $id
+     * @param $param
+     * date 2023/06/08 09:55
+     */
+    public static function updateBanner($id, $param)
+    {
+        // 禁用检测
+       if( $param['status'] != 1){
+           $type = getProp($param,'miniprogram_type');
+           if (empty($type)){
+               $type = DuanJuBanner::where('id',$id)->value('miniprogram_type');
+           }
+           $other = DuanJuBanner::where('id','<>',$id)->where('miniprogram_type',$type)->where('status',1)->value('id');
+           if (empty($other)){
+               self::throwErrMsg("此类型小程序应最少保障一张可用轮播图");
+           }
+       }
+
+       $res = DuanJuBanner::where('id',$id)->update($param);
+       if ($res){
+           return "操作成功";
+       }
+        self::throwErrMsg("操作失败");
+    }
+
+    /*
+     * 删除
+     */
+    public static function delBannerById($id)
+    {
+        $info = DuanJuBanner::where('id',$id)->first();
+       if (is_empty($info)){
+           return  "操作成功";
+       }
+
+        $other = DuanJuBanner::where('id','<>',$id)->where('miniprogram_type',$info->miniprogram_type)->where('status',1)->value('id');
+        if (empty($other)){
+            self::throwErrMsg("此类型小程序应最少保障一张可用轮播图");
+        }
+        DuanJuBanner::where('id',$id)->delete();
+        return "操作成功";
+    }
+}

+ 93 - 0
modules/Operation/Service/ChannelServic.php

@@ -0,0 +1,93 @@
+<?php
+/**
+ *
+ * @file:Channel.php
+ * @Date: 2023/6/8
+ * @Time: 11:17
+ */
+
+
+namespace Modules\Operation\Service;
+
+use Modules\Common\Services\BaseService;
+use Modules\Operation\Models\NavPages;
+
+class ChannelServic extends BaseService
+{
+
+    public static function ChannelList($param)
+    {
+        $sql = self::getQuerySql($param);
+        $isAll = getProp($param,'is_all',false);
+        if ($isAll){
+            $list = $sql->get();
+        }else{
+            $list = $sql->paginate(getProp($param,'limit',15));
+        }
+        if (!$list->isEmpty()){
+            $type = array_column(self::getNavPagesType(),null,'value');
+            $minParamType = array_column(self::getMiniProgramType(),null,'value');
+            foreach ($list as  $value){
+                $value->type_txt = $type[$value->type]['name'] ?? "-";
+                $value->miniprogram_type_text = $minParamType[$value->miniprogram_type]['name'] ?? "-";
+                $value->duanjus = collect($value->duanjus)->sortBy('sort');
+            }
+        }
+        return $list;
+    }
+
+    public static function getQuerySql($param)
+    {
+        $sql = NavPages::query()->orderBy('status','desc')->orderBy('id','desc');
+        if (getProp($param,'type')){
+            $sql->where('type',$param['type']);
+        }
+        if (getProp($param,'miniprogram_type')){
+            $sql->where("miniprogram_type",$param['miniprogram_type']);
+        }
+        return $sql;
+    }
+
+    /**
+     *  添加
+     * name: addChannel
+     * @param mixed $param
+     * @return string|void
+     * date 2023/06/08 15:11
+     */
+    public static function addChannel(mixed $param)
+    {
+        $res = NavPages::create($param);
+        if ($res){
+            if ($param['status'] == 1){
+                NavPages::where('id','<>',$res->id)->where('type',$param['type'])->where('miniprogram_type',$param['miniprogram_type'])->update(['status' => 0]);
+            }
+            return "操作成功";
+        }
+        self::throwErrMsg("添加失败");
+    }
+
+    public static function enableChannel($id)
+    {
+        $info = NavPages::where('id',$id)->first();
+        if(is_empty($info)){
+            self::throwErrMsg("频道配置不存在");
+        }
+        NavPages::where('type',$info->type)->where('miniprogram_type',$info->miniprogram_type)->update(['status'=>0]);
+        NavPages::where('id',$id)->update(['status'=>1]);
+        return "操作成功";
+    }
+
+    public static function setChannel($id, array $set)
+    {
+        $info = NavPages::where('id',$id)->first();
+        if(is_empty($info)){
+            self::throwErrMsg("频道配置不存在");
+        }
+        $res = NavPages::where('id',$id)->update(['duanjus' => $set]);
+        if ($res){
+            return "操作成功";
+        }
+        self::throwErrMsg("操作失败");
+    }
+}

+ 29 - 0
modules/Operation/routes/route.php

@@ -10,5 +10,34 @@ Route::prefix('operationManage')->group(function () {
         Route::post('setConfig', [FirstPageController::class, 'setConfig']);
         Route::get('list', [FirstPageController::class, 'list']);
     });
+
+
 });
 
+Route::prefix('operation')->group(function () {
+    // 轮播图管理
+    Route::prefix('banner')->group(function () {
+        // 列表
+        Route::any('list',[\Modules\Operation\Http\Controllers\BannerController::class,'list']);
+        // 添加
+        Route::post('add',[\Modules\Operation\Http\Controllers\BannerController::class,'add']);
+        // 编辑
+        Route::post('edit/{id}',[\Modules\Operation\Http\Controllers\BannerController::class,'edit']);
+        // 删除
+        Route::post('del/{id}',[\Modules\Operation\Http\Controllers\BannerController::class,'del']);
+        // 快速状态
+        Route::post('editStatus/{id}',[\Modules\Operation\Http\Controllers\BannerController::class,'updateStatus']);
+    });
+
+    // 频道管理
+    Route::prefix('channel')->group(function (){
+        // 列表
+        Route::any('list',[\Modules\Operation\Http\Controllers\ChannelController::class,'list']);
+        // 添加
+        Route::post('add',[\Modules\Operation\Http\Controllers\ChannelController::class,'add']);
+        // 启用
+        Route::post('enableStatus/{id}',[\Modules\Operation\Http\Controllers\ChannelController::class,'enableStatus']);
+        // 配置
+        Route::post("setting/{id}",[\Modules\Operation\Http\Controllers\ChannelController::class,"setting"]);
+    });
+});