Administrator 2 лет назад
Родитель
Сommit
7e6287834a
6 измененных файлов с 321 добавлено и 36 удалено
  1. 5 0
      configs/config.go
  2. 31 3
      file/virtual_mall.sql
  3. 1 0
      router/UserRouter.go
  4. 213 31
      user/user.go
  5. 51 2
      user/userdao.go
  6. 20 0
      util/RandomUtil.go

+ 5 - 0
configs/config.go

@@ -29,6 +29,11 @@ type User struct {
 	Avatar        string `xorm:"'avatar'" json:"avatar"`
 	RecommendCode string `xorm:"'recommend_code'" json:"recommend_code"`
 }
+
+func (receiver User) String() string {
+	return fmt.Sprintf("User{Id:%d, Username:%s, Password:%s, Creation_time:%d, Login_time:%d, Status:%d, Role_id:%d, Phone:%s, Email:%s, Name:%s, Avatar:%s, RecommendCode:%s}", receiver.Id, receiver.Username, receiver.Password, receiver.Creation_time, receiver.Login_time, receiver.Status, receiver.Role_id, receiver.Phone, receiver.Email, receiver.Name, receiver.Avatar, receiver.RecommendCode)
+}
+
 type Role struct {
 	Id        int    `xorm:"'id'" json:"id"`
 	Role_name string `xorm:"'role_name'" json:"role_Name"`

+ 31 - 3
file/virtual_mall.sql

@@ -306,7 +306,7 @@ CREATE TABLE `user` (
   `recommend_code` varchar(255) DEFAULT NULL COMMENT '推荐码',
   PRIMARY KEY (`id`) USING BTREE,
   KEY `usernames` (`username`) USING BTREE COMMENT '用户名'
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
+) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -315,9 +315,37 @@ CREATE TABLE `user` (
 
 LOCK TABLES `user` WRITE;
 /*!40000 ALTER TABLE `user` DISABLE KEYS */;
-INSERT INTO `user` VALUES (1,'516702882@qq.com','37bcf5e351f329952fb347edc09f31a1',1711168151,NULL,'0',1,'15537351020','516702882@qq.com','大名鼎鼎',NULL,NULL),(2,'875182750@qq.com','37bcf5e351f329952fb347edc09f31a1',1711168151,NULL,'0',2,'13233826561','875182750@qq.com',NULL,NULL,NULL);
+INSERT INTO `user` VALUES (1,'516702882@qq.com','37bcf5e351f329952fb347edc09f31a1',1711168151,NULL,'0',1,'15537351020','516702882@qq.com','大名鼎鼎',NULL,NULL),(2,'875182750@qq.com','37bcf5e351f329952fb347edc09f31a1',1711168151,NULL,'0',2,'13233826561','875182750@qq.com',NULL,NULL,NULL),(7,'123@qq.com','123123',1714287720,0,'0',2,'13642531323','123@qq.com','123@qq.com','','662df46810151761019911310251106102818984');
 /*!40000 ALTER TABLE `user` ENABLE KEYS */;
 UNLOCK TABLES;
+
+--
+-- Table structure for table `user_wallet`
+--
+
+DROP TABLE IF EXISTS `user_wallet`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `user_wallet` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `user_id` int(11) DEFAULT NULL COMMENT '用户id',
+  `balance` decimal(65,0) DEFAULT NULL COMMENT '余额',
+  `promotion_amount` decimal(20,2) DEFAULT NULL COMMENT '推广获取总金额',
+  `recharge_amount` decimal(20,2) DEFAULT NULL COMMENT '充值金额',
+  PRIMARY KEY (`id`),
+  KEY `user` (`user_id`),
+  CONSTRAINT `user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `user_wallet`
+--
+
+LOCK TABLES `user_wallet` WRITE;
+/*!40000 ALTER TABLE `user_wallet` DISABLE KEYS */;
+/*!40000 ALTER TABLE `user_wallet` ENABLE KEYS */;
+UNLOCK TABLES;
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
@@ -328,4 +356,4 @@ UNLOCK TABLES;
 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2024-04-26 17:16:41
+-- Dump completed on 2024-04-28 17:11:27

+ 1 - 0
router/UserRouter.go

@@ -12,6 +12,7 @@ func UserRouth(engine *gin.RouterGroup) {
 		user.GET("/info", GetUserInfo)
 	}
 }
+
 func GetUserInfo(c *gin.Context) {
 	header := c.GetHeader("auth-sign")
 	if header == "" {

+ 213 - 31
user/user.go

@@ -5,13 +5,16 @@ import (
 	"demo/configs"
 	"demo/router"
 	"demo/share"
+	"demo/util"
 	"fmt"
 	"github.com/gin-gonic/gin"
 	"github.com/mojocn/base64Captcha"
 	"github.com/spf13/cast"
 	"log"
+	"math/big"
 	"net/http"
 	"regexp"
+	"strconv"
 	"time"
 )
 
@@ -22,8 +25,10 @@ func UserRouth(engine *gin.RouterGroup) {
 	{
 		user.POST("/login", login)
 		user.POST("/register", register)
-		user.POST("sendSms", SendVerificationCode)
+		user.POST("/registerCode", registerCode)
+		user.PUT("/name", SetNameValue)
 
+		user.POST("/sendSms", SendVerificationCode)
 		user.GET("/captcha", VerificationCode)
 	}
 }
@@ -118,42 +123,219 @@ func login(c *gin.Context) {
 		c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!"))
 	}
 }
-func register(c *gin.Context) {
-	//data := share.GetJsonAnyParam(c)
-	//var user configs.User
-	//var err error
-	//username, _ := data("username")
-	//password, _ := data("password")
-	//// 定义正则表达式
-	//regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
-	//
-	//// 编译正则表达式
-	//reg, err := regexp.Compile(regexPattern)
-	//if err != nil {
-	//	fmt.Println("Error compiling regex:", err)
-	//	return
-	//}
-	//判断是否为邮箱格式
-	//matched := reg.MatchString(cast.ToString(username))
 
-	//user, err = logins(cast.ToString(username), cast.ToString(password), matched)
+func registerCode(c *gin.Context) {
+	data := share.GetJsonAnyParam(c)
+	phone, _ := data("phone")
+	//判断是否为手机格式
+	if !checkPhone(c, cast.ToString(phone)) {
+		return
+	}
+	//判断是否已经注册
+	b, err := existsPhone(cast.ToString(phone))
+	if err != nil {
+		fmt.Println(err)
+		c.JSON(http.StatusOK, router.CreateResultError(200, "数据库错误!!!"))
+		return
+	}
+	if b {
+		c.JSON(http.StatusOK, router.CreateResultError(200, "手机号已注册!!!"))
+		return
+	}
+	//判断是否重复注册
+	get := configs.RedisDb.Exists(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone))
+	if get.Val() == 1 {
+		c.JSON(http.StatusOK, router.CreateResultError(200, "验证码已经发送,请等待"))
+		return
+	}
+
+	//发送短信
+	//sms := sendSms(b, cast.ToString(phone))
+	//TODO 模拟发送短信
+	sms := testSendSms()
+	fmt.Println("发送成功!!!:验证码为:", sms)
+	set := configs.RedisDb.Set(ctx, "PhoneVerificationCode_"+cast.ToString(phone), sms, 60*5*time.Second)
+	configs.RedisDb.Set(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone), time.Now(), 60*time.Second)
+	fmt.Println(set)
+	fmt.Println("发送成功!!!:验证码为:", sms)
+	c.JSON(http.StatusOK, router.CreateResult())
+
+}
+
+func testSendSms() string {
+	mins := big.NewInt(100000)
+	maxs := big.NewInt(999999)
+	randomNum := share.RandomInt(mins, maxs)
+	//if matched {
+	//	//bools, err = configs.Engine.Table("user").Where("username = ?", username).Exist(&user)
+	//
+	//	share.SendMail(username, strconv.Itoa(int(randomNum.Int64())))
 	//
-	//if err == nil && user.Id != 0 {
-	//	fmt.Println("用户登录成功!!!")
-	//	token, err := share.GenerateToken(cast.ToString(user.Id))
-	//	if err == nil {
-	//		c.Header("auth-sign", token)
-	//		c.JSON(http.StatusOK, router.CreateResult())
-	//	} else {
-	//		c.JSON(http.StatusOK, router.CreateResultError(400, "生成token失败!!!"))
-	//	}
 	//} else {
-	//	fmt.Println("用户登录失败!!!")
-	//	c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!"))
+	//	share.SendSms(strconv.Itoa(int(randomNum.Int64())), username)
 	//}
+	return randomNum.String()
+}
+
+func register(c *gin.Context) {
+
+	data := share.GetJsonAnyParam(c)
+
+	username, _ := data("username")
+	password, _ := data("password")
+	code, _ := data("code")
+	phone, _ := data("phone")
+
+	if !checkEmail(c, cast.ToString(username)) {
+		return
+	}
+	if !checkPhone(c, cast.ToString(phone)) {
+		return
+	}
+	if !checkCode(c, cast.ToString(code)) {
+		return
+	}
+	if !checkPassword(c, cast.ToString(password)) {
+		return
+	}
+	// 验证验证码
+	get := configs.RedisDb.Get(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
+	fmt.Println(code, get.Val())
+	if code != get.Val() {
+		c.JSON(http.StatusOK, router.CreateResultError(400, "验证码错误!"))
+		return
+	}
+	configs.RedisDb.Del(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
+
+	//判断是否已经注册
+	b, err := GetUserByPhoneOrEmail(cast.ToString(phone), cast.ToString(username))
+	if err != nil {
+		c.JSON(http.StatusOK, router.CreateResultError(400, "验证手机号及用户名,数据错误"))
+		return
+	}
+	if b {
+		c.JSON(http.StatusOK, router.CreateResultError(400, "手机号或邮箱已注册!!!"))
+		return
+	}
+
+	timestamp := time.Now().Unix()
+	user := configs.User{
+		Username:      cast.ToString(username),
+		Password:      cast.ToString(password),
+		Creation_time: int(timestamp),
+		Status:        0,
+		Role_id:       2,
+		Phone:         cast.ToString(phone),
+		Email:         cast.ToString(username),
+		Name:          cast.ToString(username),
+		RecommendCode: fmt.Sprint(strconv.FormatInt(timestamp, 16), util.RandomArrays(13, 62)),
+	}
+
+	user, err = SaveNewUser(user)
+	if err != nil {
+		fmt.Println(err)
+		c.JSON(http.StatusOK, router.CreateResultError(400, "数据库错误!!!"))
+		return
+	}
+	if user.Id != 0 {
+		fmt.Println("用户注册成功!!!")
+		c.JSON(http.StatusOK, router.CreateResultData(map[string]any{"user": user}))
+		return
+	} else {
+		fmt.Println("用户注册失败!!!")
+		c.JSON(http.StatusOK, router.CreateResultError(400, "用户注册失败!!!"))
+		return
+	}
+}
+func SetNameValue(c *gin.Context) {
+	data := share.GetJsonAnyParam(c)
+	id, _ := data("id")
+	name, _ := data("name")
+	user, err := SetName(cast.ToInt(id), cast.ToString(name))
+	if err != nil {
+		c.JSON(http.StatusOK, router.CreateResultError(400, "数据库错误!!!"))
+		return
+	}
+	fmt.Println("用户修改名字成功!!!")
+	c.JSON(http.StatusOK, router.CreateResultData(map[string]any{"user": user}))
+	return
+
+}
+
+func checkEmail(c *gin.Context, email string) bool {
+	//// 定义正则表达式
+	regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "邮箱格式错误!!!"))
+		return false
+	}
+	//判断是否为邮箱格式
+	matched := reg.MatchString(cast.ToString(email))
+	if !matched {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "邮箱格式错误!!!"))
+		return false
+	}
+	return true
+}
+func checkPhone(c *gin.Context, phone string) bool {
+	//// 定义正则表达式
+	regexPattern := `^1[3-9]\d{9}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("1 Error compiling regex:", err)
+		c.JSON(200, router.CreateResultError(500, "手机号格式错误!!!"))
+		return false
+	}
+	matched := reg.MatchString(cast.ToString(phone))
+	if !matched {
+		fmt.Println("2 Error compiling regex:", err)
+		c.JSON(200, router.CreateResultError(500, "手机号格式错误!!!"))
+		return false
+	}
+	return true
+}
+func checkPassword(c *gin.Context, email string) bool {
+	//// 定义正则表达式
+	regexPattern := `^[a-zA-Z0-9,./<>?;'\\:"|\[\]{}~!@#$%^&*()_+=-]{6,32}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "密码格式错误!!!"))
+		return false
+	}
+	//判断是否为邮箱格式
+	matched := reg.MatchString(cast.ToString(email))
+	if !matched {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "密码格式错误!!!"))
+		return false
+	}
+	return true
+}
+func checkCode(c *gin.Context, code string) bool {
+	//// 定义正则表达式
+	regexPattern := `^\d{6}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "验证码格式错误!!!"))
+		return false
+	}
+	//判断是否为邮箱格式
+	matched := reg.MatchString(cast.ToString(code))
+	if !matched {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "验证码格式错误!!!"))
+		return false
+	}
+
+	return true
 }
 
