Browse Source

Merge branch 'develop' of http://git.caihongxingqiu.net/rainbow/community-manage into develop

durong 5 years ago
parent
commit
51534c9921
41 changed files with 2186 additions and 67 deletions
  1. 1 0
      .gitignore
  2. 1 1
      .rocketeer/config.php
  3. 1 1
      .rocketeer/scm.php
  4. 83 0
      app/Console/Commands/Downloads.php
  5. 8 2
      app/Console/Kernel.php
  6. 50 9
      app/Helper/helper.php
  7. 26 1
      app/Http/Controllers/ConfigController.php
  8. 67 0
      app/Http/Controllers/DownloadController.php
  9. 228 3
      app/Http/Controllers/Post/PostController.php
  10. 101 0
      app/Http/Controllers/Topic/CategoryController.php
  11. 123 0
      app/Http/Controllers/Topic/TopicController.php
  12. 5 0
      app/Models/Category.php
  13. 10 0
      app/Models/CategoryTopic.php
  14. 16 0
      app/Models/Download.php
  15. 5 0
      app/Models/Topic.php
  16. 143 0
      app/Repositories/CategoryRepository.php
  17. 96 0
      app/Repositories/DownloadRepository.php
  18. 541 9
      app/Repositories/Post/PostRepository.php
  19. 182 0
      app/Repositories/TopicRepository.php
  20. 34 0
      app/Traits/PostTrait.php
  21. 26 0
      app/Traits/UserTrait.php
  22. 31 0
      app/Transformers/CategoryTransformer.php
  23. 34 0
      app/Transformers/DetailCategoryTransformer.php
  24. 36 0
      app/Transformers/DetailTopicTransformer.php
  25. 28 0
      app/Transformers/DownloadTransformer.php
  26. 29 0
      app/Transformers/Post/CommentTransformer.php
  27. 45 0
      app/Transformers/Post/DetailTransformer.php
  28. 26 0
      app/Transformers/Post/LogTransformer.php
  29. 1 0
      app/Transformers/Post/PostTransformer.php
  30. 38 0
      app/Transformers/TopicTransformer.php
  31. 1 0
      bootstrap/app.php
  32. 5 8
      composer.json
  33. 1 1
      database/migrations/2019_06_03_162403_create_table_post_data.php
  34. 55 0
      database/migrations/2019_06_11_095634_create_table_downloads.php
  35. 30 0
      database/migrations/2019_06_11_163708_modify_download_status_to_table_download.php
  36. 1 1
      deploy/nginx/conf.d/app.beta.conf
  37. 1 1
      deploy/nginx/conf.d/app.dev.conf
  38. 5 5
      docker-compose-beta.yml
  39. 4 4
      docker-compose-dev.yml
  40. 7 0
      resources/lang/zh-CN/validation.php
  41. 61 21
      routes/api.php

+ 1 - 0
.gitignore

@@ -6,3 +6,4 @@ Homestead.yaml
 composer.lock
 composer.lock
 /storage/*
 /storage/*
 /config/customer.php
 /config/customer.php
+/public/export/*

+ 1 - 1
.rocketeer/config.php

@@ -7,7 +7,7 @@ return [
     // The name of the application to deploy
     // The name of the application to deploy
     // This will create a folder of the same name in the root directory
     // This will create a folder of the same name in the root directory
     // configured above, so be careful about the characters used
     // configured above, so be careful about the characters used
-    'application_name' => 'order-manage',
+    'application_name' => 'community-manage',
 
 
     // Plugins
     // Plugins
     ////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////

+ 1 - 1
.rocketeer/scm.php

@@ -10,7 +10,7 @@ return [
 
 
     // The SSH/HTTPS address to your repository
     // The SSH/HTTPS address to your repository
     // Example: https://github.com/vendor/website.git
     // Example: https://github.com/vendor/website.git
-    'repository' => 'http://caihongxingqiu:Ch20151002@git.caihongxingqiu.net/rainbow/order-manage.git',
+    'repository' => 'http://caihongxingqiu:Ch20151002@git.caihongxingqiu.net/rainbow/community-manage.git',
 
 
     // The repository credentials : you can leave those empty
     // The repository credentials : you can leave those empty
     // if you're using SSH or if your repository is public
     // if you're using SSH or if your repository is public

+ 83 - 0
app/Console/Commands/Downloads.php

@@ -0,0 +1,83 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/11
+ * Time: 13:39
+ */
+
+namespace App\Console\Commands;
+
+use App\Repositories\Post\PostRepository;
+use Illuminate\Console\Command;
+use App\Models\Download;
+use Illuminate\Support\Carbon;
+
+class Downloads extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'download:download';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '处理下载';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct(Download $download, PostRepository $postRepository)
+    {
+        parent::__construct();
+        $this->download = $download;
+        $this->postRepository = $postRepository;
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $this->line("开始检索生成中下载");
+
+        $fileDir = 'export/';
+        $path = public_path($fileDir);
+        if(!file_exists($path)){
+            mkdir($path, 0775);
+        }
+
+        $download = $this->download->where('download_status', 0)->orderBy('id', 'desc')->first();
+        if(!$download) exit;
+
+        if($download->download_type == 'post'){
+            $filePath = $fileDir .$download->username.'内容-'.Carbon::now()->format('Y-m-d') .'_' .uniqid() .'.csv';
+        }elseif($download->download_type == 'post_waste'){
+            $filePath = $fileDir .$download->username.'回收站内容-'.Carbon::now()->format('Y-m-d') .'_' .uniqid() .'.csv';
+        }else{
+            exit;
+        }
+        $download->download_status = 1;
+        $download->save();
+
+        try {
+            $this->postRepository->download($filePath, $download->download_type, json_decode($download->params, true));
+            $download->url = $filePath;
+            $download->download_status = 2;
+            $download->save();
+        } catch (\Exception $e) {
+            $download->download_status = 3;
+            $download->url = $e->getMessage();
+            $download->save();
+        }
+    }
+}

+ 8 - 2
app/Console/Kernel.php

@@ -3,6 +3,7 @@
 namespace App\Console;
 namespace App\Console;
 
 
 use App\Console\Commands\Apollo;
 use App\Console\Commands\Apollo;
+use App\Console\Commands\Downloads;
 use Illuminate\Console\Scheduling\Schedule;
 use Illuminate\Console\Scheduling\Schedule;
 use Laravel\Lumen\Console\Kernel as ConsoleKernel;
 use Laravel\Lumen\Console\Kernel as ConsoleKernel;
 
 
@@ -14,7 +15,8 @@ class Kernel extends ConsoleKernel
      * @var array
      * @var array
      */
      */
     protected $commands = [
     protected $commands = [
-        Apollo::class
+        Apollo::class,
+        Downloads::class
     ];
     ];
 
 
     /**
     /**
@@ -25,6 +27,10 @@ class Kernel extends ConsoleKernel
      */
      */
     protected function schedule(Schedule $schedule)
     protected function schedule(Schedule $schedule)
     {
     {
-        //
+        $path = storage_path('logs/'.date('Y-m-d').'-schedule.log');
+
+        $schedule->command('download:download')
+            ->everyMinute()
+            ->withoutOverlapping()->appendOutputTo($path);
     }
     }
 }
 }

+ 50 - 9
app/Helper/helper.php

@@ -15,30 +15,71 @@ if ( ! function_exists('config_path'))
     {
     {
         return app()->basePath() . '/config' . ($path ? '/' . $path : $path);
         return app()->basePath() . '/config' . ($path ? '/' . $path : $path);
     }
     }
+}
 
 
-    function subtext($text, $length)
+if (! function_exists('public_path')) {
+    /**
+     * Get the path to the public folder.
+     *
+     * @param  string  $path
+     * @return string
+     */
+    function public_path($path = '')
     {
     {
-        if(mb_strlen($text, 'utf8') > $length) {
-            return mb_substr($text, 0, $length, 'utf8').'...';
-        } else {
-        return $text;
+        return app()->basePath() . '/public' . ($path ? '/' . $path : $path);
     }
     }
 }
 }
+
+function subtext($text, $length)
+{
+    if(mb_strlen($text, 'utf8') > $length) {
+        return mb_substr($text, 0, $length, 'utf8').'...';
+    } else {
+        return $text;
+    }
 }
 }
 
 
-function http($url, $param, $method = 'post')
+
+function http($url, $param, $isCheck = true, $method = 'post')
 {
 {
     try {
     try {
         $client = new \GuzzleHttp\Client();
         $client = new \GuzzleHttp\Client();
         $response = $client->request($method, $url, $param);
         $response = $client->request($method, $url, $param);
         $result = json_decode($response->getBody()->getContents(), true);
         $result = json_decode($response->getBody()->getContents(), true);
-        if ($result['code'] == 0) {
-            return $result['data'];
+        if ($isCheck == true) {
+            if ($result['code'] == 0) {
+                return $result['data'];
+            } else {
+                return [];
+            }
         } else {
         } else {
-            return [];
+            return $result;
         }
         }
+
     } catch (\Exception $exception) {
     } catch (\Exception $exception) {
         return [];
         return [];
     }
     }
+}
+
+
+function generateSign(array $params, $secret_key)
+{
+    unset($params['sign']);
+    // 将删除参数组中所有等值为FALSE的参数(包括:NULL, 空字符串,0, false)
+    $params = array_filter($params);
+
+    // 按照键名对参数数组进行升序排序
+    ksort($params);
 
 
+    // 给参数数组追加密钥,键名为 key, 值为签名配置中配置的 secret_key 的值
+    $params['chxq_key'] = $secret_key;
+    \Illuminate\Support\Facades\Log::debug($params);
+    // 生成 URL-encode 之后的请求字符串
+    $str = http_build_query($params);
+    $str = urldecode($str);
+    \Illuminate\Support\Facades\Log::debug($str);
+    //$str = "address=计算机啊手机壳阿看见手机卡&address_type=1&area_id=2&area_name=西安市&city_id=2&city_name=西安市&contact_mobile
+    //=18458881890&contact_name=刘德华&province_id=1&province_name=陕西省&uid=0&zipcode=1000000";
+    // 将请求字符串使用MD5加密后,再转换成大写,并返回
+    return strtoupper(MD5($str));
 }
 }

