feat(user): 新增 acme 用户相关功能

- 添加 acme_user 模型和相关数据库迁移- 实现 acme 用户的 CRUD 功能
- 新增 acme 用户相关的 handler 和 service
-优化 domain 模型,移除冗余字段
- 更新全局异常处理,增加日志记录
This commit is contained in:
ZhuoQinghui 2025-05-05 12:24:09 +08:00
parent a288f5b6da
commit 61a17cfa5e
11 changed files with 214 additions and 16 deletions

69
dao/acme_user.go Normal file
View File

@ -0,0 +1,69 @@
package dao
import (
"acme-mana-server-go/db"
"acme-mana-server-go/model"
"acme-mana-server-go/vo"
)
type AcmeUserDao struct {
}
func (dao *AcmeUserDao) Add(user *model.AcmeUser) *model.AcmeUser {
conn := db.Db()
conn.Create(user)
return user
}
func (dao *AcmeUserDao) Get(id int) *model.AcmeUser {
res := &model.AcmeUser{}
conn := db.Db()
tx := conn.First(res, id)
if tx.Error != nil {
panic(tx.Error)
}
return res
}
func (dao *AcmeUserDao) List() *[]model.AcmeUser {
conn := db.Db()
var res []model.AcmeUser
conn.Find(&res)
return &res
}
func (dao *AcmeUserDao) Edit(acmeUser *model.AcmeUser) *model.AcmeUser {
conn := db.Db()
conn.Save(acmeUser)
return acmeUser
}
func (dao *AcmeUserDao) Delete(id int) {
conn := db.Db()
conn.Delete(&model.AcmeUser{}, id)
}
func (dao *AcmeUserDao) Page(req *vo.AcmeUserPageReq) (int64, *[]model.AcmeUser) {
var total int64
var list []model.AcmeUser
conn := db.Db()
bean := req.Bean
query := conn.Model(&model.Domain{})
if bean.Email != "" {
query = query.Where("email like ?", "%"+bean.Email+"%")
}
query.Count(&total)
if total == 0 {
return total, &list
}
page := req.Page
query.Offset(page.Size * (page.Page - 1)).Limit(page.Size)
query.Find(&list)
return total, &list
}

View File

