Browse Source

feat: 后台上传剧集

xiansin 2 năm trước cách đây
mục cha
commit
de57ea7e97
34 tập tin đã thay đổi với 643 bổ sung62 xóa
  1. 25 0
      mini/api/episode.js
  2. 5 1
      mini/api/index.js
  3. 25 0
      mini/api/setting.js
  4. 33 7
      mini/components/NavBar/index.vue
  5. 23 6
      mini/components/SwiperBox/index.vue
  6. 29 0
      mini/components/TabBar/index.vue
  7. 11 6
      mini/pages/my/index.vue
  8. 7 1
      server/app/Admin/Controllers/Episode/EpisodeController.php
  9. 130 0
      server/app/Admin/Controllers/Episode/EpisodesListController.php
  10. 3 2
      server/app/Admin/Controllers/Program/NavBarController.php
  11. 2 2
      server/app/Admin/Controllers/Program/TabbarController.php
  12. 6 2
      server/app/Admin/routes.php
  13. 25 2
      server/app/Helper/ByteDance.php
  14. 10 0
      server/app/Helper/function.php
  15. 5 1
      server/app/Http/Controllers/V1/AuthController.php
  16. 1 0
      server/app/Http/Controllers/V1/Controller.php
  17. 48 0
      server/app/Http/Controllers/V1/EpisodeController.php
  18. 47 0
      server/app/Http/Controllers/V1/SettingController.php
  19. 9 7
      server/app/Http/Controllers/V1/UserController.php
  20. 7 0
      server/app/Models/Episode.php
  21. 7 1
      server/app/Models/EpisodesList.php
  22. 42 0
      server/app/Models/UserCollect.php
  23. 43 0
      server/app/Models/UserFavorite.php
  24. 17 1
      server/app/Models/UserWatchRecord.php
  25. 2 2
      server/composer.json
  26. 1 1
      server/composer.lock
  27. 32 20
      server/dcat_admin_ide_helper.php
  28. BIN
      server/public/uploads/golf/images/4ff92eec5b95c62a91422a32a56c5f3b.png
  29. BIN
      server/public/uploads/golf/images/b5314304d9611e5dc09c4ab4cf1fa164.png
  30. BIN
      server/public/uploads/golf/images/d18e2b99354db24da488758161436a0a.png
  31. BIN
      server/public/uploads/golf/images/fd4e07abc88a143b8a1df3ced8e9c89a.jpg
  32. 16 0
      server/resources/lang/zh/episodes-list.php
  33. 14 0
      server/resources/lang/zh_CN/episodes-list.php
  34. 18 0
      server/routes/api.php

+ 25 - 0
mini/api/episode.js

xqd
@@ -0,0 +1,25 @@
+const request = uni.$u.http
+
+export function tabBar() {
+  return request.get(
+    'setting/navBar'
+  )
+}
+
+export async function navBar() {
+  return request.get(
+    'setting/navBar'
+  )
+}
+
+export async function banner() {
+  return request.get(
+    'setting/banner'
+  )
+}
+
+export default {
+  tabBar,
+  navBar,
+  banner
+}

+ 5 - 1
mini/api/index.js

xqd
@@ -1,6 +1,10 @@
 import user from './user/index'
+import setting from './setting'
+import episode from './episode'
 const api = {
-  user
+  user,
+  setting,
+  episode
 }
 
 export default api

+ 25 - 0
mini/api/setting.js

xqd
@@ -0,0 +1,25 @@
+const request = uni.$u.http
+
+export function tabBar() {
+  return request.get(
+    'setting/navBar'
+  )
+}
+
+export async function navBar() {
+  return request.get(
+    'setting/navBar'
+  )
+}
+
+export async function banner() {
+  return request.get(
+    'setting/banner'
+  )
+}
+
+export default {
+  tabBar,
+  navBar,
+  banner
+}

+ 33 - 7
mini/components/NavBar/index.vue

xqd xqd xqd xqd xqd
@@ -6,9 +6,12 @@
       class="item dir-top-wrap cross-center"
       @click="handleRedirect(item)"
     >
-      <view class="icon">
-        <image :src="item.icon" />
-      </view>
+      <view
+        class="icon"
+        :style="{
+          backgroundImage: `url(${item.icon})`
+        }"
+      />
       <text>{{ item.name }}</text>
     </view>
     <!--充值-->
