













注意:这是一款通过AI完成的网址导航程序,不是作者自己动手编写开发的,作者也只是提供开发思路。
一个基于原生 PHP 开发的轻量级网址导航站。
零第三方依赖 —— 不引入任何 Composer 包、不用任何第三方 CSS/JS 框架,全部代码自行实现;同时支持 MySQL / SQLite 双数据库驱动,下载即用。
前台提供分类导航、多引擎搜索、热门排行、站点详情与搜索引擎权重查询;后台提供分类 / 网址 / 公告 / 系统设置的完整管理,以及投稿审核、数据导入导出、模板切换等运营能力。
bootstrap.php 中的 XM_VERSION)| 模块 | 能力 |
|---|---|
| 导航展示 | 分类聚合、图标展示、站点描述、点击量统计、热门 TOP 排行、最新收录、推荐位 |
| 搜索聚合 | 站内搜索 + 百度 / 搜狗 / 必应 / 360 / 神马 / 头条 / 谷歌 七引擎一键切换 |
| 站点详情 | 站点信息、网站截图、相关推荐、搜索引擎权重与收录量查询(百度 / 360 / 搜狗 / 神马 / 必应 / 头条 / 谷歌) |
| 信息自动抓取 | 输入网址一键抓取标题 / 描述 / favicon / Logo(含 SSRF 白名单防护、512KB 体积上限、字符集自动转码) |
| 图标三来源 | 自动抓取、手动填 URL、本地上传,三者共用同一套选择器组件 |
| 前台投稿 | 访客自助提交网址,蜜罐反机器人 + 回链自动检测 + 待审核队列 |
| 权重接口适配 | 任意第三方权重 API 可通过「接口地址 + 字段映射」接入,无需改代码;内置 apihz / chinaz / nxvav 三套一键预设 |
| 数据管理 | CSV / JSON 导入导出(含字段映射与导入报告) |
| 模板系统 | 前台 / 后台皮肤可切换,视图解析走 Skin::resolve() |
| 多用户与安全 | 管理员会话、CSRF 令牌、IP 维度服务端限流、参数化 SQL、全站输出转义 |
| 项 | 说明 |
|---|---|
| 语言 | PHP(declare(strict_types=1),要求 7.4+) |
| 架构 | 原生 MVC 简化实现,无框架 |
| 命名空间 | xm\core\*(基础层)、xm\app\model\*(模型层) |
| 自动加载 | bootstrap.php 内注册的 PSR-4 简化自动加载器(含目录穿越防护) |
| 数据库 | PDO 封装(xm\core\Db),支持 MySQL / SQLite,表前缀可配 |
| 前端 | 原生 HTML / CSS / JavaScript,无任何框架;脚本按页面拆分为独立文件 |
| 依赖 | 零 Composer 包、零第三方 CDN 资源,可完全离线部署 |
项目约定:
views/**,由 Skin::resolve() 按区域(frontend / admin)解析。?v=XM_VERSION 破缓存,修改 assets/ 下任意 css/js 后必须手动递增 XM_VERSION。<img> 必须声明 loading="lazy" decoding="async";图片容器需有固定尺寸或 aspect-ratio,避免布局跳动。t.cc/
├── index.php 前台首页 / 公告列表 / 分类页(按 p / c / s / e / page 参数分流)
├── submit.php 前台投稿表单
├── detail.php 站点详情页(含权重查询面板)
├── go.php 出站跳转(点击计数 + 白名单校验)
├── fetchmeta.php 公开接口:抓取目标站标题/描述/图标
├── upload.php 公开接口:图标上传
├── weight.php 公开接口:搜索引擎权重查询
├── install.php 安装向导(首次部署用)
├── bootstrap.php 引导文件:常量、自动加载、配置、会话、数据库初始化
├── config.php 站点配置(数据库、调试、时区、站点 key)
│
├── core/ 基础层
│ ├── Db.php PDO 封装(查询构造、事务、表名引用)
│ ├── Auth.php 管理员认证(bcrypt 哈希、会话、口令修改)
│ ├── Csrf.php CSRF 令牌生成与校验
│ ├── RateLimiter.php IP 维度服务端限流(落盘 + 原子写 + 故障放行)
│ ├── Skin.php 模板解析与皮肤管理
│ └── Util.php 工具集(转义、输入、URL、图标、分页、IP 等)
│
├── app/model/ 模型层
│ ├── Base.php 模型基类(增删改查、分页、排序、条件构造)
│ ├── Link.php 网址(前台查询、投稿、审核、点击、搜索)
│ ├── Category.php 分类(含合并、级联删除)
│ ├── Notice.php 公告
│ ├── Setting.php 系统设置(KV 表 + 分组 + 类型 + 默认值)
│ ├── Schema.php 建表 / 种子数据 / 幂等升级
│ ├── SiteMeta.php 外站信息抓取(SSRF 防护、HTML 解析)
│ ├── WeightQuery.php 搜索权重查询(三数据源 + 自定义适配 + 缓存)
│ ├── BacklinkChecker.php 友链回链自动检测
│ ├── IconUploader.php 图标上传校验与落盘
│ ├── Importer.php 数据导入(CSV / JSON)
│ └── Exporter.php 数据导出
│
├── admin/ 后台
│ ├── index.php 后台页面路由(dashboard/categories/links/reviews/notices/settings/...)
│ └── api.php 后台统一 AJAX 接口(POST + 登录态 + CSRF)
│
├── views/ 视图模板
│ ├── layout/ 前台公共头尾(header / footer)
│ ├── admin/ 后台各页面模板 + layout
│ ├── home.php 首页
│ └── notices.php 公告列表
│
├── assets/ 前端资源
│ ├── style.css 前台样式(CSS 变量 + 深色模式)
│ ├── app.js 前台公共脚本
│ ├── submit.js 投稿页脚本(抓取、图标选择、校验)
│ ├── detail.js 详情页脚本(权重查询)
│ ├── admin.css 后台样式(含弹窗、响应式)
│ ├── admin.js 后台脚本(弹窗、表单、接口调用)
│ └── lazyload.js 图片懒加载兜底(老浏览器)
│
├── data/ 运行时数据(缓存、证书、导出临时文件)
│ ├── cacert.pem CA 根证书包(HTTPS 校验用)
│ ├── meta_*.dat 抓取结果缓存
│ ├── weight_*.dat 权重查询缓存
│ └── rate_*.dat 限流计数
│
└── uploads/ 上传文件(图标等,需可外链访问)
└── icons/YYYYmm/ 按月归档的图标系统共 5 张表,全部通过 Schema::create() 建立,Schema::upgrade() 在每次请求时幂等补齐增量字段(老库可平滑升级,无需手工改表)。
| 表 | 用途 | 关键字段 |
|---|---|---|
admins | 管理员账号 | username、password(bcrypt)、last_login_at、last_login_ip |
categories | 网址分类 | name、slug(唯一)、icon、remark、sort_order、status |
links | 网址条目 | category_id、title、url、description、icon、hits、is_recommend、status、submitter、review_note、backlink_pass |
notices | 站点公告 | title、content、type、is_top、status、sort_order |
settings | 系统设置(KV) | k(唯一)、v、group_name |
settings为键值表,扩展设置项不需要改表结构 —— 在Setting::DEFAULTS追加一行并在Setting::GROUPS登记分组即可,后台设置页会自动渲染。
未保存过的设置项不落库,读取时回落到默认值。
| 页面 / 入口 | 说明 |
|---|---|
首页 index.php | 分类导航主体 + 搜索横幅 + 侧栏(热门 TOP10、最新收录、公告) |
分类页 index.php?c={slug} | 单分类下的网址列表,支持排序与分页 |
搜索 index.php?s={关键词} | 站内搜索,带高亮与结果计数 |
公告列表 index.php?p=notices | 公告分页浏览 |
投稿 submit.php | 访客提交网址(可开关),支持一键抓取站点信息、三种图标来源 |
详情 detail.php?id={id} | 站点信息、截图、相关推荐、权重查询面板 |
跳转 go.php?id={id} | 出站跳转,累加点击量、记录最后点击时间 |
搜索聚合:七种搜索引擎可切换,用户选择会带参数透传,站内搜索与外部引擎搜索在同一输入框完成。
权重查询(详情页):展示各搜索引擎的权重等级(BR)、收录量与预估流量。支持三种数据源 —— 站长之家、接口盒子、自定义接口,可配置自动或手动触发,查询结果带缓存(默认 6 小时),失败时回退旧缓存并进入冷却期,避免反复打第三方接口。
信息自动抓取:输入网址后点击「自动获取」,服务端抓取目标站点的 <title>、description、favicon、og:image 并回填表单。前台投稿场景只填空字段、不覆盖用户手填内容;后台编辑场景直接覆盖(意图是刷新)。触发时机完全由按钮控制,失焦 / 回车均不触发。
后台入口 admin/index.php,所有 AJAX 请求统一走后端接口(POST + 登录态 + CSRF 校验,响应结构 {code, msg, data})。
| 页面 | 功能 |
|---|---|
| 仪表盘 | 分类数 / 网址数 / 待审数 / 点击量概览 |
| 分类管理 | 新增、编辑、排序、启停、合并、级联删除(含关联网址) |
| 网址管理 | 新增、编辑、删除、排序、启停、推荐、批量操作、审核通过 / 驳回、自动获取站点信息 |
| 投稿审核 | 待审队列,查看投稿人、回链检测结果,一键通过或驳回并填写备注 |
| 公告管理 | 发布、编辑、置顶、启停 |
| 系统设置 | 按分组管理的全部配置项(站点 / 首页 / SEO / 列表 / 皮肤 / 投稿 / 权重 / 自定义接口) |
| 数据导入 | CSV / JSON 导入,支持字段映射,返回导入报告(插入 / 更新 / 跳过 / 失败) |
| 数据导出 | 导出全站数据,生成带 token 的临时下载文件(自动过期清理) |
| 模板切换 | 前台 / 后台皮肤选择 |
| 修改密码 | 更新管理员口令(改后强制重新登录) |
自定义权重接口:在「自定义权重接口」设置组填写接口地址(支持 {domain} 占位)、请求方式、附加参数与请求头、成功判定条件、数据根路径、字段映射(每行 统一字段=返回字段路径,支持 list[0].Br 这类嵌套路径)。配置完成后可在后台直接做接口连通性测试,返回逐源明细与字段命中情况,不写缓存。
config.php 返回一个数组,主要键:
| 键 | 说明 |
|---|---|
debug | 调试模式,开启后显示全部错误(生产环境请关闭) |
timezone | 时区,默认 Asia/Shanghai |
key | 站点密钥,用于令牌派生 |
db.driver | mysql 或 sqlite |
db.dsn | PDO 连接串(MySQL 形如 mysql:host=...;port=...;dbname=...) |
db.user / db.pass | 数据库账号 |
站点名称、LOGO、备案号、SEO、列表条数、投稿开关、权重查询参数等运营配置不在config.php,而是存在数据库settings表中,登录后台「系统设置」即可修改。
若 config.php 不存在,前台会自动跳转到 install.php 安装向导。
| 层面 | 措施 |
|---|---|
| SQL | 全量参数化查询,表名 / 字段名走白名单,LIKE 通配符转义 |
| XSS | 输出统一经 Util::e() 转义;前端动态渲染做实体编码,杜绝对不可信数据直接 innerHTML |
| CSRF | 后台全部写操作校验令牌(支持表单字段与请求头两种传递) |
| 会话 | Cookie 设置 HttpOnly + SameSite=Lax,HTTPS 下自动加 Secure |
| 限流 | RateLimiter 按 IP 维度服务端计数并落盘(抓取 / 上传 / 权重 / 登录四处),不依赖 $_SESSION |
| SSRF | 外站抓取前校验协议白名单与端口白名单,同时校验 A 与 AAAA 记录,拒绝内网 / 保留地址;禁用自动重定向,改为手动逐跳并在每一跳前重新校验 |
| 上传 | 仅允许图片类型(getimagesize 判定),排除 SVG,限制体积,按年月归档 |
| HTTPS | 调用第三方接口时校验 CA 根证书(data/cacert.pem),不使用 VERIFYPEER=false 绕过 |
| 部署 | nginx 侧封锁运行时目录(data/、.workbuddy/、点文件)、限制上传目录仅静态访问且脚本 404、拦截归档类扩展名 |
环境要求
pdo_mysql(或 pdo_sqlite)、mbstring、curl、openssl部署步骤
data/、uploads/ 可写。install.php 向导填写数据库信息并创建管理员账号。install.php,防止被重复执行。性能与缓存
assets/ 设置较长过期时间。| 项 | 值 |
|---|---|
| 版本常量 | XM_VERSION(位于 bootstrap.php) |
| 会话名 | xmnav_sid |
| 数据库表 | admins / categories / links / notices / settings |
| 命名空间 | xm\core\*、xm\app\model\* |
| 后台接口 | admin/api.php,参数 a={动作名},如 a=link.save |
| 后台响应结构 | {code, msg, data} |
改代码时的注意事项
assets/ 下的任何 CSS / JS 后,必须递增 XM_VERSION,否则浏览器会继续使用旧缓存。Setting::DEFAULTS 与 Setting::GROUPS,无需改动数据库结构。Schema::upgrade() 中用 addColumnIfMissing() 追加,保证老库可平滑升级。官方网站:http://5201317.xyz
演示截图:











此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。