Files
ToNav-go/README.md
openclaw efaf787981 feat: ToNav-go v1.0.0 - 内部服务导航系统
功能:
- 前台导航: 分类Tab切换、实时搜索、健康状态指示、响应式适配
- 后台管理: 服务/分类CRUD、系统设置、登录认证(bcrypt)
- 健康检查: 定时检测(5min)、独立检查URL、三态指示(在线/离线/未检测)
- 云端备份: WebDAV上传/下载/恢复/删除、定时自动备份、本地备份管理

技术栈: Go + Gin + GORM + SQLite
2026-02-14 05:09:23 +08:00

183 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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+
- GCCCGO 编译 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