-// SendVerificationCode
+// SendVerificationCode 发送验证码
 func SendVerificationCode(c *gin.Context) {
 	data := share.GetJsonAnyParam(c)
 	var err error

+ 51 - 2
user/userdao.go

@@ -30,8 +30,7 @@ func logins(username, password, t string) (configs.User, error) {
 	}
 	return configs.User{}, err
 }
-
-func sendSms(matched bool, username string) {
+func sendSms(matched bool, username string) string {
 	mins := big.NewInt(100000)
 	maxs := big.NewInt(999999)
 	randomNum := share.RandomInt(mins, maxs)
@@ -43,6 +42,42 @@ func sendSms(matched bool, username string) {
 	} else {
 		share.SendSms(strconv.Itoa(int(randomNum.Int64())), username)
 	}
+	return randomNum.String()
+}
+
+func SaveNewUser(user configs.User) (configs.User, error) {
+	insert, err := configs.Engine.Table("user").Insert(user)
+	if err != nil {
+		return user, err
+	}
+	if insert > 0 {
+		configs.Engine.Select("id").Where("phone = ?", user.Phone).Get(&user)
+		fmt.Println("user666:", user)
+	}
+
+	return user, nil
+}
+func GetUserByPhoneOrEmail(phone, email string) (bool, error) {
+	var user = configs.User{}
+	_, err := configs.Engine.Select("id").Where("phone = ?", phone).Or("email = ?", email).Get(&user)
+	if err != nil {
+		fmt.Println("err:", err)
+	}
+	return user.Id > 0, err
+}
+
+// 判断手机号数量
+func existsPhone(phone string) (bool, error) {
+	count, err := configs.Engine.Table("user").Where("phone = ?", phone).Count()
+	if err != nil {
+		return false, err
+	}
+	return count > 0, nil
+}
+
+func saveUser(username, password, code, phone string) bool {
+	return true
+
 }
 
 func Md5_KKC(str string) string {
@@ -50,3 +85,17 @@ func Md5_KKC(str string) string {
 	hash.Write([]byte("kkc-" + str))
 	return fmt.Sprintf("%x", hash.Sum(nil))
 }
+
+func SetName(id int, newName string) (configs.User, error) {
+	user := configs.User{}
+	_, err := configs.Engine.Table("user").Where("id = ?", id).Get(&user)
+	if err != nil {
+		return user, err
+	}
+	user.Name = newName
+	_, err = configs.Engine.Table("user").ID(id).Update(user)
+	if err != nil {
+		return user, err
+	}
+	return user, nil
+}

+ 20 - 0
util/RandomUtil.go

@@ -0,0 +1,20 @@
+package util
+
+import (
+	"demo/share"
+	"fmt"
+	"math/big"
+)
+
+const data = "66"
+
+var charArrays = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+func RandomArrays(charCount, hex int) string {
+	result := ""
+	for i := 0; i < charCount; i++ {
+		randomInt := share.RandomInt(big.NewInt(0), big.NewInt(int64(hex))).Int64()
+		result += fmt.Sprint(string(charArrays[randomInt]))
+	}
+	return result
+}