This commit is contained in:
make
2025-04-01 10:57:17 +08:00
21 changed files with 717 additions and 188 deletions

View File

@@ -4,6 +4,7 @@ declare(strict_types=1);
use app\admin\controller\Domain;
use app\admin\controller\Novel;
use app\admin\controller\Site;
use app\admin\middleware\AdminAuth;
use think\facade\Route;
@@ -39,9 +40,15 @@ Route::group("/novel", function () {
# 站点
Route::group("/site", function () {
Route::get("/domain/list", [Domain::class, "getDomainList"])->name("Domain@getDomainList");
Route::post("/domain/upload", [Domain::class, "uploadDomain"])->name("Domain@uploadDomain");
# 域名管理
Route::get("/domain/list", [Site::class, "getDomainList"])->name("Domain@getDomainList");
Route::post("/domain/upload", [Site::class, "uploadDomain"])->name("Domain@uploadDomain");
Route::post("/domain/save", [Site::class, "saveDomain"])->name("Domain@saveDomain");
Route::get("/tkdarg/list", [Domain::class, "getTKDArgList"])->name("Domain@getDomainList");
# TKD 参数模板
Route::get("/tkdarg/list", [Site::class, "getTKDArgList"])->name("Domain@getTKDArgList");
# 视图模板
Route::get("/template/list", [Site::class, "getTemplateList"])->name("Domain@getTKDArgList");
})->middleware(AdminAuth::class);

View File

@@ -8,11 +8,13 @@ use app\admin\BaseController;
use app\model\AdminUserModel;
use app\model\ConverterMovel;
use app\model\DomainModel;
use app\model\TemplatesModel;
use app\Request;
use PhpOffice\PhpSpreadsheet\IOFactory;
use think\Response;
class Domain extends BaseController
class Site extends BaseController
{
/**
@@ -61,7 +63,7 @@ class Domain extends BaseController
$arrDomain = [
'd_domain' => $arrRows[0],
't_id' => $arrRows[1],
'd_title' => $arrRows[2],
'd_name' => $arrRows[2],
'd_keywords' => $arrRows[3],
'd_description' => $arrRows[4],
'd_statis' => $arrRows[5],
@@ -69,7 +71,13 @@ class Domain extends BaseController
'd_text_log' => $arrRows[7],
'd_img_log' => $arrRows[8],
];
$TCfgTemplate = TemplatesModel::where('t_id', $arrDomain['t_id'])->find()->t_cfg_template;
$arrDomain['t_cfg'] = json_encode($TCfgTemplate, JSON_UNESCAPED_UNICODE);
$DomainModel = DomainModel::where('d_domain', $arrDomain['d_domain'])->findOrEmpty();
$DomainModel->fill($arrDomain);
$DomainModel->save();
}
@@ -129,4 +137,99 @@ class Domain extends BaseController
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_statis" => $Request->post('d_statis'),
"d_logo_type" => $Request->post('d_logo_type'),
"d_text_log" => $Request->post('d_text_log'),
"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']) {
$DomainModel = DomainModel::where('d_id', $arrData['d_id'])->findOrEmpty();
} else {
$DomainModel = new DomainModel;
}
$DomainModel->fill($arrData);
$DomainModel->save();
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);
}
}

View File

@@ -814,4 +814,17 @@ namespace {
return $strPinYin;
}
/**
* Undocumented function
*
* @param object $Obj
* @param string $strAction
* @return string
*/
function getFomartSubjectKey(string $strAction): string
{
return strtoupper(str_replace('::', '@', ltrim(strrchr($strAction, "\\"), "\\")));
}
}

View File

@@ -75,7 +75,7 @@ abstract class BaseController
private function initSiteTKD()
{
ConverterMovel::setVal([
'strSiteTitle' => $this->request->DomainModel->d_title,
'strSiteName' => $this->request->DomainModel->d_name,
'strSiteKeywords' => $this->request->DomainModel->d_keywords,
'strSiteDescription' => $this->request->DomainModel->d_description,
]);

View File

@@ -14,16 +14,16 @@ use think\facade\Route;
/**
* 首页
*/
Route::get("/", [Index::class,'index'])->ext('html')->append(['boolIsMobile' => true]);
Route::get("/pc/", [Index::class,'getPcIndex'])->append(['boolIsMobile' => false]);
Route::get("/", [Index::class, 'index'])->ext('html')->append(['boolIsMobile' => true]);
Route::get("/pc/", [Index::class, 'getPcIndex'])->append(['boolIsMobile' => false]);
// Route::get("/index", [Index::class,'index'])->ext('html')->append(['boolIsMobile' => true]);
// Route::get("/pc/index", [Index::class,'getPcIndex'])->ext('html')->append(['boolIsMobile' => false]);
//排行榜
Route::get('/paihang/all', [Novel::class,'getNovelRank'])->append(['boolIsMobile' => true]);
Route::get("/pc/paihang/all", [Novel::class,'getNovelRank'])->append(['boolIsMobile' => false]);
Route::get('/paihang/all', [Novel::class, 'getNovelRank'])->append(['boolIsMobile' => true]);
Route::get("/pc/paihang/all", [Novel::class, 'getNovelRank'])->append(['boolIsMobile' => false]);
/**
* 男生/女生 - grok 推荐最优方案
@@ -35,25 +35,25 @@ Route::get('/pc/nansheng-xiaoshuo', [Novel::class, 'getNovelChannel'])->append(
Route::get('/pc/nvsheng-xiaoshuo', [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => false, 'strChannel' => 'girls']);
/**
* 书库 - grok 推荐最优方案
* /shuku/channel-category-status-page
*/
Route::get('/shuku/all', [Novel::class,'getLibrary'])->append(['boolIsMobile' => true]);
Route::get('/pc/shuku/all', [Novel::class,'getLibrary'])->append(['boolIsMobile' => false]);
Route::get('/shuku/:intGender-:strCategory-:strStatus-:intPage', [Novel::class,'getLibrary'])
* 书库 - grok 推荐最优方案
* /shuku/strGender/category/status/page
*/
Route::get('/shuku/all', [Novel::class, 'getLibrary'])->append(['boolIsMobile' => true]);
Route::get('/pc/shuku/all', [Novel::class, 'getLibrary'])->append(['boolIsMobile' => false]);
Route::get('/shuku/:strGender/:strCategory/:strStatus/page:intPage', [Novel::class, 'getLibrary'])
->pattern([
'intGender' => '\d{1}',
'strCategory' => '[\w]*',
'strStatus' => '[\w]*',
'strGender' => 'nansheng-xiaoshuo|nvsheng-xiaoshuo|all',
'strCategory' => '[a-z\-]+',
'strStatus' => 'all|lianzai|wanjie',
'intPage' => '\d+'
])
->append(['boolIsMobile' => true]);
Route::get('/pc/shuku/:intGender-:strCategory-:strStatus-:intPage', [Novel::class,'getLibrary'])
Route::get('/pc/shuku/:strGender/:strCategory/:strStatus/page:intPage', [Novel::class, 'getLibrary'])
->pattern([
'intGender' => '\d{1}',
'strCategory' => '[\w]*',
'strStatus' => '[\w]*',
'strGender' => 'nansheng-xiaoshuo|nvsheng-xiaoshuo|all',
'strCategory' => '[a-z\-]+',
'strStatus' => 'all|lianzai|wanjie',
'intPage' => '\d+'
])
->append(['boolIsMobile' => false]);
@@ -66,18 +66,18 @@ Route::get('/pc/shuku/:intGender-:strCategory-:strStatus-:intPage', [Novel::clas
*/
Route::get('/xiaoshuo/:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', [Novel::class, 'getNovelChapter'])
->append(['boolIsMobile' => true, 'intUriType' => 1])
->pattern(['intNovelId' => '\d+','name' => '[\w-]+','intChapterId' => '\d+','intChapterPage' => '\d+']);
->pattern(['intNovelId' => '\d+', 'name' => '[\w-]+', 'intChapterId' => '\d+', 'intChapterPage' => '\d+']);
Route::get('/pc/xiaoshuo/:name-:intNovelId/zhang-:intChapterSort/[:intChapterPage]', [Novel::class, 'getNovelChapter'])
->append(['boolIsMobile' => false, 'intUriType' => 1])
->pattern(['intNovelId' => '\d+','name' => '[\w-]+','intChapterSort' => '\d+','intChapterPage' => '\d+']);
->pattern(['intNovelId' => '\d+', 'name' => '[\w-]+', 'intChapterSort' => '\d+', 'intChapterPage' => '\d+']);
/**
* 最新章节-特殊页面处理
*/
*/
Route::get('/pc/books/:name-:n_id/chapter/latest', [Novel::class, 'getNovelNewsChapter'])
->append(['boolIsMobile' => false, 'intUriType' => 1])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]);
/**
@@ -86,11 +86,11 @@ Route::get('/pc/books/:name-:n_id/chapter/latest', [Novel::class, 'getNovelNewsC
*/
Route::get('/xiaoshuo/:name-:intNovelId/mulu/:strOrder/[:intPage]', [Novel::class, 'getNovelChapterAll'])
->append(['boolIsMobile' => true, 'intUriType' => 1])
->pattern(['intNovelId' => '\d+','name' => '[\w-]+','strOrder' => 'zheng|dao','intPage' => '\d+']);
->pattern(['intNovelId' => '\d+', 'name' => '[\w-]+', 'strOrder' => 'zheng|dao', 'intPage' => '\d+']);
Route::get('/pc/xiaoshuo/:name-:intNovelId/mulu/:strOrder/[:intPage]', [Novel::class, 'getNovelChapterAll'])
->append(['boolIsMobile' => false, 'intUriType' => 1])
->pattern(['intNovelId' => '\d+','name' => '[\w-]+','strOrder' => 'zheng|dao','intPage' => '\d+']);
->pattern(['intNovelId' => '\d+', 'name' => '[\w-]+', 'strOrder' => 'zheng|dao', 'intPage' => '\d+']);
/**
* 小说详情
@@ -103,27 +103,28 @@ Route::get('/pc/xiaoshuo/:name-:intNovelId/mulu/:strOrder/[:intPage]', [Novel::c
*/
Route::get('/pc/book/:name-:n_id', [Novel::class, 'getNovelInfo'])
->append(['boolIsMobile' => false, 'intUriType' => 1])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]);
Route::get('/pc/novel/:name-:n_id', [Novel::class, 'getNovelInfo'])
->append(['boolIsMobile' => false, 'intUriType' => 2])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]);
Route::get('/pc/xiaoshuo/:name-:n_id', [Novel::class, 'getNovelInfo'])
->append(['boolIsMobile' => false, 'intUriType' => 2])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]);
Route::get('/pc/book-:name-:n_id', [Novel::class, 'getNovelInfo'])
->append(['boolIsMobile' => false, 'intUriType' => 3])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]);
Route::get('/pc/novel-:name-:n_id', [Novel::class, 'getNovelInfo'])
->append(['boolIsMobile' => false, 'intUriType' => 3])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]);
Route::get('/pc/xiaoshuo-:name-:n_id', [Novel::class, 'getNovelInfo'])
->append(['boolIsMobile' => false, 'intUriType' => 3])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
->pattern(['n_id' => '\d+', 'name' => '[\w-]+',]);
//h5
Route::get('/book/:name-:n_id', [Novel::class, 'getNovelInfo'])
@@ -151,33 +152,33 @@ Route::get('/xiaoshuo-:name-:n_id', [Novel::class, 'getNovelInfo'])
->pattern(['n_id' => '\d+','name' => '[\w-]+',]);
// 搜索小说
Route::get('/search', [Novel::class,'getSearchNovel'])->ext('html')->append(['boolIsMobile' => true]);
Route::get('/pc/search', [Novel::class,'getSearchNovel'])->ext('html')->append(['boolIsMobile' => false]);
Route::get('/search', [Novel::class, 'getSearchNovel'])->ext('html')->append(['boolIsMobile' => true]);
Route::get('/pc/search', [Novel::class, 'getSearchNovel'])->ext('html')->append(['boolIsMobile' => false]);
// 小说用户中心
Route::get('/user', [User::class,'Index'])->append(['boolIsMobile' => true]);
Route::get('/pc/user', [User::class,'Index'])->append(['boolIsMobile' => false]);
Route::get('/user', [User::class, 'Index'])->append(['boolIsMobile' => true]);
Route::get('/pc/user', [User::class, 'Index'])->append(['boolIsMobile' => false]);
// 书架
Route::get('/bookshelf', [User::class,'getBookShelf'])->append(['boolIsMobile' => true]);
Route::get('/pc/bookshelf', [User::class,'getBookShelf'])->append(['boolIsMobile' => false]);
Route::get('/bookshelf', [User::class, 'getBookShelf'])->append(['boolIsMobile' => true]);
Route::get('/pc/bookshelf', [User::class, 'getBookShelf'])->append(['boolIsMobile' => false]);
// 历史记录
Route::get('/history', [User::class,'getHistory'])->append(['boolIsMobile' => true]);
Route::get('/pc/history', [User::class,'getHistory'])->append(['boolIsMobile' => false]);
Route::get('/history', [User::class, 'getHistory'])->append(['boolIsMobile' => true]);
Route::get('/pc/history', [User::class, 'getHistory'])->append(['boolIsMobile' => false]);
// 文章 列表
Route::get('/article/list-[:intCategoryId]-[:intPage]', [Novel::class,'getArticleList'])->append(['boolIsMobile' => true]);
Route::get('/pc/article/list-[:intCategoryId]-[:intPage]', [Novel::class,'getArticleList'])->append(['boolIsMobile' => false]);
Route::get('/article/list', [Novel::class,'getArticleList'])->append(['boolIsMobile' => true]);
Route::get('/pc/article/list', [Novel::class,'getArticleList'])->append(['boolIsMobile' => false]);
Route::get('/article/list-[:intCategoryId]-[:intPage]', [Novel::class, 'getArticleList'])->append(['boolIsMobile' => true]);
Route::get('/pc/article/list-[:intCategoryId]-[:intPage]', [Novel::class, 'getArticleList'])->append(['boolIsMobile' => false]);
Route::get('/article/list', [Novel::class, 'getArticleList'])->append(['boolIsMobile' => true]);
Route::get('/pc/article/list', [Novel::class, 'getArticleList'])->append(['boolIsMobile' => false]);
// 文章 详情
Route::get('/article/info-:intArticleId', [Novel::class,'getArticleInfo'])->append(['boolIsMobile' => true]);
Route::get('/pc/article/info-:intArticleId', [Novel::class,'getArticleInfo'])->append(['boolIsMobile' => false]);
Route::get('/article/info-:intArticleId', [Novel::class, 'getArticleInfo'])->append(['boolIsMobile' => true]);
Route::get('/pc/article/info-:intArticleId', [Novel::class, 'getArticleInfo'])->append(['boolIsMobile' => false]);

