主题设置
内置主题选择后自动记忆
我的主题0
在「自定义」里调好颜色后,点下方「另存为」即可存成自己的主题。
导出的 JSON 可分享给他人,导入后会出现在「我的主题」,登录后自动备份到云端。
自定义参数默认等于液态玻璃
主题色
辅色
背景色
文字配色
渐变底色
光斑颜色
角度 160°
通透度 88%
标题
正文
描述
标题
描述
正文
链接
描述
标题
描述
站点卡片
面板背景
背景
遮罩 16%
卡片 88%
登录
星际导航 高质量资源导航
首页关于本站
开发历程 · 每日一记

84 天,一天一点做出这个导航站

没有突击,也没有大团队。每天 1 - 2 小时,只定一个能验证的小目标,做完就收工;第二天先清掉昨天的 Bug,再继续往下写。这里有从选框架到上线的完整过程。

84 天 17 个阶段 35 个插件 4 条支付通道
Day 01 已完成 84 / 84 天 Day 84
84天 从零到上线
35个 内置工具箱插件
4条 支付通道
1套 自研加密协议
共 84 天记录
试卷库 Day 83 - 84 · 把第一试卷网的整站数据接进来,做成能导入、能下载、能运营的试卷库
2 天
Day 84

试卷后台与下载鉴权:后台三页、积分扣费、签名防盗链

试卷能在后台新增、换附件、上下架,下载要过签名、时间戳、登录和积分四道关,积分不足引导扫码看广告。

  • 后台新增「试卷管理」分组:试卷管理 / 试卷分类 / 试卷标签三页,三张表注册进通用 CRUD 白名单;列表支持按学科分组筛选标签、按编号 / 标题 / 时间 / 大小 / 状态排序、批量上下架。
  • 「上传试卷」把附件传到 public/static/uploads/shijuan/,编辑弹窗补齐附件、授权方式、资源类型与上架状态;数据库升到 v81 给 shijuan_item 补 file / license / rtype / status / update_time 五列,老库缺列时后台保存会静默丢掉附件与授权信息。
  • 系统设置新增「试卷设置」:下载总开关、下载需登录、下载扣积分、每次消耗积分、看一次广告得多少积分、积分不足可看广告、小程序二维码上传 / 清空 / 预览;数值限定 0 - 10000,开启扣积分时自动强制登录。
  • 下载只认 POST:把下载地址复制到地址栏直接打开会看到一张友好的拒绝页,真正的文件必须由详情页脚本带请求头发起,GET 只用来接住误操作。
  • 签名防盗链:渲染附件地址时拼 exp(15 分钟)与 sign(HMAC-SHA256,绑定文件 / 栏目 / 过期时间 / 当前登录用户),换账号、改文件名、过一会儿再点都会失败;参数名刻意避开 e 和 s,因为 s 是 ThinkPHP 的 pathinfo 变量名,出现在查询串里会把路由覆盖成 404。
  • 请求头令牌:X-Nav-Ts 与服务器时间相差超过 5 分钟就拒绝;开启加密传输后还要求 X-Nav-Kid / X-Nav-Pub 与当前会话一致,前端遇到 419 会重新握手再重试一次。
  • 积分与「会员与积分」「用户中心」共用 user.points,不另设账户;扣费走 nav_points_change 并落流水(ref = sjk:栏目:文件名),积分不足直接拒绝,不会出现扣成负数。
  • 详情页把下载门槛分成 off / login / points 三种锁:未开放只提示维护中,游客引导登录,积分不足弹小程序二维码引导看广告;前端下载成功后就地扣减页面积分显示并锁 5 秒,连点多个下载按钮也只执行一次。
试卷后台 下载鉴权 HMAC 签名 积分 小程序导流 v81
Day 83

试卷库落地:四张表、命令行导入与图片附件代理

把第一试卷网的整站数据搬进来,一条命令导入 85 个栏目,前台 /sjk 能翻列表、看详情、显示缩略图。

  • 新增独立路由 route/shijuan.php,统一前缀 /sjk:首页、全部学科 /a/sj、学科与栏目 /a/:slug、详情 /a/:cat/:id.html、图片 /img、附件 /file;因为 config/route.php 是前缀匹配,规则全部用 `$` 锁定完全匹配,长规则写在短规则前面。
  • 新建四张表:shijuan_subject 存学科、shijuan_category 存栏目与年级并带 SEO 三件套、shijuan_item 把列表字段与详情字段合并成一行(cat + item_id 唯一)、shijuan_download 存一份试卷的多个下载按钮;数据库版本升到 v80 自动建表。
  • 导入命令 php think shijuan:import 支持 --cat / --all / --src / --limit / --dry 五个参数,默认只导语文一年级,全量 85 个栏目约 7.7 万条,先用 --dry 解析校验再写库。
  • 导入按「整栏重建」保证幂等:先按栏目删旧下载与旧试卷,再在事务内分批写入;每批 500 条落库后立刻按 item_id 换回本地主键再写下载地址,内存只保留当前一批,详情 JSON 读完即释放,memory_limit 自动放宽到 512M。
  • 导入结束按实际入库条数回写栏目 total,再汇总到学科 total,用 --limit 调试时不会把总量写歪;重复执行同一栏目结果一致。
  • 资源层 ShijuanAssetService:本地优先(public/shijuan/data/shijuanzip/{栏目}/images|thumbs|files),未命中再带 Referer 从源站抓;图片缓存到 runtime/shijuan/img,返回 ETag 与 Last-Modified,命中时直接 304;附件拉临时文件直传,不往站内目录写东西。
  • 正文 HTML 里的相对资源地址统一改写:src 走图片代理,其它链接补成源站绝对地址;缩略图沿用原站 -lp.jpg 规则,文件大小统一用两位小数 MB,和原站写法一致。
  • 前台页面一次接好:首页是学科卡 + 最新 + 热门 + 统计,学科页没有子栏目时自动落到栏目页,详情页带上一篇 / 下一篇,模板与样式单独放 app/view/shijuan 和 shijuan.css,不复用导航站的主样式。
试卷库 /sjk shijuan:import 资源代理 v80
主题工坊 Day 81 - 82 · 把自定义主题做成可拖动窗口、可保存的主题库,并支持导入导出与云端备份
2 天
Day 82

主题库与云端备份:另存、导入导出、只给自己看

调好的主题能取名存下来随时点用,能导出成文件给别的站,登录后自动备份到自己的账号下。

  • 「我的主题」库落地:nav_themes 存全部主题、nav_lib_active 记当前选中项;调好颜色后填名字(如「星光绿」)点另存为即入库,点列表里的主题直接应用,打勾区分「当前用的是库主题还是临时自定义」。
  • 库主题不新增 data-theme:统一存成 nav_theme=custom 再走同一个 paintCustom,避免每存一个主题就往 CSS 里加一套主题变量,数量再多也不会让样式表膨胀。
  • 导出:把当前配置序列化成 JSON(format: nav-theme/1,含主辅色、底色、渐变、文字与组件背景),文件名带主题名,可直接发给别人或在另一台设备导入。
  • 导入先校验再确认:只接受 .json、单文件 ≤256KB;accent 缺失或任何颜色字段不是 #hex、渐变角度 / 通透度不是数字、开关不是布尔,都直接判失败并提示具体字段,不写入主题库。
  • 名字与渲染的安全处理:主题名去掉控制字符、零宽字符与双向控制符,限 20 字,重名自动加序号;列表用 textContent 渲染、颜色点只赋 style.background,全程不拼 innerHTML,导入文件无法注入脚本;导入前弹确认框展示「主题名 + 主色」,避免误点来源不明的文件。
  • 云端备份只给自己看:新建 nav_user_theme(user_id + theme_id 唯一索引、config longtext、created / updated 毫秒版本、deleted 墓碑),数据库升到 v79 自动建表;所有读写都带 where user_id = 当前登录用户,未登录调用直接 401。
  • 单接口 /api/user/theme/sync 做双向合并:按 theme_id 匹配、updated 大者胜,删除用墓碑同步,避免多设备「删了又复活」;每人上限 50 个有效主题、单条配置 ≤20KB,服务端同样校验字段白名单并清洗名字,非法条目直接丢弃。
  • 前端自动同步:登录后距上次同步超过 5 分钟拉一次并合并,另存 / 导入 / 删除后静默上传;弹窗标题右侧显示「云端已备份 N 个主题」,未登录显示「未登录,主题仅存本机」。
  • 夜间模式修复:原来勾选后会被背景色反推的结果改回去,渐变开启时也永远算成浅色;改为手动开关优先,渐变底色自动压暗但保留彩色光斑,深色文字在暗色下自动让位给自动浅色层,首屏脚本同步按暗色绘制。
  • 顺手修一个线上报错:渐变控件的变量声明写在首屏调用 syncGrad 之后,var 提升后仍是 undefined,触发 Cannot read properties of undefined (reading forEach),把声明提前到状态区解决。
主题库 导入导出 user_theme v79 夜间模式
Day 81

主题弹窗化:能拖能拉的自定义窗口与渐变体系

