docs(constitution): 新增数据库设计原则(v2.4.0)
在项目宪章中新增第九条原则"数据库设计原则",明确禁止使用数据库外键约束和ORM关联标签。 主要变更: - 新增原则IX:数据库设计原则(Database Design Principles) - 强制要求:数据库表不得使用外键约束 - 强制要求:GORM模型不得使用ORM关联标签(foreignKey、hasMany等) - 强制要求:表关系必须通过ID字段手动维护 - 强制要求:关联数据查询必须显式编写,避免ORM魔法 - 强制要求:时间字段由GORM处理,不使用数据库触发器 设计理念: - 提升业务逻辑灵活性(无数据库约束限制) - 优化高并发性能(无外键检查开销) - 增强代码可读性(显式查询,无隐式预加载) - 简化数据库架构和迁移流程 - 支持分布式和微服务场景 版本升级:2.3.0 → 2.4.0(MINOR)
This commit is contained in:
@@ -17,8 +17,13 @@ import (
|
||||
|
||||
"github.com/break/junhong_cmp_fiber/internal/handler"
|
||||
"github.com/break/junhong_cmp_fiber/internal/middleware"
|
||||
"github.com/break/junhong_cmp_fiber/internal/service/order"
|
||||
"github.com/break/junhong_cmp_fiber/internal/service/user"
|
||||
"github.com/break/junhong_cmp_fiber/internal/store/postgres"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/config"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/database"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/logger"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/queue"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/validator"
|
||||
)
|
||||
|
||||
@@ -83,9 +88,44 @@ func main() {
|
||||
}
|
||||
appLogger.Info("Redis 已连接", zap.String("address", redisAddr))
|
||||
|
||||
// 初始化 PostgreSQL 连接
|
||||
db, err := database.InitPostgreSQL(&cfg.Database, appLogger)
|
||||
if err != nil {
|
||||
appLogger.Fatal("初始化 PostgreSQL 失败", zap.Error(err))
|
||||
}
|
||||
defer func() {
|
||||
sqlDB, _ := db.DB()
|
||||
if sqlDB != nil {
|
||||
if err := sqlDB.Close(); err != nil {
|
||||
appLogger.Error("关闭 PostgreSQL 连接失败", zap.Error(err))
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// 初始化 Asynq 任务提交客户端
|
||||
queueClient := queue.NewClient(redisClient, appLogger)
|
||||
defer func() {
|
||||
if err := queueClient.Close(); err != nil {
|
||||
appLogger.Error("关闭 Asynq 客户端失败", zap.Error(err))
|
||||
}
|
||||
}()
|
||||
|
||||
// 创建令牌验证器
|
||||
tokenValidator := validator.NewTokenValidator(redisClient, appLogger)
|
||||
|
||||
// 初始化 Store 层
|
||||
store := postgres.NewStore(db, appLogger)
|
||||
|
||||
// 初始化 Service 层
|
||||
userService := user.NewService(store, appLogger)
|
||||
orderService := order.NewService(store, appLogger)
|
||||
|
||||
// 初始化 Handler 层
|
||||
userHandler := handler.NewUserHandler(userService, appLogger)
|
||||
orderHandler := handler.NewOrderHandler(orderService, appLogger)
|
||||
taskHandler := handler.NewTaskHandler(queueClient, appLogger)
|
||||
healthHandler := handler.NewHealthHandler(db, redisClient, appLogger)
|
||||
|
||||
// 启动配置文件监听器(热重载)
|
||||
watchCtx, cancelWatch := context.WithCancel(context.Background())
|
||||
defer cancelWatch()
|
||||
@@ -125,7 +165,7 @@ func main() {
|
||||
// 路由注册
|
||||
|
||||
// 公共端点(无需认证)
|
||||
app.Get("/health", handler.HealthCheck)
|
||||
app.Get("/health", healthHandler.Check)
|
||||
|
||||
// API v1 路由组
|
||||
v1 := app.Group("/api/v1")
|
||||
@@ -160,8 +200,22 @@ func main() {
|
||||
))
|
||||
}
|
||||
|
||||
// 注册受保护的路由
|
||||
v1.Get("/users", handler.GetUsers)
|
||||
// 用户路由
|
||||
v1.Post("/users", userHandler.CreateUser)
|
||||
v1.Get("/users/:id", userHandler.GetUser)
|
||||
v1.Put("/users/:id", userHandler.UpdateUser)
|
||||
v1.Delete("/users/:id", userHandler.DeleteUser)
|
||||
v1.Get("/users", userHandler.ListUsers)
|
||||
|
||||
// 订单路由
|
||||
v1.Post("/orders", orderHandler.CreateOrder)
|
||||
v1.Get("/orders/:id", orderHandler.GetOrder)
|
||||
v1.Put("/orders/:id", orderHandler.UpdateOrder)
|
||||
v1.Get("/orders", orderHandler.ListOrders)
|
||||
|
||||
// 任务路由
|
||||
v1.Post("/tasks/email", taskHandler.SubmitEmailTask)
|
||||
v1.Post("/tasks/sync", taskHandler.SubmitSyncTask)
|
||||
|
||||
// 优雅关闭
|
||||
quit := make(chan os.Signal, 1)
|
||||
|
||||
Reference in New Issue
Block a user