View File

@@ -6,6 +6,7 @@ namespace app\home\controller;
use app\home\BaseController;
use app\model\ConverterMovel;
use app\model\DomainModel;
use app\model\NovelModel;
use storage\StorageCore;
use think\facade\View;
@@ -161,6 +162,11 @@ class Index extends BaseController
// 最近更新-随机50
$arrNewsUpdateNovel = $NovelModel->getSexNovelOnCache($Request->DomainModel->d_domain, 50);
$strTitle = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__));
$strTitle = ConverterMovel::convert($strTitle);
View::assign([
'arrNewsUpdateNovel' => $arrNewsUpdateNovel,
'arrRecommendSerializationNovel' => $arrRecommendSerializationNovel,
@@ -174,17 +180,11 @@ class Index extends BaseController
'arrGirlMoonRankNovel' => $arrGirlMoonRankNovel,
'arrBGirlTotalRankNovel' => $arrBGirlTotalRankNovel,
'arrAdBanner' => [],
'strPageCode' => 'home'
'strPageCode' => 'home',
'strTitle' => $strTitle,
]);
$strTitle = '最新小说网-{strSiteTitle}-{strSiteKeywords}';
$strTitle = ConverterMovel::convert($strTitle);
echo $strTitle;exit;
if ($boolIsMobile) {
return View::fetch();
} else {

View File

@@ -5,11 +5,13 @@ declare(strict_types=1);
namespace app\home\controller;
use app\home\BaseController;
use app\model\CategoryModel;
use app\model\ConverterMovel;
use app\model\NovelModel;
use storage\StorageCore;
use think\facade\View;
use app\Request;
use template\page\CusteomPage02;
class Novel extends BaseController
{
@@ -131,53 +133,90 @@ class Novel extends BaseController
* @param integer $intPage 分页
* @return void
*/
public function getLibrary(Request $Request) //, $strNovelChannel = 'all', $strCategory = 'all', $strStatus = 'all', $intPage = 1)
public function getLibrary(Request $Request, $strGender = 'all', $strCategory = 'all', $strStatus = 'all', $intPage = 1)
{
$boolIsMobile = $Request->param('boolIsMobile');
$intGender = (int)$Request->param('intGender',0);
$strCategory = (string)$Request->param('strCategory');
$strStatus = (string)$Request->param('strStatus');
// 性别
$arrSex = [
'all' => 0,
'nansheng-xiaoshuo' => 1,
'nvsheng-xiaoshuo' => 1,
];
if (!key_exists($strGender, $arrSex)) {
return response('Bad Request', 400);
}
$intGender = $arrSex[$strGender];
// 分类
// $strCategory = $Request->param('strCategory');
if ($strCategory == 'all') {
$strSearchCategory = NULL;
} else if (!in_array($strGender, CategoryModel::$arrCategoryPinYin)) {
return response('Bad Request', 400);
} else {
$strCategoryKey = array_search($strGender, CategoryModel::$arrCategoryPinYin);
$strSearchCategory = CategoryModel::$arrCategory[$strCategoryKey];
}
// 小说状态
// $strStatus = $Request->param('strStatus');
$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;
$strKey = sprintf("Novel:Library:%s:%s:%s:%s", $intGender, $strSearchCategory, $strSearchStatus, $intPage);
$NovelModel = new NovelModel;
$arrPage = $NovelModel->getCommonNovelPageOnCache($strKey, $intPage, $intLimit, $intLifeTime, $intGender, $strSearchStatus);
$strKey = sprintf("Novel:Library:%s:%s:%s:%s", $intGender, $strCategory, $strStatus, $intPage);
// var_dump($intType);exit;
$arrPage = $NovelModel->getCommonNovelPageOnCache($strKey, $intPage, $intLimit, $intLifeTime, $intGender, $strStatus);
$strTemplate = NULL;
$intButtomNum = 5;
if ($boolIsMobile == false) {
$intButtomNum = 10;
$strTemplate = 'pc/getLibrary';
}
// echo '<pre>';
// print_r($arrPage);
// exit;
// 模拟数据
$arrNovel = [
['n_id' => 1, 'name' => '小说1', 'author' => '作者1'],
['n_id' => 2, 'name' => '小说2', 'author' => '作者2'],
['n_id' => 3, 'name' => '小说3', 'author' => '作者3'],
['n_id' => 4, 'name' => '小说3', 'author' => '作者3'],
['n_id' => 5, 'name' => '小说3', 'author' => '作者3'],
['n_id' => 6, 'name' => '小说3', 'author' => '作者3'],
['n_id' => 7, 'name' => '小说3', 'author' => '作者3'],
['n_id' => 8, 'name' => '小说3', 'author' => '作者3'],
];
$strBaseUrl = sprintf('/pc/shuku/%s/%s/%s/page{page}', $strGender, $strCategory, $strStatus);
$arrPaginator = CusteomPage02::generate($intPage, $arrPage['total'], $intLimit, $strBaseUrl, $intButtomNum);
View::assign([
'arrNovel' => $arrNovel,
'arrNovel' => $arrPage['data'],
'strPageCode' => 'library',
'intGender' => $intGender,
'strGender' => $strGender,
'strCategory' => $strCategory,
'strStatus' => $strStatus,
'intPage' => $intPage,
'intTotalPage' => $arrPage['pages'],
'arrCategory' => array_combine(array_values(CategoryModel::$arrCategoryPinYin), array_values(CategoryModel::$arrCategory)),
'arrPaginator' => $arrPaginator,
]);
if ($boolIsMobile) {
return View::fetch();
} else {
return View::fetch('pc/getLibrary');
}
return View::fetch($strTemplate);
}
// 书架
@@ -338,7 +377,7 @@ class Novel extends BaseController
$strNovel = '斗罗大陆';
ConverterMovel::setVal("strNovelName",$strNovel);
ConverterMovel::setVal("strNovelName", $strNovel);
// 模拟数据-随机推荐数据10条
@@ -359,17 +398,24 @@ class Novel extends BaseController
// 最新要点->取新意章节, 随机提取一部分内容 大概150字数
// {strNovelName}最新章节_{strNovelName}{strNovelAuthor}_{strNovelName}全文阅读_{strSiteName}
// {strNovelName}免费全文阅读-{strNovelName}{strNovelAuthor}-{strSiteName}
// $strTitle = '小说详情-{strNovelName}-xxxxx';
// $strTitle = ConverterMovel::convert($strTitle);
// echo $strTitle;exit;
$strTitle = $Request->DomainModel->getFomartSubject(getFomartSubjectKey(__METHOD__));
// echo $strTitle ;exit;
$strTitle = ConverterMovel::convert($strTitle);
View::assign([
'arrRecommendNovel' => $arrRecommendNovel,
'strPageCode' => 'boy'
'strPageCode' => 'boy',
'strTitle' => $strTitle,
]);
if ($boolIsMobile) {
return View::fetch();

View File

@@ -32,25 +32,28 @@
<div class="optCl" mod="search_channel">
<span class="optTit">所属频道</span>
<ul>
<li><a class="on" href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}.html" btn="search_category">全部</a></li>
<li><a href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">男生</a></li>
<li><a href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">女生</a></li>
<li><a class="on" href="/pc/shuku/all/{$strCategory}/{$strStatus}/page{$intPage}.html" btn="search_category">全部</a></li>
<li><a href="/pc/shuku/nansheng-xiaoshuo/{$strCategory}/{$strStatus}/page{$intPage}" btn="search_category">男生</a></li>
<li><a href="/pc/shuku/nvsheng-xiaoshuo/{$strCategory}/{$strStatus}/page{$intPage}" btn="search_category">女生</a></li>
</ul>
</div>
<div class="optCl" mod="search_channel">
<span class="optTit">所属分类</span>
<ul>
<li><a class="on" href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">全部</a></li>
<li><a href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">都市修仙</a></li>
<li><a href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">玄幻修真</a></li>
<li><a class="on" href="/pc/shuku/{$strGender}/all/{$strStatus}/page{$intPage}" btn="search_category">全部</a></li>
{foreach $arrCategory as $key=>$vo }
<li><a href="/pc/shuku/{$strGender}/{$key}/{$strStatus}/page{$intPage}" btn="search_category">{$vo}</a></li>
{/foreach}
</ul>
</div>
<div class="optCl">
<span class="optTit">是否完结</span>
<ul>
<li><a class="on" href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">全部</a></li>
<li><a href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">连载</a></li>
<li><a href="/pc/shuku/{$intGender}-{$strCategory}-{$strStatus}-{$intPage}" btn="search_category">完本</a></li>
<li><a class="on" href="/pc/shuku/{$strGender}/{$strCategory}/all/page{$intPage}" btn="search_category">全部</a></li>
<li><a href="/pc/shuku/{$strGender}/{$strCategory}/lianzai/page{$intPage}" btn="search_category">连载</a></li>
<li><a href="/pc/shuku/{$strGender}/{$strCategory}/wanjie/page{$intPage}" btn="search_category">完本</a></li>
</ul>
</div>
</div>
@@ -67,19 +70,28 @@
<!--页码切换 开始-->
<div class="changepage">
<ul class="pagination">
<li class="disabled"><span>«</span></li>
{volist name="arrPaginator" id="vo" key="k" }
<li><a href="{$vo.url}">{$vo.label}</a></li>
{/volist}
<!-- <li class="disabled"><span>«</span></li>
<li class="active"><span>1</span></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-2">2</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-3">3</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-4">4</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-5">5</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-6">6</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-7">7</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-8">8</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-2">2</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-3">3</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-4">4</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-5">5</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-6">6</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-7">7</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-8">8</a></li>
<li class="disabled"><span>...</span></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-33">33</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-34">34</a></li>
<li><a href="/pc/{$intGender}-{$strCategory}-{$strStatus}-2">»</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-33">33</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-34">34</a></li>
<li><a href="/pc/{$strGender}-{$strCategory}-{$strStatus}-2">»</a></li> -->
</ul>
</div>
<!--页码切换 结束-->

View File

@@ -6,7 +6,7 @@
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<meta name="keywords" content="狂雨小说">
<meta name="description" content="狂雨小说">
<title>狂雨小说</title>
<title>{$strTitle??''}</title>
<link rel="stylesheet" href="/template/kuangyu/home/bai_web/css/style.css" type="text/css">
<link rel="stylesheet" href="/template/kuangyu/public/css/common.css" type="text/css">
<link rel="stylesheet" href="/public/layer/need/layer.css" type="text/css">

View File

@@ -28,6 +28,18 @@ class CategoryModel extends MongoModel
9 => '其他小说',
];
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 => '军史小说',
@@ -44,17 +56,17 @@ class CategoryModel extends MongoModel
];
static public function getCategory():array
static public function getCategory(): array
{
return self::$arrCategory;
}
static public function getManCategory():array
static public function getManCategory(): array
{
return self::$arrMan;
}
static public function getWomenCategory():array
static public function getWomenCategory(): array
{
return self::$arrWomen;
}

