sync: 对齐小程序 v1.0.2 生产代码并脱敏

This commit is contained in:
MiFaZhan
2026-10-29 15:15:12 +08:00
parent a7abd476f0
commit 5fcf74deb0
423 changed files with 15001 additions and 6382 deletions
+7 -7
View File
@@ -1,13 +1,16 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
import (
"context"
"errors"
"slices"
"strings"
"time"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/bcache"
@@ -18,9 +21,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/request"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-app/utility"
"slices"
"strings"
"time"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
@@ -141,7 +141,7 @@ func (s *sSysAuth) GenerateToken(ctx context.Context, user *model.LoginUserOut)
ets := g.Cfg().MustGet(ctx, "jwt.expiresTime", "7d").String()
bts := g.Cfg().MustGet(ctx, "jwt.bufferTime", "1d").String()
iss := g.Cfg().MustGet(ctx, "jwt.issuer", "XiuAdmin").String()
sk := g.Cfg().MustGet(ctx, "jwt.signingKey", "${JWT_SIGNING_KEY}").String()
sk := g.Cfg().MustGet(ctx, "jwt.signingKey", "39c54195e73304e74a8429b178965865").String()
et, _ := utility.ParseDuration(ets)
bt, _ := utility.ParseDuration(bts)
g.Log().Infof(ctx, "sSysAuth.GenerateToken 生成Token: user:%+v, et:%s, bt:%s, iss:%s, sk:%s", user, et, bt, iss, sk)
@@ -211,7 +211,7 @@ func (s *sSysAuth) GenerateToken(ctx context.Context, user *model.LoginUserOut)
// 解析Token
func (s *sSysAuth) ParseToken(ctx context.Context, token string) (claims *model.CustomClaims, err error) {
sk := g.Cfg().MustGet(ctx, "jwt.signingKey", "${JWT_SIGNING_KEY}").String()
sk := g.Cfg().MustGet(ctx, "jwt.signingKey", "39c54195e73304e74a8429b178965865").String()
t, err := jwt.ParseWithClaims(token, &model.CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(sk), nil
})
@@ -233,7 +233,7 @@ func (s *sSysAuth) ParseToken(ctx context.Context, token string) (claims *model.
// 删除Token
func (s *sSysAuth) DeleteToken(ctx context.Context, token string) (err error) {
sk := g.Cfg().MustGet(ctx, "jwt.signingKey", "${JWT_SIGNING_KEY}").String()
sk := g.Cfg().MustGet(ctx, "jwt.signingKey", "39c54195e73304e74a8429b178965865").String()
t, err := jwt.ParseWithClaims(token, &model.CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(sk), nil
})
+2 -2
View File
@@ -1,15 +1,15 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
import (
"context"
"time"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"time"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
+1 -1
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+1 -1
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+1 -1
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+63 -28
View File
@@ -1,47 +1,82 @@
// package system_test
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system_test
import (
"context"
"fmt"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"testing"
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
_ "git.5iot.com/iotlcm-public/iotlcm-app/internal/logic/memorydb"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func init() {
// 数据库只读,不执行
// g.DB().SetDryRun(true)
g.DB().SetDebug(true)
testing.Init()
type deptTestMemoryDB struct {
service.IMemoryDB
database gdb.DB
}
func (memory *deptTestMemoryDB) DB(ctx context.Context) gdb.DB {
return memory.database
}
func TestSysDept_RefreshDeptAncestors(t *testing.T) {
// 设置上下文用户身份为用户
ctx := context.WithValue(gctx.New(), consts.ContextKey, &model.Context{
// 为了测试只设置了hook中需要用到的数据
User: &model.Identity{
BaseClaims: model.BaseClaims{
ID: 1,
TenantId: "000000",
DeptId: 1,
},
},
})
err := service.SysDept().RefreshDeptAncestors(ctx)
if err != nil {
var (
ctx = contexts.Set(context.Background(), &model.Context{
User: &model.Identity{BaseClaims: model.BaseClaims{ID: 1, TenantId: "A", DeptId: 1}},
})
previous = gdb.GetConfig("default")
previousMemory = service.MemoryDB()
)
if err := gdb.SetConfigGroup("default", gdb.ConfigGroup{{Type: "sqlite", Link: "sqlite::@file(:memory:)", MaxOpenConnCount: 1}}); err != nil {
t.Fatal(err)
}
fmt.Println("RefreshDeptAncestors success")
database := g.DB()
service.RegisterMemoryDB(&deptTestMemoryDB{database: database})
t.Cleanup(func() {
service.RegisterMemoryDB(previousMemory)
if err := database.GetCore().ClearCacheAll(ctx); err != nil {
t.Error(err)
}
if err := database.Close(ctx); err != nil {
t.Error(err)
}
if err := gdb.SetConfigGroup("default", previous); err != nil {
t.Error(err)
}
})
if err := database.GetCore().ClearCacheAll(ctx); err != nil {
t.Fatal(err)
}
statements := []string{
"CREATE TABLE sys_dept (dept_id INTEGER PRIMARY KEY, parent_id INTEGER, tenant_id TEXT, ancestors TEXT, updated_at DATETIME, deleted_at DATETIME)",
"INSERT INTO sys_dept VALUES (1,0,'A','wrong',NULL,NULL),(2,1,'A','wrong',NULL,NULL),(3,2,'A','wrong',NULL,NULL),(4,1,'B','other-tenant',NULL,NULL),(5,1,'A','deleted',NULL,'2026-01-01')",
}
for _, statement := range statements {
if _, err := database.Exec(ctx, statement); err != nil {
t.Fatal(err)
}
}
for attempt := 0; attempt < 2; attempt++ {
if err := service.SysDept().RefreshDeptAncestors(ctx); err != nil {
t.Fatal(err)
}
for deptID, expected := range map[int]string{1: "0,", 2: "0,1,", 3: "0,1,2,", 4: "other-tenant", 5: "deleted"} {
actual, err := database.GetValue(ctx, "SELECT ancestors FROM sys_dept WHERE dept_id = ?", deptID)
if err != nil {
t.Fatal(err)
}
if actual.String() != expected {
t.Fatalf("attempt=%d, dept=%d, ancestors=%q, expected=%q", attempt, deptID, actual.String(), expected)
}
}
}
}
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -9,6 +9,7 @@ import (
"context"
"errors"
"fmt"
"strings"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
@@ -18,7 +19,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"strings"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
+1 -1
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+4 -4
View File
@@ -1,13 +1,16 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
import (
"context"
"fmt"
"slices"
"sort"
"strings"
v1 "git.5iot.com/iotlcm-public/iotlcm-app/api/system/v1"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
@@ -18,9 +21,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"slices"
"sort"
"strings"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gcode"
+1 -1
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -1,7 +1,7 @@
// Package gen
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package system
+2 -2
View File
@@ -1,12 +1,13 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
import (
"context"
"strings"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/mcache"
@@ -15,7 +16,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/request"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-app/utility"
"strings"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gcode"
+17 -8
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -9,6 +9,12 @@ import (
"context"
"errors"
"fmt"
"mime"
"net/http"
"os"
"path/filepath"
"strings"
"time"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
@@ -19,12 +25,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/request"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-app/utility/hash"
"mime"
"net/http"
"os"
"path/filepath"
"strings"
"time"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/database/gdb"
@@ -439,6 +439,16 @@ func (s *sSysOss) buildLocalFileURL(ctx context.Context, fullFilePath string) st
if fullFilePath == "" {
return ""
}
uploadPath := strings.TrimSpace(g.Cfg().MustGet(ctx, "system.upload.local.path").String())
publicURL := strings.TrimSpace(os.Getenv("IOTLCM_UPLOAD_PUBLIC_URL"))
if publicURL == "" {
publicURL = strings.TrimSpace(g.Cfg().MustGet(ctx, "system.upload.local.publicUrl", "").String())
}
if publicURL != "" {
if fileURL, ok := localFileURLByBase(fullFilePath, uploadPath, publicURL); ok {
return fileURL
}
}
configValue := ""
configType, err := service.SysConfig().GetConfigByKey(ctx, consts.ConfigOssUrlPath)
if err == nil && configType != nil {
@@ -448,7 +458,6 @@ func (s *sSysOss) buildLocalFileURL(ctx context.Context, fullFilePath string) st
return url
}
uploadPath := strings.TrimSpace(g.Cfg().MustGet(ctx, "system.upload.local.path").String())
baseURL := localFileURLFallbackBase(configValue)
if baseURL != "" {
if url, ok := localFileURLByBase(fullFilePath, uploadPath, baseURL); ok {
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -5,8 +5,58 @@ import (
"os"
"path/filepath"
"testing"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcfg"
)
func TestLocalFileURLUsesConfiguredPublicURL(t *testing.T) {
t.Setenv("IOTLCM_UPLOAD_PUBLIC_URL", "")
previous := g.Cfg().GetAdapter()
t.Cleanup(func() { g.Cfg().SetAdapter(previous) })
cases := []struct {
name string
root string
base string
file string
want string
}{
{"本地跨端预览", "resource/upload", "http://localhost:8010/upload/", "resource/upload/000000/user/file/photo.jpeg", "http://localhost:8010/upload/000000/user/file/photo.jpeg"},
{"独立部署前缀", "/data/app/upload", "https://files.example.com/app/upload", "/data/app/upload/000000/user/file/photo.jpeg", "https://files.example.com/app/upload/000000/user/file/photo.jpeg"},
{"Windows共享目录", "F:/shared/upload", "https://files.example.com/upload", "F:/shared/upload/000000/user/file/photo.jpeg", "https://files.example.com/upload/000000/user/file/photo.jpeg"},
}
for _, testCase := range cases {
t.Run(testCase.name, func(t *testing.T) {
adapter, err := gcfg.NewAdapterContent(
"system:\n upload:\n local:\n path: " + testCase.root + "\n publicUrl: " + testCase.base + "\n",
)
if err != nil {
t.Fatal(err)
}
g.Cfg().SetAdapter(adapter)
got := NewSysOss().buildLocalFileURL(context.Background(), testCase.file)
if got != testCase.want {
t.Fatalf("url = %q, want %q", got, testCase.want)
}
})
}
}
func TestLocalFileURLUsesEnvironmentOverride(t *testing.T) {
t.Setenv("IOTLCM_UPLOAD_PUBLIC_URL", "http://localhost:8010/upload")
previous := g.Cfg().GetAdapter()
t.Cleanup(func() { g.Cfg().SetAdapter(previous) })
adapter, err := gcfg.NewAdapterContent("system:\n upload:\n local:\n path: resource/upload\n publicUrl: https://files.example.com/upload\n")
if err != nil {
t.Fatal(err)
}
g.Cfg().SetAdapter(adapter)
got := NewSysOss().buildLocalFileURL(context.Background(), "resource/upload/000000/photo.jpeg")
if got != "http://localhost:8010/upload/000000/photo.jpeg" {
t.Fatalf("environment override did not take precedence: %q", got)
}
}
func TestResolveLocalOssPathFromProjectRoot(t *testing.T) {
tempDir := t.TempDir()
relativePath := filepath.FromSlash("resource/upload/000000/user/file/test.xlsx")
@@ -49,13 +99,13 @@ func TestAppOssDownloadContentTypeXlsx(t *testing.T) {
func TestLocalFileURLByMappingWithProductionUploadPath(t *testing.T) {
filePath := "/data/app/iotlcmadmin-web-svc/upload/000000/user/file/20260710/sim-card-renew/result/REN-result.xlsx"
configValue := "/data/app/iotlcmadmin-web-svc/upload|http://iotlcm.example.com:8008/upload"
configValue := "/data/app/iotlcmadmin-web-svc/upload|http://example.com:8008/upload"
got, ok := localFileURLByMapping(filePath, configValue)
if !ok {
t.Fatal("expected production upload path mapping to match")
}
want := "http://iotlcm.example.com:8008/upload/000000/user/file/20260710/sim-card-renew/result/REN-result.xlsx"
want := "http://example.com:8008/upload/000000/user/file/20260710/sim-card-renew/result/REN-result.xlsx"
if got != want {
t.Fatalf("url = %q, want %q", got, want)
}
@@ -63,11 +113,11 @@ func TestLocalFileURLByMappingWithProductionUploadPath(t *testing.T) {
func TestLocalFileURLByBaseWithProductionUploadPath(t *testing.T) {
filePath := "/data/app/iotlcmadmin-web-svc/upload/000000/user/file/20260710/sim-card-renew/import/REN-import.xlsx"
got, ok := localFileURLByBase(filePath, "/data/app/iotlcmadmin-web-svc/upload", "http://iotlcm.example.com:8008/upload")
got, ok := localFileURLByBase(filePath, "/data/app/iotlcmadmin-web-svc/upload", "http://example.com:8008/upload")
if !ok {
t.Fatal("expected upload path base mapping to match")
}
want := "http://iotlcm.example.com:8008/upload/000000/user/file/20260710/sim-card-renew/import/REN-import.xlsx"
want := "http://example.com:8008/upload/000000/user/file/20260710/sim-card-renew/import/REN-import.xlsx"
if got != want {
t.Fatalf("url = %q, want %q", got, want)
}
+1 -1
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+3 -3
View File
@@ -8,6 +8,9 @@ import (
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
"time"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
@@ -15,9 +18,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/request"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"strconv"
"strings"
"time"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/errors/gerror"
+2 -2
View File
@@ -1,12 +1,13 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
import (
"context"
"slices"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
@@ -17,7 +18,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-app/utility"
"slices"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
+1 -1
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+4 -4
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -10,6 +10,8 @@ import (
"database/sql"
"errors"
"fmt"
"slices"
"strings"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
@@ -20,8 +22,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-app/utility"
"slices"
"strings"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
@@ -445,7 +445,7 @@ func (l *sSysTenant) BatchInsertSysParam(ctx context.Context, tx gdb.TX, tenantI
TenantId: tenantId,
ConfigName: "上传文件Url路径",
ConfigKey: "sys.oss.urlPath",
ConfigValue: "/data/app/iotlcmadmin-web-svc/upload|http://iotlcm.example.com:8008/upload",
ConfigValue: "/data/app/iotlcmadmin-web-svc/upload|http://example.com:8008/upload",
ConfigType: "Y",
CreatedDept: createdDept,
CreatedBy: createdBy,
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+2 -2
View File
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
@@ -9,6 +9,7 @@ import (
"context"
"errors"
"fmt"
"slices"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
@@ -20,7 +21,6 @@ import (
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/request"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-app/utility"
"slices"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
@@ -1,7 +1,7 @@
// package system
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system
+41 -17
View File
@@ -1,37 +1,28 @@
// package system_test
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <li@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system_test
import (
"context"
"fmt"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
"testing"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/contexts"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
"testing"
"git.5iot.com/iotlcm-public/iotlcm-app/utility"
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gtime"
)
func init() {
// 数据库只读,不执行
// g.DB().SetDryRun(true)
g.DB().SetDebug(true)
testing.Init()
}
func TestSysUser_UpdateUserPassword(t *testing.T) {
// 设置上下文用户身份为用户
ctx := context.WithValue(gctx.New(), consts.ContextKey, &model.Context{
ctx := contexts.Set(gctx.New(), &model.Context{
// 为了测试只设置了hook中需要用到的数据
User: &model.Identity{
BaseClaims: model.BaseClaims{
@@ -41,6 +32,33 @@ func TestSysUser_UpdateUserPassword(t *testing.T) {
},
},
})
previous := gdb.GetConfig("default")
if err := gdb.SetConfigGroup("default", gdb.ConfigGroup{{Type: "sqlite", Link: "sqlite::@file(:memory:)", MaxOpenConnCount: 1}}); err != nil {
t.Fatal(err)
}
database := g.DB()
t.Cleanup(func() {
if err := database.GetCore().ClearCacheAll(ctx); err != nil {
t.Error(err)
}
if err := database.Close(ctx); err != nil {
t.Error(err)
}
if err := gdb.SetConfigGroup("default", previous); err != nil {
t.Error(err)
}
})
if err := database.GetCore().ClearCacheAll(ctx); err != nil {
t.Fatal(err)
}
for _, statement := range []string{
"CREATE TABLE sys_user (user_id INTEGER PRIMARY KEY, password TEXT, salt TEXT, updated_by INTEGER, updated_at DATETIME, tenant_id TEXT)",
"INSERT INTO sys_user VALUES (1,'old','old',0,NULL,'000000'),(2,'unchanged','unchanged',0,NULL,'000000')",
} {
if _, err := database.Exec(ctx, statement); err != nil {
t.Fatal(err)
}
}
newPassword := "123456"
salt := "123456"
password := utility.PasswordEncrypt(utility.Md5(newPassword), salt)
@@ -48,11 +66,17 @@ func TestSysUser_UpdateUserPassword(t *testing.T) {
Password: password,
Salt: salt,
UpdatedBy: 1,
UpdatedAt: gtime.Now(),
}
_, err := dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().UserId, 1).Data(data).OmitEmpty().Update()
if err != nil {
t.Fatal(err)
}
fmt.Println("UpdateUserPassword success")
actual, err := database.GetValue(ctx, "SELECT password FROM sys_user WHERE user_id = 1")
if err != nil || actual.String() != password {
t.Fatalf("password=%v, error=%v", actual, err)
}
unchanged, err := database.GetValue(ctx, "SELECT password FROM sys_user WHERE user_id = 2")
if err != nil || unchanged.String() != "unchanged" {
t.Fatalf("unrelated user changed: password=%v, error=%v", unchanged, err)
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
// // package system_test
// // @Link https://github.com/xiujiecn/xiu-admin
// // @Copyright Copyright (c) 2025 LiXiujie
// // @Author Lxj <li@xiujie.cn>
// // @Author Lxj <li@example.com>
// // @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package system_test