SUMMARY • Migrated Token, Task, Midjourney, Channel, Redemption tables to true server-side pagination. • Added total / page / page_size metadata in API responses; switched all affected React tables to consume new structure. • Implemented counting helpers: – model/token.go CountUserTokens – model/task.go TaskCountAllTasks / TaskCountAllUserTask – model/midjourney.go CountAllTasks / CountAllUserTask – model/channel.go CountAllChannels / CountAllTags • Refactored controllers (token, task, midjourney, channel) for 1-based paging & aggregated returns. • Redesigned `ChannelsTable.js`: – `loadChannels`, `syncPageData`, `enrichChannels` for tag-mode grouping without recursion. – Fixed runtime white-screen (maximum call-stack) by removing child duplication. – Pagination, search, tag-mode, idSort all hot-reload correctly. • Removed unused `log` import in controller/midjourney.go. BREAKING CHANGES Front-end consumers must now expect data.items / total / page / page_size from list endpoints (`/api/channel`, `/api/task`, `/api/mj`, `/api/token`, etc.).
206 lines
5.5 KiB
Go
206 lines
5.5 KiB
Go
package model
|
|
|
|
type Midjourney struct {
|
|
Id int `json:"id"`
|
|
Code int `json:"code"`
|
|
UserId int `json:"user_id" gorm:"index"`
|
|
Action string `json:"action" gorm:"type:varchar(40);index"`
|
|
MjId string `json:"mj_id" gorm:"index"`
|
|
Prompt string `json:"prompt"`
|
|
PromptEn string `json:"prompt_en"`
|
|
Description string `json:"description"`
|
|
State string `json:"state"`
|
|
SubmitTime int64 `json:"submit_time" gorm:"index"`
|
|
StartTime int64 `json:"start_time" gorm:"index"`
|
|
FinishTime int64 `json:"finish_time" gorm:"index"`
|
|
ImageUrl string `json:"image_url"`
|
|
Status string `json:"status" gorm:"type:varchar(20);index"`
|
|
Progress string `json:"progress" gorm:"type:varchar(30);index"`
|
|
FailReason string `json:"fail_reason"`
|
|
ChannelId int `json:"channel_id"`
|
|
Quota int `json:"quota"`
|
|
Buttons string `json:"buttons"`
|
|
Properties string `json:"properties"`
|
|
}
|
|
|
|
// TaskQueryParams 用于包含所有搜索条件的结构体,可以根据需求添加更多字段
|
|
type TaskQueryParams struct {
|
|
ChannelID string
|
|
MjID string
|
|
StartTimestamp string
|
|
EndTimestamp string
|
|
}
|
|
|
|
func GetAllUserTask(userId int, startIdx int, num int, queryParams TaskQueryParams) []*Midjourney {
|
|
var tasks []*Midjourney
|
|
var err error
|
|
|
|
// 初始化查询构建器
|
|
query := DB.Where("user_id = ?", userId)
|
|
|
|
if queryParams.MjID != "" {
|
|
query = query.Where("mj_id = ?", queryParams.MjID)
|
|
}
|
|
if queryParams.StartTimestamp != "" {
|
|
// 假设您已将前端传来的时间戳转换为数据库所需的时间格式,并处理了时间戳的验证和解析
|
|
query = query.Where("submit_time >= ?", queryParams.StartTimestamp)
|
|
}
|
|
if queryParams.EndTimestamp != "" {
|
|
query = query.Where("submit_time <= ?", queryParams.EndTimestamp)
|
|
}
|
|
|
|
// 获取数据
|
|
err = query.Order("id desc").Limit(num).Offset(startIdx).Find(&tasks).Error
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
return tasks
|
|
}
|
|
|
|
func GetAllTasks(startIdx int, num int, queryParams TaskQueryParams) []*Midjourney {
|
|
var tasks []*Midjourney
|
|
var err error
|
|
|
|
// 初始化查询构建器
|
|
query := DB
|
|
|
|
// 添加过滤条件
|
|
if queryParams.ChannelID != "" {
|
|
query = query.Where("channel_id = ?", queryParams.ChannelID)
|
|
}
|
|
if queryParams.MjID != "" {
|
|
query = query.Where("mj_id = ?", queryParams.MjID)
|
|
}
|
|
if queryParams.StartTimestamp != "" {
|
|
query = query.Where("submit_time >= ?", queryParams.StartTimestamp)
|
|
}
|
|
if queryParams.EndTimestamp != "" {
|
|
query = query.Where("submit_time <= ?", queryParams.EndTimestamp)
|
|
}
|
|
|
|
// 获取数据
|
|
err = query.Order("id desc").Limit(num).Offset(startIdx).Find(&tasks).Error
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
return tasks
|
|
}
|
|
|
|
func GetAllUnFinishTasks() []*Midjourney {
|
|
var tasks []*Midjourney
|
|
var err error
|
|
// get all tasks progress is not 100%
|
|
err = DB.Where("progress != ?", "100%").Find(&tasks).Error
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return tasks
|
|
}
|
|
|
|
func GetByOnlyMJId(mjId string) *Midjourney {
|
|
var mj *Midjourney
|
|
var err error
|
|
err = DB.Where("mj_id = ?", mjId).First(&mj).Error
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return mj
|
|
}
|
|
|
|
func GetByMJId(userId int, mjId string) *Midjourney {
|
|
var mj *Midjourney
|
|
var err error
|
|
err = DB.Where("user_id = ? and mj_id = ?", userId, mjId).First(&mj).Error
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return mj
|
|
}
|
|
|
|
func GetByMJIds(userId int, mjIds []string) []*Midjourney {
|
|
var mj []*Midjourney
|
|
var err error
|
|
err = DB.Where("user_id = ? and mj_id in (?)", userId, mjIds).Find(&mj).Error
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return mj
|
|
}
|
|
|
|
func GetMjByuId(id int) *Midjourney {
|
|
var mj *Midjourney
|
|
var err error
|
|
err = DB.Where("id = ?", id).First(&mj).Error
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return mj
|
|
}
|
|
|
|
func UpdateProgress(id int, progress string) error {
|
|
return DB.Model(&Midjourney{}).Where("id = ?", id).Update("progress", progress).Error
|
|
}
|
|
|
|
func (midjourney *Midjourney) Insert() error {
|
|
var err error
|
|
err = DB.Create(midjourney).Error
|
|
return err
|
|
}
|
|
|
|
func (midjourney *Midjourney) Update() error {
|
|
var err error
|
|
err = DB.Save(midjourney).Error
|
|
return err
|
|
}
|
|
|
|
func MjBulkUpdate(mjIds []string, params map[string]any) error {
|
|
return DB.Model(&Midjourney{}).
|
|
Where("mj_id in (?)", mjIds).
|
|
Updates(params).Error
|
|
}
|
|
|
|
func MjBulkUpdateByTaskIds(taskIDs []int, params map[string]any) error {
|
|
return DB.Model(&Midjourney{}).
|
|
Where("id in (?)", taskIDs).
|
|
Updates(params).Error
|
|
}
|
|
|
|
// CountAllTasks returns total midjourney tasks for admin query
|
|
func CountAllTasks(queryParams TaskQueryParams) int64 {
|
|
var total int64
|
|
query := DB.Model(&Midjourney{})
|
|
if queryParams.ChannelID != "" {
|
|
query = query.Where("channel_id = ?", queryParams.ChannelID)
|
|
}
|
|
if queryParams.MjID != "" {
|
|
query = query.Where("mj_id = ?", queryParams.MjID)
|
|
}
|
|
if queryParams.StartTimestamp != "" {
|
|
query = query.Where("submit_time >= ?", queryParams.StartTimestamp)
|
|
}
|
|
if queryParams.EndTimestamp != "" {
|
|
query = query.Where("submit_time <= ?", queryParams.EndTimestamp)
|
|
}
|
|
_ = query.Count(&total).Error
|
|
return total
|
|
}
|
|
|
|
// CountAllUserTask returns total midjourney tasks for user
|
|
func CountAllUserTask(userId int, queryParams TaskQueryParams) int64 {
|
|
var total int64
|
|
query := DB.Model(&Midjourney{}).Where("user_id = ?", userId)
|
|
if queryParams.MjID != "" {
|
|
query = query.Where("mj_id = ?", queryParams.MjID)
|
|
}
|
|
if queryParams.StartTimestamp != "" {
|
|
query = query.Where("submit_time >= ?", queryParams.StartTimestamp)
|
|
}
|
|
if queryParams.EndTimestamp != "" {
|
|
query = query.Where("submit_time <= ?", queryParams.EndTimestamp)
|
|
}
|
|
_ = query.Count(&total).Error
|
|
return total
|
|
}
|