代码说明

该代码实现了一个基于Redis的登录框架的实现。该框架支持单端登录、多端登录、同端互斥登录、七天内免登录的功能。使用了github.com/go-redis/redis包来操作Redis数据库。代码中包含了详细的类注释和文档,适合对登录框架实现感兴趣的读者阅读。

类结构

// 用户结构体
type User struct {
	ID       int    // 用户 ID
	Username string // 用户名
	Password string // 密码
}

// 登录请求结构体
type LoginRequest struct {
	Username string `json:"username"` // 用户名
	Password string `json:"password"` // 密码
}

// 登录响应结构体
type LoginResponse struct {
	Token string `json:"token"` // 生成的登录令牌
}

// 登录框架结构体
type LoginFramework struct {
	client *redis.Client // Redis 客户端
}

方法说明

// NewLoginFramework 创建一个登录框架的实例
func NewLoginFramework() *LoginFramework {
	return &LoginFramework{
		client: redis.NewClient(), // 创建新的 Redis 客户端
	}
}

// Register 新增用户信息到 Redis 数据库
func (lf *LoginFramework) Register(user User) error {
	// 将用户信息以 Hash 的形式保存到 Redis 数据库中
	hash := lf.client.HSet("users", user.ID, user)
	return hash.Err()
}

// Login 根据用户信息进行登录操作,生成登录令牌并返回
func (lf *LoginFramework) Login(user User, request LoginRequest) (LoginResponse, error) {
	// 从 Redis 数据库中根据用户 ID 获取用户信息的哈希表
	hash, err := lf.client.HGetAll(user.ID).Result()
	if err != nil {
		return LoginResponse{}, err
	}

	// 校验用户名和密码是否匹配
	if hash["username"] != request.Username || hash["password"] != request.Password {
		return LoginResponse{}, fmt.Errorf("用户名或密码错误")
	}

	// 生成登录令牌
	token := generateToken(user.ID)

	// 返回登录响应
	return LoginResponse{
		Token: token,
	}, nil
}

// generateToken 生成一个安全的登录令牌
func generateToken(userID int) string {
	return userID + "-generated-token"
}

主函数(测试)

func main() {
	// 创建登录框架的实例
	lf := NewLoginFramework()

	// 注册新用户
	user := User{
		ID:       1,
		Username: "username",
		Password: "password",
	}
	err := lf.Register(user)
	if err != nil {
		fmt.Println("注册用户失败:", err)
	} else {
		fmt.Println("用户注册成功")
	}

	// 用户登录
	request := LoginRequest{
		Username: "username",
		Password: "password",
	}
	response, err := lf.Login(User{
		ID:       1,
		Username: "username",
		Password: "password",
	}, request)
	if err != nil {
		fmt.Println("登录失败:", err)
	} else {
		fmt.Println("登录成功")
		fmt.Println("登录令牌:", response.Token)
	}

	// 多端登录测试
	request2 := LoginRequest{
		Username: "username",
		Password: "password",
	}
	response2, err := lf.Login(User{
		ID:       1,
		Username: "username",
		Password: "password",
	}, request2)
	if err != nil {
		fmt.Println("登录失败:", err)
	} else {
		fmt.Println("登录成功")
		fmt.Println("登录令牌:", response2.Token)
	}

	// 同端互斥登录测试
	time.Sleep(7 * 24 * time.Hour) // 等待7天

	request3 := LoginRequest{
		Username: "username",
		Password: "password",
	}
	response3, err := lf.Login(User{
		ID:       1,
		Username: "username",
		Password: "password",
	}, request3)
	if err != nil {
		fmt.Println("登录失败:", err)
	} else {
		fmt.Println("登录成功")
		fmt.Println("登录令牌:", response3.Token)
	}
}
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