|
|
package controller |
|
|
|
|
|
import ( |
|
|
"time" |
|
|
|
|
|
"github.com/QuantumNous/new-api/common" |
|
|
"github.com/QuantumNous/new-api/constant" |
|
|
"github.com/QuantumNous/new-api/model" |
|
|
"github.com/QuantumNous/new-api/setting/operation_setting" |
|
|
"github.com/gin-gonic/gin" |
|
|
) |
|
|
|
|
|
type Setup struct { |
|
|
Status bool `json:"status"` |
|
|
RootInit bool `json:"root_init"` |
|
|
DatabaseType string `json:"database_type"` |
|
|
} |
|
|
|
|
|
type SetupRequest struct { |
|
|
Username string `json:"username"` |
|
|
Password string `json:"password"` |
|
|
ConfirmPassword string `json:"confirmPassword"` |
|
|
SelfUseModeEnabled bool `json:"SelfUseModeEnabled"` |
|
|
DemoSiteEnabled bool `json:"DemoSiteEnabled"` |
|
|
} |
|
|
|
|
|
func GetSetup(c *gin.Context) { |
|
|
setup := Setup{ |
|
|
Status: constant.Setup, |
|
|
} |
|
|
if constant.Setup { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": true, |
|
|
"data": setup, |
|
|
}) |
|
|
return |
|
|
} |
|
|
setup.RootInit = model.RootUserExists() |
|
|
if common.UsingMySQL { |
|
|
setup.DatabaseType = "mysql" |
|
|
} |
|
|
if common.UsingPostgreSQL { |
|
|
setup.DatabaseType = "postgres" |
|
|
} |
|
|
if common.UsingSQLite { |
|
|
setup.DatabaseType = "sqlite" |
|
|
} |
|
|
c.JSON(200, gin.H{ |
|
|
"success": true, |
|
|
"data": setup, |
|
|
}) |
|
|
} |
|
|
|
|
|
func PostSetup(c *gin.Context) { |
|
|
|
|
|
if constant.Setup { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "系统已经初始化完成", |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
|
|
|
rootExists := model.RootUserExists() |
|
|
|
|
|
var req SetupRequest |
|
|
err := c.ShouldBindJSON(&req) |
|
|
if err != nil { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "请求参数有误", |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
|
|
|
if !rootExists { |
|
|
|
|
|
if len(req.Username) > 12 { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "用户名长度不能超过12个字符", |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
if req.Password != req.ConfirmPassword { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "两次输入的密码不一致", |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
if len(req.Password) < 8 { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "密码长度至少为8个字符", |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
|
|
|
hashedPassword, err := common.Password2Hash(req.Password) |
|
|
if err != nil { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "系统错误: " + err.Error(), |
|
|
}) |
|
|
return |
|
|
} |
|
|
rootUser := model.User{ |
|
|
Username: req.Username, |
|
|
Password: hashedPassword, |
|
|
Role: common.RoleRootUser, |
|
|
Status: common.UserStatusEnabled, |
|
|
DisplayName: "Root User", |
|
|
AccessToken: nil, |
|
|
Quota: 100000000, |
|
|
} |
|
|
err = model.DB.Create(&rootUser).Error |
|
|
if err != nil { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "创建管理员账号失败: " + err.Error(), |
|
|
}) |
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
operation_setting.SelfUseModeEnabled = req.SelfUseModeEnabled |
|
|
operation_setting.DemoSiteEnabled = req.DemoSiteEnabled |
|
|
|
|
|
|
|
|
err = model.UpdateOption("SelfUseModeEnabled", boolToString(req.SelfUseModeEnabled)) |
|
|
if err != nil { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "保存自用模式设置失败: " + err.Error(), |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
err = model.UpdateOption("DemoSiteEnabled", boolToString(req.DemoSiteEnabled)) |
|
|
if err != nil { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "保存演示站点模式设置失败: " + err.Error(), |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
|
|
|
constant.Setup = true |
|
|
|
|
|
setup := model.Setup{ |
|
|
Version: common.Version, |
|
|
InitializedAt: time.Now().Unix(), |
|
|
} |
|
|
err = model.DB.Create(&setup).Error |
|
|
if err != nil { |
|
|
c.JSON(200, gin.H{ |
|
|
"success": false, |
|
|
"message": "系统初始化失败: " + err.Error(), |
|
|
}) |
|
|
return |
|
|
} |
|
|
|
|
|
c.JSON(200, gin.H{ |
|
|
"success": true, |
|
|
"message": "系统初始化成功", |
|
|
}) |
|
|
} |
|
|
|
|
|
func boolToString(b bool) string { |
|
|
if b { |
|
|
return "true" |
|
|
} |
|
|
return "false" |
|
|
} |
|
|
|