View File

@@ -14,21 +14,31 @@ use think\Model;
class ConverterMovel
{
static private $arrMap = [
'{strSiteTitle}' => '',
'{strSiteName}' => '',
'{strSiteDomain}' => '',
'{strSiteKeywords}' => '',
'{strSiteDescription}' => '',
'{strNovelName}' => '',
'{strNovelChapterName}' => '',
'{strNovelChapterSort}' => '',
'{strNovelCategoryName}' => '',
'{intPage}' => '',
'{strNovelAuthor}' => '',
'{strNovelDescription}' => '',
];
static public $arrDescription = [
'{strSiteTitle}' => '这个是网站标题',
'{strSiteDomain}' => '这个是站点域名',
'{strSiteKeywords}' => '这个是网站关键字',
'{strSiteDescription}' => '这个是网站描述',
'{strNovelName}' => '当前页面小说标题',
'{strNovelName}' => '这个是当前页面小说标题',
'{strNovelChapterName}' => '当前页面小说章节名字',
'{strNovelChapterSort}' => '当前页面小说章节排序号',
'{strNovelCategoryName}' => '当前页面小说分类名字',
'{intPage}' => '当前页面分页页码',
'{strNovelAuthor}' => '小说作者',
'{strNovelDescription}' => '小说简介',
];
static private function getKey($strKey): string

View File

@@ -15,6 +15,8 @@ class DomainModel extends BaseModel
protected $name = 'domain';
protected $pk = 'd_id';
protected $json = ['t_cfg'];
static public function getDomainByCache($strDomain)
{
@@ -47,4 +49,54 @@ class DomainModel extends BaseModel
return $strWords;
}
/**
* Undocumented function
*
* @param string $strKey
* @return void
*/
public function getFomartSubject($strKey) //, $intNum = 1, $boolRand = false)
{
// echo $strKey;
// //exit;
// echo '<pre>';
// var_dump($this->t_cfg);
// exit;
$intSfgId = $this->t_cfg->{$strKey}['sfg_id'];
// $SubjectFomartCol = SubjectFomartModel::where('sfg_id', $intSfgId)->select();
$SubjectFomartModel = SubjectFomartModel::where('sfg_id', $intSfgId)->select()->first();
// var_dump($SubjectFomartModel->toArray());
// exit;
return $SubjectFomartModel->sf_val;
}
/**
* Undocumented function
*
* @param array $arrArgs
* @return void
*/
static public function getPageUrl($strKey, array $arrArgs): string
{
$Request = request();
// $strKey = $Request->controller(false, true) . '@' .
// $Request->action(true) . '@URL';
// $strKey = strtoupper($strKey);
$strSfVal = $Request->DomainModel->getFomartSubject($strKey);
$arrKeys = [];
$arrVals = [];
foreach ($arrArgs as $strKey => $strVal) {
$arrKeys[] = '{' . $strKey . '}';
$arrVals[] = $strVal;
}
return str_replace($arrKeys, $arrVals, $strSfVal);
}
}