+ 26 - 1
app/Http/Controllers/ConfigController.php

@@ -27,6 +27,14 @@ class ConfigController extends Controller
                 'video' => '视频',
                 'video' => '视频',
                 'html' => '富文本',
                 'html' => '富文本',
             ],
             ],
+            //内容排序
+            'sort' => [
+                'praise_count' => '点赞数',
+                'share_count' => '分享数',
+                'pv' => '浏览量',
+                'comment_count' => '评论数',
+                'create_bean' => '彩虹豆数',
+            ],
             //日志类型
             //日志类型
             'log_type' => [
             'log_type' => [
                 'add_data' => '增加数据',
                 'add_data' => '增加数据',
@@ -56,7 +64,24 @@ class ConfigController extends Controller
                 '1' => '是',
                 '1' => '是',
                 '0' => '否',
                 '0' => '否',
             ],
             ],
-
+            //下载类型
+            'download_type' => [
+                'post' => '内容',
+                'post_waste' => '内容回收站',
+            ],
+            //下载状态
+            'download_status' => [
+                '1' => '生成中',
+                '0' => '待处理',
+                '2' => '成功',
+                '3' => '失败',
+            ],
+            'topic_status'=>[
+                'is_suggest'=>'推荐话题',
+                'is_hot'=>'热门话题',
+                'is_open'=>'开启',
+                'is_close'=>'关闭',
+            ]
         ];
         ];
     }
     }
 }
 }

+ 67 - 0
app/Http/Controllers/DownloadController.php

@@ -0,0 +1,67 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/11
+ * Time: 10:39
+ */
+
+namespace App\Http\Controllers;
+
+use App\Repositories\DownloadRepository;
+use App\Transformers\DownloadTransformer;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use League\Fractal\Manager;
+use League\Fractal\Pagination\IlluminatePaginatorAdapter;
+use League\Fractal\Resource\Collection;
+use Illuminate\Validation\Rule;
+
+
+class DownloadController extends Controller
+{
+    public function __construct(DownloadRepository $downloadRepository)
+    {
+        $this->downloadRepository = $downloadRepository;
+    }
+
+    /**
+     * 下载列表
+     */
+    public function index(Request $request)
+    {
+        $productList = $this->downloadRepository->lists($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($productList, new DownloadTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($productList));
+        $data = $fractal->createData($resource)->toArray();
+        $data['extra'] = [
+            'filters' => [
+                'download_type'
+            ],
+            'columns' => [
+                'id',
+                'username',
+                'download_type',
+                'download_status',
+                'url',
+                'created_at'
+            ]
+        ];
+        return $data;
+    }
+
+    /**
+     * 添加下载
+     */
+    public function create(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'download_type' => ['required',Rule::in('post', 'post_waste')],
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->downloadRepository->create($request->all());
+    }
+}

+ 228 - 3
app/Http/Controllers/Post/PostController.php

@@ -9,6 +9,9 @@
 namespace App\Http\Controllers\Post;
 namespace App\Http\Controllers\Post;
 
 
 use App\Repositories\Post\PostRepository;
 use App\Repositories\Post\PostRepository;
+use App\Transformers\Post\CommentTransformer;
+use App\Transformers\Post\DetailTransformer;
+use App\Transformers\Post\LogTransformer;
 use App\Transformers\Post\PostTransformer;
 use App\Transformers\Post\PostTransformer;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Validator;
 use Illuminate\Support\Facades\Validator;
@@ -17,6 +20,7 @@ use Illuminate\Validation\Rule;
 use League\Fractal\Manager;
 use League\Fractal\Manager;
 use League\Fractal\Pagination\IlluminatePaginatorAdapter;
 use League\Fractal\Pagination\IlluminatePaginatorAdapter;
 use League\Fractal\Resource\Collection;
 use League\Fractal\Resource\Collection;
+use League\Fractal\Resource\Item;
 
 
 class PostController extends Controller
 class PostController extends Controller
 {
 {
@@ -59,7 +63,97 @@ class PostController extends Controller
                 'comment_count',
                 'comment_count',
                 'collect_count',
                 'collect_count',
                 'create_bean',
                 'create_bean',
-                'is_suggest'
+                'is_suggest',
+                'is_hide',
+            ]
+        ];
+        return $data;
+    }
+
+    /**
+     * 回收站列表
+     */
+    public function waste(Request $request)
+    {
+        $params = $request->all();
+        $params['waste'] = 1;
+        $productList = $this->postRepository->lists($params);
+        $fractal = new Manager();
+        $resource = new Collection($productList, new PostTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($productList));
+        $data = $fractal->createData($resource)->toArray();
+        $data['extra'] = [
+            'filters' => [
+                'content',
+                'topic_ids',
+                'category_ids',
+                'created_at',
+                'sort'
+            ],
+            'columns' => [
+                'id',
+                'created_at',
+                'uid',
+                'topic',
+                'content',
+                'location',
+                'pv',
+                'praise_count',
+                'share_count',
+                'comment_count',
+                'collect_count',
+                'create_bean',
+                'is_suggest',
+            ]
+        ];
+        return $data;
+    }
+
+    /**
+     * 内容详情
+     */
+    public function detail(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|exists:post'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+
+        $post = $this->postRepository->detail($request->all());
+        return $this->response->item($post, new DetailTransformer());
+    }
+
+    /**
+     * 评论列表
+     */
+    public function commentList(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'post_id' => 'required|exists:post,id'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+
+        $commentList = $this->postRepository->commentList($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($commentList, new CommentTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($commentList));
+        $data = $fractal->createData($resource)->toArray();
+
+        $data['extra'] = [
+            'filters' => [
+
+            ],
+            'columns' => [
+                'id',
+                'parent_id',
+                'uid',
+                'content',
+                'created_at',
+                'is_delete',
             ]
             ]
         ];
         ];
         return $data;
         return $data;
@@ -78,8 +172,8 @@ class PostController extends Controller
             'video' => 'required_if:type,video|string|url',
             'video' => 'required_if:type,video|string|url',
             'topic_ids' => 'required|string|max:64',
             'topic_ids' => 'required|string|max:64',
             'title' => 'nullable|string|max:20',
             'title' => 'nullable|string|max:20',
-            'content' => 'required|string|max:20',
-            'location' => 'required|string',
+            'content' => 'required|string|max:1000',
+            'location' => 'nullable|string|max:20',
             'imgs' => 'required_if:type,image|array|max:9',
             'imgs' => 'required_if:type,image|array|max:9',
             'imgs.*' => 'required|url',
             'imgs.*' => 'required|url',
         ]);
         ]);
@@ -89,4 +183,135 @@ class PostController extends Controller
         return  $this->postRepository->create($request->all());
         return  $this->postRepository->create($request->all());
     }
     }
 
 
+    /**
+     * 评论&回复
+     */
+    public function comment(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'post_id' => 'required|integer',
+            'uid' => 'required|integer',
+            'content' => 'required|string|max:150',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->postRepository->comment($request->all());
+    }
+
+    /**
+     * 增加数据
+     */
+    public function addData(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'post_id' => 'required|exists:post,id',
+            'add_pv' => 'required|integer|min:0',
+            'add_praise_count' => 'required|integer|min:0',
+            'add_collect_count' => 'required|integer|min:0',
+            'add_share_count' => 'required|integer|min:0',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->postRepository->addData($request->all());
+    }
+
+    /**
+     * 推荐内容
+     */
+    public function suggest(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->postRepository->suggest($request->all());
+    }
+
+    /**
+     * 删除内容
+     */
+    public function delete(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->postRepository->delete($request->all());
+    }
+
+    /**
+     * 复原内容
+     */
+    public function restore(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->postRepository->restore($request->all());
+    }
+
+    /**
+     * 删除评论
+     */
+    public function commentDelete(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->postRepository->commentDelete($request->all());
+    }
+
+    /**
+     * 隐藏内容
+     */
+    public function hide(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|integer',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->postRepository->hide($request->all());
+    }
+
+    /**
+     * 日志列表
+     */
+    public function log(Request $request)
+    {
+        $commentList = $this->postRepository->log($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($commentList, new LogTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($commentList));
+        $data = $fractal->createData($resource)->toArray();
+
+        $data['extra'] = [
+            'filters' => [
+                'log_type',
+                'created_at',
+            ],
+            'columns' => [
+                'id',
+                'username',
+                'log_type',
+                'created_at',
+                'content',
+            ]
+        ];
+        return $data;
+    }
+
 }
 }

+ 101 - 0
app/Http/Controllers/Topic/CategoryController.php

