RichCMS在启动时,根据当前的安装状态决定是否去初始化数据库,它在main package的init 函数中被调用。

dbs.go位于/Users/samsong/mygo/src/github.com/zituocn/richcms/src/cms/conn目录中,以下是它的源代码及中文注释。

package conn

import (
	"fmt"
	"github.com/gkzy/gini"
	"github.com/zituocn/gow/lib/config"
	"github.com/zituocn/gow/lib/mysql"
	"github.com/zituocn/logx"
	"github.com/zituocn/richcms/common/constname"
	"github.com/zituocn/richcms/common/utils"
)

// InitDB 初始化数据库
func InitDB() {
	if IsFinishSetup() {
		initMySQL()
	} else {
		if IsDBSetup() {
			initMySQL()
			fmt.Println("================安装提示==================")
			fmt.Println("系统未安装完成")
			fmt.Println(fmt.Sprintf("请访问:%s/install 去完成", constname.GetAdminDirectory()))
			fmt.Println("========================================")
		} else {
			fmt.Println("================安装提示==================")
			fmt.Println("系统未安装")
			fmt.Println(fmt.Sprintf("请访问:%s/install 去完成", constname.GetAdminDirectory()))
			fmt.Println("========================================")
		}
	}

}

// IsDBSetup 是否设置过数据库
//
//	是否安装过系统,判断依据是 conf目录下,是否有db.conf,且配置正确。
func IsDBSetup() bool {
	_, ok, _ := GetDBConfig()
	return ok
}

// IsFinishSetup 是否安装已经完成
func IsFinishSetup() bool {
	return utils.PathExists(constname.LockFile)
}

// initMySQL 初始化mysql的具体方法
func initMySQL() {
	conf, _, err := GetDBConfig()
	if err != nil {
		logx.Errorf("read db config error : %v", err)
		return
	}
	runMode := config.DefaultString("run_mode", "dev")
	if runMode == "dev" {
		conf.Debug = true
	}

	err = mysql.InitDefaultDB(conf)
	if err != nil {
		logx.Panic(err)
	}

	logx.Infof("[DB] Database has been connected successfully: %s->%s", conf.Host, conf.Name)
}

// GetDBConfig 从配置文件中获取参数
func GetDBConfig() (conf *mysql.DBConfig, ok bool, err error) {
	ini := gini.New()
	err = ini.Load(constname.DBConfig)
	if err != nil {
		return
	}

	port, _ := ini.SectionInt(constname.DBSection, "port")
	if port == 0 {
		port = 3306
	}

	conf = &mysql.DBConfig{
		Name:     ini.SectionGet(constname.DBSection, "name"),
		User:     ini.SectionGet(constname.DBSection, "user"),
		Password: ini.SectionGet(constname.DBSection, "password"),
		Host:     ini.SectionGet(constname.DBSection, "host"),
		Port:     port,
	}

	if conf != nil && conf.Host != "" && conf.Name != "" && conf.User != "" && conf.Port > 0 {
		ok = true
	}

	return
}

代码解析:

  • IsFinishSetup() 函数检查conf目录中,是否有setup.lock,如果有此文件,说明安装已经结束。直接初始化mysql;
  • IsDBSetup() 函数检测是否已经安装成功数据库,即检查conf目录中,是否写入成功:db.conf。
  • GetDBConfig() 函数,读取db.conf中的database节内容。
  • initMySQL() 函数,去完成 mysql的连接初始化,供后续调用 。