| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 | <?phpnamespace App\Http\Controllers\Manage\Book;use App\Modules\Book\Models\Book;use App\Http\Controllers\Manage\Book\Transformers\ChapterListTransformer;use App\Http\Controllers\Manage\Book\Transformers\ChapterTransformer;use App\Modules\Book\Services\BookConfigService;use App\Modules\Book\Services\ChapterService;use Illuminate\Http\Request;use App\Http\Controllers\Controller;use Storage;use Hashids;use DB;class ChapterController extends Controller{    /**     * @apiDefine BookChapter 图书章节模块     */    /**     * @apiVersion 1.0.0     * @apiDescription 章节列表分页     * @api {get} books/{bid}/chapter 章节列表分页     * @apiGroup BookChapter     * @apiName getChapterLists     * @apiParam   {Int}         page_size  分页大小(默认15)     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Array}       data.list 分页结果集     * @apiSuccess {Int}         data.list.bid   bid     * @apiSuccess {Int}         data.list.chapter_id   章节id     * @apiSuccess {String}      data.list.chapter_name   章节名称     * @apiSuccess {Int}         data.list.chapter_sequence   序号     * @apiSuccess {Int}         data.list.chapter_is_vip   是否vip     * @apiSuccess {Int}         data.list.chapter_size   章节大小     * @apiSuccess {Int}         data.list.prev_cid   上一章节id     * @apiSuccess {Int}         data.list.next_cid   下一章节     * @apiSuccess {String}      data.list.recent_update_at   更新时间     * @apiSuccess {String}      data.list.is_need_subscirbe   是否强制关注     * @apiSuccess {object}      data.meta   分页信息     * @apiSuccess {Int}         data.meta.total  总条数     * @apiSuccess {Int}         data.meta.per_page  每页条数     * @apiSuccess {Int}         data.meta.current_page 当前页     * @apiSuccess {Int}         data.meta.last_page  最后页     * @apiSuccess {String}      data.meta.next_page_url  下一页     * @apiSuccess {String}      data.meta.prev_page_url  上一页     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data:     *            list:[     *             {     *               bid: 5,     *               chapter_id: 5,     *               chapter_name: "第1240章 不是我",     *               chapter_sequence: 1239,     *               chapter_is_vip: 1,     *               chapter_size: 2422,     *               prev_cid: 0,     *               next_cid: 0,     *               recent_update_at: 2017-11-20 15:01:56,     *               is_need_subscirbe: 1,     *            },     *             {     *               bid: 5,     *               chapter_id: 5,     *               chapter_name: "第1240章 不是我",     *               chapter_sequence: 1239,     *               chapter_is_vip: 1,     *               chapter_size: 2422,     *               prev_cid: 0,     *               next_cid: 0,     *               recent_update_at: 2017-11-20 15:01:56,     *               is_need_subscirbe: 1,     *            },     *          ]     *          meta:{     *              total: 1253,     *              per_page: 15,     *              current_page: 1,     *              last_page: 84,     *              next_page_url: "http://myapi.cn/api/books/1/chapter?page=2",     *              prev_page_url: ""     *         }     *       }     */    public function getChapterLists(Request $request,$bid){        $page_size = $request->input('page_size',15);        $lists = ChapterService::getChapterListsPage($bid,$page_size);        $book = BookConfigService::getBookById($bid);//force_subscribe_chapter_seq        foreach ($lists as &$item){            $item->is_recommend = 0;            $item->recommend_text = '';            if($item->sequence>= ($book->force_subscribe_chapter_seq)){                $item->is_need_subscirbe = 1;            }else{                $item->is_need_subscirbe = 0;            }            if($item->id == $book->recommend_cid ){                $item->is_recommend = 1;                if( Storage::exists('RecommendChapterPositionWord.txt')){                    $item->recommend_text = Storage::get('RecommendChapterPositionWord.txt');                }else{                    $item->recommend_text = '建议此章节生成推广文案(原文转化率好)';                }                            }        }        return response()->pagination(new ChapterListTransformer,$lists);    }    /**     * @apiVersion 1.0.0     * @apiDescription 前5章章节内容     * @api {get} books/{bid}/fivechapter 前5章章节内容     * @apiGroup BookChapter     * @apiName getTopFiveChapter     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Int}         data.chapter_id   章节id     * @apiSuccess {String}      data.chapter_name   章节名称     * @apiSuccess {Int}         data.chapter_sequence   序号     * @apiSuccess {Int}         data.chapter_is_vip   是否vip     * @apiSuccess {Int}         data.chapter_size   章节大小     * @apiSuccess {Int}         data.prev_cid   上一章节id     * @apiSuccess {Int}         data.next_cid   下一章节     * @apiSuccess {String}      data.recent_update_at   更新时间     * @apiSuccess {String}      data.chapter_content  章节内容     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: [{     *               chapter_id: 5,     *               chapter_name: "第1240章 不是我",     *               chapter_sequence: 1239,     *               chapter_is_vip: 1,     *               chapter_size: 2422,     *               prev_cid: 0,     *               next_cid: 0,     *               recent_update_at: 2017-11-20 15:01:56,     *               chapter_content: "叶妩被司行霈的阴阳怪气一吓,思路偏得太远了。 她张口结舌,忘记了自己要说什么。",     *            },     *           ]     *       }     */    public function getTopFiveChapter($bid){        $res = ChapterService::getTopFiveChapter($bid);        return response()->collection(new ChapterTransformer,$res);    }    /**     * @apiVersion 1.0.0     * @apiDescription 章节列表和内容     * @api {get} books/{bid}/chapter 章节列表和内容     * @apiGroup BookChapter     * @apiName getCatalogPagination     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Int}         data.chapter_id   章节id     * @apiSuccess {String}      data.chapter_name   章节名称     * @apiSuccess {Int}         data.chapter_sequence   序号     * @apiSuccess {Int}         data.chapter_is_vip   是否vip     * @apiSuccess {Int}         data.chapter_size   章节大小     * @apiSuccess {Int}         data.prev_cid   上一章节id     * @apiSuccess {Int}         data.next_cid   下一章节     * @apiSuccess {String}      data.recent_update_at   更新时间     * @apiSuccess {String}      data.chapter_content  章节内容     * @apiSuccess {Int}      data.is_recommend  是否是推荐章节     * @apiSuccess {String}      data.recommend_text  推荐章节标题     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: list:[     *             {     *               bid: 5,     *               chapter_id: 5,     *               chapter_name: "第1240章 不是我",     *               chapter_sequence: 1239,     *               chapter_is_vip: 1,     *               chapter_size: 2422,     *               prev_cid: 0,     *               next_cid: 0,     *               recent_update_at: 2017-11-20 15:01:56,     *               is_need_subscirbe: 1,     *               chapter_content:"这事儿还得从2010年的暑假说起"     *            },     *             {     *               bid: 5,     *               chapter_id: 5,     *               chapter_name: "第1240章 不是我",     *               chapter_sequence: 1239,     *               chapter_is_vip: 1,     *               chapter_size: 2422,     *               prev_cid: 0,     *               next_cid: 0,     *               recent_update_at: 2017-11-20 15:01:56,     *               is_need_subscirbe: 1,     *               chapter_content:"这事儿还得从2010年的暑假说起"     *            },     *          ]     *          meta:{     *              total: 1253,     *              per_page: 15,     *              current_page: 1,     *              last_page: 84,     *              next_page_url: "http://myapi.cn/api/books/1/chapter?page=2",     *              prev_page_url: ""     *         }     *       }     */    function getCatalogPagination(Request $request, $bid)    {        if(!is_numeric($bid)){            $bid = Hashids::decode($bid)[0];        }        $page_size = $request->input('page_size',15);        $lists = ChapterService::getChapterPage($bid,$page_size);        $book = BookConfigService::getBookById($bid);        foreach ($lists as &$item){            $item->is_recommend = '';            $item->recommend_text = '';            if($item->sequence>= ($book->force_subscribe_chapter_seq)){                $item->is_need_subscirbe = 1;            }else{                $item->is_need_subscirbe = 0;            }            if($item->id == $book->recommend_cid ){                $item->is_recommend = 1;                if( Storage::exists('RecommendChapterPositionWord.txt')){                    $item->recommend_text = Storage::get('RecommendChapterPositionWord.txt');                }else{                    $item->recommend_text = '建议此章节生成推广文案(原文转化率好)';                }                            }        }        return response()->pagination(new ChapterListTransformer,$lists);    }    /**     * @apiVersion 1.0.0     * @apiDescription 修改vip章节     * @api {get} chapter/setvip 修改vip章节     * @apiGroup BookChapter     * @apiName editChapterVip     * @apiParam   {int}         bid  bid     * @apiParam   {int}         vip  vip数     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *       }     */    public function editChapterVip(Request $request){        $bid = $request->get('bid');        $vip_num = $request->get('vip');        if(empty($bid) || $vip_num == ''){            return response()->error('PARAM_EMPTY');        }         ChapterService::editVip($bid,$vip_num);        BookConfigService::editVipSeq($bid,$vip_num);        return response()->success();    }    /**     * @apiVersion 1.0.0     * @apiDescription 修改章节内容     * @api {post} chapter/content 修改章节内容     * @apiGroup BookChapter     * @apiName editChapterVip     * @apiParam   {int}         bid  bid     * @apiParam   {int}         cid  章节id     * @apiParam   {String}      content  内容     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *       }     */    public function editChapterContent(Request $request){        $cid = $request->input('cid');        $bid = $request->input('bid');        $content = $request->input('content');        if(empty($cid) || empty($bid) || empty($content)){            return response()->error('PARAM_EMPTY');        }        $chapter = ChapterService::getChapterFromDb($bid,$cid);        $chapter->content = $content;        $chapter->size = ceil(strlen($content)/3);        ChapterService::editChapter($chapter);        return response()->success();    }    /**     * @apiVersion 1.0.0     * @apiDescription 修改章节名     * @api {get} chapter/editChapterName 修改章节名     * @apiGroup BookChapter     * @apiName editChapterName     * @apiParam   {int}         cid  章节id     * @apiParam   {String}      chaper_name  章节名     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *       }     */    public function editChapterName(Request $request){        $cid = $request->get('cid');        $chaper_name = $request->get('chaper_name');        if(empty($cid) || empty($chaper_name)){            return response()->error('PARAM_EMPTY');        }        ChapterService::updateChapterName($cid,$chaper_name);        return response()->success();    }    /**     * @apiVersion 1.0.0     * @apiDescription 删除章节     * @api {get} chapter/deleteChapter 删除章节     * @apiGroup BookChapter     * @apiName deleteChapter     * @apiParam   {int}         cid  章节id     * @apiParam   {int}         bid  bid     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *       }     */    public function deleteChapter(Request $request){        $cid = $request->get('cid');        $bid = $request->get('bid');        if(empty($cid) || empty($bid)){            return response()->error('PARAM_EMPTY');        }        $chapter = ChapterService::getChapterById($cid);        if(!$chapter || $chapter->bid< 0){            return response()->error('PARAM_EMPTY');        }        $book = Book::where('id',$bid)->first();        $chapter->bid = -$chapter->bid;        $chapter->save();        ChapterService::updateSequence($bid,$chapter->sequence);        $this->adjustSequentOne($bid,$chapter->sequence-1,$chapter->sequence+1);        $book->size -= $chapter->size;        if($chapter->sequence == 1){            $next = ChapterService::getChapterInfoByBidAndSeq($bid,1);            ChapterService::updateOne($chapter->next_cid,['prev_cid'=>0]);            if($next){                $book->first_cid = $next->id;            }        }        if($chapter->sequence == $book->chapter_count){            $prev = ChapterService::getChapterInfoByBidAndSeq($bid,$chapter->sequence-1);            ChapterService::updateOne($chapter->prev_cid,['next_cid'=>0]);            if($prev){                $book->last_cid = $prev->id;                $book->last_chapter = $prev->name;            }        }        $book->chapter_count -= 1;        $book->save();        return response()->success();    }    /**     * @apiVersion 1.0.0     * @apiDescription 新增章节     * @api {post} chapter/addChapter 新增章节     * @apiGroup BookChapter     * @apiName addChapter     * @apiParam   {string}      name  章节名     * @apiParam   {string}      content  内容     * @apiParam   {int}         sequence  顺序     * @apiParam   {int}         is_vip  是否vip     * @apiParam   {int}         bid   bid     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *       }     */    public function addChapter(Request $request){        $param = $request->except('_url');        $res = checkParam($param,['name','content','sequence','is_vip','bid']);        if($res){            return response()->error('PARAM_EMPTY',['msg'=>$res]);        }        if(!is_numeric($param['sequence'])){            return response()->error('PARAM_ERROR',['msg'=>'sequence']);        }        $book = Book::where('id',$param['bid'])->first();        if(!$book){            return response()->error('PARAM_ERROR',['msg'=>'bid not exist']);        }        DB::beginTransaction();        try{            ChapterService::updateSequenceIncr($param['bid'],$param['sequence']);            $param['size'] = mb_strlen($param['content']);            $param['recent_update_at'] = date('Y-m-d H:i:s');            $param['prev_cid'] = 0;            $param['next_cid'] = 0;            $param['ly_chapter_id'] = 0;            $result = ChapterService::createChapter($param);            if($param['sequence'] == 1){                $book->first_cid = $result->id;            }            if($param['sequence'] == $book->chapter_count+1){                $book->last_cid = $result->id;                $book->last_chapter = $param['name'];            }            $this->adjustSequentOne($param['bid'],$param['sequence']-1,$param['sequence']+1);            $book->chapter_count++;            $book->size += $param['size'] ;            $book->save();            DB::commit();            return response()->success();        }catch (\Exception $e){            DB::rollBack();        }        return response()->error('UNKNOWN_ERROR');    }    private function adjustSequentOne($bid,$startsequence,$endsequence){        $chapter_list = DB::table('chapters')            ->whereBetween('sequence',[$startsequence,$endsequence])->orderBy('sequence')->where('bid',$bid)->get();        $prev = 0;        foreach ($chapter_list as $chapter){            if($prev){                DB::table('chapters')->where('id',$chapter->id)->update(['prev_cid'=>$prev]);                DB::table('chapters')->where('id',$prev)->update(['next_cid'=>$chapter->id]);            }            $prev = $chapter->id;        }    }}
 |