View File

@@ -99,8 +99,8 @@ class NovelModel extends MongoModel
$arrOptions = [
'sort' => $arrSort,
// 'limit' => $intCount * 3,
'skip' => ($intPage - 1) * $intLimit,
'limit' => $intLimit,
'skip' => ($intPage - 1) * $intLimit,
'limit' => $intLimit,
'projection' => [
'n_id' => 1,
'og_novel_book_name' => 1,
@@ -114,13 +114,15 @@ class NovelModel extends MongoModel
],
];
$Cursor = $this->getCol()->find($arrFilter, $arrOptions);
$intTotal = $this->getCol()->countDocuments($arrFilter);
$arrResult = iterator_to_array($Cursor);
shuffle($arrResult);
$arrResult = [
'data' => $arrResult,
'total' => $intTotal,
@@ -508,21 +510,28 @@ class NovelModel extends MongoModel
*/
static public function getNovelInfoUrl($intNId, $intPinYin): string
{
$Request = request();
$strFomart = $Request->DomainModel->d_novel_info_url_fomart;
$strKey = 'NOVEL_INFO_URL';
$strUrl = DomainModel::getPageUrl($strKey, [
'intNId' => $intNId,
'strPinYin' => $intPinYin
]);
return (string)$strUrl;
return str_replace(
[
'{intNId}',
'{strPinYin}',
],
[
$intNId,
$intPinYin
],
$strFomart
);
// $Request = request();
// $strFomart = $Request->DomainModel->d_novel_info_url_fomart;
return $strUrl;
// return str_replace(
// [
// '{intNId}',
// '{strPinYin}',
// ],
// [
// $intNId,
// $intPinYin
// ],
// $strFomart
// );
// return $strUrl;
}
}

