Summary • Backend – Moved duplicate-name validation and total vendor-count aggregation from controllers (`controller/model_meta.go`, `controller/vendor_meta.go`, `controller/prefill_group.go`) to model layer (`model/model_meta.go`, `model/vendor_meta.go`, `model/prefill_group.go`). – Added `GetVendorModelCounts()` and `Is*NameDuplicated()` helpers; controllers now call these instead of duplicating queries. – API response for `/api/models` now returns `vendor_counts` with per-vendor totals across all pages, plus `all` summary. – Removed redundant checks and unused imports, eliminating `go vet` warnings. • Frontend – `useModelsData.js` updated to consume backend-supplied `vendor_counts`, calculate the `all` total once, and drop legacy client-side counting logic. – Simplified initial data flow: first render now triggers only one models request. – Deleted obsolete `updateVendorCounts` helper and related comments. – Ensured search flow also sets `vendorCounts`, keeping tab badges accurate. Why This refactor enforces single-responsibility (aggregation in model layer), delivers consistent totals irrespective of pagination, and removes redundant client queries, leading to cleaner code and better performance.
124 lines
3.0 KiB
Go
124 lines
3.0 KiB
Go
package controller
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"one-api/common"
|
|
"one-api/model"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// GetAllVendors 获取供应商列表(分页)
|
|
func GetAllVendors(c *gin.Context) {
|
|
pageInfo := common.GetPageQuery(c)
|
|
vendors, err := model.GetAllVendors(pageInfo.GetStartIdx(), pageInfo.GetPageSize())
|
|
if err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
var total int64
|
|
model.DB.Model(&model.Vendor{}).Count(&total)
|
|
pageInfo.SetTotal(int(total))
|
|
pageInfo.SetItems(vendors)
|
|
common.ApiSuccess(c, pageInfo)
|
|
}
|
|
|
|
// SearchVendors 搜索供应商
|
|
func SearchVendors(c *gin.Context) {
|
|
keyword := c.Query("keyword")
|
|
pageInfo := common.GetPageQuery(c)
|
|
vendors, total, err := model.SearchVendors(keyword, pageInfo.GetStartIdx(), pageInfo.GetPageSize())
|
|
if err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
pageInfo.SetTotal(int(total))
|
|
pageInfo.SetItems(vendors)
|
|
common.ApiSuccess(c, pageInfo)
|
|
}
|
|
|
|
// GetVendorMeta 根据 ID 获取供应商
|
|
func GetVendorMeta(c *gin.Context) {
|
|
idStr := c.Param("id")
|
|
id, err := strconv.Atoi(idStr)
|
|
if err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
v, err := model.GetVendorByID(id)
|
|
if err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
common.ApiSuccess(c, v)
|
|
}
|
|
|
|
// CreateVendorMeta 新建供应商
|
|
func CreateVendorMeta(c *gin.Context) {
|
|
var v model.Vendor
|
|
if err := c.ShouldBindJSON(&v); err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
if v.Name == "" {
|
|
common.ApiErrorMsg(c, "供应商名称不能为空")
|
|
return
|
|
}
|
|
// 创建前先检查名称
|
|
if dup, err := model.IsVendorNameDuplicated(0, v.Name); err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
} else if dup {
|
|
common.ApiErrorMsg(c, "供应商名称已存在")
|
|
return
|
|
}
|
|
|
|
if err := v.Insert(); err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
common.ApiSuccess(c, &v)
|
|
}
|
|
|
|
// UpdateVendorMeta 更新供应商
|
|
func UpdateVendorMeta(c *gin.Context) {
|
|
var v model.Vendor
|
|
if err := c.ShouldBindJSON(&v); err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
if v.Id == 0 {
|
|
common.ApiErrorMsg(c, "缺少供应商 ID")
|
|
return
|
|
}
|
|
// 名称冲突检查
|
|
if dup, err := model.IsVendorNameDuplicated(v.Id, v.Name); err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
} else if dup {
|
|
common.ApiErrorMsg(c, "供应商名称已存在")
|
|
return
|
|
}
|
|
|
|
if err := v.Update(); err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
common.ApiSuccess(c, &v)
|
|
}
|
|
|
|
// DeleteVendorMeta 删除供应商
|
|
func DeleteVendorMeta(c *gin.Context) {
|
|
idStr := c.Param("id")
|
|
id, err := strconv.Atoi(idStr)
|
|
if err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
if err := model.DB.Delete(&model.Vendor{}, id).Error; err != nil {
|
|
common.ApiError(c, err)
|
|
return
|
|
}
|
|
common.ApiSuccess(c, nil)
|
|
} |