Skip to content

Commit 1f5b7da

Browse files
author
yangtao
committed
feat: start show version && support reset password command
1 parent 0b91333 commit 1f5b7da

3 files changed

Lines changed: 85 additions & 3 deletions

File tree

Dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ RUN pnpm prune --prod
2424

2525
# ========= Go 构建阶段 =========
2626
FROM golang:1.21-alpine AS backend-builder
27+
ARG VERSION=dev
2728
WORKDIR /app
2829

2930
# 安装编译依赖
@@ -39,8 +40,8 @@ COPY --from=frontend-builder /app .
3940
# 启用 CGO
4041
ENV CGO_ENABLED=1
4142

42-
# 编译 Backend 可执行文件
43-
RUN go build -ldflags "-s -w" -o server ./cmd/server
43+
# 编译 Backend 可执行文件,注入版本号
44+
RUN go build -ldflags "-s -w -X main.Version=${VERSION}" -o server ./cmd/server
4445

4546
# ========= 运行阶段 =========
4647
ARG VERSION=dev

cmd/server/main.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"context"
55
"database/sql"
6+
"flag"
67
"log"
78
"net/http"
89
"os"
@@ -22,7 +23,30 @@ import (
2223
_ "github.com/mattn/go-sqlite3"
2324
)
2425

26+
// Version 会在构建时通过 -ldflags "-X main.Version=xxx" 注入
27+
var Version = "dev"
28+
2529
func main() {
30+
// 命令行参数处理
31+
resetPwdCmd := flag.Bool("resetpwd", false, "重置管理员密码")
32+
flag.Parse()
33+
34+
// 如果指定了 --resetpwd,则进入密码重置流程后退出
35+
if *resetPwdCmd {
36+
// 打开数据库
37+
db, err := sql.Open("sqlite3", "./public/sqlite.db")
38+
if err != nil {
39+
log.Fatalf("连接数据库失败: %v", err)
40+
}
41+
defer db.Close()
42+
43+
authService := auth.NewService(db)
44+
if _, _, err := authService.ResetAdminPassword(); err != nil {
45+
log.Fatalf("重置密码失败: %v", err)
46+
}
47+
return
48+
}
49+
2650
// 打开数据库连接
2751
db, err := sql.Open("sqlite3", "./public/sqlite.db")
2852
if err != nil {
@@ -103,7 +127,7 @@ func main() {
103127

104128
// 启动HTTP服务器
105129
go func() {
106-
log.Printf("服务器启动在 http://localhost:3000")
130+
log.Printf("NodePassDash %s 启动在 http://localhost:3000", Version)
107131
if err := server.ListenAndServe(); err != http.ErrServerClosed {
108132
log.Fatalf("HTTP服务器错误: %v", err)
109133
}

internal/auth/service.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ func (s *Service) ChangePassword(username, currentPassword, newPassword string)
301301
return false, "更新密码失败"
302302
}
303303

304+
// 使所有现有 Session 失效
305+
s.invalidateAllSessions()
304306
return true, "密码修改成功"
305307
}
306308

@@ -329,5 +331,60 @@ func (s *Service) ChangeUsername(currentUsername, newUsername string) (bool, str
329331
return true
330332
})
331333

334+
// 使所有现有 Session 失效
335+
s.invalidateAllSessions()
332336
return true, "用户名修改成功"
333337
}
338+
339+
// ResetAdminPassword 重置管理员密码并返回新密码
340+
func (s *Service) ResetAdminPassword() (string, string, error) {
341+
// 确认系统已初始化
342+
initialized := s.IsSystemInitialized()
343+
if !initialized {
344+
return "", "", errors.New("系统未初始化,无法重置密码")
345+
}
346+
347+
// 读取当前用户名
348+
username, err := s.GetSystemConfig(ConfigKeyAdminUsername)
349+
if err != nil || username == "" {
350+
username = "nodepass"
351+
}
352+
353+
// 生成新密码
354+
newPassword := generateRandomPassword(12)
355+
hash, err := s.HashPassword(newPassword)
356+
if err != nil {
357+
return "", "", err
358+
}
359+
360+
// 更新配置
361+
if err := s.SetSystemConfig(ConfigKeyAdminPassword, hash, "管理员密码哈希"); err != nil {
362+
return "", "", err
363+
}
364+
365+
// 使所有现有 Session 失效
366+
s.invalidateAllSessions()
367+
368+
// 输出提示
369+
fmt.Println("================================")
370+
fmt.Println("🔐 NodePass 管理员密码已重置!")
371+
fmt.Println("================================")
372+
fmt.Println("用户名:", username)
373+
fmt.Println("新密码:", newPassword)
374+
fmt.Println("================================")
375+
fmt.Println("⚠️ 请尽快登录并修改此密码!")
376+
fmt.Println("================================")
377+
378+
return username, newPassword, nil
379+
}
380+
381+
// invalidateAllSessions 使所有会话失效(数据库 + 缓存)
382+
func (s *Service) invalidateAllSessions() {
383+
// 更新数据库会话状态
384+
_, _ = s.db.Exec(`UPDATE "UserSession" SET isActive = 0`)
385+
// 清空缓存
386+
sessionCache.Range(func(key, value interface{}) bool {
387+
sessionCache.Delete(key)
388+
return true
389+
})
390+
}

0 commit comments

Comments
 (0)