feat: initialize project skeleton with Go backend, database, and config
- 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>
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"prompt-generator/internal/db"
|
||||
)
|
||||
|
||||
func GetClaudeSessions(w http.ResponseWriter, r *http.Request) {
|
||||
projectName := r.URL.Query().Get("project_name")
|
||||
if projectName == "" {
|
||||
fail(w, 400, "project_name 参数必填")
|
||||
return
|
||||
}
|
||||
|
||||
rows, err := db.DB.Query(`
|
||||
SELECT session_id, COUNT(*) as prompt_count, MAX(created_at) as last_time
|
||||
FROM prompts
|
||||
WHERE project_name=?
|
||||
GROUP BY session_id
|
||||
ORDER BY last_time DESC
|
||||
LIMIT 50
|
||||
`, 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 lastTime string
|
||||
if err := rows.Scan(&sessionID, &count, &lastTime); err != nil {
|
||||
continue
|
||||
}
|
||||
sessions = append(sessions, map[string]interface{}{
|
||||
"session_id": sessionID,
|
||||
"prompt_count": count,
|
||||
"last_time": lastTime,
|
||||
})
|
||||
}
|
||||
if sessions == nil {
|
||||
sessions = []map[string]interface{}{}
|
||||
}
|
||||
success(w, sessions)
|
||||
}
|
||||
|
||||
func GetClaudePrompts(w http.ResponseWriter, r *http.Request) {
|
||||
sessionID := r.PathValue("session_id")
|
||||
if sessionID == "" {
|
||||
fail(w, 400, "session_id 必填")
|
||||
return
|
||||
}
|
||||
|
||||
rows, err := db.DB.Query(`
|
||||
SELECT id, session_id, project_name, prompt, created_at
|
||||
FROM prompts
|
||||
WHERE session_id=?
|
||||
ORDER BY created_at DESC
|
||||
LIMIT 10
|
||||
`, sessionID)
|
||||
if err != nil {
|
||||
fail(w, 500, "查询失败")
|
||||
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, prompts)
|
||||
}
|
||||
Reference in New Issue
Block a user