first commit
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
// Package admin 是后台管理的 HTTP 接入层。
|
||||
package admin
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"portal-mini-go/internal/middleware"
|
||||
"portal-mini-go/internal/pkg/errors"
|
||||
"portal-mini-go/internal/pkg/response"
|
||||
"portal-mini-go/internal/pkg/token"
|
||||
)
|
||||
|
||||
// Handler 后台请求处理。
|
||||
type Handler struct {
|
||||
jwtSecret string
|
||||
tokenTTL time.Duration
|
||||
}
|
||||
|
||||
func NewHandler(jwtSecret string, tokenTTL time.Duration) *Handler {
|
||||
return &Handler{jwtSecret: jwtSecret, tokenTTL: tokenTTL}
|
||||
}
|
||||
|
||||
type LoginReq struct {
|
||||
Username string `json:"username" binding:"required"`
|
||||
Password string `json:"password" binding:"required"`
|
||||
}
|
||||
|
||||
// Login 后台登录(示例固定账号,生产应接 DB + 密码哈希校验)。
|
||||
func (h *Handler) Login(c *gin.Context) {
|
||||
var req LoginReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.Error(errors.ErrBadRequest)
|
||||
return
|
||||
}
|
||||
if req.Username != "admin" || req.Password != "admin123" {
|
||||
c.Error(errors.ErrUnauthorized)
|
||||
return
|
||||
}
|
||||
t, err := token.Generate(h.jwtSecret, "1", h.tokenTTL)
|
||||
if err != nil {
|
||||
c.Error(errors.Wrap(50000, "gen token", err))
|
||||
return
|
||||
}
|
||||
response.OK(c, gin.H{"token": t})
|
||||
}
|
||||
|
||||
// Info 受保护接口示例,需携带有效 Bearer token。
|
||||
func (h *Handler) Info(c *gin.Context) {
|
||||
response.OK(c, gin.H{"admin_id": middleware.AdminID(c)})
|
||||
}
|
||||
|
||||
// Register 注册后台路由。g 已带 /api/admin 前缀与 JWT 鉴权中间件。
|
||||
func Register(g *gin.RouterGroup, h *Handler) {
|
||||
g.POST("/login", h.Login)
|
||||
g.GET("/info", h.Info)
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
// Package miniapphdl 是后台管理小程序的 HTTP 接入层。
|
||||
package miniapphdl
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"portal-mini-go/internal/pkg/errors"
|
||||
"portal-mini-go/internal/pkg/response"
|
||||
miniappsvc "portal-mini-go/internal/service/admin/miniapp"
|
||||
)
|
||||
|
||||
// Handler 小程序管理请求处理。
|
||||
type Handler struct {
|
||||
svc *miniappsvc.Service
|
||||
}
|
||||
|
||||
func NewHandler(svc *miniappsvc.Service) *Handler { return &Handler{svc: svc} }
|
||||
|
||||
// Create 新建小程序。
|
||||
func (h *Handler) Create(c *gin.Context) {
|
||||
var req miniappsvc.CreateReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.Error(errors.ErrBadRequest)
|
||||
return
|
||||
}
|
||||
m, err := h.svc.Create(c.Request.Context(), req)
|
||||
if err != nil {
|
||||
c.Error(err)
|
||||
return
|
||||
}
|
||||
response.OK(c, m)
|
||||
}
|
||||
|
||||
// Update 更新小程序。
|
||||
func (h *Handler) Update(c *gin.Context) {
|
||||
id, ok := parseID(c)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
var req miniappsvc.UpdateReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.Error(errors.ErrBadRequest)
|
||||
return
|
||||
}
|
||||
m, err := h.svc.Update(c.Request.Context(), id, req)
|
||||
if err != nil {
|
||||
c.Error(err)
|
||||
return
|
||||
}
|
||||
response.OK(c, m)
|
||||
}
|
||||
|
||||
// Get 查询单个小程序。
|
||||
func (h *Handler) Get(c *gin.Context) {
|
||||
id, ok := parseID(c)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
m, err := h.svc.GetByID(c.Request.Context(), id)
|
||||
if err != nil {
|
||||
c.Error(err)
|
||||
return
|
||||
}
|
||||
response.OK(c, m)
|
||||
}
|
||||
|
||||
// List 分页列表小程序。支持 query: status、page、size。
|
||||
func (h *Handler) List(c *gin.Context) {
|
||||
status, _ := strconv.ParseInt(c.DefaultQuery("status", "-1"), 10, 8)
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
|
||||
list, total, err := h.svc.List(c.Request.Context(), miniappsvc.ListReq{
|
||||
Status: int8(status),
|
||||
Page: page,
|
||||
Size: size,
|
||||
})
|
||||
if err != nil {
|
||||
c.Error(err)
|
||||
return
|
||||
}
|
||||
response.OK(c, gin.H{"list": list, "total": total, "page": page, "size": size})
|
||||
}
|
||||
|
||||
// Delete 删除小程序。
|
||||
func (h *Handler) Delete(c *gin.Context) {
|
||||
id, ok := parseID(c)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
if err := h.svc.Delete(c.Request.Context(), id); err != nil {
|
||||
c.Error(err)
|
||||
return
|
||||
}
|
||||
response.OK(c, nil)
|
||||
}
|
||||
|
||||
// parseID 从路径参数解析并校验 uint64 主键。
|
||||
func parseID(c *gin.Context) (uint64, bool) {
|
||||
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
c.Error(errors.ErrBadRequest)
|
||||
return 0, false
|
||||
}
|
||||
return id, true
|
||||
}
|
||||
|
||||
// Register 注册后台小程序管理路由。g 已带 /api/admin 前缀与 JWT 鉴权中间件。
|
||||
func Register(g *gin.RouterGroup, h *Handler) {
|
||||
rg := g.Group("/miniapps")
|
||||
{
|
||||
rg.POST("", h.Create)
|
||||
rg.PUT("/:id", h.Update)
|
||||
rg.GET("/:id", h.Get)
|
||||
rg.GET("", h.List)
|
||||
rg.DELETE("/:id", h.Delete)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user