Version: 0.1.3.dev.260208

refactor: ♻️ 重命名部分接口接收器以避免与 dao 层包名冲突

- 调整部分接口接收器命名,避免与 dao 层包名重名 🧩

feat: 📅 新增获取用户今日日程接口并完成实现

fix: 🐛 修复现实日期与相对日期转换逻辑中的初始化时序问题

- 修复 conv/time.go 中日期转换函数的一个 bug ⏱️
- 解决 viper 在包级变量初始化时机过早的问题
- 避免因过早初始化导致无法读取配置中的学期开学/结束时间 📆
This commit is contained in:
LoveLosita
2026-02-08 19:09:40 +08:00
parent 75a44f2edd
commit 79b6be5f40
12 changed files with 391 additions and 28 deletions

View File

@@ -22,15 +22,15 @@ func (r *CourseDAO) WithTx(tx *gorm.DB) *CourseDAO {
return &CourseDAO{db: tx}
}
func (dao *CourseDAO) AddUserCoursesIntoSchedule(ctx context.Context, courses []model.Schedule) error {
if err := dao.db.WithContext(ctx).Create(&courses).Error; err != nil {
func (r *CourseDAO) AddUserCoursesIntoSchedule(ctx context.Context, courses []model.Schedule) error {
if err := r.db.WithContext(ctx).Create(&courses).Error; err != nil {
return err
}
return nil
}
func (dao *CourseDAO) AddUserCoursesIntoScheduleEvents(ctx context.Context, events []model.ScheduleEvent) ([]int, error) {
if err := dao.db.WithContext(ctx).Create(&events).Error; err != nil {
func (r *CourseDAO) AddUserCoursesIntoScheduleEvents(ctx context.Context, events []model.ScheduleEvent) ([]int, error) {
if err := r.db.WithContext(ctx).Create(&events).Error; err != nil {
return nil, err
}
ids := make([]int, 0, len(events))
@@ -43,8 +43,8 @@ func (dao *CourseDAO) AddUserCoursesIntoScheduleEvents(ctx context.Context, even
// Transaction 在同一个数据库事务中执行传入的函数,供 service 层复用(自动提交/回滚)
// 规则fn 返回 nil \-\> 提交fn 返回 error 或发生 panic \-\> 回滚
// 说明gorm\.\(\\\*DB\)\.Transaction 会在 fn 返回 error 时回滚,并在发生 panic 时自动回滚后继续向上抛出 panic
func (dao *CourseDAO) Transaction(fn func(txDAO *CourseDAO) error) error {
return dao.db.Transaction(func(tx *gorm.DB) error {
func (r *CourseDAO) Transaction(fn func(txDAO *CourseDAO) error) error {
return r.db.Transaction(func(tx *gorm.DB) error {
return fn(NewCourseDAO(tx))
})
}

View File

@@ -266,3 +266,21 @@ func (d *ScheduleDAO) GetNonCourseScheduleConflicts(ctx context.Context, newSche
return fullConflicts, err
}
func (d *ScheduleDAO) GetUserTodaySchedule(ctx context.Context, userID, week, dayOfWeek int) ([]model.Schedule, error) {
var schedules []model.Schedule
// 1. Preload("Event"): 拿到课程/任务的基础信息(名、地、型)
// 2. Preload("EmbeddedTask"): 拿到“水课”里嵌入的具体任务详情
err := d.db.WithContext(ctx).
Preload("Event").
Preload("EmbeddedTask").
Where("user_id = ? AND week = ? AND day_of_week = ?", userID, week, dayOfWeek).
Order("section ASC").
Find(&schedules).Error
if err != nil {
return nil, err
}
return schedules, nil
}

View File

@@ -29,7 +29,7 @@ func (r *UserDAO) WithTx(tx *gorm.DB) *UserDAO {
// Create 创建新用户
// 插入新用户信息到数据库
func (dao *UserDAO) Create(username, phoneNumber, password string) (*model.User, error) {
func (r *UserDAO) Create(username, phoneNumber, password string) (*model.User, error) {
// 创建User实例
user := &model.User{
Username: username,
@@ -41,15 +41,15 @@ func (dao *UserDAO) Create(username, phoneNumber, password string) (*model.User,
}
// 插入数据
if err := dao.db.Create(user).Error; err != nil {
if err := r.db.Create(user).Error; err != nil {
return nil, err
}
return user, nil
}
func (dao *UserDAO) IfUsernameExists(name string) (bool, error) {
err := dao.db.Where("username = ?", name).First(&model.User{}).Error
func (r *UserDAO) IfUsernameExists(name string) (bool, error) {
err := r.db.Where("username = ?", name).First(&model.User{}).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return false, nil
@@ -59,20 +59,29 @@ func (dao *UserDAO) IfUsernameExists(name string) (bool, error) {
return true, nil
}
func (dao *UserDAO) GetUserHashedPasswordByName(name string) (string, error) {
func (r *UserDAO) GetUserHashedPasswordByName(name string) (string, error) {
var user model.User
err := dao.db.Where("username = ?", name).First(&user).Error
err := r.db.Where("username = ?", name).First(&user).Error
if err != nil {
return "", err
}
return user.Password, nil
}
func (dao *UserDAO) GetUserIDByName(name string) (int, error) {
func (r *UserDAO) GetUserIDByName(name string) (int, error) {
var user model.User
err := dao.db.Where("username = ?", name).First(&user).Error
err := r.db.Where("username = ?", name).First(&user).Error
if err != nil {
return -1, err
}
return int(user.ID), nil
}
func (r *UserDAO) GetUserByID(id int) (*model.User, error) {
var user model.User
err := r.db.Where("id = ?", id).First(&user).Error
if err != nil {
return nil, err
}
return &user, nil
}