feat: complete mise env base code

This commit is contained in:
engigu
2026-02-13 17:27:55 +08:00
parent 800ac40200
commit c1c1d69e66
49 changed files with 2724 additions and 470 deletions
+101 -34
View File
@@ -24,8 +24,9 @@ func NewDependencyController() *DependencyController {
// List 获取依赖列表
func (c *DependencyController) List(ctx *gin.Context) {
depType := ctx.Query("type")
deps, err := c.service.List(depType)
language := ctx.Query("language")
langVersion := ctx.Query("lang_version")
deps, err := c.service.List(language, langVersion)
if err != nil {
utils.ServerError(ctx, "获取依赖列表失败")
return
@@ -40,10 +41,11 @@ func (c *DependencyController) List(ctx *gin.Context) {
// Create 添加依赖
func (c *DependencyController) Create(ctx *gin.Context) {
var req struct {
Name string `json:"name" binding:"required"`
Version string `json:"version"`
Type string `json:"type" binding:"required"`
Remark string `json:"remark"`
Name string `json:"name" binding:"required"`
Version string `json:"version"`
Language string `json:"language" binding:"required"`
LangVersion string `json:"lang_version"`
Remark string `json:"remark"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
@@ -51,16 +53,12 @@ func (c *DependencyController) Create(ctx *gin.Context) {
return
}
if req.Type != "py" && req.Type != "node" {
utils.BadRequest(ctx, "类型必须是 py 或 node")
return
}
dep := &models.Dependency{
Name: req.Name,
Version: req.Version,
Type: req.Type,
Remark: req.Remark,
Name: req.Name,
Version: req.Version,
Language: req.Language,
LangVersion: req.LangVersion,
Remark: req.Remark,
}
if err := c.service.Create(dep); err != nil {
@@ -87,13 +85,13 @@ func (c *DependencyController) Delete(ctx *gin.Context) {
utils.SuccessMsg(ctx, "删除成功")
}
// Install 安装依赖
func (c *DependencyController) Install(ctx *gin.Context) {
var req struct {
Name string `json:"name" binding:"required"`
Version string `json:"version"`
Type string `json:"type" binding:"required"`
Remark string `json:"remark"`
Name string `json:"name" binding:"required"`
Version string `json:"version"`
Language string `json:"language"`
LangVersion string `json:"lang_version"`
Remark string `json:"remark"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
@@ -101,11 +99,21 @@ func (c *DependencyController) Install(ctx *gin.Context) {
return
}
language := req.Language
if language == "" {
language = ctx.Query("language")
}
langVersion := req.LangVersion
if langVersion == "" {
langVersion = ctx.Query("lang_version")
}
dep := &models.Dependency{
Name: req.Name,
Version: req.Version,
Type: req.Type,
Remark: req.Remark,
Name: req.Name,
Version: req.Version,
Language: language,
LangVersion: langVersion,
Remark: req.Remark,
}
if err := c.service.Install(dep); err != nil {
@@ -119,6 +127,63 @@ func (c *DependencyController) Install(ctx *gin.Context) {
utils.SuccessMsg(ctx, "安装成功")
}
// GetInstallCommand 获取安装命令
func (c *DependencyController) GetInstallCommand(ctx *gin.Context) {
var req struct {
Name string `json:"name" binding:"required"`
Version string `json:"version"`
Language string `json:"language"`
LangVersion string `json:"lang_version"`
}
if err := ctx.ShouldBindJSON(&req); err != nil {
utils.BadRequest(ctx, "参数错误")
return
}
language := req.Language
if language == "" {
language = ctx.Query("language")
}
langVersion := req.LangVersion
if langVersion == "" {
langVersion = ctx.Query("lang_version")
}
dep := &models.Dependency{
Name: req.Name,
Version: req.Version,
Language: language,
LangVersion: langVersion,
}
cmd, err := c.service.GetInstallCommand(dep)
if err != nil {
utils.ServerError(ctx, err.Error())
return
}
utils.Success(ctx, gin.H{"command": cmd})
}
// GetReinstallAllCommand 获取全部重装命令
func (c *DependencyController) GetReinstallAllCommand(ctx *gin.Context) {
language := ctx.Query("language")
langVersion := ctx.Query("lang_version")
if language == "" {
utils.BadRequest(ctx, "缺少 language 参数")
return
}
cmd, err := c.service.GetReinstallAllCommand(language, langVersion)
if err != nil {
utils.ServerError(ctx, err.Error())
return
}
utils.Success(ctx, gin.H{"command": cmd})
}
// Uninstall 卸载依赖
func (c *DependencyController) Uninstall(ctx *gin.Context) {
id, err := strconv.Atoi(ctx.Param("id"))
@@ -128,7 +193,7 @@ func (c *DependencyController) Uninstall(ctx *gin.Context) {
}
// 获取依赖信息
deps, _ := c.service.List("")
deps, _ := c.service.List("", "")
var dep *models.Dependency
for _, d := range deps {
if d.ID == id {
@@ -162,7 +227,7 @@ func (c *DependencyController) Reinstall(ctx *gin.Context) {
}
// 获取依赖信息
deps, _ := c.service.List("")
deps, _ := c.service.List("", "")
var dep *models.Dependency
for _, d := range deps {
if d.ID == id {
@@ -186,13 +251,14 @@ func (c *DependencyController) Reinstall(ctx *gin.Context) {
// ReinstallAll 重新安装所有依赖
func (c *DependencyController) ReinstallAll(ctx *gin.Context) {
depType := ctx.Query("type")
if depType == "" {
utils.BadRequest(ctx, "缺少 type 参数")
language := ctx.Query("language")
langVersion := ctx.Query("lang_version")
if language == "" {
utils.BadRequest(ctx, "缺少 language 参数")
return
}
deps, err := c.service.List(depType)
deps, err := c.service.List(language, langVersion)
if err != nil {
utils.ServerError(ctx, "获取依赖列表失败")
return
@@ -215,13 +281,14 @@ func (c *DependencyController) ReinstallAll(ctx *gin.Context) {
// GetInstalled 获取已安装的包
func (c *DependencyController) GetInstalled(ctx *gin.Context) {
depType := ctx.Query("type")
if depType == "" {
utils.BadRequest(ctx, "缺少 type 参数")
language := ctx.Query("language")
langVersion := ctx.Query("lang_version")
if language == "" {
utils.BadRequest(ctx, "缺少 language 参数")
return
}
packages, err := c.service.GetInstalledPackages(depType)
packages, err := c.service.GetInstalledPackages(language, langVersion)
if err != nil {
utils.ServerError(ctx, "获取已安装包失败: "+err.Error())
return
+62
View File
@@ -0,0 +1,62 @@
package controllers
import (
"github.com/engigu/baihu-panel/internal/services"
"github.com/engigu/baihu-panel/internal/utils"
"github.com/gin-gonic/gin"
)
type MiseController struct {
service *services.MiseService
}
func NewMiseController(service *services.MiseService) *MiseController {
return &MiseController{
service: service,
}
}
// List 获取语言列表
func (c *MiseController) List(ctx *gin.Context) {
langs, err := c.service.List()
if err != nil {
utils.ServerError(ctx, "获取语言列表失败: "+err.Error())
return
}
utils.Success(ctx, langs)
}
// Sync 同步本地环境到数据库
func (c *MiseController) Sync(ctx *gin.Context) {
if err := c.service.Sync(); err != nil {
utils.ServerError(ctx, "同步本地环境失败: "+err.Error())
return
}
utils.Success(ctx, nil)
}
// Plugins 获取可用插件列表
func (c *MiseController) Plugins(ctx *gin.Context) {
plugins, err := c.service.Plugins()
if err != nil {
utils.ServerError(ctx, "获取插件列表失败: "+err.Error())
return
}
utils.Success(ctx, plugins)
}
// Versions 获取指定插件的可用版本列表
func (c *MiseController) Versions(ctx *gin.Context) {
plugin := ctx.Query("plugin")
if plugin == "" {
utils.BadRequest(ctx, "参数 plugin 不能为空")
return
}
versions, err := c.service.Versions(plugin)
if err != nil {
utils.ServerError(ctx, "获取版本列表失败: "+err.Error())
return
}
utils.Success(ctx, versions)
}
+6 -2
View File
@@ -61,6 +61,8 @@ func (tc *TaskController) CreateTask(c *gin.Context) {
WorkDir string `json:"work_dir"`
CleanConfig string `json:"clean_config"`
Envs string `json:"envs"`
Language string `json:"language"`
LangVersion string `json:"lang_version"`
AgentID *uint `json:"agent_id"`
}
@@ -86,7 +88,7 @@ func (tc *TaskController) CreateTask(c *gin.Context) {
workDir = resolveWorkDir(req.WorkDir)
}
task := tc.taskService.CreateTask(req.Name, req.Command, req.Schedule, req.Timeout, workDir, req.CleanConfig, req.Envs, req.Type, req.Config, req.AgentID)
task := tc.taskService.CreateTask(req.Name, req.Command, req.Schedule, req.Timeout, workDir, req.CleanConfig, req.Envs, req.Type, req.Config, req.AgentID, req.Language, req.LangVersion)
// 如果是 Agent 任务,通知 Agent;否则添加到本地 cron
if task.AgentID != nil && *task.AgentID > 0 {
@@ -156,6 +158,8 @@ func (tc *TaskController) UpdateTask(c *gin.Context) {
CleanConfig string `json:"clean_config"`
Envs string `json:"envs"`
Enabled bool `json:"enabled"`
Language string `json:"language"`
LangVersion string `json:"lang_version"`
AgentID *uint `json:"agent_id"`
}
@@ -177,7 +181,7 @@ func (tc *TaskController) UpdateTask(c *gin.Context) {
workDir = resolveWorkDir(req.WorkDir)
}
task := tc.taskService.UpdateTask(id, req.Name, req.Command, req.Schedule, req.Timeout, workDir, req.CleanConfig, req.Envs, req.Enabled, req.Type, req.Config, req.AgentID)
task := tc.taskService.UpdateTask(id, req.Name, req.Command, req.Schedule, req.Timeout, workDir, req.CleanConfig, req.Envs, req.Enabled, req.Type, req.Config, req.AgentID, req.Language, req.LangVersion)
if task == nil {
utils.NotFound(c, "任务不存在")
return