@@ -0,0 +1,101 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 17:38
+ */
+
+namespace App\Http\Controllers\Topic;
+
+use App\Repositories\CategoryRepository;
+use App\Transformers\CategoryTransformer;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Validation\Rule;
+use App\Transformers\DetailCategoryTransformer;
+use League\Fractal\Manager;
+use League\Fractal\Pagination\IlluminatePaginatorAdapter;
+use League\Fractal\Resource\Collection;
+use League\Fractal\Resource\Item;
+use App\Http\Controllers\Controller;
+
+class CategoryController extends Controller {
+
+    public function __construct(CategoryRepository $categoryRepository)
+    {
+        $this->categroupRepository = $categoryRepository;
+    }
+    //创建
+    public function create(Request $request){
+      $validator = Validator::make($request->all(), [
+          'name' => 'required|string|max:12',
+          'img' => 'required|url',
+          'desc' => 'required|string|max:100',
+          'topic_ids' => 'string',
+      ]);
+      if ($validator->fails()) {
+          return $this->response->error($validator->errors()->first(), 500);
+      }
+      return  $this->categroupRepository->create($request->all());
+    }
+    //创建
+    public function edit(Request $request){
+        $validator = Validator::make($request->all(), [
+            'id'=>'required|integer|max:12',
+            'name' => 'required|string|max:12',
+            'img' => 'required|url',
+            'desc' => 'required|string|max:100',
+            'topic_ids' => 'string',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->categroupRepository->edit($request->all());
+    }
+    //列表
+    public function index(Request $request){
+        $categroup = $this->categroupRepository->index($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($categroup, new CategoryTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($categroup));
+        $data = $fractal->createData($resource)->toArray();
+        $data['extra'] = [
+            'filters' => [
+                'name',
+            ],
+            'columns' => [
+                'id',
+                'name',
+                'img',
+                'created_at',
+                'is_suggest',
+                'topic_count'
+            ]
+        ];
+        return $data;
+    }
+    public function view(Request $request){
+        $data = $request->only('id');
+        $validator = Validator::make($data, [
+            'id' => 'required|integer|max:12',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        $categroup = $this->categroupRepository->view($data);
+        return $this->response->item($categroup, new DetailCategoryTransformer());
+    }
+    //设置推荐
+    public function isSuggest(Request $request){
+        $data = $request->only('id','is_suggest');
+        $validator = Validator::make($data, [
+            'id' => 'required|integer|max:12',
+            'is_suggest' => ['required',Rule::in(0, 1)],
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->categroupRepository->update($data);
+    }
+}

+ 123 - 0
app/Http/Controllers/Topic/TopicController.php

@@ -0,0 +1,123 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 18:09
+ */
+
+namespace App\Http\Controllers\Topic;
+
+use App\Models\Topic;
+use App\Repositories\CategoryRepository;
+use App\Repositories\TopicRepository;
+use App\Transformers\DetailTopicTransformer;
+use App\Transformers\TopicTransformer;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use League\Fractal\Manager;
+use League\Fractal\Pagination\IlluminatePaginatorAdapter;
+use League\Fractal\Resource\Collection;
+use League\Fractal\Resource\Item;
+use Illuminate\Validation\Rule;
+use App\Http\Controllers\Controller;
+
+
+
+class TopicController extends Controller {
+
+    public function __construct(CategoryRepository $categoryRepository,TopicRepository $topicRepository)
+    {
+        $this->categroupRepository = $categoryRepository;
+        $this->topicRepository = $topicRepository;
+    }
+    //列表
+    public function index(Request $request){
+        $topic= $this->topicRepository->index($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($topic, new TopicTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($topic));
+        $data = $fractal->createData($resource)->toArray();
+        $data['extra'] = [
+            'filters' => [
+                'name',
+                'topic_status',
+            ],
+            'columns' => [
+                'id',
+                'name',
+                'category_list',
+                'img',
+                'post_count',
+                'follow_count',
+                'page_count',
+                'created_at',
+                'is_suggest',
+                'is_hot',
+                'is_open',
+            ]
+        ];
+        return $data;
+    }
+    //详情
+    public function view(Request $request){
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|integer|max:12',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        $topic = $this->topicRepository->view($request->all());
+        return $this->response->item($topic, new DetailTopicTransformer());
+    }
+    //添加
+    public function create(Request $request){
+        $validator = Validator::make($request->all(), [
+            'name' => 'required|string|max:12',
+            'img' => 'required|url',
+            'desc' => 'required|string|max:100',
+            'category_ids' => 'required|string',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->topicRepository->create($request->all());
+    }
+    //编辑
+    public function edit(Request $request){
+        $validator = Validator::make($request->all(), [
+            'id'=>'integer|required|max:12',
+            'name' => 'required|string|max:12',
+            'img' => 'required|url',
+            'desc' => 'required|string|max:100',
+            'category_ids' => 'required|string',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->topicRepository->edit($request->all());
+    }
+    //开启
+    public function isOpen(Request $request) {
+        $validator = Validator::make($request->all(), [
+            'id' => 'integer|required|max:12',
+            'is_open' => ['required', Rule::in(0, 1)]
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->topicRepository->update($request->all());
+    }
+    //开启
+    public function setStatus(Request $request) {
+        $validator = Validator::make($request->all(), [
+            'id' => 'integer|required|max:12',
+            'type'=>['required', Rule::in(1, 2)],
+            'status' => ['required', Rule::in(0, 1)],
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->topicRepository->update($request->all());
+    }
+}

+ 5 - 0
app/Models/Category.php

@@ -13,4 +13,9 @@ class Category extends Model
     //
     //
     protected $table = 'category';
     protected $table = 'category';
     protected $guarded = [];
     protected $guarded = [];
+
+    public function ct()
+    {
+        return $this->hasMany('App\Models\CategoryTopic','category_id','id');
+    }
 }
 }

+ 10 - 0
app/Models/CategoryTopic.php

@@ -13,4 +13,14 @@ class CategoryTopic extends Model
     //
     //
     protected $table = 'category_topic';
     protected $table = 'category_topic';
     protected $guarded = [];
     protected $guarded = [];
+    //话题
+    public function topic()
+    {
+        return $this->hasOne('App\Models\Topic', 'id', 'topic_id');
+    }
+    //分类
+    public function category()
+    {
+        return $this->hasOne('App\Models\Category', 'id', 'category_id');
+    }
 }
 }

+ 16 - 0
app/Models/Download.php

@@ -0,0 +1,16 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/11
+ * Time: 10:35
+ */
+
+namespace App\Models;
+use Illuminate\Database\Eloquent\Model;
+
+class Download extends Model
+{
+    protected $table = 'downloads';
+    protected $guarded = [];
+}

+ 5 - 0
app/Models/Topic.php

@@ -14,4 +14,9 @@ class Topic extends Model
     //
     //
     protected $table = 'topic';
     protected $table = 'topic';
     protected $guarded = [];
     protected $guarded = [];
+
+    public function ct()
+    {
+        return $this->hasMany('App\Models\CategoryTopic','topic_id','id');
+    }
 }
 }

+ 143 - 0
app/Repositories/CategoryRepository.php

@@ -0,0 +1,143 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 17:40
+ */
+namespace App\Repositories;
+
+use App\Models\Category;
+use App\Models\CategoryTopic;
+use Dingo\Api\Http\Response;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Database\QueryException;
+
+class CategoryRepository {
+    public function __construct(Category $category,CategoryTopic $categoryTopic){
+        $this->category = $category;
+        $this->categoryTopic = $categoryTopic;
+    }
+    //列表
+    public function index($request){
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        if(isset($request['name'])){
+            $where[] = ['name', 'like', "%{$request['name']}%"];
+        }
+        return $this->category->where($where)->paginate($perPage);
+    }
+    //详情
+    public function view($request){
+        return $this->category->where(['id'=>$request['id']])->first();
+    }
+    //创建
+    public function create($request){
+        $category = $this->category->where(['name'=>$request['name']])->first();
+        if($category){
+            return Response::create([
+                'message'  => '该分类已存在',
+                'status_code'   => 500
+            ]);
+        }
+        $data = [
+            'name' => $request['name'],
+            'img' => $request['img'],
+            //'is_suggest' => $request['is_suggest'],
+            'desc' => $request['desc'],
+        ];
+        if(!empty($request['topic_ids'])){
+            $topic_ids = explode(',', $request['topic_ids']);
+        }
+        DB::beginTransaction();
+        try{
+            $categoryInfo = $this->category->create($data);
+            if($categoryInfo){
+                if($topic_ids){
+                    $category_topic_data = [];
+                    foreach($topic_ids as $value){
+                        $category_topic_data[] = [
+                            'category_id' => $categoryInfo->id,
+                            'topic_id' => $value,
+                        ];
+                    }
+                    $this->categoryTopic->insert($category_topic_data);
+                }
+            }
+            DB::commit();
+            return Response::create();
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('新增话题分组:'.$exception->getMessage());
+            return Response::create([
+                'message'  => '新增话题失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+    //编辑
+    public function edit($request){
+        $category = $this->category->where(['id'=>$request['id']])->first();
+        if(!$category){
+            return Response::create([
+                'message'  => '该分类不存在',
+                'status_code'   => 500
+            ]);
+        }
+        $_category = $this->category->where(['name'=>$request['name']])->where('id','<>',$category->id)->first();
+        if($_category){
+            return Response::create([
+                'message'  => '该分类已存在',
+                'status_code'   => 500
+            ]);
+        }
+        $category->name = $request['name'];
+        $category->img = $request['img'];
+        $category->desc = $request['desc'];
+        $topic_ids = [];
+        if(!empty($request['topic_ids'])){
+            $topic_ids = explode(',', $request['topic_ids']);
+        }
+        DB::beginTransaction();
+        try{
+
+            $categoryInfo = $category->save();
+            if($categoryInfo){
+                //删除
+                $this->categoryTopic->where(['category_id'=>$category->id])->delete();
+                if($topic_ids){
+                    $category_topic_data = [];
+                    foreach($topic_ids as $value){
+                        $category_topic_data[] = [
+                            'category_id' => $category->id,
+                            'topic_id' => $value,
+                        ];
+                    }
+                    $this->categoryTopic->insert($category_topic_data);
+                }
+            }
+            DB::commit();
+            return Response::create();
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('新增话题分组:'.$exception->getMessage());
+            return Response::create([
+                'message'  => '新增话题失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+    //修改
+    public function update($request){
+        $category = $this->category->where('id', $request['id'])->first();
+        if(isset($request['is_suggest']) && $request['is_suggest'] !== null){
+            $category->is_suggest = $request['is_suggest'];
+        }
+        $res = $category->save();
+        if($res){
+            return Response::create();
+        }
+    }
+}

+ 96 - 0
app/Repositories/DownloadRepository.php

@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/11
+ * Time: 10:45
+ */
+namespace App\Repositories;
+
+use App\Models\Download;
+use Illuminate\Database\QueryException;
+use Dingo\Api\Http\Response;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Tymon\JWTAuth\Facades\JWTAuth;
+class DownloadRepository
+{
+    public function __construct(Download $download)
+    {
+        $this->download = $download;
+    }
+
+    /**
+     * 下载列表
+     */
+    public function lists($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        if(isset($request['content'])){
+            $where[] = ['content', 'like', "%{$request['content']}%"];
+        }
+        if(isset($request['download_type'])){
+            $where[] = ['download_type', $request['download_type']];
+        }
+
+        return $this->download
+            ->where($where)
+            ->orderBy('id','desc')
+            ->paginate($perPage);
+    }
+
+    /**
+     * 添加下载
+     */
+    public function create($request)
+    {
+        $token =  JWTAuth::decode(JWTAuth::getToken());
+        if(!$token || $token['type'] != 1){
+            return Response::create([
+                'message'  => '获取登陆信息失败',
+                'status_code'   => 500
+            ]);
+        }
+        $uid = $token['user']->id;
+        $username = $token['user']->username;
+
+        //下载中
+        if($this->download->where('uid', $uid)->where('download_status', 0)->where('download_type', $request['download_type'])->exists()){
+            return Response::create([
+                'message'  => '当前有任务未完成,请等待',
+                'status_code'   => 500
+            ]);
+        }
+
+        $data = [
+            'uid' => $uid,
+            'username' => $username,
+            'download_type' => $request['download_type'],
+            'download_status' => 0,
+            'params' => json_encode($request),
+            'url' => ''
+        ];
+
+
+
+        DB::beginTransaction();
+        try{
+            $this->download->create($data);
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('生成下载内容:'.$exception->getMessage());
+            return Response::create([
+                'message'  => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+}

+ 541 - 9
app/Repositories/Post/PostRepository.php

@@ -15,16 +15,23 @@ use App\Models\PostData;
 use App\Models\PostImgs;
 use App\Models\PostImgs;
 use App\Models\PostLog;
 use App\Models\PostLog;
 use App\Models\Topic;
 use App\Models\Topic;
+use App\Traits\PostTrait;
+use App\Traits\UserTrait;
 use Illuminate\Database\QueryException;
 use Illuminate\Database\QueryException;
 use Dingo\Api\Http\Response;
 use Dingo\Api\Http\Response;
+use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Redis;
 use Illuminate\Support\Facades\Redis;
 use Symfony\Component\HttpKernel\Exception\HttpException;
 use Symfony\Component\HttpKernel\Exception\HttpException;
 use Tymon\JWTAuth\Facades\JWTAuth;
 use Tymon\JWTAuth\Facades\JWTAuth;
+use League\Csv\Writer;
+use League\Csv\CannotInsertRecord;
 
 
 class PostRepository
 class PostRepository
 {
 {
+    use PostTrait;
+    use UserTrait;
 
 
     public function __construct(Post $post,
     public function __construct(Post $post,
                                 PostData $postData,
                                 PostData $postData,
@@ -49,20 +56,29 @@ class PostRepository
     public function create($request)
     public function create($request)
     {
     {
         //验证小号
         //验证小号
-
+        $userInfo = $this->getUserInfo($request['uid']);
+        if(!$userInfo || $userInfo['type'] != 1){
+            return Response::create([
+                'message'  => '所选小号信息有误',
+                'status_code'   => 500
+            ]);
+        }
         //验证话题
         //验证话题
         $topicIds = $this->topic->whereIn('id', explode(',', $request['topic_ids']))->pluck('id')->toArray();
         $topicIds = $this->topic->whereIn('id', explode(',', $request['topic_ids']))->pluck('id')->toArray();
         $topicCount = count($topicIds);
         $topicCount = count($topicIds);
-        if($topicCount == 0 || $topicCount >= 5){
-            throw new HttpException(500, '所选话题必须1-5个');
+        if($topicCount == 0 || $topicCount > 5){
+            return Response::create([
+                'message'  => '所选话题必须1-5个',
+                'status_code'   => 500
+            ]);
         }
         }
         $topicIds = implode(',', $topicIds);
         $topicIds = implode(',', $topicIds);
 
 
         $data = [
         $data = [
             'uid' => $request['uid'],
             'uid' => $request['uid'],
-            'username' => '暂无',
-            'mobile' => '暂无',
-            'avatar' => '暂无',
+            'username' => $userInfo['username'],
+            'mobile' => $userInfo['mobile'],
+            'avatar' => $userInfo['avatar'],
             'type' => $request['type'],
             'type' => $request['type'],
             'img' => $request['img'],
             'img' => $request['img'],
             'video' => $request['video']??'',
             'video' => $request['video']??'',
@@ -94,8 +110,8 @@ class PostRepository
                 'comment_real_count' => 0,
                 'comment_real_count' => 0,
                 'collect_count' => 0,
                 'collect_count' => 0,
                 'collect_real_count' => 0,
                 'collect_real_count' => 0,
-                'available_bean' => 0,
-                'will_collect_bean' => 0,
+                'available_bean' => $this->availableBean(),
+                'will_collect_bean' => rand(100, 200),
                 'collect_bean' => 0,
                 'collect_bean' => 0,
                 'weight' => 0
                 'weight' => 0
             ]);
             ]);
@@ -127,6 +143,146 @@ class PostRepository
         }
         }
     }
     }
 
 
+    /**
+     * 增加数据
+     */
+    public function addData($request)
+    {
+        $token =  JWTAuth::decode(JWTAuth::getToken());
+        if(!$token || $token['type'] != 1){
+            return Response::create([
+                'message'  => '获取登陆信息失败',
+                'status_code'   => 500
+            ]);
+        }
+        $uid = $token['user']->id;
+        $username = $token['user']->username;
+        //验证小号数量
+
+        $postData = $this->postData->where('post_id', $request['post_id'])->first();
+        if(!$postData){
+            return Response::create([
+                'message'  => '获取内容失败',
+                'status_code'   => 500
+            ]);
+        }
+
+        if($request['add_pv'] == 0 && $request['add_praise_count'] == 0 && $request['add_collect_count'] == 0 && $request['add_share_count'] == 0){
+            return Response::create([
+                'message'  => '增加数据不能同时为0',
+                'status_code'   => 500
+            ]);
+        }
+        $content = '';
+        if($request['add_pv']){
+            $postData->pv += $request['add_pv'];
+            $content .= '浏览数增加'.$request['add_pv'].'、';
+        }
+        if($request['add_praise_count']){
+            $postData->praise_count += $request['add_praise_count'];
+            $content .= '点赞数增加'.$request['add_praise_count'].'、';
+        }
+        if($request['add_collect_count']){
+            $postData->collect_count += $request['add_collect_count'];
+            $content .= '收藏数增加'.$request['add_collect_count'].'、';
+        }
+        if($request['add_share_count']){
+            $postData->share_count += $request['add_share_count'];
+            $content .= '分享数增加'.$request['add_share_count'];
+        }
+        $content = rtrim($content, '、');
+        DB::beginTransaction();
+        try{
+            $postData->save();
+            $this->postLog->create([
+                'post_id' => $request['post_id'],
+                'uid' => $uid,
+                'username' => $username,
+                'log_type' => 'add_data',
+                'content' => $content
+            ]);
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('内容增加数据:'.$request['post_id'].$exception->getMessage());
+            return Response::create([
+                'message'  => '增加数据失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
+    /**
+     * 评论&回复
+     */
+    public function comment($request)
+    {
+        //验证小号
+        $userInfo = $this->getUserInfo($request['uid']);
+        if(!$userInfo || $userInfo['type'] != 1){
+            return Response::create([
+                'message'  => '所选小号信息有误',
+                'status_code'   => 500
+            ]);
+        }
+
+        $post = $this->post->find($request['post_id']);
+        if(!$post){
+            return Response::create([
+                'message'  => '获取内容失败',
+                'status_code'   => 500
+            ]);
+        }
+        $data = [
+            'uid' => $request['uid'],
+            'post_id' => $request['post_id'],
+            'parent_id' => 0,
+            'username' => $userInfo['username'],
+            'avatar' => $userInfo['avatar'],
+            'content' => $request['content'],
+            'is_delete' => 0,
+        ];
+        if(isset($request['parent_id']) && $request['parent_id'] != 0){
+            $comment = $this->postComment->find($request['parent_id']);
+            if(!$comment){
+                return Response::create([
+                    'message'  => '获取评论信息失败',
+                    'status_code'   => 500
+                ]);
+            }
+            if($comment->parent_id){
+                return Response::create([
+                    'message'  => '只能回复评论',
+                    'status_code'   => 500
+                ]);
+            }
+            $data['parent_id'] = $request['parent_id'];
+        }
+        DB::beginTransaction();
+        try{
+            $this->postComment->create($data);
+            $post->data->comment_count += 1;
+            $post->data->comment_real_count += 1;
+            $post->data->save();
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('评论内容:'.$request['post_id'].$exception->getMessage());
+            return Response::create([
+                'message'  => '评论失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
     /**
     /**
      * 内容列表
      * 内容列表
      */
      */
@@ -148,8 +304,12 @@ class PostRepository
         if(isset($request['sort']) && in_array($request['sort'], ['praise_count', 'share_count', 'pv', 'comment_count', 'create_bean'])){
         if(isset($request['sort']) && in_array($request['sort'], ['praise_count', 'share_count', 'pv', 'comment_count', 'create_bean'])){
             $sort = $request['sort'];
             $sort = $request['sort'];
         }
         }
+        $post = $this->post;
+        if(isset($request['waste']) && $request['waste'] == 1){
+            $post = $post->onlyTrashed();
+        }
 
 
-        return $this->post
+        return $post
             ->join('post_data', 'post_data.post_id', '=', 'post.id')
             ->join('post_data', 'post_data.post_id', '=', 'post.id')
             ->select('post.*')
             ->select('post.*')
             ->where($where)
             ->where($where)
@@ -188,5 +348,377 @@ class PostRepository
             ->orderBy($sort,'desc')
             ->orderBy($sort,'desc')
             ->paginate($perPage);
             ->paginate($perPage);
     }
     }
+    
+
+    /**
+     * 内容详情
+     */
+    public function detail($request)
+    {
+        return $this->post->withTrashed()->find($request['id']);
+    }
+
+    /**
+     * 评论列表
+     */
+    public function commentList($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+
+        return $this->postComment
+            ->where('post_id', $request['post_id'])
+            ->orderBy('id','desc')
+            ->paginate($perPage);
+    }
+
+    /**
+     * 推荐内容
+     */
+    public function suggest($request)
+    {
+        $post = $this->post->where('id', $request['id'])->first();
+        if(!$post){
+            return Response::create([
+                'message'  => '获取内容信息失败',
+                'status_code'   => 500
+            ]);
+        }
+
+        if($post->is_suggest == 1){
+            $post->is_suggest = 0;
+        }else{
+            $post->is_suggest = 1;
+        }
+
+        DB::beginTransaction();
+        try{
+            $post->save();
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('推荐内容:'.$request['id'].$exception->getMessage());
+            return Response::create([
+                'message'  => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
+    /**
+     * 删除内容
+     */
+    public function delete($request)
+    {
+        $post = $this->post->where('id', $request['id'])->first();
+        if(!$post){
+            return Response::create([
+                'message'  => '获取内容信息失败',
+                'status_code'   => 500
+            ]);
+        }
+
+        DB::beginTransaction();
+        try{
+            $post->delete();
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('删除内容:'.$request['id'].$exception->getMessage());
+            return Response::create([
+                'message'  => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
+    /**
+     * 复原内容
+     */
+    public function restore($request)
+    {
+        $post = $this->post->withTrashed()->where('id', $request['id'])->first();
+        if(!$post){
+            return Response::create([
+                'message'  => '获取内容信息失败',
+                'status_code'   => 500
+            ]);
+        }
+
+        DB::beginTransaction();
+        try{
+            $post->restore();
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('复原内容:'.$request['id'].$exception->getMessage());
+            return Response::create([
+                'message'  => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
+    /**
+     * 删除评论
+     */
+    public function commentDelete($request)
+    {
+        $comment = $this->postComment->find($request['id']);
+        if(!$comment){
+            return Response::create([
+                'message'  => '获取评论信息失败',
+                'status_code'   => 500
+            ]);
+        }
+
+        if($comment->is_delete == 1){
+            return Response::create([
+                'message'  => '该评论已经删除',
+                'status_code'   => 500
+            ]);
+        }
+
+        DB::beginTransaction();
+        try{
+            $comment->is_delete = 1;
+            $comment->save();
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('删除评论:'.$request['id'].$exception->getMessage());
+            return Response::create([
+                'message'  => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
+    /**
+     * 隐藏内容
+     */
+    public function hide($request)
+    {
+        $post = $this->post->where('id', $request['id'])->first();
+        if(!$post){
+            return Response::create([
+                'message'  => '获取内容信息失败',
+                'status_code'   => 500
+            ]);
+        }
+
+        if($post->is_hide == 1){
+            $post->is_hide = 0;
+        }else{
+            $post->is_hide = 1;
+        }
+
+        DB::beginTransaction();
+        try{
+            $post->save();
+
+            DB::commit();
+            return Response::create();
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('隐藏内容:'.$request['id'].$exception->getMessage());
+            return Response::create([
+                'message'  => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
+    /**
+     * 日志列表
+     */
+    public function log($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        if(isset($request['log_type'])){
+            $where[] = ['log_type', $request['log_type']];
+        }
+
+        return $this->postLog
+            ->where($where)
+            ->where(function($query) use ($request){
+                if(isset($request['created_at'])){
+                    $time = explode('_', $request['created_at']);
+                    $query->whereBetween('created_at', $time);
+                }
+            })
+            ->orderBy('id','desc')
+            ->paginate($perPage);
+    }
+
+    public function download($filePath, $type, $request)
+    {
+        try {
+            set_time_limit(0);
+            if (!ini_get("auto_detect_line_endings")) {
+                ini_set("auto_detect_line_endings", '1');
+            }
+
+            // 文件路径
+            $writer = Writer::createFromPath(public_path($filePath), 'w+');
+
+            // 设置标题
+            if($type == 'post'){
+                $title = [
+                    '内容', date('Y年m月d日')
+                ];
+            }else{
+                $title = [
+                    '回收站内容', date('Y年m月d日')
+                ];
+            }
+
+            $title = eval('return ' . iconv('utf-8', 'gbk//IGNORE', var_export($title, true) . ';'));
+            $writer->insertone($title);
+
+            // 内容
+            if($type == 'post') {
+                $header = [
+                    '内容ID', '发布时间', '用户昵称', '城市', '内容标签', '内容前20个字',
+                    '真实浏览量', '总浏览量', '真实点赞数', '总赞数', '真实分享数', '总分享数',
+                    '真实收藏数', '总收藏数', '评论数'
+                ];
+            } else {
+                $header = [
+                    '内容ID', '发布时间', '用户昵称', '内容标签', '内容前20个字',
+                    '真实浏览量', '真实点赞数', '真实点赞数', '真实分享数', '真实收藏数', '评论数'
+                ];
+            }
+
+            $header = eval('return ' . iconv('utf-8', 'gbk//IGNORE', var_export($header, true) . ';'));
+//            $writer->setOutputBOM(Reader::BOM_UTF8);
+            $writer->insertone($header);
+
+            $where = [];
+            if(isset($request['content'])){
+                $where[] = ['content', 'like', "%{$request['content']}%"];
+            }
+            if(isset($request['is_suggest'])){
+                $where[] = ['is_suggest', $request['is_suggest']];
+            }
+            if(isset($request['type'])){
+                $where[] = ['type', $request['type']];
+            }
+
+            $sort = 'post.id';
+            if(isset($request['sort']) && in_array($request['sort'], ['praise_count', 'share_count', 'pv', 'comment_count', 'create_bean'])){
+                $sort = $request['sort'];
+            }
+            $post = $this->post;
+            if($type == 'post_waste'){
+                $post = $post->onlyTrashed();
+            }
+
+            $post->join('post_data', 'post_data.post_id', '=', 'post.id')
+                ->select('post.*')
+                ->where($where)
+                ->where(function($query) use ($request){
+                    if(isset($request['keyword'])){
+                        $query->where('uid', '=', $request['keyword'])
+                            ->orWhere('username', 'like', "%{$request['keyword']}%")
+                            ->orWhere('mobile', 'like', "%{$request['keyword']}%");
+                    }
+                })
+                ->where(function($query) use ($request){
+                    if(isset($request['created_at'])){
+                        $time = explode('_', $request['created_at']);
+                        $query->whereBetween('post.created_at', $time);
+                    }
+                })
+                ->where(function ($query) use ($request){
+                    if(isset($request['category_ids']) || isset($request['topic_ids'])){
+                        $ids = [];
+                        if (isset($request['category_ids'])) {
+                            $categoryIds = explode('_', $request['category_ids']);
+                            $ids = $this->categoryTopic->whereIn('category_id', $categoryIds)->pluck('topic_id')->toArray();
+                        }
+                        if (isset($request['topic_ids'])) {
+                            $ids = array_merge($ids, explode('_', $request['topic_ids']));
+                        }
+                        Log::debug('话题ids:'.json_encode($ids));
+                        foreach ($ids as $key=>$id) {
+                            if ($key==0) {
+                                $query = $query->whereRaw('FIND_IN_SET('.$id.',topic_ids)');
+                            } else {
+                                $query = $query->orWhereRaw('FIND_IN_SET('.$id.',topic_ids)');
+                            }
+                        }
+                    }
+                })
+                ->orderBy($sort,'desc')
+                ->chunk(1, function ($posts) use ($writer, $type){
+                    $data = [];
+                    foreach ($posts as $post) {
+                        if($type == 'post'){
+                            $tmp = [
+                                $post->id,
+                                Carbon::parse($post->created_at)->toDateTimeString(),
+                                $post->username,
+                                $post->location,
+                                implode(' ', $post->topic()->toArray()),
+                                subtext($post->content, 20),
+                                $post->data->pv_real,
+                                $post->data->pv,
+                                $post->data->praise_real_count,
+                                $post->data->praise_count,
+                                $post->data->share_real_count,
+                                $post->data->share_count,
+                                $post->data->collect_real_count,
+                                $post->data->collect_count,
+                                $post->data->comment_count
+                            ];
+                        }else{
+                            $tmp = [
+                                $post->id,
+                                Carbon::parse($post->created_at)->toDateTimeString(),
+                                $post->username,
+                                Carbon::parse($post->created_at)->toDateTimeString(),
+                                subtext($post->content, 20),
+                                $post->data->pv_real,
+                                $post->data->praise_real_count,
+                                $post->data->share_real_count,
+                                $post->data->collect_real_count,
+                                $post->data->comment_count
+                            ];
+                        }
+                        foreach ($tmp as $key => $value) {
+                            $tmp[$key] = iconv('utf-8', 'gbk//IGNORE', $value);
+                        }
+
+                        $data[] = $tmp;
+                    }
+                    $writer->insertAll($data);
+            });
+            Log::channel('download')->info('内容导出成功!');
+
+        } catch (CannotInsertRecord $e) {
+            $e->getRecord();
+            Log::channel('download')->info('内容导出失败!');
+        }
+
+    }
 
 
 }
 }

+ 182 - 0
app/Repositories/TopicRepository.php

@@ -0,0 +1,182 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 18:12
+ */
+
+namespace App\Repositories;
+
+use App\Models\Category;
+use App\Models\CategoryTopic;
+use App\Models\Topic;
+use Dingo\Api\Http\Response;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Database\QueryException;
+
+class TopicRepository {
+    public function __construct(Topic $topic,CategoryTopic $categoryTopic){
+        $this->topic = $topic;
+        $this->categoryTopic = $categoryTopic;
+    }
+    //列表
+    public function index($request){
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        if(isset($request['name'])){
+            $where[] = ['name', 'like', "%{$request['name']}%"];
+        }
+        if(isset($request['topic_status'])){
+            if($request['topic_status'] == 'is_suggest'){
+                $where[] = ['is_suggest', 1];
+            }
+            if( $request['topic_status'] == 'is_hot'){
+                $where[] = ['is_hot', 1];
+            }
+            if($request['topic_status'] == 'is_open'){
+                $where[] = ['is_open', 1];
+            }
+            if($request['topic_status'] == 'is_close'){
+                $where[] = ['is_open', 0];
+            }
+        }
+
+        return $this->topic->where($where)->paginate($perPage);
+    }
+    //新增
+    public function create($request){
+        $topic = $this->topic->where(['name'=>$request['name']])->first();
+        if($topic){
+            return Response::create([
+                'message'  => '该话题已存在',
+                'status_code'   => 500
+            ]);
+        }
+
+        $data = [
+            'name' => $request['name'],
+            'img' => $request['img'],
+            'desc' => $request['desc'],
+        ];
+        if(isset($request['category_ids'])){
+            $category_ids = explode(',', $request['category_ids']);
+        }
+        DB::beginTransaction();
+        try{
+            $topicInfo = $this->topic->create($data);
+            if($topicInfo){
+                if($category_ids){
+                    $category_topic_data = [];
+                    foreach($category_ids as $value){
+                        $category_topic_data[] = [
+                            'category_id' => $value,
+                            'topic_id' => $topicInfo->id,
+                        ];
+                    }
+                    $this->categoryTopic->insert($category_topic_data);
+                }
+            }
+            DB::commit();
+            return Response::create();
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('新增话题:'.$exception->getMessage());
+            return Response::create([
+                'message'  => '新增话题,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+
+    public function edit($request){
+        $topic = $this->topic->where(['id'=>$request['id']])->first();
+        if(!$topic){
+            return Response::create([
+                'message'  => '该话题不存在',
+                'status_code'   => 500
+            ]);
+        }
+        $_topic = $this->topic->where(['name'=>$request['name']])->where('id','<>',$topic->id)->first();
+        if($_topic){
+            return Response::create([
+                'message'  => '该话题已存在',
+                'status_code'   => 500
+            ]);
+        }
+
+        $topic->name = $request['name'];
+        $topic->img = $request['img'];
+        $topic->desc = $request['desc'];
+        $category_ids = [];
+        if(!empty($request['category_ids'])){
+            $category_ids = explode(',', $request['category_ids']);
+        }
+        DB::beginTransaction();
+        try{
+            //保存
+            $topicInfo = $topic->save();
+            //删除原来关联关系
+            $this->categoryTopic->where(['topic_id'=>$topic->id])->delete();
+            if($topicInfo){
+                if($category_ids){
+                    $category_topic_data = [];
+                    foreach($category_ids as $value){
+                        $category_topic_data[] = [
+                            'category_id' => $value,
+                            'topic_id' => $topic->id,
+                        ];
+                    }
+                    $this->categoryTopic->insert($category_topic_data);
+                }
+            }
+            DB::commit();
+            return Response::create();
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::debug('编辑话题:'.$exception->getMessage());
+            return Response::create([
+                'message'  => '编辑话题,请重试',
+                'error' => $exception->getMessage(),
+                'status_code'   => 500
+            ]);
+        }
+    }
+    //修改
+    public function update($request){
+        $topic = $this->topic->where('id', $request['id'])->first();
+        if(!$topic){
+            return Response::create([
+                'message'  => '该话题不存在',
+                'status_code'   => 500
+            ]);
+        }
+        if(isset($request['is_open']) && $request['is_open'] !== null){
+            $topic->is_open = $request['is_open'];
+        }
+        if(!empty($request['type'])){
+            if($topic->is_open == 0){
+                return Response::create([
+                    'message'  => '该话题未开启',
+                    'status_code'   => 500
+                ]);
+            }
+            if(isset($request['type']) && $request['type'] == 1){
+                $topic->is_suggest = $request['status'];
+            }
+            if(isset($request['type']) && $request['type'] == 2){
+                $topic->is_hot = $request['status'];
+            }
+        }
+
+        $res = $topic->save();
+        if($res){
+            return Response::create();
+        }
+    }
+    //详情
+    public function view($request){
+        return $this->topic->where('id', $request['id'])->first();
+    }
+}

+ 34 - 0
app/Traits/PostTrait.php

@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/6
+ * Time: 18:05
+ */
+namespace App\Traits;
+
+use Illuminate\Support\Facades\Redis;
+
+trait PostTrait
+{
+    //预计可获得彩虹豆数
+    public function availableBean()
+    {
+        $bean = Redis::get('yesterday_post_create_bean');
+        $count = Redis::get('yesterday_post_count');
+        $num = 1000;
+        if($bean && $count){
+            $num = $bean / $count;
+        }
+        $h = date('h');
+        $H = date('H');
+        $t = $h * 60 / 720 + 2;
+
+
+        if(in_array(intval($H), [9,10,11,12,17.18,19,20,21])){
+            $t += 0.5;
+        }
+        return intval($num * $t);
+    }
+}

+ 26 - 0
app/Traits/UserTrait.php

@@ -0,0 +1,26 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/11
+ * Time: 17:50
+ */
+
+namespace App\Traits;
+use Tymon\JWTAuth\Facades\JWTAuth;
+
+trait UserTrait
+{
+    public function getUserInfo($uid) {
+        try {
+            $url = config("customer.manage_service_url").'/user/memberView';
+            $array = [
+                'json' => ['uid' => $uid], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array, true, 'get');
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
+}

+ 31 - 0
app/Transformers/CategoryTransformer.php

@@ -0,0 +1,31 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 18:47
+ */
+namespace App\Transformers;
+use App\Models\Category;
+use League\Fractal\TransformerAbstract;
+use Illuminate\Support\Carbon;
+
+class CategoryTransformer extends TransformerAbstract{
+    public function transform(Category $category)
+    {
+        $topic = [];
+        foreach ($category->ct as $key=>$value){
+            $topic[] = $value->topic;
+        }
+        return [
+            'id' => $category['id'],
+            'name' => $category['name'],
+            'img' => $category['img'],
+            'is_suggest' => $category['is_suggest'],
+            'desc' => $category['desc'],
+            'created_at' => Carbon::parse($category['created_at'])->toDateTimeString(),
+            'topic_list'=>$topic,
+            'topic_count'=>count($topic)
+        ];
+    }
+}

+ 34 - 0
app/Transformers/DetailCategoryTransformer.php

@@ -0,0 +1,34 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 19:06
+ */
+
+namespace App\Transformers;
+
+use League\Fractal\TransformerAbstract;
+use App\Models\Category;
+use Illuminate\Support\Carbon;
+
+class DetailCategoryTransformer extends TransformerAbstract{
+
+    public function transform(Category $category)
+    {
+        $topic = [];
+        foreach ($category->ct as $key=>$value){
+            $topic[] = $value->topic;
+        }
+        return [
+            'id' => $category['id'],
+            'name' => $category['name'],
+            'img' => $category['img'],
+            'is_suggest' => $category['is_suggest'],
+            'desc' => $category['desc'],
+            'created_at' => Carbon::parse($category['created_at'])->toDateTimeString(),
+            'topic_list'=>$topic,
+            'topic_count'=>count($topic)
+        ];
+    }
+}

+ 36 - 0
app/Transformers/DetailTopicTransformer.php

@@ -0,0 +1,36 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 18:47
+ */
+namespace App\Transformers;
+use App\Models\Topic;
+use League\Fractal\TransformerAbstract;
+use Illuminate\Support\Carbon;
+
+class DetailTopicTransformer extends TransformerAbstract{
+
+    public function transform(Topic $topic)
+    {
+        $category = [];
+        foreach ($topic->ct as $key=>$value){
+                $category[] = $value->category;
+        }
+        return [
+            'id' => $topic['id'],
+            'name' => $topic['name'],
+            'img' => $topic['img'],
+            'is_suggest' => $topic['is_suggest'],
+            'is_hot' => $topic['is_hot'],
+            'is_open' => $topic['is_open'],
+            'desc' => $topic['desc'],
+            'post_count' => 0,
+            'follow_count' => 0,
+            'page_count' => 0,
+            'created_at' => Carbon::parse($topic['created_at'])->toDateTimeString(),
+            'category_list'=>$category,
+        ];
+    }
+}

+ 28 - 0
app/Transformers/DownloadTransformer.php

@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/11
+ * Time: 10:48
+ */
+namespace App\Transformers;
+
+use App\Models\Download;
+use Carbon\Carbon;
+use League\Fractal\TransformerAbstract;
+
+class DownloadTransformer extends TransformerAbstract
+{
+    public function transform(Download $download)
+    {
+        return [
+            'id' => $download['id'],
+            'username' => $download['username'],
+            'download_type' => $download['download_type'],
+            'download_status' => $download['download_status'],
+            'url' => $download['url'],
+            'created_at' => Carbon::parse($download['created_at'])->toDateTimeString(),
+        ];
+    }
+}

+ 29 - 0
app/Transformers/Post/CommentTransformer.php

@@ -0,0 +1,29 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/10
+ * Time: 10:56
+ */
+
+namespace App\Transformers\Post;
+use App\Models\PostComment;
+use Illuminate\Support\Carbon;
+use League\Fractal\TransformerAbstract;
+
+class CommentTransformer extends TransformerAbstract
+{
+    public function transform(PostComment $postComment)
+    {
+        return [
+            'id' => $postComment['id'],
+            'parent_id' => $postComment['parent_id'],
+            'uid' => $postComment['uid'],
+            'username' => $postComment['username'],
+            'avatar' => $postComment['avatar'],
+            'content' => $postComment['is_delete'] == 1 ? '该评论已被删除' : $postComment['content'],
+            'created_at' => Carbon::parse($postComment['created_at'])->toDateTimeString(),
+            'is_delete' => $postComment['is_delete'],
+        ];
+    }
+}

+ 45 - 0
app/Transformers/Post/DetailTransformer.php

@@ -0,0 +1,45 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/10
+ * Time: 9:17
+ */
+
+namespace App\Transformers\Post;
+use App\Models\Post;
+use Illuminate\Support\Carbon;
+use League\Fractal\TransformerAbstract;
+
+class DetailTransformer extends  TransformerAbstract
+{
+    public function transform(Post $post)
+    {
+        $imgs = [];
+        foreach($post->imgs as $img){
+            $imgs[] = $img->img;
+        }
+        return [
+            'id' => $post['id'],
+            'created_at' => Carbon::parse($post['created_at'])->toDateTimeString(),
+            'uid' => $post['uid'],
+            'username' => $post['username'],
+            'avatar' => $post['avatar'],
+            'topic' => $post->topic(),
+            'title' => $post['title'],
+            'content' => $post['content'],
+            'type' => $post['type'],
+            'img' => $post['img'],
+            'video' => $post['video'],
+            'imgs' => $imgs,
+            'location' => $post['location'],
+            'pv' => $post->data->pv_real.'/'.$post->data->pv,
+            'praise_count' => $post->data->praise_real_count.'/'.$post->data->praise_count,
+            'share_count' => $post->data->share_real_count.'/'.$post->data->share_count,
+            'comment_count' => $post->data->comment_count,
+            'collect_count' => $post->data->collect_real_count.'/'.$post->data->collect_count,
+            'create_bean' => $post->data->create_bean,
+            'is_suggest' => $post['is_suggest'],
+        ];
+    }
+}

+ 26 - 0
app/Transformers/Post/LogTransformer.php

@@ -0,0 +1,26 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/10
+ * Time: 17:21
+ */
+
+namespace App\Transformers\Post;
+use App\Models\PostLog;
+use Illuminate\Support\Carbon;
+use League\Fractal\TransformerAbstract;
+
+class LogTransformer extends TransformerAbstract
+{
+    public function transform(PostLog $postLog)
+    {
+        return [
+            'id' => $postLog['id'],
+            'username' => $postLog['username'],
+            'log_type' => $postLog['log_type'],
+            'created_at' => Carbon::parse($postLog['created_at'])->toDateTimeString(),
+            'content' => $postLog['content'],
+        ];
+    }
+}

+ 1 - 0
app/Transformers/Post/PostTransformer.php

@@ -32,6 +32,7 @@ class PostTransformer extends TransformerAbstract
             'collect_count' => $post->data->collect_real_count.'/'.$post->data->collect_count,
             'collect_count' => $post->data->collect_real_count.'/'.$post->data->collect_count,
             'create_bean' => $post->data->create_bean,
             'create_bean' => $post->data->create_bean,
             'is_suggest' => $post['is_suggest'],
             'is_suggest' => $post['is_suggest'],
+            'is_hide' => $post['is_hide'],
         ];
         ];
     }
     }
 }
 }

+ 38 - 0
app/Transformers/TopicTransformer.php

@@ -0,0 +1,38 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-10
+ * Time: 18:47
+ */
+namespace App\Transformers;
+use App\Models\Topic;
+use League\Fractal\TransformerAbstract;
+use Illuminate\Support\Carbon;
+
+class TopicTransformer extends TransformerAbstract{
+
+    public function transform(Topic $topic)
+    {
+        $category = [];
+        foreach ($topic->ct as $key=>$value){
+            if($key < 3){
+                $category[] = $value->category->name;
+            }
+        }
+        return [
+            'id' => $topic['id'],
+            'name' => $topic['name'],
+            'img' => $topic['img'],
+            'is_suggest' => $topic['is_suggest'],
+            'is_hot' => $topic['is_hot'],
+            'is_open' => $topic['is_open'],
+            'desc' => $topic['desc'],
+            'post_count' => 0,
+            'follow_count' => 0,
+            'page_count' => 0,
+            'created_at' => Carbon::parse($topic['created_at'])->toDateTimeString(),
+            'category_list'=>$category,
+        ];
+    }
+}

+ 1 - 0
bootstrap/app.php

@@ -89,6 +89,7 @@ $app->register(App\Providers\AuthServiceProvider::class);
 
 
 $app->register(Dingo\Api\Provider\LumenServiceProvider::class);
 $app->register(Dingo\Api\Provider\LumenServiceProvider::class);
 $app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
 $app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
+$app->register(\Illuminate\Redis\RedisServiceProvider::class);
 /*
 /*
 |--------------------------------------------------------------------------
 |--------------------------------------------------------------------------
 | Load The Application Routes
 | Load The Application Routes

+ 5 - 8
composer.json

@@ -14,7 +14,10 @@
         "multilinguals/apollo-client": "^0.1.2",
         "multilinguals/apollo-client": "^0.1.2",
         "php-amqplib/php-amqplib": "^2.9",
         "php-amqplib/php-amqplib": "^2.9",
         "tymon/jwt-auth": "1.0.0-rc.4.1",
         "tymon/jwt-auth": "1.0.0-rc.4.1",
-        "vlucas/phpdotenv": "^3.3"
+        "vlucas/phpdotenv": "^3.3",
+        "illuminate/redis": "^5.8",
+        "predis/predis": "^1.1",
+        "league/csv": "^9.1"
     },
     },
     "require-dev": {
     "require-dev": {
         "fzaninotto/faker": "^1.4",
         "fzaninotto/faker": "^1.4",
@@ -49,11 +52,5 @@
         "optimize-autoloader": true
         "optimize-autoloader": true
     },
     },
     "minimum-stability": "dev",
     "minimum-stability": "dev",
-    "prefer-stable": true,
-    "repositories": {
-        "packagist": {
-            "type": "composer",
-            "url": "https://packagist.laravel-china.org"
-        }
-    }
+    "prefer-stable": true
 }
 }

+ 1 - 1
database/migrations/2019_06_03_162403_create_table_post_data.php

@@ -70,7 +70,7 @@ class CreateTablePostData extends Migration
 
 
             $table->integer('will_collect_bean')
             $table->integer('will_collect_bean')
                 ->default(0)
                 ->default(0)
-                ->comment('待收彩虹豆数');
+                ->comment('待收彩虹豆数');
 
 
             $table->integer('collect_bean')
             $table->integer('collect_bean')
                 ->default(0)
                 ->default(0)

+ 55 - 0
database/migrations/2019_06_11_095634_create_table_downloads.php

@@ -0,0 +1,55 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateTableDownloads extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('downloads', function (Blueprint $table) {
+            $table->bigIncrements('id');
+
+            $table->integer('uid')
+                ->unsigned()
+                ->comment('用户uid');
+
+            $table->string('username', 32)
+                ->default('')
+                ->comment('用户昵称');
+
+            $table->string('download_type', 32)
+                ->default('post')
+                ->comment('类型:post内容,post_waste内容回收站');
+
+            $table->tinyInteger('download_status')
+                ->default(0)
+                ->comment('状态:0生成中,1成功,2失败');
+
+            $table->mediumText('params')
+                ->comment('参数');
+
+            $table->string('url', 255)
+                ->default('')
+                ->comment('下载地址');
+
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('downloads');
+    }
+}

+ 30 - 0
database/migrations/2019_06_11_163708_modify_download_status_to_table_download.php

@@ -0,0 +1,30 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class ModifyDownloadStatusToTableDownload extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::statement("ALTER TABLE downloads MODIFY COLUMN download_status TINYINT (4) NOT NULL DEFAULT 0 COMMENT '下载状态:0待处理,1生成中,2成功,3失败'");
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('download', function (Blueprint $table) {
+            //
+        });
+    }
+}

+ 1 - 1
deploy/nginx/conf.d/app.beta.conf

@@ -7,7 +7,7 @@ server {
     location ~ \.php$ {
     location ~ \.php$ {
         try_files $uri =404;
         try_files $uri =404;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
-        fastcgi_pass app_order_manage_beta:9000;
+        fastcgi_pass app_community_manage_beta:9000;
         fastcgi_index index.php;
         fastcgi_index index.php;
         include fastcgi_params;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

+ 1 - 1
deploy/nginx/conf.d/app.dev.conf

@@ -7,7 +7,7 @@ server {
     location ~ \.php$ {
     location ~ \.php$ {
         try_files $uri =404;
         try_files $uri =404;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
-        fastcgi_pass app_order_manage_dev:9000;
+        fastcgi_pass app_community_manage_dev:9000;
         fastcgi_index index.php;
         fastcgi_index index.php;
         include fastcgi_params;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

+ 5 - 5
docker-compose-beta.yml

@@ -1,24 +1,24 @@
 version: '3'
 version: '3'
 
 
 services:
 services:
-  app_order_manage_beta:
+  app_community_manage_beta:
     image: harbor.caihongxingqiu.com:9401/library/php:latest
     image: harbor.caihongxingqiu.com:9401/library/php:latest
     tty: true
     tty: true
     working_dir: /var/www
     working_dir: /var/www
     volumes:
     volumes:
       - ./:/var/www
       - ./:/var/www
       - ./deploy/php/local.ini:/usr/local/etc/php/conf.d/local.ini
       - ./deploy/php/local.ini:/usr/local/etc/php/conf.d/local.ini
-      - /data/wwwroot/beta/order-manage:/data/wwwroot/beta/order-manage
+      - /data/wwwroot/beta/community-manage:/data/wwwroot/beta/community-manage
     networks:
     networks:
       - chxq
       - chxq
 
 
-  server_order_manage_beta:
+  server_community_manage_beta:
     image: harbor.caihongxingqiu.com:9401/library/nginx:latest
     image: harbor.caihongxingqiu.com:9401/library/nginx:latest
     tty: true
     tty: true
     depends_on:
     depends_on:
-      - app_order_manage_beta
+      - app_community_manage_beta
     ports:
     ports:
-      - "28214:80"
+      - "28218:80"
     volumes:
     volumes:
       - ./:/var/www
       - ./:/var/www
       - ./deploy/nginx/conf.d/app.beta.conf:/etc/nginx/conf.d/app.beta.conf
       - ./deploy/nginx/conf.d/app.beta.conf:/etc/nginx/conf.d/app.beta.conf

+ 4 - 4
docker-compose-dev.yml

@@ -1,7 +1,7 @@
 version: '3'
 version: '3'
 
 
 services:
 services:
-  app_order_manage_dev:
+  app_community_manage_dev:
     image: harbor.caihongxingqiu.com:9401/library/php:latest
     image: harbor.caihongxingqiu.com:9401/library/php:latest
     tty: true
     tty: true
     working_dir: /var/www
     working_dir: /var/www
@@ -11,13 +11,13 @@ services:
     networks:
     networks:
       - chxq
       - chxq
 
 
-  server_order_manage_dev:
+  server_community_manage_dev:
     image: harbor.caihongxingqiu.com:9401/library/nginx:latest
     image: harbor.caihongxingqiu.com:9401/library/nginx:latest
     tty: true
     tty: true
     depends_on:
     depends_on:
-      - app_order_manage_dev
+      - app_community_manage_dev
     ports:
     ports:
-      - "18214:80"
+      - "18218:80"
     volumes:
     volumes:
       - ./:/var/www
       - ./:/var/www
       - ./deploy/nginx/conf.d/app.dev.conf:/etc/nginx/conf.d/app.dev.conf
       - ./deploy/nginx/conf.d/app.dev.conf:/etc/nginx/conf.d/app.dev.conf

+ 7 - 0
resources/lang/zh-CN/validation.php

@@ -100,6 +100,7 @@ return [
     */
     */
 
 
     'attributes' => [
     'attributes' => [
+        'post_id' => '内容id',
         'uid' => '用户uid',
         'uid' => '用户uid',
         'type' => '类型',
         'type' => '类型',
         'is_suggest' => '是否推荐',
         'is_suggest' => '是否推荐',
@@ -111,6 +112,12 @@ return [
         'location' => '位置',
         'location' => '位置',
         'imgs' => '图组',
         'imgs' => '图组',
         'imgs.*' => '图集',
         'imgs.*' => '图集',
+        'add_pv' => '增加浏览量',
+        'add_praise_count' => '增加点赞数',
+        'add_collect_count' => '增加收藏数',
+        'add_share_count' => '增加分享数',
+        'download_type' => '下载类型',
+        'download_status' => '下载状态',
     ],
     ],
 
 
 ];
 ];

+ 61 - 21
routes/api.php

@@ -16,33 +16,73 @@ $api = app('Dingo\Api\Routing\Router');
 $api->version('v1', [
 $api->version('v1', [
     'namespace' => 'App\Http\Controllers',
     'namespace' => 'App\Http\Controllers',
 ], function ($api) {
 ], function ($api) {
-    //登录
 
 
-    $api->post('login', 'AuthController@authenticate');
+    $api->group(['middleware' => 'jwt.chxq_auth'], function ($api) {
+        //配置
+        $api->get('config', 'ConfigController@index');
 
 
+        //下载列表
+        $api->get('download', 'DownloadController@index');
+        //新增下载
+        $api->post('download', 'DownloadController@create');
 
 
+        $api->group(['namespace' => 'Post'], function ($api) {
+            //发布内容
+            $api->post('post', 'PostController@create');
+            //内容列表
+            $api->get('post', 'PostController@index');
+            //内容详情
+            $api->get('post/detail', 'PostController@detail');
+            //推荐内容
+            $api->put('post/suggest', 'PostController@suggest');
+            //删除内容
+            $api->delete('post/delete', 'PostController@delete');
+            //隐藏内容
+            $api->put('post/hide', 'PostController@hide');
 
 
-    $api->group(['middleware' => 'auth:api'], function ($api) {
-        //注册
-        $api->post('reg', 'AuthController@register');
-        //登出
-        $api->post('logout', 'AuthController@logout');
-        //刷新身份令牌
-        $api->post('refresh', 'AuthController@refresh');
-    });
+            //增加数据
+            $api->put('post/addData', 'PostController@addData');
 
 
-    //测试
-    $api->get('test', 'TestController@index');
-    //配置
-    $api->get('config', 'ConfigController@index');
-    $api->group(['namespace' => 'Post'], function ($api) {
-        //发布内容
-        $api->post('post', 'PostController@create');
-        //内容列表
-        $api->get('post', 'PostController@index');
-    });
+            //评论列表
+            $api->get('post/comment', 'PostController@commentList');
+            //评论&回复
+            $api->post('post/comment', 'PostController@comment');
+            //删除评论
+            $api->delete('post/comment/delete', 'PostController@commentDelete');
 
 
-    $api->group(['middleware' => 'jwt.chxq_auth'], function ($api) {
+            //回收站列表
+            $api->get('post/waste', 'PostController@waste');
+            //回收站复原
+            $api->put('post/waste', 'PostController@restore');
+
+            //日志列表
+            $api->get('post/log', 'PostController@log');
+
+        });
+        $api->group(['namespace' => 'Topic'], function ($api) {
+            //新增话题分类
+            $api->post('topic/categoryCreate', 'CategoryController@create');
+            //话题分类列表
+            $api->get('topic/categoryIndex', 'CategoryController@index');
+            //话题分类详情
+            $api->get('topic/categoryView', 'CategoryController@view');
+            //推荐分类
+            $api->put('topic/categoryIsSuggest', 'CategoryController@isSuggest');
+            //编辑话题
+            $api->put('topic/categoryEdit', 'CategoryController@edit');
+            //新增话题
+            $api->post('topic/topicCreate', 'TopicController@create');
+            //编辑话题
+            $api->put('topic/topicEdit', 'TopicController@edit');
+            //列表
+            $api->get('topic/topicIndex', 'TopicController@index');
+            //详情
+            $api->get('topic/topicView', 'TopicController@view');
+            //开启话题
+            $api->put('topic/topicIsOpen', 'TopicController@isOpen');
+            //设置推荐 &热门话题
+            $api->put('topic/topicSetStatus', 'TopicController@setStatus');
+        });
 
 
     });
     });
     //行为
     //行为