Feat: user setting

This commit is contained in:
HFO4
2020-02-19 16:05:54 +08:00
parent 33a917cc75
commit 4420a75c04
16 changed files with 577 additions and 20 deletions

View File

@@ -148,7 +148,7 @@ Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; verti
{Name: "hot_share_num", Value: `10`, Type: "share"},
{Name: "allow_buy_group", Value: `1`, Type: "group_sell"},
{Name: "group_sell_data", Value: `[]`, Type: "group_sell"},
{Name: "gravatar_server", Value: `https://v2ex.assets.uxengine.net/gravatar/`, Type: "avatar"},
{Name: "gravatar_server", Value: `https://gravatar.loli.net/`, Type: "avatar"},
{Name: "defaultTheme", Value: `#3f51b5`, Type: "basic"},
{Name: "themes", Value: `{"#3f51b5":{"palette":{"primary":{"light":"#7986cb","main":"#3f51b5","dark":"#303f9f","contrastText":"#fff"},"secondary":{"light":"#ff4081","main":"#f50057","dark":"#c51162","contrastText":"#fff"},"error":{"light":"#e57373","main":"#f44336","dark":"#d32f2f","contrastText":"#fff"},"explorer":{"filename":"#474849","icon":"#8f8f8f","bgSelected":"#D5DAF0","emptyIcon":"#e8e8e8"}}}}`, Type: "basic"},
{Name: "aria2_token", Value: `your token`, Type: "aria2"},
@@ -160,6 +160,11 @@ Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; verti
{Name: "max_parallel_transfer", Value: `4`, Type: "task"},
{Name: "secret_key", Value: util.RandStringRunes(256), Type: "auth"},
{Name: "temp_path", Value: "temp", Type: "path"},
{Name: "avatar_path", Value: "avatar", Type: "path"},
{Name: "avatar_size", Value: "2097152", Type: "avatar"},
{Name: "avatar_size_l", Value: "200", Type: "avatar"},
{Name: "avatar_size_m", Value: "130", Type: "avatar"},
{Name: "avatar_size_s", Value: "50", Type: "avatar"},
{Name: "score_enabled", Value: "1", Type: "score"},
{Name: "share_score_rate", Value: "80", Type: "score"},
{Name: "score_price", Value: "1", Type: "score"},

View File

@@ -45,7 +45,7 @@ type User struct {
NotifyDate *time.Time // 通知超出配额时的日期
// 关联模型
Group Group `gorm:"association_autoupdate:false"`
Group Group `gorm:"save_associations:false:false"`
Policy Policy `gorm:"PRELOAD:false,association_autoupdate:false"`
// 数据库忽略字段
@@ -73,12 +73,12 @@ func (user *User) DeductionStorage(size uint64) bool {
}
if size <= user.Storage {
user.Storage -= size
DB.Model(user).UpdateColumn("storage", gorm.Expr("storage - ?", size))
DB.Model(user).Update("storage", gorm.Expr("storage - ?", size))
return true
}
// 如果要减少的容量超出已用容量,则设为零
user.Storage = 0
DB.Model(user).UpdateColumn("storage", 0)
DB.Model(user).Update("storage", 0)
return false
}
@@ -90,7 +90,7 @@ func (user *User) IncreaseStorage(size uint64) bool {
}
if size <= user.GetRemainingCapacity() {
user.Storage += size
DB.Model(user).UpdateColumn("storage", gorm.Expr("storage + ?", size))
DB.Model(user).Update("storage", gorm.Expr("storage + ?", size))
return true
}
return false
@@ -103,7 +103,7 @@ func (user *User) PayScore(score int) bool {
}
if score <= user.Score {
user.Score -= score
DB.Model(user).UpdateColumn("score", gorm.Expr("score - ?", score))
DB.Model(user).Update("score", gorm.Expr("score - ?", score))
return true
}
return false
@@ -112,7 +112,7 @@ func (user *User) PayScore(score int) bool {
// AddScore 增加积分
func (user *User) AddScore(score int) {
user.Score += score
DB.Model(user).UpdateColumn("score", gorm.Expr("score + ?", score))
DB.Model(user).Update("score", gorm.Expr("score + ?", score))
}
// IncreaseStorageWithoutCheck 忽略可用容量,增加用户已用容量
@@ -121,7 +121,7 @@ func (user *User) IncreaseStorageWithoutCheck(size uint64) {
return
}
user.Storage += size
DB.Model(user).UpdateColumn("storage", gorm.Expr("storage + ?", size))
DB.Model(user).Update("storage", gorm.Expr("storage + ?", size))
}
@@ -175,7 +175,7 @@ func GetActiveUserByID(ID interface{}) (User, error) {
// GetUserByEmail 用Email获取用户
func GetUserByEmail(email string) (User, error) {
var user User
result := DB.Set("gorm:auto_preload", true).Where("email = ?", email).First(&user)
result := DB.Set("gorm:auto_preload", true).Where("status = ? and email = ?", Active, email).First(&user)
return user, result.Error
}
@@ -296,6 +296,11 @@ func (user *User) SetStatus(status int) {
DB.Model(&user).Update("status", status)
}
// Update 更新用户
func (user *User) Update(val map[string]interface{}) error {
return DB.Model(user).Updates(val).Error
}
// GetGroupExpiredUsers 获取用户组过期的用户
func GetGroupExpiredUsers() []User {
var users []User

View File

@@ -49,5 +49,5 @@ func (user *User) RegisterAuthn(credential *webauthn.Credential) {
if err != nil {
fmt.Println(err)
}
DB.Model(user).UpdateColumn("authn", string(res))
DB.Model(user).Update("authn", string(res))
}

View File

@@ -151,7 +151,6 @@ func TestNewUser(t *testing.T) {
newUser := NewUser()
asserts.IsType(User{}, newUser)
asserts.NotEmpty(newUser.Avatar)
asserts.NotEmpty(newUser.OptionsSerialized)
}
func TestUser_AfterFind(t *testing.T) {
@@ -304,7 +303,7 @@ func TestUser_DeductionStorage(t *testing.T) {
Storage: 10,
}
mock.ExpectBegin()
mock.ExpectExec("UPDATE(.+)").WithArgs(5, 1).WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectExec("UPDATE(.+)").WithArgs(5, sqlmock.AnyArg(), 1).WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectCommit()
asserts.True(user.DeductionStorage(5))
@@ -319,7 +318,7 @@ func TestUser_DeductionStorage(t *testing.T) {
Storage: 10,
}
mock.ExpectBegin()
mock.ExpectExec("UPDATE(.+)").WithArgs(0, 1).WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectExec("UPDATE(.+)").WithArgs(0, sqlmock.AnyArg(), 1).WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectCommit()
asserts.False(user.DeductionStorage(20))
@@ -355,11 +354,11 @@ func TestUser_IncreaseStorageWithoutCheck(t *testing.T) {
func TestGetUserByEmail(t *testing.T) {
asserts := assert.New(t)
mock.ExpectQuery("SELECT(.+)").WithArgs("abslant@foxmail.com").WillReturnRows(sqlmock.NewRows([]string{"id", "email"}))
mock.ExpectQuery("SELECT(.+)").WithArgs(Active, "abslant@foxmail.com").WillReturnRows(sqlmock.NewRows([]string{"id", "email"}))
_, err := GetUserByEmail("abslant@foxmail.com")
asserts.NoError(mock.ExpectationsWereMet())
asserts.Error(err)
asserts.NoError(mock.ExpectationsWereMet())
}
func TestUser_AfterCreate(t *testing.T) {