包含前端(Vue3 + VueFlow 画布)、后端(Go)、文档体系。 - 工作台画布:节点拖放、连线模式、右键菜单、AI 助手 - 后端:连接器 API、专员种子数据 - 导航:左侧导航、工坊、市场、控制台
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"eaisalestrain/backend/internal/api"
|
|
"eaisalestrain/backend/internal/auth"
|
|
"eaisalestrain/backend/internal/config"
|
|
"eaisalestrain/backend/internal/model"
|
|
"eaisalestrain/backend/internal/store"
|
|
)
|
|
|
|
func main() {
|
|
// 交付维护子命令(不进服务主流程)
|
|
if len(os.Args) > 1 {
|
|
switch os.Args[1] {
|
|
case "-reset-admin":
|
|
resetAdmin(os.Args[2:])
|
|
return
|
|
}
|
|
}
|
|
|
|
cfg := config.Load()
|
|
|
|
if _, err := store.Init(cfg.DBPath); err != nil {
|
|
log.Fatalf("数据库初始化失败: %v", err)
|
|
}
|
|
if err := store.SeedDefaults(); err != nil {
|
|
log.Fatalf("种子数据初始化失败: %v", err)
|
|
}
|
|
|
|
r := gin.Default()
|
|
|
|
api.RegisterRoutes(r, cfg)
|
|
|
|
log.Printf("eaisalestrain 后端启动,端口 :%s", cfg.Port)
|
|
if err := r.Run(":" + cfg.Port); err != nil {
|
|
log.Fatalf("启动失败: %v", err)
|
|
}
|
|
}
|
|
|
|
// resetAdmin 交付前重置管理员密码:eaisalestrain-server -reset-admin <新密码>
|
|
func resetAdmin(args []string) {
|
|
if len(args) < 1 || args[0] == "" {
|
|
log.Fatal("用法: eaisalestrain-server -reset-admin <新密码>")
|
|
}
|
|
cfg := config.Load()
|
|
if _, err := store.Init(cfg.DBPath); err != nil {
|
|
log.Fatalf("数据库初始化失败: %v", err)
|
|
}
|
|
hash, err := auth.HashPassword(args[0])
|
|
if err != nil {
|
|
log.Fatalf("密码加密失败: %v", err)
|
|
}
|
|
if err := store.DB.Model(&model.User{}).Where("username = ?", "admin").Update("password_hash", hash).Error; err != nil {
|
|
log.Fatalf("重置密码失败: %v", err)
|
|
}
|
|
log.Println("[OK] 管理员密码已重置")
|
|
}
|