Files
prompt-generator/internal/handlers/dashboard.go
T

162 lines
3.8 KiB
Go
Raw Normal View History

package handlers
import (
"net/http"
"strconv"
"prompt-generator/internal/db"
)
func GetDashboardProjects(w http.ResponseWriter, r *http.Request) {
rows, err := db.DB.Query(`
SELECT project_name, COUNT(*) as session_count, MIN(created_at) as first_time, MAX(created_at) as last_time
FROM prompts
GROUP BY project_name
ORDER BY last_time DESC
`)
if err != nil {
fail(w, 500, "查询项目列表失败")
return
}
defer rows.Close()
var projects []map[string]interface{}
for rows.Next() {
var name string
var count int
var firstTime, lastTime string
if err := rows.Scan(&name, &count, &firstTime, &lastTime); err != nil {
continue
}
if name == "" {
name = "(未命名项目)"
}
projects = append(projects, map[string]interface{}{
"project_name": name,
"session_count": count,
"first_time": firstTime,
"last_time": lastTime,
})
}
if projects == nil {
projects = []map[string]interface{}{}
}
success(w, projects)
}
func GetDashboardSessions(w http.ResponseWriter, r *http.Request) {
projectName := r.PathValue("name")
if projectName == "" {
fail(w, 400, "项目名称必填")
return
}
rows, err := db.DB.Query(`
SELECT session_id, COUNT(*) as prompt_count, MIN(created_at) as first_time, MAX(created_at) as last_time
FROM prompts
WHERE project_name=?
GROUP BY session_id
ORDER BY last_time DESC
LIMIT 100
`, projectName)
if err != nil {
fail(w, 500, "查询会话列表失败")
return
}
defer rows.Close()
var sessions []map[string]interface{}
for rows.Next() {
var sessionID string
var count int
var firstTime, lastTime string
if err := rows.Scan(&sessionID, &count, &firstTime, &lastTime); err != nil {
continue
}
sessions = append(sessions, map[string]interface{}{
"session_id": sessionID,
"prompt_count": count,
"first_time": firstTime,
"last_time": lastTime,
})
}
if sessions == nil {
sessions = []map[string]interface{}{}
}
success(w, sessions)
}
func GetDashboardPrompts(w http.ResponseWriter, r *http.Request) {
sessionID := r.URL.Query().Get("session_id")
keyword := r.URL.Query().Get("keyword")
pageStr := r.URL.Query().Get("page")
pageSizeStr := r.URL.Query().Get("page_size")
if sessionID == "" {
fail(w, 400, "session_id 参数必填")
return
}
page := 1
pageSize := 20
if p, err := strconv.Atoi(pageStr); err == nil && p > 0 {
page = p
}
if ps, err := strconv.Atoi(pageSizeStr); err == nil && ps > 0 && ps <= 100 {
pageSize = ps
}
offset := (page - 1) * pageSize
query := "SELECT id, session_id, project_name, prompt, created_at FROM prompts WHERE session_id=?"
countQuery := "SELECT COUNT(*) FROM prompts WHERE session_id=?"
args := []interface{}{sessionID}
countArgs := []interface{}{sessionID}
if keyword != "" {
query += " AND prompt LIKE ?"
countQuery += " AND prompt LIKE ?"
kw := "%" + keyword + "%"
args = append(args, kw)
countArgs = append(countArgs, kw)
}
var total int
db.DB.QueryRow(countQuery, countArgs...).Scan(&total)
query += " ORDER BY created_at DESC LIMIT ? OFFSET ?"
args = append(args, pageSize, offset)
rows, err := db.DB.Query(query, args...)
if err != nil {
fail(w, 500, "查询 Prompt 列表失败")
return
}
defer rows.Close()
var prompts []map[string]interface{}
for rows.Next() {
var id int64
var sid, pname, prompt, createdAt string
if err := rows.Scan(&id, &sid, &pname, &prompt, &createdAt); err != nil {
continue
}
prompts = append(prompts, map[string]interface{}{
"id": id,
"session_id": sid,
"project": pname,
"prompt": prompt,
"created_at": createdAt,
})
}
if prompts == nil {
prompts = []map[string]interface{}{}
}
success(w, map[string]interface{}{
"prompts": prompts,
"total": total,
"page": page,
"page_size": pageSize,
})
}