feat: v2(Incomplete,very early version)
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package account
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/ssdomei232/goodBaby/api/user"
|
||||
"github.com/ssdomei232/goodBaby/handler/db"
|
||||
"github.com/ssdomei232/goodBaby/model"
|
||||
)
|
||||
|
||||
// 添加账号
|
||||
func HandleAddAccount(c *gin.Context) {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "服务器内部错误"})
|
||||
return
|
||||
}
|
||||
|
||||
userInfo, err := user.GetUserInfoByGinCtx(c)
|
||||
if err != nil {
|
||||
c.JSON(401, gin.H{"code": 401, "data": "获取用户信息失败"})
|
||||
return
|
||||
}
|
||||
|
||||
var newAccount model.Account
|
||||
if err := c.BindJSON(&newAccount); err != nil {
|
||||
c.JSON(400, gin.H{"code": 400, "data": "输入参数错误"})
|
||||
return
|
||||
}
|
||||
|
||||
newAccount.UID = userInfo.ID
|
||||
result := gormDB.Create(&newAccount)
|
||||
if result.Error != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "添加账号失败"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{"code": 200, "data": "添加账号成功"})
|
||||
}
|
||||
|
||||
// 获取用户的所有账号
|
||||
func HandleGetAllAccounts(c *gin.Context) {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "服务器内部错误"})
|
||||
return
|
||||
}
|
||||
|
||||
userInfo, err := user.GetUserInfoByGinCtx(c)
|
||||
if err != nil {
|
||||
c.JSON(401, gin.H{"code": 401, "data": "获取用户信息失败"})
|
||||
return
|
||||
}
|
||||
|
||||
var accounts []model.Account
|
||||
result := gormDB.Where("uid = ?", userInfo.ID).Find(&accounts)
|
||||
if result.Error != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "获取账号失败"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{"code": 200, "data": accounts})
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package rule
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/ssdomei232/goodBaby/api/user"
|
||||
"github.com/ssdomei232/goodBaby/handler/db"
|
||||
"github.com/ssdomei232/goodBaby/model"
|
||||
)
|
||||
|
||||
// 获取用户的所有规则
|
||||
func HandleGetAllRules(c *gin.Context) {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "获取规则失败"})
|
||||
return
|
||||
}
|
||||
|
||||
userInfo, err := user.GetUserInfoByGinCtx(c)
|
||||
if err != nil {
|
||||
c.JSON(401, gin.H{"code": 401, "data": "获取用户信息失败"})
|
||||
return
|
||||
}
|
||||
|
||||
var rules []model.Rule
|
||||
result := gormDB.Where("uid = ?", userInfo.ID).Find(&rules)
|
||||
if result.Error != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "获取规则失败"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{"code": 200, "data": rules})
|
||||
}
|
||||
|
||||
// 创建新规则
|
||||
func HandleCreateRule(c *gin.Context) {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "服务器内部错误"})
|
||||
return
|
||||
}
|
||||
|
||||
userInfo, err := user.GetUserInfoByGinCtx(c)
|
||||
if err != nil {
|
||||
c.JSON(401, gin.H{"code": 401, "data": "获取用户信息失败"})
|
||||
return
|
||||
}
|
||||
|
||||
var newRule model.Rule
|
||||
if err := c.BindJSON(&newRule); err != nil {
|
||||
c.JSON(400, gin.H{"code": 400, "data": "输入参数错误"})
|
||||
return
|
||||
}
|
||||
|
||||
newRule.UID = userInfo.ID
|
||||
result := gormDB.Create(&newRule)
|
||||
if result.Error != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "创建规则失败"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{"code": 200, "data": "规则创建成功"})
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package user
|
||||
|
||||
import (
|
||||
"github.com/gin-contrib/sessions"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/ssdomei232/goodBaby/handler/db"
|
||||
"github.com/ssdomei232/goodBaby/model"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
// 加密密码
|
||||
func encryptPassword(password string) (string, error) {
|
||||
hashedID, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(hashedID), nil
|
||||
}
|
||||
|
||||
// 验证密码
|
||||
func verifyPassword(hashedPassword, inputPassword string) error {
|
||||
return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(inputPassword))
|
||||
}
|
||||
|
||||
func createUser(u *model.User) error {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hashedPassword, err := encryptPassword(u.Password)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.Password = hashedPassword
|
||||
|
||||
result := gormDB.Create(u)
|
||||
return result.Error
|
||||
}
|
||||
|
||||
// 校验密码
|
||||
func verifyUser(u *model.User) error {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var hashedPassword string
|
||||
result := gormDB.Where("username = ?", u.Username).First(&model.User{}).Select("password").Scan(&hashedPassword)
|
||||
if result.Error != nil {
|
||||
return result.Error
|
||||
}
|
||||
|
||||
return verifyPassword(hashedPassword, u.Password)
|
||||
}
|
||||
|
||||
// 通过用户名获取用户信息
|
||||
func GetUserInfo(username string) (*model.User, error) {
|
||||
gormDB, err := db.GetGormDB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var user model.User
|
||||
result := gormDB.Where("username = ?", username).First(&user)
|
||||
if result.Error != nil {
|
||||
return nil, result.Error
|
||||
}
|
||||
return &user, nil
|
||||
}
|
||||
|
||||
// 通过 gin.Context 获取用户信息
|
||||
func GetUserInfoByGinCtx(c *gin.Context) (userInfo *model.User, err error) {
|
||||
session := sessions.Default(c)
|
||||
username := session.Get("username")
|
||||
userInfo, err = GetUserInfo(username.(string))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return userInfo, nil
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
package user
|
||||
|
||||
import (
|
||||
"github.com/gin-contrib/sessions"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/ssdomei232/goodBaby/configs"
|
||||
"github.com/ssdomei232/goodBaby/model"
|
||||
)
|
||||
|
||||
// 处理注册请求,配置文件中可设置禁用注册
|
||||
func HandleRegistry(c *gin.Context) {
|
||||
var user model.User
|
||||
var err error
|
||||
|
||||
config, err := configs.GetConfig()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "获取配置文件失败"})
|
||||
return
|
||||
}
|
||||
|
||||
if !config.EnableRegistry {
|
||||
c.JSON(403, gin.H{"code": 403, "data": "注册功能已关闭"})
|
||||
return
|
||||
}
|
||||
|
||||
err = c.BindJSON(&user)
|
||||
if err != nil {
|
||||
c.JSON(400, gin.H{"code": 400, "data": "输入错误"})
|
||||
return
|
||||
}
|
||||
|
||||
if err = user.IsValid(); err != nil {
|
||||
c.JSON(400, gin.H{"code": 400, "data": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if isExist := user.IsExist(); isExist {
|
||||
c.JSON(400, gin.H{"code": 400, "data": "用户名已存在"})
|
||||
return
|
||||
}
|
||||
|
||||
if err = createUser(&user); err != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "注册失败"})
|
||||
return
|
||||
}
|
||||
|
||||
session := sessions.Default(c)
|
||||
session.Set("username", user.Username)
|
||||
session.Save()
|
||||
|
||||
c.JSON(200, gin.H{"code": 200, "data": "注册成功"})
|
||||
}
|
||||
|
||||
// 处理登录请求
|
||||
func HandleLogin(c *gin.Context) {
|
||||
var user model.User
|
||||
var err error
|
||||
|
||||
err = c.BindJSON(&user)
|
||||
if err != nil {
|
||||
c.JSON(400, gin.H{"code": 400, "data": "输入错误"})
|
||||
return
|
||||
}
|
||||
|
||||
if err = user.IsValid(); err != nil {
|
||||
c.JSON(400, gin.H{"code": 400, "data": err.Error()})
|
||||
}
|
||||
|
||||
if err = verifyUser(&user); err != nil {
|
||||
c.JSON(400, gin.H{"code": 400, "data": "用户名或密码错误"})
|
||||
return
|
||||
}
|
||||
|
||||
session := sessions.Default(c)
|
||||
session.Set("username", user.Username)
|
||||
session.Save()
|
||||
|
||||
c.JSON(200, gin.H{"code": 200, "data": "登录成功"})
|
||||
}
|
||||
|
||||
// 处理获取用户信息请求
|
||||
func HandleGetUserInfo(c *gin.Context) {
|
||||
userInfo, err := GetUserInfoByGinCtx(c)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"code": 500, "data": "获取用户信息失败"})
|
||||
return
|
||||
}
|
||||
c.JSON(200, gin.H{"code": 200, "data": userInfo})
|
||||
}
|
||||
|
||||
// 认证中间件
|
||||
func AuthMiddleware() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
session := sessions.Default(c)
|
||||
username := session.Get("username")
|
||||
if username == nil {
|
||||
c.JSON(401, gin.H{"code": 401, "data": "未登录"})
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user