feat: ToNav-go v1.0.0 - 内部服务导航系统

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

技术栈: Go + Gin + GORM + SQLite
This commit is contained in:
2026-02-14 05:09:23 +08:00
commit efaf787981
23 changed files with 2735 additions and 0 deletions

182
README.md Normal file
View File

@@ -0,0 +1,182 @@
# 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