mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-12-23 00:05:58 +08:00
优化项目 (#75)
* 💄 improve: channel search * 💄 improve: channel Table * 💄 improve: add channel batch
This commit is contained in:
100
model/channel.go
100
model/channel.go
@@ -2,31 +2,32 @@ package model
|
||||
|
||||
import (
|
||||
"one-api/common"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Channel struct {
|
||||
Id int `json:"id"`
|
||||
Type int `json:"type" gorm:"default:0"`
|
||||
Key string `json:"key" gorm:"type:varchar(767);not null;index"`
|
||||
Status int `json:"status" gorm:"default:1"`
|
||||
Name string `json:"name" gorm:"index"`
|
||||
Type int `json:"type" form:"type" gorm:"default:0"`
|
||||
Key string `json:"key" form:"key" gorm:"type:varchar(767);not null;index"`
|
||||
Status int `json:"status" form:"status" gorm:"default:1"`
|
||||
Name string `json:"name" form:"name" gorm:"index"`
|
||||
Weight *uint `json:"weight" gorm:"default:0"`
|
||||
CreatedTime int64 `json:"created_time" gorm:"bigint"`
|
||||
TestTime int64 `json:"test_time" gorm:"bigint"`
|
||||
ResponseTime int `json:"response_time"` // in milliseconds
|
||||
BaseURL *string `json:"base_url" gorm:"column:base_url;default:''"`
|
||||
Other string `json:"other"`
|
||||
Other string `json:"other" form:"other"`
|
||||
Balance float64 `json:"balance"` // in USD
|
||||
BalanceUpdatedTime int64 `json:"balance_updated_time" gorm:"bigint"`
|
||||
Models string `json:"models"`
|
||||
Group string `json:"group" gorm:"type:varchar(32);default:'default'"`
|
||||
Models string `json:"models" form:"models"`
|
||||
Group string `json:"group" form:"group" gorm:"type:varchar(32);default:'default'"`
|
||||
UsedQuota int64 `json:"used_quota" gorm:"bigint;default:0"`
|
||||
ModelMapping *string `json:"model_mapping" gorm:"type:varchar(1024);default:''"`
|
||||
Priority *int64 `json:"priority" gorm:"bigint;default:0"`
|
||||
Proxy *string `json:"proxy" gorm:"type:varchar(255);default:''"`
|
||||
TestModel string `json:"test_model" gorm:"type:varchar(50);default:''"`
|
||||
TestModel string `json:"test_model" form:"test_model" gorm:"type:varchar(50);default:''"`
|
||||
}
|
||||
|
||||
var allowedChannelOrderFields = map[string]bool{
|
||||
@@ -40,16 +41,46 @@ var allowedChannelOrderFields = map[string]bool{
|
||||
"priority": true,
|
||||
}
|
||||
|
||||
func GetChannelsList(params *GenericParams) (*DataResult[Channel], error) {
|
||||
type SearchChannelsParams struct {
|
||||
Channel
|
||||
PaginationParams
|
||||
}
|
||||
|
||||
func GetChannelsList(params *SearchChannelsParams) (*DataResult[Channel], error) {
|
||||
var channels []*Channel
|
||||
|
||||
db := DB.Omit("key")
|
||||
if params.Keyword != "" {
|
||||
keyCol := "`key`"
|
||||
if common.UsingPostgreSQL {
|
||||
keyCol = `"key"`
|
||||
}
|
||||
db = db.Where("id = ? or name LIKE ? or "+keyCol+" = ?", common.String2Int(params.Keyword), params.Keyword+"%", params.Keyword)
|
||||
|
||||
if params.Type != 0 {
|
||||
db = db.Where("type = ?", params.Type)
|
||||
}
|
||||
|
||||
if params.Status != 0 {
|
||||
db = db.Where("status = ?", params.Status)
|
||||
}
|
||||
|
||||
if params.Name != "" {
|
||||
db = db.Where("name LIKE ?", params.Name+"%")
|
||||
}
|
||||
|
||||
if params.Group != "" {
|
||||
db = db.Where("id IN (SELECT channel_id FROM abilities WHERE "+quotePostgresField("group")+" = ?)", params.Group)
|
||||
}
|
||||
|
||||
if params.Models != "" {
|
||||
db = db.Where("id IN (SELECT channel_id FROM abilities WHERE model IN (?))", params.Models)
|
||||
}
|
||||
|
||||
if params.Other != "" {
|
||||
db = db.Where("other LIKE ?", params.Other+"%")
|
||||
}
|
||||
|
||||
if params.Key != "" {
|
||||
db = db.Where(quotePostgresField("key")+" = ?", params.Key)
|
||||
}
|
||||
|
||||
if params.TestModel != "" {
|
||||
db = db.Where("test_model LIKE ?", params.TestModel+"%")
|
||||
}
|
||||
|
||||
return PaginateAndOrder[Channel](db, ¶ms.PaginationParams, &channels, allowedChannelOrderFields)
|
||||
@@ -87,6 +118,45 @@ func BatchInsertChannels(channels []Channel) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
type BatchChannelsParams struct {
|
||||
Value string `json:"value" form:"value" binding:"required"`
|
||||
Ids []int `json:"ids" form:"ids" binding:"required"`
|
||||
}
|
||||
|
||||
func BatchUpdateChannelsAzureApi(params *BatchChannelsParams) (int64, error) {
|
||||
db := DB.Model(&Channel{}).Where("id IN ?", params.Ids).Update("other", params.Value)
|
||||
if db.Error != nil {
|
||||
return 0, db.Error
|
||||
}
|
||||
return db.RowsAffected, nil
|
||||
}
|
||||
|
||||
func BatchDelModelChannels(params *BatchChannelsParams) (int64, error) {
|
||||
var count int64
|
||||
|
||||
var channels []*Channel
|
||||
err := DB.Select("id, models, "+quotePostgresField("group")).Find(&channels, "id IN ?", params.Ids).Error
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
for _, channel := range channels {
|
||||
modelsSlice := strings.Split(channel.Models, ",")
|
||||
for i, m := range modelsSlice {
|
||||
if m == params.Value {
|
||||
modelsSlice = append(modelsSlice[:i], modelsSlice[i+1:]...)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
channel.Models = strings.Join(modelsSlice, ",")
|
||||
channel.Update()
|
||||
count++
|
||||
}
|
||||
|
||||
return count, nil
|
||||
}
|
||||
|
||||
func (channel *Channel) GetPriority() int64 {
|
||||
if channel.Priority == nil {
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user