feat: 添加核心金融模型、通知模型以及路由和通知仓库的基础结构

This commit is contained in:
2026-01-28 08:38:18 +08:00
parent 5d834204dd
commit 0414401ada
4 changed files with 24 additions and 59 deletions

View File

@@ -835,35 +835,6 @@ func (AllocationRecordDetail) TableName() string {
return "allocation_record_details" return "allocation_record_details"
} }
// NotificationType represents the type of notification
type NotificationType string
const (
NotificationTypeBudgetAlert NotificationType = "budget_alert" // 预算超支提醒
NotificationTypeRecurring NotificationType = "recurring" // 周期交易提醒
NotificationTypeSystem NotificationType = "system" // 系统公告
NotificationTypePaymentReminder NotificationType = "payment_reminder" // 还款提醒
NotificationTypeSavingsGoal NotificationType = "savings_goal" // 储蓄目标提醒
)
// Notification represents a user notification
// Feature: notification-center
type Notification struct {
ID uint `gorm:"primarykey" json:"id"`
UserID uint `gorm:"not null;index" json:"user_id"`
Type NotificationType `gorm:"size:30;not null;index" json:"type"`
Title string `gorm:"size:200;not null" json:"title"`
Content string `gorm:"size:1000;not null" json:"content"`
IsRead bool `gorm:"default:false;index" json:"is_read"`
RelatedID *uint `gorm:"index" json:"related_id,omitempty"` // 关联实体 ID (如预算、周期交易等)
CreatedAt time.Time `json:"created_at"`
}
// TableName specifies the table name for Notification
func (Notification) TableName() string {
return "notifications"
}
// AllModels returns all models for database migration // AllModels returns all models for database migration
func AllModels() []interface{} { func AllModels() []interface{} {
return []interface{}{ return []interface{}{

View File

@@ -11,6 +11,10 @@ const (
NotificationTypeSystem NotificationType = "system" NotificationTypeSystem NotificationType = "system"
NotificationTypeAlert NotificationType = "alert" NotificationTypeAlert NotificationType = "alert"
NotificationTypeInfo NotificationType = "info" NotificationTypeInfo NotificationType = "info"
NotificationTypeBudgetAlert NotificationType = "budget_alert" // 预算超支提醒
NotificationTypeRecurring NotificationType = "recurring" // 周期交易提醒
NotificationTypePaymentReminder NotificationType = "payment_reminder" // 还款提醒
NotificationTypeSavingsGoal NotificationType = "savings_goal" // 储蓄目标提醒
) )
// Notification represents a system notification for a user // Notification represents a system notification for a user
@@ -19,10 +23,11 @@ type Notification struct {
UserID uint `gorm:"not null;index" json:"user_id"` UserID uint `gorm:"not null;index" json:"user_id"`
Title string `gorm:"size:200;not null" json:"title"` Title string `gorm:"size:200;not null" json:"title"`
Content string `gorm:"type:text;not null" json:"content"` Content string `gorm:"type:text;not null" json:"content"`
Type NotificationType `gorm:"size:20;not null;default:'system'" json:"type"` Type NotificationType `gorm:"size:30;not null;default:'system';index" json:"type"`
IsRead bool `gorm:"default:false" json:"is_read"` IsRead bool `gorm:"default:false;index" json:"is_read"`
Link string `gorm:"size:255" json:"link,omitempty"` // Optional link to redirect Link string `gorm:"size:255" json:"link,omitempty"` // Optional link to redirect
ReadAt *time.Time `json:"read_at,omitempty"` ReadAt *time.Time `json:"read_at,omitempty"`
RelatedID *uint `gorm:"index" json:"related_id,omitempty"` // 关联实体 ID (如预算、周期交易等)
// Relationships // Relationships
User User `gorm:"foreignKey:UserID" json:"-"` User User `gorm:"foreignKey:UserID" json:"-"`

View File

@@ -3,6 +3,7 @@ package repository
import ( import (
"errors" "errors"
"fmt" "fmt"
"time"
"accounting-app/internal/models" "accounting-app/internal/models"
@@ -119,20 +120,12 @@ func (r *NotificationRepository) MarkAsRead(userID uint, id uint) error {
// MarkAllAsRead marks all notifications as read for a user // MarkAllAsRead marks all notifications as read for a user
func (r *NotificationRepository) MarkAllAsRead(userID uint) error { func (r *NotificationRepository) MarkAllAsRead(userID uint) error {
<<<<<<< HEAD
return r.db.Model(&models.Notification{}). return r.db.Model(&models.Notification{}).
Where("user_id = ? AND is_read = ?", userID, false). Where("user_id = ? AND is_read = ?", userID, false).
Updates(map[string]interface{}{ Updates(map[string]interface{}{
"is_read": true, "is_read": true,
"read_at": time.Now(), "read_at": time.Now(),
}).Error }).Error
=======
if err := r.db.Model(&models.Notification{}).
Where("user_id = ? AND is_read = ?", userID, false).
Update("is_read", true).Error; err != nil {
return fmt.Errorf("failed to mark all notifications as read: %w", err)
}
return nil
} }
// Delete deletes a notification by its ID // Delete deletes a notification by its ID
@@ -156,5 +149,4 @@ func (r *NotificationRepository) GetUnreadCount(userID uint) (int64, error) {
return 0, fmt.Errorf("failed to count unread notifications: %w", err) return 0, fmt.Errorf("failed to count unread notifications: %w", err)
} }
return count, nil return count, nil
>>>>>>> 2dc66d478cbe3aafaae601f0939ab448b690365e
} }

View File

@@ -92,9 +92,6 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
interestService := service.NewInterestService(accountRepo, transactionRepo, db) interestService := service.NewInterestService(accountRepo, transactionRepo, db)
userSettingsServiceWithAccounts := service.NewUserSettingsServiceWithAccountRepo(userSettingsRepo, accountRepo) userSettingsServiceWithAccounts := service.NewUserSettingsServiceWithAccountRepo(userSettingsRepo, accountRepo)
// Feature: notification-center - Initialize notification service
notificationService := service.NewNotificationService(notificationRepo)
// Feature: health-score - Initialize health score service // Feature: health-score - Initialize health score service
healthScoreService := service.NewHealthScoreService(reportRepo, accountRepo, budgetRepo) healthScoreService := service.NewHealthScoreService(reportRepo, accountRepo, budgetRepo)
@@ -128,9 +125,6 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
defaultAccountHandler := handler.NewDefaultAccountHandler(userSettingsServiceWithAccounts) defaultAccountHandler := handler.NewDefaultAccountHandler(userSettingsServiceWithAccounts)
interestHandler := handler.NewInterestHandler(interestService, nil) interestHandler := handler.NewInterestHandler(interestService, nil)
// Feature: notification-center - Initialize notification handler
notificationHandler := handler.NewNotificationHandler(notificationService)
// Feature: health-score - Initialize health score handler // Feature: health-score - Initialize health score handler
healthScoreHandler := handler.NewHealthScoreHandler(healthScoreService) healthScoreHandler := handler.NewHealthScoreHandler(healthScoreService)
@@ -258,6 +252,9 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
// Register notification routes // Register notification routes
notificationHandler.RegisterRoutes(protected) notificationHandler.RegisterRoutes(protected)
// Register health score routes
healthScoreHandler.RegisterRoutes(protected)
} }
} }