Files
observer/server/main.go
T
2026-09-12 16:54:16 +08:00

62 lines
2.8 KiB
Go
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.
package main
import (
"context"
"os"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"observer-server/biz/controller"
"observer-server/biz/service"
"observer-server/common"
)
func main() {
ctx := context.Background()
s := g.Server()
// Android APK 下载静态托管:app.apkDir 目录下固定文件 observer-latest.apk
// URL 固定 /download/observer-latest.apk(绕过统一响应包装,纯二进制流);
// 模型热更新文件同根 /download/trainings/<数据集名>.tflitedatasetDir 下 trainings 目录)
if err := os.MkdirAll(common.ApkDir(ctx), 0o755); err != nil {
g.Log().Fatalf(ctx, "创建 APK 目录失败: %+v", err)
}
s.AddStaticPath("/download", common.ApkDir(ctx))
// 客户端接口组:统一响应包装 {"code":0,"message":"ok","data":...}
// 账号组公开(注册/登录),业务组(订单/授权/模型目录)需登录态(Authorization: Bearer token
s.Group("/api/v1", func(group *ghttp.RouterGroup) {
group.Middleware(common.UnifiedResponse)
common.BindController(group, controller.Auth, controller.AppVersion)
})
s.Group("/api/v1", func(group *ghttp.RouterGroup) {
group.Middleware(common.UnifiedResponse, common.AuthRequired)
common.BindController(group, controller.Order, controller.License, controller.ModelCatalog, controller.Annotate, controller.FalseTarget)
})
// 支付回调组:不做统一包装,按渠道应答格式直接返回(微信 SUCCESS/FAIL JSON、支付宝 success/failure 文本)
s.Group("/api/v1/payment", func(group *ghttp.RouterGroup) {
common.BindController(group, controller.Payment)
})
// 管理端接口组:统一响应包装 + 静态 token 鉴权
s.Group("/api/v1/admin", func(group *ghttp.RouterGroup) {
group.Middleware(common.UnifiedResponse, common.AdminAuth)
common.BindController(group, controller.Admin)
})
// APK 下载引导页(h5/ 源码目录):微信内打开提示用手机浏览器,非微信直显下载按钮
if stat, err := os.Stat("./h5"); err == nil && stat.IsDir() {
s.AddStaticPath("/download-page", "./h5")
} else {
g.Log().Warningf(ctx, "h5 目录不存在,跳过下载引导页托管")
}
// 管理端静态页面托管:构建产物输出到 admin_distserver_admin/ 构建),SPA history 路由回退 index.html
// 目录不存在(尚未构建前端)时跳过,不影响 API 启动
if stat, err := os.Stat("./admin_dist"); err == nil && stat.IsDir() {
s.AddStaticPath("/admin", "./admin_dist")
s.BindMiddlewareDefault(common.SpaFallback("./admin_dist", "/admin"))
} else {
g.Log().Warningf(ctx, "admin_dist 不存在,跳过管理端静态托管(cd server_admin && npm run build")
}
// 后台协程:训练进度轮询 + 孤儿预标注任务恢复
service.Training.StartBackgroundJobs(ctx)
s.Run()
}