This commit is contained in:
make
2025-04-22 19:52:11 +08:00
parent 06ba3c8411
commit cd0cfdeec5
10 changed files with 335 additions and 92 deletions

View File

@@ -58,6 +58,14 @@ Route::get('/sitemap-chapters-:page', function (\think\Request $Request, SiteCon
})->ext('xml');
/**
* 搜索首页
*/
Route::get('/searchhome/0', function (\think\Request $Request, SiteContext $SiteContext) {
return view('novel/getSearchIndex.html');
})->ext('html');
/**
* 路由配置文件
*/

View File

@@ -51,7 +51,7 @@
</head>
<body style="font-size: 14px;" {block name="body-class"}{/block} >
<body style="font-size: 14px;" class='{block name="body-class"}{/block}' >
<div class="v-s-nav-box-h">
<div class="s-main-box">
<div class="s-logo">

View File

@@ -55,12 +55,10 @@
</div>
</div>
<div class="navs">
<a href='{site:rankurl status="$Request.route.strStatus" order="all" page="1"/}'
id="pai_hang_all" class="tabs-item">所有</a>
<a href='{site:rankurl order="$Request.route.strOrder" status="lianzai" page="$Request.route.intPage"/}'
id="pai_hang_lianzai" class="tabs-item">连载中</a>
<a href='{site:rankurl order="$Request.route.strOrder" status="wanjie" page="$Request.route.intPage"/}'
id="pai_hang_wanjie" class="tabs-item">已完结</a>
{novel:status d_key="key" d_val="val"}
<a href='{site:rankurl order="$Request.route.strOrder" status="$key" page="1"/}'
id="pai_hang_{$key}" class="tabs-item">{$val}</a>
{/novel:status}
</div>
<script>
@@ -73,14 +71,10 @@
<div class="side-left">
<div class="slide-box">
<a href="{$strCategoryIndexUrlTemp}" class="slide-item " id="fenlei_all">{site:wz wz="全部" /}</a>
<a href='{site:rankurl status="$Request.route.strStatus" order="daily" page="$Request.route.intPage"/}'
id="fenlei_daily" class="slide-item ">日榜</a>
<a href='{site:rankurl status="$Request.route.strStatus" order="weekly" page="$Request.route.intPage"/}'
id="fenlei_weekly" class="slide-item ">周榜</a>
<a href='{site:rankurl status="$Request.route.strStatus" order="monthly" page="$Request.route.intPage"/}'
id="fenlei_monthly" class="slide-item ">月榜</a>
<a href='{site:rankurl status="$Request.route.strStatus" order="total" page="$Request.route.intPage"/}'
id="fenlei_total" class="slide-item ">总榜</a>
{novel:ranksort d_key="key" d_val="val"}
<a href='{site:rankurl status="$Request.route.strStatus" order="$key" page="$Request.route.intPage"/}'
id="fenlei_{$key}" class="slide-item ">{$val}榜</a>
{/novel:ranksort}
</div>
<script>

View File

