This commit is contained in:
kenneth 2025-06-17 11:16:24 +08:00
parent 6c3b4ec367
commit 759863f1aa
24 changed files with 103 additions and 92 deletions

View File

@ -8,14 +8,14 @@ import (
"management/internal/pkg/render" "management/internal/pkg/render"
) )
type App struct { type app struct {
config *config.Config config *config.Config
render render.Renderer render render.Renderer
captchaService v1.CaptchaService captchaService v1.CaptchaService
} }
func NewApp(config *config.Config, render render.Renderer, captchaService v1.CaptchaService) *App { func newApp(config *config.Config, render render.Renderer, captchaService v1.CaptchaService) *app {
return &App{ return &app{
config: config, config: config,
render: render, render: render,
captchaService: captchaService, captchaService: captchaService,
@ -29,7 +29,7 @@ type Response struct {
OpenCaptcha int `json:"open_captcha"` OpenCaptcha int `json:"open_captcha"`
} }
func (a *App) captcha(w http.ResponseWriter, _ *http.Request) { func (a *app) captcha(w http.ResponseWriter, _ *http.Request) {
id, b64s, _, err := a.captchaService.Generate( id, b64s, _, err := a.captchaService.Generate(
a.config.Captcha.ImgHeight, a.config.Captcha.ImgHeight,
a.config.Captcha.ImgWidth, a.config.Captcha.ImgWidth,

View File

@ -15,6 +15,6 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Conf, cfg.Render, cfg.CaptchaService) app := newApp(cfg.Conf, cfg.Render, cfg.CaptchaService)
r.Get("/captcha", app.captcha) r.Get("/captcha", app.captcha)
} }

View File

@ -10,19 +10,19 @@ import (
"management/internal/pkg/render" "management/internal/pkg/render"
) )
type App struct { type app struct {
render render.Renderer render render.Renderer
auditLogService v1.AuditLogService auditLogService v1.AuditLogService
} }
func NewApp(render render.Renderer, auditLogService v1.AuditLogService) *App { func newApp(render render.Renderer, auditLogService v1.AuditLogService) *app {
return &App{ return &app{
render: render, render: render,
auditLogService: auditLogService, auditLogService: auditLogService,
} }
} }
func (a *App) list(w http.ResponseWriter, r *http.Request) { func (a *app) list(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
ctx := r.Context() ctx := r.Context()

View File

@ -16,7 +16,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Render, cfg.AuditLogService) app := newApp(cfg.Render, cfg.AuditLogService)
r.Route("/audit_log", func(r chi.Router) { r.Route("/audit_log", func(r chi.Router) {
r.Get("/list", app.list) r.Get("/list", app.list)

View File

@ -16,7 +16,7 @@ import (
"github.com/drhin/logger" "github.com/drhin/logger"
) )
type App struct { type app struct {
log *logger.Logger log *logger.Logger
sm session.Manager sm session.Manager
render render.Renderer render render.Renderer
@ -24,14 +24,14 @@ type App struct {
userService v1.UserService userService v1.UserService
} }
func NewApp( func newApp(
log *logger.Logger, log *logger.Logger,
sm session.Manager, sm session.Manager,
render render.Renderer, render render.Renderer,
captchaService v1.CaptchaService, captchaService v1.CaptchaService,
userService v1.UserService, userService v1.UserService,
) *App { ) *app {
return &App{ return &app{
log: log, log: log,
sm: sm, sm: sm,
render: render, render: render,
@ -40,7 +40,7 @@ func NewApp(
} }
} }
func (a *App) login(w http.ResponseWriter, r *http.Request) { func (a *app) login(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
@ -88,7 +88,7 @@ func (a *App) login(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) logout(w http.ResponseWriter, r *http.Request) { func (a *app) logout(w http.ResponseWriter, r *http.Request) {
err := a.sm.Destroy(r.Context()) err := a.sm.Destroy(r.Context())
if err != nil { if err != nil {
a.log.Error(err.Error(), err) a.log.Error(err.Error(), err)

View File

@ -20,7 +20,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Log, cfg.Sm, cfg.Render, cfg.CaptchaService, cfg.UserService) app := newApp(cfg.Log, cfg.Sm, cfg.Render, cfg.CaptchaService, cfg.UserService)
r.Get("/", app.login) r.Get("/", app.login)
r.Post("/login", app.login) r.Post("/login", app.login)

View File

@ -15,19 +15,19 @@ import (
"management/internal/pkg/render" "management/internal/pkg/render"
) )
type App struct { type app struct {
render render.Renderer render render.Renderer
configService systemService.ConfigService configService systemService.ConfigService
} }
func NewApp(render render.Renderer, configService systemService.ConfigService) *App { func newApp(render render.Renderer, configService systemService.ConfigService) *app {
return &App{ return &app{
render: render, render: render,
configService: configService, configService: configService,
} }
} }
func (a *App) list(w http.ResponseWriter, r *http.Request) { func (a *app) list(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
ctx := r.Context() ctx := r.Context()
@ -57,12 +57,12 @@ func (a *App) list(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) add(w http.ResponseWriter, r *http.Request) { func (a *app) add(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
a.render.Render(ctx, w, config.Edit(ctx, &view.EditSysConfig{Config: &systemModel.Config{}})) a.render.Render(ctx, w, config.Edit(ctx, &view.EditSysConfig{Config: &systemModel.Config{}}))
} }
func (a *App) edit(w http.ResponseWriter, r *http.Request) { func (a *app) edit(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
id := convertor.QueryInt[int32](vars, "id", 0) id := convertor.QueryInt[int32](vars, "id", 0)
@ -77,7 +77,7 @@ func (a *App) edit(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, config.Edit(ctx, vm)) a.render.Render(ctx, w, config.Edit(ctx, vm))
} }
func (a *App) save(w http.ResponseWriter, r *http.Request) { func (a *app) save(w http.ResponseWriter, r *http.Request) {
id := convertor.ConvertInt[int32](r.PostFormValue("ID"), 0) id := convertor.ConvertInt[int32](r.PostFormValue("ID"), 0)
key := r.PostFormValue("Key") key := r.PostFormValue("Key")
value := r.PostFormValue("Value") value := r.PostFormValue("Value")
@ -125,7 +125,7 @@ func (a *App) save(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) refreshCache(w http.ResponseWriter, r *http.Request) { func (a *app) refreshCache(w http.ResponseWriter, r *http.Request) {
key := r.FormValue("key") key := r.FormValue("key")
err := a.configService.RefreshCache(r.Context(), strings.ToLower(key)) err := a.configService.RefreshCache(r.Context(), strings.ToLower(key))
if err != nil { if err != nil {
@ -136,7 +136,7 @@ func (a *App) refreshCache(w http.ResponseWriter, r *http.Request) {
a.render.JSONOk(w, "刷新成功") a.render.JSONOk(w, "刷新成功")
} }
func (a *App) resetPear(w http.ResponseWriter, r *http.Request) { func (a *app) resetPear(w http.ResponseWriter, r *http.Request) {
err := a.configService.ResetPear(r.Context()) err := a.configService.ResetPear(r.Context())
if err != nil { if err != nil {
a.render.JSONErr(w, err.Error()) a.render.JSONErr(w, err.Error())
@ -145,7 +145,7 @@ func (a *App) resetPear(w http.ResponseWriter, r *http.Request) {
a.render.JSONOk(w, "重置成功") a.render.JSONOk(w, "重置成功")
} }
func (a *App) pear(w http.ResponseWriter, r *http.Request) { func (a *app) pear(w http.ResponseWriter, r *http.Request) {
pear, err := a.configService.Pear(r.Context()) pear, err := a.configService.Pear(r.Context())
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)

View File

@ -19,7 +19,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Render, cfg.ConfigService) app := newApp(cfg.Render, cfg.ConfigService)
r.Get("/pear.json", app.pear) r.Get("/pear.json", app.pear)
r.Route("/config", func(r chi.Router) { r.Route("/config", func(r chi.Router) {

View File

@ -13,19 +13,19 @@ import (
"management/internal/pkg/render" "management/internal/pkg/render"
) )
type App struct { type app struct {
render render.Renderer render render.Renderer
departmentService v1.DepartmentService departmentService v1.DepartmentService
} }
func NewApp(render render.Renderer, departmentService v1.DepartmentService) *App { func newApp(render render.Renderer, departmentService v1.DepartmentService) *app {
return &App{ return &app{
render: render, render: render,
departmentService: departmentService, departmentService: departmentService,
} }
} }
func (a *App) list(w http.ResponseWriter, r *http.Request) { func (a *app) list(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
ctx := r.Context() ctx := r.Context()
@ -57,12 +57,12 @@ func (a *App) list(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) add(w http.ResponseWriter, r *http.Request) { func (a *app) add(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
a.render.Render(ctx, w, department.Edit(ctx, &systemmodel.Department{Sort: 6666})) a.render.Render(ctx, w, department.Edit(ctx, &systemmodel.Department{Sort: 6666}))
} }
func (a *App) addChildren(w http.ResponseWriter, r *http.Request) { func (a *app) addChildren(w http.ResponseWriter, r *http.Request) {
vars := r.URL.Query() vars := r.URL.Query()
parentID := convertor.QueryInt[int32](vars, "parentID", 0) parentID := convertor.QueryInt[int32](vars, "parentID", 0)
vm := &systemmodel.Department{ParentID: parentID, Sort: 6666} vm := &systemmodel.Department{ParentID: parentID, Sort: 6666}
@ -70,7 +70,7 @@ func (a *App) addChildren(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, department.Edit(ctx, vm)) a.render.Render(ctx, w, department.Edit(ctx, vm))
} }
func (a *App) edit(w http.ResponseWriter, r *http.Request) { func (a *app) edit(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
id := convertor.QueryInt[int32](vars, "id", 0) id := convertor.QueryInt[int32](vars, "id", 0)
@ -81,7 +81,7 @@ func (a *App) edit(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, department.Edit(ctx, vm)) a.render.Render(ctx, w, department.Edit(ctx, vm))
} }
func (a *App) save(w http.ResponseWriter, r *http.Request) { func (a *app) save(w http.ResponseWriter, r *http.Request) {
var req form.Department var req form.Department
if err := binding.Form.Bind(r, &req); err != nil { if err := binding.Form.Bind(r, &req); err != nil {
a.render.JSONErr(w, binding.ValidatorErrors(err)) a.render.JSONErr(w, binding.ValidatorErrors(err))
@ -107,7 +107,7 @@ func (a *App) save(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) data(w http.ResponseWriter, r *http.Request) { func (a *app) data(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
t := vars.Get("type") t := vars.Get("type")
@ -130,7 +130,7 @@ func (a *App) data(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) refreshCache(w http.ResponseWriter, r *http.Request) { func (a *app) refreshCache(w http.ResponseWriter, r *http.Request) {
err := a.departmentService.RefreshCache(r.Context()) err := a.departmentService.RefreshCache(r.Context())
if err != nil { if err != nil {
a.render.JSONErr(w, err.Error()) a.render.JSONErr(w, err.Error())
@ -140,7 +140,7 @@ func (a *App) refreshCache(w http.ResponseWriter, r *http.Request) {
a.render.JSONOk(w, "缓存刷新成功") a.render.JSONOk(w, "缓存刷新成功")
} }
func (a *App) rebuildParentPath(w http.ResponseWriter, r *http.Request) { func (a *app) rebuildParentPath(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
err := a.departmentService.RebuildParentPath(ctx) err := a.departmentService.RebuildParentPath(ctx)
if err != nil { if err != nil {

View File

@ -19,7 +19,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Render, cfg.DepartmentService) app := newApp(cfg.Render, cfg.DepartmentService)
r.Route("/department", func(r chi.Router) { r.Route("/department", func(r chi.Router) {
r.Use(mid.Audit(cfg.Sm, cfg.Log)) r.Use(mid.Audit(cfg.Sm, cfg.Log))

View File

@ -9,20 +9,20 @@ import (
"management/internal/pkg/render" "management/internal/pkg/render"
) )
type App struct { type app struct {
render render.Renderer render render.Renderer
userService v1.UserService userService v1.UserService
menuService v1.MenuService menuService v1.MenuService
loginLogService v1.LoginLogService loginLogService v1.LoginLogService
} }
func NewApp( func newApp(
render render.Renderer, render render.Renderer,
userService v1.UserService, userService v1.UserService,
menuService v1.MenuService, menuService v1.MenuService,
loginLogService v1.LoginLogService, loginLogService v1.LoginLogService,
) *App { ) *app {
return &App{ return &app{
render: render, render: render,
userService: userService, userService: userService,
menuService: menuService, menuService: menuService,
@ -30,12 +30,12 @@ func NewApp(
} }
} }
func (a *App) home(w http.ResponseWriter, r *http.Request) { func (a *app) home(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
a.render.Render(ctx, w, home.Home(ctx)) a.render.Render(ctx, w, home.Home(ctx))
} }
func (a *App) dashboard(w http.ResponseWriter, r *http.Request) { func (a *app) dashboard(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
auth := mid.GetUser(ctx) auth := mid.GetUser(ctx)
lt, _ := a.loginLogService.LoginTime(ctx, auth.Email) lt, _ := a.loginLogService.LoginTime(ctx, auth.Email)

View File

@ -18,7 +18,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Render, cfg.UserService, cfg.MenuService, cfg.LoginLogService) app := newApp(cfg.Render, cfg.UserService, cfg.MenuService, cfg.LoginLogService)
r.With(mid.Authorize(cfg.Sm, cfg.MenuService)).Get("/home.html", app.home) r.With(mid.Authorize(cfg.Sm, cfg.MenuService)).Get("/home.html", app.home)
r.With(mid.Authorize(cfg.Sm, cfg.MenuService)).Get("/dashboard", app.dashboard) r.With(mid.Authorize(cfg.Sm, cfg.MenuService)).Get("/dashboard", app.dashboard)

View File

@ -10,19 +10,19 @@ import (
"management/internal/pkg/render" "management/internal/pkg/render"
) )
type App struct { type app struct {
render render.Renderer render render.Renderer
loginLogService v1.LoginLogService loginLogService v1.LoginLogService
} }
func NewApp(render render.Renderer, loginLogService v1.LoginLogService) *App { func newApp(render render.Renderer, loginLogService v1.LoginLogService) *app {
return &App{ return &app{
render: render, render: render,
loginLogService: loginLogService, loginLogService: loginLogService,
} }
} }
func (a *App) list(w http.ResponseWriter, r *http.Request) { func (a *app) list(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
ctx := r.Context() ctx := r.Context()

View File

@ -16,7 +16,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Render, cfg.LoginLogService) app := newApp(cfg.Render, cfg.LoginLogService)
r.Route("/login_log", func(r chi.Router) { r.Route("/login_log", func(r chi.Router) {
r.Get("/list", app.list) r.Get("/list", app.list)

View File

@ -19,19 +19,19 @@ import (
const style = "layui-btn-primary layui-btn-sm" const style = "layui-btn-primary layui-btn-sm"
type App struct { type app struct {
render render.Renderer render render.Renderer
menuService v1.MenuService menuService v1.MenuService
} }
func NewApp(render render.Renderer, menuService v1.MenuService) *App { func newApp(render render.Renderer, menuService v1.MenuService) *app {
return &App{ return &app{
render: render, render: render,
menuService: menuService, menuService: menuService,
} }
} }
func (a *App) menus(w http.ResponseWriter, r *http.Request) { func (a *app) menus(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
user := mid.GetUser(ctx) user := mid.GetUser(ctx)
menus, err := a.menuService.OwerMenus(ctx, user.RoleID) menus, err := a.menuService.OwerMenus(ctx, user.RoleID)
@ -43,7 +43,7 @@ func (a *App) menus(w http.ResponseWriter, r *http.Request) {
a.render.JSON(w, menus) a.render.JSON(w, menus)
} }
func (a *App) list(w http.ResponseWriter, r *http.Request) { func (a *app) list(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
ctx := r.Context() ctx := r.Context()
@ -67,12 +67,12 @@ func (a *App) list(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) add(w http.ResponseWriter, r *http.Request) { func (a *app) add(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
a.render.Render(ctx, w, menu.Edit(ctx, &systemmodel.Menu{Style: style, Visible: true, Sort: 6666})) a.render.Render(ctx, w, menu.Edit(ctx, &systemmodel.Menu{Style: style, Visible: true, Sort: 6666}))
} }
func (a *App) addChildren(w http.ResponseWriter, r *http.Request) { func (a *app) addChildren(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
parentID := convertor.QueryInt[int32](vars, "parentID", 0) parentID := convertor.QueryInt[int32](vars, "parentID", 0)
@ -88,7 +88,7 @@ func (a *App) addChildren(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, menu.Edit(ctx, vm)) a.render.Render(ctx, w, menu.Edit(ctx, vm))
} }
func (a *App) edit(w http.ResponseWriter, r *http.Request) { func (a *app) edit(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
id := convertor.QueryInt[int32](vars, "id", 0) id := convertor.QueryInt[int32](vars, "id", 0)
@ -99,7 +99,7 @@ func (a *App) edit(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, menu.Edit(ctx, vm)) a.render.Render(ctx, w, menu.Edit(ctx, vm))
} }
func (a *App) save(w http.ResponseWriter, r *http.Request) { func (a *app) save(w http.ResponseWriter, r *http.Request) {
id := convertor.ConvertInt[int32](r.PostFormValue("ID"), 0) id := convertor.ConvertInt[int32](r.PostFormValue("ID"), 0)
name := r.PostFormValue("Name") name := r.PostFormValue("Name")
displayName := r.PostFormValue("DisplayName") displayName := r.PostFormValue("DisplayName")
@ -190,7 +190,7 @@ func (a *App) save(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) data(w http.ResponseWriter, r *http.Request) { func (a *app) data(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
t := vars.Get("type") t := vars.Get("type")
@ -216,7 +216,7 @@ func (a *App) data(w http.ResponseWriter, r *http.Request) {
a.render.JSON(w, nil) a.render.JSON(w, nil)
} }
func (a *App) refreshCache(w http.ResponseWriter, r *http.Request) { func (a *app) refreshCache(w http.ResponseWriter, r *http.Request) {
err := a.menuService.RefreshCache(r.Context()) err := a.menuService.RefreshCache(r.Context())
if err != nil { if err != nil {
a.render.JSONErr(w, err.Error()) a.render.JSONErr(w, err.Error())

View File

@ -18,7 +18,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Render, cfg.MenuService) app := newApp(cfg.Render, cfg.MenuService)
r.Get("/menus", app.menus) r.Get("/menus", app.menus)
r.Route("/menu", func(r chi.Router) { r.Route("/menu", func(r chi.Router) {

View File

@ -15,21 +15,21 @@ import (
"management/internal/pkg/render" "management/internal/pkg/render"
) )
type App struct { type app struct {
render render.Renderer render render.Renderer
roleService v1.RoleService roleService v1.RoleService
menuService v1.MenuService menuService v1.MenuService
} }
func NewApp(render render.Renderer, roleService v1.RoleService, menuService v1.MenuService) *App { func newApp(render render.Renderer, roleService v1.RoleService, menuService v1.MenuService) *app {
return &App{ return &app{
render: render, render: render,
roleService: roleService, roleService: roleService,
menuService: menuService, menuService: menuService,
} }
} }
func (a *App) list(w http.ResponseWriter, r *http.Request) { func (a *app) list(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
ctx := r.Context() ctx := r.Context()
@ -61,12 +61,12 @@ func (a *App) list(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) add(w http.ResponseWriter, r *http.Request) { func (a *app) add(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
a.render.Render(ctx, w, role.Edit(ctx, &system.Role{Sort: 6666})) a.render.Render(ctx, w, role.Edit(ctx, &system.Role{Sort: 6666}))
} }
func (a *App) addChildren(w http.ResponseWriter, r *http.Request) { func (a *app) addChildren(w http.ResponseWriter, r *http.Request) {
vars := r.URL.Query() vars := r.URL.Query()
parentID := convertor.QueryInt[int32](vars, "parentID", 0) parentID := convertor.QueryInt[int32](vars, "parentID", 0)
vm := &system.Role{ParentID: parentID, Sort: 6666} vm := &system.Role{ParentID: parentID, Sort: 6666}
@ -74,7 +74,7 @@ func (a *App) addChildren(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, role.Edit(ctx, vm)) a.render.Render(ctx, w, role.Edit(ctx, vm))
} }
func (a *App) edit(w http.ResponseWriter, r *http.Request) { func (a *app) edit(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
id := convertor.QueryInt[int32](vars, "id", 0) id := convertor.QueryInt[int32](vars, "id", 0)
@ -85,7 +85,7 @@ func (a *App) edit(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, role.Edit(ctx, vm)) a.render.Render(ctx, w, role.Edit(ctx, vm))
} }
func (a *App) save(w http.ResponseWriter, r *http.Request) { func (a *app) save(w http.ResponseWriter, r *http.Request) {
var req form.Role var req form.Role
if err := binding.Form.Bind(r, &req); err != nil { if err := binding.Form.Bind(r, &req); err != nil {
a.render.JSONErr(w, binding.ValidatorErrors(err)) a.render.JSONErr(w, binding.ValidatorErrors(err))
@ -110,7 +110,7 @@ func (a *App) save(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) data(w http.ResponseWriter, r *http.Request) { func (a *app) data(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
t := vars.Get("type") t := vars.Get("type")
@ -131,7 +131,7 @@ func (a *App) data(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) refreshCache(w http.ResponseWriter, r *http.Request) { func (a *app) refreshCache(w http.ResponseWriter, r *http.Request) {
err := a.roleService.RefreshCache(r.Context()) err := a.roleService.RefreshCache(r.Context())
if err != nil { if err != nil {
a.render.JSONErr(w, err.Error()) a.render.JSONErr(w, err.Error())
@ -141,7 +141,7 @@ func (a *App) refreshCache(w http.ResponseWriter, r *http.Request) {
a.render.JSONOk(w, "缓存刷新成功") a.render.JSONOk(w, "缓存刷新成功")
} }
func (a *App) rebuildParentPath(w http.ResponseWriter, r *http.Request) { func (a *app) rebuildParentPath(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
err := a.roleService.RebuildParentPath(ctx) err := a.roleService.RebuildParentPath(ctx)
if err != nil { if err != nil {
@ -152,7 +152,7 @@ func (a *App) rebuildParentPath(w http.ResponseWriter, r *http.Request) {
a.render.JSONOk(w, "重建成功") a.render.JSONOk(w, "重建成功")
} }
func (a *App) refreshRoleMenus(w http.ResponseWriter, r *http.Request) { func (a *app) refreshRoleMenus(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
// 获取需要刷新的角色ID // 获取需要刷新的角色ID
@ -191,7 +191,7 @@ func (a *App) refreshRoleMenus(w http.ResponseWriter, r *http.Request) {
a.render.JSONOk(w, "刷新成功") a.render.JSONOk(w, "刷新成功")
} }
func (a *App) setMenu(w http.ResponseWriter, r *http.Request) { func (a *app) setMenu(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
vars := r.URL.Query() vars := r.URL.Query()

View File

@ -19,7 +19,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp(cfg.Render, cfg.RoleService, cfg.MenuService) app := newApp(cfg.Render, cfg.RoleService, cfg.MenuService)
r.Route("/role", func(r chi.Router) { r.Route("/role", func(r chi.Router) {
r.Use(mid.Audit(cfg.Sm, cfg.Log)) r.Use(mid.Audit(cfg.Sm, cfg.Log))

View File

@ -21,7 +21,7 @@ type Config struct {
} }
func Routes(r chi.Router, cfg Config) { func Routes(r chi.Router, cfg Config) {
app := NewApp( app := newApp(
cfg.Log, cfg.Log,
cfg.Sm, cfg.Sm,
cfg.Render, cfg.Render,

View File

@ -17,7 +17,7 @@ import (
"github.com/drhin/logger" "github.com/drhin/logger"
) )
type App struct { type app struct {
log *logger.Logger log *logger.Logger
sm session.Manager sm session.Manager
render render.Renderer render render.Renderer
@ -26,15 +26,15 @@ type App struct {
departmentService v1.DepartmentService departmentService v1.DepartmentService
} }
func NewApp( func newApp(
log *logger.Logger, log *logger.Logger,
sm session.Manager, sm session.Manager,
render render.Renderer, render render.Renderer,
userService v1.UserService, userService v1.UserService,
roleService v1.RoleService, roleService v1.RoleService,
departmentService v1.DepartmentService, departmentService v1.DepartmentService,
) *App { ) *app {
return &App{ return &app{
log: log, log: log,
sm: sm, sm: sm,
render: render, render: render,
@ -44,12 +44,12 @@ func NewApp(
} }
} }
func (a *App) add(w http.ResponseWriter, r *http.Request) { func (a *app) add(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
a.render.Render(ctx, w, user.Edit(ctx, &systemmodel.User{HashedPassword: nil})) a.render.Render(ctx, w, user.Edit(ctx, &systemmodel.User{HashedPassword: nil}))
} }
func (a *App) edit(w http.ResponseWriter, r *http.Request) { func (a *app) edit(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
vars := r.URL.Query() vars := r.URL.Query()
id := convertor.QueryInt[int32](vars, "id", 0) id := convertor.QueryInt[int32](vars, "id", 0)
@ -63,7 +63,7 @@ func (a *App) edit(w http.ResponseWriter, r *http.Request) {
a.render.Render(ctx, w, user.Edit(ctx, vm)) a.render.Render(ctx, w, user.Edit(ctx, vm))
} }
func (a *App) save(w http.ResponseWriter, r *http.Request) { func (a *app) save(w http.ResponseWriter, r *http.Request) {
var req form.User var req form.User
if err := binding.Form.Bind(r, &req); err != nil { if err := binding.Form.Bind(r, &req); err != nil {
a.render.JSONErr(w, binding.ValidatorErrors(err)) a.render.JSONErr(w, binding.ValidatorErrors(err))
@ -103,7 +103,7 @@ func (a *App) save(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) list(w http.ResponseWriter, r *http.Request) { func (a *app) list(w http.ResponseWriter, r *http.Request) {
switch r.Method { switch r.Method {
case http.MethodGet: case http.MethodGet:
ctx := r.Context() ctx := r.Context()
@ -135,14 +135,14 @@ func (a *App) list(w http.ResponseWriter, r *http.Request) {
} }
} }
func (a *App) profile(w http.ResponseWriter, r *http.Request) { func (a *app) profile(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
u := mid.GetUser(ctx) u := mid.GetUser(ctx)
vm, _ := a.userService.Get(ctx, u.ID) vm, _ := a.userService.Get(ctx, u.ID)
a.render.Render(ctx, w, user.Profile(ctx, vm)) a.render.Render(ctx, w, user.Profile(ctx, vm))
} }
func (a *App) data(w http.ResponseWriter, r *http.Request) { func (a *app) data(w http.ResponseWriter, r *http.Request) {
vars := r.URL.Query() vars := r.URL.Query()
t := vars.Get("type") t := vars.Get("type")
if t == "xm_select" { if t == "xm_select" {

View File

@ -65,7 +65,7 @@ var PearJson = &dto.PearConfig{
}, },
}, },
Other: dto.Other{ Other: dto.Other{
KeepLoad: "200", KeepLoad: "100",
AutoHead: false, AutoHead: false,
Footer: false, Footer: false,
}, },

View File

@ -17,12 +17,15 @@ const redisTimeout = 200 * time.Millisecond
type RedisStore struct { type RedisStore struct {
// 内嵌 go-redis 客户端 // 内嵌 go-redis 客户端
client *redis.Client client *redis.Client
// 存储键前缀
prefix string
} }
// NewRedisStore 是 RedisStore 的构造函数。 // NewRedisStore 是 RedisStore 的构造函数。
func NewRedisStore(client *redis.Client) *RedisStore { func NewRedisStore(client *redis.Client, prefix string) *RedisStore {
return &RedisStore{ return &RedisStore{
client: client, client: client,
prefix: prefix,
} }
} }
@ -34,6 +37,8 @@ func (s *RedisStore) Find(token string) ([]byte, bool, error) {
// ✅ 必须: 无论函数如何返回,都调用 cancel() 来释放上下文资源 // ✅ 必须: 无论函数如何返回,都调用 cancel() 来释放上下文资源
defer cancel() defer cancel()
token = s.prefix + token
// 使用 go-redis 的 Get 方法 // 使用 go-redis 的 Get 方法
data, err := s.client.Get(ctx, token).Bytes() data, err := s.client.Get(ctx, token).Bytes()
if err != nil { if err != nil {
@ -59,6 +64,8 @@ func (s *RedisStore) Commit(token string, b []byte, expiry time.Time) error {
// time.Until(expiry) 会计算出当前时间到 expiry 之间的时间差 // time.Until(expiry) 会计算出当前时间到 expiry 之间的时间差
ttl := time.Until(expiry) ttl := time.Until(expiry)
token = s.prefix + token
// 使用 go-redis 的 Set 方法,并设置过期时间 // 使用 go-redis 的 Set 方法,并设置过期时间
// 如果 expiry 时间已经过去ttl 会是负数Redis 会立即删除这个 key这正是我们期望的行为。 // 如果 expiry 时间已经过去ttl 会是负数Redis 会立即删除这个 key这正是我们期望的行为。
err := s.client.Set(ctx, token, b, ttl).Err() err := s.client.Set(ctx, token, b, ttl).Err()
@ -76,6 +83,8 @@ func (s *RedisStore) Delete(token string) error {
// ✅ 必须: 无论函数如何返回,都调用 cancel() 来释放上下文资源 // ✅ 必须: 无论函数如何返回,都调用 cancel() 来释放上下文资源
defer cancel() defer cancel()
token = s.prefix + token
// 使用 go-redis 的 Del 方法 // 使用 go-redis 的 Del 方法
err := s.client.Del(ctx, token).Err() err := s.client.Del(ctx, token).Err()
if err != nil { if err != nil {

View File

@ -51,7 +51,8 @@ func NewSCSManager(client *redis.Client, conf *config.Config) (Manager, error) {
// github.com/alexedwards/scs/pgxstore // github.com/alexedwards/scs/pgxstore
// sessionManager.Store = pgxstore.New(pool) // sessionManager.Store = pgxstore.New(pool)
// redis // redis
sessionManager.Store = NewRedisStore(client) prefix := "m:scs:"
sessionManager.Store = NewRedisStore(client, prefix)
return &SCSSession{manager: sessionManager}, nil return &SCSSession{manager: sessionManager}, nil
} }

View File

@ -1,5 +1,6 @@
# start manage # start manage
**/*.go **/**/**/*.tmpl **/**/**/**/*.tmpl !web/*.go !**/*_test.go { **/*.go **/**/**/*.tmpl **/**/**/**/*.tmpl !web/*.go !**/*_test.go {
prep: make templ
prep: go build -o ./management . prep: go build -o ./management .
daemon +sigterm: ./management erp -c configs/config.dev.yaml daemon +sigterm: ./management erp -c configs/config.dev.yaml
} }