init: 数字员工平台初始代码

包含前端(Vue3 + VueFlow 画布)、后端(Go)、文档体系。
- 工作台画布:节点拖放、连线模式、右键菜单、AI 助手
- 后端:连接器 API、专员种子数据
- 导航:左侧导航、工坊、市场、控制台
This commit is contained in:
eaiadmin
2026-08-18 20:19:58 +08:00
commit 4e8817d768
239 changed files with 48631 additions and 0 deletions
@@ -0,0 +1,75 @@
package api
import (
"github.com/gin-gonic/gin"
"eaisalestrain/backend/internal/auth"
"eaisalestrain/backend/internal/middleware"
"eaisalestrain/backend/internal/model"
"eaisalestrain/backend/internal/store"
"eaisalestrain/backend/internal/web"
)
type loginRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
// Login 登录 → JWT
func Login(c *gin.Context) {
var req loginRequest
if err := c.ShouldBindJSON(&req); err != nil {
web.Fail(c, web.NewBadRequest("请求参数错误"))
return
}
var user model.User
if err := store.DB.Where("username = ?", req.Username).First(&user).Error; err != nil {
web.Fail(c, web.NewAuthError("用户名或密码错误"))
return
}
if user.Status != "active" {
web.Fail(c, web.NewAuthError("账号已禁用"))
return
}
if !auth.VerifyPassword(req.Password, user.PasswordHash) {
web.Fail(c, web.NewAuthError("用户名或密码错误"))
return
}
token, err := auth.CreateToken(user.Username, user.Role, Cfg.JWTSecret, Cfg.JWTExpireMin)
if err != nil {
web.Fail(c, web.NewBadRequest("令牌签发失败"))
return
}
web.OK(c, gin.H{
"token": token,
"expires_in": Cfg.JWTExpireMin * 60,
"user": gin.H{
"id": user.ID,
"username": user.Username,
"full_name": user.FullName,
"role": user.Role,
"ai_points": user.AiPoints,
},
})
}
// Me 当前用户信息
func Me(c *gin.Context) {
u := middleware.CurrentUser(c)
if u == nil {
web.Fail(c, web.NewAuthError("未登录"))
return
}
web.OK(c, gin.H{
"id": u.ID,
"username": u.Username,
"full_name": u.FullName,
"role": u.Role,
"status": u.Status,
"ai_points": u.AiPoints,
"learning_points": u.LearningPoints,
})
}