优化结构

This commit is contained in:
Yvan 2026-08-21 10:28:30 +08:00
parent 5a548e0725
commit 56980c8087
9 changed files with 17 additions and 17 deletions

4
.gitignore vendored
View File

@ -31,7 +31,7 @@ Thumbs.db
*.key *.key
*.log *.log
bin/ bin/
/cmd/kratos-admin/kratos-admin /bin/kratos-admin
# Develop tools # Develop tools
.vscode/ .vscode/
@ -41,4 +41,4 @@ bin/
web/dist/ web/dist/
web/node_modules/ web/node_modules/
.pnpm-store/ .pnpm-store/

View File

@ -21,7 +21,7 @@ api:
.PHONY: build .PHONY: build
# build # build
build: build:
mkdir -p bin/ && go build -ldflags "-X main.Version=$(VERSION)" -o ./bin/ ./... mkdir -p bin/ && go build -ldflags "-X main.Version=$(VERSION)" -o ./bin/kratos-admin ./cmd
.PHONY: generate .PHONY: generate
# generate # generate

View File

@ -5,7 +5,7 @@ Kra 是基于 Kratos 生命周期与 Wire 依赖注入、使用 Gin 提供管理
## 目录 ## 目录
```text ```text
cmd/kratos-admin/ 服务入口与 Wire cmd/ 服务入口与 Wire
configs/ 运行配置 configs/ 运行配置
internal/biz/ 领域对象、用例和仓储接口 internal/biz/ 领域对象、用例和仓储接口
internal/data/ 数据库、缓存、对象存储及仓储实现 internal/data/ 数据库、缓存、对象存储及仓储实现
@ -20,7 +20,7 @@ web/ Vue 管理端
先修改 `configs/config.yaml`。首次启动时,如果目标数据库不可用,服务会保留初始化接口;在管理端初始化页面完成建库、建表和种子数据写入后即可登录。 先修改 `configs/config.yaml`。首次启动时,如果目标数据库不可用,服务会保留初始化接口;在管理端初始化页面完成建库、建表和种子数据写入后即可登录。
```shell ```shell
go run ./cmd/kratos-admin -conf ./configs go run ./cmd -conf ./configs
``` ```
默认 HTTP 地址为 `http://127.0.0.1:8000`。生产环境必须替换 JWT 签名密钥和数据库凭据。 默认 HTTP 地址为 `http://127.0.0.1:8000`。生产环境必须替换 JWT 签名密钥和数据库凭据。
@ -48,7 +48,7 @@ make config
修改 Wire Provider 或构造函数后执行: 修改 Wire Provider 或构造函数后执行:
```shell ```shell
go generate ./cmd/kratos-admin go generate ./cmd
``` ```
## 检查 ## 检查

View File

@ -40,7 +40,7 @@ Kra 管理后台由 Kratos 应用承载生命周期Gin 提供兼容管理端
## 验证 ## 验证
```bash ```bash
go generate ./cmd/kratos-admin go generate ./cmd
go test ./... go test ./...
go vet ./... go vet ./...
go build ./... go build ./...

View File

@ -1,4 +1,4 @@
# `app/system``pkg` 复用性审查 # `` 到 `pkg` 复用性审查
审查原则:公共包只提供跨模块稳定的机制、协议或无状态纯函数;不能依赖 审查原则:公共包只提供跨模块稳定的机制、协议或无状态纯函数;不能依赖
`app/*/internal`,也不承载 system 的业务表、用例、provider 客户端或运行时 `app/*/internal`,也不承载 system 的业务表、用例、provider 客户端或运行时

View File

@ -1,4 +1,4 @@
# `app/system/internal` 目录结构优化结论 # `internal` 目录结构优化结论
参考 Go Kratos 的分层方式,顶层保留 `app`、`biz`、`conf`、`data`、 参考 Go Kratos 的分层方式,顶层保留 `app`、`biz`、`conf`、`data`、
`initialize`、`integration`、`security`、`server`、`service`、`worker` 十个 `initialize`、`integration`、`security`、`server`、`service`、`worker` 十个

