| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749 | <?phpnamespace App\Http\Controllers\Manage\Book;use App\Http\Controllers\Controller;use App\Http\Controllers\Manage\Book\Transformers\BookTransformer;use App\Http\Controllers\Manage\Book\Transformers\SmartPushBookTransformer;use App\Modules\Book\Models\Book;use App\Modules\Book\Models\BookConfig;use App\Modules\Book\Services\BookConfigService;use App\Modules\Book\Services\BookService;use App\Modules\Book\Services\BookSpecialChannelService;use App\Modules\Book\Services\BookTagsService;use App\Modules\Channel\Services\ChannelService;use App\Modules\Statistic\Services\WapVisitStatService;use App\Modules\Product\Services\ProductService;use DB;use Hashids;use Cache;use Illuminate\Http\Request;use OSS\Core\OssException;use OSS\OssClient;use Redis;use Storage;class BookController extends Controller{    /**     * @apiDefine Book 图书模块     */    /**     * @apiVersion 1.0.0     * @apiDescription 按bid获取图书详情     * @api {get} book/{bid} 获取图书详情     * @apiGroup Book     * @apiName getBookById     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Int}         data.book_id   bid     * @apiSuccess {String}      data.book_name   书名     * @apiSuccess {String}      data.book_summary   简介     * @apiSuccess {String}      data.book_author   作者     * @apiSuccess {String}      data.cover_url   封面     * @apiSuccess {Int}         data.book_word_count   字数     * @apiSuccess {Int}         data.book_chapter_total   章节数     * @apiSuccess {Int}         data.book_category_id   分类     * @apiSuccess {String}      data.book_category   分类名     * @apiSuccess {Int}         data.book_end_status   是否完结     * @apiSuccess {String}      data.book_published_time   发布时间     * @apiSuccess {String}      data.copyright   版权信息     * @apiSuccess {Int}         data.force_subscribe_chapter_id   强制关注的章节数     * @apiSuccess {String}      data.update_time   更新时间     * @apiSuccess {Int}         data.is_on_shelf   是否上架     * @apiSuccess {Int}         data.book_price   价格     * @apiSuccess {String}      data.charge_type   收费类型     * @apiSuccess {String}      data.keyword   关键词     * @apiSuccess {String}      data.recommend_index  推荐指数     * @apiSuccess {String}      data.is_show_index_content  是否显示推荐指数文本     * @apiSuccess {Int}         data.click_count  点击数     * @apiSuccess {Int}         data.product_id  product_id     * @apiSuccess {Int}         data.sex_preference  性别偏象     * @apiSuccess {Int}         data.last_cid  最后一章id     * @apiSuccess {Int}         data.last_chapter  最后一章名     * @apiSuccess {Int}         data.first_cid  第一章cid     * @apiSuccess {String}      data.old_name  旧书名     * @apiSuccess {String}      data.recommend_text  推广标题     * @apiSuccess {String}      data.is_high_quality  是否优质     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *                   book_id: 5,     *                   book_name: "肌缘巧合",     *                   book_summary: "    他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",     *                   book_author: "妖火",     *                   cover_url: "http://www.leyuee.com/cover/0/8.jpg",     *                   book_word_count: 0,     *                   book_chapter_total: 0,     *                   book_category_id: null,     *                   book_category: "爆笑,宠文,潜规则",     *                   book_end_status: 8,     *                   book_published_time: null,     *                   copyright: null,     *                   charge_type: null,     *                   force_subscribe_chapter_id: 0,     *                   update_time: null,     *                   is_on_shelf: 0,     *                   book_price: null,     *                   keyword:   关键词,     *                   recommend_index:2,     *                   is_show_index_content:0,     *                   click_count:0,     *                   product_id:0,     *                   sex_preference:0,     *                   last_cid:0     *                   last_chapter:hello     *           }     *       }     */    public function getBookById($bid)    {        $res = BookConfigService::getBookById($bid);        $content = '';        if (Storage::exists('RecommendChapterPositionWord.txt')) {            $content = Storage::get('RecommendChapterPositionWord.txt');        } else {            $content = '建议此章节生成推广文案(原文转化率好)';        }        $res->recommend_text = $content;        return response()->item(new BookTransformer(), $res);    }    /**     * @apiVersion 1.0.0     * @apiDescription 修改上架状态 0下架 0     * @api {get} books/shelf/status 上架图书     * @apiParam {int} on_shelf_status     * @apiParam {int} bid     * @apiGroup Book     * @apiName changeShelfStatus     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function changeShelfStatus(Request $request)    {        $bid = $request->input('bid');        $shelf_status = $request->input('on_shelf_status');        if (!in_array($shelf_status, [0, 1, 2, 3])) response()->error('PARAM_EMPTY');        if (empty($bid)) return response()->error('PARAM_EMPTY');        $data = ['is_on_shelf' => $shelf_status];        if ($shelf_status == 1) {            $off_shelf_domain = env('OFF_SHELF_DOMAIN');            if ($off_shelf_domain) {                $data['promotion_domain'] = $off_shelf_domain;            }        }        if (BookConfigService::updateBookConfig($bid, $data)) {            return response()->success();        } else {            return response()->error('PARAM_ERROR');        }    }    /**     * @apiVersion 1.0.0     * @apiDescription 编辑图书     * @api {post} books/{bid}/edit 编辑图书     * @apiName editBookConfig     * @apiParam {Int} force_subscribe_chapter_seq 强制关注的章节数(非必需)     * @apiParam {Int} price 图书价格(单位:分)(非必需)     * @apiParam {String} cover 封面(非必需)     * @apiParam {String} book_name 书名(非必需)     * @apiParam {String} copyright 版权说明(非必需)     * @apiParam {String} charge_type 收费类型 按本、按章CHAPTER、BOOK(非必需)     * @apiParam {Int} hot 热度(非必需)     * @apiParam {Int} is_on_shelf 是否上架 1:上架 0:不上架(非必需)     * @apiParam {Int} is_on_shelf 是否上架 1:上架 0:不上架(非必需)     * @apiParam {String} source_domain 来源域名(非必需)     * @apiParam {Int} is_show_index_content 是否推荐指数文本     * @apiParam {Int} product_id product_id     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function editBookConfig(Request $request, $bid)    {        if (empty($bid)) return response()->error('PARAM_EMPTY');        //$bid = $request->input('bid');        $force_subscribe_chapter_seq = $request->input('force_subscribe_chapter_seq');        $price = $request->input('price');        $cover = $request->input('cover');        $book_name = $request->input('book_name');        $copyright = $request->input('copyright');        $charge_type = $request->input('charge_type');        $hot = $request->input('hot');        $roles = $request->input('roles');        $is_on_shelf = $request->input('is_on_shelf');        $source_domain = $request->input('source_domain');        $promotion_domain = $request->input('promotion_domain');        $recommend_index = $request->input('recommend_index');        $is_show_index_content = $request->input('is_show_index_content');        $product_id = $request->input('product_id');        $status = $request->input('status');        $book_category_id = $request->input('book_category_id');        $data = [];        if (isset($force_subscribe_chapter_seq) && $force_subscribe_chapter_seq !== '') $data['force_subscribe_chapter_seq'] = $force_subscribe_chapter_seq;        if (isset($price) && !empty($price)) $data['price'] = $price;        if (isset($cover) && !empty($cover)) $data['cover'] = $cover;        if (isset($book_name) && !empty($book_name)) $data['book_name'] = $book_name;        if (isset($copyright) && !empty($copyright)) $data['copyright'] = $copyright;        if (isset($charge_type) && !empty($charge_type)) $data['charge_type'] = $charge_type;        if (isset($hot) && !empty($hot)) $data['hot'] = $hot;        if (isset($roles) && !empty($roles)) $data['roles'] = $roles;        if (isset($is_on_shelf) && $is_on_shelf !== '') $data['is_on_shelf'] = (int)$is_on_shelf;        if (isset($source_domain) && !empty($source_domain)) $data['source_domain'] = $source_domain;        if (isset($recommend_index) && $recommend_index !== '') $data['recommend_index'] = $recommend_index;        if (isset($is_show_index_content)) $data['is_show_index_content'] = (int)$is_show_index_content;        if (isset($product_id) && $product_id !== '') $data['product_id'] = (int)$product_id;        if (isset($status) && $status !== '') $data['status'] = (int)$status;        if (isset($book_category_id) && $book_category_id != '') $data['book_category_id'] = (int)$book_category_id;        if (isset($promotion_domain) && $promotion_domain != '') $data['promotion_domain'] = $promotion_domain;        if (empty($data)) return response()->error('PARAM_EMPTY');        if (BookConfigService::updateBookConfig($bid, $data)) {            return response()->success();        }        return response()->error('UNKNOWN_ERROR');    }    /**     * @apiVersion 1.0.0     * @apiDescription 编辑版权信息     * @api {post} books/editcopyright 编辑版权信息     * @apiName editCopyRight     * @apiParam {Int} bid 图书id     * @apiParam {String} [copyright_limit_data] 版权截至日期     * @apiParam {String} [copyright] 版权说明     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function editCopyRight(Request $request)    {        $bid = $request->input('bid');        if (empty($bid)) return response()->error('PARAM_EMPTY');        $copyright = $request->input('copyright');        $copyright_limit_data = $request->input('copyright_limit_data');        if (isset($copyright)) {            $data['copyright'] = $copyright;        }        if (isset($copyright_limit_data)) {            $data['copyright_limit_data'] = $copyright_limit_data;        }        if (empty($data)) return response()->error('PARAM_EMPTY');        if (BookConfigService::updateBookConfig($bid, $data)) {            return response()->success();        }        return response()->error('UNKNOWN_ERROR');    }    /**     * @apiVersion 1.0.0     * @apiDescription 编辑图书域名     * @api {post} books/editPromotionUrl 编辑图书域名     * @apiName editPromotionDomain     * @apiParam {Int} bid 图书id     * @apiParam {String} promotion_domain 图书域名多个以都好隔开     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function editPromotionDomain(Request $request)    {        $bid = $request->input('bid');        if (empty($bid)) return response()->error('PARAM_EMPTY');        $promotion_domain = $request->input('promotion_domain');        if (isset($promotion_domain)) {            $data['promotion_domain'] = $promotion_domain;        }        if (empty($data)) return response()->error('PARAM_EMPTY');        if (BookConfigService::updateBookConfig($bid, $data)) {            return response()->success();        }        return response()->error('UNKNOWN_ERROR');    }    /**     * @apiVersion 1.0.0     * @apiDescription 根据分类id和关键词获取并按照推荐指数排序     * @api {get} books/search 图书搜索     * @apiParam {String} key     * @apiParam {Int} category_id  分类id     * @apiParam {String} [domain]  域名 按域名查询     * @apiParam {String} [old_name]  旧书名 按旧书名查询     * @apiParam {String} [copy_right_date]  版权到期时间     * @apiParam {String} order_field  排序字段(推荐指数:recommend_index|点击数:click_count|字数:size|update:时间)     * @apiParam {String} order_seq    排序顺序(顺序:asc|逆序:desc)     * @apiParam {Int}   is_on_shelf   上架与否(0|1)     * @apiParam {Int}   page_size     分页大小     * @apiParam {Int}   status        完结与否(0|1)     * @apiGroup Book     * @apiName getBooksByWhere     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Array}       data.list 结果数据集     * @apiSuccess {Int}         data.list.book_id   bid     * @apiSuccess {String}      data.list.book_name   书名     * @apiSuccess {String}      data.list.book_summary   简介     * @apiSuccess {String}      data.list.book_author   作者     * @apiSuccess {String}      data.list.cover_url   封面     * @apiSuccess {Int}         data.list.book_word_count   字数     * @apiSuccess {Int}         data.list.book_chapter_total   章节数     * @apiSuccess {Int}         data.list.book_category_id   分类     * @apiSuccess {String}      data.list.book_category   分类名     * @apiSuccess {String}      data.list.book_end_status   是否完结     * @apiSuccess {String}      data.list.book_published_time   发布时间     * @apiSuccess {String}      data.list.copyright   版权信息     * @apiSuccess {Int}         data.list.force_subscribe_chapter_id   强制关注的章节数     * @apiSuccess {String}      data.list.update_time   更新时间     * @apiSuccess {Int}         data.list.is_on_shelf   是否上架     * @apiSuccess {String}      data.list.book_price   是否上架     * @apiSuccess {String}      data.list.recommend_index  推荐指数     * @apiSuccess {Int}         data.list.charge_type   收费类型     * @apiSuccess {Int}         data.list.keyword   关键词     * @apiSuccess {Int}         data.list.is_show_index_content   是否显示推荐指数文本     * @apiSuccess {Int}         data.list.click_count  点击数     * @apiSuccess {Int}         data.list.product_id  product_id     * @apiSuccess {Int}         data.list.sex_preference  性格偏向     * @apiSuccess {Int}         data.list.last_cid  最后一章id     * @apiSuccess {Int}         data.list.last_chapter  最后一章名     * @apiSuccess {String}      data.list.old_name  旧书名     * @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   上一页     * @apiSuccess {String}      data.list.is_high_quality  是否优质     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *           list: [     *               {     *                   book_id: 5,     *                   book_name: "肌缘巧合",     *                   book_summary: "    他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",     *                   book_author: "妖火",     *                   cover_url: "http://www.leyuee.com/cover/0/8.jpg",     *                   book_word_count: 0,     *                   book_chapter_total: 0,     *                   book_category_id: null,     *                   book_category: "爆笑,宠文,潜规则",     *                   book_end_status: 8,     *                   book_published_time: null,     *                   copyright: null,     *                   charge_type: null,     *                   force_subscribe_chapter_id: 0,     *                   update_time: null,     *                   is_on_shelf: 1,     *                   book_price: null,     *                   keyword: "温馨,虐心,清水",     *                   recommend_index:2,     *                   is_show_index_content:0,     *                   click_count:0,     *                   product_id:0,     *                   sex_preference:0,     *                   last_cid:0,     *                   last_chapter:0,     *               },     *           ],     *           meta: {     *               total: 18,     *               per_page: 15,     *               current_page: 1,     *               last_page: 2,     *               next_page_url: "http://myapi.cn/api/hotrank/books?page=2",     *               prev_page_url: ""     *           }     *           }     *       }     */    public function getBooksByWhere(Request $request)    {        $where = [];        $order = ['book_configs.id', 'asc'];        $where['is_on_shelf'] = [1, 2];        $category_id = $request->input('category_id');        if ($category_id) {            if ($category_id == 1) {                $where['channel_name'] = '男频';            } elseif ($category_id == 2) {                $where['channel_name'] = '女频';            } else {                $where['category_id'] = $category_id;            }        }        $old_name = $request->input('old_name');        $domain = $request->input('domain');        $copy_right_date = $request->input('copy_right_date');        $bid = $request->input('bid');        if ($bid) $where['bid'] = $bid;        if ($old_name) $where['old_name'] = $old_name;        if ($domain) $where['domain'] = $domain;        if ($copy_right_date) $where['copy_right_date'] = $copy_right_date;        $author = $request->input('author');        if ($author) $where['author'] = $author;        $key = $request->input('key');        if ($key) {            $where['key'] = $key;        }        $order_field = $request->input('order_field');        $order_seq = $request->input('order_seq');        if ($order_field != '' && in_array($order_field, ['recommend_index', 'click_count', 'update', 'size', 'create'])) {            if ($order_field == 'update') {                $order = ['book_configs.updated_at', 'desc'];            } elseif ($order_field == 'create') {                $order = ['book_configs.created_at', 'desc'];            } else {                $order = [$order_field, 'desc'];            }            if ($order_seq == 'asc') {                $order = [$order_field, 'asc'];            }            if ($order_seq == 'desc') {                $order = [$order_field, 'desc'];            }        }        $status = $request->input('status');        if ($status != '') {            $where['status'] = $status;        }        $page_size = $request->input('page_size', 15);        $books = BookConfigService::getBooks($where, $order, $page_size);        return response()->pagination(new BookTransformer, $books);    }    public function getBooks(Request $request)    {        $book_name = $request->has('book_name') ? $request->input('book_name') : '';        $is_important = $request->has('is_important') ? $request->input('is_important') : 0;        if (1 == $is_important) {            $where['is_on_shelf'] = [1, 2];        } else {            $where['is_on_shelf'] = [2];        }        $data = DB::table('book_configs')->select('book_name', 'bid')->where('book_name', 'like', '%' . $book_name . '%')->whereIn('is_on_shelf', $where)->get();        return response()->success($data);    }    /**     * @apiVersion 1.0.0     * @apiDescription 获取下架图书     * @api {get} offshelf/books 获取下架图书     * @apiParam {Int} [page_size]  分页大小     * @apiParam {String} [domain]  域名 按域名查询     * @apiParam {String} [old_name]  旧书名 按旧书名查询     * @apiParam {String} [copy_right_date]  版权到期时间     * @apiParam {Int} [page]  页码     * @apiGroup Book     * @apiName getOffShelfBooks     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Array}       data 结果数据集     * @apiSuccess {Int}         data.book_id   bid     * @apiSuccess {String}      data.book_name   书名     * @apiSuccess {String}      data.book_summary   简介     * @apiSuccess {String}      data.book_author   作者     * @apiSuccess {String}      data.cover_url   封面     * @apiSuccess {Int}         data.book_word_count   字数     * @apiSuccess {Int}         data.book_chapter_total   章节数     * @apiSuccess {Int}         data.book_category_id   分类     * @apiSuccess {String}      data.book_category   分类名     * @apiSuccess {String}      data.book_end_status   是否完结     * @apiSuccess {String}      data.book_published_time   发布时间     * @apiSuccess {String}      data.copyright   版权信息     * @apiSuccess {Int}         data.force_subscribe_chapter_id   强制关注的章节数     * @apiSuccess {String}      data.update_time   更新时间     * @apiSuccess {Int}         data.is_on_shelf   是否上架     * @apiSuccess {String}      data.book_price   是否上架     * @apiSuccess {String}      data.recommend_index  推荐指数     * @apiSuccess {Int}         data.charge_type   收费类型     * @apiSuccess {Int}         data.keyword   关键词     * @apiSuccess {Int}         data.is_show_index_content   是否显示推荐指数文本     * @apiSuccess {Int}         data.click_count  点击数     * @apiSuccess {Int}         data.product_id   product_id     * @apiSuccess {Int}         data.sex_preference   性格偏向     * @apiSuccess {String}      data.old_name  旧书名     * @apiSuccess {String}      data.is_high_quality  是否优质     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *            [     *               {     *                   book_id: 5,     *                   book_name: "肌缘巧合",     *                   book_summary: "    他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",     *                   book_author: "妖火",     *                   cover_url: "http://www.leyuee.com/cover/0/8.jpg",     *                   book_word_count: 0,     *                   book_chapter_total: 0,     *                   book_category_id: null,     *                   book_category: "爆笑,宠文,潜规则",     *                   book_end_status: 8,     *                   book_published_time: null,     *                   copyright: null,     *                   charge_type: null,     *                   force_subscribe_chapter_id: 0,     *                   update_time: null,     *                   is_on_shelf: 1,     *                   book_price: null,     *                   keyword: "温馨,虐心,清水",     *                   recommend_index:2,     *                   is_show_index_content:0,     *                   click_count:0,     *                   product_id:0,     *                   sex_preference:0,     *               },     *               {}     *           ],     *           meta:{}     *           }     *       }     */    public function getOffShelfBooks(Request $request)    {        $where = ['is_on_shelf' => [0]];        $key = $request->input('key');        $author = $request->input('author');        if ($author) $where['author'] = $author;        if ($key) $where['key'] = $key;        $category_id = $request->input('category_id');        if ($category_id) {            if ($category_id == 1) {                $where['channel_name'] = '男频';            } elseif ($category_id == 2) {                $where['channel_name'] = '女频';            } else {                $where['category_id'] = $category_id;            }        }        $old_name = $request->input('old_name');        $domain = $request->input('domain');        $copy_right_date = $request->input('copy_right_date');        $bid = $request->input('bid');        if ($bid) $where['bid'] = $bid;        if ($old_name) $where['old_name'] = $old_name;        if ($domain) $where['domain'] = $domain;        if ($copy_right_date) $where['copy_right_date'] = $copy_right_date;        $page_size = $request->input('page_size', 15);        $res = BookConfigService::getBooks($where, [], $page_size);        foreach ($res as &$item) {            $item->book_special_channels = [];            $channels = BookSpecialChannelService::getChannelsByBid($item->bid);            if ($channels) {                $channel_array = [];                foreach ($channels as $channel) {                    $channel_array[] = $channel->channel_user_id;                }                $item->book_special_channels = $channel_array;            }        }        return response()->pagination(new BookTransformer, $res);    }    /**     * @apiVersion 1.0.0     * @apiDescription 获取上架架图书     * @api {get} onshelf/books 获取上架架图书     * @apiParam {Int} [page_size]  分页大小     * @apiParam {Int} [page]  页码     * @apiParam {String} [domain]  域名 按域名查询     * @apiParam {String} [old_name]  旧书名 按旧书名查询     * @apiParam {String} [copy_right_date]  版权到期时间     * @apiParam {Int} [type]  1:内部上架,2外部上架     * @apiGroup Book     * @apiName getOnShelfBooks     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Array}       data 结果数据集     * @apiSuccess {Int}         data.book_id   bid     * @apiSuccess {String}      data.book_name   书名     * @apiSuccess {String}      data.book_summary   简介     * @apiSuccess {String}      data.book_author   作者     * @apiSuccess {String}      data.cover_url   封面     * @apiSuccess {Int}         data.book_word_count   字数     * @apiSuccess {Int}         data.book_chapter_total   章节数     * @apiSuccess {Int}         data.book_category_id   分类     * @apiSuccess {String}      data.book_category   分类名     * @apiSuccess {String}      data.book_end_status   是否完结     * @apiSuccess {String}      data.book_published_time   发布时间     * @apiSuccess {String}      data.copyright   版权信息     * @apiSuccess {Int}         data.force_subscribe_chapter_id   强制关注的章节数     * @apiSuccess {String}      data.update_time   更新时间     * @apiSuccess {Int}         data.is_on_shelf   是否上架     * @apiSuccess {String}      data.book_price   是否上架     * @apiSuccess {String}      data.recommend_index  推荐指数     * @apiSuccess {Int}         data.charge_type   收费类型     * @apiSuccess {Int}         data.keyword   关键词     * @apiSuccess {Int}         data.is_show_index_content   是否显示推荐指数文本     * @apiSuccess {Int}         data.click_count  点击数     * @apiSuccess {Int}         data.product_id   product_id     * @apiSuccess {Int}         data.sex_preference   性格偏向     * @apiSuccess {String}      data.old_name  旧书名     * @apiSuccess {String}      data.is_high_quality  是否优质     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *            [     *               {     *                   book_id: 5,     *                   book_name: "肌缘巧合",     *                   book_summary: "    他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",     *                   book_author: "妖火",     *                   cover_url: "http://www.leyuee.com/cover/0/8.jpg",     *                   book_word_count: 0,     *                   book_chapter_total: 0,     *                   book_category_id: null,     *                   book_category: "爆笑,宠文,潜规则",     *                   book_end_status: 8,     *                   book_published_time: null,     *                   copyright: null,     *                   charge_type: null,     *                   force_subscribe_chapter_id: 0,     *                   update_time: null,     *                   is_on_shelf: 1,     *                   book_price: null,     *                   keyword: "温馨,虐心,清水",     *                   recommend_index:2,     *                   is_show_index_content:0,     *                   click_count:0,     *                   product_id:0,     *                   sex_preference:0,     *               },     *               {}     *           ],     *           meta:{}     *           }     *       }     */    public function getOnShelfBooks(Request $request)    {        //\Log::info('setPromotionStatus is: ' ,['param'=>$request->all()]);        $where = ['is_on_shelf' => [1, 2]];        $firstChapterContent = $request->input('firstChapterContent');        $week_promotion = $request->get('weekly_promotion','null');        if(!in_array($week_promotion,[0,1,'0','1','null'])) {            return response()->error('PARAM_ERROR');        }        if($week_promotion != 'null') {            $where['is_current_week_promotion'] = $week_promotion;        }        $type = $request->input('type');        $order = [];        if ($type == 1) {            $where['is_on_shelf'] = 1;            $order = ['book_configs.created_at', 'desc'];        }        if ($type == 2) {            $where['is_on_shelf'] = 2;        }        $author = $request->input('author');        $roles = $request->input('roles');        $tags = $request->input('tags');        if ($author) $where['author'] = $author;        $charge_type = $request->input('charge_type');        if ($charge_type) {            $where['charge_type'] = $charge_type;        }        if($tags){            $where['tags'] = $tags;        }        if ($roles) {            $where['roles'] = $roles;        }        $key = $request->input('key');        if ($key) $where['key'] = $key;        $category_id = $request->input('category_id');        if ($category_id) {            if ($category_id == 1) {                $where['channel_name'] = '男频';            } elseif ($category_id == 2) {                $where['channel_name'] = '女频';            } else {                $where['category_id'] = $category_id;            }        }        if ($firstChapterContent) {            $where['firstChapterContent'] = $firstChapterContent;        }        $old_name = $request->input('old_name');        $domain = $request->input('domain');        $copy_right_date = $request->input('copy_right_date');        $is_high_quality = $request->input('is_high_quality');        if ($is_high_quality != '') {            $where['is_high_quality'] = $is_high_quality;        }        $bid = $request->input('bid');        if ($bid) $where['bid'] = $bid;        if ($old_name) $where['old_name'] = $old_name;        if ($domain) $where['domain'] = $domain;        if ($copy_right_date) $where['copy_right_date'] = $copy_right_date;        $page_size = $request->input('page_size', 15);        $res = BookConfigService::getBooks($where, $order, $page_size);        /*$exist = Cache::get('setPromotionStatus', '');        $book_ids = explode(',', $exist);*/        //\Log::info('setPromotionStatus is: ' . $exist);        foreach ($res as &$item) {            $item->book_special_channels = [];            $channels = BookSpecialChannelService::getChannelsByBid($item->bid);            if ($channels) {                $channel_array = [];                foreach ($channels as $channel) {                    $channel_array[] = $channel->channel_user_id;                }                $item->book_special_channels = $channel_array;            }            $book_tags = BookTagsService::getBookTags($item->bid);            $item->tags = $book_tags;            $item->is_promotion = $item->is_current_week_promotion;            /*foreach ($book_ids as $book_id) {                if ($book_id == $item->bid) {                    $item->is_promotion = 1;                }            }*/        }        return response()->pagination(new BookTransformer, $res);    }    /**     * @apiVersion 1.0.0     * @apiDescription 获取屏蔽图书     * @api {get} cover/books 获取屏蔽图书     * @apiParam {Int} [page_size]  分页大小     * @apiParam {Int} [page]  页码     * @apiParam {String} [domain]  域名 按域名查询     * @apiParam {String} [old_name]  旧书名 按旧书名查询     * @apiParam {String} [copy_right_date]  版权到期时间     * @apiGroup Book     * @apiName getCoverBooks     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Array}       data 结果数据集     * @apiSuccess {Int}         data.book_id   bid     * @apiSuccess {String}      data.book_name   书名     * @apiSuccess {String}      data.book_summary   简介     * @apiSuccess {String}      data.book_author   作者     * @apiSuccess {String}      data.cover_url   封面     * @apiSuccess {Int}         data.book_word_count   字数     * @apiSuccess {Int}         data.book_chapter_total   章节数     * @apiSuccess {Int}         data.book_category_id   分类     * @apiSuccess {String}      data.book_category   分类名     * @apiSuccess {String}      data.book_end_status   是否完结     * @apiSuccess {String}      data.book_published_time   发布时间     * @apiSuccess {String}      data.copyright   版权信息     * @apiSuccess {Int}         data.force_subscribe_chapter_id   强制关注的章节数     * @apiSuccess {String}      data.update_time   更新时间     * @apiSuccess {Int}         data.is_on_shelf   是否上架     * @apiSuccess {String}      data.book_price   是否上架     * @apiSuccess {String}      data.recommend_index  推荐指数     * @apiSuccess {Int}         data.charge_type   收费类型     * @apiSuccess {Int}         data.keyword   关键词     * @apiSuccess {Int}         data.is_show_index_content   是否显示推荐指数文本     * @apiSuccess {Int}         data.click_count  点击数     * @apiSuccess {Int}         data.product_id   product_id     * @apiSuccess {Int}         data.sex_preference   性格偏向     * @apiSuccess {String}      data.old_name  旧书名     * @apiSuccess {String}      data.is_high_quality  是否优质     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *            [     *               {     *                   book_id: 5,     *                   book_name: "肌缘巧合",     *                   book_summary: "    他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",     *                   book_author: "妖火",     *                   cover_url: "http://www.leyuee.com/cover/0/8.jpg",     *                   book_word_count: 0,     *                   book_chapter_total: 0,     *                   book_category_id: null,     *                   book_category: "爆笑,宠文,潜规则",     *                   book_end_status: 8,     *                   book_published_time: null,     *                   copyright: null,     *                   charge_type: null,     *                   force_subscribe_chapter_id: 0,     *                   update_time: null,     *                   is_on_shelf: 1,     *                   book_price: null,     *                   keyword: "温馨,虐心,清水",     *                   recommend_index:2,     *                   is_show_index_content:0,     *                   click_count:0,     *                   product_id:0,     *                   sex_preference:0,     *               },     *               {}     *           ],     *           meta:{}     *           }     *       }     */    public function getCoverBooks(Request $request)    {        $where['is_on_shelf'] = [3, 4];        $key = $request->input('key');        if ($key) $where['key'] = $key;        $author = $request->input('author');        if ($author) $where['author'] = $author;        $category_id = $request->input('category_id');        if ($category_id) {            if ($category_id == 1) {                $where['channel_name'] = '男频';            } elseif ($category_id == 2) {                $where['channel_name'] = '女频';            } else {                $where['category_id'] = $category_id;            }        }        $is_on_shelf = $request->input('is_on_shelf');        if ($is_on_shelf) $where['is_on_shelf'] = $is_on_shelf;        $old_name = $request->input('old_name');        $domain = $request->input('domain');        $copy_right_date = $request->input('copy_right_date');        $bid = $request->input('bid');        if ($bid) $where['bid'] = $bid;        if ($old_name) $where['old_name'] = $old_name;        if ($domain) $where['domain'] = $domain;        if ($copy_right_date) $where['copy_right_date'] = $copy_right_date;        $page_size = $request->input('page_size', 15);        $res = BookConfigService::getBooks($where, [], $page_size);        return response()->pagination(new BookTransformer, $res);    }    /**     * @apiVersion 1.0.0     * @apiDescription 获取优质书籍     * @api {get} getHighQualityBooks/books 获取优质书籍     * @apiParam {Int} [page_size]  分页大小     * @apiParam {Int} [page]  页码     * @apiParam {String} [domain]  域名 按域名查询     * @apiParam {String} [old_name]  旧书名 按旧书名查询     * @apiParam {String} [copy_right_date]  版权到期时间     * @apiGroup Book     * @apiName getHighQualityBooks     * @apiSuccess {int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccess {Array}       data 结果数据集     * @apiSuccess {Int}         data.book_id   bid     * @apiSuccess {String}      data.book_name   书名     * @apiSuccess {String}      data.book_summary   简介     * @apiSuccess {String}      data.book_author   作者     * @apiSuccess {String}      data.cover_url   封面     * @apiSuccess {Int}         data.book_word_count   字数     * @apiSuccess {Int}         data.book_chapter_total   章节数     * @apiSuccess {Int}         data.book_category_id   分类     * @apiSuccess {String}      data.book_category   分类名     * @apiSuccess {String}      data.book_end_status   是否完结     * @apiSuccess {String}      data.book_published_time   发布时间     * @apiSuccess {String}      data.copyright   版权信息     * @apiSuccess {Int}         data.force_subscribe_chapter_id   强制关注的章节数     * @apiSuccess {String}      data.update_time   更新时间     * @apiSuccess {Int}         data.is_on_shelf   是否上架     * @apiSuccess {String}      data.book_price   是否上架     * @apiSuccess {String}      data.recommend_index  推荐指数     * @apiSuccess {Int}         data.charge_type   收费类型     * @apiSuccess {Int}         data.keyword   关键词     * @apiSuccess {Int}         data.is_show_index_content   是否显示推荐指数文本     * @apiSuccess {Int}         data.click_count  点击数     * @apiSuccess {Int}         data.product_id   product_id     * @apiSuccess {Int}         data.sex_preference   性格偏向     * @apiSuccess {String}      data.old_name  旧书名     * @apiSuccess {String}      data.is_high_quality  是否优质     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *            [     *               {     *                   book_id: 5,     *                   book_name: "肌缘巧合",     *                   book_summary: "    他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",     *                   book_author: "妖火",     *                   cover_url: "http://www.leyuee.com/cover/0/8.jpg",     *                   book_word_count: 0,     *                   book_chapter_total: 0,     *                   book_category_id: null,     *                   book_category: "爆笑,宠文,潜规则",     *                   book_end_status: 8,     *                   book_published_time: null,     *                   copyright: null,     *                   charge_type: null,     *                   force_subscribe_chapter_id: 0,     *                   update_time: null,     *                   is_on_shelf: 1,     *                   book_price: null,     *                   keyword: "温馨,虐心,清水",     *                   recommend_index:2,     *                   is_show_index_content:0,     *                   click_count:0,     *                   product_id:0,     *                   sex_preference:0,     *               },     *               {}     *           ],     *           meta:{}     *           }     *       }     */    public function getHighQualityBooks(Request $request)    {        $where = ['is_on_shelf' => [1, 2]];        $where = ['is_high_quality' => 1];        $key = $request->input('key');        if ($key) $where['key'] = $key;        $author = $request->input('author');        if ($author) $where['author'] = $author;        $category_id = $request->input('category_id');        if ($category_id) {            if ($category_id == 1) {                $where['channel_name'] = '男频';            } elseif ($category_id == 2) {                $where['channel_name'] = '女频';            } else {                $where['category_id'] = $category_id;            }        }        $old_name = $request->input('old_name');        $domain = $request->input('domain');        $copy_right_date = $request->input('copy_right_date');        $bid = $request->input('bid');        if ($bid) $where['bid'] = $bid;        if ($old_name) $where['old_name'] = $old_name;        if ($domain) $where['domain'] = $domain;        if ($copy_right_date) $where['copy_right_date'] = $copy_right_date;        $page_size = $request->input('page_size', 15);        $res = BookConfigService::getBooks($where, [], $page_size);        return response()->pagination(new BookTransformer, $res);    }    /**     * @apiVersion 1.0.0     * @apiDescription 编辑优选     * @api {get} books/editHighQuality 编辑优选     * @apiName editHighQuality     * @apiParam {Int} bid bid     * @apiParam {Int} is_high_quality 添加优质1,取消0     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function editHighQuality(Request $request)    {        $bid = $request->input('bid');        $is_high_quality = (int)$request->input('is_high_quality');        if (!$bid) {            return response()->error('PARAM_EMPTY');        }        if (BookConfigService::editIsHighQuality($bid, $is_high_quality)) {            return response()->success();        }        return response()->error('UNKNOWN_ERROR');    }    /**     * @apiVersion 1.0.0     * @apiDescription 上传封面     * @api {post} books/uploadcover 上传封面     * @apiName uploadCover     * @apiParam {Int} bid bid     * @apiParam {File} photo photo     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function uploadCover(Request $request)    {        $bid = $request->input('bid');        if (!$request->hasFile('photo') || !$bid) {            return response()->error('PARAM_EMPTY');        }        $file = $request->file('photo');        //$extension = $file->getClientOriginalName();        $extension = $file->extension();        $file_name = date('YmdHis') . $bid . '.' . $extension;        $upload_res = $this->ossObject()->uploadFile(env('OSS_BUCKET', 'zhuishuyun'), 'book/cover/' . $file_name, $file->path());        $imageUrl = str_ireplace('zhuishuyun.oss-cn-hangzhou.aliyuncs.com', 'cdn-novel.iycdm.com', $upload_res['oss-request-url']);        $imageUrl = str_ireplace('http://', 'https://', $imageUrl);        $imageUrl = $imageUrl . '?x-oss-process=image/resize,w_200/format,jpg';        $data = ['cover' => $imageUrl];        if (BookConfigService::updateBookConfig($bid, $data)) {            return response()->success();        }        return response()->error('UNKNOWN_ERROR');    }    /**     * @apiVersion 1.0.0     * @apiDescription 修改图书描述     * @api {post} books/updateIntro 修改图书描述     * @apiName updateIntro     * @apiParam {Int} bid bid     * @apiParam {String} intro 内容     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function updateIntro(Request $request)    {        $bid = $request->input('bid');        $intro = $request->input('intro');        if (!$intro || !$bid) {            return response()->error('PARAM_EMPTY');        }        $res = BookService::updateIntro($bid, $intro);        if ($res) {            return response()->success();        }        return response()->error('UNKNOWN_ERROR');    }    /**     * @apiVersion 1.0.0     * @apiDescription 修改推荐文案     * @api {post} books/editRecommendChapterPositionWords 修改推荐文案     * @apiName editRecommendChapterPositionWords     * @apiParam {String} content 内容     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function editRecommendChapterPositionWords(Request $request)    {        $content = $request->input('content');        if (!$content) {            return response()->error('PARAM_EMPTY');        }        Storage::put('RecommendChapterPositionWord.txt', $content);        return response()->success();    }    /**     * @apiVersion 1.0.0     * @apiDescription 修改推荐章节     * @api {get} books/editRecommendcid 修改推荐章节     * @apiName editRecommendcid     * @apiParam {Int} bid bid     * @apiParam {Int} cid cid     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function editRecommendcid(Request $request)    {        $bid = $request->input('bid');        $cid = $request->input('cid');        if (!$bid || !$cid) {            return response()->error('PARAM_EMPTY');        }        if (BookConfigService::editRecommendCid($bid, $cid)) {            return response()->success();        } else {            return response()->error('UNKNOWN_ERROR');        }    }    private function ossObject()    {        $accessKeyId = env('OSS_ACCESS_ID');        $accessKeySecret = env('OSS_ACCESS_KEY');        $endpoint = env('OSS_END_POINT');        $ossClient = null;        try {            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);        } catch (OssException $e) {            return null;        }        return $ossClient;    }    /**     * @apiVersion 1.0.0     * @apiDescription 获取推荐文案     * @api {get} books/getRecommendChapterPositionWords 获取推荐文案     * @apiName getRecommendChapterPositionWords     * @apiGroup Book     * @apiSuccess {Int}         code 状态码     * @apiSuccess {String}      msg  信息     * @apiSuccess {object}      data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *         content:建议此章节生成推广文案(原文转化率好)     * }     *     }     */    public function getRecommendChapterPositionWords(Request $request)    {        $content = '';        if (Storage::exists('RecommendChapterPositionWord.txt')) {            $content = Storage::get('RecommendChapterPositionWord.txt');        } else {            $content = '建议此章节生成推广文案(原文转化率好)';        }        return response()->success(['content' => $content]);    }    /**     * @apiVersion 1.0.0     * @apiDescription 书籍设置渠道标识功能     * @api {post} books/setChannelSpecialBook 获取推荐文案     * @apiName setChannelSpecialBook     * @apiParam {Int} bid 书本id     * @apiParam {Int} channel_id 渠道id     * @apiGroup Book     * @apiSuccess {Int} code 状态码     * @apiSuccess {String}msg  信息     * @apiSuccess {object}data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function setChannelSpecialBook(Request $request)    {        $bid = $request->has('bid') ? $request->input('bid') : '';        $channel_user_id = $request->has('channel_user_id') ? $request->input('channel_user_id') : '';        if (empty($bid)) {            return response()->error("PARAM_EMPTY");        } else {            if (empty($channel_user_id)) {                $data = BookSpecialChannelService::clearSpecialChannle($bid);            } else {                $channel_user_ids = explode(',', $channel_user_id);                $channels = array_filter($channel_user_ids);                $data = BookSpecialChannelService::addSpecialChannle($bid, $channels);            }            if ($data) {                return response()->success();            }            return response()->error("HANDLE_FAILED");        }    }    public function copyBook(Request $request)    {        //return 1111;        $bid = $request->has('bid') ? $request->input('bid') : '';        if (empty($bid)) {            return response()->error("PARAM_EMPTY");        }        $book_info = Book::find($bid);        if (!$book_info) {            return response()->error("PARAM_EMPTY");        }        $book_config_info = BookConfig::where('bid', $bid)->first();        if (!$book_config_info) {            return response()->error("PARAM_EMPTY");        }        $book = Book::create([            'ly_bid' => $book_info->ly_bid,            'name' => $book_info->name,            'author' => $book_info->author,            'intro' => $book_info->intro,            'cover' => $book_info->cover,            'keyword' => $book_info->keyword,            'category_id' => $book_info->category_id,            'status' => $book_info->status,            'chapter_count' => $book_info->chapter_count,            'first_cid' => 0,            'last_cid' => 0,            'last_chapter' => $book_info->last_chapter,            'size' => $book_info->size,            'category_name' => $book_info->category_name,        ]);        $product = ProductService::addProduct(['price' => 8.99, 'type' => 'BOOK_ORDER', 'given' => 0, 'is_default' => 0, 'is_enabled' => 0]);        DB::table('book_configs')->insert([            'bid' => $book->id,            'force_subscribe_chapter_seq' => $book_config_info->force_subscribe_chapter_seq,            'book_name' => $book_config_info->book_name . '-复制',            'price' => '8.99',            'cover' => $book_config_info->cover,            'charge_type' => $book_config_info->charge_type,            'is_on_shelf' => 0,            'product_id' => $product->id,            'cp_source' => $book_config_info->cp_source,            'vip_seq' => $book_config_info->vip_seq,            'hot' => $book_config_info->hot,            'promotion_domain' => $book_config_info->promotion_domain,            'recommend_cid' => $book_config_info->recommend_cid,            'is_high_quality' => $book_config_info->is_high_quality,            'source_domain' => $book_config_info->source_domain,            'is_show_index_content' => $book_config_info->is_show_index_content,            'created_at' => date('Y-m-d H:i:s'),            'updated_at' => date('Y-m-d H:i:s')        ]);        $sql = 'CALL copybook(' . $bid . ',' . $book->id . ')';        DB::select($sql);        $this->adjustSequentOne($book->id);        return response()->success(['bid' => $book->id]);    }    public function adjustSequentOne($bid)    {        $chapter_list = DB::table('chapters')->orderBy('sequence')->where('bid', $bid)->select('id')->get();        $prev = 0;        $i = 0;        $first = '';        $last = '';        foreach ($chapter_list as $chapter) {            if ($i == 0) {                $first = $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;            $i++;            $last = $chapter;        }        Book::where('id', $bid)->update(['first_cid' => $first->id, 'last_cid' => $last->id]);    }    public function getAllBookSimple(Request $request)    {        $is_on_shelf = $request->input('is_on_shelf');        $order = $request->input('order');        $seq = $request->input('sequence', 'desc');        if ($is_on_shelf) {            $is_on_shelf = explode(',', $is_on_shelf);        } else {            $is_on_shelf = [1, 2];        }        $order_arr = [];        if ($order) {            $order_arr[0] = $order;            $order_arr[1] = 'desc';            if ($seq && $seq == 'asc') {                $order_arr[1] = 'asc';            }        }        // 增加加密的bid字段        $books = BookConfig::getAllBooks($is_on_shelf, $order_arr);        foreach ($books as $key => $book) {            $books[$key]['bid_hash'] = Hashids::encode($books[$key]['bid']);        }        return response()->success($books);    }    /**     * @apiVersion 1.0.0     * @apiDescription 设置章节价格     * @api {get} books/setChapterPrice 设置章节价格     * @apiName setChapterPrice     * @apiParam {Int} type 类型(1,2) 1代表 单个渠道,2代表渠道下所有的site     * @apiParam {Int} channel_id 渠道id     * @apiParam {float} price 价格 (千字/毛)     * @apiGroup Book     * @apiSuccess {Int} code 状态码     * @apiSuccess {String}msg  信息     * @apiSuccess {object}data 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function setChapterPrice(Request $request)    {        $type = $request->input('type', 1);        $channel_id = $request->input('channel_id');        $price = $request->input('price');        if (!$channel_id || !$price) {            return response()->error("PARAM_EMPTY");        }        if (!is_numeric($price)) {            return response()->error("PARAM_EMPTY");        }        //distribution_channel_id        if ($type == 1) {            BookService::setChapterPrice($channel_id, $price);        }        //channel_user_id        if ($type == 2) {            $res = ChannelService::getByChannelUserId($channel_id);            foreach ($res as $v) {                BookService::setChapterPrice($v->id, $price);            }        }        return response()->success();    }    /**     * @apiVersion 1.0.0     * @apiDescription 根据书名获取图书     * @api {get} books/getSimpleBookListByName 根据书名获取图书     * @apiName getSimpleBookListByName     * @apiParam {String} book_name 书名     * @apiGroup Book     * @apiSuccess {Int} code 状态码     * @apiSuccess {String}msg  信息     * @apiSuccess {object}data 结果集     * @apiSuccess {int}  data.bid  bid     * @apiSuccess {string} data.book_name 书名     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function getSimpleBookListByName(Request $request)    {        $name = $request->input('book_name');        if (empty($name)) {            return response()->success();        }        $res = BookConfigService::getBooksByName(trim($name));        return response()->success($res);    }    /**     * @apiVersion 1.0.0     * @apiDescription 设置分校推荐榜     * @api {post} books/setEditorRecommendBooks 设置分校推荐榜     * @apiName setEditorRecommendBooks     * @apiParam {String} important_bids 重点bid列表,逗号隔开(1,2,3)     * @apiParam {String} unimportant_bids 非重点bid列表(112,232,312)     * @apiGroup Book     * @apiSuccess {Int} code 状态码     * @apiSuccess {String} msg  信息     * @apiSuccess {object} ata 结果集     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {}     *     }     */    public function setEditorRecommendBooks(Request $request)    {        //$type = $request->input('type');        $important_bids = $request->input('important_bids');        $unimportant_bids = $request->input('unimportant_bids');        if (empty($important_bids) || empty($unimportant_bids)) {            return response()->error("PARAM_EMPTY");        }        Redis::hincrby('channel_recomm_books', 'count', 1);        Redis::hset('channel_recomm_books', 'important', $important_bids);        Redis::hset('channel_recomm_books', 'unimportant', $unimportant_bids);        $nowcount = Redis::hget('channel_recomm_books', 'count');        if (!$nowcount) $nowcount = 0;        $old_import = BookConfigService::getSimpleBooksByIds(explode(',', $important_bids));        $data = [];        foreach ($old_import as $v) {            $data[] = ['bid' => $v->bid, 'book_name' => $v->book_name, 'type' => 'IMPORTANT',                'count' => $nowcount, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s')];        }        $old_unimportant = BookConfigService::getSimpleBooksByIds(explode(',', $unimportant_bids));        foreach ($old_unimportant as $val) {            $data[] = ['bid' => $val->bid, 'book_name' => $val->book_name, 'type' => 'UNIMPORTANT',                'count' => $nowcount, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s')];        }        if ($data) {            DB::table('channel_editor_recommend_rank')->insert($data);        }        return response()->success();    }    /**     * @apiVersion 1.0.0     * @apiDescription 获取分校推荐榜     * @api {get} books/getEditorRecommendBooks 获取分校推荐榜     * @apiName getEditorRecommendBooks     * @apiParam {String} [count] 次数默认最近一次     * @apiGroup Book     * @apiSuccess {Int} code 状态码     * @apiSuccess {String} msg  信息     * @apiSuccess {object} data 结果集     * @apiSuccess {int} data.total_count 总次数     * @apiSuccess {int} data.now 当前次数     * @apiSuccess {object} data.important 重点渠道     * @apiSuccess {int} data.important.bid bid     * @apiSuccess {string} data.important.book_name 书名     * @apiSuccess {object} data.unimportant     * @apiSuccessExample {json} Success-Response:     *     HTTP/1.1 200 OK     *     {     *       code: 0,     *       msg: "",     *       data: {     *            total_count:3,     *            now :3     *            important:[]     *            unimportant     *        }     *     }     */    public function getEditorRecommendBooks(Request $request)    {        $type = $request->input('count', 0);        $nowcount = Redis::hget('channel_recomm_books', 'count');        if (!$type) $type = $nowcount;        $important_books = null;        $unimportant_books = null;        if ($type) {            $important_books = DB::table('channel_editor_recommend_rank')->where('count', $type)->where('type', 'IMPORTANT')->select('bid', 'book_name')->get();            $unimportant_books = DB::table('channel_editor_recommend_rank')->where('count', $type)->where('type', 'UNIMPORTANT')->select('bid', 'book_name')->get();        } else {            $important = Redis::hget('channel_recomm_books', 'important');            if ($important) {                $important_bid = explode(',', $important);                $important_books = BookConfigService::getSimpleBooksByIds($important_bid);            }            $unimportant = Redis::hget('channel_recomm_books', 'unimportant');            if ($unimportant) {                $unimportant_bid = explode(',', $unimportant);                $unimportant_books = BookConfigService::getSimpleBooksByIds($unimportant_bid);            }        }        $res = ['total_count' => $nowcount, 'now' => $type, 'important' => $important_books, 'unimportant' => $unimportant_books];        return response()->success($res);    }    public function getBookIntro(Request $request)    {        $bid = (int)$request->get('bid', 0);        $book_name = $request->get('book_name', '');        if (empty($bid) && empty($book_name)) {            return response()->error("PARAM_EMPTY");        }        $info = BookConfigService::getBookIntroByBid($bid, $book_name);        if (empty($info)) {            $info = [                ['book_name' => $book_name.'(0)', 'intro' => '']            ];        }        return response()->success($info);    }    public function getBookCommentStats(Request $request){        /*$bid =  $request->input('bid');        if(!$bid){            return response()->error('PARAM_ERROR');        }*/    }        /**     * 测书更新     * @param Request $request     */    public function updateTestBook(Request $request)    {    	$bid = (int)$request->get('bid', 0);    	if (empty($bid)) {    		return response()->error("PARAM_EMPTY");    	}    	$status = $request->get('status');    	if (empty($status)) {    		return response()->error("PARAM_EMPTY");    	}    	$plan_push_user_num = $request->get('plan_push_user_num');    	if (empty($plan_push_user_num)) {    		return response()->error("PARAM_EMPTY");    	}    	    	// 检测书库是否存在这本书    	$is_one_shelfs = [1,2];    	$origin_book = BookConfigService::getBookByIdAndStatus($bid,$is_one_shelfs);    	if(empty($origin_book)){    		return response()->error("BOOK_NOT_EXIST");    	}    	    	// 如果已经存在测书,则更新状态, 不存在则要检测测书数量    	if($origin_book->test_status == 0){    		// 检测书库是否已经达到目标数量的测试书    		$test_books = BookConfigService::get_test_books(1);    		if(count($test_books) >= 50){    			return response()->error("TEST_BOOK_LIMIT_NUM");    		}    	}    	        // 开启测试书    	BookConfigService::updateTestBook($bid, $status,$plan_push_user_num);    	return response()->success();    }        /**     * 测书统计数据     * @param Request $request     */    public function getTestBookStatistics(Request $request)    {    	// 获取测试的书籍列表    	$test_books = BookConfigService::get_all_test_books(false);    	$test_books = BookService::getBookStatistics($test_books);    	    	return response()->pagination(new SmartPushBookTransformer, $test_books);    }            /**     * 智能推送统计数据     * @param Request $request     */    public function getSmartPushBookStatistics(Request $request)    {    	// 获取测试的书籍列表    	$smart_push_books = BookConfigService::get_all_smart_push_books(false);    	$smart_push_books = BookService::getBookStatistics($smart_push_books);    	     	return response()->pagination(new SmartPushBookTransformer, $smart_push_books);    }        /**     * 导出测书统计数据     * @param Request $request     */    public function exportGetTestBookStatistics(Request $request)    {    	// 获取书籍列表    	$books = BookConfigService::get_all_test_books(true);    	$book_statistics = BookService::getBookStatistics($books);    	self::exportBookStatistics($book_statistics,'测书统计');    }        /**     * 导出智能推送统计数据     * @param Request $request     */    public function exportGetSmartPushBookStatistics(Request $request)    {    	// 获取书籍列表    	$books = BookConfigService::get_all_smart_push_books(true);    	$book_statistics = BookService::getBookStatistics($books);    	self::exportBookStatistics($book_statistics,'智能推送统计');    }        function  exportBookStatistics($book_statistics,$csv_name){    	header("Content-type:application/vnd.ms-excel");    	header("Content-Disposition:attachment;filename=" . $csv_name . date("YmdHis") . ".csv");    	echo iconv("UTF-8", "GBK", "\"书名\",\"bid\",\"创建时间\",\"计划曝光量\",\"真实曝光量\",\"访问uv\",\"第二章uv\",\"订阅人数\",\"订阅金额\",\"充值人数\",\"充值金额\",\"状态\"\r\n");    	foreach ($book_statistics as $item) {    		echo("\"" . mb_convert_encoding($item->book_name, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding($item->bid, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding(isset($item->test_update_time) ? date('Y-m-d H:i:s',strtotime($item->test_update_time)):'', "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding($item->plan_push_user_num, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding($item->real_push_user_num, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding($item->uv, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding($item->second_chapter_uv, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding($item->book_user_num, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding(round($item->book_amount/100,2), "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding($item->charge_user_num, "GBK", "UTF-8") . "\",");    		echo("\"" . mb_convert_encoding(round($item->charge_amount/100,2), "GBK", "UTF-8") . "\",");    		if($item->test_status == 1){    			echo("\"" . mb_convert_encoding("测书中", "GBK", "UTF-8") . "\"\r\n");    		}else{    			echo("\"" . mb_convert_encoding("已暂停", "GBK", "UTF-8") . "\"\r\n");    		}    	}    	exit();    }    /**     * @param Request $request     * @return mixed     */    public function editorRecommendMsg(Request $request) {        $msg = trim($request->input('recommend_msg',''));        $bid = $request->input('bid','');        if(empty($msg) || empty($bid)) {            return response()->error('PARAM_EMPTY');        }        $res = BookConfig::where('bid',$bid)->update(['editor_recommend'=>$msg]);        return response()->success($res);    }    public function getEditorRecommendMsg(Request $request) {        $bid = $request->input('bid','');        if(empty($bid)) {            return response()->error('PARAM_EMPTY');        }        $msg = BookConfig::where('bid',$bid)            ->select('editor_recommend')            ->first();        $msg =  $msg?$msg->editor_recommend:'';        return response()->success($msg);    }}
 |