You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.7 KiB

package model
import (
"fmt"
"strconv"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
)
type Sign struct {
Id int64 `form:"id" json:"id,omitempty" gorm:"primaryKey;autoIncrement;column:id;comment:;"`
UserId int64 `form:"user_id" json:"user_id,omitempty" gorm:"column:user_id;type:bigint(20);size:20;default:0;index:idx_user_id;index:idx_user_sign_at,unique;comment:签到的用户ID;"`
Ip string `form:"ip" json:"ip,omitempty" gorm:"column:ip;type:varchar(64);size:64;comment:签到的用户IP;"`
SignAt int `form:"sign_at" json:"sign_at,omitempty" gorm:"column:sign_at;type:int(11);size:11;default:0;index:idx_user_sign_at,unique;comment:签到时间格式20060102;"`
CreatedAt *time.Time `form:"created_at" json:"created_at,omitempty" gorm:"column:created_at;type:datetime;comment:创建时间;"`
UpdatedAt *time.Time `form:"updated_at" json:"updated_at,omitempty" gorm:"column:updated_at;type:datetime;comment:更新时间;"`
Award int32 `form:"award" json:"award,omitempty" gorm:"column:award;type:int(11);size:11;default:0;comment:奖励积分;"`
}
func (Sign) TableName() string {
return tablePrefix + "sign"
}
// CreateSign 用户签到
// 1. 创建签到记录
// 2. 更新用户签积分
func (m *DBModel) CreateSign(userId int64, ip string) (sign *Sign, err error) {
now := time.Now()
signAt, _ := strconv.Atoi(now.Format("20060102"))
sign = &Sign{
UserId: userId,
Ip: ip,
SignAt: signAt,
}
cfg := m.GetConfigOfScore(ConfigScoreSignIn, ConfigScoreCreditName)
sign.Award = cfg.SignIn
tx := m.db.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
err = tx.Create(sign).Error
if err != nil {
m.logger.Error("CreateSign Create", zap.Error(err))
return
}
content := "完成了每日签到"
if cfg.SignIn > 0 {
// 1. 更新用户积分
err = tx.Model(&User{}).Where("id=?", userId).Update("credit_count", gorm.Expr("credit_count + ?", cfg.SignIn)).Error
if err != nil {
m.logger.Error("CreateSign Update", zap.Error(err))
return
}
content = fmt.Sprintf("签到成功,获得 %d %s奖励", cfg.SignIn, cfg.CreditName)
}
dynamic := Dynamic{
UserId: userId,
Type: DynamicTypeSign,
Content: content,
}
err = tx.Create(&dynamic).Error
if err != nil {
m.logger.Error("CreateSign Create Dynamic", zap.Error(err))
return
}
return
}
// 用户今日是否已签到
func (m *DBModel) GetSignedToday(userId int64) (sign Sign) {
signAt, _ := strconv.Atoi(time.Now().Format("20060102"))
err := m.db.Where("user_id=? and sign_at=?", userId, signAt).First(&sign).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetSignedToday", zap.Error(err))
}
return
}