View File

@ -13,4 +13,4 @@
- `protoutil`:与业务无关的 protobuf JSON 局部合并工具 - `protoutil`:与业务无关的 protobuf JSON 局部合并工具
`pkg` 只能提供机制和稳定协议,不能引用任何 `app/*/internal`。数据库配置加载、 `pkg` 只能提供机制和稳定协议,不能引用任何 `app/*/internal`。数据库配置加载、
系统集成配置、系统表和 provider 生命周期仍由 `app/system` 负责。 系统集成配置、系统表和 provider 生命周期仍由 `` 负责。

View File

@ -89,7 +89,7 @@ func TestErrorEntryIncludesFinalApplicationSource(t *testing.T) {
if err := os.WriteFile(filename, []byte(content), 0o600); err != nil { if err := os.WriteFile(filename, []byte(content), 0o600); err != nil {
t.Fatal(err) t.Fatal(err)
} }
entry := errorEntryFromZap(zapcore.Entry{Message: "task failed", Level: zapcore.ErrorLevel, Stack: "kra/app/system/internal/worker.execute\n" + filename + ":4"}, nil) entry := errorEntryFromZap(zapcore.Entry{Message: "task failed", Level: zapcore.ErrorLevel, Stack: "kra/internal/worker.execute\n" + filename + ":4"}, nil)
if !strings.Contains(entry.Info, "最终调用方法:"+filename+":4 (execute lines 3-5)") || !strings.Contains(entry.Info, "func execute()") { if !strings.Contains(entry.Info, "最终调用方法:"+filename+":4 (execute lines 3-5)") || !strings.Contains(entry.Info, "func execute()") {
t.Fatalf("expected final caller source in error entry: %s", entry.Info) t.Fatalf("expected final caller source in error entry: %s", entry.Info)
} }
@ -103,12 +103,12 @@ func TestSkipStackFileRecognizesServerTransportPackages(t *testing.T) {
}{ }{
{name: "handler", path: `D:\workspace\app\system\internal\server\handler\user.go`, want: true}, {name: "handler", path: `D:\workspace\app\system\internal\server\handler\user.go`, want: true},
{name: "middleware", path: `D:\workspace\app\system\internal\server\middleware\auth.go`, want: true}, {name: "middleware", path: `D:\workspace\app\system\internal\server\middleware\auth.go`, want: true},
{name: "router", path: `/workspace/app/system/internal/server/router/user.go`, want: true}, {name: "router", path: `/workspace/internal/server/router/user.go`, want: true},
{name: "http helper", path: `/workspace/app/system/internal/server/httpx/response.go`, want: true}, {name: "http helper", path: `/workspace/internal/server/httpx/response.go`, want: true},
{name: "legacy flattened middleware", path: `D:\workspace\app\system\internal\server\middleware_auth.go`, want: true}, {name: "legacy flattened middleware", path: `D:\workspace\app\system\internal\server\middleware_auth.go`, want: true},
{name: "legacy flattened route", path: `/workspace/app/system/internal/server/route_user.go`, want: true}, {name: "legacy flattened route", path: `/workspace/internal/server/route_user.go`, want: true},
{name: "handler remains application boundary", path: `/workspace/app/system/internal/server/handler_user.go`, want: false}, {name: "handler remains application boundary", path: `/workspace/internal/server/handler_user.go`, want: false},
{name: "legacy middleware", path: `/workspace/app/system/internal/transport/middleware/auth.go`, want: true}, {name: "legacy middleware", path: `/workspace/internal/transport/middleware/auth.go`, want: true},
} }
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {

View File

@ -2,4 +2,4 @@
Stateless payment protocol helpers live here: amount conversion, status Stateless payment protocol helpers live here: amount conversion, status
normalization, JSON/XML extraction, and request signing. Provider adapters and normalization, JSON/XML extraction, and request signing. Provider adapters and
their SDK clients remain under `app/system/internal/integration/payment`. their SDK clients remain under `internal/integration/payment`.