| | |
| | |
| | |
| |
|
| | package engine |
| |
|
| | import ( |
| | "bytes" |
| | "encoding/json" |
| | errors2 "errors" |
| | "fmt" |
| | template2 "html/template" |
| | "net/http" |
| | "runtime/debug" |
| | "strings" |
| | "sync" |
| |
|
| | "github.com/GoAdminGroup/go-admin/modules/language" |
| | "github.com/GoAdminGroup/go-admin/template/icon" |
| | "github.com/GoAdminGroup/go-admin/template/types/action" |
| |
|
| | "github.com/GoAdminGroup/go-admin/adapter" |
| | "github.com/GoAdminGroup/go-admin/context" |
| | "github.com/GoAdminGroup/go-admin/modules/auth" |
| | "github.com/GoAdminGroup/go-admin/modules/config" |
| | "github.com/GoAdminGroup/go-admin/modules/db" |
| | "github.com/GoAdminGroup/go-admin/modules/errors" |
| | "github.com/GoAdminGroup/go-admin/modules/logger" |
| | "github.com/GoAdminGroup/go-admin/modules/menu" |
| | "github.com/GoAdminGroup/go-admin/modules/service" |
| | "github.com/GoAdminGroup/go-admin/modules/system" |
| | "github.com/GoAdminGroup/go-admin/modules/ui" |
| | "github.com/GoAdminGroup/go-admin/plugins" |
| | "github.com/GoAdminGroup/go-admin/plugins/admin" |
| | "github.com/GoAdminGroup/go-admin/plugins/admin/models" |
| | "github.com/GoAdminGroup/go-admin/plugins/admin/modules/response" |
| | "github.com/GoAdminGroup/go-admin/plugins/admin/modules/table" |
| | "github.com/GoAdminGroup/go-admin/template" |
| | "github.com/GoAdminGroup/go-admin/template/types" |
| | ) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | type Engine struct { |
| | PluginList plugins.Plugins |
| | Adapter adapter.WebFrameWork |
| | Services service.List |
| | NavButtons *types.Buttons |
| | config *config.Config |
| | announceLock sync.Once |
| | } |
| |
|
| | |
| | func Default() *Engine { |
| | engine = &Engine{ |
| | Adapter: defaultAdapter, |
| | Services: service.GetServices(), |
| | NavButtons: new(types.Buttons), |
| | } |
| | return engine |
| | } |
| |
|
| | |
| | func (eng *Engine) Use(router interface{}) error { |
| | if eng.Adapter == nil { |
| | emptyAdapterPanic() |
| | } |
| |
|
| | eng.Services.Add(auth.InitCSRFTokenSrv(eng.DefaultConnection())) |
| | eng.initSiteSetting() |
| | eng.initJumpNavButtons() |
| | eng.initPlugins() |
| |
|
| | printInitMsg(language.Get("initialize success")) |
| |
|
| | return eng.Adapter.Use(router, eng.PluginList) |
| | } |
| |
|
| | |
| | func (eng *Engine) AddPlugins(plugs ...plugins.Plugin) *Engine { |
| |
|
| | if len(plugs) == 0 { |
| | return eng |
| | } |
| |
|
| | for _, plug := range plugs { |
| | eng.PluginList = eng.PluginList.Add(plug) |
| | } |
| |
|
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddPluginList(plugs plugins.Plugins) *Engine { |
| |
|
| | if len(plugs) == 0 { |
| | return eng |
| | } |
| |
|
| | for _, plug := range plugs { |
| | eng.PluginList = eng.PluginList.Add(plug) |
| | } |
| |
|
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) FindPluginByName(name string) (plugins.Plugin, bool) { |
| | for _, plug := range eng.PluginList { |
| | if plug.Name() == name { |
| | return plug, true |
| | } |
| | } |
| | return nil, false |
| | } |
| |
|
| | |
| | func (eng *Engine) AddAuthService(processor auth.Processor) *Engine { |
| | eng.Services.Add("auth", auth.NewService(processor)) |
| | return eng |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | func (eng *Engine) announce() *Engine { |
| | if eng.config.Debug { |
| | eng.announceLock.Do(func() { |
| | fmt.Printf(language.Get("goadmin is now running. \nrunning in \"debug\" mode. switch to \"release\" mode in production.\n\n")) |
| | }) |
| | } |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddConfig(cfg *config.Config) *Engine { |
| | return eng.setConfig(cfg).announce().initDatabase() |
| | } |
| |
|
| | |
| | func (eng *Engine) setConfig(cfg *config.Config) *Engine { |
| | eng.config = config.Initialize(cfg) |
| | sysCheck, themeCheck := template.CheckRequirements() |
| | if !sysCheck { |
| | logger.Panicf(language.Get("wrong goadmin version, theme %s required goadmin version are %s"), |
| | eng.config.Theme, strings.Join(template.Default().GetRequirements(), ",")) |
| | } |
| | if !themeCheck { |
| | logger.Panicf(language.Get("wrong theme version, goadmin %s required version of theme %s is %s"), |
| | system.Version(), eng.config.Theme, strings.Join(system.RequireThemeVersion()[eng.config.Theme], ",")) |
| | } |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddConfigFromJSON(path string) *Engine { |
| | cfg := config.ReadFromJson(path) |
| | return eng.setConfig(&cfg).announce().initDatabase() |
| | } |
| |
|
| | |
| | func (eng *Engine) AddConfigFromYAML(path string) *Engine { |
| | cfg := config.ReadFromYaml(path) |
| | return eng.setConfig(&cfg).announce().initDatabase() |
| | } |
| |
|
| | |
| | func (eng *Engine) AddConfigFromINI(path string) *Engine { |
| | cfg := config.ReadFromINI(path) |
| | return eng.setConfig(&cfg).announce().initDatabase() |
| | } |
| |
|
| | |
| | func (eng *Engine) initDatabase() *Engine { |
| | printInitMsg(language.Get("initialize database connections")) |
| | for driver, databaseCfg := range eng.config.Databases.GroupByDriver() { |
| | eng.Services.Add(driver, db.GetConnectionByDriver(driver).InitDB(databaseCfg)) |
| | } |
| | if defaultAdapter == nil { |
| | emptyAdapterPanic() |
| | } |
| | defaultConnection := db.GetConnection(eng.Services) |
| | defaultAdapter.SetConnection(defaultConnection) |
| | eng.Adapter.SetConnection(defaultConnection) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddAdapter(ada adapter.WebFrameWork) *Engine { |
| | eng.Adapter = ada |
| | defaultAdapter = ada |
| | return eng |
| | } |
| |
|
| | |
| | var defaultAdapter adapter.WebFrameWork |
| |
|
| | var engine *Engine |
| |
|
| | |
| | var navButtons = new(types.Buttons) |
| |
|
| | func emptyAdapterPanic() { |
| | logger.Panic(language.Get("adapter is nil, import the default adapter or use addadapter method add the adapter")) |
| | } |
| |
|
| | |
| | func Register(ada adapter.WebFrameWork) { |
| | if ada == nil { |
| | emptyAdapterPanic() |
| | } |
| | defaultAdapter = ada |
| | } |
| |
|
| | |
| | func User(ctx interface{}) (models.UserModel, bool) { |
| | return defaultAdapter.User(ctx) |
| | } |
| |
|
| | |
| | func (eng *Engine) User(ctx interface{}) (models.UserModel, bool) { |
| | return eng.Adapter.User(ctx) |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | func (eng *Engine) DB(driver string) db.Connection { |
| | return db.GetConnectionFromService(eng.Services.Get(driver)) |
| | } |
| |
|
| | |
| | func (eng *Engine) DefaultConnection() db.Connection { |
| | return eng.DB(eng.config.Databases.GetDefault().Driver) |
| | } |
| |
|
| | |
| | func (eng *Engine) MysqlConnection() db.Connection { |
| | return db.GetConnectionFromService(eng.Services.Get(db.DriverMysql)) |
| | } |
| |
|
| | |
| | func (eng *Engine) MssqlConnection() db.Connection { |
| | return db.GetConnectionFromService(eng.Services.Get(db.DriverMssql)) |
| | } |
| |
|
| | |
| | func (eng *Engine) PostgresqlConnection() db.Connection { |
| | return db.GetConnectionFromService(eng.Services.Get(db.DriverPostgresql)) |
| | } |
| |
|
| | |
| | func (eng *Engine) SqliteConnection() db.Connection { |
| | return db.GetConnectionFromService(eng.Services.Get(db.DriverSqlite)) |
| | } |
| |
|
| | |
| | func (eng *Engine) OceanBaseConnection() db.Connection { |
| | return db.GetConnectionFromService(eng.Services.Get(db.DriverOceanBase)) |
| | } |
| |
|
| | type ConnectionSetter func(db.Connection) |
| |
|
| | |
| | func (eng *Engine) ResolveConnection(setter ConnectionSetter, driver string) *Engine { |
| | setter(eng.DB(driver)) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) ResolveMysqlConnection(setter ConnectionSetter) *Engine { |
| | eng.ResolveConnection(setter, db.DriverMysql) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) ResolveMssqlConnection(setter ConnectionSetter) *Engine { |
| | eng.ResolveConnection(setter, db.DriverMssql) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) ResolveSqliteConnection(setter ConnectionSetter) *Engine { |
| | eng.ResolveConnection(setter, db.DriverSqlite) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) ResolvePostgresqlConnection(setter ConnectionSetter) *Engine { |
| | eng.ResolveConnection(setter, db.DriverPostgresql) |
| | return eng |
| | } |
| |
|
| | type Setter func(*Engine) |
| |
|
| | |
| | func (eng *Engine) Clone(e *Engine) *Engine { |
| | e = eng |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) ClonedBySetter(setter Setter) *Engine { |
| | setter(eng) |
| | return eng |
| | } |
| |
|
| | func (eng *Engine) deferHandler(conn db.Connection) context.Handler { |
| | return func(ctx *context.Context) { |
| | defer func(ctx *context.Context) { |
| | if user, ok := ctx.UserValue["user"].(models.UserModel); ok { |
| | var input []byte |
| | form := ctx.Request.MultipartForm |
| | if form != nil { |
| | input, _ = json.Marshal((*form).Value) |
| | } |
| |
|
| | models.OperationLog().SetConn(conn).New(user.Id, ctx.Path(), ctx.Method(), ctx.LocalIP(), string(input)) |
| | } |
| |
|
| | if err := recover(); err != nil { |
| | logger.Error(err) |
| | logger.Error(string(debug.Stack())) |
| |
|
| | var ( |
| | errMsg string |
| | ok bool |
| | e error |
| | ) |
| |
|
| | if errMsg, ok = err.(string); !ok { |
| | if e, ok = err.(error); ok { |
| | errMsg = e.Error() |
| | } |
| | } |
| |
|
| | if errMsg == "" { |
| | errMsg = "system error" |
| | } |
| |
|
| | if ctx.WantJSON() { |
| | response.Error(ctx, errMsg) |
| | return |
| | } |
| |
|
| | eng.errorPanelHTML(ctx, new(bytes.Buffer), errors2.New(errMsg)) |
| | } |
| | }(ctx) |
| | ctx.Next() |
| | } |
| | } |
| |
|
| | |
| | func (eng *Engine) wrapWithAuthMiddleware(handler context.Handler) context.Handlers { |
| | conn := db.GetConnection(eng.Services) |
| | return []context.Handler{eng.deferHandler(conn), response.OffLineHandler, auth.Middleware(conn), handler} |
| | } |
| |
|
| | |
| | func (eng *Engine) wrap(handler context.Handler) context.Handlers { |
| | conn := db.GetConnection(eng.Services) |
| | return []context.Handler{eng.deferHandler(conn), response.OffLineHandler, handler} |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | func (eng *Engine) AddNavButtons(title template2.HTML, icon string, action types.Action) *Engine { |
| | btn := types.GetNavButton(title, icon, action) |
| | *eng.NavButtons = append(*eng.NavButtons, btn) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddNavButtonsRaw(btns ...types.Button) *Engine { |
| | *eng.NavButtons = append(*eng.NavButtons, btns...) |
| | return eng |
| | } |
| |
|
| | type navJumpButtonParam struct { |
| | Exist bool |
| | Icon string |
| | BtnName string |
| | URL string |
| | Title string |
| | TitleScore string |
| | } |
| |
|
| | func (eng *Engine) addJumpNavButton(param navJumpButtonParam) *Engine { |
| | if param.Exist { |
| | *eng.NavButtons = (*eng.NavButtons).AddNavButton(param.Icon, param.BtnName, |
| | action.JumpInNewTab(config.Url(param.URL), |
| | language.GetWithScope(param.Title, param.TitleScore))) |
| | } |
| | return eng |
| | } |
| |
|
| | func printInitMsg(msg string) { |
| | logger.Info(msg) |
| | } |
| |
|
| | func (eng *Engine) initJumpNavButtons() { |
| | printInitMsg(language.Get("initialize navigation buttons")) |
| | for _, param := range eng.initNavJumpButtonParams() { |
| | eng.addJumpNavButton(param) |
| | } |
| | navButtons = eng.NavButtons |
| | eng.Services.Add(ui.ServiceKey, ui.NewService(eng.NavButtons)) |
| | } |
| |
|
| | func (eng *Engine) initPlugins() { |
| |
|
| | printInitMsg(language.Get("initialize plugins")) |
| |
|
| | eng.AddPlugins(admin.NewAdmin()).AddPluginList(plugins.Get()) |
| |
|
| | var plugGenerators = make(table.GeneratorList) |
| |
|
| | for i := range eng.PluginList { |
| | if eng.PluginList[i].Name() != "admin" { |
| | printInitMsg("--> " + eng.PluginList[i].Name()) |
| | eng.PluginList[i].InitPlugin(eng.Services) |
| | if !eng.PluginList[i].GetInfo().SkipInstallation { |
| | eng.AddGenerator("plugin_"+eng.PluginList[i].Name(), eng.PluginList[i].GetSettingPage()) |
| | } |
| | plugGenerators = plugGenerators.Combine(eng.PluginList[i].GetGenerators()) |
| | } |
| | } |
| | adm := eng.AdminPlugin().AddGenerators(plugGenerators) |
| | adm.InitPlugin(eng.Services) |
| | plugins.Add(adm) |
| | } |
| |
|
| | func (eng *Engine) initNavJumpButtonParams() []navJumpButtonParam { |
| | return []navJumpButtonParam{ |
| | { |
| | Exist: !eng.config.HideConfigCenterEntrance, |
| | Icon: icon.Gear, |
| | BtnName: types.NavBtnSiteName, |
| | URL: "/info/site/edit", |
| | Title: "site setting", |
| | TitleScore: "config", |
| | }, { |
| | Exist: !eng.config.HideToolEntrance && eng.config.IsNotProductionEnvironment(), |
| | Icon: icon.Wrench, |
| | BtnName: types.NavBtnToolName, |
| | URL: "/info/generate/new", |
| | Title: "code generate tool", |
| | TitleScore: "tool", |
| | }, { |
| | Exist: !eng.config.HideAppInfoEntrance, |
| | Icon: icon.Info, |
| | BtnName: types.NavBtnInfoName, |
| | URL: "/application/info", |
| | Title: "site info", |
| | TitleScore: "system", |
| | }, { |
| | Exist: !eng.config.HidePluginEntrance, |
| | Icon: icon.Th, |
| | BtnName: types.NavBtnPlugName, |
| | URL: "/plugins", |
| | Title: "plugins", |
| | TitleScore: "plugin", |
| | }, |
| | } |
| | } |
| |
|
| | func (eng *Engine) initSiteSetting() { |
| |
|
| | printInitMsg(language.Get("initialize configuration")) |
| |
|
| | err := eng.config.Update(models.Site(). |
| | SetConn(eng.DefaultConnection()). |
| | Init(eng.config.ToMap()). |
| | AllToMap()) |
| | if err != nil { |
| | logger.Panic(err) |
| | } |
| | eng.Services.Add("config", config.SrvWithConfig(eng.config)) |
| |
|
| | errors.Init() |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | |
| | func (eng *Engine) Content(ctx interface{}, panel types.GetPanelFn) { |
| | if eng.Adapter == nil { |
| | emptyAdapterPanic() |
| | } |
| | eng.Adapter.Content(ctx, panel, eng.AdminPlugin().GetAddOperationFn(), *eng.NavButtons...) |
| | } |
| |
|
| | |
| | |
| | func Content(ctx interface{}, panel types.GetPanelFn) { |
| | if defaultAdapter == nil { |
| | emptyAdapterPanic() |
| | } |
| | defaultAdapter.Content(ctx, panel, engine.AdminPlugin().GetAddOperationFn(), *navButtons...) |
| | } |
| |
|
| | |
| | func (eng *Engine) Data(method, url string, handler context.Handler, noAuth ...bool) { |
| | if len(noAuth) > 0 && noAuth[0] { |
| | eng.Adapter.AddHandler(method, url, eng.wrap(handler)) |
| | } else { |
| | eng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(handler)) |
| | } |
| | } |
| |
|
| | |
| | func (eng *Engine) HTML(method, url string, fn types.GetPanelInfoFn, noAuth ...bool) { |
| |
|
| | var handler = func(ctx *context.Context) { |
| | panel, err := fn(ctx) |
| | if err != nil { |
| | panel = template.WarningPanel(ctx, err.Error()) |
| | } |
| |
|
| | eng.AdminPlugin().GetAddOperationFn()(panel.Callbacks...) |
| |
|
| | var ( |
| | tmpl, tmplName = template.Default(ctx).GetTemplate(ctx.IsPjax()) |
| |
|
| | user = auth.Auth(ctx) |
| | buf = new(bytes.Buffer) |
| | ) |
| |
|
| | hasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{ |
| | User: user, |
| | Menu: menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(config.URLRemovePrefix(ctx.Path())), |
| | Panel: panel.GetContent(eng.config.IsProductionEnvironment()), |
| | Assets: template.GetComponentAssetImportHTML(ctx), |
| | Buttons: eng.NavButtons.CheckPermission(user), |
| | TmplHeadHTML: template.Default(ctx).GetHeadHTML(), |
| | TmplFootJS: template.Default(ctx).GetFootJS(), |
| | Iframe: ctx.IsIframe(), |
| | })) |
| |
|
| | if hasError != nil { |
| | logger.Error(fmt.Sprintf("error: %s adapter content, ", eng.Adapter.Name()), hasError) |
| | } |
| |
|
| | ctx.HTMLByte(http.StatusOK, buf.Bytes()) |
| | } |
| |
|
| | if len(noAuth) > 0 && noAuth[0] { |
| | eng.Adapter.AddHandler(method, url, eng.wrap(handler)) |
| | } else { |
| | eng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(handler)) |
| | } |
| | } |
| |
|
| | |
| | |
| | func (eng *Engine) HTMLFile(method, url, path string, data map[string]interface{}, noAuth ...bool) { |
| |
|
| | var handler = func(ctx *context.Context) { |
| |
|
| | cbuf := new(bytes.Buffer) |
| |
|
| | t, err := template2.ParseFiles(path) |
| | if err != nil { |
| | eng.errorPanelHTML(ctx, cbuf, err) |
| | return |
| | } else if err := t.Execute(cbuf, data); err != nil { |
| | eng.errorPanelHTML(ctx, cbuf, err) |
| | return |
| | } |
| |
|
| | var ( |
| | tmpl, tmplName = template.Default(ctx).GetTemplate(ctx.IsPjax()) |
| |
|
| | user = auth.Auth(ctx) |
| | buf = new(bytes.Buffer) |
| | ) |
| |
|
| | hasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{ |
| | User: user, |
| | Menu: menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(eng.config.URLRemovePrefix(ctx.Path())), |
| | Panel: types.Panel{ |
| | Content: template.HTML(cbuf.String()), |
| | }, |
| | Assets: template.GetComponentAssetImportHTML(ctx), |
| | Buttons: eng.NavButtons.CheckPermission(user), |
| | TmplHeadHTML: template.Default(ctx).GetHeadHTML(), |
| | TmplFootJS: template.Default(ctx).GetFootJS(), |
| | Iframe: ctx.IsIframe(), |
| | })) |
| |
|
| | if hasError != nil { |
| | logger.Error(fmt.Sprintf("error: %s adapter content, ", eng.Adapter.Name()), hasError) |
| | } |
| |
|
| | ctx.HTMLByte(http.StatusOK, buf.Bytes()) |
| | } |
| |
|
| | if len(noAuth) > 0 && noAuth[0] { |
| | eng.Adapter.AddHandler(method, url, eng.wrap(handler)) |
| | } else { |
| | eng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(handler)) |
| | } |
| | } |
| |
|
| | |
| | |
| | func (eng *Engine) HTMLFiles(method, url string, data map[string]interface{}, files ...string) { |
| | eng.Adapter.AddHandler(method, url, eng.wrapWithAuthMiddleware(eng.htmlFilesHandler(data, files...))) |
| | } |
| |
|
| | |
| | |
| | func (eng *Engine) HTMLFilesNoAuth(method, url string, data map[string]interface{}, files ...string) { |
| | eng.Adapter.AddHandler(method, url, eng.wrap(eng.htmlFilesHandler(data, files...))) |
| | } |
| |
|
| | |
| | |
| | func (eng *Engine) htmlFilesHandler(data map[string]interface{}, files ...string) context.Handler { |
| | return func(ctx *context.Context) { |
| |
|
| | cbuf := new(bytes.Buffer) |
| |
|
| | t, err := template2.ParseFiles(files...) |
| | if err != nil { |
| | eng.errorPanelHTML(ctx, cbuf, err) |
| | return |
| | } else if err := t.Execute(cbuf, data); err != nil { |
| | eng.errorPanelHTML(ctx, cbuf, err) |
| | return |
| | } |
| |
|
| | var ( |
| | tmpl, tmplName = template.Default(ctx).GetTemplate(ctx.IsPjax()) |
| |
|
| | user = auth.Auth(ctx) |
| | buf = new(bytes.Buffer) |
| | ) |
| |
|
| | hasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{ |
| | User: user, |
| | Menu: menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(eng.config.URLRemovePrefix(ctx.Path())), |
| | Panel: types.Panel{ |
| | Content: template.HTML(cbuf.String()), |
| | }, |
| | Assets: template.GetComponentAssetImportHTML(ctx), |
| | Buttons: eng.NavButtons.CheckPermission(user), |
| | TmplHeadHTML: template.Default(ctx).GetHeadHTML(), |
| | TmplFootJS: template.Default(ctx).GetFootJS(), |
| | Iframe: ctx.IsIframe(), |
| | })) |
| |
|
| | if hasError != nil { |
| | logger.Error(fmt.Sprintf("error: %s adapter content, ", eng.Adapter.Name()), hasError) |
| | } |
| |
|
| | ctx.HTMLByte(http.StatusOK, buf.Bytes()) |
| | } |
| | } |
| |
|
| | |
| | func (eng *Engine) errorPanelHTML(ctx *context.Context, buf *bytes.Buffer, err error) { |
| |
|
| | user := auth.Auth(ctx) |
| | tmpl, tmplName := template.Default(ctx).GetTemplate(ctx.IsPjax()) |
| |
|
| | hasError := tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(ctx, &types.NewPageParam{ |
| | User: user, |
| | Menu: menu.GetGlobalMenu(user, eng.Adapter.GetConnection(), ctx.Lang()).SetActiveClass(eng.config.URLRemovePrefix(ctx.Path())), |
| | Panel: template.WarningPanel(ctx, err.Error()).GetContent(eng.config.IsProductionEnvironment()), |
| | Assets: template.GetComponentAssetImportHTML(ctx), |
| | Buttons: (*eng.NavButtons).CheckPermission(user), |
| | TmplHeadHTML: template.Default(ctx).GetHeadHTML(), |
| | TmplFootJS: template.Default(ctx).GetFootJS(), |
| | Iframe: ctx.IsIframe(), |
| | })) |
| |
|
| | if hasError != nil { |
| | logger.Error(fmt.Sprintf("error: %s adapter content, ", eng.Adapter.Name()), hasError) |
| | } |
| |
|
| | ctx.HTMLByte(http.StatusOK, buf.Bytes()) |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | func (eng *Engine) AddGenerators(list ...table.GeneratorList) *Engine { |
| | plug, exist := eng.FindPluginByName("admin") |
| | if exist { |
| | plug.(*admin.Admin).AddGenerators(list...) |
| | return eng |
| | } |
| | eng.PluginList = append(eng.PluginList, admin.NewAdmin(list...)) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AdminPlugin() *admin.Admin { |
| | plug, exist := eng.FindPluginByName("admin") |
| | if exist { |
| | return plug.(*admin.Admin) |
| | } |
| | adm := admin.NewAdmin() |
| | eng.PluginList = append(eng.PluginList, adm) |
| | return adm |
| | } |
| |
|
| | |
| | func (eng *Engine) SetCaptcha(captcha map[string]string) *Engine { |
| | eng.AdminPlugin().SetCaptcha(captcha) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) SetCaptchaDriver(driver string) *Engine { |
| | eng.AdminPlugin().SetCaptcha(map[string]string{"driver": driver}) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddGenerator(key string, g table.Generator) *Engine { |
| | eng.AdminPlugin().AddGenerator(key, g) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddGlobalDisplayProcessFn(f types.FieldFilterFn) *Engine { |
| | types.AddGlobalDisplayProcessFn(f) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterLimit(limit int) *Engine { |
| | types.AddLimit(limit) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterTrimSpace() *Engine { |
| | types.AddTrimSpace() |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterSubstr(start int, end int) *Engine { |
| | types.AddSubstr(start, end) |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterToTitle() *Engine { |
| | types.AddToTitle() |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterToUpper() *Engine { |
| | types.AddToUpper() |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterToLower() *Engine { |
| | types.AddToUpper() |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterXssFilter() *Engine { |
| | types.AddXssFilter() |
| | return eng |
| | } |
| |
|
| | |
| | func (eng *Engine) AddDisplayFilterXssJsFilter() *Engine { |
| | types.AddXssJsFilter() |
| | return eng |
| | } |
| |
|