@@ -24,6 +27,13 @@ export default {
   components: { Recharge },
   data() {
     return {
+      types: {
+        1: { href: '/pages/' },
+        2: { href: '/pages/' },
+        3: { href: '/pages/member/index' },
+        4: { href: '/pages/sign/index' },
+        5: { type: 'recharge' }
+      },
       navItem: [
         { icon: '', name: '排行榜', href: '/pages/' },
         { icon: '', name: '最新', href: '/pages/' },
@@ -35,6 +45,9 @@ export default {
     }
   },
   computed: {},
+  created() {
+    this.getData()
+  },
   methods: {
     handleRedirect(item) {
       if (item.type === 'recharge') {
@@ -42,6 +55,18 @@ export default {
       } else if (item.href) {
         this.$u.route(item.href)
       }
+    },
+    getData() {
+      /**
+       * type 1 -排行榜 2 -最新  3 -会员 4 -签到 5 -充值
+       */
+      this.$api.setting.navBar().then(res => {
+        const data = res.data
+        data.forEach(obj => {
+          Object.assign(obj, this.types[obj.type])
+        })
+        this.navItem = data
+      })
     }
   }
 }
@@ -53,10 +78,11 @@ export default {
       flex: 1;
       font-size: 32rpx;
       .icon{
-        image{
-          width: 100rpx;
-          height: 100rpx;
-        }
+        width: 100rpx;
+        height: 100rpx;
+        background-repeat: no-repeat;
+        background-size: 100%;
+        background-position: center;
       }
       text{
         color: #fff;

+ 23 - 6
mini/components/SwiperBox/index.vue

xqd xqd xqd xqd
@@ -1,6 +1,16 @@
 <template>
-  <view class="swiper-box" :style="{height: height}">
+  <view
+    class="swiper-box "
+    :class="{
+      loading:loading,
+      'main-center':loading,
+      'cross-center': loading
+    }"
+    :style="{height: height}"
+  >
+    <u-loading-icon :show="loading" vertical />
     <u-swiper
+      v-if="list.length"
       :list="list"
       :height="height"
       :radius="radius"
@@ -43,11 +53,8 @@ export default {
   },
   data() {
     return {
-      list: [
-        'https://cdn.uviewui.com/uview/swiper/swiper1.png',
-        'https://cdn.uviewui.com/uview/swiper/swiper2.png',
-        'https://cdn.uviewui.com/uview/swiper/swiper3.png'
-      ],
+      loading: true,
+      list: [],
       currentNum: 0
     }
   },
@@ -65,6 +72,12 @@ export default {
       this.currentNum = e.current
     },
     getSwiper() {
+      this.$api.setting.banner().then(res => {
+        this.loading = false
+        res.data.forEach(obj => {
+          this.list.push(obj.image)
+        })
+      })
     }
   }
 }
@@ -73,6 +86,10 @@ export default {
 <style lang="scss" scoped>
   .swiper-box{
     margin: 20rpx 0;
+    border-radius: 8rpx;
+    &.loading{
+      background-color: #1B203C;
+    }
     .indicator {
       display: flex;
       flex-direction: row;

+ 29 - 0
mini/components/TabBar/index.vue

xqd xqd
@@ -26,6 +26,23 @@ export default {
     return {
       color: '#8a8a8a',
       selectedColor: '#6EEBE8',
+      types: {
+        1: {
+          'pagePath': '/pages/index/index',
+          'iconPath': '/static/image/tab/home.png',
+          'selectedIconPath': '/static/image/tab/home-HL.png'
+        },
+        2: {
+          'pagePath': '/pages/trace/index',
+          'iconPath': '/static/image/tab/trace.png',
+          'selectedIconPath': '/static/image/tab/trace-HL.png'
+        },
+        3: {
+          'pagePath': '/pages/my/index',
+          'iconPath': '/static/image/tab/my.png',
+          'selectedIconPath': '/static/image/tab/my-HL.png'
+        }
+      },
       list: [
         {
           'pagePath': '/pages/index/index',
@@ -79,6 +96,18 @@ export default {
       if (active !== this.active) {
         this.$store.dispatch('tab/index', active)
       }
+    },
+    getData() {
+      this.$api.setting.tabBar().then(res => {
+        const data = res.data
+        data.forEach(obj => {
+          Object.assign(obj, this.types[obj.type])
+        })
+
+        console.log('-->data', data)
+
+        this.list = data
+      })
     }
   }
 }

+ 11 - 6
mini/pages/my/index.vue

xqd xqd
@@ -56,6 +56,7 @@
         </view>
         <u-icon name="arrow-right" :color="$colors.infoColor" bold />
       </button>
+      <vedio se />
     </view>
     <!--tab bar-->
     <tab-bar />
@@ -93,12 +94,16 @@ export default {
     },
     handleGetUserInfo() {
       this.$loading('数据刷新中...')
-      const _this = this
-      uni.getUserInfo({
-        success(infoRes) {
-          _this.$api.user.update({ rawData: infoRes.rawData }).then(res => {
-            _this.$hideLoading()
-            _this.$store.dispatch('user/info', res.data)
+      uni.getUserProfile({
+        success: res => {
+          const params = {
+            encryptedData: res.encryptedData,
+            iv: res.iv,
+            signature: res.signature
+          }
+          this.$api.user.update(params).then(res => {
+            this.$hideLoading()
+            this.$store.dispatch('user/info', res.data)
           })
         }
       })

+ 7 - 1
server/app/Admin/Controllers/Episode/EpisodeController.php

xqd xqd
@@ -35,6 +35,12 @@ class EpisodeController extends AdminController
             $grid->column('is_opend')->using(config('global.episode_opend'))->label(['gray', 'primary'])->sortable();
             $grid->column('created_at');
 
+            $grid->actions(function (Grid\Displayers\Actions $actions) {
+                $id = $actions->getKey();
+                // append一个操作
+                $actions->append('<a href="/admin/episodes/'.$id.'/lists"><i class="fa fa-upload"></i> 上传剧集</a>');
+            });
+
             $grid->filter(function (Grid\Filter $filter) {
                 $filter->panel();
                 $filter->like('name')->width(2);
@@ -99,7 +105,7 @@ class EpisodeController extends AdminController
                 ->autoSave(false)
                 ->removable(false)
                 ->width(4)->required();
-            $form->switch('status')->default(1);
+            $form->radio('status')->options(config('global.episode_status'))->default(1);
             $form->switch('is_opend')->default(1);
             $form->number('sort');
             $form->switch('is_vip_watch')->default(1);

+ 130 - 0
server/app/Admin/Controllers/Episode/EpisodesListController.php

xqd
@@ -0,0 +1,130 @@
+<?php
+
+namespace App\Admin\Controllers\Episode;
+
+use App\Models\Episode;
+use App\Models\EpisodesList;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Show;
+use Dcat\Admin\Http\Controllers\AdminController;
+
+class EpisodesListController extends AdminController
+{
+    /* @var Episode $episode*/
+    private $episode;
+
+    protected function title()
+    {
+        return $this->episode->name;
+    }
+
+    protected function content(Content $content, $episodeId = 1)
+    {
+        $this->episode = Episode::find($episodeId);
+        return $content
+            ->translation($this->translation())
+            ->breadcrumb(
+                ['text' => $this->episode->name],
+                ['text' => '剧集上传'],
+            )
+            ->title($this->title())
+            ->description('剧集上传');
+    }
+
+    public function index(Content $content,$episodeId = 0)
+    {
+        return $this->content($content,$episodeId)
+            ->body($this->grid());
+    }
+
+    public function create(Content $content,$episodeId = 0)
+    {
+        return $this->content($content,$episodeId)
+            ->body($this->form());
+    }
+
+    public function store($episodeId = 0)
+    {
+        $this->episode = Episode::find($episodeId);
+        return $this->form()->store();
+    }
+
+    public function edit($id, Content $content, $episodeId = 0)
+    {
+        return $this->content($content,$episodeId)
+            ->body($this->form()->edit($id));
+    }
+
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        return Grid::make(EpisodesList::with(['episode'])->where('episodes_id', $this->episode->id), function (Grid $grid) {
+            $grid->column('id')->sortable();
+            $grid->column('episode.name','剧集名称');
+            $grid->column('sort')->display(function (){
+                return '第'.$this->sort.'集';
+            })->editable();
+            $grid->column('url')->display(function (){
+                return '<video src="'.$this->url.'" width="200" controls></vedio>';
+            });
+
+            $grid->disableViewButton();
+        });
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     *
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        return Show::make($id, new EpisodesList(), function (Show $show) {
+            $show->field('id');
+            $show->field('episodes_id');
+            $show->field('sort');
+            $show->field('url');
+            $show->field('created_at');
+            $show->field('updated_at');
+        });
+    }
+
+
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+
+        return Form::make(new EpisodesList(), function (Form $form)  {
+            $form->display('id');
+            $form->hidden('episodes_id')->value($this->episode->id);
+            $form->number('sort')->min(1);
+            $form->file('url')->chunkSize(1024)->maxSize(1024 * 1024)->saveFullUrl()
+                ->uniqueName()->autoUpload()
+                ->autoSave(false)
+                ->removable(false)
+                ->width(4)->required();;
+
+            $form->display('created_at');
+
+            $form->disableViewButton();
+            $form->disableDeleteButton();
+            $form->disableListButton();
+            $form->disableEditingCheck();
+            $form->disableViewCheck();
+            $form->disableCreatingCheck();
+        });
+    }
+}

+ 3 - 2
server/app/Admin/Controllers/Program/NavBarController.php

xqd
@@ -41,10 +41,11 @@ class NavBarController extends AdminController
         return Form::make(new NavBar(), function (Form $form) {
             $form->display('id');
             $form->text('name');
-            $form->image('icon')->uniqueName()->autoUpload()
+            $form->image('icon')->saveFullUrl()
+                ->uniqueName()->autoUpload()
                 ->autoSave(false)
                 ->removable(false)
-                ->width(4);
+                ->width(4)->required();;
             $form->number('sort');
             $form->switch('status', true);
 

+ 2 - 2
server/app/Admin/Controllers/Program/TabbarController.php

xqd
@@ -41,10 +41,10 @@ class TabbarController extends AdminController
         return Form::make(new Tabbar(), function (Form $form) {
             $form->display('id');
             $form->text('name')->required();
-            $form->image('icon')->uniqueName()->autoUpload()
+            $form->image('icon')->saveFullUrl()->uniqueName()->autoUpload()
                 ->autoSave(false)
                 ->removable(false)
-                ->width(4);
+                ->width(4)->required();;
             $form->number('sort');
             $form->switch('status', true);
 

+ 6 - 2
server/app/Admin/routes.php

xqd xqd
@@ -35,10 +35,14 @@ Route::group([
         'prefix' => 'episodes',
     ],function ($router){
         // 短剧管理 --剧集列表
-        $router->resource('/lists','EpisodeController');
+        /* @var Route $router*/
+        $router->resource('/index','EpisodeController');
         // 短剧管理 --剧集分类
         $router->resource('/category','EpisodesCategoryController');
     });
+    // 短剧管理 --剧集列表
+    $router->resource('episodes/{episodes}/lists','Episode\\EpisodesListController')->shallow();
+
 
     //  订单
     $router->group([
@@ -46,7 +50,7 @@ Route::group([
         'prefix' => 'order',
     ],function ($router){
         // 订单管理 --金币消费记录
-        $router->resource('/consume','UserConsumeRecordController');
+        // $router->resource('/consume','UserConsumeRecordController');
         // 订单管理 --充值记录
         $router->resource('/recharge','UserRechargeRecordController');
         // 订单管理 --用户剧集消费记录

+ 25 - 2
server/app/Helper/ByteDance.php

xqd xqd
@@ -5,8 +5,6 @@ namespace App\Helper;
 use App\Helper\Bytedance\ByteDanceAPI;
 use GuzzleHttp\Client;
 use GuzzleHttp\Exception\GuzzleException;
-use PharIo\Manifest\Email;
-use think\Exception;
 
 class ByteDance
 {
@@ -47,6 +45,31 @@ class ByteDance
         ]);
     }
 
+    /**
+     * @param string $sessionKey
+     * @param string $iv
+     * @param string $encrypted
+     * @return array
+     * @throws \Exception
+     */
+    public function decryptData(string $sessionKey, string $iv, string $encrypted): array
+    {
+
+        $decrypted =  openssl_decrypt(
+            base64_decode($encrypted,true),
+            'AES-128-CBC',
+            base64_decode($sessionKey),
+            OPENSSL_RAW_DATA,
+            base64_decode($iv)
+        );
+        $decrypted = json_decode($decrypted,true);
+        if(empty($decrypted)){
+            throw new \Exception('解密数据错误');
+        }
+
+        return $decrypted;
+    }
+
     /**
      * 校验access token 是否过期
      * @return mixed

+ 10 - 0
server/app/Helper/function.php

xqd
@@ -330,3 +330,13 @@ if (!function_exists('valid_url')) {
     }
 }
 
+if(!function_exists('user')){
+    /**
+     * 获取用户登录信息
+     * @return \Illuminate\Contracts\Auth\Authenticatable|\App\Models\User
+     */
+    function user () {
+        return auth('api')->user();
+    }
+}
+

+ 5 - 1
server/app/Http/Controllers/V1/AuthController.php

xqd xqd xqd
@@ -165,7 +165,7 @@ class AuthController extends Controller
             $code = $request->input('code');
             $anonymousCode = $request->input('anonymousCode');
             $app = $this->getByteDanceFactory();
-            $res = $app->login($code, $anonymousCode);
+            $res = $app::login($code, $anonymousCode);
 
             $openId = $res['openid'];
             $user = User::where('open_id', $openId)->first();
@@ -182,6 +182,9 @@ class AuthController extends Controller
                 $info->save();
 
                 $user = User::where('id', $user->id)->first();
+            }else{
+                $user->remember_token = $res['session_key'];
+                $user->save();
             }
 
             $token = Auth::guard('api')->fromUser($user);
@@ -189,6 +192,7 @@ class AuthController extends Controller
             $data = [
                 'token' => "Bearer " . $token,
                 'user_info' => $user,
+                '$res' =>  $res
             ];
             return $this->success($data);
         } catch (\Exception $e) {

+ 1 - 0
server/app/Http/Controllers/V1/Controller.php

xqd
@@ -61,6 +61,7 @@ class Controller extends BaseController
 
     protected function getByteDanceFactory()
     {
+
         $setting = PayConfig::first();
         return (new ByteDance())->factory([
             'app_id'    => $setting->douyin_app_id,

+ 48 - 0
server/app/Http/Controllers/V1/EpisodeController.php

xqd
@@ -0,0 +1,48 @@
+<?php
+namespace App\Http\Controllers\V1;
+use App\Models\Banner;
+use App\Models\Episode;
+use App\Models\NavBar;
+use App\Models\Tabbar;
+use App\Models\User;
+use App\Models\UserWatchRecord;
+use Carbon\Carbon;
+use Illuminate\Support\Collection;
+
+class EpisodeController extends Controller
+{
+    /**
+     * 推荐
+     */
+    public function recommend()
+    {
+        // 七天内看的随机一条
+        $history = UserWatchRecord::with(['episode'])
+            ->inRandomOrder()
+            ->where('user_id', \user()->id)
+            ->where('created_at','>=', Carbon::now()->subDays(7)->toDateTime())
+            ->first();
+        $limit = 3 - collect($history)->count();
+        $episode = Episode::where('is_opend', 1)->limit($limit)->get()->toArray();
+        dd($episode);
+
+    }
+
+
+    /**
+     * 最新
+     */
+    public function news()
+    {
+
+    }
+
+
+    /**
+     * 排行
+     */
+    public function rank()
+    {
+
+    }
+}

+ 47 - 0
server/app/Http/Controllers/V1/SettingController.php

xqd
@@ -0,0 +1,47 @@
+<?php
+namespace App\Http\Controllers\V1;
+use App\Models\Banner;
+use App\Models\NavBar;
+use App\Models\Tabbar;
+
+class SettingController extends Controller
+{
+    /**
+     * 底部导航
+     */
+    public function tabBar()
+    {
+        $all = Tabbar::select(['name','icon','type'])
+            ->where('status',1)
+            ->orderByDesc('sort')
+            ->get();
+
+        return $this->success($all);
+    }
+
+    /**
+     * 首页顶部分类
+     */
+    public function navBar()
+    {
+        $all = NavBar::select(['name','icon','type'])
+            ->where('status',1)
+            ->orderByDesc('sort')
+            ->get();
+
+        return $this->success($all);
+    }
+
+    /**
+     * 首页顶部分类
+     */
+    public function banner()
+    {
+        $all = Banner::select(['name as title','image'])
+            ->where('status',1)
+            ->orderByDesc('sort')
+            ->get();
+
+        return $this->success($all);
+    }
+}

+ 9 - 7
server/app/Http/Controllers/V1/UserController.php

xqd
@@ -79,15 +79,17 @@ class UserController extends Controller
 
     public function update(Request $request)
     {
-        $data = $request->input('rawData');
-        $data = json_decode($data,true);
+        $req = $request->all();
+        $app = $this->getByteDanceFactory();
         $user = auth('api')->user();
+
+        $decryptedData = $app->decryptData($user->remember_token, $req['iv'], $req['encryptedData']);
         $user = User::with(['info'])->where('id', $user->id)->first();
-        if (isset($data['nickName'])) {
-            $user->nickname = $data['nickName'];
-        }
-        if (isset($data['avatarUrl'])) {
-            $user->avatar = $data['avatarUrl'];
+        if (isset($decryptedData['nickName'])) {
+            $user->nickname = $decryptedData['nickName'];
+            $user->avatar = $decryptedData['avatarUrl'];
+        }else{
+            $user->mobile = $decryptedData['phoneNumber'];
         }
         $user->save();
         return $this->success($user);

+ 7 - 0
server/app/Models/Episode.php

xqd xqd
@@ -50,6 +50,7 @@ use Illuminate\Database\Eloquent\Model;
  * @property-read \App\Models\UserEpisodesRecord|null $userEpisodesRecords
  * @property-read int|null $user_episodes_records_count
  * @method static \Illuminate\Database\Eloquent\Builder|Episode wherePlatform($value)
+ * @property-write mixed $status_text
  */
 class Episode extends Model
 {
@@ -66,6 +67,12 @@ class Episode extends Model
         return $this->belongsTo(EpisodesList::class,'id','episodes_id');
     }
 
+    public function setStatusTextAttribute($value)
+    {
+        $config = config('global.episode_status');
+        $this->attributes['status_text'] = $config[$value]??'未知';
+    }
+
     public function userEpisodesRecords()
     {
         return $this->hasMany(UserEpisodesRecord::class,'episodes_id','id');

+ 7 - 1
server/app/Models/EpisodesList.php

xqd xqd
@@ -30,6 +30,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static \Illuminate\Database\Query\Builder|EpisodesList withTrashed()
  * @method static \Illuminate\Database\Query\Builder|EpisodesList withoutTrashed()
  * @mixin \Eloquent
+ * @property-read \App\Models\Episode|null $episode
  */
 class EpisodesList extends Model
 {
@@ -37,5 +38,10 @@ class EpisodesList extends Model
     use SoftDeletes;
 
     protected $table = 'episodes_lists';
-    
+
+    public function episode()
+    {
+        return $this->belongsTo(Episode::class,'episodes_id','id');
+    }
+
 }

+ 42 - 0
server/app/Models/UserCollect.php

xqd
@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+/**
+ * App\Models\UserCollect
+ *
+ * @property int $id
+ * @property int $user_id user_id
+ * @property int $episode_id 剧集ID
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon|null $deleted_at
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect newQuery()
+ * @method static \Illuminate\Database\Query\Builder|UserCollect onlyTrashed()
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect query()
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect whereDeletedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect whereEpisodeId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserCollect whereUserId($value)
+ * @method static \Illuminate\Database\Query\Builder|UserCollect withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|UserCollect withoutTrashed()
+ * @mixin \Eloquent
+ * @property-read \App\Models\Episode|null $episode
+ */
+class UserCollect extends Model
+{
+    use HasFactory,SoftDeletes;
+    protected $table = 'user_collect';
+
+    public function episode()
+    {
+        return $this->belongsTo(Episode::class,'episode_id','id');
+    }
+}

+ 43 - 0
server/app/Models/UserFavorite.php

xqd
@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+/**
+ * App\Models\UserFavorite
+ *
+ * @property int $id
+ * @property int $user_id user_id
+ * @property int $episode_id 剧集ID
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon|null $deleted_at
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite newQuery()
+ * @method static \Illuminate\Database\Query\Builder|UserFavorite onlyTrashed()
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite query()
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite whereDeletedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite whereEpisodeId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|UserFavorite whereUserId($value)
+ * @method static \Illuminate\Database\Query\Builder|UserFavorite withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|UserFavorite withoutTrashed()
+ * @mixin \Eloquent
+ * @property-read \App\Models\Episode|null $episode
+ */
+class UserFavorite extends Model
+{
+    use HasFactory,SoftDeletes;
+
+    protected $table = 'user_favorite';
+
+    public function episode()
+    {
+        return $this->belongsTo(Episode::class,'episode_id','id');
+    }
+}

+ 17 - 1
server/app/Models/UserWatchRecord.php

xqd xqd
@@ -4,6 +4,7 @@ namespace App\Models;
 
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 /**
  * App\Models\UserWatchRecord
@@ -26,8 +27,23 @@ use Illuminate\Database\Eloquent\Model;
  * @method static \Illuminate\Database\Eloquent\Builder|UserWatchRecord whereUpdatedAt($value)
  * @method static \Illuminate\Database\Eloquent\Builder|UserWatchRecord whereUserId($value)
  * @mixin \Eloquent
+ * @property-read \App\Models\Episode|null $episode
+ * @method static \Illuminate\Database\Query\Builder|UserWatchRecord onlyTrashed()
+ * @method static \Illuminate\Database\Query\Builder|UserWatchRecord withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|UserWatchRecord withoutTrashed()
  */
 class UserWatchRecord extends Model
 {
-    use HasFactory;
+    use HasFactory,SoftDeletes;
+
+    protected function serializeDate(\DateTimeInterface $date)
+    {
+        return $date->format($this->dateFormat ?: 'Y-m-d H:i:s');
+    }
+
+
+    public function episode()
+    {
+        return $this->belongsTo(Episode::class,'id','episode_id');
+    }
 }

+ 2 - 2
server/composer.json

xqd xqd
@@ -6,6 +6,7 @@
     "license": "MIT",
     "require": {
         "php": "^7.3|^8.0",
+        "ext-json": "*",
         "alibabacloud/iot": "^1.8",
         "api-ecosystem-for-laravel/dingo-api": "^v3.1.1",
         "dcat/easy-excel": "^1.0",
@@ -29,8 +30,7 @@
         "socialiteproviders/weixin": "^4.1",
         "stomp-php/stomp-php": "^5.0",
         "tencent/tls-sig-api-v2": "1.0",
-        "tencentcloud/tencentcloud-sdk-php": "^3.0",
-        "ext-json": "*"
+        "tencentcloud/tencentcloud-sdk-php": "^3.0"
     },
     "require-dev": {
         "barryvdh/laravel-ide-helper": "^2.12",

+ 1 - 1
server/composer.lock

xqd
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "ad3ea976110ace9ca36860a8e1a4798c",
+    "content-hash": "2d2e458a1da59e616f87d59326bd802c",
     "packages": [
         {
             "name": "adbario/php-dot-notation",

+ 32 - 20
server/dcat_admin_ide_helper.php

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -70,6 +70,8 @@ namespace Dcat\Admin {
      * @property Grid\Column|Collection failed_at
      * @property Grid\Column|Collection migration
      * @property Grid\Column|Collection batch
+     * @property Grid\Column|Collection category_id
+     * @property Grid\Column|Collection platform
      * @property Grid\Column|Collection cover_img
      * @property Grid\Column|Collection is_opend
      * @property Grid\Column|Collection is_vip_watch
@@ -77,13 +79,11 @@ namespace Dcat\Admin {
      * @property Grid\Column|Collection paid_episodes
      * @property Grid\Column|Collection episodes_price
      * @property Grid\Column|Collection episodes_id
-     * @property Grid\Column|Collection serial
      * @property Grid\Column|Collection answer
      * @property Grid\Column|Collection look_num
      * @property Grid\Column|Collection email
      * @property Grid\Column|Collection token
      * @property Grid\Column|Collection pay_id
-     * @property Grid\Column|Collection store_id
      * @property Grid\Column|Collection pay_type
      * @property Grid\Column|Collection pay_dt
      * @property Grid\Column|Collection order_fee
@@ -110,6 +110,7 @@ namespace Dcat\Admin {
      * @property Grid\Column|Collection abilities
      * @property Grid\Column|Collection last_used_at
      * @property Grid\Column|Collection price
+     * @property Grid\Column|Collection gold
      * @property Grid\Column|Collection gift
      * @property Grid\Column|Collection code
      * @property Grid\Column|Collection parent_code
@@ -117,6 +118,7 @@ namespace Dcat\Admin {
      * @property Grid\Column|Collection logo
      * @property Grid\Column|Collection contact
      * @property Grid\Column|Collection tips
+     * @property Grid\Column|Collection vip_role
      * @property Grid\Column|Collection is_watch_auto_pay
      * @property Grid\Column|Collection recharge_bg_img
      * @property Grid\Column|Collection recharge_button_txt
@@ -127,6 +129,7 @@ namespace Dcat\Admin {
      * @property Grid\Column|Collection verify_key
      * @property Grid\Column|Collection sms_code
      * @property Grid\Column|Collection sms_result
+     * @property Grid\Column|Collection episode_id
      * @property Grid\Column|Collection before
      * @property Grid\Column|Collection change
      * @property Grid\Column|Collection current
@@ -134,25 +137,25 @@ namespace Dcat\Admin {
      * @property Grid\Column|Collection order_id
      * @property Grid\Column|Collection list_id
      * @property Grid\Column|Collection discount
+     * @property Grid\Column|Collection statust
      * @property Grid\Column|Collection content
      * @property Grid\Column|Collection file
      * @property Grid\Column|Collection integral
      * @property Grid\Column|Collection total_integral
-     * @property Grid\Column|Collection platform
      * @property Grid\Column|Collection is_vip
      * @property Grid\Column|Collection start_at
      * @property Grid\Column|Collection end_at
      * @property Grid\Column|Collection opend_at
+     * @property Grid\Column|Collection recharge_id
      * @property Grid\Column|Collection combo_id
+     * @property Grid\Column|Collection desc
      * @property Grid\Column|Collection date
      * @property Grid\Column|Collection award
      * @property Grid\Column|Collection valid_day
-     * @property Grid\Column|Collection episode_id
      * @property Grid\Column|Collection nickname
      * @property Grid\Column|Collection open_id
      * @property Grid\Column|Collection union_id
      * @property Grid\Column|Collection email_verified_at
-     * @property Grid\Column|Collection desc
      *
      * @method Grid\Column|Collection id(string $label = null)
      * @method Grid\Column|Collection name(string $label = null)
@@ -213,6 +216,8 @@ namespace Dcat\Admin {
      * @method Grid\Column|Collection failed_at(string $label = null)
      * @method Grid\Column|Collection migration(string $label = null)
      * @method Grid\Column|Collection batch(string $label = null)
+     * @method Grid\Column|Collection category_id(string $label = null)
+     * @method Grid\Column|Collection platform(string $label = null)
      * @method Grid\Column|Collection cover_img(string $label = null)
      * @method Grid\Column|Collection is_opend(string $label = null)
      * @method Grid\Column|Collection is_vip_watch(string $label = null)
@@ -220,13 +225,11 @@ namespace Dcat\Admin {
      * @method Grid\Column|Collection paid_episodes(string $label = null)
      * @method Grid\Column|Collection episodes_price(string $label = null)
      * @method Grid\Column|Collection episodes_id(string $label = null)
-     * @method Grid\Column|Collection serial(string $label = null)
      * @method Grid\Column|Collection answer(string $label = null)
      * @method Grid\Column|Collection look_num(string $label = null)
      * @method Grid\Column|Collection email(string $label = null)
      * @method Grid\Column|Collection token(string $label = null)
      * @method Grid\Column|Collection pay_id(string $label = null)
-     * @method Grid\Column|Collection store_id(string $label = null)
      * @method Grid\Column|Collection pay_type(string $label = null)
      * @method Grid\Column|Collection pay_dt(string $label = null)
      * @method Grid\Column|Collection order_fee(string $label = null)
@@ -253,6 +256,7 @@ namespace Dcat\Admin {
      * @method Grid\Column|Collection abilities(string $label = null)
      * @method Grid\Column|Collection last_used_at(string $label = null)
      * @method Grid\Column|Collection price(string $label = null)
+     * @method Grid\Column|Collection gold(string $label = null)
      * @method Grid\Column|Collection gift(string $label = null)
      * @method Grid\Column|Collection code(string $label = null)
      * @method Grid\Column|Collection parent_code(string $label = null)
@@ -260,6 +264,7 @@ namespace Dcat\Admin {
      * @method Grid\Column|Collection logo(string $label = null)
      * @method Grid\Column|Collection contact(string $label = null)
      * @method Grid\Column|Collection tips(string $label = null)
+     * @method Grid\Column|Collection vip_role(string $label = null)
      * @method Grid\Column|Collection is_watch_auto_pay(string $label = null)
      * @method Grid\Column|Collection recharge_bg_img(string $label = null)
      * @method Grid\Column|Collection recharge_button_txt(string $label = null)
@@ -270,6 +275,7 @@ namespace Dcat\Admin {
      * @method Grid\Column|Collection verify_key(string $label = null)
      * @method Grid\Column|Collection sms_code(string $label = null)
      * @method Grid\Column|Collection sms_result(string $label = null)
+     * @method Grid\Column|Collection episode_id(string $label = null)
      * @method Grid\Column|Collection before(string $label = null)
      * @method Grid\Column|Collection change(string $label = null)
      * @method Grid\Column|Collection current(string $label = null)
@@ -277,25 +283,25 @@ namespace Dcat\Admin {
      * @method Grid\Column|Collection order_id(string $label = null)
      * @method Grid\Column|Collection list_id(string $label = null)
      * @method Grid\Column|Collection discount(string $label = null)
+     * @method Grid\Column|Collection statust(string $label = null)
      * @method Grid\Column|Collection content(string $label = null)
      * @method Grid\Column|Collection file(string $label = null)
      * @method Grid\Column|Collection integral(string $label = null)
      * @method Grid\Column|Collection total_integral(string $label = null)
-     * @method Grid\Column|Collection platform(string $label = null)
      * @method Grid\Column|Collection is_vip(string $label = null)
      * @method Grid\Column|Collection start_at(string $label = null)
      * @method Grid\Column|Collection end_at(string $label = null)
      * @method Grid\Column|Collection opend_at(string $label = null)
+     * @method Grid\Column|Collection recharge_id(string $label = null)
      * @method Grid\Column|Collection combo_id(string $label = null)
+     * @method Grid\Column|Collection desc(string $label = null)
      * @method Grid\Column|Collection date(string $label = null)
      * @method Grid\Column|Collection award(string $label = null)
      * @method Grid\Column|Collection valid_day(string $label = null)
-     * @method Grid\Column|Collection episode_id(string $label = null)
      * @method Grid\Column|Collection nickname(string $label = null)
      * @method Grid\Column|Collection open_id(string $label = null)
      * @method Grid\Column|Collection union_id(string $label = null)
      * @method Grid\Column|Collection email_verified_at(string $label = null)
-     * @method Grid\Column|Collection desc(string $label = null)
      */
     class Grid {}
 
@@ -361,6 +367,8 @@ namespace Dcat\Admin {
      * @property Show\Field|Collection failed_at
      * @property Show\Field|Collection migration
      * @property Show\Field|Collection batch
+     * @property Show\Field|Collection category_id
+     * @property Show\Field|Collection platform
      * @property Show\Field|Collection cover_img
      * @property Show\Field|Collection is_opend
      * @property Show\Field|Collection is_vip_watch
@@ -368,13 +376,11 @@ namespace Dcat\Admin {
      * @property Show\Field|Collection paid_episodes
      * @property Show\Field|Collection episodes_price
      * @property Show\Field|Collection episodes_id
-     * @property Show\Field|Collection serial
      * @property Show\Field|Collection answer
      * @property Show\Field|Collection look_num
      * @property Show\Field|Collection email
      * @property Show\Field|Collection token
      * @property Show\Field|Collection pay_id
-     * @property Show\Field|Collection store_id
      * @property Show\Field|Collection pay_type
      * @property Show\Field|Collection pay_dt
      * @property Show\Field|Collection order_fee
@@ -401,6 +407,7 @@ namespace Dcat\Admin {
      * @property Show\Field|Collection abilities
      * @property Show\Field|Collection last_used_at
      * @property Show\Field|Collection price
+     * @property Show\Field|Collection gold
      * @property Show\Field|Collection gift
      * @property Show\Field|Collection code
      * @property Show\Field|Collection parent_code
@@ -408,6 +415,7 @@ namespace Dcat\Admin {
      * @property Show\Field|Collection logo
      * @property Show\Field|Collection contact
      * @property Show\Field|Collection tips
+     * @property Show\Field|Collection vip_role
      * @property Show\Field|Collection is_watch_auto_pay
      * @property Show\Field|Collection recharge_bg_img
      * @property Show\Field|Collection recharge_button_txt
@@ -418,6 +426,7 @@ namespace Dcat\Admin {
      * @property Show\Field|Collection verify_key
      * @property Show\Field|Collection sms_code
      * @property Show\Field|Collection sms_result
+     * @property Show\Field|Collection episode_id
      * @property Show\Field|Collection before
      * @property Show\Field|Collection change
      * @property Show\Field|Collection current
@@ -425,25 +434,25 @@ namespace Dcat\Admin {
      * @property Show\Field|Collection order_id
      * @property Show\Field|Collection list_id
      * @property Show\Field|Collection discount
+     * @property Show\Field|Collection statust
      * @property Show\Field|Collection content
      * @property Show\Field|Collection file
      * @property Show\Field|Collection integral
      * @property Show\Field|Collection total_integral
-     * @property Show\Field|Collection platform
      * @property Show\Field|Collection is_vip
      * @property Show\Field|Collection start_at
      * @property Show\Field|Collection end_at
      * @property Show\Field|Collection opend_at
+     * @property Show\Field|Collection recharge_id
      * @property Show\Field|Collection combo_id
+     * @property Show\Field|Collection desc
      * @property Show\Field|Collection date
      * @property Show\Field|Collection award
      * @property Show\Field|Collection valid_day
-     * @property Show\Field|Collection episode_id
      * @property Show\Field|Collection nickname
      * @property Show\Field|Collection open_id
      * @property Show\Field|Collection union_id
      * @property Show\Field|Collection email_verified_at
-     * @property Show\Field|Collection desc
      *
      * @method Show\Field|Collection id(string $label = null)
      * @method Show\Field|Collection name(string $label = null)
@@ -504,6 +513,8 @@ namespace Dcat\Admin {
      * @method Show\Field|Collection failed_at(string $label = null)
      * @method Show\Field|Collection migration(string $label = null)
      * @method Show\Field|Collection batch(string $label = null)
+     * @method Show\Field|Collection category_id(string $label = null)
+     * @method Show\Field|Collection platform(string $label = null)
      * @method Show\Field|Collection cover_img(string $label = null)
      * @method Show\Field|Collection is_opend(string $label = null)
      * @method Show\Field|Collection is_vip_watch(string $label = null)
@@ -511,13 +522,11 @@ namespace Dcat\Admin {
      * @method Show\Field|Collection paid_episodes(string $label = null)
      * @method Show\Field|Collection episodes_price(string $label = null)
      * @method Show\Field|Collection episodes_id(string $label = null)
-     * @method Show\Field|Collection serial(string $label = null)
      * @method Show\Field|Collection answer(string $label = null)
      * @method Show\Field|Collection look_num(string $label = null)
      * @method Show\Field|Collection email(string $label = null)
      * @method Show\Field|Collection token(string $label = null)
      * @method Show\Field|Collection pay_id(string $label = null)
-     * @method Show\Field|Collection store_id(string $label = null)
      * @method Show\Field|Collection pay_type(string $label = null)
      * @method Show\Field|Collection pay_dt(string $label = null)
      * @method Show\Field|Collection order_fee(string $label = null)
@@ -544,6 +553,7 @@ namespace Dcat\Admin {
      * @method Show\Field|Collection abilities(string $label = null)
      * @method Show\Field|Collection last_used_at(string $label = null)
      * @method Show\Field|Collection price(string $label = null)
+     * @method Show\Field|Collection gold(string $label = null)
      * @method Show\Field|Collection gift(string $label = null)
      * @method Show\Field|Collection code(string $label = null)
      * @method Show\Field|Collection parent_code(string $label = null)
@@ -551,6 +561,7 @@ namespace Dcat\Admin {
      * @method Show\Field|Collection logo(string $label = null)
      * @method Show\Field|Collection contact(string $label = null)
      * @method Show\Field|Collection tips(string $label = null)
+     * @method Show\Field|Collection vip_role(string $label = null)
      * @method Show\Field|Collection is_watch_auto_pay(string $label = null)
      * @method Show\Field|Collection recharge_bg_img(string $label = null)
      * @method Show\Field|Collection recharge_button_txt(string $label = null)
@@ -561,6 +572,7 @@ namespace Dcat\Admin {
      * @method Show\Field|Collection verify_key(string $label = null)
      * @method Show\Field|Collection sms_code(string $label = null)
      * @method Show\Field|Collection sms_result(string $label = null)
+     * @method Show\Field|Collection episode_id(string $label = null)
      * @method Show\Field|Collection before(string $label = null)
      * @method Show\Field|Collection change(string $label = null)
      * @method Show\Field|Collection current(string $label = null)
@@ -568,25 +580,25 @@ namespace Dcat\Admin {
      * @method Show\Field|Collection order_id(string $label = null)
      * @method Show\Field|Collection list_id(string $label = null)
      * @method Show\Field|Collection discount(string $label = null)
+     * @method Show\Field|Collection statust(string $label = null)
      * @method Show\Field|Collection content(string $label = null)
      * @method Show\Field|Collection file(string $label = null)
      * @method Show\Field|Collection integral(string $label = null)
      * @method Show\Field|Collection total_integral(string $label = null)
-     * @method Show\Field|Collection platform(string $label = null)
      * @method Show\Field|Collection is_vip(string $label = null)
      * @method Show\Field|Collection start_at(string $label = null)
      * @method Show\Field|Collection end_at(string $label = null)
      * @method Show\Field|Collection opend_at(string $label = null)
+     * @method Show\Field|Collection recharge_id(string $label = null)
      * @method Show\Field|Collection combo_id(string $label = null)
+     * @method Show\Field|Collection desc(string $label = null)
      * @method Show\Field|Collection date(string $label = null)
      * @method Show\Field|Collection award(string $label = null)
      * @method Show\Field|Collection valid_day(string $label = null)
-     * @method Show\Field|Collection episode_id(string $label = null)
      * @method Show\Field|Collection nickname(string $label = null)
      * @method Show\Field|Collection open_id(string $label = null)
      * @method Show\Field|Collection union_id(string $label = null)
      * @method Show\Field|Collection email_verified_at(string $label = null)
-     * @method Show\Field|Collection desc(string $label = null)
      */
     class Show {}
 

BIN
server/public/uploads/golf/images/4ff92eec5b95c62a91422a32a56c5f3b.png


BIN
server/public/uploads/golf/images/b5314304d9611e5dc09c4ab4cf1fa164.png


BIN
server/public/uploads/golf/images/d18e2b99354db24da488758161436a0a.png


BIN
server/public/uploads/golf/images/fd4e07abc88a143b8a1df3ced8e9c89a.jpg


+ 16 - 0
server/resources/lang/zh/episodes-list.php

xqd
@@ -0,0 +1,16 @@
+<?php
+return [
+    'labels' => [
+        'EpisodesList' => '剧集列表',
+        'episodes-list' => '剧集列表',
+        'episodes' => '剧集',
+        'lists' => '列表',
+    ],
+    'fields' => [
+        'episodes_id' => '剧集ID',
+        'sort' => '排序',
+        'url' => '视频链接',
+    ],
+    'options' => [
+    ],
+];

+ 14 - 0
server/resources/lang/zh_CN/episodes-list.php

xqd
@@ -0,0 +1,14 @@
+<?php 
+return [
+    'labels' => [
+        'EpisodesList' => 'EpisodesList',
+        'episodes-list' => 'EpisodesList',
+    ],
+    'fields' => [
+        'episodes_id' => '剧集ID',
+        'sort' => '第几集',
+        'url' => '视频链接',
+    ],
+    'options' => [
+    ],
+];

+ 18 - 0
server/routes/api.php

xqd xqd
@@ -58,10 +58,12 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\V1'], function ($api)
         'middleware' => ['api.auth', 'throttle:120'],
     ], function ($api) {
 
+        /* @var Dingo\Api\Routing\Router $api*/
         $api->post('auth/logout', 'AuthController@logout');  //退出登录
         $api->post('auth/forget_password', 'AuthController@forgetPassword'); //忘记密码
 
         $api->group(['prefix' => 'user'], function($api){
+            /* @var Dingo\Api\Routing\Router $api*/
             $api->post('h5_bind', 'UserController@h5Bind'); //H5绑定
             $api->post('h5_rebind', 'UserController@h5Rebind'); //H5解绑
             $api->post('mini_program_bind', 'UserController@miniProgramBind'); //微信小程序绑定
@@ -74,6 +76,22 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\V1'], function ($api)
             $api->post('update', 'UserController@update'); //更新用户信息
         });
 
+        // 相关设置
+        $api->group(['prefix' => 'setting'],function ($api){
+            /* @var Dingo\Api\Routing\Router $api*/
+            $api->get('tabBar', 'SettingController@tabBar'); // 底部导航
+            $api->get('navBar', 'SettingController@navBar'); // 首页顶部分类
+            $api->get('banner', 'SettingController@banner'); // banner
+        });
+
+        // 短剧
+        $api->group(['prefix' => 'episode'],function ($api){
+            /* @var Dingo\Api\Routing\Router $api*/
+            $api->get('recommend', 'EpisodeController@recommend'); // 推荐
+            $api->get('news', 'EpisodeController@news'); // 最新
+            $api->get('rank', 'EpisodeController@rank'); // 排行
+        });
+
     });
 
     $api->post('pay/alipay/notify', 'PayController@alipayNotify'); //支付宝支付回调