mirror of
https://github.com/go-nunu/nunu-layout-advanced.git
synced 2025-09-26 20:41:33 +08:00
feat: Add English comments
This commit is contained in:
@@ -21,7 +21,7 @@ log:
|
||||
log_level: debug
|
||||
encoding: console # json or console
|
||||
log_file_name: "./storage/logs/server.log"
|
||||
max_backups: 30 # 日志文件最多保存多少个备份
|
||||
max_age: 7 # 文件最多保存多少天
|
||||
max_size: 1024 # 每个日志文件保存的最大尺寸 单位:M
|
||||
compress: true # 是否压缩
|
||||
max_backups: 30
|
||||
max_age: 7
|
||||
max_size: 1024
|
||||
compress: true
|
@@ -21,7 +21,7 @@ log:
|
||||
log_level: info
|
||||
encoding: json # json or console
|
||||
log_file_name: "./storage/logs/server.log"
|
||||
max_backups: 30 # 日志文件最多保存多少个备份
|
||||
max_age: 7 # 文件最多保存多少天
|
||||
max_size: 1024 # 每个日志文件保存的最大尺寸 单位:M
|
||||
compress: true # 是否压缩
|
||||
max_backups: 30
|
||||
max_age: 7
|
||||
max_size: 1024
|
||||
compress: true
|
@@ -17,7 +17,7 @@ import (
|
||||
func RequestLogMiddleware(logger *log.Logger) gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
|
||||
// 每次请求都初始化一次配置
|
||||
// The configuration is initialized once per request
|
||||
trace := md5.Md5(uuid.GenUUID())
|
||||
logger.NewContext(ctx, zap.String("trace", trace))
|
||||
logger.NewContext(ctx, zap.String("request_method", ctx.Request.Method))
|
||||
|
@@ -3,6 +3,7 @@ package migration
|
||||
import (
|
||||
"github.com/go-nunu/nunu-layout-advanced/internal/model"
|
||||
"github.com/go-nunu/nunu-layout-advanced/pkg/log"
|
||||
"go.uber.org/zap"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
@@ -18,6 +19,9 @@ func NewMigrate(db *gorm.DB, log *log.Logger) *Migrate {
|
||||
}
|
||||
}
|
||||
func (m *Migrate) Run() {
|
||||
m.db.AutoMigrate(&model.User{})
|
||||
if err := m.db.AutoMigrate(&model.User{}); err != nil {
|
||||
m.log.Error("user migrate error", zap.Error(err))
|
||||
return
|
||||
}
|
||||
m.log.Info("AutoMigrate end")
|
||||
}
|
||||
|
@@ -19,11 +19,12 @@ func NewServerHTTP(
|
||||
r.Use(
|
||||
middleware.CORSMiddleware(),
|
||||
middleware.ResponseLogMiddleware(logger),
|
||||
middleware.RequestLogMiddleware(logger),
|
||||
//middleware.SignMiddleware(log),
|
||||
)
|
||||
|
||||
// 无权限路由
|
||||
noAuthRouter := r.Group("/").Use(middleware.RequestLogMiddleware(logger))
|
||||
// No route group has permission
|
||||
noAuthRouter := r.Group("/")
|
||||
{
|
||||
|
||||
noAuthRouter.GET("/", func(ctx *gin.Context) {
|
||||
@@ -36,14 +37,14 @@ func NewServerHTTP(
|
||||
noAuthRouter.POST("/register", userHandler.Register)
|
||||
noAuthRouter.POST("/login", userHandler.Login)
|
||||
}
|
||||
// 非严格权限路由
|
||||
noStrictAuthRouter := r.Group("/").Use(middleware.NoStrictAuth(jwt, logger), middleware.RequestLogMiddleware(logger))
|
||||
// Non-strict permission routing group
|
||||
noStrictAuthRouter := r.Group("/").Use(middleware.NoStrictAuth(jwt, logger))
|
||||
{
|
||||
noStrictAuthRouter.GET("/user", userHandler.GetProfile)
|
||||
}
|
||||
|
||||
// 严格权限路由
|
||||
strictAuthRouter := r.Group("/").Use(middleware.StrictAuth(jwt, logger), middleware.RequestLogMiddleware(logger))
|
||||
// Strict permission routing group
|
||||
strictAuthRouter := r.Group("/").Use(middleware.StrictAuth(jwt, logger))
|
||||
{
|
||||
strictAuthRouter.PUT("/user", userHandler.UpdateProfile)
|
||||
}
|
||||
|
@@ -36,7 +36,6 @@ type UserService interface {
|
||||
Login(ctx context.Context, req *LoginRequest) (string, error)
|
||||
GetProfile(ctx context.Context, userId string) (*model.User, error)
|
||||
UpdateProfile(ctx context.Context, userId string, req *UpdateProfileRequest) error
|
||||
GenerateToken(ctx context.Context, userId string) (string, error)
|
||||
}
|
||||
|
||||
type userService struct {
|
||||
@@ -61,12 +60,12 @@ func (s *userService) Register(ctx context.Context, req *RegisterRequest) error
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to hash password")
|
||||
}
|
||||
// 生成用户ID
|
||||
// Generate user ID
|
||||
userId, err := s.sid.GenString()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to generate user ID")
|
||||
}
|
||||
// 创建用户
|
||||
// Create a user
|
||||
user := &model.User{
|
||||
UserId: userId,
|
||||
Username: req.Username,
|
||||
@@ -90,8 +89,7 @@ func (s *userService) Login(ctx context.Context, req *LoginRequest) (string, err
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "failed to hash password")
|
||||
}
|
||||
// 生成JWT token
|
||||
token, err := s.GenerateToken(ctx, user.UserId)
|
||||
token, err := s.jwt.GenToken(user.UserId, time.Now().Add(time.Hour*24*90))
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "failed to generate JWT token")
|
||||
}
|
||||
@@ -123,13 +121,3 @@ func (s *userService) UpdateProfile(ctx context.Context, userId string, req *Upd
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *userService) GenerateToken(ctx context.Context, userId string) (string, error) {
|
||||
// 生成JWT token
|
||||
token, err := s.jwt.GenToken(userId, time.Now().Add(time.Hour*24*90))
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "failed to generate JWT token")
|
||||
}
|
||||
|
||||
return token, nil
|
||||
}
|
||||
|
@@ -36,21 +36,6 @@ func (m *MockUserService) EXPECT() *MockUserServiceMockRecorder {
|
||||
return m.recorder
|
||||
}
|
||||
|
||||
// GenerateToken mocks base method.
|
||||
func (m *MockUserService) GenerateToken(ctx context.Context, userId string) (string, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "GenerateToken", ctx, userId)
|
||||
ret0, _ := ret[0].(string)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// GenerateToken indicates an expected call of GenerateToken.
|
||||
func (mr *MockUserServiceMockRecorder) GenerateToken(ctx, userId interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateToken", reflect.TypeOf((*MockUserService)(nil).GenerateToken), ctx, userId)
|
||||
}
|
||||
|
||||
// GetProfile mocks base method.
|
||||
func (m *MockUserService) GetProfile(ctx context.Context, userId string) (*model.User, error) {
|
||||
m.ctrl.T.Helper()
|
||||
|
@@ -18,15 +18,12 @@ func NewSid() *Sid {
|
||||
return &Sid{sf}
|
||||
}
|
||||
func (s Sid) GenString() (string, error) {
|
||||
// 生成分布式ID
|
||||
id, err := s.sf.NextID()
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "failed to generate sonyflake ID")
|
||||
}
|
||||
// 将ID转换为字符串
|
||||
return convert.IntToBase62(int(id)), nil
|
||||
}
|
||||
func (s Sid) GenUint64() (uint64, error) {
|
||||
// 生成分布式ID
|
||||
return s.sf.NextID()
|
||||
}
|
||||
|
@@ -21,9 +21,8 @@ func NewLog(conf *viper.Viper) *Logger {
|
||||
}
|
||||
|
||||
func initZap(conf *viper.Viper) *Logger {
|
||||
// 日志地址 "out.log" 自定义
|
||||
// log address "out.log" User-defined
|
||||
lp := conf.GetString("log.log_file_name")
|
||||
// 日志级别 DEBUG,ERROR, INFO
|
||||
lv := conf.GetString("log.log_level")
|
||||
var level zapcore.Level
|
||||
//debug<info<warn<error<fatal<panic
|
||||
@@ -40,11 +39,11 @@ func initZap(conf *viper.Viper) *Logger {
|
||||
level = zap.InfoLevel
|
||||
}
|
||||
hook := lumberjack.Logger{
|
||||
Filename: lp, // 日志文件路径
|
||||
MaxSize: conf.GetInt("log.max_size"), // 每个日志文件保存的最大尺寸 单位:M
|
||||
MaxBackups: conf.GetInt("log.max_backups"), // 日志文件最多保存多少个备份
|
||||
MaxAge: conf.GetInt("log.max_age"), // 文件最多保存多少天
|
||||
Compress: conf.GetBool("log.compress"), // 是否压缩
|
||||
Filename: lp, // Log file path
|
||||
MaxSize: conf.GetInt("log.max_size"), // Maximum size unit for each log file: M
|
||||
MaxBackups: conf.GetInt("log.max_backups"), // The maximum number of backups that can be saved for log files
|
||||
MaxAge: conf.GetInt("log.max_age"), // Maximum number of days the file can be saved
|
||||
Compress: conf.GetBool("log.compress"), // Compression or not
|
||||
}
|
||||
|
||||
var encoder zapcore.Encoder
|
||||
@@ -79,9 +78,9 @@ func initZap(conf *viper.Viper) *Logger {
|
||||
})
|
||||
}
|
||||
core := zapcore.NewCore(
|
||||
encoder, // 编码器配置
|
||||
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件
|
||||
level, // 日志级别
|
||||
encoder,
|
||||
zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // Print to console and file
|
||||
level,
|
||||
)
|
||||
if conf.GetString("env") != "prod" {
|
||||
return &Logger{zap.New(core, zap.Development(), zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))}
|
||||
@@ -90,18 +89,17 @@ func initZap(conf *viper.Viper) *Logger {
|
||||
|
||||
}
|
||||
|
||||
// 自定义时间编码器
|
||||
func timeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
||||
//enc.AppendString(t.Format("2006-01-02 15:04:05"))
|
||||
enc.AppendString(t.Format("2006-01-02 15:04:05.000000000"))
|
||||
}
|
||||
|
||||
// NewContext 给指定的context添加字段
|
||||
// NewContext Adds a field to the specified context
|
||||
func (l *Logger) NewContext(ctx *gin.Context, fields ...zapcore.Field) {
|
||||
ctx.Set(LOGGER_KEY, l.WithContext(ctx).With(fields...))
|
||||
}
|
||||
|
||||
// WithContext 从指定的context返回一个zap实例
|
||||
// WithContext Returns a zap instance from the specified context
|
||||
func (l *Logger) WithContext(ctx *gin.Context) *Logger {
|
||||
if ctx == nil {
|
||||
return l
|
||||
|
@@ -26,7 +26,10 @@ var (
|
||||
func TestMain(m *testing.M) {
|
||||
fmt.Println("begin")
|
||||
|
||||
os.Setenv("APP_CONF", "../../../config/local.yml")
|
||||
err := os.Setenv("APP_CONF", "../../../config/local.yml")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
conf := config.NewConfig()
|
||||
|
||||
@@ -208,20 +211,3 @@ func TestUserService_UpdateProfile_UserNotFound(t *testing.T) {
|
||||
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestUserService_GenerateToken(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
|
||||
mockUserRepo := mock_repository.NewMockUserRepository(ctrl)
|
||||
|
||||
userService := service.NewUserService(srv, mockUserRepo)
|
||||
|
||||
ctx := context.Background()
|
||||
userId := "123"
|
||||
|
||||
result, err := userService.GenerateToken(ctx, userId)
|
||||
|
||||
assert.NoError(t, err)
|
||||
assert.NotEmpty(t, result)
|
||||
}
|
||||
|
Reference in New Issue
Block a user