@ -25,11 +25,11 @@ func (_ *DomainDao) Get(id int) *model.Domain {
return res
}
func (_ *DomainDao) List() []*model.Domain {
func (_ *DomainDao) List() *[]model.Domain {
conn := db.Db()
res := make([]*model.Domain, 0)
var res []model.Domain
conn.Find(&res)
return res
return &res
}
func (_ *DomainDao) Edit(newDomain *model.Domain) *model.Domain {

View File

@ -24,7 +24,7 @@ func initDb() {
if err != nil {
panic("failed to connect database")
}
err = conn.AutoMigrate(&model.Domain{})
err = conn.AutoMigrate(&model.Domain{}, &model.AcmeUser{})
if err != nil {
panic(err)
}

72
handler/acme_user.go Normal file
View File

@ -0,0 +1,72 @@
package handler
import (
"acme-mana-server-go/model"
"acme-mana-server-go/service"
"acme-mana-server-go/vo"
"github.com/gin-gonic/gin"
"strconv"
)
var acmeUserService = &service.AcmeUserService{}
type AcmeUserHandler struct {
}
func (a *AcmeUserHandler) Register(r *gin.RouterGroup) {
group := r.Group("/acme_user")
group.GET("/", a.List)
group.POST("/", a.Add)
group.GET("/:id", a.Get)
group.DELETE("/:id", a.Delete)
group.POST("/page", a.Page)
}
func (a *AcmeUserHandler) List(c *gin.Context) {
acmeUsers := acmeUserService.List()
c.JSON(200, vo.Success(acmeUsers))
}
func (a *AcmeUserHandler) Add(c *gin.Context) {
acmeUser := &model.AcmeUser{}
err := c.BindJSON(acmeUser)
if err != nil {
panic(err)
}
acmeUser = acmeUserService.Add(acmeUser)
c.JSON(200, vo.Success(acmeUser))
}
func (a *AcmeUserHandler) Get(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.Atoi(idStr)
if err != nil {
panic(err)
}
acmeUser := acmeUserService.Get(id)
c.JSON(200, vo.Success(acmeUser))
}
func (a *AcmeUserHandler) Delete(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.Atoi(idStr)
if err != nil {
panic(err)
}
acmeUserService.Delete(id)
c.JSON(200, vo.Success(""))
}
func (a *AcmeUserHandler) Page(c *gin.Context) {
req := &vo.AcmeUserPageReq{}
err := c.BindJSON(req)
if err != nil {
panic(err)
}
total, acmeUsers := acmeUserService.Page(req)
result := vo.PageResult{
Total: total,
List: acmeUsers,
}
c.JSON(200, vo.Success(&result))
}

View File

@ -3,12 +3,15 @@ package handler
import (
"acme-mana-server-go/vo"
"github.com/gin-gonic/gin"
"github.com/go-acme/lego/v4/log"
)
func GlobalPanicHandler() gin.HandlerFunc {
return func(ctx *gin.Context) {
defer func() {
if err := recover(); err != nil {
//debug.PrintStack()
log.Infof("panic: %v", err)
ctx.JSON(500, vo.Fail(err.(error).Error()))
ctx.Abort()
}
@ -21,13 +24,9 @@ func GlobalErrorHandler() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
if len(c.Errors) > 0 {
log.Printf("error: %v", c.Errors)
c.JSON(500, vo.Fail(c.Errors.String()))
c.Abort()
}
err := recover()
if err != nil {
c.JSON(500, vo.Fail(err.(error).Error()))
c.Abort()
}
}
}

View File

@ -10,4 +10,7 @@ func RegisterRouter(r *gin.Engine) {
api := r.Group("/api/v1")
domainHandler := DomainHandler{}
domainHandler.Register(api)
acmeUserHandler := AcmeUserHandler{}
acmeUserHandler.Register(api)
}

View File

@ -4,10 +4,7 @@ type Domain struct {
Id uint `gorm:"primary_key;auto_increment"`
Name string `gorm:"type:varchar(255);not null"`
Hosts string `gorm:"type:varchar(255);not null"`
Provider string `gorm:"type:varchar(32);not null"`
ProviderConf string `gorm:"type:text;not null"`
AcmeEmail string `gorm:"type:varchar(255);not null"`
AcmePriKey string `gorm:"type:text;not null"`
Registration string `gorm:"type:text;not null"`
Resource string `gorm:"type:text;not null"`
Provider string `gorm:"type:varchar(32);not null;default:''"`
ProviderConf string `gorm:"type:text;not null;default:''"`
Resource string `gorm:"type:text;not null;default:''"`
}

9
model/user.go Normal file
View File

@ -0,0 +1,9 @@
package model
type AcmeUser struct {
Id uint `gorm:"primary_key;auto_increment"`
Email string `gorm:"type:varchar(255);not null;index:idx_email,unique"`
PrivateKey string `gorm:"type:text;not null"`
Registration string `gorm:"type:text;not null"`
Status int `gorm:"type:int;not null"`
}

41
service/acme_user.go Normal file
View File

@ -0,0 +1,41 @@
package service
import (
"acme-mana-server-go/dao"
"acme-mana-server-go/model"
"acme-mana-server-go/vo"
)
var acmeUserDao = &dao.AcmeUserDao{}
type AcmeUserService struct {
}
func (_ *AcmeUserService) Get(id int) *model.AcmeUser {
return acmeUserDao.Get(id)
}
func (_ *AcmeUserService) List() *[]model.AcmeUser {
return acmeUserDao.List()
}
func (service *AcmeUserService) Add(acmeUser *model.AcmeUser) *model.AcmeUser {
acmeUser = &model.AcmeUser{
Email: acmeUser.Email,
Status: 0,
}
acmeUser = acmeUserDao.Add(acmeUser)
acmeUser.PrivateKey = "PrivateKey"
acmeUser.Registration = "Registration"
acmeUser.Status = 1
service.Edit(acmeUser)
return acmeUser
}
func (_ *AcmeUserService) Edit(acmeUser *model.AcmeUser) *model.AcmeUser {
return acmeUserDao.Edit(acmeUser)
}
func (_ *AcmeUserService) Delete(id int) {
acmeUserDao.Delete(id)
}
func (_ *AcmeUserService) Page(req *vo.AcmeUserPageReq) (int64, *[]model.AcmeUser) {
return acmeUserDao.Page(req)
}

View File

@ -14,7 +14,7 @@ var domainDao = &dao.DomainDao{}
func (_ *DomainService) Get(id int) *model.Domain {
return domainDao.Get(id)
}
func (_ *DomainService) List() []*model.Domain {
func (_ *DomainService) List() *[]model.Domain {
return domainDao.List()
}
func (_ *DomainService) Add(domain *model.Domain) *model.Domain {

8
vo/acme_user.go Normal file
View File

@ -0,0 +1,8 @@
package vo
type AcmeUserPageReq struct {
Bean struct {
Email string `json:"email"`
}
Page Page
}