- Go Gin 后端 (19个源文件): 认证、工单CRUD、GLM AI分析、状态流转、备注、操作日志 - Arco Design Vue 前端: 登录、工单列表/详情/创建、AI分析触发与确认 - MySQL 5表: ticket_user/ticket_info/ticket_ai_analysis/ticket_operation_log/ticket_note - 部署: tk.1216.top HTTPS, Nginx反代
90 lines
2.1 KiB
Go
90 lines
2.1 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/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)
|
|
|
|
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)
|
|
}
|
|
}
|