Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
1ef3782d
Unverified
Commit
1ef3782d
authored
Apr 11, 2026
by
Wesley Liddick
Committed by
GitHub
Apr 11, 2026
Browse files
Merge pull request #1538 from IanShaw027/fix/bug-cleanup-main
fix: 修复多个 UI 和功能问题 - 表格排序搜索、导出逻辑、分页配置和状态筛选
parents
00c08c57
f480e573
Changes
117
Expand all
Show whitespace changes
Inline
Side-by-side
backend/internal/service/domain_constants.go
View file @
1ef3782d
...
@@ -143,6 +143,8 @@ const (
...
@@ -143,6 +143,8 @@ const (
SettingKeyHideCcsImportButton
=
"hide_ccs_import_button"
// 是否隐藏 API Keys 页面的导入 CCS 按钮
SettingKeyHideCcsImportButton
=
"hide_ccs_import_button"
// 是否隐藏 API Keys 页面的导入 CCS 按钮
SettingKeyPurchaseSubscriptionEnabled
=
"purchase_subscription_enabled"
// 是否展示"购买订阅"页面入口
SettingKeyPurchaseSubscriptionEnabled
=
"purchase_subscription_enabled"
// 是否展示"购买订阅"页面入口
SettingKeyPurchaseSubscriptionURL
=
"purchase_subscription_url"
// "购买订阅"页面 URL(作为 iframe src)
SettingKeyPurchaseSubscriptionURL
=
"purchase_subscription_url"
// "购买订阅"页面 URL(作为 iframe src)
SettingKeyTableDefaultPageSize
=
"table_default_page_size"
// 表格默认每页条数
SettingKeyTablePageSizeOptions
=
"table_page_size_options"
// 表格可选每页条数(JSON 数组)
SettingKeyCustomMenuItems
=
"custom_menu_items"
// 自定义菜单项(JSON 数组)
SettingKeyCustomMenuItems
=
"custom_menu_items"
// 自定义菜单项(JSON 数组)
SettingKeyCustomEndpoints
=
"custom_endpoints"
// 自定义端点列表(JSON 数组)
SettingKeyCustomEndpoints
=
"custom_endpoints"
// 自定义端点列表(JSON 数组)
...
...
backend/internal/service/openai_ws_ratelimit_signal_test.go
View file @
1ef3782d
...
@@ -492,7 +492,7 @@ func TestAdminService_ListAccounts_ExhaustedCodexExtraReturnsRateLimitedAccount(
...
@@ -492,7 +492,7 @@ func TestAdminService_ListAccounts_ExhaustedCodexExtraReturnsRateLimitedAccount(
}
}
svc
:=
&
adminServiceImpl
{
accountRepo
:
repo
}
svc
:=
&
adminServiceImpl
{
accountRepo
:
repo
}
accounts
,
total
,
err
:=
svc
.
ListAccounts
(
context
.
Background
(),
1
,
20
,
PlatformOpenAI
,
AccountTypeOAuth
,
""
,
""
,
0
,
""
)
accounts
,
total
,
err
:=
svc
.
ListAccounts
(
context
.
Background
(),
1
,
20
,
PlatformOpenAI
,
AccountTypeOAuth
,
""
,
""
,
0
,
""
,
""
,
""
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
int64
(
1
),
total
)
require
.
Equal
(
t
,
int64
(
1
),
total
)
require
.
Len
(
t
,
accounts
,
1
)
require
.
Len
(
t
,
accounts
,
1
)
...
...
backend/internal/service/setting_service.go
View file @
1ef3782d
...
@@ -9,6 +9,7 @@ import (
...
@@ -9,6 +9,7 @@ import (
"fmt"
"fmt"
"log/slog"
"log/slog"
"net/url"
"net/url"
"sort"
"strconv"
"strconv"
"strings"
"strings"
"sync/atomic"
"sync/atomic"
...
@@ -161,6 +162,8 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
...
@@ -161,6 +162,8 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
SettingKeyHideCcsImportButton
,
SettingKeyHideCcsImportButton
,
SettingKeyPurchaseSubscriptionEnabled
,
SettingKeyPurchaseSubscriptionEnabled
,
SettingKeyPurchaseSubscriptionURL
,
SettingKeyPurchaseSubscriptionURL
,
SettingKeyTableDefaultPageSize
,
SettingKeyTablePageSizeOptions
,
SettingKeyCustomMenuItems
,
SettingKeyCustomMenuItems
,
SettingKeyCustomEndpoints
,
SettingKeyCustomEndpoints
,
SettingKeyLinuxDoConnectEnabled
,
SettingKeyLinuxDoConnectEnabled
,
...
@@ -200,6 +203,10 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
...
@@ -200,6 +203,10 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
registrationEmailSuffixWhitelist
:=
ParseRegistrationEmailSuffixWhitelist
(
registrationEmailSuffixWhitelist
:=
ParseRegistrationEmailSuffixWhitelist
(
settings
[
SettingKeyRegistrationEmailSuffixWhitelist
],
settings
[
SettingKeyRegistrationEmailSuffixWhitelist
],
)
)
tableDefaultPageSize
,
tablePageSizeOptions
:=
parseTablePreferences
(
settings
[
SettingKeyTableDefaultPageSize
],
settings
[
SettingKeyTablePageSizeOptions
],
)
return
&
PublicSettings
{
return
&
PublicSettings
{
RegistrationEnabled
:
settings
[
SettingKeyRegistrationEnabled
]
==
"true"
,
RegistrationEnabled
:
settings
[
SettingKeyRegistrationEnabled
]
==
"true"
,
...
@@ -221,6 +228,8 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
...
@@ -221,6 +228,8 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
HideCcsImportButton
:
settings
[
SettingKeyHideCcsImportButton
]
==
"true"
,
HideCcsImportButton
:
settings
[
SettingKeyHideCcsImportButton
]
==
"true"
,
PurchaseSubscriptionEnabled
:
settings
[
SettingKeyPurchaseSubscriptionEnabled
]
==
"true"
,
PurchaseSubscriptionEnabled
:
settings
[
SettingKeyPurchaseSubscriptionEnabled
]
==
"true"
,
PurchaseSubscriptionURL
:
strings
.
TrimSpace
(
settings
[
SettingKeyPurchaseSubscriptionURL
]),
PurchaseSubscriptionURL
:
strings
.
TrimSpace
(
settings
[
SettingKeyPurchaseSubscriptionURL
]),
TableDefaultPageSize
:
tableDefaultPageSize
,
TablePageSizeOptions
:
tablePageSizeOptions
,
CustomMenuItems
:
settings
[
SettingKeyCustomMenuItems
],
CustomMenuItems
:
settings
[
SettingKeyCustomMenuItems
],
CustomEndpoints
:
settings
[
SettingKeyCustomEndpoints
],
CustomEndpoints
:
settings
[
SettingKeyCustomEndpoints
],
LinuxDoOAuthEnabled
:
linuxDoEnabled
,
LinuxDoOAuthEnabled
:
linuxDoEnabled
,
...
@@ -270,6 +279,8 @@ func (s *SettingService) GetPublicSettingsForInjection(ctx context.Context) (any
...
@@ -270,6 +279,8 @@ func (s *SettingService) GetPublicSettingsForInjection(ctx context.Context) (any
HideCcsImportButton
bool
`json:"hide_ccs_import_button"`
HideCcsImportButton
bool
`json:"hide_ccs_import_button"`
PurchaseSubscriptionEnabled
bool
`json:"purchase_subscription_enabled"`
PurchaseSubscriptionEnabled
bool
`json:"purchase_subscription_enabled"`
PurchaseSubscriptionURL
string
`json:"purchase_subscription_url,omitempty"`
PurchaseSubscriptionURL
string
`json:"purchase_subscription_url,omitempty"`
TableDefaultPageSize
int
`json:"table_default_page_size"`
TablePageSizeOptions
[]
int
`json:"table_page_size_options"`
CustomMenuItems
json
.
RawMessage
`json:"custom_menu_items"`
CustomMenuItems
json
.
RawMessage
`json:"custom_menu_items"`
CustomEndpoints
json
.
RawMessage
`json:"custom_endpoints"`
CustomEndpoints
json
.
RawMessage
`json:"custom_endpoints"`
LinuxDoOAuthEnabled
bool
`json:"linuxdo_oauth_enabled"`
LinuxDoOAuthEnabled
bool
`json:"linuxdo_oauth_enabled"`
...
@@ -297,6 +308,8 @@ func (s *SettingService) GetPublicSettingsForInjection(ctx context.Context) (any
...
@@ -297,6 +308,8 @@ func (s *SettingService) GetPublicSettingsForInjection(ctx context.Context) (any
HideCcsImportButton
:
settings
.
HideCcsImportButton
,
HideCcsImportButton
:
settings
.
HideCcsImportButton
,
PurchaseSubscriptionEnabled
:
settings
.
PurchaseSubscriptionEnabled
,
PurchaseSubscriptionEnabled
:
settings
.
PurchaseSubscriptionEnabled
,
PurchaseSubscriptionURL
:
settings
.
PurchaseSubscriptionURL
,
PurchaseSubscriptionURL
:
settings
.
PurchaseSubscriptionURL
,
TableDefaultPageSize
:
settings
.
TableDefaultPageSize
,
TablePageSizeOptions
:
settings
.
TablePageSizeOptions
,
CustomMenuItems
:
filterUserVisibleMenuItems
(
settings
.
CustomMenuItems
),
CustomMenuItems
:
filterUserVisibleMenuItems
(
settings
.
CustomMenuItems
),
CustomEndpoints
:
safeRawJSONArray
(
settings
.
CustomEndpoints
),
CustomEndpoints
:
safeRawJSONArray
(
settings
.
CustomEndpoints
),
LinuxDoOAuthEnabled
:
settings
.
LinuxDoOAuthEnabled
,
LinuxDoOAuthEnabled
:
settings
.
LinuxDoOAuthEnabled
,
...
@@ -522,6 +535,16 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet
...
@@ -522,6 +535,16 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet
updates
[
SettingKeyHideCcsImportButton
]
=
strconv
.
FormatBool
(
settings
.
HideCcsImportButton
)
updates
[
SettingKeyHideCcsImportButton
]
=
strconv
.
FormatBool
(
settings
.
HideCcsImportButton
)
updates
[
SettingKeyPurchaseSubscriptionEnabled
]
=
strconv
.
FormatBool
(
settings
.
PurchaseSubscriptionEnabled
)
updates
[
SettingKeyPurchaseSubscriptionEnabled
]
=
strconv
.
FormatBool
(
settings
.
PurchaseSubscriptionEnabled
)
updates
[
SettingKeyPurchaseSubscriptionURL
]
=
strings
.
TrimSpace
(
settings
.
PurchaseSubscriptionURL
)
updates
[
SettingKeyPurchaseSubscriptionURL
]
=
strings
.
TrimSpace
(
settings
.
PurchaseSubscriptionURL
)
tableDefaultPageSize
,
tablePageSizeOptions
:=
normalizeTablePreferences
(
settings
.
TableDefaultPageSize
,
settings
.
TablePageSizeOptions
,
)
updates
[
SettingKeyTableDefaultPageSize
]
=
strconv
.
Itoa
(
tableDefaultPageSize
)
tablePageSizeOptionsJSON
,
err
:=
json
.
Marshal
(
tablePageSizeOptions
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"marshal table page size options: %w"
,
err
)
}
updates
[
SettingKeyTablePageSizeOptions
]
=
string
(
tablePageSizeOptionsJSON
)
updates
[
SettingKeyCustomMenuItems
]
=
settings
.
CustomMenuItems
updates
[
SettingKeyCustomMenuItems
]
=
settings
.
CustomMenuItems
updates
[
SettingKeyCustomEndpoints
]
=
settings
.
CustomEndpoints
updates
[
SettingKeyCustomEndpoints
]
=
settings
.
CustomEndpoints
...
@@ -875,6 +898,8 @@ func (s *SettingService) InitializeDefaultSettings(ctx context.Context) error {
...
@@ -875,6 +898,8 @@ func (s *SettingService) InitializeDefaultSettings(ctx context.Context) error {
SettingKeySiteLogo
:
""
,
SettingKeySiteLogo
:
""
,
SettingKeyPurchaseSubscriptionEnabled
:
"false"
,
SettingKeyPurchaseSubscriptionEnabled
:
"false"
,
SettingKeyPurchaseSubscriptionURL
:
""
,
SettingKeyPurchaseSubscriptionURL
:
""
,
SettingKeyTableDefaultPageSize
:
"20"
,
SettingKeyTablePageSizeOptions
:
"[10,20,50,100]"
,
SettingKeyCustomMenuItems
:
"[]"
,
SettingKeyCustomMenuItems
:
"[]"
,
SettingKeyCustomEndpoints
:
"[]"
,
SettingKeyCustomEndpoints
:
"[]"
,
SettingKeyOIDCConnectEnabled
:
"false"
,
SettingKeyOIDCConnectEnabled
:
"false"
,
...
@@ -946,6 +971,10 @@ func (s *SettingService) parseSettings(settings map[string]string) *SystemSettin
...
@@ -946,6 +971,10 @@ func (s *SettingService) parseSettings(settings map[string]string) *SystemSettin
CustomEndpoints
:
settings
[
SettingKeyCustomEndpoints
],
CustomEndpoints
:
settings
[
SettingKeyCustomEndpoints
],
BackendModeEnabled
:
settings
[
SettingKeyBackendModeEnabled
]
==
"true"
,
BackendModeEnabled
:
settings
[
SettingKeyBackendModeEnabled
]
==
"true"
,
}
}
result
.
TableDefaultPageSize
,
result
.
TablePageSizeOptions
=
parseTablePreferences
(
settings
[
SettingKeyTableDefaultPageSize
],
settings
[
SettingKeyTablePageSizeOptions
],
)
// 解析整数类型
// 解析整数类型
if
port
,
err
:=
strconv
.
Atoi
(
settings
[
SettingKeySMTPPort
]);
err
==
nil
{
if
port
,
err
:=
strconv
.
Atoi
(
settings
[
SettingKeySMTPPort
]);
err
==
nil
{
...
@@ -1221,6 +1250,50 @@ func parseDefaultSubscriptions(raw string) []DefaultSubscriptionSetting {
...
@@ -1221,6 +1250,50 @@ func parseDefaultSubscriptions(raw string) []DefaultSubscriptionSetting {
return
normalized
return
normalized
}
}
func
parseTablePreferences
(
defaultPageSizeRaw
,
optionsRaw
string
)
(
int
,
[]
int
)
{
defaultPageSize
:=
20
if
v
,
err
:=
strconv
.
Atoi
(
strings
.
TrimSpace
(
defaultPageSizeRaw
));
err
==
nil
{
defaultPageSize
=
v
}
var
options
[]
int
if
strings
.
TrimSpace
(
optionsRaw
)
!=
""
{
_
=
json
.
Unmarshal
([]
byte
(
optionsRaw
),
&
options
)
}
return
normalizeTablePreferences
(
defaultPageSize
,
options
)
}
func
normalizeTablePreferences
(
defaultPageSize
int
,
options
[]
int
)
(
int
,
[]
int
)
{
const
minPageSize
=
5
const
maxPageSize
=
1000
const
fallbackPageSize
=
20
seen
:=
make
(
map
[
int
]
struct
{},
len
(
options
))
normalizedOptions
:=
make
([]
int
,
0
,
len
(
options
))
for
_
,
option
:=
range
options
{
if
option
<
minPageSize
||
option
>
maxPageSize
{
continue
}
if
_
,
ok
:=
seen
[
option
];
ok
{
continue
}
seen
[
option
]
=
struct
{}{}
normalizedOptions
=
append
(
normalizedOptions
,
option
)
}
sort
.
Ints
(
normalizedOptions
)
if
defaultPageSize
<
minPageSize
||
defaultPageSize
>
maxPageSize
{
defaultPageSize
=
fallbackPageSize
}
if
len
(
normalizedOptions
)
==
0
{
normalizedOptions
=
[]
int
{
10
,
20
,
50
}
}
return
defaultPageSize
,
normalizedOptions
}
// getStringOrDefault 获取字符串值或默认值
// getStringOrDefault 获取字符串值或默认值
func
(
s
*
SettingService
)
getStringOrDefault
(
settings
map
[
string
]
string
,
key
,
defaultValue
string
)
string
{
func
(
s
*
SettingService
)
getStringOrDefault
(
settings
map
[
string
]
string
,
key
,
defaultValue
string
)
string
{
if
value
,
ok
:=
settings
[
key
];
ok
&&
value
!=
""
{
if
value
,
ok
:=
settings
[
key
];
ok
&&
value
!=
""
{
...
...
backend/internal/service/setting_service_public_test.go
View file @
1ef3782d
...
@@ -62,3 +62,18 @@ func TestSettingService_GetPublicSettings_ExposesRegistrationEmailSuffixWhitelis
...
@@ -62,3 +62,18 @@ func TestSettingService_GetPublicSettings_ExposesRegistrationEmailSuffixWhitelis
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
[]
string
{
"@example.com"
,
"@foo.bar"
},
settings
.
RegistrationEmailSuffixWhitelist
)
require
.
Equal
(
t
,
[]
string
{
"@example.com"
,
"@foo.bar"
},
settings
.
RegistrationEmailSuffixWhitelist
)
}
}
func
TestSettingService_GetPublicSettings_ExposesTablePreferences
(
t
*
testing
.
T
)
{
repo
:=
&
settingPublicRepoStub
{
values
:
map
[
string
]
string
{
SettingKeyTableDefaultPageSize
:
"50"
,
SettingKeyTablePageSizeOptions
:
"[20,50,100]"
,
},
}
svc
:=
NewSettingService
(
repo
,
&
config
.
Config
{})
settings
,
err
:=
svc
.
GetPublicSettings
(
context
.
Background
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
50
,
settings
.
TableDefaultPageSize
)
require
.
Equal
(
t
,
[]
int
{
20
,
50
,
100
},
settings
.
TablePageSizeOptions
)
}
backend/internal/service/setting_service_update_test.go
View file @
1ef3782d
...
@@ -202,3 +202,24 @@ func TestParseDefaultSubscriptions_NormalizesValues(t *testing.T) {
...
@@ -202,3 +202,24 @@ func TestParseDefaultSubscriptions_NormalizesValues(t *testing.T) {
{
GroupID
:
12
,
ValidityDays
:
MaxValidityDays
},
{
GroupID
:
12
,
ValidityDays
:
MaxValidityDays
},
},
got
)
},
got
)
}
}
func
TestSettingService_UpdateSettings_TablePreferences
(
t
*
testing
.
T
)
{
repo
:=
&
settingUpdateRepoStub
{}
svc
:=
NewSettingService
(
repo
,
&
config
.
Config
{})
err
:=
svc
.
UpdateSettings
(
context
.
Background
(),
&
SystemSettings
{
TableDefaultPageSize
:
50
,
TablePageSizeOptions
:
[]
int
{
20
,
50
,
100
},
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
"50"
,
repo
.
updates
[
SettingKeyTableDefaultPageSize
])
require
.
Equal
(
t
,
"[20,50,100]"
,
repo
.
updates
[
SettingKeyTablePageSizeOptions
])
err
=
svc
.
UpdateSettings
(
context
.
Background
(),
&
SystemSettings
{
TableDefaultPageSize
:
1000
,
TablePageSizeOptions
:
[]
int
{
20
,
100
},
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
"1000"
,
repo
.
updates
[
SettingKeyTableDefaultPageSize
])
require
.
Equal
(
t
,
"[20,100]"
,
repo
.
updates
[
SettingKeyTablePageSizeOptions
])
}
backend/internal/service/settings_view.go
View file @
1ef3782d
...
@@ -66,6 +66,8 @@ type SystemSettings struct {
...
@@ -66,6 +66,8 @@ type SystemSettings struct {
HideCcsImportButton
bool
HideCcsImportButton
bool
PurchaseSubscriptionEnabled
bool
PurchaseSubscriptionEnabled
bool
PurchaseSubscriptionURL
string
PurchaseSubscriptionURL
string
TableDefaultPageSize
int
TablePageSizeOptions
[]
int
CustomMenuItems
string
// JSON array of custom menu items
CustomMenuItems
string
// JSON array of custom menu items
CustomEndpoints
string
// JSON array of custom endpoints
CustomEndpoints
string
// JSON array of custom endpoints
...
@@ -132,6 +134,8 @@ type PublicSettings struct {
...
@@ -132,6 +134,8 @@ type PublicSettings struct {
PurchaseSubscriptionEnabled
bool
PurchaseSubscriptionEnabled
bool
PurchaseSubscriptionURL
string
PurchaseSubscriptionURL
string
TableDefaultPageSize
int
TablePageSizeOptions
[]
int
CustomMenuItems
string
// JSON array of custom menu items
CustomMenuItems
string
// JSON array of custom menu items
CustomEndpoints
string
// JSON array of custom endpoints
CustomEndpoints
string
// JSON array of custom endpoints
...
...
frontend/package.json
View file @
1ef3782d
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
"@lobehub/icons"
:
"^4.0.2"
,
"@lobehub/icons"
:
"^4.0.2"
,
"@tanstack/vue-virtual"
:
"^3.13.23"
,
"@tanstack/vue-virtual"
:
"^3.13.23"
,
"@vueuse/core"
:
"^10.7.0"
,
"@vueuse/core"
:
"^10.7.0"
,
"axios"
:
"^1.1
3.5
"
,
"axios"
:
"^1.1
5.0
"
,
"chart.js"
:
"^4.4.1"
,
"chart.js"
:
"^4.4.1"
,
"dompurify"
:
"^3.3.1"
,
"dompurify"
:
"^3.3.1"
,
"driver.js"
:
"^1.4.0"
,
"driver.js"
:
"^1.4.0"
,
...
...
frontend/pnpm-lock.yaml
View file @
1ef3782d
This diff is collapsed.
Click to expand it.
frontend/src/api/admin/accounts.ts
View file @
1ef3782d
...
@@ -38,6 +38,8 @@ export async function list(
...
@@ -38,6 +38,8 @@ export async function list(
search
?:
string
search
?:
string
privacy_mode
?:
string
privacy_mode
?:
string
lite
?:
string
lite
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
},
options
?:
{
options
?:
{
signal
?:
AbortSignal
signal
?:
AbortSignal
...
@@ -71,6 +73,8 @@ export async function listWithEtag(
...
@@ -71,6 +73,8 @@ export async function listWithEtag(
search
?:
string
search
?:
string
privacy_mode
?:
string
privacy_mode
?:
string
lite
?:
string
lite
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
},
options
?:
{
options
?:
{
signal
?:
AbortSignal
signal
?:
AbortSignal
...
@@ -500,7 +504,11 @@ export async function exportData(options?: {
...
@@ -500,7 +504,11 @@ export async function exportData(options?: {
platform
?:
string
platform
?:
string
type
?:
string
type
?:
string
status
?:
string
status
?:
string
group
?:
string
privacy_mode
?:
string
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}
}
includeProxies
?:
boolean
includeProxies
?:
boolean
}):
Promise
<
AdminDataPayload
>
{
}):
Promise
<
AdminDataPayload
>
{
...
@@ -508,11 +516,15 @@ export async function exportData(options?: {
...
@@ -508,11 +516,15 @@ export async function exportData(options?: {
if
(
options
?.
ids
&&
options
.
ids
.
length
>
0
)
{
if
(
options
?.
ids
&&
options
.
ids
.
length
>
0
)
{
params
.
ids
=
options
.
ids
.
join
(
'
,
'
)
params
.
ids
=
options
.
ids
.
join
(
'
,
'
)
}
else
if
(
options
?.
filters
)
{
}
else
if
(
options
?.
filters
)
{
const
{
platform
,
type
,
status
,
search
}
=
options
.
filters
const
{
platform
,
type
,
status
,
group
,
privacy_mode
,
search
,
sort_by
,
sort_order
}
=
options
.
filters
if
(
platform
)
params
.
platform
=
platform
if
(
platform
)
params
.
platform
=
platform
if
(
type
)
params
.
type
=
type
if
(
type
)
params
.
type
=
type
if
(
status
)
params
.
status
=
status
if
(
status
)
params
.
status
=
status
if
(
group
)
params
.
group
=
group
if
(
privacy_mode
)
params
.
privacy_mode
=
privacy_mode
if
(
search
)
params
.
search
=
search
if
(
search
)
params
.
search
=
search
if
(
sort_by
)
params
.
sort_by
=
sort_by
if
(
sort_order
)
params
.
sort_order
=
sort_order
}
}
if
(
options
?.
includeProxies
===
false
)
{
if
(
options
?.
includeProxies
===
false
)
{
params
.
include_proxies
=
'
false
'
params
.
include_proxies
=
'
false
'
...
...
frontend/src/api/admin/announcements.ts
View file @
1ef3782d
...
@@ -17,10 +17,16 @@ export async function list(
...
@@ -17,10 +17,16 @@ export async function list(
filters
?:
{
filters
?:
{
status
?:
string
status
?:
string
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
}
):
Promise
<
BasePaginationResponse
<
Announcement
>>
{
):
Promise
<
BasePaginationResponse
<
Announcement
>>
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
Announcement
>>
(
'
/admin/announcements
'
,
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
Announcement
>>
(
'
/admin/announcements
'
,
{
params
:
{
page
,
page_size
:
pageSize
,
...
filters
}
params
:
{
page
,
page_size
:
pageSize
,
...
filters
},
signal
:
options
?.
signal
})
})
return
data
return
data
}
}
...
@@ -49,11 +55,21 @@ export async function getReadStatus(
...
@@ -49,11 +55,21 @@ export async function getReadStatus(
id
:
number
,
id
:
number
,
page
:
number
=
1
,
page
:
number
=
1
,
pageSize
:
number
=
20
,
pageSize
:
number
=
20
,
search
:
string
=
''
filters
?:
{
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
):
Promise
<
BasePaginationResponse
<
AnnouncementUserReadStatus
>>
{
):
Promise
<
BasePaginationResponse
<
AnnouncementUserReadStatus
>>
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
AnnouncementUserReadStatus
>>
(
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
AnnouncementUserReadStatus
>>
(
`/admin/announcements/
${
id
}
/read-status`
,
`/admin/announcements/
${
id
}
/read-status`
,
{
params
:
{
page
,
page_size
:
pageSize
,
search
}
}
{
params
:
{
page
,
page_size
:
pageSize
,
...
filters
},
signal
:
options
?.
signal
}
)
)
return
data
return
data
}
}
...
@@ -68,4 +84,3 @@ const announcementsAPI = {
...
@@ -68,4 +84,3 @@ const announcementsAPI = {
}
}
export
default
announcementsAPI
export
default
announcementsAPI
frontend/src/api/admin/channels.ts
View file @
1ef3782d
...
@@ -83,6 +83,8 @@ export async function list(
...
@@ -83,6 +83,8 @@ export async function list(
filters
?:
{
filters
?:
{
status
?:
string
status
?:
string
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
},
options
?:
{
signal
?:
AbortSignal
}
options
?:
{
signal
?:
AbortSignal
}
):
Promise
<
PaginatedResponse
<
Channel
>>
{
):
Promise
<
PaginatedResponse
<
Channel
>>
{
...
...
frontend/src/api/admin/groups.ts
View file @
1ef3782d
...
@@ -27,6 +27,8 @@ export async function list(
...
@@ -27,6 +27,8 @@ export async function list(
status
?:
'
active
'
|
'
inactive
'
status
?:
'
active
'
|
'
inactive
'
is_exclusive
?:
boolean
is_exclusive
?:
boolean
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
},
options
?:
{
options
?:
{
signal
?:
AbortSignal
signal
?:
AbortSignal
...
...
frontend/src/api/admin/promo.ts
View file @
1ef3782d
...
@@ -17,10 +17,16 @@ export async function list(
...
@@ -17,10 +17,16 @@ export async function list(
filters
?:
{
filters
?:
{
status
?:
string
status
?:
string
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
}
):
Promise
<
BasePaginationResponse
<
PromoCode
>>
{
):
Promise
<
BasePaginationResponse
<
PromoCode
>>
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
PromoCode
>>
(
'
/admin/promo-codes
'
,
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
PromoCode
>>
(
'
/admin/promo-codes
'
,
{
params
:
{
page
,
page_size
:
pageSize
,
...
filters
}
params
:
{
page
,
page_size
:
pageSize
,
...
filters
},
signal
:
options
?.
signal
})
})
return
data
return
data
}
}
...
...
frontend/src/api/admin/proxies.ts
View file @
1ef3782d
...
@@ -29,6 +29,8 @@ export async function list(
...
@@ -29,6 +29,8 @@ export async function list(
protocol
?:
string
protocol
?:
string
status
?:
'
active
'
|
'
inactive
'
status
?:
'
active
'
|
'
inactive
'
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
},
options
?:
{
options
?:
{
signal
?:
AbortSignal
signal
?:
AbortSignal
...
@@ -227,16 +229,20 @@ export async function exportData(options?: {
...
@@ -227,16 +229,20 @@ export async function exportData(options?: {
protocol
?:
string
protocol
?:
string
status
?:
'
active
'
|
'
inactive
'
status
?:
'
active
'
|
'
inactive
'
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}
}
}):
Promise
<
AdminDataPayload
>
{
}):
Promise
<
AdminDataPayload
>
{
const
params
:
Record
<
string
,
string
>
=
{}
const
params
:
Record
<
string
,
string
>
=
{}
if
(
options
?.
ids
&&
options
.
ids
.
length
>
0
)
{
if
(
options
?.
ids
&&
options
.
ids
.
length
>
0
)
{
params
.
ids
=
options
.
ids
.
join
(
'
,
'
)
params
.
ids
=
options
.
ids
.
join
(
'
,
'
)
}
else
if
(
options
?.
filters
)
{
}
else
if
(
options
?.
filters
)
{
const
{
protocol
,
status
,
search
}
=
options
.
filters
const
{
protocol
,
status
,
search
,
sort_by
,
sort_order
}
=
options
.
filters
if
(
protocol
)
params
.
protocol
=
protocol
if
(
protocol
)
params
.
protocol
=
protocol
if
(
status
)
params
.
status
=
status
if
(
status
)
params
.
status
=
status
if
(
search
)
params
.
search
=
search
if
(
search
)
params
.
search
=
search
if
(
sort_by
)
params
.
sort_by
=
sort_by
if
(
sort_order
)
params
.
sort_order
=
sort_order
}
}
const
{
data
}
=
await
apiClient
.
get
<
AdminDataPayload
>
(
'
/admin/proxies/data
'
,
{
params
})
const
{
data
}
=
await
apiClient
.
get
<
AdminDataPayload
>
(
'
/admin/proxies/data
'
,
{
params
})
return
data
return
data
...
...
frontend/src/api/admin/redeem.ts
View file @
1ef3782d
...
@@ -25,6 +25,8 @@ export async function list(
...
@@ -25,6 +25,8 @@ export async function list(
type
?:
RedeemCodeType
type
?:
RedeemCodeType
status
?:
'
active
'
|
'
used
'
|
'
expired
'
|
'
unused
'
status
?:
'
active
'
|
'
used
'
|
'
expired
'
|
'
unused
'
search
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
},
options
?:
{
options
?:
{
signal
?:
AbortSignal
signal
?:
AbortSignal
...
@@ -151,7 +153,10 @@ export async function getStats(): Promise<{
...
@@ -151,7 +153,10 @@ export async function getStats(): Promise<{
*/
*/
export
async
function
exportCodes
(
filters
?:
{
export
async
function
exportCodes
(
filters
?:
{
type
?:
RedeemCodeType
type
?:
RedeemCodeType
status
?:
'
active
'
|
'
used
'
|
'
expired
'
status
?:
'
used
'
|
'
expired
'
|
'
unused
'
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}):
Promise
<
Blob
>
{
}):
Promise
<
Blob
>
{
const
response
=
await
apiClient
.
get
(
'
/admin/redeem-codes/export
'
,
{
const
response
=
await
apiClient
.
get
(
'
/admin/redeem-codes/export
'
,
{
params
:
filters
,
params
:
filters
,
...
...
frontend/src/api/admin/settings.ts
View file @
1ef3782d
...
@@ -40,6 +40,8 @@ export interface SystemSettings {
...
@@ -40,6 +40,8 @@ export interface SystemSettings {
hide_ccs_import_button
:
boolean
hide_ccs_import_button
:
boolean
purchase_subscription_enabled
:
boolean
purchase_subscription_enabled
:
boolean
purchase_subscription_url
:
string
purchase_subscription_url
:
string
table_default_page_size
:
number
table_page_size_options
:
number
[]
backend_mode_enabled
:
boolean
backend_mode_enabled
:
boolean
custom_menu_items
:
CustomMenuItem
[]
custom_menu_items
:
CustomMenuItem
[]
custom_endpoints
:
CustomEndpoint
[]
custom_endpoints
:
CustomEndpoint
[]
...
@@ -138,6 +140,8 @@ export interface UpdateSettingsRequest {
...
@@ -138,6 +140,8 @@ export interface UpdateSettingsRequest {
hide_ccs_import_button
?:
boolean
hide_ccs_import_button
?:
boolean
purchase_subscription_enabled
?:
boolean
purchase_subscription_enabled
?:
boolean
purchase_subscription_url
?:
string
purchase_subscription_url
?:
string
table_default_page_size
?:
number
table_page_size_options
?:
number
[]
backend_mode_enabled
?:
boolean
backend_mode_enabled
?:
boolean
custom_menu_items
?:
CustomMenuItem
[]
custom_menu_items
?:
CustomMenuItem
[]
custom_endpoints
?:
CustomEndpoint
[]
custom_endpoints
?:
CustomEndpoint
[]
...
...
frontend/src/api/admin/usage.ts
View file @
1ef3782d
...
@@ -81,6 +81,8 @@ export interface AdminUsageQueryParams extends UsageQueryParams {
...
@@ -81,6 +81,8 @@ export interface AdminUsageQueryParams extends UsageQueryParams {
user_id
?:
number
user_id
?:
number
exact_total
?:
boolean
exact_total
?:
boolean
billing_mode
?:
string
billing_mode
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}
}
// ==================== API Functions ====================
// ==================== API Functions ====================
...
...
frontend/src/api/admin/users.ts
View file @
1ef3782d
...
@@ -24,6 +24,8 @@ export async function list(
...
@@ -24,6 +24,8 @@ export async function list(
group_name
?:
string
// fuzzy filter by allowed group name
group_name
?:
string
// fuzzy filter by allowed group name
attributes
?:
Record
<
number
,
string
>
// attributeId -> value
attributes
?:
Record
<
number
,
string
>
// attributeId -> value
include_subscriptions
?:
boolean
include_subscriptions
?:
boolean
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
},
options
?:
{
options
?:
{
signal
?:
AbortSignal
signal
?:
AbortSignal
...
@@ -37,7 +39,9 @@ export async function list(
...
@@ -37,7 +39,9 @@ export async function list(
role
:
filters
?.
role
,
role
:
filters
?.
role
,
search
:
filters
?.
search
,
search
:
filters
?.
search
,
group_name
:
filters
?.
group_name
,
group_name
:
filters
?.
group_name
,
include_subscriptions
:
filters
?.
include_subscriptions
include_subscriptions
:
filters
?.
include_subscriptions
,
sort_by
:
filters
?.
sort_by
,
sort_order
:
filters
?.
sort_order
}
}
// Add attribute filters as attr[id]=value
// Add attribute filters as attr[id]=value
...
...
frontend/src/api/keys.ts
View file @
1ef3782d
...
@@ -17,7 +17,13 @@ import type { ApiKey, CreateApiKeyRequest, UpdateApiKeyRequest, PaginatedRespons
...
@@ -17,7 +17,13 @@ import type { ApiKey, CreateApiKeyRequest, UpdateApiKeyRequest, PaginatedRespons
export
async
function
list
(
export
async
function
list
(
page
:
number
=
1
,
page
:
number
=
1
,
pageSize
:
number
=
10
,
pageSize
:
number
=
10
,
filters
?:
{
search
?:
string
;
status
?:
string
;
group_id
?:
number
|
string
},
filters
?:
{
search
?:
string
status
?:
string
group_id
?:
number
|
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
options
?:
{
signal
?:
AbortSignal
signal
?:
AbortSignal
}
}
...
...
frontend/src/api/usage.ts
View file @
1ef3782d
...
@@ -91,7 +91,7 @@ export async function list(
...
@@ -91,7 +91,7 @@ export async function list(
* @returns Paginated list of usage logs
* @returns Paginated list of usage logs
*/
*/
export
async
function
query
(
export
async
function
query
(
params
:
UsageQueryParams
,
params
:
UsageQueryParams
&
{
sort_by
?:
string
;
sort_order
?:
'
asc
'
|
'
desc
'
}
,
config
:
{
signal
?:
AbortSignal
}
=
{}
config
:
{
signal
?:
AbortSignal
}
=
{}
):
Promise
<
PaginatedResponse
<
UsageLog
>>
{
):
Promise
<
PaginatedResponse
<
UsageLog
>>
{
const
{
data
}
=
await
apiClient
.
get
<
PaginatedResponse
<
UsageLog
>>
(
'
/usage
'
,
{
const
{
data
}
=
await
apiClient
.
get
<
PaginatedResponse
<
UsageLog
>>
(
'
/usage
'
,
{
...
...
Prev
1
2
3
4
5
6
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment