diff --git a/README.md b/README.md deleted file mode 100644 index 6867fe0..0000000 --- a/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# SEONexus 站群系统 🌐🚀 - -![SEONexus Logo](https://images.unsplash.com/photo-1507150823660-eed1895c23c7?q=80&w=600) - -**SEONexus** 是一个灵活且强大的站群系统,旨在通过不同的域名展示独特的网站和内容,方便用户进行 SEO 推广和管理。✨ - -## 特性 🌟 - -- **多域名管理**: 轻松管理多个域名,展示不同的网站内容。🖥️ -- **内容管理系统**: 友好的用户界面,方便编辑和更新网站内容。✏️ -- **SEO 优化工具**: 内置 SEO 工具,帮助优化网站以提高搜索引擎排名。📈 -- **流量分析**: 实时监控网站表现,集成流量分析功能。📊 -- **安全性**: 遵循最新的安全标准,确保用户数据和内容安全。🔒 - -## 技术栈 🛠️ - -- **PHP**: 8.4 🐘 -- **Nginx**: 🥡 -- **MySQL**: 8 🍃 -- **Redis**: 🔥 -- **Swoole**: ⚡ -- **ThinkPHP**: 8.1 🎉 - -## 安装 ⚙️ - -### 先决条件 ✅ - -- [PHP 8.4](https://www.php.net/) -- [MySQL 8](https://www.mysql.com/) -- [Redis](https://redis.io/) -- [Nginx](https://www.nginx.com/) -- [Swoole](https://www.swoole.co.uk/) -- [Composer](https://getcomposer.org/) (用于管理 PHP 依赖) - -### 克隆项目 📥 - -$ git clone https://github.com/yourusername/SEONexus.git -$ cd SEONexus - -### 安装依赖 📦 - -$ composer install - -### 配置环境变量 ⚙️ - -在项目根目录下创建一个 `.env` 文件,并添加必要的环境变量,例如: - -``` -DB_HOST=127.0.0.1 -DB_DATABASE=seonexus -DB_USERNAME=your_username -DB_PASSWORD=your_password -REDIS_HOST=127.0.0.1 -``` - -### 启动应用 🚀 - -1. **使用 PHP 启动**: - - $ php think run - -2. **使用 Docker 启动** (可选): - - $ docker-compose up - -### 访问应用 🌍 - -打开浏览器,访问 `http://localhost:80`。 - -## 使用指南 📚 - -- **添加新域名**: 在管理面板中,选择“添加域名”,输入所需信息。🆕 -- **编辑网站内容**: 点击需要编辑的网站,使用内置编辑器修改内容。📝 -- **查看分析数据**: 访问“分析”选项卡,监控流量和用户行为。🔍 - -## 贡献 🤝 - -我们欢迎任何形式的贡献!如果你想为 SEONexus 做出贡献,请遵循以下步骤: - -1. Fork 这个仓库 🍴 -2. 创建你的特性分支 ($ git checkout -b feature/YourFeature) -3. 提交你的修改 ($ git commit -m 'Add some feature') -4. 推送到分支 ($ git push origin feature/YourFeature) -5. 提交一个 Pull Request 📥 - -## 许可证 📜 - -本项目采用 **MIT 许可证**。详细信息请参阅 [LICENSE](LICENSE) 文件。 - -## 联系方式 📬 - -如有任何问题或建议,请通过以下方式联系我: - -- **电子邮件**: your_email@example.com -- **GitHub**: [yourusername](https://github.com/yourusername) - -感谢你对 SEONexus 项目的关注与支持!我们期待你的参与与反馈。一起推动 SEO 的未来!🌈 \ No newline at end of file diff --git a/code/.example.env b/code/.example.env deleted file mode 100644 index 708559a..0000000 --- a/code/.example.env +++ /dev/null @@ -1,64 +0,0 @@ -# 应用 -APP_DEBUG = true -SHOW_ERROR_MSG = true -DEFAULT_LANG = zh-cn - -# 数据库 -DB_TYPE = mysql -DB_HOST = 127.0.0.1 -DB_NAME = novel -DB_USER = root -DB_PASS = qq123123 -DB_PORT = 3306 -DB_CHARSET = utf8mb4 -DB_SQL_DEBUG = true -DB_FIELD_CACHE = false - -# 缓存 -CACHE_DRIVER = redis -CACHE_TIME = 7200 - -# REDIS -REDIS_HOST = 127.0.0.1 -REDIS_PORT = 6379 -REDIS_PASSWORD = -REDIS_PREFIX = -REDIS_DATABASE = 0 - -#MongoDB -MONGO_HOST = 127.0.0.1 -MONGO_PORT = 27017 -MONGO_USER = admin -MONGO_PASSWORD = qq123123 -MONGO_DB = novel - -# TASK -TASK_PROCESS_NUM_01 = 4 -TASK_PROCESS_NUM_02 = 2 - -# QUEUEU -QUEUE_NAME_1 = QueueKey01 -QUEUE_EXEC_NUM_1 = 10 -QUEUE_NAME_2 = QueueKey02 -QUEUE_EXEC_NUM_2 = 10 - -# LocalStorage -STORAGE_LOCAL_DIR = /mnt/gluster - -# VIEW -VIEW_DISPLAY_CACHE = false -VIEW_TPL_CACHE = false -VIEW_DATA_CACHE = false - -# PROXY -PROXY_STATUS = true -# PROXY_CODE = XIONGMAO -# PROXY_HOST = dtbf.xiongmaodaili.com:8089 -# PROXY_KEY = DT20250413204710pFcgjMR9 -# PROXY_SECRET = 583b141edcf65ce94f83591c5cb592ed - -PROXY_CODE = KUAI -#PROXY_HOST = w739.kdltps.com -PROXY_HOST = w740.kdltps.com:15818 -PROXY_KEY = t14468368981914 -PROXY_SECRET = 03xvfdc0 diff --git a/code/.gitignore b/code/.gitignore deleted file mode 100644 index 3a8d1e7..0000000 --- a/code/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -*.log -.env -composer.phar -.DS_Store -Thumbs.db -/.idea -/.vscode -/vendor -/.settings -/.buildpath -/.project -composer.lock \ No newline at end of file diff --git a/code/.travis.yml b/code/.travis.yml deleted file mode 100644 index 36f7b6f..0000000 --- a/code/.travis.yml +++ /dev/null @@ -1,42 +0,0 @@ -sudo: false - -language: php - -branches: - only: - - stable - -cache: - directories: - - $HOME/.composer/cache - -before_install: - - composer self-update - -install: - - composer install --no-dev --no-interaction --ignore-platform-reqs - - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip . - - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0" - - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0" - - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0" - - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0" - - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0" - - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0" - - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0" - - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0" - - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0" - - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip . - -script: - - php think unit - -deploy: - provider: releases - api_key: - secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw= - file: - - ThinkPHP_Core.zip - - ThinkPHP_Full.zip - skip_cleanup: true - on: - tags: true diff --git a/code/app/.htaccess b/code/app/.htaccess deleted file mode 100644 index 3418e55..0000000 --- a/code/app/.htaccess +++ /dev/null @@ -1 +0,0 @@ -deny from all \ No newline at end of file diff --git a/code/app/AppService.php b/code/app/AppService.php deleted file mode 100644 index 96556e8..0000000 --- a/code/app/AppService.php +++ /dev/null @@ -1,22 +0,0 @@ -bind(AdminUserModel::class, function (Request $Request) { - return AdminUserModel::getUserByToken($Request->header("admin-token")); - }); - } - - /** - * 执行服务 - * - * @return mixed - */ - public function boot() - { - // - } -} diff --git a/code/app/admin/BaseController.php b/code/app/admin/BaseController.php deleted file mode 100644 index 47ab2c6..0000000 --- a/code/app/admin/BaseController.php +++ /dev/null @@ -1,107 +0,0 @@ -app = $app; - $this->request = $this->app->request; - - // 控制器初始化 - $this->initialize(); - } - - // 初始化 - protected function initialize() - { - } - - /** - * 验证数据 - * @access protected - * @param array $data 数据 - * @param string|array $validate 验证器名或者验证规则数组 - * @param array $message 提示信息 - * @param bool $batch 是否批量验证 - * @return array|string|true - * @throws ValidateException - */ - protected function validate(array $data, $validate, array $message = [], bool $batch = false) - { - if (is_array($validate)) { - $v = new Validate(); - $v->rule($validate); - } else { - if (strpos($validate, '.')) { - // 支持场景 - [$validate, $scene] = explode('.', $validate); - } - $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate); - $v = new $class(); - if (!empty($scene)) { - $v->scene($scene); - } - } - - $v->message($message); - - // 是否批量验证 - if ($batch || $this->batchValidate) { - $v->batch(true); - } - - return $v->failException(true)->check($data); - } - - - public function success($arrData = [], $strMsg = "", $strCode = "1000") - { - return AdminResponse::create($strCode, $strMsg, $arrData); - } - - public function error($strCode = "9999", $strMsg = "", $arrData = []) - { - return AdminResponse::create($strCode, $strMsg, $arrData); - } -} diff --git a/code/app/admin/common.php b/code/app/admin/common.php deleted file mode 100644 index 1243615..0000000 --- a/code/app/admin/common.php +++ /dev/null @@ -1,2 +0,0 @@ - '成功', - - '1001' => '用户不存在!', - '1002' => '密码错误!', - '1003' => '用户名不能为空!', - '1004' => '密码不能为空!', - - #权限节点组 - '1011' => '权限节点路径不能为空!', - '1012' => '权限节点名不能为空!', - '1013' => '权限节点是否显示不能为空!', - '1014' => '权限节点ID不能为空!', - '1015' => '权限节点集合不能为空!', - '1016' => '该部门下存在成员无法删除!', - '1017' => '角色名不能为空!', - '1018' => '角色ID不能为空!', - - - - #其他组 - '9900' => '参数错误!', - '9901' => '获取PHP程序位置失败!', - '9991' => '你没有这个权限!', - '9992' => '远程密钥错误!', - '9993' => '未查询到相关数据!', - '9994' => '信息输入有误!', - '9995' => '请先登录!', - '9996' => '无效令牌!', - '9997' => '地址错误!', - '9998' => '请求对象未定义!', - '9999' => '系统异常!', -]; diff --git a/code/app/admin/config/router.php b/code/app/admin/config/router.php deleted file mode 100644 index 385479e..0000000 --- a/code/app/admin/config/router.php +++ /dev/null @@ -1,66 +0,0 @@ -name("Guest@Login"); - Route::post("/logout", "Guest/Logout")->name("Guest@Logout"); -}); - - -# 系统配置 -Route::group("/system", function () { - Route::get("/user/info", [AdminUser::class, "info"])->name("AdminUser@info"); - Route::get("/user/list", [AdminUser::class, "getAdminUserList"])->name("AdminUser@getAdminUserList"); - Route::post("/user/save", [AdminUser::class, "saveAdminUser"])->name("AdminUser@saveAdminUser"); - Route::post("/user/del", [AdminUser::class, "delAdminUser"])->name("AdminUser@delAdminUser"); - - Route::get("/config/list", [SystemConfig::class, "getSystemConfigList"])->name("SystemConfig@getSystemConfigList"); - Route::post("/config/save", [SystemConfig::class, "saveSystemConfig"])->name("SystemConfig@saveSystemConfig"); - - Route::get("/cjpz/list", [SystemConfig::class, "getCaiJiPeiZhiList"])->name("SystemConfig@getCaiJiPeiZhiList"); - Route::post("/cjpz/save", [SystemConfig::class, "saveCaiJiPeiZhi"])->name("SystemConfig@saveCaiJiPeiZhi"); - - Route::get("/plan/list", [SystemConfig::class, "getPlanTaskList"])->name("SystemConfig@getPlanTaskList"); - Route::post("/plan/save", [SystemConfig::class, "savePlanTask"])->name("SystemConfig@savePlanTask"); - Route::post("/cache/flush", [SystemConfig::class, "flushCache"])->name("SystemConfig@flushCache"); -})->middleware(AdminAuth::class); - -# 小说 -Route::group("/novel", function () { - Route::get("/list", [Novel::class, "getNovelList"])->name("Domain@getNovelList"); - Route::post("/level/set", [Novel::class, "updateNovelLevel"])->name("Novel@updateNovelLevel"); - Route::get("/category/list", [Novel::class, "getCategory"])->name("Domain@getCategory"); -})->middleware(AdminAuth::class); - -# 站点 -Route::group("/site", function () { - - # 域名管理 - Route::get("/domain/list", [Site::class, "getDomainList"])->name("Site@getDomainList"); - Route::post("/domain/upload", [Site::class, "uploadDomain"])->name("Site@uploadDomain"); - Route::post("/domain/save", [Site::class, "saveDomain"])->name("Site@saveDomain"); - - # TKD 参数模板 - Route::get("/tkdarg/list", [Site::class, "getTKDArgList"])->name("Site@getTKDArgList"); - - # 视图模板 - Route::get("/template/list", [Site::class, "getTemplateList"])->name("Site@getTKDArgList"); - - # 替换模板管理 - Route::get("/subject/fomart/group/list", [Site::class, "getSubjectFomartGroupList"])->name("Site@getSubjectFomartGroupList"); - Route::post("/subject/fomart/group/save", [Site::class, "saveSubjectFomartGroup"])->name("Site@saveSubjectFomartGroup"); - Route::post("/subject/fomart/group/del", [Site::class, "delSubjectFomartGroup"])->name("Site@delSubjectFomartGroup"); - - Route::get("/subject/fomart/list", [Site::class, "getSubjectFomartList"])->name("Site@getSubjectFomartList"); - Route::post("/subject/fomart/save", [Site::class, "saveSubjectFomart"])->name("Site@saveSubjectFomart"); - Route::post("/subject/fomart/del", [Site::class, "delSubjectFomart"])->name("Site@delSubjectFomart"); -})->middleware(AdminAuth::class); diff --git a/code/app/admin/controller/AdminUser.php b/code/app/admin/controller/AdminUser.php deleted file mode 100644 index b5d8fe1..0000000 --- a/code/app/admin/controller/AdminUser.php +++ /dev/null @@ -1,153 +0,0 @@ - $AdminUserModel, - ]; - - return $this->success($arrResult); - } - - /** - * 列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getAdminUserList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $AdminUserModel = AdminUserModel::alias('au'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $AdminUserModel->where(function ($AdminUserModel) use ($strKey) { - $AdminUserModel->whereOr([ - ['au.au_name', 'like', "%" . $strKey . "%"], - ['au.au_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $AdminUserModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 设置管理员 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveAdminUser(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "au_id" => $Request->post('au_id'), - "au_status" => $Request->post('au_status'), - "au_name" => $Request->post('au_name'), - "au_pwd" => $Request->post('au_pwd'), - ]; - - $arrRule = [ - // 'au_id' => 'require', - 'au_status' => 'require', - 'au_name' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - if ($arrData['au_id'] == NULL) { - $AdminUserModel = new AdminUserModel; - } else { - $AdminUserModel = AdminUserModel::where('au_id', $arrData['au_id'])->find(); - - if (empty($AdminUserModel)) { - return $this->error('9993'); - } - } - - if (isset($arrData['au_pwd']) && !empty($arrData['au_pwd'])) { - $arrData['au_pwd'] = md5($arrData['au_pwd']); - } else { - unset($arrData['au_pwd']); - } - - $AdminUserModel->fill($arrData); - - $AdminUserModel->save(); - return $this->success(); - } - - /** - * 删除管理员 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function delAdminUser(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "au_id" => $Request->post('au_id'), - ]; - - $arrRule = [ - 'au_id' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $arrData['au_id'] = explode(',', $arrData['au_id']); - - AdminUserModel::whereIn('au_id', $arrData['au_id'])->delete(); - - - return $this->success(); - } -} diff --git a/code/app/admin/controller/GuangGao.php b/code/app/admin/controller/GuangGao.php deleted file mode 100644 index a2922ed..0000000 --- a/code/app/admin/controller/GuangGao.php +++ /dev/null @@ -1,359 +0,0 @@ - $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $GuangGaoFenZuModel = GuangGaoFenZuModel::alias('ggfz'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $GuangGaoFenZuModel->where(function ($GuangGaoFenZuModel) use ($strKey) { - $GuangGaoFenZuModel->whereOr([ - ['ggfz.ggfz_name', 'like', "%" . $strKey . "%"], - ['ggfz.ggfz_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $GuangGaoFenZuModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 设置广告分组 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveGuangGaoFenZu(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "ggfz_id" => $Request->post('ggfz_id'), - "ggfz_code" => $Request->post('ggfz_code'), - "ggfz_name" => $Request->post('ggfz_name'), - ]; - - $arrRule = [ - // 'ggfz_id' => 'require', - 'ggfz_code' => 'require', - 'ggfz_name' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - if ($arrData['ggfz_id'] == NULL) { - $GuangGaoFenZuModel = new GuangGaoFenZuModel; - } else { - $GuangGaoFenZuModel = GuangGaoFenZuModel::where('ggfz_id', $arrData['ggfz_id'])->find(); - - if (empty($GuangGaoFenZuModel)) { - return $this->error('9993'); - } - } - - $GuangGaoFenZuModel->fill($arrData); - - $GuangGaoFenZuModel->save(); - GuangGaoModel::flushCache(); - return $this->success(); - } - - /** - * 删除广告分组 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function delGuangGaoFenZu(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "ggfz_id" => $Request->post('ggfz_id'), - ]; - - $arrRule = [ - 'ggfz_id' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $arrData['ggfz_id'] = explode(',', $arrData['ggfz_id']); - - GuangGaoFenZuModel::whereIn('ggfz_id', $arrData['ggfz_id'])->delete(); - - GuangGaoModel::whereIn('ggfz_id', $arrData['ggfz_id'])->delete(); - GuangGaoModel::flushCache(); - return $this->success(); - } - - - /** - * 列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getGuangGaoList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - "ggfz_id" => $Request->get('ggfz_id'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $GuangGaoModel = GuangGaoModel::alias('gg') - ->leftJoin('guang_gao_fen_zu ggfz', 'ggfz.ggfz_id = gg.ggfz_id') - ->field(['gg.*', 'ggfz.ggfz_name']) - ->order('ggfz.ggfz_id','desc') - ->order('gg.gg_sort','desc'); - - if ($arrData['ggfz_id'] !== NULL) { - $GuangGaoModel = $GuangGaoModel->where('gg.ggfz_id', $arrData['ggfz_id']); - } - - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $GuangGaoModel->where(function ($GuangGaoModel) use ($strKey) { - $GuangGaoModel = $GuangGaoModel->whereOr([ - ['gg.gg_wen_zi', 'like', "%" . $strKey . "%"], - ['gg.gg_id', 'like', "%" . $strKey . "%"], - ['ggfz.ggfz_name', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $GuangGaoModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - - /** - * 设置广告 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveGuangGao(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "gg_id" => $Request->post('gg_id'), - "ggfz_id" => $Request->post('ggfz_id'), - "gg_lei_xing" => $Request->post('gg_lei_xing'), - "gg_tu_pian" => $Request->post('gg_tu_pian'), - "gg_wen_zi" => $Request->post('gg_wen_zi'), - "gg_tiao_zhuan_di_zhi" => $Request->post('gg_tiao_zhuan_di_zhi'), - "gg_sort" => $Request->post('gg_sort'), - "gg_status" => $Request->post('gg_status'), - ]; - - $arrRule = [ - // 'gg_id' => 'require', - 'ggfz_id' => 'require', - 'gg_lei_xing' => 'require', - 'gg_status' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - if ($arrData['gg_id'] == NULL) { - $GuangGaoModel = new GuangGaoModel; - } else { - $GuangGaoModel = GuangGaoModel::where('gg_id', $arrData['gg_id'])->find(); - - if (empty($GuangGaoModel)) { - return $this->error('9993'); - } - } - - $GuangGaoModel->fill($arrData); - - $GuangGaoModel->save(); - GuangGaoModel::flushCache(); - return $this->success(); - } - - /** - * 删除广告 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function delGuangGao(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "gg_id" => $Request->post('gg_id'), - ]; - - $arrRule = [ - 'gg_id' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $arrData['gg_id'] = explode(',', $arrData['gg_id']); - - GuangGaoModel::whereIn('gg_id', $arrData['gg_id'])->delete(); - - GuangGaoModel::flushCache(); - return $this->success(); - } - - - - /** - * 广告配置列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getGuangGaoPeiZhiList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $GuangGaoPeiZhiModel = GuangGaoPeiZhiModel::alias('ggpz'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $GuangGaoPeiZhiModel->where(function ($GuangGaoPeiZhiModel) use ($strKey) { - $GuangGaoPeiZhiModel->whereOr([ - ['ggpz.ggpz_code', 'like', "%" . $strKey . "%"], - ['ggpz.ggpz_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $GuangGaoPeiZhiModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 设置广告配置 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveGuangGaoPeiZhi(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "ggpz_id" => $Request->post('ggpz_id'), - "ggpz_val" => $Request->post('ggpz_val'), - ]; - - $arrRule = [ - 'ggpz_id' => 'require', - 'ggpz_val' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $GuangGaoPeiZhiModel = GuangGaoPeiZhiModel::where('ggpz_id', $arrData['ggpz_id'])->find(); - - if (empty($GuangGaoPeiZhiModel)) { - return $this->error('9993'); - } - - $GuangGaoPeiZhiModel->fill($arrData); - - $GuangGaoPeiZhiModel->save(); - - GuangGaoPeiZhiModel::flushCache(); - - return $this->success(); - } -} diff --git a/code/app/admin/controller/Guest.php b/code/app/admin/controller/Guest.php deleted file mode 100644 index d59023e..0000000 --- a/code/app/admin/controller/Guest.php +++ /dev/null @@ -1,70 +0,0 @@ - $Request->post('au_name'), - "au_pwd" => $Request->post('au_pwd'), - ]; - - $arrRule = [ - 'au_name' => 'require|max:25', - 'au_pwd' => 'require|min:6', - ]; - - $this->validate($arrData, $arrRule); - - $arrData['au_pwd'] = md5(trim($arrData['au_pwd'])); - - $AdminUserModel = AdminUserModel::where('au_name', $arrData['au_name']) - ->where('au_pwd', $arrData['au_pwd']) - ->where('au_status', 0) - ->find(); - - if (empty($AdminUserModel)) { - return $this->error("1002"); - } - - $arrResult = [ - 'admin-token' => $AdminUserModel->createToken(), - ]; - - return $this->success($arrResult); - } - - /** - * 退出 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function Logout(Request $Request, ?AdminUserModel $AdminUserModel) - { - $strToken = $Request->header("admin-token"); - - if ($strToken) { - Cache::delete($strToken); - } - } -} diff --git a/code/app/admin/controller/Index.php b/code/app/admin/controller/Index.php deleted file mode 100644 index 677cfdd..0000000 --- a/code/app/admin/controller/Index.php +++ /dev/null @@ -1,12 +0,0 @@ - $Request->post('keywords'), - "n_level" => (int)$Request->post('n_level'), - ]; - - $arrRule = [ - 'keywords' => 'require', - 'n_level' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $arrKeywords = explode(',', $arrData['keywords']); - $NovelModel = NovelModel::getInstance(); - $NovelModel->updateByKeywords($arrKeywords, $arrData['n_level']); - return $this->success(); - } - - /** - * 小说分页 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getNovelList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $intPage = $Request->param('page', 1, 'intval'); - $intLimit = $Request->param('limit', 10, 'intval'); - - try { - - $NovelModel = NovelModel::getInstance(); - - $Col = $NovelModel->getCol(); - - // 查询条件(可选) - $arrFilter = []; - // 示例:如果需要筛选,例如 status=1 - // $arrFilter['status'] = 1; - - $arrOptions = [ - 'sort' => ['_id' => -1], - 'skip' => ($intPage - 1) * $intLimit, - 'limit' => $intLimit, - ]; - - $Cursor = $Col->find($arrFilter, $arrOptions); - $arrData = iterator_to_array($Cursor); - - $intTotal = $Col->countDocuments($arrFilter); - - $arrResult = [ - 'data' => $arrData, - 'total' => $intTotal, - 'page' => $intPage, - 'limit' => $intLimit, - 'pages' => ceil($intTotal / $intLimit) - ]; - return $this->success($arrResult); - } catch (\Exception $e) { - return $this->error("9999", $e->getMessage()); - } - } - - /** - * get category data - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return void - */ - public function getCategory(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrResult = [ - 'all' => CategoryModel::getCategory(), - 'man' => CategoryModel::getManCategory(), - 'women' => CategoryModel::getWomenCategory(), - ]; - return $this->success($arrResult); - } -} diff --git a/code/app/admin/controller/Site.php b/code/app/admin/controller/Site.php deleted file mode 100644 index 922eab8..0000000 --- a/code/app/admin/controller/Site.php +++ /dev/null @@ -1,481 +0,0 @@ -success(ConverterMovel::$arrDescription); - } - - - /** - * upload site domain info file - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function uploadDomain(Request $Request, ?AdminUserModel $AdminUserModel) - { - $File = $Request->file('excel_file'); - if (!$File) { - return $this->error("9999", '请上传 Excel 文件'); - } - - try { - $arrAllowedExt = ['xls', 'xlsx']; - $strExt = $File->getOriginalExtension(); - if (!in_array($strExt, $arrAllowedExt)) { - return $this->error("9999", '仅支持 xls 或 xlsx 文件'); - } - - $FilePath = $File->getPathname(); - - $Spreadsheet = IOFactory::load($FilePath); - $Sheet = $Spreadsheet->getActiveSheet(); - $arrData = $Sheet->toArray(); - - array_shift($arrData); - - foreach ($arrData as $arrRows) { - $arrDomain = [ - 'd_domain' => $arrRows[0], - 't_id' => $arrRows[1], - 'd_name' => $arrRows[2], - 'd_keywords' => $arrRows[3], - 'd_index_title' => $arrRows[4], - 'd_index_keywords' => $arrRows[5], - 'd_index_description' => $arrRows[6], - 'd_description' => $arrRows[7], - 'd_statis' => $arrRows[8], - 'd_logo_type' => (int)$arrRows[9], - 'd_text_logo' => $arrRows[10], - 'd_img_logo' => $arrRows[11], - 'd_content_encode' => $arrRows[12], - ]; - - $TCfgTemplate = TemplatesModel::where('t_id', $arrDomain['t_id'])->find()->t_cfg_template; - - $arrDomain['t_cfg'] = json_encode($TCfgTemplate, JSON_UNESCAPED_UNICODE); - - /** @var DomainModel **/ - $DomainModel = DomainModel::where('d_domain', $arrDomain['d_domain'])->findOrEmpty(); - - $DomainModel->fill($arrDomain); - $DomainModel->save(); - - DomainModel::flushAllDomianOnCache(); - } - - - return $this->success(); - } catch (\Exception $e) { - return $this->error("9999", '导入失败: ' . $e->getMessage()); - } - } - - /** - * 列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getDomainList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $DomainModel = DomainModel::alias('d'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $DomainModel->where(function ($DomainModel) use ($strKey) { - $DomainModel->whereOr([ - ['d.d_domain', 'like', "%" . $strKey . "%"], - ['d.d_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $DomainModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - - /** - * 添加|修改 域名 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveDomain(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "d_id" => $Request->post('d_id'), - "d_domain" => $Request->post('d_domain'), - "t_id" => $Request->post('t_id'), - "d_name" => $Request->post('d_name'), - "d_keywords" => $Request->post('d_keywords'), - "d_description" => $Request->post('d_description'), - "d_index_title" => $Request->post('d_index_title'), - "d_index_keywords" => $Request->post('d_index_keywords'), - "d_index_description" => $Request->post('d_index_description'), - "d_statis" => $Request->post('d_statis'), - "d_logo_type" => $Request->post('d_logo_type'), - "d_text_logo" => $Request->post('d_text_logo'), - "d_img_log" => $Request->post('d_img_log'), - "d_content_encode" => $Request->post('d_content_encode'), - "t_cfg" => $Request->post('t_cfg'), - ]; - - $arrRule = [ - // 'd_id' => 'require|number', - 'd_domain' => 'require', - 'd_logo_type' => 'require|number', - 'd_content_encode' => 'require|number', - 't_cfg' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - if ($arrData['d_id']) { - /** @var DomainModel **/ - $DomainModel = DomainModel::where('d_id', $arrData['d_id'])->findOrEmpty(); - } else { - $DomainModel = new DomainModel; - } - - $DomainModel->fill($arrData); - - $DomainModel->save(); - DomainModel::flushAllDomianOnCache(); - - return $this->success(); - } - - /** - * 列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getTemplateList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $TemplatesModel = TemplatesModel::alias('t'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $TemplatesModel->where(function ($TemplatesModel) use ($strKey) { - $TemplatesModel->whereOr([ - ['t.t_code', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $TemplatesModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 替换模板分组列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getSubjectFomartGroupList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $SubjectFomartGroupModel = SubjectFomartGroupModel::alias('sfg'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $SubjectFomartGroupModel->where(function ($SubjectFomartGroupModel) use ($strKey) { - $SubjectFomartGroupModel->whereOr([ - ['sfg.sfg_name', 'like', "%" . $strKey . "%"], - ['sfg.sfg_description', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $SubjectFomartGroupModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 添加|修改 替换模板分组 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveSubjectFomartGroup(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "sfg_id" => $Request->post('sfg_id'), - "sfg_name" => $Request->post('sfg_name'), - "sfg_description" => $Request->post('sfg_description'), - - ]; - - $arrRule = [ - // 'sfg_id' => 'require|number', - 'sfg_name' => 'require', - 'sfg_description' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - if ($arrData['sfg_id']) { - $SubjectFomartGroupModel = SubjectFomartGroupModel::where('sfg_id', $arrData['sfg_id'])->findOrEmpty(); - } else { - $SubjectFomartGroupModel = new SubjectFomartGroupModel; - } - - $SubjectFomartGroupModel->fill($arrData); - - $SubjectFomartGroupModel->save(); - return $this->success(); - } - - /** - * 添加|修改 替换模板分组 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function delSubjectFomartGroup(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "sfg_id" => $Request->post('sfg_id'), - - ]; - - $arrRule = [ - 'sfg_id' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $arrSfgId = explode(',', $arrData['sfg_id']); - - SubjectFomartGroupModel::whereIn('sfg_id', $arrSfgId)->delete(); - - SubjectFomartModel::whereIn('sfg_id', $arrSfgId)->delete(); - - return $this->success(); - } - - - - - /** - * 替换模板分组列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getSubjectFomartList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - "sfg_id" => $Request->get('sfg_id'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $SubjectFomartModel = SubjectFomartModel::alias('sf'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $SubjectFomartModel->where(function ($SubjectFomartModel) use ($strKey) { - $SubjectFomartModel->whereOr([ - ['sf.sf_val', 'like', "%" . $strKey . "%"], - ]); - }); - } - if (!empty($arrData['sfg_id'])) { - $SubjectFomartModel->where('sf.sfg_id', $arrData['sfg_id']); - } - - $Paginate = $SubjectFomartModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 添加|修改 替换模板分组 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveSubjectFomart(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "sf_id" => $Request->post('sf_id'), - "sfg_id" => $Request->post('sfg_id'), - "sf_val" => $Request->post('sf_val'), - - ]; - - $arrRule = [ - // 'sf_id' => 'require|number', - 'sfg_id' => 'require|number', - 'sf_val' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - if ($arrData['sf_id']) { - $SubjectFomartModel = SubjectFomartModel::where('sf_id', $arrData['sf_id'])->findOrEmpty(); - } else { - $SubjectFomartModel = new SubjectFomartModel; - } - - $SubjectFomartModel->fill($arrData); - - $SubjectFomartModel->save(); - return $this->success(); - } - - /** - * 添加|修改 替换模板分组 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function delSubjectFomart(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "sf_id" => $Request->post('sf_id'), - - ]; - - $arrRule = [ - 'sf_id' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $arrSfId = explode(',', $arrData['sf_id']); - SubjectFomartModel::whereIn('sf_id', $arrSfId)->delete(); - - return $this->success(); - } -} diff --git a/code/app/admin/controller/SystemConfig.php b/code/app/admin/controller/SystemConfig.php deleted file mode 100644 index 01e9234..0000000 --- a/code/app/admin/controller/SystemConfig.php +++ /dev/null @@ -1,391 +0,0 @@ - $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $CaiJiPeiZhiModel = CaiJiPeiZhiModel::alias('cjpz'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $CaiJiPeiZhiModel->where(function ($CaiJiPeiZhiModel) use ($strKey) { - $CaiJiPeiZhiModel->whereOr([ - ['cjpz.cjpz_code', 'like', "%" . $strKey . "%"], - ['cjpz.cjpz_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $CaiJiPeiZhiModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 设置采集配置 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveCaiJiPeiZhi(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "cjpz_id" => $Request->post('cjpz_id'), - "cjpz_val" => $Request->post('cjpz_val'), - ]; - - $arrRule = [ - 'cjpz_id' => 'require', - 'cjpz_val' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $CaiJiPeiZhiModel = CaiJiPeiZhiModel::where('cjpz_id', $arrData['cjpz_id'])->find(); - - if (empty($CaiJiPeiZhiModel)) { - return $this->error('9993'); - } - - $CaiJiPeiZhiModel->fill($arrData); - - $CaiJiPeiZhiModel->save(); - - CaiJiPeiZhiModel::flushCache(); - - return $this->success(); - } - - - - /** - * 系统配置列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getSystemConfigList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $SystemConfigModel = SystemConfigModel::alias('sc'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $SystemConfigModel->where(function ($SystemConfigModel) use ($strKey) { - $SystemConfigModel->whereOr([ - ['sc.sc_code', 'like', "%" . $strKey . "%"], - ['sc.sc_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $SystemConfigModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 设置系统配置 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveSystemConfig(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "sc_id" => $Request->post('sc_id'), - "sc_val" => $Request->post('sc_val'), - ]; - - $arrRule = [ - 'sc_id' => 'require', - 'sc_val' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $SystemConfigModel = SystemConfigModel::where('sc_id', $arrData['sc_id'])->find(); - - if (empty($SystemConfigModel)) { - return $this->error('9993'); - } - - $SystemConfigModel->fill($arrData); - - $SystemConfigModel->save(); - - SystemConfigModel::flushCache(); - - return $this->success(); - } - - - /** - * 资源端点列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getZiYuanDuanDianList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $ZiYuanDuanDianModel = ZiYuanDuanDianModel::alias('zydd'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $ZiYuanDuanDianModel->where(function ($ZiYuanDuanDianModel) use ($strKey) { - $ZiYuanDuanDianModel->whereOr([ - ['zydd.zydd_ming_zi', 'like', "%" . $strKey . "%"], - ['zydd.zydd_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $ZiYuanDuanDianModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 设置资源端点 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function saveZiYuanDuanDian(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "zydd_id" => $Request->post('zydd_id'), - "zydd_domain" => $Request->post('zydd_domain'), - ]; - - $arrRule = [ - 'zydd_id' => 'require', - 'zydd_domain' => 'require', - ]; - - $this->validate($arrData, $arrRule); - - $ZiYuanDuanDianModel = ZiYuanDuanDianModel::where('zydd_id', $arrData['zydd_id'])->find(); - - if (empty($ZiYuanDuanDianModel)) { - return $this->error('9993'); - } - - $ZiYuanDuanDianModel->fill($arrData); - - $ZiYuanDuanDianModel->save(); - - ZiYuanDuanDianModel::flushCache(); - - return $this->success(); - } - - - /** - * 计划任务列表 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function getPlanTaskList(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "page" => $Request->get('page', 1), - "limit" => $Request->get('limit', 10), - "key" => $Request->get('key'), - ]; - - $arrRule = [ - 'page' => 'require|number', - 'limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $PlanTaskModel = PlanTaskModel::alias('pt'); - - if (!empty($arrData['key'])) { - $strKey = $arrData['key']; - $PlanTaskModel->where(function ($PlanTaskModel) use ($strKey) { - $PlanTaskModel->whereOr([ - ['pt.pt_name', 'like', "%" . $strKey . "%"], - ['pt.pt_id', 'like', "%" . $strKey . "%"], - ]); - }); - } - - $Paginate = $PlanTaskModel->paginate([ - 'list_rows' => $arrData['limit'], - 'page' => $arrData['page'], - ]); - - $arrResult = [ - 'items' => $Paginate->items(), - 'total' => $Paginate->total(), - 'current_page' => $Paginate->currentPage(), - 'total_pages' => $Paginate->lastPage(), - ]; - - return $this->success($arrResult); - } - - /** - * 设置计划任务 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function savePlanTask(Request $Request, ?AdminUserModel $AdminUserModel) - { - $arrData = [ - "pt_id" => $Request->post('pt_id'), - "pt_enable" => $Request->post('pt_enable'), - "pt_limit" => $Request->post('pt_limit'), - ]; - - $arrRule = [ - 'pt_id' => 'require|number', - 'pt_enable' => 'require|number', - 'pt_limit' => 'require|number', - ]; - - $this->validate($arrData, $arrRule); - - $PlanTaskModel = PlanTaskModel::where('pt_id', $arrData['pt_id'])->find(); - - if (empty($PlanTaskModel)) { - return $this->error('9993'); - } - - $PlanTaskModel->fill($arrData); - - $PlanTaskModel->save(); - - return $this->success(); - } - - - /** - * 清理系统缓存 - * - * @param Request $Request - * @param AdminUserModel|null $AdminUserModel - * @return Response - */ - public function flushCache(Request $Request, ?AdminUserModel $AdminUserModel) - { - DomainModel::flushAllDomianOnCache(); - - SubjectFomartModel::flushAllSubjectFomartOnCache(); - - SystemConfigModel::flushCache(); - - TemplatesModel::flushAllTemplateOnCache(); - - return $this->success(); - } -} diff --git a/code/app/admin/event.php b/code/app/admin/event.php deleted file mode 100644 index 4eff890..0000000 --- a/code/app/admin/event.php +++ /dev/null @@ -1,5 +0,0 @@ -checkRole() == false) { - return AdminResponse::create("9991"); - } - - return $Next($Request); - } catch (\Throwable $T) { - return AdminResponse::createByErr($T); - } - } -} diff --git a/code/app/admin/middleware/AdminCors.php b/code/app/admin/middleware/AdminCors.php deleted file mode 100644 index 4ee0ecf..0000000 --- a/code/app/admin/middleware/AdminCors.php +++ /dev/null @@ -1,22 +0,0 @@ - 'true', - 'Access-Control-Max-Age' => 3600, - 'Access-Control-Allow-Methods' => '*', - 'Access-Control-Allow-Headers' => '*', - ]; -} diff --git a/code/app/admin/middleware/AdminException.php b/code/app/admin/middleware/AdminException.php deleted file mode 100644 index ecde2c5..0000000 --- a/code/app/admin/middleware/AdminException.php +++ /dev/null @@ -1,17 +0,0 @@ - $strCode, - 'msg' => $strMsg, - 'data' => $arrData, - ]; - - return json($arrData, 200, [], [JSON_UNESCAPED_UNICODE]); - } - - static $arrExceptionMap = [ - ValidateException::class => "9900", - ]; - - static public function createByErr(\Throwable $T) - { - $strCode = $T->getCode(); - - if ($T instanceof ValidateException) { - $strCode = "9900"; - } - - foreach (self::$arrExceptionMap as $ExceptionClass => $strExceptonCode) { - if ($T instanceof $ExceptionClass) { - $strCode = $strExceptonCode; - break; - } - } - - return self::create($strCode, $T->getMessage()); - } -} diff --git a/code/app/admin/provider.php b/code/app/admin/provider.php deleted file mode 100644 index 916884b..0000000 --- a/code/app/admin/provider.php +++ /dev/null @@ -1,12 +0,0 @@ - Request::class, - 'think\exception\Handle' => AdminException::class, -]; diff --git a/code/app/api/BaseController.php b/code/app/api/BaseController.php deleted file mode 100644 index 2e106a8..0000000 --- a/code/app/api/BaseController.php +++ /dev/null @@ -1,98 +0,0 @@ -app = $app; - $this->request = $this->app->request; - - // 控制器初始化 - $this->initialize(); - - // View::assign('') - } - - // 初始化 - protected function initialize() {} - - /** - * 验证数据 - * @access protected - * @param array $data 数据 - * @param string|array $validate 验证器名或者验证规则数组 - * @param array $message 提示信息 - * @param bool $batch 是否批量验证 - * @return array|string|true - * @throws ValidateException - */ - protected function validate(array $data, string|array $validate, array $message = [], bool $batch = false) - { - if (is_array($validate)) { - $v = new Validate(); - $v->rule($validate); - } else { - if (strpos($validate, '.')) { - // 支持场景 - [$validate, $scene] = explode('.', $validate); - } - $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate); - $v = new $class(); - if (!empty($scene)) { - $v->scene($scene); - } - } - - $v->message($message); - - // 是否批量验证 - if ($batch || $this->batchValidate) { - $v->batch(true); - } - - return $v->failException(true)->check($data); - } -} diff --git a/code/app/api/common.php b/code/app/api/common.php deleted file mode 100644 index 1243615..0000000 --- a/code/app/api/common.php +++ /dev/null @@ -1,2 +0,0 @@ -middleware(\think\middleware\Throttle::class, [ - // 'visit_rate' => '1/m', - // 'key' => '__CONTROLLER__/__ACTION__/__IP__', - // ]) - ->name('Statis@publish'); - - -Route::get("/search", [Novel::class, 'search']) - // ->middleware(\think\middleware\Throttle::class, [ - // 'visit_rate' => '1/m', - // 'key' => '__CONTROLLER__/__ACTION__/__IP__', - // ]) - ->name('Novel@search');; - - - - -Route::get("/test", [Statis::class, 'test']) - // ->middleware(\think\middleware\Throttle::class, [ - // 'visit_rate' => '1/m', - // 'key' => '__CONTROLLER__/__ACTION__/__IP__', - // ]) - ->name('Statis@test'); diff --git a/code/app/api/config/throttle.php b/code/app/api/config/throttle.php deleted file mode 100644 index ce79257..0000000 --- a/code/app/api/config/throttle.php +++ /dev/null @@ -1,12 +0,0 @@ - 'api:throttle_', - 'visit_method' => ["GET", "POST", "PUT", "DELETE", "HEAD"], - 'visit_fail_response' => function (Throttle $throttle, $request, $wait_seconds) { - return Response::create('抱歉,请求过于频繁, 请 ' . $wait_seconds . ' 秒后重新操作 。')->code(429); - }, -]; diff --git a/code/app/api/controller/Statis.php b/code/app/api/controller/Statis.php deleted file mode 100644 index 3c9ca08..0000000 --- a/code/app/api/controller/Statis.php +++ /dev/null @@ -1,44 +0,0 @@ -post('n_id/d'); - - if ($intNId <= 0) { - return Response::create('非法请求!')->code(400); - } - - $NovelClicksModel = NovelClicksModel::getInstance(); - - try { - $NovelClicksModel->addStatis($intNId); - } catch (\Exception $e) { - // throw $e; - } - - return Response::create()->code(204); - } -} diff --git a/code/app/api/event.php b/code/app/api/event.php deleted file mode 100644 index 4eff890..0000000 --- a/code/app/api/event.php +++ /dev/null @@ -1,5 +0,0 @@ - 标签 - return preg_replace($rpText, '', $newText); - } - - function extractFilename($url) - { - // 检查 URL 是否以 .html 结尾 - if (substr($url, -5) !== '.html') { - throw new InvalidArgumentException('URL must end with .html'); - } - - // 解析 URL 获取路径部分 - $path = parse_url($url, PHP_URL_PATH); - - // 获取文件名部分 - $filename = basename($path, '.html'); - - return $filename; - } - - function extractIdFromUrl($url) - { - if (preg_match('/-id-(\d+)\.html/', $url, $matches)) { - return $matches[1]; - } - return null; - } - - function extractNumbersFromUrl($url) - { - // 使用正则表达式匹配路径中的数字部分 - if (preg_match('#/(\d+)/(\d+)/#', $url, $matches)) { - return [ - 'first' => $matches[1], // 提取到的第一个数字 - 'second' => $matches[2], // 提取到的第二个数字 - ]; - } - return null; // 如果未匹配,返回 null - } - - function extractNumberFromUrl($url) - { - // 使用正则表达式匹配 /class/{数字}_ 的格式 - if (preg_match('/\/class\/(\d+)_/', $url, $matches)) { - return $matches[1]; // 返回匹配的数字部分 - } - return null; // 如果未匹配,返回 null - } - - - function encImgBy17C($strInputImgPath, $strOutImgPath, $strKey = 0x88) - { - // 读取图像内容 - $strImgData = file_get_contents($strInputImgPath); - if ($strImgData === false) { - throw new Exception("无法读取图片文件: $strInputImgPath"); - } - - // 将图像内容转换为字节数组 - $bytes = array_values(unpack('C*', $strImgData)); - $len = count($bytes); - - // 对每个字节进行异或操作加密 - for ($i = 0; $i < $len; $i++) { - $bytes[$i] ^= $strKey; - } - - // 将字节数组转换回二进制数据 - $strEncryptedData = pack('C*', ...$bytes); - - // 将加密后的数据写入文件 - if (file_put_contents($strOutImgPath, $strEncryptedData) === false) { - throw new Exception("无法写入加密文件: $strOutImgPath"); - } - } - - /** - * 中文转码实体字符 - * - * @param string $text - * @return string - */ - function customEntities($text) - { - $result = ''; - $length = mb_strlen($text, 'UTF-8'); - - for ($i = 0; $i < $length; $i++) { - $char = mb_substr($text, $i, 1, 'UTF-8'); - $code = ord($char); - - if ($code < 128) { - // 对于 ASCII 字符,直接使用 ord - $result .= '&#' . $code . ';'; - } else { - // 对于非 ASCII 字符,使用 mb_ord 获取 Unicode 码 - $code = mb_ord($char, 'UTF-8'); - $result .= '&#' . $code . ';'; - } - } - - return $result; - } - - function isValidDateTime($dateTimeStr, $format = 'Y-m-d H:i:s') - { - $date = DateTime::createFromFormat($format, $dateTimeStr); - return $date && $date->format($format) === $dateTimeStr; - } - - // 创建保存文件 - function saveContentToFile($filePath, $content) - { - // 确保目标路径的目录存在 - $directory = dirname($filePath); - if (!is_dir($directory)) { - // 尝试创建目录 - if (!mkdir($directory, 0777, true)) { - return [ - 'status' => false, - 'message' => "Failed to create directory: $directory" - ]; - } - } - - // 写入内容到文件 - if (file_put_contents($filePath, $content) !== false) { - return [ - 'status' => true, - 'message' => "Content successfully written to $filePath" - ]; - } else { - return [ - 'status' => false, - 'message' => "Failed to write content to $filePath" - ]; - } - } - - function saveCompressAndDeleteTxt($filePath, $content) - { - // 确保目标路径的目录存在 - $directory = dirname($filePath); - if (!is_dir($directory)) { - if (!mkdir($directory, 0777, true)) { - return [ - 'status' => false, - 'message' => "Failed to create directory: $directory" - ]; - } - } - - // 写入内容到文件 - $fp = fopen($filePath, "c+"); // 使用 c+ 模式,支持加锁 - if (!$fp) { - return [ - 'status' => false, - 'message' => "Failed to open file for writing: $filePath" - ]; - } - - // 加锁防止其他进程同时操作 - if (!flock($fp, LOCK_EX)) { // 加排他锁 - fclose($fp); - return [ - 'status' => false, - 'message' => "Failed to acquire lock for file: $filePath" - ]; - } - - // 写入内容 - if (fwrite($fp, $content) === false) { - flock($fp, LOCK_UN); // 释放锁 - fclose($fp); - return [ - 'status' => false, - 'message' => "Failed to write content to $filePath" - ]; - } - - // 解锁并关闭文件 - flock($fp, LOCK_UN); - fclose($fp); - - // 压缩文件为 ZIP - $zipPath = $filePath . ".zip"; // 压缩后的 ZIP 文件路径 - $zip = new ZipArchive(); - - $zipOpenResult = $zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE); - if ($zipOpenResult !== true) { - return [ - 'status' => false, - 'message' => "Failed to open zip archive: $zipPath" - ]; - } - - // 添加文件到 ZIP 中 - if (!$zip->addFile($filePath, basename($filePath))) { - $zip->close(); - return [ - 'status' => false, - 'message' => "Failed to add file to zip archive: $filePath" - ]; - } - - if (!$zip->close()) { - return [ - 'status' => false, - 'message' => "Failed to close zip archive: $zipPath" - ]; - } - - // 删除原始文件 - $fp = fopen($filePath, "c+"); // 重新打开文件以加锁 - if ($fp && flock($fp, LOCK_EX)) { - if (!file_exists($filePath)) { - unlink($filePath); // 删除文件 - } - - flock($fp, LOCK_UN); - fclose($fp); - } - - return [ - 'status' => true, - 'message' => "File success save to $zipPath and del", - 'zip_path' => $zipPath - ]; - } - - /** - * 提取 ZIP 文件中的所有 .txt 文件内容 - * - * @param string $zipPath ZIP 文件的完整路径 - * @return array 返回一个数组,键是文件名,值是对应的文件内容 - * @throws Exception 如果文件不存在或解压失败则抛出异常 - */ - function extractTxtFromZip($zipPath) - { - if (!file_exists($zipPath)) { - throw new Exception("ZIP 文件路径无效: " . $zipPath); - } - - $zip = new ZipArchive(); - - if ($zip->open($zipPath) === true) { - $txtContents = ""; - - // 遍历所有文件 - for ($i = 0; $i < $zip->numFiles; $i++) { - $fileName = $zip->getNameIndex($i); - - // 检查文件是否是 .txt 结尾 - if (pathinfo($fileName, PATHINFO_EXTENSION) === 'txt') { - // 读取文件内容 - $content = $zip->getFromName($fileName); - $txtContents = $content; - } - } - - $zip->close(); - return $txtContents; - } else { - throw new Exception("无法打开 ZIP 文件。"); - } - } - - - function readExtractAndDeleteTxt($zipPath, $extractTo = null) - { - // 检查 ZIP 文件是否存在 - if (!file_exists($zipPath)) { - return [ - 'status' => false, - 'message' => "ZIP file does not exist: $zipPath" - ]; - } - - // 打开 ZIP 文件 - $zip = new ZipArchive(); - if ($zip->open($zipPath) !== true) { - return [ - 'status' => false, - 'message' => "Failed to open ZIP file: $zipPath" - ]; - } - - // 获取 ZIP 文件内容列表 - $fileList = []; - for ($i = 0; $i < $zip->numFiles; $i++) { - $fileList[] = $zip->getNameIndex($i); - } - - // 如果需要提取文件 - if ($extractTo) { - // 确保目标目录存在 - if (!is_dir($extractTo)) { - if (!mkdir($extractTo, 0777, true)) { - return [ - 'status' => false, - 'message' => "Failed to create extraction directory: $extractTo" - ]; - } - } - - // 提取文件到指定目录 - if (!$zip->extractTo($extractTo)) { - $zip->close(); - return [ - 'status' => false, - 'message' => "Failed to extract ZIP file to $extractTo" - ]; - } - } - - // 关闭 ZIP 文件 - $zip->close(); - - // 删除提取的 .txt 文件 - $deletedFiles = []; - foreach ($fileList as $file) { - if (pathinfo($file, PATHINFO_EXTENSION) === 'txt') { // 检查是否是 .txt 文件 - $filePath = rtrim($extractTo, '/') . '/' . $file; - if (file_exists($filePath) && unlink($filePath)) { - $deletedFiles[] = $file; - } - } - } - - // 返回提取和删除状态 - return [ - 'status' => true, - 'message' => "ZIP file successfully extracted to $extractTo and .txt files deleted.", - 'files_extracted' => $fileList, - 'files_deleted' => $deletedFiles - ]; - } - - function getRandomUserAgent() - { - $userAgents = [ - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36', - // 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', - // 'Mozilla/5.0 (Linux; Android 9; ASUS_X00TD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/359.0.0.288 Mobile Safari/537.36', - // 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1', - // 'Mozilla/5.0 (Linux; Android 9; ASUS_X00TD; Flow) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/359.0.0.288 Mobile Safari/537.36' - ]; - return $userAgents[array_rand($userAgents)]; - } - - function getRandomProxies() - { - $proxies = [ - 'http://114.115.130.225:3128', - // 'http://36.6.145.131:8089', - // 'http://202.101.213.205:19926', - // 'http://218.87.205.35:21874', - // 'http://203.19.38.114:1080', - // 'http://121.89.222.174:8090', - // 'http://223.113.80.158:9091', - // 'http://120.232.194.134:8998', - // 'http://120.46.197.14:8083', - // 'http://139.9.5.196:7890', - - // 'http://203.89.8.107:80', - // 'http://117.186.143.130:8118', - // 'http://117.186.232.73:8080', - // 'http://203.12.200.179:8085', - // 'http://120.46.215.52:15280', - // 'http://111.230.243.170:80', - // 'http://223.113.101.150:8060', - // 'http://117.50.113.39:1337', - ]; - return $proxies[array_rand($proxies)]; - } - - function fetchContentWithCurl($url, $headers = [], $timeout = 10, $proxy = null, $proxyAuth = null) - { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - - // 设置头部 - if (!empty($headers)) { - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - } - - // 模拟浏览器 - curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 9; ASUS_X00TD; Flow) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/359.0.0.288 Mobile Safari/537.36'); - - // 如果需要代理 - if ($proxy) { - curl_setopt($ch, CURLOPT_PROXY, $proxy); - if ($proxyAuth) { - curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyAuth); // 代理用户名和密码 - } - } - - // 执行请求 - $response = curl_exec($ch); - - // 检查错误 - if (curl_errno($ch)) { - $error = 'cURL Error: ' . curl_error($ch); - curl_close($ch); - return ['success' => false, 'error' => $error]; - } - - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - - // 返回结果 - if ($httpCode >= 200 && $httpCode < 300) { - return ['success' => true, 'data' => $response]; - } else { - return ['success' => false, 'error' => "HTTP Error: $httpCode"]; - } - } - - - // 随机颜色生成函数 - function getRandomColor() - { - return 'color:rgb(' . mt_rand(0, 255) . ', ' . mt_rand(0, 255) . ', ' . mt_rand(0, 255) . ');'; - } - - /** - * 生成分页 HTML 的通用函数 - * - * @param int $currentPage 当前页码 - * @param int $lastPage 总页数 - * @param string $baseUrl 基础 URL - * @param string $queryParams 查询参数(包含占位符 :page) - * @param int $maxPagesToShow 最大显示页码数 - * @return string 分页 HTML - * 示例调用 - * $paginationHtml = generatePaginationHtml( - * 3, // 当前页 - * 10, // 总页数 - * '/vodshow/dy-cn-hot-action-en-', // 基础 URL - * ':page---2024.html', // 查询参数,包含占位符 :page - * 5 // 最多显示 5 个页码 - * ); - * // 输出分页 HTML - * echo $paginationHtml; - * - */ - function generatePaginationHtml($currentPage, $lastPage, $baseUrl, $queryParams, $maxPagesToShow = 5) - { - - $paginationHtml = ''; - - return $paginationHtml; - } - - - /** - * 生成分页 HTML 的通用函数 - * - * @param int $currentPage 当前页码 - * @param int $lastPage 总页数 - * @param string $baseUrl 基础 URL - * @param string $queryParams 查询参数(包含占位符 :page) - * @param int $maxPagesToShow 最大显示页码数 - * @return string 分页 HTML - * 示例调用 - * $paginationHtml = generatePaginationHtml( - * 3, // 当前页 - * 10, // 总页数 - * '/vodshow/dy-cn-hot-action-en-', // 基础 URL - * ':page---2024.html', // 查询参数,包含占位符 :page - * 5 // 最多显示 5 个页码 - * ); - * // 输出分页 HTML - * echo $paginationHtml; - * - */ - function generateNovelPaginationHtml($currentPage, $lastPage, $baseUrl, $queryParams, $maxPagesToShow = 10) - { - $paginationHtml = '
'; - - // 首页按钮 - $paginationHtml .= '首 页'; - - // 计算分页起始和结束 - $start = max(1, $currentPage - floor($maxPagesToShow / 2)); - $end = min($lastPage, $start + $maxPagesToShow - 1); - if ($end - $start + 1 < $maxPagesToShow) { - $start = max(1, $end - $maxPagesToShow + 1); - } - - // 页码按钮 - for ($i = $start; $i <= $end; $i++) { - if ($i == $currentPage) { - $paginationHtml .= ' ' . $i . ' '; - } else { - $paginationHtml .= ' ' . $i . ' '; - } - } - - // 下一页按钮 - if ($currentPage < $lastPage) { - $paginationHtml .= '下一页'; - } - - $paginationHtml .= '
'; - - return $paginationHtml; - } - - // 分页模板-时空小说模板 - function generateNovelSkPaginationHtml($currentPage, $lastPage, $baseUrl, $queryParams, $maxPagesToShow = 10) - { - $paginationHtml = ''; - - return $paginationHtml; - } - - - - // 更据IP 获取地区 - function getLocationByIp($ip) - { - try { - $response = file_get_contents("http://ip-api.com/json/{$ip}"); - $locationData = json_decode($response, true); - - if ($locationData['status'] === 'success') { - return [ - 'country' => $locationData['country'], - 'region' => $locationData['regionName'], - 'city' => $locationData['city'], - 'lat' => $locationData['lat'], - 'lon' => $locationData['lon'] - ]; - } - } catch (\Exception $e) { - // 记录异常或忽略 - } - - return null; // 无法获取地理信息时返回 null - } - - // 检查解密内容是否包含潜在的漏洞代码 - function checkForVulnerabilities($content) - { - // 检查是否包含 'eval' 函数 - if (stripos($content, 'eval') !== false) { - return true; - } - - // 检查是否包含恶意的 http 或域名 - $vulnerablePatterns = [ - '/http(s)?:\/\/[^ ]+/', // 匹配 URL - '/.*<\/script>/i' // 匹配 script 标签 - ]; - - foreach ($vulnerablePatterns as $pattern) { - if (preg_match($pattern, $content)) { - return true; - } - } - - return false; - } - - /** - * 从 URL、URI 或路径中提取文件名(不带后缀) - * @param string $path 输入的路径,比如 "/shu/1/4313672.html" 或 "https://example.com/files/test.pdf" - * @return string|null 返回文件名部分,如果提取失败返回 null - */ - function supperExtractFilename($path) - { - if (empty($path) || !is_string($path)) { - return null; - } - - $slashPos = strrpos($path, '/'); - if ($slashPos === false) { - $slashPos = -1; - } - - $dotPos = strrpos($path, '.'); - if ($dotPos === false || $dotPos <= $slashPos) { - - return substr($path, $slashPos + 1); - } - - $start = $slashPos + 1; - $length = $dotPos - $start; - return substr($path, $start, $length); - } - - - /** - * Undocumented function - * - * @param string $strZh - * @return string - */ - function zhToPinYin(string $strZh): string - { - if (empty($strZh)) { - return $strZh; - } - - $strPinYinToolsPath = root_path() . '/extend/tools/pinyin-tool'; - - $strPinYin = shell_exec(sprintf("%s %s", $strPinYinToolsPath, escapeshellcmd($strZh))); - - $strPinYin = trim((string) $strPinYin); - - return $strPinYin; - } - - - /** - * Undocumented function - * - * @param object $Obj - * @param string $strAction - * @return string - */ - function getFomartSubjectKey(string $strAction): string - { - return strtoupper(str_replace('::', '@', ltrim(strrchr($strAction, "\\"), "\\"))); - } - - /** - * Undocumented function - * - * @param MongoDB\BSON\UTCDateTime $mongoDate - * @param string $format - * @return string - */ - function formatMongoDate(\MongoDB\BSON\UTCDateTime $mongoDate, string $strFormat = "Y-m-d H:i:s"): string - { - $intTimestamp = (int) ((string) $mongoDate / 1000); - return gmdate($strFormat, $intTimestamp); - } - - /** - * Undocumented function - * - * @param array $arrData - * @param array $arrKeys - * @param callable $Callback - * @return void - */ - function applyToKeys(null|array &$arrData, array $arrKeys, callable $Callback) - { - if (empty($arrData)) return; - - foreach ($arrKeys as $strKey) { - if (key_exists($strKey, $arrData)) { - $arrData[$strKey] = $Callback($arrData[$strKey]); - } - } - } - - /** - * generate string - * - * @param integer $length - * @return string - */ - function randomString(int $length): string { - $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $max = 51; // 字符集长度减1 (0-51) - $result = ''; - - for ($i = 0; $i < $length; $i++) { - $result .= $chars[random_int(0, $max)]; - } - - return $result; - } -} diff --git a/code/app/event.php b/code/app/event.php deleted file mode 100644 index e9851bb..0000000 --- a/code/app/event.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - ], - - 'listen' => [ - 'AppInit' => [], - 'HttpRun' => [], - 'HttpEnd' => [], - 'LogLevel' => [], - 'LogWrite' => [], - ], - - 'subscribe' => [ - ], -]; diff --git a/code/app/home/BaseController.php b/code/app/home/BaseController.php deleted file mode 100644 index 1b45103..0000000 --- a/code/app/home/BaseController.php +++ /dev/null @@ -1,152 +0,0 @@ -app = $app; - $this->request = $this->app->request; - - // 控制器初始化 - $this->initialize(); - - // View::assign('') - } - - /** - * 初始化 - * - * @return void - */ - protected function initialize() - { - $this->initSiteTKD(); - } - - - /** - * 初始化网站基本信息到全局替换类里 - * - * @return void - */ - private function initSiteTKD() - { - ConverterMovel::setVal([ - 'strSiteName' => $this->request->DomainModel->d_name, - 'strSiteDomain' => $this->request->DomainModel->d_domain, - 'strSiteKeywords' => $this->request->DomainModel->d_keywords, - 'strSiteDescription' => $this->request->DomainModel->d_description, - ]); - } - - /** - * return fomart view string - * - * @param string $strTemplate - * @return string - */ - public function rending($strTemplate = '') - { - // 全局使用的URL模板 - $strPcUrlTemp = $this->request->DomainModel->getFomartSubject('PC_URL_PATH','',false); - $strNanUrlTemp = $this->request->DomainModel->getFomartSubject('NAN_SHENG_URL','',false); - $strNvUrlTemp = $this->request->DomainModel->getFomartSubject('NV_SHENG_URL','',false); - $strCategoryIndexUrlTemp = $this->request->DomainModel->getFomartSubject('CATEGORY_INDEX_URL','',false); - $strRankUrlTemp = $this->request->DomainModel->getFomartSubject('RANK_INFO_URL','',false); - $strSearchIndexUrlTemp = $this->request->DomainModel->getFomartSubject('SEARCH_INDEX_URL','',false); - $strHistoryUrlTemp = $this->request->DomainModel->getFomartSubject('HISTORY_INFO_URL','',false); - $strBookShelfUrlTemp = $this->request->DomainModel->getFomartSubject('SHUJIA_INFO_URL','',false); - $strUserUrlTemp = $this->request->DomainModel->getFomartSubject('USER_INFO_URL','',false); - - View::assign("DomainModel", $this->request->DomainModel); - View::assign("TemplatesModel", $this->request->TemplatesModel); - View::assign("strPcPath", $strPcUrlTemp); - View::assign("strNanUrlTemp", $strNanUrlTemp); - View::assign("strNvUrlTemp", $strNvUrlTemp); - View::assign("strCategoryIndexUrlTemp", $strCategoryIndexUrlTemp); - View::assign("strRankUrlTemp", $strRankUrlTemp); - View::assign("strSearchIndexUrlTemp", $strSearchIndexUrlTemp); - View::assign("strHistoryUrlTemp", $strHistoryUrlTemp); - View::assign("strBookShelfUrlTemp", $strBookShelfUrlTemp); - View::assign("strUserUrlTemp", $strUserUrlTemp); - - $strTemplatesModel = $this->request->TemplatesModel->t_code; - - switch ($strTemplatesModel) { - case 'default': - // TODO 随机30个小说(有伪造小说的) - $arrForgeNovel = []; - View::assign([ - 'arrForgeNovel' => $arrForgeNovel, - 'arrCategoryAll' => CategoryModel::$arrCategoryAll, - ]); - break; - case 'kuangYu': - break; - - } - - return View::fetch($strTemplate); - } - - /** - * generate GRM - * - * @param integer $intDeviceType - * @param integer $intNum - * @return void - */ - public function generateGrm(int $intDeviceType, string|int $strDiff, int $intNum) - { - $strDomain = $this->request->DomainModel->d_domain; - $strPageCode = $this->request->controller() . '@' . $this->request->action() . '@' . $intDeviceType; - - $arrGRM = GanRaoMaModel::getGrmCode($strDomain, $strPageCode, $strDiff, $intNum); - - View::assign("arrGRM", $arrGRM); - } -} diff --git a/code/app/home/common.php b/code/app/home/common.php deleted file mode 100644 index 1243615..0000000 --- a/code/app/home/common.php +++ /dev/null @@ -1,2 +0,0 @@ - [ - 'pc' => ['/pc', '/web', '/desktop', '/index', '/shouye', '/zhuomian'], - 'h5' => ['','/nindex'], - ], - - // 通用路径别名 - 'paths' => [ - // 章节相关路径 - 'chapter' => [ - '/xiaoshuo/:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', - '/novel/:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', - '/book/:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', - '/xiaoshuo-:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', - '/novel-:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', - '/book-:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', - ], - - // 最新章节-特殊页面处理 - 'latest' => [ - '/xiaoshuo/:name-:intNovelId/chapter/latest', - '/novel/:name-:intNovelId/chapter/latest', - '/book/:name-:intNovelId/chapter/latest', - '/xiaoshuo-:name-:intNovelId/chapter/latest', - '/novel-:name-:intNovelId/chapter/latest', - '/book-:name-:intNovelId/chapter/latest', - ], - - // 目录相关路径 - 'catalog' => [ - '/xiaoshuo/:name-:intNovelId/mulu/:strOrder/[:intPage]', - '/novel/:name-:intNovelId/catalog/:strOrder/[:intPage]', - '/book/:name-:intNovelId/table/:strOrder/[:intPage]', - '/xiaoshuo/:name-:intNovelId/mulu/:strOrder/[:intPage]', - '/novel/:name-:intNovelId/catalog/:strOrder/[:intPage]', - '/book/:name-:intNovelId/table/:strOrder/[:intPage]', - ], - - // 伪小说详情相关路径 - 'kan-novel' => [ - '/kan-xiaoshuo/:name-:intNovelId-:n_forge_id', - '/show-novel/:name-:intNovelId-:n_forge_id', - '/seo-book/:name-:intNovelId-:n_forge_id', - '/show-xiaoshuo-:name-:intNovelId-:n_forge_id', - '/see-novel-:name-:intNovelId-:n_forge_id', - '/good-book-:name-:intNovelId-:n_forge_id', - ], - - // 小说详情相关路径 - 'novel' => [ - '/xiaoshuo/:name-:intNovelId', - '/novel/:name-:intNovelId', - '/book/:name-:intNovelId', - '/xiaoshuo-:name-:intNovelId', - '/novel-:name-:intNovelId', - '/book-:name-:intNovelId', - ], - - // 书库 - 'library' => [ - /** - * /shuku/nansheng-xiaoshuo/all/all/all/page1 - * '/:strGender?/:strCategory?/:strStatus?/:strOrder?/:intPage?'; - * 完整路由 - * 使用: {site:nflurl gender="$strGender" category="$CategoryPinyin" status="all" order="all" page="1"/} - */ - // '/shuku/:strGender?/:strCategory?/:strStatus?/:strOrder?/page:intPage?', - '/shuku/:strGender/:strCategory/:strStatus/:strOrder/page:intPage', - '/books/:strGender/:strCategory/:strStatus/:strOrder/page:intPage', - '/library/:strGender/:strCategory/:strStatus/:strOrder/page:intPage', - '/fenlei/:strGender/:strCategory/:strStatus/:strOrder/page:intPage', - '/class/:strGender/:strCategory/:strStatus/:strOrder/page:intPage', - '/category/:strGender/:strCategory/:strStatus/:strOrder/page:intPage', - - /** - * default 模板 - * strGender 不需要 - * 使用 :gender 传空/或者不传,控制器会默认值是 all - * {site:nflurl gender="" category="$CategoryPinyin" status="all" order="all" page="1"/} - */ - '/shuku/:strCategory/:strStatus/:strOrder/page:intPage', - '/books/:strCategory/:strStatus/:strOrder/page:intPage', - '/library/:strCategory/:strStatus/:strOrder/page:intPage', - '/fenlei/:strCategory/:strStatus/:strOrder/page:intPage', - '/class/:strCategory/:strStatus/:strOrder/page:intPage', - '/category/:strCategory/:strStatus/:strOrder/page:intPage', - - /** - * default 模板 - * strGender strOrder 不需要 - * 使用 :gender 传空/或者不传,控制器会默认值是 all - * {site:nflurl gender="" category="$CategoryPinyin" status="all" order="all" page="1"/} - */ - // '/shuku/:strCategory/:strStatus/page:intPage', - // '/books/:strCategory/:strStatus/page:intPage', - // '/library/:strCategory/:strStatus/page:intPage', - // '/fenlei/:strCategory/:strStatus/page:intPage', - // '/class/:strCategory/:strStatus/page:intPage', - // '/category/:strCategory/:strStatus/page:intPage', - - /** - * default 模板 - * strGender 不需要 - * 使用 :gender 传空/或者不传,控制器会默认值是 all - * {site:nflurl gender="" category="$CategoryPinyin" status="all" order="all" page="1"/} - */ - // '/shuku/:strCategory/:strOrder/page:intPage', - // '/books/:strCategory/:strOrder/page:intPage', - // '/library/:strCategory/:strOrder/page:intPage', - // '/fenlei/:strCategory/:strOrder/page:intPage', - // '/class/:strCategory/:strOrder/page:intPage', - // '/category/:strCategory/:strOrder/page:intPage', - - - /** - * default 模板 /shuku/xuanhuan-xiuzhen/page1 - * strGender strStatus strOrder 不需要 - * 使用 :gender 传空/或者不传,控制器会默认值是 all - * {site:nflurl gender="" category="$CategoryPinyin" status="all" order="all" page="1"/} - */ - // '/shuku/:strCategory/page:intPage', - // '/books/:strCategory/page:intPage', - // '/library/:strCategory/page:intPage', - // '/fenlei/:strCategory/page:intPage', - // '/class/:strCategory/page:intPage', - // '/category/:strCategory/page:intPage', - - /** - * kuangyu 模板 - * strOrder 不需要 - * 使用 order 传空/或者不传,控制器会默认值是 all - * {site:nflurl gender="$strGender" category="$CategoryPinyin" status="all" page="1"/} - */ - '/shuku/:strGender/:strCategory/:strStatus/page:intPage', - '/books/:strGender/:strCategory/:strStatus/page:intPage', - '/library/:strGender/:strCategory/:strStatus/page:intPage', - '/fenlei/:strGender/:strCategory/:strStatus/page:intPage', - '/class/:strGender/:strCategory/:strStatus/page:intPage', - '/category/:strGender/:strCategory/:strStatus/page:intPage', - - // '/shuku/:strGender/page:intPage', - // '/books/:strGender/page:intPage', - // '/library/:strGender/page:intPage', - // '/fenlei/:strGender/page:intPage', - // '/class/:strGender/page:intPage', - // '/category/:strGender/page:intPage', - ], - // 书库首页 - 'library-index' => [ - '/shuku/index', - '/books/index', - '/library/index', - '/fenlei/index', - '/class/index', - '/category/index', - ], - //排行榜 - 'rank' => ['/paihang/all', '/rank/all', '/paihang-quan', '/top/all', '/paihang-bang', '/ranks/all'], - // 男生 - 'boys' => ['/nansheng-xiaoshuo', '/boys-novel', '/nansheng-shu', '/man-read', '/nansheng-book', '/male-novels'], - //女生 - 'girls' => ['/nvsheng-xiaoshuo', '/girls-novel', '/nvsheng-shu', '/woman-read', '/nvsheng-book', '/female-novels'], - //搜索 - 'search' => ['/search', '/explore', '/sousuo', '/find', '/query', '/keywords'], - // 用户中心 - 'user' => ['/user', '/my-account', '/profile', '/yonghu', '/wode-zhongxin', '/personal-center'], - //书架 - 'bookshelf' => ['/bookshelf', '/book-shelf', '/reading-shelf', '/shujia', '/yuedu-shujia', '/book-collection'], - //历史记录 - 'history' => ['/history', '/reading-history', '/read-record', '/lishi', '/yuedu-lishi', '/browse-past'], - // 首页 - 'index' => ['/'], - // 首页 - 如果info_id 》 0 - 'nindex' => ['/nindex'], - - ], - -]; - -/** - * 遍历路由配置,动态注册 H5 和 PC 路由 - */ -foreach ($arrRoutes['prefixes'] as $platform => $prefixes) { - $prefixes = is_array($prefixes) ? $prefixes : [$prefixes]; - $boolIsMobile = $platform === 'h5'; - foreach ($prefixes as $strPath) { - foreach ($arrRoutes['paths'] as $key => $arrUrl) { - foreach ($arrUrl as $strUrl) { - $strRoute = $strPath . $strUrl; - switch ($key) { - case 'latest': - //最新章节 - $strView = 'pc/getNovelCatalog.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelCatalog.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }) - ->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]); - break; - - case 'chapter': - //章节 - $strView = 'pc/getNovelChapter.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelChapter.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }) - ->pattern(['intNovelId' => '\d+', 'name' => '[\w-]+', 'intChapterSort' => '\d+', 'intChapterPage' => '\d+']); - break; - - case 'kan-novel': - //伪造小说详情 - $strView = 'pc/getNovelInfo.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelInfo.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }) - ->pattern(['n_id' => '\d+', 'n_forge_id' => '\d+', 'name' => '[\w-]+',]); - break; - - case 'novel': - //小说详情 - $strView = 'pc/getNovelInfo.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelInfo.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }) - ->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]); - - break; - case 'catalog': - //目录 - $strView = 'pc/getNovelCatalog.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelCatalog.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }) - ->pattern(['n_id' => '\d+', 'name' => '[\w-]+', 'strOrder' => 'zheng|dao', 'intPage' => '\d+']); - - break; - case 'library': - $strView = 'pc/getLibrary.html'; - if ($platform == 'h5') { - $strView = 'novel/getLibrary.html'; - } - //书库/分类 - Route::get($strRoute, function () use ($strView) { - return view($strView); - }) - ->pattern([ - 'strGender' => '[a-z\-]*', // 允许空值 - 'strCategory' => '[a-z\-]*', // 允许空值 - 'strStatus' => '(all|lianzai|wanjie)?', // 允许空值 - 'strOrder' => '[a-z\-]*', // 允许空值 - 'intPage' => '\d*', // 允许空值 - // 'strCategory' => 'all|xuanhuan-xiuzhen|junshi-xiaoshuo|wangyou-xiaoshuo|kehuan-xiaoshuo|zhongsheng-chuanyue|dushi-xiaoshuo|lingyi-xiaoshuo|yanqing-xiaoshuo|qita-xiaoshuo', - - - ]); - break; - - case 'library-index': - //书库/分类首页 - $strView = 'pc/getLibrary.html'; - if ($platform == 'h5') { - $strView = 'novel/getLibrary.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }); - - break; - case 'rank': - //排行榜 - $strView = 'pc/getNovelRank.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelRank.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }); - break; - - case 'boys': - //男生 - $strView = 'pc/getNovelChannel.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelChannel.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - })->append(['strChannel' => 'man']); - - //Route::get($strRoute, [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => $boolIsMobile, 'strChannel' => 'boys']); - break; - - case 'girls': - //女生 - $strView = 'pc/getNovelChannel.html'; - if ($platform == 'h5') { - $strView = 'novel/getNovelChannel.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - })->append(['strChannel' => 'women']); - - //Route::get($strRoute, [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => $boolIsMobile, 'strChannel' => 'girls']); - break; - - case 'search': - //搜素 - $strView = 'pc/getSearchNovel.html'; - if ($platform == 'h5') { - $strView = 'novel/getSearchNovel.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - })->ext('html'); - break; - - case 'user': - //用户中心 - $strView = 'pc/user/index.html'; - if ($platform == 'h5') { - $strView = 'user/index.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }); - break; - - case 'bookshelf': - //书架 - $strView = 'pc/user/getBookShelf.html'; - if ($platform == 'h5') { - $strView = 'user/getBookShelf.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }); - break; - - case 'history': - //历史记录 - $strView = 'pc/user/getHistory.html'; - if ($platform == 'h5') { - $strView = 'user/getHistory.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }); - break; - - case 'index': - // 首页 - if ($platform == 'h5') { - Route::get($strRoute, function (\think\Request $Request, SiteContext $SiteContext ) { - return view($SiteContext->getHomeView('h5')); - }); - } else { - Route::get($strRoute, function (\think\Request $Request, SiteContext $SiteContext ) { - return view($SiteContext->getHomeView('pc')); - }); - } - break; - case 'nindex': - // 首页 - $strView = 'pc/index.html'; - if ($platform == 'h5') { - $strView = 'index/index.html'; - } - Route::get($strRoute, function () use ($strView) { - return view($strView); - }); - break; - - } - } - } - } -} - -/** - * 遍历路由配置,动态注册 H5 和 PC 路由 - */ -// foreach ($arrRoutes['prefixes'] as $platform => $prefixes) { -// $prefixes = is_array($prefixes) ? $prefixes : [$prefixes]; -// $boolIsMobile = $platform === 'h5'; -// foreach ($prefixes as $strPath) { -// foreach ($arrRoutes['paths'] as $key => $arrUrl) { -// foreach ($arrUrl as $strUrl) { -// $strRoute = $strPath . $strUrl; -// switch ($key) { -// case 'latest': -// //最新章节 -// Route::get($strRoute, [Novel::class, 'getNovelLatestChapter']) -// ->append(['boolIsMobile' => $boolIsMobile]) -// ->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]); -// break; -// case 'chapter': -// //章节 -// Route::get($strRoute, [Novel::class, 'getNovelChapter']) -// ->append(['boolIsMobile' => $boolIsMobile]) -// ->pattern(['intNovelId' => '\d+', 'name' => '[\w-]+', 'intChapterSort' => '\d+', 'intChapterPage' => '\d+']); -// break; -// case 'kan-novel': -// //伪造小说详情 -// Route::get($strRoute, [Novel::class, 'getKanNovelInfo']) -// ->append(['boolIsMobile' => $boolIsMobile]) -// ->pattern(['n_id' => '\d+', 'n_forge_id' => '\d+', 'name' => '[\w-]+',]); -// break; -// case 'novel': -// //小说详情 -// Route::get($strRoute, [Novel::class, 'getNovelInfo']) -// ->append(['boolIsMobile' => $boolIsMobile]) -// ->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]); -// break; -// case 'catalog': -// //目录 -// Route::get($strRoute, [Novel::class, 'getNovelCatalog']) -// ->append(['boolIsMobile' => $boolIsMobile]) -// ->pattern(['intNovelId' => '\d+', 'name' => '[\w-]+', 'strOrder' => 'zheng|dao', 'intPage' => '\d+']); -// break; -// case 'library': -// //书库/分类 /shuku/all/xuanhuan-xiuzhen/all/all/page1 -// Route::get($strRoute, [Novel::class, 'getLibrary']) -// ->append(['boolIsMobile' => $boolIsMobile]) -// ->pattern([ -// //'strGender' => 'all|nansheng-xiaoshuo|boys-novel|nansheng-shu|man-read|nansheng-book|male-novels|nvsheng-xiaoshuo|girls-novel|nvsheng-shu|woman-read|nvsheng-book|female-novels', -// 'strGender' => '[a-z\-]+', -// 'strCategory' => '[a-z\-]+', -// 'strStatus' => 'all|lianzai|wanjie', -// // 'strOrder' => '[a-z\-]+', -// 'intPage' => '\d+' -// ]); -// break; -// case 'library-index': -// //书库/分类首页 -// Route::get($strRoute, [Novel::class, 'getLibrary'])->append(['boolIsMobile' => $boolIsMobile]); -// break; -// case 'rank': -// //排行榜 -// Route::get($strRoute, [Novel::class, 'getNovelRank'])->append(['boolIsMobile' => $boolIsMobile]); -// break; -// case 'boys': -// //男生 -// Route::get($strRoute, [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => $boolIsMobile, 'strChannel' => 'boys']); -// break; -// case 'girls': -// //女生 -// Route::get($strRoute, [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => $boolIsMobile, 'strChannel' => 'girls']); -// break; -// case 'search': -// //搜素 -// Route::get($strRoute, [Novel::class, 'getSearchNovel'])->ext('html')->append(['boolIsMobile' => $boolIsMobile]); -// break; -// case 'user': -// //用户中心 -// Route::get($strRoute, [User::class, 'Index'])->append(['boolIsMobile' => $boolIsMobile]); -// break; -// case 'bookshelf': -// //书架 -// Route::get($strRoute, [User::class, 'getBookShelf'])->append(['boolIsMobile' => $boolIsMobile]); -// break; -// case 'history': -// //历史记录 -// Route::get($strRoute, [User::class, 'getHistory'])->append(['boolIsMobile' => $boolIsMobile]); -// break; -// case 'index': -// // 首页 -// if ($platform == 'h5') { -// Route::get($strRoute, [Index::class, 'index'])->append(['boolIsMobile' => $boolIsMobile]); -// } else { -// Route::get($strRoute, [Index::class, 'getPcIndex'])->append(['boolIsMobile' => $boolIsMobile]); -// } -// break; -// } -// } -// } -// } -// } diff --git a/code/app/home/config/view.php b/code/app/home/config/view.php deleted file mode 100644 index 00c27a9..0000000 --- a/code/app/home/config/view.php +++ /dev/null @@ -1,5 +0,0 @@ -getViewConfig(); diff --git a/code/app/home/controller/Index.php b/code/app/home/controller/Index.php deleted file mode 100644 index aa6b561..0000000 --- a/code/app/home/controller/Index.php +++ /dev/null @@ -1,249 +0,0 @@ -param('boolIsMobile'); - $intTTL = 24 * 3600; - - $NovelModel = NovelModel::getInstance(); - - $strTemplatesModel = $Request->TemplatesModel->t_code; - - switch ($strTemplatesModel) { - case 'default': - // 默认模板 630zw - // TODO default模板-h5 首页数据: 获取所有分类数据,然后 每个分类 随机获取 10个小说 , - // 所有分类数据 放到一个数组里, 前端一个循环渲染,排版都是一样的 - $arrAllCategoryNovel = []; - - View::assign([ - 'arrAllCategoryNovel' => $arrAllCategoryNovel, - ]); - break; - - case 'kuangYu': - $strKey = sprintf('%s:H5:INDEX:ZUIJIAN:SEX:%s:%s', $Request->DomainModel->d_domain, 0, 8); - $arrNewsNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, 8, 0, NULL, ['n_update_time' => -1]); - - $strKey = sprintf('%s:H5:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'daily', 0); - $arrDayRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'daily'); - - $strKey = sprintf('%s:H5:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'weekly', 0); - $arrWeekRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'weekly'); - - $strKey = sprintf('%s:H5:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'monthly', 0); - $arrMoonRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'monthly'); - - $strStatus = '已完结'; - $strKey = sprintf('%s:H5:INDEX:RANK:%s:%s', $Request->DomainModel->d_domain, 'total', 'finished'); - $arrEndNovelRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'total', $strStatus); - - /** @var DomainModel **/ - $Request->DomainModel; - - - $strHostNovelDescriptionTemplate = $Request->DomainModel->getFomartSubject('INDEX_POPULAR_NOVELS'); - $strNewsNovelDescriptionTemplate = $Request->DomainModel->getFomartSubject('INDEX_NEWS_NOVELS'); - $strRankNovelDescriptionTemplate = $Request->DomainModel->getFomartSubject('INDEX_RANK_NOVELS'); - $strHostNovelDescription = ConverterMovel::convert($strHostNovelDescriptionTemplate); - $strNewsNovelDescription = ConverterMovel::convert($strNewsNovelDescriptionTemplate); - $strRankNovelDescription = ConverterMovel::convert($strRankNovelDescriptionTemplate); - - View::assign([ - 'arrDayRankNovel' => $arrDayRankNovel, - 'arrWeekRankNovel' => $arrWeekRankNovel, - 'arrMoonRankNovel' => $arrMoonRankNovel, - 'arrEndNovelRankNovel' => $arrEndNovelRankNovel, - 'strHostNovelDescription' => $strHostNovelDescription, - 'strNewsNovelDescription' => $strNewsNovelDescription, - 'strRankNovelDescription' => $strRankNovelDescription, - ]); - break; - } - - // 推荐等级为9的 随机15个小说 - $strKey = sprintf('%s:H5:INDEX:TUIJIAN:%s', $Request->DomainModel->d_domain, 8); - $arrRecommendNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, 8); - - $strKey = sprintf('%s:H5:INDEX:ZUIJIAN:SEX:%s:%s', $Request->DomainModel->d_domain, 0, 8); - $arrNewsNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, 8, 0, NULL, ['og_novel_update_time' => -1]); - - // Title 模板 - ConverterMovel::setVal([ - 'strIndexTitle' => $this->request->DomainModel->d_index_title, - 'strIndexKeywords' => $this->request->DomainModel->d_index_keywords, - 'strIndexDescription' => $this->request->DomainModel->d_index_description, - ]); - $strTitleTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE'); - $strKeywordsTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS'); - $strDescriptionTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION'); - - - $strTitle = ConverterMovel::convert($strTitleTemplate); - $strKeywords = ConverterMovel::convert($strKeywordsTemplate); - $strDescription = ConverterMovel::convert($strDescriptionTemplate); - - View::assign([ - 'arrRecommendNovel' => $arrRecommendNovel, - 'arrNewsNovel' => $arrNewsNovel, - 'strPageCode' => 'home', - 'strTitle' => $strTitle, - 'strKeywords' => $strKeywords, - 'strDescription' => $strDescription, - - ]); - - $strView = $boolIsMobile ? '' : 'pc/index'; - - $this->generateGrm(1, 0, 60); - return $this->rending($strView); - } - - /** - * 首页数据-PC - * @param Request $Request - * @return void - */ - public function getPcIndex(Request $Request) - { - $boolIsMobile = $Request->param('boolIsMobile'); - - $intTTL = 24 * 3600; - - $NovelModel = NovelModel::getInstance(); - - $strTemplatesModel = $Request->TemplatesModel->t_code; - - $intRecommendSerializationNovel = 4; - $intRecommendEndNovel = 9; - - switch ($strTemplatesModel) { - case 'default': - // TODO 1.获取所有分类数据, - // 2.然后 每个分类 随机获取 13个小说 , - // 3.所有分类数据 放到一个数组里, 前端一个循环渲染,排版都是一样的 - $arrAllCategoryNovel = []; - - // TODO 最新入库小说 随机30个 - $arrNewsNovel = []; - - View::assign([ - 'arrAllCategoryNovel' => $arrAllCategoryNovel, - 'arrNewsNovel' => $arrNewsNovel, - - ]); - break; - - case 'kuangYu': - $intRecommendSerializationNovel = 13; - $intRecommendEndNovel = 12; - // 男生频道,最新的 随机5个小说 - $strKey = sprintf('%s:PC:INDEX:ZUIJIAN:SEX:%s:%s', $Request->DomainModel->d_domain, 1, 5); - $arrBoyNewsNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, 5, 1, NULL, ['n_update_time' => -1]); - - // 男生频道,周排行榜 随机10个小说 - $strKey = sprintf('%s:PC:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'weekly', 1); - $arrBoyWeekRankNovel = $NovelModel->getRankNovelOnCache($strKey, 5, 1, 'weekly'); - - // 男生频道,月排行榜 随机10个小说 - $strKey = sprintf('%s:PC:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'monthly', 1); - $arrBoyMoonRankNovel = $NovelModel->getRankNovelOnCache($strKey, 5, 1, 'monthly'); - - // 男生频道,总排行榜 随机10个小说 - $strKey = sprintf('%s:PC:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'total', 1); - $arrBoyTotalRankNovel = $NovelModel->getRankNovelOnCache($strKey, 5, 1, 'total'); - - // 女生频道,最新的 随机5个小说 - $strKey = sprintf('%s:PC:INDEX:ZUIJIAN:SEX:%s:%s', $Request->DomainModel->d_domain, 2, 5); - $arrGirlNewsNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, 5, 2, NULL, ['n_update_time' => -1]); - - // 女生频道,周排行榜 随机10个小说 - $strKey = sprintf('%s:PC:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'weekly', 2); - $arrGirlWeekRankNovel = $NovelModel->getRankNovelOnCache($strKey, 5, 2, 'weekly'); - - // 女生频道,月排行榜 随机10个小说 - $strKey = sprintf('%s:PC:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'monthly', 2); - $arrGirlMoonRankNovel = $NovelModel->getRankNovelOnCache($strKey, 5, 2, 'monthly'); - - // 女生频道,总排行榜 随机10个小说 - $strKey = sprintf('%s:PC:INDEX:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'total', 2); - $arrBGirlTotalRankNovel = $NovelModel->getRankNovelOnCache($strKey, 5, 2, 'total'); - View::assign([ - 'arrBoyNewsNovel' => $arrBoyNewsNovel, - 'arrBoyWeekRankNovel' => $arrBoyWeekRankNovel, - 'arrBoyMoonRankNovel' => $arrBoyMoonRankNovel, - 'arrBoyTotalRankNovel' => $arrBoyTotalRankNovel, - 'arrGirlNewsNovel' => $arrGirlNewsNovel, - 'arrGirlWeekRankNovel' => $arrGirlWeekRankNovel, - 'arrGirlMoonRankNovel' => $arrGirlMoonRankNovel, - 'arrBGirlTotalRankNovel' => $arrBGirlTotalRankNovel, - ]); - break; - } - - // 推荐等级为9的连载的 随机15个小说 - $strKey = sprintf('%s:PC:INDEX:TUIJIAN:%s', $Request->DomainModel->d_domain, $intRecommendSerializationNovel); - $arrRecommendSerializationNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, $intRecommendSerializationNovel, 0, NULL); - - // 推荐等级为9的完结的 随机12个小说 - $strKey = sprintf('%s:PC:INDEX:TUIJIAN:WANJIE:%s', $Request->DomainModel->d_domain, $intRecommendEndNovel); - $arrRecommendEndNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, $intRecommendEndNovel, 0, "已完结"); - - // 最近更新-随机50 - $strKey = sprintf('%s:PC:INDEX:ZUIJIAN:SEX:%s:%s', $Request->DomainModel->d_domain, 0, 50); - $arrNewsUpdateNovel = $NovelModel->getCommonNovelOnCache($strKey, $intTTL, 50, 0, NULL, ['n_update_time' => -1]); - - // Title 模板 - ConverterMovel::setVal([ - 'strIndexTitle' => $this->request->DomainModel->d_index_title, - 'strIndexKeywords' => $this->request->DomainModel->d_index_keywords, - 'strIndexDescription' => $this->request->DomainModel->d_index_description, - ]); - // $strTitle = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__)); - $strTitleTemplate = $Request->DomainModel->getFomartSubject('INDEX@INDEX@TITLE'); - $strKeywordsTemplate = $Request->DomainModel->getFomartSubject('INDEX@INDEX@KEYWORDS'); - $strDescriptionTemplate = $Request->DomainModel->getFomartSubject('INDEX@INDEX@DESCRIPTION'); - - $strTitle = ConverterMovel::convert($strTitleTemplate); - $strKeywords = ConverterMovel::convert($strKeywordsTemplate); - $strDescription = ConverterMovel::convert($strDescriptionTemplate); - - View::assign([ - 'arrNewsUpdateNovel' => $arrNewsUpdateNovel, - 'arrRecommendSerializationNovel' => $arrRecommendSerializationNovel, - 'arrRecommendEndNovel' => $arrRecommendEndNovel, - 'arrAdBanner' => [], - 'strPageCode' => 'home', - 'strTitle' => $strTitle, - 'strKeywords' => $strKeywords, - 'strDescription' => $strDescription, - ]); - - $strView = $boolIsMobile ? '' : 'pc/index'; - - $this->generateGrm(2, 0, 150); - return $this->rending($strView); - } -} diff --git a/code/app/home/controller/Novel.php b/code/app/home/controller/Novel.php deleted file mode 100644 index bef662d..0000000 --- a/code/app/home/controller/Novel.php +++ /dev/null @@ -1,1051 +0,0 @@ -param('boolIsMobile'); - - // 模拟数据-日排行榜 随机10个小说 - $NovelModel = NovelModel::getInstance(); - $strKey = sprintf('%s:PC:NOVEL:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'daily', 0); - $arrDayRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'daily'); - - // 模拟数据-周排行榜 随机10个小说 - $strKey = sprintf('%s:PC:NOVEL:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'weekly', 0); - $arrWeekRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'weekly'); - - // 模拟数据-月排行榜 随机10个小说 - $strKey = sprintf('%s:PC:NOVEL:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'monthly', 0); - $arrMoonRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'monthly'); - - // 模拟数据-总排行榜 随机10个小说 - $strKey = sprintf('%s:PC:NOVEL:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'total', 0); - $arrTotalRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'total'); - - // 新书榜 随机10个小说,n_id倒叙 - $strKey = $Request->DomainModel->d_domain . ':RANK:NEW:'; - $intLifeTime = 24 * 3600; - $intCount = 10; - $intType = 0; - $strStatus = NULL; - $arrSort = ['n_id' => -1]; - $arrNewsNovelRankNovel = $NovelModel->getCommonNovelOnCache($strKey, $intLifeTime, $intCount, $intType, $strStatus, $arrSort); - - // 完结榜 随机10个小说 - $strStatus = '已完结'; - $strKey = sprintf('%s:PC:NOVEL:RANK:%s:SEX:%s:%s', $Request->DomainModel->d_domain, 'total', 0, 'finished'); - $arrEdnNovelRankNovel = $NovelModel->getRankNovelOnCache($strKey, 10, 0, 'total', $strStatus); - - // Title 模板 - ConverterMovel::setVal([ - 'intPage' => 1, - ]); - // $strTitle = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__)); - $strTitleTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE'); - $strKeywordsTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS'); - $strDescriptionTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION'); - - $strTitle = ConverterMovel::convert($strTitleTemplate); - $strKeywords = ConverterMovel::convert($strKeywordsTemplate); - $strDescription = ConverterMovel::convert($strDescriptionTemplate); - - View::assign([ - 'arrDayRankNovel' => $arrDayRankNovel, - 'arrWeekRankNovel' => $arrWeekRankNovel, - 'arrMoonRankNovel' => $arrMoonRankNovel, - 'arrTotalRankNovel' => $arrTotalRankNovel, - 'arrNewsNovelRankNovel' => $arrNewsNovelRankNovel, - 'arrEdnNovelRankNovel' => $arrEdnNovelRankNovel, - 'strTitle' => $strTitle, - 'strKeywords' => $strKeywords, - 'strDescription' => $strDescription, - 'strPageCode' => 'rank' - ]); - - - $strView = $boolIsMobile ? '' : 'pc/getNovelRank'; - $this->generateGrm(2, 0, 60); - return $this->rending($strView); - } - - /** - * 书库 - * - * @param Request $Request - * @param string $strNovelChannel 男生/女生 -拼音 - * @param string $strCategory 分类 -拼音 - * @param string $strStatus 连载/完结 -拼音 - * @param string $strOrder 排序 -拼音 - * @param integer $intPage 分页 - * @return void - */ - public function getLibrary(Request $Request, $strGender = 'all', $strCategory = 'all', $strStatus = 'all', $strOrder = 'all', $intPage = 1) - { - $boolIsMobile = $Request->param('boolIsMobile'); - $strChannel = $Request->param('strChannel') ?? 'all'; - - $strNanUrlTemp = $this->request->DomainModel->getFomartSubject('NAN_SHENG_URL', '', false); - $strNvUrlTemp = $this->request->DomainModel->getFomartSubject('NV_SHENG_URL', '', false); - $strNanUrl = str_replace("/", "", $strNanUrlTemp); - $strNvUrl = str_replace("/", "", $strNvUrlTemp); - // 性别 - $arrSex = [ - 'all' => 0, - $strNanUrl => 1, - $strNvUrl => 1, - ]; - $arrSexChinese = [ - 'all' => '', - $strNanUrl => '男生', - $strNvUrl => '女生', - ]; - - if (!key_exists($strGender, $arrSex)) { - return response('Bad Request', 400); - } - - $intGender = $arrSex[$strGender]; - - // 分类 - if ($strCategory == 'all') { - $strSearchCategory = ''; - } else if (!in_array($strCategory, CategoryModel::$arrCategoryPinYin)) { - return response('Bad Request', 400); - } else { - $strCategoryKey = array_search($strCategory, CategoryModel::$arrCategoryPinYin); - $strSearchCategory = CategoryModel::$arrCategory[$strCategoryKey]; - } - - // 小说状态 - $arrStatus = [ - 'all' => NULL, - 'lianzai' => '连载中', - 'wanjie' => '已完结', - ]; - - if (!key_exists($strStatus, $arrStatus)) { - return response('Bad Request', 400); - } - - $strSearchStatus = $arrStatus[$strStatus]; - - $intPage = (int)$Request->param('intPage'); - if ($intPage <= 1) { - $intPage = 1; - } - $intLimit = 20; - $intLifeTime = 24 * 3600; - - $strTemplatesModel = $Request->TemplatesModel->t_code; - switch ($strTemplatesModel) { - case 'default': - $arrOrder = [ - 'all' => '全部排序', - 'day' => '日排行', - 'week' => '周排行', - 'mon' => '月排行', - 'click' => '总排行', - 'tuijian' => '推荐', - 'news' => '最新入库', - 'update' => '最新更新', - ]; - - // TODO 当前筛选条件(除了分页),随机6条 - $arrTopNovel = []; - - if (!$boolIsMobile) { - // TODO 当前筛选条件(除了分页),最新 随机 $intLimit 条 - $arrNewsNovel = []; - View::assign([ - 'arrNewsNovel' => $arrNewsNovel, - ]); - } else { - } - - $strBaseUrl = app(NovelService::class)->getNovelCategoryUrl('', $strCategory, $strStatus, $strOrder, '{page}'); - View::assign([ - 'arrTopNovel' => $arrTopNovel, - 'arrOrder' => $arrOrder, - 'strOrder' => $strOrder, - ]); - break; - - case 'kuangYu': - $strBaseUrl = app(NovelService::class)->getNovelCategoryUrl($strGender, $strCategory, $strStatus, "", '{page}'); - break; - } - - $strKey = sprintf("Novel:Library:%s:%s:%s:%s", $intGender, $strSearchCategory, $strSearchStatus, $intPage); - - $NovelModel = NovelModel::getInstance(); - $arrPage = $NovelModel->getCustomPage01($strKey, $intPage, $intLimit, $intLifeTime, $intGender, $strSearchStatus); - - $strTemplate = ''; - $intButtonNum = 5; - if ($boolIsMobile == false) { - $intButtonNum = 10; - $strTemplate = 'pc/getLibrary'; - } - - $arrPaginator = CusteomPage02::generate($intPage, $arrPage['total'], $intLimit, $strBaseUrl, $intButtonNum); - - // 更新值 - ConverterMovel::setVal([ - 'intPage' => $intPage, - 'strNovelSex' => $arrSexChinese[$strGender], - 'strNovelCategoryName' => str_replace("小说", "", $strSearchCategory), - 'strNovelStatus' => $strSearchStatus, - ]); - - $strTitleTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE'); - $strKeywordsTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS'); - $strDescriptionTemplate = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION'); - - $strTitle = ConverterMovel::convert($strTitleTemplate); - $strKeywords = ConverterMovel::convert($strKeywordsTemplate); - $strDescription = ConverterMovel::convert($strDescriptionTemplate); - - View::assign([ - 'arrNovel' => $arrPage['data'], // TODO default 模板需要加入 $strOrder 筛查数据 - 'strPageCode' => 'library', - 'strGender' => $strGender, - 'strCategory' => $strCategory, - 'strStatus' => $strStatus, - 'intPage' => $intPage, - 'intTotalPage' => $arrPage['pages'], - 'arrCategoryAll' => CategoryModel::$arrCategoryAll, - 'arrPaginator' => $arrPaginator, - 'strSearchCategory' => $strSearchCategory, - 'strSearchStatus' => $strSearchStatus, - 'strNovelSex' => $arrSexChinese[$strGender], - 'strNanUrl' => $strNanUrl, - 'strNvUrl' => $strNvUrl, - 'strChannel' => $strChannel, - 'strTitle' => $strTitle, - 'strKeywords' => $strKeywords, - 'strDescription' => $strDescription, - - ]); - - $this->generateGrm(2, $strGender . '-' . $strCategory . '-' . $strStatus . '-' . $intPage, 30); - return $this->rending($strTemplate); - } - - /** - * 男生女生频道 - * - * @param Request $Request - * @return void - */ - public function getNovelChannel(Request $Request) - { - $boolIsMobile = $Request->param('boolIsMobile'); - $strNovelChannel = $Request->param('strChannel'); // 区分男生/女生频道 - - $NovelModel = NovelModel::getInstance(); - $intType = ['boys' => 1, 'girls' => 2][$strNovelChannel]; - $intLifeTime = 24 * 3600; - - // 推荐等级为9的,连载的,男生频道/女生频道, 随机12个小说 - $strKey = sprintf('%s:PC:Novel:Channel:Hot:%s:%s', $Request->DomainModel->d_domain, $intType, 'Serialized'); - $intCount = 12; - $strStuatus = '连载中'; - - $arrRecommendSerializationNovel = $NovelModel->getCommonNovelOnCache($strKey, $intLifeTime, $intCount, $intType, $strStuatus); - - // 推荐等级为9的,完结的,男生频道/女生频道, 随机8个小说 - $strKey = sprintf('%s:PC:Novel:Channel:Hot:%s:%s', $Request->DomainModel->d_domain, $intType, 'Finish'); - $intCount = 8; - $strStuatus = '已完结'; - - $arrRecommendEndNovel = $NovelModel->getCommonNovelOnCache($strKey, $intLifeTime, $intCount, $intType, $strStuatus); - - // 模拟数据-最近更新-随机50 - $strKey = sprintf('%s:PC:Novel:Channel:Latest:%s', $Request->DomainModel->d_domain, $intType); - $intCount = 20; - $arrNewsUpdateNovel = $NovelModel->getCommonNovelOnCache($strKey, $intLifeTime, $intCount, $intType, NULL, ['n_update_time' => -1]); - - // echo "
";
-        // var_dump($arrNewsUpdateNovel);exit;
-        // TODO   n_description  改成 n_description
-        // 更新值
-        ConverterMovel::setVal([
-            'intPage' => 1,
-            'strNovelSex' => $strNovelChannel == 'boys' ? '男生' : '女生',  //汉字 男生或者女生 
-        ]);
-
-        // $strTitle =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__));
-        $strTitleTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE');
-        $strKeywordsTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS');
-        $strDescriptionTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION');
-
-        $strTitle = ConverterMovel::convert($strTitleTemplate);
-        $strKeywords = ConverterMovel::convert($strKeywordsTemplate);
-        $strDescription = ConverterMovel::convert($strDescriptionTemplate);
-
-        View::assign([
-            'arrRecommendSerializationNovel' => $arrRecommendSerializationNovel,
-            'arrRecommendEndNovel' => $arrRecommendEndNovel,
-            'arrNewsUpdateNovel' => $arrNewsUpdateNovel,
-            'arrAdBanner' => [],
-            'strPageCode' => $strNovelChannel,
-            'strTitle' => $strTitle,
-            'strKeywords' => $strKeywords,
-            'strDescription' => $strDescription,
-        ]);
-
-
-        $strView = $boolIsMobile ? '' : 'pc/getNovelChannel';
-        $this->generateGrm(2, $strNovelChannel, 50);
-        return $this->rending($strView);
-    }
-
-    /**
-     * 小说详情-伪造小说
-     * 
-     * @param Request $Request
-     * @return void
-     */
-    public function getKanNovelInfo(Request $Request)
-    {
-
-        $intNId = $Request->param('n_id');
-
-        $intNForgeId = $Request->param('n_forge_id');
-
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        $NovelModel = NovelModel::getInstance();
-
-        // 小说详情
-        $arrNovel = $NovelModel->getNovelByNId($intNId);
-
-        foreach ($arrNovel['n_forge_novel'] as $arrForgeNovel) {
-            if ($arrForgeNovel['n_forge_id'] == $intNForgeId) {
-                $arrNovel['n_name'] = $arrForgeNovel['n_forge_title'];
-                break;
-            }
-        }
-
-        // 分类拼音
-        $arrNovel['n_category_pinyin'] = CategoryModel::getPinYin($arrNovel['n_category']);
-        $arrNovel['n_category_sex_en'] = $arrNovel['n_category_sex_en'] ?? 'man';
-
-        // 最后章节
-        $ChapterModel = ChapterModel::getInstance();
-        $arrLatestChapter = $ChapterModel->getLatestChapterByNId($intNId);
-
-        // 第一章
-        $arrFirstChapter = $ChapterModel->getFirstChapterByNId($intNId, false);
-        $intFirstChapterSort = null;
-        if ($arrFirstChapter) {
-            $intFirstChapterSort = $arrFirstChapter['c_sort_num'];
-        }
-
-        $strFocus = '';
-        // 要点
-        if ($arrLatestChapter) {
-            $strFocus =  strip_tags($arrLatestChapter['c_content']);
-            $intCount = mb_strlen($strFocus);
-            if ($intCount > 300) {
-                $intPos = mt_rand(0, $intCount - 300);
-                $strFocus = mb_substr($strFocus, $intPos, 300);
-            }
-        }
-
-        // 最近五个章节
-        $arrChapter = $ChapterModel->findMany([
-            'n_id' => $intNId,
-            'c_page' => 0,
-        ], 10, ['c_sort_num' => -1]);
-
-        // 点击数
-        $NovelClicksModel = NovelClicksModel::getInstance();
-        $arrNovelClicks = $NovelClicksModel->getStats($intNId);
-
-        // 推荐小说
-        $arrRelateveNId = array_column($arrNovel['n_related_novel'], 'n_id');
-
-        $arrRelateveNovel = $NovelModel->findMany(['n_id' => [
-            '$in' => $arrRelateveNId,
-        ]], 10);
-
-        $strTemplatesModel = $Request->TemplatesModel->t_code;
-        switch ($strTemplatesModel) {
-            case 'default':
-
-                // TODO  章节正序 前100 条
-                $arrChapterAsc = [];
-
-                // TODO  和当前小说同分类,完结的小说 随机6个
-                $arrEndNovel = [];
-
-                View::assign([
-                    'arrChapterAsc' => $arrChapterAsc,
-                    'arrEndNovel' => $arrEndNovel,
-                ]);
-                break;
-        }
-
-        // 更新值
-        ConverterMovel::setVal([
-            'intPage' => 1,
-            'strNovelName' => $arrNovel['n_name'],
-            'strNovelAuthor' => $arrNovel['n_author'],
-            'strNovelCategoryName' => $arrNovel['n_category'],
-            'strNovelSex' => $arrNovel['n_category_sex_en'] == 'man' ? '男生' : '女生',
-            'strNovelStatus' => $arrNovel['n_status'],
-            'strNovelDescription' => $arrNovel['n_description'],
-        ]);
-
-        $strTitleTemplate =  $Request->DomainModel->getFomartSubject('NOVEL@GETNOVELINFO@TITLE', $intNForgeId);
-        $strKeywordsTemplate =  $Request->DomainModel->getFomartSubject('NOVEL@GETNOVELINFO@KEYWORDS', $intNForgeId);
-        $strDescriptionTemplate =  $Request->DomainModel->getFomartSubject('NOVEL@GETNOVELINFO@DESCRIPTION', $intNForgeId);
-
-        $strTitle = ConverterMovel::convert($strTitleTemplate);
-        $strKeywords = ConverterMovel::convert($strKeywordsTemplate);
-        $strDescription = ConverterMovel::convert($strDescriptionTemplate);
-
-        // js使用到
-        $arrNovelJs = $arrNovel;
-        unset($arrNovelJs['n_related_novel'], $arrNovelJs['n_forge_novel'], $arrNovelJs['n_description']);
-
-        View::assign([
-            'intPage' => 1,
-            'arrRelateveNovel' => $arrRelateveNovel,
-            'arrNovel' => $arrNovel,
-            'arrNovelJs' => $arrNovelJs,
-            'arrChapter' => $arrChapter,
-            'arrLatestChapter' => $arrLatestChapter,
-            'arrNovelClicks' => $arrNovelClicks,
-            'strFocus' => $strFocus,
-            'intFirstChapterSort' => $intFirstChapterSort,
-            'strPageCode' => 'detail',
-            'strTitle' => $strTitle,
-            'strKeywords' => $strKeywords,
-            'strDescription' => $strDescription,
-        ]);
-
-        $strView = $boolIsMobile ? 'getNovelInfo' : 'pc/getNovelInfo';
-        $this->generateGrm(2, $intNId . '-' . $intNForgeId, 50);
-        return $this->rending($strView);
-    }
-
-    /**
-     * 小说详情
-     *
-     * @param Request $Request
-     * @return void
-     */
-    public function getNovelInfo(Request $Request)
-    {
-        $intNId = $Request->param('n_id');
-
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        $NovelModel = NovelModel::getInstance();
-
-        // 小说详情
-        $arrNovel = $NovelModel->getNovelByNId($intNId);
-
-        // 分类拼音
-        $arrNovel['n_category_pinyin'] = CategoryModel::getPinYin($arrNovel['n_category']);
-        $arrNovel['n_category_sex_en'] = $arrNovel['n_category_sex_en'] ?? 'man';
-
-        // 最后章节
-        $ChapterModel = ChapterModel::getInstance();
-        $arrLatestChapter = $ChapterModel->getLatestChapterByNId($intNId);
-
-        // 第一章
-        $arrFirstChapter = $ChapterModel->getFirstChapterByNId($intNId, false);
-        $intFirstChapterSort = null;
-        if ($arrFirstChapter) {
-            $intFirstChapterSort = $arrFirstChapter['c_sort_num'];
-        }
-
-        $strFocus = '';
-        // 要点
-        if ($arrLatestChapter) {
-            $strFocus =  strip_tags($arrLatestChapter['c_content']);
-            $intCount = mb_strlen($strFocus);
-            if ($intCount > 300) {
-                $intPos = mt_rand(0, $intCount - 300);
-                $strFocus = mb_substr($strFocus, 0, 300);
-            }
-        }
-
-        // 最近五个章节
-        $arrChapter = $ChapterModel->findMany([
-            'n_id' => $intNId,
-            'c_page' => 0,
-        ], 10, ['c_sort_num' => -1]);
-
-        // 点击数
-        $NovelClicksModel = NovelClicksModel::getInstance();
-        $arrNovelClicks = $NovelClicksModel->getStats($intNId);
-
-        // 推荐小说
-        $arrRelateveNId = array_column($arrNovel['n_related_novel'], 'n_id');
-
-        $arrRelateveNovel = $NovelModel->findMany(['n_id' => [
-            '$in' => $arrRelateveNId,
-        ]], 10);
-
-        $strTemplatesModel = $Request->TemplatesModel->t_code;
-        switch ($strTemplatesModel) {
-            case 'default':
-
-                // TODO  章节正序 前100 条
-                $arrChapterAsc = [];
-
-                // TODO  和当前小说同分类,完结的小说  随机6个
-                $arrEndNovel = [];
-
-                View::assign([
-                    'arrChapterAsc' => $arrChapterAsc,
-                    'arrEndNovel' => $arrEndNovel,
-                ]);
-                break;
-        }
-
-        // 更新值
-        ConverterMovel::setVal([
-            'intPage' => 1,
-            'strNovelName' => $arrNovel['n_name'],
-            'strNovelAuthor' => $arrNovel['n_author'],
-            'strNovelCategoryName' => $arrNovel['n_category'],
-            'strNovelSex' => $arrNovel['n_category_sex_en'] == 'man' ? '男生' : '女生',
-            'strNovelStatus' => $arrNovel['n_status'],
-            'strNovelDescription' => $arrNovel['n_description'],
-        ]);
-
-        $strTitleTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE', $intNId);
-        $strKeywordsTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS', $intNId);
-        $strDescriptionTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION', $intNId);
-
-        $strTitle = ConverterMovel::convert($strTitleTemplate);
-        $strKeywords = ConverterMovel::convert($strKeywordsTemplate);
-        $strDescription = ConverterMovel::convert($strDescriptionTemplate);
-
-        View::assign([
-            'arrRelateveNovel' => $arrRelateveNovel,
-            'arrNovel' => $arrNovel,
-            'arrChapter' => $arrChapter,
-            'arrLatestChapter' => $arrLatestChapter,
-            'arrNovelClicks' => $arrNovelClicks,
-            'strFocus' => $strFocus,
-            'intFirstChapterSort' => $intFirstChapterSort,
-            'strPageCode' => 'detail',
-            'strTitle' => $strTitle,
-            'strKeywords' => $strKeywords,
-            'strDescription' => $strDescription,
-        ]);
-
-        $strView = $boolIsMobile ? '' : 'pc/getNovelInfo';
-        $this->generateGrm(2, $intNId, 50);
-        return $this->rending($strView);
-    }
-
-    /**
-     * 最新章节-特殊页面处理
-     *
-     * @param Request $Request
-     * @return void
-     */
-    public function getNovelLatestChapter(Request $Request)
-    {
-
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        $intNId = $Request->param('n_id');
-
-        // 小说详情
-        $NovelModel = NovelModel::getInstance();
-        $arrNovel = $NovelModel->getNovelByNId($intNId);
-
-        $arrNovel['n_category_pinyin'] =  $arrNovel['n_category_pinyin'] ?? 'all';
-        $arrNovel['n_category_sex_en'] = $arrNovel['n_category_sex_en'] ?? 'man';
-
-        // 最新章节
-        $ChapterModel = ChapterModel::getInstance();
-        $arrChapter = $ChapterModel->getLatestChapterByNId($intNId);
-
-        $strChapterDescription = '';
-        // 上一章节和下一章节
-        $arrPreChapter  = $arrNextChapter = [];
-
-        if ($arrChapter) {
-            $arrPreChapter = $ChapterModel->getPreChapter($arrChapter['n_id'], $arrChapter['c_sort_num'], $arrChapter['c_page']);
-            $arrNextChapter = $ChapterModel->getNextChapter($arrChapter['n_id'], $arrChapter['c_sort_num'], $arrChapter['c_page']);
-
-            // 要点-先从章节随机截取,后面如果用上ai,看看使用ai 提炼 精简内容
-            $strChapterDescription = strip_tags($arrChapter['c_content']);
-            $intCount = mb_strlen($strChapterDescription);
-            $strChapterDescription = ($intCount > 50) ? mb_substr($strChapterDescription, 0, 50) : $strChapterDescription;
-
-            $arrChapter['c_content'] = base64_encode($arrChapter['c_content']);
-        }
-
-        $strTemplatesModel = $Request->TemplatesModel->t_code;
-        switch ($strTemplatesModel) {
-            case 'default':
-                // 推荐小说
-                $arrRelateveNId = array_column($arrNovel['n_related_novel'], 'n_id');
-                $arrRelateveNovel = $NovelModel->findMany(['n_id' => [
-                    '$in' => $arrRelateveNId,
-                ]], 10);
-
-                // TODO  和当前小说同分类,完结的小说  随机6个
-                $arrEndNovel = [];
-
-                View::assign([
-                    'arrRelateveNovel' => $arrRelateveNovel,
-                    'arrEndNovel' => $arrEndNovel,
-                ]);
-
-                break;
-
-            case 'kuangYu':
-        }
-
-
-        $arrCategoryAll = CategoryModel::$arrCategoryAll;
-
-        // 更新值
-        ConverterMovel::setVal([
-            'intPage' => 1,
-            'strNovelName' => $arrNovel['n_name'],
-            'strNovelAuthor' => $arrNovel['n_author'],
-            'strNovelCategoryName' => $arrNovel['n_category'],
-            'strNovelStatus' => $arrNovel['n_status'],
-            'strNovelDescription' => $arrNovel['n_description'],
-            'strChapterDescription' => $strChapterDescription,
-            'strNovelChapterName' => $arrChapter['c_name'] ?? '',
-            'strNovelChapterSort' => $arrChapter['c_sort_num'] ?? '',
-        ]);
-
-
-        $strTitleTemplate =  $Request->DomainModel->getFomartSubject('NOVEL@GETNOVELCHAPTER@TITLE', $intNId);
-        $strKeywordsTemplate =  $Request->DomainModel->getFomartSubject('NOVEL@GETNOVELCHAPTER@KEYWORDS', $intNId);
-        $strDescriptionTemplate =  $Request->DomainModel->getFomartSubject('NOVEL@GETNOVELCHAPTER@DESCRIPTION', $intNId);
-
-        $strTitle = ConverterMovel::convert($strTitleTemplate);
-        $strKeywords = ConverterMovel::convert($strKeywordsTemplate);
-        $strDescription = ConverterMovel::convert($strDescriptionTemplate);
-
-
-        View::assign([
-            'arrNovel' => $arrNovel,
-            'arrCategoryAll' => $arrCategoryAll,
-            'arrChapter' => $arrChapter,
-            'arrPreChapter' => $arrPreChapter,
-            'arrNextChapter' => $arrNextChapter,
-            'strPageCode' => 'boy',
-            'intNovelId' => $intNId,
-            'intChapterSort' => $arrChapter['c_sort_num'] ?? 0,
-            'intChapterPage' => $arrChapter['c_page'] ?? 0,
-            'strTitle' => $strTitle,
-            'strKeywords' => $strKeywords,
-            'strDescription' => $strDescription,
-        ]);
-
-        $strView = $boolIsMobile ? 'getNovelChapter' : 'pc/getNovelChapter';
-        $this->generateGrm(2, $intNId . '-' . $arrChapter['c_sort_num'] ?? 0, 100);
-        return $this->rending($strView);
-    }
-
-    /**
-     * 章节详情
-     *
-     * @param Request $Request
-     * @param integer $intNovelId  小说id
-     * @param integer $intChapterSort  章节排序 序号
-     * @param integer $intChapterPage  每个章节的分页
-     * @return void
-     */
-    public function getNovelChapter(Request $Request, $intNovelId = 1, $intChapterSort = 1, $intChapterPage = 0)
-    {
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        // 小说详情
-        $NovelModel = NovelModel::getInstance();
-        $intNId = $intNovelId;
-        $arrNovel = $NovelModel->getNovelByNId($intNId);
-
-        $arrNovel['n_category_pinyin'] =  $arrNovel['n_category_pinyin'] ?? 'all';
-        $arrNovel['n_category_sex_en'] = $arrNovel['n_category_sex_en'] ?? 'man';
-
-        // 章节
-        $ChapterModel = ChapterModel::getInstance();
-        $arrFilter = ['n_id' => $intNId, 'c_sort_num' => $intChapterSort, 'c_page' => $intChapterPage];
-
-        $arrChapter = $ChapterModel->findOne($arrFilter);
-        $strChapterDescription = '';
-
-        // 上一章节和下一章节
-        $arrPreChapter  = $arrNextChapter = [];
-
-        if ($arrChapter) {
-            $arrPreChapter = $ChapterModel->getPreChapter($arrChapter['n_id'], $arrChapter['c_sort_num'], $arrChapter['c_page']);
-            $arrNextChapter = $ChapterModel->getNextChapter($arrChapter['n_id'], $arrChapter['c_sort_num'], $arrChapter['c_page']);
-
-            // 要点-先从章节随机截取,后面如果用上ai,看看使用ai 提炼 精简内容
-            $strChapterDescription = strip_tags($arrChapter['c_content']);
-            $intCount = mb_strlen($strChapterDescription);
-            $strChapterDescription = ($intCount > 50) ? mb_substr($strChapterDescription, 0, 50) : $strChapterDescription;
-
-            $arrChapter['c_content'] = base64_encode($arrChapter['c_content']);
-        }
-
-        $strTemplatesModel = $Request->TemplatesModel->t_code;
-        switch ($strTemplatesModel) {
-            case 'default':
-                // 推荐小说
-                $arrRelateveNId = array_column($arrNovel['n_related_novel'], 'n_id');
-                $arrRelateveNovel = $NovelModel->findMany(['n_id' => [
-                    '$in' => $arrRelateveNId,
-                ]], 10);
-
-                // TODO  和当前小说同分类,完结的小说  随机6个
-                $arrEndNovel = [];
-
-                View::assign([
-                    'arrRelateveNovel' => $arrRelateveNovel,
-                    'arrEndNovel' => $arrEndNovel,
-                ]);
-
-                break;
-
-            case 'kuangYu':
-        }
-
-        $arrCategoryAll = CategoryModel::$arrCategoryAll;
-
-        // 更新值
-        ConverterMovel::setVal([
-            'intPage' => 1,
-            'strNovelName' => $arrNovel['n_name'],
-            'strNovelAuthor' => $arrNovel['n_author'],
-            'strNovelCategoryName' => $arrNovel['n_category'],
-            'strNovelStatus' => $arrNovel['n_status'],
-            'strNovelDescription' => $arrNovel['n_description'],
-            'strChapterDescription' => $strChapterDescription,
-            'strNovelChapterName' => $arrChapter['c_name'],
-            'strNovelChapterSort' => $arrChapter['c_sort_num'],
-        ]);
-
-        $strTitleTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE', $intNId);
-        $strKeywordsTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS', $intNId);
-        $strDescriptionTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION', $intNId);
-
-        $strTitle = ConverterMovel::convert($strTitleTemplate);
-        $strKeywords = ConverterMovel::convert($strKeywordsTemplate);
-        $strDescription = ConverterMovel::convert($strDescriptionTemplate);
-
-        View::assign([
-            'arrNovel' => $arrNovel,
-            'arrCategoryAll' => $arrCategoryAll,
-            'arrChapter' => $arrChapter,
-            'arrPreChapter' => $arrPreChapter,
-            'arrNextChapter' => $arrNextChapter,
-            'strPageCode' => 'boy',
-            'intNovelId' => $intNovelId,
-            'intChapterSort' => $intChapterSort,
-            'intChapterPage' => $intChapterPage,
-            'strTitle' => $strTitle,
-            'strKeywords' => $strKeywords,
-            'strDescription' => $strDescription,
-        ]);
-
-        $strView = $boolIsMobile ? '' : 'pc/getNovelChapter';
-        $this->generateGrm(2, $intNId . '-' . $arrChapter['c_sort_num'] ?? 0, 100);
-        return $this->rending($strView);
-    }
-
-    /**
-     * 小说章节列表页面
-     *
-     * @param Request $Request
-     * @param int $intNovelId  小说id
-     * @param int $intPage    目录分页
-     * @param string $strOrder    正序倒叙:zheng/dao
-     * @return void
-     */
-    public function getNovelCatalog(Request $Request, $intNovelId = null, $intPage = 1, $strOrder = 'zheng')
-    {
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        // 小说详情
-        $NovelModel = NovelModel::getInstance();
-        $intNId = $intNovelId;
-        $arrNovel = $NovelModel->getNovelByNId($intNId);
-
-        $arrNovel['n_category_pinyin'] =  $arrNovel['n_category_pinyin'] ?? 'all';
-        $arrNovel['n_category_sex_en'] = $arrNovel['n_category_sex_en'] ?? 'man';
-
-        $ChapterModel = ChapterModel::getInstance();
-
-        $strKey = sprintf('Nid:%s:Chapter-Page:%s:Order:%s', $intNId, $intPage, $strOrder);
-
-        $arrFilter = ['n_id' => $intNId, 'c_page' => 0,];
-        $intLimit = 10;
-        $intLifeTime = 12 * 3600;
-
-        if ($strOrder == 'zheng') {
-            $arrSort = ['c_sort_num' => 1];
-        } else {
-            $arrSort = ['c_sort_num' => -1];
-        }
-
-        $strTemplatesModel = $Request->TemplatesModel->t_code;
-        switch ($strTemplatesModel) {
-            case 'default':
-                // 第一章
-                $arrFirstChapter = $ChapterModel->getFirstChapterByNId($intNId, false);
-                $intFirstChapterSort = null;
-                if ($arrFirstChapter) {
-                    $intFirstChapterSort = $arrFirstChapter['c_sort_num'];
-                }
-
-                // 推荐小说
-                $arrRelateveNId = array_column($arrNovel['n_related_novel'], 'n_id');
-                $arrRelateveNovel = $NovelModel->findMany(['n_id' => [
-                    '$in' => $arrRelateveNId,
-                ]], 10);
-
-                // TODO  章节正序 前100 条
-                $arrChapterAsc = [];
-
-                // TODO  和当前小说同分类,完结的小说 随机6个
-                $arrEndNovel = [];
-
-                View::assign([
-                    'arrChapterAsc' => $arrChapterAsc,
-                    'arrEndNovel' => $arrEndNovel,
-                    'intFirstChapterSort' => $intFirstChapterSort,
-                    'arrRelateveNovel' => $arrRelateveNovel,
-                ]);
-                break;
-
-            case 'kuangYu':
-        }
-
-        $arrPage = $ChapterModel->findPaginatedWithCache($arrFilter, $intPage, $intLimit, $arrSort, $strKey, $intLifeTime);
-
-        $intButtonNum = 5;
-        if ($boolIsMobile == false) {
-            $intButtonNum = 10;
-        }
-
-        $strBaseUrl =  app(NovelService::class)->getNovelCatalogUrl($intNId, $arrNovel['n_name_pinyin'], $strOrder, '{page}');
-        $arrPaginator = CusteomPage02::generate($intPage,  $arrPage['total'], $intLimit, $strBaseUrl, $intButtonNum);
-
-        // 更新值
-        ConverterMovel::setVal([
-            'intPage' => $intPage,
-            'strNovelSex' => $arrNovel['n_category_sex_en'] == 'man' ? '男生' : '女生',
-            'strNovelName' => $arrNovel['n_name'],
-            'strNovelAuthor' => $arrNovel['n_author'],
-            'strNovelCategoryName' => $arrNovel['n_category'],
-            'strNovelStatus' => $arrNovel['n_status'],
-            'strNovelDescription' => $arrNovel['n_description'],
-        ]);
-
-        $strTitleTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE', $intNId);
-        $strKeywordsTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS', $intNId);
-        $strDescriptionTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION', $intNId);
-
-        $strTitle = ConverterMovel::convert($strTitleTemplate);
-        $strKeywords = ConverterMovel::convert($strKeywordsTemplate);
-        $strDescription = ConverterMovel::convert($strDescriptionTemplate);
-
-        View::assign([
-            'arrNovel' => $arrNovel,
-            'arrPage' => $arrPage,
-            'arrPaginator' => $arrPaginator,
-            'intNovelId' => $intNovelId,
-            'intPage' => $intPage,
-            'strOrder' => $strOrder,
-            'strPageCode' => 'chapters',
-            'intLimit' => $intLimit,
-            'strTitle' => $strTitle,
-            'strKeywords' => $strKeywords,
-            'strDescription' => $strDescription,
-        ]);
-
-
-        if ($boolIsMobile) {
-            $strView = '';
-            $this->generateGrm(1, $intNId . '-' . $strOrder . '-' . $intPage, 110);
-        } else {
-            $strView = 'pc/getNovelCatalog';
-            $this->generateGrm(2, $intNId . '-' . $strOrder . '-' . $intPage, 110);
-        }
-
-        return $this->rending($strView);
-    }
-
-    /**
-     * 小说-搜索
-     *
-     * @param Request $Request
-     * @return void
-     */
-    public function getSearchNovel(Request $Request)
-    {
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        $strSearchKeywords = (string)$Request->get('keyword');
-        $intPage = (int)$Request->get('page', 1);
-        $intLimit = 20;
-
-        $strKey = sprintf('%s:PC:Novel:Search:%s:Page:%s:Limit:%s', $Request->DomainModel->d_domain,  $strSearchKeywords, $intPage, $intLimit);
-
-        if (empty($strSearchKeywords)) {
-            return response('请输入搜索的关键字', 400);
-        }
-
-        $NovelModel = NovelModel::getInstance();
-
-        $arrFilter = [
-            '$or' => [
-                ['n_name' => ['$regex' => $strSearchKeywords, '$options' => 'i']],
-                ['n_author' => ['$regex' => $strSearchKeywords, '$options' => 'i']],
-                ['n_category' => ['$regex' => $strSearchKeywords, '$options' => 'i']],
-                ['n_description' => ['$regex' => $strSearchKeywords, '$options' => 'i']],
-            ]
-        ];
-
-        $arrPage = $NovelModel->findPaginatedWithCache($arrFilter, $intPage, $intLimit, [], $strKey);
-
-        $intButtonNum = 10;
-
-
-        $strBaseUrl =  app(NovelService::class)->getNovelSearchUrl($strSearchKeywords, '{page}');
-        $arrPaginator = CusteomPage02::generate($intPage,  $arrPage['total'], $intLimit, $strBaseUrl, $intButtonNum);
-
-        // 更新值
-        ConverterMovel::setVal([
-            'intPage' => $intPage,
-            'strSearchKeywords' => $strSearchKeywords,
-
-        ]);
-
-        $strTitleTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@TITLE');
-        $strKeywordsTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@KEYWORDS');
-        $strDescriptionTemplate =  $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__) . '@DESCRIPTION');
-
-        $strTitle = ConverterMovel::convert($strTitleTemplate);
-        $strKeywords = ConverterMovel::convert($strKeywordsTemplate);
-        $strDescription = ConverterMovel::convert($strDescriptionTemplate);
-
-        View::assign([
-            'arrPage' => $arrPage,
-            'arrPaginator' => $arrPaginator,
-            'strSearchKeywords' => $strSearchKeywords,
-            'intPage' => $intPage,
-            'intTotalPage' => $arrPage['pages'],
-            'strPageCode' => 'search',
-            'strTitle' => $strTitle,
-            'strKeywords' => $strKeywords,
-            'strDescription' => $strDescription,
-        ]);
-
-        $strView = $boolIsMobile ? '' : 'pc/getSearchNovel';
-        $this->generateGrm(2, $strSearchKeywords . $intPage, 20);
-        return $this->rending($strView);
-    }
-
-    /**
-     * 小说章节-文章-自定义页面-列表
-     *
-     * @todo 第一版本不做
-     * @param Request $Request
-     * @param [type] $intCategoryId
-     * @param integer $intPage
-     * @return void
-     */
-    // public function getArticleList(Request $Request, $intCategoryId = null, $intPage = 1)
-    // {
-    //     $boolIsMobile = $Request->param('boolIsMobile');
-
-    //     // 模拟数据
-    //     $arrNewsNovel = [
-    //         ['id' => 1, 'name' => '小说1', 'author' => '作者1'],
-    //         ['id' => 2, 'name' => '小说2', 'author' => '作者2'],
-    //         ['id' => 3, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 4, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 5, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 6, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 7, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 8, 'name' => '小说3', 'author' => '作者3'],
-    //     ];
-
-    //     View::assign([
-    //         'arrNewsNovel' => $arrNewsNovel,
-    //         'strPageCode' => 'article'
-    //     ]);
-    //     if ($boolIsMobile) {
-    //         return View::fetch();
-    //     } else {
-    //         return View::fetch('pc/getArticleList');
-    //     }
-    // }
-
-    /**
-     * 小说章节-文章-自定义页面-详情
-     * @todo 第一版本不做
-     * @param Request $Request
-     * @param [type] $intArticleId
-     * @return void
-     */
-    // public function getArticleInfo(Request $Request, $intArticleId)
-    // {
-    //     $boolIsMobile = $Request->param('boolIsMobile');
-
-    //     // 模拟数据
-    //     $arrNewsNovel = [
-    //         ['id' => 1, 'name' => '小说1', 'author' => '作者1'],
-    //         ['id' => 2, 'name' => '小说2', 'author' => '作者2'],
-    //         ['id' => 3, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 4, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 5, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 6, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 7, 'name' => '小说3', 'author' => '作者3'],
-    //         ['id' => 8, 'name' => '小说3', 'author' => '作者3'],
-    //     ];
-
-    //     View::assign([
-    //         'arrNewsNovel' => $arrNewsNovel,
-    //         'strPageCode' => 'article'
-    //     ]);
-    //     if ($boolIsMobile) {
-    //         return View::fetch();
-    //     } else {
-    //         return View::fetch('pc/getArticleInfo');
-    //     }
-    // }
-}
diff --git a/code/app/home/controller/User.php b/code/app/home/controller/User.php
deleted file mode 100644
index ca1d199..0000000
--- a/code/app/home/controller/User.php
+++ /dev/null
@@ -1,102 +0,0 @@
-param('boolIsMobile');
-
-        $strNovelUrlTemp =  $Request->DomainModel->getFomartSubject('NOVEL_INFO_URL','',false);
-        $strNovelChapterUrlTemp =  $Request->DomainModel->getFomartSubject('CONTENT_INFO_URL','',false);
-        $strSearchUrlTemp =  $Request->DomainModel->getFomartSubject('SEARCH_INFO_URL','',false);
-
-        $NovelModel = NovelModel::getInstance();
-
-        // 推荐等级为9的完结 随机15个小说
-        $intTTL = 24 * 3600;
-        $strKey = sprintf('%s:ALL:USER:TUIJIAN:WANJIE:%s', $Request->DomainModel->d_domain, 8);
-
-        $arrRecommendEndNovel = $NovelModel->getCommonNovelOnCache($strKey,  $intTTL, 8, 0, "已完结");
-
-        $strKey = sprintf('%s:PC:NOVEL:RANK:%s:SEX:%s', $Request->DomainModel->d_domain, 'monthly', 0);
-        $arrMoonRankNovel = $NovelModel->getRankNovelOnCache($strKey, 5, 0, 'monthly');
-
-        View::assign([
-            'arrRecommendEndNovel' => $arrRecommendEndNovel,
-            'arrMoonRankNovel' => $arrMoonRankNovel,
-            'strNovelUrlTemp' => $strNovelUrlTemp,
-            'strNovelChapterUrlTemp' => $strNovelChapterUrlTemp,
-            'strSearchUrlTemp' => $strSearchUrlTemp,
-        ]);
-
-        if ($boolIsMobile) {
-            $strView = '';
-            $this->generateGrm(1, 0, 20);
-        } else {
-            $strView = 'pc/user/index';
-            $this->generateGrm(2, 0, 20);
-        }
-        return $this->rending($strView);
-    }
-
-    public function getBookShelf(Request $Request)
-    {
-
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        $strNovelUrlTemp =  $Request->DomainModel->getFomartSubject('NOVEL_INFO_URL','',false);
-        $strNovelChapterUrlTemp =  $Request->DomainModel->getFomartSubject('CONTENT_INFO_URL','',false);
-        $strSearchUrlTemp =  $Request->DomainModel->getFomartSubject('SEARCH_INFO_URL','',false);
-
-        View::assign([
-            'strPageCode' => 'BookShelf',
-            'strNovelUrlTemp' => $strNovelUrlTemp,
-            'strNovelChapterUrlTemp' => $strNovelChapterUrlTemp,
-            'strSearchUrlTemp' => $strSearchUrlTemp,
-        ]);
-
-        if ($boolIsMobile) {
-            $strView = '';
-            $this->generateGrm(1, 0, 10);
-        } else {
-            $strView = 'pc/user/getBookShelf';
-            $this->generateGrm(2, 0, 10);
-        }
-        return $this->rending($strView);
-    }
-
-    public function getHistory(Request $Request)
-    {
-
-        $boolIsMobile = $Request->param('boolIsMobile');
-
-        $strNovelUrlTemp =  $Request->DomainModel->getFomartSubject('NOVEL_INFO_URL','',false);
-        $strNovelChapterUrlTemp =  $Request->DomainModel->getFomartSubject('CONTENT_INFO_URL','',false);
-        $strSearchUrlTemp =  $Request->DomainModel->getFomartSubject('SEARCH_INFO_URL','',false);
-
-        View::assign([
-            'strPageCode' => 'history',
-            'strNovelUrlTemp' => $strNovelUrlTemp,
-            'strNovelChapterUrlTemp' => $strNovelChapterUrlTemp,
-            'strSearchUrlTemp' => $strSearchUrlTemp,
-        ]);
-
-        if ($boolIsMobile) {
-            $strView = '';
-            $this->generateGrm(1, 0, 10);
-        } else {
-            $strView = 'pc/user/getHistory';
-            $this->generateGrm(2, 0, 10);
-        }
-        return $this->rending($strView);
-    }
-}
diff --git a/code/app/home/event.php b/code/app/home/event.php
deleted file mode 100644
index 4eff890..0000000
--- a/code/app/home/event.php
+++ /dev/null
@@ -1,5 +0,0 @@
-initCfg();
-        return $next($request);
-    },
-
-];
diff --git a/code/app/home/view/default/Index/index.html b/code/app/home/view/default/Index/index.html
deleted file mode 100644
index d10d6ff..0000000
--- a/code/app/home/view/default/Index/index.html
+++ /dev/null
@@ -1,120 +0,0 @@
-{extend name="baseH5" /}
-{block name="title"}{site:replace code="INDEX@INDEX@TITLE"}{/block}
-{block name="keywords"}{site:replace code="INDEX@INDEX@KEYWORDS"}{/block}
-{block name="description"}{site:replace code="INDEX@INDEX@DESCRIPTION"}{/block}
-{block name="head"}
-
-
-
-
-
-
-
-
-
-
-{/block}
-
-{block name="head-js"}{/block}
-
-{block name="logo-html"}
-

- {$DomainModel->d_name}-免费在线阅读热门小说 -

-{/block} - -{block name="main"} - -{site:grm page_code="h5_index" diff="0" num="100" g_key="arrGrm" /} - -

{$DomainModel->d_index_description}

-
-

封面推荐

-
- {novel:list count="8" sort_type="tuijian" d_key="d_key" d_val="Novel" p_val="page_data" cache_life="86400"} -
-
- {$arrGrm[$d_key]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
-
-

{$Novel.n_name}

-

作者:{$Novel.n_author}

-

{$Novel.n_description}

-
-
- {/novel:list} - -
- -
- -{novel:category d_key="strCategoryPinyin" d_val="strCategoryName"} -
-

- {$strCategoryName} - 更多.. -

-
-
- - - - {novel:list count="1" n_category="$strCategoryPinyin" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} -
- - {$arrGrm[$d_key+8+10*$start]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读
-
-

{$Novel.n_name}

-

作者:{$Novel.n_author}

-

{$Novel.n_description}

-
- {/novel:list} -
-
    - {novel:list count="9" n_category="$strCategoryPinyin" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} -
  • - {$arrGrm[$d_key+8+10*$start]|raw} - {$Novel.n_name}{$Novel.n_author} -
  • - {/novel:list} - -
-
-
- -{/novel:category} - -{/block} - -{block name="customize"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Novel/getArticleInfo.html b/code/app/home/view/default/Novel/getArticleInfo.html deleted file mode 100644 index 990ea64..0000000 --- a/code/app/home/view/default/Novel/getArticleInfo.html +++ /dev/null @@ -1,18 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

- 狂雨小说 -

-{/block} - -{block name="main"} -
- -article......... -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/default/Novel/getArticleList.html b/code/app/home/view/default/Novel/getArticleList.html deleted file mode 100644 index 272e206..0000000 --- a/code/app/home/view/default/Novel/getArticleList.html +++ /dev/null @@ -1,46 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

- 狂雨小说/文章 -

-{/block} - -{block name="main"} -
- - - -
-
-

深度解说列表

-
-
-
    - {foreach $arrNewsNovel as $key => $vo} - {include file="Public/articleList" /} - - {/foreach} -
-
- -
-{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/default/Novel/getLibrary.html b/code/app/home/view/default/Novel/getLibrary.html deleted file mode 100644 index 07f6454..0000000 --- a/code/app/home/view/default/Novel/getLibrary.html +++ /dev/null @@ -1,178 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETLIBRARY@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETLIBRARY@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETLIBRARY@DESCRIPTION"}{/block} - -{block name="head"} - - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - - -{/if} - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - -{/if} - -{/block} - -{block name="head-js"}{/block} -{block name='nav-active-class'}home{/block} -{block name="body-class"}novel_home{/block} - -{block name="logo-html"} -

- {$DomainModel->d_name}-{$Request.route.strCategory}{$Request.route.strOrder}{$Request.route.strStatus}免费阅读 -

-{/block} - -{block name="nav-html"}{/block} - -{block name="main"} - -{novel:pagerexp page="$Request.get.page" limit="30" -n_category="$Request.route.strCategory" -sort_type="$Request.route.strOrder" -n_status="$Request.route.strStatus" d_key="d_key" -d_key="d_key" -d_val="Novel" n_num="total" -button_num="5" cache_life="86400" func="generateCategoryPager" export_name="resData" /} - -{site:grm page_code="h5_novel_library" diff="$resData.p_data.page" num="40" g_key="arrGrm" /} - -

{$strDescription??''}

- - -
-

更新列表

-
    - {foreach $resData.data as $key=>$Novel} - -
  • - [{$Novel.n_category}] - - {$arrGrm[$key]|raw} - - {$Novel.n_name} - - - {$Novel.n_author} - {:date('m-d')} -
  • - {/foreach} -
-
- - -
- {volist name="resData.p_data.pager" id="vo" key="k"} - {switch $vo.label} - {case value="上一页"} - {if $resData.p_data.page == 1} - « - {else} - « - {/if} - {/case} - {case value="下一页"} - {if $resData.p_data.page >= $resData.p_data.total} - » - {else} - » - {/if} - {/case} - {default /} - {if preg_match('/^\d+$/', $vo.label)} - {$vo.label} - {/if} - {/switch} - {/volist} -
- -
-

- 封面推荐 -

-
- {novel:list count="8" sort_type="tuijian" d_key="d_key" d_val="Novel" p_val="page_data" cache_life="86400"} -
-
- {$arrGrm[$d_key+30]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
-
-

- - {$Novel.n_name} - -

-

作者:{$Novel.n_author}

-

{$Novel.n_description}

-
-
- {/novel:list} - -
-
- -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/default/Novel/getNovelCatalog.html b/code/app/home/view/default/Novel/getNovelCatalog.html deleted file mode 100644 index 6577c37..0000000 --- a/code/app/home/view/default/Novel/getNovelCatalog.html +++ /dev/null @@ -1,268 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELCATALOG@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCATALOG@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCATALOG@DESCRIPTION"}{/block} - -{block name="head"} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{site:grm page_code="h5_novel_catalog " diff="$Request.url" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-js"} -{/block} - -{block name="body-class"}novel_info{/block} - -{block name="logo-html"} -

- {$DomainModel->d_name} -

-{/block} - -{block name="nav-html"} - - - - -{/block} - -{block name="main"} - -{chapter:pagerexp page="$Request.route.intPage" limit="100" n_id="$Request.route.intNovelId" d_key="d_key" d_val="chapter" -cache_life="86400" button_num="3" sort_type="$Request.route.strOrder" func="generateChapterPager" export_name="resData" /} - -

{$arrNovel['n_name']}最新章节 - {$arrNovel['n_author']} - {$DomainModel->d_name}

-
-
-
- {$arrNovel['n_name'] ?? ''}小说封面 - {$arrNovel.n_author}最新章节 -
-
-
-

{$arrNovel.n_name}

{$arrNovel.n_author} - 著 -
-

{$arrNovel.n_category}{$arrNovel.n_status} -

-

最近更新:{$arrLatestChapter->c_name - ?? ""}

-

更新时间:{$arrNovel.n_update_time}

-
-
- -
-
-
- {$arrNovel.n_description} -
- -

章节列表(第{$Request.route.intPage}页) - {if $Request.route.strOrder == 'zheng'} - 点击切换倒序 - {else} - 点击切换正序 - {/if} -

-
- - - {include file="public/allChapterPage" start="1"/} - -
    - {foreach $resData.data as $key=>$Chapter} -
  • - {$arrGrm[$key]|raw} - {$Chapter.c_name} -
  • - - {/foreach} -
- - {include file="public/allChapterPage" /} - -
- -
-

完结推荐

-
- {novel:list count="6" n_category="$arrNovel.n_category_pinyin" n_status="wanjie" d_key="d_key" d_val="Novel" p_val="page_data" cache_life="86400"} -
-
- {$arrGrm[$d_key+110]|raw} - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读
-
-

{$Novel.n_name} -

-

作者:{$Novel.n_author}

-

{$Novel.n_description}

-
-
- {/novel:list} -
-
- - -
-

相邻小说

-
- - {$arrNovel.strFocus ?? ""} 。看小说就来{$DomainModel->d_name} {$DomainModel->d_domain}... -
-
- {volist name='$arrNovel.arrRelateveNovel' id='Novel'} - {$Novel.n_name}   - {/volist} - - {volist name='arrNovel.n_forge_novel' id='ForgeNovel'} - {$ForgeNovel.n_forge_title}   - {/volist} -
-
- - - - - -{/block} - -{block name="customize"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Novel/getNovelChapter.html b/code/app/home/view/default/Novel/getNovelChapter.html deleted file mode 100644 index 8c08d9d..0000000 --- a/code/app/home/view/default/Novel/getNovelChapter.html +++ /dev/null @@ -1,227 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELCHAPTER@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCHAPTER@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCHAPTER@DESCRIPTION"}{/block} - -{block name="head"} - -{site:grm page_code="h5_novel_chapter" diff="$Request.url" num="20" g_key="arrGrm" /} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{chapter:info n_id="$Request.route.intNovelId" c_sort_num="$Request.route.intChapterSort" -c_page="$Request.route.intChapterPage" c_key="arrChapter" /} - - - - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-js"} - -{/block} - -{block name="body-class"}jjdfjkozd{/block} -{block name="body-id"}kkasdfei{/block} - - -{block name="logo-html"} -

- {$DomainModel->d_name} -

-{/block} - -{block name="nav-html"} - - -{/block} - -{block name="main"} -

{$arrNovel['n_name']}最新章节 - {$arrChapter.c_name ?? ''}

- -
-
关灯
-
护眼
-
- 字体: - - - -
-
-
-

{$arrNovel.n_name}(第{$arrChapter.c_sort_num}页)

-
- {$arrGrm[1]|raw} -
    - {if $arrChapter.c_sort_num == 1} -
  • 上一页
  • - {elseif $arrChapter['pre_chapter'] && $arrChapter['pre_chapter']['c_sort_num']} -
  • 上一页 -
  • - {/if} -
  • 章节目录
  • - {if $arrChapter.next_chapter && $arrChapter.next_chapter.c_sort_num} -
  • 下一页 -
  • - {/if} - -
-
- {$arrGrm[2]|raw} -
- {$arrGrm[3]|raw} - - {$arrGrm[4]|raw} -
-
- {$arrGrm[5]|raw} -
    - {if $arrChapter.c_sort_num == 1} -
  • 上一页
  • - {elseif $arrChapter['pre_chapter'] && $arrChapter['pre_chapter']['c_sort_num']} -
  • 上一页 -
  • - {/if} -
  • 章节目录
  • - {if $arrChapter.next_chapter && $arrChapter.next_chapter.c_sort_num} -
  • 下一页 -
  • - {/if} -
- {$arrGrm[6]|raw} -
-
- -
-

完结推荐

-
- {novel:list count="6" n_category="$arrNovel.n_category_pinyin" n_status="wanjie" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} -
-
- {$arrGrm[$d_key+6]|raw} - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读
-
-

{$Novel.n_name} -

-

作者:{$Novel.n_author}

-

{$Novel.n_description}

-
-
- {/novel:list} -
-
- -
-

相邻小说

-
- - {$arrNovel.strFocus ?? ""} 。看小说就来{$DomainModel->d_name} {$DomainModel->d_domain}... -
-
- {volist name='arrNovel.arrRelateveNovel' id='Novel'} - {$Novel.n_name}   - {/volist} - - {volist name="arrNovel.n_forge_novel" id="ForgeNovel" key="key"} - {$ForgeNovel.n_forge_title}   - {/volist} -
-
-{/block} - -{block name="customize"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Novel/getNovelInfo.html b/code/app/home/view/default/Novel/getNovelInfo.html deleted file mode 100644 index 91e9ce2..0000000 --- a/code/app/home/view/default/Novel/getNovelInfo.html +++ /dev/null @@ -1,258 +0,0 @@ -$Novel.n_id{extend name="baseH5" /} -{block name="title"}{site:replace code="NOVEL@GETNOVELINFO@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELINFO@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELINFO@DESCRIPTION"}{/block} - -{block name="head"} - -{if $Request.route.intNovelId} -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{else} -{novel:info n_id="$DomainModel->info_id" n_key="arrNovel" n_forge_id="0" /} -{/if} - -{site:grm page_code="h5_novel_info" diff="$arrNovel.n_id" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-js"} -{/block} - -{block name="body-class"}novel_info{/block} - -{block name="logo-html"} -

- {$DomainModel->d_name} -

-{/block} - -{block name="nav-html"} - - -{/block} - -{block name="main"} -

{$arrNovel['n_name']}最新章节 - {$arrNovel['n_author']} - {$DomainModel->d_name}

-
-
-
- {$arrNovel['n_name'] ?? ''}小说封面 - {$arrNovel.n_author}最新章节 -
-
-
-

{$arrNovel.n_name}

{$arrNovel.n_author} - 著 -
-

{$arrNovel.n_category}{$arrNovel.n_status} -

-

最近更新:{$arrLatestChapter->c_name - ?? ""}

-

更新时间:{$arrNovel.n_update_time}

-
-
- -
-
-
- {$arrNovel.n_description} -
- -

最新章节

-
-
    - {chapter:list count="10" sort_type="dao" n_id="$arrNovel.n_id" d_key="d_key" d_val="Chapter" cache_life="86400"} -
  • - {$arrGrm[$d_key]|raw} - {$Chapter.c_name} -
  • - {/chapter:list} -
- 查看更多章节... -
-
-

章节列表

-
-
    - {chapter:list count="100" sort_type="zheng" n_id="$arrNovel.n_id" d_key="d_key" d_val="Chapter" cache_life="86400"} -
  • - {$arrGrm[$d_key+10]|raw} - {$Chapter.c_name} -
  • - {/chapter:list} -
- 查看更多章节... -
- -
-

完结推荐

-
- {novel:list count="6" n_category="$arrNovel.n_category_pinyin" n_status="wanjie" d_key="d_key" d_val="Novel" p_val="page_data" cache_life="86400"} -
-
- {$arrGrm[$d_key+110]|raw} - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读
-
-

{$Novel.n_name} -

-

作者:{$Novel.n_author}

-

{$Novel.n_description}

-
-
- {/novel:list} -
-
- -
-

相邻小说

-
- - {$arrNovel.strFocus ?? ""} 。看小说就来{$DomainModel->d_name} {$DomainModel->d_domain}... -
-
- {volist name='$arrNovel.arrRelateveNovel' id='Novel'} - {$Novel.n_name}   - {/volist} - - {volist name='arrNovel.n_forge_novel' id='ForgeNovel'} - {$ForgeNovel.n_forge_title}   - {/volist} -
-
- - -{/block} - -{block name="customize"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Novel/getSearchNovel.html b/code/app/home/view/default/Novel/getSearchNovel.html deleted file mode 100644 index 1c6d512..0000000 --- a/code/app/home/view/default/Novel/getSearchNovel.html +++ /dev/null @@ -1,119 +0,0 @@ -{extend name="baseH5" /} -{block name="title"}{site:replace code="NOVEL@GETSEARCHNOVEL@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETSEARCHNOVEL@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETSEARCHNOVEL@DESCRIPTION"}{/block} - -{block name="head"} - - - - - - - - - - - - - -{/block} - -{block name='nav-active-class'}home{/block} -{block name="body-class"}novel_so novel_search_page{/block} - -{block name="logo-html"} -

- {$DomainModel->d_name} -

-{/block} - -{block name="main"} - -{novel:pagerexp page="$Request.get.page" limit="30" -key="$Request.get.keyword" -d_key="d_key" -d_val="Novel" -p_val="page_data" button_num="10" cache_life="86400" func="generateSearchPager" export_name="resData" /} - -{site:grm page_code="h5_novel_search" diff="$Request.url" num="30" g_key="arrGrm" /} - -
-

{$Request.get.keyword}搜索结果 - {$DomainModel->d_name} 第{$resData.p_data.page}页

- {if $resData.p_data.total < 1}

没有相关数据

- {else} - -
- {foreach $resData.data as $key=>$Novel} -
-
- {$arrGrm[$key]|raw} - - {$Novel['n_name'] ?? ''}小说封面 - {$Novel.n_author}最新章节 - -
-
-

{$Novel.n_name}

-

作者:{$Novel.n_author}

-

{$Novel.n_description}

-
-
- {/foreach} -
- {/if} - -
- - -
- {volist name="$resData.p_data.pager" id="vo" key="k"} - {switch $vo.label} - {case value="上一页"} - {if $resData.p_data.page == 1} - « - {else} - « - {/if} - {/case} - {case value="下一页"} - {if $resData.p_data.page >= $resData.p_data.total} - » - {else} - » - {/if} - {/case} - {default /} - {if preg_match('/^\d+$/', $vo.label)} - {$vo.label} - {/if} - {/switch} - {/volist} -
- - -{/block} - -{block name="customize"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/adBanner.html b/code/app/home/view/default/Pc/Public/adBanner.html deleted file mode 100644 index bd8e696..0000000 --- a/code/app/home/view/default/Pc/Public/adBanner.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/code/app/home/view/default/Pc/Public/allChapterPage.html b/code/app/home/view/default/Pc/Public/allChapterPage.html deleted file mode 100644 index ce3086b..0000000 --- a/code/app/home/view/default/Pc/Public/allChapterPage.html +++ /dev/null @@ -1,35 +0,0 @@ -{if !empty($resData.p_data.pager)} -
- {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="prev"} - - {$item.label} - - {/eq} - {/volist} - - - - {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="next"} - - {$item.label} - - {/eq} - {/volist} -
-{/if} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/articleList.html b/code/app/home/view/default/Pc/Public/articleList.html deleted file mode 100644 index 3a6a22b..0000000 --- a/code/app/home/view/default/Pc/Public/articleList.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/chapterTableAll.html b/code/app/home/view/default/Pc/Public/chapterTableAll.html deleted file mode 100644 index 2fc1fc2..0000000 --- a/code/app/home/view/default/Pc/Public/chapterTableAll.html +++ /dev/null @@ -1,6 +0,0 @@ -
  • - 01 天龙问世 -
  • -
  • - 02 沧武的小霸王 -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/endNovelList.html b/code/app/home/view/default/Pc/Public/endNovelList.html deleted file mode 100644 index cb851c3..0000000 --- a/code/app/home/view/default/Pc/Public/endNovelList.html +++ /dev/null @@ -1,11 +0,0 @@ -
  • - - 落魄千金美食发家日常 - - -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/footer.html b/code/app/home/view/default/Pc/Public/footer.html deleted file mode 100644 index adc12bf..0000000 --- a/code/app/home/view/default/Pc/Public/footer.html +++ /dev/null @@ -1,22 +0,0 @@ -
    -
    -
    -

    友情链接

    - -
    -
    -
    -

    - Copyright (C) 2008-2020 All rights reserved -
    - -

    -

    请所有作者发布作品时务必遵守国家互联网信息管理办法规定,我们拒绝任何色情小说,一经发现,即作删除!本站所收录作品、社区、书库评论及本站所做之广告均属其个人行为,与本站立场无关

    -
    -
    - - 返回顶部 - \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/historyNovelList.html b/code/app/home/view/default/Pc/Public/historyNovelList.html deleted file mode 100644 index 59a94b1..0000000 --- a/code/app/home/view/default/Pc/Public/historyNovelList.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - 我真是一条龙 - - - 老读者必看公告!!! - - - 兔子很淡定 - - 3天前 - - 已完结 - - 阅读 - 删除 - - \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/hostListImg.html b/code/app/home/view/default/Pc/Public/hostListImg.html deleted file mode 100644 index 6117718..0000000 --- a/code/app/home/view/default/Pc/Public/hostListImg.html +++ /dev/null @@ -1,15 +0,0 @@ - \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/hostListText.html b/code/app/home/view/default/Pc/Public/hostListText.html deleted file mode 100644 index abaaf6e..0000000 --- a/code/app/home/view/default/Pc/Public/hostListText.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/indexBoyNewsList.html b/code/app/home/view/default/Pc/Public/indexBoyNewsList.html deleted file mode 100644 index ca8cbc1..0000000 --- a/code/app/home/view/default/Pc/Public/indexBoyNewsList.html +++ /dev/null @@ -1,17 +0,0 @@ -
  • -

    玻璃焰

    -
    - 美绿哔哔 - 武侠仙侠 - - 玻璃焰 - -

    [已签约实体待上市]【天生坏种x清冷校花】【大学校园、男追女、协议情侣、强制爱、破镜重圆】黎幸在整个西京大学都很有名。 - 高考状元,够美,够穷。这样的人,外貌不是恩赐,是原罪。楼崇,出生即登上金字塔最顶层的存在优越家世,顶级皮囊但却是个十足十的人渣。 - ——这样两个毫无交集的人,某天却被人撞见楼崇的阿斯顿马丁车内黎幸被单手抱起跨坐在腿上,后背抵着方向盘车窗光影交错,男人冷白精致的侧脸清晰可见,扣着她的手腕,亲自教她怎么扯开自己的领结。 - —— “协议女友,知道什么意思吗?” “意思是牵手,接吻,拥抱,上床。” “以及,爱上我。” “一步不能少。”—— “玻璃焰,玻璃高温产生的火焰,银蓝色,很美。” - 本站提示:各位书友要是觉得《玻璃焰》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!

    -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/indexBoyNewsOne.html b/code/app/home/view/default/Pc/Public/indexBoyNewsOne.html deleted file mode 100644 index 4d7860e..0000000 --- a/code/app/home/view/default/Pc/Public/indexBoyNewsOne.html +++ /dev/null @@ -1,44 +0,0 @@ -
    -

    渣攻的白月光总对我打直球

    - - 渣攻的白月光总对我打直球 - -
    -
    - 作者:不见仙踪 - 分类:武侠仙侠 - 字数:24.20万字+ - 进度:已完结 - 总点击:0 -
    -

    【下本开《分手后四个鬼攻同时找上我》嗷~】 大二上学期,宣从南被一个温柔至极的男人追求;大二下学期,宣从南和沈迁在一起。 - 两个人谈了一年恋爱,宣从南发现,沈迁照常温柔,但他却常常把这样的话挂在嘴边: “不要笑。” “安静一点。” “不要太闹腾。” “眼里不要有温度。” “这样才像他。” 宣从南:……哦。 - 宣从南走了,潇洒果决,晚上却在路边捡到一个看起来落魄至极的男人。他耷拉着眉眼,带口罩,安静地坐在花坛边,似乎是在晒月光。 这人倒是很安静,还不笑,更不闹腾,眼里也没有温度。 - 宣从南把人捡回家了。他发现,这个名叫顾拾的男人竟然是娱乐圈里的顶流,只不过他不太关注娱乐圈,这才错误地把拥有千万粉丝的人捡回了家。 - 宣从南还发现,顾拾虽然过分冷淡,但他打直球说能不能喜欢我;顾拾虽然安静不闹腾,但他打直球说能不能抱抱我;顾拾虽然眼睛里没什么温度,但他打直球说能不能做…… 宣从南:这就是顶流吗? - “同居”段时间,两人顺理成章地谈恋爱。 又同居段时间,宣从南忽而得知顾拾就是沈迁爱而不得的白月光。 宣从南:……命运啊。 - 为了避免尴尬,他收拾行李又打算跑,刚走到门口却只听一道开门声,顾拾裹挟着外面的寒气进来,轻轻带上门。 宣从南:…… 顾拾冷淡的目光从上到下打量他,最后落在行李箱上。 “去哪儿?”他问。 - 宣从南捏紧行李杆,正欲说话,顾拾又道: “你想甩了我?” …… 这天晚上有狗仔拍到顾拾进了一间出租屋。 除了顾拾,窗户玻璃上还映出另外一道男性身影,他手边还有个行李箱。 - 紧接着,一向喜怒不形于色的顾拾猛地推开行李箱,拽起另一人的手腕去了卧室。 一夜没出来。 【阅读指南】: *1V1,HE,甜文。 *攻非常非常非常爱受,非常非常非常宠受 - *攻能直球绿茶也能偏执疯批,属性复杂,天使们直接看文叭 *有打脸剧情 *无原型,勿代入现实。我写文为了快乐,也只想让读者快乐~ *感谢支持正版,给大家鞠躬啦~ - ★下本《分手后四个鬼攻同时找上我》求收藏~ 宴祀亭是个小道士,山生山长,没见过外面的天,最大的雄心壮志是杀死鬼王。 但他怕鬼,还花心。 下山后进城,他在酒吧泡了一个大学教授做男朋友。 - 教授克制古板,一副性冷淡的模样。 但他“暴力”且沉沦地教会了宴祀亭在床上的108种姿势。 每天晚上宴祀亭都被哔的“身心俱散”。 随着感情渐深,教授带宴祀亭回家见父母。 他家里有鬼,好多鬼。 - 那些鬼躲在门外、趴在床底听他和教授...... 宴祀亭瑟瑟发抖,教授却像没事人,依然一次比一次深入。 宴祀亭:师父救命—— - 日复一日,教授变得愈发过分。他中午要抱宴祀亭亲昵,下午要抱宴祀亭厮磨,晚上要抱宴祀亭深入交流,非常不节制。 最后他还设门禁时间限制宴祀亭的出行,控制欲极强。 宴祀亭受不了,把人踹了。 - 他谈了第二个男朋友。 但为什么温柔先生最后因他变得野蛮,各种道具都上场; 绅士先生因他变成恶棍,让他不准离开自己的视线; 禁欲先生因他变得纵荡,永远都要按着他驰骋...... - 宴祀亭:师父我遇到了好多变态,我要回山立刻马上! 身心遭受“严重摧残”的宴祀亭决定封心锁爱,这辈子都不要泡男人了,要去完成自己的雄心壮志——杀死鬼王。 - 紧接着被甩的教授将他堵在家门口,唇角带笑声含魅:“不是要杀我吗?我来了。” 晦暗夜色下,教授身后又慢慢浮现出温柔先生、绅士先生、禁欲先生的身影,他们都在盯着宴祀亭。 - 教授柔声道:“你是要我们一起来,还是一个一个来呢。” 宴祀亭抖如筛糠无可逃脱地被他们推进了卧室。恶鬼们商量谁先来,最后愉快地决定一起。 “不要,救命啊啊啊啊啊啊啊啊啊——” *切片攻 - *所有躲门外趴床底听床戏的,都是攻的切片 ★求预收《不是人也能攻我?》收藏~ 司徒禁肩宽窄腰身材好,胸肌饱满腿长,在男同界是被许多人觊觎的优质1。 - 有人找司徒禁拍钙片,身为直男的司徒禁果断拒绝。 等再醒来,司徒禁发现他穿到了异世界。 这里到处是妖魔鬼怪。 - 司徒禁有个极倒霉的倒霉体质,喝凉水塞牙缝,吃东西噎喉咙,睡觉能窒息。再又一次平地摔跤后,司徒禁气得破口大骂。 那些神经病又来了。 玛德,这次还敢撕他衣服! - 这个世界不止他一个倒霉蛋,还有ABCDE等男人进来了。 老乡见老乡两眼泪汪汪,司徒禁和大家互相扶持,把这群想上他的变态杀得四处逃窜。 然后有一天,司徒禁看见男人 A 帮鬼撕碎了他的上衣。 - 司徒禁:? 男人B帮鬼扯烂了他的裤子。 司徒禁:?? 男人C帮鬼拽掉了他的衬衫夹。 司徒禁:??? 混乱中,谁摸了他的胸肌! 谁捏了他的屁股!! 谁掰开了他的腿!!! - 司徒禁冷笑:想攻我的千千万,你算哪块小饼干?! ABCDE 得逞,鬼得逞,怪物藤蔓得手,触手得逞...... 被迫野战后司徒禁躺在草地里抽事后烟,沉思:是个人都能攻我?不是人也能攻我? - 而他不知道,他进入的异世界其实是一个系列视频,无数观众坐在电视机前,每天就为了看他闯关。 司徒禁:什么关?“床”关吗? *切片攻,每个都为了受打得头破血流,甚至想杀了自己的分身 - *受极度理智冷静大胸美人 *攻疯得一批,每个切片都想独占囚禁受 *直播镜头前的观众只能看正经闯关,其他的看不到,花钱做榜一也没用 - 本站提示:各位书友要是觉得《渣攻的白月光总对我打直球》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!

    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/indexBoyRankList.html b/code/app/home/view/default/Pc/Public/indexBoyRankList.html deleted file mode 100644 index 2009dd2..0000000 --- a/code/app/home/view/default/Pc/Public/indexBoyRankList.html +++ /dev/null @@ -1,16 +0,0 @@ -
  • - {$key+=1} -

    娱乐宗师

    -
    - - 娱乐宗师 - -
    - 作者:猩猩崛起 - 类别:武侠仙侠 -

    小工作室的微电影导演,重生平行世界!踏上娱乐征途! - 本站提示:各位书友要是觉得《娱乐宗师》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!

    -
    -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/indexBoyRankOne.html b/code/app/home/view/default/Pc/Public/indexBoyRankOne.html deleted file mode 100644 index 458de74..0000000 --- a/code/app/home/view/default/Pc/Public/indexBoyRankOne.html +++ /dev/null @@ -1,26 +0,0 @@ -
  • - 1 -

    捻转步舞曲[花滑] -

    -
    - - 捻转步舞曲[花滑] - -
    - 作者:梧桐树下wt - 类别:武侠仙侠 -

    【本文将会于2023年9月30日星期六入V,谢谢支持!】 【求投票——《成长·逆袭》主题征文——作品投票——鱼跃龙门后来居上】 - 【每5K营养液加更一章】 作为刚升组没多久,在华国内难得可以跳跃演绎两手抓的男子单人花滑选手,郁辰被队里的教练们给予极大的厚望。 - 并且整个教练团也在想尽各种方法教导这位,冰上冰下两个样子,经常会躲起来不见人的闷葫芦。 “到底有什么办法,能让那家伙在冰下的时候,有上冰那会百分之一的灵气啊!” - 只有郁辰他本人知道——他无论什么时候,都爱惨了艺术与冰面结合起来的样子。 ——只是台下之后,不会表达而已。 - 一切的变动,从他没忍住在莫斯科赛后偷瞒着教练,去看了一场芭蕾舞舞台剧之后。 追着一见钟情的男孩来到异国,并且努力学了中文的佐切卡:你好,郁!能我你拥抱? - 沉思了好久,才理清楚他语法顺序的郁辰:你学顺了中文再和我说话吧。 佐切卡(惊喜):那就是可以了! - 于是某位男单运动员就被纤细高挑练跳舞的熊抱住了一个下午,跑都跑不掉。 来自莫斯科的芭蕾舞者X略显自闭的花滑选手 1、故事里面所有人物故事,经历都没有原型。 - 2、作者对于花滑的认知还没有到完全专业水平,但是所有技术动作描写,比赛规则描述,都有资料支持。 - 3、如果有技术问题需要讨论可以随时留评,我看到后会回复的。看了每章词汇解释还是不懂的话也可以留评,我会想办法换一种解释试试看的(作者是真想教会你们滑冰系列)。 - 4、最重要一点——无论怎么样的情感下,都请不要轻易怀疑运动员对该项目的热爱。 5、停在‘4’好像不太好,所以写了个‘5’。 - 本站提示:各位书友要是觉得《捻转步舞曲[花滑]》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!

    -
    -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/indexNewsUpdateList.html b/code/app/home/view/default/Pc/Public/indexNewsUpdateList.html deleted file mode 100644 index 1b055eb..0000000 --- a/code/app/home/view/default/Pc/Public/indexNewsUpdateList.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/shuKuNovelList.html b/code/app/home/view/default/Pc/Public/shuKuNovelList.html deleted file mode 100644 index 1698493..0000000 --- a/code/app/home/view/default/Pc/Public/shuKuNovelList.html +++ /dev/null @@ -1,32 +0,0 @@ -
  • - - 落魄千金美食发家日常 - -
    -

    落魄千金美食发家日常

    -

    - 作者:鱼昆子 - 分类:男生 - 状态:已完结 - 总字数:43.80万字+ -

    -

    - 标签: - -

    -

    最近更新:219 桃花酿 -

    -

    正文已完结,福利番外待续! 预收《癫疯人生有多爽你知道吗》《当家主母的咸鱼美食日常》戳专栏求收藏。 ——————— 温仲夏身为百万粉丝美食博主,一朝穿越。 - 好消息,穿成尚书千金。 坏消息,父兄获罪被贬到千里之外。 身边只有一个柔弱的嫂嫂和年幼的小弟。 开局就是一个交不上房租,大雪天几乎要流落街头的惨境。 温仲夏来不及哭,撸起袖子就是干。 - 红烧肉火锅烧烤爆米花卷饼卤肉奶茶小蛋糕…… 她就不信这些东京人都不爱吃。 不成的话,她还有麻辣烫烤鸭炸鸡酸辣粉炸酱面汤圆大馄饨…… 一不小心,落魄千金混成东京知名女掌柜。 …… 小剧场: - 一众贵女听闻温仲夏当街叫卖吃食后,纷纷对她这种抛头露面的行为狠狠批判。 几天后,她们却在温仲夏的食店门口不期而遇。 “你怎么来了,不会是来买蛋挞的吧?” “难道你也是?” - “我可不是,我还要买奶油蛋糕呢。” 说好的不齿与之为伍呢? 这时店内传来吆喝:“数量有限,先到先得。” 贵女们忙不迭地往里冲。 “我先来的!” ①本文主线是美食和日常。 - ②背景主要参考宋朝,不严谨的地方请见谅。 - 本站提示:各位书友要是觉得《落魄千金美食发家日常》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!

    -
    -
    - 更新时间:2025-03-20 23:59 - 立即阅读 -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/Public/swiperListImg.html b/code/app/home/view/default/Pc/Public/swiperListImg.html deleted file mode 100644 index b0b9b0c..0000000 --- a/code/app/home/view/default/Pc/Public/swiperListImg.html +++ /dev/null @@ -1,7 +0,0 @@ -
  • - - 落魄千金美食发家日常 - -
  • diff --git a/code/app/home/view/default/Pc/Public/swiperListText.html b/code/app/home/view/default/Pc/Public/swiperListText.html deleted file mode 100644 index 620556b..0000000 --- a/code/app/home/view/default/Pc/Public/swiperListText.html +++ /dev/null @@ -1,6 +0,0 @@ -
  • - - 1 - 落魄千金美食发家日常 -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Pc/User/getBookShelf.html b/code/app/home/view/default/Pc/User/getBookShelf.html deleted file mode 100644 index 4de16d1..0000000 --- a/code/app/home/view/default/Pc/User/getBookShelf.html +++ /dev/null @@ -1,49 +0,0 @@ -{extend name="basePc" /} -{block name="title"}我的书架{/block} -{block name="keywords"}我的书架{/block} -{block name="description"}我的书架{/block} -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - - -{block name="body-class"}novel_home{/block} - -{block name="main"} - -
    -
    -
    -

    我的书架

    -
    - -
    -
    -
    - - -{/block} - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/User/getHistory.html b/code/app/home/view/default/Pc/User/getHistory.html deleted file mode 100644 index 3384ec2..0000000 --- a/code/app/home/view/default/Pc/User/getHistory.html +++ /dev/null @@ -1,49 +0,0 @@ -{extend name="basePc" /} -{block name="title"}我的阅读记录{/block} -{block name="keywords"}我的阅读记录{/block} -{block name="description"}我的阅读记录{/block} -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - - -{block name="body-class"}novel_home{/block} - -{block name="main"} - -
    -
    -
    -

    阅读记录

    -
    - -
    -
    -
    - - -{/block} - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/getArticleInfo.html b/code/app/home/view/default/Pc/getArticleInfo.html deleted file mode 100644 index 5c10385..0000000 --- a/code/app/home/view/default/Pc/getArticleInfo.html +++ /dev/null @@ -1,14 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - - -{block name="main"} - -
    article.......
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/getArticleList.html b/code/app/home/view/default/Pc/getArticleList.html deleted file mode 100644 index 0c385c6..0000000 --- a/code/app/home/view/default/Pc/getArticleList.html +++ /dev/null @@ -1,88 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    - - -
    - -
    - - - -
    -
    - - -
    - -
    -
    -
      -
    1. -
        -
      • 分类
      • -
      • 书名
      • -
      • 描述
      • -
      • 作者
      • -
      • 更新时间
      • -
      -
    2. - {foreach $arrNewsNovel as $key=>$Novel} - {include file="Pc/Public/articleList" /} - {/foreach} -
    -
    -
    -
    - - -
    - - -
    - -
    - -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/getLibrary.html b/code/app/home/view/default/Pc/getLibrary.html deleted file mode 100644 index 201e5b0..0000000 --- a/code/app/home/view/default/Pc/getLibrary.html +++ /dev/null @@ -1,204 +0,0 @@ -{extend name="basePc" /} -{block name="title"}{site:replace code="NOVEL@GETLIBRARY@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETLIBRARY@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETLIBRARY@DESCRIPTION"}{/block} -{block name="head"} - - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - - -{/if} - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - -{/if} - -{/block} -{block name="head-js"}{/block} - -{block name="head-css"} - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - -{/if} - -{/block} - -{block name='nav-active-class'}home{/block} - - -{block name="main"} - -{novel:pagerexp page="$Request.get.page" limit="30" -n_category="$Request.route.strCategory" -sort_type="$Request.route.strOrder" -n_status="$Request.route.strStatus" d_key="d_key" -d_key="d_key" -d_val="Novel" n_num="total" -button_num="10" cache_life="86400" func="generateCategoryPager" export_name="resData" /} - -{site:grm page_code="pc_novel_library" diff="$resData.p_data.page" num="70" g_key="arrGrm" /} - - -
    -
    -
    - {novel:list count="6" sort_type="tuijian" d_key="d_key" d_val="Novel" p_val="page_data" cache_life="86400"} -
    -
    - {$arrGrm[$d_key]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -
    -
    - {$Novel.n_author} - {$Novel.n_name} -
    -
    - {$Novel.n_description} -
    -
    -
    - {/novel:list} -
    -
    -
    -

    - 分类: - 不限 - - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName"} - {$strCategoryName} - - {/novel:category} - - -

    -

    排序: - {novel:sort d_key="key" d_val="strSortName"} - {$strSortName} - {/novel:sort} -

    -

    状态: - {novel:status d_key="key" d_val="strStatusName"} - {$strStatusName} - {/novel:status} - -

    -
    - -
    -
    -

    最新入库小说

    -
      - {novel:list count="30" sort_type="news" d_key="d_key" d_val="Novel" p_val="page_data" - cache_life="86400"} -
    • - [{$Novel->n_category ?? ''} - - {$arrGrm[$d_key+6]|raw} - {$Novel->n_name} - {$Novel->n_author} -
    • - {/novel:list} -
    -
    -
    -

    最近更新小说列表

    - -
    -
    - - -
    - {volist name="resData.p_data.pager" id="vo" key="k"} - {switch $vo.label} - {case value="上一页"} - {if $resData.p_data.page == 1} - « - {else} - « - {/if} - {/case} - {case value="下一页"} - {if $resData.p_data.page >= $resData.p_data.total} - » - {else} - » - {/if} - {/case} - {case value="..."} - ... - {/case} - {default /} - {if preg_match('/^\d+$/', $vo.label)} - {$vo.label} - {/if} - {/switch} - {/volist} - -
    - -
    - - -{/block} - -{block name="customize"} -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/getNovelCatalog.html b/code/app/home/view/default/Pc/getNovelCatalog.html deleted file mode 100644 index 2fbcbeb..0000000 --- a/code/app/home/view/default/Pc/getNovelCatalog.html +++ /dev/null @@ -1,236 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELCATALOG@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCATALOG@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCATALOG@DESCRIPTION"}{/block} - -{block name="head"} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{site:grm page_code="pc_novel_catalog" diff="$Request.url" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-css"} - -{/block} -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="head-js"} -{/block} - -{block name="body-class"}novel_info{/block} - -{block name="main"} - -{chapter:pagerexp page="$Request.route.intPage" limit="100" n_id="$Request.route.intNovelId" d_key="d_key" d_val="chapter" -cache_life="86400" button_num="3" sort_type="$Request.route.strOrder" func="generateChapterPager" export_name="resData" /} - -
    -
    -
    -

    - {$DomainModel->d_name}> - - {$arrNovel['n_name']} - -

    -
    -
    - {$arrNovel['n_name'] ?? ''}小说封面 - {$arrNovel.n_author}最新章节 -
    -
    -
    -

    {$arrNovel['n_name']}

    -
    -

    作  者:{$arrNovel.n_author ?? ''}

    -

    类  别:{$arrNovel.n_category ?? ''}

    -

    状  态:{$arrNovel.n_status ?? ''}

    -

    - 动  作: - 加入书架 - - 章节目录 - - 开始阅读 -

    -

    最后更新:{$arrNovel.n_update_time ?? ''}

    -

    最新章节: - {$arrNovel.n_latest_chapter_name ?? ""}

    -
    -
    -
    {$arrNovel.n_description ?? ''}
    -
    -
    -
    -
    -

    《{$arrNovel.n_name ?? ''}》{$arrNovel.n_name ?? '章节'}

    -
    - {$arrNovel.strFocus ?? ""} 。看小说就来{$DomainModel->d_name} {$DomainModel->d_domain}... - -

    相邻推荐: - {volist name="arrNovel.n_forge_novel" id="ForgeNovel" key="key"} - {if $key<20 } {$arrGrm[$key+20]|raw} {/if} {$ForgeNovel.n_forge_title} - {/volist} - - {volist name='$arrNovel.arrRelateveNovel' id='Novel'} - {$Novel.n_name}   - {/volist} - -

    -
    -
    -
    - -
    -
    -

    《{$arrNovel.n_name}》章节列表(第{$Request.route.intPage}页)切换倒序/正序: - {if $Request.route.strOrder == 'zheng'} - 点击切换倒序 - {else} - 点击切换正序 - {/if} -

    - - - {include file="pc/public/allChapterPage" /} - - - - - {include file="pc/public/allChapterPage" /} -
    -
    - -
    -

    已完结热门小说推荐

    -
    - - {novel:list count="6" n_category="$arrNovel.n_category_pinyin" n_status="wanjie" d_key="d_key" d_val="Novel" - cache_life="86400"} -
    -
    - {$arrGrm[$d_key+110]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -
    -
    {$Novel.n_author}{$Novel.n_name} -
    -
    {$Novel.n_description} -
    -
    -
    - {/novel:list} - -
    -
    -
    - - - -{/block} - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/getNovelChapter.html b/code/app/home/view/default/Pc/getNovelChapter.html deleted file mode 100644 index 6868ba4..0000000 --- a/code/app/home/view/default/Pc/getNovelChapter.html +++ /dev/null @@ -1,189 +0,0 @@ -{extend name="basePc" /} -{block name="title"}{site:replace code="NOVEL@GETNOVELCHAPTER@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCHAPTER@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCHAPTER@DESCRIPTION"}{/block} - -{block name="head"} - -{site:grm page_code="pc_novel_chapter" diff="$Request.url" num="20" g_key="arrGrm" /} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{chapter:info n_id="$Request.route.intNovelId" c_sort_num="$Request.route.intChapterSort" -c_page="$Request.route.intChapterPage" c_key="arrChapter" /} - - - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-css"} - -{/block} - -{block name="head-js"} - -{/block} - -{block name="body-class"}novel_info{/block} -{block name='nav-active-class'}home{/block} - -{block name="main"} - -
    - {$arrGrm[1]|raw} -
    -
    -

    - {$DomainModel->d_name}>{$arrNovel.n_name} - > - {$arrNovel.n_name}(第{$arrChapter.c_sort_num}页) -

    - {$arrGrm[2]|raw} -
    -

    {$arrNovel.n_name}(第{$arrChapter['c_sort_num']}页)

    -
    - {if $arrChapter && $arrChapter.c_sort_num && $arrChapter.c_sort_num == 1} - 上一页 - {else} - {$arrGrm[10]|raw} - 上一页 - {/if} - | - 章节目录 - | - {if $arrChapter.next_chapter && $arrChapter.next_chapter.c_sort_num} - {$arrGrm[9]|raw} - 下一页 - {/if} -
    - {$arrGrm[3]|raw} - - {$arrGrm[4]|raw} -

    请勿开启浏览器阅读模式,否则将导致章节内容缺失及无法阅读下一页。

    - -

    相邻推荐: - {volist name="arrNovel.n_forge_novel" id="ForgeNovel" key="key"} - {if $key<19 } {$arrGrm[$key+9]|raw} {/if} {$ForgeNovel.n_forge_title} - {/volist} - - {volist name='arrNovel.arrRelateveNovel' id='Novel'} - {$Novel.n_name}   - {/volist} - -

    - {$arrGrm[5]|raw} -
    - {if $arrChapter && $arrChapter.c_sort_num && $arrChapter.c_sort_num == 1} - 上一页 - {else} - {$arrGrm[10]|raw} - 上一页 - {/if} - | - 章节目录 - | - {if $arrChapter.next_chapter && $arrChapter.next_chapter.c_sort_num} - {$arrGrm[9]|raw} - 下一页 - {/if} -
    - {$arrGrm[6]|raw} -
    -
    -
    -
    -

    已完结热门小说推荐

    -
    read_btn - - {novel:list count="6" n_category="$arrNovel.n_category_pinyin" n_status="wanjie" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} -
    -
    - {$arrGrm[$d_key+6]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -
    -
    {$Novel.n_author}{$Novel.n_name}
    -
    {$Novel.n_description} -
    -
    -
    - - - {/novel:list} - -
    -
    -
    -{/block} - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/getNovelInfo.html b/code/app/home/view/default/Pc/getNovelInfo.html deleted file mode 100644 index 7f18d39..0000000 --- a/code/app/home/view/default/Pc/getNovelInfo.html +++ /dev/null @@ -1,232 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELINFO@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELINFO@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELINFO@DESCRIPTION"}{/block} - -{block name="head"} - -{if $Request.route.intNovelId} -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{else} -{novel:info n_id="$DomainModel->info_id" n_key="arrNovel" n_forge_id="0" /} -{/if} - -{site:grm page_code="pc_novel_info" diff="$arrNovel.n_id" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-css"} - -{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="head-js"} -{/block} - -{block name="body-class"}novel_info{/block} - -{block name="main"} - -
    -
    -
    -

    - {$DomainModel->d_name}> - - {$arrNovel['n_name']} - -

    -
    -
    - {$arrNovel['n_name'] ?? ''}小说封面 - {$arrNovel.n_author}最新章节 -
    -
    -
    -

    {$arrNovel['n_name']}

    -
    -

    作  者:{$arrNovel.n_author ?? ''}

    -

    类  别:{$arrNovel.n_category ?? ''}

    -

    状  态:{$arrNovel.n_status ?? ''}

    -

    - 动  作: - 加入书架 - - 章节目录 - - 开始阅读 -

    -

    最后更新:{$arrNovel.n_update_time ?? ''}

    -

    最新章节: - {$arrNovel.n_latest_chapter_name ?? ""}

    -
    -
    -
    {$arrNovel.n_description ?? ''}
    -
    -
    -
    -
    -

    《{$arrNovel.n_name ?? ''}》{$arrNovel.n_name ?? '章节'}

    -
    - {$arrNovel.strFocus ?? ""} 。看小说就来{$DomainModel->d_name} {$DomainModel->d_domain}... - -

    相邻推荐: - {volist name="arrNovel.n_forge_novel" id="ForgeNovel" key="key"} - {if $key<20 } {$arrGrm[$key+20]|raw} {/if} {$ForgeNovel.n_forge_title} - {/volist} - - {volist name='$arrNovel.arrRelateveNovel' id='Novel'} - {$Novel.n_name}   - {/volist} - -

    -
    -
    -
    - -
    -
    -

    《{$arrNovel.n_name}》最新章节

    -
      - {chapter:list count="12" sort_type="dao" n_id="$arrNovel.n_id" d_key="d_key" d_val="Chapter" cache_life="86400"} -
    • - {$arrGrm[$d_key]|raw} - {$Chapter.c_name} -
    • - {/chapter:list} -
    -

    《{$arrNovel.n_name}》章节列表

    -
      - {chapter:list count="100" sort_type="zheng" n_id="$arrNovel.n_id" d_key="d_key" d_val="Chapter" cache_life="86400"} -
    • - {$arrGrm[$d_key+10]|raw} - {$Chapter.c_name} -
    • - {/chapter:list} -
    查看更多章节... -
    -
    - -
    -

    已完结热门小说推荐

    -
    - - {novel:list count="6" n_category="$arrNovel.n_category_pinyin" n_status="wanjie" d_key="d_key" d_val="Novel" p_val="page_data" cache_life="86400"} -
    -
    - {$arrGrm[$d_key+110]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -
    -
    {$Novel.n_author}{$Novel.n_name} -
    -
    {$Novel.n_description} -
    -
    -
    - {/novel:list} - -
    -
    -
    - - -{/block} - - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/getSearchNovel.html b/code/app/home/view/default/Pc/getSearchNovel.html deleted file mode 100644 index daa10a4..0000000 --- a/code/app/home/view/default/Pc/getSearchNovel.html +++ /dev/null @@ -1,133 +0,0 @@ -{extend name="basePc" /} -{block name="title"}{site:replace code="NOVEL@GETSEARCHNOVEL@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETSEARCHNOVEL@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETSEARCHNOVEL@DESCRIPTION"}{/block} - -{block name="head"} - - - - - - - - - - - - - -{/block} - -{block name='nav-active-class'}home{/block} - -{block name="title"}{/block} -{block name="meta-other"}{/block} -{block name="body-class"}novel_home novel_search_page{/block} -{block name="main"} - - -{novel:pagerexp page="$Request.get.page" limit="30" -key="$Request.get.keyword" -d_key="d_key" -d_val="Novel" n_num="total" -p_val="page_data" button_num="10" cache_life="86400" func="generateSearchPager" export_name="resData" /} - -{site:grm page_code="pc_novel_search" diff="$Request.url" num="30" g_key="arrGrm" /} - -
    -
    -
    -

    {$Request.get.keyword}搜索结果 - {$DomainModel->d_name} 第{$resData.p_data.page}页

    -
    - 搜索“{$Request.get.keyword}”相关结果共有 {$resData.p_data.total} 部小说 -
    - {if $resData.p_data.total <1}

    没有相关数据

    - {else} -
    - - {foreach $resData.data as $key=>$Novel} -
    -
    - {$arrGrm[$key]|raw} - - {$Novel['n_name'] ?? ''}小说封面 - {$Novel.n_author}最新章节 - -
    -
    -
    {$Novel.n_author}{$Novel.n_name} -
    -
    {$Novel.n_description} -
    -
    -
    - {/foreach} - -
    - - {/if} - -
    -
    - - -
    - {volist name="resData.p_data.pager" id="vo" key="k"} - {switch $vo.label} - {case value="上一页"} - {if $resData.p_data.page == 1} - « - {else} - « - {/if} - {/case} - {case value="下一页"} - {if $resData.p_data.page >= $resData.p_data.total} - » - {else} - » - {/if} - {/case} - {case value="..."} - ... - {/case} - {default /} - {if preg_match('/^\d+$/', $vo.label)} - {$vo.label} - {/if} - {/switch} - {/volist} - -
    - -
    -{/block} - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Pc/index.html b/code/app/home/view/default/Pc/index.html deleted file mode 100644 index 817a7ed..0000000 --- a/code/app/home/view/default/Pc/index.html +++ /dev/null @@ -1,179 +0,0 @@ -{extend name="basePc" /} -{block name="title"}{site:replace code="INDEX@INDEX@TITLE"}{/block} -{block name="keywords"}{site:replace code="INDEX@INDEX@KEYWORDS"}{/block} -{block name="description"}{site:replace code="INDEX@INDEX@DESCRIPTION"}{/block} - -{block name="head-css"} - -{/block} -{block name="head"} - - - - - - - -{/block} - -{block name="main"} - -{site:grm page_code="pc_index" diff="0" num="150" g_key="arrGrm" /} - -
    -
    -
    - {novel:list count="4" sort_type="tuijian" n_status="lianzai" d_key="d_key" d_val="Novel" p_val="page_data" - cache_life="86400"} -
    -
    - {$arrGrm[$d_key]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -
    -
    - {$Novel.n_author ?? ''} - {$Novel.n_name - ?? ''} -
    -
    - - {$Novel.n_description ?? ''} - -
    -
    -
    - {/novel:list} -
    -
    -

    经典推荐

    -
      - {novel:list count="9" sort_type="tuijian" n_status="wanjie" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} -
    • - [{$Novel->n_category ?? ''} - - {$arrGrm[$d_key+4]|raw} - {$Novel->n_name} - - {$Novel->n_author} - -
    • - {/novel:list} -
    -
    -
    - -
    -
    - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName"} -
    -

    {$strCategoryName}

    -
    - - - - {novel:list count="1" n_category="$strCategoryPinyin" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} -
    - {$arrGrm[$d_key+9+10*$start]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -
    -
    {$Novel->n_name} -
    -
    {$Novel.n_description ?? ''}
    -
    - {/novel:list} -
    -
      - {novel:list count="12" n_category="$strCategoryPinyin" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} -
    • - {$arrGrm[$d_key+9+10*$start]|raw} - {$Novel->n_name}/{$Novel->n_author}
    • - {/novel:list} -
    -
    - {/novel:category} -
    -
    - -
    -
    -

    最新入库小说

    -
      - {novel:list count="50" sort_type="news" d_key="d_key" d_val="Novel" p_val="page_data" - cache_life="86400"} -
    • - [{$Novel->n_category ?? ''}] - - {$arrGrm[$d_key+100]|raw} - {$Novel->n_name} - {$Novel->n_author} -
    • - {/novel:list} -
    -
    -
    -

    最近更新小说列表

    - -
    -
    -
    - -{/block} - -{block name="customize"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/Public/allChapterPage.html b/code/app/home/view/default/Public/allChapterPage.html deleted file mode 100644 index b8f1c2e..0000000 --- a/code/app/home/view/default/Public/allChapterPage.html +++ /dev/null @@ -1,38 +0,0 @@ - -{if !empty($resData.p_data.pager)} - -
    - {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="prev"} - {$arrGrm[$key]|raw} - - {$item.label} - - {/eq} - {/volist} - - - - {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="next"} - {$arrGrm[$key]|raw} - - {$item.label} - - {/eq} - {/volist} -
    -{/if} diff --git a/code/app/home/view/default/Public/articleList.html b/code/app/home/view/default/Public/articleList.html deleted file mode 100644 index 4946aeb..0000000 --- a/code/app/home/view/default/Public/articleList.html +++ /dev/null @@ -1,5 +0,0 @@ -
  • -
    - 我真是一条龙 -
    {$key+=1} -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Public/chapterTable.html b/code/app/home/view/default/Public/chapterTable.html deleted file mode 100644 index 5c04f4a..0000000 --- a/code/app/home/view/default/Public/chapterTable.html +++ /dev/null @@ -1,3 +0,0 @@ -
  • - 01 天龙问世 -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Public/chapterTableAll.html b/code/app/home/view/default/Public/chapterTableAll.html deleted file mode 100644 index ec3a545..0000000 --- a/code/app/home/view/default/Public/chapterTableAll.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - - 01 天龙问世 - -
  • -
  • - - 02 沧武的小霸王 - -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Public/footer.html b/code/app/home/view/default/Public/footer.html deleted file mode 100644 index 0a03808..0000000 --- a/code/app/home/view/default/Public/footer.html +++ /dev/null @@ -1,24 +0,0 @@ - \ No newline at end of file diff --git a/code/app/home/view/default/Public/historyNovelList.html b/code/app/home/view/default/Public/historyNovelList.html deleted file mode 100644 index ca5bf18..0000000 --- a/code/app/home/view/default/Public/historyNovelList.html +++ /dev/null @@ -1,19 +0,0 @@ -
  • - -
    -
    - 我真是一条龙 - 耽美百合 - - - 老读者必看公告!!! - - 4天前 - 继续阅读 - -
    -
    - -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Public/novelListH.html b/code/app/home/view/default/Public/novelListH.html deleted file mode 100644 index f594bca..0000000 --- a/code/app/home/view/default/Public/novelListH.html +++ /dev/null @@ -1,19 +0,0 @@ -
  • - 我真是一条龙 - 我真是一条龙 -

    - 我的父亲告诉我,在我出生那一年,天上金光闪耀,隐隐约约中,好像能看到云朵里有条龙在盘旋,紧接着,一道金光照入我们的村子,我便出生了……为寻答案来人间,天龙问世扰乾坤。 - 无情无义闹天下,千军万马赴黄泉。 - 本站提示:各位书友要是觉得《我真是一条龙》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦! -

    -

    - - 作者:兔子很淡定 - - 耽美百合 - - 已完结 -

    -
  • - diff --git a/code/app/home/view/default/Public/novelListRank.html b/code/app/home/view/default/Public/novelListRank.html deleted file mode 100644 index 7b1959c..0000000 --- a/code/app/home/view/default/Public/novelListRank.html +++ /dev/null @@ -1,5 +0,0 @@ -
  • -
    - 我真是一条龙 -
    {$key+=1} -
  • \ No newline at end of file diff --git a/code/app/home/view/default/Public/novelListS.html b/code/app/home/view/default/Public/novelListS.html deleted file mode 100644 index 66bd276..0000000 --- a/code/app/home/view/default/Public/novelListS.html +++ /dev/null @@ -1,10 +0,0 @@ -
  • - - 落魄千金美食发家日常 - 落魄千金美食发家日常 - - 作者:鱼昆子 - - -
  • \ No newline at end of file diff --git a/code/app/home/view/default/User/getBookShelf.html b/code/app/home/view/default/User/getBookShelf.html deleted file mode 100644 index 55a721a..0000000 --- a/code/app/home/view/default/User/getBookShelf.html +++ /dev/null @@ -1,40 +0,0 @@ -{extend name="baseH5" /} -{block name="title"}我的书架{/block} -{block name="keywords"}我的书架{/block} -{block name="description"}我的书架{/block} -{block name='nav-active-class'}home{/block} - - -{block name="body-class"}novel_so{/block} - -{block name='head-name'}{$DomainModel->d_name}{/block} -{block name='head-href'}/{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name} -

    -{/block} - -{block name="main"} - -
    -

    我的书架

    -
    - -
    -
    - - - -{/block} - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/User/getHistory.html b/code/app/home/view/default/User/getHistory.html deleted file mode 100644 index 8bcdcf1..0000000 --- a/code/app/home/view/default/User/getHistory.html +++ /dev/null @@ -1,40 +0,0 @@ -{extend name="baseH5" /} -{block name="title"}我的阅读记录{/block} -{block name="keywords"}我的阅读记录{/block} -{block name="description"}我的阅读记录{/block} - -{block name='nav-active-class'}home{/block} - -{block name="body-class"}novel_so{/block} - -{block name='head-name'}{$DomainModel->d_name}{/block} -{block name='head-href'}/{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name} -

    -{/block} - -{block name="main"} - -
    -

    阅读记录

    -
    - -
    -
    - - - -{/block} - -{block name="customize"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/default/baseH5.html b/code/app/home/view/default/baseH5.html deleted file mode 100644 index ed61ebf..0000000 --- a/code/app/home/view/default/baseH5.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - {block name="title"}{/block} - - - - - - - - {block name="head"}{/block} - {block name="head-css"}{/block} - {block name="head-js"}{/block} - - - - -
    - {block name="logo-html"}{/block} - - -
    - - - -
    - - {block name="nav-html"}{/block} - - {block name="main"} {/block} - -
    -

    - 最新标签 -

    -
    - {site:forgelist count="30" d_key="d_key" d_val="ForgeNovel" cache_life="86400"} - - {$ForgeNovel.n_forge_title} - - {/site:forgelist} - XML地图   - 网站地图 -
    -
    -

    反馈邮箱: - {site:cfg code="YOU_XIANG" encode="false"/} Inc. All Rights Reserved.

    -

    - - - - - - - - - {block name="customize"} - - {/block} - - - {site:cfg code="PUBLIC_TONGJI_CODE" encode="false"/} - - - {$DomainModel->d_statis|raw} - - - \ No newline at end of file diff --git a/code/app/home/view/default/basePc.html b/code/app/home/view/default/basePc.html deleted file mode 100644 index 9ec6e8d..0000000 --- a/code/app/home/view/default/basePc.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - {block name="title"}{/block} - - - - - - - - - - {block name="meta-other"}{/block} - {block name="head"}{/block} - {block name="head-css"}{/block} - {block name="head-js"}{/block} - - - - - -
    -

    {$DomainModel->d_name}

    - -
    - - - {block name="main"} - - {/block} - -
    -
    -

    最新标签

    - -
    -
    - -
    - - - - - - - {block name="customize"} - - {/block} - - - {site:cfg code="PUBLIC_TONGJI_CODE" encode="false"/} - - - {$DomainModel->d_statis|raw} - - - \ No newline at end of file diff --git a/code/app/home/view/default/index.md b/code/app/home/view/default/index.md deleted file mode 100644 index 9e377a4..0000000 --- a/code/app/home/view/default/index.md +++ /dev/null @@ -1,32 +0,0 @@ -630小说模板-资源模板 -源地址: 630zw.org - - - - -domain 表 要加字段 : -1.tdk -分类页面的tdk -d_category_title d_category_keywords d_category_description -排行榜页面的tdk -d_rank_title d_rank_keywords d_rank_description -内容/章节页面的tdk -d_content_title d_content_keywords d_content_description - - -2.详情页面的tdk: -每个域名每个详情页面随机绑定一个设定的tdk模板 - -3.页面路由别名配置:代码里面直接读这个配置渲染,后面就不需要改模板代码里面的挑战地址 -分类路由目录 : d_category_path -详情路由目录 : d_info_path -章节/内容页面路由目录 : d_content_path -排行榜路由目录 : d_rank_path -推荐页面路由目录 : d_recommend_path -kan页面路由目录 : d_kan_path -文章页面路由目录 : d_article_path - -4.这个是为了做某个视频或者某个小说关键词排名设计的 -是否设置详情页面为首页 : d_info_is_index -要设置为首页的小说或者视频资源id : d_info_id - diff --git a/code/app/home/view/default/test/test01/faker.html b/code/app/home/view/default/test/test01/faker.html deleted file mode 100644 index 2b71d63..0000000 --- a/code/app/home/view/default/test/test01/faker.html +++ /dev/null @@ -1,14 +0,0 @@ - - - -{novel:info n_id="$DomainModel->n_id" n_key="arrNovel01" n_forge_id="1125940" /} - {$arrNovel01.n_name} - 首页 - - - - {$arrNovel01.n_description} - - - - - diff --git a/code/app/home/view/default/test/test01/index.html b/code/app/home/view/default/test/test01/index.html deleted file mode 100644 index 5ba0b9d..0000000 --- a/code/app/home/view/default/test/test01/index.html +++ /dev/null @@ -1,108 +0,0 @@ - {site:forgelist count="3" d_key="d_key" d_val="novel" cache_life="1000"} -
  • - Index: {$d_key} - Title: {$novel.n_name} - Author: {$novel.n_category} -
  • -{/site:forgelist} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/app/home/view/haoZi/Index/index.html b/code/app/home/view/haoZi/Index/index.html deleted file mode 100644 index 46ec3ce..0000000 --- a/code/app/home/view/haoZi/Index/index.html +++ /dev/null @@ -1,67 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - 狂雨小说 -

    -{/block} - -{block name="main"} -
    -
    人气推荐
    -
      - {foreach $arrRecommendNovel as $key=>$category} - {include file="Public/novelListS" /} - {/foreach} -
    -
    -
    -
    今日点击
    - {foreach $arrRecommendNovel as $key=>$category} - {if $key == 0} - {include file="Public/novelListH" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendNovel as $key=>$category} - {if $key >= 1} - {include file="Public/novelTextList" /} - {/if} - {/foreach} -
    -
    -
    -
    书友推荐
    - {foreach $arrRecommendNovel as $key=>$category} - {if $key == 0} - {include file="Public/novelListH" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendNovel as $key=>$category} - {if $key >= 1} - {include file="Public/novelTextList" /} - {/if} - {/foreach} -
    -
    -
    -
    最近入库
    -
      - {foreach $arrRecommendNovel as $key=>$category} - {include file="Public/newsUpdateNovelList" /} - {/foreach} -
    -
    -
    -
    最近更新
    -
      - {foreach $arrRecommendNovel as $key=>$category} - {include file="Public/newsUpdateNovelList" /} - {/foreach} -
    -
    -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getNovelCategory.html b/code/app/home/view/haoZi/Novel/getNovelCategory.html deleted file mode 100644 index 14ed519..0000000 --- a/code/app/home/view/haoZi/Novel/getNovelCategory.html +++ /dev/null @@ -1,69 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} - -
    - 首页 - >>分类 - >>小说分类 - 小说列表 -
    - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getNovelChapter.html b/code/app/home/view/haoZi/Novel/getNovelChapter.html deleted file mode 100644 index 153ef98..0000000 --- a/code/app/home/view/haoZi/Novel/getNovelChapter.html +++ /dev/null @@ -1,116 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} -

    - 《满朝文武都能听到我的心声》 -

    -

    101 朕拳打南山敬老院(第1页)

    - -
    -

    当然,在开始修史前,编修们决定给许烟杪做个特训。

    -

    “来,许郎,我问你,你是史官,要记录一件事:皇帝得了一匹烈马,三年过去马仍桀骜,将军为其驯马,短短百日即令马服从,帝问其如何做到,他告知:使马忍渴受训,从人驱遣。”

    -

    许烟杪琢磨了一下,开始下笔。

    -

    ——经过两年的工作环境熏陶,他已经可以相对熟练地使用文言文了。

    -

    “上得烈马,三年不得乘。将军献言:百日可令其驯服。遂使之。果得,上问其由。曰:使马久渴则从人。”

    -

    编修看毕,很是惊喜:“许郎初涉修史,便已摸到精髓了!不错,记史便是越简练越好,‘上得烈马,三年不得乘’,此句便足以超过九成史官!”

    -

    许烟杪眼神清亮:“谢编修!”

    -

    那编修一愣:“你谢我作甚?”

    -

    许烟杪不好意思地笑:“此前我听编修言你们修前朝史已修了十年,便怕我的到来给诸位添麻烦。”

    -

    那编修本来平静的情绪,又微妙起了望不见的波澜。他深深看了许烟杪一眼,本来觉得这白泽过来当个吉祥物,提供正史就可以了,至于史书,编得大差不差就行,反正也不是指望他来做这个的。

    -

    但此刻,编修提笔,在纸上写了一句话:“你来看看。”

    -

    许烟杪探头,就见他写的文字下面,是板板正正的:上得烈马,三年不得乘。将军闻之,以渴服马,解上愁。

    -

    许烟杪眼睛一下子亮了起来。

    -

    他明白了!

    -

    -

    老皇帝进入椒房殿的时候,窦皇后都吓了一跳:“怎这般狼狈!”

    -

    怎么胡子乱糟糟的!衣服也有褶皱了!

    -

    老皇帝骂道:“匹夫!皆是匹夫!”

    -

    然后气冲冲地向窦皇后诉说自己刚才的遭遇:“他们一个个闹着要上吊不算,还言语围攻朕!还捋朕的龙须!朕不想和他们计较,要走,还抓着不让朕走!”

    -

    ——气到‘朕’字都冒出来了。

    -

    窦皇后:“……”

    -

    都把大臣们气到上手抓着皇帝不让他走了……尤其是她家五郎这种暴脾气的皇帝……

    -

    “五郎,你和我说真话。”窦皇后表情一下子严肃起来:“你不会是一气之下,砸了大臣的祖坟吧?”

    -

    她本来是挑严重的说,没想到对面的人诡异地沉默了。

    -

    “……你?”窦皇后的尾音不是很稳。

    -

    老皇帝咳嗽一声:“也没这么严重,比这个轻一点……也不是,轻了一些……呃,总之就是轻了。”

    -

    要不是实在心虚,他也不会只是在老婆面前骂几句这群粗鄙之人不要太过分。

    -

    ——早就让人拖出去打板子了。

    -

    窦皇后:“究竟是何事?”

    -

    老皇帝眼神一漂:“让许烟杪去修周史。”

    -

    窦皇后:“……”

    -

    这和掘人家祖坟也没差多少了。真的怨不得大臣一气之下做出以下犯上的事情。

    -

    但看看丈夫下巴上面被揪得乱糟糟的胡子,窦皇后还是没忍住笑出声。

    -

    老皇帝:“妹子!你又不帮我!”

    -

    窦皇后乐不可支:“你啊,大臣也不是泥捏的,这匹夫一怒……还好只是揪揪胡子,拉着衣服不让你走。”

    -
    - - - - - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getNovelChapterAll.html b/code/app/home/view/haoZi/Novel/getNovelChapterAll.html deleted file mode 100644 index b538d15..0000000 --- a/code/app/home/view/haoZi/Novel/getNovelChapterAll.html +++ /dev/null @@ -1,644 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} -
    - 满朝文武都能听到我的心声 -

    - 满朝文武都能听到我的心声 -

    -

    - - 白色的木 -

    -

    - 其他小说 - 连载中 -

    -

    - 最新章节:第224章 许郎此去光耀万里 -

    -

    最后更新:2024-06-05 17:53:58

    -
    - -
    -
    满朝文武都能听到我的心声 章节列表(第2页)
    -
    - 上一页 - - 下一页 -
    - -
    - 上一页 - - 下一页 -
    -
    - - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getNovelInfo.html b/code/app/home/view/haoZi/Novel/getNovelInfo.html deleted file mode 100644 index 5b7df9b..0000000 --- a/code/app/home/view/haoZi/Novel/getNovelInfo.html +++ /dev/null @@ -1,699 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} -
    - 和扶弟魔老婆离婚后,我直接走上巅峰! -

    - 和扶弟魔老婆离婚后,我直接走上巅峰! -

    -

    - - 天命人悟猴 -

    -

    - 都市小说 - 连载中 -

    -

    - 最新章节:第344章 -

    -

    最后更新:2025-03-20 11:17:50

    -
    - -
    -
    和扶弟魔老婆离婚后,我直接走上巅峰!小说简介
    -
    -

    结婚两年半,妻子为了弟弟掏空家产,甚至拿走给工人的工资!面对妻子赵梦莹胡搅蛮缠的一家人,以及对方的颠倒黑白,许平安一通电话打给以前的战友。他不忍了!一场意外,再次见到高中同学,对方脱胎换骨。许平安也很惊讶,却不知自己是某人心中的白月光。离了赵梦莹,许平安逐渐走向人生巅峰,收获真爱,而前妻却开始死缠烂打。呵呵,他瞧不上! -

    -
    -
    -
    -
    和扶弟魔老婆离婚后,我直接走上巅峰! 最新章节
    - -
    和扶弟魔老婆离婚后,我直接走上巅峰! 章节列表(第1页/100章)
    - -
    - - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getNovelRank.html b/code/app/home/view/haoZi/Novel/getNovelRank.html deleted file mode 100644 index a7cbea2..0000000 --- a/code/app/home/view/haoZi/Novel/getNovelRank.html +++ /dev/null @@ -1,72 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} - -
    - 首页 - >>排行 - >>月排行榜 -
    - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getSearchNovel.html b/code/app/home/view/haoZi/Novel/getSearchNovel.html deleted file mode 100644 index 937a350..0000000 --- a/code/app/home/view/haoZi/Novel/getSearchNovel.html +++ /dev/null @@ -1,37 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} - -
    - "我" - 相关结果: -
    - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getSeoInfo.html b/code/app/home/view/haoZi/Novel/getSeoInfo.html deleted file mode 100644 index 172afb8..0000000 --- a/code/app/home/view/haoZi/Novel/getSeoInfo.html +++ /dev/null @@ -1,29 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - 狂雨小说 -

    -{/block} - -{block name="main"} -
    - -
    -
    -

    深度解说列表

    -
    -
    -
      - {foreach $arrNewsNovel as $key2 => $vo} - {include file="Public/novelListRank" /} - {/foreach} -
    -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Novel/getSeoList.html b/code/app/home/view/haoZi/Novel/getSeoList.html deleted file mode 100644 index 1eadedf..0000000 --- a/code/app/home/view/haoZi/Novel/getSeoList.html +++ /dev/null @@ -1,45 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - 狂雨小说/文章 -

    -{/block} - -{block name="main"} -
    - - - -
    -
    -

    深度解说列表

    -
    -
    -
      - {foreach $arrNewsNovel as $key => $vo} - {include file="Public/novelListRank" /} - - {/foreach} -
    -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/chapterTableAll.html b/code/app/home/view/haoZi/Pc/Public/chapterTableAll.html deleted file mode 100644 index 2e765a4..0000000 --- a/code/app/home/view/haoZi/Pc/Public/chapterTableAll.html +++ /dev/null @@ -1 +0,0 @@ -
    第1912章
    \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/footer.html b/code/app/home/view/haoZi/Pc/Public/footer.html deleted file mode 100644 index adc12bf..0000000 --- a/code/app/home/view/haoZi/Pc/Public/footer.html +++ /dev/null @@ -1,22 +0,0 @@ -
    -
    -
    -

    友情链接

    - -
    -
    -
    -

    - Copyright (C) 2008-2020 All rights reserved -
    - -

    -

    请所有作者发布作品时务必遵守国家互联网信息管理办法规定,我们拒绝任何色情小说,一经发现,即作删除!本站所收录作品、社区、书库评论及本站所做之广告均属其个人行为,与本站立场无关

    -
    -
    - - 返回顶部 - \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/historyNovelList.html b/code/app/home/view/haoZi/Pc/Public/historyNovelList.html deleted file mode 100644 index 07b4640..0000000 --- a/code/app/home/view/haoZi/Pc/Public/historyNovelList.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - 我真是一条龙 - - - 老读者必看公告!!! - - - 兔子很淡定 - - 3天前 - - 已完结 - - 阅读 - 删除 - - \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/hostListImg.html b/code/app/home/view/haoZi/Pc/Public/hostListImg.html deleted file mode 100644 index 9056817..0000000 --- a/code/app/home/view/haoZi/Pc/Public/hostListImg.html +++ /dev/null @@ -1,13 +0,0 @@ - -
    -
    永恒之门 -
    -
    -
    六界三道永恒之门
    -
    关于永恒之门神魔混战,万界崩塌,只永恒仙域长存世间。尘世罹苦,妖祟邪乱,诸神明弃众生而不朽。万古后,一尊名为赵云的战神,凝练了天地玄黄,重铸了宇宙洪荒,自碧落凡尘,一路打上了永恒仙域,以神之名,君临万道。自此,他说的话,便是神话。... -
    -
    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/hostListText.html b/code/app/home/view/haoZi/Pc/Public/hostListText.html deleted file mode 100644 index 5e2b744..0000000 --- a/code/app/home/view/haoZi/Pc/Public/hostListText.html +++ /dev/null @@ -1,7 +0,0 @@ - -
  • - - 步步升云 - - 钓人的鱼 -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/indexCategoryNewsList.html b/code/app/home/view/haoZi/Pc/Public/indexCategoryNewsList.html deleted file mode 100644 index 9f8c3ba..0000000 --- a/code/app/home/view/haoZi/Pc/Public/indexCategoryNewsList.html +++ /dev/null @@ -1 +0,0 @@ -
  • 逆天邪神/火星引力
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/indexCategoryNewsOne.html b/code/app/home/view/haoZi/Pc/Public/indexCategoryNewsOne.html deleted file mode 100644 index ff31541..0000000 --- a/code/app/home/view/haoZi/Pc/Public/indexCategoryNewsOne.html +++ /dev/null @@ -1,10 +0,0 @@ -
    -
    重生巫族,我为盘古立神像
    -
    -
    重生巫族,我为盘古立神像
    -
    关于重生巫族,我为盘古立神像天生万物以养人,人无一物可报天,浩瀚如洪荒世界,在亿万生灵只知
    -
    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/Public/indexNewsUpdateList.html b/code/app/home/view/haoZi/Pc/Public/indexNewsUpdateList.html deleted file mode 100644 index 2dc6664..0000000 --- a/code/app/home/view/haoZi/Pc/Public/indexNewsUpdateList.html +++ /dev/null @@ -1,13 +0,0 @@ - -
  • - [玄幻修真] - - 太荒吞天诀 - - - 第四千一百六十八章 熟悉的气息 - - 铁马飞桥 - 03-20 -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/User/getBookShelf.html b/code/app/home/view/haoZi/Pc/User/getBookShelf.html deleted file mode 100644 index 34efd82..0000000 --- a/code/app/home/view/haoZi/Pc/User/getBookShelf.html +++ /dev/null @@ -1,42 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    - - -
    -
    -

    【阅读记录】列表 最多显示100条

    - -
    -
    -

    热门小说

    - -
    -
    -
    - - - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/User/getHistory.html b/code/app/home/view/haoZi/Pc/User/getHistory.html deleted file mode 100644 index 34efd82..0000000 --- a/code/app/home/view/haoZi/Pc/User/getHistory.html +++ /dev/null @@ -1,42 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    - - -
    -
    -

    【阅读记录】列表 最多显示100条

    - -
    -
    -

    热门小说

    - -
    -
    -
    - - - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getNovelCategory.html b/code/app/home/view/haoZi/Pc/getNovelCategory.html deleted file mode 100644 index afe51d1..0000000 --- a/code/app/home/view/haoZi/Pc/getNovelCategory.html +++ /dev/null @@ -1,54 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} - -
    - -
    -
    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key < 6} {include file="Pc/Public/hostListImg" /} {/if} - {/foreach} -
    -
    - -
    - -
    -

    《玄幻修真》 - 小说列表玄幻修真完本榜

    -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {include file="Pc/Public/indexNewsUpdateList" /} - {/foreach} -
    -
    - -
    -

    最新入库

    -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {include file="Pc/Public/hostListText" /} - {/foreach} -
    -
    - - - -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getNovelChapter.html b/code/app/home/view/haoZi/Pc/getNovelChapter.html deleted file mode 100644 index 72b0d1f..0000000 --- a/code/app/home/view/haoZi/Pc/getNovelChapter.html +++ /dev/null @@ -1,132 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} - -
    -
    -
    - 耗子小说网 - >千里宦途 - >第578章 什么样子 - -
    -
    -

    第578章 什么样子(第1页)

    - -
    - -
    -

    晚上八点钟,冯宇走出孙记私房菜馆,两人没有谈拢,最终不欢而散。

    -

    相比冯宇的满面愁容,洪波则是一脸得意的走出私房菜馆,看着冯宇离开的方向,冷哼一声。

    -

    刚才在包厢里,他故意引导冯宇说出了那天找自己的经过,不但偷录了音,微型摄像头还把冯宇说话的整个过程录了下来。

    -

    “冯宇啊冯宇,要怪就怪出了事你想拿老子顶缸,把老子当傻子,一点实惠没有,还想让老子给你卖命,真以为你一个县委书记秘书有什么了不起,呸。”洪波心里暗骂一声。

    -

    当晚洪波睡得很香,冯宇则是辗转反侧,到天亮的时候才眯了一会。

    -

    早晨,洪波并没去上班,而是直接开车去了市区。

    -

    冯宇顶着熊猫眼来到了县委,杨志看了他一眼,眉头紧锁了起来。

    -

    他一直对形象十分重视,所以要求身边的人也要随时随地保持自己的形象。

    -

    冯宇以前都做得很好,可是今天早晨却是头发混乱,眼圈十分重,一副无精打采的样子。

    -

    冯宇将刚沏好的茶放在杨志面前。

    -

    杨志看了他一眼,道:“冯宇,如果你觉得在我身边压力过大,我可以把你调到轻松的部门。”

    -

    本来无精打采的冯宇,听到杨志的话,瞬间身体打了一个激灵,立刻开口说道:“杨书记,我没事,我没感觉到压力,在您身边在我的荣幸,你的批评是对我的鞭策,我一定把工作做好……”

    -

    冯宇紧张的说了很多,直到杨志摆了一下手,他的话才戛然而止。

    -

    “你看看你今天的形象,昨晚去干嘛了?没睡觉吗?”杨志问道。

    -

    冯宇看着杨志,这几天他承受了十分巨大的压力,此时终于有点扛不住了。

    -

    “杨书记,我……”冯宇红了眼圈,一个大男人想要落泪。

    -

    不知道是真的,还是演的,反正效果不错,杨志看到落泪的冯宇,明显语气变得温和起来:“什么事,还能让你一个县委书记的秘书急得落泪?”

    -

    “杨书记,我犯了错误。”冯宇低头说道。

    -

    他扛不住了,不如跟杨志说实话,不然等市纪委下来调查,他的结果可能更惨。

    -

    “说。”杨志喝了口茶,说道。

    -

    “杨书记,上次您让我给小羊饼干加把火,于是我就找了……”冯宇把事情详细的讲了一遍,最后说道:“阳城县那边已经把许强秘密抓捕了,可能很快就能查到咱们县住建局洪波头上,可是这几天我跟他谈了好几次,洪波都不愿意把事情扛下来。” -

    -

    “甚至他还威胁我,只要市纪委找到他,他就立刻把我供出来,当时我说只要你把事情扛下来,书记您会想办法让他的处分最小,保住他的党籍和级别,等沉寂几年,未来还能重新起复。”

    -

    “洪波还是没松口,他说……”冯宇变得犹犹豫豫起来。

    -

    “说什么?”杨志问道。

    -

    明知后面的话可能不太好听,但是他还是问了。

    -

    “他说杨书记你还是管好自己,上次就被王子枫玩得团团……”

    -

    砰!

    -

    转字还没有说出口,冯宇就听到杨志生气的拍了桌子。

    -
    - -
    -
    - - - - -{/block} - -{block name="customize"} {/block} - -{block name="footer-js"} - - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getNovelChapterAll.html b/code/app/home/view/haoZi/Pc/getNovelChapterAll.html deleted file mode 100644 index 9cc3cf2..0000000 --- a/code/app/home/view/haoZi/Pc/getNovelChapterAll.html +++ /dev/null @@ -1,180 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    -
    - -
    -
    -
    -
    《武裂苍穹》正文目录
    -
    上一页下一页 -
    - {foreach $arrNovelChapterAll as $category} - {include file="Pc/Public/chapterTableAll" /} - {/foreach} -
    返回《武裂苍穹》第一页
    -
    上一页下一页
    -
    -
    -
    - - - - -
    - -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getNovelInfo.html b/code/app/home/view/haoZi/Pc/getNovelInfo.html deleted file mode 100644 index 0cb544f..0000000 --- a/code/app/home/view/haoZi/Pc/getNovelInfo.html +++ /dev/null @@ -1,269 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    -
    -
    -
    -
    -

    剑出霜满城

    -

    作者:馀杯    状态:连载中

    -

    分类:玄幻修真        加入书架 -         章节目录

    -

    最新章节:第1912章

    -

    更新时间:2025-03-25 09:08:59

    -
    - -
    - -
    -
    -
    -
    -
    《剑出霜满城》最新章节
    - {foreach $arrRecommendNovel as $category} - {include file="Pc/Public/chapterTableAll" /} - {/foreach} - -
    《剑出霜满城》正文目录
    - {foreach $arrRecommendNovel as $category} - {include file="Pc/Public/chapterTableAll" /} - {/foreach} -
    >> 查看《剑出霜满城》更多章节列表 <<
    -
    -
    -
    - -
    书友推荐:私吻蝴蝶骨袅袅春腰吃了肉,就不能吃我了女神攻略手册触手怪她只想生存逐澳游戏没你就不行之新征途望门娇媳无敌六皇子认知性偏差以你为名的夏天古代猎户的养家日常一品红人官道之权势滔天青花冷(先婚后爱H)官途,搭上女领导之后!蝶变见微知著(弟妹 H)替身男配只想赚钱龙凤猪旅行团开局揭皇榜,皇后竟是我亲娘官途,搭上女领导之后!升迁之路格格党官道征途:从跟老婆离婚开始零度小说网权力巅峰:从城建办主任开始官梯险情相亲认错人,闪婚千亿女总裁二嫁好孕,残疾世子宠疯了神站文学网不乖官路女人香学姐蓄意勾引深入浅出九一书库仙帝重生,我有一个紫云葫芦财阀小甜妻:老公,乖乖宠我空白在综艺直播里高潮不断七八中文网官运,挖笋挖出个青云之路!精英小说网为夫体弱多病迟音(1v1)大秦第一熊孩子看奇中文网通房撩人,她掏空世子金库要跑路酒厂卧底的我成了boss三五文学我靠读书成圣人落尘小说网万人迷她千娇百媚[穿书]超级仙学院大明:我只想做一个小县令啊官场:从读心术开始崛起魔蝎小说逆袭人生,从绝境走向权力巅峰清穿后被康熙巧取豪夺了装疯卖傻三年,从边疆开始崛起神站完本官阶,从亲子鉴定平步青云!逆袭人生,从绝境走向权力巅峰寒门官路2:权变前妻太撩人:傅总把持不住了落尘小说铅笔小说网强宠上瘾,病娇大小姐求放过重生大画家,有系统就是任性笔看阁野性缠绵斗罗里的藤虎一笑合欢宗双修日常看书网燕尔(古言1v1)天医出狱出狱后,首富老公逼我生三胎笔笔趣小说异界最强赘婿边疆来了个娇媳妇[年代]一问小说网阁笔趣官阶,从亲子鉴定平步青云!一天花掉四百亿之后[足球]小药店通古今,我暴富不难吧?笔趣阁前门村的留守妇女秘书太厉害,倾城女领导直呼受不了笔下文学驾崩百年,朕成了暴君的白月光我和我妈的那些事儿(无绿修改)合欢御女录荒岛狂龙三五小说薄太太今天又被扒马甲了三A小说网顶点小说恶霸文学叭叭小说BL小说末世对照组:大佬带全系异能守护华夏哥哥爱上的女神邪帝轻点爱:腹黑鬼医狂妃人生如局不良娇妻:老师,晚上好亮剑:开局拿下鬼子据点豪门后妈在娃综靠反向贴贴爆火了签到十年,我成圣了诡墓密码绝世废柴狂妃锦鲤娇妻:摄政王宠妻手册反派崽崽不好养,山神外挂上大分吾弟大秦第一纨绔玄学崽崽五岁半,这家没我都得散穿越之娇俏小甜妻完本神站两小无猜凡人之我为厉天尊穿越七零:撩最强男神养傲娇的崽天剑神帝苟在四合院捡漏正道潜龙天域苍穹只想当侯爷,奈何妻妾想打天下萌宠甜心:恶魔少爷深深吻开局父母祭天,她带空间养家致富祁同伟:学生时代开始签到关系重回2009,从不当舔狗开始透骨欢爱欲之潮NP直上青云深度补习>上流社会共享女友镇龙棺,阎王命上瘾禁忌爱欲之潮假千金身世曝光,玄学大佬杀疯了臣服议事桌上的官途:权力巅峰开局手搓歼10,被女儿开去航展曝光了!关于我哥和我男朋友互换身体这件事村野流香万人嫌的大师兄重生后,天道跪舔落伍文学神医毒妃腹黑宝宝镇南王女总裁的贴身高手重返1987携空间嫁山野糙汉,暴富荒年官运,挖笋挖出个青云之路!修仙暴徒九龙乾坤诀官道雄途镇国狂龙盖世狂龙天剑神帝婚后热恋宦海官途:从撞破上司好事开始苟着苟着我成了反派真爱狂医下山,都市我为王官道升天官道之破局闪婚女领导后,我一路青云直上快穿之我在年代文里抱大腿帝剑天玄诀闪婚夜,残疾老公站起来了师娘,你真美迟音官妻太荒吞天诀乡村绝色村姑九天剑主春漾穿成虐文主角后我和霸总he了日复一日真千金霸气归来,五个哥哥磕头认错机娘世界,校花老师要上天了农门医女:我带着全家致富了大明:诏狱讲课,老朱偷听人麻了四合院:带着娄晓娥提前躺平蛟龙出渊,十个师姐又美又飒!被骂赔钱货,看我种田跑商成富婆悟性逆天:模型机悟出龙警3000!脱下她的情趣内衣山雨欲来离婚后,渣爹做梦都在偷妈咪小夫人奶又甜,大叔彻底失了控我委身病娇反派后,男主黑化了图谋不轨七零甜蜜蜜,糙汉宠翻小辣媳末世:开局疯狂囤物资,美女急哭了千亿总裁宠妻成狂病弱太子妃超凶的医妃她日日想休夫放开她,让我来财阀小娇妻:叔,你要宠坏我了!财阀小娇妻:叔,你要宠坏我了!搬空敌人珍藏后,疯批王爷我罩了!
    - - - -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getNovelRank.html b/code/app/home/view/haoZi/Pc/getNovelRank.html deleted file mode 100644 index f954f83..0000000 --- a/code/app/home/view/haoZi/Pc/getNovelRank.html +++ /dev/null @@ -1,54 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} - -
    - -
    -
    - {foreach $arrNewsNovelRankNovel as $key=>$Novel} - {if $key < 6} {include file="Pc/Public/hostListImg" /} {/if} - {/foreach} -
    -
    - -
    - -
    -

    《玄幻修真》 - 小说列表玄幻修真完本榜

    -
      - {foreach $arrNewsNovelRankNovel as $key=>$Novel} - {include file="Pc/Public/indexNewsUpdateList" /} - {/foreach} -
    -
    - -
    -

    最新入库

    -
      - {foreach $arrNewsNovelRankNovel as $key=>$Novel} - {include file="Pc/Public/hostListText" /} - {/foreach} -
    -
    - - - -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getSearchNovel.html b/code/app/home/view/haoZi/Pc/getSearchNovel.html deleted file mode 100644 index 1bca516..0000000 --- a/code/app/home/view/haoZi/Pc/getSearchNovel.html +++ /dev/null @@ -1,46 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}boy{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} - -
    - - -
    - -
    -

    '玄幻修真' - 相关搜索结果

    -
      - {foreach $arrSearchNovel as $key=>$Novel} - {include file="Pc/Public/indexNewsUpdateList" /} - {/foreach} -
    -
    - -
    -

    最新入库

    -
      - {foreach $arrSearchNovel as $key=>$Novel} - {include file="Pc/Public/hostListText" /} - {/foreach} -
    -
    - - - -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getSeoInfo.html b/code/app/home/view/haoZi/Pc/getSeoInfo.html deleted file mode 100644 index 172afb8..0000000 --- a/code/app/home/view/haoZi/Pc/getSeoInfo.html +++ /dev/null @@ -1,29 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - 狂雨小说 -

    -{/block} - -{block name="main"} -
    - -
    -
    -

    深度解说列表

    -
    -
    -
      - {foreach $arrNewsNovel as $key2 => $vo} - {include file="Public/novelListRank" /} - {/foreach} -
    -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/getSeoList.html b/code/app/home/view/haoZi/Pc/getSeoList.html deleted file mode 100644 index 423dc98..0000000 --- a/code/app/home/view/haoZi/Pc/getSeoList.html +++ /dev/null @@ -1,89 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    - - -
    - -
    - - - -
    -
    - - -
    - -
    -
    -
      -
    1. -
        -
      • 分类
      • -
      • 书名
      • -
      • 描述
      • -
      • 作者
      • -
      • 更新时间
      • -
      -
    2. - {foreach $arrNewsNovel as $key=>$Novel} - {if $key >= 1} - {include file="Pc/Public/indexNewsUpdateList" /} - {/if} - {/foreach} -
    -
    -
    -
    - - -
    - - -
    - -
    - -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Pc/index.html b/code/app/home/view/haoZi/Pc/index.html deleted file mode 100644 index 71794c6..0000000 --- a/code/app/home/view/haoZi/Pc/index.html +++ /dev/null @@ -1,144 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    -
    -
    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key < 4} {include file="Pc/Public/hostListImg" /} {/if} {/foreach} -
    -
    -

    经典推荐

    -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key > 3} - {include file="Pc/Public/hostListText" /} - {/if} - {/foreach} -
    -
    -
    -
    -
    -
    -

    玄幻魔法

    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key == 0} - {include file="Pc/Public/indexCategoryNewsOne" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key >= 1} - {include file="Pc/Public/indexCategoryNewsList" /} - {/if} - {/foreach} -
    -
    -
    -

    武侠修真

    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key == 0} - {include file="Pc/Public/indexCategoryNewsOne" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key >= 1} - {include file="Pc/Public/indexCategoryNewsList" /} - {/if} - {/foreach} -
    -
    -
    -

    都市言情

    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key == 0} - {include file="Pc/Public/indexCategoryNewsOne" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key >= 1} - {include file="Pc/Public/indexCategoryNewsList" /} - {/if} - {/foreach} -
    -
    -
    -
    -
    -
    -

    穿越小说

    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key == 0} - {include file="Pc/Public/indexCategoryNewsOne" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key >= 1} - {include file="Pc/Public/indexCategoryNewsList" /} - {/if} - {/foreach} -
    -
    -
    -

    网游动漫

    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key == 0} - {include file="Pc/Public/indexCategoryNewsOne" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key >= 1} - {include file="Pc/Public/indexCategoryNewsList" /} - {/if} - {/foreach} -
    -
    -
    -

    科幻小说

    - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key == 0} - {include file="Pc/Public/indexCategoryNewsOne" /} - {/if} - {/foreach} -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {if $key >= 1} - {include file="Pc/Public/indexCategoryNewsList" /} - {/if} - {/foreach} -
    -
    -
    -
    -
    -
    -

    最近更新小说列表

    -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {include file="Pc/Public/indexNewsUpdateList" /} - {/foreach} -
    -
    -
    -

    最新入库小说

    -
      - {foreach $arrRecommendSerializationNovel as $key=>$Novel} - {include file="Pc/Public/hostListText" /} - {/foreach} -
    -
    -
    -
    -
    - {/block} - - {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/chapterTable.html b/code/app/home/view/haoZi/Public/chapterTable.html deleted file mode 100644 index 9f93359..0000000 --- a/code/app/home/view/haoZi/Public/chapterTable.html +++ /dev/null @@ -1,3 +0,0 @@ -
  • - 01 天龙问世 -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/chapterTableAll.html b/code/app/home/view/haoZi/Public/chapterTableAll.html deleted file mode 100644 index c296f50..0000000 --- a/code/app/home/view/haoZi/Public/chapterTableAll.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - - 01 天龙问世 - -
  • -
  • - - 02 沧武的小霸王 - -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/footer.html b/code/app/home/view/haoZi/Public/footer.html deleted file mode 100644 index 727e92e..0000000 --- a/code/app/home/view/haoZi/Public/footer.html +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/historyNovelList.html b/code/app/home/view/haoZi/Public/historyNovelList.html deleted file mode 100644 index ca5bf18..0000000 --- a/code/app/home/view/haoZi/Public/historyNovelList.html +++ /dev/null @@ -1,19 +0,0 @@ -
  • - -
    -
    - 我真是一条龙 - 耽美百合 - - - 老读者必看公告!!! - - 4天前 - 继续阅读 - -
    -
    - -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/newsUpdateNovelList.html b/code/app/home/view/haoZi/Public/newsUpdateNovelList.html deleted file mode 100644 index 65baad0..0000000 --- a/code/app/home/view/haoZi/Public/newsUpdateNovelList.html +++ /dev/null @@ -1,4 +0,0 @@ -
  • [03-20] -

    夏野堂

    -

    万人嫌师兄被魔尊掳走後

    -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/novelListH.html b/code/app/home/view/haoZi/Public/novelListH.html deleted file mode 100644 index 7840ca8..0000000 --- a/code/app/home/view/haoZi/Public/novelListH.html +++ /dev/null @@ -1,11 +0,0 @@ - -
    - 1 - - 医道官途 -

    医道官途

    -

    帷赫其他小说

    -

    天才中医凌游,在大学毕业后为逝世的爷爷回村守孝三年,并且继承了爷爷生前经营的医馆三七堂。

    -
    \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/novelListRank.html b/code/app/home/view/haoZi/Public/novelListRank.html deleted file mode 100644 index bab7f32..0000000 --- a/code/app/home/view/haoZi/Public/novelListRank.html +++ /dev/null @@ -1,17 +0,0 @@ -
  • - - 满朝文武都能听到我的心声 - -

    - 满朝文武都能听到我的心声 -

    -

    - 白色的木 -

    -

    *古代奇幻轻小说坏消息许烟杪穿越回古代了,而他本人四肢不勤五谷不分,专业还是对古...

    -

    - 最新:第224章许郎此去光耀万里 -

    -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/novelListS.html b/code/app/home/view/haoZi/Public/novelListS.html deleted file mode 100644 index 567a8d2..0000000 --- a/code/app/home/view/haoZi/Public/novelListS.html +++ /dev/null @@ -1,8 +0,0 @@ - -
  • - - 绝品风流狂医 -

    绝品风流狂医

    - 花开彼岸 -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/Public/novelTextList.html b/code/app/home/view/haoZi/Public/novelTextList.html deleted file mode 100644 index 929889c..0000000 --- a/code/app/home/view/haoZi/Public/novelTextList.html +++ /dev/null @@ -1,4 +0,0 @@ -
  • 2 -

    咸鱼继母日常

    -

    明栀

    -
  • \ No newline at end of file diff --git a/code/app/home/view/haoZi/User/getBookShelf.html b/code/app/home/view/haoZi/User/getBookShelf.html deleted file mode 100644 index 1cb5922..0000000 --- a/code/app/home/view/haoZi/User/getBookShelf.html +++ /dev/null @@ -1,32 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} -
    -
    《阅读记录》最多显示100条,请收藏至书架
    - - - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/User/getHistory.html b/code/app/home/view/haoZi/User/getHistory.html deleted file mode 100644 index 1cb5922..0000000 --- a/code/app/home/view/haoZi/User/getHistory.html +++ /dev/null @@ -1,32 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} -
    -
    《阅读记录》最多显示100条,请收藏至书架
    - - - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/User/index.html b/code/app/home/view/haoZi/User/index.html deleted file mode 100644 index e37fe98..0000000 --- a/code/app/home/view/haoZi/User/index.html +++ /dev/null @@ -1,60 +0,0 @@ -{extend name="baseH5User" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="head-name"}用户中心{/block} -{block name="main"} -
    -
    -
    - -
    - -
    - -
    - 123456 -
    -
    -
    -
      -
    • 经验0
    • -
    • 积分0
    • -
    • 推荐票0
    • -
    -
    - -
    - -
    - - - -
    -
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/haoZi/baseH5.html b/code/app/home/view/haoZi/baseH5.html deleted file mode 100644 index 7e17dad..0000000 --- a/code/app/home/view/haoZi/baseH5.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - 耗子小说网_最值得收藏的热门小说阅读网 - - - - - - - - - - - - - - - -
    - - - - - {block name="main"} {/block} - -
    - - - - - - - \ No newline at end of file diff --git a/code/app/home/view/haoZi/baseH5User.html b/code/app/home/view/haoZi/baseH5User.html deleted file mode 100644 index 9206c2d..0000000 --- a/code/app/home/view/haoZi/baseH5User.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - 狂雨小说 - - - - - - -
    -
    - - {block name="main"} {/block} - -
    - - - - - - \ No newline at end of file diff --git a/code/app/home/view/haoZi/basePc.html b/code/app/home/view/haoZi/basePc.html deleted file mode 100644 index 1dfbb52..0000000 --- a/code/app/home/view/haoZi/basePc.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - 耗子小说网_最值得收藏的热门小说阅读网 - - - - - - - - - - - - - - - - - - - -
    - - - {block name="main"} {/block} - - - - {block name="customize"}{/block} - - {block name="footer-js"} {/block} - - - - \ No newline at end of file diff --git a/code/app/home/view/haoZi/basePcUser.html b/code/app/home/view/haoZi/basePcUser.html deleted file mode 100644 index ddab4dd..0000000 --- a/code/app/home/view/haoZi/basePcUser.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - 狂雨小说 - - - - -
    -
    - - - -
    -
    -
    - -
    -
    -
    - -
    -
    123456
    -
    -
      -
    • - - 经验:0 -
    • -
    • - - 积分:0 -
    • -
    • - - - 推荐票:0 -
    • -
    -
    -
    -

    - - 关注中心 -

    - -

    - - 设置 -

    - -
    - - {block name="main"} {/block} -
    - - - - - - - - \ No newline at end of file diff --git a/code/app/home/view/haoZi/index.md b/code/app/home/view/haoZi/index.md deleted file mode 100644 index 3a3526e..0000000 --- a/code/app/home/view/haoZi/index.md +++ /dev/null @@ -1,2 +0,0 @@ -耗子小说网模板 -源地址: https://hzpxw.net/ \ No newline at end of file diff --git a/code/app/home/view/kuangYu/baseH5.html b/code/app/home/view/kuangYu/baseH5.html deleted file mode 100644 index a0e6c67..0000000 --- a/code/app/home/view/kuangYu/baseH5.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - {block name="title"}{/block} - - - - - - - - - - {block name="head"}{/block} - {block name="head-css"}{/block} - {block name="head-js"}{/block} - - - - -
    - {block name="logo-html"}{/block} - - - - - - -
    - - - - - - - - {block name="main"} {site:wz wz="主内容" /}{/block} - - {include file="public/footer" /} - - {block name="customize"}{/block} - - - - - - - - - - {block name="footer-js"}{/block} - - - {site:cfg code="PUBLIC_TONGJI_CODE" encode="false"/} - - - {$DomainModel->d_statis|raw} - - - - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/baseH5User.html b/code/app/home/view/kuangYu/baseH5User.html deleted file mode 100644 index 303dc20..0000000 --- a/code/app/home/view/kuangYu/baseH5User.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - {$strTitle??''} - - - - {block name="head"}{/block} - {block name="head-css"}{/block} - {block name="head-js"}{/block} - - - - -
    -
    - - {block name="main"} {/block} - -
    - - - - - - {site:cfg code="PUBLIC_TONGJI_CODE" encode="false"/} - - - {$DomainModel->d_statis|raw} - - - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/basePc.html b/code/app/home/view/kuangYu/basePc.html deleted file mode 100644 index 75f9ac1..0000000 --- a/code/app/home/view/kuangYu/basePc.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - {block name="title"}{/block} - - - - - - - {block name="head"}{/block} - {block name="head-css"}{/block} - {block name="head-js"}{/block} - - - - -{block name="strPageCode"} - -{/block} - - - - -
    -
    - {block name="logo-html"}{/block} - -
    - - -
    -
    -
    - - - {block name="main"} {/block} - - {block name="customize-footer-after"}{/block} - - {include file="pc/public/footer" /} - - {block name="customize"}{/block} - - - - - - - - - - {block name="footer-js"}{/block} - - - {site:cfg code="PUBLIC_TONGJI_CODE" encode="false"/} - - - {$DomainModel->d_statis|raw} - - - - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/basePcUser.html b/code/app/home/view/kuangYu/basePcUser.html deleted file mode 100644 index 0295dd7..0000000 --- a/code/app/home/view/kuangYu/basePcUser.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - {$strTitle??''} - - - - {block name="head"}{/block} - {block name="head-css"}{/block} - {block name="head-js"}{/block} - - - - -
    -
    - - - -
    -
    -
    - -
    -
    -
    - -
    -
    123456
    -
    -
      -
    • - - 经验:0 -
    • -
    • - - 积分:0 -
    • -
    • - - - 推荐票:0 -
    • -
    -
    -
    -

    - - 关注中心 -

    - -

    - - 设置 -

    - -
    - - {block name="main"} {/block} -
    - - - - - - - - {site:cfg code="PUBLIC_TONGJI_CODE" encode="false"/} - - - {$DomainModel->d_statis|raw} - - - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/index/index.html b/code/app/home/view/kuangYu/index/index.html deleted file mode 100644 index 1215d01..0000000 --- a/code/app/home/view/kuangYu/index/index.html +++ /dev/null @@ -1,165 +0,0 @@ -{extend name="baseH5" /} -{block name="title"}{site:replace code="INDEX@INDEX@TITLE"}{/block} -{block name="keywords"}{site:replace code="INDEX@INDEX@KEYWORDS"}{/block} -{block name="description"}{site:replace code="INDEX@INDEX@DESCRIPTION"}{/block} -{block name="head"} - - - - - - - - -{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name}-{$DomainModel->d_text_logo} -

    -{/block} - -{block name="main"} - -{site:grm page_code="h5_index" diff="0" num="60" g_key="arrGrm" /} - - -
    - -
    -
    -
    -
    - -

    {$DomainModel->d_index_description}

    - - - - -
    -
    -

    热门小说

    -
    -

    {site:replace code="INDEX_POPULAR_NOVELS"}

    -
    -
      - {novel:list count="8" sort_type="tuijian" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="public/novelListS" start="0"/} - {/novel:list} -
    -
    -
    - - -
    -
    -

    最新小说

    -
    -

    {site:replace code="INDEX_NEWS_NOVELS"}

    - -
    -
      - {novel:list count="8" sort_type="news" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="public/novelListH" start="9"/} - {/novel:list} -
    -
    -
    - - -
    -
    -

    小说排行榜

    -
    -

    {site:replace code="INDEX_RANK_NOVELS"}

    - -
    -
      -
    1. 日排榜
    2. -
    3. 周排榜
    4. -
    5. 月排榜
    6. -
    7. 完结榜
    8. -
    -
    - -
    -
    -
      - {novel:list count="8" n_category="xuanhuan-xiuzhen" sort_type="news" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="public/novelListH" start="17"/} - {/novel:list} -
    -
    -
    - - - - - - -
    - - -

    {$DomainModel->d_description}

    -
    -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getArticleInfo.html b/code/app/home/view/kuangYu/novel/getArticleInfo.html deleted file mode 100644 index 649fb51..0000000 --- a/code/app/home/view/kuangYu/novel/getArticleInfo.html +++ /dev/null @@ -1,36 +0,0 @@ -{extend name="baseH5" /} -{block name="title"}{$strTitle??''}{/block} -{block name="keywords"}{$strKeywords??''}{/block} -{block name="description"}{$strDescription??''}{/block} -{block name="head"} - - - - - - - - {/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name}-{$DomainModel->d_text_logo} -

    -{/block} - -{block name="main"} -
    - -article......... -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getArticleList.html b/code/app/home/view/kuangYu/novel/getArticleList.html deleted file mode 100644 index a78d589..0000000 --- a/code/app/home/view/kuangYu/novel/getArticleList.html +++ /dev/null @@ -1,64 +0,0 @@ -{extend name="baseH5" /} -{block name="title"}{$strTitle??''}{/block} -{block name="keywords"}{$strKeywords??''}{/block} -{block name="description"}{$strDescription??''}{/block} -{block name="head"} - - - - - - - - {/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name}-{$DomainModel->d_text_logo}/文章 -

    -{/block} - -{block name="main"} -
    - - - -
    -
    -

    深度解说列表

    -
    -
    -
      - {foreach $arrNewsNovel as $key => $vo} - {include file="public/articleList" /} - - {/foreach} -
    -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getLibrary.html b/code/app/home/view/kuangYu/novel/getLibrary.html deleted file mode 100644 index 811a0ed..0000000 --- a/code/app/home/view/kuangYu/novel/getLibrary.html +++ /dev/null @@ -1,194 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETLIBRARY@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETLIBRARY@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETLIBRARY@DESCRIPTION"}{/block} - -{block name="head"} - - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - - -{/if} - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - -{/if} - -{/block} - -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name}-{$Request.route.strGender}{$Request.route.strCategory}{$Request.route.strStatus}免费阅读 -

    -{/block} - -{block name="strPageCode"} - -{/block} - -{block name="main"} - -{novel:pagerexp page="$Request.get.page" limit="30" -n_category="$Request.route.strCategory" -n_sex="$Request.route.strGender" -n_status="$Request.route.strStatus" -d_key="d_key" -button_num="10" cache_life="86400" func="generateCategoryPager" export_name="resData" /} - -{site:grm page_code="pc_novel_library" diff="$resData.p_data.page" num="70" g_key="arrGrm" /} - -
    -

    {site:replace code="NOVEL@GETLIBRARY@DESCRIPTION"}

    - - - -
    -
    - -
    -
    -
      - -
    • - 全部 -
    • - {if $Request.route.strGender == "all" || $Request.route.strGender == ""} - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName"} -
    • - {$strCategoryName} -
    • - {/novel:category} - {/if} - - {eq name="$Request.route.strGender" value="$strNanUrl"} - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName" n_sex="man"} -
    • - {$strCategoryName} -
    • - {/novel:category} - {/eq} - - {eq name="$Request.route.strGender" value="$strNvUrl"} - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName" n_sex="women"} -
    • - {$strCategoryName} -
    • - {/novel:category} - {/eq} - - -
    -
    -
    - -
    -
    -
    -
    -
      - {volist name="$resData.data" id="Novel" key="key"} - {include file="public/novelListH" start="0"/} - {/volist} -
    -
    - -
    -
      - {volist name="$resData.p_data.pager" id="vo" key="k"} - {switch $vo.label} - {case value="上一页"} - {if $resData.p_data.page == 1} -
    • «
    • - {else} -
    • «
    • - {/if} - {/case} - {case value="下一页"} - {if $resData.p_data.page >= $resData.p_data.total} -
    • »
    • - {else} -
    • »
    • - {/if} - {/case} - {/switch} - {/volist} -
    -
    -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getNovelCatalog.html b/code/app/home/view/kuangYu/novel/getNovelCatalog.html deleted file mode 100644 index 2457b52..0000000 --- a/code/app/home/view/kuangYu/novel/getNovelCatalog.html +++ /dev/null @@ -1,162 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELCATALOG@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCATALOG@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCATALOG@DESCRIPTION"}{/block} - -{block name="head"} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{site:grm page_code="h5_novel_catalog " diff="$Request.url" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} - -{chapter:pagerexp page="$Request.route.intPage" limit="100" n_id="$Request.route.intNovelId" d_key="d_key" d_val="chapter" -cache_life="86400" button_num="3" sort_type="$Request.route.strOrder" func="generateChapterPager" export_name="resData" /} - -
    - - - -
    - {$arrGrm[0]|raw} -
    -

    {$arrNovel['n_name']}章节目录 - {$arrNovel['n_author']} - {$DomainModel->d_name} 第{$Request.route.intPage}页

    -
    - - -
    - - {include file="public/allChapterPage" start="0"/} - -
      - {volist name="resData.data" id="Chapter" key="key"} -
    • - {$arrGrm[$key]|raw} - {$Chapter.c_name} -
    • - {/volist} -
    - - - {include file="public/allChapterPage" /} -
    -
    -
    -
    - - -
    - - -{/block} - - - diff --git a/code/app/home/view/kuangYu/novel/getNovelChannel.html b/code/app/home/view/kuangYu/novel/getNovelChannel.html deleted file mode 100644 index a9a2899..0000000 --- a/code/app/home/view/kuangYu/novel/getNovelChannel.html +++ /dev/null @@ -1,113 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELCHANNEL@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCHANNEL@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCHANNEL@DESCRIPTION"}{/block} - -{block name="head"} -param('strChannel'); - -?> - - - - - - - -{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - {eq name="strPageCode" value="man"} - {$DomainModel->d_name}-男生小说免费阅读 - {else} - {$DomainModel->d_name}-女生小说免费阅读 - {/eq} -

    -{/block} - -{block name="main"} - -{site:grm page_code="pc_index" diff="0" num="50" g_key="arrGrm" /} - - -
    - -

    {site:replace code="NOVEL@GETNOVELCHANNEL@DESCRIPTION"}

    - - - - -
    -
    -

    热门推荐

    -
    -
    -
      - {novel:list count="8" sort_type="tuijian" n_status="lianzai" n_sex="$strPageCode" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="public/novelListS" start="0"/} - {/novel:list} -
    -
    -
    -
    -
    -

    完结推荐

    -
    -
    -
      - {novel:list count="8" sort_type="tuijian" n_status="wanjie" n_sex="$strPageCode" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="public/novelListS" start="13"/} - {/novel:list} -
    -
    -
    -
    -
    -

    最近更新

    -
    -
    -
      - {novel:list count="8" sort_type="update" n_sex="$strPageCode" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="public/novelListH" start="21"/} - {/novel:list} -
    -
    -
    - -
    -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getNovelChapter.html b/code/app/home/view/kuangYu/novel/getNovelChapter.html deleted file mode 100644 index 8059e84..0000000 --- a/code/app/home/view/kuangYu/novel/getNovelChapter.html +++ /dev/null @@ -1,403 +0,0 @@ - - - - - {site:grm page_code="h5_novel_chapter" diff="$Request.url" num="20" g_key="arrGrm" /} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{chapter:info n_id="$Request.route.intNovelId" c_sort_num="$Request.route.intChapterSort" -c_page="$Request.route.intChapterPage" c_key="arrChapter" /} - - - - - - - - - - {site:replace code="NOVEL@GETNOVELCHAPTER@TITLE"} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {$arrGrm[0]|raw} - - {$arrGrm[1]|raw} -
    - -
    - -

    下拉阅读上一章

    -
    - {$arrGrm[2]|raw} -
    - {if $arrChapter.c_sort_num == 1 } - {$arrGrm[3]|raw} - 上一章 - {elseif $arrChapter['pre_chapter'] && $arrChapter['pre_chapter']['c_sort_num']} - {$arrGrm[4]|raw} - 上一章 - {/if} - - {if $arrChapter.next_chapter && $arrChapter.next_chapter.c_sort_num} - 下一章 - {/if} - -
    -
    -
    - - -
    -
    - {$arrGrm[5]|raw} -
    - {if $arrChapter.c_sort_num == 1} - 上一章 - {elseif $arrChapter['pre_chapter'] && $arrChapter['pre_chapter']['c_sort_num']} - 上一章 - {/if} - - {if $arrChapter.next_chapter && $arrChapter.next_chapter.c_sort_num} - 下一章 - {/if} - - - -
    - -
    - - 你刚刚阅读到这里 -

    1/1

    -
    - {$arrGrm[6]|raw} -
    -
    - - - 返回 - - -
    - - -
    -
    - 加入书架 - -
    - -
    - -
    -
    -
    - -
    -
      -
    • - - -
    • -
    • - - -
    • -
    • - - -
    • -
    • - - -
    • -
    -
    -
    -
      -
    • - - -
    • -
    • - - -
    • -
    -
    -
    - {$arrGrm[8]|raw} - -
    - {$arrGrm[7]|raw} - - - - - - - - - - - - - {block name="footer-js"} - - {/block} - - {$arrGrm[10]|raw} - - - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getNovelInfo.html b/code/app/home/view/kuangYu/novel/getNovelInfo.html deleted file mode 100644 index f90fcfd..0000000 --- a/code/app/home/view/kuangYu/novel/getNovelInfo.html +++ /dev/null @@ -1,274 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELINFO@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELINFO@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELINFO@DESCRIPTION"}{/block} - -{block name="head"} - -{if $Request.route.intNovelId} -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{else} -{novel:info n_id="$DomainModel->info_id" n_key="arrNovel" n_forge_id="0" /} -{/if} -{site:grm page_code="h5_novel_info" diff="$arrNovel.n_id" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-js"}{/block} - -{block name="logo-html"} - -{/block} - -{block name="main"} -
    - - - - -
    - {$arrGrm[0]|raw} -
    -
    -
    - {$arrNovel['n_name'] ?? ''}小说封面 - {$arrNovel.n_author}最新章节 - - 已完结 -
    -
    -

    {$arrNovel['n_name']}

    -

    - 分类:{$arrNovel.n_category} - 作者:{$arrNovel.n_author} - - 阅读:{$arrNovel.arrNovelClicks.total} -

    -
    -
    - {$arrGrm[1]|raw} -
    - -
    -
    - {$arrGrm[3]|raw} -
    -

    - {$arrNovel.n_description ?? ''} -

    -
    -
    -
    -
    - - -
    -
    -
    -

    最新要点

    -
    - {$arrGrm[4]|raw} -
    -
    -

    - {$arrNovel.strFocus} -

    -

    相邻推荐: - {volist name="arrNovel.n_forge_novel" id="ForgeNovel" key="key"} - {$arrGrm[$key+20]|raw} - {$ForgeNovel.n_forge_title} - {/volist} -

    -
    -
    - - -
    -
    - - -
    -
    -

    {$arrNovel.n_name}最新章节

    -
    -
    -
      - {chapter:list count="10" sort_type="dao" n_id="$arrNovel.n_id" d_key="d_key" d_val="Chapter" cache_life="86400"} -
    • - {$arrGrm[$key]|raw} - {$Chapter.c_name} -
    • - {/chapter:list} - -
    - -
    -
    - -
    -
    -

    同类作品

    -
    -
    - -
    -
    -
    - - - -{/block} - -{block name="customize"} - - -{/block} - -{block name="footer-js"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getNovelRank.html b/code/app/home/view/kuangYu/novel/getNovelRank.html deleted file mode 100644 index f955ee5..0000000 --- a/code/app/home/view/kuangYu/novel/getNovelRank.html +++ /dev/null @@ -1,173 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELRANK@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELRANK@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELRANK@DESCRIPTION"}{/block} - -{block name="head"} - - - - - - - -{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name}--排行榜最新免费阅读 -

    -{/block} - -{block name="strPageCode"} - -{/block} - - -{block name="main"} - -{site:grm page_code="h5_rank" diff="0" num="100" g_key="arrGrm" /} - -
    -

    {site:replace code="NOVEL@GETNOVELRANK@DESCRIPTION"}

    - - - -
    -
    -

    日点击榜

    -
    -
    -
      - {novel:ranklist count="10" sort_type="daily" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 1} - {include file="public/novelListH" start="0"/} - {/if} - {if $key >= 2} - {include file="public/novelListRank" start="1"/} - {/if} - - {/novel:ranklist} -
    -
    -
    - -
    -
    -

    周点击榜

    -
    -
    -
      - {novel:ranklist count="10" sort_type="weekly" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 1} - {include file="public/novelListH" start="10"/} - {/if} - {if $key >= 2} - {include file="public/novelListRank" start="11"/} - {/if} - - {/novel:ranklist} -
    -
    -
    - -
    -
    -

    月点击榜

    -
    -
    -
      - {novel:ranklist count="10" sort_type="monthly" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 1} - {include file="public/novelListH" start="20"/} - {/if} - {if $key >= 2} - {include file="public/novelListRank" start="21"/} - {/if} - - {/novel:ranklist} -
    -
    -
    - -
    -
    -

    总点击榜

    -
    -
    -
      - {novel:ranklist count="10" sort_type="total" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 1} - {include file="public/novelListH" start="30"/} - {/if} - {if $key >= 2} - {include file="public/novelListRank" start="31"/} - {/if} - {/novel:ranklist} -
    -
    -
    - -
    -
    -

    新书榜

    -
    -
    -
      - {novel:ranklist count="10" sort_type="total" n_status="lianzai" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 1} - {include file="public/novelListH" start="40"/} - {/if} - {if $key >= 2} - {include file="public/novelListRank" start="41"/} - {/if} - {/novel:ranklist} -
    -
    -
    - -
    -
    -

    完结榜

    -
    -
    -
      - {novel:ranklist count="10" sort_type="total" n_status="wanjie" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 1} - {include file="public/novelListH" start="50"/} - {/if} - {if $key >= 2} - {include file="public/novelListRank" start="51"/} - {/if} - {/novel:ranklist} -
    -
    -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/novel/getSearchNovel.html b/code/app/home/view/kuangYu/novel/getSearchNovel.html deleted file mode 100644 index 0f81602..0000000 --- a/code/app/home/view/kuangYu/novel/getSearchNovel.html +++ /dev/null @@ -1,105 +0,0 @@ -{extend name="baseH5" /} - -{block name="title"}{site:replace code="NOVEL@GETSEARCHNOVEL@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETSEARCHNOVEL@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETSEARCHNOVEL@DESCRIPTION"}{/block} - -{block name="head"} - - - - - - - - - - - - - -{/block} - -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - {$DomainModel->d_name}-{$DomainModel->d_text_logo} -

    -{/block} - -{block name="main"} - -{novel:pagerexp page="$Request.get.page" limit="30" -key="$Request.get.keyword" -d_key="d_key" -d_val="Novel" -p_val="page_data" button_num="10" cache_life="86400" func="generateSearchPager" export_name="resData" /} - -{site:grm page_code="h5_novel_search" diff="$Request.url" num="30" g_key="arrGrm" /} - -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getArticleInfo.html b/code/app/home/view/kuangYu/pc/getArticleInfo.html deleted file mode 100644 index 2f067e4..0000000 --- a/code/app/home/view/kuangYu/pc/getArticleInfo.html +++ /dev/null @@ -1,38 +0,0 @@ -{extend name="basePc" /} -{block name="title"}{$strTitle??''}{/block} -{block name="keywords"}{$strKeywords??''}{/block} -{block name="description"}{$strDescription??''}{/block} -{block name="head"} - - - - - - - - {/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="main"} - -
    article.......
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getArticleList.html b/code/app/home/view/kuangYu/pc/getArticleList.html deleted file mode 100644 index 3e46d23..0000000 --- a/code/app/home/view/kuangYu/pc/getArticleList.html +++ /dev/null @@ -1,105 +0,0 @@ -{extend name="basePc" /} -{block name="title"}{$strTitle??''}{/block} -{block name="keywords"}{$strKeywords??''}{/block} -{block name="description"}{$strDescription??''}{/block} -{block name="head"} - - - - - - - - {/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} -{block name="main"} -
    - - -
    - -
    - - - -
    -
    - - -
    - -
    -
    -
      -
    1. -
        -
      • 分类
      • -
      • 书名
      • -
      • 描述
      • -
      • 作者
      • -
      • 更新时间
      • -
      -
    2. - {foreach $arrNewsNovel as $key=>$Novel} - {include file="pc/public/articleList" /} - {/foreach} -
    -
    -
    -
    - - -
    - - -
    - -
    - -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getKanNovelInfo.html b/code/app/home/view/kuangYu/pc/getKanNovelInfo.html deleted file mode 100644 index 3570b81..0000000 --- a/code/app/home/view/kuangYu/pc/getKanNovelInfo.html +++ /dev/null @@ -1,267 +0,0 @@ -{extend name="basePc" /} -{block name="title"}{$strTitle??''}{/block} -{block name="keywords"}{$strKeywords??''}{/block} -{block name="description"}{$strDescription??''}{/block} -{block name="head"} - - - - - - - - - - - - - - - - - - - - - - - -{/block} -{block name="head-css"} - -{/block} -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} -{block name="main"} -
    - - -
    -
    - -
    - -

    - 作者:{$arrNovel.n_author} - 创建日期:{$arrNovel.n_update_time} -

    -
    -

    简介

    -
    -

    - {$arrNovel.n_description}

    - 展开 - -
    -
    -
    -

    最新要点

    -
    -

    - {$strFocus}

    - 展开 - -
    -
    -
    - {if !empty($arrChapter)} - 立即阅读 - 目录 - {/if} -
    - -
    -
    -
    -
    -

    小说信息

    -

    类别: - - - {$arrNovel.n_category} - -

    - -

    总点击量:{$arrNovelClicks.total}

    -

    月点击量:{$arrNovelClicks.monthly}

    -

    周点击量:{$arrNovelClicks.weekly}

    -

    日点击量:{$arrNovelClicks.daily}

    - -
    - -
    -
    - -
    -
    -
    -
    -

    最新章节

    -
    -
    - {volist name="arrChapter" id="Chapter" key="key"} -

    - {$Chapter.c_name} - {$Chapter.created_at ?? '1天前'} - -

    -

    - {/volist} -
    -
    -
    -

    相邻推荐:

    -
    -
    - {volist name="arrNovel.n_forge_novel" id="ForgeNovel" key="key"} - - {$ForgeNovel.n_forge_title} - {/volist} - -
    -
    - -
    -
    -

    精品推荐

    - -
    -
    -
    -
    - -{/block} - -{block name="customize"} - -{/block} - -{block name="footer-js"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getLibrary.html b/code/app/home/view/kuangYu/pc/getLibrary.html deleted file mode 100644 index 77464ab..0000000 --- a/code/app/home/view/kuangYu/pc/getLibrary.html +++ /dev/null @@ -1,213 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETLIBRARY@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETLIBRARY@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETLIBRARY@DESCRIPTION"}{/block} - -{block name="head"} - - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - - -{/if} - - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - -{/if} - -{/block} -{block name="head-js"}{/block} - -{block name="head-css"} - -{if $Request.route.strGender == 'all' && $Request.route.strCategory == 'all' && $Request.route.strStatus == 'all'} - -{else} - -{/if} - -{/block} -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="strPageCode"} - -{/block} - -{block name="main"} - -{novel:pagerexp page="$Request.get.page" limit="30" -n_category="$Request.route.strCategory" -n_sex="$Request.route.strGender" -n_status="$Request.route.strStatus" -d_key="d_key" -button_num="10" cache_life="86400" func="generateCategoryPager" export_name="resData" /} - -{site:grm page_code="pc_novel_library" diff="$resData.p_data.page" num="70" g_key="arrGrm" /} - -
    - - -
    -
    -
    - 6 - {$Request.route.strGender} - 5 - 所属频道 - -
    -
    - 所属分类 -
      -
    • - 全部 -
    • - {if $Request.route.strGender == "all" || $Request.route.strGender == ""} - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName"} -
    • - {$strCategoryName} -
    • - {/novel:category} - {/if} - - {eq name="$Request.route.strGender" value="$strNanUrl"} - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName" n_sex="man"} -
    • {$strCategoryName}
    • - {/novel:category} - {/eq} - - {eq name="$Request.route.strGender" value="$strNvUrl"} - {novel:category d_key="strCategoryPinyin" d_val="strCategoryName" n_sex="women"} -
    • {$strCategoryName}
    • - {/novel:category} - {/eq} -
    -
    -
    - 是否完结 - -
    -
    -
    - - - -
    -
      - {volist name="$resData.data" id="Novel" key="key"} - {include file="pc/public/shukuNovelList" start="0"/} - {/volist} -
    - -
    -
      - {volist name="$resData.p_data.pager" id="vo" key="k"} - {switch $vo.label} - {case value="上一页"} - {if $resData.p_data.page == 1} -
    • «
    • - {else} - « - {/if} - {/case} - {case value="下一页"} - {if $resData.p_data.page >= $resData.p_data.total} -
    • »
    • - {else} -
    • »
    • - {/if} - {/case} - {case value="..."} -
    • ...
    • - {/case} - {default /} - {if preg_match('/^\d+$/', $vo.label)} -
    • - {$vo.label} -
    • - {/if} - {/switch} - {/volist} -
    -
    - -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getNovelCatalog.html b/code/app/home/view/kuangYu/pc/getNovelCatalog.html deleted file mode 100644 index f1c0d8d..0000000 --- a/code/app/home/view/kuangYu/pc/getNovelCatalog.html +++ /dev/null @@ -1,153 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELCATALOG@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCATALOG@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCATALOG@DESCRIPTION"}{/block} - -{block name="head"} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{site:grm page_code="pc_novel_catalog" diff="$Request.url" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-css"} - -{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} -{block name="main"} - -{chapter:pagerexp page="$Request.route.intPage" limit="100" n_id="$Request.route.intNovelId" d_key="d_key" d_val="chapter" -cache_life="86400" button_num="3" sort_type="$Request.route.strOrder" func="generateChapterPager" export_name="resData" /} - -
    - - -
    - - -
    - -
    章节列表
    - - - {include file="pc/public/allChapterPage" /} - -
    -
      - {foreach $resData.data as $key => $Chapter } -
    • - {$arrGrm[$key]|raw} -

      - {$Chapter.c_name} -

      -
    • - {/foreach} -
    -
    - - - {include file="pc/public/allChapterPage" /} -
    -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getNovelChannel.html b/code/app/home/view/kuangYu/pc/getNovelChannel.html deleted file mode 100644 index 6cf625d..0000000 --- a/code/app/home/view/kuangYu/pc/getNovelChannel.html +++ /dev/null @@ -1,150 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELCHANNEL@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELCHANNEL@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELCHANNEL@DESCRIPTION"}{/block} - -{block name="strPageCode"} - param('strChannel'); ?> -{/block} - -{block name="head"} - -param('strChannel'); - -?> - - - - - - - - -{/block} - -{block name="head-css"} - -{eq name="strPageCode" value="man"} - -{else} - -{/eq} - -{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="main"} - -{site:grm page_code="pc_index" diff="0" num="50" g_key="arrGrm" /} - -
    - - - - -
    -
    - -

    热门推荐

    - -
    -
      - {novel:list count="12" sort_type="tuijian" n_status="lianzai" n_sex="$strPageCode" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="pc/public/endNovelList" start="0"/} - {/novel:list} -
    -
    -
    - - -
    - - - - -
    -
    -

    完本推荐

    -
    -
      - {novel:list count="8" sort_type="tuijian" n_status="wanjie" n_sex="$strPageCode" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - - {include file="pc/public/endNovelList" start="13"/} - {/novel:list} -
    -
    - -
    - -
    - -
    -
    - -

    作品更新

    - -
    -
    -
    -
      -
    1. -
        -
      • 类别
      • -
      • 书名
      • -
      • 最新更新章节
      • -
      • 作者
      • -
      • 更新时间
      • -
      -
    2. - {novel:list count="30" sort_type="update" n_sex="$strPageCode" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} - {include file="pc/public/indexNewsUpdateList" start="21"/} - {/novel:list} -
    -
    -
    -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getNovelChapter.html b/code/app/home/view/kuangYu/pc/getNovelChapter.html deleted file mode 100644 index 27c0a3d..0000000 --- a/code/app/home/view/kuangYu/pc/getNovelChapter.html +++ /dev/null @@ -1,423 +0,0 @@ - - - - {site:grm page_code="pc_novel_chapter" diff="$Request.url" num="20" g_key="arrGrm" /} - -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{chapter:info n_id="$Request.route.intNovelId" c_sort_num="$Request.route.intChapterSort" -c_page="$Request.route.intChapterPage" c_key="arrChapter" /} - - - - - - - {site:replace code="NOVEL@GETNOVELCHAPTER@TITLE"} - - - - {block name="head-css"} - - {/block} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {$arrGrm[0]|raw} -
    -
    -
    -
    - - -
    - {$arrGrm[1]|raw} - -
    -
    -
    - 首页 - - {if $arrNovel.n_category_sex_en && $arrNovel.n_category_sex_en == 'man'} - {$arrGrm[15]|raw} - - 男生 - - {$arrGrm[14]|raw} - - {$arrNovel.n_category} - {else} - 女生 - - {$arrGrm[13]|raw} - {$arrNovel.n_category} - {/if} - - {$arrGrm[12]|raw} - {$arrNovel.n_name} -
    -
    -
    -
    -
    -
    -

    - - {$arrNovel.n_name} - - {$arrChapter.c_name} -

    -
    -
    - {$arrGrm[11]|raw} - - {$arrNovel.n_name} - {$arrNovel.n_author} - 2000 - {$arrChapter.created_at ?? - ''} -
    -
    -
    -
    - {if $arrChapter && $arrChapter.c_content} - - {/if} -
    -
    -
    - -
    - -
    - {if $arrChapter && $arrChapter.c_sort_num && $arrChapter.c_sort_num == 1} - 上一章 - {else} - {$arrGrm[10]|raw} - 上一章 - {/if} - | - {if $arrChapter.next_chapter && $arrChapter.next_chapter.c_sort_num} - {$arrGrm[9]|raw} - 下一章 - {/if} -
    -
    -
    -
    -
    -
    -
    - {$arrGrm[8]|raw} - - 目录 - -
    -
    - - 设置 - -
    -
    - {$arrGrm[7]|raw} - - 书架 - -
    -
    - {$arrGrm[6]|raw} - - 详情 - -
    -
    - {$arrGrm[5]|raw} - - - -
    -
    -
    - - -
    -
    -
    - {$arrGrm[2]|raw} - - - - - - - - - - {$arrGrm[19]|raw} - - - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getNovelInfo.html b/code/app/home/view/kuangYu/pc/getNovelInfo.html deleted file mode 100644 index 5d87783..0000000 --- a/code/app/home/view/kuangYu/pc/getNovelInfo.html +++ /dev/null @@ -1,292 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELINFO@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELINFO@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELINFO@DESCRIPTION"}{/block} - - -{block name="head"} - -{if $Request.route.intNovelId} -{novel:info n_id="$Request.route.intNovelId" n_key="arrNovel" n_forge_id="0" /} -{else} -{novel:info n_id="$DomainModel->info_id" n_key="arrNovel" n_forge_id="0" /} -{/if} -{site:grm page_code="pc_novel_info" diff="$arrNovel.n_id" num="120" g_key="arrGrm" /} - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="head-css"} - -{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="strPageCode"} - -{/block} - -{block name="main"} - -
    - - -
    -
    - -
    - -

    - 作者:{$arrNovel.n_author} - 创建日期:{$arrNovel.n_update_time} -

    -
    -

    简介

    -
    -

    - {$arrNovel.n_description ?? ''}

    - 展开 - -
    -
    -
    -

    最新要点

    -
    -

    - {$arrNovel.strFocus}

    - 展开 - -
    -
    - - -
    -
    -
    -
    -

    小说信息

    -

    类别: - - {$arrNovel.n_category} - -

    - -

    总点击量:{$arrNovel.arrNovelClicks.total}

    -

    月点击量:{$arrNovel.arrNovelClicks.monthly}

    -

    周点击量:{$arrNovel.arrNovelClicks.weekly}

    -

    日点击量:{$arrNovel.arrNovelClicks.daily}

    - -
    - -
    -
    - -
    -
    -
    -
    -

    最新章节

    -
    -
    - {chapter:list count="12" sort_type="dao" n_id="$arrNovel.n_id" d_key="key" d_val="Chapter" cache_life="86400"} -

    - {$arrGrm[$key]|raw} - {$Chapter.c_name} - {$Chapter.created_at ?? '1天前'} - -

    -

    - {/chapter:list} -
    -
    -
    -

    相邻推荐:

    -
    -
    - {volist name="arrNovel.n_forge_novel" id="ForgeNovel" key="key"} - {if $key<20 } {$arrGrm[$key+20]|raw} {/if} {$ForgeNovel.n_forge_title} - {/volist} - -
    -
    - -
    -
    -

    精品推荐

    -
      - {novel:list count="6" n_category="$arrNovel.n_category_pinyin" n_status="wanjie" d_key="key" d_val="Novel" p_val="page_data" cache_life="86400"} -
    • -

      - {$arrGrm[$key+10]|raw} - - {$Novel['n_name'] ?? ''} - -

      -
      - - {$Novel['n_name'] ?? ''} - -
      - {$Novel['n_author'] ?? ''} - {$Novel['n_category'] ?? ''} -

      - {$Novel['n_description'] ?? ''}

      -
      -
      -
    • - {/novel:list} -
    -
    -
    -
    -
    - -{/block} - -{block name="customize"} - -{/block} - -{block name="footer-js"} - - -{/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getNovelRank.html b/code/app/home/view/kuangYu/pc/getNovelRank.html deleted file mode 100644 index 76f2eea..0000000 --- a/code/app/home/view/kuangYu/pc/getNovelRank.html +++ /dev/null @@ -1,215 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETNOVELRANK@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETNOVELRANK@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETNOVELRANK@DESCRIPTION"}{/block} - -{block name="head"} - - - - - - - -{/block} - -{block name="head-css"} - -{/block} -{block name="head-js"}{/block} -{block name='body-class'}body-rank-class{/block} -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="strPageCode"} - -{/block} - -{block name="main"} - -{site:grm page_code="h5_rank" diff="0" num="100" g_key="arrGrm" /} - -
    - - - - -
    -
    -
    -

    日点击榜

    -
    -
    -
    -
      - {novel:ranklist count="10" sort_type="daily" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 0} - {include file="pc/public/indexBoyRankOne" start="0"/} - {/if} - {if $key >= 1} - {include file="pc/public/indexBoyRankList" start="1"/} - {/if} - {/novel:ranklist} -
    -
    - -
    -
    -
    -
    -

    周点击榜

    -
    -
    -
    -
      - {novel:ranklist count="10" sort_type="weekly" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 0} - {include file="pc/public/indexBoyRankOne" start="10"/} - {/if} - {if $key >= 1} - {include file="pc/public/indexBoyRankList" start="11"/} - {/if} - {/novel:ranklist} -
    -
    - -
    -
    -
    -
    -

    月点击榜

    -
    -
    -
    -
      - {novel:ranklist count="10" sort_type="monthly" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 0} - {include file="pc/public/indexBoyRankOne" start="20"/} - {/if} - {if $key >= 1} - {include file="pc/public/indexBoyRankList" start="21"/} - {/if} - {/novel:ranklist} -
    -
    - -
    -
    -
    -
    -

    总点击榜

    -
    -
    -
    -
      - {novel:ranklist count="10" sort_type="total" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 0} - {include file="pc/public/indexBoyRankOne" start="30"/} - {/if} - {if $key >= 1} - {include file="pc/public/indexBoyRankList" start="31"/} - {/if} - {/novel:ranklist} -
    -
    - -
    -
    -
    -
    -

    连载榜

    -
    -
    -
    -
      - {novel:ranklist count="10" sort_type="total" n_status="lianzai" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 0} - {include file="pc/public/indexBoyRankOne" start="40"/} - {/if} - {if $key >= 1} - {include file="pc/public/indexBoyRankList" start="41"/} - {/if} - {/novel:ranklist} -
    -
    - -
    -
    -
    -
    -

    完结榜

    -
    -
    -
    -
      - {novel:ranklist count="10" sort_type="total" n_status="wanjie" d_key="key" d_val="Novel" cache_life="1000"} - {if $key == 0} - {include file="pc/public/indexBoyRankOne" start="50"/} - {/if} - {if $key >= 1} - {include file="pc/public/indexBoyRankList" start="51"/} - {/if} - {/novel:ranklist} -
    -
    - -
    -
    -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/getSearchNovel.html b/code/app/home/view/kuangYu/pc/getSearchNovel.html deleted file mode 100644 index a9cecc7..0000000 --- a/code/app/home/view/kuangYu/pc/getSearchNovel.html +++ /dev/null @@ -1,120 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="NOVEL@GETSEARCHNOVEL@TITLE"}{/block} -{block name="keywords"}{site:replace code="NOVEL@GETSEARCHNOVEL@KEYWORDS"}{/block} -{block name="description"}{site:replace code="NOVEL@GETSEARCHNOVEL@DESCRIPTION"}{/block} - -{block name="head"} - - - - - - - - - - - - - -{/block} - -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="main"} - -{novel:pagerexp page="$Request.get.page" limit="30" -key="$Request.get.keyword" -d_key="d_key" -d_val="Novel" n_num="total" -p_val="page_data" button_num="10" cache_life="86400" func="generateSearchPager" export_name="resData" /} - -{site:grm page_code="pc_novel_search" diff="$Request.url" num="30" g_key="arrGrm" /} - -
    -
    - -
    -

    {$Request.get.keyword}搜索结果 - {$DomainModel->d_name} 第{$Request.get.page}页

    -
    - - 搜索“{$Request.get.keyword}”相关结果共有 {$resData.p_data.total} 部小说 -
    -
    -
    - -
    - {if empty($resData.data)} -

    没有相关数据

    - {else} -
      - {foreach $resData.data as $key=>$Novel} - {include file="pc/public/shukuNovelList" start="0"/} - {/foreach} -
    - {/if} - -
    -
      - {volist name="resData.p_data.pager" id="vo" key="k"} - {switch $vo.label} - {case value="上一页"} - {if $resData.p_data.page == 1} -
    • «
    • - {else} -
    • «
    • - {/if} - {/case} - {case value="下一页"} - {if $resData.p_data.page >= $resData.p_data.total} -
    • »
    • - {else} -
    • »
    • - {/if} - {/case} - {case value="..."} -
    • ...
    • - {/case} - {default /} - {if preg_match('/^\d+$/', $vo.label)} -
    • - {$vo.label} -
    • - {/if} - {/switch} - {/volist} -
    -
    - -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/index.html b/code/app/home/view/kuangYu/pc/index.html deleted file mode 100644 index 5a6114a..0000000 --- a/code/app/home/view/kuangYu/pc/index.html +++ /dev/null @@ -1,303 +0,0 @@ -{extend name="basePc" /} - -{block name="title"}{site:replace code="INDEX@INDEX@TITLE"}{/block} -{block name="keywords"}{site:replace code="INDEX@INDEX@KEYWORDS"}{/block} -{block name="description"}{site:replace code="INDEX@INDEX@DESCRIPTION"}{/block} - -{block name="head-css"} - -{/block} -{block name="head"} - - - - - - - -{/block} -{block name="head-js"}{/block} - -{block name="strPageCode"} - -{/block} - -{block name="logo-html"} -

    - - {$DomainModel->d_name}-{$DomainModel->d_text_logo} - -

    -{/block} - -{block name="main"} - -{site:grm page_code="pc_index" diff="0" num="150" g_key="arrGrm" /} - -
    - -

    {$DomainModel->d_index_description}

    - -
    - {novel:pagerexp page="1" limit="13" -sort_type="tuijian" -n_status="lianzai" -d_key="d_key" -button_num="10" cache_life="86400" func="generateCategoryPager" export_name="resData" /} - -
    -
    -
      - {volist name="$resData.data" id="Novel" key="key"} - {if $key < 6} {include file="pc/public/swiperListImg" start="1" /} {/if} - {/volist} -
    -
    -
      - {volist name="$resData.data" id="Novel" key="key"} - {if $key < 6} {include file="pc/public/swiperListText" /} {/if} {/volist} -
    -
    - {volist name="$resData.data" id="Novel" key="key"} - {if $key == 1} -

    - {$arrGrm[1]|raw} - - {$Novel.n_name ?? ''} - -

    -

    {$Novel.n_description ?? ''}

    - {/if} - {/volist} -
    -
    -
    - {volist name="$resData.data" id="Novel" key="key"} - {if $key > 5 && $key < 10} {include file="pc/public/hostListImg" start="5" /} {/if} {/volist} - {volist - name="$resData.data" id="Novel" key="key" } {if $key> 9 } - {$arrGrm[$key+9]|raw} - {include file="pc/public/hostListText" start="9"/} - {/if} - {/volist} - -
    -
    - -
    -
    - -

    完本推荐

    - -
    -
      - {novel:list count="12" sort_type="tuijian" n_status="wanjie" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {include file="pc/public/endNovelList" start="13" /} - {/novel:list} -
    -
    - - - - - -
    -
    - -

    男生频道

    - -
    - {novel:list count="1" n_sex="man" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {include file="pc/public/indexBoyNewsOne" start="25" /} - {/novel:list} -
    -
      - {novel:list count="4" n_sex="man" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {include file="pc/public/indexBoyNewsList" start="26" /} - {/novel:list} -
    -
    -
    -

    - 排行榜 - - - -

    -
    -
      - {novel:list count="10" n_sex="man" sort_type="update" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {if $d_key == 1} - {include file="pc/public/indexBoyRankOne" start="30"/} - {/if} - {if $d_key >= 2} - {include file="pc/public/indexBoyRankList" start="31"/} - {/if} - {/novel:list} -
    - 查看更多 -
    - - -
    -
    - - - -
    -
    - -

    女生频道

    - -
    - {novel:list count="1" n_sex="women" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {include file="pc/public/indexBoyNewsOne" start="55"/} - {/novel:list} -
    -
      - {novel:list count="4" n_sex="women" sort_type="news" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {include file="pc/public/indexBoyNewsList" start="56"/} - {/novel:list} -
    -
    -
    -

    - 排行榜 - - - -

    -
    -
      - {novel:list count="10" n_sex="women" sort_type="update" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {if $d_key == 1} - {include file="pc/public/indexBoyRankOne" start="59"/} - {/if} - {if $d_key >= 2} - {include file="pc/public/indexBoyRankList" start="60"/} - {/if} - {/novel:list} -
    - 查看更多 -
    - - -
    -
    - -
    - -
    - -
    -
    - -

    作品更新

    - -
    -
    -
    -
      -
    1. -
        -
      • 类别
      • -
      • 书名
      • -
      • 最新更新章节
      • -
      • 作者
      • -
      • 更新时间
      • -
      -
    2. - {novel:list count="30" sort_type="update" d_key="d_key" d_val="Novel" - p_val="page_data" cache_life="86400"} - {include file="pc/public/indexNewsUpdateList" start="70"/} - {/novel:list} -
    -
    -
    -
    - -

    {$DomainModel->d_description}

    -
    -{/block} - -{block name="customize-footer-after"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/adBanner.html b/code/app/home/view/kuangYu/pc/public/adBanner.html deleted file mode 100644 index fe9b569..0000000 --- a/code/app/home/view/kuangYu/pc/public/adBanner.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/code/app/home/view/kuangYu/pc/public/allChapterPage.html b/code/app/home/view/kuangYu/pc/public/allChapterPage.html deleted file mode 100644 index 7cb2e8c..0000000 --- a/code/app/home/view/kuangYu/pc/public/allChapterPage.html +++ /dev/null @@ -1,34 +0,0 @@ -{if !empty($resData.p_data.pager)} -
    - {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="prev"} - - {$item.label} - - {/eq} - {/volist} - - - - {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="next"} - - {$item.label} - - {/eq} - {/volist} -
    -{/if} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/articleList.html b/code/app/home/view/kuangYu/pc/public/articleList.html deleted file mode 100644 index d2fe72b..0000000 --- a/code/app/home/view/kuangYu/pc/public/articleList.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/endNovelList.html b/code/app/home/view/kuangYu/pc/public/endNovelList.html deleted file mode 100644 index 15fc07d..0000000 --- a/code/app/home/view/kuangYu/pc/public/endNovelList.html +++ /dev/null @@ -1,14 +0,0 @@ -
  • - {$arrGrm[$key+[start]]|raw} -

    - - {$Novel->n_name ?? ''}- {$Novel.n_category ?? ''}最新章节在线免费阅读 - -

    -
    -

    {$Novel->n_name ?? ''}

    - {$Novel->n_author ?? ''} -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/footer.html b/code/app/home/view/kuangYu/pc/public/footer.html deleted file mode 100644 index 55728d0..0000000 --- a/code/app/home/view/kuangYu/pc/public/footer.html +++ /dev/null @@ -1,33 +0,0 @@ -
    -
    -
    -

    友情链接

    - -
    -
    -
    -

    - Copyright (C) 2008-2025 All rights reserved -
    - -

    -

    请所有作者发布作品时务必遵守国家互联网信息管理办法规定,我们拒绝任何色情小说,一经发现,即作删除!本站所收录作品、社区、书库评论及本站所做之广告均属其个人行为,与本站立场无关!

    -

    删除邮箱:{site:cfg code="YOU_XIANG" encode="false"/}

    -
    -
    - - 返回顶部 - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/hostListImg.html b/code/app/home/view/kuangYu/pc/public/hostListImg.html deleted file mode 100644 index 26fc40e..0000000 --- a/code/app/home/view/kuangYu/pc/public/hostListImg.html +++ /dev/null @@ -1,14 +0,0 @@ - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/hostListText.html b/code/app/home/view/kuangYu/pc/public/hostListText.html deleted file mode 100644 index df44eba..0000000 --- a/code/app/home/view/kuangYu/pc/public/hostListText.html +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/indexBoyNewsList.html b/code/app/home/view/kuangYu/pc/public/indexBoyNewsList.html deleted file mode 100644 index 17ac3aa..0000000 --- a/code/app/home/view/kuangYu/pc/public/indexBoyNewsList.html +++ /dev/null @@ -1,19 +0,0 @@ -
  • - -

    - {$arrGrm[$key+[start]]|raw} - - {$Novel->n_name ?? ''} - -

    -
    - {$Novel->n_author ?? ''} - {$Novel->n_category ?? ''} - - {$Novel->n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -

    {$Novel->n_description ?? ''}

    -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/indexBoyNewsOne.html b/code/app/home/view/kuangYu/pc/public/indexBoyNewsOne.html deleted file mode 100644 index 93d48ce..0000000 --- a/code/app/home/view/kuangYu/pc/public/indexBoyNewsOne.html +++ /dev/null @@ -1,24 +0,0 @@ -
    - -

    - {$arrGrm[$key+[start]]|raw} - - {$Novel.n_name ?? ''}

    - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -
    - 作者:{$Novel->n_author ?? ''} - 分类: - {$Novel->n_category ?? ''} - - - 进度:{$Novel->n_status ?? ''} - 总点击:{$Novel->og_novel_click ?? 0} -
    -

    {$Novel->n_description ?? ''}

    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/indexBoyRankList.html b/code/app/home/view/kuangYu/pc/public/indexBoyRankList.html deleted file mode 100644 index 2963c9c..0000000 --- a/code/app/home/view/kuangYu/pc/public/indexBoyRankList.html +++ /dev/null @@ -1,23 +0,0 @@ -
  • - - {$key+=1} -

    - {$arrGrm[$key+[start]]|raw} - - {$Novel.n_name ?? ''} - -

    -
    - - {$Novel.n_name ?? ''} - -
    - 作者:{$Novel->n_author ?? ''} - 类别: - {$Novel->n_category ?? ''} - -

    {$Novel->n_description ?? ''}

    -
    -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/indexBoyRankOne.html b/code/app/home/view/kuangYu/pc/public/indexBoyRankOne.html deleted file mode 100644 index 3f02d19..0000000 --- a/code/app/home/view/kuangYu/pc/public/indexBoyRankOne.html +++ /dev/null @@ -1,21 +0,0 @@ -
  • - - 1 -

    - {$arrGrm[$key+[start]]|raw} - {$Novel.n_name ?? ''} -

    -
    - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    - 作者:{$Novel.n_author ?? ''} - 类别: - {$Novel.n_category ?? ''} - -

    {$Novel.n_description ?? ''}

    -
    -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/indexNewsUpdateList.html b/code/app/home/view/kuangYu/pc/public/indexNewsUpdateList.html deleted file mode 100644 index 6980311..0000000 --- a/code/app/home/view/kuangYu/pc/public/indexNewsUpdateList.html +++ /dev/null @@ -1,20 +0,0 @@ -
  • - -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/shukuNovelList.html b/code/app/home/view/kuangYu/pc/public/shukuNovelList.html deleted file mode 100644 index 7bb36ad..0000000 --- a/code/app/home/view/kuangYu/pc/public/shukuNovelList.html +++ /dev/null @@ -1,27 +0,0 @@ -
  • - {$arrGrm[$key+[start]]|raw} - - {$Novel->n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -
    -

    {$Novel->n_name ?? ''}

    -

    - 作者:{$Novel->n_author ?? ''} - 分类:{$Novel->n_category ?? ''} - 状态:{$Novel->n_status ?? ''} - -

    -

    - 标签: - -

    -

    最近更新:219 桃花酿 -

    -

    {$Novel->n_description ?? ''}

    -
    -
    - 更新时间:2025-03-20 23:59 - 立即阅读 -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/public/swiperListImg.html b/code/app/home/view/kuangYu/pc/public/swiperListImg.html deleted file mode 100644 index 7e2d8b8..0000000 --- a/code/app/home/view/kuangYu/pc/public/swiperListImg.html +++ /dev/null @@ -1,10 +0,0 @@ -
  • - {$arrGrm[$key+[start]]|raw} -

    - - {$Novel->n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - -

    -
  • diff --git a/code/app/home/view/kuangYu/pc/public/swiperListText.html b/code/app/home/view/kuangYu/pc/public/swiperListText.html deleted file mode 100644 index 662b5e2..0000000 --- a/code/app/home/view/kuangYu/pc/public/swiperListText.html +++ /dev/null @@ -1,5 +0,0 @@ -
  • - - {$key} - {$Novel.n_name ?? ''} -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/user/getBookShelf.html b/code/app/home/view/kuangYu/pc/user/getBookShelf.html deleted file mode 100644 index f22e114..0000000 --- a/code/app/home/view/kuangYu/pc/user/getBookShelf.html +++ /dev/null @@ -1,74 +0,0 @@ -{extend name="basePcUser" /} - -{block name="title"}我的书架{/block} -{block name="keywords"}我的书架{/block} -{block name="description"}我的书架{/block} - -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - - -{block name="main"} -{site:grm page_code="pc_bookshekf" diff="0" num="10" g_key="arrGrm" /} -{$arrGrm[0]|raw} -
    - -
    - 我的书架 -
    - {$arrGrm[1]|raw} -
    - - - - - - - - - - - - - {$arrGrm[3]|raw} - -
    封面书名最新章节作者更新时间状态操作
    - {$arrGrm[4]|raw} -
    -
    -
    -
    -
    -
    -
    -
    -{$arrGrm[2]|raw} - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/user/getHistory.html b/code/app/home/view/kuangYu/pc/user/getHistory.html deleted file mode 100644 index 721b262..0000000 --- a/code/app/home/view/kuangYu/pc/user/getHistory.html +++ /dev/null @@ -1,70 +0,0 @@ -{extend name="basePcUser" /} -{block name="title"}我的阅读记录{/block} -{block name="keywords"}我的阅读记录{/block} -{block name="description"}我的阅读记录{/block} -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - - -{block name="main"} -{site:grm page_code="pc_history" diff="0" num="10" g_key="arrGrm" /} -{$arrGrm[0]|raw} -
    -
    - 最近阅读 -
    - {$arrGrm[1]|raw} -
    - - - - - - - - - - - - - -
    封面书名阅读章节作者更新时间状态操作
    - {$arrGrm[2]|raw} -
    -
    -
    -
    -
    -
    -
    -
    -{$arrGrm[3]|raw} - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/pc/user/index.html b/code/app/home/view/kuangYu/pc/user/index.html deleted file mode 100644 index 3554ff4..0000000 --- a/code/app/home/view/kuangYu/pc/user/index.html +++ /dev/null @@ -1,277 +0,0 @@ -{extend name="basePcUser" /} - -{block name="title"}个人中心{/block} -{block name="keywords"}个人中心{/block} -{block name="description"}个人中心{/block} - -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - - -{block name="main"} - -{site:grm page_code="userinfo" diff="0" num="100" g_key="arrGrm" /} - -
    - -
    - -
    -
    - {$arrGrm[1]|raw} -
    - 我的书架 - 查看更多>> -
    -
      - - -
    -
    - {$arrGrm[2]|raw} -
    -
    - 最近阅读 - 查看更多>> -
    -
      - - -
    -
    - {$arrGrm[3]|raw} -
    -
    - 热读作品 - -
    -
    -
      - {novel:list count="10" sort_type="news" d_key="key" d_val="Novel" cache_life="86400"} - {include file="pc/public/endNovelList" start="0"/} - {/novel:list} - -
    - - -
    -
    -
    - {$arrGrm[4]|raw} - -
    -
    -
    推荐作品
    - -
    -
    -
    -
    - - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/public/allChapterPage.html b/code/app/home/view/kuangYu/public/allChapterPage.html deleted file mode 100644 index f6a5274..0000000 --- a/code/app/home/view/kuangYu/public/allChapterPage.html +++ /dev/null @@ -1,36 +0,0 @@ -{if !empty($resData.p_data.pager)} -
    - {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="prev"} - {$arrGrm[$key]|raw} - - {$item.label} - - {/eq} - {/volist} - - - - {volist name="$resData.p_data.pager" id="item"} - {eq name="item.type" value="next"} - {$arrGrm[$key]|raw} - - {$item.label} - - {/eq} - {/volist} -
    -{/if} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/public/articleList.html b/code/app/home/view/kuangYu/public/articleList.html deleted file mode 100644 index 36ed3c6..0000000 --- a/code/app/home/view/kuangYu/public/articleList.html +++ /dev/null @@ -1,5 +0,0 @@ -
  • -
    - 我真是一条龙 -
    {$key+=1} -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/public/footer.html b/code/app/home/view/kuangYu/public/footer.html deleted file mode 100644 index c1b4b51..0000000 --- a/code/app/home/view/kuangYu/public/footer.html +++ /dev/null @@ -1,33 +0,0 @@ - \ No newline at end of file diff --git a/code/app/home/view/kuangYu/public/novelListH.html b/code/app/home/view/kuangYu/public/novelListH.html deleted file mode 100644 index e563bfd..0000000 --- a/code/app/home/view/kuangYu/public/novelListH.html +++ /dev/null @@ -1,21 +0,0 @@ -
  • - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 - {$arrGrm[$key+[start]]|raw} -

    - {$Novel.n_name ?? ''} -

    -

    {$Novel.n_description ?? ''}

    -

    - - 作者:{$Novel.n_author ?? ''} - - {$Novel->n_category ?? ''} - {$Novel->n_status ?? ''} -

    -
  • - - - - diff --git a/code/app/home/view/kuangYu/public/novelListRank.html b/code/app/home/view/kuangYu/public/novelListRank.html deleted file mode 100644 index 1c81f8f..0000000 --- a/code/app/home/view/kuangYu/public/novelListRank.html +++ /dev/null @@ -1,6 +0,0 @@ -
  • -
    - {$arrGrm[$key+[start]]|raw} - {$Novel.n_name ?? ''} -
    {$key} -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/public/novelListS.html b/code/app/home/view/kuangYu/public/novelListS.html deleted file mode 100644 index 553f7a8..0000000 --- a/code/app/home/view/kuangYu/public/novelListS.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - {$arrGrm[$key+[start]]|raw} - - {$Novel.n_name ?? ''} - {$Novel.n_category ?? ''}最新章节在线免费阅读 -

    {$Novel.n_name ?? ''}

    - - 作者:{$Novel.n_author ?? ''} - -
    -
  • \ No newline at end of file diff --git a/code/app/home/view/kuangYu/user/getBookShelf.html b/code/app/home/view/kuangYu/user/getBookShelf.html deleted file mode 100644 index ff88f1b..0000000 --- a/code/app/home/view/kuangYu/user/getBookShelf.html +++ /dev/null @@ -1,59 +0,0 @@ -{extend name="baseH5User" /} -{block name="title"}我的书架{/block} -{block name="keywords"}我的书架{/block} -{block name="description"}我的书架{/block} -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - -{block name="head-name"}我的书架{/block} -{block name="main"} -{site:grm page_code="h5_bookshekf" diff="0" num="10" g_key="arrGrm" /} - -{$arrGrm[0]|raw} -
    - {$arrGrm[3]|raw} -
    - - 管理 -
    - {$arrGrm[2]|raw} -
    -
    -
      - -
    -
    -
    - {$arrGrm[4]|raw} -
    -
    -
    - -{$arrGrm[1]|raw} -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/user/getHistory.html b/code/app/home/view/kuangYu/user/getHistory.html deleted file mode 100644 index ae22b0e..0000000 --- a/code/app/home/view/kuangYu/user/getHistory.html +++ /dev/null @@ -1,62 +0,0 @@ -{extend name="baseH5User" /} -{block name="title"}我的阅读记录{/block} -{block name="keywords"}我的阅读记录{/block} -{block name="description"}我的阅读记录{/block} -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - -{block name="head-name"}最近阅读{/block} -{block name="main"} - -{site:grm page_code="h5_history" diff="0" num="10" g_key="arrGrm" /} - -{$arrGrm[0]|raw} -
    - {$arrGrm[1]|raw} -
    - - 管理 -
    - {$arrGrm[2]|raw} -
    -
    -
      - -
    -
    - {$arrGrm[3]|raw} -
    -
    -
    - {$arrGrm[4]|raw} -
    - - -{$arrGrm[5]|raw} -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/user/index.html b/code/app/home/view/kuangYu/user/index.html deleted file mode 100644 index c3e2f5e..0000000 --- a/code/app/home/view/kuangYu/user/index.html +++ /dev/null @@ -1,74 +0,0 @@ -{extend name="baseH5User" /} -{block name="title"}个人中心{/block} -{block name="keywords"}个人中心{/block} -{block name="description"}个人中心{/block} -{block name="head"} - - - - - - - -{block name="head-js"}{/block} - -{block name="head-name"}用户中心{/block} -{block name="main"} -{site:grm page_code="userinfo" diff="0" num="10" g_key="arrGrm" /} -{$arrGrm[0]|raw} -
    - {$arrGrm[1]|raw} -
    -
    - {$arrGrm[2]|raw} - -
    - -
    - -
    - 123456 -
    -
    - {$arrGrm[3]|raw} -
    -
      -
    • 经验0
    • -
    • 积分0
    • -
    • 推荐票0
    • -
    -
    - -
    - {$arrGrm[4]|raw} - -
    - - - -
    -
    -{$arrGrm[5]|raw} -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/分类书库页面TKD.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/分类书库页面TKD.md deleted file mode 100644 index 975ddfb..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/分类书库页面TKD.md +++ /dev/null @@ -1,213 +0,0 @@ -最牛的seo 优化大师 -这个是 替换标识 这个页面下面的标签都可以使用 ,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', -'{intPage}' => '当前页面分页页码', -'{strNovelSex}' => '当前页面小说是男生还是女生 小说', -'{strNovelCategoryName}' => '当前页面小说分类名字', -'{strNovelStatus}' => '当前页面小说状态 是连载还是完结', - - -这个是分类或者书库的路由,公用一套视图模板 -/shuku/:strGender/:strCategory/:strStatus/page:intPage - - -请根据路由和上面的替换标识,你帮忙设计100套最友好seo的 tkd 替换模板,字数要符合常规,不要超标也不要少,质量要保证 -返回格式: -title :[ - '{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说 - {strSiteName} - 第{intPage}页', - '{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说 - {strSiteName} - 第{intPage}页', - .. -] - -keywords: [ - '{strNovelCategoryName}, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费阅读', - .. - ] -description: [ - '{strSiteName}提供{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说免费阅读,第{intPage}页汇聚热门作品,欢迎体验{strSiteDomain}!', - .. - ] - - - -好的,我会根据你提供的书库路由 `/shuku/:strGender/:strCategory/:strStatus/page:intPage` 和替换标识,设计一个最优的 SEO 友好的 TKD 模板。你的案例已经给出了一个分类页的模板,我会在此基础上优化,确保它既符合书库页面的特点,又最大化 SEO 效果。 - ---- - -### **分析** -#### **路由特点** -- **路由**:`/shuku/:strGender/:strCategory/:strStatus/page:intPage` - - `:strGender`:性别筛选(男生/女生/全部)。 - - `:strCategory`:分类(如玄幻、言情)。 - - `:strStatus`:状态(连载/完结/全部)。 - - `:intPage`:分页页码。 -- **页面类型**:书库或分类页面,展示符合筛选条件的小说列表,支持分页。 -- **SEO 目标**: - - 突出筛选条件(性别、分类、状态)。 - - 支持分页优化。 - - 融入品牌词并吸引点击。 - -#### **替换标识使用** -- **核心字段**: - - `{strNovelSex}`:对应 `:strGender`。 - - `{strNovelCategoryName}`:对应 `:strCategory`。 - - `{strNovelStatus}`:对应 `:strStatus`。 - - `{intPage}`:对应 `:intPage`。 - - `{strSiteName}`、 `{strSiteDomain}`:品牌词。 -- **不适用字段**: - - `{strNovelName}`、 `{strNovelChapterName}`、 `{strNovelChapterSort}`、 `{strNovelAuthor}`、 `{strNovelDescription}`:书库页不涉及具体小说。 - - `{strSearchKeywords}`:搜索页专用。 - -#### **SEO 优化原则** -- **Title**:简洁(60 字符内),突出筛选条件和品牌。 -- **Keywords**:覆盖分类、性别、状态等核心词,5-10 个。 -- **Description**:吸引点击,融入筛选条件和网站特色。 - ---- - -### **优化后的 TKD 模板** -以下是基于你的案例优化后的 TKD 模板: - -#### **1. Title**(控制在 60 字符以内) -- **模板**:`{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说 - {strSiteName} - 第{intPage}页` -- **优化点**: - - 保留你的案例结构,简洁直观。 - - `{intPage}` 仅在大于 1 时显示,避免首页面冗余。 -- **示例**(`/shuku/nansheng-xiaoshuo/xuanhuan/lianzai/page2`): - - `男生玄幻连载小说 - 这个是网站名 - 第2页` - -#### **2. Keywords**(5-10 个核心词) -- **模板**:`{strNovelCategoryName}小说, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费小说, 在线阅读` -- **优化点**: - - 增加“免费小说”和“在线阅读”,提升行业词覆盖。 - - `{strSiteName}` 作为品牌词,不重复 `{strSiteKeywords}`,保持简洁。 -- **示例**: - - `玄幻小说, 男生小说, 连载小说, 这个是网站名, 免费小说, 在线阅读` - -#### **3. Description**(150-160 字符) -- **模板**:`{strSiteName}提供{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说免费在线阅读,第{intPage}页精选热门作品,畅享{strSiteDomain}!` -- **优化点**: - - 替换“欢迎体验”为“畅享”,更吸引移动端用户。 - - 加入“精选热门作品”,提升点击欲望。 -- **示例**: - - `这个是网站名提供男生玄幻连载小说免费在线阅读,第2页精选热门作品,畅享这个是站点域名!` - ---- - -### **参数映射** -- `{strNovelSex}`: - - `nansheng-xiaoshuo` → '男生' - - `nvsheng-xiaoshuo` → '女生' - - `all` → ''(空) -- `{strNovelCategoryName}`: - - `xuanhuan` → '玄幻' - - `yanqing` → '言情' - - `all` → ''(需完整映射表) -- `{strNovelStatus}`: - - `lianzai` → '连载' - - `wanjie` → '完结' - - `all` → ''(空) -- `{intPage}`:直接使用路由中的 `:intPage` -- `{strSiteName}` → '这个是网站名' -- `{strSiteDomain}` → '这个是站点域名' -- `{strSiteTitle}` → '这个是网站标题' -- `{strSiteKeywords}` → '这个是网站关键字' -- `{strNovelName}`、 `{strNovelChapterName}`、 `{strNovelChapterSort}`、 `{strNovelAuthor}`、 `{strNovelDescription}`、 `{strSearchKeywords}` → 空 - ---- - -### **完整拼接示例** -#### **1. 全默认:`/shuku/all/all/all/page1`** -- **Title**:`小说 - 这个是网站名` -- **Keywords**:`小说, 这个是网站名, 免费小说, 在线阅读` -- **Description**:`这个是网站名提供小说免费在线阅读,第1页精选热门作品,畅享这个是站点域名!` - -#### **2. 具体筛选:`/shuku/nansheng-xiaoshuo/xuanhuan/lianzai/page2`** -- **Title**:`男生玄幻连载小说 - 这个是网站名 - 第2页` -- **Keywords**:`玄幻小说, 男生小说, 连载小说, 这个是网站名, 免费小说, 在线阅读` -- **Description**:`这个是网站名提供男生玄幻连载小说免费在线阅读,第2页精选热门作品,畅享这个是站点域名!` - -#### **3. 女生完结:`/shuku/nvsheng-xiaoshuo/yanqing/wanjie/page1`** -- **Title**:`女生言情完结小说 - 这个是网站名` -- **Keywords**:`言情小说, 女生小说, 完结小说, 这个是网站名, 免费小说, 在线阅读` -- **Description**:`这个是网站名提供女生言情完结小说免费在线阅读,第1页精选热门作品,畅享这个是站点域名!` - ---- - -### **实现代码(伪代码)** -```php -public function getLibrary($strGender, $strCategory, $strStatus, $intPage) { - $genderMap = [ - 'nansheng-xiaoshuo' => '男生', - 'nvsheng-xiaoshuo' => '女生', - 'all' => '' - ]; - $categoryMap = [ - 'xuanhuan' => '玄幻', - 'yanqing' => '言情', - // 更多分类... - ]; - $statusMap = [ - 'lianzai' => '连载', - 'wanjie' => '完结', - 'all' => '' - ]; - - $replacements = [ - '{strSiteName}' => '这个是网站名', - '{strSiteDomain}' => '这个是站点域名', - '{strSiteTitle}' => '这个是网站标题', - '{strSiteKeywords}' => '这个是网站关键字', - '{strNovelSex}' => $genderMap[$strGender] ?? '', - '{strNovelCategoryName}' => $categoryMap[$strCategory] ?? $strCategory, - '{strNovelStatus}' => $statusMap[$strStatus] ?? '', - '{intPage}' => $intPage, - '{strNovelName}' => '', - '{strNovelChapterName}' => '', - '{strNovelChapterSort}' => '', - '{strNovelAuthor}' => '', - '{strNovelDescription}' => '', - '{strSearchKeywords}' => '' - ]; - - $pageStr = $intPage > 1 ? " - 第{intPage}页" : ''; - $title = "{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说 - {strSiteName}{$pageStr}"; - $keywords = "{strNovelCategoryName}小说, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费小说, 在线阅读"; - $description = "{strSiteName}提供{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说免费在线阅读,第{intPage}页精选热门作品,畅享{strSiteDomain}!"; - - foreach ($replacements as $key => $value) { - $title = str_replace($key, $value, $title); - $keywords = str_replace($key, $value, $keywords); - $description = str_replace($key, $value, $description); - } - - return view('library', [ - 'title' => $title, - 'keywords' => $keywords, - 'description' => $description, - 'gender' => $strGender, - 'category' => $strCategory, - 'status' => $strStatus, - 'page' => $intPage - ]); -} -``` - ---- - -### **SEO 优化亮点** -1. **动态筛选**:`{strNovelSex}`、 `{strNovelCategoryName}`、 `{strNovelStatus}` 组合覆盖多种搜索意图(如“男生玄幻连载小说”)。 -2. **分页友好**:首页面简洁,后续页面自然融入 `{intPage}`,可配合 `rel="next/prev"`。 -3. **品牌强化**:`{strSiteName}` 和 `{strSiteDomain}` 提升网站辨识度。 -4. **行业词**:增加“免费小说”“在线阅读”,契合用户搜索习惯。 - ---- - -### **与你的案例对比** -- **Title**:保留你的结构,优化分页显示。 -- **Keywords**:增加“免费小说”“在线阅读”,提升覆盖。 -- **Description**:用“畅享”替代“欢迎体验”,更吸引人。 - -这个 TKD 模板是书库页面的最优 SEO 方案。如果需要进一步调整(比如更短的 Title 或特定关键词),可以告诉我! \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说排行榜的Tkd.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说排行榜的Tkd.md deleted file mode 100644 index a99a434..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说排行榜的Tkd.md +++ /dev/null @@ -1,180 +0,0 @@ -最牛的seo 优化大师 -这个是 替换标识 这个页面下面的标签都可以使用,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', -'{intPage}' => '当前页面分页页码', - -这个是小说排行榜的路由,公用一套视图模板 -/paihang/all - -请根据路由和上面的替换标识,你帮忙设计100套最友好seo的 tkd 替换模板,字数要符合常规,不要超标也不要少,质量要保证 -返回格式: -title :[ - '小说排行榜 - {strSiteName} - 第{intPage}页', - .. -] - -keywords: [ - '小说排行榜, 热门小说, 小说推荐, {strSiteKeywords}, {strSiteName}, 免费阅读', - .. - ] -description: [ - '{strSiteName}提供小说排行榜,第{intPage}页精选热门小说免费阅读,最新排行一览无余,畅享{strSiteDomain}!', - .. - ] - - -好的,我会根据你提供的小说排行榜路由 `/paihang/all` 和替换标识,设计一个最优的 SEO 友好的 TKD 模板。小说排行榜页面与分类页面不同,它展示的是热门或推荐的小说列表,通常不涉及具体的性别、分类或状态筛选,而是突出“排行榜”这一特性。以下是我的设计: - ---- - -### **分析** -#### **路由特点** -- **路由**:`/paihang/all` - - `all`:表示全部排行榜(可能是默认或唯一的排行榜类型)。 - - 无显式分页参数,但可能通过视图逻辑支持分页(如 `?page=2`)。 -- **页面类型**:小说排行榜页面,展示热门小说列表,可能按点击量、更新时间等排序。 -- **SEO 目标**: - - 突出“排行榜”特性,吸引搜索热门小说的用户。 - - 支持分页优化(如果有)。 - - 融入品牌词并提升点击率。 - -#### **替换标识使用** -- **核心字段**: - - `{strSiteName}`、 `{strSiteDomain}`、 `{strSiteKeywords}`:品牌和公用关键词。 - - `{intPage}`:分页页码(若支持分页)。 -- **不适用字段**: - - `{strNovelSex}`、 `{strNovelCategoryName}`、 `{strNovelStatus}`:排行榜页面不涉及具体筛选。 - - `{strNovelName}`、 `{strNovelChapterName}`、 `{strNovelChapterSort}`、 `{strNovelAuthor}`、 `{strNovelDescription}`:不涉及单本小说。 - - `{strSearchKeywords}`:搜索页专用。 - - `{strIndexTitle}`、 `{strIndexKeywords}`、 `{strIndexDescription}`:首页专用。 - -#### **SEO 优化原则** -- **Title**:简洁(60 字符内),突出排行榜和品牌。 -- **Keywords**:覆盖排行榜相关词和网站公用关键词。 -- **Description**:吸引点击,强调热门小说和免费阅读。 - ---- - -### **优化后的 TKD 模板** -以下是专为小说排行榜页面设计的 TKD 模板: - -#### **1. Title**(控制在 60 字符以内) -- **模板**:`小说排行榜 - {strSiteName} - 第{intPage}页` -- **优化点**: - - “小说排行榜”作为核心关键词,匹配用户搜索(如“小说排行榜”)。 - - `{strSiteName}` 强化品牌。 - - `{intPage}` 仅在大于 1 时显示,避免首页面冗余。 -- **示例**(`/paihang/all`,假设无分页或 `intPage = 1`): - - `小说排行榜 - 这个是网站名` - -#### **2. Keywords**(5-10 个核心词) -- **模板**:`小说排行榜, 热门小说, 小说推荐, {strSiteKeywords}, {strSiteName}, 免费阅读` -- **优化点**: - - “小说排行榜”、“热门小说”、“小说推荐”突出页面主题。 - - `{strSiteKeywords}` 复用网站公用关键词(如“这个是网站关键字”)。 - - `{strSiteName}` 作为品牌词。 - - “免费阅读”增加行业词覆盖。 -- **示例**(假设 `{strSiteKeywords}` = '小说, 免费小说, 在线阅读'): - - `小说排行榜, 热门小说, 小说推荐, 小说, 免费小说, 在线阅读, 这个是网站名, 免费阅读` - -#### **3. Description**(150-160 字符) -- **模板**:`{strSiteName}提供小说排行榜,第{intPage}页精选热门小说免费阅读,最新排行一览无余,畅享{strSiteDomain}!` -- **优化点**: - - 突出“排行榜”和“热门小说”,吸引用户。 - - “免费阅读”和“畅享”提升点击欲望。 - - `{strSiteName}` 和 `{strSiteDomain}` 强化品牌。 -- **示例**: - - `这个是网站名提供小说排行榜,第1页精选热门小说免费阅读,最新排行一览无余,畅享这个是站点域名!` - ---- - -### **参数映射** -- `{strSiteName}` → '这个是网站名' -- `{strSiteDomain}` → '这个是站点域名' -- `{strSiteKeywords}` → '这个是网站关键字'(假设为“小说, 免费小说, 在线阅读”) -- `{intPage}` → 默认 '1'(若路由支持分页,则从参数获取,如 `?page=2`) -- `{strNovelName}`、 `{strNovelSex}`、 `{strNovelCategoryName}`、 `{strNovelStatus}`、 `{strNovelChapterName}`、 `{strNovelChapterSort}`、 `{strNovelAuthor}`、 `{strNovelDescription}`、 `{strSearchKeywords}` → 空 - ---- - -### **完整拼接示例** -#### **路由:`/paihang/all`(假设 intPage = 1)** -- 假设: - - `{strSiteKeywords}` = '小说, 免费小说, 在线阅读' - - `{intPage}` = '1' -- **Title**: - - `小说排行榜 - 这个是网站名` -- **Keywords**: - - `小说排行榜, 热门小说, 小说推荐, 小说, 免费小说, 在线阅读, 这个是网站名, 免费阅读` -- **Description**: - - `这个是网站名提供小说排行榜,第1页精选热门小说免费阅读,最新排行一览无余,畅享这个是站点域名!` - -#### **路由:`/paihang/all?page=2`(假设支持分页)** -- `{intPage}` = '2' -- **Title**: - - `小说排行榜 - 这个是网站名 - 第2页` -- **Keywords**: - - `小说排行榜, 热门小说, 小说推荐, 小说, 免费小说, 在线阅读, 这个是网站名, 免费阅读` -- **Description**: - - `这个是网站名提供小说排行榜,第2页精选热门小说免费阅读,最新排行一览无余,畅享这个是站点域名!` - ---- - -### **实现代码(伪代码)** -```php -public function getRanking() { - $replacements = [ - '{strSiteName}' => '这个是网站名', - '{strSiteDomain}' => '这个是站点域名', - '{strSiteKeywords}' => '小说, 免费小说, 在线阅读', // 使用你配置的公用关键词 - '{strSiteDescription}' => '这个是网站描述', - '{intPage}' => request()->input('page', 1), // 默认第1页,假设分页通过查询参数传入 - '{strNovelName}' => '', - '{strNovelSex}' => '', - '{strNovelCategoryName}' => '', - '{strNovelStatus}' => '', - '{strNovelChapterName}' => '', - '{strNovelChapterSort}' => '', - '{strNovelAuthor}' => '', - '{strNovelDescription}' => '', - '{strSearchKeywords}' => '' - ]; - - $pageStr = $replacements['{intPage}'] > 1 ? " - 第{intPage}页" : ''; - $title = "小说排行榜 - {strSiteName}{$pageStr}"; - $keywords = "小说排行榜, 热门小说, 小说推荐, {strSiteKeywords}, {strSiteName}, 免费阅读"; - $description = "{strSiteName}提供小说排行榜,第{intPage}页精选热门小说免费阅读,最新排行一览无余,畅享{strSiteDomain}!"; - - foreach ($replacements as $key => $value) { - $title = str_replace($key, $value, $title); - $keywords = str_replace($key, $value, $keywords); - $description = str_replace($key, $value, $description); - } - - return view('ranking', [ - 'title' => $title, - 'keywords' => $keywords, - 'description' => $description, - 'page' => $replacements['{intPage}'] - ]); -} -``` - ---- - -### **SEO 优化亮点** -1. **排行榜特性**:`小说排行榜` 匹配用户搜索(如“小说排行榜 2023”)。 -2. **公用关键词**:`{strSiteKeywords}` 融入 Keywords,提升网站整体相关性。 -3. **分页支持**:`{intPage}` 动态调整,首页面简洁,后续页面自然扩展。 -4. **品牌强化**:`{strSiteName}` 和 `{strSiteDomain}` 提升辨识度。 -5. **吸引点击**:突出“热门小说”和“免费阅读”,契合用户需求。 - ---- - -### **与分类案例的区别** -- **分类页**:聚焦筛选条件(如“男生玄幻连载小说”),多类别。 -- **排行榜页**:聚焦热门小说推荐(如“小说排行榜”),无具体筛选。 - -这个 TKD 模板是小说排行榜页面的最优 SEO 方案。如果你的 `{strSiteKeywords}` 有具体值(而不是“这个是网站关键字”),或路由支持其他参数(比如不同排行榜类型),请告诉我,我再调整!你觉得如何? \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说章节目录页面TKD.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说章节目录页面TKD.md deleted file mode 100644 index 2fac59f..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说章节目录页面TKD.md +++ /dev/null @@ -1,212 +0,0 @@ -最牛的seo 优化大师 -词量好像少了点,想无广告 最新章节 这些。。 你看看可以加多些词入取,你看看 顶级同行是咋做的,多收罗些数据 -这个是 替换标识 这个页面下面的标签都可以使用,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', -'{strNovelName}' => '这个是当前页面小说名字', -'{strNovelCategoryName}' => '当前页面小说分类名字', -'{strNovelSex}' => '当前页面小说是男生还是女生 小说', -'{strNovelStatus}' => '当前页面小说状态 是连载还是完结', -'{strNovelAuthor}' => '小说作者', -'{strNovelDescription}' => '小说简介', -'{intPage}' => '当前页面分页页码', - -这个是小说章节目录页面的路由 -/xiaoshuo/[小说拼音]-[小说id]/mulu/order/[page] - -请根据路由和上面的替换标识,你帮忙设计200套最友好seo的 tkd 替换模板,字数要符合常规,不要超标也不要少,质量要保证,不要重复 -返回格式: -title :[ - '{strNovelName}章节目录 - {strSiteName} - 第{intPage}页', - .. -] - -keywords: [ - '{strNovelName}, {strNovelName}章节目录, {strNovelAuthor}, {strNovelCategoryName}小说, {strNovelSex}小说, {strSiteKeywords}, {strSiteName}', - .. - ] -description: [ - '{strSiteName}提供{strNovelName}章节目录免费查看,第{intPage}页包含最新{strNovelStatus}章节,{strNovelAuthor}创作,畅享{strSiteDomain}!', - .. - ] - - -好的,我会根据你提供的小说章节目录页面路由 `/xiaoshuo/[小说拼音]-[小说id]/mulu/order/[page]` 和替换标识,设计一个最优的 SEO 友好的 TKD 模板。小说章节目录页面与分类页面和章节页面不同,它展示的是某本小说的章节列表,通常按顺序排列并支持分页,因此需要突出小说名、目录特性以及分页信息。以下是我的设计: - ---- - -### **分析** -#### **路由特点** -- **路由**:`/xiaoshuo/[小说拼音]-[小说id]/mulu/order/[page]` - - `[小说拼音]`:小说拼音(如 `douluodalu`)。 - - `[小说id]`:小说 ID(如 `123`)。 - - `/mulu/`:表示章节目录。 - - `order`:可能表示排序方式(假设为固定值,未明确变化)。 - - `[page]`:分页页码。 -- **页面类型**:小说章节目录页面,展示某本小说的所有章节列表,支持分页。 -- **SEO 目标**: - - 突出小说名和“章节目录”特性,吸引搜索目录的用户。 - - 支持分页优化。 - - 融入品牌词并提升点击率。 - -#### **替换标识使用** -- **核心字段**: - - `{strNovelName}`:小说标题。 - - `{intPage}`:分页页码。 - - `{strNovelAuthor}`:小说作者。 - - `{strNovelCategoryName}`:小说分类。 - - `{strNovelSex}`:男生/女生小说。 - - `{strNovelStatus}`:连载/完结。 - - `{strSiteName}`、 `{strSiteDomain}`、 `{strSiteKeywords}`:品牌和公用关键词。 -- **不适用字段**: - - `{strNovelChapterName}`、 `{strNovelChapterSort}`:目录页不涉及具体章节。 - - `{strSearchKeywords}`:搜索页专用。 - - `{strIndexTitle}`、 `{strIndexKeywords}`、 `{strIndexDescription}`:首页专用。 - -#### **SEO 优化原则** -- **Title**:简洁(60 字符内),突出小说名和目录特性。 -- **Keywords**:覆盖小说名、目录、分类等高相关性词。 -- **Description**:吸引点击,强调章节目录和免费阅读。 - ---- - -### **优化后的 TKD 模板** -以下是专为小说章节目录页面设计的 TKD 模板: - -#### **1. Title**(控制在 60 字符以内) -- **模板**:`{strNovelName}章节目录 - {strSiteName} - 第{intPage}页` -- **优化点**: - - `{strNovelName}` 放在首位,匹配用户搜索(如“斗罗大陆 章节目录”)。 - - “章节目录”明确页面类型。 - - `{strSiteName}` 强化品牌。 - - `{intPage}` 仅在大于 1 时显示,避免首页面冗余。 -- **示例**(`/xiaoshuo/douluodalu-123/mulu/order/2`): - - `斗罗大陆章节目录 - 这个是网站名 - 第2页` - -#### **2. Keywords**(5-10 个核心词) -- **模板**:`{strNovelName}, {strNovelName}章节目录, {strNovelAuthor}, {strNovelCategoryName}小说, {strNovelSex}小说, {strSiteKeywords}, {strSiteName}` -- **优化点**: - - `{strNovelName}` 和 `{strNovelName}章节目录` 是核心词。 - - `{strNovelAuthor}` 提升作者相关搜索。 - - `{strNovelCategoryName}小说` 和 `{strNovelSex}小说` 增加分类相关性。 - - `{strSiteKeywords}` 复用网站公用关键词(如“这个是网站关键字”)。 - - `{strSiteName}` 作为品牌词。 -- **示例**(假设 `{strSiteKeywords}` = '小说, 免费小说, 在线阅读'): - - `斗罗大陆, 斗罗大陆章节目录, 唐家三少, 玄幻小说, 男生小说, 小说, 免费小说, 在线阅读, 这个是网站名` - -#### **3. Description**(150-160 字符) -- **模板**:`{strSiteName}提供{strNovelName}章节目录免费查看,第{intPage}页包含最新{strNovelStatus}章节,{strNovelAuthor}创作,畅享{strSiteDomain}!` -- **优化点**: - - 突出“章节目录免费查看”,吸引用户。 - - `{strNovelStatus}` 体现小说状态。 - - `{strNovelAuthor}` 增加权威性。 - - “畅享”提升吸引力。 -- **示例**: - - `这个是网站名提供斗罗大陆章节目录免费查看,第2页包含最新连载章节,唐家三少创作,畅享这个是站点域名!` - ---- - -### **参数映射** -- `{strNovelName}`:从数据库根据 `[小说id]` 获取小说标题。 -- `{intPage}`:直接使用路由中的 `[page]`。 -- `{strNovelAuthor}`:从数据库获取作者名。 -- `{strNovelCategoryName}`:从数据库获取分类(如“玄幻”)。 -- `{strNovelSex}`:从数据库获取性别(如“男生”)。 -- `{strNovelStatus}`:从数据库获取状态(如“连载”)。 -- `{strSiteName}` → '这个是网站名' -- `{strSiteDomain}` → '这个是站点域名' -- `{strSiteKeywords}` → '这个是网站关键字'(假设为“小说, 免费小说, 在线阅读”) -- `{strNovelChapterName}`、 `{strNovelChapterSort}`、 `{strSearchKeywords}` → 空 - ---- - -### **完整拼接示例** -#### **路由:`/xiaoshuo/douluodalu-123/mulu/order/1`** -- 假设: - - `{strNovelName}` = '斗罗大陆' - - `{intPage}` = '1' - - `{strNovelAuthor}` = '唐家三少' - - `{strNovelCategoryName}` = '玄幻' - - `{strNovelSex}` = '男生' - - `{strNovelStatus}` = '连载' - - `{strSiteKeywords}` = '小说, 免费小说, 在线阅读' -- **Title**: - - `斗罗大陆章节目录 - 这个是网站名` -- **Keywords**: - - `斗罗大陆, 斗罗大陆章节目录, 唐家三少, 玄幻小说, 男生小说, 小说, 免费小说, 在线阅读, 这个是网站名` -- **Description**: - - `这个是网站名提供斗罗大陆章节目录免费查看,第1页包含最新连载章节,唐家三少创作,畅享这个是站点域名!` - -#### **路由:`/xiaoshuo/douluodalu-123/mulu/order/2`** -- `{intPage}` = '2' -- **Title**: - - `斗罗大陆章节目录 - 这个是网站名 - 第2页` -- **Keywords**: - - `斗罗大陆, 斗罗大陆章节目录, 唐家三少, 玄幻小说, 男生小说, 小说, 免费小说, 在线阅读, 这个是网站名` -- **Description**: - - `这个是网站名提供斗罗大陆章节目录免费查看,第2页包含最新连载章节,唐家三少创作,畅享这个是站点域名!` - ---- - -### **实现代码(伪代码)** -```php -public function getChapterList($strPinYin, $intNId, $intPage) { - // 假设从数据库获取小说信息 - $novel = Novel::find($intNId); - - $replacements = [ - '{strSiteName}' => '这个是网站名', - '{strSiteDomain}' => '这个是站点域名', - '{strSiteKeywords}' => '小说, 免费小说, 在线阅读', // 使用你配置的公用关键词 - '{strSiteDescription}' => '这个是网站描述', - '{strNovelName}' => $novel->title ?? '', - '{intPage}' => $intPage, - '{strNovelAuthor}' => $novel->author ?? '', - '{strNovelCategoryName}' => $novel->category ?? '', - '{strNovelSex}' => $novel->sex === 'boys' ? '男生' : '女生', - '{strNovelStatus}' => $novel->status === 'ongoing' ? '连载' : '完结', - '{strNovelChapterName}' => '', - '{strNovelChapterSort}' => '', - '{strNovelDescription}' => $novel->description ?? '', - '{strSearchKeywords}' => '' - ]; - - $pageStr = $intPage > 1 ? " - 第{intPage}页" : ''; - $title = "{strNovelName}章节目录 - {strSiteName}{$pageStr}"; - $keywords = "{strNovelName}, {strNovelName}章节目录, {strNovelAuthor}, {strNovelCategoryName}小说, {strNovelSex}小说, {strSiteKeywords}, {strSiteName}"; - $description = "{strSiteName}提供{strNovelName}章节目录免费查看,第{intPage}页包含最新{strNovelStatus}章节,{strNovelAuthor}创作,畅享{strSiteDomain}!"; - - foreach ($replacements as $key => $value) { - $title = str_replace($key, $value, $title); - $keywords = str_replace($key, $value, $keywords); - $description = str_replace($key, $value, $description); - } - - return view('chapter_list', [ - 'title' => $title, - 'keywords' => $keywords, - 'description' => $description, - 'novel' => $novel, - 'page' => $intPage - ]); -} -``` - ---- - -### **SEO 优化亮点** -1. **目录特性**:`{strNovelName}章节目录` 匹配用户搜索(如“斗罗大陆 目录”)。 -2. **公用关键词**:`{strSiteKeywords}` 融入 Keywords,提升网站整体相关性。 -3. **分页友好**:`{intPage}` 动态调整,首页面简洁,后续页面自然扩展。 -4. **品牌强化**:`{strSiteName}` 和 `{strSiteDomain}` 提升辨识度。 -5. **吸引点击**:突出“免费查看”和“最新章节”,契合用户需求。 - ---- - -### **与分类案例的区别** -- **分类页**:聚焦筛选条件(如“男生玄幻连载小说”),多类别。 -- **目录页**:聚焦单本小说的章节列表(如“斗罗大陆章节目录”),无具体章节内容。 - -这个 TKD 模板是小说章节目录页的最优 SEO 方案。如果你的 `{strSiteKeywords}` 配置有具体值(而不是“这个是网站关键字”),请告诉我,我再调整!觉得如何? - diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说章节页面TKD.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说章节页面TKD.md deleted file mode 100644 index fb4ba1f..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说章节页面TKD.md +++ /dev/null @@ -1,215 +0,0 @@ -最牛的seo 优化大师 -词量好像少了点,想无广告 最新章节 这些。。 你看看可以加多些词入取,你看看 顶级同行是咋做的,多收罗些数据 -这个是 替换标识 这个页面下面的标签都可以使用,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', -'{strNovelName}' => '这个是当前页面小说名字', -'{strNovelChapterName}' => '当前页面小说章节名字', -'{strNovelChapterSort}' => '当前页面小说章节排序号', -'{strChapterDescription}' => '当前页面小说章节描述', -'{strNovelCategoryName}' => '当前页面小说分类名字', -'{strNovelSex}' => '当前页面小说是男生还是女生 小说', -'{strNovelStatus}' => '当前页面小说状态 是连载还是完结', -'{strNovelAuthor}' => '小说作者', -'{strNovelDescription}' => '小说简介', - -这个是小说章节页面的路由 -/xiaoshuo/小说拼音-小说id/zhang-章节排序/章节分页 - -请根据路由和上面的替换标识,你帮忙设计200套最友好seo的 tkd 替换模板,字数要符合常规,不要超标也不要少,质量要保证,不要重复 -返回格式: -title :[ - '{strNovelName} 第{strNovelChapterSort}章 - {strSiteName}', - .. -] - -keywords: [ - '{strNovelName}, 第{strNovelChapterSort}章, {strSiteKeywords}, {strSiteName}, 在线小说, {strNovelStatus}', - .. - ] -description: [ - '{strSiteName}提供{strNovelName} {strNovelChapterName}免费阅读,{strNovelSex}小说{strNovelCategoryName},{strNovelStatus},畅享{strSiteDomain}!', - .. - ] - - - -好的,我会根据你提供的小说章节页面路由 `/xiaoshuo/小说拼音-小说id/zhang-章节排序/章节分页` 和替换标识,设计一个最优的 SEO 友好的 TKD 模板。小说章节页面与分类页面和详情页面不同,它聚焦于具体章节内容,因此需要突出小说名、章节名和排序,同时优化分页和搜索可见性。以下是我的设计: - ---- - -### **分析** -#### **路由特点** -- **路由**:`/xiaoshuo/{strPinYin}-{intNId}/zhang-{intChapterSort}/{intPage}` - - `{strPinYin}`:小说拼音(如 `douluodalu`)。 - - `{intNId}`:小说 ID(如 `123`)。 - - `{intChapterSort}`:章节排序号(如 `5`,表示第 5 章)。 - - `{intPage}`:章节分页(如长章节可能分多页显示)。 -- **页面类型**:小说章节页面,展示具体章节内容,可能包含分页。 -- **SEO 目标**: - - 突出小说名和章节信息,吸引搜索具体章节的用户。 - - 支持分页优化。 - - 融入品牌词并提升阅读吸引力。 - -#### **替换标识使用** -- **核心字段**: - - `{strNovelName}`:小说标题。 - - `{strNovelChapterName}`:章节名字。 - - `{strNovelChapterSort}`:章节排序号。 - - `{intPage}`:章节分页页码。 - - `{strNovelAuthor}`:小说作者。 - - `{strNovelCategoryName}`:小说分类。 - - `{strNovelSex}`:男生/女生小说。 - - `{strNovelStatus}`:连载/完结。 - - `{strSiteName}`、 `{strSiteDomain}`:品牌词。 -- **不适用字段**: - - `{strSearchKeywords}`:搜索页专用。 - - `{strSiteTitle}`、 `{strSiteKeywords}`、 `{strSiteDescription}`:更适合全局使用。 - -#### **SEO 优化原则** -- **Title**:简洁(60 字符内),包含小说名和章节信息。 -- **Keywords**:覆盖小说名、章节、分类等高相关性词。 -- **Description**:吸引点击,融入章节相关信息。 - ---- - -### **优化后的 TKD 模板** -以下是专为小说章节页面设计的 TKD 模板: - -#### **1. Title**(控制在 60 字符以内) -- **模板**:`{strNovelName} 第{strNovelChapterSort}章 {strNovelChapterName} - {strSiteName}` -- **优化点**: - - `{strNovelName}` 和 `{strNovelChapterSort}` 突出具体章节,匹配用户搜索(如“斗罗大陆 第5章”)。 - - `{strNovelChapterName}` 增加可读性。 - - `{strSiteName}` 强化品牌。 - - 若 `{intPage}` > 1,可附加“- 第{intPage}页”,但需控制长度。 -- **示例**(`/xiaoshuo/douluodalu-123/zhang-5/1`): - - `斗罗大陆 第5章 魂兽森林 - 这个是网站名` - -#### **2. Keywords**(5-10 个核心词) -- **模板**:`{strNovelName}, 第{strNovelChapterSort}章, {strNovelChapterName}, {strNovelAuthor}, {strSiteKeywords}, {strSiteName}` -- **优化点**: - - `{strNovelName}` 和 `{strNovelChapterSort}` 是核心词。 - - `{strNovelChapterName}` 和 `{strNovelAuthor}` 提升具体性。 - - `{strNovelCategoryName}小说` 和 `{strNovelSex}小说` 增加分类相关性。 - - “免费阅读”吸引流量。 -- **示例**: - - `斗罗大陆, 第5章, 魂兽森林, 唐家三少, 玄幻小说, 男生小说, 这个是网站名, 免费阅读` - -#### **3. Description**(150-160 字符) -- **模板**:`{strSiteName}提供{strNovelName}第{strNovelChapterSort}章{strNovelChapterName}免费阅读,{strNovelAuthor}创作,畅享{strSiteDomain}!` -- **优化点**: - - 突出章节内容,吸引用户点击。 - - 融入 `{strNovelAuthor}` 和 `{strNovelCategoryName}`,提升相关性。 - - “畅享”更具吸引力。 - - 若有分页,可附加“第{intPage}页”,但需控制长度。 -- **示例**: - - `这个是网站名提供斗罗大陆第5章魂兽森林免费阅读,唐家三少创作的玄幻小说,畅享这个是站点域名!` - ---- - -### **参数映射** -- `{strNovelName}`:从数据库根据 `{intNId}` 获取小说标题。 -- `{strNovelChapterName}`:从数据库根据 `{intChapterSort}` 获取章节名。 -- `{strNovelChapterSort}`:直接使用路由中的 `{intChapterSort}`。 -- `{intPage}`:直接使用路由中的 `{intPage}`。 -- `{strNovelAuthor}`:从数据库获取作者名。 -- `{strNovelCategoryName}`:从数据库获取分类(如“玄幻”)。 -- `{strNovelSex}`:从数据库获取性别(如“男生”)。 -- `{strNovelStatus}`:从数据库获取状态(如“连载”)。 -- `{strSiteName}` → '这个是网站名' -- `{strSiteDomain}` → '这个是站点域名' -- `{strNovelDescription}`、 `{strSearchKeywords}` → 空(章节页不适用) - ---- - -### **完整拼接示例** -#### **路由:`/xiaoshuo/douluodalu-123/zhang-5/1`** -- 假设: - - `{strNovelName}` = '斗罗大陆' - - `{strNovelChapterSort}` = '5' - - `{strNovelChapterName}` = '魂兽森林' - - `{intPage}` = '1' - - `{strNovelAuthor}` = '唐家三少' - - `{strNovelCategoryName}` = '玄幻' - - `{strNovelSex}` = '男生' - - `{strNovelStatus}` = '连载' -- **Title**: - - `斗罗大陆 第5章 魂兽森林 - 这个是网站名` -- **Keywords**: - - `斗罗大陆, 第5章, 魂兽森林, 唐家三少, 玄幻小说, 男生小说, 这个是网站名, 免费阅读` -- **Description**: - - `这个是网站名提供斗罗大陆第5章魂兽森林免费阅读,唐家三少创作的玄幻小说,畅享这个是站点域名!` - -#### **路由:`/xiaoshuo/douluodalu-123/zhang-5/2`** -- `{intPage}` = '2' -- **Title**: - - `斗罗大陆 第5章 魂兽森林 - 这个是网站名` (若需分页,可加“- 第2页”,但需截断) -- **Keywords**: - - `斗罗大陆, 第5章, 魂兽森林, 唐家三少, 玄幻小说, 男生小说, 这个是网站名, 免费阅读` -- **Description**: - - `这个是网站名提供斗罗大陆第5章魂兽森林免费阅读,唐家三少创作的玄幻小说,畅享这个是站点域名!` - ---- - -### **实现代码(伪代码)** -```php -public function getChapter($strPinYin, $intNId, $intChapterSort, $intPage) { - // 假设从数据库获取小说和章节信息 - $novel = Novel::find($intNId); - $chapter = Chapter::where('novel_id', $intNId)->where('sort', $intChapterSort)->first(); - - $replacements = [ - '{strSiteName}' => '这个是网站名', - '{strSiteDomain}' => '这个是站点域名', - '{strSiteTitle}' => '这个是网站标题', - '{strSiteKeywords}' => '这个是网站关键字', - '{strNovelName}' => $novel->title ?? '', - '{strNovelChapterName}' => $chapter->title ?? '', - '{strNovelChapterSort}' => $intChapterSort, - '{intPage}' => $intPage, - '{strNovelAuthor}' => $novel->author ?? '', - '{strNovelCategoryName}' => $novel->category ?? '', - '{strNovelSex}' => $novel->sex === 'boys' ? '男生' : '女生', - '{strNovelStatus}' => $novel->status === 'ongoing' ? '连载' : '完结', - '{strNovelDescription}' => '', - '{strSearchKeywords}' => '' - ]; - - $title = "{strNovelName} 第{strNovelChapterSort}章 {strNovelChapterName} - {strSiteName}"; - $keywords = "{strNovelName}, 第{strNovelChapterSort}章, {strNovelChapterName}, {strNovelAuthor}, {strNovelCategoryName}小说, {strNovelSex}小说, {strSiteName}, 免费阅读"; - $description = "{strSiteName}提供{strNovelName}第{strNovelChapterSort}章{strNovelChapterName}免费阅读,{strNovelAuthor}创作的{strNovelCategoryName}小说,畅享{strSiteDomain}!"; - - foreach ($replacements as $key => $value) { - $title = str_replace($key, $value, $title); - $keywords = str_replace($key, $value, $keywords); - $description = str_replace($key, $value, $description); - } - - return view('chapter', [ - 'title' => $title, - 'keywords' => $keywords, - 'description' => $description, - 'novel' => $novel, - 'chapter' => $chapter - ]); -} -``` - ---- - -### **SEO 优化亮点** -1. **章节精准**:`{strNovelName} 第{strNovelChapterSort}章 {strNovelChapterName}` 匹配用户搜索具体章节的习惯。 -2. **关键词丰富**:包含小说名、章节、作者、分类等多维度词。 -3. **分页支持**:`{intPage}` 可灵活扩展,若章节内容分多页,可在 Title 或 Description 中体现。 -4. **品牌融入**:`{strSiteName}` 和 `{strSiteDomain}` 提升网站辨识度。 -5. **吸引点击**:突出“免费阅读”和“畅享”,契合用户需求。 - ---- - -### **与分类案例的区别** -- **分类页**:聚焦筛选条件(如“男生玄幻连载小说”),多分页。 -- **章节页**:聚焦具体章节(如“斗罗大陆 第5章”),单章节内容。 - -这个 TKD 模板是小说章节页的最优 SEO 方案。如果需要调整(比如更短的 Title 或分页处理),可以告诉我! diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说详情页TKD设计.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说详情页TKD设计.md deleted file mode 100644 index 3aec202..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/小说详情页TKD设计.md +++ /dev/null @@ -1,195 +0,0 @@ -最牛的seo 优化大师 -词量好像少了点,想无广告 最新章节 这些。。 你看看可以加多些词入取,你看看 顶级同行是咋做的,多收罗些数据 -这个是 替换标识 这个页面下面的标签都可以使用,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', -'{strNovelName}' => '这个是当前页面小说名字', -'{strNovelCategoryName}' => '当前页面小说分类名字', -'{strNovelSex}' => '当前页面小说是男生还是女生 小说', -'{strNovelStatus}' => '当前页面小说状态 是连载还是完结', -'{strNovelAuthor}' => '小说作者', -'{strNovelDescription}' => '小说简介', - -这个是小说详情页面的路由 -/xiaoshuo/{strPinYin}-{intNId} - -请根据路由和上面的替换标识,你帮忙设计200套最友好seo的 tkd 替换模板,字数要符合常规,不要超标也不要少,质量要保证,不要重复 -返回格式: -title :[ - '{strNovelName} - {strNovelAuthor} - {strSiteName} - 免费阅读', - .. -] - -keywords: [ - '{strNovelName}, {strNovelAuthor}, {strNovelCategoryName}小说, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费阅读', - .. - ] -description: [ - '{strSiteName}提供{strNovelName}免费在线阅读,{strNovelAuthor}创作的{strNovelCategoryName}{strNovelStatus}小说,{strNovelDescription},欢迎体验{strSiteDomain}!', - .. - ] - - -好的,我会根据你提供的小说详情页面路由 `/xiaoshuo/{strPinYin}-{intNId}` 和替换标识,设计一个最优的 SEO 友好的 TKD 模板。小说详情页面与分类页面不同,它聚焦于具体的小说,因此需要突出小说的标题、作者、分类等信息,同时融入网站品牌和吸引点击的元素。以下是我的设计: - ---- - -### **分析** -#### **路由特点** -- **路由**:`/xiaoshuo/{strPinYin}-{intNId}` - - `{strPinYin}`:小说的拼音(如小说名的拼音,用于 URL 可读性)。 - - `{intNId}`:小说 ID(唯一标识符)。 -- **页面类型**:小说详情页,通常展示小说标题、作者、简介、分类、状态等信息。 -- **SEO 目标**: - - 突出具体小说(如 `{strNovelName}`)。 - - 融入分类、性别、状态等信息,提升相关性。 - - 吸引用户点击阅读。 - -#### **替换标识使用** -- **核心字段**: - - `{strNovelName}`:小说标题。 - - `{strNovelAuthor}`:小说作者。 - - `{strNovelCategoryName}`:小说分类。 - - `{strNovelSex}`:男生/女生小说。 - - `{strNovelStatus}`:连载/完结。 - - `{strSiteName}`、 `{strSiteDomain}`:品牌词。 -- **不适用字段**: - - `{intPage}`:详情页通常无分页,设为默认值 1 或留空。 - - `{strNovelChapterName}`、 `{strNovelChapterSort}`:更适合章节页面。 - - `{strSearchKeywords}`:搜索页专用。 - -#### **SEO 优化原则** -- **Title**:简洁(60 字符内),包含小说名和品牌词。 -- **Keywords**:覆盖小说名、分类、作者等高相关性词。 -- **Description**:吸引点击,融入简介和免费阅读亮点。 - ---- - -### **优化后的 TKD 模板** -以下是专为小说详情页面设计的 TKD 模板: - -#### **1. Title**(控制在 60 字符以内) -- **模板**:`{strNovelName} - {strNovelAuthor} - {strSiteName} - 免费阅读` -- **说明**: - - `{strNovelName}`:核心关键词,放在首位吸引搜索。 - - `{strNovelAuthor}`:增加作者相关搜索的匹配度。 - - `{strSiteName}`:品牌词。 - - “免费阅读”:提升点击率。 -- **示例**(假设小说名为“斗罗大陆”,作者为“唐家三少”): - - `斗罗大陆 - 唐家三少 - 这个是网站名 - 免费阅读` - -#### **2. Keywords**(5-10 个核心词) -- **模板**:`{strNovelName}, {strNovelAuthor}, {strNovelCategoryName}小说, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费阅读` -- **说明**: - - `{strNovelName}` 和 `{strNovelAuthor}`:具体小说的核心词。 - - `{strNovelCategoryName}小说`、 `{strNovelSex}小说`、 `{strNovelStatus}小说`:分类相关词。 - - `{strSiteName}`:品牌词。 - - “免费阅读”:高频行业词。 -- **示例**: - - `斗罗大陆, 唐家三少, 玄幻小说, 男生小说, 连载小说, 这个是网站名, 免费阅读` - -#### **3. Description**(150-160 字符) -- **模板**:`{strSiteName}提供{strNovelName}免费在线阅读,{strNovelAuthor}创作的{strNovelCategoryName}{strNovelStatus}小说,{strNovelDescription},欢迎体验{strSiteDomain}!` -- **说明**: - - `{strSiteName}` 和 `{strSiteDomain}`:品牌露出。 - - `{strNovelName}` 和 `{strNovelAuthor}`:突出小说和作者。 - - `{strNovelCategoryName}{strNovelStatus}小说`:分类和状态信息。 - - `{strNovelDescription}`:简介吸引用户(需控制长度)。 -- **示例**(假设简介为“少年逆天崛起”): - - `这个是网站名提供斗罗大陆免费在线阅读,唐家三少创作的玄幻连载小说,少年逆天崛起,欢迎体验这个是站点域名!` - ---- - -### **参数映射** -- `{strNovelName}`:从数据库根据 `{intNId}` 获取小说标题。 -- `{strNovelAuthor}`:从数据库获取作者名。 -- `{strNovelCategoryName}`:从数据库获取分类(如“玄幻”)。 -- `{strNovelSex}`:从数据库获取性别(如“男生”)。 -- `{strNovelStatus}`:从数据库获取状态(如“连载”)。 -- `{strNovelDescription}`:从数据库获取简介(需截断至合适长度)。 -- `{strSiteName}` → '这个是网站名' -- `{strSiteDomain}` → '这个是站点域名' -- `{strSiteTitle}` → '这个是网站标题' -- `{strSiteKeywords}` → '这个是网站关键字' -- `{intPage}` → 1(详情页无分页) -- `{strNovelChapterName}`、 `{strNovelChapterSort}`、 `{strSearchKeywords}` → 空 - ---- - -### **完整拼接示例** -#### **路由:`/xiaoshuo/douluodalu-123`** -- 假设: - - `{strNovelName}` = '斗罗大陆' - - `{strNovelAuthor}` = '唐家三少' - - `{strNovelCategoryName}` = '玄幻' - - `{strNovelSex}` = '男生' - - `{strNovelStatus}` = '连载' - - `{strNovelDescription}` = '少年逆天崛起,成就无上斗罗' -- **Title**: - - `斗罗大陆 - 唐家三少 - 这个是网站名 - 免费阅读` -- **Keywords**: - - `斗罗大陆, 唐家三少, 玄幻小说, 男生小说, 连载小说, 这个是网站名, 免费阅读` -- **Description**: - - `这个是网站名提供斗罗大陆免费在线阅读,唐家三少创作的玄幻连载小说,少年逆天崛起,成就无上斗罗,欢迎体验这个是站点域名!` - ---- - -### **实现代码(伪代码)** -```php -public function getNovelDetail($strPinYin, $intNId) { - // 假设从数据库获取小说信息 - $novel = Novel::find($intNId); // 示例,需替换为实际逻辑 - - $replacements = [ - '{strSiteName}' => '这个是网站名', - '{strSiteDomain}' => '这个是站点域名', - '{strSiteTitle}' => '这个是网站标题', - '{strSiteKeywords}' => '这个是网站关键字', - '{strNovelName}' => $novel->title ?? '', - '{strNovelAuthor}' => $novel->author ?? '', - '{strNovelCategoryName}' => $novel->category ?? '', - '{strNovelSex}' => $novel->sex === 'boys' ? '男生' : '女生', - '{strNovelStatus}' => $novel->status === 'ongoing' ? '连载' : '完结', - '{strNovelDescription}' => substr($novel->description ?? '', 0, 50), // 截断简介 - '{intPage}' => 1, // 详情页无分页 - '{strNovelChapterName}' => '', - '{strNovelChapterSort}' => '', - '{strSearchKeywords}' => '' - ]; - - $title = "{strNovelName} - {strNovelAuthor} - {strSiteName} - 免费阅读"; - $keywords = "{strNovelName}, {strNovelAuthor}, {strNovelCategoryName}小说, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费阅读"; - $description = "{strSiteName}提供{strNovelName}免费在线阅读,{strNovelAuthor}创作的{strNovelCategoryName}{strNovelStatus}小说,{strNovelDescription},欢迎体验{strSiteDomain}!"; - - foreach ($replacements as $key => $value) { - $title = str_replace($key, $value, $title); - $keywords = str_replace($key, $value, $keywords); - $description = str_replace($key, $value, $description); - } - - return view('novel_detail', [ - 'title' => $title, - 'keywords' => $keywords, - 'description' => $description, - 'novel' => $novel - ]); -} -``` - ---- - -### **SEO 优化亮点** -1. **小说名优先**:`{strNovelName}` 放在 Title 和 Keywords 首位,匹配用户搜索习惯(如“斗罗大陆 小说”)。 -2. **作者强化**:`{strNovelAuthor}` 提升作者粉丝的搜索命中率。 -3. **分类信息**:`{strNovelCategoryName}` 和 `{strNovelStatus}` 增加长尾词覆盖(如“玄幻连载小说”)。 -4. **简介吸引**:`{strNovelDescription}` 简短展示小说亮点,激发阅读兴趣。 -5. **品牌融入**:`{strSiteName}` 和 `{strSiteDomain}` 提升网站辨识度。 - ---- - -### **与分类案例的区别** -- **分类页**(你的案例):聚焦类别(如“男生玄幻连载小说”),分页较多。 -- **详情页**(此设计):聚焦具体小说(如“斗罗大陆”),无分页,突出标题和作者。 - -这个 TKD 模板是小说详情页的最优 SEO 方案。如果需要调整(比如更短的 Description 或更多关键词),可以告诉我! \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/搜索页Tkd.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/搜索页Tkd.md deleted file mode 100644 index a152b35..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/搜索页Tkd.md +++ /dev/null @@ -1,98 +0,0 @@ -最牛的seo 优化大师 -这个是 替换标识 这个页面下面的标签都可以使用,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', -'{intPage}' => '当前页面分页页码', -'{strSearchKeywords}' => '搜索关键词', - -这个是搜索页面的路由,公用一套视图模板 -/search?keyword=jj&page=1 - -请根据路由和上面的替换标识,你帮忙设计100套最友好seo的 tkd 替换模板,字数要符合常规,不要超标也不要少,质量要保证 -返回格式: -title :[ - '{strSearchKeywords} - {strSiteName}搜索 - 第{intPage}页', - .. -] - -keywords: [ - '{strSearchKeywords}, {strSiteName}, 免费阅读, 在线搜索, 第{intPage}页', - .. - ] -description: [ - '{strSearchKeywords}搜索结果尽在{strSiteName},第{intPage}页提供免费阅读,访问{strSiteDomain}立即体验!', - .. - ] - - - - - -根据你提供的搜索页面路由 `/search?keyword=jj&page=1` 和替换标识,我将为你设计一个针对搜索页面的 **SEO 友好** 的 TKD(Title、Keywords、Description)替换模板。搜索页面的 TKD 需要兼顾搜索引擎的抓取规则和用户体验,突出搜索关键词、分页信息以及站点品牌,同时保持自然流畅的语言。 - -以下是设计思路和最终模板: - -### 设计思路 -1. **Title(标题)**: - - 突出 `{strSearchKeywords}`(搜索关键词),这是搜索页面的核心。 - - 加入 `{strSiteName}` 和 `{intPage}`,强化品牌和分页信息。 - - 保持标题长度在 60 个字符以内(中文算 2 个字符),避免被搜索引擎截断。 - - 使用分隔符(如 `-` 或 `|`)增强可读性。 - -2. **Keywords(关键词)**: - - 包含 `{strSearchKeywords}` 作为主关键词。 - - 搭配站点品牌 `{strSiteName}` 和通用修饰词(如“免费阅读”)。 - - 避免堆砌,保持 5-7 个核心词组,简洁且相关。 - -3. **Description(描述)**: - - 以 `{strSearchKeywords}` 开头,吸引用户点击。 - - 融入 `{strSiteName}`、 `{strSiteDomain}` 和 `{intPage}`,提升品牌曝光。 - - 控制在 150-160 个字符以内,确保完整显示在搜索结果中。 - - 添加号召性语言(如“立即体验”),提升点击率。 - -### 搜索页面 TKD 替换模板 -基于以上思路,结合你的路由和替换标识,我设计如下模板: - -#### Title -``` -'{strSearchKeywords} - {strSiteName}搜索 - 第{intPage}页' -``` -- **示例**:输入 `keyword=jj&page=1` 时,生成: - `jj - 这个是网站名搜索 - 第1页` -- **解析**:标题简洁,直观展示搜索关键词,品牌名靠后,分页信息明确,适合搜索引擎和用户快速理解。 - -#### Keywords -``` -'{strSearchKeywords}, {strSiteName}, 免费阅读, 在线搜索, 第{intPage}页' -``` -- **示例**:输入 `keyword=jj&page=1` 时,生成: - `jj, 这个是网站名, 免费阅读, 在线搜索, 第1页` -- **解析**:关键词覆盖搜索词、站点名和通用阅读相关词,分页信息作为辅助,简洁不冗余。 - -#### Description -``` -'{strSearchKeywords}搜索结果尽在{strSiteName},第{intPage}页提供免费阅读,访问{strSiteDomain}立即体验!' -``` -- **示例**:输入 `keyword=jj&page=1` 时,生成: - `jj搜索结果尽在这个是网站名,第1页提供免费阅读,访问这个是站点域名立即体验!` -- **字符数**:约 50 个中文字符(100 字节),在搜索引擎显示范围内。 -- **解析**:描述以搜索关键词开头,融入品牌和域名,结尾有行动号召,兼顾 SEO 和用户吸引。 - -### 优化后的特点 -1. **动态适配**:模板根据 `{strSearchKeywords}` 和 `{intPage}` 动态生成,确保每个搜索页面 TKD 唯一,避免重复内容。 -2. **SEO 友好**:标题和描述中关键词靠前,分页信息明确,符合搜索引擎对搜索结果页的偏好。 -3. **用户体验**:语言自然,突出免费阅读和品牌,吸引用户点击。 -4. **可扩展性**:如果未来需要调整(如加入小说分类或状态),模板可以轻松扩展。 - -### 与分类页面案例的对比 -你的分类页面案例更偏向小说分类的结构化内容(包含 `{strNovelSex}`、 `{strNovelCategoryName}` 等),而搜索页面需要更灵活地围绕 `{strSearchKeywords}` 构建。搜索页面的 TKD 应尽量简洁,避免过多无关变量,确保聚焦用户输入的关键词。 - -### 如果需要调整 -如果你希望在搜索页面加入更多变量(如 `{strNovelStatus}` 或 `{strNovelCategoryName}`),可以告诉我具体需求,我再帮你调整。例如: -- 如果搜索结果只限于某分类,可以加入 `{strNovelCategoryName}`: - ``` - Title: '{strSearchKeywords} - {strNovelCategoryName} - {strSiteName} - 第{intPage}页' - ``` - -请告诉我你的想法或具体需求,我可以进一步优化! \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/男生女生页面TKD设计.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/男生女生页面TKD设计.md deleted file mode 100644 index 801a9af..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/男生女生页面TKD设计.md +++ /dev/null @@ -1,189 +0,0 @@ -最牛的seo 优化大师 -这个是 替换标识 这个页面下面的标签都可以使用 ,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', -'{intPage}' => '当前页面分页页码', -'{strNovelSex}' => '当前页面小说是男生还是女生 小说', - -这个是男生和女生的路由,公用一套视图模板 -Route::get('/nansheng-xiaoshuo', [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => true, 'strChannel' => 'boys']); -Route::get('/nvsheng-xiaoshuo', [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => true, 'strChannel' => 'girls']); - -请根据路由和上面的替换标识,你帮忙设计100套最友好seo的 tkd 替换模板,字数要符合常规,不要超标也不要少,质量要保证 -返回格式: -title :[ - '{strNovelSex}小说 - {strSiteName} - 免费阅读 - 第{intPage}页', - .. -] - -keywords: [ - '{strNovelSex}小说, {strSiteKeywords}, 免费小说, 在线阅读, {strSiteName}', - .. - ] -description: [ - '{strSiteName}提供{strNovelSex}小说免费在线阅读,第{intPage}页精选热门作品,畅享{strSiteDomain},{strNovelSex}小说迷必备', - .. - ] - - - - - -好的,我会根据你提供的路由和替换标识,设计一个最优的 SEO 友好的 TKD 模板,适用于男生和女生频道的公用视图模板(`/nansheng-xiaoshuo` 和 `/nvsheng-xiaoshuo`)。这个设计将结合你的案例,同时优化关键词密度、品牌曝光和用户吸引力。 - ---- - -### **分析** -#### **路由特点** -- **路由**: - - `/nansheng-xiaoshuo`:男生小说频道,`strChannel = 'boys'`。 - - `/nvsheng-xiaoshuo`:女生小说频道,`strChannel = 'girls'`。 -- **参数**: - - `boolIsMobile = true`:适配移动端。 - - 无具体分类 (`strCategory`) 和状态 (`strStatus`) 参数,因此这是一个频道首页,展示男生或女生小说的概览。 - - `{intPage}` 在路由中未显式定义,但可能通过视图逻辑支持分页。 - -#### **替换标识** -- `{strNovelSex}`:从 `strChannel` 映射为“男生”或“女生”。 -- `{strNovelCategoryName}` 和 `{strNovelStatus}`:频道首页无具体分类和状态,需调整为通用描述。 -- `{strSiteName}`、 `{strSiteDomain}` 等:用于品牌强化。 -- `{strNovelName}`、 `{strNovelChapterName}` 等:频道首页不适用,留空。 - -#### **SEO 目标** -- 突出频道特性(男生/女生小说)。 -- 融入品牌词(网站名、域名)。 -- 适配分页(如果有)。 -- 吸引移动端用户(`boolIsMobile = true`)。 - ---- - -### **优化后的 TKD 模板** -以下是专为频道首页设计的 TKD 模板,基于你的案例并进一步优化: - -#### **1. Title**(控制在 60 字符以内) -- **模板**:`{strNovelSex}小说 - {strSiteName} - 免费阅读 - 第{intPage}页` -- **说明**: - - `{strNovelSex}` 突出频道主题(男生/女生)。 - - `{strSiteName}` 强化品牌。 - - “免费阅读”吸引用户点击。 - - `{intPage}` 仅在大于 1 时显示,避免首页面冗余。 - -#### **2. Keywords**(5-10 个核心词) -- **模板**:`{strNovelSex}小说, {strSiteKeywords}, 免费小说, 在线阅读, {strSiteName}` -- **说明**: - - `{strNovelSex}小说` 是核心关键词。 - - `{strSiteKeywords}` 复用网站通用关键词。 - - 添加“免费小说”“在线阅读”提升搜索覆盖。 - -#### **3. Description**(150-160 字符) -- **模板**:`{strSiteName}提供{strNovelSex}小说免费在线阅读,第{intPage}页精选热门作品,畅享{strSiteDomain},{strNovelSex}小说迷必备!` -- **说明**: - - `{strSiteName}` 和 `{strSiteDomain}` 提升品牌认知。 - - “免费在线阅读”契合移动端用户习惯。 - - “{strNovelSex}小说迷必备”增加用户粘性。 - ---- - -### **参数映射** -- `{strNovelSex}`: - - `strChannel = 'boys'` → '男生' - - `strChannel = 'girls'` → '女生' -- `{strSiteName}` → '这个是网站名' -- `{strSiteDomain}` → '这个是站点域名' -- `{strSiteTitle}` → '这个是网站标题' -- `{strSiteKeywords}` → '这个是网站关键字' -- `{strSiteDescription}` → '这个是网站描述' -- `{intPage}` → 默认 1,若有分页逻辑则动态传入 -- `{strNovelCategoryName}` → 空(频道首页无具体分类) -- `{strNovelStatus}` → 空(频道首页无状态筛选) -- `{strNovelName}`、 `{strNovelChapterName}`、 `{strNovelChapterSort}`、 `{strNovelAuthor}`、 `{strNovelDescription}`、 `{strSearchKeywords}` → 空(频道首页不适用) - ---- - -### **完整拼接示例** -#### **1. 男生频道首页:`/nansheng-xiaoshuo`(假设 intPage = 1)** -- **Title**: `男生小说 - 这个是网站名 - 免费阅读` -- **Keywords**: `男生小说, 这个是网站关键字, 免费小说, 在线阅读, 这个是网站名` -- **Description**: `这个是网站名提供男生小说免费在线阅读,第1页精选热门作品,畅享这个是站点域名,男生小说迷必备!` - -#### **2. 女生频道首页:`/nvsheng-xiaoshuo`(假设 intPage = 1)** -- **Title**: `女生小说 - 这个是网站名 - 免费阅读` -- **Keywords**: `女生小说, 这个是网站关键字, 免费小说, 在线阅读, 这个是网站名` -- **Description**: `这个是网站名提供女生小说免费在线阅读,第1页精选热门作品,畅享这个是站点域名,女生小说迷必备!` - -#### **3. 男生频道分页:`/nansheng-xiaoshuo`(假设 intPage = 2)** -- **Title**: `男生小说 - 这个是网站名 - 免费阅读 - 第2页` -- **Keywords**: `男生小说, 这个是网站关键字, 免费小说, 在线阅读, 这个是网站名` -- **Description**: `这个是网站名提供男生小说免费在线阅读,第2页精选热门作品,畅享这个是站点域名,男生小说迷必备!` - ---- - -### **实现代码(伪代码)** -```php -public function getNovelChannel($strChannel) { - // 映射表 - $sexMap = [ - 'boys' => '男生', - 'girls' => '女生' - ]; - - // 替换标识赋值 - $replacements = [ - '{strSiteName}' => '这个是网站名', - '{strSiteDomain}' => '这个是站点域名', - '{strSiteTitle}' => '这个是网站标题', - '{strSiteKeywords}' => '这个是网站关键字', - '{strSiteDescription}' => '这个是网站描述', - '{strNovelSex}' => $sexMap[$strChannel] ?? '', - '{strNovelCategoryName}' => '', // 频道首页无具体分类 - '{strNovelStatus}' => '', // 频道首页无状态 - '{intPage}' => request()->input('page', 1), // 默认第1页,假设分页通过查询参数传入 - '{strNovelName}' => '', - '{strNovelChapterName}' => '', - '{strNovelChapterSort}' => '', - '{strNovelAuthor}' => '', - '{strNovelDescription}' => '', - '{strSearchKeywords}' => '' - ]; - - // 动态生成 TKD - $pageStr = $replacements['{intPage}'] > 1 ? " - 第{intPage}页" : ''; - $title = "{strNovelSex}小说 - {strSiteName} - 免费阅读{$pageStr}"; - $keywords = "{strNovelSex}小说, {strSiteKeywords}, 免费小说, 在线阅读, {strSiteName}"; - $description = "{strSiteName}提供{strNovelSex}小说免费在线阅读,第{intPage}页精选热门作品,畅享{strSiteDomain},{strNovelSex}小说迷必备!"; - - // 替换模板中的标识 - foreach ($replacements as $key => $value) { - $title = str_replace($key, $value, $title); - $keywords = str_replace($key, $value, $keywords); - $description = str_replace($key, $value, $description); - } - - // 返回视图 - return view('novel_channel', [ - 'title' => $title, - 'keywords' => $keywords, - 'description' => $description, - 'channel' => $strChannel - ]); -} -``` - ---- - -### **SEO 优化亮点** -1. **核心关键词靠前**:`{strNovelSex}小说` 放在 Title 和 Description 开头,提升相关性。 -2. **品牌强化**:`{strSiteName}` 和 `{strSiteDomain}` 融入 TKD,增加网站辨识度。 -3. **移动端适配**:突出“免费在线阅读”,契合 `boolIsMobile = true` 的用户习惯。 -4. **分页友好**:首页面简洁,后续页面自然融入 `{intPage}`,并可配合 `rel="next/prev"` 优化。 -5. **通用性**:模板适用于男生和女生频道,公用一套视图。 - ---- - -### **扩展建议** -- 如果频道首页支持分页,建议通过查询参数(如 `?page=2`)传入 `{intPage}`,并在代码中动态获取。 -- 如果需要加入热门分类(如玄幻、言情),可以在 Description 中扩展描述,例如“涵盖玄幻、武侠等热门类型”。 -- 若 `{strSiteKeywords}` 已包含“小说”相关词,可精简 Keywords,避免重复。 - -这个 TKD 模板是目前最优的 SEO 方案,兼顾了搜索排名和用户体验。如果有其他需求(比如具体分类或搜索页面),可以告诉我,我再调整! \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/首页 文案.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/首页 文案.md deleted file mode 100644 index 3e86eed..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/TKD/首页 文案.md +++ /dev/null @@ -1,23 +0,0 @@ -最牛的seo 优化大师 -词量好像少了点, 你看看可以加多些词入取,你看看 顶级同行是咋做的,多收罗些数据 -这个是 替换标识 这个页面下面的标签都可以使用,{strSiteKeywords} 是全局公用关键词,你看看怎么使用 -'{strSiteName}' => '这个是网站名', -'{strSiteDomain}' => '这个是站点域名', -'{strSiteKeywords}' => '这个是网站全局通用关键字', - - -请根据路由和上面的替换标识,你帮忙设计200套最友好seo的 替换模板,字数要符合常规,不要超标也不要少,质量要保证,不要重复 -返回格式: -首页-热门小说介绍文案 :[ - ''精选全网热评佳作,涵盖玄幻冒险、都市传奇、穿越重生等多种类型,带你领略最受欢迎的阅读热潮,快来发现你的下一本心动之作!',', - .. -] - -首页-最新小说介绍文案: [ - '每日更新最新章节,囊括玄幻修真、都市爽文、重生逆袭等热门题材,紧跟作者步伐,第一时间畅读新鲜故事!', - .. - ] -首页-排行榜介绍文案: [ - '汇聚读者最爱的小说排行,日榜、周榜、月榜一网打尽,玄幻巅峰、都市热血、完结经典全都有,助你快速找到高人气好书!', - .. - ] diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/index.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/index.md deleted file mode 100644 index 8585cfa..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/index.md +++ /dev/null @@ -1,93 +0,0 @@ -# 狂雨小说模板 - 源地址: test.nove66.net , cms 模板部署在虚拟机 - -# 是否带.html 后缀 - 根据ai 分析,不带 html 版本更具好, 第一版本不带 html - -# pc 和 h5端是否需要2个url? - 根据ai 分析,2个url 使用js 区分跳转 ,不是最优方案,h5和pc 使用一个url 才是最优方案 - -# 数据渲染 -PC -公共数据 -底部 友情链接 -底部 每日热搜小说推荐: kan 数据列表随机展示20个 -pc-首页 - 1.首页第一板块:推荐等级为9的连载的 随机15个小说 - 2.首页第二板块:热门小说:推荐等级为9的完结的 随机12个小说 - 3.首页第三板块:男生频道,最新的 随机5个小说 - 男生频道,周排行榜 随机10个小说 - 男生频道,月排行榜 随机10个小说 - 男生频道,总排行榜 随机10个小说 - 4.首页第四板块:女生频道,最新的 随机5个小说 - 女生频道,周排行榜 随机10个小说 - 女生频道,月排行榜 随机10个小说 - 女生频道,总排行榜 随机10个小说 - 5.首页第五板块: 最近更新-随机50 - - - - - -# 第一版本 - 1.设计好url 规则 - 2.设计好tdk模板 - 3.渲染好内容 - 4.干扰码优化: - 4.1方案1: 每个列表里每个视频元素a标签前面 生成一个 干扰码 - 4.2方案2: - 后面 随机 10-30个标签 - 前面面 随机 10-30个标签 - body 中间 选择 5-10行 , a 标签前面 生成一个干扰码 - 5.详情 title 模板 设置 - - - - -# 第二版本 - 1.增加广广告配置,(所有站点会放一些广告,广告内容是我们的视频站点,这个站点主要收集一些 香港片,目的是增加留存) - 2.html 检查优化 - 3.地图生成 - 4.收录推送 - 5.友情链接 - 6.热搜词 顶部收索框下面展示,全站通用,每个站点随机展示10条 - 7.需要指定一个小说id 的内容页面 展示为首页,然后现在的首页路径改成 nindex - - - - - -# 第三版本 - 1.文章 板块 - - - -# 替换模板 需要根据域名绑定的 - -1.其他所有 替换模板分组 : 每个域名 随机绑定一个替换模板 - -2.(特殊化)小说详情 title : 每个域名 / 每个小说 随机绑定一个 替换模板 - -3.(特殊化) 页面url 配置 : - 每个域名 绑定一个替换模板,但是这里有个特殊需求( - 看下面,比喻第一组,详情页面选择了 xiaoshuo 这个 命名,那我希望 章节和目录也是选择这个 带有 xiaoshuo 的命名模板 - ) -``` - 1组 - 详情页url '/xiaoshuo/{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}' - 章节页url '/xiaoshuo/{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - 目录页url '/xiaoshuo/{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}', - 其它页面。。。 - - 2组 - 详情页url '/novel/{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}' - 章节页url '/ novel/{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - 目录页url '/novel/{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}', - 其它页面。。。 - - 3组 - 详情页url '/book/{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}' - 章节页url '/book/{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - 目录页url '/book/{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}', - 其它页面。。。 -``` \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/上线前数据准备.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/上线前数据准备.md deleted file mode 100644 index 0c6bebf..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/上线前数据准备.md +++ /dev/null @@ -1,15 +0,0 @@ -首页-head - 站点名字 - 站点域名 - 站点全局通用关键词 - 站点描述 丰富首页内容 - title - keywords - description - 文字logo - 模板 选择 - -替换模板数据准备 - 首页-热门小说介绍文案 - 首页-最新小说介绍文案 - 首页-排行榜介绍文案 \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/书库页面设计.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/书库页面设计.md deleted file mode 100644 index e9f3d48..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/书库页面设计.md +++ /dev/null @@ -1,11 +0,0 @@ -# 书库页面设计 - -# grok 推荐 -`` - 推荐URL:{$strPcPath}/shuku/nansheng/dushixiuxian/lianzai/1 - 全部URL:{$strPcPath}/shuku/all/all/all/1 - 理由: - all 提供语义支持,SEO友好。 - 拼音关键词(如 nansheng、lianzai)直接优化中文搜索。 - 多参数结构支持组合筛选,权重集中。 -`` \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/小说目录页面.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/小说目录页面.md deleted file mode 100644 index e9e8b3b..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/小说目录页面.md +++ /dev/null @@ -1,37 +0,0 @@ - -``` - 最终推荐 - 推荐URL:/xiaoshuo/[name]-[novel-id]/mulu/[order]/[page] - 示例: - 正序:/xiaoshuo/doupo-123/mulu/zheng/1 - 倒序:/xiaoshuo/doupo-123/mulu/dao/1 - 长拼音名:/xiaoshuo/zhong-sheng-zhi-dao-zun-456/mulu/dao/1 - 理由: - SEO最佳: - xiaoshuo 和 mulu 保留核心关键词。 - zheng 和 dao 是拼音,匹配“正序目录”“倒序目录”搜索。 - 语义清晰: - /mulu/zheng/1 直观表示“目录 正序 第1页”。 - 一致性: - 与章节页(/xiaoshuo/doupo-123/zhang-45/1)的拼音风格统一。 - 分页和排序分离: - [order] 和 [page] 分开,便于扩展其他筛选。 -``` - - - -## SEO优化建议 -标题: -斗破苍穹 章节目录 - 全集在线阅读 - 网站名 -元描述: - -H1标签: -

    斗破苍穹 章节目录

    -面包屑: -首页 > 小说 > 斗破苍穹 > 章节目录 -内部链接: -目录页链接到每个章节(如 /xiaoshuo/doupo-123/zhang-45/1),提升内链权重。 -Canonical标签: - -Sitemap: -包含所有目录页URL(如 /xiaoshuo/doupo-123/mulu/1、/xiaoshuo/doupo-123/mulu/2),提交搜索引擎。 \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/小说章节.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/小说章节.md deleted file mode 100644 index 61d3ab6..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/小说章节.md +++ /dev/null @@ -1,25 +0,0 @@ -# 小说章节页面 设计记录 grok反馈 - -最终推荐 -推荐URL:/xiaoshuo/[name]-[novel-id]/zhang-[chapter-sort]/[page] -示例: -/xiaoshuo/doupo-123/zhang-45/1 -/xiaoshuo/zhong-sheng-zhi-dao-zun-456/zhang-45/1 -理由: -SEO最佳: -xiaoshuo 和 zhang 是高频搜索词,提升通用性。 -name(如 doupo)匹配小说名搜索。 -chapter-sort(如 45)匹配“第X章”。 -长拼音优化: -zhong-sheng-zhi-dao-zun 已用 - 分割,语义清晰,匹配“重生 至尊”。 -统一性: -PC和H5共用URL,通过 request()->isMobile() 动态渲染。 -简洁性: -去掉 intChapterId,假设 chapterSort 足以标识章节。 - - -## SEO优化建议 -标题:斗破苍穹 第45章 - 小说在线阅读 - 网站名 -元描述: -面包屑:首页 > 小说 > 斗破苍穹 > 第45章 -Canonical: \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/干扰吗设计.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/干扰吗设计.md deleted file mode 100644 index 491b3d2..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/干扰吗设计.md +++ /dev/null @@ -1,38 +0,0 @@ -在讨论这个问题时,我们需要明确一点:向 HTML 中插入带有随机 ID、类名或隐藏内容的标签(如 ``、`
    `、`` 等 `style="display:none;"` 的元素),其目的是否是为了欺骗搜索引擎(如 Google 的爬虫/蜘蛛),让其认为页面内容是原创的,而不是伪原创或复制内容。 - -### 这种做法的效果与风险 -1. **搜索引擎蜘蛛的判断机制** - - 现代搜索引擎(如 Google、Bing)使用复杂的算法来判断页面内容的原创性。它们不仅分析可见内容,还会检查 HTML 结构、元数据、语义、链接模式,甚至用户行为信号(如停留时间、跳出率)。 - - 隐藏内容(`display:none;`)通常会被搜索引擎忽略,因为它们认为这些内容对用户无意义。如果大量使用隐藏标签填充无意义或随机字符串,反而可能被视为“内容填充”(keyword stuffing)或“隐藏文本”(hidden text),这是违反搜索引擎优化(SEO)规则的行为。 - -2. **伪原创的检测** - - 搜索引擎不会仅仅因为你添加了一些随机标签就认为内容是原创的。它们更关注文本的语义相似性、句子结构、词频分布等。 - - 如果你的页面主要内容(比如 `

    ` 标签中的文章)是从其他地方复制的,即使插入了这些随机标签,搜索引擎依然可以通过比对主要内容判断出伪原创。 - -3. **潜在风险** - - **惩罚风险**:Google 的《网站管理员指南》中明确禁止使用“隐藏文本或链接”来操纵排名。如果被检测到这种行为,你的网站可能会被降权甚至从索引中移除。 - - **用户体验**:虽然这些标签对用户不可见,但如果代码过于冗余,可能增加页面加载时间,间接影响 SEO。 - -### 这种做法是否“有助于”伪原创? -- **短期效果**:理论上,插入随机标签可能会让页面的 HTML 结构看起来与原始页面有所不同,稍微增加伪原创的“伪装性”。但这只是表面功夫,搜索引擎的算法早已超越了简单对比 HTML 结构。 -- **长期效果**:几乎没有帮助,反而可能引发负面后果。搜索引擎更倾向于分析内容的实际价值,而不是这些“噪声”标签。 - -### 更好的伪原创策略(合法且有效) -如果你确实想通过修改内容来提高原创性,可以尝试以下方法: -1. **重写文本**:用自己的语言重新组织句子,改变表达方式。 -2. **添加独特内容**:插入原创的评论、分析或数据。 -3. **优化结构**:调整标题、段落布局,添加图片或多媒体(配上原创描述)。 -4. **合法引用**:如果引用他人内容,标注来源,避免被视为抄袭。 - -### 结论 -插入这些随机标签并不会真正帮助蜘蛛判断内容是伪原创,反而可能被视为作弊行为。如果你是为了 SEO 或内容优化,建议把精力放在提升内容的实际质量和独特性上,而不是依赖这种技术手段。有没有什么具体场景困扰着你?我可以进一步帮你分析优化方案! - - -对比分析 -维度 格式 1(标准 HTML) 格式 2(自定义标签) -结构复杂性 高(嵌套、多标签) 低(单一标签) -伪装性 较强(像合法 HTML) 较弱(明显异常) -独特性 高(多属性组合) 中等(依赖标签名和属性) -生成难度 较高(需维护嵌套结构) 较低(简单随机生成) -体积与性能 较大(可能影响加载) 较小(轻量) -检测风险 中等(隐藏内容可能被怀疑) 较高(非标准标签易暴露) \ No newline at end of file diff --git a/code/app/home/view/kuangYu/推广SEO过程设计记录/男生女生页面设计.md b/code/app/home/view/kuangYu/推广SEO过程设计记录/男生女生页面设计.md deleted file mode 100644 index 0be9c64..0000000 --- a/code/app/home/view/kuangYu/推广SEO过程设计记录/男生女生页面设计.md +++ /dev/null @@ -1,74 +0,0 @@ -# 男生女生页面 设计 - -# grok 推荐 - -## url 设计: - 问 grok.com - 我目前在做一个seo 小说站点。有 一个男生频道页面和一个女生频道页面,请问这个 url 怎么设计在最友好seo ,请你列出几个最优方案 - -# grok 回复: -在设计SEO友好的URL结构时,需要考虑清晰性、简洁性、关键词相关性以及对搜索引擎和用户的可读性。对于你的小说站点,有男生频道页面和女生频道页面,以下是一些设计URL的最佳实践和具体方案建议: - -### SEO友好URL设计的核心原则 -1. **简洁明了**:URL尽量短,避免冗余参数。 -2. **关键词优化**:包含目标关键词(如“男生小说”“女生小说”),帮助搜索引擎理解页面内容。 -3. **层次清晰**:反映网站结构,方便爬虫抓取和用户导航。 -4. **语言适配**:如果你面向中文用户,可以考虑用拼音或中文(视具体情况)。 -5. **避免动态参数**:尽量使用静态URL,而不是带有“?id=123”之类的内容。 - -### 假设你的网站域名是 `www.example.com` -以下是针对男生频道和女生频道的几个最优URL方案: - -#### 方案1:拼音关键词结构 -- 男生频道:`www.example.com/nansheng-xiaoshuo` -- 女生频道:`www.example.com/nvsheng-xiaoshuo` -- **优点**: - - 使用拼音(如“nansheng”“nvsheng”)清晰表明性别分类,便于中文用户理解。 - - “xiaoshuo”作为关键词,直接指向小说内容,有助于SEO。 - - 简洁且层次分明。 -- **适用场景**:面向中文用户,注重拼音搜索习惯的场景。 - -#### 方案2:英文关键词结构 -- 男生频道:`www.example.com/boys-novels` -- 女生频道:`www.example.com/girls-novels` -- **优点**: - - 国际化设计,适合英文搜索引擎优化。 - - “boys”“girls”和“novels”都是高相关性关键词。 - - URL简短易读。 -- **适用场景**:如果你的站点有国际化需求,或者目标用户可能用英文搜索。 - -#### 方案3:分类目录结构 -- 男生频道:`www.example.com/xiaoshuo/nansheng` -- 女生频道:`www.example.com/xiaoshuo/nvsheng` -- **优点**: - - “xiaoshuo”作为一级目录,表明这是小说类别的主分类。 - - “nansheng”“nvsheng”作为子分类,结构清晰,方便扩展其他类别(如“玄幻”“言情”)。 - - 层次感强,利于搜索引擎理解网站架构。 -- **适用场景**:网站规模较大,计划增加更多分类时。 - -#### 方案4:中文关键词结构 -- 男生频道:`www.example.com/男生小说` -- 女生频道:`www.example.com/女生小说` -- **优点**: - - 直接使用中文关键词,非常直观,符合中文用户的搜索习惯。 - - 如果你的目标搜索引擎(如百度)支持中文URL,会有很好的效果。 -- **缺点**: - - 在某些国际搜索引擎中,中文URL可能需要转码(如`%E7%94%B7%E7%94%9F%E5%B0%8F%E8%AF%B4`),不够美观。 -- **适用场景**:完全面向中文市场,且技术支持中文URL优化。 - -### 推荐选择 -- **首选方案**:**方案1(拼音关键词结构)** - - 理由:拼音URL既保留了中文用户的可读性,又能在大多数搜索引擎中被很好地解析和优化,同时避免了中文转码问题。`www.example.com/nansheng-xiaoshuo` 和 `www.example.com/nvsheng-xiaoshuo` 是兼顾SEO和用户体验的最佳选择。 -- **备选方案**:**方案3(分类目录结构)** - - 理由:如果你的网站未来会扩展更多分类,目录结构更具灵活性,且层次清晰。 - -### 额外建议 -1. **统一URL格式**:无论选择哪种方案,确保全站URL风格一致。 -2. **面包屑导航**:在页面上配合使用面包屑导航(如“首页 > 男生小说”),强化SEO效果。 -3. **301重定向**:如果用户可能通过其他路径访问(如`www.example.com/male`),设置重定向到主URL。 -4. **提交Sitemap**:将最终URL提交到搜索引擎(如百度站长工具或Google Search Console),加速收录。 - -如果你有更具体的网站定位或技术限制,可以告诉我,我再帮你进一步优化! - -## -根据上面第一版本使用 方案1 \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Index/index.html b/code/app/home/view/xiongMao/Index/index.html deleted file mode 100644 index a28f1f0..0000000 --- a/code/app/home/view/xiongMao/Index/index.html +++ /dev/null @@ -1,56 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}index{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}index_xs{/block} - - -{block name="main"} -

    -
    -
    - 完结小说推荐 - www.xmttxs.com -
    - {foreach $arrRecommendNovel as $category} - {include file="Public/novelListH" /} - {/foreach} -
    -
    -
    -
    www.xmttxs.com -

    新书推荐

    -
      - {foreach $arrRecommendNovel as $category} - {include file="Public/novelText" /} - {/foreach} -
    -
    -
    www.xmttxs.com -

    热门连载

    -
      - {foreach $arrRecommendNovel as $category} - {include file="Public/novelText" /} - {/foreach} -
    -
    -
    www.xmttxs.com -

    热门收藏

    -
      - {foreach $arrRecommendNovel as $category} - {include file="Public/novelText" /} - {/foreach} -
    -
    -
    www.xmttxs.com -

    最新更新

    -
      - {foreach $arrRecommendNovel as $category} - {include file="Public/updateNovelList" /} - {/foreach} -
    -
    - -
    -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Novel/getArticleInfo.html b/code/app/home/view/xiongMao/Novel/getArticleInfo.html deleted file mode 100644 index 990ea64..0000000 --- a/code/app/home/view/xiongMao/Novel/getArticleInfo.html +++ /dev/null @@ -1,18 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - 狂雨小说 -

    -{/block} - -{block name="main"} -
    - -article......... -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Novel/getArticleList.html b/code/app/home/view/xiongMao/Novel/getArticleList.html deleted file mode 100644 index 272e206..0000000 --- a/code/app/home/view/xiongMao/Novel/getArticleList.html +++ /dev/null @@ -1,46 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="logo-html"} -

    - 狂雨小说/文章 -

    -{/block} - -{block name="main"} -
    - - - -
    -
    -

    深度解说列表

    -
    -
    -
      - {foreach $arrNewsNovel as $key => $vo} - {include file="Public/articleList" /} - - {/foreach} -
    -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Novel/getNovelCategory.html b/code/app/home/view/xiongMao/Novel/getNovelCategory.html deleted file mode 100644 index 4739a02..0000000 --- a/code/app/home/view/xiongMao/Novel/getNovelCategory.html +++ /dev/null @@ -1,80 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}top_xs{/block} - -{block name="main"} - -
    -
    - {foreach $arrRecommendSerializationNovel as $category} - {include file="Public/novelCategoryList" /} - {/foreach} -
    - -
    -
    -
    -
    - 完结小说推荐 - www.xmttxs.com - -
    - {foreach $arrRecommendSerializationNovel as $category} - {include file="Public/novelListH" /} - {/foreach} -
    -
    - - -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Novel/getNovelChapter.html b/code/app/home/view/xiongMao/Novel/getNovelChapter.html deleted file mode 100644 index 19db0d1..0000000 --- a/code/app/home/view/xiongMao/Novel/getNovelChapter.html +++ /dev/null @@ -1,81 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}chapterlist_xs{/block} -{block name='body-id'}chapterbody{/block} - -{block name="main"} -
    -
    关灯
    -
    护眼
    -
    字体:
    -
    - -
    -

    第7章 终章 上古真神07(第1页)

    -
    - -
    -
    -

    第7章终章·上古真神07

    -

    停歇了两日后再次远行,这次目的地繁华的城市,比起偏远的古镇这里更加喧嚣,空气都变得稀薄。

    -

    他双腿翘在小茶桌上,仰面朝天懒散靠在沙发背上,一眼不眨地盯着说话的小扁盒。

    -

    不得不说现在的人类真的很厉害,上次来还是个大黑盒,现在这么薄看的更加清楚。

    -

    “你又翘桌上!放下去,放下去!”

    -

    白色小身影扑棱着翅膀在他眼前不断晃悠。

    -

    “小鸭子别挡道。”

    -

    白玄飞的更欢了,仰着尖嘴,“不要不要!”

    -

    “你再不放下来,等主人回来让他收拾你!”

    -

    嘿,他的暴脾气!

    -

    他眉眼含笑,语调拉长,“你主人不在,等会就把你炖了!”

    -

    “坏天时!臭天时!丑天时!。。。。。。”

    -

    “你讨厌!。。。。”

    -

    叽叽喳喳地吵死了,楚时红唇拉直,眉宇间透露着一丝烦躁。

    -

    小盒子里的画面变黑,白玄又飞在他旁边没完没了。

    -

    他起身向门外走去,却引来小鸟的阻拦。

    -

    小喙一张一合的,很是滑稽,“你干嘛去!”

    -

    “主人说了,让我看着你。”

    -

    轻啧一声,神情有些不耐,“你好好在家吧。”

    -

    他抬手虚空轻点,整个房间似乎亮了一下化为平静。

    -

    肉眼看不出来的东西却在小白玄黑色眼里映出,一个白色的大网笼罩在整个屋内。

    -

    这是单独针对它的!

    -

    白玄气的在半空中跳脚,“砰”地一声门被关上了,哪里还有天时那家伙地身影。

    -

    此时的楚时漫无目的走在大街上,晚霞红艳洒在大地上,来往的人群似乎变多了。

    -

    侧肩而过的人忍不住侧目投来惊艳的目光。

    -

    楚时站在红绿灯处,凝望着川流不息的车辆,总觉得有些熟悉,眉头不自觉的皱紧。

    -

    这时,三个女孩你推我挤的走过来。

    -

    其中一个脸颊通红,“帅。。。帅哥你好!”

    -

    楚时垂眸,轻声道,“你在和我说话?”

    -

    她慌张地不敢直视,低着头手里手机被紧紧握着,羞红脸结巴道,“是。。是的,能不。。。。能不。。。。”

    -
    -
    -
    - -

    -
    -
    - - -{/block} -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Novel/getNovelChapterAll.html b/code/app/home/view/xiongMao/Novel/getNovelChapterAll.html deleted file mode 100644 index 0c73bf9..0000000 --- a/code/app/home/view/xiongMao/Novel/getNovelChapterAll.html +++ /dev/null @@ -1,85 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}chapterlist_xs{/block} - -{block name="main"} -
    - - - 详情 - - - - 收藏 - - {eq name="strSort" value="asc"} - - - 切换成倒序 - - {else} - - - 切换成正序 - - {/eq} - -
    - - -
    -
    - - {eq name="strSort" value="asc"} - 当前正序排列 - {else} - 当前倒叙序排列 - {/eq} - - -

    万人迷NPC总想暴走【无限】

    -
      - {foreach $arrNovelChapterAll as $category} - {include file="Public/chapterTable" /} - {/foreach} -
    -
    -
    - -
    -
    完结小说推荐www.xmttxs.com
    - {foreach $arrNovelChapterAll as $category} - {include file="Public/novelListH" /} - {/foreach} -
    - -
    www.xmttxs.com -

    最新更新

    -
      - {foreach $arrNovelChapterAll as $category} - {include file="Public/updateNovelList" /} - {/foreach} - -
    -
    - - - -
    -
    -
    -
    -{/block} -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Novel/getNovelInfo.html b/code/app/home/view/xiongMao/Novel/getNovelInfo.html deleted file mode 100644 index 73304e2..0000000 --- a/code/app/home/view/xiongMao/Novel/getNovelInfo.html +++ /dev/null @@ -1,84 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}info_xs{/block} - -{block name="main"} -
    - -
    - - 卿君好/著 -

    - 万人迷NPC总想暴走【无限】 -

    -
    - 这是一朵表面白莲内心食人花受与疯批切片老攻相爱相杀的故事。.演员楚时意外进入了无限世界,与新人玩家不同就算了,居然让他玩起了角色扮演!.副本一顺序已调整任劳任怨捞起自己的老本,尽职尽责扮演着娇柔做作的人设。BOSS:想他想他想...NPC:好漂亮的小东西~玩家:他好娇,我好喜欢。.副本二已完工凝视着和上个副本毫无差... -
    -
    -
    -
    - -
    -

    相邻推荐

    - - {foreach $arrRecommendNovel as $category} - {include file="Public/seoNovelList" /} - {/foreach} - -
    - -
    -

    万人迷NPC总想暴走【无限】最新章节

    -
      - {foreach $arrRecommendNovel as $category} - {include file="Public/chapterTable" /} - {/foreach} - - -
    -
    - -
    -

    万人迷NPC总想暴走【无限】章节列表

    -
      - {foreach $arrRecommendNovel as $category} - {include file="Public/chapterTable" /} - {/foreach} -
    - 查看更多章节... -
    - -
    -
    完结小说推荐www.xmttxs.com
    - {foreach $arrRecommendNovel as $category} - {include file="Public/novelListH" /} - {/foreach} -
    - -
    www.xmttxs.com -

    最新更新

    -
      - {foreach $arrRecommendNovel as $category} - {include file="Public/updateNovelList" /} - {/foreach} - -
    -
    - - - - -{/block} -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Novel/getSearchNovel.html b/code/app/home/view/xiongMao/Novel/getSearchNovel.html deleted file mode 100644 index 4cec32a..0000000 --- a/code/app/home/view/xiongMao/Novel/getSearchNovel.html +++ /dev/null @@ -1,38 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}top_xs{/block} - -{block name="main"} -
    - -
    -
    -
    - “1”相关结果: -
    - {foreach $arrSearchNovel as $category} - {include file="Public/novelListH" /} - {/foreach} -
    -
    - - - -
    -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/Public/articleList.html b/code/app/home/view/xiongMao/Pc/Public/articleList.html deleted file mode 100644 index 3a6a22b..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/articleList.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/Public/chapterTableAll.html b/code/app/home/view/xiongMao/Pc/Public/chapterTableAll.html deleted file mode 100644 index 6ae6421..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/chapterTableAll.html +++ /dev/null @@ -1,3 +0,0 @@ -
  • - 第245章 全文完 -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/Public/endNovelList.html b/code/app/home/view/xiongMao/Pc/Public/endNovelList.html deleted file mode 100644 index cb851c3..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/endNovelList.html +++ /dev/null @@ -1,11 +0,0 @@ -
  • - - 落魄千金美食发家日常 - - -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/Public/footer.html b/code/app/home/view/xiongMao/Pc/Public/footer.html deleted file mode 100644 index adc12bf..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/footer.html +++ /dev/null @@ -1,22 +0,0 @@ -
    -
    -
    -

    友情链接

    - -
    -
    -
    -

    - Copyright (C) 2008-2020 All rights reserved -
    - -

    -

    请所有作者发布作品时务必遵守国家互联网信息管理办法规定,我们拒绝任何色情小说,一经发现,即作删除!本站所收录作品、社区、书库评论及本站所做之广告均属其个人行为,与本站立场无关

    -
    -
    - - 返回顶部 - \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/Public/historyNovelList.html b/code/app/home/view/xiongMao/Pc/Public/historyNovelList.html deleted file mode 100644 index fd4ea96..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/historyNovelList.html +++ /dev/null @@ -1,18 +0,0 @@ -
  • - - 抗战之血肉丛林 - - 疙瘩 - 第七百二十九章 死神来了 - - - - 继续阅读 - - - - 云端保存 - - 删除 - -
  • diff --git a/code/app/home/view/xiongMao/Pc/Public/hostListImg.html b/code/app/home/view/xiongMao/Pc/Public/hostListImg.html deleted file mode 100644 index 73da104..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/hostListImg.html +++ /dev/null @@ -1,15 +0,0 @@ - -
    -
    - - 凝脂美人随军后,最强军爷急红眼 - -
    -
    -

    - 凝脂美人随军后,最强军爷急红眼 -

    -

    一朝穿越七十年代,成为了一个将要遭受迫害,面临下乡窘境的物理教授的女儿林听绾,无奈之下被迫相亲!据说那人比她大八岁带三个娃,还不能生育!别人避之不及,林...

    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/Public/hostListText.html b/code/app/home/view/xiongMao/Pc/Public/hostListText.html deleted file mode 100644 index 0af65c5..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/hostListText.html +++ /dev/null @@ -1,4 +0,0 @@ -
  • - 我本无意成仙 - 金色茉莉花 -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/Public/indexNewsUpdateList.html b/code/app/home/view/xiongMao/Pc/Public/indexNewsUpdateList.html deleted file mode 100644 index ca29f9a..0000000 --- a/code/app/home/view/xiongMao/Pc/Public/indexNewsUpdateList.html +++ /dev/null @@ -1,8 +0,0 @@ -
  • - [灵异小说] - - 一万个我同时穿越 - - 搓个大丸子 - 03-20 -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/User/getBookShelf.html b/code/app/home/view/xiongMao/Pc/User/getBookShelf.html deleted file mode 100644 index b4a7a05..0000000 --- a/code/app/home/view/xiongMao/Pc/User/getBookShelf.html +++ /dev/null @@ -1,38 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}novel_tmpbook{/block} - - -{block name="main"} -
    -
    我的书架
    -
      -
    • - 小说名称 - 作者 - 最后阅读章节 - 操作 -
    • - - {foreach $arrNewsNovel as $category} - {include file="/Pc/Public/historyNovelList" /} - {/foreach} - - -
    - -
    -
    热门小说推荐
    - {foreach $arrNewsNovel as $category} - {include file="/Pc/Public/hostListImg" /} - {/foreach} -
    - -
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/User/getHistory.html b/code/app/home/view/xiongMao/Pc/User/getHistory.html deleted file mode 100644 index 7c1f497..0000000 --- a/code/app/home/view/xiongMao/Pc/User/getHistory.html +++ /dev/null @@ -1,38 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}novel_tmpbook{/block} - - -{block name="main"} -
    -
    阅读记录
    -
      -
    • - 小说名称 - 作者 - 最后阅读章节 - 操作 -
    • - - {foreach $arrNewsNovel as $category} - {include file="/Pc/Public/historyNovelList" /} - {/foreach} - - -
    - -
    -
    热门小说推荐
    - {foreach $arrNewsNovel as $category} - {include file="/Pc/Public/hostListImg" /} - {/foreach} -
    - -
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getArticleInfo.html b/code/app/home/view/xiongMao/Pc/getArticleInfo.html deleted file mode 100644 index 5c10385..0000000 --- a/code/app/home/view/xiongMao/Pc/getArticleInfo.html +++ /dev/null @@ -1,14 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - - -{block name="main"} - -
    article.......
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getArticleList.html b/code/app/home/view/xiongMao/Pc/getArticleList.html deleted file mode 100644 index 0c385c6..0000000 --- a/code/app/home/view/xiongMao/Pc/getArticleList.html +++ /dev/null @@ -1,88 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    - - -
    - -
    - - - -
    -
    - - -
    - -
    -
    -
      -
    1. -
        -
      • 分类
      • -
      • 书名
      • -
      • 描述
      • -
      • 作者
      • -
      • 更新时间
      • -
      -
    2. - {foreach $arrNewsNovel as $key=>$Novel} - {include file="Pc/Public/articleList" /} - {/foreach} -
    -
    -
    -
    - - -
    - - -
    - -
    - -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getNovelCategory.html b/code/app/home/view/xiongMao/Pc/getNovelCategory.html deleted file mode 100644 index 5d31367..0000000 --- a/code/app/home/view/xiongMao/Pc/getNovelCategory.html +++ /dev/null @@ -1,58 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    -
    -
    - 热门小说推荐 -
    - {foreach $arrRecommendSerializationNovel as $category} - {include file="/Pc/Public/hostListImg" /} - {/foreach} -
    -
    -
    -
    -
    - 小说列表 -
    -
      - {foreach $arrRecommendSerializationNovel as $category} - {include file="/Pc/Public/indexNewsUpdateList" /} - {/foreach} -
    -
    -
    -
    - 新书入库 -
    -
      - {foreach $arrRecommendSerializationNovel as $category} - {include file="/Pc/Public/hostListText" /} - {/foreach} -
    -
    -
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getNovelChapter.html b/code/app/home/view/xiongMao/Pc/getNovelChapter.html deleted file mode 100644 index 90a5b86..0000000 --- a/code/app/home/view/xiongMao/Pc/getNovelChapter.html +++ /dev/null @@ -1,118 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}novel_chapter{/block} -{block name="main"} -
    -
    - - -

    第113章 尴尬的张启灵饵(第1页)

    - -

    黑瞎子敏锐的捕捉到秦泽口中的关键字“青铜门”,微微蹙起眉头,他问道:“小泽,你是跟哑巴张在青铜门里遇到了什么吗?”

    -

    秦泽点点头,又摇摇头:“是遇到了一些事情,但我不知道能不能说,还是等小哥醒来之后再告诉你们吧。”

    -

    说着,他看向了另一张病床上昏迷不醒的张启灵。

    -

    心中不免有些担心,他不知道张启灵是什么时候昏迷的,想来跟他昏迷的时间也差不了多少。

    -

    他现在醒过来了,而对方还处于昏迷状态中。

    -

    【瓶崽的身体比我还要好,他一定会没事儿的】秦泽在心里面安慰着自己。

    -

    胖子站起身去问医生,秦泽现在的身体情况能不能进食,得到肯定的答复之后,快乐的去给他买粥喝。

    -

    秦泽喝着胖妈妈买来的粥,一边喝一边有些心不在焉的时不时瞅向,另一张病床上,躺着的张启灵。

    -

    终于在他第17次看向对方的时候,无邪无奈的叹口气,把他脑袋移过来,道:“认真喝粥,小心点别撒身上了。”

    -

    “哦。”

    -

    秦泽乖乖把粥喝完了,他醒来之后又被重新检查一遍身体,确认没有任何问题。

    -

    医生摇着头,大呼奇怪,但秦泽的身体确实挺健康,看不出有毛病。在秦泽强烈的要求下,同意其出院请求。

    -

    换下身上穿着的病号服,秦泽和哥几个一起,在病房内盯着张启灵,时时不时聊上几句,气氛异常融洽。

    -

    确实挺融洽的,毕竟某人头上的表情包有意思的很,都冲淡些许的压抑之感。

    -

    【瓶崽他睡着之后的样子,看上去好乖呀,可惜哥几个都在我周围,不然我早就上手揉了】

    -

    【嘿嘿嘿,肯定手感很好】

    -

    秦泽的话让黑花邪胖额头上齐齐划过黑线。

    -

    解语臣无奈的叹口气,看来把孩子性取向扳过来的道路,任重而道远啊。

    -

    黑瞎子抬眼就看到了秦泽头顶的大猫撸瓶猫表情包,不知为何,竟感觉有些心梗。

    -

    而病床上静静躺着的张启灵略微皱了一下眉头,动静很小,却还是被一直盯着他的秦泽发现了。

    -

    “小哥他刚刚皱眉头了。”秦泽手指着张起灵说道。

    -

    “还真是。”胖子凑过去一看,果不其然看到张启灵轻微皱起的眉头。

    -

    “估计小哥要醒了吧。”无邪道。

    -

    在五个人的齐注视之下,张启灵缓缓睁开双眼,他的眼神中带着些许的迷茫。

    -

    “小哥喝口水。”秦泽给张启灵倒了满满一大杯的温水递到他的嘴边。

    -

    张启灵没有说话,却低下头咕噜噜的喝起来。

    -

    【猫崽儿喝水,真可爱~】

    -

    张起灵喝水的动作一僵,口中含着水咽也不是,不咽也不是。

    -

    解语臣嘴角扬起笑意,很快又压了下来。

    -

    病人尴尬着呢,不能嘲笑。

    - -

    - - 美人赠我暗妖娆/媚杀+番外  腹黑在手,天下我有/狐狸在手,天下我有(出书版)  大国院士  [原神]穿越到提瓦特我靠卖帝君手办崛起  校花骗我,冷艳老师独宠我一人!  (综漫同人)请外援吗?带挂  (原神同人)我在提瓦特当CP记录员  重生长公主  离婚后的我开始转运了  山神圣母守则  我靠吃瓜在年代文暴富  从时间停止开始纵横诸天  瘾诱/破烂事儿+番外  有人说我克夫  公侯庶女  圆满+番外  掌上明珠+番外  娱乐圈小人物史+番外  (综同人)弓弦响彻之时+番外  悍匪掠夺,掠天、掠地、掠众生  
    - -

    - -
    -
    -
    - 热门小说推荐 -
    - {foreach $arrNewsNovel as $category} - {include file="/Pc/Public/hostListImg" /} - {/foreach} -
    -
    - -{/block} - -{block name="customize"} - -{/block} - -{block name="footer-js"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getNovelChapterAll.html b/code/app/home/view/xiongMao/Pc/getNovelChapterAll.html deleted file mode 100644 index 99ed85d..0000000 --- a/code/app/home/view/xiongMao/Pc/getNovelChapterAll.html +++ /dev/null @@ -1,110 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}novel_info{/block} -{block name="main"} -
    -
    - -
    -
    - -
    -
    -

    凝脂美人随军后,最强军爷急红眼

    -

    - - 作者:凉城喵 - - 更新时间:2024-07-01 05:20:19 -

    -

    - 一朝穿越七十年代,成为了一个将要遭受迫害,面临下乡窘境的物理教授的女儿林听绾,无奈之下被迫相亲!据说那人比她大八岁带三个娃,还不能生育!别人避之不及,林听绾见之却眼前一亮,宽肩窄腰大长腿,一身正气不说,还是个妥妥的纯情小狼狗!结婚后,众人八卦的DNA启动!“听说了吗?陆云铮带回来一个漂亮媳妇,可这后妈不好当啊……”... - 凝脂美人随军后,最强军爷急红眼

    -
    - -
    - - -

    手机浏览器扫描二维码访问

    -
    -
    -
    -
    -
    《盗墓,被偷听心声后我暴露了》章节列表(第2页)切换倒序/正序:当前正序 -
    -
    上一页下一页
    -
      - {foreach $arrNovelChapterAll as $category} - {include file="/Pc/Public/chapterTableAll" /} - {/foreach} -
    -
    上一页下一页
    -
    - -
    -
    - 热门小说推荐 -
    - {foreach $arrNovelChapterAll as $category} - {include file="/Pc/Public/hostListImg" /} - {/foreach} -
    -
    - -{/block} - -{block name="customize"} - -{/block} - -{block name="footer-js"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getNovelInfo.html b/code/app/home/view/xiongMao/Pc/getNovelInfo.html deleted file mode 100644 index 4881859..0000000 --- a/code/app/home/view/xiongMao/Pc/getNovelInfo.html +++ /dev/null @@ -1,158 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}novel_info{/block} -{block name="main"} -
    -
    - -
    -
    - -
    -
    -

    凝脂美人随军后,最强军爷急红眼

    -

    - - 作者:凉城喵 - - 更新时间:2024-07-01 05:20:19 -

    -

    - 一朝穿越七十年代,成为了一个将要遭受迫害,面临下乡窘境的物理教授的女儿林听绾,无奈之下被迫相亲!据说那人比她大八岁带三个娃,还不能生育!别人避之不及,林听绾见之却眼前一亮,宽肩窄腰大长腿,一身正气不说,还是个妥妥的纯情小狼狗!结婚后,众人八卦的DNA启动!“听说了吗?陆云铮带回来一个漂亮媳妇,可这后妈不好当啊……”... - 凝脂美人随军后,最强军爷急红眼

    -
    - -
    - - -

    手机浏览器扫描二维码访问

    -
    -
    -
    -
    -
    《凝脂美人随军后,最强军爷急红眼》第245章 全文完
    -
    -

    在是可惜,都是钱啊! 若是能放进她空间就好了,肯定会很安全的。 只是她不能先开口提及此事,万一陆云峥想了解的话,她没有办法叙说。 一时间,眼神中也有些无奈的惋惜。 一边的陆云峥见状,也是犹豫了好一会儿。 - 才轻咳了一声,小声的试探道:“绾绾,你是不是有办法把这些东西带走?” “嗯?”林听绾瞪大了眼睛,虽然知道陆云峥对她这件事情呈现出默认的状态,可从来不会询问的呀! 见她眉眼里的紧张。 - 陆云峥也伸手握住了她的手,轻声解释道:“我的意思是,若是有人能把这些东西带走,我自然更希望你可以,毕竟这些东西本来就是要给你的,比日后丢了强!” “你要是可以带走的话,那我就出去等你。” - ...

    - 凝脂美人在八零免费阅读    - 凝脂美人随军后    - 凝脂美人在八零笔趣阁    - 凝脂美人在七零的    - 凝脂美人在八零阅读    - 凝脂美人在八零[斜眼r    - 凝脂美人在八零全文免费阅读    - 凝脂美人在八零穿书免费阅读    - 凝脂美人穿七零    - 凝脂美人在八零45章    - 凝脂美人在八零穿书全文免费阅读    - 凝脂美人在八零全文阅读    - 凝脂美人在八零48章    - 凝脂美人在八零 无弹窗    - 凝脂美人在八零[/cp    - 凝脂美人在八零阎泽扬    - 凝脂美人在八零简介    - 凝脂美人在八零完整版免费阅读    - 凝脂美人在六零穿书全文免费    - 凝脂美人在八零2k    - 凝脂美人随军后最强军爷急红眼    - 凝脂美人在七零免费阅读    - 凝脂美人在八零千千    - 凝脂凝脂美人在八零    - 凝脂美人在九零    - 最强军爷急红眼    - 凝脂美人在八零(年代文)   - 最强军爷急红眼 凉城喵    - 族咒:山隐卷 -   重生八零团宠妹妹旺翻全家 -   被虐重生后,真千金杀疯了 -   宣和公主 -   我们这帮打工仔 -   旺夫小田妻 -   重生六零年代,萌娃有空间 -   嫁良缘 -   全宗门反派,奈何师妹脑子有坑 -   农门医香 -   崩坏,为美好的世界献上祝福 -   海贼之冲向巅峰 -   洪荒:你可知贫道来历 -   久病成庸医 -   逆旅: -   开局绑定万界买菜APP搞玄学 -   前山小骆驼的新书李天的明末之旅 -   下辈子不要遇见我 -   入世成仙 -    -
    -
    -
    -
    《凝脂美人随军后,最强军爷急红眼》最新章节
    -
      - {foreach $arrRecommendNovel as $category} - {include file="/Pc/Public/chapterTableAll" /} - {/foreach} -
    -
    -
    -
    《凝脂美人随军后,最强军爷急红眼》章节列表
    -
      - {foreach $arrRecommendNovel as $category} - {include file="/Pc/Public/chapterTableAll" /} - {/foreach} -
    - 查看更多章节... -
    -
    -
    - 热门小说推荐 -
    - {foreach $arrRecommendNovel as $category} - {include file="/Pc/Public/hostListImg" /} - {/foreach} -
    -
    - -{/block} - -{block name="customize"} - -{/block} - -{block name="footer-js"} - -{/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getSearchNovel.html b/code/app/home/view/xiongMao/Pc/getSearchNovel.html deleted file mode 100644 index e5a3892..0000000 --- a/code/app/home/view/xiongMao/Pc/getSearchNovel.html +++ /dev/null @@ -1,68 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    - -
    -
    -
    - - - 搜索 -
    -
    -
    - - - -
    -
      - {foreach $arrSearchNovel as $key=>$Novel} -
    • - - 1秒1技能点,你说我凡阶天赋修炼慢? - -
      -

      - 11技能点,你说我凡阶天赋修炼慢? -

      -

      - 作者:青城老鬼 - 分类: - 状态:已完结 - 总字数:38.00万字+ -

      -

      - 标签: - -

      -

      最近更新:第190章 武破虚空,新的开始

      -

      深海中潜藏的巨兽掀起灭世海啸!山间凶兽朝着钢铁巨城露出凶猛的獠牙。 即将参加高考的武道学生徐天觉醒深红系统。却没想觉醒日被未婚妻强行退婚,面对众人诋毁,未婚妻的鄙视。 - 地阶天赋又如何,深红,给我加点! - 本站提示:各位书友要是觉得《1秒1技能点,你说我凡阶天赋修炼慢?》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!

      -
      -
      - 更新时间:2025-03-20 23:57 - 立即阅读 -
      -
    • - {/foreach}
    - -
    -
    - -
    - -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/getUserIndex.html b/code/app/home/view/xiongMao/Pc/getUserIndex.html deleted file mode 100644 index 198f188..0000000 --- a/code/app/home/view/xiongMao/Pc/getUserIndex.html +++ /dev/null @@ -1,143 +0,0 @@ -{extend name="basePcUser" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    - -
    - -
    -
    -
    - 我的书架 - 查看更多>> -
    - -
    -
    -
    - 最近阅读 - 查看更多>> -
    - -
    -
    -
    - 热读作品 -
      -
    • -
    • -
    • -
    -
    -
    - {foreach $arrNewsNovel as $key=>$Novel} - - {/foreach} - -
    -
    -
    - -
    -
    -
    推荐作品
    -
      - {foreach $arrNewsNovel as $key=>$Novel} -
    • - - - -

      - - 我真是一条龙 - - - 兔子很淡定 - - - 我的父亲告诉我,在我出生那一年,天上金光闪耀,隐隐约约中,好像能看到云朵里有条龙在盘旋,紧接着,一道金光照入我们的村子,我便出生了……为寻答案来人间,天龙问世扰乾坤。 - 无情无义闹天下,千军万马赴黄泉。 - 本站提示:各位书友要是觉得《我真是一条龙》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦! -

      -
    • - {/foreach} - -
    -
    -
    -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Pc/index.html b/code/app/home/view/xiongMao/Pc/index.html deleted file mode 100644 index 48293aa..0000000 --- a/code/app/home/view/xiongMao/Pc/index.html +++ /dev/null @@ -1,52 +0,0 @@ -{extend name="basePc" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - - -{block name="main"} -
    -
    -
    - 已完结小说推荐 -
    - {foreach $arrRecommendSerializationNovel as $category} - {include file="/Pc/Public/hostListImg" /} - {/foreach} -
    -
    -
    - 热门小说 -
    -
      - {foreach $arrRecommendSerializationNovel as $category} - {include file="/Pc/Public/hostListText" /} - {/foreach} -
    -
    -
    -
    -
    -
    - 最新更新 -
    -
      - {foreach $arrRecommendSerializationNovel as $category} - {include file="/Pc/Public/indexNewsUpdateList" /} - {/foreach} -
    -
    -
    -
    - 新书入库 -
    -
      - {foreach $arrRecommendSerializationNovel as $category} - {include file="/Pc/Public/hostListText" /} - {/foreach} -
    -
    -
    -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/articleList.html b/code/app/home/view/xiongMao/Public/articleList.html deleted file mode 100644 index 4946aeb..0000000 --- a/code/app/home/view/xiongMao/Public/articleList.html +++ /dev/null @@ -1,5 +0,0 @@ -
  • -
    - 我真是一条龙 -
    {$key+=1} -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/chapterTable.html b/code/app/home/view/xiongMao/Public/chapterTable.html deleted file mode 100644 index 251cf3a..0000000 --- a/code/app/home/view/xiongMao/Public/chapterTable.html +++ /dev/null @@ -1,2 +0,0 @@ - -
  • 第13章 终章 上古真神13
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/chapterTableAll.html b/code/app/home/view/xiongMao/Public/chapterTableAll.html deleted file mode 100644 index ec3a545..0000000 --- a/code/app/home/view/xiongMao/Public/chapterTableAll.html +++ /dev/null @@ -1,12 +0,0 @@ -
  • - - 01 天龙问世 - -
  • -
  • - - 02 沧武的小霸王 - -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/footer.html b/code/app/home/view/xiongMao/Public/footer.html deleted file mode 100644 index 385093d..0000000 --- a/code/app/home/view/xiongMao/Public/footer.html +++ /dev/null @@ -1,25 +0,0 @@ - -
    - www.xmttxs.com 熊猫小说网
    畅快阅读 永久免费
    请注意适当休息 保护好您的眼睛

    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/historyNovelList.html b/code/app/home/view/xiongMao/Public/historyNovelList.html deleted file mode 100644 index aa9c8c7..0000000 --- a/code/app/home/view/xiongMao/Public/historyNovelList.html +++ /dev/null @@ -1,25 +0,0 @@ - -
    - -

    小说作者:卿君好

    -

    上次阅读:第11章 终章 上古真神11

    - -
    \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/novelCategoryList.html b/code/app/home/view/xiongMao/Public/novelCategoryList.html deleted file mode 100644 index 1efdcb6..0000000 --- a/code/app/home/view/xiongMao/Public/novelCategoryList.html +++ /dev/null @@ -1,8 +0,0 @@ - -
    -

    HP屑巫师

    -
    - 女主无CP。斯莱特林女主,黑巫师,很颠很屑,混邪乐子人,GGAD狂热粉头,子世代。一家三口轻松搞笑文,格林德沃,邓布利多带熊孩子身为邓布利多和格林德沃血盟瓶,艾莉森格林德沃今天也在试图撮合双亲。曾经困在自己电脑里的几个游戏世界,在等... -
    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/novelListH.html b/code/app/home/view/xiongMao/Public/novelListH.html deleted file mode 100644 index 397b7d0..0000000 --- a/code/app/home/view/xiongMao/Public/novelListH.html +++ /dev/null @@ -1,10 +0,0 @@ - - -
    - -
    -
    -

    万人迷C总想暴走【无限】

    -
    这是一朵表面白莲内心食人花受与疯批切片老攻相爱相杀的故事。演员楚时意外进入了无限世界,与新人玩家不同就算了,居...
    -
    -
    \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/novelText.html b/code/app/home/view/xiongMao/Public/novelText.html deleted file mode 100644 index ef01136..0000000 --- a/code/app/home/view/xiongMao/Public/novelText.html +++ /dev/null @@ -1 +0,0 @@ -
  • [重生]侠骨温敛
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/seoNovelList.html b/code/app/home/view/xiongMao/Public/seoNovelList.html deleted file mode 100644 index 916e2b2..0000000 --- a/code/app/home/view/xiongMao/Public/seoNovelList.html +++ /dev/null @@ -1 +0,0 @@ -万人迷总在崩人设全文   \ No newline at end of file diff --git a/code/app/home/view/xiongMao/Public/updateNovelList.html b/code/app/home/view/xiongMao/Public/updateNovelList.html deleted file mode 100644 index 49863b3..0000000 --- a/code/app/home/view/xiongMao/Public/updateNovelList.html +++ /dev/null @@ -1,4 +0,0 @@ -
  • 心之怪盗!但柯南 - 六日四尘 -
  • \ No newline at end of file diff --git a/code/app/home/view/xiongMao/User/getBookShelf.html b/code/app/home/view/xiongMao/User/getBookShelf.html deleted file mode 100644 index efd9fef..0000000 --- a/code/app/home/view/xiongMao/User/getBookShelf.html +++ /dev/null @@ -1,50 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}top_xs{/block} - -{block name="main"} -
    -
    -

    我的书架

    - {foreach $arrNewsNovel as $category} - {include file="Public/historyNovelList" /} - {/foreach} -
    -
    -
    -
    完结小说推荐www.xmttxs.com - -
    - {foreach $arrNewsNovel as $category} - {include file="Public/novelListH" /} - {/foreach} -
    -
    -
    - - - - -
    -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/User/getHistory.html b/code/app/home/view/xiongMao/User/getHistory.html deleted file mode 100644 index 846da4d..0000000 --- a/code/app/home/view/xiongMao/User/getHistory.html +++ /dev/null @@ -1,50 +0,0 @@ -{extend name="baseH5" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name='body-class'}top_xs{/block} - -{block name="main"} -
    -
    -

    阅读历史(浏览器储存记录)

    - {foreach $arrNewsNovel as $category} - {include file="Public/historyNovelList" /} - {/foreach} -
    -
    -
    -
    完结小说推荐www.xmttxs.com - -
    - {foreach $arrNewsNovel as $category} - {include file="Public/novelListH" /} - {/foreach} -
    -
    -
    - - - - -
    -{/block} {block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/User/index.html b/code/app/home/view/xiongMao/User/index.html deleted file mode 100644 index e37fe98..0000000 --- a/code/app/home/view/xiongMao/User/index.html +++ /dev/null @@ -1,60 +0,0 @@ -{extend name="baseH5User" /} -{block name='nav-active-class'}home{/block} -{block name="title"}{/block} -{block name="head-js"}{/block} - -{block name="head-name"}用户中心{/block} -{block name="main"} -
    -
    -
    - -
    - -
    - -
    - 123456 -
    -
    -
    -
      -
    • 经验0
    • -
    • 积分0
    • -
    • 推荐票0
    • -
    -
    - -
    - -
    - - - -
    -
    - -{/block} - -{block name="customize"} {/block} \ No newline at end of file diff --git a/code/app/home/view/xiongMao/baseH5.html b/code/app/home/view/xiongMao/baseH5.html deleted file mode 100644 index 7854754..0000000 --- a/code/app/home/view/xiongMao/baseH5.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - 熊猫小说网_书友最值得收藏的网络小说阅读网 - - - - - - - - - -
    - -

    熊猫小说网

    -
    - - - -
    -
    - - - - {block name="main"} {/block} - - {include file="/Public/footer" /} - - {block name="customize"}{/block} - - - - {block name="footer-js"}{/block} - - - - - - \ No newline at end of file diff --git a/code/app/home/view/xiongMao/basePc.html b/code/app/home/view/xiongMao/basePc.html deleted file mode 100644 index cc0e942..0000000 --- a/code/app/home/view/xiongMao/basePc.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - 熊猫小说网_书友最值得收藏的网络小说阅读网 - - - - - - - - -
    - - -
    - - {block name="main"} {/block} - -
    -
    -
    - 每日热搜小说推荐 -
    - -
    -
    - - - - - - diff --git a/code/app/home/view/xiongMao/index.md b/code/app/home/view/xiongMao/index.md deleted file mode 100644 index 59e3437..0000000 --- a/code/app/home/view/xiongMao/index.md +++ /dev/null @@ -1,79 +0,0 @@ -熊猫小说模板 -源地址: (https://www.xmttxs.com) - -H5 -H5-首页: - 1.首页第一板块:热门小说推荐,取推荐等级为9的,完结的,随机6个小说 - 2.首页第二板块:最新小说,随机取最新入库的 10个小说 - 3.首页第三板块:连载小说推荐,取推荐等级为9的,连载的,随机10个小说 - 4.首页第四板块:热门收藏,增加收藏统计和api,根据收藏排序,随机10个小说 - 5.首页第五板块:最近更新,根据最近更新的排序,随机30个小说 -H5-分类页面: - 1.分类页面第一板块:根据分类id,提取最新的 随机20个小说 - 2.分类页面第一板块:完结小说推荐,取推荐等级为9的,完结的,随机6个小说 - 3.分页 - -H5-阅读记录页面: - 1.第二板块:完结小说推荐,取推荐等级为9的,完结的,随机6个小说 - -H5-我的书架页面: - 1.第二板块:完结小说推荐,取推荐等级为9的,完结的,随机6个小说 - - -H5-详情页面: - 1.小说详情信息 - 2.小说 kan 相关信息 - 3.最新章节获取 5章节 - 4.小说 1-100章节 - 5.根据当前小说分类,获取完结的,随机6个小说 - 6.根据当前小说分类最近更新,随机10个小说 - -H5-目录页面: - 1.小说章节列表,根据分页,倒叙或者正序, 获取对应分页的 章节列表 100章节/页 - 2.小说章节分页下拉列表,和上一页和下一页 - 3.根据当前小说分类,获取完结的,随机6个小说 - 4.根据当前小说分类最近更新,随机10个小说 - -H5-章节页面: - 1.小说章节信息,上一章和下一章节 - ----------------------------------------------------------------------------------- - -PC -公共数据 -底部 友情链接 -底部 每日热搜小说推荐: kan 数据列表随机展示20个 -pc-首页 - 1.首页第一板块:已完结小说推荐: 取推荐等级为9的,完结的,随机9个小说 - 2.首页第二板块:热门小说:取推荐等级为9的 ,连载的,随机取最新入库的 13个小说 - 3.首页第三板块:最近更新,根据最近更新的排序,随机30个小说 - 4.首页第三板块:新书入库,随机取最新入库的 随机30个小说 - -pc-分类 - 1.第一板块:热门推荐小说:取推荐等级为9的 ,随机取最新入库的 6个小说 - 2.第二板块:小说列表,当前分类 随机30个小说 - 3.第三板块:新书入库,随机取最新入库的 随机30个小说 - 4. 分页 - -pc-阅读记录页面: - 1.第二板块:热门小说推荐,取推荐等级为9的,随机12个小说 - -pc-我的书架页面: - 1.第二板块:热门小说推荐,取推荐等级为9的,随机12个小说 - -pc-详情页面: - 1.小说详情信息 - 2.小说 kan 相关信息 - 3.最新章节获取 16章节 - 4.小说 1-100章节 - 5.根据当前小说分类,获取完结的,推荐等级倒叙 ,随机6个小说 - 6.根据当前小说分类 ,随机10个小说 - -pc-目录页面: - 1.小说详情信息 - 2.小说章节列表,根据分页,倒叙或者正序, 获取对应分页的 章节列表 100章节/页 - 3.小说章节分页下拉列表,和上一页和下一页 - 4.根据当前小说分类,获取完结的,推荐等级倒叙 ,随机6个小说 - -pc-章节页面: - 1.小说章节信息,上一章和下一章节 - 2.根据当前小说分类,获取完结的,推荐等级倒叙 ,随机6个小说 diff --git a/code/app/middleware.php b/code/app/middleware.php deleted file mode 100644 index d2c3fda..0000000 --- a/code/app/middleware.php +++ /dev/null @@ -1,10 +0,0 @@ -alias('arn') - ->field('an.an_url') - ->leftjoin('admin_node an','an.an_id=arn.an_id'); - - if($intArId>0) - { - $AdminRoleNodeModel = $AdminRoleNodeModel->where('arn.ar_id',$intArId); - } - - $arrRoleNode = $AdminRoleNodeModel - ->select() - ->toArray(); - - $arrRoleNode = array_column($arrRoleNode, 'an_url'); - - // Cache::set($strCacheKey,$arrRoleNode); - } - - return $arrRoleNode; - } -} diff --git a/code/app/model/AdminRoleNodeModel.php b/code/app/model/AdminRoleNodeModel.php deleted file mode 100644 index f4325fc..0000000 --- a/code/app/model/AdminRoleNodeModel.php +++ /dev/null @@ -1,15 +0,0 @@ -token = $strToken; - - $AdminUserModel->refreshToken(); - - return $AdminUserModel; - } - - public function checkRole() - { - return true; - } - - - public function createToken() - { - $this->token = Str::random(32); - - $this->refreshToken(); - - return $this->token; - } - - public function refreshToken() - { - Cache::set("AdminToken:" . $this->token, $this->au_id, 3600); - } - - static public function getAdminUserModelByCache($intAuId, $boolForceUpdate = false) - { - $strKey = "AdminUser:Id:" . $intAuId; - - $AdminUserModel = Cache::get($strKey); - - if (empty($AdminUserModel) || $boolForceUpdate == true) { - $AdminUserModel = self::where('au_id', $intAuId)->find(); - - if (empty($AdminUserModel)) { - throw new \Exception("用户不存在", 9999); - } - $AdminUserModel->au_pwd = ""; - - Cache::set($strKey, $AdminUserModel); - } - - return $AdminUserModel; - } -} diff --git a/code/app/model/BaseModel.php b/code/app/model/BaseModel.php deleted file mode 100644 index a4073ef..0000000 --- a/code/app/model/BaseModel.php +++ /dev/null @@ -1,21 +0,0 @@ - $strVal) { - $this->$strKey = $strVal; - } - } -} diff --git a/code/app/model/CaiJiPeiZhiModel.php b/code/app/model/CaiJiPeiZhiModel.php deleted file mode 100644 index 4d56c22..0000000 --- a/code/app/model/CaiJiPeiZhiModel.php +++ /dev/null @@ -1,39 +0,0 @@ -set('CaiJiPeiZhi', $arrCaiJiPeiZhi); - } -} diff --git a/code/app/model/CategoryModel.php b/code/app/model/CategoryModel.php deleted file mode 100644 index 08da1b3..0000000 --- a/code/app/model/CategoryModel.php +++ /dev/null @@ -1,202 +0,0 @@ - '玄幻修真', - 2 => '军史小说', - 3 => '网游小说', - 4 => '科幻小说', - 5 => '重生穿越', - 6 => '都市小说', - 7 => '灵异小说', - 8 => '言情小说', - 9 => '其他小说', - ]; - - static $arrCategoryAll = [ - 'man' => [ - 'xuanhuan-xiuzhen' => '玄幻修真', - 'junshi-xiaoshuo' => '军史小说', - 'wangyou-xiaoshuo' => '网游小说', - 'kehuan-xiaoshuo' => '科幻小说', - ], - 'women' => [ - 'zhongsheng-chuanyue' => '重生穿越', - 'dushi-xiaoshuo' => '都市小说', - 'lingyi-xiaoshuo' => '灵异小说', - 'yanqing-xiaoshuo' => '言情小说', - 'qita-xiaoshuo' => '其他小说', - ] - ]; - - static $arrCategoryPinYin = [ - 1 => 'xuanhuan-xiuzhen', // 玄幻-修真 - 2 => 'junshi-xiaoshuo', // 军史-小说 - 3 => 'wangyou-xiaoshuo', // 网游-小说 - 4 => 'kehuan-xiaoshuo', // 科幻-小说 - 5 => 'zhongsheng-chuanyue', // 重生-穿越 - 6 => 'dushi-xiaoshuo', // 都市-小说 - 7 => 'lingyi-xiaoshuo', // 灵异-小说 - 8 => 'yanqing-xiaoshuo', // 言情-小说 - 9 => 'qita-xiaoshuo', // 其他-小说 - ]; - - static $arrMan = [ - 1 => '玄幻修真', - 2 => '军史小说', - 3 => '网游小说', - 4 => '科幻小说', - ]; - - static $arrWomen = [ - 5 => '重生穿越', - 6 => '都市小说', - 7 => '灵异小说', - 8 => '言情小说', - 9 => '其他小说', - ]; - - - /** - * get category of the novels - * - * @return array - */ - static public function getCategory(): array - { - return self::$arrCategory; - } - - - /** - * Undocumented function - * - * @param integer $intType - * @param boolean $boolOnlyValue - * @return array - */ - static public function getCategoryByType(int $intType, bool $boolOnlyValue = true): array - { - $arrCategory = []; - switch ($intType) { - case 1: - if ($boolOnlyValue) { - $arrCategory = array_values(CategoryModel::getManCategory()); - } else { - $arrCategory = CategoryModel::getManCategory(); - } - - - break; - case 2: - if ($boolOnlyValue) { - $arrCategory = array_values(CategoryModel::getWomenCategory()); - } else { - $arrCategory = CategoryModel::getWomenCategory(); - } - break; - } - return $arrCategory; - } - - /** - * get a category of man's novels - * - * @return array - */ - static public function getManCategory(): array - { - return self::$arrMan; - } - - /** - * get a category of the woman novels - * - * @return array - */ - static public function getWomenCategory(): array - { - return self::$arrWomen; - } - - /** - * get pinyin based on chinese characters - * - * @param string $strZh - * @return string - */ - static public function getPinYin(string $strZh) - { - $intKey = array_search($strZh, self::$arrCategory); - return self::$arrCategoryPinYin[$intKey]; - } - - - /** - * get chinese characters based on pinyin - * - * @param string $strPinYin - * @return string|null - */ - static public function getZhByPinYin(string $strPinYin): string|null - { - $strZh = NULL; - $intKey = array_search($strPinYin, self::$arrCategoryPinYin); - if (is_numeric($intKey)) { - $strZh = self::$arrCategory[$intKey]; - } - return $strZh; - } - - /** - * determine the gender of the novel category - * - * @param string $strName - * @return string - */ - static public function getSexEn(string $strName): string - { - return in_array($strName, self::$arrMan) ? 'man' : 'women'; - } - - /** - * determine the gender of the novel category - * - * @param string $strName - * @return string - */ - static public function getSexZh(string $strName): string - { - return in_array($strName, self::$arrMan) ? '男生' : '女生'; - } -} diff --git a/code/app/model/ChapterModel.php b/code/app/model/ChapterModel.php deleted file mode 100644 index f6b557f..0000000 --- a/code/app/model/ChapterModel.php +++ /dev/null @@ -1,319 +0,0 @@ - [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - 'projection' => [ - '_id' => 0, - 'c_source_id' => 0, - 'c_site_code' => 0, - 'c_source_uuid' => 0, - - ], - ]; - - /** - * Undocumented function - * - * @param array $arrFilter - * @param integer $intPage - * @param integer $intLimit - * @param array $arrSort - * @param string $strKey - * @param integer $intLifeTime - * @return array - */ - public function findPaginatedWithCache( - array $arrFilter, - int $intPage = 1, - int $intLimit = 20, - array $arrSort = ['c_sort_num' => 1], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): array { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrOptions = self::$arrChapterOptions; - - $arrOptions = array_merge($arrOptions, [ - 'sort' => $arrSort, - 'skip' => ($intPage - 1) * $intLimit, - 'limit' => $intLimit, - ]); - - - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - - $intTotal = $this->getCol()->countDocuments($arrFilter); - - $arrResult = iterator_to_array($Cursor); - - if (!empty($arrResult)) { - foreach ($arrResult as &$arrChapter) { - applyToKeys($arrChapter, ['created_at', 'updated_at'], 'formatMongoDate'); - } - } - - $arrResult = [ - 'data' => $arrResult, - 'total' => $intTotal, - 'page' => $intPage, - 'limit' => $intLimit, - 'pages' => ceil($intTotal / $intLimit) - ]; - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @return null|array - */ - public function findOne(array $arrFilter, array $arrOptions = [], bool $boolReadContent = true): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrChapterOptions; - } - - $arrChapter = $this->getOne($arrFilter, $arrOptions); - - if (!empty($arrChapter)) { - try { - applyToKeys($arrChapter, ['created_at', 'updated_at'], 'formatMongoDate'); - } catch (\Exception $e) { - var_dump($arrChapter); - throw $e; - } - - - if ($boolReadContent) { - $arrChapter['c_content'] = StorageCore::getInstance()->read($arrChapter['c_content_path']); - } else { - $arrChapter['c_content'] = ''; - } - } - - return $arrChapter; - } - - /** - * Undocumented function - * - * @param integer $intNId - * @return null|array - */ - public function getLatestChapterByNId(int $intNId, bool $boolReadContent = true): null|array - { - $arrFilter = ['n_id' => $intNId, 'c_page' => 0]; - - $arrOptions = self::$arrChapterOptions; - - $arrOptions['sort'] = ['c_sort_num' => -1]; - - return $this->findOne($arrFilter, $arrOptions, $boolReadContent); - } - - /** - * Undocumented function - * - * @param integer $intNId - * @return null|array - */ - public function getFirstChapterByNId(int $intNId, bool $boolReadContent = true): null|array - { - $arrFilter = ['n_id' => $intNId, 'c_page' => 0]; - - $arrOptions = self::$arrChapterOptions; - - $arrOptions['sort'] = ['c_sort_num' => 1]; - - return $this->findOne($arrFilter, $arrOptions, $boolReadContent); - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @param integer $intCount - * @param array $arrSort - * @param array $arrOptions - * @param boolean $boolReadContent - * @return null|array - */ - public function findMany(array $arrFilter, int $intCount = 0, array $arrSort = ['c_sort_num' => -1], array $arrOptions = [], bool $boolReadContent = false): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrChapterOptions; - } - - $arrOptions['sort'] = $arrSort; - - if ($intCount > 0) { - $arrOptions['limit'] = $intCount; - } - - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - - $arrResult = iterator_to_array($Cursor); - - foreach ($arrResult as &$arrItem) { - applyToKeys($arrItem, ['created_at', 'updated_at'], 'formatMongoDate'); - $arrItem['c_content'] = ''; - if ($boolReadContent) { - $arrItem['c_content'] = StorageCore::getInstance()->read($arrItem['c_content_path']); - } - } - - return $arrResult; - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @param integer $intCount - * @param array $arrSort - * @param array $arrOptions - * @param boolean $boolReadContent - * @return null|array - */ - public function findManyShuffledWithCache( - array $arrFilter, - int $intCount = 0, - array $arrSort = ['c_sort_num' => -1], - string $strKey = '', - int $intLifeTime = 24 * 3600, - bool $boolReadContent = false - ): null|array { - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - if (empty($arrOptions)) { - $arrOptions = self::$arrChapterOptions; - } - - $arrResult = $this->findMany($arrFilter, $intCount, $arrSort, [], $boolReadContent); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } - - /** - * Undocumented function - * - * @param integer $intNId - * @param integer $intCSortNum - * @param integer $intCPage - * @return null|array - */ - public function getPreChapter(int $intNId, int $intCSortNum, int $intCPage): null|array - { - $arrFilter = [ - '$and' => [ - [ - '$or' => [ - ['c_sort_num' => ['$lt' => $intCSortNum]], - [ - '$and' => [ - ['c_sort_num' => ['$eq' => $intCSortNum]], - ['c_page' => ['$lt' => $intCPage]] - ] - ] - ] - ], - ['n_id' => $intNId] - ] - ]; - - - $arrSort = [ - 'c_sort_num' => -1, - 'c_page' => -1, - ]; - - $arrChapterAll = $this->findMany($arrFilter, 1, $arrSort); - return $arrChapterAll[0] ?? []; - } - - /** - * Undocumented function - * - * @param integer $intNId - * @param integer $intCSortNum - * @param integer $intCPage - * @return null|array - */ - public function getNextChapter(int $intNId, int $intCSortNum, int $intCPage): null|array - { - $arrFilter = [ - '$and' => [ - [ - '$or' => [ - ['c_sort_num' => ['$gt' => $intCSortNum]], - [ - '$and' => [ - ['c_sort_num' => ['$eq' => $intCSortNum]], - ['c_page' => ['$gt' => $intCPage]] - ] - ] - ] - ], - ['n_id' => $intNId] - ] - ]; - - - $arrSort = [ - 'c_sort_num' => 1, - 'c_page' => 1, - ]; - - $arrChapterAll = $this->findMany($arrFilter, 1, $arrSort); - return $arrChapterAll[0] ?? []; - } -} diff --git a/code/app/model/ConfigSubjectFomartModel.php b/code/app/model/ConfigSubjectFomartModel.php deleted file mode 100644 index 03f9426..0000000 --- a/code/app/model/ConfigSubjectFomartModel.php +++ /dev/null @@ -1,146 +0,0 @@ - [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - 'projection' => [ - '_id' => 0, - ], - ]; - - - /** - * 直接读库查询大量小说 - * - * @param integer $intNId - * @return null|array - */ - public function findMany(array $arrFilter, int $intCount = 10, array $arrSort = [], array $arrOptions = []): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrOptions; - } - - if ($intCount > 0) { - $arrOptions['limit'] = $intCount; - } - - if (empty($arrSort)) { - $arrOptions['sort'] = $arrSort; - } - - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - - $arrResult = iterator_to_array($Cursor); - - return $arrResult; - } - - - /** - * 查询多条数据并缓存 - * - * @param array $arrFilter - * @param integer $intCount - * @param array $arrSort - * @param array $arrOptions - * @param string $strKey - * @param integer $intLifeTime - * @return null|array - */ - public function findManyWithCache( - array $arrFilter, - int $intCount = 0, - array $arrSort = [], - array $arrOptions = [], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): null|array { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrResult = $this->findMany($arrFilter, $intCount, $arrSort, $arrOptions); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - - /** - * find one novel - * - * @param array $arrFilter - * @param array $arrOptions - * @return null|array - */ - public function findOne(array $arrFilter, array $arrOptions = []): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrOptions; - } - - $arrNovel = $this->getOne($arrFilter, $arrOptions); - - return $arrNovel; - } - - /** - * 根据小说ID查询指定小说 - * - * @param integer $intNId - * @return array - */ - public function getConfigSubjectFomartByCsfKey(string $intNId): null|array - { - $arrFilter = ['csf_key' => $intNId]; - return $this->findOne($arrFilter); - } - - -} diff --git a/code/app/model/ConverterMovel.php b/code/app/model/ConverterMovel.php deleted file mode 100644 index 21e5875..0000000 --- a/code/app/model/ConverterMovel.php +++ /dev/null @@ -1,108 +0,0 @@ - '', - '{strSiteDomain}' => '', - '{strSiteKeywords}' => '', - '{strSiteDescription}' => '', - '{strIndexTitle}' => '', - '{strIndexKeywords}' => '', - '{strIndexDescription}' => '', - '{strNovelName}' => '', - '{strNovelChapterName}' => '', - '{strNovelChapterSort}' => '', - '{strChapterDescription}' => '', - '{strNovelCategoryName}' => '', - '{strNovelSex}' => '', - '{strNovelStatus}' => '', - '{intPage}' => '', - '{strNovelAuthor}' => '', - '{strNovelDescription}' => '', - '{strSearchKeywords}' => '', - - ]; - - static public $arrDescription = [ - '{strSiteName}' => '这个是网站名', - '{strSiteDomain}' => '这个是站点域名', - '{strSiteKeywords}' => '这个是网站关键字', - '{strSiteDescription}' => '这个是网站描述', - '{strIndexTitle}' => '这个是首页Title', - '{strIndexKeywords}' => '这个是首页Keywords', - '{strIndexDescription}' => '这个是首页Description', - '{strNovelName}' => '这个是当前页面小说名字', - '{strNovelChapterName}' => '当前页面小说章节名字', - '{strNovelChapterSort}' => '当前页面小说章节排序号', - '{strChapterDescription}' => '当前页面小说章节描述', - '{strNovelCategoryName}' => '当前页面小说分类名字', - '{strNovelSex}' => '当前页面小说是男生还是女生 小说', - '{strNovelStatus}' => '当前页面小说状态 是连载还是完结', - '{intPage}' => '当前页面分页页码', - '{strNovelAuthor}' => '小说作者', - '{strNovelDescription}' => '小说简介', - '{strSearchKeywords}' => '搜索关键词', - ]; - - static private function getKey($strKey): string - { - return '{' . $strKey . '}'; - } - - - /** - * Undocumented function - * - * @param string|array $mixedKey 全局动态变量键或者数组 - * @param string $strVal 全局动态变量值 - * @return void - */ - static public function setVal(string | array $mixedKey, $strVal = NULL) - { - if (is_string($mixedKey)) { - self::$arrMap[self::getKey($mixedKey)] = $strVal; - } else if (is_array($mixedKey)) { - foreach ($mixedKey as $strKey => $strVal) { - if (key_exists(self::getKey($strKey), self::$arrMap)) { - self::$arrMap[self::getKey($strKey)] = $strVal; - } - } - } - } - - /** - * Undocumented function - * - * @param string $strKey - * @return void - */ - static public function getVal(string $strKey) - { - return self::$arrMap[self::getKey($strKey)]; - } - - /** - * Undocumented function - * - * @param string $strSubject - * @return string - */ - static public function convert(string $strSubject): string - { - $strSubject = str_replace(array_keys(self::$arrMap), array_values(self::$arrMap), $strSubject); - - return str_replace(array_keys(self::$arrMap), array_values(self::$arrMap), $strSubject); - } -} diff --git a/code/app/model/CountersModel.php b/code/app/model/CountersModel.php deleted file mode 100644 index fdd707d..0000000 --- a/code/app/model/CountersModel.php +++ /dev/null @@ -1,63 +0,0 @@ - [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - 'projection' => [ - '_id' => 0, - ], - ]; - - /** - * 获取下一个自增序列值 - * @param string $strSequenceName 序列名称 - * @return int 自增 ID - */ - public function getNextSequence(string $strSequenceName): int - { - $Result = $this->getCol()->findOneAndUpdate( - ['_id' => $strSequenceName], - ['$inc' => ['sequence_value' => 1]], - [ - 'upsert' => true, - 'returnDocument' => \MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER - ] - ); - return $Result->sequence_value ?? 1; - } -} diff --git a/code/app/model/DomainModel.php b/code/app/model/DomainModel.php deleted file mode 100644 index 0e6f32b..0000000 --- a/code/app/model/DomainModel.php +++ /dev/null @@ -1,148 +0,0 @@ -d_domain] = $DomainModel; - } - - return Cache::set($strKey, self::$arrAllDomain); - } - - /** - * Undocumented function - * - * @param string $strDomain - * @return DomainModel|NULL - */ - static public function getDomainOnCacheByDomain($strDomain): DomainModel|NULL - { - if (key_exists($strDomain, self::getAllDomainOnCache())) { - return self::getAllDomainOnCache()[$strDomain]; - } - - return NULL; - } - - /** - * Undocumented function - * - * @param string $strWords - * @return string - */ - static public function wordsEncode($strWords): string - { - $Request = request(); - $intEncode = $Request->DomainModel->d_content_encode; - - if ($intEncode == 1) { - $strWords = customEntities($strWords); - } - - return $strWords; - } - - - /** - * Undocumented function - * - * @param string $strKey - * @return string - */ - public function getFomartSubject($strKey, $strDiff = '', bool $boolJoin = true) - { - $intSfgId = $this->t_cfg->{$strKey}['sfg_id']; - $SubjectFomartModel = NULL; - - $arrAllSubjectFomartModel = SubjectFomartModel::getAllSubjectFomartOnCacheBySfgId($intSfgId); - if (empty($arrAllSubjectFomartModel)) { - return ''; - } - - $strDomain = request()->DomainModel->d_domain; - $strController = request()->controller(); - $strAction = request()->action(); - - if ($boolJoin) { - $strUUId = sprintf('%s-%s-%s-%s-%s', $strDomain, $strController, $strAction, $strKey, $strDiff); - } else { - $strUUId = sprintf('%s-%s-%s', $strDomain, $strKey, $strDiff); - } - - $arrConfigSubjectFomart = ConfigSubjectFomartModel::getInstance()->getConfigSubjectFomartByCsfKey($strUUId); - - if (empty($arrConfigSubjectFomart)) { - - $intKey = array_rand($arrAllSubjectFomartModel); - - $SubjectFomartModel = $arrAllSubjectFomartModel[$intKey]; - - ConfigSubjectFomartModel::getInstance()->insert([ - 'csf_key' => $strUUId, - 'sf_id' => $SubjectFomartModel->sf_id, - ]); - - - } else { - $intSfId = $arrConfigSubjectFomart['sf_id']; - - foreach ($arrAllSubjectFomartModel as $objTemp) { - if ($objTemp->sf_id == $intSfId) { - $SubjectFomartModel = $objTemp; - break; - } - } - - } - - return $SubjectFomartModel->sf_val ?? ''; - - } - - -} diff --git a/code/app/model/FenLeiModel.php b/code/app/model/FenLeiModel.php deleted file mode 100644 index 0805f57..0000000 --- a/code/app/model/FenLeiModel.php +++ /dev/null @@ -1,133 +0,0 @@ -where('fl_mingzi',$strFlMingzi)->find(); - - if ($FenLeiModel) { - return $FenLeiModel; - } - - $FenLeiModel = new self; - // $FenLeiModel->fl_id = $intFlId; - $FenLeiModel->fl_leixing = 0; - $FenLeiModel->fl_pid = $intFlPId; - $FenLeiModel->fl_mingzi = $strFlMingzi; - $FenLeiModel->save(); - return $FenLeiModel; - } catch (\Throwable $T) { - } - - if ($T->getCode() == 10501) { - return self::addFenlei($intFlId, $intFlPId, $strFlMingzi); - } - throw $T; - } - - static public function getAllFenLei() - { - if (self::$arrFenLei == []) { - self::$arrFenLei = Cache::get('SHI_PIN_FEN_LEI'); - - if (empty(self::$arrFenLei)) { - self::flushCache(); - self::$arrFenLei = Cache::get('SHI_PIN_FEN_LEI'); - } - } - - - return self::$arrFenLei; - } - - - static public function getFenLeiByFlId($intFlId) - { - if (self::$arrFenLei == []) { - self::$arrFenLei = Cache::get('SHI_PIN_FEN_LEI'); - - if (empty(self::$arrFenLei)) { - self::flushCache(); - self::$arrFenLei = Cache::get('SHI_PIN_FEN_LEI'); - } - } - - - return self::$arrFenLei[$intFlId] ?? ""; - } - - static public function getFenLeiMingZiByFlId($intFlId, $intZiFlId) - { - if (empty(self::$arrFenLei)) { - self::$arrFenLei = Cache::get('SHI_PIN_FEN_LEI'); - - if (empty(self::$arrFenLei)) { - self::flushCache(); - self::$arrFenLei = Cache::get('SHI_PIN_FEN_LEI'); - } - } - - if ($intZiFlId == 0) { - return self::$arrFenLei[$intFlId]['fl_mingzi'] ?? ''; - } else { - $arrFenLeiChild = self::$arrFenLei[$intFlId]['child'] ?? []; - foreach ($arrFenLeiChild as $item) { - if ($item['fl_id'] == $intZiFlId) { - return $item['fl_mingzi']; - } - } - } - - return ''; - } - - - static public function flushCache() - { - // $arrFenLei = self::select()->toArray(); - $arrFenLei = self::order('fl_sort', 'desc')->select()->toArray(); - - $arrFenLei = static::buildTree($arrFenLei); - - Cache::tag('SHI_PIN_FEN_LEI')->set('SHI_PIN_FEN_LEI', $arrFenLei); - } - - static public function buildTree(array $elements, $parentId = 0) - { - $branch = []; - - foreach ($elements as $element) { - if ($element['fl_pid'] == $parentId) { - $children = static::buildTree($elements, $element['fl_id']); - if ($children) { - $element['child'] = $children; - } - $branch[$element['fl_id']] = $element; - } - } - - return $branch; - } -} diff --git a/code/app/model/GanRaoMaModel.php b/code/app/model/GanRaoMaModel.php deleted file mode 100644 index 18720ae..0000000 --- a/code/app/model/GanRaoMaModel.php +++ /dev/null @@ -1,260 +0,0 @@ - [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - 'projection' => [ - '_id' => 0, - ], - ]; - - - /** - * 可选属性 - */ - const POSSIBLE_ATTRIBUTES = [ - 'draggable', - 'date-time', - 'lang', - 'id', - 'dir', - 'class' - ]; - - /** - * 配置常量 - */ - const TAG_MAX_LENGTH = 8; - const ATTR_VALUE_MAX_LENGTH = 10; - const ATTR_MIN_COUNT = 1; - const ATTR_MAX_COUNT = 3; - - /** - * Undocumented variable - * - * @var array - */ - static public $arrSelfClosing = [ - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - - '<%s id="%s"> ', - ]; - - const LETTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - - const CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - - public static function generateRandomStrings(int $count): array - { - static $lettersLength = null; - static $charsLength = null; - - if ($lettersLength === null) { - $lettersLength = strlen(self::LETTERS) - 1; - $charsLength = strlen(self::CHARS) - 1; - } - - - $result = array_fill(0, $count, ''); - - array_walk($result, function (&$value) use ($lettersLength, $charsLength) { - $length = random_int(5, 10); - $value = self::LETTERS[random_int(0, $lettersLength)]; - $i = 1; - while ($i < $length) { - $value .= self::CHARS[random_int(0, $charsLength)]; - $i++; - } - }); - - return $result; - } - - /** - * Undocumented function - * 随机生成自定义标签-干扰码 - * - * @param integer $intMinTags - * @param integer $intMaxTags - * @return string - */ - static public function generateRandomCustomizeHtml(int $intMinTags = 5, int $intMaxTags = 20): string - { - - // 随机标签数量 - $intNumTags = rand($intMinTags, $intMaxTags); - $strHtmlResult = ''; - - for ($i = 0; $i < $intNumTags; $i++) { - // 生成随机标签名 - $strTagName = self::generateRandomString(rand(3, self::TAG_MAX_LENGTH), self::LETTERS); - - // 随机属性数量 - $intNumAttributes = rand(self::ATTR_MIN_COUNT, self::ATTR_MAX_COUNT); - $strAttributes = self::generateAttributes($intNumAttributes); - - // 拼接标签 - $strHtmlResult .= "<{$strTagName}{$strAttributes}>\n"; - } - - return $strHtmlResult; - } - - /** - * Undocumented function - * 生成自定义属性 - * - * @param integer $intTotal - * @return string - */ - static public function generateAttributes(int $intTotal): string - { - $strAttributes = ''; - $arrUsedAttributes = array_rand(array_flip(self::POSSIBLE_ATTRIBUTES), $intTotal); - - foreach ((array) $arrUsedAttributes as $strAttrName) { - $strAttrValue = self::generateRandomString( - rand(3, self::ATTR_VALUE_MAX_LENGTH), - self::CHARS - ); - $strAttributes .= " {$strAttrName}=\"{$strAttrValue}\""; - } - - return $strAttributes; - } - - /** - * Undocumented function - * 生成随机字符串 - * - * @param integer $length - * @param string $strCharset - * @return string - */ - static public function generateRandomString(int $length, string $strCharset): string - { - $intCharsetLength = strlen($strCharset); - $strRandomString = ''; - - for ($i = 0; $i < $length; $i++) { - $strRandomString .= $strCharset[rand(0, $intCharsetLength - 1)]; - } - - return $strRandomString; - } - - - - /** - * Undocumented function - * - * @param string $strDomain 域名 - * @param string $strPageCode 视图编码 - * @param string $strDifference 差异 - * @param int $intNum 生成数量 - * @return array - */ - static public function getGrmCode($strDomain, $strPageCode, $strDifference, $intNum) - { - - $arrFilter = [ - 'grm_domain' => (string) $strDomain, - 'grm_page_code' => (string) $strPageCode, - 'grm_page_diff' => (string) $strDifference, - ]; - $arrResult = self::getInstance()->getOne($arrFilter, self::$arrOptions); - - if (empty($arrResult)) { - - // $intNum = mt_rand($intStartNumber, $intEndNumber); - // $arrGrmCode = self::$arrSelfClosing; - // shuffle($arrGrmCode); - // $arrGrmCode = array_slice($arrGrmCode, 0, $intNum); - // $strGrmCode = implode('', $arrGrmCode); - // $intRandNum = substr_count($strGrmCode, '%s'); - // $arrRandStr = self::generateRandomStrings($intRandNum); - // $strGrmCode = sprintf($strGrmCode, ...$arrRandStr); - - $arrGrmCode = []; - while ($intNum-- > 0) { - // $arrGrmCode[] = self::generateRandomCustomizeHtml(mt_rand(1, 3), mt_rand(3, 6)); - $arrGrmCode[] = self::generateRandomCustomizeHtml(1, 1); - } - - $arrData = $arrFilter; - $arrData['grm_code'] = $arrGrmCode; - - self::getInstance()->insert($arrData); - } else { - $arrGrmCode = $arrResult['grm_code']; - } - - return $arrGrmCode; - } - - static public function splitTagsToArray(string $htmlTags): array - { - // 按换行符分割,兼容不同系统 - $tagsArray = preg_split('/\r\n|\n|\r/', $htmlTags); - - // 去除空白行并清理首尾空格 - $tagsArray = array_filter(array_map('trim', $tagsArray), function ($tag) { - return !empty($tag); - }); - - // 重置索引 - return array_values($tagsArray); - } -} diff --git a/code/app/model/MongoModel.php b/code/app/model/MongoModel.php deleted file mode 100644 index 5c30baf..0000000 --- a/code/app/model/MongoModel.php +++ /dev/null @@ -1,147 +0,0 @@ -MongoBase = MongoBase::getInstance(); - } - - /** - * Undocumented function - * - * @return MongoBase - */ - public function getMongoBase(): MongoBase - { - return $this->MongoBase; - } - - /** - * Undocumented function - * - * @return Collection - */ - public function getCol(): Collection - { - return $this->getMongoBase()->getDb()->selectCollection($this->getCollectionName()); - } - - /** - * Undocumented function - * - * @return string - */ - public function getCollectionName(): string - { - return $this->strCollection; - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @return array|object|null - */ - public function getOne(array $arrFilter = [], array $arrOptions = []): array|object|null - { - return $this->getCol()->findOne($arrFilter, $arrOptions); - } - - /** - * Undocumented function - * - * @param string $strKey - * @return array|object|NULL - */ - public function checkCacheByKey(string $strKey): array|object|NULL - { - - if (config('view.view_data_cache') == false) { - return NULL; - } - - if (!empty($strKey)) { - $arrResult = Cache::get($strKey); - if (!empty($arrResult)) { - return $arrResult; - } - } - return NULL; - } - - /** - * Undocumented function - * - * @param string $strKey - * @param mixed $mixedData - * @param integer $intLifeTime - * @return void - */ - public function setCacheByKey(string $strKey, mixed $mixedData, int $intLifeTime) - { - if (!empty($strKey) && !empty($mixedData)) { - Cache::set($strKey, $mixedData, $intLifeTime); - } - } - - /** - * Undocumented function - * - * @param array $arrData - * @return mixed - */ - public function insert(array $arrData, array $arrOptions = []): mixed - { - $Result = $this->getCol()->insertOne($arrData); - return $Result->getInsertedId(); - } - - - /** - * 更新单条数据 - * @param string $strColName 集合名称 - * @param array $arrFilter 查询条件 - * @param array $arrUpdate 更新内容 - * @param array $arrOptions 更新选项 - * @return int 受影响的文档数 - */ - public function updateOne(array $arrFilter, array $arrUpdate, array $arrOptions = []): int - { - $Result = $this->getCol()->updateOne($arrFilter, $arrUpdate, $arrOptions); - return $Result->getModifiedCount(); - } -} diff --git a/code/app/model/NovelClicksModel.php b/code/app/model/NovelClicksModel.php deleted file mode 100644 index 663c11f..0000000 --- a/code/app/model/NovelClicksModel.php +++ /dev/null @@ -1,118 +0,0 @@ -getCol()->findOne([ - "n_id" => $intNId, - ]); - - if (empty($Novel)) { - return false; - } - - $Now = new DateTime(); - - $strDailyDate = $Now->format('Y-m-d'); - $strWeeklyDate = $Now->modify('monday this week')->format('Y-m-d'); - $MonthlyDate = $Now->format('Y-m-01'); - - $arrClickTypes = [ - 'daily' => $strDailyDate, - 'weekly' => $strWeeklyDate, - 'monthly' => $MonthlyDate, - 'total' => null, - ]; - - foreach ($arrClickTypes as $strType => $strDate) { - $this->getCol()->updateOne( - [ - 'n_id' => $intNId, - 'nc_date' => $strDate, - 'nc_type' => $strType, - ], - [ - '$inc' => ['nc_clicks' => 1], - '$set' => ['n_category' => $Novel->n_category] - ], - [ - 'upsert' => true - ] - ); - } - return true; - } - - public function getStats(int $intNId): array - { - $Now = new DateTime(); - $strDailyDate = $Now->format('Y-m-d'); - $strWeeklyDate = $Now->modify('monday this week')->format('Y-m-d'); - $strMonthlyDate = $Now->format('Y-m-01'); - - $query = [ - 'n_id' => $intNId, - '$or' => [ - ['nc_type' => 'daily', 'nc_date' => $strDailyDate], - ['nc_type' => 'weekly', 'nc_date' => $strWeeklyDate], - ['nc_type' => 'monthly', 'nc_date' => $strMonthlyDate], - ['nc_type' => 'total', 'nc_date' => null] - ] - ]; - $arrOptions = [ - 'projection' => ['nc_type' => 1, 'nc_clicks' => 1, '_id' => 0], - 'typeMap' => ['root' => 'array', 'document' => 'array', 'array' => 'array'] - ]; - - $arrResults = $this->getCol()->find($query, $arrOptions)->toArray(); - - $arrStats = array_column($arrResults, 'nc_clicks', 'nc_type'); - - $defaultStats = [ - 'daily' => 0, - 'weekly' => 0, - 'monthly' => 0, - 'total' => 0 - ]; - $arrStats = array_merge($defaultStats, $arrStats); - - return $arrStats; - } -} diff --git a/code/app/model/NovelModel.php b/code/app/model/NovelModel.php deleted file mode 100644 index efdf686..0000000 --- a/code/app/model/NovelModel.php +++ /dev/null @@ -1,486 +0,0 @@ - [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - 'projection' => [ - '_id' => 0, - 'n_site_code' => 0, - 'n_source_uuid' => 0, - 'n_source_id' => 0, - ], - ]; - - /** - * 根据关键词数组更新小说推荐等级 - * @param array $arrKeywords 关键词数组,例如 ["斗罗", "遮天", "凡人"] - * @param int $intLevel 推荐等级1~9,例如 3 - * @return array 更新结果 - */ - public function updateByKeywords(array $arrKeywords, int $intLevel) - { - if (empty($arrKeywords)) { - return false; - } - - try { - $arrConditions = array_map(function ($strKeyword) { - return ['n_name' => ['$regex' => trim($strKeyword), '$options' => 'i']]; - }, $arrKeywords); - - $UpdateResult = $this->getCol()->updateMany( - ['$or' => $arrConditions], - ['$set' => ['n_level' => $intLevel]] - ); - - $UpdateResult->getModifiedCount(); - } catch (Exception $e) { - return false; - } - - return true; - } - - /** - * 直接读库查询大量小说 - * - * @param integer $intNId - * @return null|array - */ - public function findMany(array $arrFilter, int $intCount = 10, array $arrSort = [], array $arrOptions = []): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrOptions; - } - - if ($intCount > 0) { - $arrOptions['limit'] = $intCount; - } - - if (empty($arrSort)) { - $arrOptions['sort'] = $arrSort; - } - - $arrFilter['n_have_chapter'] = 1; - - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - - $arrResult = iterator_to_array($Cursor); - - foreach ($arrResult as &$arrItem) { - applyToKeys($arrItem, ['created_at', 'updated_at'], 'formatMongoDate'); - } - - return $arrResult; - } - - - /** - * 查询多条数据并缓存 - * - * @param array $arrFilter - * @param integer $intCount - * @param array $arrSort - * @param array $arrOptions - * @param string $strKey - * @param integer $intLifeTime - * @return null|array - */ - public function findManyWithCache( - array $arrFilter, - int $intCount = 0, - array $arrSort = [], - array $arrOptions = [], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): null|array { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrResult = $this->findMany($arrFilter, $intCount, $arrSort, $arrOptions); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - /** - * find one novel - * - * @param array $arrFilter - * @param array $arrOptions - * @return null|array - */ - public function findOne(array $arrFilter, array $arrOptions = []): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrOptions; - } - - $arrNovel = $this->getOne($arrFilter, $arrOptions); - - if (!empty($arrNovel)) { - applyToKeys($arrNovel, ['created_at', 'updated_at'], 'formatMongoDate'); - } - - return $arrNovel; - } - - /** - * 根据小说ID查询指定小说 - * - * @param integer $intNId - * @return array - */ - public function getNovelByNId(int $intNId): null|array - { - $arrFilter = ['n_id' => $intNId, 'n_have_chapter' => 1]; - return $this->findOne($arrFilter); - } - - - /** - * 查询符合条件的随机多条小说 - * - * @param string $strKey - * @param array $arrFilter - * @param integer $intCount - * @param integer $intLifeTime - * @return array - */ - public function getRandNovelWithCache(array $arrFilter = [], int $intCount = 10, string $strKey = '', int $intLifeTime = 24 * 3600,): array - { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrFilter['n_have_chapter'] = 1; - - $arrPipeline = [ - ['$match' => $arrFilter], - ['$sample' => ['size' => $intCount]] - ]; - - $Novel = $this->getCol()->aggregate($arrPipeline); - - $arrResult = iterator_to_array($Novel); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - /** - * 通用小说分页 - * - * @param array $arrFilter - * @param integer $intPage - * @param integer $intLimit - * @param array $arrSort - * @param string $strKey - * @param int $intLifeTime - * @return array - */ - public function findPaginatedWithCache( - array $arrFilter, - int $intPage = 1, - int $intLimit = 20, - array $arrSort = ['n_level' => -1], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): array { - try { - $arrFilter['n_have_chapter'] = 1; - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - $arrOptions = self::$arrOptions; - $arrOptions['sort'] = $arrSort; - $arrOptions['skip'] = ($intPage - 1) * $intLimit; - $arrOptions['limit'] = $intLimit; - unset($arrOptions['typeMap']); - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - $intTotal = $this->getCol()->countDocuments($arrFilter); - - $arrResult = iterator_to_array($Cursor); - - shuffle($arrResult); - - $arrResult = [ - 'data' => $arrResult, - 'total' => $intTotal, - 'page' => $intPage, - 'limit' => $intLimit, - 'pages' => ceil($intTotal / $intLimit) - ]; - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - - /** - * 用于Home下的书库分页 - * - * @param string $strKey - * @param integer $intPage - * @param integer $intLimit - * @param int $intLifeTime - * @param integer $intType - * @param string $strStatus - * @param array $arrSort - * @return array - */ - public function getCustomPage01( - string $strKey, - int $intPage = 1, - int $intLimit = 20, - int $intLifeTime = 24 * 3600, - int $intType = 0, - $strStatus = NULL, - array $arrSort = ['n_level' => -1] - ): array { - $arrFilter = ['n_have_chapter' => 1,]; - - switch ($intType) { - case 1: - $arrCategory = array_values(CategoryModel::getManCategory()); - $arrFilter['n_category'] = ['$in' => $arrCategory]; - break; - case 2: - $arrCategory = array_values(CategoryModel::getWomenCategory()); - $arrFilter['n_category'] = ['$in' => $arrCategory]; - break; - } - - if ($strStatus !== NULL) { - $arrFilter['n_status'] = $strStatus; - } - return $this->findPaginatedWithCache($arrFilter, $intPage, $intLimit, $arrSort, $strKey, $intLifeTime,); - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @param integer $intCount - * @param array $arrSort - * @param string $strKey - * @param integer $intLifeTime - * @return array - */ - public function findManyShuffledWithCache( - array $arrFilter, - int $intCount = 10, - array $arrSort = [], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): array { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrFilter['n_have_chapter'] = 1; - - $arrOptions = self::$arrOptions; - - if (!empty($arrSort)) { - $arrOptions['sort'] = $arrSort; - } - - $arrOptions['limit'] = $intCount * 3; - - unset($arrOptions['typeMap']); - - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - - $arrResult = iterator_to_array($Cursor); - - shuffle($arrResult); - - $arrResult = array_slice($arrResult, 0, $intCount); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - /** - * Undocumented function - * - * @param string $strKey - * @param int $intLifeTime - * @param integer $intCount - * @param integer $intType - * @param string $strStatus - * @param array $arrSort - * @return array - */ - public function getCommonNovelOnCache( - string $strKey, - int $intLifeTime = 24 * 3600, - int $intCount = 10, - int $intType = 0, - $strStatus = NULL, - array $arrSort = ['n_level' => -1] - ): array { - try { - $arrFilter = []; - - if (in_array($intType, [1, 2])) { - $arrFilter['n_category'] = ['$in' => CategoryModel::getCategoryByType($intType)]; - } - - if ($strStatus !== NULL) { - $arrFilter['n_status'] = $strStatus; - } - - return $this->findManyShuffledWithCache($arrFilter, $intCount, $arrSort, $strKey, $intLifeTime); - } catch (\Exception $e) { - return []; - } - } - - /** - * Undocumented function - * - * @param string $strSign - * @param integer $intCount - * @param integer $intType - * @param string strDateType - * * daily 天 - * * weekly 周 - * * monthly 月 - * * total 总 - * @return array - */ - public function getRankNovelOnCache( - string $strKey, - int $intCount = 10, - int $intType = 0, - $strDateType = 'daily', - $strStatus = NULL, - $intLifeTime = 24 * 3600, - ): array { - try { - - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - $arrFilter = [ - 'nc_type' => $strDateType, - ]; - - if ($strStatus !== NULL) { - $arrFilter['n_status'] = $strStatus; - } - - if (in_array($intType, [1, 2])) { - $arrFilter['n_category'] = ['$in' => CategoryModel::getCategoryByType($intType)]; - } - - $arrOptions = [ - 'sort' => ['nc_clicks' => -1], - 'limit' => $intCount * 3, - 'projection' => [ - 'n_id' => 1, - ], - ]; - - $NovelClicksModel = NovelClicksModel::getInstance(); - - $Cursor = $NovelClicksModel->getCol()->find($arrFilter, $arrOptions); - - $arrNId = []; - foreach ($Cursor as $Doc) { - $arrNId[] = $Doc['n_id']; - } - - $arrFilter = ['n_id' => ['$in' => $arrNId]]; - $arrOptions = self::$arrOptions; - unset($arrOptions['typeMap']); - - $Cursor = $this->getCol()->find( - $arrFilter, - $arrOptions - ); - - $arrResult = iterator_to_array($Cursor); - - shuffle($arrResult); - - $arrResult = array_slice($arrResult, 0, $intCount); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } -} diff --git a/code/app/model/PlanTaskModel.php b/code/app/model/PlanTaskModel.php deleted file mode 100644 index 61ff6e5..0000000 --- a/code/app/model/PlanTaskModel.php +++ /dev/null @@ -1,17 +0,0 @@ -sfg_id][] = $SubjectFomartModel; - } - - return Cache::set($strKey, self::$arrAllSubjectFomart); - } - -} diff --git a/code/app/model/SystemConfigModel.php b/code/app/model/SystemConfigModel.php deleted file mode 100644 index 92819bb..0000000 --- a/code/app/model/SystemConfigModel.php +++ /dev/null @@ -1,39 +0,0 @@ -set('Config', $arrSystemConfig); - } -} diff --git a/code/app/model/TemplatesModel.php b/code/app/model/TemplatesModel.php deleted file mode 100644 index a562fd6..0000000 --- a/code/app/model/TemplatesModel.php +++ /dev/null @@ -1,86 +0,0 @@ -t_id] = $TemplateModel; - } - - return Cache::set($strKey, self::$arrAllTemplate); - } - - /** - * Undocumented function - * - * @param int $intTId - * @return TemplatesModel|NULL - */ - static public function getTemplateOnCacheByTId(int $intTId): TemplatesModel|NULL - { - if (key_exists($intTId, self::getAllTemplateOnCache())) { - return self::getAllTemplateOnCache()[$intTId]; - } - - return NULL; - } -} diff --git a/code/app/model/VideoClicksModel.php b/code/app/model/VideoClicksModel.php deleted file mode 100644 index 06984f4..0000000 --- a/code/app/model/VideoClicksModel.php +++ /dev/null @@ -1,124 +0,0 @@ -getCol()->findOne([ - "v_id" => $intVId, - ]); - - if (empty($Novel)) { - return false; - } - - $Now = new DateTime(); - - $strDailyDate = $Now->format('Y-m-d'); - $strWeeklyDate = $Now->modify('monday this week')->format('Y-m-d'); - $MonthlyDate = $Now->format('Y-m-01'); - - $arrClickTypes = [ - 'daily' => $strDailyDate, - 'weekly' => $strWeeklyDate, - 'monthly' => $MonthlyDate, - 'total' => null, - ]; - - foreach ($arrClickTypes as $strType => $strDate) { - $this->getCol()->updateOne( - [ - 'v_id' => $intVId, - 'vc_date' => $strDate, - 'vc_type' => $strType, - ], - [ - '$inc' => ['vc_clicks' => 1], - '$set' => ['v_category_id' => $Novel->v_category_id] - ], - [ - 'upsert' => true - ] - ); - } - return true; - } - - /** - * GetStats - * - * @param integer $intVId - * @return array - */ - public function getStats(int $intVId): array - { - $Now = new DateTime(); - $strDailyDate = $Now->format('Y-m-d'); - $strWeeklyDate = $Now->modify('monday this week')->format('Y-m-d'); - $strMonthlyDate = $Now->format('Y-m-01'); - - $query = [ - 'v_id' => $intVId, - '$or' => [ - ['vc_type' => 'daily', 'vc_date' => $strDailyDate], - ['vc_type' => 'weekly', 'vc_date' => $strWeeklyDate], - ['vc_type' => 'monthly', 'vc_date' => $strMonthlyDate], - ['vc_type' => 'total', 'vc_date' => null] - ] - ]; - $arrOptions = [ - 'projection' => ['vc_type' => 1, 'vc_clicks' => 1, '_id' => 0], - 'typeMap' => ['root' => 'array', 'document' => 'array', 'array' => 'array'] - ]; - - $arrResults = $this->getCol()->find($query, $arrOptions)->toArray(); - - $arrStats = array_column($arrResults, 'vc_clicks', 'vc_type'); - - $defaultStats = [ - 'daily' => 0, - 'weekly' => 0, - 'monthly' => 0, - 'total' => 0 - ]; - $arrStats = array_merge($defaultStats, $arrStats); - - return $arrStats; - } -} diff --git a/code/app/model/VideoModel.php b/code/app/model/VideoModel.php deleted file mode 100644 index 33bcd7d..0000000 --- a/code/app/model/VideoModel.php +++ /dev/null @@ -1,484 +0,0 @@ - [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - 'projection' => [ - '_id' => 0, - 'n_site_code' => 0, - 'n_source_uuid' => 0, - 'n_source_id' => 0, - ], - ]; - - /** - * 根据关键词数组更新小说推荐等级 - * @param array $arrKeywords 关键词数组,例如 ["斗罗", "遮天", "凡人"] - * @param int $intLevel 推荐等级1~9,例如 3 - * @return array 更新结果 - */ - public function updateByKeywords(array $arrKeywords, int $intLevel) - { - if (empty($arrKeywords)) { - return false; - } - - try { - $arrConditions = array_map(function ($strKeyword) { - return ['n_name' => ['$regex' => trim($strKeyword), '$options' => 'i']]; - }, $arrKeywords); - - $UpdateResult = $this->getCol()->updateMany( - ['$or' => $arrConditions], - ['$set' => ['n_level' => $intLevel]] - ); - - $UpdateResult->getModifiedCount(); - } catch (Exception $e) { - return false; - } - - return true; - } - - /** - * 直接读库查询大量小说 - * - * @param integer $intNId - * @return null|array - */ - public function findMany(array $arrFilter, int $intCount = 10, array $arrSort = [], array $arrOptions = []): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrOptions; - } - - if ($intCount > 0) { - $arrOptions['limit'] = $intCount; - } - - if (empty($arrSort)) { - $arrOptions['sort'] = $arrSort; - } - - $arrFilter['n_have_chapter'] = 1; - - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - - $arrResult = iterator_to_array($Cursor); - - foreach ($arrResult as &$arrItem) { - applyToKeys($arrItem, ['created_at', 'updated_at'], 'formatMongoDate'); - } - - return $arrResult; - } - - - /** - * 查询多条数据并缓存 - * - * @param array $arrFilter - * @param integer $intCount - * @param array $arrSort - * @param array $arrOptions - * @param string $strKey - * @param integer $intLifeTime - * @return null|array - */ - public function findManyWithCache( - array $arrFilter, - int $intCount = 0, - array $arrSort = [], - array $arrOptions = [], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): null|array { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrResult = $this->findMany($arrFilter, $intCount, $arrSort, $arrOptions); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - /** - * find one Video - * - * @param array $arrFilter - * @param array $arrOptions - * @return null|array - */ - public function findOne(array $arrFilter, array $arrOptions = []): null|array - { - if (empty($arrOptions)) { - $arrOptions = self::$arrOptions; - } - - $arrVideo = $this->getOne($arrFilter, $arrOptions); - - if (!empty($arrVideo)) { - applyToKeys($arrVideo, ['created_at', 'updated_at'], 'formatMongoDate'); - } - - return $arrVideo; - } - - /** - * 根据小说ID查询指定小说 - * - * @param integer $intNId - * @return array - */ - public function getVideoByNId(int $intNId): null|array - { - $arrFilter = ['n_id' => $intNId, 'n_have_chapter' => 1]; - return $this->findOne($arrFilter); - } - - - /** - * 查询符合条件的随机多条小说 - * - * @param string $strKey - * @param array $arrFilter - * @param integer $intCount - * @param integer $intLifeTime - * @return array - */ - public function getRandVideoWithCache(array $arrFilter = [], int $intCount = 10, string $strKey = '', int $intLifeTime = 24 * 3600,): array - { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrFilter['n_have_chapter'] = 1; - - $arrPipeline = [ - ['$match' => $arrFilter], - ['$sample' => ['size' => $intCount]] - ]; - - $Video = $this->getCol()->aggregate($arrPipeline); - - $arrResult = iterator_to_array($Video); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - /** - * 通用小说分页 - * - * @param array $arrFilter - * @param integer $intPage - * @param integer $intLimit - * @param array $arrSort - * @param string $strKey - * @param int $intLifeTime - * @return array - */ - public function findPaginatedWithCache( - array $arrFilter, - int $intPage = 1, - int $intLimit = 20, - array $arrSort = ['n_level' => -1], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): array { - try { - $arrFilter['n_have_chapter'] = 1; - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - $arrOptions = self::$arrOptions; - $arrOptions['sort'] = $arrSort; - $arrOptions['skip'] = ($intPage - 1) * $intLimit; - $arrOptions['limit'] = $intLimit; - unset($arrOptions['typeMap']); - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - $intTotal = $this->getCol()->countDocuments($arrFilter); - - $arrResult = iterator_to_array($Cursor); - - shuffle($arrResult); - - $arrResult = [ - 'data' => $arrResult, - 'total' => $intTotal, - 'page' => $intPage, - 'limit' => $intLimit, - 'pages' => ceil($intTotal / $intLimit) - ]; - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - - /** - * 用于Home下的书库分页 - * - * @param string $strKey - * @param integer $intPage - * @param integer $intLimit - * @param int $intLifeTime - * @param integer $intType - * @param string $strStatus - * @param array $arrSort - * @return array - */ - public function getCustomPage01( - string $strKey, - int $intPage = 1, - int $intLimit = 20, - int $intLifeTime = 24 * 3600, - int $intType = 0, - $strStatus = NULL, - array $arrSort = ['n_level' => -1] - ): array { - $arrFilter = ['n_have_chapter' => 1,]; - - switch ($intType) { - case 1: - $arrCategory = array_values(CategoryModel::getManCategory()); - $arrFilter['n_category'] = ['$in' => $arrCategory]; - break; - case 2: - $arrCategory = array_values(CategoryModel::getWomenCategory()); - $arrFilter['n_category'] = ['$in' => $arrCategory]; - break; - } - - if ($strStatus !== NULL) { - $arrFilter['n_status'] = $strStatus; - } - return $this->findPaginatedWithCache($arrFilter, $intPage, $intLimit, $arrSort, $strKey, $intLifeTime,); - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @param integer $intCount - * @param array $arrSort - * @param string $strKey - * @param integer $intLifeTime - * @return array - */ - public function findManyShuffledWithCache( - array $arrFilter, - int $intCount = 10, - array $arrSort = [], - string $strKey = '', - int $intLifeTime = 24 * 3600, - ): array { - try { - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - - $arrFilter['n_have_chapter'] = 1; - - $arrOptions = self::$arrOptions; - - if (!empty($arrSort)) { - $arrOptions['sort'] = $arrSort; - } - - $arrOptions['limit'] = $intCount * 3; - - unset($arrOptions['typeMap']); - - $Cursor = $this->getCol()->find($arrFilter, $arrOptions); - - $arrResult = iterator_to_array($Cursor); - - shuffle($arrResult); - - $arrResult = array_slice($arrResult, 0, $intCount); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - /** - * Undocumented function - * - * @param string $strKey - * @param int $intLifeTime - * @param integer $intCount - * @param integer $intType - * @param string $strStatus - * @param array $arrSort - * @return array - */ - public function getCommonVideoOnCache( - string $strKey, - int $intLifeTime = 24 * 3600, - int $intCount = 10, - int $intType = 0, - $strStatus = NULL, - array $arrSort = ['n_level' => -1] - ): array { - try { - $arrFilter = []; - - if (in_array($intType, [1, 2])) { - $arrFilter['n_category'] = ['$in' => CategoryModel::getCategoryByType($intType)]; - } - - if ($strStatus !== NULL) { - $arrFilter['n_status'] = $strStatus; - } - - return $this->findManyShuffledWithCache($arrFilter, $intCount, $arrSort, $strKey, $intLifeTime); - } catch (\Exception $e) { - return []; - } - } - - /** - * Undocumented function - * - * @param string $strSign - * @param integer $intCount - * @param integer $intType - * @param string strDateType - * * daily 天 - * * weekly 周 - * * monthly 月 - * * total 总 - * @return array - */ - public function getRankVideoOnCache(string $strKey, int $intCount = 10, int $intType = 0, $strDateType = 'daily', $strStatus = NULL): array - { - try { - $intLifeTime = 24 * 3600; - - $arrResult = $this->checkCacheByKey($strKey); - if ($arrResult !== NULL) { - return $arrResult; - } - $arrFilter = [ - 'nc_type' => $strDateType, - ]; - - if ($strStatus !== NULL) { - $arrFilter['n_status'] = $strStatus; - } - - if (in_array($intType, [1, 2])) { - $arrFilter['n_category'] = ['$in' => CategoryModel::getCategoryByType($intType)]; - } - - $arrOptions = [ - 'sort' => ['nc_clicks' => -1], - 'limit' => $intCount * 3, - 'projection' => [ - 'n_id' => 1, - ], - ]; - - $VideoClicksModel = VideoClicksModel::getInstance(); - - $Cursor = $VideoClicksModel->getCol()->find($arrFilter, $arrOptions); - - $arrNId = []; - foreach ($Cursor as $Doc) { - $arrNId[] = $Doc['n_id']; - } - - $arrFilter = ['n_id' => ['$in' => $arrNId]]; - $arrOptions = self::$arrOptions; - unset($arrOptions['typeMap']); - - $Cursor = $this->getCol()->find( - $arrFilter, - $arrOptions - ); - - $arrResult = iterator_to_array($Cursor); - - shuffle($arrResult); - - $arrResult = array_slice($arrResult, 0, $intCount); - - $this->setCacheByKey($strKey, $arrResult, $intLifeTime); - - return $arrResult; - } catch (\Exception $e) { - return []; - } - } - - - - -} diff --git a/code/app/model/ZiYuanDuanDianModel.php b/code/app/model/ZiYuanDuanDianModel.php deleted file mode 100644 index e07890d..0000000 --- a/code/app/model/ZiYuanDuanDianModel.php +++ /dev/null @@ -1,40 +0,0 @@ -set('Zydd', $arrZiYuanDuanDian); - } -} diff --git a/code/app/provider.php b/code/app/provider.php deleted file mode 100644 index 73d99fa..0000000 --- a/code/app/provider.php +++ /dev/null @@ -1,9 +0,0 @@ - Request::class, - 'think\exception\Handle' => ExceptionHandle::class, -]; diff --git a/code/app/service.php b/code/app/service.php deleted file mode 100644 index d820878..0000000 --- a/code/app/service.php +++ /dev/null @@ -1,11 +0,0 @@ -SiteContext = $SiteContext; - $this->CategoryModel = CategoryModel::getInstance(); - } -} diff --git a/code/app/services/ChapterService.php b/code/app/services/ChapterService.php deleted file mode 100644 index 5ff8c52..0000000 --- a/code/app/services/ChapterService.php +++ /dev/null @@ -1,291 +0,0 @@ -SiteContext = $SiteContext; - $this->NovelModel = NovelModel::getInstance(); - $this->ChapterModel = ChapterModel::getInstance(); - } - - public $arrSortType = [ - 'zheng' => '正序', - 'dao' => '倒叙', - ]; - - - /** - * 获取小说数据 - * - * @param array $arrParams - * @return array - */ - public function getChapterList(array $arrParams): array - { - $intCount = (int)$arrParams['count'] ?? 10; - $intNId = (int)$arrParams['n_id'] ?? 0; - $strSortType = (string)$arrParams['sort_type'] ?? ''; - $strDiffKey = (string) $arrParams['diff_key'] ?? ''; - $intCacheLifeTime = (int)$arrParams['cache_life'] ?? 0; - - $arrFilter = [ - 'n_id' => $intNId, - 'c_page' => 0, - ]; - - $arrFilter['n_id'] = $intNId; - - $arrSort = []; - - # sort filter - if (!empty($strSortType)) { - switch ($strSortType) { - case 'zheng': - $arrSort['c_sort_num'] = 1; - break; - case 'dao': - $arrSort['c_sort_num'] = -1; - break; - } - } - - $strCacheKey = ''; - $intLifeTime = 0; - - # cache filter - if ($intCacheLifeTime > 0) { - $strCacheKey = sprintf( - 'ChapterService:getChapterList:%s:%s:%s:%s:%s', - $this->SiteContext->DomainModel->d_domain, - md5(serialize($arrFilter)), - md5(serialize($arrSort)), - $intCount, - $strDiffKey, - ); - - $intLifeTime = $intLifeTime; - } - - $arrChapter = $this->ChapterModel->findManyShuffledWithCache( - $arrFilter, - $intCount, - $arrSort, - $strCacheKey, - $intLifeTime, - ); - - return $arrChapter; - } - - - /** - * 获取小说章节分页数据 - * - * @param array $arrParams - * @return array - */ - public function getNovelPager(array $arrParams): array - { - - $arrParams = [ - 'page' => max((int)($arrParams['page'] ?? 1), 1), - 'limit' => (int)($arrParams['limit'] ?? 10), - 'n_id' => (int)($arrParams['n_id'] ?? 0), - 'button_num' => (int)($arrParams['button_num'] ?? 0), - 'sort_type' => (string)($arrParams['sort_type'] ?? ''), - 'diff_key' => (string)($arrParams['diff_key'] ?? ''), - 'key' => (string)($arrParams['key'] ?? ''), - 'cache_life' => (int)($arrParams['cache_life'] ?? 0), - 'func' => (string)($arrParams['func']), - ]; - - if (!in_array($arrParams['sort_type'], array_keys($this->arrSortType))) { - $arrParams['sort_type'] = 'zheng'; - } - - $intPage = $arrParams['page']; - $intLimit = $arrParams['limit']; - $intNId = $arrParams['n_id']; - - $strSortType = $arrParams['sort_type']; - $strDiffKey = $arrParams['diff_key']; - $intCacheLifeTime = $arrParams['cache_life']; - $Func = $arrParams['func']; - - if ($intPage <= 0) { - $intPage = 1; - } - - $arrFilter = [ - '$and' => [], - ]; - - $arrFilter['$and'][] = ['n_id' => $intNId]; - $arrFilter['$and'][] = ['c_page' => 0]; - - $arrSort = []; - - # sort filter - if (!empty($strSortType)) { - switch ($strSortType) { - case 'zheng': - $arrSort['c_sort_num'] = 1; - break; - case 'dao': - $arrSort['c_sort_num'] = -1; - break; - } - } - - $strCacheKey = ''; - $intLifeTime = 0; - - if (empty($arrFilter['$and'])) { - $arrFilter = []; - } - - # cache filter - if ($intCacheLifeTime > 0) { - $strCacheKey = sprintf( - 'Service:getNovelList:%s:%s:%s:%s:%s:%s', - $this->SiteContext->DomainModel->d_domain, - md5(serialize($arrFilter)), - md5(serialize($arrSort)), - $intPage, - $intLimit, - $strDiffKey, - ); - - $intLifeTime = $intLifeTime; - } - - $arrChapter = $this->ChapterModel->findPaginatedWithCache( - $arrFilter, - $intPage, - $intLimit, - $arrSort, - $strCacheKey, - $intLifeTime, - ); - - $arrPager = call_user_func([$this, $Func], $arrParams, $arrSort, $arrChapter); - - $arrPager = $arrChapter; - unset($arrPager['data']); - $arrPager['pager'] = call_user_func([$this, $Func], $arrParams, $arrSort, $arrChapter); - - $arrResult = [ - 'data' => $arrChapter['data'], - 'p_data' => $arrPager, - ]; - - return $arrResult; - } - - - /** - * 根据NId获取小说详情 - * - * @param integer $intNId - * @return void - */ - public function getChapterInfo(int $intNId, int $intCSortNum, int $intCPage) - { - // 小说详情 - $arrNovel = $this->NovelModel->getNovelByNId($intNId); - - // 章节 - $ChapterModel = ChapterModel::getInstance(); - $arrFilter = ['n_id' => $intNId, 'c_sort_num' => $intCSortNum, 'c_page' => $intCPage]; - - - $arrChapter = $ChapterModel->findOne($arrFilter); - $strChapterDescription = ''; - - // 上一章节和下一章节 - $arrPreChapter = $arrNextChapter = []; - - if ($arrChapter) { - $arrPreChapter = $ChapterModel->getPreChapter($arrChapter['n_id'], $arrChapter['c_sort_num'], $arrChapter['c_page']); - $arrNextChapter = $ChapterModel->getNextChapter($arrChapter['n_id'], $arrChapter['c_sort_num'], $arrChapter['c_page']); - - // 要点-先从章节随机截取,后面如果用上ai,看看使用ai 提炼 精简内容 - $strChapterDescription = strip_tags($arrChapter['c_content']); - $intCount = mb_strlen($strChapterDescription); - $strChapterDescription = ($intCount > 50) ? mb_substr($strChapterDescription, 0, 50) : $strChapterDescription; - - $arrChapter['c_content'] = base64_encode($arrChapter['c_content']); - } - - $arrChapter['pre_chapter'] = $arrPreChapter; - $arrChapter['next_chapter'] = $arrNextChapter; - // var_dump($arrChapter['c_name']);exit; - // 更新值 - ConverterMovel::setVal([ - 'intPage' => 1, - 'strNovelName' => $arrNovel['n_name'], - 'strNovelAuthor' => $arrNovel['n_author'], - 'strNovelCategoryName' => $arrNovel['n_category'], - 'strNovelStatus' => $arrNovel['n_status'], - 'strNovelDescription' => $arrNovel['n_description'], - 'strChapterDescription' => $strChapterDescription, - 'strNovelChapterName' => $arrChapter['c_name'], - 'strNovelChapterSort' => $arrChapter['c_sort_num'], - ]); - - return $arrChapter; - } - - - /** - * 搜索定制分页 - * - * @param array $arrFilter 查询条件字段 - * @param array $arrSort 查询排序字段 - * @param array $arrChapter 查询出来的数据 - * @return array - */ - public function generateChapterPager(array $arrParams, array $arrSort, array $arrChapter): array - { - - $arrNovel = $this->NovelModel->getNovelByNId($arrParams['n_id']); - $intButtonNum = $arrParams['button_num']; - $intPage = $arrChapter['page']; - $intLimit = $arrChapter['limit']; - - $strBaseUrl = app(NovelService::class)->getNovelCatalogUrl($arrParams['n_id'], $arrNovel['n_name_pinyin'], $arrParams['sort_type'], '{page}'); - $arrPaginator = CusteomPage02::generate($intPage, $arrChapter['total'], $intLimit, $strBaseUrl, $intButtonNum); - - return $arrPaginator; - } -} diff --git a/code/app/services/NovelService.php b/code/app/services/NovelService.php deleted file mode 100644 index dd8db5b..0000000 --- a/code/app/services/NovelService.php +++ /dev/null @@ -1,722 +0,0 @@ -SiteContext = $SiteContext; - $this->NovelModel = NovelModel::getInstance(); - $this->ChapterModel = ChapterModel::getInstance(); - $this->NovelClicksModel = NovelClicksModel::getInstance(); - } - - /** - * Undocumented function - * - * @param array $arrArgs - * @return string - */ - public function getPageUrl($strKey, array $arrArgs,): string - { - $strSfVal = $this->SiteContext->DomainModel->getFomartSubject($strKey, '', false); - $arrKeys = []; - $arrVals = []; - foreach ($arrArgs as $strKey => $strVal) { - $arrKeys[] = '{' . $strKey . '}'; - $arrVals[] = $strVal; - } - - return str_replace($arrKeys, $arrVals, $strSfVal); - } - - - /** - * Undocumented function - * - * @param int $intNId - * @param string $intPinYin - * @return string - */ - public function getNovelInfoUrl($intNId, $intPinYin): string - { - $strKey = 'NOVEL_INFO_URL'; - $strUrl = $this->getPageUrl($strKey, [ - 'intNId' => $intNId, - 'strPinYin' => $intPinYin - ]); - return (string)$strUrl; - } - - /** - * Undocumented function - * 伪造小说 - * @param int $intNId - * @param string $intPinYin - * @return string - */ - public function getForgeNovelInfoUrl($intNId, $intPinYin, $intNForgeId): string - { - $strKey = 'KAN_NOVEL_INFO_URL'; - $strUrl = $this->getPageUrl($strKey, [ - 'intNId' => $intNId, - 'strPinYin' => $intPinYin, - 'intNForgeId' => $intNForgeId, - ]); - return (string)$strUrl; - } - - - /** - * Undocumented function - * - * @param int $intNId - * @param int $intPinYin - * @param int $intChapterSort - * @param integer $intChapterPage - * @return string - */ - public function getNovelChapterUrl(int $intNId, $intPinYin, $intChapterSort, $intChapterPage = 0): string - { - $strKey = 'CONTENT_INFO_URL'; - $strUrl = $this->getPageUrl($strKey, [ - 'intNId' => $intNId, - 'strPinYin' => $intPinYin, - 'intChapterSort' => $intChapterSort, - 'intChapterPage' => $intChapterPage, - ]); - return (string)$strUrl; - } - - /** - * Undocumented function - * - * @param int $intNId - * @param string $intPinYin - * @return string - * - */ - public function getNovelLasterChapterUrl($intNId, $intPinYin): string - { - $strKey = 'NEWS_CONTENT_INFO_URL'; - $strUrl = $this->getPageUrl($strKey, [ - 'intNId' => $intNId, - 'strPinYin' => $intPinYin, - ]); - return (string)$strUrl; - } - - /** - * 小说分类/书库 - * Undocumented function - * - * @param [type] $strGender - * @param [type] $strCategory - * @param [type] $strStatus - * @param [type] $strOrder - * @param [type] $intPage - * @return string - */ - public function getNovelCategoryUrl($strGender, $strCategory, $strStatus, $strOrder, $intPage): string - { - $strKey = 'CATEGORY_INFO_URL'; - $strUrl = $this->getPageUrl($strKey, [ - 'strGender' => $strGender ?? 'all', - 'strCategory' => $strCategory ?? 'all', - 'strStatus' => $strStatus ?? 'all', - 'strOrder' => $strOrder ?? 'all', - 'intPage' => $intPage ?? 1, - ]); - $strUrl = preg_replace('#/{2,}#', '/', $strUrl); - return (string)$strUrl; - } - - - - /** - * Undocumented function - * 小说目录 - * @param int $intNId - * @param string $intPinYin - * @return string - * - */ - public function getNovelCatalogUrl($intNId, $intPinYin, $strOrder, $intPage = 1): string - { - $strKey = 'NOVEL_CATALOG_URL'; - $strUrl = $this->getPageUrl($strKey, [ - 'intNId' => $intNId, - 'strPinYin' => $intPinYin, - 'strOrder' => $strOrder, - 'intPage' => $intPage, - ]); - return (string)$strUrl; - } - - - /** - * Undocumented function - * - * @param int $intPage - * @param string $strKeyWords - * @return string - */ - public function getNovelSearchUrl($strKeyWords, $intPage = 1): string - { - $strKey = 'SEARCH_INFO_URL'; - $strUrl = $this->getPageUrl($strKey, [ - 'intPage' => $intPage, - 'strSearchKeywords' => $strKeyWords - ]); - return (string)$strUrl; - } - - - public $arrSortType = [ - 'all' => '全部排序', - 'news' => '最新入库', - 'tuijian' => '推荐', - 'update' => '最新更新', - ]; - - public $arrRankSortType = [ - 'daily' => '天', - 'weekly' => '周', - 'monthly' => '月', - 'total' => '总', - ]; - - public $arrStatus = [ - 'all' => '所有', - 'lianzai' => '连载中', - 'wanjie' => '已完结', - ]; - - public $arrSex = [ - 'all' => '所有', - 'man' => '男生', - 'women' => '女生', - ]; - - - /** - * GetCategoryFilter - * - * @return array - */ - public function getCategoryFilter(string $strNSex = ''): array - { - if ($strNSex == 'man') { - return CategoryModel::$arrCategoryAll['man']; - } else if ($strNSex == 'women') { - return CategoryModel::$arrCategoryAll['women']; - } else { - return array_combine(CategoryModel::$arrCategoryPinYin, CategoryModel::$arrCategory); - } - } - - /** - * 获取排行榜小说 - * - * @param array $arrParams - * @return array - */ - public function getRankList(array $arrParams): array - { - $intCount = (int)$arrParams['count'] ?? 10; - $strSortType = (string)$arrParams['sort_type'] ?? ''; - $strNStatus = (string) $arrParams['n_status'] ?? ''; - $strNSex = (string) $arrParams['n_sex'] ?? ''; - $strDiffKey = (string) $arrParams['diff_key'] ?? ''; - $intCacheLifeTime = (int)$arrParams['cache_life'] ?? 0; - - $arrFilter = []; - - # n_status filter - if (!empty($strNStatus)) { - switch ($strNStatus) { - case 'lianzai': - $arrFilter['n_status'] = $this->arrStatus[$strNStatus]; - break; - case 'wanjie': - $arrFilter['n_status'] = $this->arrStatus[$strNStatus]; - break; - } - } - - # n_category_sex_zh filter - if (!empty($strNSex)) { - switch ($strNSex) { - case 'man': - $arrFilter['n_category_sex_zh'] = 1; - break; - case 'women': - $arrFilter['n_category_sex_zh'] = 2; - break; - } - } - - $arrSort = []; - - # sort filter - if (!empty($strSortType)) { - switch ($strSortType) { - case 'daily': - $arrSort['n_sort_type'] = 'daily'; - break; - case 'weekly': - $arrSort['n_sort_type'] = 'weekly'; - break; - case 'monthly': - $arrSort['n_sort_type'] = 'monthly'; - break; - case 'total': - $arrSort['n_sort_type'] = 'total'; - break; - } - } - - $strCacheKey = ''; - $intLifeTime = 0; - - # cache filter - if ($intCacheLifeTime > 0) { - $strCacheKey = sprintf( - 'NovelService:getRankList:%s:%s:%s:%s:%s', - $this->SiteContext->DomainModel->d_domain, - md5(serialize($arrFilter)), - md5(serialize($arrSort)), - $intCount, - $strDiffKey, - ); - - $intLifeTime = $intLifeTime; - } - - $arrNovel = $this->NovelModel->getRankNovelOnCache( - $strCacheKey, - $intCount, - $arrFilter['n_category_sex_zh'] ?? 0, - $arrSort['n_sort_type'] ?? 'daily', - $arrFilter['n_status'] ?? NULL, - $intLifeTime, - ); - - return $arrNovel; - } - - - /** - * 获取小说数据 - * - * @param array $arrParams - * @return array - */ - public function getNovelList(array $arrParams): array - { - $intCount = (int)$arrParams['count'] ?? 10; - $strNCategory = $arrParams['n_category'] ?? ''; - $strSortType = (string)$arrParams['sort_type'] ?? ''; - $strNStatus = (string) $arrParams['n_status'] ?? ''; - $strNSex = (string) $arrParams['n_sex'] ?? ''; - $strDiffKey = (string) $arrParams['diff_key'] ?? ''; - $intCacheLifeTime = (int)$arrParams['cache_life'] ?? 0; - - $arrFilter = []; - - # n_category filter - if (!empty($strNCategory)) { - $strNCategory = CategoryModel::getZhByPinYin($strNCategory); - if ($strNCategory) { - $arrFilter['n_category'] = $strNCategory; - } - } - - # n_status filter - if (!empty($strNStatus)) { - switch ($strNStatus) { - case 'lianzai': - $arrFilter['n_status'] = $this->arrStatus[$strNStatus]; - break; - case 'wanjie': - $arrFilter['n_status'] = $this->arrStatus[$strNStatus]; - break; - } - } - - # n_category_sex_zh filter - if (!empty($strNSex)) { - switch ($strNSex) { - case 'man': - $arrFilter['n_category_sex_zh'] = $this->arrSex[$strNSex]; - break; - case 'women': - $arrFilter['n_category_sex_zh'] = $this->arrSex[$strNSex]; - break; - } - } - - $arrSort = []; - - # sort filter - if (!empty($strSortType)) { - switch ($strSortType) { - case 'news': - $arrSort['created_at'] = -1; - break; - case 'tuijian': - $arrSort['n_level'] = -1; - break; - case 'update': - $arrSort['n_update_time'] = -1; - break; - } - } - - $strCacheKey = ''; - $intLifeTime = 0; - - # cache filter - if ($intCacheLifeTime > 0) { - $strCacheKey = sprintf( - 'NovelService:getNovelList:%s:%s:%s:%s:%s', - $this->SiteContext->DomainModel->d_domain, - md5(serialize($arrFilter)), - md5(serialize($arrSort)), - $intCount, - $strDiffKey, - ); - - $intLifeTime = $intLifeTime; - } - - $arrNovel = $this->NovelModel->findManyShuffledWithCache( - $arrFilter, - $intCount, - $arrSort, - $strCacheKey, - $intLifeTime, - ); - - return $arrNovel; - } - - - /** - * 获取小说分页数据 - * - * @param array $arrParams - * @return array - */ - public function getNovelPager(array $arrParams): array - { - $arrParams = [ - 'page' => max((int)($arrParams['page'] ?? 1), 1), - 'limit' => (int)($arrParams['limit'] ?? 10), - 'button_num' => (int)($arrParams['button_num'] ?? 0), - 'n_category' => (string)($arrParams['n_category'] ?? ''), - 'sort_type' => (string)($arrParams['sort_type'] ?? ''), - 'n_status' => (string)($arrParams['n_status'] ?? ''), - 'n_sex' => (string)($arrParams['n_sex'] ?? ''), - 'diff_key' => (string)($arrParams['diff_key'] ?? ''), - 'key' => (string)($arrParams['key'] ?? ''), - 'cache_life' => (int)($arrParams['cache_life'] ?? 0), - 'func' => (string)($arrParams['func']), - ]; - - $intPage = $arrParams['page']; - $intLimit = $arrParams['limit']; - $strNCategory = $arrParams['n_category']; - $strSortType = $arrParams['sort_type']; - $strNStatus = $arrParams['n_status']; - $strNSex = $arrParams['n_sex']; - $strDiffKey = $arrParams['diff_key']; - $strKey = $arrParams['key']; - $intCacheLifeTime = $arrParams['cache_life']; - $Func = $arrParams['func']; - - if ($intPage <= 0) { - $intPage = 1; - } - - $arrFilter = [ - '$and' => [], - ]; - - # n_category filter - if (!empty($strNCategory)) { - $strNCategory = CategoryModel::getZhByPinYin($strNCategory); - if ($strNCategory) { - $arrFilter['$and'][] = ['n_category' => $strNCategory]; - } else { - $arrParams['n_category'] = 'all'; - } - } - - # n_status filter - if (!empty($strNStatus)) { - switch ($strNStatus) { - case 'lianzai': - $arrFilter['$and'][] = ['n_status' => $this->arrStatus[$strNStatus]]; - break; - case 'wanjie': - $arrFilter['$and'][] = ['n_status' => $this->arrStatus[$strNStatus]]; - break; - default: - $arrParams['n_status'] = 'all'; - break; - } - } - - # n_category_sex_zh filter - if (!empty($strNSex)) { - switch ($strNSex) { - case 'man': - $arrFilter['$and'][] = ['n_category_sex_zh' => $this->arrSex[$strNSex]]; - break; - case 'women': - $arrFilter['$and'][] = ['n_category_sex_zh' => $this->arrSex[$strNSex]]; - break; - default: - $arrParams['n_sex'] = 'all'; - break; - } - } - - # key filter - if (!empty($strKey)) { - - $strKey = mb_substr($strKey, 0, 30); - $arrFilter['$and'][] = [ - '$or' => [ - ['n_name' => ['$regex' => $strKey, '$options' => 'i']], - ['n_author' => ['$regex' => $strKey, '$options' => 'i']], - ['n_category' => ['$regex' => $strKey, '$options' => 'i']], - ['n_description' => ['$regex' => $strKey, '$options' => 'i']], - ] - ]; - $arrParams['key'] = $strKey; - } - - $arrSort = []; - - # sort filter - if (!empty($strSortType)) { - switch ($strSortType) { - case 'news': - $arrSort['created_at'] = -1; - break; - case 'tuijian': - $arrSort['n_level'] = -1; - break; - case 'update': - $arrSort['n_update_time'] = -1; - break; - default: - $arrParams['sort_type'] = 'all'; - break; - } - } - - $strCacheKey = ''; - $intLifeTime = 0; - - # cache filter - if ($intCacheLifeTime > 0) { - $strCacheKey = sprintf( - 'NovelService:getNovelList:%s:%s:%s:%s:%s:%s', - $this->SiteContext->DomainModel->d_domain, - md5(serialize($arrFilter)), - md5(serialize($arrSort)), - $intPage, - $intLimit, - $strDiffKey, - ); - - $intLifeTime = $intLifeTime; - } - - if (empty($arrFilter['$and'])) { - $arrFilter = []; - } - - $arrNovel = $this->NovelModel->findPaginatedWithCache( - $arrFilter, - $intPage, - $intLimit, - $arrSort, - $strCacheKey, - $intLifeTime, - ); - - $arrPager = $arrNovel; - unset($arrPager['data']); - $arrPager['pager'] = call_user_func([$this, $Func], $arrParams, $arrSort, $arrNovel); - - $arrResult = [ - 'data' => $arrNovel['data'], - 'p_data' => $arrPager, - ]; - - return $arrResult; - } - - /** - * 搜索定制分页 - * - * @param array $arrFilter 查询条件字段 - * @param array $arrSort 查询排序字段 - * @param array $arrNovel 查询出来的数据 - * @return array - */ - public function generateSearchPager(array $arrParams, array $arrSort, array $arrNovel): array - { - $strKey = $arrParams['key']; - $intPage = $arrNovel['page']; - $intLimit = $arrNovel['limit']; - $intButtomNum = $arrParams['button_num']; - $strBaseUrl = app(NovelService::class)->getNovelSearchUrl($strKey, '{page}'); - $arrPaginator = CusteomPage02::generate($intPage, $arrNovel['total'], $intLimit, $strBaseUrl, $intButtomNum); - - return $arrPaginator; - } - - /** - * 书库/分类定制分页 - * - * @param array $arrFilter 查询条件字段 - * @param array $arrSort 查询排序字段 - * @param array $arrNovel 查询出来的数据 - * @return array - */ - public function generateCategoryPager(array $arrParams, array $arrSort, array $arrNovel): array - { - $strGender = $arrParams['n_sex']; - $strCategory = $arrParams['n_category']; - $strStatus = $arrParams['n_status']; - $strOrder = $arrParams['sort_type']; - $intPage = $arrNovel['page'] ?? 1; - $intLimit = $arrNovel['limit'] ?? 10; - $intTotal = $arrNovel['total'] ?? 0; - $intButtomNum = $arrParams['button_num']; - $strBaseUrl = app(NovelService::class)->getNovelCategoryUrl($strGender, $strCategory, $strStatus, $strOrder, '{page}'); - $arrPaginator = CusteomPage02::generate($intPage, $intTotal, $intLimit, $strBaseUrl, $intButtomNum); - - return $arrPaginator; - } - - - /** - * 根据NId获取小说详情 - * - * @param integer $intNId - * @return void - */ - public function getNovelByNId(int $intNId, int $intNForgeId = 0) - { - - // 小说详情 - $arrNovel = $this->NovelModel->getNovelByNId($intNId); - - if ($intNForgeId > 0) { - foreach ($arrNovel['n_forge_novel'] as $arrForgeNovel) { - if ($arrForgeNovel['n_forge_id'] == $intNForgeId) { - $arrNovel['n_name'] = $arrForgeNovel['n_forge_title']; - break; - } - } - } - - // 分类拼音 - $arrNovel['n_category_pinyin'] = CategoryModel::getPinYin($arrNovel['n_category']); - $arrNovel['n_category_sex_en'] = $arrNovel['n_category_sex_en'] ?? 'man'; - - // 最后章节 - $arrLatestChapter = $this->ChapterModel->getLatestChapterByNId($intNId); - - // 第一章 - $arrFirstChapter = $this->ChapterModel->getFirstChapterByNId($intNId, false); - $intFirstChapterSort = null; - if ($arrFirstChapter) { - $intFirstChapterSort = $arrFirstChapter['c_sort_num']; - } - - $strFocus = ''; - // 要点 - if ($arrLatestChapter) { - $strFocus = strip_tags($arrLatestChapter['c_content']); - $intCount = mb_strlen($strFocus); - if ($intCount > 300) { - $strFocus = mb_substr($strFocus, 0, 300); - } - } - - // 点击数 - $arrNovelClicks = $this->NovelClicksModel->getStats($intNId); - - // 推荐小说 - $arrRelateveNId = array_column($arrNovel['n_related_novel'], 'n_id'); - - $arrRelateveNovel = $this->NovelModel->findMany(['n_id' => [ - '$in' => $arrRelateveNId, - ]], 10); - - - // 更新值 - ConverterMovel::setVal([ - 'intPage' => 1, - 'strNovelName' => $arrNovel['n_name'], - 'strNovelAuthor' => $arrNovel['n_author'], - 'strNovelCategoryName' => $arrNovel['n_category'], - 'strNovelSex' => $arrNovel['n_category_sex_en'] == 'man' ? '男生' : '女生', - 'strNovelStatus' => $arrNovel['n_status'], - 'strNovelDescription' => $arrNovel['n_description'], - ]); - $arrNovel['intFirstChapterSort'] = $intFirstChapterSort; - $arrNovel['arrNovelClicks'] = $arrNovelClicks; - $arrNovel['arrRelateveNovel'] = $arrRelateveNovel; - $arrNovel['strFocus'] = $strFocus; - - return $arrNovel; - } - - - -} diff --git a/code/app/services/SiteContext.php b/code/app/services/SiteContext.php deleted file mode 100644 index 48bb7ab..0000000 --- a/code/app/services/SiteContext.php +++ /dev/null @@ -1,263 +0,0 @@ -Request = request(); - $this->NovelModel = NovelModel::getInstance(); - $this->ChapterModel = ChapterModel::getInstance(); - $this->NovelClicksModel = NovelClicksModel::getInstance(); - } - - /** - * GetViewConfig - * - * @return array - */ - public function getViewConfig(): array - { - $strDomain = $this->Request->rootDomain(); - - $this->DomainModel = DomainModel::getDomainOnCacheByDomain($strDomain); - - if (empty($this->DomainModel)) { - throw new HttpException(404, 'Site config not Found'); - } - - $this->TemplatesModel = TemplatesModel::getTemplateOnCacheByTId($this->DomainModel->t_id); - - if (empty($this->DomainModel)) { - throw new HttpException(500, 'Site template not Found'); - } - - $this->Request->DomainModel = $this->DomainModel; - - $this->Request->TemplatesModel = $this->TemplatesModel; - - return [ - 'type' => 'Think', - 'auto_rule' => 3, - 'view_dir_name' => 'view', - 'view_suffix' => 'html', - 'view_path' => root_path(ltrim($this->TemplatesModel->t_path, '/')), - ]; - } - - /** - * 初始化网站基本信息到全局替换类里 - * - * @return void - */ - public function initCfg() - { - // 全局使用的URL模板 - $strPcUrlTemp = $this->DomainModel->getFomartSubject('PC_URL_PATH', '', false); - $strNanUrlTemp = $this->DomainModel->getFomartSubject('NAN_SHENG_URL', '', false); - $strNvUrlTemp = $this->DomainModel->getFomartSubject('NV_SHENG_URL', '', false); - $strCategoryIndexUrlTemp = $this->DomainModel->getFomartSubject('CATEGORY_INDEX_URL', '', false); - $strRankUrlTemp = $this->DomainModel->getFomartSubject('RANK_INFO_URL', '', false); - $strSearchIndexUrlTemp = $this->DomainModel->getFomartSubject('SEARCH_INDEX_URL', '', false); - $strHistoryUrlTemp = $this->DomainModel->getFomartSubject('HISTORY_INFO_URL', '', false); - $strBookShelfUrlTemp = $this->DomainModel->getFomartSubject('SHUJIA_INFO_URL', '', false); - $strUserUrlTemp = $this->DomainModel->getFomartSubject('USER_INFO_URL', '', false); - - $strNanUrl = str_replace("/", "", $strNanUrlTemp); - $strNvUrl = str_replace("/", "", $strNvUrlTemp); - - View::assign("strPcPath", $strPcUrlTemp); - View::assign("strNanUrlTemp", $strNanUrlTemp); - View::assign("strNvUrlTemp", $strNvUrlTemp); - View::assign("strNanUrl", $strNanUrl); - View::assign("strNvUrl", $strNvUrl); - View::assign("strCategoryIndexUrlTemp", $strCategoryIndexUrlTemp); - View::assign("strRankUrlTemp", $strRankUrlTemp); - View::assign("strSearchIndexUrlTemp", $strSearchIndexUrlTemp); - View::assign("strHistoryUrlTemp", $strHistoryUrlTemp); - View::assign("strBookShelfUrlTemp", $strBookShelfUrlTemp); - View::assign("strUserUrlTemp", $strUserUrlTemp); - - View::assign('Request', $this->Request); - View::assign('DomainModel', $this->DomainModel); - View::assign('TemplatesModel', $this->TemplatesModel); - - ConverterMovel::setVal([ - 'strSiteName' => $this->DomainModel->d_name, - 'strSiteDomain' => $this->DomainModel->d_domain, - 'strSiteKeywords' => $this->DomainModel->d_keywords, - 'strSiteDescription' => $this->DomainModel->d_description, - - 'strIndexTitle' => $this->DomainModel->d_index_title, - 'strIndexKeywords' => $this->DomainModel->d_index_keywords, - 'strIndexDescription' => $this->DomainModel->d_index_description, - ]); - } - - - - /** - * 变量转换 - * - * @param string $strCode - * @return string - */ - public function converterTemplate(string $strCode): string - { - $strTitleTemplate = $this->DomainModel->getFomartSubject($strCode); - - return ConverterMovel::convert($strTitleTemplate); - } - - /** - * 获取干扰码 - * - * @param string $strPageCode - * @param string $strDiff - * @param integer $intNum - * @return array - */ - public function generateGrm(string $strPageCode, string $strDiff, int $intNum): array - { - $strDomain = $this->DomainModel->d_domain; - - return GanRaoMaModel::getGrmCode($strDomain, $strPageCode, $strDiff, $intNum); - } - - /** - * get home view - * - * @return string - */ - public function getHomeView(string $strPlatform): string - { - if ($strPlatform == 'h5') { - if ($this->DomainModel->info_id > 0) { - $strView = 'novel/getNovelInfo.html'; - } else { - $strView = 'index/index.html'; - } - } else { - if ($this->DomainModel->info_id > 0) { - $strView = 'pc/getNovelInfo.html'; - } else { - $strView = 'pc/index.html'; - } - } - - return $strView; - } - - /** - * 获取伪造小说列表 - * - * @param array $arrParams - * @return array - */ - public function getForgeList(array $arrParams): array - { - $intCount = (int)$arrParams['count'] ?? 10; - $strDiffKey = (string) $arrParams['diff_key'] ?? ''; - $intCacheLifeTime = (int)$arrParams['cache_life'] ?? 0; - - $arrFilter = [ - 'n_forge_novel' => [ - '$ne' => null, // 不为 null - '$ne' => '', // 不为空字符串 - '$ne' => [], // 不为空数组 - '$exists' => true // 确保字段存在 - ], - ]; - - $strCacheKey = ''; - $intLifeTime = 0; - - # cache filter - if ($intCacheLifeTime > 0) { - $strCacheKey = sprintf( - 'SiteContext:getForgeList:%s:%s:%s:%s', - $this->DomainModel->d_domain, - md5(serialize($arrFilter)), - $intCount, - $strDiffKey, - ); - - $intLifeTime = $intLifeTime; - } - - $arrAllNovel = $this->NovelModel->getRandNovelWithCache( - $arrFilter, - $intCount, - $strCacheKey, - $intLifeTime, - ); - - - $arrResult = []; - foreach ($arrAllNovel as $arrNovel) { - $arrResult[] = [ - 'n_id' => $arrNovel['n_id'], - 'n_name_pinyin' => $arrNovel['n_name_pinyin'], - 'n_forge_id' => $arrNovel['n_forge_novel'][0]->n_forge_id, - 'n_forge_title' => $arrNovel['n_forge_novel'][0]->n_forge_title, - ]; - } - - return $arrResult; - } -} diff --git a/code/app/task/crawler/youzhi/Scheduler.php b/code/app/task/crawler/youzhi/Scheduler.php deleted file mode 100644 index 05aa1cf..0000000 --- a/code/app/task/crawler/youzhi/Scheduler.php +++ /dev/null @@ -1,122 +0,0 @@ -QueueManage = new QueueManage(); - $this->init(); - } - - /** - * Undocumented function - * - * @return void - */ - public function init() - { - $this->intSlice = 8; - } - - /** - * get site - * - * @return Site - */ - public function getSite() - { - if ($this->Site == NULL) { - $this->Site = new Site; - } - return $this->Site; - } - - - /** - * create a site-wide craw task - * - * @return void - */ - public function crawlFull() - { - $intLimit = 10; - - $Site = $this->getSite(); - - $arrAllCategory = $Site->getCategory(); - - foreach ($arrAllCategory as $arrCategory) { - $intTotalPage = ceil($arrCategory['total'] / $intLimit); - for ($intStartPage = 1; $intStartPage <= $intTotalPage; $intStartPage++) { - $arrFilter = [ - [ - 'v_category_id' => $arrCategory['v_category_id'], - 'page' => $intStartPage, - ], - ]; - - $arrVideoPageList = $Site->getVideoPageList($arrFilter); - - foreach ($arrVideoPageList as $VideoPage) { - $arrAllVideoPager = $VideoPage->getVideoPager(); - - $arrVSourceId = []; - foreach ($arrAllVideoPager['list'] as $arrVideoPager) { - $arrVSourceId[] = ['v_source_id' => (int)$arrVideoPager['vod_id']]; - } - - $arrAllVideoInfoPage = $Site->getVideoInfoPageList($arrVSourceId); - foreach ($arrAllVideoInfoPage as $VideoInfoPage) { - $arrVideo = $VideoInfoPage->getVideo(); - print_r($arrVideo); - } - } - } - } - - - $arrCover = []; - - - if ($arrCover) { - // $Site->downRemoteImgToLocal($arrCover); - } - - return; - } -} diff --git a/code/app/task/crawler/youzhi/page/BasePage.php b/code/app/task/crawler/youzhi/page/BasePage.php deleted file mode 100644 index 67b5d48..0000000 --- a/code/app/task/crawler/youzhi/page/BasePage.php +++ /dev/null @@ -1,251 +0,0 @@ -setSite($Site); - - $this->strUri = $strUri; - } - - /** - * Undocumented function - * - * @return string - */ - public function getUri(): string - { - return $this->strUri; - } - - /** - * Undocumented function - * - * @param array $arrData - * @return void - */ - public function setData(array $arrData) - { - $this->arrData = $arrData; - } - - /** - * Undocumented function - * - * @return array - */ - public function getData(): array - { - return $this->arrData; - } - - /** - * Undocumented function - * - * @return QueueManage - */ - public function getQueueManage(): QueueManage - { - if ($this->QueueManage == NULL) { - $this->QueueManage = QueueManage::getInstance(); - } - - return $this->QueueManage; - } - - /** - * Undocumented function - * - * @return MongoBase - */ - public function getMongoBase(): MongoBase - { - if ($this->MongoBase == NULL) { - DDLManage::load('MongoBase'); - $this->MongoBase = MongoBase::getInstance(); - } - - return $this->MongoBase; - } - - public function getQueryList(): QueryList - { - if ($this->QueryList == NULL) { - $this->QueryList = QueryList::html($this->getContent()); - } - - return $this->QueryList; - } - - - /** - * Undocumented function - * - * @return string - */ - public function getContent(): string - { - if ($this->strContent == NULL) { - $this->Response = $this->getClient()->get($this->strUri); - $this->strContent = $this->Response->getBody()->getContents(); - } - - return $this->strContent; - } - - /** - * force set page content - * - * @param string $strContent - * @return void - */ - public function setContent($strContent) - { - $this->strContent = $strContent; - } - - - /** - * Undocumented function - * - * @return boolean - */ - public function isMobile($strMark = 'content="mobile"'): bool - { - if ($this->boolIsMobile === NULL) { - $this->boolIsMobile = is_numeric(strpos($this->getContent(), $strMark)); - } - return $this->boolIsMobile; - } - - - /** - * Undocumented function - * - * @return Client - */ - protected function getClient(): Client - { - if ($this->Client == NULL) { - $this->Client = $this->getSite()->getClient(); - } - return $this->Client; - } - - - /** - * Undocumented variable - * - * @var Site - */ - protected $Site; - - public function setSite(Site $Site) - { - $this->Site = $Site; - } - - public function getSite() - { - return $this->Site; - } -} diff --git a/code/app/task/crawler/youzhi/page/Site.php b/code/app/task/crawler/youzhi/page/Site.php deleted file mode 100644 index d66ee60..0000000 --- a/code/app/task/crawler/youzhi/page/Site.php +++ /dev/null @@ -1,369 +0,0 @@ -initClient(); - } - - /** - * Undocumented function - */ - public function initClient() - { - $arrConfig = [ - 'http_version' => '1.1', // 强制用 HTTP/1.1,已有,保持 - 'base_uri' => $this->strDomain, // 基础域名,已有,保持 - 'http_errors' => false, // 不抛 HTTP 错误,已有,保持 - 'timeout' => 60, // 从 160 秒改为 60 秒 - 'connect_timeout' => 10, // 从 30 秒改为 10 秒 - 'curl' => [ - CURLOPT_TCP_KEEPALIVE => 1, // 启用 TCP Keep-Alive,已有,保持 - CURLOPT_TCP_KEEPIDLE => 120, // Keep-Alive 空闲时间 - CURLOPT_TCP_KEEPINTVL => 60, // Keep-Alive 探测间隔 - // CURLOPT_SSL_VERIFYPEER => true, // 验证 SSL,已有,保持 - ], - 'headers' => [ - 'User-Agent' => 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36', - 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', - 'Referer' => $this->strDomain, - 'Connection' => 'keep-alive', - 'sec-ch-ua' => '"Not/A)Brand";v="8", "Chromium";v="130", "Google Chrome";v="130"', - 'sec-ch-ua-mobile' => '?1', - 'sec-ch-ua-platform' => '"Android"', - 'sec-fetch-dest' => 'document', - 'sec-fetch-mode' => 'navigate', - 'sec-fetch-site' => 'same-origin', - 'sec-fetch-user' => '?1', - 'upgrade-insecure-requests' => '1', - ], - 'pool_size' => 20, - 'verify' => false, - ]; - - $arrProxy = config('proxy'); - - - if ($this->boolProxy && $arrProxy['proxy_status']) { - - $strCode = $arrProxy['proxy_code']; - $strProxyHost = $arrProxy['proxy_host']; - $strKey = $arrProxy['proxy_key']; - $strSecret = $arrProxy['proxy_secret']; - - - switch ($strCode) { - case 'XIONGMAO': - $intTime = time(); - $strTxt = "orderno=" . $strKey . ",secret=" . $strSecret . ",timestamp=" . $intTime; - $strSign = strtoupper(md5($strTxt)); - $strAuth = 'sign=' . $strSign . '&orderno=' . $strKey . '×tamp=' . $intTime; - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['headers']['Proxy-Authorization'] = $strAuth; - break; - case 'KUAI': - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['curl'][CURLOPT_PROXYAUTH] = CURLAUTH_BASIC; - $arrConfig['curl'][CURLOPT_PROXYUSERPWD] = "$strKey:$strSecret"; - break; - } - } - - - $this->Client = new Client($arrConfig); - } - - /** - * Undocumented function - * - * @return string - */ - public function getSiteCode(): string - { - return $this->strSiteCode; - } - - /** - * Undocumented function - * - * @param integer|string $strSign - * @return string - */ - public function getSiteUUId(int|string $strSign): string - { - return $this->getSiteCode() . '-' . $strSign; - } - - /** - * Undocumented function - * - * @return Client - */ - public function getClient(): Client - { - return $this->Client; - } - - /** - * retrieve multiple novel page model - * - * @param string $strUri - * @return VideoPage[] - */ - public function getCategory(): array - { - $strUri = '/inc/api_mac10.php?ac=list&t=1&page=1'; - - $Response = $this->getClient()->get($strUri); - $strContent = $Response->getBody()->getContents(); - - $arrContent = json_decode($strContent, true); - $arrFilter = $arrContent['class']; - - $arrCategory = []; - - foreach ($arrFilter as $intKey => $arrItem) { - - $arrFilter[$intKey]['uri'] = $this->getVideoPageUri((int)$arrItem['type_id'], 1); - - $arrPromises[$intKey] = $this->getClient()->getAsync($arrFilter[$intKey]['uri']); - } - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - $strContent = $Response->getBody()->getContents(); - - $arrTemp = json_decode($strContent, true); - - $arrCategory[] = [ - 'v_category_id' => (int)$arrFilter[$intKey]['type_id'], - 'v_category_name' => $arrFilter[$intKey]['type_name'], - 'v_category_name_en' => zhToPinYin($arrFilter[$intKey]['type_name']), - 'total' => $arrTemp['total'], - ]; - } - - return $arrCategory; - } - - /** - * generate video list uri - * - * @param integer $intVCategoryId - * @param integer $intPage - * @return string - */ - public function getVideoPageUri(int $intVCategoryId, int $intPage): string - { - return sprintf('/inc/api_mac10.php?ac=list&t=%s&page=%s', $intVCategoryId, $intPage); - } - - /** - * retrieve multiple novel page model - * - * @param string $strUri - * @return VideoPage[] - */ - public function getVideoPageList(array $arrFilter): array - { - - /** @var VideoPage[] */ - $arrVideoPage = []; - - foreach ($arrFilter as $intKey => $arrItem) { - - $arrFilter[$intKey]['uri'] = $this->getVideoPageUri($arrItem['v_category_id'], $arrItem['page']); - - $arrPromises[$intKey] = $this->getClient()->getAsync($arrFilter[$intKey]['uri']); - } - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - $strContent = $Response->getBody()->getContents(); - - - $VideoPage = $this->getVideoPage($this, $arrFilter[$intKey]['uri']); - - $VideoPage->setContent($strContent); - $VideoPage->setData($arrFilter[$intKey]); - - $arrVideoPage[] = $VideoPage; - } - - return $arrVideoPage; - } - - /** - * generate video list uri - * - * @param integer $intVCategoryId - * @param integer $intPage - * @return string - */ - public function getVideoUri(int $intVSourceId): string - { - return sprintf('/inc/api_mac10.php?ac=detail&tds=%s', $intVSourceId); - } - - /** - * retrieve multiple chapter page model - * - * @param string $strUri - * @return VideoInfoPage[] - */ - public function getVideoInfoPageList(array $arrFilter): array - { - - /** @var VideoInfoPage[] */ - $arrVideoInfoPage = []; - - $arrPromises = []; - foreach ($arrFilter as $intKey => $arrItem) { - $arrFilter[$intKey]['uri'] = $this->getVideoUri($arrItem['v_source_id']); - $arrPromises[$intKey] = $arrFilter[$intKey]['uri']; - } - - print_r($arrFilter); - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - - var_dump($arrResults); - return []; - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - var_dump($arrResult); - - $strContent = $Response->getBody()->getContents();; - - $VideoInfoPage = $this->getVideoInfoPage($this, $arrFilter[$intKey]['uri']); - - $VideoInfoPage->setContent($strContent); - $VideoInfoPage->setData($arrFilter[$intKey]); - - $arrVideoInfoPage[] = $VideoInfoPage; - } - - return $arrVideoInfoPage; - } - - /** - * download the image to the local system - * - * @param array $arrFilter - * @return void - */ - public function downRemoteImgToLocal(array $arrFilter) - { - $StorageCore = StorageCore::getInstance(); - - $arrPromises = []; - - foreach ($arrFilter as $intKey => $arrItem) { - if (!$StorageCore->has($arrItem['local_path'])) { - $arrPromises[$intKey] = $this->getClient()->getAsync($arrItem['uri']); - } - } - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - $StorageCore->writeStream($arrFilter[$intKey]['local_path'], $Response->getBody()->detach());; - } - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return VideoPage - */ - public function getVideoPage($Site, $strUri) - { - return new VideoPage($Site, $strUri); - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return VideoInfoPage - */ - public function getVideoInfoPage($Site, $strUri) - { - return new VideoInfoPage($Site, $strUri); - } -} diff --git a/code/app/task/crawler/youzhi/page/VideoInfoPage.php b/code/app/task/crawler/youzhi/page/VideoInfoPage.php deleted file mode 100644 index 4a63308..0000000 --- a/code/app/task/crawler/youzhi/page/VideoInfoPage.php +++ /dev/null @@ -1,194 +0,0 @@ -VideoModel == NULL) { - $this->VideoModel = VideoModel::getInstance(); - } - return $this->VideoModel; - } - - public $arrOptions = [ - 'typeMap' => [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - ]; - - /** - * Undocumented function - * - * @return array - */ - public function getVideo(): array - { - if (empty($this->arrVideo)) { - - $this->arrVideo = json_decode($this->getContent(), true); - } - - return $this->arrVideo; - } - - /** - * Undocumented variable - * - * @var array - */ - protected $arrVideo; - - - /** - * Undocumented function - * - * @param integer $intNId - * @return boolean - */ - public function saveChapter(int $intNId): bool - { - $arrPageChapter = $this->getVideo(); - - if ( - empty($arrPageChapter) || - empty($arrPageChapter['c_page_title']) || - empty($arrPageChapter['c_page_data']) || - count($arrPageChapter['c_page_data']) < 5 - ) { - return false; - } - - $strUUId = $this->getSite()->getSiteUUId('chapter-' . $this->arrData['c_source_id'] . '-' . $this->arrData['c_page']); - - $arrChapter = [ - 'n_id' => $intNId, - 'c_name' => $arrPageChapter['c_page_data'][3], - 'c_sort_num' => $this->arrData['c_sort_num'], - 'c_page' => $this->arrData['c_page'], - 'c_source_id' => $this->arrData['c_source_id'], - 'c_site_code' => $this->getSite()->getSiteCode(), - 'c_source_uuid' => $strUUId, - ]; - - $arrExistsChapter = $this->getVideoModel()->findOne(['c_source_uuid' => $strUUId], $this->arrOptions); - - if ($arrExistsChapter) { - - $arrExistsChapter = (array) $arrExistsChapter; - - $arrUpdate = [ - 'updated_at' => new \MongoDB\BSON\UTCDateTime(), - ]; - - $this->getVideoModel()->updateOne( - ['c_source_uuid' => $strUUId], - ['$set' => $arrUpdate], - ); - $this->strCContentPath = $arrExistsChapter['c_content_path']; - } else { - - $arrInsertNovel = $arrChapter; - - $arrInsertNovel['c_content_path'] = '/novel/' . ($intNId % 100) . '/' . $intNId . '/' . $arrChapter['c_sort_num'] . '_' . $arrChapter['c_page'] . '.txt'; - $arrInsertNovel['created_at'] = new \MongoDB\BSON\UTCDateTime(); - - try { - $this->getVideoModel()->insert($arrInsertNovel); - $this->updateNovelHaveChapter($intNId); - $this->strCContentPath = $arrInsertNovel['c_content_path']; - } catch (\Exception $e) { - if ($e->getCode() === 11000) { - return $this->saveChapter($intNId); - } else { - throw $e; - } - } - } - - StorageCore::getInstance()->put($this->strCContentPath, $this->strChapterContent); - - return true; - } - - public $strCContentPath; - /** - * Undocumented function - * - * @param integer $intNId - * @return void - */ - protected function updateNovelHaveChapter(int $intNId) - { - $arrFilter = [ - 'n_id' => $intNId, - ]; - - $VideoModel = VideoModel::getInstance(); - $arrLasteChapter = $VideoModel->getLatestChapterByNId($intNId, false); - - if (!empty($arrLasteChapter)) { - $arrUpdate['$set']['n_have_chapter'] = 1; - $arrUpdate['$set']['n_latest_chapter_name'] = $arrLasteChapter['c_name']; - $this->getMongoBase()->updateOne('novel', $arrFilter, $arrUpdate); - } - } - - protected $arrNextPage; - - /** - * Undocumented function - * - * @return array - */ - public function getNextPage(): array - { - if ($this->arrNextPage === NULL) { - $this->arrNextPage = []; - - if ($this->isMobile()) { - $strPattern = "/var\s+hhekgsv\s*=\s*['\"](.*?)['\"]/"; - preg_match_all($strPattern, $this->getContent(), $arrMatches); - $strNextPageUri = end($arrMatches[1]) ?: ''; - } else { - $strHref = $this->getQueryList()->find('.read_btn a:contains("下一章")')->attr('href'); - $strNextPageUri = $strHref ?: ''; - } - - if (is_numeric(strpos($strNextPageUri, '_'))) { - $this->arrNextPage = $this->arrData; - $this->arrNextPage['c_page'] += 1; - $this->arrNextPage['uri'] = $strNextPageUri; - } - } - - return $this->arrNextPage; - } -} diff --git a/code/app/task/crawler/youzhi/page/VideoPage.php b/code/app/task/crawler/youzhi/page/VideoPage.php deleted file mode 100644 index 2cb1c83..0000000 --- a/code/app/task/crawler/youzhi/page/VideoPage.php +++ /dev/null @@ -1,417 +0,0 @@ -NovelModel == NULL) { - $this->NovelModel = NovelModel::getInstance(); - } - return $this->NovelModel; - } - - public $arrOptions = [ - 'typeMap' => [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - ]; - - /** - * 查询看的小说 - * - * @param integer $intNSourceId - * @param string $strName - * @return array - */ - protected function findOrCreateNovel(int $intNSourceId, string $strName): array - { - $strUUId = $this->getSite()->getSiteUUId($intNSourceId); - - $arrExistsNovel = $this->getNovelModel()->findOne(['n_source_uuid' => $strUUId], $this->arrOptions); - - if ($arrExistsNovel) { - $arrVideo = (array) $arrExistsNovel; - } else { - $arrVideo = [ - 'n_id' => CountersModel::getInstance()->getNextSequence('novel'), - 'n_name' => $strName, - 'n_name_pinyin' => zhToPinYin($strName), - 'n_site_code' => $this->getSite()->getSiteCode(), - 'n_source_uuid' => $strUUId, - 'n_source_id' => $intNSourceId, - 'n_level' => 1, - 'n_have_chapter' => 0, - 'created_at' => new \MongoDB\BSON\UTCDateTime(), - ]; - try { - $this->getNovelModel()->insert($arrVideo); - } catch (\Exception $e) { - if ($e->getCode() === 11000) { - return $this->findOrCreateNovel($intNSourceId, $strName); - } else { - throw $e; - } - } - } - return $arrVideo; - } - - - /** - * 分析关联数据 - * - * @return void - */ - public function getReletedNovel() {} - - - /** - * Undocumented function - * - * @return array - */ - public function getVideoPager(): array - { - if (empty($this->arrVideo)) { - - $this->arrVideo = json_decode($this->getContent(), true); - - $this->getReletedNovel(); - } - - return $this->arrVideo; - } - - /** - * Undocumented function - * - * @param string $strName - * @return string - */ - public function generateCoverPath($strName): string - { - $intTime = time() - mt_rand(1, 2 * 24 * 3600 * 360); - - return sprintf('/img/%s/%s.jpg', date('Y/m/d/H', $intTime), $strName); - } - - public function filterOtherFields(&$arrNovel) - { - $arrFields = [ - 'n_id', - 'n_name', - 'n_name_pinyin', - 'n_status', - 'n_author', - 'n_description', - 'n_category', - 'n_category_pinyin', - 'n_category_sex_en', - 'n_category_sex_zh', - 'n_cover_path', - 'n_latest_chapter_name', - 'n_update_time', - 'n_forge_novel', - 'n_related_novel', - 'n_site_code', - 'n_source_uuid', - 'n_source_id', - 'n_have_chapter', - 'created_at', - 'updated_at', - ]; - - foreach ($arrNovel as $strKey => $strVal) { - if (!in_array($strKey, $arrFields)) { - unset($arrNovel[$strKey]); - } - } - } - - /** - * Undocumented function - * - * @return bool - */ - public function saveVideo(): bool - { - $arrPageInfo = $this->getVideo(); - - print_r($arrPageInfo); - return false; - if ( - empty($arrPageInfo) || - empty($arrPageInfo['og_title']) || - empty($arrPageInfo['og_image']) || - empty($arrPageInfo['og_novel_category']) - ) { - return false; - } - - $arrVideo = [ - // 'n_id'=> $arrPageInfo['xxxxx'], - 'n_name' => $arrPageInfo['og_title'], - 'n_name_pinyin' => zhToPinYin($arrPageInfo['og_title']), - 'n_status' => $arrPageInfo['og_novel_status'], - 'n_author' => $arrPageInfo['og_novel_author'], - 'n_description' => $arrPageInfo['og_description'], - 'n_category' => $arrPageInfo['og_novel_category'], - // 'n_category_pinyin' => $arrPageInfo['xxxxx'], - // 'n_category_sex_en' => $arrPageInfo['xxxxx'], - // 'n_category_sex_zh' => $arrPageInfo['xxxxx'], - // 'n_cover_path' => $arrPageInfo['xxxxx'], - 'n_latest_chapter_name' => $arrPageInfo['og_novel_latest_chapter_name'], - 'n_update_time' => $arrPageInfo['og_novel_update_time'], - 'n_forge_novel' => $this->arrForgeNovel, - 'n_related_novel' => $this->arrRelatedNovel, - - 'n_site_code' => $this->getSite()->getSiteCode(), - 'n_source_id' => $this->arrData['n_source_id'], - 'n_source_uuid' => $this->getSite()->getSiteUUId($this->arrData['n_source_id']), - - // 'n_have_chapter' => $arrPageInfo['xxxxx'], - // 'created_at' => $arrPageInfo['xxxxx'], - // 'updated_at' => $arrPageInfo['xxxxx'], - - ]; - - $arrExistsNovel = $this->getNovelModel()->findOne(['n_source_uuid' => $arrVideo['n_source_uuid']], $this->arrOptions); - - if ($arrExistsNovel) { - - $arrExistsNovel = (array) $arrExistsNovel; - - $arrUpdate = [ - 'n_latest_chapter_name' => $arrVideo['n_latest_chapter_name'], - 'n_update_time' => $arrVideo['n_update_time'], - 'updated_at' => new \MongoDB\BSON\UTCDateTime(), - ]; - - # 如果没有分类,说明这条数据是最初从关联shu那里采集的,需要补全全部信息 - if (empty($arrExistsNovel['n_category'])) { - $arrUpdate = array_merge($arrUpdate, $arrVideo); - $arrUpdate['n_related_novel'] = $this->arrRelatedNovel; - $arrUpdate['n_forge_novel'] = $this->arrForgeNovel; - $arrUpdate['n_category_pinyin'] = CategoryModel::getPinYin($this->arrVideo['og_novel_category']); - $arrUpdate['n_category_sex_en'] = CategoryModel::getSexEn($this->arrVideo['og_novel_category']); - $arrUpdate['n_category_sex_zh'] = CategoryModel::getSexZh($this->arrVideo['og_novel_category']); - $arrUpdate['n_related_novel'] = $this->arrRelatedNovel; - $arrUpdate['n_forge_novel'] = $this->arrForgeNovel; - } - - # 图片不存在的时候,需要重新生成 - if ( - !isset($arrExistsNovel['n_cover_path']) || - empty($arrExistsNovel['n_cover_path']) || - !StorageCore::getInstance()->has($arrExistsNovel['n_cover_path']) || - (basename($arrExistsNovel['n_cover_path']) == '.jpg') - ) { - $arrUpdate['n_cover_path'] = $this->generateCoverPath($arrVideo['n_name_pinyin']); - $this->strCoverLocalPath = $arrUpdate['n_cover_path']; - } else { - $this->strCoverLocalPath = $arrExistsNovel['n_cover_path']; - } - - $this->getNovelModel()->updateOne( - ['n_source_uuid' => $arrVideo['n_source_uuid']], - ['$set' => $arrUpdate], - ); - $this->intNId = $arrExistsNovel['n_id']; - } else { - - $arrVideo['n_category_pinyin'] = CategoryModel::getPinYin($this->arrVideo['og_novel_category']); - $arrVideo['n_category_sex_en'] = CategoryModel::getSexEn($this->arrVideo['og_novel_category']); - $arrVideo['n_category_sex_zh'] = CategoryModel::getSexZh($this->arrVideo['og_novel_category']); - $arrVideo['n_id'] = CountersModel::getInstance()->getNextSequence('novel'); - $arrVideo['n_level'] = 1; - $arrVideo['n_have_chapter'] = 0; - $arrVideo['n_cover_path'] = $this->generateCoverPath($arrVideo['n_name_pinyin']); - $arrVideo['n_related_novel'] = $this->arrRelatedNovel; - $arrVideo['n_forge_novel'] = $this->arrForgeNovel; - $arrVideo['created_at'] = new \MongoDB\BSON\UTCDateTime(); - - try { - $this->getNovelModel()->insert($arrVideo); - $this->intNId = $arrVideo['n_id']; - $this->strCoverLocalPath = $arrVideo['n_cover_path']; - } catch (\Exception $e) { - if ($e->getCode() === 11000) { - return $this->saveVideo(); - } else { - throw $e; - } - } - } - - return true; - } - - - public $strCoverLocalPath = ''; - - public $intNId; - - /** - * Undocumented function - * - * @return array - */ - public function getDownCoverInfo(): array - { - return [ - 'uri' => $this->arrVideo['og_image'], - 'local_path' => $this->strCoverLocalPath, - ]; - } - - /** - * Undocumented variable - * - * @var array - */ - protected $arrLatestChapters = NULL; - - /** - * Undocumented variable - * - * @var array - */ - protected $arrChapters = NULL; - - public function getLatestChapterByNIdsList(): array - { - if ($this->arrLatestChapters === NULL) { - $this->arrLatestChapters = []; - - if ($this->isMobile()) { - $strClass = '.chapter-list'; - } else { - $strClass = '.section-list'; - } - - if ($this->arrData['page'] == 0) { - $this->getQueryList()->find($strClass)->eq(0)->find("a")->map(function ($A) { - $this->arrLatestChapters[] = [ - 'name' => $A->text(), - 'uri' => $A->attr('href'), - ]; - }); - } - } - return $this->arrLatestChapters; - } - - /** - * Undocumented function - * - * @return array - */ - public function getChapters(): array - { - if ($this->arrChapters === NULL) { - $this->arrChapters = []; - if ($this->isMobile()) { - $strClass = '.chapter-list'; - } else { - $strClass = '.section-list'; - } - - $intDivIndex = 0; - if ($this->arrData['page'] == 0) { - $intDivIndex = 1; - } - - $this->getQueryList()->find($strClass)->eq($intDivIndex)->find("a")->map(function ($A) { - $this->arrChapters[] = [ - 'name' => $A->text(), - 'uri' => $A->attr('href'), - ]; - }); - } - return $this->arrChapters; - } - - - protected $arrNextPageArgs = NULL; - - /** - * Undocumented function - * - * @return array - */ - public function getNextPageArgs(): array - { - $this->arrNextPageArgs = []; - if ($this->arrData['page'] == 0) { - $this->getLatestChapterByNIdsList(); - $this->getChapters(); - - $arrLatestChapterFirstBlock = count($this->arrLatestChapters) > 0 ? $this->arrLatestChapters[0] : null; - $arrLatestChapterSecondBlock = count($this->arrChapters) > 0 ? $this->arrChapters[count($this->arrChapters) - 1] : null; - - if ( - !empty($arrLatestChapterFirstBlock) && !empty($arrLatestChapterSecondBlock) - && ($arrLatestChapterFirstBlock['uri'] != $arrLatestChapterSecondBlock['uri']) - - ) { - $this->arrNextPageArgs = [ - 'n_source_id' => $this->arrData['n_source_id'], - 'page' => $this->arrData['page'] + 1, - ]; - } - } else { - $strLastUri = $this->getQueryList()->find('select:first option:last')->attr('value'); - if ($strLastUri != '' && $strLastUri != $this->strUri) { - $this->arrNextPageArgs = [ - 'n_source_id' => $this->arrData['n_source_id'], - 'page' => $this->arrData['page'] + 1, - ]; - } - } - return $this->arrNextPageArgs; - } -} diff --git a/code/app/task/crawler/zw/Scheduler.php b/code/app/task/crawler/zw/Scheduler.php deleted file mode 100644 index 27395b7..0000000 --- a/code/app/task/crawler/zw/Scheduler.php +++ /dev/null @@ -1,319 +0,0 @@ -QueueManage = new QueueManage(); - $this->init(); - } - - /** - * Undocumented function - * - * @return void - */ - public function init() - { - $this->intSlice = 8; - } - - /** - * create a site-wide craw task - * - * @return void - */ - public function crawlFull() - { - $intSliceSize = $this->intSlice; - - $arrFilter = []; - for ($intNId = $this->intStartNSourceId; $intNId <= $this->intEndNSourceId; $intNId++) { - $arrFilter[] = [ - 'n_source_id' => $intNId, - 'page' => 0, - ]; - - if ($intNId % $intSliceSize == 0) { - $this->fetchNovel($arrFilter); - $arrFilter = []; - } - } - if (!empty($arrFilter)) { - $this->fetchNovel($arrFilter); - } - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @return void - */ - public function fetchNovel(array $arrFilter) - { - $arrTask = [ - 'callback' => [static::class, 'getNovelInfo'], - 'data' => $arrFilter, - ]; - - $this->QueueManage->set($arrTask); - } - - /** - * Undocumented function - * - * @param array $arrFilter - * @return void - */ - public function getNovelInfo(array $arrFilter) - { - $Site = $this->getSite(); - - $arrNovelPageList = $Site->getNovelPageList($arrFilter); - - $arrCover = []; - foreach ($arrNovelPageList as $NovelPage) { - // $arrNovel = $NovelPage->getNovelInfo(); - $boolResult = $NovelPage->saveNovelInfo(); - // return; - - if ($boolResult == false) { - continue; - } - - $arrNextPageData = $NovelPage->getNextPageArgs(); - if (!empty($arrNextPageData)) { - $this->fetchNovel([ - [ - 'n_source_id' => $arrNextPageData['n_source_id'], - 'page' => $arrNextPageData['page'], - ] - ]); - } - - $arrCoverItem = $NovelPage->getDownCoverInfo(); - - if (!StorageCore::getInstance()->has($arrCoverItem['local_path'])) { - $arrCover[] = $arrCoverItem; - } - - $arrChapterList = $NovelPage->getChapters(); - $this->fetchChapter($NovelPage->intNId, $NovelPage->getData()['page'], $arrChapterList); - } - - if ($arrCover) { - $Site->downRemoteImgToLocal($arrCover); - } - } - - /** - * create a task to craw the latest chapter - * - * @return void - */ - public function crawLatest() - { - $intSliceSize = $this->intSlice; - $arrUri = []; - $strUri = '/list/lastupdate_%s_0_0_%s.html'; - - $intEndCategory = $intEndPage = 10; - - for ($intCategoryKey = 0; $intCategoryKey < $intEndCategory; $intCategoryKey++) { - for ($intPage = 1; $intPage <= $intEndPage; $intPage++) { - $arrUri[] = sprintf($strUri, $intCategoryKey, $intPage); - } - } - - $arrUri = array_chunk($arrUri, $intSliceSize); - - $arrTask = [ - 'callback' => [static::class, 'getLatestChapter'], - 'data' => [], - ]; - - foreach ($arrUri as $arrUriSlice) { - $arrTask['data'] = $arrUriSlice; - $this->QueueManage->set($arrTask); - } - } - - /** - * Undocumented function - * - * @param array $arrData - * @return void - */ - public function getLatestChapter(array $arrFilter) - { - $Site = $this->getSite(); - - $arrLatestListPageList = $Site->getLatestListPageList($arrFilter); - - $arrNSourceId = []; - - foreach ($arrLatestListPageList as $LatestListPage) { - $arrResult = $LatestListPage->getNovelFilter(); - $arrNSourceId = array_merge($arrNSourceId, $arrResult); - } - - $arrNSourceId = array_unique($arrNSourceId); - $arrNSourceId = array_values($arrNSourceId); - - $intSliceSize = $this->intSlice; - $arrFilter = []; - - foreach ($arrNSourceId as $intKey => $intNSourceId) { - $arrFilter[] = [ - 'n_source_id' => $intNSourceId, - 'page' => 0, - ]; - - if ($intKey % $intSliceSize == 0) { - $this->fetchNovel($arrFilter); - $arrFilter = []; - } - } - - if (!empty($arrFilter)) { - $this->fetchNovel($arrFilter); - } - } - - /** - * Undocumented function - * - * @param integer $intNId - * @param integer $intPage - * @param array $arrChapterList - * @return void - */ - public function fetchChapter(int $intNId, int $intPage, array $arrChapterList = []) - { - $intSliceSize = $this->intSlice; - $intPageSize = 100; - - $arrTask = [ - 'callback' => [static::class, 'getChapterInfo'], - 'data' => [ - 'n_id' => $intNId, - ] - ]; - $arrFilter = []; - foreach ($arrChapterList as $intKey => $arrChapter) { - $arrChapter['c_sort_num'] = $intPage * $intPageSize + $intKey + 1; - $arrChapter['c_source_id'] = supperExtractFilename($arrChapter['uri']); - $arrChapter['c_page'] = 0; - - $arrFilter[] = $arrChapter; - if ($intKey % $intSliceSize == 0) { - $arrTask['data']['filter'] = $arrFilter; - $this->QueueManage->set($arrTask); - $arrFilter = []; - } - } - - if (!empty($arrFilter)) { - $arrTask['data']['filter'] = $arrFilter; - $this->QueueManage->set($arrTask); - } - } - - /** - * Undocumented variable - * - * @var Site - */ - public $Site; - - /** - * Undocumented function - * - * @return Site - */ - public function getSite() - { - if ($this->Site == NULL) { - $this->Site = new Site; - } - return $this->Site; - } - - /** - * Undocumented function - * - * @param array $arrData - * @return void - */ - public function getChapterInfo(array $arrData) - { - $Site = $this->getSite(); - - $ChapterModel = ChapterModel::getInstance(); - - foreach ($arrData['filter'] as $intKey => $arrChapterFilter) { - $strUUId = sprintf('%s-chapter-%s-%s', $Site->getSiteCode(), $arrChapterFilter['c_source_id'], $arrChapterFilter['c_page']); - $arrChapter = $ChapterModel->findOne(['c_source_uuid' => $strUUId]); - - if (!empty($arrChapter) && !empty($arrChapter['content'])) { - unset($arrData['filter'][$intKey]); - } - } - - $arrData['filter'] = array_values($arrData['filter']); - - $arrChapterPageList = $Site->getChapterPageList($arrData['filter']); - - $arrNextPageFilterList = []; - foreach ($arrChapterPageList as $ChapterPage) { - - $ChapterPage->saveChapter($arrData['n_id']); - - $arrNextPageFilter = $ChapterPage->getNextPage(); - - if (!empty($arrNextPageFilter)) { - $arrNextPageFilterList[] = $arrNextPageFilter; - } - } - - if (!empty($arrNextPageFilterList)) { - - $arrTask = $arrData; - $arrTask['filter'] = $arrNextPageFilterList; - $arrTask = [ - 'callback' => [static::class, 'getChapterInfo'], - 'data' => $arrTask - ]; - $this->QueueManage->set($arrTask); - } - } -} diff --git a/code/app/task/crawler/zw/page/BasePage.php b/code/app/task/crawler/zw/page/BasePage.php deleted file mode 100644 index e0c8c99..0000000 --- a/code/app/task/crawler/zw/page/BasePage.php +++ /dev/null @@ -1,251 +0,0 @@ -setSite($Site); - - $this->strUri = $strUri; - } - - /** - * Undocumented function - * - * @return string - */ - public function getUri(): string - { - return $this->strUri; - } - - /** - * Undocumented function - * - * @param array $arrData - * @return void - */ - public function setData(array $arrData) - { - $this->arrData = $arrData; - } - - /** - * Undocumented function - * - * @return array - */ - public function getData(): array - { - return $this->arrData; - } - - /** - * Undocumented function - * - * @return QueueManage - */ - public function getQueueManage(): QueueManage - { - if ($this->QueueManage == NULL) { - $this->QueueManage = QueueManage::getInstance(); - } - - return $this->QueueManage; - } - - /** - * Undocumented function - * - * @return MongoBase - */ - public function getMongoBase(): MongoBase - { - if ($this->MongoBase == NULL) { - DDLManage::load('MongoBase'); - $this->MongoBase = MongoBase::getInstance(); - } - - return $this->MongoBase; - } - - public function getQueryList(): QueryList - { - if ($this->QueryList == NULL) { - $this->QueryList = QueryList::html($this->getContent()); - } - - return $this->QueryList; - } - - - /** - * Undocumented function - * - * @return string - */ - public function getContent(): string - { - if ($this->strContent == NULL) { - $this->Response = $this->getClient()->get($this->strUri); - $this->strContent = $this->Response->getBody()->getContents(); - } - - return $this->strContent; - } - - /** - * force set page content - * - * @param string $strContent - * @return void - */ - public function setContent($strContent) - { - $this->strContent = $strContent; - } - - - /** - * Undocumented function - * - * @return boolean - */ - public function isMobile($strMark = 'content="mobile"'): bool - { - if ($this->boolIsMobile === NULL) { - $this->boolIsMobile = is_numeric(strpos($this->getContent(), $strMark)); - } - return $this->boolIsMobile; - } - - - /** - * Undocumented function - * - * @return Client - */ - protected function getClient(): Client - { - if ($this->Client == NULL) { - $this->Client = $this->getSite()->getClient(); - } - return $this->Client; - } - - - /** - * Undocumented variable - * - * @var Site - */ - protected $Site; - - public function setSite(Site $Site) - { - $this->Site = $Site; - } - - public function getSite() - { - return $this->Site; - } -} diff --git a/code/app/task/crawler/zw/page/ChapterPage.php b/code/app/task/crawler/zw/page/ChapterPage.php deleted file mode 100644 index fd8b799..0000000 --- a/code/app/task/crawler/zw/page/ChapterPage.php +++ /dev/null @@ -1,226 +0,0 @@ -ChapterModel == NULL) { - $this->ChapterModel = ChapterModel::getInstance(); - } - return $this->ChapterModel; - } - - public $arrOptions = [ - 'typeMap' => [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - ]; - - /** - * Undocumented function - * - * @return array - */ - public function getChapterInfo(): array - { - if ($this->arrChapterInfo === NULL) { - - $this->arrChapterInfo = []; - - $strPattern = "/qsbs\.bb\('([^']*)'\)/"; - - preg_match_all($strPattern, $this->getContent(), $arrMatches); - - $strContent = ''; - - foreach ($arrMatches[1] as $str) { - $strContent .= base64_decode($str); - } - - $this->strChapterContent = $strContent; - - $this->arrChapterInfo['c_page_title'] = $this->getQueryList()->find('title')->text(); - $this->arrChapterInfo['c_page_keywords'] = $this->getQueryList()->find('meta[name="keywords"]')->attr('content'); - $this->arrChapterInfo['c_page_description'] = $this->getQueryList()->find('meta[name="description"]')->attr('content'); - - $strPattern = "/lastread\.set\((.*?)\);/"; - - if (preg_match($strPattern, $this->getContent(), $arrMatches)) { - $strMatch = $arrMatches[1]; // 提取括号内的内容 - - $arrData = array_map('trim', explode(",", $strMatch)); - - $arrData = array_map(function ($item) { - return trim($item, "'"); - }, $arrData); - - $this->arrChapterInfo['c_page_data'] = $arrData; - } else { - $this->arrChapterInfo['c_page_data'] = NULL; - } - } - - return $this->arrChapterInfo; - } - - /** - * Undocumented variable - * - * @var array - */ - protected $arrChapterInfo; - - - /** - * Undocumented function - * - * @param integer $intNId - * @return boolean - */ - public function saveChapter(int $intNId): bool - { - $arrPageChapter = $this->getChapterInfo(); - - if ( - empty($arrPageChapter) || - empty($arrPageChapter['c_page_title']) || - empty($arrPageChapter['c_page_data']) || - count($arrPageChapter['c_page_data']) < 5 - ) { - return false; - } - - $strUUId = $this->getSite()->getSiteUUId('chapter-' . $this->arrData['c_source_id'] . '-' . $this->arrData['c_page']); - - $arrChapter = [ - 'n_id' => $intNId, - 'c_name' => $arrPageChapter['c_page_data'][3], - 'c_sort_num' => $this->arrData['c_sort_num'], - 'c_page' => $this->arrData['c_page'], - 'c_source_id' => $this->arrData['c_source_id'], - 'c_site_code' => $this->getSite()->getSiteCode(), - 'c_source_uuid' => $strUUId, - ]; - - $arrExistsChapter = $this->getChapterModel()->findOne(['c_source_uuid' => $strUUId], $this->arrOptions); - - if ($arrExistsChapter) { - - $arrExistsChapter = (array) $arrExistsChapter; - - $arrUpdate = [ - 'updated_at' => new \MongoDB\BSON\UTCDateTime(), - ]; - - $this->getChapterModel()->updateOne( - ['c_source_uuid' => $strUUId], - ['$set' => $arrUpdate], - ); - $this->strCContentPath = $arrExistsChapter['c_content_path']; - } else { - - $arrInsertNovel = $arrChapter; - - $arrInsertNovel['c_content_path'] = '/novel/' . ($intNId % 100) . '/' . $intNId . '/' . $arrChapter['c_sort_num'] . '_' . $arrChapter['c_page'] . '.txt'; - $arrInsertNovel['created_at'] = new \MongoDB\BSON\UTCDateTime(); - - try { - $this->getChapterModel()->insert($arrInsertNovel); - $this->updateNovelHaveChapter($intNId); - $this->strCContentPath = $arrInsertNovel['c_content_path']; - } catch (\Exception $e) { - if ($e->getCode() === 11000) { - return $this->saveChapter($intNId); - } else { - throw $e; - } - } - } - - StorageCore::getInstance()->put($this->strCContentPath, $this->strChapterContent); - - return true; - } - - public $strCContentPath; - /** - * Undocumented function - * - * @param integer $intNId - * @return void - */ - protected function updateNovelHaveChapter(int $intNId) - { - $arrFilter = [ - 'n_id' => $intNId, - ]; - - $ChapterModel = ChapterModel::getInstance(); - $arrLasteChapter = $ChapterModel->getLatestChapterByNId($intNId, false); - - if (!empty($arrLasteChapter)) { - $arrUpdate['$set']['n_have_chapter'] = 1; - $arrUpdate['$set']['n_latest_chapter_name'] = $arrLasteChapter['c_name']; - $this->getMongoBase()->updateOne('novel', $arrFilter, $arrUpdate); - } - } - - protected $arrNextPage; - - /** - * Undocumented function - * - * @return array - */ - public function getNextPage(): array - { - if ($this->arrNextPage === NULL) { - $this->arrNextPage = []; - - if ($this->isMobile()) { - $strPattern = "/var\s+hhekgsv\s*=\s*['\"](.*?)['\"]/"; - preg_match_all($strPattern, $this->getContent(), $arrMatches); - $strNextPageUri = end($arrMatches[1]) ?: ''; - } else { - $strHref = $this->getQueryList()->find('.read_btn a:contains("下一章")')->attr('href'); - $strNextPageUri = $strHref ?: ''; - } - - if (is_numeric(strpos($strNextPageUri, '_'))) { - $this->arrNextPage = $this->arrData; - $this->arrNextPage['c_page'] += 1; - $this->arrNextPage['uri'] = $strNextPageUri; - } - } - - return $this->arrNextPage; - } -} diff --git a/code/app/task/crawler/zw/page/LatestListPage.php b/code/app/task/crawler/zw/page/LatestListPage.php deleted file mode 100644 index 94565d1..0000000 --- a/code/app/task/crawler/zw/page/LatestListPage.php +++ /dev/null @@ -1,64 +0,0 @@ -NovelModel == NULL) { - $this->NovelModel = NovelModel::getInstance(); - } - return $this->NovelModel; - } - - static public $arrOptions = [ - 'typeMap' => [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - ]; - - /** - * Undocumented function - * - * @return array - */ - public function getNovelFilter(): array - { - $arrFilter = []; - if ($this->isMobile()) { - $arrFilter = $this->getQueryList()->find('div.wrap-box')->eq(0)->find('ul.sort_list li')->map(function ($li) { - $strUri = $li->find('a')->eq(0)->attr('href'); - return supperExtractFilename($strUri); - })->filter()->all(); - } else { - - $arrFilter = $this->getQueryList()->find('div.layout.layout2.layout-col2.fl ul.txt-list li')->map(function ($li) { - $strUri = $li->find('a')->eq(0)->attr('href'); - return supperExtractFilename($strUri); - })->filter()->all(); - } - - return $arrFilter; - } -} diff --git a/code/app/task/crawler/zw/page/NovelPage.php b/code/app/task/crawler/zw/page/NovelPage.php deleted file mode 100644 index 2a863bc..0000000 --- a/code/app/task/crawler/zw/page/NovelPage.php +++ /dev/null @@ -1,418 +0,0 @@ -NovelModel == NULL) { - $this->NovelModel = NovelModel::getInstance(); - } - return $this->NovelModel; - } - - public $arrOptions = [ - 'typeMap' => [ - 'root' => 'array', - 'document' => 'array', - 'array' => 'array', - ], - ]; - - /** - * 查询看的小说 - * - * @param integer $intNSourceId - * @param string $strName - * @return array - */ - protected function findOrCreateNovel(int $intNSourceId, string $strName): array - { - $strUUId = $this->getSite()->getSiteUUId($intNSourceId); - - $arrExistsNovel = $this->getNovelModel()->findOne(['n_source_uuid' => $strUUId], $this->arrOptions); - - if ($arrExistsNovel) { - $arrNovelInfo = (array) $arrExistsNovel; - } else { - $arrNovelInfo = [ - 'n_id' => CountersModel::getInstance()->getNextSequence('novel'), - 'n_name' => $strName, - 'n_name_pinyin' => zhToPinYin($strName), - 'n_site_code' => $this->getSite()->getSiteCode(), - 'n_source_uuid' => $strUUId, - 'n_source_id' => $intNSourceId, - 'n_level' => 1, - 'n_have_chapter' => 0, - 'created_at' => new \MongoDB\BSON\UTCDateTime(), - ]; - try { - $this->getNovelModel()->insert($arrNovelInfo); - } catch (\Exception $e) { - if ($e->getCode() === 11000) { - return $this->findOrCreateNovel($intNSourceId, $strName); - } else { - throw $e; - } - } - } - return $arrNovelInfo; - } - - - /** - * 分析关联数据 - * - * @return void - */ - public function getReletedNovel() {} - - - /** - * Undocumented function - * - * @return array - */ - public function getNovelInfo(): array - { - if (empty($this->arrNovelInfo)) { - - # 获取head字段 - $this->getQueryList()->find('meta[property]')->each(function ($Item) { - $strKey = str_replace(':', '_', $Item->attr('property')); - $this->arrNovelInfo[$strKey] = $Item->attr('content'); - }); - - $this->getReletedNovel(); - } - - return $this->arrNovelInfo; - } - - /** - * Undocumented function - * - * @param string $strName - * @return string - */ - public function generateCoverPath($strName): string - { - $intTime = time() - mt_rand(1, 2 * 24 * 3600 * 360); - - return sprintf('/img/%s/%s.jpg', date('Y/m/d/H', $intTime), $strName); - } - - public function filterOtherFields(&$arrNovel) - { - $arrFields = [ - 'n_id', - 'n_name', - 'n_name_pinyin', - 'n_status', - 'n_author', - 'n_description', - 'n_category', - 'n_category_pinyin', - 'n_category_sex_en', - 'n_category_sex_zh', - 'n_cover_path', - 'n_latest_chapter_name', - 'n_update_time', - 'n_forge_novel', - 'n_related_novel', - 'n_site_code', - 'n_source_uuid', - 'n_source_id', - 'n_have_chapter', - 'created_at', - 'updated_at', - ]; - - foreach ($arrNovel as $strKey => $strVal) { - if (!in_array($strKey, $arrFields)) { - unset($arrNovel[$strKey]); - } - } - } - - /** - * Undocumented function - * - * @return bool - */ - public function saveNovelInfo(): bool - { - $arrPageInfo = $this->getNovelInfo(); - if ( - empty($arrPageInfo) || - empty($arrPageInfo['og_title']) || - empty($arrPageInfo['og_image']) || - empty($arrPageInfo['og_novel_category']) - ) { - return false; - } - - $arrNovelInfo = [ - // 'n_id'=> $arrPageInfo['xxxxx'], - 'n_name' => $arrPageInfo['og_title'], - 'n_name_pinyin' => zhToPinYin($arrPageInfo['og_title']), - 'n_status' => $arrPageInfo['og_novel_status'], - 'n_author' => $arrPageInfo['og_novel_author'], - 'n_description' => $arrPageInfo['og_description'], - 'n_category' => $arrPageInfo['og_novel_category'], - // 'n_category_pinyin' => $arrPageInfo['xxxxx'], - // 'n_category_sex_en' => $arrPageInfo['xxxxx'], - // 'n_category_sex_zh' => $arrPageInfo['xxxxx'], - // 'n_cover_path' => $arrPageInfo['xxxxx'], - 'n_latest_chapter_name' => $arrPageInfo['og_novel_latest_chapter_name'], - 'n_update_time' => $arrPageInfo['og_novel_update_time'], - 'n_forge_novel' => $this->arrForgeNovel, - 'n_related_novel' => $this->arrRelatedNovel, - - 'n_site_code' => $this->getSite()->getSiteCode(), - 'n_source_id' => $this->arrData['n_source_id'], - 'n_source_uuid' => $this->getSite()->getSiteUUId($this->arrData['n_source_id']), - - // 'n_have_chapter' => $arrPageInfo['xxxxx'], - // 'created_at' => $arrPageInfo['xxxxx'], - // 'updated_at' => $arrPageInfo['xxxxx'], - - ]; - - $arrExistsNovel = $this->getNovelModel()->findOne(['n_source_uuid' => $arrNovelInfo['n_source_uuid']], $this->arrOptions); - - if ($arrExistsNovel) { - - $arrExistsNovel = (array) $arrExistsNovel; - - $arrUpdate = [ - 'n_latest_chapter_name' => $arrNovelInfo['n_latest_chapter_name'], - 'n_update_time' => $arrNovelInfo['n_update_time'], - 'updated_at' => new \MongoDB\BSON\UTCDateTime(), - ]; - - # 如果没有分类,说明这条数据是最初从关联shu那里采集的,需要补全全部信息 - if (empty($arrExistsNovel['n_category'])) { - $arrUpdate = array_merge($arrUpdate, $arrNovelInfo); - $arrUpdate['n_related_novel'] = $this->arrRelatedNovel; - $arrUpdate['n_forge_novel'] = $this->arrForgeNovel; - $arrUpdate['n_category_pinyin'] = CategoryModel::getPinYin($this->arrNovelInfo['og_novel_category']); - $arrUpdate['n_category_sex_en'] = CategoryModel::getSexEn($this->arrNovelInfo['og_novel_category']); - $arrUpdate['n_category_sex_zh'] = CategoryModel::getSexZh($this->arrNovelInfo['og_novel_category']); - $arrUpdate['n_related_novel'] = $this->arrRelatedNovel; - $arrUpdate['n_forge_novel'] = $this->arrForgeNovel; - } - - # 图片不存在的时候,需要重新生成 - if ( - !isset($arrExistsNovel['n_cover_path']) || - empty($arrExistsNovel['n_cover_path']) || - !StorageCore::getInstance()->has($arrExistsNovel['n_cover_path']) || - (basename($arrExistsNovel['n_cover_path']) == '.jpg') - ) { - $arrUpdate['n_cover_path'] = $this->generateCoverPath($arrNovelInfo['n_name_pinyin']); - $this->strCoverLocalPath = $arrUpdate['n_cover_path']; - } else { - $this->strCoverLocalPath = $arrExistsNovel['n_cover_path']; - } - - $this->getNovelModel()->updateOne( - ['n_source_uuid' => $arrNovelInfo['n_source_uuid']], - ['$set' => $arrUpdate], - ); - $this->intNId = $arrExistsNovel['n_id']; - } else { - - $arrNovelInfo['n_category_pinyin'] = CategoryModel::getPinYin($this->arrNovelInfo['og_novel_category']); - $arrNovelInfo['n_category_sex_en'] = CategoryModel::getSexEn($this->arrNovelInfo['og_novel_category']); - $arrNovelInfo['n_category_sex_zh'] = CategoryModel::getSexZh($this->arrNovelInfo['og_novel_category']); - $arrNovelInfo['n_id'] = CountersModel::getInstance()->getNextSequence('novel'); - $arrNovelInfo['n_level'] = 1; - $arrNovelInfo['n_have_chapter'] = 0; - $arrNovelInfo['n_cover_path'] = $this->generateCoverPath($arrNovelInfo['n_name_pinyin']); - $arrNovelInfo['n_related_novel'] = $this->arrRelatedNovel; - $arrNovelInfo['n_forge_novel'] = $this->arrForgeNovel; - $arrNovelInfo['created_at'] = new \MongoDB\BSON\UTCDateTime(); - - try { - $this->getNovelModel()->insert($arrNovelInfo); - $this->intNId = $arrNovelInfo['n_id']; - $this->strCoverLocalPath = $arrNovelInfo['n_cover_path']; - } catch (\Exception $e) { - if ($e->getCode() === 11000) { - return $this->saveNovelInfo(); - } else { - throw $e; - } - } - } - - return true; - } - - - public $strCoverLocalPath = ''; - - public $intNId; - - /** - * Undocumented function - * - * @return array - */ - public function getDownCoverInfo(): array - { - return [ - 'uri' => $this->arrNovelInfo['og_image'], - 'local_path' => $this->strCoverLocalPath, - ]; - } - - /** - * Undocumented variable - * - * @var array - */ - protected $arrLatestChapters = NULL; - - /** - * Undocumented variable - * - * @var array - */ - protected $arrChapters = NULL; - - public function getLatestChapterByNIdsList(): array - { - if ($this->arrLatestChapters === NULL) { - $this->arrLatestChapters = []; - - if ($this->isMobile()) { - $strClass = '.chapter-list'; - } else { - $strClass = '.section-list'; - } - - if ($this->arrData['page'] == 0) { - $this->getQueryList()->find($strClass)->eq(0)->find("a")->map(function ($A) { - $this->arrLatestChapters[] = [ - 'name' => $A->text(), - 'uri' => $A->attr('href'), - ]; - }); - } - } - return $this->arrLatestChapters; - } - - /** - * Undocumented function - * - * @return array - */ - public function getChapters(): array - { - if ($this->arrChapters === NULL) { - $this->arrChapters = []; - if ($this->isMobile()) { - $strClass = '.chapter-list'; - } else { - $strClass = '.section-list'; - } - - $intDivIndex = 0; - if ($this->arrData['page'] == 0) { - $intDivIndex = 1; - } - - $this->getQueryList()->find($strClass)->eq($intDivIndex)->find("a")->map(function ($A) { - $this->arrChapters[] = [ - 'name' => $A->text(), - 'uri' => $A->attr('href'), - ]; - }); - } - return $this->arrChapters; - } - - - protected $arrNextPageArgs = NULL; - - /** - * Undocumented function - * - * @return array - */ - public function getNextPageArgs(): array - { - $this->arrNextPageArgs = []; - if ($this->arrData['page'] == 0) { - $this->getLatestChapterByNIdsList(); - $this->getChapters(); - - $arrLatestChapterFirstBlock = count($this->arrLatestChapters) > 0 ? $this->arrLatestChapters[0] : null; - $arrLatestChapterSecondBlock = count($this->arrChapters) > 0 ? $this->arrChapters[count($this->arrChapters) - 1] : null; - - if ( - !empty($arrLatestChapterFirstBlock) && !empty($arrLatestChapterSecondBlock) - && ($arrLatestChapterFirstBlock['uri'] != $arrLatestChapterSecondBlock['uri']) - - ) { - $this->arrNextPageArgs = [ - 'n_source_id' => $this->arrData['n_source_id'], - 'page' => $this->arrData['page'] + 1, - ]; - } - } else { - $strLastUri = $this->getQueryList()->find('select:first option:last')->attr('value'); - if ($strLastUri != '' && $strLastUri != $this->strUri) { - $this->arrNextPageArgs = [ - 'n_source_id' => $this->arrData['n_source_id'], - 'page' => $this->arrData['page'] + 1, - ]; - } - } - return $this->arrNextPageArgs; - } -} diff --git a/code/app/task/crawler/zw/page/Site.php b/code/app/task/crawler/zw/page/Site.php deleted file mode 100644 index b161e2f..0000000 --- a/code/app/task/crawler/zw/page/Site.php +++ /dev/null @@ -1,347 +0,0 @@ -initClient(); - } - - /** - * Undocumented function - */ - public function initClient() - { - $arrConfig = [ - 'http_version' => '1.1', // 强制用 HTTP/1.1,已有,保持 - 'base_uri' => $this->strDomain, // 基础域名,已有,保持 - 'http_errors' => false, // 不抛 HTTP 错误,已有,保持 - 'timeout' => 60, // 从 160 秒改为 60 秒 - 'connect_timeout' => 10, // 从 30 秒改为 10 秒 - 'curl' => [ - CURLOPT_TCP_KEEPALIVE => 1, // 启用 TCP Keep-Alive,已有,保持 - CURLOPT_TCP_KEEPIDLE => 120, // Keep-Alive 空闲时间 - CURLOPT_TCP_KEEPINTVL => 60, // Keep-Alive 探测间隔 - // CURLOPT_SSL_VERIFYPEER => true, // 验证 SSL,已有,保持 - ], - 'headers' => [ - 'User-Agent' => 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36', - 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', - 'Referer' => $this->strDomain, - 'Connection' => 'keep-alive', - 'sec-ch-ua' => '"Not/A)Brand";v="8", "Chromium";v="130", "Google Chrome";v="130"', - 'sec-ch-ua-mobile' => '?1', - 'sec-ch-ua-platform' => '"Android"', - 'sec-fetch-dest' => 'document', - 'sec-fetch-mode' => 'navigate', - 'sec-fetch-site' => 'same-origin', - 'sec-fetch-user' => '?1', - 'upgrade-insecure-requests' => '1', - ], - 'pool_size' => 10, - 'verify' => false, - ]; - - $arrProxy = config('proxy'); - if ($arrProxy['proxy_status']) { - - $strCode = $arrProxy['proxy_code']; - $strProxyHost = $arrProxy['proxy_host']; - $strKey = $arrProxy['proxy_key']; - $strSecret = $arrProxy['proxy_secret']; - - - switch ($strCode) { - case 'XIONGMAO': - $intTime = time(); - $strTxt = "orderno=" . $strKey . ",secret=" . $strSecret . ",timestamp=" . $intTime; - $strSign = strtoupper(md5($strTxt)); - $strAuth = 'sign=' . $strSign . '&orderno=' . $strKey . '×tamp=' . $intTime; - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['headers']['Proxy-Authorization'] = $strAuth; - break; - case 'KUAI': - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['curl'][CURLOPT_PROXYAUTH] = CURLAUTH_BASIC; - $arrConfig['curl'][CURLOPT_PROXYUSERPWD] = "$strKey:$strSecret"; - break; - } - } - - - $this->Client = new Client($arrConfig); - } - - /** - * Undocumented function - * - * @return string - */ - public function getSiteCode(): string - { - return $this->strSiteCode; - } - - /** - * Undocumented function - * - * @param integer|string $strSign - * @return string - */ - public function getSiteUUId(int|string $strSign): string - { - return $this->getSiteCode() . '-' . $strSign; - } - - /** - * Undocumented function - * - * @return Client - */ - public function getClient(): Client - { - return $this->Client; - } - - public function getNovelPageUri($intNSourceId, $intPage): string - { - $intUriFirst = intdiv($intNSourceId, 1000); - - $strUri = ''; - - if ($intPage == 0) { - $strUri = sprintf('/%s/%s/', $intUriFirst, $intNSourceId); - } else { - $strUri = sprintf('/book/%s/list%s.html', $intNSourceId, $intPage); - } - - return $strUri; - } - - /** - * retrieve multiple novel page model - * - * @param string $strUri - * @return NovelPage[] - */ - public function getNovelPageList(array $arrFilter): array - { - - /** @var NovelPage[] */ - $arrNovelPage = []; - - foreach ($arrFilter as $intKey => $arrItem) { - - $arrFilter[$intKey]['uri'] = $this->getNovelPageUri($arrItem['n_source_id'], $arrItem['page']); - - $arrPromises[$intKey] = $this->getClient()->getAsync($arrFilter[$intKey]['uri']); - } - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - $strContent = $Response->getBody()->getContents(); - if ($strContent == '索引文件不存在!') { - continue; - } - - $NovelPage = $this->getNovelPage($this, $arrFilter[$intKey]['uri']); - - $NovelPage->setContent($strContent); - $NovelPage->setData($arrFilter[$intKey]); - - $arrNovelPage[] = $NovelPage; - } - - return $arrNovelPage; - } - - /** - * retrieve multiple chapter page model - * - * @param string $strUri - * @return ChapterPage[] - */ - public function getChapterPageList(array $arrFilter): array - { - - /** @var ChapterPage[] */ - $arrChapterPage = []; - - $arrPromises = []; - foreach ($arrFilter as $intKey => $arrItem) { - $arrPromises[$intKey] = $this->getClient()->getAsync($arrItem['uri']); - } - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - $strContent = $Response->getBody()->getContents();; - - $ChapterPage = $this->getChapterPage($this, $arrFilter[$intKey]['uri']); - - $ChapterPage->setContent($strContent); - $ChapterPage->setData($arrFilter[$intKey]); - - $arrChapterPage[] = $ChapterPage; - } - - return $arrChapterPage; - } - - - /** - * retrieve multiple chapter page model - * - * @param string $strUri - * @return LatestListPage[] - */ - public function getLatestListPageList(array $arrFilter): array - { - - /** @var LatestListPage[] */ - $arrLatestListPage = []; - - $arrPromises = []; - foreach ($arrFilter as $intKey => $strUri) { - $arrPromises[$intKey] = $this->getClient()->getAsync($strUri); - } - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - $strContent = $Response->getBody()->getContents();; - - $LatestListPage = $this->getLatestListPage($this, $arrFilter[$intKey]); - - $LatestListPage->setContent($strContent); - - $arrLatestListPage[] = $LatestListPage; - } - - - return $arrLatestListPage; - } - - /** - * download the image to the local system - * - * @param array $arrFilter - * @return void - */ - public function downRemoteImgToLocal(array $arrFilter) - { - $StorageCore = StorageCore::getInstance(); - - $arrPromises = []; - - foreach ($arrFilter as $intKey => $arrItem) { - if (!$StorageCore->has($arrItem['local_path'])) { - $arrPromises[$intKey] = $this->getClient()->getAsync($arrItem['uri']); - } - } - - $arrResults = Promise\Utils::settle($arrPromises)->wait(); - - $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { - return $arrResult['state'] === 'fulfilled'; - }); - - foreach ($arrSuccessfulResults as $intKey => $arrResult) { - $Response = $arrResult['value']; - - $StorageCore->writeStream($arrFilter[$intKey]['local_path'], $Response->getBody()->detach());; - } - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return NovelPage - */ - public function getNovelPage($Site, $strUri) - { - return new NovelPage($Site, $strUri); - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return ChapterPage - */ - public function getChapterPage($Site, $strUri) - { - return new ChapterPage($Site, $strUri); - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return LatestListPage - */ - public function getLatestListPage($Site, $strUri) - { - return new LatestListPage($Site, $strUri); - } -} diff --git a/code/app/task/crawler/zw630/Scheduler.php b/code/app/task/crawler/zw630/Scheduler.php deleted file mode 100644 index b51775c..0000000 --- a/code/app/task/crawler/zw630/Scheduler.php +++ /dev/null @@ -1,42 +0,0 @@ -intSlice = 3; - } - - /** - * Undocumented function - * - * @return Site - */ - public function getSite() - { - if ($this->Site == NULL) { - $this->Site = new Site; - } - return $this->Site; - } -} diff --git a/code/app/task/crawler/zw630/page/ChapterPage.php b/code/app/task/crawler/zw630/page/ChapterPage.php deleted file mode 100644 index b079ea0..0000000 --- a/code/app/task/crawler/zw630/page/ChapterPage.php +++ /dev/null @@ -1,9 +0,0 @@ -arrRelatedNovel) || empty($this->arrForgeNovel)) { - $this->getQueryList()->find('.first_txt')->eq(0)->find("a")->map(function ($A) { - $strName = $A->text(); - $strUri = $A->attr('href'); - - if (is_numeric(strpos($strUri, 'shu'))) { - $intNSourceId = (int)supperExtractFilename($strUri); - $arrNovelInfo = $this->findOrCreateNovel($intNSourceId, $strName); - $this->arrRelatedNovel[] = [ - "n_id" => $arrNovelInfo["n_id"], - "n_source_id" => $arrNovelInfo["n_source_id"], - "n_name" => $arrNovelInfo["n_name"], - ]; - } elseif (is_numeric(strpos($strUri, 'kan'))) { - $intNForgeId = (int)supperExtractFilename($strUri); - $this->arrForgeNovel[] = [ - "n_forge_id" => $intNForgeId, - "n_forge_title" => $strName, - ]; - } - }); - } - } -} diff --git a/code/app/task/crawler/zw630/page/Site.php b/code/app/task/crawler/zw630/page/Site.php deleted file mode 100644 index a3791d5..0000000 --- a/code/app/task/crawler/zw630/page/Site.php +++ /dev/null @@ -1,148 +0,0 @@ - '1.1', // 强制用 HTTP/1.1,已有,保持 - 'base_uri' => $this->strDomain, // 基础域名,已有,保持 - 'http_errors' => false, // 不抛 HTTP 错误,已有,保持 - 'timeout' => 60, // 从 160 秒改为 60 秒 - 'connect_timeout' => 10, // 从 30 秒改为 10 秒 - 'curl' => [ - CURLOPT_TCP_KEEPALIVE => 1, // 启用 TCP Keep-Alive,已有,保持 - CURLOPT_TCP_KEEPIDLE => 120, // Keep-Alive 空闲时间 - CURLOPT_TCP_KEEPINTVL => 60, // Keep-Alive 探测间隔 - // CURLOPT_SSL_VERIFYPEER => true, // 验证 SSL,已有,保持 - ], - 'headers' => [ - 'User-Agent' => 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36', - 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', - 'Referer' => $this->strDomain, - 'Connection' => 'keep-alive', - 'sec-ch-ua' => '"Not/A)Brand";v="8", "Chromium";v="130", "Google Chrome";v="130"', - 'sec-ch-ua-mobile' => '?1', - 'sec-ch-ua-platform' => '"Android"', - 'sec-fetch-dest' => 'document', - 'sec-fetch-mode' => 'navigate', - 'sec-fetch-site' => 'same-origin', - 'sec-fetch-user' => '?1', - 'upgrade-insecure-requests' => '1', - ], - 'pool_size' => 10, - 'verify' => false, - ]; - - $arrProxy = config('proxy'); - if ($arrProxy['proxy_status']) { - - $strCode = $arrProxy['proxy_code']; - $strProxyHost = $arrProxy['proxy_host']; - $strKey = $arrProxy['proxy_key']; - $strSecret = $arrProxy['proxy_secret']; - - - switch ($strCode) { - case 'XIONGMAO': - $intTime = time(); - $strTxt = "orderno=" . $strKey . ",secret=" . $strSecret . ",timestamp=" . $intTime; - $strSign = strtoupper(md5($strTxt)); - $strAuth = 'sign=' . $strSign . '&orderno=' . $strKey . '×tamp=' . $intTime; - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['headers']['Proxy-Authorization'] = $strAuth; - break; - case 'KUAI': - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['curl'][CURLOPT_PROXYAUTH] = CURLAUTH_BASIC; - $arrConfig['curl'][CURLOPT_PROXYUSERPWD] = "$strKey:$strSecret"; - break; - } - } - - - $this->Client = new Client($arrConfig); - } - - - public function getNovelPageUri($intNSourceId, $intPage): string - { - $strUri = ''; - - if ($intPage == 0) { - - $strUri = sprintf('/shu/%s.html', $intNSourceId); - } else { - - $strUri = sprintf('/shu/%s_%s.html', $intNSourceId, $intPage); - } - - return $strUri; - } - - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return NovelPage - */ - public function getNovelPage($Site, $strUri) - { - return new NovelPage($Site, $strUri); - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return ChapterPage - */ - public function getChapterPage($Site, $strUri) - { - return new ChapterPage($Site, $strUri); - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return LatestListPage - */ - public function getLatestListPage($Site, $strUri) - { - return new LatestListPage($Site, $strUri); - } -} diff --git a/code/app/task/crawler/zw74/Scheduler.php b/code/app/task/crawler/zw74/Scheduler.php deleted file mode 100644 index 6780f01..0000000 --- a/code/app/task/crawler/zw74/Scheduler.php +++ /dev/null @@ -1,37 +0,0 @@ -intSlice = 8; - } - - /** - * Undocumented function - * - * @return Site - */ - public function getSite() - { - if ($this->Site == NULL) { - $this->Site = new Site; - } - return $this->Site; - } -} diff --git a/code/app/task/crawler/zw74/page/ChapterPage.php b/code/app/task/crawler/zw74/page/ChapterPage.php deleted file mode 100644 index c2d49b1..0000000 --- a/code/app/task/crawler/zw74/page/ChapterPage.php +++ /dev/null @@ -1,9 +0,0 @@ -arrRelatedNovel) || empty($this->arrForgeNovel)) { - $this->getQueryList()->find('.first_txt')->eq(0)->find("a")->map(function ($A) { - $strName = $A->text(); - $strUri = $A->attr('href'); - - if (is_numeric(strpos($strUri, 'http'))) { - return; - } - - $strPattern = '#^/\d+/(\d+)/$#'; - - if (is_numeric(strpos($strUri, 'info'))) { - $intNForgeId = (int)supperExtractFilename($strUri); - $this->arrForgeNovel[] = [ - "n_forge_id" => $intNForgeId, - "n_forge_title" => $strName, - ]; - } elseif (preg_match($strPattern, $strUri, $arrMatches)) { - $intNSourceId = (int)$arrMatches[1]; - $arrNovelInfo = $this->findOrCreateNovel($intNSourceId, $strName); - $this->arrRelatedNovel[] = [ - "n_id" => $arrNovelInfo["n_id"], - "n_source_id" => $arrNovelInfo["n_source_id"], - "n_name" => $arrNovelInfo["n_name"], - ]; - } - }); - } - } -} diff --git a/code/app/task/crawler/zw74/page/Site.php b/code/app/task/crawler/zw74/page/Site.php deleted file mode 100644 index 298a260..0000000 --- a/code/app/task/crawler/zw74/page/Site.php +++ /dev/null @@ -1,152 +0,0 @@ - '1.1', // 强制用 HTTP/1.1,已有,保持 - 'base_uri' => $this->strDomain, // 基础域名,已有,保持 - 'http_errors' => false, // 不抛 HTTP 错误,已有,保持 - 'timeout' => 60, // 从 160 秒改为 60 秒 - 'connect_timeout' => 10, // 从 30 秒改为 10 秒 - 'curl' => [ - CURLOPT_TCP_KEEPALIVE => 1, // 启用 TCP Keep-Alive,已有,保持 - CURLOPT_TCP_KEEPIDLE => 120, // Keep-Alive 空闲时间 - CURLOPT_TCP_KEEPINTVL => 60, // Keep-Alive 探测间隔 - // CURLOPT_SSL_VERIFYPEER => true, // 验证 SSL,已有,保持 - ], - 'headers' => [ - 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0', - 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', - 'Referer' => $this->strDomain, - 'Connection' => 'keep-alive', - 'sec-ch-ua' => '"Microsoft Edge";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', - 'sec-ch-ua-mobile' => '?0', - 'sec-ch-ua-platform' => '"Windows"', - 'sec-fetch-dest' => 'document', - 'sec-fetch-mode' => 'navigate', - 'sec-fetch-site' => 'same-origin', - 'sec-fetch-user' => '?1', - 'upgrade-insecure-requests' => '1', - ], - 'pool_size' => 10, - 'verify' => false, - ]; - - $arrProxy = config('proxy'); - if ($arrProxy['proxy_status']) { - - $strCode = $arrProxy['proxy_code']; - $strProxyHost = $arrProxy['proxy_host']; - $strKey = $arrProxy['proxy_key']; - $strSecret = $arrProxy['proxy_secret']; - - - switch ($strCode) { - case 'XIONGMAO': - $intTime = time(); - $strTxt = "orderno=" . $strKey . ",secret=" . $strSecret . ",timestamp=" . $intTime; - $strSign = strtoupper(md5($strTxt)); - $strAuth = 'sign=' . $strSign . '&orderno=' . $strKey . '×tamp=' . $intTime; - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['headers']['Proxy-Authorization'] = $strAuth; - break; - case 'KUAI': - $arrConfig['proxy'] = $strProxyHost; - $arrConfig['curl'][CURLOPT_PROXYAUTH] = CURLAUTH_BASIC; - $arrConfig['curl'][CURLOPT_PROXYUSERPWD] = "$strKey:$strSecret"; - break; - } - } - - - $this->Client = new Client($arrConfig); - } - - /** - * Undocumented function - * - * @param int $intNSourceId - * @param int $intPage - * @return string - */ - public function getNovelPageUri($intNSourceId, $intPage): string - { - $intUriFirst = intdiv($intNSourceId, 1000); - - $strUri = ''; - - if ($intPage == 0) { - $strUri = sprintf('/%s/%s/', $intUriFirst, $intNSourceId); - } else { - $strUri = sprintf('/book/%s/list%s.html', $intNSourceId, $intPage); - } - - return $strUri; - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return NovelPage - */ - public function getNovelPage($Site, $strUri) - { - return new NovelPage($Site, $strUri); - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return ChapterPage - */ - public function getChapterPage($Site, $strUri) - { - return new ChapterPage($Site, $strUri); - } - - /** - * Undocumented function - * - * @param object $Site - * @param string $strUri - * @return LatestListPage - */ - public function getLatestListPage($Site, $strUri) - { - return new LatestListPage($Site, $strUri); - } -} diff --git a/code/app/task/module/Listen.php b/code/app/task/module/Listen.php deleted file mode 100644 index b9130df..0000000 --- a/code/app/task/module/Listen.php +++ /dev/null @@ -1,90 +0,0 @@ - 0) { - $intLimit--; - try { - $strData = $QueueManage->get(); - if (empty($strData)) { - sleep(1); - continue; - } - $arrData = json_decode($strData, true); - if (!is_array($arrData)) { - echo '监听Redis队列读取到异常无法解析的数据[' . $strData . ']' . PHP_EOL; - continue; - } - $Class = new $arrData['callback'][0]; - $Class->{$arrData['callback'][1]}($arrData['data']); - unset($Class); - } catch (\Throwable $t) { - $strData = $strData ?? ''; - echo date('Y-m-d H:i:s') . ':出现致命错误需要处理' . PHP_EOL . - ' 队列数据:' . $strData . PHP_EOL . - ' 文件:' . $t->getFile() . PHP_EOL . - ' 行数:' . $t->getLine() . PHP_EOL . - ' 错误描述:' . $t->getMessage() . PHP_EOL . - ' 堆栈跟踪:' . $t->getTraceAsString() . PHP_EOL; - } - } - } -} diff --git a/code/app/task/module/PlanTask.php b/code/app/task/module/PlanTask.php deleted file mode 100644 index 264f37c..0000000 --- a/code/app/task/module/PlanTask.php +++ /dev/null @@ -1,136 +0,0 @@ -select(); - - foreach ($PlanTaskAll as $PlanTask) { - - if ($PlanTask->pt_last_exec != 0 && ($PlanTask->pt_last_exec + $PlanTask->pt_limit) > time()) continue; - - $PlanTask->pt_last_exec = time(); - - $PlanTask->save(); - - switch ($PlanTask->pt_code) { - - case 'PULL_630_ZW_NOVEL': - self::pull630ZwNovel(); - break; - case 'PULL_630_ZW_NOVEL_LATEST': - self::pull630ZwNovelLatest(); - break; - - case 'PULL_74_ZW_NOVEL': - self::pull74ZwNovel(); - break; - case 'PULL_74_ZW_NOVEL_LATEST': - self::pull74ZwNovelLatest(); - break; - - case 'PULL_YOU_ZHI_SHI_PIN': - self::pullYouZhiShiPin(); - break; - - } - } - } - /** - * Undocumented function - * - * @return void - */ - public static function pullYouZhiShiPin() - { - $arrTask = [ - 'callback' => [YouZhiScheduler::class, 'crawlFull'], - 'data' => [] - ]; - - $QueueManage = new QueueManage(); - $QueueManage->set($arrTask); - } - - - /** - * Undocumented function - * - * @return void - */ - public static function pull630ZwNovel() - { - $arrTask = [ - 'callback' => [Zw630Scheduler::class, 'crawlFull'], - 'data' => [] - ]; - - $QueueManage = new QueueManage(); - $QueueManage->set($arrTask); - } - - /** - * Undocumented function - * - * @return void - */ - public static function pull630ZwNovelLatest() - { - $arrTask = [ - 'callback' => [Zw630Scheduler::class, 'crawLatest'], - 'data' => [] - ]; - - $QueueManage = new QueueManage(); - $QueueManage->set($arrTask); - } - - - /** - * Undocumented function - * - * @return void - */ - public static function pull74ZwNovel() - { - $arrTask = [ - 'callback' => [Zw74Scheduler::class, 'crawlFull'], - 'data' => [] - ]; - - $QueueManage = new QueueManage(); - $QueueManage->set($arrTask); - } - - /** - * Undocumented function - * - * @return void - */ - public static function pull74ZwNovelLatest() - { - $arrTask = [ - 'callback' => [Zw74Scheduler::class, 'crawLatest'], - 'data' => [] - ]; - - $QueueManage = new QueueManage(); - $QueueManage->set($arrTask); - } -} diff --git a/code/composer.json b/code/composer.json deleted file mode 100644 index aefec70..0000000 --- a/code/composer.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "topthink/think", - "description": "the new thinkphp framework", - "type": "project", - "keywords": [ - "framework", - "thinkphp", - "ORM" - ], - "homepage": "https://www.thinkphp.cn/", - "license": "Apache-2.0", - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - }, - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "require": { - "php": ">=8.0.0", - "topthink/framework": "^8.0", - "topthink/think-orm": "^3.0|^4.0", - "topthink/think-filesystem": "^2.0", - "topthink/think-multi-app": "^1.1", - "topthink/think-view": "^2.0", - "guzzlehttp/guzzle": "^7.8", - "jaeger/querylist": "^4.2", - "topthink/think-migration": "^3.1", - "topthink/think-helper": "^3.1", - "fakerphp/faker": "^1.23", - "aws/aws-sdk-php": "^3.337", - "league/flysystem": "^1.1", - "league/flysystem-aws-s3-v3": "^1.0", - "topthink/think-throttle": "^2.0", - "phpoffice/phpspreadsheet": "^4.1" - }, - "require-dev": { - "topthink/think-dumper": "^1.0", - "topthink/think-trace": "^1.0", - "mongodb/mongodb": "^1.21" - }, - "autoload": { - "psr-4": { - "app\\": "app", - "database\\": "database" - }, - "psr-0": { - "": "extend/" - } - }, - "config": { - "preferred-install": "dist" - }, - "scripts": { - "post-autoload-dump": [ - "@php think service:discover", - "@php think vendor:publish" - ] - } -} diff --git a/code/composer.lock b/code/composer.lock deleted file mode 100644 index 5324ab2..0000000 --- a/code/composer.lock +++ /dev/null @@ -1,3113 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "b478b1d55a2646f40e59782fcccfd100", - "packages": [ - { - "name": "aws/aws-crt-php", - "version": "v1.2.7", - "source": { - "type": "git", - "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", - "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "AWS SDK Common Runtime Team", - "email": "aws-sdk-common-runtime@amazon.com" - } - ], - "description": "AWS Common Runtime for PHP", - "homepage": "https://github.com/awslabs/aws-crt-php", - "keywords": [ - "amazon", - "aws", - "crt", - "sdk" - ], - "support": { - "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" - }, - "time": "2024-10-18T22:15:13+00:00" - }, - { - "name": "aws/aws-sdk-php", - "version": "3.337.3", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "06dfc8f76423b49aaa181debd25bbdc724c346d6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/06dfc8f76423b49aaa181debd25bbdc724c346d6", - "reference": "06dfc8f76423b49aaa181debd25bbdc724c346d6", - "shasum": "" - }, - "require": { - "aws/aws-crt-php": "^1.2.3", - "ext-json": "*", - "ext-pcre": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "mtdowling/jmespath.php": "^2.6", - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0" - }, - "require-dev": { - "andrewsville/php-token-reflection": "^1.4", - "aws/aws-php-sns-message-validator": "~1.0", - "behat/behat": "~3.0", - "composer/composer": "^1.10.22", - "dms/phpunit-arraysubset-asserts": "^0.4.0", - "doctrine/cache": "~1.4", - "ext-dom": "*", - "ext-openssl": "*", - "ext-pcntl": "*", - "ext-sockets": "*", - "nette/neon": "^2.3", - "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", - "sebastian/comparator": "^1.2.3 || ^4.0", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", - "doctrine/cache": "To use the DoctrineCacheAdapter", - "ext-curl": "To send requests using cURL", - "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", - "ext-sockets": "To use client-side monitoring" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Aws\\": "src/" - }, - "exclude-from-classmap": [ - "src/data/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" - } - ], - "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", - "keywords": [ - "amazon", - "aws", - "cloud", - "dynamodb", - "ec2", - "glacier", - "s3", - "sdk" - ], - "support": { - "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", - "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.337.3" - }, - "time": "2025-01-21T19:10:05+00:00" - }, - { - "name": "composer/pcre", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<1.11.10" - }, - "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" - }, - "type": "library", - "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-11-12T16:29:46+00:00" - }, - { - "name": "fakerphp/faker", - "version": "v1.24.1", - "source": { - "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", - "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "conflict": { - "fzaninotto/faker": "*" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "doctrine/persistence": "^1.3 || ^2.0", - "ext-intl": "*", - "phpunit/phpunit": "^9.5.26", - "symfony/phpunit-bridge": "^5.4.16" - }, - "suggest": { - "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", - "ext-curl": "Required by Faker\\Provider\\Image to download images.", - "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", - "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", - "ext-mbstring": "Required for multibyte Unicode string functionality." - }, - "type": "library", - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" - }, - "time": "2024-11-21T13:46:39+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.9.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.2", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2024-07-24T11:22:20+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2024-10-17T10:06:22+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2024-07-18T11:15:46+00:00" - }, - { - "name": "jaeger/g-http", - "version": "V2.0.1", - "source": { - "type": "git", - "url": "https://github.com/jae-jae/GHttp.git", - "reference": "29cb537c57f230980ca10622de190f04831e35e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jae-jae/GHttp/zipball/29cb537c57f230980ca10622de190f04831e35e6", - "reference": "29cb537c57f230980ca10622de190f04831e35e6", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.0 || ^7.0", - "php": ">=8.1", - "symfony/cache": "^6.4 || ^7.0" - }, - "require-dev": { - "predis/predis": "^2.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Jaeger\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaeger", - "email": "JaegerCode@gmail.com" - } - ], - "description": "Simple Http client base on GuzzleHttp", - "support": { - "issues": "https://github.com/jae-jae/GHttp/issues", - "source": "https://github.com/jae-jae/GHttp/tree/V2.0.1" - }, - "time": "2024-06-14T08:13:32+00:00" - }, - { - "name": "jaeger/phpquery-single", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/jae-jae/phpQuery-single.git", - "reference": "39a650ade692a6b480c22220dce0c198d6a946fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jae-jae/phpQuery-single/zipball/39a650ade692a6b480c22220dce0c198d6a946fb", - "reference": "39a650ade692a6b480c22220dce0c198d6a946fb", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "phpQuery.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobiasz Cudnik", - "email": "tobiasz.cudnik@gmail.com", - "homepage": "https://github.com/TobiaszCudnik", - "role": "Developer" - }, - { - "name": "Jaeger", - "role": "Packager" - } - ], - "description": "phpQuery单文件版本,是Querylist的依赖(http://querylist.cc/),phpQuery项目主页:http://code.google.com/p/phpquery/", - "homepage": "http://code.google.com/p/phpquery/", - "support": { - "issues": "https://github.com/jae-jae/phpQuery-single/issues", - "source": "https://github.com/jae-jae/phpQuery-single/tree/1.1.1" - }, - "time": "2022-03-26T15:01:16+00:00" - }, - { - "name": "jaeger/querylist", - "version": "V4.4.6", - "source": { - "type": "git", - "url": "https://github.com/jae-jae/QueryList.git", - "reference": "939f4e41b94b4d3ef77071fb7f386abd2ceeb59a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jae-jae/QueryList/zipball/939f4e41b94b4d3ef77071fb7f386abd2ceeb59a", - "reference": "939f4e41b94b4d3ef77071fb7f386abd2ceeb59a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "jaeger/g-http": "^2.0", - "jaeger/phpquery-single": "^1", - "php": ">=8.1", - "symfony/var-dumper": ">3.4" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/Collect/Support/helpers.php", - "src/Collect/Support/alias.php" - ], - "psr-4": { - "QL\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaeger", - "email": "JaegerCode@gmail.com" - } - ], - "description": "Simple, elegant, extensible PHP Web Scraper (crawler/spider),Use the css3 dom selector,Based on phpQuery! 简洁、优雅、可扩展的PHP采集工具(爬虫),基于phpQuery。", - "homepage": "http://querylist.cc", - "keywords": [ - "QueryList", - "phpQuery", - "spider" - ], - "support": { - "issues": "https://github.com/jae-jae/QueryList/issues", - "source": "https://github.com/jae-jae/QueryList/tree/V4.4.6" - }, - "funding": [ - { - "url": "https://opencollective.com/querylist", - "type": "open_collective" - } - ], - "time": "2024-12-13T06:16:14+00:00" - }, - { - "name": "league/flysystem", - "version": "1.1.10", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "Cloud Files", - "WebDAV", - "abstraction", - "aws", - "cloud", - "copy.com", - "dropbox", - "file systems", - "files", - "filesystem", - "filesystems", - "ftp", - "rackspace", - "remote", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" - }, - "funding": [ - { - "url": "https://offset.earth/frankdejonge", - "type": "other" - } - ], - "time": "2022-10-04T09:16:37+00:00" - }, - { - "name": "league/flysystem-aws-s3-v3", - "version": "1.0.30", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/af286f291ebab6877bac0c359c6c2cb017eb061d", - "reference": "af286f291ebab6877bac0c359c6c2cb017eb061d", - "shasum": "" - }, - "require": { - "aws/aws-sdk-php": "^3.20.0", - "league/flysystem": "^1.0.40", - "php": ">=5.5.0" - }, - "require-dev": { - "henrikbjorn/phpspec-code-coverage": "~1.0.1", - "phpspec/phpspec": "^2.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\AwsS3v3\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Flysystem adapter for the AWS S3 SDK v3.x", - "support": { - "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.30" - }, - "funding": [ - { - "url": "https://offset.earth/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2022-07-02T13:51:38+00:00" - }, - { - "name": "league/flysystem-cached-adapter", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-cached-adapter.git", - "reference": "7bb5cd9d996904cf43d7da8ba45a724ff8c7ef14" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/7bb5cd9d996904cf43d7da8ba45a724ff8c7ef14", - "reference": "7bb5cd9d996904cf43d7da8ba45a724ff8c7ef14", - "shasum": "" - }, - "require": { - "league/flysystem": "~1.0" - }, - "require-dev": { - "henrikbjorn/phpspec-code-coverage": "~1.0@dev", - "mockery/mockery": "~0.9", - "phpspec/phpspec": "~2.1", - "phpunit/phpunit": "~4.1", - "predis/predis": "~1.0", - "tedivm/stash": "~0.12" - }, - "suggest": { - "ext-phpredis": "Pure C implemented extension for PHP" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\Cached\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "frankdejonge", - "email": "info@frenky.net" - } - ], - "description": "An adapter decorator to enable meta-data caching.", - "support": { - "issues": "https://github.com/thephpleague/flysystem-cached-adapter/issues", - "source": "https://github.com/thephpleague/flysystem-cached-adapter/tree/master" - }, - "time": "2015-07-09T21:00:39+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2024-09-21T08:32:55+00:00" - }, - { - "name": "maennchen/zipstream-php", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", - "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-zlib": "*", - "php-64bit": "^8.2" - }, - "require-dev": { - "brianium/paratest": "^7.7", - "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.16", - "guzzlehttp/guzzle": "^7.5", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^11.0", - "vimeo/psalm": "^6.0" - }, - "suggest": { - "guzzlehttp/psr7": "^2.4", - "psr/http-message": "^2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "ZipStream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paul Duncan", - "email": "pabs@pablotron.org" - }, - { - "name": "Jonatan Männchen", - "email": "jonatan@maennchen.ch" - }, - { - "name": "Jesse Donat", - "email": "donatj@gmail.com" - }, - { - "name": "András Kolesár", - "email": "kolesar@kolesar.hu" - } - ], - "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", - "keywords": [ - "stream", - "zip" - ], - "support": { - "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" - }, - "funding": [ - { - "url": "https://github.com/maennchen", - "type": "github" - } - ], - "time": "2025-01-27T12:07:53+00:00" - }, - { - "name": "markbaker/complex", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", - "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "phpcompatibility/php-compatibility": "^9.3", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Complex\\": "classes/src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@lange.demon.co.uk" - } - ], - "description": "PHP Class for working with complex numbers", - "homepage": "https://github.com/MarkBaker/PHPComplex", - "keywords": [ - "complex", - "mathematics" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" - }, - "time": "2022-12-06T16:21:08+00:00" - }, - { - "name": "markbaker/matrix", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "728434227fe21be27ff6d86621a1b13107a2562c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", - "reference": "728434227fe21be27ff6d86621a1b13107a2562c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-master", - "phpcompatibility/php-compatibility": "^9.3", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Matrix\\": "classes/src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@demon-angel.eu" - } - ], - "description": "PHP Class for working with matrices", - "homepage": "https://github.com/MarkBaker/PHPMatrix", - "keywords": [ - "mathematics", - "matrix", - "vector" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" - }, - "time": "2022-12-02T22:17:43+00:00" - }, - { - "name": "mtdowling/jmespath.php", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-mbstring": "^1.17" - }, - "require-dev": { - "composer/xdebug-handler": "^3.0.3", - "phpunit/phpunit": "^8.5.33" - }, - "bin": [ - "bin/jp.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "files": [ - "src/JmesPath.php" - ], - "psr-4": { - "JmesPath\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Declaratively specify how to extract elements from a JSON document", - "keywords": [ - "json", - "jsonpath" - ], - "support": { - "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" - }, - "time": "2024-09-04T18:46:31+00:00" - }, - { - "name": "phpoffice/phpspreadsheet", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "6ff18c3a8df3a945492f75ce455d77f7ad55dd5c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/6ff18c3a8df3a945492f75ce455d77f7ad55dd5c", - "reference": "6ff18c3a8df3a945492f75ce455d77f7ad55dd5c", - "shasum": "" - }, - "require": { - "composer/pcre": "^1||^2||^3", - "ext-ctype": "*", - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-gd": "*", - "ext-iconv": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "ext-zip": "*", - "ext-zlib": "*", - "maennchen/zipstream-php": "^2.1 || ^3.0", - "markbaker/complex": "^3.0", - "markbaker/matrix": "^3.0", - "php": "^8.1", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "dev-main", - "dompdf/dompdf": "^2.0 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.2", - "mitoteam/jpgraph": "^10.3", - "mpdf/mpdf": "^8.1.1", - "phpcompatibility/php-compatibility": "^9.3", - "phpstan/phpstan": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.7", - "tecnickcom/tcpdf": "^6.5" - }, - "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer", - "ext-intl": "PHP Internationalization Functions", - "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", - "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" - }, - "type": "library", - "autoload": { - "psr-4": { - "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maarten Balliauw", - "homepage": "https://blog.maartenballiauw.be" - }, - { - "name": "Mark Baker", - "homepage": "https://markbakeruk.net" - }, - { - "name": "Franck Lefevre", - "homepage": "https://rootslabs.net" - }, - { - "name": "Erik Tilt" - }, - { - "name": "Adrien Crivelli" - } - ], - "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", - "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", - "keywords": [ - "OpenXML", - "excel", - "gnumeric", - "ods", - "php", - "spreadsheet", - "xls", - "xlsx" - ], - "support": { - "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/4.1.0" - }, - "time": "2025-03-02T06:52:24+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" - }, - "time": "2023-04-04T09:50:52+00:00" - }, - { - "name": "psr/log", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" - }, - "time": "2024-09-11T13:17:53+00:00" - }, - { - "name": "psr/simple-cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", - "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" - }, - "time": "2021-10-29T13:26:27+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "symfony/cache", - "version": "v7.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "d33cd9e14326e14a4145c21e600602eaf17cc9e7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d33cd9e14326e14a4145c21e600602eaf17cc9e7", - "reference": "d33cd9e14326e14a4145c21e600602eaf17cc9e7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/cache": "^2.0|^3.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.4|^7.0" - }, - "conflict": { - "doctrine/dbal": "<3.6", - "symfony/dependency-injection": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/var-dumper": "<6.4" - }, - "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/dbal": "^3.6|^4", - "predis/predis": "^1.1|^2.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/filesystem": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "classmap": [ - "Traits/ValueWrapper.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v7.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-02-26T09:57:54+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v3.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", - "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/cache": "^3.0" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:20:29+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:20:29+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v3.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:20:29+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v7.2.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.12" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-01-17T11:39:41+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v7.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/4ede73aa7a73d81506002d2caadbbdad1ef5b69a", - "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-02-13T10:27:23+00:00" - }, - { - "name": "topthink/framework", - "version": "v8.1.2", - "source": { - "type": "git", - "url": "https://github.com/top-think/framework.git", - "reference": "8faec5c9b7a7f2a66ca3140a57e81bd6cd37567c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/framework/zipball/8faec5c9b7a7f2a66ca3140a57e81bd6cd37567c", - "reference": "8faec5c9b7a7f2a66ca3140a57e81bd6cd37567c", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-mbstring": "*", - "php": ">=8.0.0", - "psr/http-message": "^1.0", - "psr/log": "^1.0|^2.0|^3.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "topthink/think-container": "^3.0", - "topthink/think-helper": "^3.1", - "topthink/think-orm": "^3.0|^4.0", - "topthink/think-validate": "^3.0" - }, - "require-dev": { - "guzzlehttp/psr7": "^2.1.0", - "mikey179/vfsstream": "^1.6", - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "autoload": { - "files": [], - "psr-4": { - "think\\": "src/think/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - }, - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "The ThinkPHP Framework.", - "homepage": "http://thinkphp.cn/", - "keywords": [ - "framework", - "orm", - "thinkphp" - ], - "support": { - "issues": "https://github.com/top-think/framework/issues", - "source": "https://github.com/top-think/framework/tree/v8.1.2" - }, - "time": "2025-01-14T08:04:03+00:00" - }, - { - "name": "topthink/think-container", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-container.git", - "reference": "a24d442a02fb2a4716de232ff1a4f006c178a370" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-container/zipball/a24d442a02fb2a4716de232ff1a4f006c178a370", - "reference": "a24d442a02fb2a4716de232ff1a4f006c178a370", - "shasum": "" - }, - "require": { - "php": ">=8.0", - "psr/container": "^2.0", - "topthink/think-helper": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "autoload": { - "files": [], - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "PHP Container & Facade Manager", - "support": { - "issues": "https://github.com/top-think/think-container/issues", - "source": "https://github.com/top-think/think-container/tree/v3.0.1" - }, - "time": "2025-01-07T08:19:23+00:00" - }, - { - "name": "topthink/think-filesystem", - "version": "v2.0.3", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-filesystem.git", - "reference": "e8e51adb9f3a3f3aac2aa3ef73b7b439100f777d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-filesystem/zipball/e8e51adb9f3a3f3aac2aa3ef73b7b439100f777d", - "reference": "e8e51adb9f3a3f3aac2aa3ef73b7b439100f777d", - "shasum": "" - }, - "require": { - "league/flysystem": "^1.1.4", - "league/flysystem-cached-adapter": "^1.0", - "php": ">=7.2.5", - "topthink/framework": "^6.1|^8.0" - }, - "require-dev": { - "mikey179/vfsstream": "^1.6", - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "The ThinkPHP6.1 Filesystem Package", - "support": { - "issues": "https://github.com/top-think/think-filesystem/issues", - "source": "https://github.com/top-think/think-filesystem/tree/v2.0.3" - }, - "time": "2024-10-16T03:37:24+00:00" - }, - { - "name": "topthink/think-helper", - "version": "v3.1.10", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-helper.git", - "reference": "ac66cc0859a12cd5d73258f50f338aadc95e9b46" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-helper/zipball/ac66cc0859a12cd5d73258f50f338aadc95e9b46", - "reference": "ac66cc0859a12cd5d73258f50f338aadc95e9b46", - "shasum": "" - }, - "require": { - "php": ">=7.1.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/helper.php" - ], - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "The ThinkPHP6 Helper Package", - "support": { - "issues": "https://github.com/top-think/think-helper/issues", - "source": "https://github.com/top-think/think-helper/tree/v3.1.10" - }, - "time": "2024-11-21T01:47:51+00:00" - }, - { - "name": "topthink/think-migration", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-migration.git", - "reference": "22c44058e1454f3af1d346e7f6524fbe654de7fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-migration/zipball/22c44058e1454f3af1d346e7f6524fbe654de7fb", - "reference": "22c44058e1454f3af1d346e7f6524fbe654de7fb", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "topthink/framework": "^6.0 || ^8.0", - "topthink/think-helper": "^3.0.3" - }, - "require-dev": { - "composer/composer": "^2.5.8", - "fzaninotto/faker": "^1.8", - "robmorgan/phinx": "^0.13.4" - }, - "suggest": { - "fzaninotto/faker": "Required to use the factory builder (^1.8)." - }, - "type": "library", - "extra": { - "think": { - "services": [ - "think\\migration\\Service" - ] - } - }, - "autoload": { - "psr-4": { - "Phinx\\": "phinx", - "think\\migration\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "support": { - "issues": "https://github.com/top-think/think-migration/issues", - "source": "https://github.com/top-think/think-migration/tree/v3.1.1" - }, - "time": "2023-09-14T05:51:31+00:00" - }, - { - "name": "topthink/think-multi-app", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-multi-app.git", - "reference": "f93c604d5cfac2b613756273224ee2f88e457b88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/f93c604d5cfac2b613756273224ee2f88e457b88", - "reference": "f93c604d5cfac2b613756273224ee2f88e457b88", - "shasum": "" - }, - "require": { - "php": ">=7.1.0", - "topthink/framework": "^6.0|^8.0" - }, - "type": "library", - "extra": { - "think": { - "services": [ - "think\\app\\Service" - ] - } - }, - "autoload": { - "psr-4": { - "think\\app\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "thinkphp multi app support", - "support": { - "issues": "https://github.com/top-think/think-multi-app/issues", - "source": "https://github.com/top-think/think-multi-app/tree/v1.1.1" - }, - "time": "2024-11-25T08:52:44+00:00" - }, - { - "name": "topthink/think-orm", - "version": "v4.0.3", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-orm.git", - "reference": "0c951d1eb08b48211d31079a616164e195028e44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-orm/zipball/0c951d1eb08b48211d31079a616164e195028e44", - "reference": "0c951d1eb08b48211d31079a616164e195028e44", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pdo": "*", - "php": ">=8.0.0", - "psr/log": ">=1.0", - "psr/simple-cache": ">=1.0", - "topthink/think-helper": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.6|^10" - }, - "suggest": { - "ext-mongodb": "provide mongodb support" - }, - "type": "library", - "autoload": { - "files": [ - "src/helper.php", - "stubs/load_stubs.php" - ], - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "the PHP Database&ORM Framework", - "keywords": [ - "database", - "orm" - ], - "support": { - "issues": "https://github.com/top-think/think-orm/issues", - "source": "https://github.com/top-think/think-orm/tree/v4.0.3" - }, - "time": "2025-02-13T06:09:45+00:00" - }, - { - "name": "topthink/think-template", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-template.git", - "reference": "0b88bd449f0f7626dd75b05f557c8bc208c08b0c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-template/zipball/0b88bd449f0f7626dd75b05f557c8bc208c08b0c", - "reference": "0b88bd449f0f7626dd75b05f557c8bc208c08b0c", - "shasum": "" - }, - "require": { - "php": ">=8.0.0", - "psr/simple-cache": ">=1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "the php template engine", - "support": { - "issues": "https://github.com/top-think/think-template/issues", - "source": "https://github.com/top-think/think-template/tree/v3.0.2" - }, - "time": "2024-10-16T03:41:06+00:00" - }, - { - "name": "topthink/think-throttle", - "version": "v2.0.2", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-throttle.git", - "reference": "99c479adecad951d578e5d1703ce4a05b0ebc800" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-throttle/zipball/99c479adecad951d578e5d1703ce4a05b0ebc800", - "reference": "99c479adecad951d578e5d1703ce4a05b0ebc800", - "shasum": "" - }, - "require": { - "php": ">=8.0.0", - "topthink/framework": "^8.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^7.7", - "phpunit/phpunit": "^9.5", - "topthink/think": "^8.0.0" - }, - "type": "library", - "extra": { - "think": { - "config": { - "throttle": "src/config.php" - } - } - }, - "autoload": { - "psr-4": { - "think\\middleware\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "hongweipeng", - "email": "hongweichen8888@sina.com" - } - ], - "description": "throttle middleware for thinkphp8", - "support": { - "issues": "https://github.com/top-think/think-throttle/issues", - "source": "https://github.com/top-think/think-throttle/tree/v2.0.2" - }, - "time": "2024-04-15T10:33:30+00:00" - }, - { - "name": "topthink/think-validate", - "version": "v3.0.5", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-validate.git", - "reference": "f7dd85675270e9f8c0b04a13362133067629f53c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-validate/zipball/f7dd85675270e9f8c0b04a13362133067629f53c", - "reference": "f7dd85675270e9f8c0b04a13362133067629f53c", - "shasum": "" - }, - "require": { - "php": ">=8.0", - "topthink/think-container": ">=3.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/helper.php" - ], - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "think validate", - "support": { - "issues": "https://github.com/top-think/think-validate/issues", - "source": "https://github.com/top-think/think-validate/tree/v3.0.5" - }, - "time": "2025-03-05T06:11:48+00:00" - }, - { - "name": "topthink/think-view", - "version": "v2.0.4", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-view.git", - "reference": "e6a68e4179baf8d795700d62b710da86d7c3f783" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-view/zipball/e6a68e4179baf8d795700d62b710da86d7c3f783", - "reference": "e6a68e4179baf8d795700d62b710da86d7c3f783", - "shasum": "" - }, - "require": { - "php": ">=8.0.0", - "topthink/think-template": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "think\\view\\driver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "thinkphp template driver", - "support": { - "issues": "https://github.com/top-think/think-view/issues", - "source": "https://github.com/top-think/think-view/tree/v2.0.4" - }, - "time": "2025-01-10T08:49:57+00:00" - } - ], - "packages-dev": [ - { - "name": "mongodb/mongodb", - "version": "1.21.1", - "source": { - "type": "git", - "url": "https://github.com/mongodb/mongo-php-library.git", - "reference": "37bc8df3a67ddf8380704a5ba5dbd00e92ec1f6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/37bc8df3a67ddf8380704a5ba5dbd00e92ec1f6a", - "reference": "37bc8df3a67ddf8380704a5ba5dbd00e92ec1f6a", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0", - "ext-mongodb": "^1.21.0", - "php": "^8.1", - "psr/log": "^1.1.4|^2|^3" - }, - "replace": { - "mongodb/builder": "*" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0", - "phpunit/phpunit": "^10.5.35", - "rector/rector": "^1.2", - "squizlabs/php_codesniffer": "^3.7", - "vimeo/psalm": "6.5.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "MongoDB\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Andreas Braun", - "email": "andreas.braun@mongodb.com" - }, - { - "name": "Jeremy Mikola", - "email": "jmikola@gmail.com" - }, - { - "name": "Jérôme Tamarelle", - "email": "jerome.tamarelle@mongodb.com" - } - ], - "description": "MongoDB driver library", - "homepage": "https://jira.mongodb.org/browse/PHPLIB", - "keywords": [ - "database", - "driver", - "mongodb", - "persistence" - ], - "support": { - "issues": "https://github.com/mongodb/mongo-php-library/issues", - "source": "https://github.com/mongodb/mongo-php-library/tree/1.21.1" - }, - "time": "2025-02-28T17:24:20+00:00" - }, - { - "name": "topthink/think-dumper", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-dumper.git", - "reference": "49e6975cec4ffe7997c05fc902f98f1ab1f54150" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-dumper/zipball/49e6975cec4ffe7997c05fc902f98f1ab1f54150", - "reference": "49e6975cec4ffe7997c05fc902f98f1ab1f54150", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/var-dumper": ">=6.0", - "topthink/framework": "^6.0|^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.4" - }, - "type": "library", - "autoload": { - "files": [ - "src/helper.php" - ], - "psr-4": { - "think\\dumper\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "Dumper extend for thinkphp", - "support": { - "issues": "https://github.com/top-think/think-dumper/issues", - "source": "https://github.com/top-think/think-dumper/tree/v1.0.4" - }, - "time": "2025-01-17T09:41:46+00:00" - }, - { - "name": "topthink/think-trace", - "version": "v1.6", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-trace.git", - "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-trace/zipball/136cd5d97e8bdb780e4b5c1637c588ed7ca3e142", - "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142", - "shasum": "" - }, - "require": { - "php": ">=7.1.0", - "topthink/framework": "^6.0|^8.0" - }, - "type": "library", - "extra": { - "think": { - "config": { - "trace": "src/config.php" - }, - "services": [ - "think\\trace\\Service" - ] - } - }, - "autoload": { - "psr-4": { - "think\\trace\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "liu21st", - "email": "liu21st@gmail.com" - } - ], - "description": "thinkphp debug trace", - "support": { - "issues": "https://github.com/top-think/think-trace/issues", - "source": "https://github.com/top-think/think-trace/tree/v1.6" - }, - "time": "2023-02-07T08:36:32+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=8.0.0" - }, - "platform-dev": {}, - "plugin-api-version": "2.6.0" -} diff --git a/code/config/app.php b/code/config/app.php deleted file mode 100644 index d29d17e..0000000 --- a/code/config/app.php +++ /dev/null @@ -1,47 +0,0 @@ - '', - - // 是否启用路由 - 'with_route' => true, - - // 默认应用 - 'default_app' => 'home', - - // 默认时区 - 'default_timezone' => 'Asia/Shanghai', - - // 应用映射(自动多应用模式有效) - 'app_map' => [ - 'admin' => 'admin' - ], - - - // 域名绑定(自动多应用模式有效) - 'domain_bind' => [ - '*' => 'home', - 'adapi' => 'admin', - 'api' => 'api', - ], - - // 禁止URL访问的应用列表(自动多应用模式有效) - 'deny_app_list' => [ - 'task', - 'model', - 'services', - ], - - // 异常页面的模板文件 - 'exception_tmpl' => app()->getThinkPath() . 'tpl/think_exception.tpl', - - // 错误显示信息,非调试模式有效 - 'error_message' => '页面错误!请稍后再试~', - - // 显示错误信息 - 'show_error_msg' => env('SHOW_ERROR_MSG', false), -]; diff --git a/code/config/cache.php b/code/config/cache.php deleted file mode 100644 index cbec626..0000000 --- a/code/config/cache.php +++ /dev/null @@ -1,50 +0,0 @@ - env('CACHE_DRIVER', 'file'), - - 'cache_time' => env('CACHE_TIME', 60 * 60 * 3), // 缓存时间 3小时 - - // 缓存连接方式配置 - 'stores' => [ - 'file' => [ - // 驱动方式 - 'type' => 'File', - // 缓存保存目录 - 'path' => '', - // 缓存前缀 - 'prefix' => '', - // 缓存有效期 0表示永久缓存 - 'expire' => 0, - // 缓存标签前缀 - 'tag_prefix' => 'tag:', - // 序列化机制 例如 ['serialize', 'unserialize'] - 'serialize' => [], - ], - // 更多的缓存连接 - - // redis缓存 - 'redis' => [ - // 驱动方式 - 'type' => 'redis', - // 服务器地址 - 'host' => env('REDIS_HOST', '127.0.0.1'), - // 端口 - 'port' => env('REDIS_PORT', '6379'), - // 密码 - 'password' => env('REDIS_PASSWORD', ''), - // 缓存前缀 - 'prefix' => env('REDIS_PREFIX', ''), - // 缓存前缀 - 'database' => env('REDIS_DATABASE', 0), - - // 缓存标签前缀 - 'tag_prefix' => '', - ], - ], -]; diff --git a/code/config/console.php b/code/config/console.php deleted file mode 100644 index 10089f1..0000000 --- a/code/config/console.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'task' => 'microserver\ServerConsole', - 'db:manage' => 'db\DatabaseManage', - 'mongo:manage' => 'db\MongoMigrate', - 'novel:manage' => 'db\NovelManage', - ], -]; diff --git a/code/config/cookie.php b/code/config/cookie.php deleted file mode 100644 index d3b3aab..0000000 --- a/code/config/cookie.php +++ /dev/null @@ -1,20 +0,0 @@ - 0, - // cookie 保存路径 - 'path' => '/', - // cookie 有效域名 - 'domain' => '', - // cookie 启用安全传输 - 'secure' => false, - // httponly设置 - 'httponly' => false, - // 是否使用 setcookie - 'setcookie' => true, - // samesite 设置,支持 'strict' 'lax' - 'samesite' => '', -]; diff --git a/code/config/database.php b/code/config/database.php deleted file mode 100644 index b3625ef..0000000 --- a/code/config/database.php +++ /dev/null @@ -1,64 +0,0 @@ - env('DB_DRIVER', 'mysql'), - - // 自定义时间查询规则 - 'time_query_rule' => [], - - // 自动写入时间戳字段 - // true为自动识别类型 false关闭 - // 字符串则明确指定时间字段类型 支持 int timestamp datetime date - 'auto_timestamp' => true, - - // 时间字段取出后的默认时间格式 - 'datetime_format' => 'Y-m-d H:i:s', - - // 时间字段配置 配置格式:create_time,update_time - 'datetime_field' => '', - - // 数据库连接配置信息 - 'connections' => [ - 'mysql' => [ - // 数据库类型 - 'type' => env('DB_TYPE', 'mysql'), - // 服务器地址 - 'hostname' => env('DB_HOST', '127.0.0.1'), - // 数据库名 - 'database' => env('DB_NAME', ''), - // 用户名 - 'username' => env('DB_USER', 'root'), - // 密码 - 'password' => env('DB_PASS', ''), - // 端口 - 'hostport' => env('DB_PORT', '3306'), - // 数据库连接参数 - 'params' => [], - // 数据库编码 - 'charset' => env('DB_CHARSET', 'utf8mb4'), - // 数据库表前缀 - 'prefix' => env('DB_PREFIX', ''), - - // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'deploy' => 0, - // 数据库读写是否分离 主从式有效 - 'rw_separate' => false, - // 读写分离后 主服务器数量 - 'master_num' => 1, - // 指定从服务器序号 - 'slave_no' => '', - // 是否严格检查字段是否存在 - 'fields_strict' => true, - // 是否需要断线重连 - 'break_reconnect' => false, - // 监听SQL - 'trigger_sql' => env('DB_SQL_DEBUG', false), - // 开启字段缓存 - 'fields_cache' => env('DB_FIELD_CACHE', true), - ], - - // 更多的数据库配置信息 - - ], -]; diff --git a/code/config/filesystem.php b/code/config/filesystem.php deleted file mode 100644 index 582a8f8..0000000 --- a/code/config/filesystem.php +++ /dev/null @@ -1,24 +0,0 @@ - 'local', - // 磁盘列表 - 'disks' => [ - 'local' => [ - 'type' => 'local', - 'root' => app()->getRuntimePath() . 'storage', - ], - 'public' => [ - // 磁盘类型 - 'type' => 'local', - // 磁盘路径 - 'root' => app()->getRootPath() . 'public/storage', - // 磁盘路径对应的外部URL路径 - 'url' => '/storage', - // 可见性 - 'visibility' => 'public', - ], - // 更多的磁盘配置信息 - ], -]; diff --git a/code/config/lang.php b/code/config/lang.php deleted file mode 100644 index ccad14a..0000000 --- a/code/config/lang.php +++ /dev/null @@ -1,29 +0,0 @@ - env('DEFAULT_LANG', 'zh-cn'), - // 自动侦测浏览器语言 - 'auto_detect_browser' => true, - // 允许的语言列表 - 'allow_lang_list' => [], - // 多语言自动侦测变量名 - 'detect_var' => 'lang', - // 是否使用Cookie记录 - 'use_cookie' => true, - // 多语言cookie变量 - 'cookie_var' => 'think_lang', - // 多语言header变量 - 'header_var' => 'think-lang', - // 扩展语言包 - 'extend_list' => [], - // Accept-Language转义为对应语言包名称 - 'accept_language' => [ - 'zh-hans-cn' => 'zh-cn', - ], - // 是否支持语言分组 - 'allow_group' => false, -]; diff --git a/code/config/log.php b/code/config/log.php deleted file mode 100644 index 0d406f8..0000000 --- a/code/config/log.php +++ /dev/null @@ -1,45 +0,0 @@ - 'file', - // 日志记录级别 - 'level' => [], - // 日志类型记录的通道 ['error'=>'email',...] - 'type_channel' => [], - // 关闭全局日志写入 - 'close' => false, - // 全局日志处理 支持闭包 - 'processor' => null, - - // 日志通道列表 - 'channels' => [ - 'file' => [ - // 日志记录方式 - 'type' => 'File', - // 日志保存目录 - 'path' => '', - // 单文件日志写入 - 'single' => false, - // 独立日志级别 - 'apart_level' => [], - // 最大日志文件数量 - 'max_files' => 0, - // 使用JSON格式记录 - 'json' => false, - // 日志处理 - 'processor' => null, - // 关闭通道日志写入 - 'close' => false, - // 日志输出格式化 - 'format' => '[%s][%s] %s', - // 是否实时写入 - 'realtime_write' => false, - ], - // 其它日志通道配置 - ], - -]; diff --git a/code/config/middleware.php b/code/config/middleware.php deleted file mode 100644 index 7e1972f..0000000 --- a/code/config/middleware.php +++ /dev/null @@ -1,8 +0,0 @@ - [], - // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行 - 'priority' => [], -]; diff --git a/code/config/mongodb.php b/code/config/mongodb.php deleted file mode 100644 index 12a90f0..0000000 --- a/code/config/mongodb.php +++ /dev/null @@ -1,19 +0,0 @@ - env('MONGO_HOST', '127.0.0.1'), - - // 端口 - 'hostport' => env('MONGO_PORT', '3306'), - - // 用户名 - 'username' => env('MONGO_USER', 'root'), - - // 密码 - 'password' => env('MONGO_PASSWORD', ''), - - // 数据库名 - 'database' => env('MONGO_DB', ''), -]; diff --git a/code/config/proxy.php b/code/config/proxy.php deleted file mode 100644 index 483e797..0000000 --- a/code/config/proxy.php +++ /dev/null @@ -1,12 +0,0 @@ - env('PROXY_STATUS', false), - 'proxy_code' => env('PROXY_CODE', ''), - 'proxy_host' => env('PROXY_HOST', ''), - 'proxy_key' => env('PROXY_KEY', ''), - 'proxy_secret' => env('PROXY_SECRET', ''), -]; diff --git a/code/config/route.php b/code/config/route.php deleted file mode 100644 index 41ba1ed..0000000 --- a/code/config/route.php +++ /dev/null @@ -1,51 +0,0 @@ - '/', - // 是否开启路由延迟解析 - 'url_lazy_route' => false, - // 是否强制使用路由 - 'url_route_must' => false, - // 是否区分大小写 - 'url_case_sensitive' => false, - // 合并路由规则 - 'route_rule_merge' => false, - // 路由是否完全匹配 - 'route_complete_match' => false, - // 去除斜杠 - 'remove_slash' => false, - // 默认的路由变量规则 - 'default_route_pattern' => '[\w\.]+', - // URL伪静态后缀 - 'url_html_suffix' => 'html', - // 访问控制器层名称 - 'controller_layer' => 'controller', - // 空控制器名 - 'empty_controller' => 'Error', - // 是否使用控制器后缀 - 'controller_suffix' => false, - // 默认模块名(开启自动多模块有效) - 'default_module' => 'index', - // 默认控制器名 - 'default_controller' => 'Index', - // 默认操作名 - 'default_action' => 'index', - // 操作方法后缀 - 'action_suffix' => '', - // 非路由变量是否使用普通参数方式(用于URL生成) - 'url_common_param' => true, - // 操作方法的参数绑定方式 route get param - 'action_bind_param' => 'get', - // 请求缓存规则 true为自动规则 - 'request_cache_key' => true, - // 请求缓存有效期 - 'request_cache_expire' => null, - // 全局请求缓存排除规则 - 'request_cache_except' => [], - // 请求缓存的Tag - 'request_cache_tag' => '', -]; diff --git a/code/config/session.php b/code/config/session.php deleted file mode 100644 index c1ef6e1..0000000 --- a/code/config/session.php +++ /dev/null @@ -1,19 +0,0 @@ - 'PHPSESSID', - // SESSION_ID的提交变量,解决flash上传跨域 - 'var_session_id' => '', - // 驱动方式 支持file cache - 'type' => 'file', - // 存储连接标识 当type使用cache的时候有效 - 'store' => null, - // 过期时间 - 'expire' => 1440, - // 前缀 - 'prefix' => '', -]; diff --git a/code/config/storage.php b/code/config/storage.php deleted file mode 100644 index 2b2973c..0000000 --- a/code/config/storage.php +++ /dev/null @@ -1,24 +0,0 @@ - [ - // 端点 - 'endpoint' => env('MINIO_END_POINT', '127.0.0.1:9000'), - // KEY - 'key' => env('MINIO_KEY', ''), - // 密钥 - 'secret' => env('MINIO_SECRET', ''), - // 区域 - 'region' => env('MINIO_REGION', 'us-east-1'), - // 桶 - 'bucket' => env('MINIO_BUCKET', 'my-bucket'), - - ], - 'local' => [ - 'dir' => env('STORAGE_LOCAL_DIR', ''), - ] - -]; diff --git a/code/config/task.php b/code/config/task.php deleted file mode 100644 index 7e45e0b..0000000 --- a/code/config/task.php +++ /dev/null @@ -1,68 +0,0 @@ - [ - 1 => [ - 'name' => env('QUEUE_NAME_1', 'QueueKey01'), // 消费队列名 - 'exec_num' => env('QUEUE_EXEC_NUM_1', 20), // 单进程消费任务数后重启 - ], - 2 => [ - 'name' => env('QUEUE_NAME_2', 'QueueKey02'), - 'exec_num' => env('QUEUE_EXEC_NUM_2', 20), - ] - ], - - - # Server Config - 'service' => [ - /***** 监听SOCK文件 *****/ - - //'host'=>runtime_path().'task.sock', - 'host' => sys_get_temp_dir() . '/task.sock', - 'port' => 0, - 'mode' => SWOOLE_BASE, - 'sockType' => SWOOLE_UNIX_STREAM, - 'server_type' => 'TCP', - /***********************/ - - - 'worker_num' => 1, - 'log_file' => runtime_path() . 'task.log', - 'pid_file' => runtime_path() . 'task.pid', - 'task_worker_num' => 0, - ], - - # Process Pool, NUM 为设置的任务组进程数 , 根据自身服务器情况增减 - 'process_pool' => [ - # 采集任务进程组 队列消费者 - [ - 'Name' => 'Inner Consume', - 'Num' => env('TASK_PROCESS_NUM_01', 4), - 'callback' => [app\task\module\Listen::class, 'innerConsume'], - ], - - # 内部循环任务进程组 优先队列消费者 - [ - 'Name' => 'Inner Consume', - 'Num' => env('TASK_PROCESS_NUM_02', 2), - 'callback' => [app\task\module\Listen::class, 'innerConsume02'], - ], - ], - - # 计划任务 - 'scheduled_tasks_pool' => [ - [ - // 扫描数据表计划任务 - 'status' => true, - 'name' => 'Plan Task ', - 'execution_interval' => 1, - 'callback' => [\app\task\module\PlanTask::class, 'scanPlanTask'], - 'param' => [], - ], - ], -]; diff --git a/code/config/throttle.php b/code/config/throttle.php deleted file mode 100644 index 575662e..0000000 --- a/code/config/throttle.php +++ /dev/null @@ -1,33 +0,0 @@ - 'throttle_', - // 缓存的键,true 表示使用来源ip - 'key' => true, - // 要被限制的请求类型, eg: GET POST PUT DELETE HEAD 等 - 'visit_method' => ['GET', 'HEAD'], - // 设置访问频率,例如 '10/m' 指的是允许每分钟请求10次;'10/60'指允许每60秒请求10次。值 null 表示不限制, eg: null 10/m 20/h 300/d 200/300 - 'visit_rate' => '100/m', - /* - * 设置节流算法,组件提供了四种算法: - * - CounterFixed :计数固定窗口 - * - CounterSlider: 滑动窗口 - * - TokenBucket : 令牌桶算法 - * - LeakyBucket : 漏桶限流算法 - */ - 'driver_name' => CounterFixed::class, - // 响应体中设置速率限制的头部信息 - 'visit_enable_show_rate_limit' => true, - // 访问受限时返回的响应 - 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds) { - return Response::create('Too many requests, try again after ' . $wait_seconds . ' seconds.')->code(429); - }, -]; diff --git a/code/config/trace.php b/code/config/trace.php deleted file mode 100644 index fad2392..0000000 --- a/code/config/trace.php +++ /dev/null @@ -1,10 +0,0 @@ - 'Html', - // 读取的日志通道名 - 'channel' => '', -]; diff --git a/code/config/view.php b/code/config/view.php deleted file mode 100644 index 2bdee2f..0000000 --- a/code/config/view.php +++ /dev/null @@ -1,40 +0,0 @@ - 'Think', - // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 - 'auto_rule' => 1, - // 模板目录名 - 'view_dir_name' => 'view', - // 模板后缀 - 'view_suffix' => 'html', - // 模板文件名分隔符 - 'view_depr' => DIRECTORY_SEPARATOR, - // 允许 PHP 函数调用 - 'tpl_deny_php' => false, - // 模板引擎普通标签开始标记 - 'tpl_begin' => '{', - // 模板引擎普通标签结束标记 - 'tpl_end' => '}', - // 标签库标签开始标记 - 'taglib_begin' => '{', - // 标签库标签结束标记 - 'taglib_end' => '}', - - - // 自定义标签 - 'taglib_pre_load' => '\\template\\taglib\\Ad,\\template\\taglib\\Site,\\template\\taglib\\Rs,\\template\\taglib\\Novel,\\template\\taglib\\Chapter', - - // 模板渲染缓存 - 'display_cache' => env('VIEW_DISPLAY_CACHE', false), - - // 是否开启模板编译缓存,设为false则每次都会重新编译 - 'tpl_cache' => env('VIEW_TPL_CACHE', false), - - //页面数据缓存,实际是控制器数据缓存 - 'view_data_cache' => env('VIEW_DATA_CACHE', false), -]; diff --git a/code/database/migrations/20240717191901_add_gg_pai_xu_colum_on_guang_gao_table.php b/code/database/migrations/20240717191901_add_gg_pai_xu_colum_on_guang_gao_table.php deleted file mode 100644 index 5c7b011..0000000 --- a/code/database/migrations/20240717191901_add_gg_pai_xu_colum_on_guang_gao_table.php +++ /dev/null @@ -1,20 +0,0 @@ -table('guang_gao'); - - // $Table->addColumn('gg_sort', 'integer', ['after' => 'gg_tiao_zhuan_di_zhi'])->setComment("排序")->save(); - } - - public function down() - { - // $Table = $this->table('guang_gao'); - // $Table->removeColumn('gg_sort')->save(); - } -} diff --git a/code/database/mongo/migrations/category.php b/code/database/mongo/migrations/category.php deleted file mode 100644 index ed64e88..0000000 --- a/code/database/mongo/migrations/category.php +++ /dev/null @@ -1,10 +0,0 @@ - 'category', - 'indexes' => [ - [ - 'key' => ['ca_name' => 1], - 'options' => ['unique' => true] - ], - ] -]; diff --git a/code/database/mongo/migrations/chapter.php b/code/database/mongo/migrations/chapter.php deleted file mode 100644 index 7eb1d0e..0000000 --- a/code/database/mongo/migrations/chapter.php +++ /dev/null @@ -1,23 +0,0 @@ - 'chapter', - 'indexes' => [ - [ - 'key' => ['c_source_uuid' => 1], - 'options' => ['unique' => true] - ], - - [ - 'key' => ['n_id' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['c_sort_num' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['c_page' => 1], - 'options' => ['unique' => false] - ], - ] -]; diff --git a/code/database/mongo/migrations/config_subject_fomart.php b/code/database/mongo/migrations/config_subject_fomart.php deleted file mode 100644 index 2277de8..0000000 --- a/code/database/mongo/migrations/config_subject_fomart.php +++ /dev/null @@ -1,10 +0,0 @@ - 'config_subject_fomart', - 'indexes' => [ - [ - 'key' => ['csf_key' => 1], - 'options' => ['unique' => true] - ], - ] -]; diff --git a/code/database/mongo/migrations/gan_rao_ma.php b/code/database/mongo/migrations/gan_rao_ma.php deleted file mode 100644 index f8daf59..0000000 --- a/code/database/mongo/migrations/gan_rao_ma.php +++ /dev/null @@ -1,10 +0,0 @@ - 'gan_rao_ma', - 'indexes' => [ - [ - 'key' => ['grm_domain' => 1, 'grm_page_code' => 1, 'grm_page_diff' => 1], - 'options' => ['unique' => true] - ], - ] -]; diff --git a/code/database/mongo/migrations/novel.php b/code/database/mongo/migrations/novel.php deleted file mode 100644 index ae80f92..0000000 --- a/code/database/mongo/migrations/novel.php +++ /dev/null @@ -1,50 +0,0 @@ - 'novel', - 'indexes' => [ - [ - 'key' => ['n_id' => 1], - 'options' => ['unique' => true] - ], - [ - 'key' => ['n_name' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_author' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_description' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_category' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_category_sex_en' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_status' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_source_uuid' => 1], - 'options' => ['unique' => true] - ], - [ - 'key' => ['n_related_novel.n_id' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_forge_novel.n_forge_id' => 1], - 'options' => ['unique' => false] - ], - [ - 'key' => ['n_have_chapter' => 1], - 'options' => ['unique' => false] - ], - ] -]; diff --git a/code/database/mongo/migrations/novel_clicks.php b/code/database/mongo/migrations/novel_clicks.php deleted file mode 100644 index 66665a7..0000000 --- a/code/database/mongo/migrations/novel_clicks.php +++ /dev/null @@ -1,10 +0,0 @@ - 'novel_clicks', - 'indexes' => [ - [ - 'key' => ['n_id' => 1, 'nc_date' => 1, 'nc_type' => 1], - 'options' => ['unique' => true] - ], - ] -]; diff --git a/code/database/schema/mysql-schema.dump b/code/database/schema/mysql-schema.dump deleted file mode 100644 index 4d712f0..0000000 --- a/code/database/schema/mysql-schema.dump +++ /dev/null @@ -1,274 +0,0 @@ --- MySQL dump 10.13 Distrib 8.0.41, for Linux (x86_64) --- --- Host: 127.0.0.1 Database: seo --- ------------------------------------------------------ --- Server version 8.0.41 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `admin_user` --- - -DROP TABLE IF EXISTS `admin_user`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `admin_user` ( - `au_id` int unsigned NOT NULL AUTO_INCREMENT, - `au_status` tinyint DEFAULT '0', - `au_name` varchar(255) DEFAULT NULL, - `au_pwd` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `deleted_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`au_id`), - UNIQUE KEY `au_name` (`au_name`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `cai_ji_pei_zhi` --- - -DROP TABLE IF EXISTS `cai_ji_pei_zhi`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `cai_ji_pei_zhi` ( - `cjpz_id` int unsigned NOT NULL AUTO_INCREMENT, - `cjpz_code` varchar(255) DEFAULT NULL, - `cjpz_val` text, - `cjpz_description` varchar(255) DEFAULT NULL, - PRIMARY KEY (`cjpz_id`), - KEY `cjpz_code` (`cjpz_code`) -) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `domain` --- - -DROP TABLE IF EXISTS `domain`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `domain` ( - `d_id` int NOT NULL AUTO_INCREMENT COMMENT '域名ID', - `d_domain` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '域名', - `t_id` int DEFAULT NULL COMMENT '模板ID', - `d_name` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '站点名', - `d_keywords` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '站点关键词', - `d_description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '站点描述', - `d_index_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '首页title模板', - `d_index_keywords` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '首页keywords模板', - `d_index_description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '首页description模板', - `d_statis` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '单域名统计', - `d_logo_type` tinyint(1) DEFAULT NULL, - `d_text_logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `d_img_logo` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `d_content_encode` tinyint unsigned DEFAULT '0', - `t_cfg` json DEFAULT NULL, - `info_id` int DEFAULT '0' COMMENT '详情id', - PRIMARY KEY (`d_id`), - UNIQUE KEY `d_domain` (`d_domain`) USING BTREE, - KEY `t_id` (`t_id`) -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='域名表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `guang_gao` --- - -DROP TABLE IF EXISTS `guang_gao`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `guang_gao` ( - `gg_id` int unsigned NOT NULL AUTO_INCREMENT, - `ggfz_id` int DEFAULT NULL, - `gg_lei_xing` tinyint DEFAULT NULL, - `gg_tu_pian` varchar(500) DEFAULT NULL, - `gg_wen_zi` varchar(500) DEFAULT NULL, - `gg_tiao_zhuan_di_zhi` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, - `gg_status` int DEFAULT '0', - `gg_sort` int DEFAULT NULL, - `site_id` int DEFAULT '1' COMMENT '站点ID', - PRIMARY KEY (`gg_id`), - KEY `ggfz_id` (`ggfz_id`), - KEY `site_id` (`site_id`) -) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `guang_gao_fen_zu` --- - -DROP TABLE IF EXISTS `guang_gao_fen_zu`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `guang_gao_fen_zu` ( - `ggfz_id` int unsigned NOT NULL AUTO_INCREMENT, - `ggfz_code` varchar(255) DEFAULT NULL, - `ggfz_name` varchar(255) DEFAULT NULL, - `site_id` int DEFAULT '1' COMMENT '站点ID', - PRIMARY KEY (`ggfz_id`), - UNIQUE KEY `ggfz_code` (`ggfz_code`) USING BTREE, - KEY `site_id` (`site_id`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `guang_gao_pei_zhi` --- - -DROP TABLE IF EXISTS `guang_gao_pei_zhi`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `guang_gao_pei_zhi` ( - `ggpz_id` int unsigned NOT NULL AUTO_INCREMENT, - `ggpz_code` varchar(255) DEFAULT NULL, - `ggpz_val` text, - `ggpz_description` varchar(255) DEFAULT NULL, - `site_id` int DEFAULT '1' COMMENT '站点ID', - PRIMARY KEY (`ggpz_id`), - KEY `ggpz_code` (`ggpz_code`), - KEY `site_id` (`site_id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `migrations` --- - -DROP TABLE IF EXISTS `migrations`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `migrations` ( - `version` bigint NOT NULL, - `migration_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `start_time` timestamp NULL DEFAULT NULL, - `end_time` timestamp NULL DEFAULT NULL, - `breakpoint` tinyint(1) NOT NULL DEFAULT '0', - PRIMARY KEY (`version`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `plan_task` --- - -DROP TABLE IF EXISTS `plan_task`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `plan_task` ( - `pt_id` int unsigned NOT NULL AUTO_INCREMENT, - `pt_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '', - `pt_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '', - `pt_enable` tinyint unsigned NOT NULL DEFAULT '1', - `pt_limit` int unsigned NOT NULL DEFAULT '0', - `pt_last_exec` int unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`pt_id`) USING BTREE, - KEY `pt_code` (`pt_code`) USING BTREE, - KEY `pt_enable` (`pt_enable`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `subject_fomart` --- - -DROP TABLE IF EXISTS `subject_fomart`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `subject_fomart` ( - `sf_id` int unsigned NOT NULL AUTO_INCREMENT, - `sfg_id` int DEFAULT NULL COMMENT '所属格式化分组ID', - `sf_val` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '待格式化内容', - PRIMARY KEY (`sf_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=2468 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `subject_fomart_group` --- - -DROP TABLE IF EXISTS `subject_fomart_group`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `subject_fomart_group` ( - `sfg_id` int unsigned NOT NULL AUTO_INCREMENT, - `sfg_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sfg_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - PRIMARY KEY (`sfg_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `system_config` --- - -DROP TABLE IF EXISTS `system_config`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_config` ( - `sc_id` int unsigned NOT NULL AUTO_INCREMENT, - `sc_code` varchar(255) DEFAULT NULL, - `sc_val` text, - `sc_description` text, - `site_id` int DEFAULT '1' COMMENT '站点ID', - PRIMARY KEY (`sc_id`), - KEY `site_id` (`site_id`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `templates` --- - -DROP TABLE IF EXISTS `templates`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `templates` ( - `t_id` int NOT NULL AUTO_INCREMENT COMMENT '视图模板ID', - `t_default` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否默认模板', - `t_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '模板编码', - `t_path` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '模板位置', - `t_cfg_template` json DEFAULT NULL COMMENT '模板需要配置的变量', - PRIMARY KEY (`t_id`), - KEY `t_code` (`t_code`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='模板表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `zi_yuan_duan_dian` --- - -DROP TABLE IF EXISTS `zi_yuan_duan_dian`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `zi_yuan_duan_dian` ( - `zydd_id` int unsigned NOT NULL AUTO_INCREMENT, - `zydd_ming_zi` varchar(255) DEFAULT NULL, - `zydd_code` varchar(255) DEFAULT NULL, - `zydd_domain` varchar(255) DEFAULT NULL, - PRIMARY KEY (`zydd_id`), - KEY `zydd_code` (`zydd_code`) -) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2025-04-21 15:51:05 diff --git a/code/database/seeders/AdminUserSeeder.php b/code/database/seeders/AdminUserSeeder.php deleted file mode 100644 index eabe3ef..0000000 --- a/code/database/seeders/AdminUserSeeder.php +++ /dev/null @@ -1,20 +0,0 @@ -find(); - - if (empty($AdminUserModel)) { - AdminUserModel::insert([ - 'au_name' => 'admin', - 'au_pwd' => md5('qq123123'), - ]); - } - } -} diff --git a/code/database/seeders/PlanTaskSeeder.php b/code/database/seeders/PlanTaskSeeder.php deleted file mode 100644 index 666f9d8..0000000 --- a/code/database/seeders/PlanTaskSeeder.php +++ /dev/null @@ -1,65 +0,0 @@ - '630小说全量扫描', - 'pt_code' => 'PULL_630_ZW_NOVEL', - 'pt_enable' => 0, - 'pt_limit' => 10 * 24 * 3600 * 3, - ], - [ - 'pt_name' => '630小说每日增量', - 'pt_code' => 'PULL_630_ZW_NOVEL_LATEST', - 'pt_enable' => 0, - 'pt_limit' => 1 * 24 * 3600, - ], - - - - [ - 'pt_name' => '74小说全量扫描', - 'pt_code' => 'PULL_74_ZW_NOVEL', - 'pt_enable' => 0, - 'pt_limit' => 10 * 24 * 3600 * 3, - ], - [ - 'pt_name' => '74小说每日增量', - 'pt_code' => 'PULL_74_ZW_NOVEL_LATEST', - 'pt_enable' => 0, - 'pt_limit' => 1 * 24 * 3600, - ], - - - [ - 'pt_name' => '优质资源库全量采集', - 'pt_code' => 'PULL_YOU_ZHI_SHI_PIN', - 'pt_enable' => 0, - 'pt_limit' => 1 * 24 * 3600, - ], - ]; - - foreach ($arrDataNovel as $arrPlanTask) { - $NovelOnePlanTaskModel = PlanTaskModel::where('pt_code', $arrPlanTask['pt_code'])->find(); - - if (empty($NovelOnePlanTaskModel)) { - PlanTaskModel::insert($arrPlanTask); - } - } - } -} diff --git a/code/database/seeders/SeedManager.php b/code/database/seeders/SeedManager.php deleted file mode 100644 index 71cb80d..0000000 --- a/code/database/seeders/SeedManager.php +++ /dev/null @@ -1,15 +0,0 @@ - 'YOU_XIANG', - 'sc_val' => 'TEST@USA.COM', - 'sc_description' => '邮箱', - ], - [ - 'sc_code' => 'LIAN_XI_FANG_SHI', - 'sc_val' => '@111111', - 'sc_description' => '联系方式', - ], - [ - 'sc_code' => 'STATIC_FILE_VERSION', - 'sc_val' => time(), - 'sc_description' => '静态文件版本号', - ], - [ - 'sc_code' => 'SHARE_DOMAIN', - 'sc_val' => "https://share.com", - 'sc_description' => '分享域名', - ], - [ - 'sc_code' => 'PUSH_API_DOMAIN', - 'sc_val' => "api.test.com", - 'sc_description' => 'api', - ], - [ - 'sc_code' => 'PUBLIC_TONGJI_CODE', - 'sc_val' => "", - 'sc_description' => '全局刚刚统计代码', - ], - - ]; - - foreach ($arrData as $arrSystemConfig) { - $SystemConfigModel = SystemConfigModel::where('sc_code', $arrSystemConfig['sc_code'])->find(); - - if (empty($SystemConfigModel)) { - SystemConfigModel::insert($arrSystemConfig); - } - } - - SystemConfigModel::flushCache(); - - - $arrCaiJiPeiZhiData = [ - - [ - 'cjpz_code' => 'AILISI_DOMAIN', - 'cjpz_val' => 'https://www.123yqw.com', - 'cjpz_description' => '123小说主站域名', - ], - [ - 'cjpz_code' => 'AILISI_COOKIE', - 'cjpz_val' => 'fontFamily=null; fontColor=null; fontSize=null; bg=null; HstCfa4825157=1719515765978; HstCmu4825157=1719515765978; HstCnv4825157=1; __dtsu=104017181364393C07A241A233B7F357; lf_reader_num_33724=2; lf_reader_num_32663=7; PHPSESSID=rd7eervf3m5hsq6629va4ki0l6; lf_user_auth=think%3A%7B%22uid%22%3A%2263234%22%2C%22username%22%3A%22fuckusa%22%7D; lf_user_auth_sign=a72a7c954fed581c73cddc462847ff817c282a85; lf_user_recommend=1719516174; reader_config_web=0%7C18%7C1%7C0%7C1; lf_read_log=think%3A%7B%2232162%22%3A%2233724%257C5339f996a809d%257C1719515981%22%2C%2231743%22%3A%2232663%257C5d31940dbd7b3%257C1719516204%22%2C%2232083%22%3A%2233098%257Cf826dc7bf1eba%257C1719516318%22%2C%2230460%22%3A%2231268%257Ce18a0ef2441a3%257C1719516591%22%7D; lf___forward__=%2F; HstCns4825157=2; HstCla4825157=1719517404420; HstPn4825157=26; HstPt4825157=26', - 'cjpz_description' => '小说主站登录COOKIE', - ], - [ - 'cjpz_code' => 'TIANLAI_DOMAIN', - 'cjpz_val' => 'https://www.tzkczc.com', - 'cjpz_description' => '天籁小说主站域名', - ], - [ - 'cjpz_code' => 'TIANLAI_COOKIE', - 'cjpz_val' => 'fontFamily=null; fontColor=null; fontSize=null; bg=null; HstCfa4825157=1719515765978; HstCmu4825157=1719515765978; HstCnv4825157=1; __dtsu=104017181364393C07A241A233B7F357; lf_reader_num_33724=2; lf_reader_num_32663=7; PHPSESSID=rd7eervf3m5hsq6629va4ki0l6; lf_user_auth=think%3A%7B%22uid%22%3A%2263234%22%2C%22username%22%3A%22fuckusa%22%7D; lf_user_auth_sign=a72a7c954fed581c73cddc462847ff817c282a85; lf_user_recommend=1719516174; reader_config_web=0%7C18%7C1%7C0%7C1; lf_read_log=think%3A%7B%2232162%22%3A%2233724%257C5339f996a809d%257C1719515981%22%2C%2231743%22%3A%2232663%257C5d31940dbd7b3%257C1719516204%22%2C%2232083%22%3A%2233098%257Cf826dc7bf1eba%257C1719516318%22%2C%2230460%22%3A%2231268%257Ce18a0ef2441a3%257C1719516591%22%7D; lf___forward__=%2F; HstCns4825157=2; HstCla4825157=1719517404420; HstPn4825157=26; HstPt4825157=26', - 'cjpz_description' => '天籁小说主站登录COOKIE', - ], - [ - 'cjpz_code' => 'BIQUXS_DOMAIN', - 'cjpz_val' => 'http://www.biquxs.com', - 'cjpz_description' => '笔趣阁biquxs小说主站域名', - ], - [ - 'cjpz_code' => '5CCC_DOMAIN', - 'cjpz_val' => 'https://www.5ccc.org', - 'cjpz_description' => '笔趣阁5ccc小说主站域名', - ], - [ - 'cjpz_code' => '630zw_DOMAIN', - 'cjpz_val' => 'https://630zw.org', - 'cjpz_description' => '笔趣阁630zw.org小说主站域名', - ], - [ - 'cjpz_code' => 'HEIMUER_DOMAIN', - 'cjpz_val' => 'https://json02.heimuer.xyz', - 'cjpz_description' => '黑木耳资源主站域名', - ], - [ - 'cjpz_code' => 'YZZY_DOMAIN', - 'cjpz_val' => 'https://1080zyk1.com', - 'cjpz_description' => '优质资源主站域名', - ] - ]; - - foreach ($arrCaiJiPeiZhiData as $arrCaiJiPeiZhi) { - $CaiJiPeiZhiModel = CaiJiPeiZhiModel::where('cjpz_code', $arrCaiJiPeiZhi['cjpz_code'])->find(); - - if (empty($CaiJiPeiZhiModel)) { - CaiJiPeiZhiModel::insert($arrCaiJiPeiZhi); - } - } - - CaiJiPeiZhiModel::flushCache(); - - } -} diff --git a/code/database/seeders/TemplateSeeder.php b/code/database/seeders/TemplateSeeder.php deleted file mode 100644 index f478254..0000000 --- a/code/database/seeders/TemplateSeeder.php +++ /dev/null @@ -1,540 +0,0 @@ - [ - 'description' => '首页Title 模板分组', - 'sfg_id' => 1, - 'arrSubjectFomart' => [ - '{strIndexTitle}', - ] - ], - 'INDEX@INDEX@KEYWORDS' => [ - 'description' => '首页Keywords 模板分组', - 'sfg_id' => 2, - 'arrSubjectFomart' => [ - '{strIndexKeywords}', - ] - ], - 'INDEX@INDEX@DESCRIPTION' => [ - 'description' => '首页Description 模板分组', - 'sfg_id' => 3, - 'arrSubjectFomart' => [ - '{strIndexDescription}', - ] - ], - - 'NOVEL@GETLIBRARY@TITLE' => [ - 'description' => '分类书库Title 模板分组', - 'sfg_id' => 4, - 'arrSubjectFomart' => [ - '{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说 - {strSiteName} - 第{intPage}页', - ] - ], - 'NOVEL@GETLIBRARY@KEYWORDS' => [ - 'description' => '分类书库Keywords 模板分组', - 'sfg_id' => 5, - 'arrSubjectFomart' => [ - '{strNovelCategoryName}小说, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费小说, 在线阅读', - ] - ], - 'NOVEL@GETLIBRARY@DESCRIPTION' => [ - 'description' => '分类书库Description 模板分组', - 'sfg_id' => 6, - 'arrSubjectFomart' => [ - '{strSiteName}提供{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说免费在线阅读,第{intPage}页精选热门作品,畅享{strSiteDomain}!', - ] - ], - - 'NOVEL@GETNOVELCHANNEL@TITLE' => [ - 'description' => '男女生Title 模板分组', - 'sfg_id' => 7, - 'arrSubjectFomart' => [ - '{strNovelSex}小说 - {strSiteName} - 免费阅读 - 第{intPage}页', - ] - ], - 'NOVEL@GETNOVELCHANNEL@KEYWORDS' => [ - 'description' => '男女生Keywords 模板分组', - 'sfg_id' => 8, - 'arrSubjectFomart' => [ - '{strNovelSex}小说 - {strSiteKeywords} - 免费阅读 - 第{intPage}页', - ] - ], - 'NOVEL@GETNOVELCHANNEL@DESCRIPTION' => [ - 'description' => '男女生Description 模板分组', - 'sfg_id' => 9, - 'arrSubjectFomart' => [ - '{strNovelSex}小说 - {strSiteName} - 免费阅读 - 第{intPage}页', - ] - ], - - 'NOVEL@GETNOVELINFO@TITLE' => [ - 'description' => '详情Title 模板分组', - 'sfg_id' => 10, - 'arrSubjectFomart' => [ - '{strNovelName} - {strNovelAuthor}- {strNovelCategoryName} - 免费在线阅读 - {strSiteName}', - ] - - ], - 'NOVEL@GETNOVELINFO@KEYWORDS' => [ - 'description' => '详情Keywords 模板分组', - 'sfg_id' => 11, - 'arrSubjectFomart' => [ - '{strNovelName}, {strNovelAuthor}, {strNovelCategoryName}, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费阅读', - ] - ], - 'NOVEL@GETNOVELINFO@DESCRIPTION' => [ - 'description' => '详情Description 模板分组', - 'sfg_id' => 12, - 'arrSubjectFomart' => [ - '{strSiteName}提供{strNovelName}免费在线阅读,{strNovelAuthor}创作的{strNovelCategoryName}{strNovelStatus}小说,{strNovelDescription},欢迎体验{strSiteDomain}!', - ] - ], - - 'NOVEL@GETNOVELCATALOG@TITLE' => [ - 'description' => '目录Title 模板分组', - 'sfg_id' => 13, - 'arrSubjectFomart' => [ - '{strNovelName}章节目录 - {strNovelAuthor} - 免费查看 - {strSiteName} 第{intPage}页', - ] - ], - 'NOVEL@GETNOVELCATALOG@KEYWORDS' => [ - 'description' => '目录Keywords 模板分组', - 'sfg_id' => 14, - 'arrSubjectFomart' => [ - '{strNovelName}, 章节目录, {strNovelAuthor}, {strNovelCategoryName}, 免费阅读,{strNovelSex}小说, {strSiteKeywords}, {strSiteName}', - ] - ], - 'NOVEL@GETNOVELCATALOG@DESCRIPTION' => [ - 'description' => '目录Description 模板分组', - 'sfg_id' => 15, - 'arrSubjectFomart' => [ - '{strSiteName}提供{strNovelName}章节目录免费查看,第{intPage}页包含最新{strNovelStatus}章节,{strNovelAuthor}创作,畅享{strSiteDomain}!', - ] - ], - - 'NOVEL@GETNOVELCHAPTER@TITLE' => [ - 'description' => '内容Title 模板分组', - 'sfg_id' => 16, - 'arrSubjectFomart' => [ - '{strNovelName} {strNovelChapterName} - {strNovelAuthor} - 免费阅读 - {strSiteName}', - ] - ], - 'NOVEL@GETNOVELCHAPTER@KEYWORDS' => [ - 'description' => '内容Keywords 模板分组', - 'sfg_id' => 17, - 'arrSubjectFomart' => [ - '{strNovelName}, {strNovelChapterName}, {strNovelAuthor}, {strSiteKeywords}, 免费阅读, {strSiteName}', - ] - ], - 'NOVEL@GETNOVELCHAPTER@DESCRIPTION' => [ - 'description' => '内容Description 模板分组', - 'sfg_id' => 18, - 'arrSubjectFomart' => [ - '{strNovelName}{strNovelChapterName}免费在线阅读,{strNovelAuthor}著。{strChapterDescription},快来{strSiteName}畅读精彩章节!', - ] - ], - - 'NOVEL@GETNOVELRANK@TITLE' => [ - 'description' => '排行榜Title 模板分组', - 'sfg_id' => 19, - 'arrSubjectFomart' => [ - '小说排行榜 - {strSiteName} - 第{intPage}页', - ] - ], - 'NOVEL@GETNOVELRANK@KEYWORDS' => [ - 'description' => '排行榜Keywords 模板分组', - 'sfg_id' => 20, - 'arrSubjectFomart' => [ - '小说排行榜, 热门小说, 小说推荐, {strSiteKeywords}, {strSiteName}, 免费阅读', - ] - ], - 'NOVEL@GETNOVELRANK@DESCRIPTION' => [ - 'description' => '排行榜Description 模板分组', - 'sfg_id' => 21, - 'arrSubjectFomart' => [ - '{strSiteName}提供小说排行榜,第{intPage}页精选热门小说免费阅读,最新排行一览无余,畅享{strSiteDomain}!', - ] - ], - - 'NOVEL@GETSEARCHNOVEL@TITLE' => [ - 'description' => '搜索页Title 模板分组', - 'sfg_id' => 22, - 'arrSubjectFomart' => [ - '{strSearchKeywords} - {strSiteName}搜索 - 第{intPage}页', - ] - ], - 'NOVEL@GETSEARCHNOVEL@KEYWORDS' => [ - 'description' => '搜索页Keywords 模板分组', - 'sfg_id' => 23, - 'arrSubjectFomart' => [ - '{strSearchKeywords}, {strSiteName}, 免费阅读, 在线搜索, 第{intPage}页', - ] - ], - 'NOVEL@GETSEARCHNOVEL@DESCRIPTION' => [ - 'description' => '搜索页Description 模板分组', - 'sfg_id' => 24, - 'arrSubjectFomart' => [ - '{strSearchKeywords}搜索结果尽在{strSiteName},第{intPage}页提供免费阅读,访问{strSiteDomain}立即体验!', - ] - ], - - // URL - 'CATEGORY_INFO_URL' => [ - 'description' => '分类书库URL 模板1', - 'sfg_id' => 25, - 'arrSubjectFomart' => [ - '/shuku/{strGender}/{strCategory}/{strStatus}/{strOrder}/page{intPage}', - ] - ], - 'NAN_SHENG_URL' => [ - 'description' => '男生URL 模板1', - 'sfg_id' => 26, - 'arrSubjectFomart' => [ - '/nansheng-xiaoshuo', - ] - ], - 'NV_SHENG_URL' => [ - 'description' => '女生URL 模板1', - 'sfg_id' => 27, - 'arrSubjectFomart' => [ - '/nvsheng-xiaoshuo', - ] - ], - 'RANK_INFO_URL' => [ - 'description' => '排行榜URL 模板1', - 'sfg_id' => 28, - 'arrSubjectFomart' => [ - '/paihang/all', - ] - ], - 'NOVEL_INFO_URL' => [ - 'description' => '小说详情URL 模板1', - 'sfg_id' => 29, - 'arrSubjectFomart' => [ - '/xiaoshuo/{strPinYin}-{intNId}', - ] - ], - 'KAN_NOVEL_INFO_URL' => [ - 'description' => 'kan小说详情URL 模板1', - 'sfg_id' => 30, - 'arrSubjectFomart' => [ - '/kan-xiaoshuo/{strPinYin}-{intNId}-{intNForgeId}', - ] - ], - 'NOVEL_CATALOG_URL' => [ - 'description' => '小说目录URL 模板1', - 'sfg_id' => 31, - 'arrSubjectFomart' => [ - '/xiaoshuo/{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}', - ] - ], - 'CONTENT_INFO_URL' => [ - 'description' => '内容章节URL 模板1', - 'sfg_id' => 32, - 'arrSubjectFomart' => [ - '/xiaoshuo/{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - ] - ], - 'NEWS_CONTENT_INFO_URL' => [ - 'description' => '最新章节特殊页URL 模板1', - 'sfg_id' => 33, - 'arrSubjectFomart' => [ - '/xiaoshuo/{strPinYin}-{intNId}/chapter/latest', - ] - ], - 'SEARCH_INFO_URL' => [ - 'description' => '搜索页URL 模板1', - 'sfg_id' => 34, - 'arrSubjectFomart' => [ - '/search.html?keyword={strSearchKeywords}&page={intPage}', - ] - ], - 'HISTORY_INFO_URL' => [ - 'description' => '历史记录URL 模板1', - 'sfg_id' => 89, - 'arrSubjectFomart' => [ - '/history', - ] - ], - 'SHUJIA_INFO_URL' => [ - 'description' => '书架URL 模板1', - 'sfg_id' => 90, - 'arrSubjectFomart' => [ - '/bookshelf', - ] - ], - 'USER_INFO_URL' => [ - 'description' => '用户中心URL 模板1', - 'sfg_id' => 91, - 'arrSubjectFomart' => [ - '/user', - ] - ], - 'PC_URL_PATH' => [ - 'description' => 'pc端URL目录 模板', - 'sfg_id' => 107, - 'arrSubjectFomart' => ['/pc', '/web', '/desktop', '/index', '/shouye', '/zhuomian'] - ], - 'CATEGORY_INDEX_URL' => [ - 'description' => '书库首页URL 模板1', - 'sfg_id' => 108, - 'arrSubjectFomart' => ['/shuku/index',] - ], - 'SEARCH_INDEX_URL' => [ - 'description' => '搜索首页URL 模板1', - 'sfg_id' => 114, - 'arrSubjectFomart' => [ - '/search.html', - ] - ], - - - // SEO 丰富内容 - 'INDEX_POPULAR_NOVELS' => [ - 'description' => '首页热门小说介绍 模板分组', - 'sfg_id' => 35, - 'arrSubjectFomart' => [ - '精选全网热评佳作,涵盖玄幻冒险、都市传奇、穿越重生等多种类型,带你领略最受欢迎的阅读热潮,快来发现你的下一本心动之作!', - ] - ], - 'INDEX_NEWS_NOVELS' => [ - 'description' => '首页最新小说介绍 模板分组', - 'sfg_id' => 37, - 'arrSubjectFomart' => [ - '每日更新最新章节,囊括玄幻修真、都市爽文、重生逆袭等热门题材,紧跟作者步伐,第一时间畅读新鲜故事!', - ] - ], - 'INDEX_RANK_NOVELS' => [ - 'description' => '首页小说排行榜介绍 模板分组', - 'sfg_id' => 38, - 'arrSubjectFomart' => [ - '汇聚读者最爱的小说排行,日榜、周榜、月榜一网打尽,玄幻巅峰、都市热血、完结经典全都有,助你快速找到高人气好书!', - ] - ], - - // 最新替换模板分组id 119 - ]; - - - /** - * 视图模板 数据播种 - */ - $arrTemplateData = [ - [ - 't_id' => 1, - 't_default' => 1, - 't_code' => 'default', - 't_path' => '/app/home/view/default/', - 't_cfg_template' => $arrSubjectFomartGroupData, - ], - [ - 't_id' => 2, - 't_default' => 0, - 't_code' => 'kuangYu', - 't_path' => '/app/home/view/kuangYu/', - 't_cfg_template' => $arrSubjectFomartGroupData, - ], - // [ - // 't_id' => 3, - // 't_default' => 0, - // 't_code' => 'haoZi', - // 't_path' => '/app/home/view/haoZi/', - // ], - // [ - // 't_id' => 4, - // 't_default' => 0, - // 't_code' => 'xiongMao', - // 't_path' => '/app/home/view/xiongMao/', - // ], - // [ - // 't_id' => 5, - // 't_default' => 0, - // 't_code' => 'shiKong', - // 't_path' => '/app/home/view/shiKong/', - // ], - - - ]; - - /** - * 站点列表 数据播种 - */ - $arrSiteData = [ - [ - 'd_id' => 1, - 'd_domain' => 'seo.com', - 'd_name' => '狂雨小说', - 't_id' => '1', - 'd_keywords' => '狂雨小说', - 'd_description' => '欢迎来到狂雨小说 - 您的免费小说阅读天堂!这里汇聚了玄幻修真、穿越重生、都市热血、言情甜宠等多种热门小说类型,无论您是喜欢热血激战的主角成长故事,还是钟情于逆袭人生的穿越传奇,亦或是沉浸于都市生活的浪漫情缘,狂雨小说都能满足您的阅读渴望。我们每日更新最新章节,确保您第一时间追更心仪作品;更有小说排行榜精选全网热评佳作,从日榜到完结榜,助您轻松找到高人气好书。无需注册,免费畅读,狂雨小说致力于为您打造极致阅读体验,快来加入我们,开启属于您的故事冒险之旅吧!', - 'd_index_title' => '狂雨小说 - 免费在线阅读热门玄幻、穿越、都市小说', - 'd_index_keywords' => '狂雨小说, 小说在线阅读, 玄幻小说, 穿越小说, 热门小说排行榜', - 'd_index_description' => '狂雨小说提供免费在线阅读,涵盖玄幻、穿越、都市等热门小说,最新排行榜每日更新,尽享阅读乐趣!', - 'd_text_logo' => '热门小说阅读平台', - 't_cfg' => $arrSubjectFomartGroupData, - ], - [ - 'd_id' => 2, - 'd_domain' => 'novel2.com', - 'd_name' => '狂雨小说', - 't_id' => '2', - 'd_keywords' => '狂雨小说', - 'd_description' => '欢迎来到狂雨小说 - 您的免费小说阅读天堂!这里汇聚了玄幻修真、穿越重生、都市热血、言情甜宠等多种热门小说类型,无论您是喜欢热血激战的主角成长故事,还是钟情于逆袭人生的穿越传奇,亦或是沉浸于都市生活的浪漫情缘,狂雨小说都能满足您的阅读渴望。我们每日更新最新章节,确保您第一时间追更心仪作品;更有小说排行榜精选全网热评佳作,从日榜到完结榜,助您轻松找到高人气好书。无需注册,免费畅读,狂雨小说致力于为您打造极致阅读体验,快来加入我们,开启属于您的故事冒险之旅吧!', - 'd_index_title' => '狂雨小说 - 免费在线阅读热门玄幻、穿越、都市小说', - 'd_index_keywords' => '狂雨小说, 小说在线阅读, 玄幻小说, 穿越小说, 热门小说排行榜', - 'd_index_description' => '狂雨小说提供免费在线阅读,涵盖玄幻、穿越、都市等热门小说,最新排行榜每日更新,尽享阅读乐趣!', - 'd_text_logo' => '热门小说阅读平台', - 't_cfg' => $arrSubjectFomartGroupData, - ], - [ - 'd_id' => 3, - 'd_domain' => 'novel3.com', - 'd_name' => '狂雨小说', - 't_id' => '2', - 'd_keywords' => '狂雨小说', - 'd_description' => '欢迎来到狂雨小说 - 您的免费小说阅读天堂!这里汇聚了玄幻修真、穿越重生、都市热血、言情甜宠等多种热门小说类型,无论您是喜欢热血激战的主角成长故事,还是钟情于逆袭人生的穿越传奇,亦或是沉浸于都市生活的浪漫情缘,狂雨小说都能满足您的阅读渴望。我们每日更新最新章节,确保您第一时间追更心仪作品;更有小说排行榜精选全网热评佳作,从日榜到完结榜,助您轻松找到高人气好书。无需注册,免费畅读,狂雨小说致力于为您打造极致阅读体验,快来加入我们,开启属于您的故事冒险之旅吧!', - 'd_index_title' => '狂雨小说 - 免费在线阅读热门玄幻、穿越、都市小说', - 'd_index_keywords' => '狂雨小说, 小说在线阅读, 玄幻小说, 穿越小说, 热门小说排行榜', - 'd_index_description' => '狂雨小说提供免费在线阅读,涵盖玄幻、穿越、都市等热门小说,最新排行榜每日更新,尽享阅读乐趣!', - 'd_text_logo' => '热门小说阅读平台', - 't_cfg' => $arrSubjectFomartGroupData, - ], - [ - 'd_id' => 4, - 'd_domain' => 'novel4.com', - 'd_name' => '狂雨小说', - 't_id' => '2', - 'd_keywords' => '狂雨小说', - 'd_description' => '欢迎来到狂雨小说 - 您的免费小说阅读天堂!这里汇聚了玄幻修真、穿越重生、都市热血、言情甜宠等多种热门小说类型,无论您是喜欢热血激战的主角成长故事,还是钟情于逆袭人生的穿越传奇,亦或是沉浸于都市生活的浪漫情缘,狂雨小说都能满足您的阅读渴望。我们每日更新最新章节,确保您第一时间追更心仪作品;更有小说排行榜精选全网热评佳作,从日榜到完结榜,助您轻松找到高人气好书。无需注册,免费畅读,狂雨小说致力于为您打造极致阅读体验,快来加入我们,开启属于您的故事冒险之旅吧!', - 'd_index_title' => '狂雨小说 - 免费在线阅读热门玄幻、穿越、都市小说', - 'd_index_keywords' => '狂雨小说, 小说在线阅读, 玄幻小说, 穿越小说, 热门小说排行榜', - 'd_index_description' => '狂雨小说提供免费在线阅读,涵盖玄幻、穿越、都市等热门小说,最新排行榜每日更新,尽享阅读乐趣!', - 'd_text_logo' => '热门小说阅读平台', - 't_cfg' => $arrSubjectFomartGroupData, - ], - ]; - - self::initTemplate($arrTemplateData); - - self::initSubjectFomartGroup($arrSubjectFomartGroupData); - self::initSubjectFomartGroup($arrUrlSubjectFomartGroupData); - self::initSubjectFomartGroup($arrTkdSubjectFomartGroupData); - - self::initSite($arrSiteData); - } - - - /** - * 视图模板 数据播种 - * - * @param [type] $arrTemplateData - * @return void - */ - static public function initTemplate($arrTemplateData) - { - foreach ($arrTemplateData as $arrTemplate) { - $TemplatesModel = TemplatesModel::where('t_id', $arrTemplate['t_id'])->find(); - foreach ($arrTemplate['t_cfg_template'] as $key => $arrCfgTemplate) { - unset($arrTemplate['t_cfg_template'][$key]['arrSubjectFomart']); - } - if (empty($TemplatesModel)) { - TemplatesModel::insert($arrTemplate); - } else { - // 如果记录存在,更新记录 - $TemplatesModel->update($arrTemplate); - } - } - - TemplatesModel::flushAllTemplateOnCache(); - } - - /** - * 替换模板分组/替换模板 数据播种 - * - * @param [type] $arrTemplateData - * @return void - */ - static public function initSubjectFomartGroup($arrSubjectFomartGroupData) - { - foreach ($arrSubjectFomartGroupData as $SubjectFomartGroup) { - $SubjectFomartGroupModel = SubjectFomartGroupModel::where('sfg_id', $SubjectFomartGroup['sfg_id'])->find(); - - $SubjectFomartGroupItem = [ - 'sfg_id' => $SubjectFomartGroup['sfg_id'], - 'sfg_name' => str_replace(" 模板分组", "", $SubjectFomartGroup['description']), - 'sfg_description' => str_replace(" 模板分组", "", $SubjectFomartGroup['description']), - ]; - - foreach ($SubjectFomartGroup['arrSubjectFomart'] as $SubjectFomart) { - $SubjectFomartItem = [ - 'sfg_id' => $SubjectFomartGroup['sfg_id'], - 'sf_val' => $SubjectFomart - ]; - $SubjectFomartModel = SubjectFomartModel::where('sfg_id', $SubjectFomartItem['sfg_id'])->where('sf_val', $SubjectFomart)->find(); - if (empty($SubjectFomartModel)) { - SubjectFomartModel::insert($SubjectFomartItem); - } - }; - - if (empty($SubjectFomartGroupModel)) { - SubjectFomartGroupModel::insert($SubjectFomartGroupItem); - } else { - // 如果记录存在,更新记录 - $SubjectFomartGroupModel->update($SubjectFomartGroupItem); - } - } - - // SubjectFomartGroupModel::flushCache(); - } - - /** - * 站点列表 数据播种 -- - * - * @param [type] $arrTemplateData - * @return void - */ - static public function initSite($arrSiteData) - { - foreach ($arrSiteData as $arrSite) { - $SiteModel = DomainModel::where('d_id', $arrSite['d_id'])->find(); - - if (empty($SiteModel)) { - DomainModel::insert($arrSite); - } else { - // 如果记录存在,更新记录 - $SiteModel->update($arrSite); - } - } - - DomainModel::flushAllDomianOnCache(); - } -} diff --git a/code/database/seeders/ZiYuanDuanDianSeeder.php b/code/database/seeders/ZiYuanDuanDianSeeder.php deleted file mode 100644 index a6b7891..0000000 --- a/code/database/seeders/ZiYuanDuanDianSeeder.php +++ /dev/null @@ -1,56 +0,0 @@ - '小说封面', - 'zydd_code' => 'XS_COVER', - 'zydd_domain' => '', - ], - [ - 'zydd_ming_zi' => '大地影视封面', - 'zydd_code' => 'DADI_YINGSHI_COVER', - 'zydd_domain' => '', - ], - [ - 'zydd_ming_zi' => '黑木耳资源封面', - 'zydd_code' => 'HEIMUER_SOURCE_COVER', - 'zydd_domain' => '', - ], - [ - 'zydd_ming_zi' => '黑木耳资源m3u8', - 'zydd_code' => 'HEIMUER_SOURCE_PLAY', - 'zydd_domain' => '', - ], - [ - 'zydd_ming_zi' => '优质资源封面', - 'zydd_code' => 'YOUZHI_SOURCE_COVER', - 'zydd_domain' => '', - ], - [ - 'zydd_ming_zi' => '优质耳资源m3u8', - 'zydd_code' => 'YOUZHI_SOURCE_PLAY', - 'zydd_domain' => '', - ] - ]; - - foreach ($arrData as $arrDataOne) { - $ZiYuanDuanDianModel = ZiYuanDuanDianModel::where('zydd_code', $arrDataOne['zydd_code'])->find(); - - if (empty($ZiYuanDuanDianModel)) { - ZiYuanDuanDianModel::insert($arrDataOne); - } - } - } -} diff --git a/code/extend/db/DatabaseManage.php b/code/extend/db/DatabaseManage.php deleted file mode 100644 index b1432a2..0000000 --- a/code/extend/db/DatabaseManage.php +++ /dev/null @@ -1,114 +0,0 @@ -setName('db:manage') - ->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: backup or init or seed') - ->setDescription('Manage the database: backup or initialize'); - } - - protected function execute(Input $input, Output $Output) - { - $strAction = $input->getArgument('action'); - - if ($strAction === 'backup') { - $this->backupDatabase($Output); - } elseif ($strAction === 'init') { - $this->initializeDatabase($Output); - } elseif ($strAction === 'seed') { - $this->seed($Output); - } else { - $Output->writeln("Invalid action. Use 'backup' or 'init'. or 'seed'"); - } - } - - private function seed(Output $Output) - { - $SeedManager = new SeedManager; - $Output->writeln("开始数据播种" . PHP_EOL); - $SeedManager->handle(); - $Output->writeln("数据播种结束"); - } - - private function backupDatabase(Output $Output) - { - $arrConfig = config('database.connections.mysql'); - $strDb = $arrConfig['database']; - $strUserName = $arrConfig['username']; - $strPwd = $arrConfig['password']; - $strHost = $arrConfig['hostname']; - $strBackupFile = app()->getRootPath() . 'database/schema/mysql-schema.dump'; - - $strTempFile = tempnam(sys_get_temp_dir(), 'mysql-schema-') . '.dump'; - - $strCmd = "mysqldump -h{$strHost} -u{$strUserName} -p{$strPwd} --no-data {$strDb} > {$strTempFile}"; - - system($strCmd, $intResultCode); - - if ($intResultCode === 0) { - if (file_exists($strBackupFile)) { - unlink($strBackupFile); - } - - if (rename($strTempFile, $strBackupFile)) { - $Output->writeln("Database backup successful: {$strBackupFile}"); - } else { - $Output->writeln("Failed to move backup file to destination."); - } - } else { - $Output->writeln("Database backup failed."); - unlink($strTempFile); - } - } - - private function initializeDatabase(Output $Output) - { - $arrConfig = config('database.connections.mysql'); - $strDb = $arrConfig['database']; - $strUserName = $arrConfig['username']; - $strPwd = $arrConfig['password']; - $strHost = $arrConfig['hostname']; - $strPort = $arrConfig['hostport']; - $strBackupFile = app()->getRootPath() . 'database/schema/mysql-schema.dump'; - - $checkTableQuery = "SHOW TABLES LIKE 'migrations'"; - $boolMigrateExists = Db::query($checkTableQuery); - - if (!empty($boolMigrateExists)) { - $Output->writeln("数据库已存在,跳过初始化导入"); - return; - } - - $strTempFile = tempnam(sys_get_temp_dir(), 'mysql-schema-') . '.dump'; - - if (!copy($strBackupFile, $strTempFile)) { - $Output->writeln("创建临时导入文件失败."); - return; - } - - $strCmd = "mysql -h{$strHost} -P{$strPort} -u{$strUserName} -p{$strPwd} {$strDb} < {$strTempFile}"; - - system($strCmd, $intResultCode); - - if ($intResultCode === 0) { - $Output->writeln("成功导入初始化文件"); - } else { - $Output->writeln("初始化文件导入失败"); - } - - unlink($strTempFile); - } -} diff --git a/code/extend/db/MongoMigrate.php b/code/extend/db/MongoMigrate.php deleted file mode 100644 index 2d84b68..0000000 --- a/code/extend/db/MongoMigrate.php +++ /dev/null @@ -1,176 +0,0 @@ -setName('mongo:manage') - ->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: migrate') - ->setDescription('Manage the mongo, migarte index or drop all index'); - } - - /** - * Undocumented function - * - * @param Input $input - * @param Output $Output - * @return void - */ - protected function execute(Input $input, Output $Output) - { - $strAction = $input->getArgument('action'); - - if ($strAction === 'migrate') { - $this->migrate($Output); - } else if ($strAction === 'drop') { - $this->dropAllIndexes($Output); - } else { - $Output->writeln("Invalid action. Use 'migrate' or 'drop'"); - } - } - - /** - * Undocumented function - * - * @param Output $Output - * @return void - */ - protected function dropAllIndexes(Output $Output) - { - try { - DDLManage::load('MongoBase'); - $Db = MongoBase::getInstance()->getDb(); - - $ColsInfo = $Db->listCollections(); - - foreach ($ColsInfo as $ColInfo) { - $strColName = $ColInfo->getName(); - $Col = $Db->selectCollection($strColName); - - - $arrIndexes = iterator_to_array($Col->listIndexes()); - $arrIndexesToDrop = []; - - - foreach ($arrIndexes as $Index) { - $strIndexName = $Index->getName(); - if ($strIndexName !== '_id_') { - $arrIndexesToDrop[] = $strIndexName; - } - } - - - if (!empty($arrIndexesToDrop)) { - foreach ($arrIndexesToDrop as $strIndexName) { - $Col->dropIndex($strIndexName); - $Output->writeln(" Dropped index: {$strIndexName} from collection: {$strColName}"); - } - } else { - $Output->writeln(" No non-_id indexes found in collection: {$strColName}"); - } - } - } catch (\Exception $e) { - $Output->writeln("Failed to drop indexes: {$e->getMessage()}"); - } - } - - /** - * Undocumented function - * - * @param Output $Output - * @return void - */ - protected function migrate(Output $Output) - { - try { - DDLManage::load('MongoBase'); - $strMigrationDir = root_path() . 'database/mongo/migrations'; - - - if (!is_dir($strMigrationDir)) { - mkdir($strMigrationDir, 0755, true); - $Output->writeln("Created migration directory: {$strMigrationDir}"); - } - - - $arrFiles = glob($strMigrationDir . '/*.php'); - if (empty($arrFiles)) { - $Output->writeln('No migration files found.'); - return 0; - } - - sort($arrFiles); - - $Db = MongoBase::getInstance()->getDb(); - - foreach ($arrFiles as $strFile) { - $Output->writeln("Processing migration: " . basename($strFile)); - - - $arrMigration = require $strFile; - if (!is_array($arrMigration) || !isset($arrMigration['collection']) || !isset($arrMigration['indexes'])) { - $Output->writeln("Invalid migration format in {$strFile}"); - continue; - } - - $strCollectionName = $arrMigration['collection']; - $arrIndexes = $arrMigration['indexes']; - - - $Col = $Db->selectCollection($strCollectionName); - - - $arrExistingIndexes = iterator_to_array($Col->listIndexes()); - - $arrExistingIndexKeys = []; - foreach ($arrExistingIndexes as $Index) { - $strKey = json_encode($Index->getKey()); - $arrExistingIndexKeys[$strKey] = $Index->getName(); - } - - - foreach ($arrIndexes as $arrIndex) { - $arrKey = $arrIndex['key']; - $arrOptions = $arrIndex['options'] ?? []; - - - $strKey = json_encode($arrKey); - - - if (array_key_exists($strKey, $arrExistingIndexKeys)) { - $Output->writeln(" Index for " . json_encode($arrKey) . " already exists as {$arrExistingIndexKeys[$strKey]}, skipping..."); - continue; - } - - - $arrIndexNameParts = []; - foreach ($arrKey as $field => $direction) { - $arrIndexNameParts[] = "{$field}_{$direction}"; - } - $strIndexName = implode('_', $arrIndexNameParts); - - - $arrOptions['name'] = $strIndexName; - $Col->createIndex($arrKey, $arrOptions); - - $Output->writeln(" Created index: {$strIndexName} for " . json_encode($arrKey)); - } - } - - $Output->writeln('Migration completed successfully!'); - return 0; - } catch (\Exception $e) { - $Output->writeln("Error: {$e->getMessage()}"); - return 1; - } - } -} diff --git a/code/extend/db/NovelManage.php b/code/extend/db/NovelManage.php deleted file mode 100644 index 8f08888..0000000 --- a/code/extend/db/NovelManage.php +++ /dev/null @@ -1,114 +0,0 @@ -setName('novel:manage') - ->addArgument('action', \think\console\input\Argument::OPTIONAL, 'The action to perform: reset') - ->setDescription('Manage the novel data: reset or ...'); - } - - protected function execute(Input $input, Output $Output) - { - $strAction = $input->getArgument('action'); - - if ($strAction === 'reset') { - $this->resetData($Output); - } else { - $Output->writeln("Invalid action. Use 'reset' "); - } - } - - private function resetData(Output $Output) - { - DDLManage::load('MongoBase'); - - $Db = MongoBase::getInstance()->getDb(); - - $NovelCol = $Db->selectCollection('novel'); - - $ChapterCol = $Db->selectCollection('chapter'); - - $ChapterModel = ChapterModel::getInstance(); - - $intBatchSize = 1000; - - $LastId = null; - - while (true) { - - $arrFilter = []; - if (!is_null($LastId)) { - $arrFilter['_id'] = ['$gt' => $LastId]; - } - $arrOptions = [ - 'sort' => ['_id' => 1], - 'limit' => $intBatchSize, - 'noCursorTimeout' => true, - ]; - - $Cursor = $NovelCol->find($arrFilter, $arrOptions); - $arrDocs = iterator_to_array($Cursor); - - if (empty($arrDocs)) { - echo "全部处理完毕。\n"; - break; - } - - $arrBulkOps = []; - - foreach ($arrDocs as $arrDoc) { - $arrUpdateData = []; - - if (!empty($arrDoc['n_category'])) { - $arrUpdateData['n_category_pinyin'] = CategoryModel::getPinYin($arrDoc['n_category']); - $arrUpdateData['n_category_sex_en'] = CategoryModel::getSexEn($arrDoc['n_category']); - $arrUpdateData['n_category_sex_zh'] = CategoryModel::getSexZh($arrDoc['n_category']); - } - - $arrLasteChapter = $ChapterModel->getLatestChapterByNId($arrDoc['n_id'], false); - - if (!empty($arrLasteChapter)) { - $arrUpdateData['n_have_chapter'] = 1; - $arrUpdateData['n_latest_chapter_name'] = $arrLasteChapter['name']; - } - - if (!empty($arrUpdateData)) { - $arrBulkOps[] = [ - 'updateOne' => [ - ['_id' => $arrDoc['_id']], - ['$set' => $arrUpdateData], - ], - ]; - } - - $LastId = $arrDoc['_id']; - } - - if (!empty($arrBulkOps)) { - $Result = $NovelCol->bulkWrite($arrBulkOps); - printf("本批匹配 %d 条记录, 修改 %d 条记录\n", $Result->getMatchedCount(), $Result->getModifiedCount()); - } else { - echo "本批无需要更新的记录。\n"; - } - - echo "已处理一批,最后 _id: " . (string)$LastId . "\n"; - } - } -} diff --git a/code/extend/ddl/DDLManage.php b/code/extend/ddl/DDLManage.php deleted file mode 100644 index 80a453b..0000000 --- a/code/extend/ddl/DDLManage.php +++ /dev/null @@ -1,65 +0,0 @@ - 'extend/ddl/MicroCore.ddl', - 'MongoBase' => 'extend/ddl/MongoBase.ddl', - ]; - - /** - * 加载指定模块 - * @param string $strModuleCode 模块编码 - * @return bool 加载是否成功 - */ - public static function load($strModuleCode) - { - if (isset(self::$arrLoadedModules[$strModuleCode])) { - return true; - } - - if (!isset(self::$arrModuleFiles[$strModuleCode])) { - return false; - } - - $filename = self::$arrModuleFiles[$strModuleCode]; - - $strFileName = root_path() . $filename; - - if (!file_exists($strFileName)) { - return false; - } - - if (load_module_file($strFileName)) { - self::$arrLoadedModules[$strModuleCode] = true; - return true; - } else { - return false; - } - } - - /** - * 检查模块是否已加载 - * @param string $strModuleCode 类名 - * @return bool - */ - public static function isLoaded($strModuleCode) - { - return isset(self::$arrLoadedModules[$strModuleCode]); - } - - /** - * 获取所有已加载的模块 - * @return array - */ - public static function getarrLoadedModules() - { - return array_keys(self::$arrLoadedModules); - } -} diff --git a/code/extend/ddl/MicroCore.ddl b/code/extend/ddl/MicroCore.ddl deleted file mode 100644 index 4a8fe8f..0000000 Binary files a/code/extend/ddl/MicroCore.ddl and /dev/null differ diff --git a/code/extend/ddl/MongoBase.ddl b/code/extend/ddl/MongoBase.ddl deleted file mode 100644 index e06fd09..0000000 Binary files a/code/extend/ddl/MongoBase.ddl and /dev/null differ diff --git a/code/extend/processor/ImageProcessor.php b/code/extend/processor/ImageProcessor.php deleted file mode 100644 index e15e185..0000000 --- a/code/extend/processor/ImageProcessor.php +++ /dev/null @@ -1,133 +0,0 @@ -client = new Client([ - 'verify' => false // 忽略证书检测 - ]); - $this->key = $key; - } - - public static function getInstance($key = 0x88) - { - if (self::$instance == null) { - self::$instance = new ImageProcessor($key = 0x88); - } - return self::$instance; - } - - public function downloadAndEncryptImage($imageUrl, $directory) - { - try { - // 下载图片 - $response = $this->client->get($imageUrl); - if ($response->getStatusCode() !== 200) { - throw new Exception("Failed to download image: $imageUrl"); - } - $imageData = $response->getBody()->getContents(); - - // 加密图片 - $encryptedData = $this->encrypt($imageData); - - // 生成目录路径 - $relativePath = $this->generatePath($directory); - - // 保存加密后的图片 - file_put_contents(public_path() . $relativePath, $encryptedData); - - return '/' . $relativePath; - } catch (RequestException $e) { - throw new Exception("Request Error: " . $e->getMessage()); - } catch (Exception $e) { - throw new Exception("Error: " . $e->getMessage()); - } - } - - public function downloadImage( $intXiaoShuoSourceId,$imageUrl, $directory) - { - try { - // 下载图片 - $response = $this->client->get($imageUrl); - if ($response->getStatusCode() !== 200) { - throw new Exception("Failed to download image: $imageUrl"); - } - $imageData = $response->getBody()->getContents(); - - // 加密图片 - //$encryptedData = $this->encrypt($imageData); - - // 生成目录路径 - $relativePath = $this->generateImgPath($directory,$intXiaoShuoSourceId); - - // 保存图片 - file_put_contents(public_path() . $relativePath, $imageData); - - return '/' . $relativePath; - } catch (RequestException $e) { - throw new Exception("Request Error: " . $e->getMessage()); - } catch (Exception $e) { - throw new Exception("Error: " . $e->getMessage()); - } - } - - private function encrypt($data) - { - $bytes = array_values(unpack('C*', $data)); - $len = count($bytes); - - for ($i = 0; $i < $len; $i++) { - $bytes[$i] ^= $this->key; - } - - return pack('C*', ...$bytes); - } - - private function generateImgPath($directory,$intXiaoShuoSourceId) - { - $relativePath = $directory . '/pic/'.$intXiaoShuoSourceId; - $basePath = public_path() . $relativePath; - if (!is_dir($basePath)) { - mkdir($basePath, 0777, true); - } - - $filePath = $relativePath . '.jpg'; ; - return $filePath; - } - - private function generatePath($directory) - { - $datePath = date('Y/m/d'); - $hash = md5(uniqid(rand(), true)); - $hashPath = substr($hash, 0, 2) . '/' . substr($hash, 2, 2); - - $relativePath = $directory . '/' . $datePath . '/' . $hashPath; - $basePath = public_path() . $relativePath; - if (!is_dir($basePath)) { - mkdir($basePath, 0777, true); - } - - $filePath = $relativePath . '/' . uniqid() . '.jpg'; - return $filePath; - } -} - -// // 示例用法 -// try { -// $imageProcessor = ImageProcessor::getInstance(); -// $savedPath = $imageProcessor->downloadAndEncryptImage('https://example.com/path/to/image.jpg', 'abc'); -// echo "图片加密并保存到: " . $savedPath; -// } catch (Exception $e) { -// echo "错误: " . $e->getMessage(); -// } diff --git a/code/extend/storage/StorageCore.php b/code/extend/storage/StorageCore.php deleted file mode 100644 index 78d2612..0000000 --- a/code/extend/storage/StorageCore.php +++ /dev/null @@ -1,98 +0,0 @@ -Adapter = new Local( - $arrConfig['local']['dir'] - ); - - $this->Filesystem = new Filesystem($this->Adapter); - } - - /** - * Undocumented function - * - * @return self - */ - public static function getInstance(): self - { - if (self::$instance == null) { - self::$instance = new self(); - } - return self::$instance; - } - - public function set($strKey, $strContent) - { - $strContent = zstd_compress($strContent); - return $this->Filesystem->write($strKey, $strContent); - } - - public function writeStream(string $strPath, $Resource) - { - $this->Filesystem->writeStream($strPath, $Resource); - } - - public function put($strKey, $strContent, array $arrConfig = []) - { - $strContent = zstd_compress($strContent); - return $this->Filesystem->put($strKey, $strContent, $arrConfig); - } - - public function write($strKey, $strContent, array $arrConfig = []) - { - $strContent = zstd_compress($strContent); - return $this->Filesystem->write($strKey, $strContent, $arrConfig); - } - - public function update($strKey, $strContent, array $arrConfig = []) - { - $strContent = zstd_compress($strContent); - return $this->Filesystem->update($strKey, $strContent, $arrConfig); - } - - public function read($strKey) - { - try { - $Stream = $this->Filesystem->readStream($strKey); - $strContent = stream_get_contents($Stream); - $strContent = zstd_uncompress($strContent); - return $strContent; - } catch (\Exception $e) { - return ''; - } - } - - public function has($strKey) - { - return $this->Filesystem->has($strKey); - } -} diff --git a/code/extend/template/page/CusteomPage.php b/code/extend/template/page/CusteomPage.php deleted file mode 100644 index 89726d2..0000000 --- a/code/extend/template/page/CusteomPage.php +++ /dev/null @@ -1,215 +0,0 @@ -currentPage() <= 1) { - return $this->getDisabledTextWrapper($text); - } - - $url = $this->url( - $this->currentPage() - 1 - ); - - return $this->getPageLinkWrapper($url, $text); - } - - /** - * 下一页按钮 - * @param string $text - * @return string - */ - protected function getNextButton(string $text = '下一页'): string - { - if (!$this->hasMore) { - return $this->getDisabledTextWrapper($text); - } - - $url = $this->url($this->currentPage() + 1); - - return $this->getPageLinkWrapper($url, $text); - } - - /** - * 页码按钮 - * @return string - */ - /** - * 页码按钮 - * @return string - */ - protected function getLinks(): string - { - if ($this->simple) { - return ''; - } - - $block = [ - 'first' => null, - 'slider' => null, - 'last' => null, - ]; - - if ($this->lastPage <= 3) { - // 如果总页数少于或等于3,显示所有页码 - $block['first'] = $this->getUrlRange(1, $this->lastPage); - } else { - if ($this->currentPage == 1) { - // 如果当前页码是第一页,显示前两页和第三页 - $block['first'] = $this->getUrlRange(1, 3); - } elseif ($this->currentPage == $this->lastPage) { - // 如果当前页码是最后一页,显示最后三页 - $block['first'] = $this->getUrlRange($this->lastPage - 2, $this->lastPage); - } else { - // 否则,显示当前页码及其前后各一页 - $block['first'] = $this->getUrlRange($this->currentPage - 1, $this->currentPage + 1); - } - } - - $html = ''; - - if (is_array($block['first'])) { - $html .= $this->getUrlLinks($block['first']); - } - - return $html; - } - - /** - * 渲染分页html - * @return mixed - */ - public function render() - { - if ($this->hasPages()) { - if ($this->simple) { - return sprintf( - '
      %s %s
    ', - $this->getPreviousButton(), - $this->getNextButton() - ); - } else { - return sprintf( - '
      %s %s %s %s
    %s', - $this->getPreviousButton(), - $this->getLinks(), - $this->getNextButton(), - $this->getTotalInfo(), - $this->getTargePage(), - ); - } - } - } - - /** - * 跳转 - * - * @return string - */ - protected function getTargePage(): string - { - return '
    - - -
    '; - } - - /** - * 统计 - * - * @return string - */ - protected function getTotalInfo(): string - { - return '
  • ' . $this->currentPage() . '/' . $this->lastPage() . '
  • '; - } - - /** - * 生成一个可点击的按钮 - * - * @param string $url - * @param string $page - * @return string - */ - protected function getAvailablePageWrapper(string $url, string $page): string - { - return '
  • ' . $page . '
  • '; - } - - /** - * 生成一个禁用的按钮 - * - * @param string $text - * @return string - */ - protected function getDisabledTextWrapper(string $text): string - { - return '
  • ' . $text . '
  • '; - } - - /** - * 生成一个激活的按钮 - * - * @param string $text - * @return string - */ - protected function getActivePageWrapper(string $text): string - { - return '
  • ' . $text . '
  • '; - } - - /** - * 生成省略号按钮 - * - * @return string - */ - protected function getDots(): string - { - return $this->getDisabledTextWrapper('...'); - } - - /** - * 批量生成页码按钮. - * - * @param array $urls - * @return string - */ - protected function getUrlLinks(array $urls): string - { - $html = ''; - - foreach ($urls as $page => $url) { - $html .= $this->getPageLinkWrapper($url, $page); - } - - return $html; - } - - /** - * 生成普通页码按钮 - * - * @param string $url - * @param string $page - * @return string - */ - protected function getPageLinkWrapper(string $url, string $page): string - { - if ($this->currentPage() == $page) { - return $this->getActivePageWrapper($page); - } - - return $this->getAvailablePageWrapper($url, $page); - } -} diff --git a/code/extend/template/page/CusteomPage02.php b/code/extend/template/page/CusteomPage02.php deleted file mode 100644 index 4b51d7e..0000000 --- a/code/extend/template/page/CusteomPage02.php +++ /dev/null @@ -1,152 +0,0 @@ - '上一页', - 'next' => '下一页', - 'ellipsis' => '...' - ]; - $labels = array_merge($defaultLabels, $buttonLabels); - - // 验证 totalButtons 必须大于 3 - if ($totalButtons < 3) { - throw new \InvalidArgumentException('Total buttons must be greater than 3'); - } - - // 计算总页数 - $totalPages = ceil($totalItems / $itemsPerPage); - if ($totalPages <= 1) return []; // 只有一页时返回空数组 - - // 确保当前页码在有效范围内 - $currentPage = max(1, min($currentPage, $totalPages)); - - // 计算除去“上一页”和“下一页”后可显示的页码按钮数 - $pageButtons = $totalButtons - 2; // 减去“上一页”和“下一页” - - // 初始化按钮数组 - $buttons = []; - - // 上一页按钮 - $buttons[] = [ - 'type' => 'prev', - 'label' => $labels['prev'], - 'url' => $currentPage > 1 ? str_replace('{page}', $currentPage - 1, $baseUrl) : null, - 'rel' => $currentPage > 1 ? 'prev' : null, - 'disabled' => $currentPage <= 1 - ]; - - // 计算页码范围 - $half = floor($pageButtons / 2); - $start = max(1, $currentPage - $half); - $end = $start + $pageButtons - 1; - - // 调整范围,确保不超过总页数 - if ($end > $totalPages) { - $end = $totalPages; - $start = max(1, $end - $pageButtons + 1); - } - - // 如果总页数大于可显示的页码数,添加省略号逻辑 - if ($totalPages > $pageButtons) { - if ($start > 1) { - $buttons[] = [ - 'type' => 'page', - 'label' => '1', - 'url' => str_replace('{page}', 1, $baseUrl), - 'current' => false - ]; - if ($start > 2) { - $buttons[] = [ - 'type' => 'ellipsis', - 'label' => $labels['ellipsis'], - 'url' => null - ]; - } - } - - // 添加页码按钮 - for ($i = $start; $i <= $end; $i++) { - $buttons[] = [ - 'type' => 'page', - 'label' => (string)$i, - 'url' => str_replace('{page}', $i, $baseUrl), - 'current' => $i === $currentPage - ]; - } - - if ($end < $totalPages) { - if ($end < $totalPages - 1) { - $buttons[] = [ - 'type' => 'ellipsis', - 'label' => $labels['ellipsis'], - 'url' => null - ]; - } - $buttons[] = [ - 'type' => 'page', - 'label' => (string)$totalPages, - 'url' => str_replace('{page}', $totalPages, $baseUrl), - 'current' => false - ]; - } - } else { - // 总页数少于等于可显示页码数,直接全部显示 - for ($i = 1; $i <= $totalPages; $i++) { - $buttons[] = [ - 'type' => 'page', - 'label' => (string)$i, - 'url' => str_replace('{page}', $i, $baseUrl), - 'current' => $i === $currentPage - ]; - } - } - - // 下一页按钮 - $buttons[] = [ - 'type' => 'next', - 'label' => $labels['next'], - 'url' => $currentPage < $totalPages ? str_replace('{page}', $currentPage + 1, $baseUrl) : null, - 'rel' => $currentPage < $totalPages ? 'next' : null, - 'disabled' => $currentPage >= $totalPages - ]; - - return $buttons; - } -} - -// // 测试示例 1:显示 5 个按钮 -// $currentPage = 3; -// $totalItems = 100; -// $itemsPerPage = 10; -// $baseUrl = '/male/xuanhuan-xiuzhen/finished/page{page}'; -// $buttons = Pagination::generate($currentPage, $totalItems, $itemsPerPage, $baseUrl, 5); -// print_r($buttons); - -// // 测试示例 2:显示 7 个按钮 -// $buttons = Pagination::generate($currentPage, $totalItems, $itemsPerPage, $baseUrl, 7); -// print_r($buttons); -// diff --git a/code/extend/template/taglib/Ad.php b/code/extend/template/taglib/Ad.php deleted file mode 100644 index 2b997d5..0000000 --- a/code/extend/template/taglib/Ad.php +++ /dev/null @@ -1,36 +0,0 @@ - ['attr' => 'code,order,limit,id', 'close' => 1] - ]; - - /** - * list标签处理函数 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagList($tag, $content) - { - $code = $tag['code'] ?? ''; - $order = $tag['order'] ?? 'asc'; - $limit = isset($tag['limit']) ? (int)$tag['limit'] : 10; - $id = $tag['id'] ?? 'ad'; - - $parse = << -{volist name="adList" id="{$id}"} -$content -{/volist} -EOD; - return $parse; - } -} diff --git a/code/extend/template/taglib/Chapter.php b/code/extend/template/taglib/Chapter.php deleted file mode 100644 index c302390..0000000 --- a/code/extend/template/taglib/Chapter.php +++ /dev/null @@ -1,193 +0,0 @@ - ['attr' => 'count,n_category,sort_type,n_status,n_sex,key,diff_key,cache_life,d_key,d_val', 'close' => 1], - 'pager' => ['attr' => 'page,limit,n_category,sort_type,n_status,n_sex,key,diff_key,cache_life,d_key,d_val,p_val,export_name', 'close' => 1], - 'pagerexp' => ['attr' => 'page,limit,n_category,sort_type,n_status,n_sex,key,diff_key,cache_life,d_key,d_val,p_val,func,export_name', 'close' => 0], - 'info' => ['attr' => 'n_id,n_key', 'close' => 0], - ]; - - private function customBuildVar($mixedArgs) - { - if (substr($mixedArgs, 0, 1) == '$') { - return $this->autoBuildVar($mixedArgs); - } else { - return is_numeric($mixedArgs) ? $mixedArgs : "'" . $mixedArgs . "'"; - } - } - - - /** - * pagerexp tag code - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagPagerExp($tag, $content) - { - return $this->tagPager($tag, $content); - } - - - /** - * chapter pager - * - * @param arrya $tag - * @param string $content - * @return void - */ - public function tagPager($tag, $content) - { - $page = $tag['page'] ?? '0'; - $limit = $tag['limit'] ?? '100'; - $button_num = $tag['button_num'] ?? '10'; - $n_id = $tag['n_id'] ?? '0'; - $sort_type = $tag['sort_type'] ?? ""; - $diff_key = $tag['diff_key'] ?? ""; - $cache_life = $tag['cache_life'] ?? '0'; - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - $p_val = $tag['p_val'] ?? 'p_val'; - $func = $tag['func']; - $export_name = $tag['export_name'] ?? ''; - - $n_id = $this->customBuildVar($n_id); - $sort_type = $this->customBuildVar($sort_type); - $button_num = $this->customBuildVar($button_num); - - $page = $this->customBuildVar($page); - $limit = $this->customBuildVar($limit); - $diff_key = $this->customBuildVar($diff_key); - $cache_life = $this->customBuildVar($cache_life); - $func = $this->customBuildVar($func); - - $arrDataName = randomString(5); - - $strParse = <<getNovelPager([ - 'page' => {$page}, - 'limit' => {$limit}, - 'button_num' => {$button_num}, - 'n_id' => {$n_id}, - 'sort_type' => {$sort_type}, - 'diff_key' => {$diff_key}, - 'cache_life' => {$cache_life}, - 'func' => {$func}, -]); -EOT; - - if (empty($export_name)) { - $strParse .= << -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - } else { - $strParse .= << -EOT; - } - return $strParse; - } - - /** - * chapter list - * - * @param arrya $tag - * @param string $content - * @return void - */ - public function tagList($tag, $content) - { - $count = $tag['count'] ?? '100'; - $n_id = $tag['n_id'] ?? '0'; - $sort_type = $tag['sort_type'] ?? ""; - $diff_key = $tag['diff_key'] ?? ""; - $cache_life = $tag['cache_life'] ?? '0'; - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - - $count = $this->customBuildVar($count); - $n_id = $this->customBuildVar($n_id); - $sort_type = $this->customBuildVar($sort_type); - $diff_key = $this->customBuildVar($diff_key); - $cache_life = $this->customBuildVar($cache_life); - $arrDataName = randomString(5); - - $strParse = <<getChapterList([ - 'n_id' => {$n_id}, - 'count' => {$count}, - 'sort_type' => {$sort_type}, - 'diff_key' => {$diff_key}, - 'cache_life' => {$cache_life}, -]); - -if (!empty(\${$arrDataName}) && is_array(\${$arrDataName})): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } - - - /** - * chapter info - * - * @param arrya $tag - * @param string $content - * @return void - */ - public function tagInfo($tag) - { - $n_id = $tag['n_id'] ?? '0'; - $c_sort_num = $tag['c_sort_num'] ?? 0; - $c_page = $tag['c_page'] ?? 0; - $c_key = $tag['c_key'] ?? 'arrChapter'; - - $n_id = $this->customBuildVar($n_id); - $c_sort_num = $this->customBuildVar($c_sort_num); - $c_page = $this->customBuildVar($c_page); - - $strParse = <<getChapterInfo( - {$n_id}, - {$c_sort_num}, - {$c_page} -); - - - \${$c_key} = \$arrChapter ?? []; -?> -EOT; - - return $strParse; - } -} diff --git a/code/extend/template/taglib/Novel.php b/code/extend/template/taglib/Novel.php deleted file mode 100644 index 872a2ab..0000000 --- a/code/extend/template/taglib/Novel.php +++ /dev/null @@ -1,403 +0,0 @@ - ['attr' => 'count,n_category,sort_type,n_status,n_sex,diff_key,cache_life,d_key,d_val', 'close' => 1], - 'pager' => ['attr' => 'page,limit,n_category,sort_type,n_status,n_sex,key,diff_key,cache_life,d_key,d_val,p_val,func,export_name', 'close' => 1], - 'pagerexp' => ['attr' => 'page,limit,n_category,sort_type,n_status,n_sex,key,diff_key,cache_life,d_key,d_val,p_val,func,export_name', 'close' => 0], - 'info' => ['attr' => 'n_id,n_key', 'close' => 0], - 'sort' => ['attr' => 'd_key,d_val'], - 'status' => ['attr' => 'd_key,d_val'], - 'sex' => ['attr' => 'd_key,d_val'], - 'category' => ['attr' => 'd_key,d_val,n_sex'], - - 'ranklist' => ['attr' => 'count,sort_type,n_status,n_sex,diff_key,cache_life,d_key,d_val', 'close' => 1], - ]; - - private function customBuildVar($mixedArgs) - { - if (substr($mixedArgs, 0, 1) == '$') { - return $this->autoBuildVar($mixedArgs); - } else { - return is_numeric($mixedArgs) ? $mixedArgs : "'" . $mixedArgs . "'"; - } - } - - - - /** - * tagRankList - * - * @param array $tag - * @param string $content - * @return void - */ - public function tagRankList($tag, $content) - { - $count = $tag['count'] ?? '10'; - $sort_type = $tag['sort_type'] ?? ""; - $n_status = $tag['n_status'] ?? "all"; - $n_sex = $tag['n_sex'] ?? "all"; - - $diff_key = $tag['diff_key'] ?? ""; - $cache_life = $tag['cache_life'] ?? '0'; - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - - $sort_type = $this->customBuildVar($sort_type); - $n_status = $this->customBuildVar($n_status); - $n_sex = $this->customBuildVar($n_sex); - $diff_key = $this->customBuildVar($diff_key); - $cache_life = $this->customBuildVar($cache_life); - - $arrDataName = randomString(5); - - $strParse = <<getRankList([ -'count' => {$count}, -'sort_type' => {$sort_type}, -'n_status' => {$n_status}, -'n_sex' => {$n_sex}, -'diff_key' => {$diff_key}, -'cache_life' => {$cache_life} -]); - -if (!empty(\${$arrDataName}) && is_array(\${$arrDataName})): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } - - - /** - * tagPagerExp - * - * @param array $tag - * @param string $content - * @return void - */ - public function tagPagerExp($tag, $content) - { - return $this->tagPager($tag, $content); - } - - /** - * tagPager - * - * @param array $tag - * @param string $content - * @return void - */ - public function tagPager($tag, $content) - { - $page = $tag['page'] ?? '0'; - $limit = $tag['limit'] ?? '10'; - $button_num = $tag['button_num'] ?? '10'; - $n_category = $tag['n_category'] ?? "all"; - $sort_type = $tag['sort_type'] ?? ""; - $n_status = $tag['n_status'] ?? ""; - $n_sex = $tag['n_sex'] ?? ""; - $key = $tag['key'] ?? ""; - $diff_key = $tag['diff_key'] ?? ""; - $cache_life = $tag['cache_life'] ?? '0'; - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - $p_val = $tag['p_val'] ?? 'p_val'; - - $export_name = $tag['export_name'] ?? ''; - - $func = $tag['func']; - - $page = $this->customBuildVar($page); - $limit = $this->customBuildVar($limit); - $button_num = $this->customBuildVar($button_num); - $n_category = $this->customBuildVar($n_category); - $sort_type = $this->customBuildVar($sort_type); - $n_status = $this->customBuildVar($n_status); - $n_sex = $this->customBuildVar($n_sex); - $key = $this->customBuildVar($key); - $diff_key = $this->customBuildVar($diff_key); - $cache_life = $this->customBuildVar($cache_life); - $func = $this->customBuildVar($func); - - $arrDataName = randomString(5); - - $strParse = <<getNovelPager([ - 'page' => {$page}, - 'limit' => {$limit}, - 'button_num' => {$button_num}, - 'n_category' => {$n_category}, - 'sort_type' => {$sort_type}, - 'n_status' => {$n_status}, - 'n_sex' => {$n_sex}, - 'key' => {$key}, - 'diff_key' => {$diff_key}, - 'cache_life' => {$cache_life}, - 'func' => {$func}, -]); -EOT; - - - if (empty($export_name)) { - $strParse .= << -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - } else { - $strParse .= << -EOT; - } - - return $strParse; - } - - /** - * tagList - * - * @param array $tag - * @param string $content - * @return void - */ - public function tagList($tag, $content) - { - $count = $tag['count'] ?? '10'; - $n_category = $tag['n_category'] ?? "all"; - $sort_type = $tag['sort_type'] ?? ""; - $n_status = $tag['n_status'] ?? "all"; - $n_sex = $tag['n_sex'] ?? "all"; - $diff_key = $tag['diff_key'] ?? ""; - $cache_life = $tag['cache_life'] ?? '0'; - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - - - $n_category = $this->customBuildVar($n_category); - $sort_type = $this->customBuildVar($sort_type); - $n_status = $this->customBuildVar($n_status); - $n_sex = $this->customBuildVar($n_sex); - $diff_key = $this->customBuildVar($diff_key); - $cache_life = $this->customBuildVar($cache_life); - - $arrDataName = randomString(5); - - $strParse = <<getNovelList([ - 'count' => {$count}, - 'n_category' => {$n_category}, - 'sort_type' => {$sort_type}, - 'n_status' => {$n_status}, - 'n_sex' => {$n_sex}, - 'diff_key' => {$diff_key}, - 'cache_life' => {$cache_life} -]); - -if (!empty(\${$arrDataName}) && is_array(\${$arrDataName})): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } - - - - - - /** - * 获取小说详情 - * - * @param array $tag - * @param string $content - * @return void - */ - public function tagInfo($tag) - { - $n_id = $tag['n_id'] ?? '0'; - $n_forge_id = $tag['n_forge_id'] ?? 0; - - $n_key = $tag['n_key'] ?? 'arrNovel'; - - $n_id = $this->customBuildVar($n_id); - - $strParse = <<getNovelByNId( - {$n_id}, - {$n_forge_id} -); - - \${$n_key} = \$novelData ?? []; -?> -EOT; - - return $strParse; - } - - /** - * 获取排序筛选参数 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagSort($tag, $content) - { - - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - - $strParse = <<arrSortType; - -if (!empty(\$arrSort) && is_array(\$arrSort)): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } - - /** - * 获取状态筛选参数 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagStatus($tag, $content) - { - - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - - $strParse = <<arrStatus; - -if (!empty(\$arrStatus) && is_array(\$arrStatus)): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } - - - /** - * 获取状态筛选参数 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagSex($tag, $content) - { - - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - - $strParse = <<arrSex; - -if (!empty(\$arrSex) && is_array(\$arrSex)): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } - - /** - * 获取状态筛选参数 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagCategory($tag, $content) - { - - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - $n_sex = $tag['n_sex'] ?? ''; - - $n_sex = $this->customBuildVar($n_sex); - - $strParse = <<getCategoryFilter( {$n_sex}); - -if (!empty(\$arrCategory) && is_array(\$arrCategory)): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } -} diff --git a/code/extend/template/taglib/Rs.php b/code/extend/template/taglib/Rs.php deleted file mode 100644 index 680db23..0000000 --- a/code/extend/template/taglib/Rs.php +++ /dev/null @@ -1,35 +0,0 @@ - ['attr' => 'order,limit,id', 'close' => 1] - ]; - - /** - * list标签处理函数 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagList($tag, $content) - { - $order = $tag['order'] ?? 'asc'; - $limit = isset($tag['limit']) ? (int)$tag['limit'] : 10; - $id = $tag['id'] ?? 'vo'; - - $parse = << -{volist name="adRs" id="{$id}"} -$content -{/volist} -EOD; - return $parse; - } -} diff --git a/code/extend/template/taglib/Site.php b/code/extend/template/taglib/Site.php deleted file mode 100644 index d2c86bd..0000000 --- a/code/extend/template/taglib/Site.php +++ /dev/null @@ -1,364 +0,0 @@ - ['attr' => 'code,encode', 'close' => 0], - 'wz' => ['attr' => 'wz', 'close' => 0], - 'nurl' => ['attr' => 'n_id,n_py', 'close' => 0], - 'nnurl' => ['attr' => 'n_id,n_py,n_fid', 'close' => 0], - 'souurl' => ['attr' => 'key', 'close' => 0], - 'cpurl' => ['attr' => 'n_id,n_py,c_sort,c_page', 'close' => 0], - 'lcpurl' => ['attr' => 'n_id,n_py', 'close' => 0], - 'nclurl' => ['attr' => 'n_id,n_py,order,page', 'close' => 0], - 'nflurl' => ['attr' => 'gender,category,status,order,page', 'close' => 0], - 'grm' => ['attr' => 'domain,code,line,diff,start,end,index,type', 'close' => 0], - 'replace' => ['attr' => 'code', 'close' => 0], - - 'forgelist' => ['attr' => 'count,diff_key,cache_life,d_key,d_val', 'close' => 1], - ]; - - private function customBuildVar($mixedArgs) - { - if (substr($mixedArgs, 0, 1) == '$') { - return $this->autoBuildVar($mixedArgs); - } else { - return is_numeric($mixedArgs) ? $mixedArgs : "'" . $mixedArgs . "'"; - } - } - - - /** - * tagRankList - * - * @param array $tag - * @param string $content - * @return void - */ - public function tagForgeList($tag, $content) - { - $count = $tag['count'] ?? '10'; - $diff_key = $tag['diff_key'] ?? ""; - $cache_life = $tag['cache_life'] ?? '0'; - $d_key = $tag['d_key'] ?? 'd_key'; - $d_val = $tag['d_val'] ?? 'd_val'; - - $diff_key = $this->customBuildVar($diff_key); - $cache_life = $this->customBuildVar($cache_life); - - $arrDataName = randomString(5); - - $strParse = <<getForgeList([ -'count' => {$count}, -'diff_key' => {$diff_key}, -'cache_life' => {$cache_life} -]); - -if (!empty(\${$arrDataName}) && is_array(\${$arrDataName})): - -?> -EOT; - $strParse .= << \${$d_val}): ?> -EOT; - $strParse .= $content; - $strParse .= << - -EOT; - return $strParse; - } - - /** - * cfg 标签处理函数-系统配置 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagCfg($tag) - { - $code = isset($tag['code']) ? $tag['code'] : ''; - $encode = isset($tag['encode']) ? $tag['encode'] : 'false'; - - $parse = << -EOD; - return $parse; - } - - /** - * 文字处理函数 - * - * @param array $tag - * @param string $content - * @return string - */ - public function tagWz($tag) - { - $strWords = isset($tag['wz']) ? $tag['wz'] : ''; - - $parse = << -EOD; - return $parse; - } - - /** - * 小说详情URL生成器 - * - * @param array $n_id - * @return string - */ - public function tagNUrl($tag) - { - $intNId = isset($tag['n_id']) ? $tag['n_id'] : ''; - $strNPy = isset($tag['n_py']) ? $tag['n_py'] : ''; - - $intNId = $this->customBuildVar($intNId); - $strNPy = $this->customBuildVar($strNPy); - - $strParse = <<getNovelInfoUrl({$intNId},{$strNPy}); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - /** - * 伪小说详情URL生成器 - * - * @param array $n_id - * @return string - */ - public function tagNNUrl($tag) - { - $intNId = isset($tag['n_id']) ? $tag['n_id'] : ''; - $strNPy = isset($tag['n_py']) ? $tag['n_py'] : ''; - $intNForgeId = isset($tag['n_fid']) ? $tag['n_fid'] : ''; - - $intNId = $this->customBuildVar($intNId); - $strNPy = $this->customBuildVar($strNPy); - $intNForgeId = $this->customBuildVar($intNForgeId); - - $strParse = <<getForgeNovelInfoUrl({$intNId},{$strNPy},{$intNForgeId}); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - /** - * 小说章节URL生成器 - * - * @param array $n_id - * @return string - */ - public function tagCPUrl($tag) - { - $intNId = isset($tag['n_id']) ? $tag['n_id'] : ''; - $strNPy = isset($tag['n_py']) ? $tag['n_py'] : ''; - $intChapterSort = isset($tag['c_sort']) ? $tag['c_sort'] : ''; - $intChapterPage = isset($tag['c_page']) ? $tag['c_page'] : 0; - - $intNId = $this->customBuildVar($intNId); - $strNPy = $this->customBuildVar($strNPy); - $intChapterSort = $this->customBuildVar($intChapterSort); - $intChapterPage = $this->customBuildVar($intChapterPage); - - $strParse = <<getNovelChapterUrl({$intNId},{$strNPy},{$intChapterSort},{$intChapterPage}); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - /** - * 小说最新章节URL生成器 - * - * @param array $n_id - * @return string - */ - public function tagLCPUrl($tag) - { - $intNId = isset($tag['n_id']) ? $tag['n_id'] : ''; - $strNPy = isset($tag['n_py']) ? $tag['n_py'] : ''; - - $intNId = $this->customBuildVar($intNId); - $strNPy = $this->customBuildVar($strNPy); - - $strParse = <<getNovelLasterChapterUrl({$intNId},{$strNPy}); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - /** - * 小说目录URL生成器 - * - * @param array $n_id - * @return string - */ - public function tagNClUrl($tag) - { - $intNId = isset($tag['n_id']) ? $tag['n_id'] : ''; - $strNPy = isset($tag['n_py']) ? $tag['n_py'] : ''; - $strOrder = isset($tag['order']) ? $tag['order'] : ''; - $intPage = isset($tag['page']) ? $tag['page'] : ''; - - $intNId = $this->customBuildVar($intNId); - $strNPy = $this->customBuildVar($strNPy); - $strOrder = $this->customBuildVar($strOrder); - $intPage = $this->customBuildVar($intPage); - - $strParse = <<getNovelCatalogUrl({$intNId},{$strNPy},{$strOrder},{$intPage}); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - /** - * 小说书库/分类 URL生成器 - * - * @param array $n_id - * @return string - */ - public function tagNFLUrl($tag) - { - $strGender = isset($tag['gender']) ? $tag['gender'] : 'all'; - $strCategory = isset($tag['category']) ? $tag['category'] : 'all'; - $strStatus = isset($tag['status']) ? $tag['status'] : 'all'; - $strOrder = isset($tag['order']) ? $tag['order'] : 'all'; - $intPage = isset($tag['page']) ? $tag['page'] : 1; - - $strGender = $this->customBuildVar($strGender); - $strCategory = $this->customBuildVar($strCategory); - $strStatus = $this->customBuildVar($strStatus); - $strOrder = $this->customBuildVar($strOrder); - $intPage = $this->customBuildVar($intPage); - - $strParse = <<getNovelCategoryUrl({$strGender},{$strCategory},{$strStatus},{$strOrder},{$intPage}); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - /** - * 搜索页URL生成器 - * - * @param array $key - * @return string - */ - public function tagSouUrl($tag) - { - $strKey = isset($tag['key']) ? $tag['key'] : ''; - $intPage = isset($tag['p']) ? $tag['p'] : ''; - - $strKey = $this->customBuildVar($strKey); - $intPage = $this->customBuildVar($intPage); - - $strParse = <<getNovelSearchUrl({$strKey},{$intPage}); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - - - - - - /** - * 内容替换 - * - * @param array - * @return string - */ - public function tagReplace($tag) - { - $strCode = isset($tag['code']) ? $tag['code'] : ''; - - $strParse = <<converterTemplate("{$strCode}"); - echo \$strUrl; -?> -EOD; - return $strParse; - } - - - - /** - * get grm - * - * @param arrya $tag - * @param string $content - * @return void - */ - public function tagGrm($tag) - { - - $page_code = $tag['page_code'] ?? ''; - $diff = $tag['diff'] ?? ''; - $num = $tag['num'] ?? 1; - $g_key = $tag['g_key'] ?? 'arrGrm'; - - $page_code = $this->customBuildVar($page_code); - $diff = $this->customBuildVar($diff); - $num = $this->customBuildVar($num); - // var_dump($page_code); - // var_dump($diff); - // var_dump($num); - // exit; - $arrDataName = randomString(5); - - $strParse = <<generateGrm( - {$page_code}, - {$diff}, - {$num} -); - - \${$g_key} = \${$arrDataName} ?? []; -?> -EOT; - - return $strParse; - } -} diff --git a/code/extend/template/ziku/WordsEntities.php b/code/extend/template/ziku/WordsEntities.php deleted file mode 100644 index a478f99..0000000 --- a/code/extend/template/ziku/WordsEntities.php +++ /dev/null @@ -1,17 +0,0 @@ - - Options +FollowSymlinks -Multiviews - RewriteEngine On - - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - diff --git a/code/public/403.html b/code/public/403.html deleted file mode 100644 index eac94be..0000000 --- a/code/public/403.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - 404 - 页面未找到 - - - - -
    -

    403

    -

    Too Many Requests

    -

    5 秒后将自动返回上一页。

    -

    倒计时:5

    -

    或者 点击这里返回首页

    -
    - - diff --git a/code/public/404.html b/code/public/404.html deleted file mode 100644 index 06ab31e..0000000 --- a/code/public/404.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - 404 - 页面未找到 - - - - -
    -

    404

    -

    抱歉,您访问的页面不存在。

    -

    5 秒后将自动返回上一页。

    -

    倒计时:5

    -

    或者 点击这里返回首页

    -
    - - diff --git a/code/public/favicon.ico b/code/public/favicon.ico deleted file mode 100644 index 3f2817f..0000000 Binary files a/code/public/favicon.ico and /dev/null differ diff --git a/code/public/index.php b/code/public/index.php deleted file mode 100644 index c3b7842..0000000 --- a/code/public/index.php +++ /dev/null @@ -1,25 +0,0 @@ - -// +---------------------------------------------------------------------- - -use think\App; - -// [ 应用入口文件 ] - -require __DIR__ . '/../vendor/autoload.php'; - -// 执行HTTP应用并响应 -$http = (new App())->http; - -$response = $http->run(); - -$response->send(); - -$http->end($response); diff --git a/code/public/initdata/novel/getCatalog/description.php b/code/public/initdata/novel/getCatalog/description.php deleted file mode 100644 index 113263f..0000000 --- a/code/public/initdata/novel/getCatalog/description.php +++ /dev/null @@ -1,155 +0,0 @@ - [ - 'description' => '首页Title 模板分组', - 'sfg_id' => 1, - 'arrSubjectFomart' => [ - '{strIndexTitle}', - ] - ], - 'INDEX@INDEX@KEYWORDS' => [ - 'description' => '首页Keywords 模板分组', - 'sfg_id' => 2, - 'arrSubjectFomart' => [ - '{strIndexKeywords}', - ] - ], - 'INDEX@INDEX@DESCRIPTION' => [ - 'description' => '首页Description 模板分组', - 'sfg_id' => 3, - 'arrSubjectFomart' => [ - '{strIndexDescription}', - ] - ], - - 'NOVEL@GETLIBRARY@TITLE' => [ - 'description' => '分类书库Title 模板分组', - 'sfg_id' => 4, - 'arrSubjectFomart' => $arrLibraryTitleTemp, - ], - 'NOVEL@GETLIBRARY@KEYWORDS' => [ - 'description' => '分类书库Keywords 模板分组', - 'sfg_id' => 5, - 'arrSubjectFomart' => $arrLibraryKeyswordTemp, - ], - 'NOVEL@GETLIBRARY@DESCRIPTION' => [ - 'description' => '分类书库Description 模板分组', - 'sfg_id' => 6, - 'arrSubjectFomart' => $arrLibraryDescriptionTemp, - ], - - 'NOVEL@GETNOVELCHANNEL@TITLE' => [ - 'description' => '男女生Title 模板分组', - 'sfg_id' => 7, - 'arrSubjectFomart' => $arrSexTitleTemp, - ], - 'NOVEL@GETNOVELCHANNEL@KEYWORDS' => [ - 'description' => '男女生Keywords 模板分组', - 'sfg_id' => 8, - 'arrSubjectFomart' => $arrSexTitleTemp, - ], - 'NOVEL@GETNOVELCHANNEL@DESCRIPTION' => [ - 'description' => '男女生Description 模板分组', - 'sfg_id' => 9, - 'arrSubjectFomart' => $arrSexKeyswordTemp, - ], - - 'NOVEL@GETNOVELINFO@TITLE' => [ - 'description' => '详情Title 模板分组', - 'sfg_id' => 10, - 'arrSubjectFomart' => $arrSexDescriptionTemp, - - ], - 'NOVEL@GETNOVELINFO@KEYWORDS' => [ - 'description' => '详情Keywords 模板分组', - 'sfg_id' => 11, - 'arrSubjectFomart' => $arrNovelKeyswordTemp, - ], - 'NOVEL@GETNOVELINFO@DESCRIPTION' => [ - 'description' => '详情Description 模板分组', - 'sfg_id' => 12, - 'arrSubjectFomart' => $arrNovelDescriptionTemp, - ], - - 'NOVEL@GETNOVELCATALOG@TITLE' => [ - 'description' => '目录Title 模板分组', - 'sfg_id' => 13, - 'arrSubjectFomart' => $arrCatalogTitleTemp, - ], - 'NOVEL@GETNOVELCATALOG@KEYWORDS' => [ - 'description' => '目录Keywords 模板分组', - 'sfg_id' => 14, - 'arrSubjectFomart' => $arrCatalogKeyswordTemp, - ], - 'NOVEL@GETNOVELCATALOG@DESCRIPTION' => [ - 'description' => '目录Description 模板分组', - 'sfg_id' => 15, - 'arrSubjectFomart' => $arrCatalogDescriptionTemp, - ], - - 'NOVEL@GETNOVELCHAPTER@TITLE' => [ - 'description' => '内容Title 模板分组', - 'sfg_id' => 16, - 'arrSubjectFomart' => $arrChapterTitleTemp - ], - 'NOVEL@GETNOVELCHAPTER@KEYWORDS' => [ - 'description' => '内容Keywords 模板分组', - 'sfg_id' => 17, - 'arrSubjectFomart' => $arrChapterKeyswordTemp, - ], - 'NOVEL@GETNOVELCHAPTER@DESCRIPTION' => [ - 'description' => '内容Description 模板分组', - 'sfg_id' => 18, - 'arrSubjectFomart' => $arrChapterDescriptionTemp, - ], - - 'NOVEL@GETNOVELRANK@TITLE' => [ - 'description' => '排行榜Title 模板分组', - 'sfg_id' => 19, - 'arrSubjectFomart' => $arrRankTitleTemp, - ], - 'NOVEL@GETNOVELRANK@KEYWORDS' => [ - 'description' => '排行榜Keywords 模板分组', - 'sfg_id' => 20, - 'arrSubjectFomart' => $arrRankKeyswordTemp, - ], - 'NOVEL@GETNOVELRANK@DESCRIPTION' => [ - 'description' => '排行榜Description 模板分组', - 'sfg_id' => 21, - 'arrSubjectFomart' => $arrRankDescriptionTemp, - ], - 'NOVEL@GETSEARCHNOVEL@TITLE' => [ - 'description' => '搜索页Title 模板分组', - 'sfg_id' => 22, - 'arrSubjectFomart' => $arrSearchTitleTemp, - ], - 'NOVEL@GETSEARCHNOVEL@KEYWORDS' => [ - 'description' => '搜索页Keywords 模板分组', - 'sfg_id' => 23, - 'arrSubjectFomart' => $arrSearchKeyswordTemp, - ], - 'NOVEL@GETSEARCHNOVEL@DESCRIPTION' => [ - 'description' => '搜索页Description 模板分组', - 'sfg_id' => 24, - 'arrSubjectFomart' => $arrSearchDescriptionTemp, - ], - - // SEO 丰富内容 - 'INDEX_POPULAR_NOVELS' => [ - 'description' => '首页热门小说介绍 模板分组', - 'sfg_id' => 35, - 'arrSubjectFomart' => $arrIndexHostTemp, - ], - 'INDEX_NEWS_NOVELS' => [ - 'description' => '首页最新小说介绍 模板分组', - 'sfg_id' => 37, - 'arrSubjectFomart' => $arrIndexNewsTemp, - ], - 'INDEX_RANK_NOVELS' => [ - 'description' => '首页小说排行榜介绍 模板分组', - 'sfg_id' => 38, - 'arrSubjectFomart' => $arrIndexRankTemp, - ], -]; -return $arrTKDSubjectFomartGroupData; diff --git a/code/public/initdata/novel/urlSubjectFomartGroup.php b/code/public/initdata/novel/urlSubjectFomartGroup.php deleted file mode 100644 index e2d8d91..0000000 --- a/code/public/initdata/novel/urlSubjectFomartGroup.php +++ /dev/null @@ -1,575 +0,0 @@ - [ - 'description' => '分类书库URL 模板2', - 'sfg_id' => 39, - 'arrSubjectFomart' => [ - '/books/{strGender}/{strCategory}/{strStatus}/{strOrder}/page{intPage}', - ] - ], - 'CATEGORY_INFO_URL_T3' => [ - 'description' => '分类书库URL 模板3', - 'sfg_id' => 40, - 'arrSubjectFomart' => [ - '/library/{strGender}/{strCategory}/{strStatus}/{strOrder}/page{intPage}', - ] - ], - 'CATEGORY_INFO_URL_T4' => [ - 'description' => '分类书库URL 模板4', - 'sfg_id' => 41, - 'arrSubjectFomart' => [ - '/fenlei/{strGender}/{strCategory}/{strStatus}/{strOrder}/page{intPage}', - ] - ], - 'CATEGORY_INFO_URL_T5' => [ - 'description' => '分类书库URL 模板5', - 'sfg_id' => 42, - 'arrSubjectFomart' => [ - '/class/{strGender}/{strCategory}/{strStatus}/{strOrder}/page{intPage}', - ] - ], - 'CATEGORY_INFO_URL_T6' => [ - 'description' => '分类书库URL 模板6', - 'sfg_id' => 43, - 'arrSubjectFomart' => [ - '/category/{strGender}/{strCategory}/{strStatus}/{strOrder}/page{intPage}', - ] - ], - - // 男生小说频道URL 模板1 - 'NAN_SHENG_URL_T2' => [ - 'description' => '男生URL 模板2', - 'sfg_id' => 44, - 'arrSubjectFomart' => [ - '/boys-novel' - ] - ], - 'NAN_SHENG_URL_T3' => [ - 'description' => '男生URL 模板3', - 'sfg_id' => 45, - 'arrSubjectFomart' => [ - '/nansheng-shu' - ] - ], - 'NAN_SHENG_URL_T4' => [ - 'description' => '男生URL 模板4', - 'sfg_id' => 46, - 'arrSubjectFomart' => [ - '/man-read' - ] - ], - 'NAN_SHENG_URL_T5' => [ - 'description' => '男生URL 模板5', - 'sfg_id' => 47, - 'arrSubjectFomart' => [ - '/nansheng-book' - ] - ], - 'NAN_SHENG_URL_T6' => [ - 'description' => '男生URL 模板6', - 'sfg_id' => 48, - 'arrSubjectFomart' => [ - '/male-novels' - ] - ], - - - // 女生小说频道URL 模板1 - 'NV_SHENG_URL_T2' => [ - 'description' => '女生URL 模板2', - 'sfg_id' => 49, - 'arrSubjectFomart' => [ - '/girls-novel' - ] - ], - 'NV_SHENG_URL_T3' => [ - 'description' => '女生URL 模板3', - 'sfg_id' => 50, - 'arrSubjectFomart' => [ - '/nvsheng-shu' - ] - ], - 'NV_SHENG_URL_T4' => [ - 'description' => '女生URL 模板4', - 'sfg_id' => 51, - 'arrSubjectFomart' => [ - '/woman-read' - ] - ], - 'NV_SHENG_URL_T5' => [ - 'description' => '女生URL 模板5', - 'sfg_id' => 52, - 'arrSubjectFomart' => [ - '/nvsheng-book' - ] - ], - 'NV_SHENG_URL_T6' => [ - 'description' => '女生URL 模板6', - 'sfg_id' => 53, - 'arrSubjectFomart' => [ - '/female-novels' - ] - ], - - // 排行榜 - 'RANK_INFO_URL_T2' => [ - 'description' => '排行榜URL 模板2', - 'sfg_id' => 54, - 'arrSubjectFomart' => [ - '/rank/all' - ] - ], - 'RANK_INFO_URL_T3' => [ - 'description' => '排行榜URL 模板3', - 'sfg_id' => 55, - 'arrSubjectFomart' => [ - '/paihang-quan' - ] - ], - 'RANK_INFO_URL_T4' => [ - 'description' => '排行榜URL 模板4', - 'sfg_id' => 56, - 'arrSubjectFomart' => [ - '/top/all' - ] - ], - 'RANK_INFO_URL_T5' => [ - 'description' => '排行榜URL 模板5', - 'sfg_id' => 57, - 'arrSubjectFomart' => [ - '/paihang-bang' - ] - ], - 'RANK_INFO_URL_T6' => [ - 'description' => '排行榜URL 模板6', - 'sfg_id' => 58, - 'arrSubjectFomart' => [ - '/ranks/all' - ] - ], - - // 小说详情 url - 'NOVEL_INFO_URL_T2' => [ - 'description' => '小说详情URL 模板2', - 'sfg_id' => 59, - 'arrSubjectFomart' => [ - '/novel/{strPinYin}-{intNId}', - ] - ], - 'NOVEL_INFO_URL_T3' => [ - 'description' => '小说详情URL 模板3', - 'sfg_id' => 60, - 'arrSubjectFomart' => [ - '/book/{strPinYin}-{intNId}', - ] - ], - 'NOVEL_INFO_URL_T4' => [ - 'description' => '小说详情URL 模板4', - 'sfg_id' => 61, - 'arrSubjectFomart' => [ - '/xiaoshuo-{strPinYin}-{intNId}', - ] - ], - 'NOVEL_INFO_URL_T5' => [ - 'description' => '小说详情URL 模板5', - 'sfg_id' => 62, - 'arrSubjectFomart' => [ - '/novel-{strPinYin}-{intNId}', - ] - ], - 'NOVEL_INFO_URL_T6' => [ - 'description' => '小说详情URL 模板6', - 'sfg_id' => 63, - 'arrSubjectFomart' => [ - '/book-{strPinYin}-{intNId}', - ] - ], - - // 伪小说详情 url - 'KAN_NOVEL_INFO_URL_T2' => [ - 'description' => '伪小说详情URL 模板2', - 'sfg_id' => 64, - 'arrSubjectFomart' => [ - '/kan-novel/{strPinYin}-{intNId}-{intNForgeId}', - ] - ], - 'KAN_NOVEL_INFO_URL_T3' => [ - 'description' => '伪小说详情URL 模板3', - 'sfg_id' => 65, - 'arrSubjectFomart' => [ - '/kan-book/{strPinYin}-{intNId}-{intNForgeId}', - ] - ], - 'KAN_NOVEL_INFO_URL_T4' => [ - 'description' => '伪小说详情URL 模板4', - 'sfg_id' => 66, - 'arrSubjectFomart' => [ - '/kan-xiaoshuo-{strPinYin}-{intNId}-{intNForgeId}', - ] - ], - 'KAN_NOVEL_INFO_URL_T5' => [ - 'description' => '伪小说详情URL 模板5', - 'sfg_id' => 67, - 'arrSubjectFomart' => [ - '/kan-novel-{strPinYin}-{intNId}-{intNForgeId}', - ] - ], - 'KAN_NOVEL_INFO_URL_T6' => [ - 'description' => '伪小说详情URL 模板6', - 'sfg_id' => 68, - 'arrSubjectFomart' => [ - '/kan-book-{strPinYin}-{intNId}-{intNForgeId}', - ] - ], - - // 小说详情目录 url - 'NOVEL_CATALOG_URL_T2' => [ - 'description' => '小说目录URL 模板2', - 'sfg_id' => 69, - 'arrSubjectFomart' => [ - '/novel/{strPinYin}-{intNId}/catalog/{strOrder}/{intPage}', - ] - ], - 'NOVEL_CATALOG_URL_T3' => [ - 'description' => '小说目录URL 模板3', - 'sfg_id' => 70, - 'arrSubjectFomart' => [ - '/book/{strPinYin}-{intNId}/table/{strOrder}/{intPage}', - ] - ], - 'NOVEL_CATALOG_URL_T4' => [ - 'description' => '小说目录URL 模板4', - 'sfg_id' => 71, - 'arrSubjectFomart' => [ - '/xiaoshuo-{strPinYin}-{intNId}/mulu/{strOrder}/{intPage}', - ] - ], - 'NOVEL_CATALOG_URL_T5' => [ - 'description' => '小说目录URL 模板5', - 'sfg_id' => 72, - 'arrSubjectFomart' => [ - '/novel-{strPinYin}-{intNId}/catalog/{strOrder}/{intPage}', - ] - ], - 'NOVEL_CATALOG_URL_T6' => [ - 'description' => '小说目录URL 模板6', - 'sfg_id' => 73, - 'arrSubjectFomart' => [ - '/book-{strPinYin}-{intNId}/table/{strOrder}/{intPage}', - ] - ], - - // 小说章节 url - 'CONTENT_INFO_URL_T2' => [ - 'description' => '内容章节URL 模板2', - 'sfg_id' => 74, - 'arrSubjectFomart' => [ - '/novel/{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - ] - ], - 'CONTENT_INFO_URL_T3' => [ - 'description' => '内容章节URL 模板3', - 'sfg_id' => 75, - 'arrSubjectFomart' => [ - '/book/{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - ] - ], - 'CONTENT_INFO_URL_T4' => [ - 'description' => '内容章节URL 模板4', - 'sfg_id' => 76, - 'arrSubjectFomart' => [ - '/xiaoshuo-{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - ] - ], - 'CONTENT_INFO_URL_T5' => [ - 'description' => '内容章节URL 模板5', - 'sfg_id' => 77, - 'arrSubjectFomart' => [ - '/novel-{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - ] - ], - 'CONTENT_INFO_URL_T6' => [ - 'description' => '内容章节URL 模板6', - 'sfg_id' => 78, - 'arrSubjectFomart' => [ - '/book-{strPinYin}-{intNId}/zhang-{intChapterSort}/{intChapterPage}', - ] - ], - - /** - * 小说最新内容 url - * '/xiaoshuo/{strPinYin}-{intNId}/chapter/latest', - * '/novel/{strPinYin}-{intNId}/chapter/latest', - * '/book/{strPinYin}-{intNId}/chapter/latest', - * '/xiaoshuo-{strPinYin}-{intNId}/chapter/latest', - * '/novel-{strPinYin}-{intNId}/chapter/latest', - * '/book-{strPinYin}-{intNId}/chapter/latest', - */ - 'NEWS_CONTENT_INFO_URL_T2' => [ - 'description' => '最新内容章节URL 模板2', - 'sfg_id' => 79, - 'arrSubjectFomart' => [ - '/novel/{strPinYin}-{intNId}/chapter/latest', - ] - ], - 'NEWS_CONTENT_INFO_URL_T3' => [ - 'description' => '最新内容章节URL 模板3', - 'sfg_id' => 80, - 'arrSubjectFomart' => [ - '/book/{strPinYin}-{intNId}/chapter/latest', - ] - ], - 'NEWS_CONTENT_INFO_URL_T4' => [ - 'description' => '最新内容章节URL 模板4', - 'sfg_id' => 81, - 'arrSubjectFomart' => [ - '/xiaoshuo-{strPinYin}-{intNId}/chapter/latest', - ] - ], - 'NEWS_CONTENT_INFO_URL_T5' => [ - 'description' => '最新内容章节URL 模板5', - 'sfg_id' => 82, - 'arrSubjectFomart' => [ - '/novel-{strPinYin}-{intNId}/chapter/latest', - ] - ], - 'NEWS_CONTENT_INFO_URL_T6' => [ - 'description' => '最新内容章节URL 模板6', - 'sfg_id' => 83, - 'arrSubjectFomart' => [ - '/book-{strPinYin}-{intNId}/chapter/latest', - ] - ], - - // 搜索页 - 'SEARCH_INFO_URL_T2' => [ - 'description' => '搜索页URL 模板2', - 'sfg_id' => 84, - 'arrSubjectFomart' => [ - '/explore.html?keyword={strSearchKeywords}&page={intPage}', - ] - ], - 'SEARCH_INFO_URL_T3' => [ - 'description' => '搜索页URL 模板3', - 'sfg_id' => 85, - 'arrSubjectFomart' => [ - '/sousuo.html?keyword={strSearchKeywords}&page={intPage}', - ] - ], - 'SEARCH_INFO_URL_T4' => [ - 'description' => '搜索页URL 模板4', - 'sfg_id' => 86, - 'arrSubjectFomart' => [ - '/find.html?keyword={strSearchKeywords}&page={intPage}', - ] - ], - 'SEARCH_INFO_URL_T5' => [ - 'description' => '搜索页URL 模板5', - 'sfg_id' => 87, - 'arrSubjectFomart' => [ - '/query.html?keyword={strSearchKeywords}&page={intPage}', - ] - ], - 'SEARCH_INFO_URL_T6' => [ - 'description' => '搜索页URL 模板6', - 'sfg_id' => 88, - 'arrSubjectFomart' => [ - '/keywords.html?keyword={strSearchKeywords}&page={intPage}', - ] - ], - - // 历史记录 - 'HISTORY_INFO_URL_T2' => [ - 'description' => '历史记录URL 模板2', - 'sfg_id' => 92, - 'arrSubjectFomart' => [ - '/reading-history', - ] - ], - 'HISTORY_INFO_URL_T3' => [ - 'description' => '历史记录URL 模板3', - 'sfg_id' => 93, - 'arrSubjectFomart' => [ - '/read-record', - ] - ], - 'HISTORY_INFO_URL_T4' => [ - 'description' => '历史记录URL 模板4', - 'sfg_id' => 94, - 'arrSubjectFomart' => [ - '/lishi', - ] - ], - 'HISTORY_INFO_URL_T5' => [ - 'description' => '历史记录URL 模板5', - 'sfg_id' => 95, - 'arrSubjectFomart' => [ - '/yuedu-lishi', - ] - ], - 'HISTORY_INFO_URL_T6' => [ - 'description' => '历史记录URL 模板6', - 'sfg_id' => 96, - 'arrSubjectFomart' => [ - '/browse-past', - ] - ], - - // 书架 - 'SHUJIA_INFO_URL_T2' => [ - 'description' => '书架URL 模板2', - 'sfg_id' => 97, - 'arrSubjectFomart' => [ - '/book-shelf', - ] - ], - 'SHUJIA_INFO_URL_T3' => [ - 'description' => '书架URL 模板3', - 'sfg_id' => 98, - 'arrSubjectFomart' => [ - '/reading-shelf', - ] - ], - 'SHUJIA_INFO_URL_T4' => [ - 'description' => '书架URL 模板4', - 'sfg_id' => 99, - 'arrSubjectFomart' => [ - '/shujia', - ] - ], - 'SHUJIA_INFO_URL_T5' => [ - 'description' => '书架URL 模板5', - 'sfg_id' => 100, - 'arrSubjectFomart' => [ - '/yuedu-shujia', - ] - ], - 'SHUJIA_INFO_URL_T6' => [ - 'description' => '书架URL 模板6', - 'sfg_id' => 101, - 'arrSubjectFomart' => [ - '/book-collection', - ] - ], - - // 用户中心 - 'USER_INFO_URL_T2' => [ - 'description' => '用户中心URL 模板2', - 'sfg_id' => 102, - 'arrSubjectFomart' => [ - '/my-account', - ] - ], - 'USER_INFO_URL_T3' => [ - 'description' => '用户中心URL 模板3', - 'sfg_id' => 103, - 'arrSubjectFomart' => [ - '/profile', - ] - ], - 'USER_INFO_URL_T4' => [ - 'description' => '用户中心URL 模板4', - 'sfg_id' => 104, - 'arrSubjectFomart' => [ - '/yonghu', - ] - ], - 'USER_INFO_URL_T5' => [ - 'description' => '用户中心URL 模板5', - 'sfg_id' => 105, - 'arrSubjectFomart' => [ - '/wode-zhongxin', - ] - ], - 'USER_INFO_URL_T6' => [ - 'description' => '用户中心URL 模板6', - 'sfg_id' => 106, - 'arrSubjectFomart' => [ - '/personal-center', - ] - ], - - // 书库首页 - 'CATEGORY_INDEX_URL_T2' => [ - 'description' => '书库首页URL 模板2', - 'sfg_id' => 109, - 'arrSubjectFomart' => [ - '/books/index', - ] - ], - 'CATEGORY_INDEX_URL_T3' => [ - 'description' => '书库首页URL 模板3', - 'sfg_id' => 110, - 'arrSubjectFomart' => [ - '/library/index', - ] - ], - 'CATEGORY_INDEX_URL_T4' => [ - 'description' => '书库首页URL 模板4', - 'sfg_id' => 111, - 'arrSubjectFomart' => [ - '/fenlei/index', - ] - ], - 'CATEGORY_INDEX_URL_T5' => [ - 'description' => '书库首页URL 模板5', - 'sfg_id' => 112, - 'arrSubjectFomart' => [ - '/class/index', - ] - ], - 'CATEGORY_INDEX_URL_T6' => [ - 'description' => '书库首页URL 模板6', - 'sfg_id' => 113, - 'arrSubjectFomart' => [ - '/category/index', - ] - ], - - // 搜索首页 - 'SEARCH_INDEX_URL_T2' => [ - 'description' => '搜索首页URL 模板2', - 'sfg_id' => 115, - 'arrSubjectFomart' => [ - '/explore.html', - ] - ], - 'SEARCH_INDEX_URL_T3' => [ - 'description' => '搜索首页URL 模板3', - 'sfg_id' => 116, - 'arrSubjectFomart' => [ - '/sousuo.html', - ] - ], - 'SEARCH_INDEX_URL_T4' => [ - 'description' => '搜索首页URL 模板4', - 'sfg_id' => 117, - 'arrSubjectFomart' => [ - '/find.html', - ] - ], - 'SEARCH_INDEX_URL_T5' => [ - 'description' => '搜索首页URL 模板5', - 'sfg_id' => 118, - 'arrSubjectFomart' => [ - '/query.html', - ] - ], - 'SEARCH_INDEX_URL_T6' => [ - 'description' => '搜索首页URL 模板6', - 'sfg_id' => 119, - 'arrSubjectFomart' => [ - '/keywords.html', - ] - ], - - - // 最新替换模板分组id 119 - -]; diff --git a/code/public/public/jquery/jquery-3.7.1.min.js b/code/public/public/jquery/jquery-3.7.1.min.js deleted file mode 100644 index 1cded40..0000000 --- a/code/public/public/jquery/jquery-3.7.1.min.js +++ /dev/null @@ -1,4146 +0,0 @@ -/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e, t) { - "use strict"; - "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function(e) { - if (!e.document) - throw new Error("jQuery requires a window with a document"); - return t(e) - } - : t(e) -}("undefined" != typeof window ? window : this, function(ie, e) { - "use strict"; - var oe = [] - , r = Object.getPrototypeOf - , ae = oe.slice - , g = oe.flat ? function(e) { - return oe.flat.call(e) - } - : function(e) { - return oe.concat.apply([], e) - } - , s = oe.push - , se = oe.indexOf - , n = {} - , i = n.toString - , ue = n.hasOwnProperty - , o = ue.toString - , a = o.call(Object) - , le = {} - , v = function(e) { - return "function" == typeof e && "number" != typeof e.nodeType && "function" != typeof e.item - } - , y = function(e) { - return null != e && e === e.window - } - , C = ie.document - , u = { - type: !0, - src: !0, - nonce: !0, - noModule: !0 - }; - function m(e, t, n) { - var r, i, o = (n = n || C).createElement("script"); - if (o.text = e, - t) - for (r in u) - (i = t[r] || t.getAttribute && t.getAttribute(r)) && o.setAttribute(r, i); - n.head.appendChild(o).parentNode.removeChild(o) - } - function x(e) { - return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[i.call(e)] || "object" : typeof e - } - var t = "3.7.1" - , l = /HTML$/i - , ce = function(e, t) { - return new ce.fn.init(e,t) - }; - function c(e) { - var t = !!e && "length"in e && e.length - , n = x(e); - return !v(e) && !y(e) && ("array" === n || 0 === t || "number" == typeof t && 0 < t && t - 1 in e) - } - function fe(e, t) { - return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() - } - ce.fn = ce.prototype = { - jquery: t, - constructor: ce, - length: 0, - toArray: function() { - return ae.call(this) - }, - get: function(e) { - return null == e ? ae.call(this) : e < 0 ? this[e + this.length] : this[e] - }, - pushStack: function(e) { - var t = ce.merge(this.constructor(), e); - return t.prevObject = this, - t - }, - each: function(e) { - return ce.each(this, e) - }, - map: function(n) { - return this.pushStack(ce.map(this, function(e, t) { - return n.call(e, t, e) - })) - }, - slice: function() { - return this.pushStack(ae.apply(this, arguments)) - }, - first: function() { - return this.eq(0) - }, - last: function() { - return this.eq(-1) - }, - even: function() { - return this.pushStack(ce.grep(this, function(e, t) { - return (t + 1) % 2 - })) - }, - odd: function() { - return this.pushStack(ce.grep(this, function(e, t) { - return t % 2 - })) - }, - eq: function(e) { - var t = this.length - , n = +e + (e < 0 ? t : 0); - return this.pushStack(0 <= n && n < t ? [this[n]] : []) - }, - end: function() { - return this.prevObject || this.constructor() - }, - push: s, - sort: oe.sort, - splice: oe.splice - }, - ce.extend = ce.fn.extend = function() { - var e, t, n, r, i, o, a = arguments[0] || {}, s = 1, u = arguments.length, l = !1; - for ("boolean" == typeof a && (l = a, - a = arguments[s] || {}, - s++), - "object" == typeof a || v(a) || (a = {}), - s === u && (a = this, - s--); s < u; s++) - if (null != (e = arguments[s])) - for (t in e) - r = e[t], - "__proto__" !== t && a !== r && (l && r && (ce.isPlainObject(r) || (i = Array.isArray(r))) ? (n = a[t], - o = i && !Array.isArray(n) ? [] : i || ce.isPlainObject(n) ? n : {}, - i = !1, - a[t] = ce.extend(l, o, r)) : void 0 !== r && (a[t] = r)); - return a - } - , - ce.extend({ - expando: "jQuery" + (t + Math.random()).replace(/\D/g, ""), - isReady: !0, - error: function(e) { - throw new Error(e) - }, - noop: function() {}, - isPlainObject: function(e) { - var t, n; - return !(!e || "[object Object]" !== i.call(e)) && (!(t = r(e)) || "function" == typeof (n = ue.call(t, "constructor") && t.constructor) && o.call(n) === a) - }, - isEmptyObject: function(e) { - var t; - for (t in e) - return !1; - return !0 - }, - globalEval: function(e, t, n) { - m(e, { - nonce: t && t.nonce - }, n) - }, - each: function(e, t) { - var n, r = 0; - if (c(e)) { - for (n = e.length; r < n; r++) - if (!1 === t.call(e[r], r, e[r])) - break - } else - for (r in e) - if (!1 === t.call(e[r], r, e[r])) - break; - return e - }, - text: function(e) { - var t, n = "", r = 0, i = e.nodeType; - if (!i) - while (t = e[r++]) - n += ce.text(t); - return 1 === i || 11 === i ? e.textContent : 9 === i ? e.documentElement.textContent : 3 === i || 4 === i ? e.nodeValue : n - }, - makeArray: function(e, t) { - var n = t || []; - return null != e && (c(Object(e)) ? ce.merge(n, "string" == typeof e ? [e] : e) : s.call(n, e)), - n - }, - inArray: function(e, t, n) { - return null == t ? -1 : se.call(t, e, n) - }, - isXMLDoc: function(e) { - var t = e && e.namespaceURI - , n = e && (e.ownerDocument || e).documentElement; - return !l.test(t || n && n.nodeName || "HTML") - }, - merge: function(e, t) { - for (var n = +t.length, r = 0, i = e.length; r < n; r++) - e[i++] = t[r]; - return e.length = i, - e - }, - grep: function(e, t, n) { - for (var r = [], i = 0, o = e.length, a = !n; i < o; i++) - !t(e[i], i) !== a && r.push(e[i]); - return r - }, - map: function(e, t, n) { - var r, i, o = 0, a = []; - if (c(e)) - for (r = e.length; o < r; o++) - null != (i = t(e[o], o, n)) && a.push(i); - else - for (o in e) - null != (i = t(e[o], o, n)) && a.push(i); - return g(a) - }, - guid: 1, - support: le - }), - "function" == typeof Symbol && (ce.fn[Symbol.iterator] = oe[Symbol.iterator]), - ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function(e, t) { - n["[object " + t + "]"] = t.toLowerCase() - }); - var pe = oe.pop - , de = oe.sort - , he = oe.splice - , ge = "[\\x20\\t\\r\\n\\f]" - , ve = new RegExp("^" + ge + "+|((?:^|[^\\\\])(?:\\\\.)*)" + ge + "+$","g"); - ce.contains = function(e, t) { - var n = t && t.parentNode; - return e === n || !(!n || 1 !== n.nodeType || !(e.contains ? e.contains(n) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(n))) - } - ; - var f = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - function p(e, t) { - return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e - } - ce.escapeSelector = function(e) { - return (e + "").replace(f, p) - } - ; - var ye = C - , me = s; - !function() { - var e, b, w, o, a, T, r, C, d, i, k = me, S = ce.expando, E = 0, n = 0, s = W(), c = W(), u = W(), h = W(), l = function(e, t) { - return e === t && (a = !0), - 0 - }, f = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", t = "(?:\\\\[\\da-fA-F]{1,6}" + ge + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", p = "\\[" + ge + "*(" + t + ")(?:" + ge + "*([*^$|!~]?=)" + ge + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + t + "))|)" + ge + "*\\]", g = ":(" + t + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + p + ")*)|.*)\\)|)", v = new RegExp(ge + "+","g"), y = new RegExp("^" + ge + "*," + ge + "*"), m = new RegExp("^" + ge + "*([>+~]|" + ge + ")" + ge + "*"), x = new RegExp(ge + "|>"), j = new RegExp(g), A = new RegExp("^" + t + "$"), D = { - ID: new RegExp("^#(" + t + ")"), - CLASS: new RegExp("^\\.(" + t + ")"), - TAG: new RegExp("^(" + t + "|[*])"), - ATTR: new RegExp("^" + p), - PSEUDO: new RegExp("^" + g), - CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + ge + "*(even|odd|(([+-]|)(\\d*)n|)" + ge + "*(?:([+-]|)" + ge + "*(\\d+)|))" + ge + "*\\)|)","i"), - bool: new RegExp("^(?:" + f + ")$","i"), - needsContext: new RegExp("^" + ge + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + ge + "*((?:-\\d)?\\d*)" + ge + "*\\)|)(?=[^-]|$)","i") - }, N = /^(?:input|select|textarea|button)$/i, q = /^h\d$/i, L = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, H = /[+~]/, O = new RegExp("\\\\[\\da-fA-F]{1,6}" + ge + "?|\\\\([^\\r\\n\\f])","g"), P = function(e, t) { - var n = "0x" + e.slice(1) - 65536; - return t || (n < 0 ? String.fromCharCode(n + 65536) : String.fromCharCode(n >> 10 | 55296, 1023 & n | 56320)) - }, M = function() { - V() - }, R = J(function(e) { - return !0 === e.disabled && fe(e, "fieldset") - }, { - dir: "parentNode", - next: "legend" - }); - try { - k.apply(oe = ae.call(ye.childNodes), ye.childNodes), - oe[ye.childNodes.length].nodeType - } catch (e) { - k = { - apply: function(e, t) { - me.apply(e, ae.call(t)) - }, - call: function(e) { - me.apply(e, ae.call(arguments, 1)) - } - } - } - function I(t, e, n, r) { - var i, o, a, s, u, l, c, f = e && e.ownerDocument, p = e ? e.nodeType : 9; - if (n = n || [], - "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p) - return n; - if (!r && (V(e), - e = e || T, - C)) { - if (11 !== p && (u = L.exec(t))) - if (i = u[1]) { - if (9 === p) { - if (!(a = e.getElementById(i))) - return n; - if (a.id === i) - return k.call(n, a), - n - } else if (f && (a = f.getElementById(i)) && I.contains(e, a) && a.id === i) - return k.call(n, a), - n - } else { - if (u[2]) - return k.apply(n, e.getElementsByTagName(t)), - n; - if ((i = u[3]) && e.getElementsByClassName) - return k.apply(n, e.getElementsByClassName(i)), - n - } - if (!(h[t + " "] || d && d.test(t))) { - if (c = t, - f = e, - 1 === p && (x.test(t) || m.test(t))) { - (f = H.test(t) && U(e.parentNode) || e) == e && le.scope || ((s = e.getAttribute("id")) ? s = ce.escapeSelector(s) : e.setAttribute("id", s = S)), - o = (l = Y(t)).length; - while (o--) - l[o] = (s ? "#" + s : ":scope") + " " + Q(l[o]); - c = l.join(",") - } - try { - return k.apply(n, f.querySelectorAll(c)), - n - } catch (e) { - h(t, !0) - } finally { - s === S && e.removeAttribute("id") - } - } - } - return re(t.replace(ve, "$1"), e, n, r) - } - function W() { - var r = []; - return function e(t, n) { - return r.push(t + " ") > b.cacheLength && delete e[r.shift()], - e[t + " "] = n - } - } - function F(e) { - return e[S] = !0, - e - } - function $(e) { - var t = T.createElement("fieldset"); - try { - return !!e(t) - } catch (e) { - return !1 - } finally { - t.parentNode && t.parentNode.removeChild(t), - t = null - } - } - function B(t) { - return function(e) { - return fe(e, "input") && e.type === t - } - } - function _(t) { - return function(e) { - return (fe(e, "input") || fe(e, "button")) && e.type === t - } - } - function z(t) { - return function(e) { - return "form"in e ? e.parentNode && !1 === e.disabled ? "label"in e ? "label"in e.parentNode ? e.parentNode.disabled === t : e.disabled === t : e.isDisabled === t || e.isDisabled !== !t && R(e) === t : e.disabled === t : "label"in e && e.disabled === t - } - } - function X(a) { - return F(function(o) { - return o = +o, - F(function(e, t) { - var n, r = a([], e.length, o), i = r.length; - while (i--) - e[n = r[i]] && (e[n] = !(t[n] = e[n])) - }) - }) - } - function U(e) { - return e && "undefined" != typeof e.getElementsByTagName && e - } - function V(e) { - var t, n = e ? e.ownerDocument || e : ye; - return n != T && 9 === n.nodeType && n.documentElement && (r = (T = n).documentElement, - C = !ce.isXMLDoc(T), - i = r.matches || r.webkitMatchesSelector || r.msMatchesSelector, - r.msMatchesSelector && ye != T && (t = T.defaultView) && t.top !== t && t.addEventListener("unload", M), - le.getById = $(function(e) { - return r.appendChild(e).id = ce.expando, - !T.getElementsByName || !T.getElementsByName(ce.expando).length - }), - le.disconnectedMatch = $(function(e) { - return i.call(e, "*") - }), - le.scope = $(function() { - return T.querySelectorAll(":scope") - }), - le.cssHas = $(function() { - try { - return T.querySelector(":has(*,:jqfake)"), - !1 - } catch (e) { - return !0 - } - }), - le.getById ? (b.filter.ID = function(e) { - var t = e.replace(O, P); - return function(e) { - return e.getAttribute("id") === t - } - } - , - b.find.ID = function(e, t) { - if ("undefined" != typeof t.getElementById && C) { - var n = t.getElementById(e); - return n ? [n] : [] - } - } - ) : (b.filter.ID = function(e) { - var n = e.replace(O, P); - return function(e) { - var t = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); - return t && t.value === n - } - } - , - b.find.ID = function(e, t) { - if ("undefined" != typeof t.getElementById && C) { - var n, r, i, o = t.getElementById(e); - if (o) { - if ((n = o.getAttributeNode("id")) && n.value === e) - return [o]; - i = t.getElementsByName(e), - r = 0; - while (o = i[r++]) - if ((n = o.getAttributeNode("id")) && n.value === e) - return [o] - } - return [] - } - } - ), - b.find.TAG = function(e, t) { - return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : t.querySelectorAll(e) - } - , - b.find.CLASS = function(e, t) { - if ("undefined" != typeof t.getElementsByClassName && C) - return t.getElementsByClassName(e) - } - , - d = [], - $(function(e) { - var t; - r.appendChild(e).innerHTML = "", - e.querySelectorAll("[selected]").length || d.push("\\[" + ge + "*(?:value|" + f + ")"), - e.querySelectorAll("[id~=" + S + "-]").length || d.push("~="), - e.querySelectorAll("a#" + S + "+*").length || d.push(".#.+[+~]"), - e.querySelectorAll(":checked").length || d.push(":checked"), - (t = T.createElement("input")).setAttribute("type", "hidden"), - e.appendChild(t).setAttribute("name", "D"), - r.appendChild(e).disabled = !0, - 2 !== e.querySelectorAll(":disabled").length && d.push(":enabled", ":disabled"), - (t = T.createElement("input")).setAttribute("name", ""), - e.appendChild(t), - e.querySelectorAll("[name='']").length || d.push("\\[" + ge + "*name" + ge + "*=" + ge + "*(?:''|\"\")") - }), - le.cssHas || d.push(":has"), - d = d.length && new RegExp(d.join("|")), - l = function(e, t) { - if (e === t) - return a = !0, - 0; - var n = !e.compareDocumentPosition - !t.compareDocumentPosition; - return n || (1 & (n = (e.ownerDocument || e) == (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !le.sortDetached && t.compareDocumentPosition(e) === n ? e === T || e.ownerDocument == ye && I.contains(ye, e) ? -1 : t === T || t.ownerDocument == ye && I.contains(ye, t) ? 1 : o ? se.call(o, e) - se.call(o, t) : 0 : 4 & n ? -1 : 1) - } - ), - T - } - for (e in I.matches = function(e, t) { - return I(e, null, null, t) - } - , - I.matchesSelector = function(e, t) { - if (V(e), - C && !h[t + " "] && (!d || !d.test(t))) - try { - var n = i.call(e, t); - if (n || le.disconnectedMatch || e.document && 11 !== e.document.nodeType) - return n - } catch (e) { - h(t, !0) - } - return 0 < I(t, T, null, [e]).length - } - , - I.contains = function(e, t) { - return (e.ownerDocument || e) != T && V(e), - ce.contains(e, t) - } - , - I.attr = function(e, t) { - (e.ownerDocument || e) != T && V(e); - var n = b.attrHandle[t.toLowerCase()] - , r = n && ue.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !C) : void 0; - return void 0 !== r ? r : e.getAttribute(t) - } - , - I.error = function(e) { - throw new Error("Syntax error, unrecognized expression: " + e) - } - , - ce.uniqueSort = function(e) { - var t, n = [], r = 0, i = 0; - if (a = !le.sortStable, - o = !le.sortStable && ae.call(e, 0), - de.call(e, l), - a) { - while (t = e[i++]) - t === e[i] && (r = n.push(i)); - while (r--) - he.call(e, n[r], 1) - } - return o = null, - e - } - , - ce.fn.uniqueSort = function() { - return this.pushStack(ce.uniqueSort(ae.apply(this))) - } - , - (b = ce.expr = { - cacheLength: 50, - createPseudo: F, - match: D, - attrHandle: {}, - find: {}, - relative: { - ">": { - dir: "parentNode", - first: !0 - }, - " ": { - dir: "parentNode" - }, - "+": { - dir: "previousSibling", - first: !0 - }, - "~": { - dir: "previousSibling" - } - }, - preFilter: { - ATTR: function(e) { - return e[1] = e[1].replace(O, P), - e[3] = (e[3] || e[4] || e[5] || "").replace(O, P), - "~=" === e[2] && (e[3] = " " + e[3] + " "), - e.slice(0, 4) - }, - CHILD: function(e) { - return e[1] = e[1].toLowerCase(), - "nth" === e[1].slice(0, 3) ? (e[3] || I.error(e[0]), - e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), - e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && I.error(e[0]), - e - }, - PSEUDO: function(e) { - var t, n = !e[6] && e[2]; - return D.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && j.test(n) && (t = Y(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), - e[2] = n.slice(0, t)), - e.slice(0, 3)) - } - }, - filter: { - TAG: function(e) { - var t = e.replace(O, P).toLowerCase(); - return "*" === e ? function() { - return !0 - } - : function(e) { - return fe(e, t) - } - }, - CLASS: function(e) { - var t = s[e + " "]; - return t || (t = new RegExp("(^|" + ge + ")" + e + "(" + ge + "|$)")) && s(e, function(e) { - return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") - }) - }, - ATTR: function(n, r, i) { - return function(e) { - var t = I.attr(e, n); - return null == t ? "!=" === r : !r || (t += "", - "=" === r ? t === i : "!=" === r ? t !== i : "^=" === r ? i && 0 === t.indexOf(i) : "*=" === r ? i && -1 < t.indexOf(i) : "$=" === r ? i && t.slice(-i.length) === i : "~=" === r ? -1 < (" " + t.replace(v, " ") + " ").indexOf(i) : "|=" === r && (t === i || t.slice(0, i.length + 1) === i + "-")) - } - }, - CHILD: function(d, e, t, h, g) { - var v = "nth" !== d.slice(0, 3) - , y = "last" !== d.slice(-4) - , m = "of-type" === e; - return 1 === h && 0 === g ? function(e) { - return !!e.parentNode - } - : function(e, t, n) { - var r, i, o, a, s, u = v !== y ? "nextSibling" : "previousSibling", l = e.parentNode, c = m && e.nodeName.toLowerCase(), f = !n && !m, p = !1; - if (l) { - if (v) { - while (u) { - o = e; - while (o = o[u]) - if (m ? fe(o, c) : 1 === o.nodeType) - return !1; - s = u = "only" === d && !s && "nextSibling" - } - return !0 - } - if (s = [y ? l.firstChild : l.lastChild], - y && f) { - p = (a = (r = (i = l[S] || (l[S] = {}))[d] || [])[0] === E && r[1]) && r[2], - o = a && l.childNodes[a]; - while (o = ++a && o && o[u] || (p = a = 0) || s.pop()) - if (1 === o.nodeType && ++p && o === e) { - i[d] = [E, a, p]; - break - } - } else if (f && (p = a = (r = (i = e[S] || (e[S] = {}))[d] || [])[0] === E && r[1]), - !1 === p) - while (o = ++a && o && o[u] || (p = a = 0) || s.pop()) - if ((m ? fe(o, c) : 1 === o.nodeType) && ++p && (f && ((i = o[S] || (o[S] = {}))[d] = [E, p]), - o === e)) - break; - return (p -= g) === h || p % h == 0 && 0 <= p / h - } - } - }, - PSEUDO: function(e, o) { - var t, a = b.pseudos[e] || b.setFilters[e.toLowerCase()] || I.error("unsupported pseudo: " + e); - return a[S] ? a(o) : 1 < a.length ? (t = [e, e, "", o], - b.setFilters.hasOwnProperty(e.toLowerCase()) ? F(function(e, t) { - var n, r = a(e, o), i = r.length; - while (i--) - e[n = se.call(e, r[i])] = !(t[n] = r[i]) - }) : function(e) { - return a(e, 0, t) - } - ) : a - } - }, - pseudos: { - not: F(function(e) { - var r = [] - , i = [] - , s = ne(e.replace(ve, "$1")); - return s[S] ? F(function(e, t, n, r) { - var i, o = s(e, null, r, []), a = e.length; - while (a--) - (i = o[a]) && (e[a] = !(t[a] = i)) - }) : function(e, t, n) { - return r[0] = e, - s(r, null, n, i), - r[0] = null, - !i.pop() - } - }), - has: F(function(t) { - return function(e) { - return 0 < I(t, e).length - } - }), - contains: F(function(t) { - return t = t.replace(O, P), - function(e) { - return -1 < (e.textContent || ce.text(e)).indexOf(t) - } - }), - lang: F(function(n) { - return A.test(n || "") || I.error("unsupported lang: " + n), - n = n.replace(O, P).toLowerCase(), - function(e) { - var t; - do { - if (t = C ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang")) - return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-") - } while ((e = e.parentNode) && 1 === e.nodeType); - return !1 - } - }), - target: function(e) { - var t = ie.location && ie.location.hash; - return t && t.slice(1) === e.id - }, - root: function(e) { - return e === r - }, - focus: function(e) { - return e === function() { - try { - return T.activeElement - } catch (e) {} - }() && T.hasFocus() && !!(e.type || e.href || ~e.tabIndex) - }, - enabled: z(!1), - disabled: z(!0), - checked: function(e) { - return fe(e, "input") && !!e.checked || fe(e, "option") && !!e.selected - }, - selected: function(e) { - return e.parentNode && e.parentNode.selectedIndex, - !0 === e.selected - }, - empty: function(e) { - for (e = e.firstChild; e; e = e.nextSibling) - if (e.nodeType < 6) - return !1; - return !0 - }, - parent: function(e) { - return !b.pseudos.empty(e) - }, - header: function(e) { - return q.test(e.nodeName) - }, - input: function(e) { - return N.test(e.nodeName) - }, - button: function(e) { - return fe(e, "input") && "button" === e.type || fe(e, "button") - }, - text: function(e) { - var t; - return fe(e, "input") && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) - }, - first: X(function() { - return [0] - }), - last: X(function(e, t) { - return [t - 1] - }), - eq: X(function(e, t, n) { - return [n < 0 ? n + t : n] - }), - even: X(function(e, t) { - for (var n = 0; n < t; n += 2) - e.push(n); - return e - }), - odd: X(function(e, t) { - for (var n = 1; n < t; n += 2) - e.push(n); - return e - }), - lt: X(function(e, t, n) { - var r; - for (r = n < 0 ? n + t : t < n ? t : n; 0 <= --r; ) - e.push(r); - return e - }), - gt: X(function(e, t, n) { - for (var r = n < 0 ? n + t : n; ++r < t; ) - e.push(r); - return e - }) - } - }).pseudos.nth = b.pseudos.eq, - { - radio: !0, - checkbox: !0, - file: !0, - password: !0, - image: !0 - }) - b.pseudos[e] = B(e); - for (e in { - submit: !0, - reset: !0 - }) - b.pseudos[e] = _(e); - function G() {} - function Y(e, t) { - var n, r, i, o, a, s, u, l = c[e + " "]; - if (l) - return t ? 0 : l.slice(0); - a = e, - s = [], - u = b.preFilter; - while (a) { - for (o in n && !(r = y.exec(a)) || (r && (a = a.slice(r[0].length) || a), - s.push(i = [])), - n = !1, - (r = m.exec(a)) && (n = r.shift(), - i.push({ - value: n, - type: r[0].replace(ve, " ") - }), - a = a.slice(n.length)), - b.filter) - !(r = D[o].exec(a)) || u[o] && !(r = u[o](r)) || (n = r.shift(), - i.push({ - value: n, - type: o, - matches: r - }), - a = a.slice(n.length)); - if (!n) - break - } - return t ? a.length : a ? I.error(e) : c(e, s).slice(0) - } - function Q(e) { - for (var t = 0, n = e.length, r = ""; t < n; t++) - r += e[t].value; - return r - } - function J(a, e, t) { - var s = e.dir - , u = e.next - , l = u || s - , c = t && "parentNode" === l - , f = n++; - return e.first ? function(e, t, n) { - while (e = e[s]) - if (1 === e.nodeType || c) - return a(e, t, n); - return !1 - } - : function(e, t, n) { - var r, i, o = [E, f]; - if (n) { - while (e = e[s]) - if ((1 === e.nodeType || c) && a(e, t, n)) - return !0 - } else - while (e = e[s]) - if (1 === e.nodeType || c) - if (i = e[S] || (e[S] = {}), - u && fe(e, u)) - e = e[s] || e; - else { - if ((r = i[l]) && r[0] === E && r[1] === f) - return o[2] = r[2]; - if ((i[l] = o)[2] = a(e, t, n)) - return !0 - } - return !1 - } - } - function K(i) { - return 1 < i.length ? function(e, t, n) { - var r = i.length; - while (r--) - if (!i[r](e, t, n)) - return !1; - return !0 - } - : i[0] - } - function Z(e, t, n, r, i) { - for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++) - (o = e[s]) && (n && !n(o, r, i) || (a.push(o), - l && t.push(s))); - return a - } - function ee(d, h, g, v, y, e) { - return v && !v[S] && (v = ee(v)), - y && !y[S] && (y = ee(y, e)), - F(function(e, t, n, r) { - var i, o, a, s, u = [], l = [], c = t.length, f = e || function(e, t, n) { - for (var r = 0, i = t.length; r < i; r++) - I(e, t[r], n); - return n - }(h || "*", n.nodeType ? [n] : n, []), p = !d || !e && h ? f : Z(f, u, d, n, r); - if (g ? g(p, s = y || (e ? d : c || v) ? [] : t, n, r) : s = p, - v) { - i = Z(s, l), - v(i, [], n, r), - o = i.length; - while (o--) - (a = i[o]) && (s[l[o]] = !(p[l[o]] = a)) - } - if (e) { - if (y || d) { - if (y) { - i = [], - o = s.length; - while (o--) - (a = s[o]) && i.push(p[o] = a); - y(null, s = [], i, r) - } - o = s.length; - while (o--) - (a = s[o]) && -1 < (i = y ? se.call(e, a) : u[o]) && (e[i] = !(t[i] = a)) - } - } else - s = Z(s === t ? s.splice(c, s.length) : s), - y ? y(null, t, s, r) : k.apply(t, s) - }) - } - function te(e) { - for (var i, t, n, r = e.length, o = b.relative[e[0].type], a = o || b.relative[" "], s = o ? 1 : 0, u = J(function(e) { - return e === i - }, a, !0), l = J(function(e) { - return -1 < se.call(i, e) - }, a, !0), c = [function(e, t, n) { - var r = !o && (n || t != w) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n)); - return i = null, - r - } - ]; s < r; s++) - if (t = b.relative[e[s].type]) - c = [J(K(c), t)]; - else { - if ((t = b.filter[e[s].type].apply(null, e[s].matches))[S]) { - for (n = ++s; n < r; n++) - if (b.relative[e[n].type]) - break; - return ee(1 < s && K(c), 1 < s && Q(e.slice(0, s - 1).concat({ - value: " " === e[s - 2].type ? "*" : "" - })).replace(ve, "$1"), t, s < n && te(e.slice(s, n)), n < r && te(e = e.slice(n)), n < r && Q(e)) - } - c.push(t) - } - return K(c) - } - function ne(e, t) { - var n, v, y, m, x, r, i = [], o = [], a = u[e + " "]; - if (!a) { - t || (t = Y(e)), - n = t.length; - while (n--) - (a = te(t[n]))[S] ? i.push(a) : o.push(a); - (a = u(e, (v = o, - m = 0 < (y = i).length, - x = 0 < v.length, - r = function(e, t, n, r, i) { - var o, a, s, u = 0, l = "0", c = e && [], f = [], p = w, d = e || x && b.find.TAG("*", i), h = E += null == p ? 1 : Math.random() || .1, g = d.length; - for (i && (w = t == T || t || i); l !== g && null != (o = d[l]); l++) { - if (x && o) { - a = 0, - t || o.ownerDocument == T || (V(o), - n = !C); - while (s = v[a++]) - if (s(o, t || T, n)) { - k.call(r, o); - break - } - i && (E = h) - } - m && ((o = !s && o) && u--, - e && c.push(o)) - } - if (u += l, - m && l !== u) { - a = 0; - while (s = y[a++]) - s(c, f, t, n); - if (e) { - if (0 < u) - while (l--) - c[l] || f[l] || (f[l] = pe.call(r)); - f = Z(f) - } - k.apply(r, f), - i && !e && 0 < f.length && 1 < u + y.length && ce.uniqueSort(r) - } - return i && (E = h, - w = p), - c - } - , - m ? F(r) : r))).selector = e - } - return a - } - function re(e, t, n, r) { - var i, o, a, s, u, l = "function" == typeof e && e, c = !r && Y(e = l.selector || e); - if (n = n || [], - 1 === c.length) { - if (2 < (o = c[0] = c[0].slice(0)).length && "ID" === (a = o[0]).type && 9 === t.nodeType && C && b.relative[o[1].type]) { - if (!(t = (b.find.ID(a.matches[0].replace(O, P), t) || [])[0])) - return n; - l && (t = t.parentNode), - e = e.slice(o.shift().value.length) - } - i = D.needsContext.test(e) ? 0 : o.length; - while (i--) { - if (a = o[i], - b.relative[s = a.type]) - break; - if ((u = b.find[s]) && (r = u(a.matches[0].replace(O, P), H.test(o[0].type) && U(t.parentNode) || t))) { - if (o.splice(i, 1), - !(e = r.length && Q(o))) - return k.apply(n, r), - n; - break - } - } - } - return (l || ne(e, c))(r, t, !C, n, !t || H.test(e) && U(t.parentNode) || t), - n - } - G.prototype = b.filters = b.pseudos, - b.setFilters = new G, - le.sortStable = S.split("").sort(l).join("") === S, - V(), - le.sortDetached = $(function(e) { - return 1 & e.compareDocumentPosition(T.createElement("fieldset")) - }), - ce.find = I, - ce.expr[":"] = ce.expr.pseudos, - ce.unique = ce.uniqueSort, - I.compile = ne, - I.select = re, - I.setDocument = V, - I.tokenize = Y, - I.escape = ce.escapeSelector, - I.getText = ce.text, - I.isXML = ce.isXMLDoc, - I.selectors = ce.expr, - I.support = ce.support, - I.uniqueSort = ce.uniqueSort - }(); - var d = function(e, t, n) { - var r = [] - , i = void 0 !== n; - while ((e = e[t]) && 9 !== e.nodeType) - if (1 === e.nodeType) { - if (i && ce(e).is(n)) - break; - r.push(e) - } - return r - } - , h = function(e, t) { - for (var n = []; e; e = e.nextSibling) - 1 === e.nodeType && e !== t && n.push(e); - return n - } - , b = ce.expr.match.needsContext - , w = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; - function T(e, n, r) { - return v(n) ? ce.grep(e, function(e, t) { - return !!n.call(e, t, e) !== r - }) : n.nodeType ? ce.grep(e, function(e) { - return e === n !== r - }) : "string" != typeof n ? ce.grep(e, function(e) { - return -1 < se.call(n, e) !== r - }) : ce.filter(n, e, r) - } - ce.filter = function(e, t, n) { - var r = t[0]; - return n && (e = ":not(" + e + ")"), - 1 === t.length && 1 === r.nodeType ? ce.find.matchesSelector(r, e) ? [r] : [] : ce.find.matches(e, ce.grep(t, function(e) { - return 1 === e.nodeType - })) - } - , - ce.fn.extend({ - find: function(e) { - var t, n, r = this.length, i = this; - if ("string" != typeof e) - return this.pushStack(ce(e).filter(function() { - for (t = 0; t < r; t++) - if (ce.contains(i[t], this)) - return !0 - })); - for (n = this.pushStack([]), - t = 0; t < r; t++) - ce.find(e, i[t], n); - return 1 < r ? ce.uniqueSort(n) : n - }, - filter: function(e) { - return this.pushStack(T(this, e || [], !1)) - }, - not: function(e) { - return this.pushStack(T(this, e || [], !0)) - }, - is: function(e) { - return !!T(this, "string" == typeof e && b.test(e) ? ce(e) : e || [], !1).length - } - }); - var k, S = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; - (ce.fn.init = function(e, t, n) { - var r, i; - if (!e) - return this; - if (n = n || k, - "string" == typeof e) { - if (!(r = "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length ? [null, e, null] : S.exec(e)) || !r[1] && t) - return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); - if (r[1]) { - if (t = t instanceof ce ? t[0] : t, - ce.merge(this, ce.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : C, !0)), - w.test(r[1]) && ce.isPlainObject(t)) - for (r in t) - v(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); - return this - } - return (i = C.getElementById(r[2])) && (this[0] = i, - this.length = 1), - this - } - return e.nodeType ? (this[0] = e, - this.length = 1, - this) : v(e) ? void 0 !== n.ready ? n.ready(e) : e(ce) : ce.makeArray(e, this) - } - ).prototype = ce.fn, - k = ce(C); - var E = /^(?:parents|prev(?:Until|All))/ - , j = { - children: !0, - contents: !0, - next: !0, - prev: !0 - }; - function A(e, t) { - while ((e = e[t]) && 1 !== e.nodeType) - ; - return e - } - ce.fn.extend({ - has: function(e) { - var t = ce(e, this) - , n = t.length; - return this.filter(function() { - for (var e = 0; e < n; e++) - if (ce.contains(this, t[e])) - return !0 - }) - }, - closest: function(e, t) { - var n, r = 0, i = this.length, o = [], a = "string" != typeof e && ce(e); - if (!b.test(e)) - for (; r < i; r++) - for (n = this[r]; n && n !== t; n = n.parentNode) - if (n.nodeType < 11 && (a ? -1 < a.index(n) : 1 === n.nodeType && ce.find.matchesSelector(n, e))) { - o.push(n); - break - } - return this.pushStack(1 < o.length ? ce.uniqueSort(o) : o) - }, - index: function(e) { - return e ? "string" == typeof e ? se.call(ce(e), this[0]) : se.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 - }, - add: function(e, t) { - return this.pushStack(ce.uniqueSort(ce.merge(this.get(), ce(e, t)))) - }, - addBack: function(e) { - return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) - } - }), - ce.each({ - parent: function(e) { - var t = e.parentNode; - return t && 11 !== t.nodeType ? t : null - }, - parents: function(e) { - return d(e, "parentNode") - }, - parentsUntil: function(e, t, n) { - return d(e, "parentNode", n) - }, - next: function(e) { - return A(e, "nextSibling") - }, - prev: function(e) { - return A(e, "previousSibling") - }, - nextAll: function(e) { - return d(e, "nextSibling") - }, - prevAll: function(e) { - return d(e, "previousSibling") - }, - nextUntil: function(e, t, n) { - return d(e, "nextSibling", n) - }, - prevUntil: function(e, t, n) { - return d(e, "previousSibling", n) - }, - siblings: function(e) { - return h((e.parentNode || {}).firstChild, e) - }, - children: function(e) { - return h(e.firstChild) - }, - contents: function(e) { - return null != e.contentDocument && r(e.contentDocument) ? e.contentDocument : (fe(e, "template") && (e = e.content || e), - ce.merge([], e.childNodes)) - } - }, function(r, i) { - ce.fn[r] = function(e, t) { - var n = ce.map(this, i, e); - return "Until" !== r.slice(-5) && (t = e), - t && "string" == typeof t && (n = ce.filter(t, n)), - 1 < this.length && (j[r] || ce.uniqueSort(n), - E.test(r) && n.reverse()), - this.pushStack(n) - } - }); - var D = /[^\x20\t\r\n\f]+/g; - function N(e) { - return e - } - function q(e) { - throw e - } - function L(e, t, n, r) { - var i; - try { - e && v(i = e.promise) ? i.call(e).done(t).fail(n) : e && v(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) - } catch (e) { - n.apply(void 0, [e]) - } - } - ce.Callbacks = function(r) { - var e, n; - r = "string" == typeof r ? (e = r, - n = {}, - ce.each(e.match(D) || [], function(e, t) { - n[t] = !0 - }), - n) : ce.extend({}, r); - var i, t, o, a, s = [], u = [], l = -1, c = function() { - for (a = a || r.once, - o = i = !0; u.length; l = -1) { - t = u.shift(); - while (++l < s.length) - !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && (l = s.length, - t = !1) - } - r.memory || (t = !1), - i = !1, - a && (s = t ? [] : "") - }, f = { - add: function() { - return s && (t && !i && (l = s.length - 1, - u.push(t)), - function n(e) { - ce.each(e, function(e, t) { - v(t) ? r.unique && f.has(t) || s.push(t) : t && t.length && "string" !== x(t) && n(t) - }) - }(arguments), - t && !i && c()), - this - }, - remove: function() { - return ce.each(arguments, function(e, t) { - var n; - while (-1 < (n = ce.inArray(t, s, n))) - s.splice(n, 1), - n <= l && l-- - }), - this - }, - has: function(e) { - return e ? -1 < ce.inArray(e, s) : 0 < s.length - }, - empty: function() { - return s && (s = []), - this - }, - disable: function() { - return a = u = [], - s = t = "", - this - }, - disabled: function() { - return !s - }, - lock: function() { - return a = u = [], - t || i || (s = t = ""), - this - }, - locked: function() { - return !!a - }, - fireWith: function(e, t) { - return a || (t = [e, (t = t || []).slice ? t.slice() : t], - u.push(t), - i || c()), - this - }, - fire: function() { - return f.fireWith(this, arguments), - this - }, - fired: function() { - return !!o - } - }; - return f - } - , - ce.extend({ - Deferred: function(e) { - var o = [["notify", "progress", ce.Callbacks("memory"), ce.Callbacks("memory"), 2], ["resolve", "done", ce.Callbacks("once memory"), ce.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", ce.Callbacks("once memory"), ce.Callbacks("once memory"), 1, "rejected"]] - , i = "pending" - , a = { - state: function() { - return i - }, - always: function() { - return s.done(arguments).fail(arguments), - this - }, - "catch": function(e) { - return a.then(null, e) - }, - pipe: function() { - var i = arguments; - return ce.Deferred(function(r) { - ce.each(o, function(e, t) { - var n = v(i[t[4]]) && i[t[4]]; - s[t[1]](function() { - var e = n && n.apply(this, arguments); - e && v(e.promise) ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[t[0] + "With"](this, n ? [e] : arguments) - }) - }), - i = null - }).promise() - }, - then: function(t, n, r) { - var u = 0; - function l(i, o, a, s) { - return function() { - var n = this - , r = arguments - , e = function() { - var e, t; - if (!(i < u)) { - if ((e = a.apply(n, r)) === o.promise()) - throw new TypeError("Thenable self-resolution"); - t = e && ("object" == typeof e || "function" == typeof e) && e.then, - v(t) ? s ? t.call(e, l(u, o, N, s), l(u, o, q, s)) : (u++, - t.call(e, l(u, o, N, s), l(u, o, q, s), l(u, o, N, o.notifyWith))) : (a !== N && (n = void 0, - r = [e]), - (s || o.resolveWith)(n, r)) - } - } - , t = s ? e : function() { - try { - e() - } catch (e) { - ce.Deferred.exceptionHook && ce.Deferred.exceptionHook(e, t.error), - u <= i + 1 && (a !== q && (n = void 0, - r = [e]), - o.rejectWith(n, r)) - } - } - ; - i ? t() : (ce.Deferred.getErrorHook ? t.error = ce.Deferred.getErrorHook() : ce.Deferred.getStackHook && (t.error = ce.Deferred.getStackHook()), - ie.setTimeout(t)) - } - } - return ce.Deferred(function(e) { - o[0][3].add(l(0, e, v(r) ? r : N, e.notifyWith)), - o[1][3].add(l(0, e, v(t) ? t : N)), - o[2][3].add(l(0, e, v(n) ? n : q)) - }).promise() - }, - promise: function(e) { - return null != e ? ce.extend(e, a) : a - } - } - , s = {}; - return ce.each(o, function(e, t) { - var n = t[2] - , r = t[5]; - a[t[1]] = n.add, - r && n.add(function() { - i = r - }, o[3 - e][2].disable, o[3 - e][3].disable, o[0][2].lock, o[0][3].lock), - n.add(t[3].fire), - s[t[0]] = function() { - return s[t[0] + "With"](this === s ? void 0 : this, arguments), - this - } - , - s[t[0] + "With"] = n.fireWith - }), - a.promise(s), - e && e.call(s, s), - s - }, - when: function(e) { - var n = arguments.length - , t = n - , r = Array(t) - , i = ae.call(arguments) - , o = ce.Deferred() - , a = function(t) { - return function(e) { - r[t] = this, - i[t] = 1 < arguments.length ? ae.call(arguments) : e, - --n || o.resolveWith(r, i) - } - }; - if (n <= 1 && (L(e, o.done(a(t)).resolve, o.reject, !n), - "pending" === o.state() || v(i[t] && i[t].then))) - return o.then(); - while (t--) - L(i[t], a(t), o.reject); - return o.promise() - } - }); - var H = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - ce.Deferred.exceptionHook = function(e, t) { - ie.console && ie.console.warn && e && H.test(e.name) && ie.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t) - } - , - ce.readyException = function(e) { - ie.setTimeout(function() { - throw e - }) - } - ; - var O = ce.Deferred(); - function P() { - C.removeEventListener("DOMContentLoaded", P), - ie.removeEventListener("load", P), - ce.ready() - } - ce.fn.ready = function(e) { - return O.then(e)["catch"](function(e) { - ce.readyException(e) - }), - this - } - , - ce.extend({ - isReady: !1, - readyWait: 1, - ready: function(e) { - (!0 === e ? --ce.readyWait : ce.isReady) || (ce.isReady = !0) !== e && 0 < --ce.readyWait || O.resolveWith(C, [ce]) - } - }), - ce.ready.then = O.then, - "complete" === C.readyState || "loading" !== C.readyState && !C.documentElement.doScroll ? ie.setTimeout(ce.ready) : (C.addEventListener("DOMContentLoaded", P), - ie.addEventListener("load", P)); - var M = function(e, t, n, r, i, o, a) { - var s = 0 - , u = e.length - , l = null == n; - if ("object" === x(n)) - for (s in i = !0, - n) - M(e, t, s, n[s], !0, o, a); - else if (void 0 !== r && (i = !0, - v(r) || (a = !0), - l && (a ? (t.call(e, r), - t = null) : (l = t, - t = function(e, t, n) { - return l.call(ce(e), n) - } - )), - t)) - for (; s < u; s++) - t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); - return i ? e : l ? t.call(e) : u ? t(e[0], n) : o - } - , R = /^-ms-/ - , I = /-([a-z])/g; - function W(e, t) { - return t.toUpperCase() - } - function F(e) { - return e.replace(R, "ms-").replace(I, W) - } - var $ = function(e) { - return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType - }; - function B() { - this.expando = ce.expando + B.uid++ - } - B.uid = 1, - B.prototype = { - cache: function(e) { - var t = e[this.expando]; - return t || (t = {}, - $(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { - value: t, - configurable: !0 - }))), - t - }, - set: function(e, t, n) { - var r, i = this.cache(e); - if ("string" == typeof t) - i[F(t)] = n; - else - for (r in t) - i[F(r)] = t[r]; - return i - }, - get: function(e, t) { - return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][F(t)] - }, - access: function(e, t, n) { - return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), - void 0 !== n ? n : t) - }, - remove: function(e, t) { - var n, r = e[this.expando]; - if (void 0 !== r) { - if (void 0 !== t) { - n = (t = Array.isArray(t) ? t.map(F) : (t = F(t))in r ? [t] : t.match(D) || []).length; - while (n--) - delete r[t[n]] - } - (void 0 === t || ce.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) - } - }, - hasData: function(e) { - var t = e[this.expando]; - return void 0 !== t && !ce.isEmptyObject(t) - } - }; - var _ = new B - , z = new B - , X = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/ - , U = /[A-Z]/g; - function V(e, t, n) { - var r, i; - if (void 0 === n && 1 === e.nodeType) - if (r = "data-" + t.replace(U, "-$&").toLowerCase(), - "string" == typeof (n = e.getAttribute(r))) { - try { - n = "true" === (i = n) || "false" !== i && ("null" === i ? null : i === +i + "" ? +i : X.test(i) ? JSON.parse(i) : i) - } catch (e) {} - z.set(e, t, n) - } else - n = void 0; - return n - } - ce.extend({ - hasData: function(e) { - return z.hasData(e) || _.hasData(e) - }, - data: function(e, t, n) { - return z.access(e, t, n) - }, - removeData: function(e, t) { - z.remove(e, t) - }, - _data: function(e, t, n) { - return _.access(e, t, n) - }, - _removeData: function(e, t) { - _.remove(e, t) - } - }), - ce.fn.extend({ - data: function(n, e) { - var t, r, i, o = this[0], a = o && o.attributes; - if (void 0 === n) { - if (this.length && (i = z.get(o), - 1 === o.nodeType && !_.get(o, "hasDataAttrs"))) { - t = a.length; - while (t--) - a[t] && 0 === (r = a[t].name).indexOf("data-") && (r = F(r.slice(5)), - V(o, r, i[r])); - _.set(o, "hasDataAttrs", !0) - } - return i - } - return "object" == typeof n ? this.each(function() { - z.set(this, n) - }) : M(this, function(e) { - var t; - if (o && void 0 === e) - return void 0 !== (t = z.get(o, n)) ? t : void 0 !== (t = V(o, n)) ? t : void 0; - this.each(function() { - z.set(this, n, e) - }) - }, null, e, 1 < arguments.length, null, !0) - }, - removeData: function(e) { - return this.each(function() { - z.remove(this, e) - }) - } - }), - ce.extend({ - queue: function(e, t, n) { - var r; - if (e) - return t = (t || "fx") + "queue", - r = _.get(e, t), - n && (!r || Array.isArray(n) ? r = _.access(e, t, ce.makeArray(n)) : r.push(n)), - r || [] - }, - dequeue: function(e, t) { - t = t || "fx"; - var n = ce.queue(e, t) - , r = n.length - , i = n.shift() - , o = ce._queueHooks(e, t); - "inprogress" === i && (i = n.shift(), - r--), - i && ("fx" === t && n.unshift("inprogress"), - delete o.stop, - i.call(e, function() { - ce.dequeue(e, t) - }, o)), - !r && o && o.empty.fire() - }, - _queueHooks: function(e, t) { - var n = t + "queueHooks"; - return _.get(e, n) || _.access(e, n, { - empty: ce.Callbacks("once memory").add(function() { - _.remove(e, [t + "queue", n]) - }) - }) - } - }), - ce.fn.extend({ - queue: function(t, n) { - var e = 2; - return "string" != typeof t && (n = t, - t = "fx", - e--), - arguments.length < e ? ce.queue(this[0], t) : void 0 === n ? this : this.each(function() { - var e = ce.queue(this, t, n); - ce._queueHooks(this, t), - "fx" === t && "inprogress" !== e[0] && ce.dequeue(this, t) - }) - }, - dequeue: function(e) { - return this.each(function() { - ce.dequeue(this, e) - }) - }, - clearQueue: function(e) { - return this.queue(e || "fx", []) - }, - promise: function(e, t) { - var n, r = 1, i = ce.Deferred(), o = this, a = this.length, s = function() { - --r || i.resolveWith(o, [o]) - }; - "string" != typeof e && (t = e, - e = void 0), - e = e || "fx"; - while (a--) - (n = _.get(o[a], e + "queueHooks")) && n.empty && (r++, - n.empty.add(s)); - return s(), - i.promise(t) - } - }); - var G = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source - , Y = new RegExp("^(?:([+-])=|)(" + G + ")([a-z%]*)$","i") - , Q = ["Top", "Right", "Bottom", "Left"] - , J = C.documentElement - , K = function(e) { - return ce.contains(e.ownerDocument, e) - } - , Z = { - composed: !0 - }; - J.getRootNode && (K = function(e) { - return ce.contains(e.ownerDocument, e) || e.getRootNode(Z) === e.ownerDocument - } - ); - var ee = function(e, t) { - return "none" === (e = t || e).style.display || "" === e.style.display && K(e) && "none" === ce.css(e, "display") - }; - function te(e, t, n, r) { - var i, o, a = 20, s = r ? function() { - return r.cur() - } - : function() { - return ce.css(e, t, "") - } - , u = s(), l = n && n[3] || (ce.cssNumber[t] ? "" : "px"), c = e.nodeType && (ce.cssNumber[t] || "px" !== l && +u) && Y.exec(ce.css(e, t)); - if (c && c[3] !== l) { - u /= 2, - l = l || c[3], - c = +u || 1; - while (a--) - ce.style(e, t, c + l), - (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0), - c /= o; - c *= 2, - ce.style(e, t, c + l), - n = n || [] - } - return n && (c = +c || +u || 0, - i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], - r && (r.unit = l, - r.start = c, - r.end = i)), - i - } - var ne = {}; - function re(e, t) { - for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++) - (r = e[c]).style && (n = r.style.display, - t ? ("none" === n && (l[c] = _.get(r, "display") || null, - l[c] || (r.style.display = "")), - "" === r.style.display && ee(r) && (l[c] = (u = a = o = void 0, - a = (i = r).ownerDocument, - s = i.nodeName, - (u = ne[s]) || (o = a.body.appendChild(a.createElement(s)), - u = ce.css(o, "display"), - o.parentNode.removeChild(o), - "none" === u && (u = "block"), - ne[s] = u)))) : "none" !== n && (l[c] = "none", - _.set(r, "display", n))); - for (c = 0; c < f; c++) - null != l[c] && (e[c].style.display = l[c]); - return e - } - ce.fn.extend({ - show: function() { - return re(this, !0) - }, - hide: function() { - return re(this) - }, - toggle: function(e) { - return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function() { - ee(this) ? ce(this).show() : ce(this).hide() - }) - } - }); - var xe, be, we = /^(?:checkbox|radio)$/i, Te = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, Ce = /^$|^module$|\/(?:java|ecma)script/i; - xe = C.createDocumentFragment().appendChild(C.createElement("div")), - (be = C.createElement("input")).setAttribute("type", "radio"), - be.setAttribute("checked", "checked"), - be.setAttribute("name", "t"), - xe.appendChild(be), - le.checkClone = xe.cloneNode(!0).cloneNode(!0).lastChild.checked, - xe.innerHTML = "", - le.noCloneChecked = !!xe.cloneNode(!0).lastChild.defaultValue, - xe.innerHTML = "", - le.option = !!xe.lastChild; - var ke = { - thead: [1, "", "
    "], - col: [2, "", "
    "], - tr: [2, "", "
    "], - td: [3, "", "
    "], - _default: [0, "", ""] - }; - function Se(e, t) { - var n; - return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], - void 0 === t || t && fe(e, t) ? ce.merge([e], n) : n - } - function Ee(e, t) { - for (var n = 0, r = e.length; n < r; n++) - _.set(e[n], "globalEval", !t || _.get(t[n], "globalEval")) - } - ke.tbody = ke.tfoot = ke.colgroup = ke.caption = ke.thead, - ke.th = ke.td, - le.option || (ke.optgroup = ke.option = [1, ""]); - var je = /<|&#?\w+;/; - function Ae(e, t, n, r, i) { - for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++) - if ((o = e[d]) || 0 === o) - if ("object" === x(o)) - ce.merge(p, o.nodeType ? [o] : o); - else if (je.test(o)) { - a = a || f.appendChild(t.createElement("div")), - s = (Te.exec(o) || ["", ""])[1].toLowerCase(), - u = ke[s] || ke._default, - a.innerHTML = u[1] + ce.htmlPrefilter(o) + u[2], - c = u[0]; - while (c--) - a = a.lastChild; - ce.merge(p, a.childNodes), - (a = f.firstChild).textContent = "" - } else - p.push(t.createTextNode(o)); - f.textContent = "", - d = 0; - while (o = p[d++]) - if (r && -1 < ce.inArray(o, r)) - i && i.push(o); - else if (l = K(o), - a = Se(f.appendChild(o), "script"), - l && Ee(a), - n) { - c = 0; - while (o = a[c++]) - Ce.test(o.type || "") && n.push(o) - } - return f - } - var De = /^([^.]*)(?:\.(.+)|)/; - function Ne() { - return !0 - } - function qe() { - return !1 - } - function Le(e, t, n, r, i, o) { - var a, s; - if ("object" == typeof t) { - for (s in "string" != typeof n && (r = r || n, - n = void 0), - t) - Le(e, s, n, r, t[s], o); - return e - } - if (null == r && null == i ? (i = n, - r = n = void 0) : null == i && ("string" == typeof n ? (i = r, - r = void 0) : (i = r, - r = n, - n = void 0)), - !1 === i) - i = qe; - else if (!i) - return e; - return 1 === o && (a = i, - (i = function(e) { - return ce().off(e), - a.apply(this, arguments) - } - ).guid = a.guid || (a.guid = ce.guid++)), - e.each(function() { - ce.event.add(this, t, i, r, n) - }) - } - function He(e, r, t) { - t ? (_.set(e, r, !1), - ce.event.add(e, r, { - namespace: !1, - handler: function(e) { - var t, n = _.get(this, r); - if (1 & e.isTrigger && this[r]) { - if (n) - (ce.event.special[r] || {}).delegateType && e.stopPropagation(); - else if (n = ae.call(arguments), - _.set(this, r, n), - this[r](), - t = _.get(this, r), - _.set(this, r, !1), - n !== t) - return e.stopImmediatePropagation(), - e.preventDefault(), - t - } else - n && (_.set(this, r, ce.event.trigger(n[0], n.slice(1), this)), - e.stopPropagation(), - e.isImmediatePropagationStopped = Ne) - } - })) : void 0 === _.get(e, r) && ce.event.add(e, r, Ne) - } - ce.event = { - global: {}, - add: function(t, e, n, r, i) { - var o, a, s, u, l, c, f, p, d, h, g, v = _.get(t); - if ($(t)) { - n.handler && (n = (o = n).handler, - i = o.selector), - i && ce.find.matchesSelector(J, i), - n.guid || (n.guid = ce.guid++), - (u = v.events) || (u = v.events = Object.create(null)), - (a = v.handle) || (a = v.handle = function(e) { - return "undefined" != typeof ce && ce.event.triggered !== e.type ? ce.event.dispatch.apply(t, arguments) : void 0 - } - ), - l = (e = (e || "").match(D) || [""]).length; - while (l--) - d = g = (s = De.exec(e[l]) || [])[1], - h = (s[2] || "").split(".").sort(), - d && (f = ce.event.special[d] || {}, - d = (i ? f.delegateType : f.bindType) || d, - f = ce.event.special[d] || {}, - c = ce.extend({ - type: d, - origType: g, - data: r, - handler: n, - guid: n.guid, - selector: i, - needsContext: i && ce.expr.match.needsContext.test(i), - namespace: h.join(".") - }, o), - (p = u[d]) || ((p = u[d] = []).delegateCount = 0, - f.setup && !1 !== f.setup.call(t, r, h, a) || t.addEventListener && t.addEventListener(d, a)), - f.add && (f.add.call(t, c), - c.handler.guid || (c.handler.guid = n.guid)), - i ? p.splice(p.delegateCount++, 0, c) : p.push(c), - ce.event.global[d] = !0) - } - }, - remove: function(e, t, n, r, i) { - var o, a, s, u, l, c, f, p, d, h, g, v = _.hasData(e) && _.get(e); - if (v && (u = v.events)) { - l = (t = (t || "").match(D) || [""]).length; - while (l--) - if (d = g = (s = De.exec(t[l]) || [])[1], - h = (s[2] || "").split(".").sort(), - d) { - f = ce.event.special[d] || {}, - p = u[d = (r ? f.delegateType : f.bindType) || d] || [], - s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), - a = o = p.length; - while (o--) - c = p[o], - !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), - c.selector && p.delegateCount--, - f.remove && f.remove.call(e, c)); - a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, v.handle) || ce.removeEvent(e, d, v.handle), - delete u[d]) - } else - for (d in u) - ce.event.remove(e, d + t[l], n, r, !0); - ce.isEmptyObject(u) && _.remove(e, "handle events") - } - }, - dispatch: function(e) { - var t, n, r, i, o, a, s = new Array(arguments.length), u = ce.event.fix(e), l = (_.get(this, "events") || Object.create(null))[u.type] || [], c = ce.event.special[u.type] || {}; - for (s[0] = u, - t = 1; t < arguments.length; t++) - s[t] = arguments[t]; - if (u.delegateTarget = this, - !c.preDispatch || !1 !== c.preDispatch.call(this, u)) { - a = ce.event.handlers.call(this, u, l), - t = 0; - while ((i = a[t++]) && !u.isPropagationStopped()) { - u.currentTarget = i.elem, - n = 0; - while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) - u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace) || (u.handleObj = o, - u.data = o.data, - void 0 !== (r = ((ce.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && !1 === (u.result = r) && (u.preventDefault(), - u.stopPropagation())) - } - return c.postDispatch && c.postDispatch.call(this, u), - u.result - } - }, - handlers: function(e, t) { - var n, r, i, o, a, s = [], u = t.delegateCount, l = e.target; - if (u && l.nodeType && !("click" === e.type && 1 <= e.button)) - for (; l !== this; l = l.parentNode || this) - if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { - for (o = [], - a = {}, - n = 0; n < u; n++) - void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? -1 < ce(i, this).index(l) : ce.find(i, this, null, [l]).length), - a[i] && o.push(r); - o.length && s.push({ - elem: l, - handlers: o - }) - } - return l = this, - u < t.length && s.push({ - elem: l, - handlers: t.slice(u) - }), - s - }, - addProp: function(t, e) { - Object.defineProperty(ce.Event.prototype, t, { - enumerable: !0, - configurable: !0, - get: v(e) ? function() { - if (this.originalEvent) - return e(this.originalEvent) - } - : function() { - if (this.originalEvent) - return this.originalEvent[t] - } - , - set: function(e) { - Object.defineProperty(this, t, { - enumerable: !0, - configurable: !0, - writable: !0, - value: e - }) - } - }) - }, - fix: function(e) { - return e[ce.expando] ? e : new ce.Event(e) - }, - special: { - load: { - noBubble: !0 - }, - click: { - setup: function(e) { - var t = this || e; - return we.test(t.type) && t.click && fe(t, "input") && He(t, "click", !0), - !1 - }, - trigger: function(e) { - var t = this || e; - return we.test(t.type) && t.click && fe(t, "input") && He(t, "click"), - !0 - }, - _default: function(e) { - var t = e.target; - return we.test(t.type) && t.click && fe(t, "input") && _.get(t, "click") || fe(t, "a") - } - }, - beforeunload: { - postDispatch: function(e) { - void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) - } - } - } - }, - ce.removeEvent = function(e, t, n) { - e.removeEventListener && e.removeEventListener(t, n) - } - , - ce.Event = function(e, t) { - if (!(this instanceof ce.Event)) - return new ce.Event(e,t); - e && e.type ? (this.originalEvent = e, - this.type = e.type, - this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? Ne : qe, - this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, - this.currentTarget = e.currentTarget, - this.relatedTarget = e.relatedTarget) : this.type = e, - t && ce.extend(this, t), - this.timeStamp = e && e.timeStamp || Date.now(), - this[ce.expando] = !0 - } - , - ce.Event.prototype = { - constructor: ce.Event, - isDefaultPrevented: qe, - isPropagationStopped: qe, - isImmediatePropagationStopped: qe, - isSimulated: !1, - preventDefault: function() { - var e = this.originalEvent; - this.isDefaultPrevented = Ne, - e && !this.isSimulated && e.preventDefault() - }, - stopPropagation: function() { - var e = this.originalEvent; - this.isPropagationStopped = Ne, - e && !this.isSimulated && e.stopPropagation() - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - this.isImmediatePropagationStopped = Ne, - e && !this.isSimulated && e.stopImmediatePropagation(), - this.stopPropagation() - } - }, - ce.each({ - altKey: !0, - bubbles: !0, - cancelable: !0, - changedTouches: !0, - ctrlKey: !0, - detail: !0, - eventPhase: !0, - metaKey: !0, - pageX: !0, - pageY: !0, - shiftKey: !0, - view: !0, - "char": !0, - code: !0, - charCode: !0, - key: !0, - keyCode: !0, - button: !0, - buttons: !0, - clientX: !0, - clientY: !0, - offsetX: !0, - offsetY: !0, - pointerId: !0, - pointerType: !0, - screenX: !0, - screenY: !0, - targetTouches: !0, - toElement: !0, - touches: !0, - which: !0 - }, ce.event.addProp), - ce.each({ - focus: "focusin", - blur: "focusout" - }, function(r, i) { - function o(e) { - if (C.documentMode) { - var t = _.get(this, "handle") - , n = ce.event.fix(e); - n.type = "focusin" === e.type ? "focus" : "blur", - n.isSimulated = !0, - t(e), - n.target === n.currentTarget && t(n) - } else - ce.event.simulate(i, e.target, ce.event.fix(e)) - } - ce.event.special[r] = { - setup: function() { - var e; - if (He(this, r, !0), - !C.documentMode) - return !1; - (e = _.get(this, i)) || this.addEventListener(i, o), - _.set(this, i, (e || 0) + 1) - }, - trigger: function() { - return He(this, r), - !0 - }, - teardown: function() { - var e; - if (!C.documentMode) - return !1; - (e = _.get(this, i) - 1) ? _.set(this, i, e) : (this.removeEventListener(i, o), - _.remove(this, i)) - }, - _default: function(e) { - return _.get(e.target, r) - }, - delegateType: i - }, - ce.event.special[i] = { - setup: function() { - var e = this.ownerDocument || this.document || this - , t = C.documentMode ? this : e - , n = _.get(t, i); - n || (C.documentMode ? this.addEventListener(i, o) : e.addEventListener(r, o, !0)), - _.set(t, i, (n || 0) + 1) - }, - teardown: function() { - var e = this.ownerDocument || this.document || this - , t = C.documentMode ? this : e - , n = _.get(t, i) - 1; - n ? _.set(t, i, n) : (C.documentMode ? this.removeEventListener(i, o) : e.removeEventListener(r, o, !0), - _.remove(t, i)) - } - } - }), - ce.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function(e, i) { - ce.event.special[e] = { - delegateType: i, - bindType: i, - handle: function(e) { - var t, n = e.relatedTarget, r = e.handleObj; - return n && (n === this || ce.contains(this, n)) || (e.type = r.origType, - t = r.handler.apply(this, arguments), - e.type = i), - t - } - } - }), - ce.fn.extend({ - on: function(e, t, n, r) { - return Le(this, e, t, n, r) - }, - one: function(e, t, n, r) { - return Le(this, e, t, n, r, 1) - }, - off: function(e, t, n) { - var r, i; - if (e && e.preventDefault && e.handleObj) - return r = e.handleObj, - ce(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), - this; - if ("object" == typeof e) { - for (i in e) - this.off(i, t, e[i]); - return this - } - return !1 !== t && "function" != typeof t || (n = t, - t = void 0), - !1 === n && (n = qe), - this.each(function() { - ce.event.remove(this, e, n, t) - }) - } - }); - var Oe = /\s*$/g; - function Re(e, t) { - return fe(e, "table") && fe(11 !== t.nodeType ? t : t.firstChild, "tr") && ce(e).children("tbody")[0] || e - } - function Ie(e) { - return e.type = (null !== e.getAttribute("type")) + "/" + e.type, - e - } - function We(e) { - return "true/" === (e.type || "").slice(0, 5) ? e.type = e.type.slice(5) : e.removeAttribute("type"), - e - } - function Fe(e, t) { - var n, r, i, o, a, s; - if (1 === t.nodeType) { - if (_.hasData(e) && (s = _.get(e).events)) - for (i in _.remove(t, "handle events"), - s) - for (n = 0, - r = s[i].length; n < r; n++) - ce.event.add(t, i, s[i][n]); - z.hasData(e) && (o = z.access(e), - a = ce.extend({}, o), - z.set(t, a)) - } - } - function $e(n, r, i, o) { - r = g(r); - var e, t, a, s, u, l, c = 0, f = n.length, p = f - 1, d = r[0], h = v(d); - if (h || 1 < f && "string" == typeof d && !le.checkClone && Pe.test(d)) - return n.each(function(e) { - var t = n.eq(e); - h && (r[0] = d.call(this, e, t.html())), - $e(t, r, i, o) - }); - if (f && (t = (e = Ae(r, n[0].ownerDocument, !1, n, o)).firstChild, - 1 === e.childNodes.length && (e = t), - t || o)) { - for (s = (a = ce.map(Se(e, "script"), Ie)).length; c < f; c++) - u = e, - c !== p && (u = ce.clone(u, !0, !0), - s && ce.merge(a, Se(u, "script"))), - i.call(n[c], u, c); - if (s) - for (l = a[a.length - 1].ownerDocument, - ce.map(a, We), - c = 0; c < s; c++) - u = a[c], - Ce.test(u.type || "") && !_.access(u, "globalEval") && ce.contains(l, u) && (u.src && "module" !== (u.type || "").toLowerCase() ? ce._evalUrl && !u.noModule && ce._evalUrl(u.src, { - nonce: u.nonce || u.getAttribute("nonce") - }, l) : m(u.textContent.replace(Me, ""), u, l)) - } - return n - } - function Be(e, t, n) { - for (var r, i = t ? ce.filter(t, e) : e, o = 0; null != (r = i[o]); o++) - n || 1 !== r.nodeType || ce.cleanData(Se(r)), - r.parentNode && (n && K(r) && Ee(Se(r, "script")), - r.parentNode.removeChild(r)); - return e - } - ce.extend({ - htmlPrefilter: function(e) { - return e - }, - clone: function(e, t, n) { - var r, i, o, a, s, u, l, c = e.cloneNode(!0), f = K(e); - if (!(le.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || ce.isXMLDoc(e))) - for (a = Se(c), - r = 0, - i = (o = Se(e)).length; r < i; r++) - s = o[r], - u = a[r], - void 0, - "input" === (l = u.nodeName.toLowerCase()) && we.test(s.type) ? u.checked = s.checked : "input" !== l && "textarea" !== l || (u.defaultValue = s.defaultValue); - if (t) - if (n) - for (o = o || Se(e), - a = a || Se(c), - r = 0, - i = o.length; r < i; r++) - Fe(o[r], a[r]); - else - Fe(e, c); - return 0 < (a = Se(c, "script")).length && Ee(a, !f && Se(e, "script")), - c - }, - cleanData: function(e) { - for (var t, n, r, i = ce.event.special, o = 0; void 0 !== (n = e[o]); o++) - if ($(n)) { - if (t = n[_.expando]) { - if (t.events) - for (r in t.events) - i[r] ? ce.event.remove(n, r) : ce.removeEvent(n, r, t.handle); - n[_.expando] = void 0 - } - n[z.expando] && (n[z.expando] = void 0) - } - } - }), - ce.fn.extend({ - detach: function(e) { - return Be(this, e, !0) - }, - remove: function(e) { - return Be(this, e) - }, - text: function(e) { - return M(this, function(e) { - return void 0 === e ? ce.text(this) : this.empty().each(function() { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = e) - }) - }, null, e, arguments.length) - }, - append: function() { - return $e(this, arguments, function(e) { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || Re(this, e).appendChild(e) - }) - }, - prepend: function() { - return $e(this, arguments, function(e) { - if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { - var t = Re(this, e); - t.insertBefore(e, t.firstChild) - } - }) - }, - before: function() { - return $e(this, arguments, function(e) { - this.parentNode && this.parentNode.insertBefore(e, this) - }) - }, - after: function() { - return $e(this, arguments, function(e) { - this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) - }) - }, - empty: function() { - for (var e, t = 0; null != (e = this[t]); t++) - 1 === e.nodeType && (ce.cleanData(Se(e, !1)), - e.textContent = ""); - return this - }, - clone: function(e, t) { - return e = null != e && e, - t = null == t ? e : t, - this.map(function() { - return ce.clone(this, e, t) - }) - }, - html: function(e) { - return M(this, function(e) { - var t = this[0] || {} - , n = 0 - , r = this.length; - if (void 0 === e && 1 === t.nodeType) - return t.innerHTML; - if ("string" == typeof e && !Oe.test(e) && !ke[(Te.exec(e) || ["", ""])[1].toLowerCase()]) { - e = ce.htmlPrefilter(e); - try { - for (; n < r; n++) - 1 === (t = this[n] || {}).nodeType && (ce.cleanData(Se(t, !1)), - t.innerHTML = e); - t = 0 - } catch (e) {} - } - t && this.empty().append(e) - }, null, e, arguments.length) - }, - replaceWith: function() { - var n = []; - return $e(this, arguments, function(e) { - var t = this.parentNode; - ce.inArray(this, n) < 0 && (ce.cleanData(Se(this)), - t && t.replaceChild(e, this)) - }, n) - } - }), - ce.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function(e, a) { - ce.fn[e] = function(e) { - for (var t, n = [], r = ce(e), i = r.length - 1, o = 0; o <= i; o++) - t = o === i ? this : this.clone(!0), - ce(r[o])[a](t), - s.apply(n, t.get()); - return this.pushStack(n) - } - }); - var _e = new RegExp("^(" + G + ")(?!px)[a-z%]+$","i") - , ze = /^--/ - , Xe = function(e) { - var t = e.ownerDocument.defaultView; - return t && t.opener || (t = ie), - t.getComputedStyle(e) - } - , Ue = function(e, t, n) { - var r, i, o = {}; - for (i in t) - o[i] = e.style[i], - e.style[i] = t[i]; - for (i in r = n.call(e), - t) - e.style[i] = o[i]; - return r - } - , Ve = new RegExp(Q.join("|"),"i"); - function Ge(e, t, n) { - var r, i, o, a, s = ze.test(t), u = e.style; - return (n = n || Xe(e)) && (a = n.getPropertyValue(t) || n[t], - s && a && (a = a.replace(ve, "$1") || void 0), - "" !== a || K(e) || (a = ce.style(e, t)), - !le.pixelBoxStyles() && _e.test(a) && Ve.test(t) && (r = u.width, - i = u.minWidth, - o = u.maxWidth, - u.minWidth = u.maxWidth = u.width = a, - a = n.width, - u.width = r, - u.minWidth = i, - u.maxWidth = o)), - void 0 !== a ? a + "" : a - } - function Ye(e, t) { - return { - get: function() { - if (!e()) - return (this.get = t).apply(this, arguments); - delete this.get - } - } - } - !function() { - function e() { - if (l) { - u.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", - l.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", - J.appendChild(u).appendChild(l); - var e = ie.getComputedStyle(l); - n = "1%" !== e.top, - s = 12 === t(e.marginLeft), - l.style.right = "60%", - o = 36 === t(e.right), - r = 36 === t(e.width), - l.style.position = "absolute", - i = 12 === t(l.offsetWidth / 3), - J.removeChild(u), - l = null - } - } - function t(e) { - return Math.round(parseFloat(e)) - } - var n, r, i, o, a, s, u = C.createElement("div"), l = C.createElement("div"); - l.style && (l.style.backgroundClip = "content-box", - l.cloneNode(!0).style.backgroundClip = "", - le.clearCloneStyle = "content-box" === l.style.backgroundClip, - ce.extend(le, { - boxSizingReliable: function() { - return e(), - r - }, - pixelBoxStyles: function() { - return e(), - o - }, - pixelPosition: function() { - return e(), - n - }, - reliableMarginLeft: function() { - return e(), - s - }, - scrollboxSize: function() { - return e(), - i - }, - reliableTrDimensions: function() { - var e, t, n, r; - return null == a && (e = C.createElement("table"), - t = C.createElement("tr"), - n = C.createElement("div"), - e.style.cssText = "position:absolute;left:-11111px;border-collapse:separate", - t.style.cssText = "box-sizing:content-box;border:1px solid", - t.style.height = "1px", - n.style.height = "9px", - n.style.display = "block", - J.appendChild(e).appendChild(t).appendChild(n), - r = ie.getComputedStyle(t), - a = parseInt(r.height, 10) + parseInt(r.borderTopWidth, 10) + parseInt(r.borderBottomWidth, 10) === t.offsetHeight, - J.removeChild(e)), - a - } - })) - }(); - var Qe = ["Webkit", "Moz", "ms"] - , Je = C.createElement("div").style - , Ke = {}; - function Ze(e) { - var t = ce.cssProps[e] || Ke[e]; - return t || (e in Je ? e : Ke[e] = function(e) { - var t = e[0].toUpperCase() + e.slice(1) - , n = Qe.length; - while (n--) - if ((e = Qe[n] + t)in Je) - return e - }(e) || e) - } - var et = /^(none|table(?!-c[ea]).+)/ - , tt = { - position: "absolute", - visibility: "hidden", - display: "block" - } - , nt = { - letterSpacing: "0", - fontWeight: "400" - }; - function rt(e, t, n) { - var r = Y.exec(t); - return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t - } - function it(e, t, n, r, i, o) { - var a = "width" === t ? 1 : 0 - , s = 0 - , u = 0 - , l = 0; - if (n === (r ? "border" : "content")) - return 0; - for (; a < 4; a += 2) - "margin" === n && (l += ce.css(e, n + Q[a], !0, i)), - r ? ("content" === n && (u -= ce.css(e, "padding" + Q[a], !0, i)), - "margin" !== n && (u -= ce.css(e, "border" + Q[a] + "Width", !0, i))) : (u += ce.css(e, "padding" + Q[a], !0, i), - "padding" !== n ? u += ce.css(e, "border" + Q[a] + "Width", !0, i) : s += ce.css(e, "border" + Q[a] + "Width", !0, i)); - return !r && 0 <= o && (u += Math.max(0, Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - .5)) || 0), - u + l - } - function ot(e, t, n) { - var r = Xe(e) - , i = (!le.boxSizingReliable() || n) && "border-box" === ce.css(e, "boxSizing", !1, r) - , o = i - , a = Ge(e, t, r) - , s = "offset" + t[0].toUpperCase() + t.slice(1); - if (_e.test(a)) { - if (!n) - return a; - a = "auto" - } - return (!le.boxSizingReliable() && i || !le.reliableTrDimensions() && fe(e, "tr") || "auto" === a || !parseFloat(a) && "inline" === ce.css(e, "display", !1, r)) && e.getClientRects().length && (i = "border-box" === ce.css(e, "boxSizing", !1, r), - (o = s in e) && (a = e[s])), - (a = parseFloat(a) || 0) + it(e, t, n || (i ? "border" : "content"), o, r, a) + "px" - } - function at(e, t, n, r, i) { - return new at.prototype.init(e,t,n,r,i) - } - ce.extend({ - cssHooks: { - opacity: { - get: function(e, t) { - if (t) { - var n = Ge(e, "opacity"); - return "" === n ? "1" : n - } - } - } - }, - cssNumber: { - animationIterationCount: !0, - aspectRatio: !0, - borderImageSlice: !0, - columnCount: !0, - flexGrow: !0, - flexShrink: !0, - fontWeight: !0, - gridArea: !0, - gridColumn: !0, - gridColumnEnd: !0, - gridColumnStart: !0, - gridRow: !0, - gridRowEnd: !0, - gridRowStart: !0, - lineHeight: !0, - opacity: !0, - order: !0, - orphans: !0, - scale: !0, - widows: !0, - zIndex: !0, - zoom: !0, - fillOpacity: !0, - floodOpacity: !0, - stopOpacity: !0, - strokeMiterlimit: !0, - strokeOpacity: !0 - }, - cssProps: {}, - style: function(e, t, n, r) { - if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { - var i, o, a, s = F(t), u = ze.test(t), l = e.style; - if (u || (t = Ze(s)), - a = ce.cssHooks[t] || ce.cssHooks[s], - void 0 === n) - return a && "get"in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; - "string" === (o = typeof n) && (i = Y.exec(n)) && i[1] && (n = te(e, t, i), - o = "number"), - null != n && n == n && ("number" !== o || u || (n += i && i[3] || (ce.cssNumber[s] ? "" : "px")), - le.clearCloneStyle || "" !== n || 0 !== t.indexOf("background") || (l[t] = "inherit"), - a && "set"in a && void 0 === (n = a.set(e, n, r)) || (u ? l.setProperty(t, n) : l[t] = n)) - } - }, - css: function(e, t, n, r) { - var i, o, a, s = F(t); - return ze.test(t) || (t = Ze(s)), - (a = ce.cssHooks[t] || ce.cssHooks[s]) && "get"in a && (i = a.get(e, !0, n)), - void 0 === i && (i = Ge(e, t, r)), - "normal" === i && t in nt && (i = nt[t]), - "" === n || n ? (o = parseFloat(i), - !0 === n || isFinite(o) ? o || 0 : i) : i - } - }), - ce.each(["height", "width"], function(e, u) { - ce.cssHooks[u] = { - get: function(e, t, n) { - if (t) - return !et.test(ce.css(e, "display")) || e.getClientRects().length && e.getBoundingClientRect().width ? ot(e, u, n) : Ue(e, tt, function() { - return ot(e, u, n) - }) - }, - set: function(e, t, n) { - var r, i = Xe(e), o = !le.scrollboxSize() && "absolute" === i.position, a = (o || n) && "border-box" === ce.css(e, "boxSizing", !1, i), s = n ? it(e, u, n, a, i) : 0; - return a && o && (s -= Math.ceil(e["offset" + u[0].toUpperCase() + u.slice(1)] - parseFloat(i[u]) - it(e, u, "border", !1, i) - .5)), - s && (r = Y.exec(t)) && "px" !== (r[3] || "px") && (e.style[u] = t, - t = ce.css(e, u)), - rt(0, t, s) - } - } - }), - ce.cssHooks.marginLeft = Ye(le.reliableMarginLeft, function(e, t) { - if (t) - return (parseFloat(Ge(e, "marginLeft")) || e.getBoundingClientRect().left - Ue(e, { - marginLeft: 0 - }, function() { - return e.getBoundingClientRect().left - })) + "px" - }), - ce.each({ - margin: "", - padding: "", - border: "Width" - }, function(i, o) { - ce.cssHooks[i + o] = { - expand: function(e) { - for (var t = 0, n = {}, r = "string" == typeof e ? e.split(" ") : [e]; t < 4; t++) - n[i + Q[t] + o] = r[t] || r[t - 2] || r[0]; - return n - } - }, - "margin" !== i && (ce.cssHooks[i + o].set = rt) - }), - ce.fn.extend({ - css: function(e, t) { - return M(this, function(e, t, n) { - var r, i, o = {}, a = 0; - if (Array.isArray(t)) { - for (r = Xe(e), - i = t.length; a < i; a++) - o[t[a]] = ce.css(e, t[a], !1, r); - return o - } - return void 0 !== n ? ce.style(e, t, n) : ce.css(e, t) - }, e, t, 1 < arguments.length) - } - }), - ((ce.Tween = at).prototype = { - constructor: at, - init: function(e, t, n, r, i, o) { - this.elem = e, - this.prop = n, - this.easing = i || ce.easing._default, - this.options = t, - this.start = this.now = this.cur(), - this.end = r, - this.unit = o || (ce.cssNumber[n] ? "" : "px") - }, - cur: function() { - var e = at.propHooks[this.prop]; - return e && e.get ? e.get(this) : at.propHooks._default.get(this) - }, - run: function(e) { - var t, n = at.propHooks[this.prop]; - return this.options.duration ? this.pos = t = ce.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, - this.now = (this.end - this.start) * t + this.start, - this.options.step && this.options.step.call(this.elem, this.now, this), - n && n.set ? n.set(this) : at.propHooks._default.set(this), - this - } - }).init.prototype = at.prototype, - (at.propHooks = { - _default: { - get: function(e) { - var t; - return 1 !== e.elem.nodeType || null != e.elem[e.prop] && null == e.elem.style[e.prop] ? e.elem[e.prop] : (t = ce.css(e.elem, e.prop, "")) && "auto" !== t ? t : 0 - }, - set: function(e) { - ce.fx.step[e.prop] ? ce.fx.step[e.prop](e) : 1 !== e.elem.nodeType || !ce.cssHooks[e.prop] && null == e.elem.style[Ze(e.prop)] ? e.elem[e.prop] = e.now : ce.style(e.elem, e.prop, e.now + e.unit) - } - } - }).scrollTop = at.propHooks.scrollLeft = { - set: function(e) { - e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) - } - }, - ce.easing = { - linear: function(e) { - return e - }, - swing: function(e) { - return .5 - Math.cos(e * Math.PI) / 2 - }, - _default: "swing" - }, - ce.fx = at.prototype.init, - ce.fx.step = {}; - var st, ut, lt, ct, ft = /^(?:toggle|show|hide)$/, pt = /queueHooks$/; - function dt() { - ut && (!1 === C.hidden && ie.requestAnimationFrame ? ie.requestAnimationFrame(dt) : ie.setTimeout(dt, ce.fx.interval), - ce.fx.tick()) - } - function ht() { - return ie.setTimeout(function() { - st = void 0 - }), - st = Date.now() - } - function gt(e, t) { - var n, r = 0, i = { - height: e - }; - for (t = t ? 1 : 0; r < 4; r += 2 - t) - i["margin" + (n = Q[r])] = i["padding" + n] = e; - return t && (i.opacity = i.width = e), - i - } - function vt(e, t, n) { - for (var r, i = (yt.tweeners[t] || []).concat(yt.tweeners["*"]), o = 0, a = i.length; o < a; o++) - if (r = i[o].call(n, t, e)) - return r - } - function yt(o, e, t) { - var n, a, r = 0, i = yt.prefilters.length, s = ce.Deferred().always(function() { - delete u.elem - }), u = function() { - if (a) - return !1; - for (var e = st || ht(), t = Math.max(0, l.startTime + l.duration - e), n = 1 - (t / l.duration || 0), r = 0, i = l.tweens.length; r < i; r++) - l.tweens[r].run(n); - return s.notifyWith(o, [l, n, t]), - n < 1 && i ? t : (i || s.notifyWith(o, [l, 1, 0]), - s.resolveWith(o, [l]), - !1) - }, l = s.promise({ - elem: o, - props: ce.extend({}, e), - opts: ce.extend(!0, { - specialEasing: {}, - easing: ce.easing._default - }, t), - originalProperties: e, - originalOptions: t, - startTime: st || ht(), - duration: t.duration, - tweens: [], - createTween: function(e, t) { - var n = ce.Tween(o, l.opts, e, t, l.opts.specialEasing[e] || l.opts.easing); - return l.tweens.push(n), - n - }, - stop: function(e) { - var t = 0 - , n = e ? l.tweens.length : 0; - if (a) - return this; - for (a = !0; t < n; t++) - l.tweens[t].run(1); - return e ? (s.notifyWith(o, [l, 1, 0]), - s.resolveWith(o, [l, e])) : s.rejectWith(o, [l, e]), - this - } - }), c = l.props; - for (!function(e, t) { - var n, r, i, o, a; - for (n in e) - if (i = t[r = F(n)], - o = e[n], - Array.isArray(o) && (i = o[1], - o = e[n] = o[0]), - n !== r && (e[r] = o, - delete e[n]), - (a = ce.cssHooks[r]) && "expand"in a) - for (n in o = a.expand(o), - delete e[r], - o) - n in e || (e[n] = o[n], - t[n] = i); - else - t[r] = i - }(c, l.opts.specialEasing); r < i; r++) - if (n = yt.prefilters[r].call(l, o, c, l.opts)) - return v(n.stop) && (ce._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), - n; - return ce.map(c, vt, l), - v(l.opts.start) && l.opts.start.call(o, l), - l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always), - ce.fx.timer(ce.extend(u, { - elem: o, - anim: l, - queue: l.opts.queue - })), - l - } - ce.Animation = ce.extend(yt, { - tweeners: { - "*": [function(e, t) { - var n = this.createTween(e, t); - return te(n.elem, e, Y.exec(t), n), - n - } - ] - }, - tweener: function(e, t) { - v(e) ? (t = e, - e = ["*"]) : e = e.match(D); - for (var n, r = 0, i = e.length; r < i; r++) - n = e[r], - yt.tweeners[n] = yt.tweeners[n] || [], - yt.tweeners[n].unshift(t) - }, - prefilters: [function(e, t, n) { - var r, i, o, a, s, u, l, c, f = "width"in t || "height"in t, p = this, d = {}, h = e.style, g = e.nodeType && ee(e), v = _.get(e, "fxshow"); - for (r in n.queue || (null == (a = ce._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, - s = a.empty.fire, - a.empty.fire = function() { - a.unqueued || s() - } - ), - a.unqueued++, - p.always(function() { - p.always(function() { - a.unqueued--, - ce.queue(e, "fx").length || a.empty.fire() - }) - })), - t) - if (i = t[r], - ft.test(i)) { - if (delete t[r], - o = o || "toggle" === i, - i === (g ? "hide" : "show")) { - if ("show" !== i || !v || void 0 === v[r]) - continue; - g = !0 - } - d[r] = v && v[r] || ce.style(e, r) - } - if ((u = !ce.isEmptyObject(t)) || !ce.isEmptyObject(d)) - for (r in f && 1 === e.nodeType && (n.overflow = [h.overflow, h.overflowX, h.overflowY], - null == (l = v && v.display) && (l = _.get(e, "display")), - "none" === (c = ce.css(e, "display")) && (l ? c = l : (re([e], !0), - l = e.style.display || l, - c = ce.css(e, "display"), - re([e]))), - ("inline" === c || "inline-block" === c && null != l) && "none" === ce.css(e, "float") && (u || (p.done(function() { - h.display = l - }), - null == l && (c = h.display, - l = "none" === c ? "" : c)), - h.display = "inline-block")), - n.overflow && (h.overflow = "hidden", - p.always(function() { - h.overflow = n.overflow[0], - h.overflowX = n.overflow[1], - h.overflowY = n.overflow[2] - })), - u = !1, - d) - u || (v ? "hidden"in v && (g = v.hidden) : v = _.access(e, "fxshow", { - display: l - }), - o && (v.hidden = !g), - g && re([e], !0), - p.done(function() { - for (r in g || re([e]), - _.remove(e, "fxshow"), - d) - ce.style(e, r, d[r]) - })), - u = vt(g ? v[r] : 0, r, p), - r in v || (v[r] = u.start, - g && (u.end = u.start, - u.start = 0)) - } - ], - prefilter: function(e, t) { - t ? yt.prefilters.unshift(e) : yt.prefilters.push(e) - } - }), - ce.speed = function(e, t, n) { - var r = e && "object" == typeof e ? ce.extend({}, e) : { - complete: n || !n && t || v(e) && e, - duration: e, - easing: n && t || t && !v(t) && t - }; - return ce.fx.off ? r.duration = 0 : "number" != typeof r.duration && (r.duration in ce.fx.speeds ? r.duration = ce.fx.speeds[r.duration] : r.duration = ce.fx.speeds._default), - null != r.queue && !0 !== r.queue || (r.queue = "fx"), - r.old = r.complete, - r.complete = function() { - v(r.old) && r.old.call(this), - r.queue && ce.dequeue(this, r.queue) - } - , - r - } - , - ce.fn.extend({ - fadeTo: function(e, t, n, r) { - return this.filter(ee).css("opacity", 0).show().end().animate({ - opacity: t - }, e, n, r) - }, - animate: function(t, e, n, r) { - var i = ce.isEmptyObject(t) - , o = ce.speed(e, n, r) - , a = function() { - var e = yt(this, ce.extend({}, t), o); - (i || _.get(this, "finish")) && e.stop(!0) - }; - return a.finish = a, - i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) - }, - stop: function(i, e, o) { - var a = function(e) { - var t = e.stop; - delete e.stop, - t(o) - }; - return "string" != typeof i && (o = e, - e = i, - i = void 0), - e && this.queue(i || "fx", []), - this.each(function() { - var e = !0 - , t = null != i && i + "queueHooks" - , n = ce.timers - , r = _.get(this); - if (t) - r[t] && r[t].stop && a(r[t]); - else - for (t in r) - r[t] && r[t].stop && pt.test(t) && a(r[t]); - for (t = n.length; t--; ) - n[t].elem !== this || null != i && n[t].queue !== i || (n[t].anim.stop(o), - e = !1, - n.splice(t, 1)); - !e && o || ce.dequeue(this, i) - }) - }, - finish: function(a) { - return !1 !== a && (a = a || "fx"), - this.each(function() { - var e, t = _.get(this), n = t[a + "queue"], r = t[a + "queueHooks"], i = ce.timers, o = n ? n.length : 0; - for (t.finish = !0, - ce.queue(this, a, []), - r && r.stop && r.stop.call(this, !0), - e = i.length; e--; ) - i[e].elem === this && i[e].queue === a && (i[e].anim.stop(!0), - i.splice(e, 1)); - for (e = 0; e < o; e++) - n[e] && n[e].finish && n[e].finish.call(this); - delete t.finish - }) - } - }), - ce.each(["toggle", "show", "hide"], function(e, r) { - var i = ce.fn[r]; - ce.fn[r] = function(e, t, n) { - return null == e || "boolean" == typeof e ? i.apply(this, arguments) : this.animate(gt(r, !0), e, t, n) - } - }), - ce.each({ - slideDown: gt("show"), - slideUp: gt("hide"), - slideToggle: gt("toggle"), - fadeIn: { - opacity: "show" - }, - fadeOut: { - opacity: "hide" - }, - fadeToggle: { - opacity: "toggle" - } - }, function(e, r) { - ce.fn[e] = function(e, t, n) { - return this.animate(r, e, t, n) - } - }), - ce.timers = [], - ce.fx.tick = function() { - var e, t = 0, n = ce.timers; - for (st = Date.now(); t < n.length; t++) - (e = n[t])() || n[t] !== e || n.splice(t--, 1); - n.length || ce.fx.stop(), - st = void 0 - } - , - ce.fx.timer = function(e) { - ce.timers.push(e), - ce.fx.start() - } - , - ce.fx.interval = 13, - ce.fx.start = function() { - ut || (ut = !0, - dt()) - } - , - ce.fx.stop = function() { - ut = null - } - , - ce.fx.speeds = { - slow: 600, - fast: 200, - _default: 400 - }, - ce.fn.delay = function(r, e) { - return r = ce.fx && ce.fx.speeds[r] || r, - e = e || "fx", - this.queue(e, function(e, t) { - var n = ie.setTimeout(e, r); - t.stop = function() { - ie.clearTimeout(n) - } - }) - } - , - lt = C.createElement("input"), - ct = C.createElement("select").appendChild(C.createElement("option")), - lt.type = "checkbox", - le.checkOn = "" !== lt.value, - le.optSelected = ct.selected, - (lt = C.createElement("input")).value = "t", - lt.type = "radio", - le.radioValue = "t" === lt.value; - var mt, xt = ce.expr.attrHandle; - ce.fn.extend({ - attr: function(e, t) { - return M(this, ce.attr, e, t, 1 < arguments.length) - }, - removeAttr: function(e) { - return this.each(function() { - ce.removeAttr(this, e) - }) - } - }), - ce.extend({ - attr: function(e, t, n) { - var r, i, o = e.nodeType; - if (3 !== o && 8 !== o && 2 !== o) - return "undefined" == typeof e.getAttribute ? ce.prop(e, t, n) : (1 === o && ce.isXMLDoc(e) || (i = ce.attrHooks[t.toLowerCase()] || (ce.expr.match.bool.test(t) ? mt : void 0)), - void 0 !== n ? null === n ? void ce.removeAttr(e, t) : i && "set"in i && void 0 !== (r = i.set(e, n, t)) ? r : (e.setAttribute(t, n + ""), - n) : i && "get"in i && null !== (r = i.get(e, t)) ? r : null == (r = ce.find.attr(e, t)) ? void 0 : r) - }, - attrHooks: { - type: { - set: function(e, t) { - if (!le.radioValue && "radio" === t && fe(e, "input")) { - var n = e.value; - return e.setAttribute("type", t), - n && (e.value = n), - t - } - } - } - }, - removeAttr: function(e, t) { - var n, r = 0, i = t && t.match(D); - if (i && 1 === e.nodeType) - while (n = i[r++]) - e.removeAttribute(n) - } - }), - mt = { - set: function(e, t, n) { - return !1 === t ? ce.removeAttr(e, n) : e.setAttribute(n, n), - n - } - }, - ce.each(ce.expr.match.bool.source.match(/\w+/g), function(e, t) { - var a = xt[t] || ce.find.attr; - xt[t] = function(e, t, n) { - var r, i, o = t.toLowerCase(); - return n || (i = xt[o], - xt[o] = r, - r = null != a(e, t, n) ? o : null, - xt[o] = i), - r - } - }); - var bt = /^(?:input|select|textarea|button)$/i - , wt = /^(?:a|area)$/i; - function Tt(e) { - return (e.match(D) || []).join(" ") - } - function Ct(e) { - return e.getAttribute && e.getAttribute("class") || "" - } - function kt(e) { - return Array.isArray(e) ? e : "string" == typeof e && e.match(D) || [] - } - ce.fn.extend({ - prop: function(e, t) { - return M(this, ce.prop, e, t, 1 < arguments.length) - }, - removeProp: function(e) { - return this.each(function() { - delete this[ce.propFix[e] || e] - }) - } - }), - ce.extend({ - prop: function(e, t, n) { - var r, i, o = e.nodeType; - if (3 !== o && 8 !== o && 2 !== o) - return 1 === o && ce.isXMLDoc(e) || (t = ce.propFix[t] || t, - i = ce.propHooks[t]), - void 0 !== n ? i && "set"in i && void 0 !== (r = i.set(e, n, t)) ? r : e[t] = n : i && "get"in i && null !== (r = i.get(e, t)) ? r : e[t] - }, - propHooks: { - tabIndex: { - get: function(e) { - var t = ce.find.attr(e, "tabindex"); - return t ? parseInt(t, 10) : bt.test(e.nodeName) || wt.test(e.nodeName) && e.href ? 0 : -1 - } - } - }, - propFix: { - "for": "htmlFor", - "class": "className" - } - }), - le.optSelected || (ce.propHooks.selected = { - get: function(e) { - var t = e.parentNode; - return t && t.parentNode && t.parentNode.selectedIndex, - null - }, - set: function(e) { - var t = e.parentNode; - t && (t.selectedIndex, - t.parentNode && t.parentNode.selectedIndex) - } - }), - ce.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function() { - ce.propFix[this.toLowerCase()] = this - }), - ce.fn.extend({ - addClass: function(t) { - var e, n, r, i, o, a; - return v(t) ? this.each(function(e) { - ce(this).addClass(t.call(this, e, Ct(this))) - }) : (e = kt(t)).length ? this.each(function() { - if (r = Ct(this), - n = 1 === this.nodeType && " " + Tt(r) + " ") { - for (o = 0; o < e.length; o++) - i = e[o], - n.indexOf(" " + i + " ") < 0 && (n += i + " "); - a = Tt(n), - r !== a && this.setAttribute("class", a) - } - }) : this - }, - removeClass: function(t) { - var e, n, r, i, o, a; - return v(t) ? this.each(function(e) { - ce(this).removeClass(t.call(this, e, Ct(this))) - }) : arguments.length ? (e = kt(t)).length ? this.each(function() { - if (r = Ct(this), - n = 1 === this.nodeType && " " + Tt(r) + " ") { - for (o = 0; o < e.length; o++) { - i = e[o]; - while (-1 < n.indexOf(" " + i + " ")) - n = n.replace(" " + i + " ", " ") - } - a = Tt(n), - r !== a && this.setAttribute("class", a) - } - }) : this : this.attr("class", "") - }, - toggleClass: function(t, n) { - var e, r, i, o, a = typeof t, s = "string" === a || Array.isArray(t); - return v(t) ? this.each(function(e) { - ce(this).toggleClass(t.call(this, e, Ct(this), n), n) - }) : "boolean" == typeof n && s ? n ? this.addClass(t) : this.removeClass(t) : (e = kt(t), - this.each(function() { - if (s) - for (o = ce(this), - i = 0; i < e.length; i++) - r = e[i], - o.hasClass(r) ? o.removeClass(r) : o.addClass(r); - else - void 0 !== t && "boolean" !== a || ((r = Ct(this)) && _.set(this, "__className__", r), - this.setAttribute && this.setAttribute("class", r || !1 === t ? "" : _.get(this, "__className__") || "")) - })) - }, - hasClass: function(e) { - var t, n, r = 0; - t = " " + e + " "; - while (n = this[r++]) - if (1 === n.nodeType && -1 < (" " + Tt(Ct(n)) + " ").indexOf(t)) - return !0; - return !1 - } - }); - var St = /\r/g; - ce.fn.extend({ - val: function(n) { - var r, e, i, t = this[0]; - return arguments.length ? (i = v(n), - this.each(function(e) { - var t; - 1 === this.nodeType && (null == (t = i ? n.call(this, e, ce(this).val()) : n) ? t = "" : "number" == typeof t ? t += "" : Array.isArray(t) && (t = ce.map(t, function(e) { - return null == e ? "" : e + "" - })), - (r = ce.valHooks[this.type] || ce.valHooks[this.nodeName.toLowerCase()]) && "set"in r && void 0 !== r.set(this, t, "value") || (this.value = t)) - })) : t ? (r = ce.valHooks[t.type] || ce.valHooks[t.nodeName.toLowerCase()]) && "get"in r && void 0 !== (e = r.get(t, "value")) ? e : "string" == typeof (e = t.value) ? e.replace(St, "") : null == e ? "" : e : void 0 - } - }), - ce.extend({ - valHooks: { - option: { - get: function(e) { - var t = ce.find.attr(e, "value"); - return null != t ? t : Tt(ce.text(e)) - } - }, - select: { - get: function(e) { - var t, n, r, i = e.options, o = e.selectedIndex, a = "select-one" === e.type, s = a ? null : [], u = a ? o + 1 : i.length; - for (r = o < 0 ? u : a ? o : 0; r < u; r++) - if (((n = i[r]).selected || r === o) && !n.disabled && (!n.parentNode.disabled || !fe(n.parentNode, "optgroup"))) { - if (t = ce(n).val(), - a) - return t; - s.push(t) - } - return s - }, - set: function(e, t) { - var n, r, i = e.options, o = ce.makeArray(t), a = i.length; - while (a--) - ((r = i[a]).selected = -1 < ce.inArray(ce.valHooks.option.get(r), o)) && (n = !0); - return n || (e.selectedIndex = -1), - o - } - } - } - }), - ce.each(["radio", "checkbox"], function() { - ce.valHooks[this] = { - set: function(e, t) { - if (Array.isArray(t)) - return e.checked = -1 < ce.inArray(ce(e).val(), t) - } - }, - le.checkOn || (ce.valHooks[this].get = function(e) { - return null === e.getAttribute("value") ? "on" : e.value - } - ) - }); - var Et = ie.location - , jt = { - guid: Date.now() - } - , At = /\?/; - ce.parseXML = function(e) { - var t, n; - if (!e || "string" != typeof e) - return null; - try { - t = (new ie.DOMParser).parseFromString(e, "text/xml") - } catch (e) {} - return n = t && t.getElementsByTagName("parsererror")[0], - t && !n || ce.error("Invalid XML: " + (n ? ce.map(n.childNodes, function(e) { - return e.textContent - }).join("\n") : e)), - t - } - ; - var Dt = /^(?:focusinfocus|focusoutblur)$/ - , Nt = function(e) { - e.stopPropagation() - }; - ce.extend(ce.event, { - trigger: function(e, t, n, r) { - var i, o, a, s, u, l, c, f, p = [n || C], d = ue.call(e, "type") ? e.type : e, h = ue.call(e, "namespace") ? e.namespace.split(".") : []; - if (o = f = a = n = n || C, - 3 !== n.nodeType && 8 !== n.nodeType && !Dt.test(d + ce.event.triggered) && (-1 < d.indexOf(".") && (d = (h = d.split(".")).shift(), - h.sort()), - u = d.indexOf(":") < 0 && "on" + d, - (e = e[ce.expando] ? e : new ce.Event(d,"object" == typeof e && e)).isTrigger = r ? 2 : 3, - e.namespace = h.join("."), - e.rnamespace = e.namespace ? new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, - e.result = void 0, - e.target || (e.target = n), - t = null == t ? [e] : ce.makeArray(t, [e]), - c = ce.event.special[d] || {}, - r || !c.trigger || !1 !== c.trigger.apply(n, t))) { - if (!r && !c.noBubble && !y(n)) { - for (s = c.delegateType || d, - Dt.test(s + d) || (o = o.parentNode); o; o = o.parentNode) - p.push(o), - a = o; - a === (n.ownerDocument || C) && p.push(a.defaultView || a.parentWindow || ie) - } - i = 0; - while ((o = p[i++]) && !e.isPropagationStopped()) - f = o, - e.type = 1 < i ? s : c.bindType || d, - (l = (_.get(o, "events") || Object.create(null))[e.type] && _.get(o, "handle")) && l.apply(o, t), - (l = u && o[u]) && l.apply && $(o) && (e.result = l.apply(o, t), - !1 === e.result && e.preventDefault()); - return e.type = d, - r || e.isDefaultPrevented() || c._default && !1 !== c._default.apply(p.pop(), t) || !$(n) || u && v(n[d]) && !y(n) && ((a = n[u]) && (n[u] = null), - ce.event.triggered = d, - e.isPropagationStopped() && f.addEventListener(d, Nt), - n[d](), - e.isPropagationStopped() && f.removeEventListener(d, Nt), - ce.event.triggered = void 0, - a && (n[u] = a)), - e.result - } - }, - simulate: function(e, t, n) { - var r = ce.extend(new ce.Event, n, { - type: e, - isSimulated: !0 - }); - ce.event.trigger(r, null, t) - } - }), - ce.fn.extend({ - trigger: function(e, t) { - return this.each(function() { - ce.event.trigger(e, t, this) - }) - }, - triggerHandler: function(e, t) { - var n = this[0]; - if (n) - return ce.event.trigger(e, t, n, !0) - } - }); - var qt = /\[\]$/ - , Lt = /\r?\n/g - , Ht = /^(?:submit|button|image|reset|file)$/i - , Ot = /^(?:input|select|textarea|keygen)/i; - function Pt(n, e, r, i) { - var t; - if (Array.isArray(e)) - ce.each(e, function(e, t) { - r || qt.test(n) ? i(n, t) : Pt(n + "[" + ("object" == typeof t && null != t ? e : "") + "]", t, r, i) - }); - else if (r || "object" !== x(e)) - i(n, e); - else - for (t in e) - Pt(n + "[" + t + "]", e[t], r, i) - } - ce.param = function(e, t) { - var n, r = [], i = function(e, t) { - var n = v(t) ? t() : t; - r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n) - }; - if (null == e) - return ""; - if (Array.isArray(e) || e.jquery && !ce.isPlainObject(e)) - ce.each(e, function() { - i(this.name, this.value) - }); - else - for (n in e) - Pt(n, e[n], t, i); - return r.join("&") - } - , - ce.fn.extend({ - serialize: function() { - return ce.param(this.serializeArray()) - }, - serializeArray: function() { - return this.map(function() { - var e = ce.prop(this, "elements"); - return e ? ce.makeArray(e) : this - }).filter(function() { - var e = this.type; - return this.name && !ce(this).is(":disabled") && Ot.test(this.nodeName) && !Ht.test(e) && (this.checked || !we.test(e)) - }).map(function(e, t) { - var n = ce(this).val(); - return null == n ? null : Array.isArray(n) ? ce.map(n, function(e) { - return { - name: t.name, - value: e.replace(Lt, "\r\n") - } - }) : { - name: t.name, - value: n.replace(Lt, "\r\n") - } - }).get() - } - }); - var Mt = /%20/g - , Rt = /#.*$/ - , It = /([?&])_=[^&]*/ - , Wt = /^(.*?):[ \t]*([^\r\n]*)$/gm - , Ft = /^(?:GET|HEAD)$/ - , $t = /^\/\// - , Bt = {} - , _t = {} - , zt = "*/".concat("*") - , Xt = C.createElement("a"); - function Ut(o) { - return function(e, t) { - "string" != typeof e && (t = e, - e = "*"); - var n, r = 0, i = e.toLowerCase().match(D) || []; - if (v(t)) - while (n = i[r++]) - "+" === n[0] ? (n = n.slice(1) || "*", - (o[n] = o[n] || []).unshift(t)) : (o[n] = o[n] || []).push(t) - } - } - function Vt(t, i, o, a) { - var s = {} - , u = t === _t; - function l(e) { - var r; - return s[e] = !0, - ce.each(t[e] || [], function(e, t) { - var n = t(i, o, a); - return "string" != typeof n || u || s[n] ? u ? !(r = n) : void 0 : (i.dataTypes.unshift(n), - l(n), - !1) - }), - r - } - return l(i.dataTypes[0]) || !s["*"] && l("*") - } - function Gt(e, t) { - var n, r, i = ce.ajaxSettings.flatOptions || {}; - for (n in t) - void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); - return r && ce.extend(!0, e, r), - e - } - Xt.href = Et.href, - ce.extend({ - active: 0, - lastModified: {}, - etag: {}, - ajaxSettings: { - url: Et.href, - type: "GET", - isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol), - global: !0, - processData: !0, - async: !0, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - accepts: { - "*": zt, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - converters: { - "* text": String, - "text html": !0, - "text json": JSON.parse, - "text xml": ce.parseXML - }, - flatOptions: { - url: !0, - context: !0 - } - }, - ajaxSetup: function(e, t) { - return t ? Gt(Gt(e, ce.ajaxSettings), t) : Gt(ce.ajaxSettings, e) - }, - ajaxPrefilter: Ut(Bt), - ajaxTransport: Ut(_t), - ajax: function(e, t) { - "object" == typeof e && (t = e, - e = void 0), - t = t || {}; - var c, f, p, n, d, r, h, g, i, o, v = ce.ajaxSetup({}, t), y = v.context || v, m = v.context && (y.nodeType || y.jquery) ? ce(y) : ce.event, x = ce.Deferred(), b = ce.Callbacks("once memory"), w = v.statusCode || {}, a = {}, s = {}, u = "canceled", T = { - readyState: 0, - getResponseHeader: function(e) { - var t; - if (h) { - if (!n) { - n = {}; - while (t = Wt.exec(p)) - n[t[1].toLowerCase() + " "] = (n[t[1].toLowerCase() + " "] || []).concat(t[2]) - } - t = n[e.toLowerCase() + " "] - } - return null == t ? null : t.join(", ") - }, - getAllResponseHeaders: function() { - return h ? p : null - }, - setRequestHeader: function(e, t) { - return null == h && (e = s[e.toLowerCase()] = s[e.toLowerCase()] || e, - a[e] = t), - this - }, - overrideMimeType: function(e) { - return null == h && (v.mimeType = e), - this - }, - statusCode: function(e) { - var t; - if (e) - if (h) - T.always(e[T.status]); - else - for (t in e) - w[t] = [w[t], e[t]]; - return this - }, - abort: function(e) { - var t = e || u; - return c && c.abort(t), - l(0, t), - this - } - }; - if (x.promise(T), - v.url = ((e || v.url || Et.href) + "").replace($t, Et.protocol + "//"), - v.type = t.method || t.type || v.method || v.type, - v.dataTypes = (v.dataType || "*").toLowerCase().match(D) || [""], - null == v.crossDomain) { - r = C.createElement("a"); - try { - r.href = v.url, - r.href = r.href, - v.crossDomain = Xt.protocol + "//" + Xt.host != r.protocol + "//" + r.host - } catch (e) { - v.crossDomain = !0 - } - } - if (v.data && v.processData && "string" != typeof v.data && (v.data = ce.param(v.data, v.traditional)), - Vt(Bt, v, t, T), - h) - return T; - for (i in (g = ce.event && v.global) && 0 == ce.active++ && ce.event.trigger("ajaxStart"), - v.type = v.type.toUpperCase(), - v.hasContent = !Ft.test(v.type), - f = v.url.replace(Rt, ""), - v.hasContent ? v.data && v.processData && 0 === (v.contentType || "").indexOf("application/x-www-form-urlencoded") && (v.data = v.data.replace(Mt, "+")) : (o = v.url.slice(f.length), - v.data && (v.processData || "string" == typeof v.data) && (f += (At.test(f) ? "&" : "?") + v.data, - delete v.data), - !1 === v.cache && (f = f.replace(It, "$1"), - o = (At.test(f) ? "&" : "?") + "_=" + jt.guid++ + o), - v.url = f + o), - v.ifModified && (ce.lastModified[f] && T.setRequestHeader("If-Modified-Since", ce.lastModified[f]), - ce.etag[f] && T.setRequestHeader("If-None-Match", ce.etag[f])), - (v.data && v.hasContent && !1 !== v.contentType || t.contentType) && T.setRequestHeader("Content-Type", v.contentType), - T.setRequestHeader("Accept", v.dataTypes[0] && v.accepts[v.dataTypes[0]] ? v.accepts[v.dataTypes[0]] + ("*" !== v.dataTypes[0] ? ", " + zt + "; q=0.01" : "") : v.accepts["*"]), - v.headers) - T.setRequestHeader(i, v.headers[i]); - if (v.beforeSend && (!1 === v.beforeSend.call(y, T, v) || h)) - return T.abort(); - if (u = "abort", - b.add(v.complete), - T.done(v.success), - T.fail(v.error), - c = Vt(_t, v, t, T)) { - if (T.readyState = 1, - g && m.trigger("ajaxSend", [T, v]), - h) - return T; - v.async && 0 < v.timeout && (d = ie.setTimeout(function() { - T.abort("timeout") - }, v.timeout)); - try { - h = !1, - c.send(a, l) - } catch (e) { - if (h) - throw e; - l(-1, e) - } - } else - l(-1, "No Transport"); - function l(e, t, n, r) { - var i, o, a, s, u, l = t; - h || (h = !0, - d && ie.clearTimeout(d), - c = void 0, - p = r || "", - T.readyState = 0 < e ? 4 : 0, - i = 200 <= e && e < 300 || 304 === e, - n && (s = function(e, t, n) { - var r, i, o, a, s = e.contents, u = e.dataTypes; - while ("*" === u[0]) - u.shift(), - void 0 === r && (r = e.mimeType || t.getResponseHeader("Content-Type")); - if (r) - for (i in s) - if (s[i] && s[i].test(r)) { - u.unshift(i); - break - } - if (u[0]in n) - o = u[0]; - else { - for (i in n) { - if (!u[0] || e.converters[i + " " + u[0]]) { - o = i; - break - } - a || (a = i) - } - o = o || a - } - if (o) - return o !== u[0] && u.unshift(o), - n[o] - }(v, T, n)), - !i && -1 < ce.inArray("script", v.dataTypes) && ce.inArray("json", v.dataTypes) < 0 && (v.converters["text script"] = function() {} - ), - s = function(e, t, n, r) { - var i, o, a, s, u, l = {}, c = e.dataTypes.slice(); - if (c[1]) - for (a in e.converters) - l[a.toLowerCase()] = e.converters[a]; - o = c.shift(); - while (o) - if (e.responseFields[o] && (n[e.responseFields[o]] = t), - !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), - u = o, - o = c.shift()) - if ("*" === o) - o = u; - else if ("*" !== u && u !== o) { - if (!(a = l[u + " " + o] || l["* " + o])) - for (i in l) - if ((s = i.split(" "))[1] === o && (a = l[u + " " + s[0]] || l["* " + s[0]])) { - !0 === a ? a = l[i] : !0 !== l[i] && (o = s[0], - c.unshift(s[1])); - break - } - if (!0 !== a) - if (a && e["throws"]) - t = a(t); - else - try { - t = a(t) - } catch (e) { - return { - state: "parsererror", - error: a ? e : "No conversion from " + u + " to " + o - } - } - } - return { - state: "success", - data: t - } - }(v, s, T, i), - i ? (v.ifModified && ((u = T.getResponseHeader("Last-Modified")) && (ce.lastModified[f] = u), - (u = T.getResponseHeader("etag")) && (ce.etag[f] = u)), - 204 === e || "HEAD" === v.type ? l = "nocontent" : 304 === e ? l = "notmodified" : (l = s.state, - o = s.data, - i = !(a = s.error))) : (a = l, - !e && l || (l = "error", - e < 0 && (e = 0))), - T.status = e, - T.statusText = (t || l) + "", - i ? x.resolveWith(y, [o, l, T]) : x.rejectWith(y, [T, l, a]), - T.statusCode(w), - w = void 0, - g && m.trigger(i ? "ajaxSuccess" : "ajaxError", [T, v, i ? o : a]), - b.fireWith(y, [T, l]), - g && (m.trigger("ajaxComplete", [T, v]), - --ce.active || ce.event.trigger("ajaxStop"))) - } - return T - }, - getJSON: function(e, t, n) { - return ce.get(e, t, n, "json") - }, - getScript: function(e, t) { - return ce.get(e, void 0, t, "script") - } - }), - ce.each(["get", "post"], function(e, i) { - ce[i] = function(e, t, n, r) { - return v(t) && (r = r || n, - n = t, - t = void 0), - ce.ajax(ce.extend({ - url: e, - type: i, - dataType: r, - data: t, - success: n - }, ce.isPlainObject(e) && e)) - } - }), - ce.ajaxPrefilter(function(e) { - var t; - for (t in e.headers) - "content-type" === t.toLowerCase() && (e.contentType = e.headers[t] || "") - }), - ce._evalUrl = function(e, t, n) { - return ce.ajax({ - url: e, - type: "GET", - dataType: "script", - cache: !0, - async: !1, - global: !1, - converters: { - "text script": function() {} - }, - dataFilter: function(e) { - ce.globalEval(e, t, n) - } - }) - } - , - ce.fn.extend({ - wrapAll: function(e) { - var t; - return this[0] && (v(e) && (e = e.call(this[0])), - t = ce(e, this[0].ownerDocument).eq(0).clone(!0), - this[0].parentNode && t.insertBefore(this[0]), - t.map(function() { - var e = this; - while (e.firstElementChild) - e = e.firstElementChild; - return e - }).append(this)), - this - }, - wrapInner: function(n) { - return v(n) ? this.each(function(e) { - ce(this).wrapInner(n.call(this, e)) - }) : this.each(function() { - var e = ce(this) - , t = e.contents(); - t.length ? t.wrapAll(n) : e.append(n) - }) - }, - wrap: function(t) { - var n = v(t); - return this.each(function(e) { - ce(this).wrapAll(n ? t.call(this, e) : t) - }) - }, - unwrap: function(e) { - return this.parent(e).not("body").each(function() { - ce(this).replaceWith(this.childNodes) - }), - this - } - }), - ce.expr.pseudos.hidden = function(e) { - return !ce.expr.pseudos.visible(e) - } - , - ce.expr.pseudos.visible = function(e) { - return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) - } - , - ce.ajaxSettings.xhr = function() { - try { - return new ie.XMLHttpRequest - } catch (e) {} - } - ; - var Yt = { - 0: 200, - 1223: 204 - } - , Qt = ce.ajaxSettings.xhr(); - le.cors = !!Qt && "withCredentials"in Qt, - le.ajax = Qt = !!Qt, - ce.ajaxTransport(function(i) { - var o, a; - if (le.cors || Qt && !i.crossDomain) - return { - send: function(e, t) { - var n, r = i.xhr(); - if (r.open(i.type, i.url, i.async, i.username, i.password), - i.xhrFields) - for (n in i.xhrFields) - r[n] = i.xhrFields[n]; - for (n in i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), - i.crossDomain || e["X-Requested-With"] || (e["X-Requested-With"] = "XMLHttpRequest"), - e) - r.setRequestHeader(n, e[n]); - o = function(e) { - return function() { - o && (o = a = r.onload = r.onerror = r.onabort = r.ontimeout = r.onreadystatechange = null, - "abort" === e ? r.abort() : "error" === e ? "number" != typeof r.status ? t(0, "error") : t(r.status, r.statusText) : t(Yt[r.status] || r.status, r.statusText, "text" !== (r.responseType || "text") || "string" != typeof r.responseText ? { - binary: r.response - } : { - text: r.responseText - }, r.getAllResponseHeaders())) - } - } - , - r.onload = o(), - a = r.onerror = r.ontimeout = o("error"), - void 0 !== r.onabort ? r.onabort = a : r.onreadystatechange = function() { - 4 === r.readyState && ie.setTimeout(function() { - o && a() - }) - } - , - o = o("abort"); - try { - r.send(i.hasContent && i.data || null) - } catch (e) { - if (o) - throw e - } - }, - abort: function() { - o && o() - } - } - }), - ce.ajaxPrefilter(function(e) { - e.crossDomain && (e.contents.script = !1) - }), - ce.ajaxSetup({ - accepts: { - script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function(e) { - return ce.globalEval(e), - e - } - } - }), - ce.ajaxPrefilter("script", function(e) { - void 0 === e.cache && (e.cache = !1), - e.crossDomain && (e.type = "GET") - }), - ce.ajaxTransport("script", function(n) { - var r, i; - if (n.crossDomain || n.scriptAttrs) - return { - send: function(e, t) { - r = ce("