|
|
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
|
|
|
}
|