gocron/internal/routers/install/install.go

175 lines
4.4 KiB
Go
Raw Permalink Normal View History

2017-04-01 09:04:40 +00:00
package install
import (
2018-07-11 09:50:20 +00:00
"errors"
2017-09-16 09:58:33 +00:00
"fmt"
2018-01-30 11:26:04 +00:00
"strconv"
2019-06-02 04:57:56 +00:00
macaron "gopkg.in/macaron.v1"
2018-09-30 15:10:45 +00:00
"github.com/go-macaron/binding"
2018-07-11 09:50:20 +00:00
"github.com/go-sql-driver/mysql"
"github.com/lib/pq"
2018-03-25 05:12:12 +00:00
"github.com/ouqiang/gocron/internal/models"
"github.com/ouqiang/gocron/internal/modules/app"
"github.com/ouqiang/gocron/internal/modules/setting"
"github.com/ouqiang/gocron/internal/modules/utils"
"github.com/ouqiang/gocron/internal/service"
2017-04-01 09:04:40 +00:00
)
// 系统安装
type InstallForm struct {
2018-07-06 07:37:41 +00:00
DbType string `binding:"In(mysql,postgres)"`
2017-09-16 09:58:33 +00:00
DbHost string `binding:"Required;MaxSize(50)"`
DbPort int `binding:"Required;Range(1,65535)"`
DbUsername string `binding:"Required;MaxSize(50)"`
DbPassword string `binding:"Required;MaxSize(30)"`
DbName string `binding:"Required;MaxSize(50)"`
DbTablePrefix string `binding:"MaxSize(20)"`
AdminUsername string `binding:"Required;MinSize(3)"`
AdminPassword string `binding:"Required;MinSize(6)"`
ConfirmAdminPassword string `binding:"Required;MinSize(6)"`
AdminEmail string `binding:"Required;Email;MaxSize(50)"`
2017-04-01 09:04:40 +00:00
}
2017-05-05 08:31:24 +00:00
func (f InstallForm) Error(ctx *macaron.Context, errs binding.Errors) {
2017-09-16 09:58:33 +00:00
if len(errs) == 0 {
return
}
json := utils.JsonResponse{}
content := json.CommonFailure("表单验证失败, 请检测输入")
2018-05-02 12:41:41 +00:00
ctx.Write([]byte(content))
2017-04-01 09:04:40 +00:00
}
2017-04-07 01:13:36 +00:00
// 安装
func Store(ctx *macaron.Context, form InstallForm) string {
2017-09-16 09:58:33 +00:00
json := utils.JsonResponse{}
if app.Installed {
return json.CommonFailure("系统已安装!")
}
if form.AdminPassword != form.ConfirmAdminPassword {
return json.CommonFailure("两次输入密码不匹配")
}
err := testDbConnection(form)
if err != nil {
2018-07-11 09:50:20 +00:00
return json.CommonFailure(err.Error())
2017-09-16 09:58:33 +00:00
}
// 写入数据库配置
err = writeConfig(form)
if err != nil {
return json.CommonFailure("数据库配置写入文件失败", err)
}
appConfig, err := setting.Read(app.AppConfig)
if err != nil {
return json.CommonFailure("读取应用配置失败", err)
}
app.Setting = appConfig
models.Db = models.CreateDb()
// 创建数据库表
migration := new(models.Migration)
err = migration.Install(form.DbName)
if err != nil {
return json.CommonFailure(fmt.Sprintf("创建数据库表失败-%s", err.Error()), err)
}
// 创建管理员账号
err = createAdminUser(form)
if err != nil {
return json.CommonFailure("创建管理员账号失败", err)
}
// 创建安装锁
err = app.CreateInstallLock()
if err != nil {
return json.CommonFailure("创建文件安装锁失败", err)
}
// 更新版本号文件
app.UpdateVersionFile()
app.Installed = true
// 初始化定时任务
2018-01-27 10:08:46 +00:00
service.ServiceTask.Initialize()
2017-09-16 09:58:33 +00:00
return json.Success("安装成功", nil)
2017-04-01 09:04:40 +00:00
}
// 配置写入文件
2017-04-01 09:04:40 +00:00
func writeConfig(form InstallForm) error {
2017-09-16 09:58:33 +00:00
dbConfig := []string{
"db.engine", form.DbType,
"db.host", form.DbHost,
"db.port", strconv.Itoa(form.DbPort),
"db.user", form.DbUsername,
"db.password", form.DbPassword,
"db.database", form.DbName,
"db.prefix", form.DbTablePrefix,
"db.charset", "utf8",
2019-06-02 04:57:56 +00:00
"db.max.idle.conns", "5",
2017-09-16 09:58:33 +00:00
"db.max.open.conns", "100",
"allow_ips", "",
"app.name", "定时任务管理系统", // 应用名称
"api.key", "",
"api.secret", "",
"enable_tls", "false",
2018-02-04 03:28:48 +00:00
"concurrency.queue", "500",
2018-05-13 14:48:37 +00:00
"auth_secret", utils.RandAuthToken(),
2017-09-16 09:58:33 +00:00
"ca_file", "",
"cert_file", "",
"key_file", "",
}
return setting.Write(dbConfig, app.AppConfig)
2017-04-01 09:04:40 +00:00
}
// 创建管理员账号
func createAdminUser(form InstallForm) error {
2017-09-16 09:58:33 +00:00
user := new(models.User)
user.Name = form.AdminUsername
user.Password = form.AdminPassword
user.Email = form.AdminEmail
user.IsAdmin = 1
_, err := user.Create()
return err
2017-04-02 02:19:52 +00:00
}
// 测试数据库连接
func testDbConnection(form InstallForm) error {
2017-09-16 09:58:33 +00:00
var s setting.Setting
s.Db.Engine = form.DbType
s.Db.Host = form.DbHost
s.Db.Port = form.DbPort
s.Db.User = form.DbUsername
s.Db.Password = form.DbPassword
2018-07-06 07:37:41 +00:00
s.Db.Database = form.DbName
2017-09-16 09:58:33 +00:00
s.Db.Charset = "utf8"
db, err := models.CreateTmpDb(&s)
2019-06-02 06:27:04 +00:00
if err != nil {
return err
}
2017-09-16 09:58:33 +00:00
defer db.Close()
err = db.Ping()
2018-07-11 09:50:20 +00:00
if s.Db.Engine == "postgres" && err != nil {
2018-09-30 15:10:45 +00:00
pgError, ok := err.(*pq.Error)
if ok && pgError.Code == "3D000" {
err = errors.New("数据库不存在")
}
return err
2018-07-11 09:50:20 +00:00
}
if s.Db.Engine == "mysql" && err != nil {
2018-09-30 15:10:45 +00:00
mysqlError, ok := err.(*mysql.MySQLError)
if ok && mysqlError.Number == 1049 {
err = errors.New("数据库不存在")
2018-07-11 09:50:20 +00:00
}
2018-09-30 15:10:45 +00:00
return err
2018-07-11 09:50:20 +00:00
}
2017-09-16 09:58:33 +00:00
return err
}