BookNav 是一个使用 Flask 构建的、可通过 Docker 轻松部署的个人导航网站项目。它旨在帮助用户整理和快速访问常用的网站链接,提供分类管理和丰富的交互功能,并支持邀请码注册系统来控制用户访问。
抓取图标功能线上点击抓取后可能存在不显示进度问题,可以本地运行抓取图标然后导出数据库,再导入线上
BookNav 基于 Flask Web 框架打造,提供了以下核心功能:
- 🖱️ 右键菜单交互: 链接卡片右键可弹出快捷菜单,支持添加、编辑、删除、复制链接等操作
- ⚡ 快速添加网站: 首页直接粘贴链接可弹出快速添加链接对话框,无需进入后台
- 🤏 拖拽排序功能:
- 支持网站卡片拖拽排序
- 支持侧边栏分类拖拽排序
- 🔄 重复链接验证功能:
- 在添加或编辑网站时自动检测 URL 是否已存在
- 智能提示已存在的链接及其所属分类
- 提供选项: 取消添加、强制添加或跳转到已有链接
- 有效防止重复添加相同网站,保持导航整洁
- 全局快速搜索: 顶部搜索框支持即时搜索整站内容
- 多维度匹配:支持网站标题、URL、描述和关键词的全文搜索
- 分类内搜索: 在特定分类页面可限定搜索范围
- 完美兼容 OneNav 数据结构,支持无缝迁移
- 支持导入 OneNav 的 SQLite 数据库导出文件
- 自动匹配分类,保留原有的组织结构
- 导出为多种格式:原生格式、OneNav 兼容格式
- 完整的后台管理界面: 独立的管理控制台
- 网站与分类管理: 完整的增删改查功能,批量删除,批量修改公开,私有状态
- 站点设置: 自定义站点名称、Logo、SEO 信息等,支持自定义背景图片,支持开启链接跳转过渡页(支持放广告)
- 邀请码管理: 生成和管理注册邀请码
- 数据批量操作功能:
- 一键抓取图标
- 一键清空所有数据
- 备份功能
- 用户管理: 首次启动默认超级管理员权限,支持查看和管理用户账户,支持添加普通用户和管理员角色
- 邀请码注册: 仅通过邀请码才能注册新用户,确保站点的私密性
- 用户认证: 完整的登录、注册和登出功能
- 权限管理: 区分普通用户和管理员权限
注意:如果多用户,谨慎放开用户的的超级管理员权限;可以适当放开普通管理员权限(普通管理员后台功能只涉及链接相关和邀请码部分)
- 自动获取网站图标: 自动尝试获取并显示网站的 Favicon
- 优雅的降级显示: 当图标加载失败时,显示基于网站名称首字母的默认图标
- 一致的视觉体验: 确保界面整洁一致,即使外部资源不可用
- 全设备适配: 完美支持桌面、平板和移动设备
- 布局自适应: 基于 Bootstrap 的响应式网格系统
- 触摸友好: 为移动设备优化的交互体验
- 核心框架: Python 3.9+, Flask
- ORM: SQLAlchemy
- 数据库迁移: Flask-Migrate
- 用户认证: Flask-Login
- 表单处理: Flask-WTF
- WSGI 服务器: Gunicorn
- UI 框架: Bootstrap 5
- 动画效果: Animate.css
- 图标: Font Awesome, Bootstrap Icons
- 交互: 原生 JavaScript
- 默认数据库: SQLite
- 可选扩展: 支持 PostgreSQL, MySQL 等关系型数据库
- 容器化: Docker, Docker Compose
- Web 服务器: Nginx (容器内反向代理)
- 进程管理: Supervisor
-
环境准备:
- 安装 Docker
- 安装 Docker Compose
-
获取代码:
git clone https://github.com/yourusername/booknav.git cd booknav sed -i 's/\r$//' docker/cleanup_backups.sh sed -i 's/\r$//' docker/entrypoint.sh
-
构建与启动:
docker-compose build docker-compose up -d
-
访问:
- 在浏览器中打开
http://<您的服务器IP>:8988 - 默认用户名:
admin,密码:admin123
- 在浏览器中打开
version: "3"
services:
nav:
image: yilan666/booknav-nav:1.9.5
container_name: nav
restart: always
ports:
- "8988:80" # Nginx端口
volumes:
- ./data:/data # 数据目录
- ./data/backups:/app/app/backups # 备份目录
- ./data/uploads:/app/app/static/uploads # 上传文件目录(静态文件中的上传目录)
- ./config/nginx:/etc/nginx/http.d # Nginx配置
env_file:
- .env
environment:
- DATABASE_URL=sqlite:////data/app.dbdocker-compose.yml 文件同级目录下创建.env 文件
# 基本配置
SECRET_KEY=
FLASK_ENV=production
DATABASE_URL=sqlite:////data/app.db
# 管理员设置
ADMIN_USERNAME=admin
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=admin123
# 其他配置
INVITATION_CODE_LENGTH=8SECRET_KEY=
ADMIN_USERNAME=
ADMIN_EMAIL=
ADMIN_PASSWORD=这些参数自定义填写,执行
docker-compose up -d用户名和密码为.env 文件中自定义填写的
首次启动时,容器内的 entrypoint.sh 脚本会自动:
- 检查数据库文件是否存在
- 执行数据库迁移 (
flask db upgrade) 创建表结构 - 创建默认的管理员账户
-
环境准备:
python -m venv venv # Windows venv\Scripts\activate # Linux/Mac source venv/bin/activate pip install -r requirements.txt
-
配置:
- 创建
.env文件并设置必要的环境变量
- 创建
-
数据库初始化:
flask db upgrade
-
运行开发服务器:
python run.py
- 使用默认管理员账号登录 (参考
config.py或您配置的环境变量) - 建议立即修改默认管理员密码
- 进入管理后台 (
/admin) - 创建分类,设置名称、图标和颜色
- 为分类添加网站,填写网站标题、URL、描述等信息
- 在管理界面中找到"邀请码管理"
- 点击"生成新邀请码"
- 将生成的邀请码分享给需要注册的用户
- 右键菜单: 在网站卡片或分类上右键点击,使用上下文菜单
- 拖拽排序: 长按并拖动网站卡片或分类进行排序
- 搜索功能: 使用顶部搜索框查找网站
.
├── app/ # Flask 应用核心目录
│ ├── admin/ # 后台管理蓝图
│ ├── api/ # API 蓝图
│ ├── auth/ # 认证蓝图 (登录、注册)
│ ├── main/ # 主要应用蓝图 (首页、分类页)
│ ├── static/ # 静态文件 (CSS, JS, images, vendor libs)
│ ├── templates/ # Jinja2 模板文件
│ ├── utils/ # 工具函数
│ ├── __init__.py # 应用工厂函数 create_app()
│ ├── models.py # SQLAlchemy 数据模型
│ └── ...
├── docker/ # Docker 相关配置文件
│ ├── entrypoint.sh # Docker 容器启动脚本
│ ├── nginx.conf # Nginx 配置文件
│ └── supervisord.conf # Supervisor 配置文件
├── migrations/ # Flask-Migrate 数据库迁移脚本
├── config/ # Nginx 配置目录 (本地映射)
├── data/ # 持久化数据目录 (本地映射)
├── .env # 环境变量文件
├── config.py # Flask 配置类
├── Dockerfile # Docker 镜像构建文件
├── docker-compose.yml # Docker Compose 部署文件
├── requirements.txt # Python 依赖列表
└── run.py # Flask 应用启动入口 (开发用)
- 首次部署后,请立即修改默认的管理员密码
- Docker 部署时请确保 8988 端口未被占用
- 为保证数据安全,请定期备份
data目录
MIT License - 详见 LICENSE 文件
欢迎提交 Issue 和 Pull Request 来帮助改进项目!