把挤在顶栏下拉里的主题设置改成独立窗口,拖动、缩放、三个标签页,并让「什么都不改」就等于液态玻璃。

  • 自定义主题从顶栏下拉整体搬成独立窗口:标题栏拖动、四角四边共 8 个缩放手柄、位置与尺寸存 nav_theme_win,刷新后原位还原;窗口挂到 body 上,避开顶栏 backdrop-filter 造成的 fixed 参照系错位。
  • 窗口分「主题 / 自定义 / 背景」三个标签页,原来的背景图设置整块搬进第三页,背景色、遮罩、卡片通透度、卡片模糊全部保留,不再和主题色挤在同一列。
  • 手机端不启用拖拽:≤640px 时窗口用 !important 铺满屏幕变成全屏抽屉,隐藏缩放把手,标题栏恢复默认光标。
  • 渐变升为一等参数:新增 GLASS_TPL 默认值(主色 #6366f1、辅色 #8b5cf6、三段底色 #eef3ff / #f6f2ff / #eafaf6、三个光斑、160°、88% 通透度),光斑位置与透明度固化成常量,保证默认值与液态玻璃逐像素一致。
  • paintCustom 先合成玻璃底:渐变开启时用「白 / 黑 + 通透度」拼出 rgba 交给 paintBg,沿用原有玻璃面板变量,再由 applyGradView 写入 --page-bg / --page-bg-img,新增一条 html.nav-custom-bg body 规则负责绘制,不额外堆 CSS。
  • 首屏内联脚本同步支持渐变:读取 nav_custom.grad 直接铺渐变,刷新页面不会先白一下再变色;渐变角度、通透度、三个底色、三个光斑全部可在自定义页实时预览。
  • 点液态玻璃自动回填:主色、辅色、底色、文字配色、渐变参数一次性写进自定义表单,用户在这套值上改就成了自己的主题,不用从空白开始调。
  • 文字与分区颜色全量令牌化:正文三级文字、.sec-head 标题与描述、.foot 文字 / 链接 / 副标题、卡片标题与描述都走 --u-* 覆盖层,留空自动回落到主题层,夜间与背景图模式不会互相打架。
  • 补齐组件背景:站点卡片 .card 与面板 .panel(右侧站点信息、友链、排行)新增 --u-card-bg / --u-panel-bg 两个令牌,CSS 用 var(--u-card-bg, var(--surface)) 这类回落链,不设置时完全保持液态玻璃的玻璃质感。
主题弹窗 可拖动窗口 渐变 液态玻璃 颜色令牌
全局便签 Day 78 - 80 · 把便签做成全站可植入、跨设备同步的提醒浮层
3 天
Day 80

便签上云:user_note 与双时间戳合并

登录用户的便签按条上云,换浏览器登录自动回来;游客本地数据合并一次后以服务端为准。

  • 新建 nav_user_note 表:note_id 为前端生成的稳定 ID(A-Za-z0-9_-,≤32),存 title / content / color / pinned / front / fx / fy / w / h,并分 updated(内容版本)与 layout_updated(布局版本)两套毫秒时间戳。
  • 新增 /api/user/note/list|sync|save|delete 四个接口:sync 按 note_id 匹配,内容字段按 updated 取新、布局字段按 layout_updated 取新,每人上限 200 条,返回合并后的全量列表。
  • 前端 nav-note.js 增加同步引擎:stickynote_owner 区分游客与账号,登录后把游客本地数据合并上传一次,随后用服务端结果回填 localStorage;换账号自动丢弃别人的本地副本,不会串数据。
  • 拖动、缩放、取消植入与面板编辑防抖 600ms 推全量;推送故意忽略返回值,避免拖动过程中被服务端回填而弹回原位;同步请求往返期间本地又改过,会把较新字段并回结果再补推。
  • 面板里删除便签时对比 id 集合调用 delete,删除同样同步到其它设备;面板打开时收到 nav-note:pull 事件重新 load() 并重绘,正在编辑则不打断,避免冲掉输入。
  • 数据库版本升到 v78,升级时自动建表;浮层本身不用改动,仍只读 localStorage,同步只发生在后台,页面渲染逻辑与阶段一保持一致。
user_note 云端同步 双时间戳 v78
Day 79

浮层打磨:拖动边界、尺寸与加载兜底

把「拖上去抓不回来、不能改大小、点了没反应」三个真实问题逐个收掉。

  • 位置与尺寸统一夹在视口内(边距 6px、最小 150×70):拖到边缘自动停住,缩放不会超出屏幕,手机上地址栏伸缩改变视口高度后重新夹一次。
  • 标题栏与底部拖动条都能移动整块,避免卡片被顶栏压住时只剩一条可抓;指针按下后位移不超过 2px 视为点击,不会误改坐标。
  • 右下角把手拖动改像素宽高,w / h 存 localStorage;normalize 会丢弃未知字段,因此在 load() 里补回 w / h 与布局时间戳,persist() 再合并本地最新值,面板保存不会把用户调好的大小写回旧值。
  • 线上点便签报 pct is not defined:旧加密包由「normalize 引用外部 pct 但缺定义」的源码打出,修复为把 pct 定义收进 normalize 内部,明文校验通过后再混淆打包。
  • 前台页面没有引入 pkg-loader.js,点编辑报「便签插件未就绪」:ensurePlugin() 检测 NavPkg 缺失时动态插入加载器再解密;弹窗助手 openModal / closeModal / uiConfirm 只存在于工具箱页,前台补最小实现(给遮罩加 show 类)才显示得出来。
  • 每次改插件源码都按「改源 → 明文打包 → 解密校验 → 混淆打包」的链路走,避免打包产物与源码不一致,出现本地好、线上坏的情况。
拖动边界 自定义尺寸 pkg-loader 问题修复
Day 78

全站便签:入口与可拖动浮层

把工具箱里的便签搬成全站入口,点一下就开;选中的便签能钉在前台任意页面提醒自己。

  • 首页音乐图标上方新增便签入口,沿用同一套圆形按钮视觉与固定定位,手机端同步出现;入口只注入配置与脚本,插件包点开时才按需加载,不拖慢首屏。
  • 便签卡片新增「植入前端」图钉开关,front / fx / fy 三个字段随条目存进 localStorage 的 stickynote_v1,与插件面板共用同一份数据,不存在两套状态。
  • 新增 nav-note.js 与 nav-note.css:只渲染 front 为真且标题或正文不为空的便签,标题栏拖动整块、右下角拖动改尺寸,位置按视口可用空间的百分比保存,换页面、换窗口大小都能还原。
  • 浮层层级定为 135:高于吸顶导航与侧栏抽屉,低于登录弹窗与 toast;拖到页面顶部也不会被顶栏盖住,取消植入用图钉按钮,立即从页面上消失。
  • 未登录时数据只落本机 localStorage,换浏览器就丢;留好 owner 机制的位置,为后面登录上云做准备。
  • 后台设置新增「全局便签」总开关 note_on,关闭后 body 加 no-note 类,入口与浮层一起隐藏,前台模板不用再改。
全局便签 植入前端 可拖动浮层 localStorage
数据与运营 Day 76 - 77 · 用数据衡量推荐效果,把右栏精选推荐做成可运营的模块
2 天
Day 77

区块拆独立模块与多条推荐语轮换

精选推荐的每个区块都能拆出来单独排位,站长推荐语从一段话变成可轮播的多条。

  • 「首页模块」右栏新增「+ 添加精选推荐」,把某个区块拆成独立模块行,能和其他右栏模块自由穿插拖动。
  • r_pics 只兜底渲染没被拆出的区块,已拆出的自动从容器剔除;模块行隐藏时整块不显示,不会退回容器。
  • 区块行的齿轮直达 /admin/homepics 并自动打开该区块编辑弹窗;× 移除后区块回到容器,删除区块时同步清理模块行。
  • 推荐语支持多条(正文 + 署名,最多 12 条),note_items 存 JSON,旧数据自动回退到单条,不需要迁移。
  • 前台按 2~60 秒自动轮换,标题右侧显示 1 2 3…N 数字指示点:选中紫底白字、未选中浅底灰字,点击立即切换并重新计时,悬停暂停。
  • 数据库版本升到 v77,升级时自动补 note_items 列;补列失败不写版本号,下次请求继续尝试。
模块拆分 自由拖拽 推荐语轮换 数字指示点
Day 76

精选推荐数据看板:CTR 趋势与 A/B 对比

让「推荐得好不好」有数据可看,手工推荐和系统兜底谁更受欢迎一目了然。

  • 新增 home_pic_stat / home_block_stat 两张统计表,曝光与点击按天落库;同一浏览器每天只计一次,避免刷新刷量。
  • 前台渲染时给站内链接自动追加 nav_blk / nav_ab 标记,点击回传区块与 AB 分组,统计口径和曝光完全一致。
  • 后台「精选推荐」页顶部加数据看板:总曝光、总点击、整体 CTR、近 7 天双色柱状图、A/B 对比卡与区块汇总表。
  • 内容列表每行补一条迷你趋势,7 天里哪张图被点得多不用再翻报表。
  • 榜单、推荐语这类不参与 AB 的类型自动排除,避免把系统内容混进实验组。
数据看板 CTR趋势 A/B对比 区块统计
模块化首页 Day 72 - 75 · 把首页拆成一个个模块,主栏右栏后台拖拽自由组装
4 天
Day 75

模块化收尾:三端过一遍与空模块隐藏

把 18 个模块在三端与开关组合下过一遍,收掉布局毛刺后收工。

  • 手机端主栏模块顺序与电脑一致;今日精选与自定义导航的列数各自走 pick_cols_m / quick_cols_m 独立变量,想完全对齐就设成同一个数。
  • 右栏模块在手机端收进抽屉按同一顺序渲染,显隐开关同步生效,不残留空容器与多余分隔线。
  • 空数据自动隐藏与手动关闭的视觉结果一致:无在投广告的横幅、无公告、无赞助、未配二维码的 QQ 群整块消失,页面不留空洞。
  • 文章卡片个数、友链条数、排行条数全部收进后台参数,前台模板不再写死数量,运营自己就能调密度。
  • 回归 18 个模块 × 显隐 × 参数组合:主栏右栏排序互不干扰,缓存失效后刷新即见,模块化首页就此收工。
三端适配 空模块隐藏 回归
Day 74

老库升级:补种、重排与双向对账

让已上线的库无缝补齐新模块,用户关过的模块不被误打开。

  • v68 升级建 home_module 表并加 mkey 唯一索引,表为空时按注册表种子全量模块,老站升级即得与升级前一致的默认布局。
  • v69 注册表新增快捷导航 / 首页推荐位 / 品牌固定位三个顶部模块:先补种库里缺的 key,再按注册表默认 sort 重排一次。
  • 重排只改 sort 不动 visible:用户手动关过的模块补种后依旧关闭,顺序以注册表默认为准,后台可再拖回自己喜欢的样子。
  • nav_home_modules() 每次取列表都做双向对账:库里多出的旧键(代码已删的模块)跳过不渲染,注册表新增而库里没有的模块补到末尾默认显示,代码与数据永不脱节。
  • 升级每步 try/catch 包裹并写日志,任何一步失败前台走注册表回退布局,页面不白屏、布局不散架。
db_upgrade 补种 对账
Day 73

后台模块管理:拖拽排序与参数弹窗

首页布局交给后台鼠标拖,显隐与参数都在一个页面里调完。

  • 后台新增「首页模块」页(homemodules.html):主栏、右栏两栏各列模块卡片,带图标、标题与一句说明,所见即所排。
  • 拖完即存:/admin/api/home_modules/save 按页面顺序批量写入 sort 与 visible,zone 不允许跨栏改动,保存后 nav_cache_bump() 让前台缓存立即失效,刷新首页即见。
  • 每个模块一个显示开关,关掉前台整块不渲染;老库未种子的模块首次保存时自动补行,不留脏数据。
  • 带参数的模块行尾出现「设置」:弹窗按注册表 cfg 渲染数字输入并带 min / max / 默认值,推荐总个数、每行列数、展示条数都在这里调。
  • 参数统一存 setting 表(featured_total、pick_cols、quick_cols、rank_rail_total 等),沿用现有设置缓存,模板读同一来源,改完刷新即生效。
  • 「恢复默认布局」一键清空 home_module 表:空表回退注册表默认顺序且全部显示,拖乱了也能一键还原。
拖拽排序 显隐开关 参数弹窗
Day 72

首页拆模块:注册表与独立模板

把首页写死的十几块内容拆成一个个模块文件,一个模块一个模板,注册表统一登记。

  • 主栏与右栏内容各自独立成模板:主栏 m_ 前缀、右栏 r_ 前缀,统一放 app/view/front/modules/,index.html 与 footer.html 按 mainModules / railModules 顺序逐个匹配渲染。
  • nav_home_module_registry() 注册表统一登记每个模块的 zone / sort / title / icon / desc / cfg,后台列表、前台渲染、升级补种共用一份数据,加模块只改 PHP 一处。
  • home_module 表只有 mkey / zone / sort / visible 四个业务字段(建表加 mkey 唯一索引),样式与数据查询仍留在各自模板与控制器,模块化不动业务逻辑。
  • m_qstrip / m_featured / m_fixads 三个模块位置特殊,渲染在 header.html 的 home-top(Hero 搜索框下方),其余主栏模块在 index.html,排序只在同容器内生效。
  • 右栏 8 个模块(站点信息卡、站点数据、人气排行、最近收录、公告、赞助墙、图集、QQ 群)一并入表管理,手机端收进抽屉时同样按序渲染。
  • 表不存在或查询失败时回退注册表默认顺序,前台永不因升级中断;注册表里没有的旧键直接跳过不渲染,避免代码删了模块页面还残留。
模块化 注册表 模板拆分
搜索与打磨 Day 70 - 71 · 把树洞搜索做准,再把手机端布局与分类展示打磨到一致
2 天
Day 71

手机端导航复刻与分类数量开关

自定义导航的手机端对齐今日精选,分类数量也能一键收起来。

  • 手机端自定义导航整体复刻「今日精选」:横排、图标在左、名称单行省略、描述两行截断,圆角 11px、内边距 12px 2px 8px 2px、图标 28×28 字号 15。
  • 平台角标与站点角标沿用同一套:右上角 top 1px / right 3px、图标 11×11,角标复用 .pick-badge,两处视觉完全一致。
  • 网格列数各自独立:今日精选 --pick-cols-m、自定义导航 --qn-cols-m 都能在后台单独配置,想完全一致就设成同一个数字。
  • 用户自己添加的卡片保留右侧 X / 编辑按钮,但给文字区留 14px 余量,描述不会被按钮压住。
  • 后台「默认角标」右侧新增「显示分类数量」开关:关闭后 body 加 no-cat-count,侧栏分类、二级标签、首页与分类页标签条的数量一起隐藏,悬停 title 也不再带数字。
  • 数量 <em> 统一加 cnt 类,一份 CSS 就能全站收起;侧栏「工具箱 / 开发历程 / 赞助墙」的新 / HOT 角标不是数量,保持显示。
  • 站点数为 0 的分类与标签直接不渲染:侧栏、二级标签、首页标签条、分类页标签条统一过滤,后台分类管理与收录表单的标签选项不受影响。
  • 只改展示层不动数据:后台仍能看到完整分类与标签,前台只保留有内容的入口,避免空分类点进去一片空白。
手机端 自定义导航 分类数量 空分类隐藏
Day 70

树洞搜索与八种心情

树洞不只能刷,还能按正文、关联站点和类型一起搜。

  • /api/secret/list 新增 kw 参数:正文 content LIKE、关联站点名称、类型名称三路各查一次取并集,再与心情筛选、最新 / 热门排序、cursor 翻页叠加生效。
  • 站点名命中时先查 site 表拿到 ID 列表,再按 site_id IN (...) 取树洞,不为一次搜索把两张表整体联起来扫。
  • 类型命中时遍历 nav_secret_moods(),输入「求助」就把该类型全部内容并入结果,不会因为正文没写这个词而漏掉。
  • 关键词统一截到 20 字,对 % 与 _ 做转义,避免通配符把整表扫出来;空关键词等于不过滤。
  • 前台工具栏右侧加搜索框:输入防抖 350ms、回车立即搜、清空恢复原列表,手机端独占一行并撑满宽度。
  • 请求进行中改关键词不会丢:pendingReset 记住最后一次输入,当前请求结束后补一次 load;搜索状态下即时发布的新帖不插入列表,避免和关键词无关。
  • 无结果提示「没有找到相关心事」;清空按钮只在有关键词时出现,聚焦时有描边高亮,样式统一收进 secret.css。
  • 树洞类型从 4 个扩到 8 个:新增 日常 / 表白 / 许愿 / 深夜;类型由 nav_secret_moods() 统一输出,发布选择器、筛选条、搜索匹配、站点留言弹窗与后台筛选自动同步,加类型只改 PHP 一处。
树洞搜索 并集匹配 心情类型 防抖
右键与弹窗 Day 67 - 69 · 把浏览器右键变成站点自己的操作入口,弹窗也能装富内容
3 天
Day 69

后台编辑器与弹窗视觉精修

把每天都要用的右键菜单编辑器做顺手,把前台弹窗做成能拿得出手的样式。

  • 菜单项改成卡片 + 网格:宽度够时一行两个,窄屏自动单列;卡片标题栏可展开收起,收起后显示「名称 · 动作 · N 个子项」摘要。
  • 「添加菜单项」「收起全部」吸顶固定在菜单项区顶部,滚到列表底部也能直接新增,不用再滚回顶部找按钮。
  • 图标选择器格子从 34px 放大到 46px,图标 chip 加宽到 56×40,动作下拉、内容框、角色选择重新分配宽度,长文案不再挤成一行。
  • 前台富内容弹窗改为 Dock 风格:22px 大圆角、胶囊 TAB、标题栏固定,只有内容区滚动;封面图等比完整显示,不再被裁掉上下。
  • 宽度 ≥660px 时自动切成「左图右文」两栏,宽屏下弹窗更矮、正文不用滑动;窄屏回到居中单列,图片按原始比例缩放。
  • 弹窗内右键屏蔽浏览器原生菜单,切 TAB 内容区回到顶部,长描述出现细滚动条,手机端按安全区内边距排版不被状态栏挡住。
卡片网格 折叠吸顶 Dock弹窗 响应式
Day 68

富内容弹窗与二级菜单

让一个菜单项能弹出带 TAB、图片和说明书的窗口,也能像浏览器一样挂二级菜单。

  • 弹窗内容改为 JSON 多 TAB:每个 TAB 可填标题、图片(本地上传或直接填地址)和描述,描述同时支持 Markdown 与原生 HTML。
  • 后台菜单项编辑拆成「基础设置 / 菜单项」两个标签,选「弹窗」动作时出现内容编辑入口,TAB 可增删排序,保存前统一做长度与 JSON 校验。
  • 二级菜单:菜单项补 pid,一级项可挂多个子项,电脑悬停右侧展开、贴近屏幕右缘自动翻到左侧,手机端改成点击展开。
  • 收藏与屏蔽彻底拆成两个动作:收藏走服务端记录并点亮星标,屏蔽只在本机隐藏卡片、左下角给「恢复」入口,不影响别人看到的数据。
  • 快捷导航「打开文件夹」动作直接复用前台文件夹弹窗,右键就能展开某个文件夹里的站点与文章。
  • 图标兼容三种写法:Bootstrap Icons 类名、emoji、图片地址;图标字段放宽到 500 字,后台给实时预览,不用反复试。
弹窗TAB Markdown 图片上传 二级菜单 收藏屏蔽
Day 67

右键菜单规则引擎

把「右键」从浏览器默认行为,变成按规则匹配的自定义菜单。

  • 新增 right_menu / right_menu_item 两张表:规则记作用范围、生效页面与优先级,菜单项记文字、图标、动作、内容、角色与排序,后台可增删改。
  • 作用范围按站点卡片 / 软件卡片 / 文章 / 全站任意匹配,同一位置命中多条规则时按 priority 取最高的一条,没命中再回落到「全站空白处」规则。
  • 动作统一为 link / copy / qr / top / reload / folder / fav / block:链接支持占位符替换(官网地址、详情页地址),二维码本地生成不请求第三方。
  • 角色白名单 all / user / admin:游客看不到会员菜单项,管理员多一条后台入口,接口只下发有权限的项,前端不用再判登录。
  • 电脑右键、手机长按 500ms 统一接管;空白处右键不再弹浏览器菜单,输入框与选中文字仍保留原生行为。
  • 前端用 md5(规则 JSON) 做版本号,规则没变直接吃缓存,后台改完刷新即时生效,不用清浏览器缓存。
右键菜单 规则匹配 动作 收藏屏蔽
影音与全局开关 Day 64 - 66 · 把音乐做成全站能力,再把全局开关交给后台一键控制
3 天
Day 66

播放器精修与两个全局开关

把手机端播放器从「能用」打磨到「顺手」,再把音乐与获取信息做成后台可一键控制的开关。

  • 手机端把歌单 / 曲库 / 设置收进底部抽屉,播放器右上角一键展开收回,抽屉铺满底部、内容滚动不露底,空间全部还给歌曲列表。
  • 黑胶唱片改为四边对称的整体旋转,叠加音波涟漪与节拍辉光;封面缩成唱片中心的圆形标签,不再遮挡唱片本体。
  • 手机端弹窗改用安全区内边距推算高度,标题与最小化 / 最大化 / 关闭按钮不再被状态栏切掉,三个窗口按钮图标常显。
  • 播放控制栏重排:定时关闭移到播放模式右侧,手机端左右各四个按钮,播放键严格居中。
  • 后台「内容展示」新增音乐开关与获取信息开关:音乐开关只影响全站入口与续播,插件本身仍可在工具箱内使用;获取信息开关只隐藏前台按钮,后台抓取不受影响。
  • 首页手机端隐藏副标题,把首屏空间让给搜索与站点卡片;右下角音乐、回到顶部与手机操作列统一尺寸、间距与右侧对齐。
抽屉 黑胶特效 安全区 全局开关 响应式
Day 65

全站音乐入口与跨页续播

音乐不能只活在工具箱里,要能全站右下角随开随听,翻页、最小化都不中断。

  • 右下角新增悬浮音乐图标,手机端并入底部操作列;播放器运行中自动隐藏,关闭后重新出现,入口始终保持单一。
  • 懒加载加载器 nav-music.js 全站引入:点开才加载插件资源,同时支持明文产物与 .pkg 加密包两种形态。
  • .pkg 票据缓存进 sessionStorage,翻页复用同一张票,避免每页都消耗一次匿名额度。
  • 跨页续播:记录播放位置、播放态与最小化态,新页面自动恢复悬浮唱片并从上次进度继续;被浏览器拦截时改为任意点击即续播。
  • 手机端迷你播放器:点唱片展开控制条、再点收回、3 秒无操作自动收起;右下角 || / ▶ 徽标直接切播放暂停,电脑端 hover 逻辑不变。
  • 插件内所有请求改走统一加密通道,自动补 X-Nav-Kid / X-Nav-Pub 握手头并解密响应,修掉 Encrypted API 419 nokid 的问题。
  • 加密包仍按 --only=music --pkg --guard --obf --anti --lock 构建,明文产物自动删除,服务器密钥与域名白名单必须与本机一致。
全局入口 跨页续播 懒加载 迷你播放器 419
Day 64

音乐插件迁移与后端打通

把另一个项目里成熟的音乐播放器搬进导航站,前端插件化、后端独立控制器,一次跑通曲库、上传与歌单全链路。

  • 源码与产物分离:plugins-src/music 只放 JS / CSS,public/plugins/music 只留 widget.json 与构建后的哈希产物,源码不进 Web 目录。
  • 新增 app/controller/tool/Music.php,承接 library / saveDir / upload / songAdd / songUpdate / songDelete / playlist 系列与 scan 共 11 个接口。
  • 路由集中在 route/app.php 注册 11 条 /music/*,并把 music 加进「需后端」插件清单,后台插件管理能正确识别。
  • 曲库写入 runtime/music/library.json(flock 读写),音频文件落 public/plugins/music/uploads,JSON 不进 Web 根,避免被直接下载。
  • 鉴权按读写分层:曲库与配置公开可播,上传 / 直链 / 歌单 / 删除 / 目录修改仅后台管理员,操作日志统一走 nav_log。
  • 目录歌单规则保留:uploads 下的歌单1、歌单2 通过 music.json 覆盖名称与排序,本地个人层按账号哈希隔离,游客单独一份。
音乐插件 控制器 路由 曲库 上传
站点与社区 Day 59 - 63 · 把站点信息补全,再把评论、留言与互动做成社区
5 天
Day 63

评论系统、详情页标签与封面灯箱

把「看完想说两句」做成一个脚本就能挂到任意页面,截图还能放大看细节。

  • 新增 nav_comment 表:page_key 标记页面(site:12 / app:34 / article:56 / about),root_id + parent_id 两级回复,昵称、邮箱哈希、头像、区县、设备、系统与浏览器、点赞、置顶、审核字段齐全。
  • 接入收敛成两行:一个空容器加一个带 data-key 的 script,comment.js 自动注入样式与 DOM;站点详情、APP 详情、文章页共用同一套组件。
  • 权限分三档:管理员 > 登录用户 > 游客;游客默认只能回复游客,后台可切「必须登录」;删除按管理员任意 / 账号本人 / 设备本人判定。
  • 头像按邮箱哈希稳定取 /static/avatars 图片,后台只存哈希;IP 归属地本地 xdb 优先,区县为空用 GeoCN.mmdb 补齐,缺省再回落远程接口。
  • 后台新增评论管理:待审核 / 已发布 / 未通过 / 已删除四种状态、置顶、审核备注与关键词搜索,列表直接显示 IP 与归属地。
  • 详情页标签化:站点页拆成「网址介绍 / 发表评论 / 星球留言 / 常见问题」,APP 页拆成「应用详情 / 星球留言 / 评论」,统一 .sdp-tabbar 切换不刷新,各标签宽度与下载区保持一致。
  • 跳转与交互:可配「所有站点经过详情页」,关闭时首页精选与推荐位直接 302;评论昵称与邮箱必填、点「回复」把发表框移到被回复评论下方、子回复与「说道:」左对齐。
  • 封面灯箱支持二次缩放:滚轮以鼠标为中心、手机双指捏合、双击放大或还原,放大后可拖动查看局部细节,并限制边界不把图片拖出视口。
评论系统 单脚本嵌入 详情页标签 IP归属地 灯箱缩放
Day 62

星球留言、匿名树洞与微语录

让用户能在站点下留一句话,也能去树洞说点不方便署名的。

  • 新增 secret_post / secret_report 两张表:内容、心情、关联站点、匿名昵称 / 头像 / 配色、区县、IP 哈希、设备哈希、点赞、举报、置顶与审核字段一次到位。
  • 匿名但不裸奔:昵称与头像按设备哈希稳定生成,IP 只存哈希;同一设备 / 同一 IP 对同一条内容只记一次举报,累计 3 条自动隐藏待复核。
  • 发布频控可配:同一设备每天 10 条、同一 IP 每天 5 条,长度与发布间隔后台可调;树洞与站点留言共用同一套清洗、审核与举报逻辑。
  • 站点详情页新增「星球留言」标签:只取本站留言,最多 10 条,按置顶 → 点赞最多 → 最新排序,并提供跳转 /secret-wall 的入口。
  • 树洞页支持最新 / 最热切换、点赞、举报与「我的树洞」,手机端单列卡片,长内容自动折叠。
  • 微语录频道:后台维护语录内容 / 作者 / 排序 / 显示,前台按作者筛选并分页,Hero 显示总条数、作者数与最新一条,侧栏挂「更多微语」入口。
  • 评论与留言统一接入 ContentSecurityService:本地词库命中直接拒绝,第三方接口异常时放行,不因外部服务抖动挡住正常用户。
树洞 星球留言 微语录 匿名 内容安全
Day 61

平台图标、自定义角标与站点反馈

把站点的「支持什么端、有什么标、出了什么问题」都摆到卡片和详情页上。

  • 站点新增 platforms 字段(逗号分隔),映射 Windows / macOS / iOS / Android / 车机 / APP 六个平台,未知值忽略,兼容旧数据。
  • 卡片右下角显示平台图标,侧栏最多保留 4 个:超出优先去掉 macOS、再去掉车机;非软件站点固定显示 Web,详情页与下载区共用同一份平台数据。
  • 自定义角标(最多 8 个字)覆盖预设角标,选择预设时自动清空自定义;角标统一走 nav_badge_style(),卡片、详情、后台列表、固定条共用一套颜色。
  • 角标配色:后台色块打开取色器 + hex 手填 + 恢复默认,预览文字实时跟随,留空沿用内置蓝色;后台列表同时显示角标文字与颜色,编辑自动回填。
  • 站点反馈:详情页收集网址失效 / 跳转异常 / 已被屏蔽 / 敏感内容 / 封面异常 / 信息有误,落库到站点反馈字段,按时间倒序保留最近 6 条并记录 IP。
  • 后台把「未处理反馈」的站点名称标红并排在最前,支持只看未处理、查看完整说明与 IP、处理后勾选已处理;有新反馈时通知管理员。
  • 站点卡片信息层级重排,窄屏下标题、描述、平台、角标按优先级换行;新增头图折叠按钮,data-fold + localStorage 记住每个页面的收起状态。
平台图标 自定义角标 角标配色 站点反馈 头图折叠
Day 60

今日精选与自定义导航

首页既要能运营推荐,也要让用户放自己的常用网址。

  • 今日精选重做:总开关、电脑一行 5 个 / 手机 3 个,固定两行;勾选的推荐站点超出一屏时随机抽取,每次刷新都有新鲜感。
  • 没有勾选任何「精选推荐」时自动回落:按点赞数 → 浏览量倒序取前 6 个,数据每天变化,首页不会出现空白块。
  • 精选卡片复用站点角标与悬停提示,无数据时给占位说明,不出现整块空框。
  • 自定义导航:用户可以自己添加网址,电脑 3~8 个 / 手机 2~5 个 / 一屏 1~5 行都能配,超出一屏出现左右箭头翻页。
  • 未登录的网址先存在浏览器本地,登录后按「域名 + 路径」去重合并进账号,换浏览器登录也能恢复。
  • 后台「快捷导航」与用户自定义导航分离:分类 / 站点 / 自定义链接三种类型,副标题悬停气泡,分类自动带站点数量。
今日精选 自定义导航 随机抽取 本地缓存
Day 59

收录、友链与广告的付费规则

把「谁能免费、谁必须付费、付完是否免审」做成后台可配的开关组合。

  • 收录入口拆成四个开关:收录总开关、免费单免审、强制付费、付费免审;费用为 0 时前台只有「免费提交」,大于 0 才出现「付费提交 / 免费提交」二选一。
  • 强制付费开启后前台不再给免费入口,必须支付成功才收录;付费免审开启后支付回调直接上架,待审站点保留记录并标记为已审核通过。
  • 友链复用同一套规则:免费单免审 / 付费免审 / 强制付费 / 价格 0 免费,付款成功自动展示上线,后台仍可人工改状态与排序。
  • 广告区分免费单直接投放与收费单待收款,按套餐或默认月价计费,保留「强制广告标识」用于合规展示。
  • 三类申请都进统一待审列表,后台可按待收款 / 待审核 / 已上线筛选;在线回调与后台确认收款都能触发入账,订单号做幂等。
  • 批量收录新站点时先按网址去重再导入,统一 create_time / update_time,简介压到两行内,卡片与详情页都不用二次修。
付费收录 友链付费 强制付费 免审 自动入账
加密与会员 Day 56 - 60 · 把通信加密、插件发布与会员体系做成可运营的闭环
3 天
Day 58

通知队列可视化与通知上下文统一

让每一条通知都看得见、查得清,并且自动带上用户、IP、归属地与设备信息。

  • 新增队列监控页 /admin/queue:消费者进程(PID / 用户 / 内存 / 启动时间 / 命令)、待发送与失败归档、脚本日志、计划任务心跳一屏可见;网页内可启动、停止、重启、智能管理、立即消费与测试通知。
  • 新增消费者守护脚本 scripts/notify-worker.sh:flock 互斥、逐个启动并轮询确认、超额进程回收、manage 三轮校准,把「目标 2 个却起成 4 个」收敛为稳定的 2/2,可一条命令挂宝塔计划任务。
  • 队列错误可读化:pending → working 失败写 move_failed 与 last_error,心跳记录 err_t / err_title / err_msg;失败按 1/5/15/30 分钟退避,5 次后归档;root 创建的目录由 0755 改 0775 并归还 www,避免网页端无法入队。
  • 401 定位与密钥一致性:说明 APISend 的 checkApiKey 是 fail-closed(留空即拒绝),区分「渠道测试直连 webhook 不校验 key」与「队列测试走后端接口才校验」;401 提示直接对比地址侧与插件侧 api_key,并保留非 2xx 的 HTTP 返回体。
  • 通知上下文中枢:nav_notify_admin 统一补用户名(UID)、IP、归属地、设备(含清洗后的原始 UA)、时间;订单类用下单 IP;注册、改密、找回、激活邮箱、收录申请、会员 / 积分 / 邀请码订单、管理员登录全部接入,并新增找回密码与邮箱激活开关。
  • 后台体验与文档:侧栏底部收成一行两图标、品牌可点回后台、菜单默认只展开概览;推送渠道拆成接口与密钥 / 企业微信 / 飞书 / 钉钉 / 邮件五个标签,新增会员与积分标签,设置页内嵌队列卡片并 15 秒自动刷新;开发过程/20261103 输出 9 份模块文档与 Day 58 补录 SQL。
通知队列 进程守护 401 通知上下文 开发文档
Day 57

会员体系、注册风控与真实 IP

把会员、积分、注册和 IP 留痕串成一套可运营、可审计的闭环。

  • 会员体系 v40:会员按 vip_expire、站长按 level>=9 或 webmaster_expire;积分统一走 nav_points_change,条件扣减不会扣成负数,每次变动写流水与 IP。
  • 会员订单与发放:MB 前缀订单号、同档未支付复用、同 IP 每小时 10 单、0 元档限领一次;积分充值按订单号幂等,会员续期从 max(现在, 原到期) 累加,发放失败回滚为待确认。
  • 插件访问额度:匿名 60 次 / 登录 300 次 / 会员不限,按票据加插件做幂等,刷新不重复扣费;会员与站长使用扣积分插件时不扣积分。
  • 注册与登录风控:注册开关、邀请码、邮箱验证、图形验证码、注册配额、默认头像可配;新增同 IP 24 小时注册数量限制,邀请码核销失败回滚账号;登录账号 5 次、IP 20 次失败锁 10 分钟。
  • 真实 IP 与归属地:全站统一 IpUtils::getRealIp(),单值头优先、XFF 最左公网 IP 兜底;后台新增 IP 自检与归属地查询;归属地 7 天缓存、单页最多查 12 个;v42 给收藏、点赞、赞助、赞助订单、积分流水补 ip。
  • 体验与文档:v41 插件封面,工具箱卡片补封面、分类标签、需登录 / 免费或 N 积分;开发过程/20261102 输出 9 份 Markdown,覆盖加密、构建、会员、注册、IP、前端、安全与变更记录。
  • 后台配套:会员订单页按状态筛选并支持手动发放,用户列表显示会员等级、到期时间与积分余额,会员与积分档位支持角标文案(热门 / 加赠);前台统一登录弹窗与积分说明弹窗,避免跳页打断操作。
会员体系 注册风控 真实IP 归属地 开发文档
Day 56

通信加密落地与插件双版本构建

让插件请求真正走密文,同时把加密包和明文包的发布流程彻底分开。

  • 全站接口接入 nav-sec-v1:ECDH(P-256) 协商会话密钥,HKDF 派生 AES-256-GCM 与 HMAC,会话 1800 秒,站点密钥按 30 分钟时间片下发 4 真 2 假分片。
  • 插件请求改造:tuchuang 等插件改用 secXhr,先握手再带 X-Nav-Kid / X-Nav-Pub,响应在本地解密,上传进度条保留;419 自动 reset 并重试一次。
  • 修掉「开了加密却返回明文」:移除页面全局 ?nav_token= 注入,window.ajax 改为 NavSec 优先,明文令牌只留给 cron / curl。
  • 构建工具新增选项 10 / 11:10 生成带 8 位 hash 的 .min.js / .min.css,11 导出到 dist-upload/mingwen,并自动去掉导出副本里的 pkg 字段。
  • 明确 widget.json 的单一生效态:有 pkg 走加密包,没有 pkg 走 assets 明文;--pkg 会删除明文,必须先导出留档再打包。
  • 修复 nav.cmd 双击闪退:LF 改为 CRLF、补 Node 检测、无参数时必定 pause;响应头补 no-store / Vary / nosniff,避免 CDN 缓存串响应。
通信加密 419 插件构建 nav.cmd CDN
用户与触达 Day 51 - 55 · 注册、用户中心、通知与推送统一打通
5 天
Day 55

多渠道推送后台

通知能力要能接不同通道,而不是写死在代码里。

  • 推送渠道改为配置驱动,支持邮件、短信、Webhook 与企业机器人,密钥与地址统一在后台维护。
  • 新增推送日志表记录每次调用的渠道、请求参数、响应内容与耗时,失败原因不用再翻服务器日志。
  • 后台提供渠道连通性测试、启停与优先级排序,主通道失败时按顺序降级到备用通道。
推送 渠道 日志
Day 54

通知模板与触发规则

该提醒的事情要提醒到人,不该打扰的一次都不发。

  • 抽出通知模板表,按事件(注册、邀请码、收录审核、广告到期、赞助到账)分别配置标题与正文变量。
  • 每种事件可单独开关、选择发送渠道与接收对象,变量缺失时用默认值兜底,避免发出半截消息。
  • 发送结果落库,失败可重试;同一事件对同一对象做去重,防止一次性重复轰炸。
通知 模板 变量
Day 53

用户中心与互动数据

登录之后要有「自己的东西」,用户才会反复回来。

  • 用户中心拆出资料、收藏、点赞、浏览记录与我的投稿,统一入口按模块分页加载,避免一次查全表。
  • 站点收藏与点赞改为服务端记录,同一用户重复点击只算一次,取消后计数同步回退,不做前端假数据。
  • 浏览记录按天归档,超过保留天数自动清理,既能看到最近足迹,也不会让表无限增长。
用户中心 收藏 点赞
Day 52

注册开关与邀请码

注册入口要能开能关,邀请码要能买、能发、能核销。

  • 注册设置新增总开关、仅邀请注册开关、邀请码单价与购买地址说明,入口关闭时前台直接给出提示而不是报错。
  • 邀请码支持后台批量生成、绑定购买订单、一键复制与失效,购买订单支持在线支付与后台确认发码。
  • 支付回调自动发码,重复回调只生效一次;未支付订单可取消,已发码订单保留完整记录便于追溯。
注册 邀请码 订单
Day 51

弹窗设置与页面级配置

公告、活动、推广都能用弹窗触达,但不能每个页面各写一套。

  • 抽出统一的弹窗配置结构,首页、文章、收录、关于、工具箱、赞助、广告、用户中心八个页面各自独立开关。
  • 后台按页面维护弹窗标题、内容、按钮、展示频率与生效时段,并复用前台组件做实时预览。
  • 前台统一由一个渲染器接管,支持「每天一次」「每次进入」「关闭后不再提示」三种频率,避免重复打扰。
弹窗 配置 频率
运营与账务 Day 46 - 50 · 把记账、赞助与内容沉淀成可持续的运营能力
5 天
Day 50

文章分类与 Markdown 编辑

导航站需要内容留住人,先把「写文章」这件事做顺。

  • 文章表与文章分类表拆分,支持置顶、封面、摘要、浏览量、发布状态与 URL 标识。
  • 后台内置 Markdown 编辑器,支持加粗、标题、引用、列表、代码、表格与图片,保存前可以先预览。
  • 前台文章列表与详情统一排版,封面缺失时显示占位图,阅读量与「多久前」自动计算,不依赖手填。
文章 Markdown 封面
Day 49

赞助墙与赞助订单

让愿意支持的访客有地方表达,也让站长看得见谁在支持。

  • 赞助墙按金额排序展示赞助者,支持正常、永久、最佳位套餐,勾选「同时收录」时订单金额自动叠加收录费用。
  • 赞助订单支持在线支付与后台确认到账,到账后同步写入赞助墙,并按套餐计算展示时长。
  • 前台把支付方式、二维码与价格预演放在一起,勾选收录后金额立即变化,避免下单才发现价格不对。
赞助 套餐 支付
Day 48

订单自动入账

钱到账就该自动出现在账本里,不再靠人工补记。

  • 新增统一入账方法,自动查找或创建「站点收入」分类,金额小于等于 0 直接跳过,免费单不产生脏记录。
  • 邀请码购买、广告投放(含首页固定位)、付费收录、赞助墙四条收款链路全部接入,在线回调和后台确认收款都能触发。
  • 订单号写进备注做幂等判断,支付回调重复到达也只记一笔;入账异常只写支付日志,不影响支付本身。
自动入账 幂等 订单
Day 47

记账日历与统计

一屏看清每天的收支,比翻列表找数字高效得多。

  • 按 7 列日历渲染整月记录,跨月日期淡化显示,今天与选中日高亮,单日收入、支出直接标在格子里。
  • 右侧拆出「记录明细」按天分组、可折叠,本月合计与当日合计跟随选择实时联动。
  • 统计区补齐四块:收支总结、每日收支柱状图、分类占比环形图、各月趋势折线图,全部用 Chart.js 绘制。
  • 桌面端改成左日历加统计、右明细的左右布局,明细吸顶并独立滚动,窄屏自动回退单列。
日历 Chart.js 布局
Day 46

记账模块落地

把「钱花在哪、赚了多少」变成可查的数据,而不是记在脑子里。

  • 新建 accounting_categories 与 accounting_records 两张表,收入、支出共用同一套分类,记账时不必重复维护分类。
  • 记录按 record_date + record_time 分开存储,金额统一保留两位小数,备注限制长度,先把数据规范立住。
  • 后台记账接口提供列表、保存、删除与分类维护,统一走管理员登录态与参数校验。
  • 表结构惰性初始化:首次打开记账页自动建表并写入默认分类,不依赖安装脚本,老站也能直接用。
记账 分类 接口
安全与打磨 Day 38 - 45 · 最后八天,全部用来补安全、修体验、做复盘
8 天
Day 45

上线复盘

最后一天不写新功能,只做收尾与规划。

  • 整理部署步骤、备份与恢复策略。
  • 输出后台使用说明与常见问题。
  • 关于页做成数据驱动:开发日志、阶段、技术栈全部读库,前台按阶段分组,支持阶段筛选、升降序与「收起顶部介绍」。
  • 后台「开发日志 / 开发阶段」可视化增删改:天数、标题、目标、逐条事项、标签、日期与显示状态,保存后 /about 立即生效,不用改模板。
  • 列出下一阶段计划:更多插件、数据备份、内容运营。
关于页 开发日志 部署 备份 复盘
Day 44

兼容与修复

把开发过程中记下的问题清单逐条清掉。

  • 修复支付回调验签、时区与缓存导致的问题。
  • 处理空数据、超长文本与异常图片等边界情况。
  • 补齐 Windows 与 Linux 的部署差异说明。
Bug 修复 兼容
Day 43

移动端打磨

最后统一检查手机上的交互细节。

  • 抽屉、弹窗、Dock 的手势与层级统一。
  • 播放器交互对齐主流视频平台的用户习惯。
  • 横向筛选栏支持鼠标拖动与滚轮滚动,新选项优先展示。
手势 播放器 横向滚动
Day 42

设置页体验

设置项越来越多,不能让站长在一堆输入框里迷路。

  • 设置最终收敛成 17 个标签页:基础、注册|邀请码、内容展示、二维码与联系、收录、广告、友链与 Dock、邮件、支付、通知、推送渠道、赞助墙、通信与安全、弹窗、会员与积分、评论,右侧说明随当前标签联动。
  • 会员与推送再拆子标签(套餐 / 站长 / 积分档位、接口与密钥 / 企业微信 / 飞书 / 钉钉 / 邮件),配置项再多也不会挤在一个长页面里。
  • 支付通道分组展示,启用状态一目了然;永久收录价签实时预览,保存后用服务端真实值回填。
  • 设置页内嵌队列状态卡片,15 秒自动刷新,不用跳到监控页也能看到消费者与积压。
标签页 说明联动 价签预览
Day 41

防抓包与防查看源码

把「随手 F12」这道门槛立起来。

  • 全站拦截 F12 与 Ctrl+Shift+I / J / C。
  • 检测到开发者工具打开时弹出遮罩阻断页面,关闭后自动恢复。
  • 防查看源码额外禁用右键菜单、Ctrl+U 与 Ctrl+S。
F12 防抓包 右键拦截
Day 40

后台安全

后台是权限最集中的地方,逐项加固。

  • 密码哈希存储,登录限速与服务端 Token 校验。
  • 所有后台接口统一 guard,未登录直接拒绝。
  • APP_DEBUG 开关直接写入 .env,避免线上暴露堆栈与配置。
密码哈希 接口守卫 APP_DEBUG
Day 39

会话与降级

安全要强,但不能让正常用户打不开页面。

  • 会话密钥 30 分钟轮换,过期返回 419 由前端自动重连。
  • HTTP 或浏览器能力不足时自动降级为明文。
  • 调试模式支持 ?debug=1 临时明文,方便排查接口。
会话轮换 419 重连 明文降级
Day 38

加密传输

接口里的数据不该以明文躺在网络面板里。

  • 自研 nav-sec-v1:ECDH 协商 + HKDF 派生 + AES-256-GCM 加密。
  • 接口返回加密信封,前端握手后还原密钥再解密。
  • 站点密钥分片存储,降低单点泄露风险。
ECDH HKDF AES-256-GCM
商业化 Day 31 - 37 · 收录、广告、友链与支付,让站点可以自己造血
7 天
Day 37

订单与人工收款

不是所有人都用在线支付,人工通道必须顺手。

  • 订单列表、状态流转与按类型筛选。
  • 收款码回填单号,人工确认后入账。
  • 赞助记录与永久收录联动,付款即上墙。
订单 收款码 人工确认
Day 36

微信 Native

微信 APIv3 的坑最多,单独安排一天。

  • APIv3 下单与二维码生成。
  • 回调用 AES-256-GCM 解密,平台证书验签。
  • 证书轮换后后台会提示同步更新。
APIv3 AES-GCM
Day 35

支付宝当面付

官方通道能减少对第三方网关的依赖。

  • 调用 precreate 生成二维码,前台直接扫码。
  • RSA2 签名与支付宝公钥验签。
  • 异步回调做幂等处理,避免重复入账。
precreate RSA2
Day 34

聚合支付

先接最容易落地的通道,把支付链路跑通。

  • 易支付协议接入,同时支持支付宝与微信。
  • 下单、签名、回调验签全链路跑通。
  • 支付成功后写订单并自动完成投放。
易支付 MD5 签名
Day 33

友链系统

友链是最轻量的互换合作方式。

  • /friend 申请页、后台审核、付费与免费两种模式。
  • 免费单可设置免审,提交即展示。
  • 友链展示区与权重说明集中维护。
/friend 审核 付费
Day 32

广告系统

广告位既是收入,也是首页的视觉组成部分。

  • 横幅与固定位两种广告位,分别设置价格与列数。
  • 套餐、月价、投放时长与「虚位以待」占位卡。
  • 强制广告标识、排序与到期自动下线。
横幅 固定位 套餐
Day 31

收录系统

把「申请收录」做成一条完整流水线。

  • 前台 /submit 提交收录,后台「待审站点」集中处理。
  • 免审开关与收录费用说明,免费与付费两套流程。
  • 审核通过后自动写入站点管理并上架前台。
/submit 待审 免审
工具箱 Day 21 - 30 · 把插件体系做出来,让功能可以持续生长
10 天
Day 30

上传与素材

所有插件都要上传,安全必须统一收口。

  • 统一上传接口,校验文件类型、大小与后缀。
  • 上传目录权限收紧,文件名随机化。
  • 图片与文件预览、清理入口集中管理。
上传接口 文件校验
Day 29

工具箱体验

插件数量变多后,如何找到才是关键。

  • 工具搜索、分类筛选与插件弹窗一体化。
  • 重排中栏布局,减少空白区,操作说明与示例数据分区展示。
  • 横向筛选栏支持鼠标拖动与滚轮滚动,新工具排在前面。
搜索 筛选 布局
Day 28

内容与娱乐

除了工具,也要有让人愿意多停一会的页面。

  • KPL 赛事数据、赛程与直播入口。
  • 热搜榜聚合,按平台分类展示。
  • 数据做缓存,避免频繁请求源站被封。
KPL 热搜
Day 27

效率工具

把重复劳动交给页面完成。

  • 文件批量改名与格式转换。
  • iOS 描述文件生成,方便内测分发。
  • 卡密与随机口令生成,支持自定义字符集。
改名 描述文件 口令
Day 26

视频与解析

这一批插件最考验稳定性和合规边界。

  • m3u8 播放器支持多套内核与自定义配置。
  • 蓝奏云、飞寄盘、青数云解析入口。
  • token 与代理接口分离,前台不暴露真实资源地址。
m3u8 云盘解析
Day 25

音频工具

音频处理是工具箱里最容易被忽略的一类。

  • 音频压缩与裁剪,支持波形预览与试听。
  • 输出格式与码率可选,兼顾体积与音质。
  • 长音频分段处理,避免浏览器卡死。
压缩 裁剪 试听
Day 24

图片工具

图片处理全部放在浏览器里完成。

  • 图片压缩、格式转换、水印、在线编辑。
  • 封面制作与贴图工具,满足日常运营需求。
  • Canvas 本地处理,避免上传原图带来的隐私与带宽问题。
压缩 水印 编辑
Day 23

站长工具

把站长每天要查的东西集中到一个页面。

  • 权重、友链、备案、SEO 查询入口。
  • IP 查询与 Ping 工具,支持批量检测。
  • 死链批量检测,结果可一键复制。
权重 友链 备案
Day 22

文本类工具

第一批插件从最常用、最容易验证的开始。

  • 记事本、Markdown 预览、编码转换、二维码生成。
  • 纯前端运行,输入内容不上传服务器。
  • 工具箱首页使用 2x2 / 2x4 图标布局,功能一眼可辨。
记事本 Markdown 二维码
Day 21

插件框架

先定规则,再批量做工具,效率会高很多。

  • 约定 widget.json 清单:名称、分类、入口、依赖资源。
  • 后台自动发现、安装、启用 / 停用插件。
  • 插件页面独立运行,样式与脚本不污染主站。
widget.json 插件管理
导航核心 Day 11 - 20 · 把「找站点」的完整链路做顺
10 天
Day 20

性能第一轮

功能齐了之后,回头处理「能用但不快」的地方。

  • 图片与图标懒加载,首屏只加载必要资源。
  • 合并公共查询并补索引,排行榜与首页明显变快。
  • 静态资源统一带版本号,解决浏览器缓存导致样式不更新。
懒加载 索引 缓存
Day 19

后台仪表盘与统计

每天打开后台,第一眼要看到关键数据。

  • 站点、文章、待审、订单、赞助数据集中展示。
  • 近 7 天趋势图与常用功能快捷入口。
  • 待审核、待收款等事项集中提醒,避免漏单。
  • 独立统计页补齐访问趋势、设备分布与站点访问排行,按天聚合不扫全表。
  • 待办扩展到待审站点、待收款订单、未处理反馈与推送队列异常四类。
统计 趋势图 待办
Day 18

赞助墙

给愿意支持站点的人一个体面的展示位置。

  • 雪花飘落背景、赞助列表与金额档位。
  • 赞助播报、榜上有名门槛与永久收录入口。
  • 移动端降级为静态列表,减少动画开销。
赞助 动画 榜单
Day 17

导航与 Dock

让站长可以自由调整站点的导航结构。

  • 顶部、底部导航支持二级菜单、图标与描述。
  • 底部 Dock 支持站点 / 分类 / 网址标签 / 自定义链接四种入口。
  • 后台可视化排序,保存后前台即时生效。
顶部导航 底部 Dock
Day 16

SEO 细节

把搜索引擎关心的细节逐项补齐。

  • 每页独立 title / keywords / description。
  • 语义化链接:/c/:slug、/site/:slug、/article/:id。
  • 统一 404 页面与跳转逻辑,避免出现软 404。
meta 语义化链接 404
Day 15

公告与单页

运营需要能随时发通知、挂说明页。

  • 首页顶部滚动公告条,后台可一键关闭。
  • 公告列表与详情页,支持时间排序。
  • 单页管理支持自定义 HTML、访问密码与来源校验。
公告 单页 访问密码
Day 14

人气排行

排行是用户发现好站点的第二条路径。

  • 日 / 周 / 月 / 总榜四种周期。
  • 定时聚合浏览量,避免每次请求都做全表统计。
  • 榜单做缓存与空数据回落,冷启动也不出现空白。
日榜 周榜 月榜
Day 13

文章系统

导航站需要内容来沉淀搜索流量。

  • 文章分类、列表、详情与 Markdown 编辑器。
  • 封面图、摘要、阅读量、发布时间等基础字段一次补齐。
  • 文章与站点互相导流:文章里可引用站点,站点页可挂相关文章。
文章 Markdown 封面
Day 12

站点详情页

详情页承担 SEO 与转化,不能只是简单跳转。

  • /site/:slug 详情页,标题、关键词与描述按站点内容自动生成。
  • 相关推荐按分类与标签匹配,提升停留时长。
  • 访问计数与外部跳转分别统计,方便判断站点价值。
  • 数据胶囊:今日 / 本周 / 本月点击与收录天数,浏览量按天聚合,详情页与榜单共用同一份统计。
  • 「手机查看」二维码气泡:电脑悬停、手机点击,箭头按空间自动翻转,扫码直达当前页。
  • 权重区接入爱站百度 / 移动 / 搜狗三张权重图,加载失败自动隐藏,链接带 nofollow。
  • 页面下滑后出现固定信息条,收藏 / 点赞状态与主按钮双向同步。
/site/:slug SEO 相关推荐
Day 11

站内搜索

搜索是导航站最高频的入口。

  • 站内同时搜索站点与文章,结果按相关度与热度排序。
  • 搜索框可切换 Bing / 百度 / Google 等外部引擎。
  • 补充输入联想与空结果兜底,避免用户走进死胡同。
搜索 联想 多引擎
起步 Day 01 - 10 · 定框架、搭骨架,让程序先完整跑起来
10 天
Day 10

公共函数层

把重复逻辑收敛,后面做插件和支付才不会越写越乱。

  • common.php 统一封装设置读取、统计、排行与导航数据。
  • 统一 JSON 返回结构 code / msg / data,前端只写一套请求逻辑。
  • 设置项读取后做请求级缓存,减少重复查库。
common.php 设置缓存
Day 9

三端响应式

手机访问占比很高,移动端不能是桌面端的缩小版。

  • 桌面、平板、手机三套断点,分别调整栅格与间距。
  • 手机端使用抽屉式侧栏与底部 Dock,主操作保持单手可达。
  • 触控区域不小于 44px,避免误触。
响应式 抽屉 Dock
Day 8

主题系统

让同一个站点有多种气质,但只需要维护一套样式。

  • 六套预设主题,支持自定义主色与底色。
  • 全部颜色走 CSS 变量,切换主题不刷新页面。
  • 内联脚本提前还原主题,避免首屏闪白。
CSS 变量 localStorage
Day 7

首页骨架

先把首页的信息层级和视觉节奏定下来。

  • Hero 搜索区、分类快捷入口、精选卡片与推荐位一次排布完成。
  • 右侧栏:站点数据、人气排行、最近收录、公告、赞助榜。
  • 先用占位数据把布局跑通,再接真实查询,避免边改样式边查库。
Hero 精选 侧栏
Day 6

站点管理

把「收录一个站点」这件事做到最省力。

  • 站点的名称、URL、图标、封面、描述、标签、徽章等完整字段。
  • 一键抓取图标与站点信息,支持批量上下架。
  • 图标选择器统一收口:内置图标库分组检索 + emoji / 1~2 个汉字 + 上传图片三合一,未设置时回落站点首字母,后台各页面复用同一组件。
  • 封面支持手动上传与自动截图,截图失败时显示首字母占位,不出现破图。
  • 前台提供详情页与直达链接两种跳转模式,可整体切换「所有站点先经过详情页」。
CRUD 图标抓取 批量操作
Day 5

分类与二级标签

导航站的骨架是分类,先让内容有地方放。

  • 一级分类 + 二级标签树,图标同时支持 emoji 与 Bootstrap Icons。
  • 支持排序、批量启停与站点数量统计。
  • 前台左侧菜单按树形展示,子分类可展开收起。
分类 标签 排序
Day 4

后台登录与布局

后台是每天都要用的地方,先把骨架和登录态做稳。

  • 使用服务端 Token 登录态,退出登录后立即失效。
  • 登录失败次数限速,避免被暴力破解。
  • 后台侧边栏与移动端抽屉布局一次搭好,后续页面直接复用。
  • 「当前账号」页集中展示登录信息并支持修改密码,首次登录提醒替换默认密码。
Token 登录限速 Cookie
Day 3

安装向导

让程序可以脱离开发者环境,在任意服务器上安装。

  • 环境检测:PHP 版本、扩展、目录可写权限逐项检查。
  • 填写数据库信息后自动建表,并把配置写入项目根目录 .env。
  • 生成默认管理员 admin / 123456,首次登录提醒立即修改。
/install 环境检测 .env
Day 2

数据库设计

先想清楚数据怎么存,后面所有功能才不用反复改表。

  • 设计站点、分类、标签、文章、公告、设置、管理员等核心表。
  • 同一套 Schema 兼容 SQLite 与 MySQL,表前缀自动读取 .env。
  • 所有表统一 create_time / update_time,方便排序、统计与审计。
SQLite MySQL 表前缀
Day 1

选型与项目骨架

把项目定位成「一个能长期维护的导航站」,先把目录结构和请求链路跑通。

  • 选定 ThinkPHP 8 + PHP 8.1,路由集中在 route/app.php,业务统一放在 app/controller。
  • 确立「后台纯 HTML 视图 + PHP 接口」的前后端分离结构,静态资源统一放 public/static。
  • 第一天就把安全层写进架构:登录态、接口守卫、登录限速,为后续加密传输留好位置。
ThinkPHP 8 PHP 8.1 MVC
已记录 84 天 · 还在继续 接下来继续加插件、做内容、修细节 —— 慢一点没关系,每天都在往前。
必备 枫叶起始页(必备)
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-11-12 18:10:33 HTTP/1.1 GET : https://dhw.wchulian.com.cn/about.html
  2. 运行时间 : 0.187177s [ 吞吐率:5.34req/s ] 内存消耗:10,705.06kb 文件加载:182
  3. 缓存信息 : 0 reads,0 writes
  1. /www/wwwroot/daohw.cn/public/index.php ( 0.79 KB )
  2. /www/wwwroot/daohw.cn/vendor/autoload.php ( 0.73 KB )
  3. /www/wwwroot/daohw.cn/vendor/composer/autoload_real.php ( 1.63 KB )
  4. /www/wwwroot/daohw.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /www/wwwroot/daohw.cn/vendor/composer/ClassLoader.php ( 15.99 KB )
  6. /www/wwwroot/daohw.cn/vendor/composer/autoload_static.php ( 4.73 KB )
  7. /www/wwwroot/daohw.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /www/wwwroot/daohw.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /www/wwwroot/daohw.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /www/wwwroot/daohw.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /www/wwwroot/daohw.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 0.35 KB )
  15. /www/wwwroot/daohw.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.86 KB )
  16. /www/wwwroot/daohw.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.60 KB )
  17. /www/wwwroot/daohw.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /www/wwwroot/daohw.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.23 KB )
  19. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /www/wwwroot/daohw.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /www/wwwroot/daohw.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /www/wwwroot/daohw.cn/app/provider.php ( 0.19 KB )
  23. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Http.php ( 6.22 KB )
  24. /www/wwwroot/daohw.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /www/wwwroot/daohw.cn/app/common.php ( 2.99 KB )
  27. /www/wwwroot/daohw.cn/app/common/base.php ( 5.99 KB )
  28. /www/wwwroot/daohw.cn/app/common/ip.php ( 6.27 KB )
  29. /www/wwwroot/daohw.cn/app/common/db.php ( 8.74 KB )
  30. /www/wwwroot/daohw.cn/app/common/db_upgrade.php ( 102.73 KB )
  31. /www/wwwroot/daohw.cn/app/common/schema.php ( 59.00 KB )
  32. /www/wwwroot/daohw.cn/app/common/seed.php ( 102.14 KB )
  33. /www/wwwroot/daohw.cn/app/common/install.php ( 14.51 KB )
  34. /www/wwwroot/daohw.cn/app/common/sec.php ( 18.30 KB )
  35. /www/wwwroot/daohw.cn/app/common/auth.php ( 17.69 KB )
  36. /www/wwwroot/daohw.cn/app/common/user.php ( 34.70 KB )
  37. /www/wwwroot/daohw.cn/app/common/notify.php ( 33.47 KB )
  38. /www/wwwroot/daohw.cn/app/common/queue.php ( 19.44 KB )
  39. /www/wwwroot/daohw.cn/app/common/apisend.php ( 6.03 KB )
  40. /www/wwwroot/daohw.cn/app/common/order.php ( 29.57 KB )
  41. /www/wwwroot/daohw.cn/app/common/view.php ( 28.15 KB )
  42. /www/wwwroot/daohw.cn/app/common/content.php ( 21.14 KB )
  43. /www/wwwroot/daohw.cn/app/common/widget.php ( 34.99 KB )
  44. /www/wwwroot/daohw.cn/app/common/money.php ( 36.29 KB )
  45. /www/wwwroot/daohw.cn/app/common/http.php ( 11.16 KB )
  46. /www/wwwroot/daohw.cn/app/common/ui.php ( 6.03 KB )
  47. /www/wwwroot/daohw.cn/app/common/compat.php ( 26.91 KB )
  48. /www/wwwroot/daohw.cn/app/common/plugin.php ( 40.16 KB )
  49. /www/wwwroot/daohw.cn/app/common/member.php ( 47.08 KB )
  50. /www/wwwroot/daohw.cn/app/common/secret.php ( 10.39 KB )
  51. /www/wwwroot/daohw.cn/app/common/comment.php ( 19.84 KB )
  52. /www/wwwroot/daohw.cn/app/common/home_modules.php ( 14.25 KB )
  53. /www/wwwroot/daohw.cn/app/common/home_pic.php ( 55.16 KB )
  54. /www/wwwroot/daohw.cn/app/common/shijuan.php ( 7.81 KB )
  55. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/helper.php ( 18.77 KB )
  56. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Config.php ( 5.93 KB )
  57. /www/wwwroot/daohw.cn/config/app.php ( 0.95 KB )
  58. /www/wwwroot/daohw.cn/config/cache.php ( 0.78 KB )
  59. /www/wwwroot/daohw.cn/config/console.php ( 0.64 KB )
  60. /www/wwwroot/daohw.cn/config/cookie.php ( 0.56 KB )
  61. /www/wwwroot/daohw.cn/config/database.php ( 2.13 KB )
  62. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  63. /www/wwwroot/daohw.cn/config/filesystem.php ( 0.61 KB )
  64. /www/wwwroot/daohw.cn/config/lang.php ( 0.91 KB )
  65. /www/wwwroot/daohw.cn/config/log.php ( 1.35 KB )
  66. /www/wwwroot/daohw.cn/config/middleware.php ( 0.19 KB )
  67. /www/wwwroot/daohw.cn/config/route.php ( 1.89 KB )
  68. /www/wwwroot/daohw.cn/config/session.php ( 0.57 KB )
  69. /www/wwwroot/daohw.cn/config/shijuan.php ( 1.16 KB )
  70. /www/wwwroot/daohw.cn/config/trace.php ( 0.34 KB )
  71. /www/wwwroot/daohw.cn/config/view.php ( 1.20 KB )
  72. /www/wwwroot/daohw.cn/app/event.php ( 0.25 KB )
  73. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Event.php ( 7.77 KB )
  74. /www/wwwroot/daohw.cn/app/service.php ( 0.13 KB )
  75. /www/wwwroot/daohw.cn/app/AppService.php ( 0.26 KB )
  76. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  77. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  78. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  79. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  80. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  81. /www/wwwroot/daohw.cn/vendor/services.php ( 0.14 KB )
  82. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  83. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  84. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  85. /www/wwwroot/daohw.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  86. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  87. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  88. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  89. /www/wwwroot/daohw.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  90. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  91. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  92. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.20 KB )
  93. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.75 KB )
  94. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  95. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  96. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.30 KB )
  97. /www/wwwroot/daohw.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  98. /www/wwwroot/daohw.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  99. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  100. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  101. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  102. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  103. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  104. /www/wwwroot/daohw.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  105. /www/wwwroot/daohw.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  106. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  107. /www/wwwroot/daohw.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  108. /www/wwwroot/daohw.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 17.45 KB )
  109. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  110. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.02 KB )
  111. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  112. /www/wwwroot/daohw.cn/app/Request.php ( 0.09 KB )
  113. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Request.php ( 54.64 KB )
  114. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/traits/UrlHandler.php ( 6.05 KB )
  115. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/traits/DomainHandler.php ( 5.49 KB )
  116. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/traits/HttpMethodHandler.php ( 4.74 KB )
  117. /www/wwwroot/daohw.cn/app/middleware.php ( 0.37 KB )
  118. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  119. /www/wwwroot/daohw.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  120. /www/wwwroot/daohw.cn/app/middleware/SecurityHeaders.php ( 1.37 KB )
  121. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  122. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.74 KB )
  123. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  124. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.41 KB )
  125. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/route/Rule.php ( 27.49 KB )
  126. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  127. /www/wwwroot/daohw.cn/route/apisend.php ( 2.09 KB )
  128. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  129. /www/wwwroot/daohw.cn/route/app.php ( 23.43 KB )
  130. /www/wwwroot/daohw.cn/route/shijuan.php ( 1.60 KB )
  131. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  132. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 11.32 KB )
  133. /www/wwwroot/daohw.cn/app/controller/Front.php ( 1.01 KB )
  134. /www/wwwroot/daohw.cn/app/BaseController.php ( 2.05 KB )
  135. /www/wwwroot/daohw.cn/app/controller/front/ContextTrait.php ( 16.29 KB )
  136. /www/wwwroot/daohw.cn/app/controller/front/HomeTrait.php ( 23.51 KB )
  137. /www/wwwroot/daohw.cn/app/controller/front/ArticleTrait.php ( 17.13 KB )
  138. /www/wwwroot/daohw.cn/app/controller/front/SponsorTrait.php ( 14.59 KB )
  139. /www/wwwroot/daohw.cn/app/controller/front/ApplyTrait.php ( 12.21 KB )
  140. /www/wwwroot/daohw.cn/app/controller/front/ToolTrait.php ( 12.58 KB )
  141. /www/wwwroot/daohw.cn/app/controller/front/DyTrait.php ( 14.19 KB )
  142. /www/wwwroot/daohw.cn/app/controller/front/SecretTrait.php ( 2.17 KB )
  143. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  144. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.73 KB )
  145. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 53.74 KB )
  146. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  147. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  148. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  149. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.07 KB )
  150. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  151. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.97 KB )
  152. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  153. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  154. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  155. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  156. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  157. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  158. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  159. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  160. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  161. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  162. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 6.10 KB )
  163. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  164. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  165. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  166. /www/wwwroot/daohw.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  167. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/facade/Cache.php ( 2.06 KB )
  168. /www/wwwroot/daohw.cn/vendor/topthink/think-orm/src/db/Raw.php ( 1.30 KB )
  169. /www/wwwroot/daohw.cn/app/utils/IpUtils.php ( 5.41 KB )
  170. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Response.php ( 9.07 KB )
  171. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  172. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  173. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  174. /www/wwwroot/daohw.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  175. /www/wwwroot/daohw.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  176. /www/wwwroot/daohw.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  177. /www/wwwroot/daohw.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  178. /www/wwwroot/daohw.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  179. /www/wwwroot/daohw.cn/vendor/topthink/think-template/src/template/taglib/Cx.php ( 24.23 KB )
  180. /www/wwwroot/daohw.cn/vendor/topthink/think-template/src/template/TagLib.php ( 12.11 KB )
  181. /www/wwwroot/daohw.cn/runtime/temp/f49a314407b30ac1d0ec59c0923ea738.php ( 118.18 KB )
  182. /www/wwwroot/daohw.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000592s ] mysql:host=127.0.0.1;port=3306;dbname=daohw_cn;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `nav_devlog` [ RunTime:0.001735s ]
  3. SELECT * FROM `nav_devlog` WHERE `status` = 1 ORDER BY `day` ASC,`id` ASC [ RunTime:0.000662s ]
  4. SHOW FULL COLUMNS FROM `nav_devphase` [ RunTime:0.000917s ]
  5. SELECT * FROM `nav_devphase` WHERE `status` = 1 ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000270s ]
  6. SHOW FULL COLUMNS FROM `nav_setting` [ RunTime:0.000786s ]
  7. SELECT * FROM `nav_setting` [ RunTime:0.000447s ]
  8. SHOW FULL COLUMNS FROM `nav_category` [ RunTime:0.000959s ]
  9. SELECT * FROM `nav_category` WHERE `status` = 1 ORDER BY `sort` DESC,`id` ASC [ RunTime:0.000236s ]
  10. SHOW FULL COLUMNS FROM `nav_site` [ RunTime:0.001204s ]
  11. SELECT `hide_code` FROM `nav_site` LIMIT 1 [ RunTime:0.001153s ]
  12. SELECT category_id, COUNT(*) AS n FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' GROUP BY `category_id` [ RunTime:0.001384s ]
  13. SELECT SUM(`views`) AS think_sum FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' [ RunTime:0.000542s ]
  14. SHOW FULL COLUMNS FROM `nav_article` [ RunTime:0.000841s ]
  15. SELECT SUM(`views`) AS think_sum FROM `nav_article` WHERE `status` = 1 [ RunTime:0.000227s ]
  16. SELECT SUM(`likes`) AS think_sum FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' [ RunTime:0.000475s ]
  17. SHOW FULL COLUMNS FROM `nav_category_tag` [ RunTime:0.000822s ]
  18. SELECT COUNT(*) AS think_count FROM `nav_category_tag` WHERE `status` = 1 [ RunTime:0.000210s ]
  19. SHOW FULL COLUMNS FROM `nav_user` [ RunTime:0.000816s ]
  20. SELECT COUNT(*) AS think_count FROM `nav_user` [ RunTime:0.000178s ]
  21. SELECT SUM(`views_today`) AS think_sum FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' AND `views_date` = 1794412800 [ RunTime:0.000444s ]
  22. SELECT * FROM `nav_category_tag` WHERE `status` = 1 ORDER BY `sort` DESC,`id` ASC [ RunTime:0.000288s ]
  23. SELECT tag_id, COUNT(*) AS n FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' GROUP BY `tag_id` [ RunTime:0.000777s ]
  24. SELECT * FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' AND `views_date` = 1794412800 AND `views_today` > 0 ORDER BY `views_today` DESC,`id` DESC LIMIT 8 [ RunTime:0.000475s ]
  25. SHOW FULL COLUMNS FROM `nav_like_log` [ RunTime:0.000798s ]
  26. SELECT `target_id` FROM `nav_like_log` WHERE `type` = 'site' AND `ip` = '216.73.216.251' [ RunTime:0.000249s ]
  27. SELECT * FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' AND `views_wkey` = '202646' AND `views_week` > 0 ORDER BY `views_week` DESC,`id` DESC LIMIT 8 [ RunTime:0.000428s ]
  28. SELECT * FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' AND `views_mkey` = '202611' AND `views_month` > 0 ORDER BY `views_month` DESC,`id` DESC LIMIT 8 [ RunTime:0.003560s ]
  29. SELECT * FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' ORDER BY `views` DESC,`id` DESC LIMIT 8 [ RunTime:0.000668s ]
  30. SHOW FULL COLUMNS FROM `nav_ad` [ RunTime:0.000960s ]
  31. SELECT * FROM `nav_ad` WHERE `status` = 2 AND `position` = 'home_banner' AND `start_time` <= 1794478233 AND `end_time` >= 1794478233 ORDER BY `sort` DESC,`id` DESC LIMIT 20 [ RunTime:0.000370s ]
  32. SHOW FULL COLUMNS FROM `nav_notice` [ RunTime:0.000826s ]
  33. SELECT * FROM `nav_notice` WHERE `status` = 1 ORDER BY `sort` DESC,`id` DESC LIMIT 8 [ RunTime:0.000230s ]
  34. SHOW FULL COLUMNS FROM `nav_qlink` [ RunTime:0.002534s ]
  35. SELECT * FROM `nav_qlink` WHERE `status` = 1 ORDER BY `sort` ASC,`id` ASC LIMIT 16 [ RunTime:0.000253s ]
  36. SHOW FULL COLUMNS FROM `nav_qlink_item` [ RunTime:0.000774s ]
  37. SELECT * FROM `nav_qlink_item` WHERE `qlink_id` IN (3,4) [ RunTime:0.000253s ]
  38. SELECT `id` FROM `nav_site` WHERE `status` = 1 AND `id` IN (1082,1187,865,941,988,774,773,771,776,778,790,1011,1016,1017,763,594) AND `hide_code` = '' [ RunTime:0.000276s ]
  39. SELECT `id` FROM `nav_article` WHERE `status` = 1 AND `id` IN (4,1,3,7,2,5,6) [ RunTime:0.000312s ]
  40. SHOW FULL COLUMNS FROM `nav_home_block` [ RunTime:0.001386s ]
  41. SELECT * FROM `nav_home_block` WHERE `status` = 1 ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000310s ]
  42. SHOW FULL COLUMNS FROM `nav_home_pic` [ RunTime:0.000864s ]
  43. SELECT * FROM `nav_home_pic` WHERE `block_id` = 4 AND `status` = 1 ORDER BY `weight` DESC,`sort` ASC,`id` ASC LIMIT 3 [ RunTime:0.000293s ]
  44. SELECT * FROM `nav_site` WHERE `id` = 759 AND `status` = 1 AND `hide_code` = '' LIMIT 1 [ RunTime:0.000282s ]
  45. SELECT * FROM `nav_article` WHERE `id` = 17 AND `status` = 1 LIMIT 1 [ RunTime:0.000244s ]
  46. SELECT * FROM `nav_category` WHERE `id` = 1 AND `status` = 1 LIMIT 1 [ RunTime:0.000173s ]
  47. SELECT COUNT(*) AS think_count FROM `nav_site` WHERE `status` = 1 AND `category_id` = 1 AND `hide_code` = '' [ RunTime:0.000327s ]
  48. SELECT * FROM `nav_site` WHERE `status` = 1 AND `category_id` = 1 AND `hide_code` = '' ORDER BY `views` DESC,`id` DESC LIMIT 1 [ RunTime:0.001873s ]
  49. SELECT * FROM `nav_home_pic` WHERE `block_id` = 5 AND `status` = 1 ORDER BY `weight` DESC,`sort` ASC,`id` ASC LIMIT 3 [ RunTime:0.000270s ]
  50. SELECT * FROM `nav_site` WHERE `id` = 996 AND `status` = 1 AND `hide_code` = '' LIMIT 1 [ RunTime:0.000238s ]
  51. SELECT * FROM `nav_site` WHERE `id` = 1149 AND `status` = 1 AND `hide_code` = '' LIMIT 1 [ RunTime:0.000241s ]
  52. SELECT * FROM `nav_home_block` ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000233s ]
  53. SHOW FULL COLUMNS FROM `nav_home_module` [ RunTime:0.000771s ]
  54. SELECT * FROM `nav_home_module` WHERE `zone` = 'rail' ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000217s ]
  55. SELECT * FROM `nav_home_block` ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000220s ]
  56. SELECT * FROM `nav_home_module` WHERE `zone` = 'rail' ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000181s ]
  57. SHOW FULL COLUMNS FROM `nav_link` [ RunTime:0.000754s ]
  58. SELECT * FROM `nav_link` WHERE `status` = 1 AND `position` = 'top' ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000236s ]
  59. SELECT * FROM `nav_link` WHERE `status` = 1 AND `position` = 'foot' ORDER BY `sort` ASC,`id` ASC [ RunTime:0.000272s ]
  60. SHOW FULL COLUMNS FROM `nav_dock` [ RunTime:0.000781s ]
  61. SELECT * FROM `nav_dock` WHERE `status` = 1 ORDER BY `sort` ASC,`id` ASC LIMIT 12 [ RunTime:0.000225s ]
  62. SELECT * FROM `nav_category_tag` WHERE `status` = 1 ORDER BY `sort` DESC,`id` ASC [ RunTime:0.000270s ]
  63. SELECT tag_id, COUNT(*) AS n FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' GROUP BY `tag_id` [ RunTime:0.000858s ]
  64. SELECT * FROM `nav_site` WHERE `status` = 1 AND `id` = 96 AND `hide_code` = '' [ RunTime:0.000243s ]
  65. SHOW FULL COLUMNS FROM `nav_article_cat` [ RunTime:0.000689s ]
  66. SELECT * FROM `nav_article_cat` WHERE `status` = 1 ORDER BY `sort` DESC,`id` ASC [ RunTime:0.000185s ]
  67. SHOW FULL COLUMNS FROM `nav_sponsor` [ RunTime:0.000699s ]
  68. SELECT * FROM `nav_sponsor` WHERE `status` = 1 ORDER BY `amount` DESC,`id` ASC LIMIT 8 [ RunTime:0.000319s ]
  69. SELECT * FROM `nav_site` WHERE `id` IN (208,97,69,152,41,124,207) [ RunTime:0.002782s ]
  70. SELECT COUNT(*) AS think_count FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' [ RunTime:0.000997s ]
  71. SELECT COUNT(*) AS think_count FROM `nav_article` WHERE `status` = 1 [ RunTime:0.000322s ]
  72. SELECT COUNT(*) AS think_count FROM `nav_notice` WHERE `status` = 1 [ RunTime:0.000184s ]
  73. SELECT COUNT(*) AS think_count FROM `nav_sponsor` WHERE `status` = 1 [ RunTime:0.000279s ]
  74. SELECT COUNT(*) AS think_count FROM `nav_site` WHERE `status` = 1 AND `hide_code` = '' AND `create_time` >= 1794412800 [ RunTime:0.000222s ]
0.188093s