config.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package admin
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. "mDoc/tools"
  7. plogin "github.com/qor5/admin/login"
  8. "github.com/qor5/admin/presets"
  9. "github.com/qor5/admin/presets/gorm2op"
  10. "github.com/qor5/admin/utils"
  11. "github.com/qor5/ui/vuetify"
  12. "github.com/qor5/web"
  13. "github.com/qor5/x/login"
  14. "github.com/qor5/x/perm"
  15. h "github.com/theplant/htmlgo"
  16. "github.com/theplant/testingutils"
  17. "golang.org/x/text/language"
  18. "gorm.io/gorm"
  19. )
  20. const (
  21. PublishDir = "./publish"
  22. )
  23. type Config struct {
  24. pb *presets.Builder
  25. lb *login.Builder
  26. }
  27. func InitApp() *http.ServeMux {
  28. c := newPB()
  29. mux := SetupRouter(c)
  30. return mux
  31. }
  32. func Login(db *gorm.DB, pb *presets.Builder) *login.Builder {
  33. SecretCode := tools.InterfaceToStr(tools.If(os.Getenv("SECRET") == "", "12114", os.Getenv("SECRET")))
  34. //pb := presets.New()
  35. lb := plogin.New(pb).
  36. DB(db).
  37. UserModel(&User{}).
  38. Secret(SecretCode).
  39. // 点击忘记密码,输入邮箱,返回找回密码的链接
  40. AfterConfirmSendResetPasswordLink(func(r *http.Request, user interface{}, extraVals ...interface{}) error {
  41. resetLink := extraVals[0]
  42. u := user.(*User)
  43. mailbox := u.UserPass.Account
  44. fmt.Println("#########################################")
  45. testingutils.PrintlnJson(resetLink)
  46. fmt.Println("#########################################")
  47. // TODO: 邮件功能需通过配置文件设置相关
  48. fmt.Println(tools.MailTo("ease@scwy.net", mailbox, "您的找回密码", fmt.Sprintf("您可以通过<a href='%s'>点击这里,重新设置新的密码</a>。", resetLink), "scwy.net", 465, "ease@scwy.net", "yjz129129"))
  49. fmt.Println("#########################################")
  50. return nil
  51. }).
  52. TOTP(false)
  53. pb.ProfileFunc(func(ctx *web.EventContext) h.HTMLComponent {
  54. return h.A(h.Text("logout")).Href(lb.LogoutURL)
  55. })
  56. return lb
  57. }
  58. func newPB() Config {
  59. db := ConnectDB()
  60. b := presets.New().VuetifyOptions(`
  61. {
  62. icons: {
  63. iconfont: 'md', // 'mdi' || 'mdiSvg' || 'md' || 'fa' || 'fa4'
  64. },
  65. theme: {
  66. themes: {
  67. light: {
  68. primary: "#ed6f2d",
  69. secondary: "#009688",
  70. accent: "#ff5722",
  71. error: "#f44336",
  72. warning: "#ff9800",
  73. info: "#8bc34a",
  74. success: "#4caf50"
  75. },
  76. },
  77. },
  78. }
  79. `)
  80. b.URIPrefix("/admin").DataOperator(gorm2op.DataOperator(db)).
  81. BrandFunc(func(ctx *web.EventContext) h.HTMLComponent {
  82. logo := `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAESElEQVR4Xu1aS1LbQBDVSLYhq8AJsE8A3MAs+KyCfQNYJlSq7BMEToCphGQZOEHEjs8C5wTxDeKcIMoqhXGkdLsk12ikkWakMR7wTBULrPl0v3790aiJteCDLLj+lgHAMGDBEXgSF2g2myvVarUug7XjON719fVQZk2RuTMDAJWu1WodQsg+CIbKrxQRENa4QRBc3t7eugXXZy6bCQB7e3tNEPprqLgquXs3NzddVZtF+ygHAJSvg/I/Slg8S0cXQGirBEE5ALu7u99AwBYj5AD+l/VndJkNFkgAt63SHZQCEFL/nlLeA4EPywicAugAWLCpigXCAGBQW15e3gCF0CprENzO2CgNwnbg2WkkHMw9AeWPywiL5y4tLaFLYSDF4QEAq/SeVMB9DWd+H41GfRieyLlCAISWRWrTkTwhCGst3/c37+7ukP6lBuyLoCK4k8HuC88x4B4whwgFzVwAOJvzBIkJCizZApb0S2kPi1lgYd8GzT54jgxBZrLDg7mbWfVEJgAspZndExF5Z2enBQciU6JROmpvb29v2LaNcSViX4J5KefSovbBZbZ4RuACwElnSOdLoGA/jdqhv/5mDruA+WeyrkDFHLae4IIaAoGFF+sOXQChlwYCF4AU6/cfHh7aecGF9dey9GfWewDmVh6YKYzgZo4sAGKBRSb/ZvhkWTy4lmQ3Bhl+wm/18PeE20TzswCIBRaw/mqe9WkhFDNBup5ggzcvIwkDAD6UmzFYK2AAg6CIgXGdsoYMC/ow+ReAfyEDPh6gBQAymqqeawBgiqO5uIBqq8rsZxhgGBB/PzAuwHkxm2kazPLZ1mmw4lfGHWKTdWL5J+5RrfRbI1OHxAo57Rjw5uPjMSj/IarUro4qsXd8mYCXNlf7ILj/eXxvBVZzWpKOnFW3S4QuMUTAeX4A2I8N9+2roYhyInMMALqnwYQLGAa8UBfAdGdVxon7usC24f5wcsM8GZAKDy2fJGKA+76Kb4TSQ4sY0Po06gTExlRX9LsgQjO4OnKkvwNoAcD++Zi+lZG24pQdxGq77ypSH0d1ASDtvl4WCI+MnIZsjaAFAKgpuoFvO2us1iQIDmjXCAhJ3tr+8//YduAWKZO1AYBnbpMG2VLY1AEvtA4wLsBBwMSA8zGdIguluqx8qn0WaH35Ww/86uSrL5TBXUh1F7IFwrMGIBIe3xVkixwRoLRngIgSZeYYAHS/ECljXZG1hgGGAeW/DMU6PtnOLBEaznNOXmfZ9K6BJyT02RyD0tGHC5wm1Hc3T6Wjs1M6y+R7hFLaXi0VnZ+zBojTqc7tLMvrE0xrfEYdhvCn7CuOQlDq9CVLuK8HLTYNXotNJgApfboKZX2yrTI7y3Ibn0IQ8MWFbYF/Mg0KHiTUWZYLQHR42DiJ3V54l5/Wl1tQTqXL0C0HYcd4T6SzTBgApWJqtJkBQCNjzEUUw4C5wK7RoQvPgP92SnFu7MAGXwAAAABJRU5ErkJggg==`
  83. return vuetify.VContainer(
  84. h.Img(logo).Attr("width", "120"),
  85. ).Class("ma-n4")
  86. }).
  87. HomePageFunc(func(ctx *web.EventContext) (r web.PageResponse, err error) {
  88. r.Body = vuetify.VContainer(
  89. h.H1("Home"),
  90. h.P().Text("Change your home page here"))
  91. return
  92. })
  93. b.Permission(
  94. perm.New().Policies(
  95. perm.PolicyFor(perm.Anybody).WhoAre(perm.Allowed).ToDo(presets.PermCreate, presets.PermUpdate, presets.PermDelete, presets.PermGet, presets.PermList).On("*"),
  96. perm.PolicyFor(perm.Anybody).WhoAre(perm.Denied).ToDo(presets.PermCreate, presets.PermUpdate, presets.PermDelete).On("*:activity_logs:*"),
  97. ),
  98. )
  99. utils.Configure(b)
  100. // ab.RegisterModels(pm, tm, cm)
  101. b.I18n().
  102. SupportLanguages(language.English, language.SimplifiedChinese).
  103. RegisterForModule(language.English, I18nExampleKey, Messages_en_US).
  104. RegisterForModule(language.SimplifiedChinese, I18nExampleKey, Messages_zh_CN).
  105. RegisterForModule(language.SimplifiedChinese, presets.ModelsI18nModuleKey, Messages_zh_CN_ModelsI18nModuleKey).
  106. GetSupportLanguagesFromRequestFunc(func(r *http.Request) []language.Tag {
  107. return b.I18n().GetSupportLanguages()
  108. })
  109. b.MenuOrder(
  110. b.MenuGroup("Page Builder").SubItems("pages", "page_templates", "page_categories").Icon("web"),
  111. "shared_containers",
  112. )
  113. initWebsiteData(db) // 初始化数据
  114. lb := Login(db, b) // 登陆设置
  115. return Config{
  116. pb: b,
  117. lb: lb,
  118. }
  119. }