From e7686d597fb15612159b338dd947670f1c19788b Mon Sep 17 00:00:00 2001 From: miaowuawa <2484667023@qq.com> Date: Sun, 3 Aug 2025 16:57:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=8F=E9=AA=8C=E7=B3=BB=E7=BB=9F=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/core/cs/user.go | 1 + internal/core/level.go | 27 ++++++++ internal/dao/jinzhu/dbr/level.go | 53 ++++++++++++++++ internal/dao/jinzhu/dbr/user.go | 3 + internal/dao/jinzhu/jinzhu.go | 5 +- internal/dao/jinzhu/level.go | 54 ++++++++++++++++ internal/dao/jinzhu/user.go | 63 ++++++++++++++++++- internal/model/web/activities.go | 8 +++ internal/model/web/core.go | 1 + internal/servants/web/core.go | 1 + mirc/web/v1/activities.go | 4 ++ .../mysql/0016_create_user_level.down.sql | 2 + .../mysql/0016_create_user_level.up.sql | 21 +++++++ 13 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 internal/core/level.go create mode 100644 internal/dao/jinzhu/dbr/level.go create mode 100644 internal/dao/jinzhu/level.go create mode 100644 internal/model/web/activities.go create mode 100644 mirc/web/v1/activities.go create mode 100644 scripts/migration/mysql/0016_create_user_level.down.sql create mode 100644 scripts/migration/mysql/0016_create_user_level.up.sql diff --git a/internal/core/cs/user.go b/internal/core/cs/user.go index a983ebdb..b3ab8ed6 100644 --- a/internal/core/cs/user.go +++ b/internal/core/cs/user.go @@ -51,6 +51,7 @@ type UserProfile struct { CreatedOn int64 `json:"created_on"` TweetsCount int `json:"tweets_count"` Experience int `json:"experience"` + Level int `json:"level"` } func (t RelationTyp) String() string { diff --git a/internal/core/level.go b/internal/core/level.go new file mode 100644 index 00000000..527e067e --- /dev/null +++ b/internal/core/level.go @@ -0,0 +1,27 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package core + +import ( + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" +) + +// UserLevelService 用户等级服务接口 +type UserLevelService interface { + // GetLevelByExperience 根据经验值获取用户等级 + GetLevelByExperience(experience int) (*dbr.UserLevel, error) + + // GetAllLevels 获取所有等级配置 + GetAllLevels() ([]*dbr.UserLevel, error) + + // CreateLevel 创建等级配置 + CreateLevel(level *dbr.UserLevel) (*dbr.UserLevel, error) + + // UpdateLevel 更新等级配置 + UpdateLevel(level *dbr.UserLevel) error + + // DeleteLevel 删除等级配置 + DeleteLevel(level int) error +} diff --git a/internal/dao/jinzhu/dbr/level.go b/internal/dao/jinzhu/dbr/level.go new file mode 100644 index 00000000..a93c1ee0 --- /dev/null +++ b/internal/dao/jinzhu/dbr/level.go @@ -0,0 +1,53 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package dbr + +import ( + "gorm.io/gorm" +) + +// UserLevel 用户等级配置模型 +type UserLevel struct { + Level int `gorm:"column:level;primaryKey" json:"level"` // 等级 + MinExperience int `gorm:"column:min_experience" json:"min_experience"` // 最小经验值 + MaxExperience int `gorm:"column:max_experience" json:"max_experience"` // 最大经验值 + Name string `gorm:"column:name" json:"name"` // 等级名称 + Description string `gorm:"column:description" json:"description"` // 等级描述 +} + +// TableName 指定表名映射 +func (u *UserLevel) TableName() string { + return "p_user_level" +} + +// GetByExperience 根据经验值获取等级 +func (u *UserLevel) GetByExperience(db *gorm.DB, experience int) (*UserLevel, error) { + var level UserLevel + err := db.Where("min_experience <= ? AND max_experience >= ?", experience, experience).First(&level).Error + return &level, err +} + +// GetAll 获取所有等级配置 +func (u *UserLevel) GetAll(db *gorm.DB) ([]*UserLevel, error) { + var levels []*UserLevel + err := db.Order("level ASC").Find(&levels).Error + return levels, err +} + +// Create 创建等级配置 +func (u *UserLevel) Create(db *gorm.DB) (*UserLevel, error) { + err := db.Create(&u).Error + return u, err +} + +// Update 更新等级配置 +func (u *UserLevel) Update(db *gorm.DB) error { + return db.Model(&UserLevel{}).Where("level = ?", u.Level).Save(u).Error +} + +// Delete 删除等级配置 +func (u *UserLevel) Delete(db *gorm.DB) error { + return db.Where("level = ?", u.Level).Delete(&UserLevel{}).Error +} diff --git a/internal/dao/jinzhu/dbr/user.go b/internal/dao/jinzhu/dbr/user.go index 105cca57..b216733f 100644 --- a/internal/dao/jinzhu/dbr/user.go +++ b/internal/dao/jinzhu/dbr/user.go @@ -26,6 +26,7 @@ type User struct { Balance int64 `json:"balance"` IsAdmin bool `json:"is_admin"` Experience int `gorm:"-" json:"experience"` + Level int `gorm:"-" json:"level"` } type UserFormated struct { @@ -38,6 +39,7 @@ type UserFormated struct { IsFriend bool `json:"is_friend"` IsFollowing bool `json:"is_following"` Experience int `json:"experience"` + Level int `json:"level"` } func (u *User) Format() *UserFormated { @@ -50,6 +52,7 @@ func (u *User) Format() *UserFormated { Avatar: u.Avatar, IsAdmin: u.IsAdmin, Experience: u.Experience, + Level: u.Level, } } diff --git a/internal/dao/jinzhu/jinzhu.go b/internal/dao/jinzhu/jinzhu.go index 16b6d64a..0e6ea6cc 100644 --- a/internal/dao/jinzhu/jinzhu.go +++ b/internal/dao/jinzhu/jinzhu.go @@ -42,6 +42,7 @@ type dataSrv struct { core.TrendsManageServantA core.UserManageService core.UserMetricServantA + core.UserLevelService core.ContactManageService core.FollowingManageService core.UserRelationService @@ -62,12 +63,14 @@ func NewDataService() (core.DataService, core.VersionInfo) { pvs := security.NewPhoneVerifyService() tms := newTweetMetricServentA(db) ums := newUserMetricServentA(db) + uls := newUserLevelService(db) cms := newCommentMetricServentA(db) cis := cache.NewEventCacheIndexSrv(tms) ds := &dataSrv{ TweetMetricServantA: tms, CommentMetricServantA: cms, UserMetricServantA: ums, + UserLevelService: uls, WalletService: newWalletService(db), MessageService: newMessageService(db), TopicService: newTopicService(db), @@ -77,7 +80,7 @@ func NewDataService() (core.DataService, core.VersionInfo) { CommentService: newCommentService(db), CommentManageService: newCommentManageService(db), TrendsManageServantA: newTrendsManageServentA(db), - UserManageService: newUserManageService(db, ums), + UserManageService: newUserManageService(db, ums, uls), ContactManageService: newContactManageService(db), FollowingManageService: newFollowingManageService(db), UserRelationService: newUserRelationService(db), diff --git a/internal/dao/jinzhu/level.go b/internal/dao/jinzhu/level.go new file mode 100644 index 00000000..1d3cb8f2 --- /dev/null +++ b/internal/dao/jinzhu/level.go @@ -0,0 +1,54 @@ +// Copyright 2023 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package jinzhu + +import ( + "github.com/rocboss/paopao-ce/internal/core" + "github.com/rocboss/paopao-ce/internal/dao/jinzhu/dbr" + "gorm.io/gorm" +) + +var ( + _ core.UserLevelService = (*userLevelSrv)(nil) +) + +// userLevelSrv 实现用户等级服务接口 +type userLevelSrv struct { + db *gorm.DB +} + +// newUserLevelService 创建用户等级服务实例 +func newUserLevelService(db *gorm.DB) core.UserLevelService { + return &userLevelSrv{ + db: db, + } +} + +// GetLevelByExperience 根据经验值获取用户等级 +func (s *userLevelSrv) GetLevelByExperience(experience int) (*dbr.UserLevel, error) { + level := &dbr.UserLevel{} + return level.GetByExperience(s.db, experience) +} + +// GetAllLevels 获取所有等级配置 +func (s *userLevelSrv) GetAllLevels() ([]*dbr.UserLevel, error) { + level := &dbr.UserLevel{} + return level.GetAll(s.db) +} + +// CreateLevel 创建等级配置 +func (s *userLevelSrv) CreateLevel(level *dbr.UserLevel) (*dbr.UserLevel, error) { + return level.Create(s.db) +} + +// UpdateLevel 更新等级配置 +func (s *userLevelSrv) UpdateLevel(level *dbr.UserLevel) error { + return level.Update(s.db) +} + +// DeleteLevel 删除等级配置 +func (s *userLevelSrv) DeleteLevel(level int) error { + return (&dbr.UserLevel{Level: level}).Delete(s.db) +} diff --git a/internal/dao/jinzhu/user.go b/internal/dao/jinzhu/user.go index cd854879..380a01ef 100644 --- a/internal/dao/jinzhu/user.go +++ b/internal/dao/jinzhu/user.go @@ -22,6 +22,7 @@ var ( type userManageSrv struct { db *gorm.DB ums core.UserMetricServantA + uls core.UserLevelService _userProfileJoins string _userProfileWhere string @@ -32,10 +33,11 @@ type userRelationSrv struct { db *gorm.DB } -func newUserManageService(db *gorm.DB, ums core.UserMetricServantA) core.UserManageService { +func newUserManageService(db *gorm.DB, ums core.UserMetricServantA, uls core.UserLevelService) core.UserManageService { return &userManageSrv{ db: db, ums: ums, + uls: uls, _userProfileJoins: fmt.Sprintf("LEFT JOIN %s m ON %s.id=m.user_id", _userMetric_, _user_), _userProfileWhere: fmt.Sprintf("%s.username=? AND %s.is_del=0", _user_, _user_), _userProfileColumns: []string{ @@ -72,6 +74,16 @@ func (s *userManageSrv) GetUserByID(id int64) (*ms.User, error) { return nil, err } user.Experience = metric.Experience + + // 获取用户等级 + level, err := s.uls.GetLevelByExperience(user.Experience) + if err == nil { + user.Level = level.Level + } else { + // 默认等级为1 + user.Level = 1 + } + return user, nil } @@ -88,6 +100,16 @@ func (s *userManageSrv) GetUserByUsername(username string) (*ms.User, error) { return user, nil } user.Experience = metric.Experience + + // 获取用户等级 + level, err := s.uls.GetLevelByExperience(user.Experience) + if err == nil { + user.Level = level.Level + } else { + // 默认等级为1 + user.Level = 1 + } + return user, nil } @@ -97,6 +119,18 @@ func (s *userManageSrv) UserProfileByName(username string) (res *cs.UserProfile, Where(s._userProfileWhere, username). Select(s._userProfileColumns). First(&res).Error + + if err == nil && res != nil { + // 获取用户等级 + level, err := s.uls.GetLevelByExperience(res.Experience) + if err == nil { + res.Level = level.Level + } else { + // 默认等级为1 + res.Level = 1 + } + } + return } @@ -116,6 +150,15 @@ func (s *userManageSrv) GetUserByPhone(phone string) ([]*ms.User, error) { metric, err := s.ums.GetUserMetric(u.ID) if err == nil { u.Experience = metric.Experience + + // 获取用户等级 + level, err := s.uls.GetLevelByExperience(u.Experience) + if err == nil { + u.Level = level.Level + } else { + // 默认等级为1 + u.Level = 1 + } } } @@ -136,6 +179,15 @@ func (s *userManageSrv) GetUsersByIDs(ids []int64) ([]*ms.User, error) { metric, err := s.ums.GetUserMetric(u.ID) if err == nil { u.Experience = metric.Experience + + // 获取用户等级 + level, err := s.uls.GetLevelByExperience(u.Experience) + if err == nil { + u.Level = level.Level + } else { + // 默认等级为1 + u.Level = 1 + } } } @@ -166,6 +218,15 @@ func (s *userManageSrv) GetUsersByKeyword(keyword string) ([]*ms.User, error) { metric, err := s.ums.GetUserMetric(u.ID) if err == nil { u.Experience = metric.Experience + + // 获取用户等级 + level, err := s.uls.GetLevelByExperience(u.Experience) + if err == nil { + u.Level = level.Level + } else { + // 默认等级为1 + u.Level = 1 + } } } diff --git a/internal/model/web/activities.go b/internal/model/web/activities.go new file mode 100644 index 00000000..6125576a --- /dev/null +++ b/internal/model/web/activities.go @@ -0,0 +1,8 @@ +package web + +type UserCheckInResp struct { + // CheckInCount 签到次数 + CheckInExp int `json:"check_in_exp"` + // CheckInDays 签到天数 + CheckInDays int `json:"check_in_days"` +} diff --git a/internal/model/web/core.go b/internal/model/web/core.go index b294dbfb..686b904d 100644 --- a/internal/model/web/core.go +++ b/internal/model/web/core.go @@ -43,6 +43,7 @@ type UserInfoResp struct { Followings int64 `json:"followings"` TweetsCount int `json:"tweets_count"` Experience int `json:"experience"` + Level int `json:"level"` } type GetMessagesReq struct { diff --git a/internal/servants/web/core.go b/internal/servants/web/core.go index ea2c8a4f..13a78fdd 100644 --- a/internal/servants/web/core.go +++ b/internal/servants/web/core.go @@ -79,6 +79,7 @@ func (s *coreSrv) GetUserInfo(req *web.UserInfoReq) (*web.UserInfoResp, error) { Followings: followings, TweetsCount: user.TweetsCount, Experience: user.Experience, + Level: user.Level, } if user.Phone != "" && len(user.Phone) == 11 { resp.Phone = user.Phone[0:3] + "****" + user.Phone[7:] diff --git a/mirc/web/v1/activities.go b/mirc/web/v1/activities.go new file mode 100644 index 00000000..378a3b22 --- /dev/null +++ b/mirc/web/v1/activities.go @@ -0,0 +1,4 @@ +package v1 + +type CheckInActivitity struct { +} diff --git a/scripts/migration/mysql/0016_create_user_level.down.sql b/scripts/migration/mysql/0016_create_user_level.down.sql new file mode 100644 index 00000000..88c99393 --- /dev/null +++ b/scripts/migration/mysql/0016_create_user_level.down.sql @@ -0,0 +1,2 @@ +-- 删除用户等级表 +DROP TABLE IF EXISTS `p_user_level`; \ No newline at end of file diff --git a/scripts/migration/mysql/0016_create_user_level.up.sql b/scripts/migration/mysql/0016_create_user_level.up.sql new file mode 100644 index 00000000..3d3d88ab --- /dev/null +++ b/scripts/migration/mysql/0016_create_user_level.up.sql @@ -0,0 +1,21 @@ +-- 创建用户等级表 +CREATE TABLE IF NOT EXISTS `p_user_level` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `level` int(11) NOT NULL COMMENT '等级', + `min_experience` int(11) NOT NULL COMMENT '最小经验值', + `max_experience` int(11) NOT NULL COMMENT '最大经验值', + `created_on` int(11) NOT NULL DEFAULT 0, + `updated_on` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `idx_level` (`level`), + UNIQUE KEY `idx_min_experience` (`min_experience`), + UNIQUE KEY `idx_max_experience` (`max_experience`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户等级配置表'; + +-- 插入初始等级数据 +INSERT INTO `p_user_level` (`level`, `min_experience`, `max_experience`, `created_on`, `updated_on`) VALUES +(1, 0, 100, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(2, 101, 300, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(3, 301, 600, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(4, 601, 1000, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(5, 1001, 1500, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); \ No newline at end of file