OneNav

使用PHP开发的书签管理程序,免费开源。

介绍

OneNav是一款使用PHP + SQLite 3开发的导航/书签管理系统,风格简约,使用方便。

img

img

img

img

功能特点

项目地址

技术支持

打赏支持

安装

环境要求

常规安装

  1. 访问项目地址:https://github.com/helloxz/onenav/releases 下载最新版本并解压到站点根目录

  2. config.simple.php复制为data/config.php并填写自己的站点信息

  3. 访问后台:http://IP/index.php?c=login或点击页面右上角

宝塔面板安装

OneNav已上架宝塔商店,通过宝塔后台 - 软件商店 - 一键部署 - 搜索onenav,并点击一键部署。(上架宝塔需要人工审核,可能导致宝塔一键部署不是最新版本)

img

输入域名,并选择支持的PHP版本进行提交。

img

正常情况会看到如下界面,数据库、用户名、密码创建失败不需要理会,OneNav没有使用MySQL数据。

img

将您的域名解析到服务器IP,解析生效后访问测试,会看到如下界面。

img

根据提示将站点根目录下的config.simple.php复制为data/config.php,然后再次访问即可完成安装。

img

Docker安装

docker run -itd --name="onenav" -p 80:80 \
    -e USER='xiaoz' -e PASSWORD='xiaoz.me' \
    -v /data/onenav:/data/wwwroot/default/data \
    helloz/onenav

群晖使用Docker安装

在注册表中搜索 onenav ,选择第一个 onenav,版本选择 latest。

img

在 docker 文件夹中,创建一个新文件夹,并将其命名为 onenav

文件夹 装载路径 说明
docker/onenav /data/wwwroot/default/data 存放onenav数据

img

端口不冲突就行,这里用了 9680

本地端口 容器端口
9680 80

img

设置用户名、密码

img

保存并运行,在浏览器中输入 http://群晖IP:9680,就可以看到主界面了

详细说明可参考这篇文章:简单好用的书签管理器OneNav

配置文件说明

配置文件位于站点根目录下的config.php,文件有相关注释说明,首次使用请务必修改里面的账号/密码信息。

以下信息务必修改:

//用户名
define('USER','xiaoz');
//密码
define('PASSWORD','xiaoz.me');
//token参数,API需要使用
define('TOKEN','xiaoz.me');

站点信息配置项:

//站点标题
$site_setting['title']          =   'OneNav';
//站点关键词
$site_setting['keywords']       =   'OneNav,简洁导航,云链接,个人书签';
//站点描述
$site_setting['description']    =   '';

安全设置

如果您使用得Nginx,请务必将以下规则添加到站点配置中,否则数据库可能被下载(非常危险):

#安全设置
location ~* ^/(class|controller|db|data|functions|templates)/.*.(db3|php|php5)$ {
    return 403;
}
location /db {
        deny all;
}

#伪静态
rewrite ^/click/(.*) /index.php?c=click&id=$1 break;
rewrite ^/api/(.*)?(.*) /index.php?c=api&method=$1&$2 break;
rewrite /login /index.php?c=login break;

如果使用得Apache则无需设置,已内置.htaccess进行屏蔽。

用户名密码是多少?

默认用户名为xiaoz密码为xiaoz.me,请通过config.php自行修改。

使用说明

OneNav使用说明

使用说明

入门

后台使用

后台登录地址为:http://domain.com/index.php?c=login

或者点击首页顶部按钮。

img

添加分类

点击导航菜单 - 添加分类进行操作,下方演示添加一个“测试分类”如下截图。

img

分类名称图标设置

分类名称支持Font Awesome 4图标,可前往:https://fontawesome.dashgame.com/ 选择喜欢的图标。试试将分类名称设置为:

<i class="fa fa-html5"></i> 站长工具

然后访问前台首页看看效果如何。

添加链接

点击导航菜单 - 添加链接进行操作,如下图。

