feat(admin): 添加用户管理和Linux.do登录功能

- 新增AdminUser类型定义及用户管理API接口
- 实现用户列表查询、保存和删除功能
- 添加Linux.do第三方登录支持
- 集成Linux.do OAuth认证流程
- 在系统设置中添加Linux.do登录配置选项
- 实现算力点余额调整记录功能
- 优化搜索组件关键词状态管理
- 更新数据库迁移添加credit_logs表
- 完善用户状态和信用等级验证逻辑
This commit is contained in:
HouYunFei
2026-05-25 11:21:09 +08:00
parent f871a5d015
commit b2cae2471d
25 changed files with 1023 additions and 117 deletions
+23 -2
View File
@@ -35,12 +35,22 @@ type PublicModelChannelSetting struct {
// PublicSetting 公开配置。
type PublicSetting struct {
ModelChannel PublicModelChannelSetting `json:"modelChannel"`
Auth PublicAuthSetting `json:"auth"`
}
type PublicAuthSetting struct {
LinuxDo PublicLinuxDoAuthSetting `json:"linuxDo"`
}
type PublicLinuxDoAuthSetting struct {
Enabled bool `json:"enabled"`
}
// PrivateSetting 私有配置。
type PrivateSetting struct {
Channels []ModelChannel `json:"channels"`
PromptSync PromptSyncSetting `json:"promptSync"`
Channels []ModelChannel `json:"channels"`
PromptSync PromptSyncSetting `json:"promptSync"`
Auth PrivateAuthSetting `json:"auth"`
}
// PromptSyncSetting 提示词定时同步配置。
@@ -49,6 +59,17 @@ type PromptSyncSetting struct {
Cron string `json:"cron"`
}
type PrivateAuthSetting struct {
LinuxDo PrivateLinuxDoAuthSetting `json:"linuxDo"`
}
type PrivateLinuxDoAuthSetting struct {
ClientID string `json:"clientId"`
ClientSecret string `json:"clientSecret"`
RedirectURI string `json:"redirectUri"`
MinimumTrustLevel int `json:"minimumTrustLevel"`
}
// Setting 系统配置。
type Setting struct {
Key SettingKey `json:"key" gorm:"primaryKey"`
+61 -16
View File
@@ -8,14 +8,34 @@ const (
UserRoleAdmin UserRole = "admin"
)
type UserStatus string
const (
UserStatusActive UserStatus = "active"
UserStatusBan UserStatus = "ban"
)
// User 系统用户。
type User struct {
ID string `json:"id" gorm:"primaryKey"`
Username string `json:"username" gorm:"uniqueIndex"`
Password string `json:"password,omitempty"`
Role UserRole `json:"role"`
CreatedAt string `json:"createdAt"`
UpdatedAt string `json:"updatedAt"`
ID string `json:"id" gorm:"primaryKey"`
Username string `json:"username" gorm:"uniqueIndex"`
Password string `json:"password,omitempty"`
Email string `json:"email"`
DisplayName string `json:"displayName"`
AvatarURL string `json:"avatarUrl"`
Role UserRole `json:"role"`
Credits int `json:"credits"`
AffCode string `json:"affCode" gorm:"uniqueIndex"`
AffCount int `json:"affCount"`
InviterID string `json:"inviterId"`
GithubID string `json:"githubId"`
LinuxDoID string `json:"linuxDoId" gorm:"index"`
WechatID string `json:"wechatId"`
Status UserStatus `json:"status"`
LastLoginAt string `json:"lastLoginAt"`
Extra string `json:"extra" gorm:"type:text"`
CreatedAt string `json:"createdAt"`
UpdatedAt string `json:"updatedAt"`
}
// UserList 用户分页结果。
@@ -26,11 +46,14 @@ type UserList struct {
// AuthUser 用户公开信息。
type AuthUser struct {
ID string `json:"id"`
Username string `json:"username"`
Role UserRole `json:"role"`
CreatedAt string `json:"createdAt"`
UpdatedAt string `json:"updatedAt"`
ID string `json:"id"`
Username string `json:"username"`
DisplayName string `json:"displayName"`
AvatarURL string `json:"avatarUrl"`
Role UserRole `json:"role"`
Credits int `json:"credits"`
CreatedAt string `json:"createdAt"`
UpdatedAt string `json:"updatedAt"`
}
// AuthSession 登录会话信息。
@@ -41,10 +64,32 @@ type AuthSession struct {
func PublicUser(user User) AuthUser {
return AuthUser{
ID: user.ID,
Username: user.Username,
Role: user.Role,
CreatedAt: user.CreatedAt,
UpdatedAt: user.UpdatedAt,
ID: user.ID,
Username: user.Username,
DisplayName: user.DisplayName,
AvatarURL: user.AvatarURL,
Role: user.Role,
Credits: user.Credits,
CreatedAt: user.CreatedAt,
UpdatedAt: user.UpdatedAt,
}
}
type CreditLogType string
const (
CreditLogTypeAdminAdjust CreditLogType = "admin_adjust"
)
// CreditLog 用户算力点变更流水。
type CreditLog struct {
ID string `json:"id" gorm:"primaryKey"`
UserID string `json:"userId" gorm:"index"`
Type CreditLogType `json:"type"`
Amount int `json:"amount"`
Balance int `json:"balance"`
RelatedID string `json:"relatedId"`
Remark string `json:"remark"`
Extra string `json:"extra" gorm:"type:text"`
CreatedAt string `json:"createdAt"`
}