feat(admin): upgrade admin console UI widgets, add plan & status management, and redesign system status dashboard

This commit is contained in:
Blizzard
2026-07-18 22:18:12 +08:00
parent 197531ea33
commit 0d2929931f
16 changed files with 1979 additions and 503 deletions
@@ -339,6 +339,43 @@ func (h *Handler) AdminSetSharedBilling(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "ok"})
}
// AdminSetTenantPlan: PUT /api/v1/admin/tenants/:id/plan {plan} —— 改方案等级。
func (h *Handler) AdminSetTenantPlan(c *gin.Context) {
var b struct {
Plan string `json:"plan"`
}
if err := c.ShouldBindJSON(&b); err != nil || strings.TrimSpace(b.Plan) == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "plan 必填"})
return
}
if err := h.db.SetTenantPlan(c.Request.Context(), c.Param("id"), b.Plan); err != nil {
c.JSON(http.StatusBadGateway, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"status": "ok"})
}
// AdminSetTenantStatus: PUT /api/v1/admin/tenants/:id/status {status} —— 改租户状态(暂停/恢复)。
func (h *Handler) AdminSetTenantStatus(c *gin.Context) {
var b struct {
Status string `json:"status"`
}
if err := c.ShouldBindJSON(&b); err != nil || strings.TrimSpace(b.Status) == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "status 必填"})
return
}
if b.Status != "active" && b.Status != "suspended" {
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的 status,仅支持 active/suspended"})
return
}
if err := h.db.SetTenantStatus(c.Request.Context(), c.Param("id"), b.Status); err != nil {
c.JSON(http.StatusBadGateway, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"status": "ok"})
}
// AdminMembers: GET /api/v1/admin/tenants/:id/members —— 某租户成员列表。
func (h *Handler) AdminMembers(c *gin.Context) {
rows, err := h.db.ListMembers(c.Request.Context(), c.Param("id"))