OneNav

OneNav是一款开源免费的书签(导航)管理程序,由xiaoz使用使用PHP + SQLite 3开发,界面简洁,安装简单,使用方便。OneNav可帮助你你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问。

介绍

OneNav是一款开源免费的书签(导航)管理程序,由xiaoz使用使用PHP + SQLite 3开发,界面简洁,安装简单,使用方便。OneNav可帮助你你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问。

img

img

功能特点

项目地址

技术支持

打赏支持

安装

环境要求

常规安装

  1. 访问项目地址:https://github.com/helloxz/onenav/releases 下载最新版本并解压到站点根目录
  2. 访问您的站点首页设置初始用户名、密码

  1. 进行安全设置

备用下载地址:https://git.xiaoz.me/xiaoz/onenav/tags

注意:新手请注意权限问题,否则可能提示权限原因安装失败,宝塔、Oneinstack、lnmp.org的站点用户均为www,可通过ls -l 站点路径查看文件是否是www用户。

宝塔面板安装(版本可能滞后)

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

img

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

img

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

img

将您的域名解析到服务器IP,解析生效后访问测试,会看到如下界面,根据提示完成初始化设置即可。

注意:通过宝塔面板安装的可能版本比较滞后

Docker安装

docker run -itd --name="onenav" -p 80:80 \
    -v /data/onenav:/data/wwwroot/default/data \
    helloz/onenav:0.9.23

docker-compose安装

您也可以选择docker-compose进行安装,将下面的文件保存为docker-compose.yaml

version: '3'
services:
  onenav:
    container_name: onenav
    ports:
      - "3080:80"
    volumes:
      - './data:/data/wwwroot/default/data'
    image: 'helloz/onenav
    restart:
      always

然后运行命令docker-compose up -d进行启动。

群晖使用Docker安装

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

img

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

文件夹 装载路径(固定,不要修改) 说明
docker/onenav /data/wwwroot/default/data 存放onenav数据

img

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

本地端口 容器端口
9680 80

img

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

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

配置文件说明

配置文件位于站点根目录下的data/config.php,用户名、密码保存在这个配置文件中,如果忘记了用户名、密码可以查看这个文件,如果需要重新设置用户名、密码,可以将data/config.php删除,然后重新初始化。

安全设置

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

#安全设置
location ~* ^/(class|controller|db|data|functions|templates)/.*.(db3|php|php5|sql)$ {
    return 403;
}
location ~* ^/(data)/.*.(html)$ {
        deny all;
}
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;

Nginx反向代理

如果您使用的Docker部署,需要通过域名进行访问,您可以通过下面2个方法完成:

  1. 直接将域名解析到您服务器IP,然后访问http://域名:端口进行访问
  2. 如果您不希望带上容器端口,也可以通过Nginx反向代理绑定域名进行访问

Nginx反向代理配置参考:

server {
    listen 80;
    
	#改成你自己的域名
    server_name demo.onenav.top;

    #指定网站日志路径
    #access_log /data/logs/demo.onenav.top_nginx.log xlog;
    charset utf-8,gbk;

	location / {
        proxy_connect_timeout 10;
   		# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
	   	proxy_http_version 1.1;
	   	proxy_set_header Connection "";
	   	#chunked_transfer_encoding off;
        proxy_set_header Host 'demo.onenav.top';
    	#将3080改成你容器的端口
        proxy_pass http://127.0.0.1:3080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

使用说明

OneNav使用说明

使用说明

入门

后台使用

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

或者点击首页顶部按钮。

img

添加分类

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

img

分类名称图标设置

0.9.22及之后的版本

直接选择图标或者搜索图标添加并保存即可。

0.9.21及之前的版本

分类名称支持Font Awesome 4图标,可前往:https://fontawesome.dashgame.com/ 选择喜欢的图标(V4版本)。然后尝试将字体图标设置为:fa fa-book,并访问前台查看效果。

添加链接

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

img

前台说明

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

img

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

img

快速添加链接

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

img

右键菜单(快速编辑)

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

img

使用说明

更换主题

OneNav主题位于templates目录下,如果您不喜欢默认主题,可自行开发或者使用第三方主题。

注意:如果使用的Docker部署,主题位于挂载文件夹的templates目录下

更换主题方法

0.9.18及之后的版本

  1. 下载第三方主题,并解压至templates目录下
  2. 打开OneNav后台 - 系统设置 - 主题设置 - 选择要使用的主题

0.9.18之前的版本

  1. 下载第三方主题,并解压至templates目录下
  2. 0.9.16版本及以后还内置了一套第三方主题baisuTwo

您可以尝试修改data/config.php,将主题设置为baisuTwo,然后访问前台查看效果。

//主题风格
define('TEMPLATE','baisuTwo');

Docker版更换主题

0.9.18之后的版本

  1. 在您的挂载目录下创建一个templates目录,然后将主题解压至此目录
  2. 打开OneNav后台 - 系统设置 - 主题设置 - 选择要使用的主题

0.9.18之前的版本

  1. 在您的挂载目录下创建一个templates目录,然后将主题解压至此目录
  2. 修改config.php设置主题目录名

第三方主题

tushan

感谢@itushan的辛苦开发,为OneNav贡献一套新主题“tushan”,tushan是一款超简约的主题,将所有分类移动到抽屉,界面清爽简洁,适合浏览器主页。

主题下载地址:http://soft.xiaoz.org/source/onenav/themes/tushan.zip

下载后解压到OneNav下的templates目录,然后再OneNav后台 - 系统设置 - 主题设置,找到改主题并启用即可。

演示地址:https://web.png.ink/

baisu

由网友baisu制作,风格简约舒适,支持暗色主题。

界面如下截图:

img

注意:这是一套老版本主题,在新版本中不适用,0.9.16及之后可以使用内置主题baisuTwo

使用说明

书签导入

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. 书签链接为空字符
使用说明

过渡页设置

0.9.18版本开始新增过渡页设置,开启过渡页面后点击链接会跳转到过渡页面,并根据您的设置会等待数秒再跳转到目标地址。

好处于弊端

好处:

  1. 过渡页可方便搜索引擎抓取,利于SEO优化
  2. 可以在过渡页自定义一些内容,比如投放广告

弊端:

  1. 用户使用体验不友好

过渡页设置

进入OneNav后台 - 系统设置 - 过渡页页面进行设置。

各参数含义如下:

高级功能

过渡页高级功能包括过渡页菜单/自定义footer/广告设置,支持HTML代码,需要订阅用户才能使用(非订阅用户请留空),设置参数如下。

过渡页菜单参考代码:

<li class="nav-item">
	<a class="nav-link" href="https://www.xiaoz.me/">小z博客</a>
</li>
<li class="nav-item">
	<a class="nav-link" href="https://www.imgurl.org/">ImgURL免费图床</a>
</li>

自定义footer参考代码:

&copy;2022 Powered by <a href="https://www.xiaoz.me/" title = "小z博客" rel = "nofollow" target = "_blank">xiaoz</a>

自定义广告参考代码:

<a href = "https://www.xiaoz.me" target = "_blank"><img src = "https://img.rss.ink/imgs/2022/06/01/d90d1feb9391fc06.png" /></a>

注意:广告图片宽度需要只要大于730px,效果如下图。

使用说明

站点设置

0.9.18版本开始,站点信息可通过OneNav后台进行设置,不用再修改config.php配置文件来完成。

使用说明

打开OneNav后台 - 系统设置 - 站点设置 - 您可以对网站标题、关键词、描述等信息进行设置。

参数说明

自定义header详细说明

自定义header仅对用户首页和过渡页生效,部分主题可能未适配这个功能,默认主题是支持的。

比如您可以添加百度统计代码,比如:

<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?xxx";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

也或者自定义网站CSS:

<style type="text/css">
			/*链接描述是否显示*/
			
			.site-main .site-list .list .desc {
				/*none:不显示,block:显示*/
				display: none;
			}
		</style>
使用说明

主题设置说明

default(默认主题)

0.9.20可以在“系统设置 - 主题设置 - 找到默认主题 - 参数设置”进行参数设置。

默认主题会看到如下参数:

参数含义如下:


0.9.19如果需要隐藏默认主题的描述,请在“系统设置 - 站点设置 - 自定义header”添加如下CSS内容进行隐藏:

<style type="text/css">
/*隐藏默认主题描述*/
.link-content{
display:none;
}
.link-line{
height:56px;
}
</style>

baisuTwo

0.9.20及之后的版本如果需要显示baisuTwo主题的描述,可以将link_description修改为show


0.9.19如果需要隐藏baisuTwo主题的描述,可以在“系统设置 - 站点设置 - 自定义header”添加如下CSS内容进行隐藏:

<style type="text/css">
/*链接描述是否显示*/
.site-main .site-list .list .desc {
/*none:不显示,block:显示*/
display: none;
}
</style>

5iux

sou

使用说明

使用Chrome浏览器扩展(插件)

OneNav还支持Chrome浏览器扩展(理论上所有Chromium内核的浏览器都支持,比如Edge/傲游浏览器/QQ浏览器/搜狗浏览器/360极速浏览器),通过Chrome浏览器扩展可以快速打开和添加书签。

安装浏览器扩展

前往:Chrome Web Store 进行安装(注意:需要自备梯子),或者商店搜索“onenav”进行安装。

设置API

首先您需要在OneNav后台 - 系统设置 - 获取API,然后点击“生成SecretKey”,再点击“计算Token”,然后将Token复制并记录下来。

打开Chrome浏览器右上角的“扩展程序”图标,将OneNav扩展进行固定。

这时右上方会出现一个蓝色的OneNav(书签)按钮,点击这个按钮,并选择API设置。

填写您的OneNav域名和刚刚得到的Token,并点保存按钮。(注意:OneNav域名末尾不需要/

添加书签

您可以打开任意网址,然后鼠标右键 - 选择添加到OneNav书签,并保存即可。

或者点击右上角OneNav(书签)图标,然后选择添加链接按钮。

常见问题

设置API后书签不显示?

  1. 确保您的OneNav域名可以正常访问
  2. 设置API后可尝试点击刷新数据
  3. 检查域名或者Token是否设置错误

添加链接后没有显示书签? 为了减少网络请求,提高加载速度,数据会缓存到浏览器本地存储,如果添加后书签未能显示,可尝试点击“刷新数据按钮”

添加链接的时候所属分类是空的?

  1. 请检查API设置是否正确
  2. 尝试点击“刷新数据”试试

使用说明

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

注意

使用说明

重置密码

如果您不幸忘记OneNav或者需要重新设置密码,可通过以下方法完成。

查看当前用户名、密码

找到站点目录下的data/config.php,找到如下字段就是用户名、密码。

//用户名
define('USER','xiaoz');
//密码
define('PASSWORD','xiaoz.me');

修改密码

此方法全版本通用,找到站点目录下的data/config.php,修改如下字段即可:

//用户名
define('USER','xiaoz');
//密码
define('PASSWORD','xiaoz.me');

如果您的OneNav版本大于或等于0.9.19也可以直接删除data/config.php,然后重新访问站点首页会要求重新设置账号、密码。(推荐新手使用此方法

升级 && 更新

查看版本号

打开站点根目录下的version.txt可查看当前版本号,或者登录后台可以看到。

一键更新(推荐)

订阅用户请在OneNav后台 - 系统设置 - 订阅 & 更新 - 立即更新即可。

备注:此方法适用所有安装方式,包括Docker安装的也可以使用此方法更新。

还未订阅的用户可前往:https://shop.xiaoz.top/productinfo-101.html 购买订阅服务。

注意:Docker用户不要混用更新方式,比如:

  1. 不要部分版本一键更新,部分版本修改tag更新,这样会造成版本混乱和冲突
  2. 要么后续版本全部一键更新,要么后续版本全部修改tag标签更新

常规安装方式更新(手动)

v0.9.19-0.9.22升级到v0.9.23

备份整个站点,下载最新版源码覆盖升级。

v0.9.18升级到v0.9.19

备份整个站点,下载最新版源码覆盖升级。然后访问一次后台升级数据库即可。

v0.9.9-v0.9.17升级到v0.9.18

备份整个站点,下载最新版源码覆盖升级。

  1. 升级完毕后访问下后台:https://你的域名/index.php?c=admin等待数据库自动升级完毕
  2. 打开OneNav后台 - 站点设置 - 填写您的站点信息。参考站点设置
  3. 打开OneNav后台 - 主题设置 - 选择你要使用的主题

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 rm onenav
#重新启动一个容器
docker run -itd --name="onenav" -p 80:80 \
    -v /data/onenav:/data/wwwroot/default/data \
    helloz/onenav

其它说明

在线更新失败?

如果提示权限问题写入失败,请检查目录权限,通常不建议直接通过命令行的root直接操作,否则很容易出现权限问题,如果出现权限问题,您可以通过以下方式解决。

Oneinstack用户/LNMP用户:

如果您使用的Oneinstack集成环境或lnmp.org集成环境,请在命令行执行:

chown -R www:www /您的站点路径

宝塔用户:

通过文件管理,进入您的站点 - 勾选全部文件 - 点右上角权限 - 然后点下确定即可,如下图。


如果提示超时,通常是网络原因,可以刷新页面再次点更新按钮进行尝试。


如果是其它报错,请联系QQ:446199062进行反馈,并提供页面上的更新日志。

变更说明

此页面针对新版本发布时一些特殊变更说明,请务必仔细阅读。

0.9.20

参考:OneNav书签管理程序0.9.20更新,文末有彩蛋

0.9.19

参考:OneNav书签管理程序0.9.19更新,二级分类她来了

0.9.18

参考:OneNav书签管理程序0.9.18更新,站点信息、主题、过渡页面可直接通过后台设置

0.9.16

更新内容

变更说明

数据库更新功能: 用户登录后台首页时会检测数据库是否存在更新,其它后台页面不做检测,通常用户无需关注,除非提示有更新失败的情况。

用户更新到0.9.16时,请务必多刷新几次后台首页,确保所有SQL完全更新,直到日志提示无可用更新。

添加分类图标时,0.9.16字体图标已经分离,对原有字体图标做了兼容性显示处理。

但是针对新增或修改,请务必使用新的方式添加。比如原来的分类名称为<i class="fa fa-html5"></i> 站长工具,现在应该修改为:

注意:新增或更新分类请务必按照新方法填写,否则会导致添加链接的时候分类名称显示异常。

API

OneNav API使用说明。

API

Token生成

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

0.9.19及之后的版本

在OneNav后台 - 系统设置 - API,查看用户名并点击生成SecretKey

然后点击页面上的“计算Token”,并将计算后的Token结果复制使用。

0.9.18及之前的版本

首先找到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 分类名称
fid 0 int 父级分类ID,如果为0则代表是顶级分类
font_icon fa fa-bookmark-o string CSS字体图标
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 分类名称
fid 0 int 父级分类ID,如果为0则代表是顶级分类
font_icon fa fa-bookmark-o string CSS字体图标
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

查询单个链接信息

接口说明

请求参数

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

请求成功响应

{
	"code": 0,
	"data": {
		"id": "2",
		"fid": "19",
		"title": "安装文档",
		"url": "https://www.yuque.com/helloz/onenav/install",
		"description": "OneNav安装文档。",
		"add_time": "1608042226",
		"up_time": "1608042440",
		"weight": "0",
		"property": "0",
		"click": "1"
	}
}

请求失败响应

{
	"code": -1002,
	"err_msg": "Authorization failure!"
}
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请求错误码可参考如下表格进行对照,如有疑问,请反馈。此对照表已经废弃,默认情况下0200代表成功,其余状态码一律为失败。

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不存在
API

获取单个分类目录信息

接口说明

请求参数

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

请求成功响应

{
	"code": 0,
	"data": {
		"id": "22",
		"name": "你好啊",
		"add_time": "1646715733",
		"up_time": "",
		"weight": "0",
		"property": "1",
		"description": "第三代",
		"font_icon": "fa fa-linux"
	}
}

请求失败响应

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

获取当前主题自定义参数

接口说明

返回参数说明

{
    "code": 200,
    "data": {
        "full_width_mode": "on",
        "link_description": "hide",
        "favicon": "online"
    },
    "msg": ""
}
API

查询用户是否登录

返回值

{
    "code": 200,
    "data": "true",
    "msg": ""
}

如果失败,返回:

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

查询指定分类下的链接列表

接口说明

请求参数

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

请求成功响应

{
    "code": 0,
    "msg": "",
    "count": 2,
    "data": [
        {
            "id": "20",
            "0": "20",
            "fid": "19",
            "1": "19",
            "title": "百度一下,你就知道",
            "2": "百度一下,你就知道",
            "url": "https:\/\/www.baidu.com\/index.php?tn=22073068_2_dg",
            "3": "https:\/\/www.baidu.com\/index.php?tn=22073068_2_dg",
            "description": "",
            "4": "",
            "add_time": "1650551209",
            "5": "1650551209",
            "up_time": null,
            "6": null,
            "weight": "0",
            "7": "0",
            "property": "0",
            "8": "0",
            "click": "2",
            "9": "2",
            "topping": "0",
            "10": "0",
            "url_standby": null,
            "11": null,
            "category_name": "默认分类",
            "12": "默认分类"
        },
        {
            "id": "19",
            "0": "19",
            "fid": "19",
            "1": "19",
            "title": "你好",
            "2": "你好",
            "url": "magnet:?xt=urn:btih:d212b7968eacb056301410bb6473436e51f2e395",
            "3": "magnet:?xt=urn:btih:d212b7968eacb056301410bb6473436e51f2e395",
            "description": "",
            "4": "",
            "add_time": "1650275033",
            "5": "1650275033",
            "up_time": null,
            "6": null,
            "weight": "0",
            "7": "0",
            "property": "0",
            "8": "0",
            "click": "0",
            "9": "0",
            "topping": "0",
            "10": "0",
            "url_standby": "",
            "11": "",
            "category_name": "默认分类",
            "12": "默认分类"
        }   
    ]
}

请求失败响应

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

主题开发

您可以根据此文档开发自己喜欢的OneNav主题。

目录结构

OneNav主题位于站点根目录下的/templates目录,或者是/data/templates,逻辑为:

  1. 优先读取/templates目录下的主题
  2. 如果未读取到/templates目录下的主题,则尝试从/data/templates读取

主题目录命名规范

  1. 主题目录不能包含特殊字符,比如-/.*!@#$%^&
  2. 目录名称不能包含空格

创建一个主题

/templates下创建一个目录,比如HelloWorld,里面至少需要存在2个文件,分别是:

info.json配置信息

info.jsonn内容包含:

{
    "name":"Hello World",
    "description":"Hello World",
    "homepage":"https://www.xiaoz.me",
    "version":"1.0.0",
    "update":"2022/04/13",
    "author":"xiaoz",
    "screenshot":"https://img.rss.ink/imgs/2022/03/42ed3ef2c4a50f6d.png"
}

字段含义如下:

这个时候回到OneNav后台 - 系统设置 - 主题设置,可以看到刚刚创建好的HelloWorld主题,不过当前没有实际作用,因为index.php还没有任何内容。

内置变量

您在index.php中可以使用以下变量,注意需要通过PHP开始符和结束符包裹,比如<?php echo $name; ?>

index.php

接下来我们试着在index.php添加内容,这个文件可以直接使用上面提到的内置变量。试着将上面的变量添加到index.php,内容如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title><?php echo $site['title']; ?> - <?php echo $site['subtitle']; ?></title>
        <meta name="keywords" content="<?php echo $site['keywords']; ?>" />
        <meta name="description" content="<?php echo $site['description']; ?>" />
        <style>
            header{
                width:100%;
                
            }
            aside{
                width:20%;
                float:left;
            }
            article{
                float:80%;
            }
            footer{
                width:100%;
            }
        </style>
	</head>
	<body>
		<!-- 顶部 -->
		<header>
            <!-- 网站标题 -->
			<h1><?php echo $site['title']; ?></h1>
		</header>
		<!-- 顶部 -->

		<!-- 左侧 -->
		<aside>
			左侧
		</aside>
		<!-- 左侧 -->

		<!-- 内容 -->
		<article>
			内容
		</article>
		<!-- 内容END -->

		<!-- 底部 -->
		<footer>
			这是底部内容
		</footer>
		<!-- 底部END -->
	</body>
</html>

OneNav后台 - 系统设置 - 主题设置 - 使用HelloWorld这个主题,回到首页我们可以看到变量已经生效,自动输出了网站标题。

不过当前非常简陋,内容都还没有。我们试着在aside元素添加遍历输出分类目录的代码,如下:

<?php
                //遍历分类目录并显示
                foreach ($categorys as $category) {
                //var_dump($category);
                $font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
            ?>
            <a href="#category-<?php echo $category['id']; ?>">
                <li>
                    <div><?php echo $font_icon; ?><?php echo htmlspecialchars_decode($category['name']); ?></div>
                </li>
            </a>
            <?php } ?>

这时分类目录已经遍历并显示,内容如下截图:

趁热打铁,我们继续将书签内容也遍历输出,将下面的代码添加到article元素节点:

<!-- 遍历分类目录 -->
            <?php foreach ( $categorys as $category ) {
                $fid = $category['id'];
                $links = get_links($fid);
				$font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
                //如果分类是私有的
                if( $category['property'] == 1 ) {
                    $property = '<i class="fa fa-expeditedssl" style = "color:#5FB878"></i>';
                }
                else {
                    $property = '';
                }
            ?>
			<div id = "category-<?php echo $category['id']; ?>" class = "mdui-col-xs-12 mdui-typo-title cat-title">
				<?php echo $font_icon; ?>
				<?php echo htmlspecialchars_decode($category['name']); ?> <?php echo $property; ?>
				<span class = "mdui-typo-caption"><?php echo $category['description']; ?></span>
			</div>
			<!-- 遍历链接 -->
			<?php
				foreach ($links as $link) {
					//默认描述
					$link['description'] = empty($link['description']) ? '作者很懒,没有填写描述。' : $link['description'];
					
				//var_dump($link);
			?>
			<div class="mdui-col-lg-3 mdui-col-md-4 mdui-col-xs-12 link-space" id = "id_<?php echo $link['id']; ?>" link-title = "<?php echo $link['title']; ?>" link-url = "<?php echo $link['url']; ?>">
				<!--定义一个卡片-->
				<div class="mdui-card link-line mdui-hoverable">
						<!-- 如果是私有链接,则显示角标 -->
						<?php if($link['property'] == 1 ) { ?>
						<div class="angle">
							<span> </span>
						</div>
						<?php } ?>
						<!-- 角标END -->
						<a href="/index.php?c=click&id=<?php echo $link['id']; ?>" target="_blank" title = "<?php echo $link['description']; ?>">
							<div class="mdui-card-primary" style = "padding-top:16px;">
									<div class="mdui-card-primary-title link-title">
										<img src="https://favicon.rss.ink/v1/<?php echo base64($link['url']); ?>" alt="HUAN" width="16" height="16">
										<span class="link_title"><?php echo $link['title']; ?></span> 
									</div>

							</div>
						</a>
						
					
					<!-- 卡片的内容end -->
					<div class="mdui-card-content mdui-text-color-black-disabled" style="padding-top:0px;"><span class="link-content"><?php echo $link['description']; ?></span></div>
				</div>
				<!--卡片END-->
			</div>
			<?php } ?>
			<!-- 遍历链接END -->
			<?php } ?>

这时候刷新首页,可以看到书签内容也输出了。不过没有CSS,样式完全是乱的,CSS样式就需要主题开发者根据自己的喜好来写了。

至此一个简单的HelloWorld主题已经完成,完整代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title><?php echo $site['title']; ?> - <?php echo $site['subtitle']; ?></title>
        <meta name="keywords" content="<?php echo $site['keywords']; ?>" />
        <meta name="description" content="<?php echo $site['description']; ?>" />
        <style>
            header{
                width:100%;
                
            }
            aside{
                width:20%;
                float:left;
            }
            article{
                float:80%;
            }
            footer{
                width:100%;
            }
        </style>
	</head>
	<body>
		<!-- 顶部 -->
		<header>
            <!-- 网站标题 -->
			<h1><?php echo $site['title']; ?></h1>
		</header>
		<!-- 顶部 -->

		<!-- 左侧 -->
		<aside>
            <?php
                //遍历分类目录并显示
                foreach ($categorys as $category) {
                //var_dump($category);
                $font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
            ?>
            <a href="#category-<?php echo $category['id']; ?>">
                <li>
                    <div><?php echo $font_icon; ?><?php echo htmlspecialchars_decode($category['name']); ?></div>
                </li>
            </a>
            <?php } ?>
		</aside>
		<!-- 左侧 -->

		<!-- 内容 -->
		<article>
			<!-- 遍历分类目录 -->
            <?php foreach ( $categorys as $category ) {
                $fid = $category['id'];
                $links = get_links($fid);
				$font_icon = empty($category['font_icon']) ? '' : "<i class='{$category['font_icon']}'></i> ";
                //如果分类是私有的
                if( $category['property'] == 1 ) {
                    $property = '<i class="fa fa-expeditedssl" style = "color:#5FB878"></i>';
                }
                else {
                    $property = '';
                }
            ?>
			<div id = "category-<?php echo $category['id']; ?>" class = "mdui-col-xs-12 mdui-typo-title cat-title">
				<?php echo $font_icon; ?>
				<?php echo htmlspecialchars_decode($category['name']); ?> <?php echo $property; ?>
				<span class = "mdui-typo-caption"><?php echo $category['description']; ?></span>
			</div>
			<!-- 遍历链接 -->
			<?php
				foreach ($links as $link) {
					//默认描述
					$link['description'] = empty($link['description']) ? '作者很懒,没有填写描述。' : $link['description'];
					
				//var_dump($link);
			?>
			<div class="mdui-col-lg-3 mdui-col-md-4 mdui-col-xs-12 link-space" id = "id_<?php echo $link['id']; ?>" link-title = "<?php echo $link['title']; ?>" link-url = "<?php echo $link['url']; ?>">
				<!--定义一个卡片-->
				<div class="mdui-card link-line mdui-hoverable">
						<!-- 如果是私有链接,则显示角标 -->
						<?php if($link['property'] == 1 ) { ?>
						<div class="angle">
							<span> </span>
						</div>
						<?php } ?>
						<!-- 角标END -->
						<a href="/index.php?c=click&id=<?php echo $link['id']; ?>" target="_blank" title = "<?php echo $link['description']; ?>">
							<div class="mdui-card-primary" style = "padding-top:16px;">
									<div class="mdui-card-primary-title link-title">
										<img src="https://favicon.rss.ink/v1/<?php echo base64($link['url']); ?>" alt="HUAN" width="16" height="16">
										<span class="link_title"><?php echo $link['title']; ?></span> 
									</div>

							</div>
						</a>
						
					
					<!-- 卡片的内容end -->
					<div class="mdui-card-content mdui-text-color-black-disabled" style="padding-top:0px;"><span class="link-content"><?php echo $link['description']; ?></span></div>
				</div>
				<!--卡片END-->
			</div>
			<?php } ?>
			<!-- 遍历链接END -->
			<?php } ?>
		</article>
		<!-- 内容END -->

		<!-- 底部 -->
		<footer>
			这是底部内容
		</footer>
		<!-- 底部END -->
	</body>
</html>