mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
修改项目为前后端分离方案
This commit is contained in:
@@ -6,20 +6,15 @@ import (
|
||||
"NetworkAuth/models"
|
||||
"NetworkAuth/services"
|
||||
"NetworkAuth/utils"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// InstallPageHandler 渲染安装页面
|
||||
func InstallPageHandler(c *gin.Context) {
|
||||
// 由于前端是通过模板渲染的,我们返回一个安装页面
|
||||
c.HTML(http.StatusOK, "install.html", gin.H{
|
||||
"title": "NetworkAuth 系统初始化",
|
||||
})
|
||||
}
|
||||
|
||||
// InstallSubmitHandler 处理安装表单提交
|
||||
func InstallSubmitHandler(c *gin.Context) {
|
||||
var req struct {
|
||||
@@ -58,7 +53,24 @@ func InstallSubmitHandler(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// 2. 重新初始化数据库连接并执行迁移
|
||||
// 2. 使用新配置尝试连接数据库
|
||||
var testDB *gorm.DB
|
||||
if req.DbType == "mysql" {
|
||||
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
|
||||
req.DbUser, req.DbPass, req.DbHost, req.DbPort, req.DbName)
|
||||
testDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 1, "msg": "连接 MySQL 数据库失败,请检查配置是否正确: " + err.Error()})
|
||||
return
|
||||
}
|
||||
sqlDB, err := testDB.DB()
|
||||
if err != nil || sqlDB.Ping() != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 1, "msg": "连接 MySQL 数据库失败,无法 Ping 通,请检查配置是否正确"})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 重新初始化全局数据库连接并执行迁移
|
||||
db, err := database.ReInit()
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 1, "msg": "连接数据库失败: " + err.Error()})
|
||||
@@ -66,7 +78,7 @@ func InstallSubmitHandler(c *gin.Context) {
|
||||
}
|
||||
|
||||
if db == nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 1, "msg": "获取数据库实例失败"})
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 1, "msg": "获取数据库实例失败,请检查数据库配置是否正确"})
|
||||
return
|
||||
}
|
||||
|
||||
@@ -91,17 +103,55 @@ func InstallSubmitHandler(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// 4. 更新设置表
|
||||
settingsToUpdate := map[string]string{
|
||||
"site_title": req.SiteTitle,
|
||||
"admin_username": strings.TrimSpace(req.AdminUsername),
|
||||
"admin_password": adminPasswordHash,
|
||||
"admin_password_salt": adminSalt,
|
||||
"is_installed": "1", // 标记为已安装
|
||||
}
|
||||
|
||||
// 开启事务进行更新
|
||||
tx := db.Begin()
|
||||
|
||||
// 更新或创建超级管理员账号
|
||||
var adminUser models.User
|
||||
if err := tx.Where("uuid = ?", "00000000-0000-0000-0000-000000000000").First(&adminUser).Error; err != nil {
|
||||
// 如果不存在则创建
|
||||
adminUser = models.User{
|
||||
UUID: "00000000-0000-0000-0000-000000000000",
|
||||
Username: strings.TrimSpace(req.AdminUsername),
|
||||
Password: adminPasswordHash,
|
||||
PasswordSalt: adminSalt,
|
||||
Nickname: "管理员",
|
||||
Avatar: "",
|
||||
Role: 0,
|
||||
Status: 1,
|
||||
Remark: "系统默认超级管理员",
|
||||
}
|
||||
// 使用 Select("Role") 确保 Role 字段(值为0时是零值)被显式插入,避免使用数据库默认值 1
|
||||
if err := tx.Select("UUID", "Username", "Password", "PasswordSalt", "Nickname", "Avatar", "Role", "Status", "Remark").Create(&adminUser).Error; err != nil {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 1, "msg": "创建管理员账号失败"})
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// 存在则更新
|
||||
adminUser.Username = strings.TrimSpace(req.AdminUsername)
|
||||
adminUser.Password = adminPasswordHash
|
||||
adminUser.PasswordSalt = adminSalt
|
||||
adminUser.Nickname = "管理员"
|
||||
adminUser.Role = 0
|
||||
if err := tx.Save(&adminUser).Error; err != nil {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"code": 1, "msg": "更新管理员账号失败"})
|
||||
return
|
||||
}
|
||||
// 确保角色被更新为0(GORM的Save可能忽略零值,所以额外Update一次)
|
||||
tx.Model(&adminUser).Update("Role", 0)
|
||||
}
|
||||
|
||||
// 如果是新创建的,再额外确保一次 Role 为 0,避免 default 标签导致的零值问题
|
||||
tx.Model(&adminUser).Update("Role", 0)
|
||||
|
||||
// 4. 更新设置表
|
||||
settingsToUpdate := map[string]string{
|
||||
"site_title": req.SiteTitle,
|
||||
"is_installed": "1", // 标记为已安装
|
||||
}
|
||||
|
||||
for name, value := range settingsToUpdate {
|
||||
// 先尝试更新,如果没有该记录,则忽略(因为 AutoMigrate 已经创建了默认记录)
|
||||
if err := tx.Model(&models.Settings{}).Where("name = ?", name).Update("value", value).Error; err != nil {
|
||||
@@ -113,10 +163,7 @@ func InstallSubmitHandler(c *gin.Context) {
|
||||
tx.Commit()
|
||||
|
||||
// 5. 更新内存缓存
|
||||
settingsService := services.GetSettingsService()
|
||||
for name, value := range settingsToUpdate {
|
||||
settingsService.Set(name, value)
|
||||
}
|
||||
services.ResetSettingsService()
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"code": 0, "msg": "安装成功"})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user