24 changed files with 371 additions and 339 deletions
@ -0,0 +1,27 @@ |
|||||
|
package core |
||||
|
|
||||
|
const ( |
||||
|
//用户身份的cookie字段名
|
||||
|
COOKIE_AUTH_KEY = "_ak" |
||||
|
|
||||
|
//数据库表前缀 tank200表示当前应用版本是tank:2.0.x版,数据库结构发生变化必然是中型升级
|
||||
|
TABLE_PREFIX = "tank20_" |
||||
|
|
||||
|
//当前版本
|
||||
|
VERSION = "2.0.0" |
||||
|
) |
||||
|
|
||||
|
type Config interface { |
||||
|
|
||||
|
//是否已经安装
|
||||
|
IsInstalled() bool |
||||
|
//启动端口
|
||||
|
GetServerPort() int |
||||
|
//获取mysql链接
|
||||
|
GetMysqlUrl() string |
||||
|
|
||||
|
//文件存放路径
|
||||
|
GetMatterPath() string |
||||
|
//完成安装过程,主要是要将配置写入到文件中
|
||||
|
FinishInstall(mysqlPort int, mysqlHost string, mysqlSchema string, mysqlUsername string, mysqlPassword string) |
||||
|
} |
||||
@ -1,220 +0,0 @@ |
|||||
package rest |
|
||||
|
|
||||
import ( |
|
||||
"fmt" |
|
||||
"github.com/eyebluecn/tank/code/config" |
|
||||
"github.com/eyebluecn/tank/code/core" |
|
||||
"github.com/eyebluecn/tank/code/tool/cache" |
|
||||
"github.com/jinzhu/gorm" |
|
||||
"net/http" |
|
||||
"reflect" |
|
||||
) |
|
||||
|
|
||||
//上下文,管理数据库连接,管理所有路由请求,管理所有的单例component.
|
|
||||
type Context struct { |
|
||||
//数据库连接
|
|
||||
db *gorm.DB |
|
||||
//session缓存
|
|
||||
SessionCache *cache.Table |
|
||||
//各类的Bean Map。这里面是包含ControllerMap中所有元素
|
|
||||
BeanMap map[string]core.IBean |
|
||||
//只包含了Controller的map
|
|
||||
ControllerMap map[string]core.IController |
|
||||
//处理所有路由请求
|
|
||||
Router *Router |
|
||||
} |
|
||||
|
|
||||
//初始化上下文
|
|
||||
func (this *Context) Init() { |
|
||||
|
|
||||
//创建一个用于存储session的缓存。
|
|
||||
this.SessionCache = cache.NewTable() |
|
||||
|
|
||||
//初始化Map
|
|
||||
this.BeanMap = make(map[string]core.IBean) |
|
||||
this.ControllerMap = make(map[string]core.IController) |
|
||||
|
|
||||
//注册各类Beans.在这个方法里面顺便把Controller装入ControllerMap中去。
|
|
||||
this.registerBeans() |
|
||||
|
|
||||
//初始化每个bean.
|
|
||||
this.initBeans() |
|
||||
|
|
||||
//初始化Router. 这个方法要在Bean注册好了之后才能。
|
|
||||
this.Router = NewRouter() |
|
||||
|
|
||||
//如果数据库信息配置好了,就直接打开数据库连接 同时执行Bean的ConfigPost方法
|
|
||||
this.InstallOk() |
|
||||
|
|
||||
} |
|
||||
|
|
||||
//获取数据库对象
|
|
||||
func (this *Context) GetDB() *gorm.DB { |
|
||||
return this.db |
|
||||
} |
|
||||
|
|
||||
func (this *Context) GetSessionCache() *cache.Table { |
|
||||
return this.SessionCache |
|
||||
} |
|
||||
|
|
||||
func (this *Context) GetControllerMap() map[string]core.IController { |
|
||||
return this.ControllerMap |
|
||||
} |
|
||||
|
|
||||
func (this *Context) Cleanup() { |
|
||||
for _, bean := range this.BeanMap { |
|
||||
bean.Cleanup() |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
//响应http的能力
|
|
||||
func (this *Context) ServeHTTP(writer http.ResponseWriter, request *http.Request) { |
|
||||
this.Router.ServeHTTP(writer, request) |
|
||||
} |
|
||||
|
|
||||
func (this *Context) OpenDb() { |
|
||||
|
|
||||
var err error = nil |
|
||||
this.db, err = gorm.Open("mysql", config.CONFIG.MysqlUrl) |
|
||||
|
|
||||
if err != nil { |
|
||||
core.LOGGER.Panic("failed to connect mysql database") |
|
||||
} |
|
||||
|
|
||||
//是否打开sql日志(在调试阶段可以打开,以方便查看执行的SQL)
|
|
||||
this.db.LogMode(false) |
|
||||
} |
|
||||
|
|
||||
func (this *Context) CloseDb() { |
|
||||
|
|
||||
if this.db != nil { |
|
||||
err := this.db.Close() |
|
||||
if err != nil { |
|
||||
core.LOGGER.Error("关闭数据库连接出错 %s", err.Error()) |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
//注册一个Bean
|
|
||||
func (this *Context) registerBean(bean core.IBean) { |
|
||||
|
|
||||
typeOf := reflect.TypeOf(bean) |
|
||||
typeName := typeOf.String() |
|
||||
|
|
||||
if element, ok := bean.(core.IBean); ok { |
|
||||
|
|
||||
err := fmt.Sprintf("【%s】已经被注册了,跳过。", typeName) |
|
||||
if _, ok := this.BeanMap[typeName]; ok { |
|
||||
core.LOGGER.Error(fmt.Sprintf(err)) |
|
||||
} else { |
|
||||
this.BeanMap[typeName] = element |
|
||||
|
|
||||
//看看是不是controller类型,如果是,那么单独放在ControllerMap中。
|
|
||||
if controller, ok1 := bean.(core.IController); ok1 { |
|
||||
this.ControllerMap[typeName] = controller |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
} else { |
|
||||
core.LOGGER.Panic("注册的【%s】不是Bean类型。", typeName) |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
//注册各个Beans
|
|
||||
func (this *Context) registerBeans() { |
|
||||
|
|
||||
//alien
|
|
||||
this.registerBean(new(AlienController)) |
|
||||
this.registerBean(new(AlienService)) |
|
||||
|
|
||||
//dashboard
|
|
||||
this.registerBean(new(DashboardController)) |
|
||||
this.registerBean(new(DashboardDao)) |
|
||||
this.registerBean(new(DashboardService)) |
|
||||
|
|
||||
//downloadToken
|
|
||||
this.registerBean(new(DownloadTokenDao)) |
|
||||
|
|
||||
//imageCache
|
|
||||
this.registerBean(new(ImageCacheController)) |
|
||||
this.registerBean(new(ImageCacheDao)) |
|
||||
this.registerBean(new(ImageCacheService)) |
|
||||
|
|
||||
//install
|
|
||||
this.registerBean(new(InstallController)) |
|
||||
|
|
||||
//matter
|
|
||||
this.registerBean(new(MatterController)) |
|
||||
this.registerBean(new(MatterDao)) |
|
||||
this.registerBean(new(MatterService)) |
|
||||
|
|
||||
//preference
|
|
||||
this.registerBean(new(PreferenceController)) |
|
||||
this.registerBean(new(PreferenceDao)) |
|
||||
this.registerBean(new(PreferenceService)) |
|
||||
|
|
||||
//footprint
|
|
||||
this.registerBean(new(FootprintController)) |
|
||||
this.registerBean(new(FootprintDao)) |
|
||||
this.registerBean(new(FootprintService)) |
|
||||
|
|
||||
//session
|
|
||||
this.registerBean(new(SessionDao)) |
|
||||
this.registerBean(new(SessionService)) |
|
||||
|
|
||||
//uploadToken
|
|
||||
this.registerBean(new(UploadTokenDao)) |
|
||||
|
|
||||
//user
|
|
||||
this.registerBean(new(UserController)) |
|
||||
this.registerBean(new(UserDao)) |
|
||||
this.registerBean(new(UserService)) |
|
||||
|
|
||||
//webdav
|
|
||||
this.registerBean(new(DavController)) |
|
||||
this.registerBean(new(DavService)) |
|
||||
|
|
||||
} |
|
||||
|
|
||||
//从Map中获取某个Bean.
|
|
||||
func (this *Context) GetBean(bean core.IBean) core.IBean { |
|
||||
|
|
||||
typeOf := reflect.TypeOf(bean) |
|
||||
typeName := typeOf.String() |
|
||||
|
|
||||
if val, ok := this.BeanMap[typeName]; ok { |
|
||||
return val |
|
||||
} else { |
|
||||
core.LOGGER.Panic("【%s】没有注册。", typeName) |
|
||||
return nil |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
//初始化每个Bean
|
|
||||
func (this *Context) initBeans() { |
|
||||
|
|
||||
for key, bean := range this.BeanMap { |
|
||||
core.LOGGER.Info("init %s", key) |
|
||||
bean.Init() |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
//系统如果安装好了就调用这个方法。
|
|
||||
func (this *Context) InstallOk() { |
|
||||
|
|
||||
if config.CONFIG.Installed { |
|
||||
this.OpenDb() |
|
||||
|
|
||||
for _, bean := range this.BeanMap { |
|
||||
bean.Bootstrap() |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
|
|
||||
//销毁的方法
|
|
||||
func (this *Context) Destroy() { |
|
||||
this.CloseDb() |
|
||||
} |
|
||||
@ -1 +1,220 @@ |
|||||
package support |
package support |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
|
||||
|
"github.com/eyebluecn/tank/code/core" |
||||
|
"github.com/eyebluecn/tank/code/rest" |
||||
|
"github.com/eyebluecn/tank/code/tool/cache" |
||||
|
"github.com/jinzhu/gorm" |
||||
|
"net/http" |
||||
|
"reflect" |
||||
|
) |
||||
|
|
||||
|
//上下文,管理数据库连接,管理所有路由请求,管理所有的单例component.
|
||||
|
type TankContext struct { |
||||
|
//数据库连接
|
||||
|
db *gorm.DB |
||||
|
//session缓存
|
||||
|
SessionCache *cache.Table |
||||
|
//各类的Bean Map。这里面是包含ControllerMap中所有元素
|
||||
|
BeanMap map[string]core.IBean |
||||
|
//只包含了Controller的map
|
||||
|
ControllerMap map[string]core.IController |
||||
|
//处理所有路由请求
|
||||
|
Router *TankRouter |
||||
|
} |
||||
|
|
||||
|
//初始化上下文
|
||||
|
func (this *TankContext) Init() { |
||||
|
|
||||
|
//创建一个用于存储session的缓存。
|
||||
|
this.SessionCache = cache.NewTable() |
||||
|
|
||||
|
//初始化Map
|
||||
|
this.BeanMap = make(map[string]core.IBean) |
||||
|
this.ControllerMap = make(map[string]core.IController) |
||||
|
|
||||
|
//注册各类Beans.在这个方法里面顺便把Controller装入ControllerMap中去。
|
||||
|
this.registerBeans() |
||||
|
|
||||
|
//初始化每个bean.
|
||||
|
this.initBeans() |
||||
|
|
||||
|
//初始化Router. 这个方法要在Bean注册好了之后才能。
|
||||
|
this.Router = NewRouter() |
||||
|
|
||||
|
//如果数据库信息配置好了,就直接打开数据库连接 同时执行Bean的ConfigPost方法
|
||||
|
this.InstallOk() |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//获取数据库对象
|
||||
|
func (this *TankContext) GetDB() *gorm.DB { |
||||
|
return this.db |
||||
|
} |
||||
|
|
||||
|
func (this *TankContext) GetSessionCache() *cache.Table { |
||||
|
return this.SessionCache |
||||
|
} |
||||
|
|
||||
|
func (this *TankContext) GetControllerMap() map[string]core.IController { |
||||
|
return this.ControllerMap |
||||
|
} |
||||
|
|
||||
|
func (this *TankContext) Cleanup() { |
||||
|
for _, bean := range this.BeanMap { |
||||
|
bean.Cleanup() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//响应http的能力
|
||||
|
func (this *TankContext) ServeHTTP(writer http.ResponseWriter, request *http.Request) { |
||||
|
this.Router.ServeHTTP(writer, request) |
||||
|
} |
||||
|
|
||||
|
func (this *TankContext) OpenDb() { |
||||
|
|
||||
|
var err error = nil |
||||
|
this.db, err = gorm.Open("mysql", core.CONFIG.GetMysqlUrl()) |
||||
|
|
||||
|
if err != nil { |
||||
|
core.LOGGER.Panic("failed to connect mysql database") |
||||
|
} |
||||
|
|
||||
|
//是否打开sql日志(在调试阶段可以打开,以方便查看执行的SQL)
|
||||
|
this.db.LogMode(false) |
||||
|
} |
||||
|
|
||||
|
func (this *TankContext) CloseDb() { |
||||
|
|
||||
|
if this.db != nil { |
||||
|
err := this.db.Close() |
||||
|
if err != nil { |
||||
|
core.LOGGER.Error("关闭数据库连接出错 %s", err.Error()) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//注册一个Bean
|
||||
|
func (this *TankContext) registerBean(bean core.IBean) { |
||||
|
|
||||
|
typeOf := reflect.TypeOf(bean) |
||||
|
typeName := typeOf.String() |
||||
|
|
||||
|
if element, ok := bean.(core.IBean); ok { |
||||
|
|
||||
|
err := fmt.Sprintf("【%s】已经被注册了,跳过。", typeName) |
||||
|
if _, ok := this.BeanMap[typeName]; ok { |
||||
|
core.LOGGER.Error(fmt.Sprintf(err)) |
||||
|
} else { |
||||
|
this.BeanMap[typeName] = element |
||||
|
|
||||
|
//看看是不是controller类型,如果是,那么单独放在ControllerMap中。
|
||||
|
if controller, ok1 := bean.(core.IController); ok1 { |
||||
|
this.ControllerMap[typeName] = controller |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
core.LOGGER.Panic("注册的【%s】不是Bean类型。", typeName) |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//注册各个Beans
|
||||
|
func (this *TankContext) registerBeans() { |
||||
|
|
||||
|
//alien
|
||||
|
this.registerBean(new(rest.AlienController)) |
||||
|
this.registerBean(new(rest.AlienService)) |
||||
|
|
||||
|
//dashboard
|
||||
|
this.registerBean(new(rest.DashboardController)) |
||||
|
this.registerBean(new(rest.DashboardDao)) |
||||
|
this.registerBean(new(rest.DashboardService)) |
||||
|
|
||||
|
//downloadToken
|
||||
|
this.registerBean(new(rest.DownloadTokenDao)) |
||||
|
|
||||
|
//imageCache
|
||||
|
this.registerBean(new(rest.ImageCacheController)) |
||||
|
this.registerBean(new(rest.ImageCacheDao)) |
||||
|
this.registerBean(new(rest.ImageCacheService)) |
||||
|
|
||||
|
//install
|
||||
|
this.registerBean(new(rest.InstallController)) |
||||
|
|
||||
|
//matter
|
||||
|
this.registerBean(new(rest.MatterController)) |
||||
|
this.registerBean(new(rest.MatterDao)) |
||||
|
this.registerBean(new(rest.MatterService)) |
||||
|
|
||||
|
//preference
|
||||
|
this.registerBean(new(rest.PreferenceController)) |
||||
|
this.registerBean(new(rest.PreferenceDao)) |
||||
|
this.registerBean(new(rest.PreferenceService)) |
||||
|
|
||||
|
//footprint
|
||||
|
this.registerBean(new(rest.FootprintController)) |
||||
|
this.registerBean(new(rest.FootprintDao)) |
||||
|
this.registerBean(new(rest.FootprintService)) |
||||
|
|
||||
|
//session
|
||||
|
this.registerBean(new(rest.SessionDao)) |
||||
|
this.registerBean(new(rest.SessionService)) |
||||
|
|
||||
|
//uploadToken
|
||||
|
this.registerBean(new(rest.UploadTokenDao)) |
||||
|
|
||||
|
//user
|
||||
|
this.registerBean(new(rest.UserController)) |
||||
|
this.registerBean(new(rest.UserDao)) |
||||
|
this.registerBean(new(rest.UserService)) |
||||
|
|
||||
|
//webdav
|
||||
|
this.registerBean(new(rest.DavController)) |
||||
|
this.registerBean(new(rest.DavService)) |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//从Map中获取某个Bean.
|
||||
|
func (this *TankContext) GetBean(bean core.IBean) core.IBean { |
||||
|
|
||||
|
typeOf := reflect.TypeOf(bean) |
||||
|
typeName := typeOf.String() |
||||
|
|
||||
|
if val, ok := this.BeanMap[typeName]; ok { |
||||
|
return val |
||||
|
} else { |
||||
|
core.LOGGER.Panic("【%s】没有注册。", typeName) |
||||
|
return nil |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//初始化每个Bean
|
||||
|
func (this *TankContext) initBeans() { |
||||
|
|
||||
|
for _, bean := range this.BeanMap { |
||||
|
bean.Init() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//系统如果安装好了就调用这个方法。
|
||||
|
func (this *TankContext) InstallOk() { |
||||
|
|
||||
|
if core.CONFIG.IsInstalled() { |
||||
|
this.OpenDb() |
||||
|
|
||||
|
for _, bean := range this.BeanMap { |
||||
|
bean.Bootstrap() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
//销毁的方法
|
||||
|
func (this *TankContext) Destroy() { |
||||
|
this.CloseDb() |
||||
|
} |
||||
|
|||||
Loading…
Reference in new issue