Initial commit: TaskPool React panel
- React frontend with route-level code splitting - Backend rebranded from Baihu to TaskPool - DB brand migration script and local compatibility
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/engigu/taskpool/internal/services"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type InstallController struct {
|
||||
installService *services.InstallService
|
||||
}
|
||||
|
||||
func NewInstallController() *InstallController {
|
||||
return &InstallController{
|
||||
installService: services.NewInstallService(),
|
||||
}
|
||||
}
|
||||
|
||||
// GetInstallStatus 获取安装状态
|
||||
// @Summary 获取安装状态
|
||||
// @Description 检查系统是否已完成安装
|
||||
// @Tags 安装
|
||||
// @Produce json
|
||||
// @Success 200 {object} services.InstallStatus
|
||||
// @Router /api/v1/install/status [get]
|
||||
func (c *InstallController) GetInstallStatus(ctx *gin.Context) {
|
||||
status, err := c.installService.CheckInstallStatus()
|
||||
if err != nil {
|
||||
ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
ctx.JSON(http.StatusOK, status)
|
||||
}
|
||||
|
||||
// Install 执行安装
|
||||
// @Summary 执行安装
|
||||
// @Description 初始化系统配置和管理员账号
|
||||
// @Tags 安装
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param request body services.InstallRequest true "安装请求"
|
||||
// @Success 200 {object} map[string]interface{}
|
||||
// @Failure 400 {object} map[string]string
|
||||
// @Failure 500 {object} map[string]string
|
||||
// @Router /api/v1/install [post]
|
||||
func (c *InstallController) Install(ctx *gin.Context) {
|
||||
// 先检查是否已安装
|
||||
status, err := c.installService.CheckInstallStatus()
|
||||
if err != nil {
|
||||
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "检查安装状态失败"})
|
||||
return
|
||||
}
|
||||
|
||||
if status.Installed {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "系统已安装,无法重复安装"})
|
||||
return
|
||||
}
|
||||
|
||||
var req services.InstallRequest
|
||||
if err := ctx.ShouldBindJSON(&req); err != nil {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "参数错误: " + err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
// 验证必填字段
|
||||
if req.AdminUsername == "" {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "管理员用户名不能为空"})
|
||||
return
|
||||
}
|
||||
if req.AdminPassword == "" {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "管理员密码不能为空"})
|
||||
return
|
||||
}
|
||||
if len(req.AdminPassword) < 6 {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "管理员密码至少6位"})
|
||||
return
|
||||
}
|
||||
|
||||
// MySQL 必填验证
|
||||
if req.DBType == "mysql" {
|
||||
if req.DBHost == "" {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "MySQL 主机不能为空"})
|
||||
return
|
||||
}
|
||||
if req.DBName == "" {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "MySQL 数据库名不能为空"})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Redis 启用时的验证
|
||||
if req.RedisEnabled {
|
||||
if req.RedisHost == "" {
|
||||
ctx.JSON(http.StatusBadRequest, gin.H{"error": "Redis 主机不能为空"})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 执行安装
|
||||
if err := c.installService.Install(&req); err != nil {
|
||||
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "安装失败: " + err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
ctx.JSON(http.StatusOK, gin.H{
|
||||
"message": "安装成功",
|
||||
"admin_username": req.AdminUsername,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user