2026-08-11 19:07:05 +08:00
|
|
|
|
// Package model 定义后端服务、SQLite 仓储和 Wails 前端之间共享的数据结构。
|
|
|
|
|
|
// 该包只描述数据,不包含数据库或系统命令逻辑,因此可被各层安全复用。
|
|
|
|
|
|
package model
|
|
|
|
|
|
|
|
|
|
|
|
type Project struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Path string `json:"path"`
|
|
|
|
|
|
Description string `json:"description"`
|
|
|
|
|
|
GroupID int64 `json:"groupId"`
|
|
|
|
|
|
GroupName string `json:"groupName"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
UpdatedAt string `json:"updatedAt"`
|
|
|
|
|
|
Stats ProjectStats `json:"stats"`
|
|
|
|
|
|
Languages []LanguageStat `json:"languages"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type ProjectInput struct {
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Path string `json:"path"`
|
|
|
|
|
|
Description string `json:"description"`
|
|
|
|
|
|
GroupID int64 `json:"groupId"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type ProjectGroup struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
UpdatedAt string `json:"updatedAt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type ProjectStats struct {
|
|
|
|
|
|
TotalLines int64 `json:"totalLines"`
|
|
|
|
|
|
CodeLines int64 `json:"codeLines"`
|
|
|
|
|
|
CommentLines int64 `json:"commentLines"`
|
|
|
|
|
|
BlankLines int64 `json:"blankLines"`
|
|
|
|
|
|
FileCount int64 `json:"fileCount"`
|
|
|
|
|
|
CommitCount int64 `json:"commitCount"`
|
|
|
|
|
|
AddedLines int64 `json:"addedLines"`
|
|
|
|
|
|
DeletedLines int64 `json:"deletedLines"`
|
|
|
|
|
|
ContributorCount int64 `json:"contributorCount"`
|
|
|
|
|
|
LastAnalyzed string `json:"lastAnalyzed"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type LanguageStat struct {
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Files int64 `json:"files"`
|
|
|
|
|
|
Code int64 `json:"code"`
|
|
|
|
|
|
Comments int64 `json:"comments"`
|
|
|
|
|
|
Blanks int64 `json:"blanks"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type FileEntry struct {
|
|
|
|
|
|
Path string `json:"path"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Extension string `json:"extension"`
|
|
|
|
|
|
Size int64 `json:"size"`
|
|
|
|
|
|
IsDir bool `json:"isDir"`
|
|
|
|
|
|
Parent string `json:"parent"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type StructureStats struct {
|
|
|
|
|
|
Files []FileEntry `json:"files"`
|
|
|
|
|
|
TotalFiles int64 `json:"totalFiles"`
|
|
|
|
|
|
TotalDirs int64 `json:"totalDirs"`
|
|
|
|
|
|
TotalSize int64 `json:"totalSize"`
|
|
|
|
|
|
LargeFiles []FileEntry `json:"largeFiles"`
|
|
|
|
|
|
Folders []FolderStat `json:"folders"`
|
|
|
|
|
|
Extensions []ExtensionStat `json:"extensions"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type FolderStat struct {
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Files int64 `json:"files"`
|
|
|
|
|
|
Size int64 `json:"size"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type ExtensionStat struct {
|
|
|
|
|
|
Extension string `json:"extension"`
|
|
|
|
|
|
Files int64 `json:"files"`
|
|
|
|
|
|
Size int64 `json:"size"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type GitCommit struct {
|
|
|
|
|
|
Hash string `json:"hash"`
|
|
|
|
|
|
Author string `json:"author"`
|
|
|
|
|
|
Email string `json:"email"`
|
|
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
|
Date string `json:"date"`
|
|
|
|
|
|
Added int64 `json:"added"`
|
|
|
|
|
|
Deleted int64 `json:"deleted"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type GitRef struct {
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Hash string `json:"hash"`
|
|
|
|
|
|
Kind string `json:"kind"`
|
|
|
|
|
|
Current bool `json:"current"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type Contributor struct {
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Email string `json:"email"`
|
|
|
|
|
|
Commits int64 `json:"commits"`
|
|
|
|
|
|
Added int64 `json:"added"`
|
|
|
|
|
|
Deleted int64 `json:"deleted"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type HeatDay struct {
|
2026-08-14 07:51:46 +08:00
|
|
|
|
Date string `json:"date"`
|
|
|
|
|
|
Count int64 `json:"count"`
|
|
|
|
|
|
Added int64 `json:"added"`
|
|
|
|
|
|
Deleted int64 `json:"deleted"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GitFileHotspot 记录变更最频繁的文件,用于识别高风险热点。
|
|
|
|
|
|
type GitFileHotspot struct {
|
|
|
|
|
|
Path string `json:"path"`
|
|
|
|
|
|
Changes int64 `json:"changes"`
|
|
|
|
|
|
Added int64 `json:"added"`
|
|
|
|
|
|
Deleted int64 `json:"deleted"`
|
2026-08-11 19:07:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
type GitStats struct {
|
2026-08-14 07:51:46 +08:00
|
|
|
|
Available bool `json:"available"`
|
|
|
|
|
|
Error string `json:"error,omitempty"`
|
|
|
|
|
|
CurrentBranch string `json:"currentBranch"`
|
|
|
|
|
|
WorkspaceBranch string `json:"workspaceBranch"`
|
|
|
|
|
|
ViewRef string `json:"viewRef"`
|
|
|
|
|
|
CommitCount int64 `json:"commitCount"`
|
|
|
|
|
|
Added int64 `json:"added"`
|
|
|
|
|
|
Deleted int64 `json:"deleted"`
|
|
|
|
|
|
ContributorCount int64 `json:"contributorCount"`
|
|
|
|
|
|
Commits []GitCommit `json:"commits"`
|
|
|
|
|
|
Refs []GitRef `json:"refs"`
|
|
|
|
|
|
Contributors []Contributor `json:"contributors"`
|
|
|
|
|
|
Heatmap []HeatDay `json:"heatmap"`
|
|
|
|
|
|
Hotspots []GitFileHotspot `json:"hotspots"`
|
2026-08-11 19:07:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
type GitDiagnostics struct {
|
|
|
|
|
|
Available bool `json:"available"`
|
|
|
|
|
|
ErrorCode string `json:"errorCode,omitempty"`
|
|
|
|
|
|
Detail string `json:"detail,omitempty"`
|
|
|
|
|
|
IsWSL bool `json:"isWsl"`
|
|
|
|
|
|
Distro string `json:"distro,omitempty"`
|
|
|
|
|
|
LinuxPath string `json:"linuxPath,omitempty"`
|
|
|
|
|
|
WorkspaceBranch string `json:"workspaceBranch,omitempty"`
|
|
|
|
|
|
ViewRef string `json:"viewRef,omitempty"`
|
|
|
|
|
|
RefCount int `json:"refCount"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type ProjectInsights struct {
|
|
|
|
|
|
ProjectID int64 `json:"projectId"`
|
|
|
|
|
|
HealthScore int `json:"healthScore"`
|
|
|
|
|
|
GeneratedAt string `json:"generatedAt"`
|
|
|
|
|
|
Summary InsightSummary `json:"summary"`
|
|
|
|
|
|
Issues []InsightIssue `json:"issues"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type InsightSummary struct {
|
|
|
|
|
|
High int `json:"high"`
|
|
|
|
|
|
Medium int `json:"medium"`
|
|
|
|
|
|
Low int `json:"low"`
|
|
|
|
|
|
TodoCount int `json:"todoCount"`
|
|
|
|
|
|
LongFiles int `json:"longFiles"`
|
|
|
|
|
|
LargeFiles int `json:"largeFiles"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type InsightIssue struct {
|
|
|
|
|
|
Severity string `json:"severity"`
|
|
|
|
|
|
Type string `json:"type"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Detail string `json:"detail"`
|
|
|
|
|
|
Path string `json:"path,omitempty"`
|
|
|
|
|
|
Line int `json:"line,omitempty"`
|
|
|
|
|
|
Suggestion string `json:"suggestion"`
|
|
|
|
|
|
Evidence string `json:"evidence,omitempty"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type GitFileChange struct {
|
|
|
|
|
|
Path string `json:"path"`
|
|
|
|
|
|
Status string `json:"status"`
|
|
|
|
|
|
Added int64 `json:"added"`
|
|
|
|
|
|
Deleted int64 `json:"deleted"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type GitCommitDetail struct {
|
|
|
|
|
|
GitCommit
|
|
|
|
|
|
Files []GitFileChange `json:"files"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type CheckoutResult struct {
|
|
|
|
|
|
Branch string `json:"branch"`
|
|
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type ExclusionRule struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Pattern string `json:"pattern"`
|
|
|
|
|
|
Category string `json:"category"`
|
|
|
|
|
|
Builtin bool `json:"builtin"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type LogEntry struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Level string `json:"level"`
|
|
|
|
|
|
Category string `json:"category"`
|
|
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
|
Detail string `json:"detail"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
}
|
2026-08-14 07:51:46 +08:00
|
|
|
|
type Todo struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
UUID string `json:"uuid"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
ProjectID int64 `json:"projectId"`
|
|
|
|
|
|
ProjectName string `json:"projectName"`
|
|
|
|
|
|
DueAt string `json:"dueAt"`
|
|
|
|
|
|
Priority string `json:"priority"` // low | medium | high
|
|
|
|
|
|
Status string `json:"status"` // open | doing | done
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
UpdatedAt string `json:"updatedAt"`
|
|
|
|
|
|
History string `json:"history"` // JSON 数组:[{"status","at"}],记录每次进入某状态的时间
|
|
|
|
|
|
TeamID int64 `json:"teamId"` // >0 表示已共享给该团队
|
|
|
|
|
|
}
|
|
|
|
|
|
type Ticket struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
UUID string `json:"uuid"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Description string `json:"description"`
|
|
|
|
|
|
Type string `json:"type"` // feature | bug | task | improvement
|
|
|
|
|
|
ProjectID int64 `json:"projectId"`
|
|
|
|
|
|
ProjectName string `json:"projectName"`
|
|
|
|
|
|
StartAt string `json:"startAt"`
|
|
|
|
|
|
DueAt string `json:"dueAt"`
|
|
|
|
|
|
Status string `json:"status"` // open | in_progress | resolved | closed
|
|
|
|
|
|
Priority string `json:"priority"` // low | medium | high
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
UpdatedAt string `json:"updatedAt"`
|
|
|
|
|
|
History string `json:"history"` // JSON 数组:[{"status","at"}],记录每次进入某状态的时间
|
|
|
|
|
|
TeamID int64 `json:"teamId"` // >0 表示已共享给该团队
|
|
|
|
|
|
}
|
|
|
|
|
|
type Note struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
UUID string `json:"uuid"`
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
UpdatedAt string `json:"updatedAt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
type Message struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Kind string `json:"kind"` // todo_due | ticket_due | analysis | sync | system
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Body string `json:"body"`
|
|
|
|
|
|
SourceType string `json:"sourceType"` // todo | ticket | project | ""
|
|
|
|
|
|
SourceID int64 `json:"sourceId"`
|
|
|
|
|
|
Read bool `json:"read"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
}
|
2026-08-11 19:07:05 +08:00
|
|
|
|
type AppSettings struct {
|
|
|
|
|
|
Theme string `json:"theme"`
|
|
|
|
|
|
Locale string `json:"locale"`
|
|
|
|
|
|
GitScope string `json:"gitScope"`
|
|
|
|
|
|
DatabasePath string `json:"databasePath"`
|
|
|
|
|
|
AutoRefresh bool `json:"autoRefresh"`
|
|
|
|
|
|
GlassOpacity int `json:"glassOpacity"`
|
|
|
|
|
|
LoadingStyle string `json:"loadingStyle"`
|
2026-08-14 07:51:46 +08:00
|
|
|
|
// 托盘与定时更新(Phase 2)
|
|
|
|
|
|
MinimizeToTray bool `json:"minimizeToTray"`
|
|
|
|
|
|
AutoUpdateEnabled bool `json:"autoUpdateEnabled"`
|
|
|
|
|
|
AutoUpdateMode string `json:"autoUpdateMode"` // daily | everyNDays | everyNHours
|
|
|
|
|
|
AutoUpdateInterval int `json:"autoUpdateInterval"` // everyNDays/everyNHours 的 N
|
|
|
|
|
|
AutoUpdateTime string `json:"autoUpdateTime"` // daily/everyNDays 的触发时刻 HH:MM
|
|
|
|
|
|
// AI 分析(Phase 5)
|
|
|
|
|
|
AIProvider string `json:"aiProvider"` // spark | deepseek
|
|
|
|
|
|
SparkKey string `json:"sparkKey"`
|
|
|
|
|
|
DeepSeekKey string `json:"deepSeekKey"`
|
|
|
|
|
|
// SyncAPIKeys 开启后 API Key 会加密同步到 MySQL(密钥由登录密码派生,服务器不可解密)。
|
|
|
|
|
|
SyncAPIKeys bool `json:"syncApiKeys"`
|
|
|
|
|
|
// 用户头像:AvatarMode 为 ""(未设置) | base64 | url | path,AvatarValue 依模式存 dataURL / 图片 URL / 本地文件路径。
|
|
|
|
|
|
AvatarMode string `json:"avatarMode"`
|
|
|
|
|
|
AvatarValue string `json:"avatarValue"`
|
|
|
|
|
|
// 内容图片存储:待办/工单 Markdown 里粘贴或插入的图片如何保存。
|
|
|
|
|
|
// base64(内嵌 dataURL,随内容同步到云端)| path(写入数据目录,仅本机可见)。
|
|
|
|
|
|
ImageMode string `json:"imageMode"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// AvatarPick 是选择头像图片的结果:Value 为要保存的值,Preview 为可直接显示的图片源。
|
|
|
|
|
|
// SearchHit 全局搜索(Ctrl+K 命令面板)的一条结果。
|
|
|
|
|
|
type SearchHit struct {
|
|
|
|
|
|
Kind string `json:"kind"` // project | todo | ticket | conversation
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Sub string `json:"sub"` // 路径 / 状态 / 供应商等辅助信息
|
|
|
|
|
|
Extra string `json:"extra"` // 次级状态(如优先级)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type AvatarPick struct {
|
|
|
|
|
|
// Mode 是选图后实际采用的存储模式(base64 | url),auto 选图时由全局配置决定。
|
|
|
|
|
|
Mode string `json:"mode"`
|
|
|
|
|
|
Value string `json:"value"`
|
|
|
|
|
|
Preview string `json:"preview"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// AIConversation 是一次 AI 分析会话(可绑定项目)。
|
|
|
|
|
|
type AIConversation struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
ProjectID int64 `json:"projectId"`
|
|
|
|
|
|
ProjectName string `json:"projectName"`
|
|
|
|
|
|
Provider string `json:"provider"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
UpdatedAt string `json:"updatedAt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// AIMessage 是会话中的一条消息。
|
|
|
|
|
|
type AIMessage struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
ConversationID int64 `json:"conversationId"`
|
|
|
|
|
|
Role string `json:"role"` // user | assistant
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// AISummary 是分析完成后 AI 生成的模块介绍(按项目+模块各存最新一份)。
|
|
|
|
|
|
type AISummary struct {
|
|
|
|
|
|
ProjectID int64 `json:"projectId"`
|
|
|
|
|
|
Kind string `json:"kind"` // project | git
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
Provider string `json:"provider"`
|
|
|
|
|
|
GeneratedAt string `json:"generatedAt"`
|
2026-08-11 19:07:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
type Dashboard struct {
|
2026-08-14 07:51:46 +08:00
|
|
|
|
Projects int64 `json:"projects"`
|
|
|
|
|
|
TotalLines int64 `json:"totalLines"`
|
|
|
|
|
|
CodeLines int64 `json:"codeLines"`
|
|
|
|
|
|
CommentLines int64 `json:"commentLines"`
|
|
|
|
|
|
BlankLines int64 `json:"blankLines"`
|
|
|
|
|
|
FileCount int64 `json:"fileCount"`
|
|
|
|
|
|
Commits int64 `json:"commits"`
|
|
|
|
|
|
Contributors int64 `json:"contributors"`
|
|
|
|
|
|
Languages []LanguageStat `json:"languages"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// FileStorageConfig 是全局「文件存储方式」配置:由管理员(云端账号 id=1)设置,
|
|
|
|
|
|
// 云端存 sync_settings 的 file_storage 行(挂在 id=1 名下),随同步分发给所有账号。
|
|
|
|
|
|
// mode=local 时图片维持本地行为;mode=server 时内容图(imageMode=server)与
|
|
|
|
|
|
// 头像选图上传到 nl-pms-api 换取 http URL,远程/跨设备场景直接引用。
|
|
|
|
|
|
type FileStorageConfig struct {
|
|
|
|
|
|
Mode string `json:"mode"` // local | server
|
|
|
|
|
|
BaseURL string `json:"baseUrl"` // nl-pms-api 地址,如 http://192.168.1.10:8788
|
|
|
|
|
|
APIKey string `json:"apiKey"` // 上传密钥(Authorization: Bearer <apiKey>)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ServerFile 是 nl-pms-api 素材库中的一条文件记录(含上传者用户名与公开访问 URL)。
|
|
|
|
|
|
type ServerFile struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
URL string `json:"url"`
|
|
|
|
|
|
Mime string `json:"mime"`
|
|
|
|
|
|
Size int64 `json:"size"`
|
|
|
|
|
|
UserID int64 `json:"userId"`
|
|
|
|
|
|
TeamID int64 `json:"teamId"`
|
|
|
|
|
|
Kind string `json:"kind"` // avatar | content
|
|
|
|
|
|
Username string `json:"username"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ServerFileList 是素材库的一页结果。
|
|
|
|
|
|
type ServerFileList struct {
|
|
|
|
|
|
Total int64 `json:"total"`
|
|
|
|
|
|
Items []ServerFile `json:"items"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SyncConfig 是 MySQL 同步服务器的连接配置(保存在本地 SQLite)。
|
|
|
|
|
|
type SyncConfig struct {
|
|
|
|
|
|
Host string `json:"host"`
|
|
|
|
|
|
Port int `json:"port"`
|
|
|
|
|
|
User string `json:"user"`
|
|
|
|
|
|
Password string `json:"password"`
|
|
|
|
|
|
Database string `json:"database"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SyncStatus 描述当前登录与同步状态,供设置页展示。
|
|
|
|
|
|
type SyncStatus struct {
|
|
|
|
|
|
Configured bool `json:"configured"`
|
|
|
|
|
|
LoggedIn bool `json:"loggedIn"`
|
|
|
|
|
|
// UserID 为云端账号 id;id=1 视为管理员(可配置节日背景图等全局资源)。
|
|
|
|
|
|
UserID int64 `json:"userId"`
|
|
|
|
|
|
Username string `json:"username"`
|
|
|
|
|
|
LastSyncAt string `json:"lastSyncAt"`
|
|
|
|
|
|
Syncing bool `json:"syncing"`
|
|
|
|
|
|
Online bool `json:"online"`
|
|
|
|
|
|
LastError string `json:"lastError"`
|
|
|
|
|
|
Pushed int `json:"pushed"`
|
|
|
|
|
|
Pulled int `json:"pulled"`
|
|
|
|
|
|
// Pending 为本地待推送(dirty)行数,用于界面徽标。
|
|
|
|
|
|
Pending int `json:"pending"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// FestivalImage 是一个节日的背景配置:mode 决定日历格显示自定义照片还是动态插画。
|
|
|
|
|
|
// image 在 mode=art 时仍保留,方便管理员切回图片模式无需重新上传。
|
|
|
|
|
|
type FestivalImage struct {
|
|
|
|
|
|
Mode string `json:"mode"` // photo | art
|
|
|
|
|
|
Image string `json:"image"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// LogPage 是日志分页搜索的结果,counts 基于当前搜索条件(忽略级别筛选)。
|
|
|
|
|
|
type LogPage struct {
|
|
|
|
|
|
Items []LogEntry `json:"items"`
|
|
|
|
|
|
Total int64 `json:"total"`
|
|
|
|
|
|
Info int64 `json:"info"`
|
|
|
|
|
|
Warning int64 `json:"warning"`
|
|
|
|
|
|
Error int64 `json:"error"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// BatchSummary 是批量统计完成后的汇总事件载荷。
|
|
|
|
|
|
type BatchSummary struct {
|
|
|
|
|
|
Total int `json:"total"`
|
|
|
|
|
|
Completed int `json:"completed"`
|
|
|
|
|
|
Failed int `json:"failed"`
|
|
|
|
|
|
Cancelled int `json:"cancelled"`
|
|
|
|
|
|
Failures []string `json:"failures"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// FilePreview 是文件预览接口的返回载荷。
|
|
|
|
|
|
type FilePreview struct {
|
|
|
|
|
|
Path string `json:"path"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Extension string `json:"extension"`
|
|
|
|
|
|
Size int64 `json:"size"`
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
Lines int `json:"lines"`
|
|
|
|
|
|
Truncated bool `json:"truncated"`
|
|
|
|
|
|
Binary bool `json:"binary"`
|
2026-08-11 19:07:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TaskEvent 只传递稳定消息键,具体中文或英文由前端根据当前语言即时翻译。
|
|
|
|
|
|
type TaskEvent struct {
|
|
|
|
|
|
TaskID string `json:"taskId"`
|
|
|
|
|
|
ProjectID int64 `json:"projectId"`
|
|
|
|
|
|
Stage string `json:"stage"`
|
|
|
|
|
|
Progress int `json:"progress"`
|
|
|
|
|
|
MessageKey string `json:"messageKey"`
|
|
|
|
|
|
Params map[string]any `json:"params,omitempty"`
|
|
|
|
|
|
}
|
2026-08-14 07:51:46 +08:00
|
|
|
|
|
|
|
|
|
|
// CloneInput 是「从 Git 克隆并添加项目」的入参。
|
|
|
|
|
|
type CloneInput struct {
|
|
|
|
|
|
URL string `json:"url"`
|
|
|
|
|
|
ParentDir string `json:"parentDir"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
GroupID int64 `json:"groupId"`
|
|
|
|
|
|
Description string `json:"description"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// LaunchApp 是启动台保存的应用(含启停命令)。
|
|
|
|
|
|
type LaunchApp struct {
|
|
|
|
|
|
ID int64 `json:"id"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Kind string `json:"kind"`
|
|
|
|
|
|
Port int `json:"port"`
|
|
|
|
|
|
Dir string `json:"dir"`
|
|
|
|
|
|
StartCmd string `json:"startCmd"`
|
|
|
|
|
|
StopCmd string `json:"stopCmd"`
|
|
|
|
|
|
LastPID int64 `json:"lastPid"`
|
|
|
|
|
|
CreatedAt string `json:"createdAt"`
|
|
|
|
|
|
UpdatedAt string `json:"updatedAt"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// LaunchEntry 是启动台卡片条目:保存的应用与实时扫描到的监听进程合并后的视图。
|
|
|
|
|
|
type LaunchEntry struct {
|
|
|
|
|
|
ID int64 `json:"id"` // launch_apps id;0 表示未保存的扫描条目
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
Kind string `json:"kind"`
|
|
|
|
|
|
Port int `json:"port"`
|
|
|
|
|
|
Dir string `json:"dir"`
|
|
|
|
|
|
StartCmd string `json:"startCmd"`
|
|
|
|
|
|
StopCmd string `json:"stopCmd"`
|
|
|
|
|
|
Running bool `json:"running"`
|
|
|
|
|
|
PID int32 `json:"pid"`
|
|
|
|
|
|
Exe string `json:"exe"`
|
|
|
|
|
|
Cmdline string `json:"cmdline"`
|
|
|
|
|
|
Ports []int `json:"ports"`
|
|
|
|
|
|
CPU float64 `json:"cpu"` // 占全机 CPU 百分比
|
|
|
|
|
|
MemMB float64 `json:"memMB"` // 常驻内存
|
|
|
|
|
|
IOKBs float64 `json:"ioKBs"` // 磁盘读写吞吐
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// LaunchSuggest 是按项目种类推荐的启停命令。
|
|
|
|
|
|
type LaunchSuggest struct {
|
|
|
|
|
|
Start []string `json:"start"`
|
|
|
|
|
|
Stop []string `json:"stop"`
|
|
|
|
|
|
}
|