User.go 7.16 KB
package Api

import (
	"crypto/sha256"
	"encoding/hex"
	"github.com/aarongao/tools"
	"github.com/gin-gonic/gin"
	"gopkg.in/mgo.v2/bson"
	"letu/DB"
	"regexp"
	"strconv"
	"time"
)

//
//// @Title 创建用户
//// @Description 用户注册
//// @Accept  json
//// @Produce  json
//// @Param   password     1    string     true        "密码"
//// @Param   confirmpassword     1    string     true        "确认密码"
//// @Param   birthday     2010.10.10    string     true        "生日"
//// @Param   fullname     aarongao    string     true        "全名"
//// @Param   code     12345678    string     true        "6位验证码"
//// @Param   mobile     18616619599    string     true        "手机,同用户名"
//// @Param   openid     12345    string     true        "微信id"
//// @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":"ok"}"
//// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
//// @Router /CreateUser? [post]
//func CreateUser(c *gin.Context) {
//	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
//	c.Header("Access-Control-Allow-Credentials", "true")
//
//	if c.PostForm("mobile") == "" {
//		c.JSON(200, tools.ResponseError{
//			1,
//			"必须有手机号",
//		})
//		return
//	}
//	if c.PostForm("password") != c.PostForm("confirmpassword") {
//		c.JSON(200, tools.ResponseError{
//			1,
//			"密码错误",
//		})
//		return
//	}
//
//	// 检查验证码
//	code := DB.Redis.Get(c.PostForm("mobile"))
//	if code == "" || code != c.PostForm("code") {
//		c.JSON(200, tools.ResponseError{
//			1,
//			"验证码错误",
//		})
//		return
//	}
//
//	objectID := bson.NewObjectId()
//	err := DB.CMember.Insert(DB.SMember{
//		&objectID,
//		c.PostForm("password"),
//		c.PostForm("birthday"),
//		c.PostForm("fullname"),
//		c.PostForm("mobile"),
//		c.PostForm("openid"),
//		"",
//	})
//	if err == nil{
//		c.JSON(200, tools.ResponseSeccess{
//			0,
//			"ok",
//		})
//	}else{
//		c.JSON(200, tools.ResponseError{
//			0,
//			"此手机号已经注册",
//		})
//	}
//
//
//}

var Regular = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$"

// @Title 登录
// @Description 用户登录&注册
// @Accept  json
// @Produce  json
// @Param   mobile     aaron    string     true        "手机号"
// @Param   password     1    string     true        "密码或验证码(使用验证码的新手机号自动注册)"
// @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":{"Id":"5e09c64c1c09c6f0f7ca2fa9","Token":"640bf934e425aba5d3c90998b2641f2f0ca07261d334d9615d1cd4790b5f34e7"}} 调用其它需要登陆的接口时携带token,有过期时间"
// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
// @Router /LoginUser? [post]
func LoginUser(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")

	reg := regexp.MustCompile(Regular)
	if !reg.MatchString(c.PostForm("mobile")) {

		c.JSON(200, tools.ResponseError{
			1,
			"手机号格式不正确",
		})
		return
	}

	if c.PostForm("mobile") == "" || c.PostForm("password") == "" {
		c.JSON(200, tools.ResponseError{
			1,
			"空",
		})
		return
	}

	// 生成token
	tokenunit8 := sha256.Sum256([]byte(c.PostForm("mobile") + c.PostForm("password") + strconv.FormatInt(time.Now().UnixNano(), 10)))
	token := hex.EncodeToString(tokenunit8[:32])

	// 检查验证码
	cacheCode := DB.Redis.Get(c.PostForm("mobile"))
	selected := bson.M{}
	var User *DB.SMember
	if cacheCode == c.PostForm("password") {
		selected["Mobile"] = c.PostForm("mobile")
		DB.CMember.Find(selected).One(&User)

		// 验证码匹配,但手机号不存在
		if User == nil {
			objectID := bson.NewObjectId()
			oUser := DB.SMember{
				&objectID,
				"",
				"",
				"",
				c.PostForm("mobile"),
				"",
				token,
			}
			DB.CMember.Insert(oUser)
			//if err == nil {
			c.JSON(200, tools.ResponseSeccess{
				0,
				oUser,
			})
			return
			//}
		}

	} else {
		selected["Mobile"] = c.PostForm("mobile")
		selected["Password"] = c.PostForm("password")
		DB.CMember.Find(selected).One(&User)
		if User == nil {
			c.JSON(200, tools.ResponseError{
				1,
				"用户不存在或密码不正确",
			})
			return
		}
	}

	// 更新用户信息
	DB.CMember.Update(
		bson.M{"_id": User.Id},
		bson.M{"$set": bson.M{"Token": token}},
	)

	User.Token = token
	c.JSON(200, tools.ResponseSeccess{
		0,
		User,
	})

}

// @Title 用户信息
// @Description 获取用户信息
// @Accept  json
// @Produce  json
// @Param   id     aaron    string     true        "用户id"
// @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":{"Id":"5e09c64c1c09c6f0f7ca2fa9","Token":"640bf934e425aba5d3c90998b2641f2f0ca07261d334d9615d1cd4790b5f34e7"}}"
// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
// @Router /UserInfo? [get]
func UserInfo(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")


	if c.Query("id") == "" {
		c.JSON(200, tools.ResponseError{
			1,
			"空",
		})
		return
	}

	var User *DB.SMember
	DB.CMember.Find(bson.M{"_id": bson.ObjectIdHex(c.Query("id"))}).One(&User)

	if User == nil {

		c.JSON(200, tools.ResponseError{
			1,
			"空",
		})
	} else {

		c.JSON(200, tools.ResponseSeccess{
			0,
			User,
		})
	}

}

// @Title 修改用户信息
// @Description 修改用户信息
// @Accept  json
// @Produce  json
// @Param   password     1    string     true        "密码"
// @Param   confirmpassword     1    string     true        "确认密码"
// @Param   birthday     2010.10.10    string     true        "生日"
// @Param   fullname     aarongao    string     true        "全名"
// @Param   code     12345678    string     true        "6位验证码"
// @Param   mobile     18616619599    string     true        "手机,同用户名"
// @Param   openid     12345    string     true        "微信id"
// @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"result":"ok"}"
// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}"
// @Router /UpdateUser? [post]
func UpdateUser(c *gin.Context) {
	c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
	c.Header("Access-Control-Allow-Credentials", "true")

	reg := regexp.MustCompile(Regular)
	if !reg.MatchString(c.PostForm("mobile")) {

		c.JSON(200, tools.ResponseError{
			1,
			"手机号格式不正确",
		})
		return
	}
	if c.PostForm("password") != c.PostForm("confirmpassword") {
		c.JSON(200, tools.ResponseError{
			1,
			"2次密码不一致",
		})
		return
	}

	// 检查验证码
	code := DB.Redis.Get(c.PostForm("mobile"))
	if code == "" || code != c.PostForm("code") {
		c.JSON(200, tools.ResponseError{
			1,
			"验证码错误",
		})
		return
	}

	objectID := bson.NewObjectId()
	err := DB.CMember.Insert(DB.SMember{
		&objectID,
		c.PostForm("password"),
		c.PostForm("birthday"),
		c.PostForm("fullname"),
		c.PostForm("mobile"),
		c.PostForm("openid"),
		"",
	})
	if err == nil {
		c.JSON(200, tools.ResponseSeccess{
			0,
			"ok",
		})
	} else {
		c.JSON(200, tools.ResponseError{
			0,
			"此手机号已经注册",
		})
	}

}