From 994597cd94422ced06945ab797b97a25f1fe5411 Mon Sep 17 00:00:00 2001 From: "daniel.w" Date: Thu, 22 Aug 2024 22:21:43 +0800 Subject: [PATCH] add uid generate --- Makefile | 4 +- .../mysql/20230529020013_user_table.up.sql | 1 + generate/protobuf/service.proto | 8 +- go.mod | 2 +- internal/model/account_model.go | 19 ++ internal/model/user_table_model.go | 186 ++++++++++++++++++ 6 files changed, 214 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 7953270..bb182f6 100644 --- a/Makefile +++ b/Makefile @@ -48,8 +48,8 @@ build-docker: .PHONY: gen-my-sql-model gen-my-sql-model: # 建立 rpc 資料庫 goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020011_account_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i '' - goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020011_account_uid_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i '' - goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020011_user_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i '' + goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020012_account_uid_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i '' + goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020013_user_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i '' goctl model mysql ddl -c no -s ./generate/database/mysql/20230719061241_machine_node.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i '' @echo "Generate mysql model files successfully" diff --git a/generate/database/mysql/20230529020013_user_table.up.sql b/generate/database/mysql/20230529020013_user_table.up.sql index ce8a45d..0db127c 100644 --- a/generate/database/mysql/20230529020013_user_table.up.sql +++ b/generate/database/mysql/20230529020013_user_table.up.sql @@ -12,5 +12,6 @@ CREATE TABLE `user_table` ( `update_time` BIGINT NOT NULL DEFAULT 0, PRIMARY KEY (`id`), INDEX `idx_create_time` (`create_time` ASC), + INDEX `idx_nick_name` (`nick_name` ASC), UNIQUE INDEX `uk_uid` (`uid` ASC) )ENGINE=InnoDB COMMENT='使用者資訊'; diff --git a/generate/protobuf/service.proto b/generate/protobuf/service.proto index 76819d1..19bcffe 100644 --- a/generate/protobuf/service.proto +++ b/generate/protobuf/service.proto @@ -85,9 +85,10 @@ message UpdateUserInfoReq { optional string language = 2; optional string currency = 3; optional string nick_name = 4; - optional VerifyType verify_type = 5; - optional AlarmType alarm_type = 6; - optional MemberStatus status = 7; + optional string avatar = 5; + optional VerifyType verify_type = 6; + optional AlarmType alarm_type = 7; + optional MemberStatus status = 8; } message GetUIDByAccountReq { @@ -102,6 +103,7 @@ message GetUidByAccountResp { message UpdateTokenReq { string account = 1; string token = 2; + int64 platform=3; } message GenerateRefreshCodeReq { diff --git a/go.mod b/go.mod index cb140e3..fdce8a4 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( go.mongodb.org/mongo-driver v1.16.0 go.uber.org/goleak v1.3.0 go.uber.org/mock v0.4.0 + golang.org/x/crypto v0.25.0 google.golang.org/grpc v1.65.0 google.golang.org/protobuf v1.34.2 ) @@ -90,7 +91,6 @@ require ( go.uber.org/automaxprocs v1.5.3 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.25.0 // indirect golang.org/x/net v0.27.0 // indirect golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sync v0.7.0 // indirect diff --git a/internal/model/account_model.go b/internal/model/account_model.go index 958d6dc..3a9dcdc 100755 --- a/internal/model/account_model.go +++ b/internal/model/account_model.go @@ -1,6 +1,9 @@ package model import ( + "context" + "database/sql" + "fmt" "github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/sqlx" ) @@ -12,6 +15,7 @@ type ( // and implement the added methods in customAccountModel. AccountModel interface { accountModel + UpdateTokenByLoginID(ctx context.Context, account string, token string) error } customAccountModel struct { @@ -25,3 +29,18 @@ func NewAccountModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) defaultAccountModel: newAccountModel(conn, c, opts...), } } + +func (m *defaultAccountModel) UpdateTokenByLoginID(ctx context.Context, account string, token string) error { + data, err := m.FindOneByAccount(ctx, account) + if err != nil { + return err + } + + accountAccountKey := fmt.Sprintf("%s%v", cacheAccountAccountPrefix, data.Account) + accountIdKey := fmt.Sprintf("%s%v", cacheAccountIdPrefix, data.Id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set `token` = ? where `id` = ?", m.table) + return conn.ExecCtx(ctx, query, token, data.Id) + }, accountAccountKey, accountIdKey) + return err +} diff --git a/internal/model/user_table_model.go b/internal/model/user_table_model.go index 13f2b1d..85c3567 100755 --- a/internal/model/user_table_model.go +++ b/internal/model/user_table_model.go @@ -1,8 +1,15 @@ package model import ( + "app-cloudep-member-server/gen_result/pb/member" + "context" + "database/sql" + "fmt" "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" "github.com/zeromicro/go-zero/core/stores/sqlx" + "strings" + "time" ) var _ UserTableModel = (*customUserTableModel)(nil) @@ -12,11 +19,27 @@ type ( // and implement the added methods in customUserTableModel. UserTableModel interface { userTableModel + FindOneByNickName(ctx context.Context, uid string) (*UserTable, error) + ListMembers(ctx context.Context, params *UserQueryParams) ([]*UserTable, error) + Count(ctx context.Context) (int64, error) + UpdateStatus(ctx context.Context, uid string, status int32) error + UpdateSome(ctx context.Context, newData *member.UpdateUserInfoReq) error } customUserTableModel struct { *defaultUserTableModel } + + UserQueryParams struct { + RoleId *string + VerifyType *int32 + AlarmType *int32 + Status *int32 + CreateStartTime *int64 + CreateEndTime *int64 + PageSize int64 + PageIndex int64 + } ) // NewUserTableModel returns a model for the database table. @@ -25,3 +48,166 @@ func NewUserTableModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Optio defaultUserTableModel: newUserTableModel(conn, c, opts...), } } + +func (m *defaultUserTableModel) FindOneByNickName(ctx context.Context, nickName string) (*UserTable, error) { + userTableUidKey := fmt.Sprintf("%s%v", cacheUserTableUidPrefix, nickName) + var resp UserTable + err := m.QueryRowIndexCtx(ctx, &resp, userTableUidKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v any) (i any, e error) { + query := fmt.Sprintf("select %s from %s where `nick_name` = ? limit 1", userTableRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, nickName); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultUserTableModel) ListMembers(ctx context.Context, params *UserQueryParams) ([]*UserTable, error) { + query := fmt.Sprintf("select %s from %s", userTableRows, m.table) + var args = make([]any, 0, 10) + var conditions []string + + if params.RoleId != nil { + conditions = append(conditions, "role_id = ?") + args = append(args, *params.RoleId) + } + + if params.VerifyType != nil { + conditions = append(conditions, "verify_type = ?") + args = append(args, *params.VerifyType) + } + + if params.AlarmType != nil { + conditions = append(conditions, "alarm_type = ?") + args = append(args, *params.AlarmType) + } + + if params.Status != nil { + conditions = append(conditions, "status = ?") + args = append(args, *params.Status) + } + + if params.CreateStartTime != nil { + conditions = append(conditions, "create_time >= ?") + args = append(args, *params.CreateStartTime) + } + + if params.CreateEndTime != nil { + conditions = append(conditions, "create_time <= ?") + args = append(args, *params.CreateEndTime) + } + + // 加入條件到查詢語句中 + if len(conditions) > 0 { + query += " WHERE " + strings.Join(conditions, " AND ") + } + + // 分頁處理 + offset := (params.PageIndex - 1) * params.PageSize + query += " LIMIT ? OFFSET ?" + args = append(args, params.PageSize, offset) + + var users []*UserTable + fmt.Println("query:", query) + fmt.Println("args:", args) + err := m.QueryRowsNoCacheCtx(ctx, &users, query, args...) + if err != nil { + return nil, err + } + + return users, nil +} + +func (m *defaultUserTableModel) Count(ctx context.Context) (int64, error) { + var count int64 + query := fmt.Sprintf("select count(*) from %s", m.table) + err := m.QueryRowNoCacheCtx(ctx, &count, query) + if err != nil { + return 0, err + } + return count, nil +} + +func (m *defaultUserTableModel) UpdateStatus(ctx context.Context, uid string, status int32) error { + data, err := m.FindOneByUid(ctx, uid) + if err != nil { + return err + } + + userTableIdKey := fmt.Sprintf("%s%v", cacheUserTableIdPrefix, data.Id) + userTableUidKey := fmt.Sprintf("%s%v", cacheUserTableUidPrefix, data.Uid) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set `status` = ? where `id` = ?", m.table) + return conn.ExecCtx(ctx, query, status, data.Id) + }, userTableIdKey, userTableUidKey) + return err +} + +func (m *defaultUserTableModel) UpdateSome(ctx context.Context, newData *member.UpdateUserInfoReq) error { + data, err := m.FindOneByUid(ctx, newData.Uid) + if err != nil { + return err + } + + // 初始化缓存键 + userTableIdKey := fmt.Sprintf("%s%v", cacheUserTableIdPrefix, data.Id) + userTableUidKey := fmt.Sprintf("%s%v", cacheUserTableUidPrefix, data.Uid) + + query := fmt.Sprintf("update %s set ", m.table) + var args []interface{} + var updates []string + + if newData.VerifyType != nil { + updates = append(updates, "verify_type = ?") + args = append(args, *newData.VerifyType) + } + if newData.AlarmType != nil { + updates = append(updates, "alarm_type = ?") + args = append(args, *newData.AlarmType) + } + if newData.Status != nil { + updates = append(updates, "status = ?") + args = append(args, *newData.Status) + } + + if newData.Language != nil { + updates = append(updates, "language = ?") + args = append(args, *newData.Language) + } + if newData.Currency != nil { + updates = append(updates, "currency = ?") + args = append(args, *newData.Currency) + } + if newData.NickName != nil { + updates = append(updates, "nick_name = ?") + args = append(args, *newData.NickName) + } + if newData.Avatar != nil { + updates = append(updates, "avatar = ?") + args = append(args, *newData.Avatar) + } + + if len(updates) == 0 { + return nil + } + + update := time.Now().UTC().Unix() + updates = append(updates, "update_time = ?") + args = append(args, &update) + + query += strings.Join(updates, ", ") + " where `id` = ?" + args = append(args, data.Id) + + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + return conn.ExecCtx(ctx, query, args...) + }, userTableIdKey, userTableUidKey) + + return err +}