# ToNav-go 🧭 内部服务导航系统 — Go 版本 基于 Go + Gin + GORM + SQLite 构建的轻量级服务导航页,用于管理和展示内部服务链接。 ## 功能特性 ### 前台导航 - 🔍 **实时搜索** — 输入即过滤,匹配服务名称、描述、标签 - 📑 **分类 Tab 切换** — 一键过滤不同分类的服务 - 🟢 **健康状态指示** — 绿色在线 / 红色离线 / 灰色未检测 - 📱 **响应式设计** — 完美适配手机端 - 🎨 **深色 Header + 白色卡片** — 现代化 UI 风格 ### 后台管理 - 📡 **服务管理** — 新增/编辑/删除服务(名称、URL、图标、分类、描述、标签、排序、健康检查配置) - 📂 **分类管理** — 新增/编辑/删除分类,支持排序权重 - ⚙️ **系统设置** — 站点标题、WebDAV 配置、自动备份开关 - 🔐 **登录认证** — bcrypt 密码加密,首次登录强制修改密码 - 📊 **Dashboard** — 服务总数、分类数、在线/离线统计 ### 健康检查 - ⏱️ **定时检测** — 每 5 分钟自动检测所有启用健康检查的服务 - 🎯 **独立检查 URL** — 可为每个服务配置专用健康检查地址 - 🔘 **三态指示** — 开启检测 + 成功 = 绿色 / 开启检测 + 失败 = 红色 / 未开启 = 灰色 ### 云端备份(WebDAV) - ☁️ **手动备份** — 一键备份数据库到 WebDAV 云端 - 🔄 **恢复备份** — 从云端备份列表选择恢复,恢复前自动备份当前数据 - 🗑️ **删除备份** — 清理云端旧备份(需 WebDAV 服务端开放 DELETE 权限) - ⏰ **定时自动备份** — 可配置每天凌晨 3:00 自动执行 - 📁 **本地备份管理** — 自动保留最近 5 份本地备份 ## 技术栈 | 组件 | 技术 | |------|------| | 语言 | Go 1.24+ | | Web 框架 | Gin | | ORM | GORM | | 数据库 | SQLite | | 认证 | bcrypt + Cookie Session | | 前端 | 原生 HTML/CSS/JS | | 备份 | WebDAV 协议 | ## 项目结构 ``` ToNav-go/ ├── main.go # 入口文件、路由注册 ├── go.mod # Go 模块定义 ├── go.sum # 依赖校验 ├── tonav-go-ctl.sh # 管理脚本 (start/stop/restart/status/build/log) ├── database/ │ ├── db.go # 数据库初始化、自动迁移 │ └── seed.go # 初始数据(默认管理员、分类、WebDAV 配置) ├── models/ │ └── models.go # 数据模型(Category, Service, User, Setting) ├── handlers/ │ ├── api.go # REST API(服务/分类 CRUD) │ ├── auth.go # 登录/登出/修改密码 │ ├── health.go # 健康检查定时任务 │ ├── settings.go # 系统设置 & 备份/恢复/删除 │ ├── views.go # 页面渲染(首页/Dashboard/管理页面) │ └── utils.go # 工具函数(Session 获取) ├── utils/ │ ├── config.go # 配置加载(环境变量) │ └── webdav.go # WebDAV 客户端(上传/下载/列表/删除/备份) ├── templates/ │ ├── index.html # 前台导航页 │ └── admin/ │ ├── login.html # 登录页 │ ├── dashboard.html # 后台首页 │ ├── services.html # 服务管理 │ ├── categories.html # 分类管理 │ └── change_password.html # 修改密码 └── backups/ # 本地备份目录(自动创建) ``` ## 快速开始 ### 环境要求 - Go 1.24+ - GCC(CGO 编译 SQLite 需要) ### 编译运行 ```bash # 克隆项目 git clone https://gitea.king.nyc.mn/openclaw/ToNav-go.git cd ToNav-go # 编译 go build -o tonav-go-v1 # 运行 ./tonav-go-v1 ``` ### 使用管理脚本 ```bash chmod +x tonav-go-ctl.sh ./tonav-go-ctl.sh start # 启动(后台运行) ./tonav-go-ctl.sh stop # 停止 ./tonav-go-ctl.sh restart # 重启 ./tonav-go-ctl.sh status # 查看状态 ./tonav-go-ctl.sh build # 编译 ./tonav-go-ctl.sh log # 查看日志 ``` ### 环境变量配置 | 变量 | 默认值 | 说明 | |------|--------|------| | `TONAV_PORT` | `9520` | 监听端口 | | `TONAV_DB` | `tonav.db` | 数据库文件路径 | | `TONAV_SECRET` | 内置密钥 | Cookie 签名密钥 | ### 默认账号 - **用户名**: `admin` - **密码**: `admin123` - 首次登录会强制修改密码 ## API 接口 ### 公开接口 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/` | 前台导航页 | | GET | `/admin/login` | 登录页 | | POST | `/admin/login` | 登录 | ### 管理接口(需登录) | 方法 | 路径 | 说明 | |------|------|------| | GET | `/admin/dashboard` | 后台首页 | | GET | `/admin/api/services` | 获取所有服务 | | POST | `/admin/api/services` | 新增服务 | | PUT | `/admin/api/services/:id` | 更新服务 | | DELETE | `/admin/api/services/:id` | 删除服务 | | GET | `/admin/api/categories` | 获取所有分类 | | POST | `/admin/api/categories` | 新增分类 | | PUT | `/admin/api/categories/:id` | 更新分类 | | DELETE | `/admin/api/categories/:id` | 删除分类 | | GET | `/admin/api/settings` | 获取设置 | | POST | `/admin/api/settings` | 保存设置 | | POST | `/admin/api/backup/webdav` | 执行云端备份 | | GET | `/admin/api/backup/list` | 列出云端备份 | | DELETE | `/admin/api/backup/delete?name=xxx` | 删除云端备份 | | POST | `/admin/api/backup/restore?name=xxx` | 恢复云端备份 | ## 数据模型 ### Service 服务 | 字段 | 类型 | 说明 | |------|------|------| | name | string | 服务名称 | | url | string | 服务地址 | | icon | string | 图标(emoji) | | description | string | 描述 | | category_id | uint | 所属分类 ID | | tags | string | 标签(逗号分隔) | | status | string | 状态(online/offline/unknown) | | is_enabled | bool | 是否启用 | | sort_order | int | 排序权重(越大越靠前) | | health_check_url | string | 健康检查 URL | | health_check_enabled | bool | 是否启用健康检查 | | click_count | int | 点击次数 | ### Category 分类 | 字段 | 类型 | 说明 | |------|------|------| | name | string | 分类名称 | | sort_order | int | 排序权重(越大越靠前) | ## License MIT