View File

@@ -0,0 +1,19 @@
<?php
declare(strict_types=1);
namespace app\model;
use think\facade\Cache;
use think\Model;
/**
* @mixin think\Model
*/
class SubjectFomartGroupModel extends BaseModel
{
protected $name = 'subject_fomart_group';
protected $pk = 'sfg_id';
}

View File

@@ -0,0 +1,17 @@
<?php
declare(strict_types=1);
namespace app\model;
use think\facade\Cache;
use think\Model;
/**
* @mixin think\Model
*/
class SubjectFomartModel extends BaseModel
{
protected $name = 'subject_fomart';
protected $pk = 'sf_id';
}

View File

@@ -13,8 +13,26 @@ use think\Model;
class TemplatesModel extends BaseModel
{
protected $name = 'templates';
protected $pk = 't_id';
protected $json = ['t_cfg_template'];
/**
* Undocumented function
*
* @param string $strVal
* @return void
*/
// public function getTCfgTemplatesAttr($strVal)
// {
// if (!empty($strVal)) {
// return json_decode($strVal);
// }
// }
static $arrTemplates = [];
static public function getTemplateOnCache($intTId)

View File

@@ -63,19 +63,19 @@ CREATE TABLE `domain` (
`d_id` int NOT NULL AUTO_INCREMENT COMMENT '域名ID',
`d_domain` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '域名',
`t_id` int DEFAULT NULL COMMENT '模板ID',
`d_title` varchar(300) COLLATE utf8mb4_unicode_ci DEFAULT '',
`d_name` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '',
`d_keywords` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`d_description` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`d_statis` text COLLATE utf8mb4_unicode_ci COMMENT '单域名统计',
`d_logo_type` tinyint(1) DEFAULT NULL,
`d_text_log` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`d_img_log` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`d_novel_info_url_fomart` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`d_content_encode` tinyint unsigned DEFAULT '0',
`t_cfg` json DEFAULT NULL,
PRIMARY KEY (`d_id`),
KEY `t_id` (`t_id`),
KEY `d_domain` (`d_domain`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='域名表';
UNIQUE KEY `d_domain` (`d_domain`) USING BTREE,
KEY `t_id` (`t_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='域名表';
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -175,6 +175,36 @@ CREATE TABLE `plan_task` (
) ENGINE=InnoDB AUTO_INCREMENT=4 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=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!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=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `system_config`
--
@@ -205,9 +235,10 @@ CREATE TABLE `templates` (
`t_default` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否默认模板',
`t_code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '模板编码',
`t_path` varchar(1000) 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=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='模板表';
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='模板表';
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -236,4 +267,4 @@ CREATE TABLE `zi_yuan_duan_dian` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-03-28 21:52:16
-- Dump completed on 2025-03-31 23:11:02

View File

@@ -1,7 +1,7 @@
<?php
namespace database\seeders;
;
namespace database\seeders;;
use app\model\TemplatesModel;
class TemplateSeeder
@@ -14,12 +14,40 @@ class TemplateSeeder
't_default' => 1,
't_code' => 'default',
't_path' => '/app/home/view/default/',
't_cfg_template' => [
'INDEX@GETPCINDEX' => [
'description' => '首页Title 替换模板分组ID',
'sfg_id' => 0,
],
'NOVEL@GETNOVELINFO' => [
'description' => '小说详情TITLE 替换模板分组ID',
'sfg_id' => 0,
],
'NOVEL_INFO_URL' => [
'description' => '小说详情URL 替换模板分组ID',
'sfg_id' => 0,
],
],
],
[
't_id' => 2,
't_default' => 0,
't_code' => 'kuangYu',
't_path' => '/app/home/view/kuangYu/',
't_cfg_template' => [
'INDEX@GETPCINDEX' => [
'description' => '首页Title 替换模板分组ID',
'sfg_id' => 0,
],
'NOVEL@GETNOVELINFO' => [
'description' => '小说详情TITLE 替换模板分组ID',
'sfg_id' => 0,
],
'NOVEL_INFO_URL' => [
'description' => '小说详情URL 替换模板分组ID',
'sfg_id' => 0,
],
],
],
[
't_id' => 3,
@@ -39,7 +67,7 @@ class TemplateSeeder
't_code' => 'shiKong',
't_path' => '/app/home/view/shiKong/',
],
];
@@ -48,13 +76,12 @@ class TemplateSeeder
if (empty($TemplatesModel)) {
TemplatesModel::insert($arrTemplate);
}else {
// 如果记录存在,更新记录
$TemplatesModel->update($arrTemplate);
}
}
TemplatesModel::flushCache();
}
}

View File

@@ -41,51 +41,51 @@ class CusteomPage extends Paginator
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);
/**
* 页码按钮
* @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 = '';
if (is_array($block['first'])) {
$html .= $this->getUrlLinks($block['first']);
}
return $html;
}
/**
* 渲染分页html
* @return mixed

View File

@@ -0,0 +1,152 @@
<?php
namespace template\page;
use think\Paginator;
class CusteomPage02
{
/**
* 生成分页按钮数据
* @param int $currentPage 当前页码
* @param int $totalItems 总数据量
* @param int $itemsPerPage 每页条数
* @param string $baseUrl 基础 URL 模板(如 /male/xuanhuan-xiuzhen/finished/page{page}
* @param int $totalButtons 总按钮数量必须大于3
* @param array $buttonLabels 按钮文本配置
* @return array 分页按钮数据
*/
public static function generate(
$currentPage,
$totalItems,
$itemsPerPage,
$baseUrl,
$totalButtons = 5,
$buttonLabels = []
) {
// 默认按钮文本
$defaultLabels = [
'prev' => '上一页',
'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);
//

BIN
code/域名.xlsx Normal file

Binary file not shown.