feat: v2(Incomplete,very early version)

This commit is contained in:
mei
2026-04-05 10:36:22 +08:00
parent 2ab9e060eb
commit 6190a8853a
41 changed files with 1131 additions and 766 deletions
+62
View File
@@ -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})
}
+62
View File
@@ -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": "规则创建成功"})
}
+81
View File
@@ -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
}
+103
View File
@@ -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()
}
}