@@ -0,0 +1,168 @@
{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"}
<!-- 社交媒体标签 -->
<meta property="og:title" content={site:replace code="NOVEL@GETSEARCHNOVEL@TITLE"} />
<meta property="og:description" content='{site:replace code="NOVEL@GETSEARCHNOVEL@DESCRIPTION"}' />
<meta property="og:url" content="https://{$DomainModel->d_domain}{site:souurl key='$Request.get.keyword' p='1'/}" />
<meta property="og:type" content="book" />
<meta property="og:site_name" content="{$DomainModel->d_name}">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{$Request.get.keyword} - {$DomainModel->d_name}搜索 - 第{$Request.get.intPage}页">
<meta name="twitter:description" content="{$Request.get.keyword}搜索结果第{$Request.get.intPage}页,免费阅读小说,快来体验!">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SearchResultsPage",
"url": "https://{$DomainModel->d_name}{site:souurl key='$Request.get.keyword' p='1'/}",
"name": "{$DomainModel->d_name} - {$DomainModel->d_name}搜索 第{$Request.get.intPage}页",
"description": "搜索‘{$Request.get.keyword}’结果第{$Request.get.intPage}页,提供{$Request.get.keyword}创作的小说免费阅读。",
"datePublished": "{$arrNovel['n_update_time'] ?? time()}",
"mainEntity": {
"@type": "Book",
"name": "{$DomainModel->d_name}",
"author": {
"@type": "Person",
"name": "{$DomainModel->d_name}"
},
"url": "https://{$DomainModel->d_domain}"
}
}
</script>
{/block}
{block name='nav-active-class'}searchhome{/block}
{block name="body-class"}novel_so novel_search_page{/block}
{block name="logo-html"}
<h2 class="bookname">
<a href="/" style="color:#ffffff">{$DomainModel->d_name}</a>
</h2>
{/block}
{block name="head-css"}
<link rel="stylesheet" type="text/css" href="/template/shikong/css/search.css">
{/block}
{block name="subcategory"}{/block}
{block name="main"}
<div class="content-box">
<div class="item-box">
<div class="main-box">
<div class="">
<div class="search-home">
<div class="search-form">
<div class="search-content">
<div class="input">
<input type="text" name="keyword" :placeholder="{site:wz wz="使用+或者空格组合多个关键词" /}"
id="search_input" onfocus="onfocusSearch()" oninput="oninputSearch()"
onchange="onchangeSearch()">
<div class="input-border">
<div role="separator" class="van-divider van-divider--hairline"></div>
</div>
</div>
<div class="button" onclick="search()">{site:wz wz="搜索" /}</div>
</div>
<div class="search-history-content" style="display: none">
<div class="title">
<div class="title-text">{site:wz wz="搜索历史" /}</div>
<div class="delete-all-history" @click="handleDelAll">{site:wz wz="删除历史记录" /}</div>
</div>
<div class="text">
<div class="history-text">{site:wz wz="搜索记录" /}</div>
<i class="bi bi-trash3"></i>
</div>
</div>
</div>
<div class="search-tag-content">
{novel:list count="8" sort_type="tuijian" d_key="key" d_val="Novel" cache_life="86400"}
<div class="search-tags">
<div class="title"><i class="bi {eq name="key" value="0"}bi-fire {else/} bi-heart-fill{/eq}"></i>
{$Novel.n_name}</div>
<div class="tags tags-rect">
<span class="badge badge-light badge-light-click" data-keyword="{$Novel.n_name}">{$Novel.n_author}</span>
</div>
</div>
{/novel:list}
</div>
</div>
</div>
</div>
</div>
</div>
<script>
var searchInputActive = false;
var searchInputval = '';
function onfocusSearch(e) {
searchInputActive = true
}
function oninputSearch(e) {
let dom = $('#search_input')
searchInputval = dom.val()
}
function onchangeSearch() {
searchInputActive = false
}
$("#search_input").keydown(function (e) {
if (e.keyCode == 13) {
search()
e.preventDefault();
}
})
$('.badge-light-click').click(function () {
$keyword = $(this).data('keyword');
$('#search_input').val($keyword)
setTimeout(function () {
search();
}, 60)
})
function search(e) {
let val = $('#search_input').val()
if (!val) {
new Noty({
layout: 'topCenter',
theme: 'bootstrap-v4',
text: '关键词不能为空!',
progressBar: false,
timeout: 1000
}).show().setType('alert');
return
}
window.location.replace("{$strSearchIndexUrlTemp}" + `?keyword=${val}`)
}
</script>
{/block}

View File

