开发指南¶
本页面介绍如何从源码构建和开发 Website Defender。
环境要求¶
| 依赖 | 版本要求 | 用途 |
|---|---|---|
| Go | 1.25+ | 后端编译和开发 |
| Node.js | 20+ | 前端构建和开发 |
| npm | 随 Node.js 安装 | 前端包管理 |
从源码构建¶
完整构建¶
使用构建脚本一键完成前端和后端的编译:
# 克隆仓库
git clone https://github.com/Flmelody/open-website-defender.git
cd open-website-defender
# 安装前端依赖
cd ui/admin && npm install && cd ../..
cd ui/guard && npm install && cd ../..
# 执行构建脚本
./scripts/build.sh
构建完成后,根目录下会生成 app 可执行文件。
分步构建¶
如需分别构建前端和后端:
构建前端:
# 构建 Guard 防护页
cd ui/guard
npm install
npm run build
cd ../..
# 构建 Admin 管理后台
cd ui/admin
npm install
npm run build
cd ../..
构建后端:
前端依赖
Go 后端通过 go:embed 嵌入 ui/admin/dist 和 ui/guard/dist 目录。必须先构建前端,否则后端编译会失败。
开发服务器¶
后端开发¶
前端开发¶
项目包含两个独立的 Vue 3 前端应用:
前端开发环境
前端开发服务器默认连接 http://localhost:9999/wall 后端 API。如需修改,可通过环境变量 VITE_BACKEND_HOST 配置。
前端代码检查¶
# 类型检查
cd ui/admin && npm run type-check
cd ui/guard && npm run type-check
# 代码风格检查和修复
cd ui/admin && npm run lint
cd ui/guard && npm run lint
项目结构¶
open-website-defender/
├── main.go # 应用入口
├── config/
│ └── config.yaml # 运行时配置文件
├── scripts/
│ └── build.sh # 构建脚本
├── internal/
│ ├── adapter/
│ │ ├── controller/http/ # Gin HTTP 处理器、中间件、请求/响应结构
│ │ └── repository/ # GORM 数据库仓储实现
│ ├── domain/
│ │ ├── entity/ # 领域模型(User, IpBlackList, IpWhiteList 等)
│ │ └── error/ # 领域错误定义
│ ├── infrastructure/
│ │ ├── config/ # 配置结构体
│ │ ├── database/ # 数据库初始化(SQLite/PostgreSQL/MySQL via GORM)
│ │ └── logging/ # Zap 日志初始化
│ ├── pkg/ # 工具包(JWT、加密、HTTP 辅助函数)
│ └── usecase/ # 业务逻辑服务层(含 DTO)
│ ├── interface/ # 仓储接口定义
│ ├── iplist/ # IP 名单服务
│ └── user/ # 认证和用户服务
├── ui/
│ ├── admin/ # Admin 管理后台(Vue 3 + Element Plus + vue-i18n)
│ └── guard/ # Guard 防护页(Vue 3)
└── docs/ # MkDocs 文档
关键设计模式¶
- Clean Architecture(整洁架构):代码分层为 adapter、domain、infrastructure、usecase
- 单例服务:使用
sync.Once模式初始化服务(如GetAuthService()、GetIpBlackListService()) - 仓储接口:定义在
internal/usecase/interface/repository.go,实现在internal/adapter/repository/ - JWT 认证:令牌通过
Defender-Authorization请求头或flmelody.tokenCookie 传递