从零开始Go微服务电商系统开发 第一章用户服务

1. 定义用户表结构

package model

import "time"
import "gorm.io/gorm"

// 基础模型结构体,包含通用字段
type BaseModel struct {
   
	ID        int32          `gorm:"primary_key;AUTO_INCREMENT"` // 主键,自动递增
	CreatedAt time.Time      `gorm:"column:add_time"`            // 创建时间
	UpdatedAt time.Time      `gorm:"column:update_time"`         // 更新时间
	DeletedAt gorm.DeletedAt // 软删除时间,GORM 内置类型
	IsDeleted bool           // 是否删除
}

// 用户模型结构体,嵌入基础模型结构体
type User struct {
   
	BaseModel
	Mobile   string     `gorm:"index:idx_mobile;unique;type:varchar(11);not null"`                      // 手机号,唯一索引,长度11字符,不能为空
	Password string     `gorm:"type:varchar(100);not null"`                                             // 密码,长度100字符,不能为空
	Nickname string     `gorm:"type:varchar(20)"`                                                       // 昵称,长度20字符
	Birthday *time.Time `gorm:"type:datetime"`                                                          // 生日,日期时间类型,使用指针以便区分空值
	Gender   string     `gorm:"column:gender;default:male;type:varchar(6) comment 'female表示女,male表示男'"` // 性别,默认值为'male',长度6字符,注释'female表示女,male表示男'
	Role     int        `gorm:"column:role;default:1;not null;type:int comment '1表示普通用户,2表示管理员'"`       // 角色,默认值为1,不能为空,注释'1表示普通用户,2表示管理员'
}

2.同步表结构

package main

import (
	"gorm.io/driver/mysql"        // 导入 MySQL 驱动
	"gorm.io/gorm"                // 导入 GORM 库
	"gorm.io/gorm/logger"         // 导入 GORM 的日志模块
	"gorm.io/gorm/schema"         // 导入 GORM 的模式定义模块
	"log"                         // 导入日志模块
	"mxshop_server/usr_srv/model" // 导入模型包
	"os"                          // 导入操作系统功能
	"time"                        // 导入时间模块
)

func main() {
   
	// 数据库连接信息
	dsn := "root:password@tcp(119.23.xxx.xxx:3306)/mxshop_user_srv?charset=utf8mb4&parseTime=True&loc=Local"

	// 配置新的日志记录器
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // 使用标准输出作为日志输出
		logger.Config{
   
			SlowThreshold: time.Second, // 设置慢查询阈值为 1 秒
			LogLevel:      logger.Info, // 设置日志级别为 Info
			Colorful:      true,        // 开启彩色输出
		})

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
   
		NamingStrategy: schema.NamingStrategy{
   
			SingularTable: true, // 使用单数表名
		},
		Logger: newLogger, // 使用新的日志记录器
	})
	if err != nil {
   
		panic(err)
	}

	// 自动迁移模型
	_ = db.AutoMigrate(&model.User{
   })
}

3. 使用md5盐值加密密码

	// 配置密码选项
	options := &password.Options{
   16, 100, 32, sha512.New}
	// 生成加密密码
	salt, encodePwd := password.Encode("generic password", options)
	newPassword := fmt.Sprintf("$pbkdf2-sha512$%s$%s", salt, encodePwd)
	fmt.Println(len(newPassword))
	fmt.Println(newPassword)

	// 拆分加密密码信息
	passwordInfo := strings.Split(newPassword, "$")
	fmt.Println(passwordInfo)
	// 验证密码
	check := password.Verify("generic password", passwordInfo[2], passwordInfo[3], options)
	fmt.Println(check)

4. proto结构表定义

syntax = "proto3";  // 使用 proto3 语法

option go_package = ".;proto";  // 指定 Go 语言生成的包路径为当前路径下的 proto 包

import "google/protobuf/empty.proto"; // 导入 Google 的 empty.proto 文件

// 定义 User 服务
service User {
   
  rpc GetUserList(PageInfo) returns (UserListResponse);  // 获取用户列表
  rpc GetUserByMobile(MobileRequest) returns (UserInfoResponse);  // 通过手机号查询用户
  rpc GetUserById(IdRequest) returns (UserInfoResponse); // 通过用户ID查询用户
  rpc CreateUser(CreateUserInfo) returns (UserInfoResponse); // 添加用户
  rpc UpdateUser(UpdateUserInfo) returns (google.protobuf.Empty); // 更新用户
  rpc CheckPassword(PasswordCheckInfo) returns (CheckReponse); // 检查密码
  rpc DeleteUser(IdRequest) returns (google.protobuf.Empty); // 删除用户
}

// 密码检查请求消息
message PasswordCheckInfo {
   
  string password = 1;  // 原始密码
  string encryptedPassword = 2;  // 加密后的密码
}

// 密码检查响应消息
message CheckReponse {
   
  bool success = 1;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值