img

前台说明

私有分类后面会显示一把小绿锁,并且该分类及下面的链接对访客不可见。

img

如果是私有链接,底部会有一条橙色线条,且该链接对访客不可见。

img

快速添加链接

如果您使用的默认主题,并以管理员身份登录后,右下角会出现“+”按钮,点击可快速添加链接。

img

右键菜单(快速编辑)

鼠标移动到某个链接上面,并单击鼠标右键,即可弹出右键菜单,可快速编辑、删除、显示二维码,复制原始链接等操作。(仅默认主题支持)

img

切换主题

OneNav主题目录位于templates,默认内置了2套风格。

img

可通过修改config.php进行切换,比如将主题切换为webstack,只需将config.php内容修改为:

//主题风格
define('TEMPLATE','webstack');
使用说明

书签导入

0.9.11版本开始,支持将Chrome/FireFox/Edge等浏览器书签导入到OneNav,导入前建议先将数据库(data/onenav.db3)进行备份。

从Google Chrome导入

按快捷键Ctrl + Shift + O打开Chrome书签管理器(或者地址栏输入chrome://bookmarks/),点击右上方三个点的按钮。

img

将书签导出为.html 并记住导出位置,稍后导入需要使用。

img

打开OneNav后台 - 链接管理 - 书签导入 - 选择刚刚导出的.html书签。按照下图顺序进行操作。

img

导入成功后看到如下提示。

img

从Firefox导入

输入快捷键Ctrl + Shift + B打开我的足迹,选择所有书签 - 导出书签到HTML进行保存。

img

然后打开OneNav后台 - 链接管理 - 书签导入 - 选择刚刚导出的.html书签。按照下图顺序进行操作。

img

从Edge导入(chromium)

在浏览器标签页输入edge://favorites/ - 打开收藏夹 - 导出收藏夹。

img

然后打开OneNav后台 - 链接管理 - 书签导入 - 选择刚刚导出的.html书签。按照下图顺序进行操作。

img

补充说明

目前仅支持.html格式导入,Chrome/Firefox/Edge测试通过,理论上支持所有chromium内核浏览器,具体请自行测试,不保障所有浏览器书签均能导入成功,导入前请将数据库进行备份。

为什么会导入失败?

  1. 书签已经存在与数据库中
  2. 书签标题为空字符
  3. 书签链接为空字符
使用说明

uTools插件

OneNav书签提供uTools插件支持,目前还处于测试阶段,暂未提交到uTools插件市场,等测试完毕后正式上线uTools插件市场,有需要尝鲜体验的同学请通过如下方法安装。

安装uTools for OneNav插件

uTools插件市场搜索“onenav”进行安装。(需uTools版本>=2.x)

img

使用

再次呼出uTools,输入其中任意关键词打开OneNav插件。关键词为:"onenav", "one","nav","bookmarks","book"

img

首次打开看到的书签是官方默认的(https://nav.rss.ink),您可以点击右下方设置按钮,设置你自己的OneNav地址:

img

设置如下截图:

img

进阶

您可以在uTools偏好设置中,设置onenav快捷键,比如我这里设置的Shift + B,下次只需要直接输入Shift + B即可打开onenav插件。

img

当onenav插件输入框获得焦点时,按Ctrl + Z可清空关键字。

img

注意

升级 && 更新

查看版本号

打开站点根目录下的version.txt可查看当前版本号。

常规安装方式

v0.9.8及以下版本升级为v0.9.9

自v0.9.9版本开始,为了适配Docker,目录结构有所变更,请按照如下方法升级:

  1. 升级前请务必备份数据(直接打包整个站点即可)

  2. 前往Github:https://github.com/helloxz/onenav/releases 下载对应版本解压覆盖

  3. 将站点根目录下已经存在的config.php移动到data目录下

  4. db/onenav.db3移动到data目录下

  5. config.php里面的'database_file' => 'db/onenav.db3'修改为'database_file' => 'data/onenav.db3'简而言之就是db目录修改为data目录

  6. 对照安全设置中伪静态规则是否一致

Docker安装方式

v0.9.11 -> v0.9.12

#停止运行中的容器
docker stop onenav
#更新镜像
docker pull helloz/onenav
#重新启动一个容器
docker run -itd --name="onenav" -p 80:80 \
    -e USER='xiaoz' -e PASSWORD='xiaoz.me' \
    -v /data/onenav:/data/wwwroot/default/data \
    helloz/onenav

API

OneNav API使用说明。

API

Token生成

通过API创建、修改、删除分类/链接时必须传递token参数,下面介绍如何拼接计算token

首先找到config.php中,USERTOKEN两个参数,比如:

//用户名
define('USER','xiaoz');
//token参数,API需要使用
define('TOKEN','xiaoz.me');

计算方法为:USER + TOKEN,再进行md5加密,上面的示例PHP代码为:

md5('xiaozxiaoz.me');
API

创建分类目录

接口说明

请求参数

参数名称 示例值 类型 是否必须 说明
token 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成
name 测试分类 string 分类名称
weight 0 int(1) 分类权重,取值0-99
property 0 int(1) 是否私有,0:公开(默认),1:私有
description string 分类描述

请求成功响应

{
	"code": 0,
	"id": 21
}

请求失败响应

{
	"code": -1000,
	"err_msg": "Categorie already exist!"
}
API

修改分类目录

接口说明

请求参数

参数名称 示例值 类型 是否必须 说明
token 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成
id 21 int 分类ID
name 测试分类 string 分类名称
weight 0 int(1) 分类权重,取值0-99
property 0 int(1) 是否私有,0:公开(默认),1:私有
description string 分类描述

请求成功响应

{
	"code": 0,
	"msg": "successful"
}

请求失败响应

{
	"code": -1000,
	"err_msg": "Categorie already exist!"
}
API

删除分类目录

接口说明

请求参数

参数名称 示例值 类型 是否必须 说明
token 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成
id 21 int 分类ID

请求成功响应

{
	"code": 0,
	"msg": "successful"
}

请求失败响应

{
	"code": -1007,
	"err_msg": "The category delete failed!"
}
API

查询分类目录列表

接口说明

请求参数

参数名称 示例值 类型 是否必须 说明
token 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成

请求成功响应

{
	"code": 0,
	"msg": "",
	"count": 6,
	"data": [
		{
			"0": "8",
			"1": "<i class=\"fa fa-external-link\"></i> 常用链接",
			"2": "1607747674",
			"3": "1607865180",
			"4": "99",
			"5": "0",
			"6": "",
			"id": "8",
			"name": "<i class=\"fa fa-external-link\"></i> 常用链接",
			"add_time": "1607747674",
			"up_time": "1607865180",
			"weight": "99",
			"property": "0",
			"description": ""
		},
		{
			"0": "19",
			"1": "<i class=\"fa fa-html5\"></i> 站长工具",
			"2": "1607866471",
			"3": "",
			"4": "80",
			"5": "0",
			"6": "",
			"id": "19",
			"name": "<i class=\"fa fa-html5\"></i> 站长工具",
			"add_time": "1607866471",
			"up_time": "",
			"weight": "80",
			"property": "0",
			"description": ""
		},
		{
			"0": "3",
			"1": "<i class=\"fa fa-linux\"></i> 运维工具",
			"2": "1607699882",
			"3": "1607865657",
			"4": "80",
			"5": "0",
			"6": "",
			"id": "3",
			"name": "<i class=\"fa fa-linux\"></i> 运维工具",
			"add_time": "1607699882",
			"up_time": "1607865657",
			"weight": "80",
			"property": "0",
			"description": ""
		},
		{
			"0": "18",
			"1": "<i class=\"fa fa-video-camera\"></i> 视频影音",
			"2": "1607865982",
			"3": "1607866160",
			"4": "10",
			"5": "0",
			"6": "",
			"id": "18",
			"name": "<i class=\"fa fa-video-camera\"></i> 视频影音",
			"add_time": "1607865982",
			"up_time": "1607866160",
			"weight": "10",
			"property": "0",
			"description": ""
		},
		{
			"0": "4",
			"1": "<i class=\"fa fa-female\"></i> 18+",
			"2": "1607699983",
			"3": "1608046903",
			"4": "0",
			"5": "0",
			"6": "",
			"id": "4",
			"name": "<i class=\"fa fa-female\"></i> 18+",
			"add_time": "1607699983",
			"up_time": "1608046903",
			"weight": "0",
			"property": "0",
			"description": ""
		}
	]
}

请求失败响应

{
	"code": -1000,
	"err_msg": "Categorie already exist!"
}
API

添加链接

接口说明

请求参数

参数名称 示例值 类型 是否必须 说明
token 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成
url https://www.xiaoz.me string(256) 链接地址,需以http://或https://开头
title 小z博客 string 链接标题
fid 1 int 分类ID
weight 0 int(1) 分类权重,取值0-99
property 0 int(1) 是否私有,0:公开(默认),1:私有
description string 分类描述

请求成功响应

{
	"code": 0,
	"id": "35"
}

请求失败响应

{
	"code": -1011,
	"err_msg": "The URL already exists!"
}
API

修改链接

接口说明

请求参数

参数名称 示例值 类型 是否必须 说明
token 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成
id 35 int 链接ID
url https://www.xiaoz.me string(256) 链接地址,需以http://或https://开头
title 小z博客 string 链接标题
fid 1 int 分类ID
weight 0 int(1) 分类权重,取值0-99
property 0 int(1) 是否私有,0:公开(默认),1:私有
description string 分类描述

请求成功响应

{
	"code": 0,
	"msg": "successful"
}

请求失败响应

{
	"code": -1008,
	"err_msg": "The title cannot be empty!"
}
API

删除链接

接口说明

请求参数

参数名称 示例值 类型 是否必须 说明
token 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成
id 21 int 链接ID

请求成功响应

{
	"code": 0,
	"msg": "successful"
}

请求失败响应

{
	"code": -1010,
	"err_msg": "link id not exists!"
}
API

查询链接列表

接口说明

请求参数

参数名称 请求方法 示例值 类型 是否必须 说明
token POST 5c7d0c90cf9e0ce560956179e8e82e7d string(32) 请参考token生成
page GET 1 int 当前页码
limit GET 10 int 每页显示条数

请求成功响应

{
	"code": 0,
	"msg": "",
	"count": 30,
	"data": [
		{
			"0": "34",
			"1": "20",
			"2": "transmission",
			"3": "http://192.168.50.6:32769/transmission/web/",
			"4": "transmission",
			"5": "1608299921",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "0",
			"10": "<i class=\"fa fa-wifi\"></i> LAN",
			"id": "34",
			"fid": "20",
			"title": "transmission",
			"url": "http://192.168.50.6:32769/transmission/web/",
			"description": "transmission",
			"add_time": "1608299921",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "0",
			"category_name": "<i class=\"fa fa-wifi\"></i> LAN"
		},
		{
			"0": "32",
			"1": "19",
			"2": "顶级域名注册商",
			"3": "https://www.icann.org/registrar-reports/accreditation-qualified-list.html",
			"4": "icann认证顶级域名注册商列表。",
			"5": "1608126988",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "1",
			"10": "<i class=\"fa fa-html5\"></i> 站长工具",
			"id": "32",
			"fid": "19",
			"title": "顶级域名注册商",
			"url": "https://www.icann.org/registrar-reports/accreditation-qualified-list.html",
			"description": "icann认证顶级域名注册商列表。",
			"add_time": "1608126988",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "1",
			"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
		},
		{
			"0": "31",
			"1": "3",
			"2": "CSR文件生成工具",
			"3": "https://www.chinassl.net/ssltools/generator-csr.html",
			"4": "免费CSR生成工具,生成CSR工具,在线CSR生产工具,生成ECC CSR工具,ECC证书CSR生成工具,ECC CSR文件生成,Certificate Signing Request Generator tools",
			"5": "1608105958",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "0",
			"10": "<i class=\"fa fa-linux\"></i> 运维工具",
			"id": "31",
			"fid": "3",
			"title": "CSR文件生成工具",
			"url": "https://www.chinassl.net/ssltools/generator-csr.html",
			"description": "免费CSR生成工具,生成CSR工具,在线CSR生产工具,生成ECC CSR工具,ECC证书CSR生成工具,ECC CSR文件生成,Certificate Signing Request Generator tools",
			"add_time": "1608105958",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "0",
			"category_name": "<i class=\"fa fa-linux\"></i> 运维工具"
		},
		{
			"0": "30",
			"1": "4",
			"2": "嘿嘿,不给你看。",
			"3": "https://www.yuque.com/helloz/onenav",
			"4": "此分类是私有链接,你看不到哦。",
			"5": "1608046983",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "20",
			"10": "<i class=\"fa fa-female\"></i> 18+",
			"id": "30",
			"fid": "4",
			"title": "嘿嘿,不给你看。",
			"url": "https://www.yuque.com/helloz/onenav",
			"description": "此分类是私有链接,你看不到哦。",
			"add_time": "1608046983",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "20",
			"category_name": "<i class=\"fa fa-female\"></i> 18+"
		},
		{
			"0": "29",
			"1": "19",
			"2": "在线图片转icon格式",
			"3": "https://app.xunjiepdf.com/img2icon",
			"4": "迅捷在线图片格式转换软件免费版为您免费提供在线图片格式转换,图片转icon,图片转换成icon等免费图片格式转换服务!",
			"5": "1607869485",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "1",
			"10": "<i class=\"fa fa-html5\"></i> 站长工具",
			"id": "29",
			"fid": "19",
			"title": "在线图片转icon格式",
			"url": "https://app.xunjiepdf.com/img2icon",
			"description": "迅捷在线图片格式转换软件免费版为您免费提供在线图片格式转换,图片转icon,图片转换成icon等免费图片格式转换服务!",
			"add_time": "1607869485",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "1",
			"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
		},
		{
			"0": "28",
			"1": "19",
			"2": "在线扒站高级版",
			"3": "https://ishow.fun/",
			"4": "动态网页扒站,免费仿站,扒站工具高级版,在线扒站高级版,手机扒站,在线扒站工具,扒站软件,扒网站工具高级版,仿站工具,网站下载器,单页扒站小工具",
			"5": "1607869040",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "6",
			"10": "<i class=\"fa fa-html5\"></i> 站长工具",
			"id": "28",
			"fid": "19",
			"title": "在线扒站高级版",
			"url": "https://ishow.fun/",
			"description": "动态网页扒站,免费仿站,扒站工具高级版,在线扒站高级版,手机扒站,在线扒站工具,扒站软件,扒网站工具高级版,仿站工具,网站下载器,单页扒站小工具",
			"add_time": "1607869040",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "6",
			"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
		},
		{
			"0": "27",
			"1": "19",
			"2": "NameBeta",
			"3": "https://namebeta.com/",
			"4": "域名比价工具。",
			"5": "1607868954",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "5",
			"10": "<i class=\"fa fa-html5\"></i> 站长工具",
			"id": "27",
			"fid": "19",
			"title": "NameBeta",
			"url": "https://namebeta.com/",
			"description": "域名比价工具。",
			"add_time": "1607868954",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "5",
			"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
		},
		{
			"0": "26",
			"1": "19",
			"2": "哪煮米",
			"3": "https://www.nazhumi.com/",
			"4": "哪煮米是一家专业的域名比价平台,提供超过1500种域名后缀,超过50家全球域名注册商的在线比价,一键选到你满意的注册商",
			"5": "1607868904",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "6",
			"10": "<i class=\"fa fa-html5\"></i> 站长工具",
			"id": "26",
			"fid": "19",
			"title": "哪煮米",
			"url": "https://www.nazhumi.com/",
			"description": "哪煮米是一家专业的域名比价平台,提供超过1500种域名后缀,超过50家全球域名注册商的在线比价,一键选到你满意的注册商",
			"add_time": "1607868904",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "6",
			"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
		},
		{
			"0": "25",
			"1": "19",
			"2": "Domain Availability and Price",
			"3": "https://www.domcomp.com/",
			"4": "Considering to register, renew or transfer a domain? Check domain name availability and compare domain prices for 714 extensions across 38 providers with Domcomp. You can find cheap domains to buy or get the cheapest price for your desired URL name with up-to-date coupon. Lookup and compare now!",
			"5": "1607868880",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "3",
			"10": "<i class=\"fa fa-html5\"></i> 站长工具",
			"id": "25",
			"fid": "19",
			"title": "Domain Availability and Price",
			"url": "https://www.domcomp.com/",
			"description": "Considering to register, renew or transfer a domain? Check domain name availability and compare domain prices for 714 extensions across 38 providers with Domcomp. You can find cheap domains to buy or get the cheapest price for your desired URL name with up-to-date coupon. Lookup and compare now!",
			"add_time": "1607868880",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "3",
			"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
		},
		{
			"0": "24",
			"1": "19",
			"2": "钻磊二级域名分发",
			"3": "https://dns.txizd.cn/",
			"4": "钻磊二级域名分发(dns.txizd.cn)成立于2019-3-2,是一家专门提供二级域名解析分发的平台,域名均免费提供使用,不收取任何费用,提供的域名当中有已备案域名和未备案域名,域名后缀多可自主选择解析,欢迎大家来钻磊域名解析网使用。",
			"5": "1607868853",
			"6": null,
			"7": "0",
			"8": "0",
			"9": "8",
			"10": "<i class=\"fa fa-html5\"></i> 站长工具",
			"id": "24",
			"fid": "19",
			"title": "钻磊二级域名分发",
			"url": "https://dns.txizd.cn/",
			"description": "钻磊二级域名分发(dns.txizd.cn)成立于2019-3-2,是一家专门提供二级域名解析分发的平台,域名均免费提供使用,不收取任何费用,提供的域名当中有已备案域名和未备案域名,域名后缀多可自主选择解析,欢迎大家来钻磊域名解析网使用。",
			"add_time": "1607868853",
			"up_time": null,
			"weight": "0",
			"property": "0",
			"click": "8",
			"category_name": "<i class=\"fa fa-html5\"></i> 站长工具"
		}
	]
}

请求失败响应

{
	"code": -1000,
	"err_msg": "Authorization failure!"
}
API

错误码对照表

所有API请求错误码可参考如下表格进行对照,如有疑问,请反馈。

code err_msg 描述
-1000 Categorie already exist! 分类目录已存在
-1002 Authorization failure! token认证失败
-1003 The category ID cannot be empty! 分类目录ID不能为空
-1004 The category name cannot be empty! 分类目录名不能为空
-1005 The category name already exists! 分类目录名已存在
-1006 The category is not empty and cannot be deleted! 分类目录不为空,无法删除
-1007 The category delete failed! 分类目录删除失败
-1008 The title cannot be empty! 链接标题不能为空
-1009 URL cannot be empty! URL不能为空
-1010 URL is not valid! URL链接不合法
-1011 The URL already exists! URL链接已经存在
-1012 link id not exists! 链接ID不存在