01ecdc8c23
- Go module with standard library + gorilla/sessions + mysql driver - Config: env-based configuration with .env file support - Database: MySQL connection with auto-migration for 6 tables - Seed data: 12 system tags with options, 8 system snippets - Auth: session cookie middleware - Handlers: auth, tags, snippets, builder, claude, dashboard, suggestions, settings - LLM: OpenAI-compatible client with 30s timeout - Docker: Dockerfile + docker-compose.yml - .env.example with all configuration options Co-Authored-By: Claude <noreply@anthropic.com>
162 lines
3.8 KiB
Go
162 lines
3.8 KiB
Go
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,
|
|
})
|
|
}
|