@@ -1,4 +1,19 @@
{extend name="baseH5" /}
{block name="get-data"}
{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="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}
@@ -37,7 +52,7 @@
</script>
{/block}
{block name='nav-active-class'}home{/block}
{block name="body-class"}novel_so novel_search_page{/block}
{block name="logo-html"}
@@ -46,69 +61,62 @@
</h2>
{/block}
{block name="head-css"}
<link rel="stylesheet" type="text/css" href="/template/shikong/css/search.css">
{/block}
{block name="subcategory"}
<span class="v-s-result">“ {$Request.get.keyword} ” 的搜索结果 共<span color="red">{$resData.p_data.total}</span></span>
{/block}
{block name='nav-active-class'}search{/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" /}
<div class="wrap-box">
<h1><span>{$Request.get.keyword}</span>搜索结果 - {$DomainModel->d_name} 第{$resData.p_data.page}页</h1>
{if $resData.p_data.total < 1} <p style="text-align: center;line-height: 60px">没有相关数据</p>
{else}
<div class="rec-focus">
<div class="content-box">
<h1 class="title-h1"><span>{$Request.get.keyword}</span>搜索结果 - {$DomainModel->d_name} 第{$resData.p_data.page}页</h1>
<div class="item-box">
<div class="novel-list">
{foreach $resData.data as $key=>$Novel}
<dl class="rec-focus-book">
<dt class="book-img">
{$arrGrm[$key]|raw}
<a href='{site:nurl n_id="$Novel.n_id" n_py="$Novel.n_name_pinyin" /}'>
<img height="100" width="80" src="/static/img/default.jpg"
data-src="{$Novel.n_cover_path ?? ''}"
alt="{$Novel['n_name'] ?? ''}小说封面 - {$Novel.n_author}最新章节" class="lazy lazyload-img">
</a>
</dt>
<dd class="book-info">
<h2><a href='{site:nurl n_id="$Novel.n_id" n_py="$Novel.n_name_pinyin" /}'>{$Novel.n_name}</a></h2>
<p>作者:{$Novel.n_author}</p>
<p>{$Novel.n_description}</p>
</dd>
</dl>
{include file="public/novel-list" /}
{/foreach}
</div>
{/if}
</div>
<div class="row sort_page_num">
{volist name="$resData.p_data.pager" id="vo" key="k"}
<div class="pagination-box">
<ul class="pagination justify-content-center">
{volist name="resData.p_data.pager" id="vo" key="k"}
{switch $vo.label}
{case value="上一页"}
{if $resData.p_data.page == 1}
<span>«</span>
<li class="page-item disabled"><span class="page-link">«</span></li>
{else}
<a href="{$vo.url}">«</a>
<li class="page-item"><a class="page-link" href="{$vo.url}">«</a></li>
{/if}
{/case}
{case value="下一页"}
{if $resData.p_data.page >= $resData.p_data.total}
<span>»</span>
<li class="page-item disabled"><span class="page-link">»</span></li>
{else}
<a href="{$vo.url}">»</a>
<li class="page-item"><a class="page-link" href="{$vo.url}">»</a></li>
{/if}
{/case}
{default /}
{if preg_match('/^\d+$/', $vo.label)}
<a href="{$vo.url}">{$vo.label}</a>
<li class="page-item"><a class="page-link" href="{$vo.url}">{$vo.label}</a></li>
{/if}
{/switch}
{/volist}
</ul>
</div>
</div>
</div>
{/block}

View File

@@ -17,16 +17,27 @@
{/block}
{block name="main"}
<div class="layout-root tuijian-web">
<div class="work-content">
<div class="wrap-box">
<h3 class="wrap-title"><span>我的书架</span></h3>
<div class="rec-focus" id="shujiaContainer">
<div class="section">
<div class="bg-top-pink bg-top-pink-minheight"></div>
<div class="title">
<div class="title-text">我的书架</div>
</div>
<div class="js-tabs">
<div class="tab-content-wrap">
<div class="">
<div class="novel-list" id="shujiaContainer">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{/block}
{block name="customize"}

View File

@@ -312,10 +312,14 @@ class SiteContext
{
$strOrder = $this->Request->param('strOrder');
$strStatus = $this->Request->param('strStatus');
$strNovelOrder = '';
if(!empty($strOrder) && $strOrder != 'all'){
$strNovelOrder = StaticConfig::$arrNovelRankSortType[$strOrder];
}
ConverterMovel::setVal([
'intPage' => 1,
'strNovelOrder' => StaticConfig::$arrNovelRankSortType[$strOrder],
'strNovelStatus' => StaticConfig::$arrNovelStatus[$strStatus],
'strNovelOrder' => $strNovelOrder,
'strNovelStatus' => empty($strStatus) ? "" : StaticConfig::$arrNovelStatus[$strStatus],
]);
}
}

View File

@@ -12,6 +12,7 @@ class Novel extends TagLib
'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_forge_id,n_key', 'close' => 0],
'sort' => ['attr' => 'd_key,d_val'],
'ranksort' => ['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'],
@@ -281,7 +282,39 @@ EOT;
$strParse = <<<EOT
<?php
\$arrSort = app(\\app\\services\\NovelService::class)->arrSortType;
\$arrSort = app(\\app\\services\\StaticConfig::class)::\$arrNovelSortType;
if (!empty(\$arrSort) && is_array(\$arrSort)):
?>
EOT;
$strParse .= <<<EOT
<?php foreach (\$arrSort as \${$d_key} => \${$d_val}): ?>
EOT;
$strParse .= $content;
$strParse .= <<<EOT
<?php endforeach; ?>
<?php endif; ?>
EOT;
return $strParse;
}
/**
* 获取排序筛选参数
*
* @param array $tag
* @param string $content
* @return string
*/
public function tagRankSort($tag, $content)
{
$d_key = $tag['d_key'] ?? 'd_key';
$d_val = $tag['d_val'] ?? 'd_val';
$strParse = <<<EOT
<?php
\$arrSort = app(\\app\\services\\StaticConfig::class)::\$arrNovelRankSortType;
if (!empty(\$arrSort) && is_array(\$arrSort)):
@@ -313,7 +346,7 @@ EOT;
$strParse = <<<EOT
<?php
\$arrStatus = app(\\app\\services\\NovelService::class)->arrStatus;
\$arrStatus = app(\\app\\services\\StaticConfig::class)::\$arrNovelStatus;
if (!empty(\$arrStatus) && is_array(\$arrStatus)):
@@ -346,7 +379,7 @@ EOT;
$strParse = <<<EOT
<?php
\$arrSex = app(\\app\\services\\NovelService::class)->arrSex;
\$arrSex = app(\\app\\services\\StaticConfig::class)::\$arrNovelSex;
if (!empty(\$arrSex) && is_array(\$arrSex)):

View File

@@ -10,6 +10,7 @@ body {
.search-home {
padding: 10px 20px 20px;
color: #fff;
background: #161313;
}
.search-form {
@@ -218,3 +219,8 @@ body {
/* .s-footer-tel , .footer-box{
color:#fff
} */
.novel_search_page .title-h1{
text-align: center;
font-size: 0.2rem;
}

View File

@@ -227,8 +227,19 @@ resData = [
<li> : {$key} - : {$val} </li>
{/novel:sort}
# 08、获取小说排行榜排序筛选条件
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{novel:ranksort d_key="key" d_val="val"}
<li> : {$key} - : {$val} </li>
{/novel:ranksort}
# 08、获取小说分类筛选条件
# 09、获取小说分类筛选条件
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
@@ -238,7 +249,7 @@ resData = [
{/novel:category}
# 09、 获取指定小说多个章节数据并且遍历
# 10、 获取指定小说多个章节数据并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$count ?? '10'; # 查询条数
$n_id ; # 小说ID
@@ -257,7 +268,7 @@ resData = [
{/chapter:list}
# 10、 获取小说章节详情数据
# 11、 获取小说章节详情数据
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$n_id ; # 传入的小说ID
$c_sort_num ; # 传入的章节索引
@@ -268,7 +279,7 @@ resData = [
{$arrChapter01.c_name}
# 11-1、 获取指定小说章节分页数据并且遍历
# 12-1、 获取指定小说章节分页数据并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page ?? '1'; # 页码
$limit ?? '10'; # 查询条数
@@ -291,7 +302,7 @@ resData = [
</li>
{/chapter:pager}
# 11-2、 获取分页小说章节数据不遍历
# 12-2、 获取分页小说章节数据不遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page ?? '1'; # 页码
$limit ?? '10'; # 查询条数
@@ -321,7 +332,7 @@ resData = [
]
{php}var_dump($resData['p_data']);{/php}
# 12、 获取干扰码
# 13、 获取干扰码
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page_code ?? ""; # 页面编码
@@ -332,7 +343,7 @@ resData = [
{php}var_dump($arrGrm);{/php}
# 13、 获取指定类型小说排行榜并且遍历
# 14、 获取指定类型小说排行榜并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$count ?? '10'; # 查询条数
$sort_type ?? "daily"; # 排序方式:
@@ -361,7 +372,7 @@ resData = [
</li>
{/novel:ranklist}
# 14、 获取随机伪造小说列表并且遍历
# 15、 获取随机伪造小说列表并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$count ?? '10'; # 查询条数
$diff_key ?? ""; # 缓存键值差异
@@ -381,7 +392,7 @@ resData = [
{/site:forgelist}
# 14、 视图反向控制器(注释函数),在视图开头调用,用来初始化一些操作。这里尽量不要复杂逻辑
# 16、 视图反向控制器(注释函数),在视图开头调用,用来初始化一些操作。这里尽量不要复杂逻辑
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$func # SiteContext 里面的方法名
@@ -389,7 +400,7 @@ resData = [
{site:helper func="initHomeTKD" /}
# 15、 获取公共替换变量的值
# 17、 获取公共替换变量的值
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$code # ConverterMovel 里面的arrMap 的key
# 样例