# Nebula Nebula 是一个用于分发桌面/客户端应用版本的全栈项目,后端使用 Go (Gin + GORM) 暴露应用、版本、资产、更新检查与 JWT 身份验证接口,前端使用 Vue 3 + Vite 构建管理控制台。 ## 🔍 项目概览 - **API 服务** (`cmd/nebula-server` + `internal/`): 提供应用、版本、资产、更新校验、认证等 REST API,并支持本地文件存储。 - **Web 控制台** (`web/`): Vue 3 + TypeScript + Pinia + Vue Router,负责登录、版本管理等 UI。 - **文档** (`docs/`): 包含资产接口、JWT、JSON Key、发布 API 以及更新检查规格。 - **脚本** (`scripts/`): 统一封装 dev/build/start 脚本(.sh/.bat)。 ``` . ├── cmd/nebula-server # API 服务入口 ├── internal/ # 领域服务、API 路由、存储、认证等 ├── web/ # Vue 3 前端应用 ├── docs/ # API 与协议文档 ├── scripts/ # 本地开发与构建脚本 ├── config*.yaml # 运行配置 (默认、dev、prod) ├── uploads/ # 本地存储文件输出目录 └── go.mod # Go 依赖定义 ``` ## 🚀 快速开始 ### 1. 准备依赖 - Go 1.21+(`go.mod` 设定 1.25,使用最新稳定版即可) - Node.js 20+ 与 [pnpm](https://pnpm.io/)(前端) ### 2. 配置后端 1. 复制并调整配置:`cp config.dev.yaml config.yaml`(Windows 可使用 `copy`)。 2. 启动 API 服务: - 开发模式:`go run ./cmd/nebula-server` - 生产构建:`go build -o bin/nebula-server ./cmd/nebula-server` 3. 默认会初始化本地 SQLite 数据库、文件存储与 JWT 认证。 ### 3. 启动前端 ```bash cd web pnpm install pnpm dev # 开发热更新 pnpm build # 生产构建,产物位于 web/dist ``` 也可以使用 `scripts/dev.(sh|bat)`、`scripts/build.(sh|bat)`、`scripts/start.(sh|bat)` 进行一键操作。 ## 📚 文档资源 - `docs/ASSET_API.md` – 资产上传/管理接口规格 - `docs/AUTH_JWT.md` – JWT 身份认证说明 - `docs/JSON_KEY_FORMAT.md` – JSON Key 结构 - `docs/RELEASE_API.md` – 发布版本 API - `docs/UPDATE_CHECK.md` – 客户端更新检查流程 ## 📦 功能实现情况 ### 后端 API 与服务 | 模块 | 功能 | 状态 | 说明 | |------|------|------|------| | 认证 | 管理员/普通用户登录、Refresh、Profile、改密 | ✅ 已落地 | `AuthHandler.Login/RefreshToken/GetProfile/ChangePassword` 已通过 `JWTMiddleware` 保护,并支持配置中的默认管理员。 | | 认证 | 自助注册 | 🟡 未启用 | `AuthHandler.Register` 与 `AuthService.Register` 已实现,但 `/api/auth/register` 在路由中被注释以限制注册,`docs/AUTH_JWT.md` 需同步说明。 | | 应用 | CRUD | ✅ 已落地 | `AppService` + `AppHandler` 覆盖列表/详情/创建/更新/删除。 | | 版本 | CRUD + 最新版本查询 | ✅ 基本可用 | `ReleaseService` 支持按渠道筛选及 `GetLatest`,但 Delete 目前不会清理关联资源(见 TODO #3)。 | | 资源 | 列表/详情/外链创建/上传/下载 | ✅ 已落地 | `AssetService` 负责校验和计算、本地存储、下载路径转换。 | | 资源 | 数字签名与删除日志 | 🟡 待补完 | 上传时 `Signature` 仍为空,删除文件失败只留下 TODO(见 TODO #1/#2)。 | | 更新检查 | `/api/check-update` | ✅ 已落地 | `updater.CheckUpdate` 使用语义化版本比较和校验和返回。 | | 存储 | LocalStorage | ✅ 已落地 | file save/delete/url/exists 已实现并在 `main.go` 注入。 | | 存储 | OSS / S3 适配器 | ⏳ 预留接口 | `storage.Storage` 提供接口,配置项存在但尚无实现分支。 | | 中间件 | AdminMiddleware | ⚠️ 未接入 | 中间件已实现,但目前所有受保护路由仅做 JWT 校验,未强制管理员角色。 | ### 前端 Web 控制台 | 功能 | 状态 | 说明 | |------|------|------| | 登录页 | ✅ 可用 | `view/auth/login.vue` 已接入 `api.login` 与 Pinia 存储,并写入 localStorage。 | | Token 刷新 | 🟡 未使用 | `api.refreshToken` 定义但尚未在 store/拦截器中调用,实际会在 Access Token 过期后直接失败。 | | 仪表盘数据 | 🟡 静态占位 | `view/home/index.vue` 的统计卡片与最近动态均为硬编码示例,尚未调用后端。 | | 导航/路由 | ⚠️ 不完整 | 路由仅注册 `/` 与 `/login`,但 `layout/default.vue` 的“应用管理”“系统设置”菜单会指向不存在的路由。 | | 应用/版本/资产管理 UI | 🔲 未实现 | 目前没有对应的列表、表单或上传界面,API 只能通过 Postman/curl 使用。 | | 注册/忘记密码 UI | 🔲 未实现 | 登录页仅展示提示文字,未提供表单或链接。 | ## ✅ 当前 TODO 列表 | # | 模块 | 文件 | 待办 | 建议思路 | |---|------|------|------|----------| | 1 | 资产上传 | `internal/asset/service.go` (行 133) | `Signature` 字段目前为空,需要实现文件签名生成与校验。 | 生成私钥签名或哈希签名存入字段,并在客户端校验;可考虑与 release key 绑定。 | | 2 | 资产删除 | `internal/asset/service.go` (行 226) | 删除存储文件失败时仅注释提醒,需要记录日志。 | 注入 logger(`pkg/logger`)并输出错误详情,便于排查存储清理问题。 | | 3 | 版本删除 | `internal/release/service.go` (行 137) | 删除 Release 时尚未同步删除关联 Assets。 | 在删除前查询并删除对应资产(含文件),或配置数据库外键级联,确保无孤立文件。 | > 若新增 TODO,请同步更新此表,保持 README 成为 backlog 的单一事实来源。 ## 🧪 测试与质量 - 后端可使用 `go test ./...` 运行单元测试。 - 前端使用 `pnpm test`(若添加测试工具)或 `pnpm lint` 保持规范。 ## 🗺️ 后续展望 - 为资产签名、删除链路补全 TODO 后,可引入对象存储(S3、OSS 等)与 CI/CD 流水线。 - 可基于 `docs/UPDATE_CHECK.md` 实现自动更新客户端 SDK。