This commit is contained in:
make
2025-04-21 17:47:12 +08:00
parent 24cef96a26
commit 7ef217c1b9
523 changed files with 0 additions and 93250 deletions

View File

@@ -1,47 +0,0 @@
### Nginx 配置
```shell
location / {
if (!-f $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}
```
### 部署
- 1. 克隆代码
- 2. 安装扩展 `composer install`
- 3. 配置env文件 `cp .example.env .env`
- 4. 上传logo 等图片到img public/statics/img/*
- 5. 初始化数据库 `php think db:manage init`
### 升级
- 1. 拉取代码
- 2. 数据库升级 `php think migrate:run`
- 2. 数据库升级 `php think mongo:manage`
- 2. 数据播种 `php think db:manage seed`
- 3. 关闭服务 `php think task stop`
- 4. 启动服务 `php think task start -d`
- 7. 创建migrate //执行命令,创建一个操作文件,一定要用大驼峰写法,如下
php think migrate:create AnyClassNameYouWant
###
/admin/system/initadminuser
keys "task:novel_source_id:*"
## 其它配置
- 1. 统计代码要在广告配置添加
- 2. 系统配置要吸怪对应的战斗信息
- 3. seoTdk 管理要修改对应的tdk

View File

@@ -1,377 +0,0 @@
# 系统配置
{site:cfg code="YONG_JIU_DOMAIN" encode="false"/}
# 广告配置
{site:adcfg code="JIAO_YOU_XIA_ZAI" encode="false"/}
# 获取seo tdk
{site:seotdk code="index" valcode="stc_title" encode="false"/}
# 获取 站点信息
{site:site valcode="site_name" encode="false"/}
# 转码
{site:wz wz="保存永久访问二维码" /}
# 小说分类 url
{site:nflurl gender="$arrNovel[gender]" category="$arrNovel[category]" status="$arrNovel[status]" page="1"/}
{site:nflurl gender="all" category="$arrNovel[category_pinyin]" status="all" page="1"/}
# 小说详情 url
{site:nurl n_id="$Novel->n_id" n_py="$Novel->n_name_pinyin"/}
# 伪造小说详情 url
{site:nnurl n_id="$arrNovel[n_id]" n_py="$arrNovel[n_name_pinyin]" n_fid="$ForgeNovel[n_forge_id]"/}
# 小说目录 url
{site:nclurl n_id="$arrNovel[n_id]" n_py="$arrNovel[og_novel_pin_yin]" order="zheng" page="1"/}
# 小说章节 url
{site:cpurl n_id="$arrNovel[n_id]" n_py="$arrNovel[og_novel_pin_yin]" c_sort="$Chapter[c_sort_num]" c_page="1"/}
# 小说最新章节 url
{site:lcpurl n_id="$arrNovel[n_id]" n_py="$arrNovel[og_novel_pin_yin]" /}
# 搜索详情 url
{site:souurl key="哈哈" p="1"/}
# 干扰码
{site:grm domain="Request->DomainModel->d_domain" code="kuangyu-pc-index" line="50" diff="0" start="5" end="20" type="2" /}
# 图片加密
<img class="pre-img lozad" loading="lazy" src="/assets/images/loading_img_bg_default.jpg?v={site:cfg code='STATIC_FILE_VERSION' encode='false'/}"
data-encrypted="true"
data-src="{$vo.sp_fengmian_url}">
<!-- <div class="page_num">
{if condition='$intPage > 1 '}
<a href='{$strPcPath}{site:nclurl n_id="$arrNovel[n_id]" n_py="$arrNovel[n_name_pinyin]" order="zheng" page="1"/}'
class="z">
{else}
<a href="{if condition='$intPage > 1 '}/{$strFirstPath}/{$intNovelId}{if condition='$intPage > 2'}-{$intPage - 1}{/if}.html
{else}/{$strFirstPath}/{$intNovelId}.html{/if}"
class="z">
{/if}
上一页</a>
<select onchange="self.location.href=this.value">
{volist name="arrChapterPages" id="page"}
<option value="/{$strFirstPath}/{$intNovelId}{if condition='$page.index neq 0'}-{$page.index+=1}{/if}.html"
{if condition="$page.index == $intPage" }selected="selected" {/if}>
第{$page.start}-{$page.end}章
</option>
{/volist}
</select>
<a href="{if condition='$intPage < $intTotalPages'}/{$strFirstPath}/{$intNovelId}-{$intPage + 1}.html{else}/{$strFirstPath}/{$intNovelId}-{$intTotalPages}.html{/if}"
class="y">下一页</a>
</div> -->
```php
# 01、 获取多个小说数据并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$count ?? '10'; # 查询条数
$n_category ?? "all"; # 查询分类
$sort_type ?? "all"; # 排序方式 news tuijian update
$n_status ?? "all"; # 查询状态:
# * * 'all' => '所有',
# * * 'lianzai' => '连载中',
# * * 'wanjie' => '已完结',
$n_sex ?? "all"; # 查询性别:
# * * 'all' => '所有',
# * * 'man' => '男生',
# * * 'women' => '女生',
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{novel:list count="10" n_category="$Request.route.category" d_key="d_key" d_val="novel" cache_life="1000"}
<li>
Index: {$d_key}
Title: {$novel.n_name}
Author: {$novel.n_category}
</li>
{/novel:list}
# 02-1、 获取分页小说数据并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page ?? '1'; # 页码
$limit ?? '10'; # 查询条数
$n_category ?? "all"; # 查询分类
$sort_type ?? "all"; # 排序方式
$n_status ?? "all"; # 查询状态:
# * * 'all' => '所有',
# * * 'lianzai' => '连载中',
# * * 'wanjie' => '已完结',
$n_sex ?? "all"; # 查询性别:
# * * 'all' => '所有',
# * * 'man' => '男生',
# * * 'women' => '女生',
$key ?? ""; # 查询 搜索
$button_num ?? "10"; # 分页按钮数量
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
$p_val ?? 'p_val'; # 分页页码数据,这是一个数组。和之前控制器渲染的那个数组一致的。
$func ; # 这个参数是一个回调方法名,用来渲染分页页码数据的,该方法需要在 NovelService 类里面实现func(array $arrParams, array $arrSort, array $arrNovel) generateCategoryPager generateSearchPager
# 样例
{novel:pager page="1" limit="10" n_category="$Request.route.category" d_key="d_key" d_val="novel" p_val="page_data" button_num="3" cache_life="1000" func="generateSearchPager"}
<li>
Index: {$d_key}
Title: {$novel.n_name}
Author: {$novel.n_category}
</li>
{/novel:pager}
{php}var_dump($page_data);{/php}
# 02-2、 获取分页小说数据不遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page ?? '1'; # 页码
$limit ?? '10'; # 查询条数
$n_category ?? "all"; # 查询分类
$sort_type ?? "all"; # 排序方式
$n_status ?? "all"; # 查询状态:
# * * 'all' => '所有',
# * * 'lianzai' => '连载中',
# * * 'wanjie' => '已完结',
$n_sex ?? "all"; # 查询性别:
# * * 'all' => '所有',
# * * 'man' => '男生',
# * * 'women' => '女生',
$key ?? ""; # 查询 搜索
$button_num ?? "10"; # 分页按钮数量
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
$p_val ?? 'p_val'; # 分页页码数据,这是一个数组。和之前控制器渲染的那个数组一致的。
$export_name ?? 'n_num'; # 查询出来的 所有数据集合,所有数据都可以在里面取。
$func ; # 这个参数是一个回调方法名,用来渲染分页页码数据的,该方法需要在 NovelService 类里面实现func(array $arrParams, array $arrSort, array $arrNovel) generateCategoryPager generateSearchPager
# 样例
{novel:pagerexp page="$Request.get.page" limit="30"
key="$Request.get.keyword"
d_key="d_key"
d_val="Novel" n
p_val="page_data" button_num="10" cache_life="86400" func="generateSearchPager" export_name="resData" /}
结构
resData = [
data = []
p_data = [
'total' => $intTotal,
'page' => $intPage,
'limit' => $intLimit,
'pages' => ceil($intTotal / $intLimit)
],
]
{php}var_dump($resData['p_data']);{/php}
# 03、获取替换模板替换后的数据
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$code ; # 替换模板编码
# 样例
{site:replace code="INDEX@INDEX@TITLE"}
# 04、获取小说详情数据
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$n_id ; # 传入的小说ID
$n_forge_id ; # 传入的伪造小说ID默认值0不伪造
$n_key ; # 查询出来的数据待使用的变量名称
# 样例
{novel:info n_id="33" n_key="arrNovel01" n_forge_id="1125940" /}
{$arrNovel01.n_name}
# 05、获取小说状态筛选条件
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{novel:status d_key="key" d_val="val"}
<li> : {$key} - : {$val} </li>
{/novel:status}
# 06、获取小说性别筛选条件
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{novel:sex d_key="key" d_val="val"}
<li> : {$key} - : {$val} </li>
{/novel:sex}
# 07、获取小说排序筛选条件
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{novel:sort d_key="key" d_val="val"}
<li> : {$key} - : {$val} </li>
{/novel:sort}
# 08、获取小说分类筛选条件
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{novel:category d_key="key" d_val="val"}
<li> : {$key} - : {$val} </li>
{/novel:category}
# 09、 获取指定小说多个章节数据并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$count ?? '10'; # 查询条数
$n_id ; # 小说ID
$sort_type ?? "all"; # 排序方式
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{chapter:list count="10" n_id="$Request.get.n_id" d_key="d_key" d_val="chapter" cache_life="1000"}
<li>
Index: {$d_key}
章节名称: {$chapter.c_name}
章节序号: {$chapter.c_sort_num}
</li>
{/chapter:list}
# 10、 获取小说章节详情数据
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$n_id ; # 传入的小说ID
$c_sort_num ; # 传入的章节索引
$c_page ; # 传入的章节页码
$n_key ; # 查询出来的数据待使用的变量名称
# 样例
{chapter:info n_id="1" c_sort_num="200" c_page="0" c_key="arrChapter01" /}
{$arrChapter01.c_name}
# 11-1、 获取指定小说章节分页数据并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page ?? '1'; # 页码
$limit ?? '10'; # 查询条数
$n_id ; # 小说ID
$sort_type ?? "all"; # 排序方式
$button_num ?? "10"; # 分页按钮数量
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
$p_val ?? 'p_val'; # 分页页码数据,这是一个数组。和之前控制器渲染的那个数组一致的。
$func ; # 这个参数是一个回调方法名,用来渲染分页页码数据的,该方法需要在 NovelService 类里面实现func(array $arrParams, array $arrSort, array $arrNovel)
# 样例
{chapter:pager page="$Request.get.page" limit="10" n_id="$Request.get.n_id" d_key="d_key" d_val="chapter" cache_life="1000" button_num="3" sort_type="dao" func="generateChapterPager"}
<li>
Index: {$d_key}
章节名称: {$chapter.c_name}
章节序号: {$chapter.c_sort_num}
</li>
{/chapter:pager}
# 11-2、 获取分页小说章节数据不遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page ?? '1'; # 页码
$limit ?? '10'; # 查询条数
$n_id ; # 小说ID
$sort_type ?? "all"; # 排序方式
$button_num ?? "10"; # 分页按钮数量
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
$p_val ?? 'p_val'; # 分页页码数据,这是一个数组。和之前控制器渲染的那个数组一致的。
$export_name ?? 'n_num'; # 查询出来的 所有数据集合,所有数据都可以在里面取。
$func ; # 这个参数是一个回调方法名,用来渲染分页页码数据的,该方法需要在 NovelService 类里面实现func(array $arrParams, array $arrSort, array $arrNovel) generateCategoryPager generateSearchPager
# 样例
{chapter:pagerexp page="$Request.get.page" page="1" limit="10" n_id="$Request.get.n_id" d_key="d_key" d_val="chapter" cache_life="1000" button_num="3" sort_type="$Request.route.strOrder" func="generateChapterPager" export_name="resData" /}
结构
resData = [
data = []
p_data = [
'pager' => []
'total' => $intTotal,
'page' => $intPage,
'limit' => $intLimit,
'pages' => ceil($intTotal / $intLimit)
],
]
{php}var_dump($resData['p_data']);{/php}
# 12、 获取干扰码
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$page_code ?? ""; # 页面编码
$diff ?? ""; # 差异值
$limit ?? '1'; # 查询条数
# 样例
{site:grm page_code="fdasfadsf" diff="fadsfdsa" num="10" g_key="arrGrm" /}
{php}var_dump($arrGrm);{/php}
# 13、 获取指定类型小说排行榜并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$count ?? '10'; # 查询条数
$sort_type ?? "daily"; # 排序方式:
# * * 'daily' => '天',
# * * 'weekly' => '周',
# * * 'monthly' => '月',
# * * 'total' => '总',
$n_status ?? "all"; # 查询状态:
# * * 'all' => '所有',
# * * 'lianzai' => '连载中',
# * * 'wanjie' => '已完结',
$n_sex ?? "all"; # 查询性别:
# * * 'all' => '所有',
# * * 'man' => '男生',
# * * 'women' => '女生',
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{novel:ranklist count="10" sort_type="total" n_status="wanjie" n_sex="man" d_key="d_key" d_val="novel" cache_life="1000"}
<li>
Index: {$d_key}
Title: {$novel.n_name}
Author: {$novel.n_category}
</li>
{/novel:ranklist}
# 14、 获取随机伪造小说列表并且遍历
# 传参与默认值(传参用下面的变量名,名称不需要$符号, 值的话如果用第三方变量作为值,需要带$符号)
$count ?? '10'; # 查询条数
$diff_key ?? ""; # 缓存键值差异
$cache_life ?? '0'; # 缓存时间如果需要开启缓存这个字段必须传而且必须大于0
$d_key ?? 'd_key'; # 查询出来的数据遍历的时候, 下标键变量的名称
$d_val ?? 'd_val'; # 查询出来的数据遍历的时候, 值的名称
# 样例
{site:forgelist count="10" d_key="d_key" d_val="novel" cache_life="1000"}
<li>
Index: {$d_key}
N ID: {$novel.n_id}
N NAME PINYIN: {$novel.n_name_pinyin}
N FORGE ID: {$novel.n_forge_id}
N FORGE TITLE: {$novel.n_forge_title}
</li>
{/site:forgelist}
```

View File

@@ -1,43 +0,0 @@
```javascript
use novel
db.dropDatabase("novel")
use novel
db.novel.createIndex({ "n_id": 1 })
db.novel.createIndex({ "og_title": 1 })
db.novel.createIndex({ "og_novel_status": 1 })
db.novel.createIndex({ "n_site_uuid": 1 }, { unique: true })
db.novel.createIndex({"n_related_novel.n_id": 1})
db.novel.createIndex({"n_forge_novel.n_forge_id": 1})
// db.novel.createIndex({ "og_novel_update_time": 1 })
// {
// "n_related_novel": [
// {"n_id": "33", "n_source_id":"11", "og_title":"小说名字"},
// {"n_id": "44", "n_source_id":"11", "og_title":"小说名字"},
// ]
// }
// {
// "n_forge_novel": [
// {"n_forge_id": "33","n_forge_code": "33", "n_forge_title":"伪造小说名字"},
// {"n_forge_id": "44","n_forge_code": "33", "n_forge_title":"伪造小说名字"},
// ]
// }
// 小说章节索引
db.chapter.createIndex({ "c_site_uuid": 1 }, { unique: true })
db.chapter.createIndex({ "n_id": 1 })
db.chapter.createIndex({ "c_sort_num": 1 })
db.chapter.createIndex({ "c_page": 1 })
// 分类
db.category.createIndex({"ca_name":1},{unique:true})
// 统计
db.novel_clicks.createIndex({ "n_id": 1, "nc_date": 1, "nc_type": 1 },{ unique: true });
````

View File

@@ -1,79 +0,0 @@
## tkd 问ai 模板格式
这个是 替换标识
'{strSiteName}' => '这个是网站名',
'{strSiteDomain}' => '这个是站点域名',
'{strSiteTitle}' => '这个是网站标题',
'{strSiteKeywords}' => '这个是网站关键字',
'{strSiteDescription}' => '这个是网站描述',
'{strNovelName}' => '这个是当前页面小说标题',
'{strNovelChapterName}' => '当前页面小说章节名字',
'{strNovelChapterSort}' => '当前页面小说章节排序号',
'{strNovelCategoryName}' => '当前页面小说分类名字',
'{strNovelSex}' => '当前页面小说是男生还是女生 小说',
'{strNovelStatus}' => '当前页面小说状态 是连载还是完结',
'{intPage}' => '当前页面分页页码',
'{strNovelAuthor}' => '小说作者',
'{strNovelDescription}' => '小说简介',
'{strSearchKeywords}' => '搜索关键词',
这个是分类页的路由
Route::get('/shuku/:strGender/:strCategory/:strStatus/page:intPage', [Novel::class, 'getLibrary'])
->pattern([
'strGender' => 'nansheng-xiaoshuo|nvsheng-xiaoshuo|all',
'strCategory' => '[a-z\-]+',
'strStatus' => 'all|lianzai|wanjie',
'intPage' => '\d+'
])
->append(['boolIsMobile' => true]);
请根据路由和上面的替换标识你帮忙设计一个最友好seo的 tkd 替换模板
案列-分类的:
title '{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说 - {strSiteName} - 第{intPage}页'
keywords: '{strNovelCategoryName}, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费阅读'
description: '{strSiteName}提供{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说免费阅读,第{intPage}页汇聚热门作品,欢迎体验{strSiteDomain}'
## tkd 问ai 模板格式
最牛的seo 优化大师
这个是 替换标识
'{strSiteName}' => '这个是网站名',
'{strSiteDomain}' => '这个是站点域名',
'{strSiteTitle}' => '这个是网站标题',
'{strSiteKeywords}' => '这个是网站关键字',
'{strSiteDescription}' => '这个是网站描述',
'{strNovelName}' => '这个是当前页面小说标题',
'{strNovelChapterName}' => '当前页面小说章节名字',
'{strNovelChapterSort}' => '当前页面小说章节排序号',
'{strNovelCategoryName}' => '当前页面小说分类名字',
'{strNovelSex}' => '当前页面小说是男生还是女生 小说',
'{strNovelStatus}' => '当前页面小说状态 是连载还是完结',
'{intPage}' => '当前页面分页页码',
'{strNovelAuthor}' => '小说作者',
'{strNovelDescription}' => '小说简介',
'{strSearchKeywords}' => '搜索关键词',
这个是男生和女生的路由,公用一套视图模板
Route::get('/nansheng-xiaoshuo', [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => true, 'strChannel' => 'boys']);
Route::get('/nvsheng-xiaoshuo', [Novel::class, 'getNovelChannel'])->append(['boolIsMobile' => true, 'strChannel' => 'girls']);
请根据路由和上面的替换标识你帮忙设计一个最友好seo的 tkd 替换模板
案列-分类的:
title '{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说 - {strSiteName} - 第{intPage}页'
keywords: '{strNovelCategoryName}, {strNovelSex}小说, {strNovelStatus}小说, {strSiteName}, 免费阅读'
description: '{strSiteName}提供{strNovelSex}{strNovelCategoryName}{strNovelStatus}小说免费阅读,第{intPage}页汇聚热门作品,欢迎体验{strSiteDomain}'

Binary file not shown.