feat: 新增语音转文字(ASR)功能
- 后端:新增 /api/audio/transcribe 接口,调用 Ollama whisper 进行语音识别 - 前端:新增 AudioTranscribePage.vue 页面,支持 MP3/WAV/M4A/OGG/FLAC 等格式 - 注册路由、工具卡片、智能助手欢迎语更新 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"eai_agentplatform/backend/internal/middleware"
|
||||
"eai_agentplatform/backend/internal/model"
|
||||
"eai_agentplatform/backend/internal/store"
|
||||
"eai_agentplatform/backend/internal/web"
|
||||
)
|
||||
|
||||
// issueCertificate 正式考试通过后颁发证书(幂等:同一 exam_record 只发一张)。
|
||||
func issueCertificate(u *model.User, rec model.ExamRecord) {
|
||||
if u == nil || !rec.Passed {
|
||||
return
|
||||
}
|
||||
var n int64
|
||||
store.DB.Model(&model.Certificate{}).Where("exam_record_id = ?", rec.ID).Count(&n)
|
||||
if n > 0 {
|
||||
return
|
||||
}
|
||||
certNo := fmt.Sprintf("BST-%06d", rec.ID)
|
||||
store.DB.Create(&model.Certificate{
|
||||
UserID: u.ID, ExamRecordID: rec.ID, UserName: u.FullName,
|
||||
ExamName: rec.ExamName, Score: rec.Score, TotalScore: rec.TotalScore, PassScore: rec.PassScore,
|
||||
CertNo: certNo, IssuedAt: time.Now(),
|
||||
})
|
||||
}
|
||||
|
||||
// MyCertificates GET /api/exam/certificates —— 我的证书列表
|
||||
func MyCertificates(c *gin.Context) {
|
||||
u := middleware.CurrentUser(c)
|
||||
if u == nil {
|
||||
web.Fail(c, web.NewAuthError("未登录"))
|
||||
return
|
||||
}
|
||||
var items []model.Certificate
|
||||
store.DB.Where("user_id = ?", u.ID).Order("issued_at DESC").Find(&items)
|
||||
web.OK(c, items)
|
||||
}
|
||||
|
||||
// CertificateDetail GET /api/exam/certificates/{id} —— 证书详情(本人或管理员可看,用于打印留存)
|
||||
func CertificateDetail(c *gin.Context) {
|
||||
u := middleware.CurrentUser(c)
|
||||
id, ok := parseID(c, "id")
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
var cert model.Certificate
|
||||
if err := store.DB.First(&cert, id).Error; err != nil {
|
||||
web.Fail(c, web.NewNotFoundError("证书不存在"))
|
||||
return
|
||||
}
|
||||
if u == nil || (u.Role != "admin" && cert.UserID != u.ID) {
|
||||
web.Fail(c, web.NewForbiddenError("无权查看他人证书"))
|
||||
return
|
||||
}
|
||||
web.OK(c, cert)
|
||||
}
|
||||
|
||||
// AdminCertificates GET /api/system/certificates —— 全员证书(管理员)
|
||||
func AdminCertificates(c *gin.Context) {
|
||||
var items []model.Certificate
|
||||
store.DB.Order("issued_at DESC").Find(&items)
|
||||
web.OK(c, items)
|
||||
}
|
||||
Reference in New Issue
Block a user