Баннер режима разработки в шапке с личным выключателем
Пока лицензия разрешает режим разработки, в шапке висит баннер; нажатие выключает режим визуально для этого пользователя и включает обратно. В шаблонах .DevMode заменён на devOn. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
package lkgateway
|
||||
|
||||
// devbanner.go — баннер режима разработки в шапке.
|
||||
//
|
||||
// Режим разработки разрешает сервер лицензий (dev_until в ключе). Пока он разрешён, в
|
||||
// шапке висит баннер; нажатие на него выключает режим визуально для этого пользователя
|
||||
// (служебные разделы прячутся, имитации не показываются) и включает обратно. Это личная
|
||||
// настройка сотрудника, а не состояние системы: лицензия по-прежнему разрешает режим.
|
||||
// Когда лицензия режим не разрешает, баннера нет и выключатель ни на что не влияет.
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// devOff — пользователи, выключившие режим разработки у себя (по логину; без
|
||||
// авторизации — пустой логин). Хранится в памяти: после перезапуска режим снова включён.
|
||||
var devOff = struct {
|
||||
mu sync.Mutex
|
||||
m map[string]bool
|
||||
}{m: map[string]bool{}}
|
||||
|
||||
func devUserKey(u *User) string {
|
||||
if u == nil {
|
||||
return ""
|
||||
}
|
||||
return u.Login
|
||||
}
|
||||
|
||||
// devOnFor — режим разработки действует для пользователя: разрешён лицензией и не выключен им.
|
||||
func devOnFor(u *User) bool {
|
||||
if !devMode(globalRC) {
|
||||
return false
|
||||
}
|
||||
devOff.mu.Lock()
|
||||
defer devOff.mu.Unlock()
|
||||
return !devOff.m[devUserKey(u)]
|
||||
}
|
||||
|
||||
// devToggle — POST /admin/dev-toggle: переключить режим у себя и вернуться на ту же страницу.
|
||||
func devToggle(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodPost {
|
||||
http.Error(w, "method", http.StatusMethodNotAllowed)
|
||||
return
|
||||
}
|
||||
if devMode(globalRC) {
|
||||
key := devUserKey(currentUser(w))
|
||||
devOff.mu.Lock()
|
||||
devOff.m[key] = !devOff.m[key]
|
||||
devOff.mu.Unlock()
|
||||
}
|
||||
dest := safeReturnPath(r.FormValue("return_to"))
|
||||
if dest == "" {
|
||||
dest = "/admin"
|
||||
}
|
||||
http.Redirect(w, r, dest, http.StatusSeeOther)
|
||||
}
|
||||
Reference in New Issue
Block a user