62 lines
2.8 KiB
Go
62 lines
2.8 KiB
Go
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/<数据集名>.tflite(datasetDir 下 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_dist(server_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()
|
||
}
|