@@ -0,0 +1,583 @@
|
||||
# YMhut更新站 - Go 版本
|
||||
|
||||
这是 Node.js 版本的完整 Go 实现,使用 Gin 框架构建,提供了更好的性能和更完善的 UI/UX 体验。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- ✅ 完整复现 Node.js 版本的所有功能
|
||||
- ✅ 产品列表展示(自动从 downloads 目录读取)
|
||||
- ✅ JSON API 接口(tool-status.json, update-info.json, media-types.json 等)
|
||||
- ✅ 文件下载功能(支持安全校验)
|
||||
- ✅ 历史版本查看
|
||||
- ✅ 改进的 UI/UX(增强动画、优化响应式设计)
|
||||
- ✅ 完整的错误处理(404、500 页面)
|
||||
- ✅ 彩色日志系统
|
||||
- ✅ **后台管理系统**(新增)
|
||||
- 用户注册和登录(第一个用户自动成为管理员)
|
||||
- 密码强度验证(防止弱密码)
|
||||
- 路由管理(可视化添加、编辑、删除路由)
|
||||
- 文件管理(浏览、查看、编辑文件)
|
||||
- 配置管理(编辑 JSON 配置文件)
|
||||
- 日志查看(实时查看系统日志)
|
||||
- 系统信息(查看系统统计)
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
go/
|
||||
├── main.go # 主入口文件
|
||||
├── go.mod # Go 模块依赖
|
||||
├── go.sum # 依赖校验文件
|
||||
├── config/
|
||||
│ └── routes.go # 路由配置
|
||||
├── models/ # 数据模型
|
||||
│ ├── user.go # 用户模型
|
||||
│ └── route.go # 路由模型
|
||||
├── database/ # 数据库
|
||||
│ └── db.go # 数据库初始化
|
||||
├── handlers/ # 请求处理
|
||||
│ ├── auth.go # 认证处理
|
||||
│ └── admin.go # 后台管理处理
|
||||
├── middleware/ # 中间件
|
||||
│ └── auth.go # 认证中间件
|
||||
├── utils/
|
||||
│ ├── logger.go # 日志工具
|
||||
│ ├── route-utils.go # 路由辅助函数
|
||||
│ ├── password.go # 密码验证
|
||||
│ ├── jwt.go # JWT Token
|
||||
│ └── config.go # 配置缓存
|
||||
├── views/ # HTML 模板
|
||||
│ ├── index.html
|
||||
│ ├── admin.html # 后台管理界面
|
||||
│ ├── 404.html
|
||||
│ └── 500.html
|
||||
└── public/ # 静态资源
|
||||
├── css/
|
||||
├── img/
|
||||
├── fonts/
|
||||
├── lang/
|
||||
├── downloads/ # 下载文件目录
|
||||
└── *.json # JSON 配置文件
|
||||
```
|
||||
|
||||
## 前置要求
|
||||
|
||||
### 必需
|
||||
|
||||
- **Go 1.21 或更高版本**
|
||||
- 下载地址:https://golang.org/dl/
|
||||
- 安装后验证:`go version`
|
||||
|
||||
### 可选(用于编译)
|
||||
|
||||
- **Git**(用于版本控制)
|
||||
- **CGO**(SQLite 需要,Windows 可能需要安装 GCC)
|
||||
|
||||
## 快速开始
|
||||
|
||||
**新手推荐**:查看 [QUICKSTART.md](./QUICKSTART.md) 获取详细的、一步一步的安装指南。
|
||||
|
||||
## 完整安装步骤
|
||||
|
||||
### 步骤 1: 检查 Go 环境
|
||||
|
||||
打开终端(Windows: PowerShell 或 CMD,Linux/macOS: Terminal),运行:
|
||||
|
||||
```bash
|
||||
go version
|
||||
```
|
||||
|
||||
**预期输出示例:**
|
||||
```
|
||||
go version go1.21.0 windows/amd64
|
||||
```
|
||||
|
||||
如果显示 "command not found" 或类似错误,请先安装 Go。
|
||||
|
||||
### 步骤 2: 进入项目目录
|
||||
|
||||
```bash
|
||||
# Windows (PowerShell)
|
||||
cd D:\Desktop\update\go
|
||||
|
||||
# Windows (CMD)
|
||||
cd D:\Desktop\update\go
|
||||
|
||||
# Linux/macOS
|
||||
cd /path/to/update/go
|
||||
```
|
||||
|
||||
### 步骤 3: 下载依赖
|
||||
|
||||
```bash
|
||||
go mod download
|
||||
```
|
||||
|
||||
**预期输出:**
|
||||
```
|
||||
go: downloading github.com/gin-gonic/gin v1.9.1
|
||||
go: downloading github.com/golang-jwt/jwt/v5 v5.2.0
|
||||
go: downloading gorm.io/gorm v1.25.5
|
||||
...
|
||||
```
|
||||
|
||||
### 步骤 4: 整理依赖(生成 go.sum)
|
||||
|
||||
```bash
|
||||
go mod tidy
|
||||
```
|
||||
|
||||
**预期输出:**
|
||||
```
|
||||
go: downloading github.com/mattn/go-sqlite3 v1.14.17
|
||||
go: downloading github.com/jinzhu/now v1.1.5
|
||||
...
|
||||
```
|
||||
|
||||
这个命令会:
|
||||
- 下载所有缺失的依赖
|
||||
- 移除未使用的依赖
|
||||
- 生成/更新 `go.sum` 文件
|
||||
|
||||
### 步骤 5: 验证依赖
|
||||
|
||||
```bash
|
||||
go mod verify
|
||||
```
|
||||
|
||||
**预期输出:**
|
||||
```
|
||||
all modules verified
|
||||
```
|
||||
|
||||
### 步骤 6: 测试编译
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
go build -o software-download-center.exe .
|
||||
|
||||
# Linux/macOS
|
||||
go build -o software-download-center .
|
||||
```
|
||||
|
||||
**预期输出:**
|
||||
- 无错误信息
|
||||
- 生成可执行文件
|
||||
|
||||
### 步骤 7: 运行项目
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
go run main.go
|
||||
|
||||
# 或使用编译后的文件
|
||||
.\software-download-center.exe
|
||||
|
||||
# Linux/macOS
|
||||
go run main.go
|
||||
|
||||
# 或使用编译后的文件
|
||||
./software-download-center
|
||||
```
|
||||
|
||||
**预期输出:**
|
||||
```
|
||||
=============================================
|
||||
✅ 数据库初始化成功
|
||||
✅ 配置缓存初始化成功
|
||||
=============================================
|
||||
📋 开始注册路由...
|
||||
✅ 路由注册成功 [GET ] / (类型: view)
|
||||
...
|
||||
📋 路由注册完成!
|
||||
|
||||
=============================================
|
||||
✅ 服务器启动成功
|
||||
📡 访问地址: http://localhost:3355
|
||||
🌍 当前环境: production
|
||||
🔄 兼容旧版访问:支持 /tool-status.json /update-info.json /media-types.json
|
||||
=============================================
|
||||
```
|
||||
|
||||
### 步骤 8: 访问应用
|
||||
|
||||
1. **主页**:http://localhost:3355
|
||||
2. **后台管理**:http://localhost:3355/admin
|
||||
|
||||
## 开发模式运行
|
||||
|
||||
### 启用调试模式
|
||||
|
||||
```bash
|
||||
# Windows (PowerShell)
|
||||
$env:GIN_MODE="debug"; go run main.go
|
||||
|
||||
# Windows (CMD)
|
||||
set GIN_MODE=debug && go run main.go
|
||||
|
||||
# Linux/macOS
|
||||
GIN_MODE=debug go run main.go
|
||||
```
|
||||
|
||||
### 自定义端口
|
||||
|
||||
```bash
|
||||
# Windows (PowerShell)
|
||||
$env:PORT="8080"; go run main.go
|
||||
|
||||
# Windows (CMD)
|
||||
set PORT=8080 && go run main.go
|
||||
|
||||
# Linux/macOS
|
||||
PORT=8080 go run main.go
|
||||
```
|
||||
|
||||
## 编译打包
|
||||
|
||||
### 方法 1: 使用打包脚本(推荐)
|
||||
|
||||
#### Windows
|
||||
|
||||
```bash
|
||||
# 运行批处理脚本
|
||||
build.bat
|
||||
```
|
||||
|
||||
#### Linux/macOS
|
||||
|
||||
```bash
|
||||
# 添加执行权限
|
||||
chmod +x build.sh
|
||||
|
||||
# 运行脚本
|
||||
./build.sh
|
||||
```
|
||||
|
||||
编译后的文件位于 `build/output/` 目录。
|
||||
|
||||
### 方法 2: 手动编译
|
||||
|
||||
#### 编译当前平台版本
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
go build -ldflags="-s -w" -o software-download-center.exe .
|
||||
|
||||
# Linux
|
||||
go build -ldflags="-s -w" -o software-download-center .
|
||||
|
||||
# macOS
|
||||
go build -ldflags="-s -w" -o software-download-center .
|
||||
```
|
||||
|
||||
#### 交叉编译(在其他平台编译)
|
||||
|
||||
```bash
|
||||
# 在 Windows 上编译 Linux 版本
|
||||
set GOOS=linux
|
||||
set GOARCH=amd64
|
||||
go build -ldflags="-s -w" -o software-download-center .
|
||||
|
||||
# 在 Linux/macOS 上编译 Windows 版本
|
||||
GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o software-download-center.exe .
|
||||
|
||||
# 在 Linux/macOS 上编译 macOS 版本(Apple Silicon)
|
||||
GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o software-download-center .
|
||||
```
|
||||
|
||||
**编译参数说明:**
|
||||
- `-ldflags="-s -w"`:减小可执行文件大小
|
||||
- `-s`:去除符号表
|
||||
- `-w`:去除调试信息
|
||||
|
||||
### 方法 3: 静态编译(无 CGO 依赖)
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
set CGO_ENABLED=0
|
||||
set GOOS=windows
|
||||
set GOARCH=amd64
|
||||
go build -ldflags="-s -w" -o software-download-center.exe .
|
||||
|
||||
# Linux
|
||||
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o software-download-center .
|
||||
|
||||
# macOS
|
||||
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o software-download-center .
|
||||
```
|
||||
|
||||
**注意:** 静态编译时 SQLite 可能无法使用,需要 CGO 支持。
|
||||
|
||||
## 配置说明
|
||||
|
||||
### 环境变量
|
||||
|
||||
| 变量名 | 说明 | 默认值 |
|
||||
|--------|------|--------|
|
||||
| `PORT` | 服务器端口 | `3355` |
|
||||
| `GIN_MODE` | Gin 运行模式 | `release` |
|
||||
| `CGO_ENABLED` | 是否启用 CGO | `1` |
|
||||
|
||||
### 文件命名规则
|
||||
|
||||
下载文件需要遵循以下命名格式才能被正确识别:
|
||||
|
||||
```
|
||||
产品名称 Setup 版本号.扩展名
|
||||
```
|
||||
|
||||
**示例:**
|
||||
- `YmhutBox Setup 1.4.21.exe`
|
||||
- `弈鸣小筑 Setup 2.0.0.zip`
|
||||
|
||||
**支持的扩展名:** `.exe`, `.zip`, `.pkg`, `.dmg`, `.msi`
|
||||
|
||||
## 后台管理
|
||||
|
||||
### 访问地址
|
||||
|
||||
http://localhost:3355/admin
|
||||
|
||||
### 首次使用
|
||||
|
||||
1. 访问后台管理页面
|
||||
2. 点击"注册"标签
|
||||
3. 填写注册信息(第一个注册的用户自动成为管理员)
|
||||
4. 登录后即可使用所有管理功能
|
||||
|
||||
### 密码要求
|
||||
|
||||
- 至少 8 个字符
|
||||
- 包含至少一个大写字母
|
||||
- 包含至少一个小写字母
|
||||
- 包含至少一个数字
|
||||
- 包含至少一个特殊字符
|
||||
- 不能是常见弱密码
|
||||
|
||||
详细使用说明请查看 [ADMIN.md](./ADMIN.md)。
|
||||
|
||||
## UI/UX 改进
|
||||
|
||||
相比 Node.js 版本,Go 版本在 UI/UX 方面做了以下改进:
|
||||
|
||||
1. **增强的动画效果**
|
||||
- 更流畅的卡片入场动画
|
||||
- 改进的悬停效果(轻微上浮)
|
||||
- 优化的按钮交互反馈
|
||||
|
||||
2. **改进的滚动条**
|
||||
- 更宽的滚动条(10px)
|
||||
- 圆角设计
|
||||
- 平滑的过渡效果
|
||||
|
||||
3. **无障碍改进**
|
||||
- 支持 `prefers-reduced-motion` 媒体查询
|
||||
- 增强的焦点可见性
|
||||
- 更好的键盘导航支持
|
||||
|
||||
4. **性能优化**
|
||||
- Go 的高性能并发处理
|
||||
- 更快的响应时间
|
||||
- 更低的内存占用
|
||||
|
||||
## API 接口
|
||||
|
||||
### JSON 接口
|
||||
|
||||
- `GET /tool-status.json` - 工具状态配置
|
||||
- `GET /update-info.json` - 更新信息
|
||||
- `GET /media-types.json` - 媒体类型配置
|
||||
- `GET /plugins.json` - 插件配置
|
||||
|
||||
所有接口都支持不带 `.json` 后缀的访问方式(向后兼容)。
|
||||
|
||||
### 文件下载
|
||||
|
||||
- `GET /downloads/:filename` - 下载指定文件
|
||||
|
||||
### 静态资源
|
||||
|
||||
- `/css/*` - CSS 样式文件
|
||||
- `/img/*` - 图片资源
|
||||
- `/fonts/*` - 字体文件
|
||||
- `/lang/*` - 语言文件
|
||||
|
||||
### 后台管理 API
|
||||
|
||||
详细 API 文档请查看 [ADMIN.md](./ADMIN.md)。
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 1. 编译错误:missing go.sum entry
|
||||
|
||||
**解决方法:**
|
||||
```bash
|
||||
go mod tidy
|
||||
```
|
||||
|
||||
### 2. 运行时错误:数据库初始化失败
|
||||
|
||||
**可能原因:**
|
||||
- `data` 目录权限不足
|
||||
- 磁盘空间不足
|
||||
|
||||
**解决方法:**
|
||||
- 检查目录权限
|
||||
- 确保有足够的磁盘空间
|
||||
- 手动创建 `data` 目录
|
||||
|
||||
### 3. 端口被占用
|
||||
|
||||
**解决方法:**
|
||||
```bash
|
||||
# 使用其他端口
|
||||
PORT=8080 go run main.go
|
||||
```
|
||||
|
||||
### 4. SQLite 相关错误(CGO 问题)
|
||||
|
||||
**错误信息:**
|
||||
```
|
||||
SQLite 连接失败: Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work
|
||||
```
|
||||
|
||||
**可能原因:**
|
||||
- 缺少 CGO 支持
|
||||
- 缺少 GCC 编译器
|
||||
- 编译时禁用了 CGO
|
||||
|
||||
**解决方法:**
|
||||
|
||||
**方案 1: 启用 CGO 重新编译**
|
||||
```bash
|
||||
# Windows (PowerShell)
|
||||
$env:CGO_ENABLED="1"
|
||||
go build -o software-download-center.exe .
|
||||
|
||||
# Linux/macOS
|
||||
export CGO_ENABLED=1
|
||||
go build -o software-download-center .
|
||||
```
|
||||
|
||||
**方案 2: 使用 MySQL(无需 CGO)**
|
||||
```bash
|
||||
# Windows (PowerShell)
|
||||
$env:DB_TYPE="mysql"
|
||||
$env:DB_HOST="localhost"
|
||||
$env:DB_USER="root"
|
||||
$env:DB_PASSWORD="password"
|
||||
$env:DB_NAME="software_download_center"
|
||||
go run main.go
|
||||
|
||||
# Linux/macOS
|
||||
export DB_TYPE=mysql
|
||||
export DB_HOST=localhost
|
||||
export DB_USER=root
|
||||
export DB_PASSWORD=password
|
||||
export DB_NAME=software_download_center
|
||||
go run main.go
|
||||
```
|
||||
|
||||
详细说明请查看 [CGO_FIX.md](./CGO_FIX.md)。
|
||||
|
||||
### 5. 依赖下载失败
|
||||
|
||||
**解决方法:**
|
||||
```bash
|
||||
# 设置 Go 代理(中国大陆)
|
||||
go env -w GOPROXY=https://goproxy.cn,direct
|
||||
|
||||
# 或使用官方代理
|
||||
go env -w GOPROXY=https://proxy.golang.org,direct
|
||||
```
|
||||
|
||||
## 开发说明
|
||||
|
||||
### 添加新路由
|
||||
|
||||
在 `config/routes.go` 中的 `RegisterRoutes` 函数中添加新路由。
|
||||
|
||||
### 修改模板
|
||||
|
||||
模板文件位于 `views/` 目录,使用 Go 的 `html/template` 语法。
|
||||
|
||||
### 添加新的工具函数
|
||||
|
||||
在 `utils/` 目录下创建新的工具文件。
|
||||
|
||||
### 数据库迁移
|
||||
|
||||
数据库使用 GORM 自动迁移,启动时会自动创建表结构。
|
||||
|
||||
## 部署说明
|
||||
|
||||
### 生产环境部署
|
||||
|
||||
1. **编译可执行文件**
|
||||
```bash
|
||||
go build -ldflags="-s -w" -o software-download-center .
|
||||
```
|
||||
|
||||
2. **复制必要文件**
|
||||
```bash
|
||||
# 复制静态资源
|
||||
cp -r public output/
|
||||
cp -r views output/
|
||||
```
|
||||
|
||||
3. **运行服务**
|
||||
```bash
|
||||
PORT=3355 ./software-download-center
|
||||
```
|
||||
|
||||
### 使用进程管理器
|
||||
|
||||
详细部署说明请查看 [BUILD.md](./BUILD.md)。
|
||||
|
||||
## 与 Node.js 版本的差异
|
||||
|
||||
1. **性能**: Go 版本具有更好的并发性能和更低的内存占用
|
||||
2. **部署**: Go 版本编译为单个可执行文件,部署更简单
|
||||
3. **UI**: Go 版本包含了一些 UI/UX 改进
|
||||
4. **功能**: 功能完全一致,100% 兼容
|
||||
5. **后台管理**: Go 版本新增了完整的后台管理系统
|
||||
|
||||
## 快速开始(完整流程)
|
||||
|
||||
```bash
|
||||
# 1. 检查 Go 版本
|
||||
go version
|
||||
|
||||
# 2. 进入项目目录
|
||||
cd go
|
||||
|
||||
# 3. 下载依赖
|
||||
go mod download
|
||||
|
||||
# 4. 整理依赖
|
||||
go mod tidy
|
||||
|
||||
# 5. 验证依赖
|
||||
go mod verify
|
||||
|
||||
# 6. 运行项目
|
||||
go run main.go
|
||||
|
||||
# 7. 访问应用
|
||||
# 浏览器打开: http://localhost:3355
|
||||
```
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
## 作者
|
||||
|
||||
YMhut
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [QUICKSTART.md](./QUICKSTART.md) - 快速开始指南(推荐新手)
|
||||
- [ADMIN.md](./ADMIN.md) - 后台管理系统使用说明
|
||||
- [BUILD.md](./BUILD.md) - 打包编译详细说明
|
||||
- [CGO_FIX.md](./CGO_FIX.md) - CGO 问题解决方案(SQLite 相关)
|
||||
Reference in New Issue
Block a user