- 修复登录参数 username→account - 修复前后端字段名不匹配 (ticketno/contactname/createtime等) - 修复AI分析GLM返回markdown包裹和priority类型问题 - 添加AutoMigrate自动建表 - 统一API路由为 /api/auth/ 前缀 - 添加config.example.yaml,.gitignore排除config.yaml
101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/casehub/ticket-workbench/internal/config"
|
|
"github.com/casehub/ticket-workbench/internal/handler"
|
|
"github.com/casehub/ticket-workbench/internal/middleware"
|
|
"github.com/casehub/ticket-workbench/internal/model"
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
func main() {
|
|
cfg, err := config.Load("config.yaml")
|
|
if err != nil {
|
|
log.Fatalf("Failed to load config: %v", err)
|
|
}
|
|
|
|
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
|
|
cfg.Database.User,
|
|
cfg.Database.Password,
|
|
cfg.Database.Host,
|
|
cfg.Database.Port,
|
|
cfg.Database.DBName,
|
|
)
|
|
|
|
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
|
|
Logger: logger.Default.LogMode(logger.Info),
|
|
})
|
|
if err != nil {
|
|
log.Fatalf("Failed to connect database: %v", err)
|
|
}
|
|
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
log.Fatalf("Failed to get database instance: %v", err)
|
|
}
|
|
sqlDB.SetMaxIdleConns(10)
|
|
sqlDB.SetMaxOpenConns(100)
|
|
|
|
if err := db.AutoMigrate(
|
|
&model.TicketUser{},
|
|
&model.TicketInfo{},
|
|
&model.TicketAiAnalysis{},
|
|
&model.TicketNote{},
|
|
&model.TicketOperationLog{},
|
|
); err != nil {
|
|
log.Fatalf("Failed to auto migrate: %v", err)
|
|
}
|
|
|
|
gin.SetMode(gin.ReleaseMode)
|
|
r := gin.Default()
|
|
|
|
r.Use(middleware.CORS())
|
|
|
|
authMiddleware := middleware.Auth(db)
|
|
|
|
api := r.Group("/api")
|
|
{
|
|
auth := api.Group("/auth")
|
|
{
|
|
auth.POST("/login", handler.Login(db))
|
|
auth.POST("/logout", handler.Logout())
|
|
auth.GET("/me", authMiddleware, handler.UserInfo())
|
|
}
|
|
|
|
tickets := api.Group("/tickets")
|
|
tickets.Use(authMiddleware)
|
|
{
|
|
tickets.GET("", handler.ListTickets(db))
|
|
tickets.POST("", handler.CreateTicket(db))
|
|
tickets.GET("/:id", handler.GetTicket(db))
|
|
tickets.PUT("/:id", handler.UpdateTicket(db))
|
|
tickets.PUT("/:id/status", handler.UpdateTicketStatus(db))
|
|
|
|
tickets.POST("/:id/analyze", handler.AnalyzeTicket(db, cfg))
|
|
tickets.GET("/:id/analysis", handler.GetAnalysis(db))
|
|
tickets.PUT("/:id/analysis", handler.ConfirmAnalysis(db))
|
|
|
|
tickets.GET("/:id/notes", handler.ListNotes(db))
|
|
tickets.POST("/:id/notes", handler.AddNote(db))
|
|
|
|
tickets.GET("/:id/logs", handler.GetOperationLogs(db))
|
|
}
|
|
}
|
|
|
|
addr := fmt.Sprintf(":%d", cfg.Server.Port)
|
|
if os.Getenv("PORT") != "" {
|
|
addr = ":" + os.Getenv("PORT")
|
|
}
|
|
log.Printf("Server starting on %s", addr)
|
|
if err := r.Run(addr); err != nil {
|
|
log.Fatalf("Failed to start server: %v", err)
|
|
}
|
|
}
|