Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .cursor/rules/base.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
alwaysApply: true
---
这是一个云原生运维管理平台,Go 1.24.6,Gin + Wire + Gorm,Redis 缓存,MySQL 主库。

## 分层与依赖
- 统一遵循 `api/service/dao/utils` 四层,禁止跨层直接调用。
- HTTP 入口只出现于 `api`,业务放 `service`,数据库与外部系统交互放 `dao`,通用方法沉淀在对应 `utils`。
- 依赖注入通过 `pkg/di` + Wire,新增服务需同步更新注入图和 `generate.go`。

## HTTP 与中间件
- Gin 处理请求,必须在 `api` 层做参数校验(`validator` / `binding`)与上下文超时控制。
- Auth 使用 JWT + Casbin,所有需要身份的接口统一通过 `internal/middleware/auth.go`;无需鉴权的路由放 `internal/not_auth`。
- HTTP 响应用统一结构:`code/message/data`,错误要区分用户错误与系统错误,日志链路包含 request-id。

## 业务与数据
- Service 层聚合缓存、DAO、第三方接口,保持幂等,可用 `context.Context` 控制超时。
- DAO 使用 Gorm,SQL 需命名方法并封装分页、排序,数据库表名蛇形,结构体字段驼峰+`gorm` tag。
- 涉及事务使用 `gorm.Transaction`,在 Service 封装,不向 API 暴露。
- Redis 仅作为缓存/分布式锁,key 要带业务前缀,失效时间可配置。

## 配置、日志与监控
- 配置通过 Viper 加载 `config/*.yaml` + 环境变量,禁止硬编码密钥。
- 日志使用 `zap`,中间件层打印请求摘要,Service/DAO 记录关键业务事件;敏感数据脱敏。
- 通过 Prometheus 与 Alertmanager 统一指标和告警,新增指标放在对应 `prometheus` 子包。

## 编码规范
- 全量使用 `goimports` + `golangci-lint`(至少包含 golint、staticcheck)保持风格一致。
- 错误必须 wrap(`fmt.Errorf` 或 `pkg/errors`),向上抛出的错误信息面向开发,面向用户的提示在 API 层翻译。
- 注释只写关键逻辑、接口、结构体,保持中英文统一(默认中文)。
- 新功能必须附带单元测试或集成测试,最少覆盖 Service 层;执行 `go test ./...` 保持通过。
- 代码中的注释不要出现AI痕迹,应尽量保证精简,直接描述代码逻辑即可。

## 安全与性能
- 所有外部输入都要校验长度、格式、枚举;密码或密钥统一用 `internal/user/utils/password.go` 等工具。
- 并发场景使用 `x/sync/errgroup` 或 channel,避免裸 goroutine 漏错误;需要锁时首选 `sync` 包。
- 关注性能与内存,禁止在热路径频繁分配对象,可利用对象池或重用 buffer。
- 对外暴露的文件、脚本、K8s 配置要保持最小权限原则,敏感配置走 `env` 或密钥管理。
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,4 @@ internal/model/kubeedge_types.go

# AI-CloudOps executable
AI-CloudOps
.cursor
94 changes: 1 addition & 93 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -35,104 +35,19 @@ lint:
@go vet ./...
@echo "✅ 代码检查完成"

# 生成 Swagger API 文档 (传统方式,需要手动注释)
swagger-manual:
@echo "正在生成API文档(传统方式)..."
@swag init --output ./docs --parseDependency --parseInternal --exclude ./internal/*/service --dir ./ --generalInfo main.go
@echo "API文档已生成到 docs/ 目录"
@echo "访问地址: http://localhost:8889/swagger/index.html"

# 生成 Swagger API 文档
swagger:
@echo "🚀 正在生成API文档..."
@echo "📄 使用生成工具生成文档..."
@bash scripts/generate-swagger.sh
@echo "✅ Swagger 文档生成完成!"

# 兼容旧的命令名
docs: swagger

# 检查 Swagger 注解完整性
swagger-check:
@echo "检查 Swagger 注解..."
@echo "正在统计 API 函数..."
@total_funcs=$$(grep -c "func.*Handler.*[Gg]et\|[Pp]ost\|[Pp]ut\|[Dd]elete" internal/*/api/*.go); \
swagger_funcs=$$(grep -c "@Summary" internal/*/api/*.go); \
echo "总 API 函数数量: $$total_funcs"; \
echo "包含 Swagger 注解的函数: $$swagger_funcs"; \
if [ $$swagger_funcs -lt $$total_funcs ]; then \
echo "⚠️ 发现 $$(( $$total_funcs - $$swagger_funcs )) 个函数缺少 Swagger 注解"; \
echo "缺少注解的文件:"; \
grep -L "@Summary" internal/*/api/*.go || true; \
else \
echo "✅ 所有 API 函数都包含 Swagger 注解"; \
fi

# 启动本地服务器并打开 Swagger UI
swagger-serve:
@echo "启动服务器..."
@if pgrep -f "AI-CloudOps" > /dev/null; then \
echo "服务器已在运行"; \
else \
echo "请先启动服务器: make dev 或 go run main.go"; \
fi
@echo "Swagger UI 访问地址: http://localhost:8889/swagger/index.html"
@if command -v open > /dev/null; then \
open http://localhost:8889/swagger/index.html; \
elif command -v xdg-open > /dev/null; then \
xdg-open http://localhost:8889/swagger/index.html; \
fi

# 验证生成的 API 文档
swagger-validate:
@echo "验证 Swagger 文档..."
@if [ -f "docs/swagger.json" ]; then \
echo "✅ swagger.json 文件存在"; \
echo "文件大小: $$(du -h docs/swagger.json | cut -f1)"; \
else \
echo "❌ swagger.json 文件不存在,请先运行 make swagger"; \
exit 1; \
fi
@if [ -f "docs/swagger.yaml" ]; then \
echo "✅ swagger.yaml 文件存在"; \
echo "文件大小: $$(du -h docs/swagger.yaml | cut -f1)"; \
else \
echo "❌ swagger.yaml 文件不存在,请先运行 make swagger"; \
exit 1; \
fi
@api_count=$$(grep -c '"paths"' docs/swagger.json 2>/dev/null || echo "0"); \
echo "API 路径数量: $$api_count"

# 清理生成的文档
swagger-clean:
@echo "清理 Swagger 文档..."
@rm -f docs/docs.go docs/swagger.json docs/swagger.yaml
@echo "✅ 文档已清理"

# 完整的 Swagger 工作流(手动生成)
swagger-all: swagger-clean swagger swagger-validate swagger-check
@echo "🎉 Swagger 文档生成完成!"

# 检查并修复 Swagger 注解
swagger-fix:
@echo "检查并修复 Swagger 注解..."
@bash scripts/swagger-helper.sh fix

# 安装开发工具
install-dev-tools:
@echo "安装开发工具..."
@go install github.com/air-verse/air@latest
@go install github.com/swaggo/swag/cmd/swag@latest
@echo "✅ 开发工具安装完成"

# 使用 Air 启动开发服务器(不自动生成 Swagger)
# 使用 Air 启动开发服务器
dev-air:
@if ! command -v air &> /dev/null; then \
echo "❌ air 工具未安装,正在安装..."; \
go install github.com/air-verse/air@latest; \
fi
@echo "🚀 启动开发服务器 (Air 热重载)..."
@echo "💡 提示: 如需生成文档,请手动运行 make swagger"
@air

# 开发环境设置(不包含自动生成功能)
Expand All @@ -145,13 +60,6 @@ dev-setup: install-dev-tools
@echo " make fmt-imports # 格式化代码并整理导入"
@echo " make fmt-check # 检查代码格式"
@echo " make lint # 代码检查 (go vet)"
@echo " make swagger # 手动生成 Swagger 文档"
@echo " make swagger-manual # 使用传统方式生成"
@echo " make swagger-validate # 验证生成的文档"
@echo " make swagger-check # 检查注解完整性"
@echo " make swagger-clean # 清理生成的文档"
@echo ""
@echo "📝 注意: Swagger 文档需要手动生成"

docker-build:
docker build -t Bamboo/gomodd:v1.23.1 .
Expand Down
1 change: 0 additions & 1 deletion README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ go run main.go
Backend service endpoints:

- API Service: [http://localhost:8000](http://localhost:8000)
- Swagger Documentation: [http://localhost:8000/swagger](http://localhost:8000/swagger)

#### 4. Start AI Service (Optional)

Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,6 @@ go run main.go
后端服务地址:

- API 服务: [http://localhost:8000](http://localhost:8000)
- Swagger 文档: [http://localhost:8000/swagger](http://localhost:8000/swagger)

#### 4. 启动 AI 服务 (可选)

Expand Down
51 changes: 0 additions & 51 deletions docs/docs.go

This file was deleted.

17 changes: 0 additions & 17 deletions env.example
Original file line number Diff line number Diff line change
Expand Up @@ -107,20 +107,3 @@ FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/your-webhook-url

# Tavily搜索配置
TAVILY_API_KEY=

# ============================================================================
# Swagger服务配置
# ============================================================================

# 是否启用Swagger生成(默认: true)
# 在生产环境中可以设置为 false 以禁用Swagger
SWAGGER_ENABLED=false

# 项目根目录路径(等同于 -root 参数)
SWAGGER_ROOT=

# 输出目录路径(等同于 -output 参数)
SWAGGER_OUTPUT=

# 是否启用详细输出(等同于 -v 参数)
SWAGGER_VERBOSE=false
10 changes: 0 additions & 10 deletions generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,6 @@
// Run `go generate` in the project root to execute all generation tasks.
package main

//go:generate bash -c "echo '🔄 正在生成 Swagger 文档...'"
//go:generate bash -c "echo '[INFO] 使用生成模式(无需手动注释)...'"
//go:generate bash -c "echo '[INFO] 构建生成工具...'"
//go:generate bash -c "cd tools/swagger-auto-gen && go build -o swagger-auto-gen ."
//go:generate bash -c "echo '[INFO] 分析项目结构并生成文档...'"
//go:generate bash -c "./tools/swagger-auto-gen/swagger-auto-gen -root . -output ./docs -v"
//go:generate bash -c "if [ -f docs/swagger.json ]; then echo '[SUCCESS] 文档生成成功!文件大小: $(du -h docs/swagger.json | cut -f1)'; else echo '[ERROR] 文档生成失败'; fi"
//go:generate bash -c "echo '[INFO] 访问地址: http://localhost:8889/swagger/index.html'"
//go:generate bash -c "echo '✅ Swagger 文档生成完成!'"

// Generate wire dependency injection code (if wire.go exists)
//go:generate bash -c "if [ -f 'pkg/di/wire.go' ]; then cd pkg/di && wire; echo '✅ Wire 依赖注入代码生成完成'; fi"

Expand Down
5 changes: 0 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ require (
github.com/redis/go-redis/v9 v9.8.0
github.com/spf13/pflag v1.0.6
github.com/spf13/viper v1.19.0
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
github.com/swaggo/swag v1.16.6
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.41.0
golang.org/x/sync v0.16.0
Expand Down Expand Up @@ -66,7 +63,6 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
github.com/armon/go-metrics v0.4.1 // indirect
Expand Down Expand Up @@ -115,7 +111,6 @@ require (
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/spec v0.21.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/goccy/go-json v0.10.5 // indirect
Expand Down
11 changes: 0 additions & 11 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
Expand Down Expand Up @@ -229,8 +227,6 @@ github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
Expand Down Expand Up @@ -668,12 +664,6 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI=
github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
Expand Down Expand Up @@ -813,7 +803,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
Expand Down
7 changes: 6 additions & 1 deletion internal/constants/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,18 @@ package constants

import "errors"

// Http Error Code
// Http Error Code 与用户常量
const (
UserSignUpFailedErrorCode = 400001 + iota
UserExistErrorCode
UserNotExistErrorCode
)

const (
AccountTypeUser int8 = 1 // 普通用户
AccountTypeService int8 = 2 // 服务账号
)

var (
ErrorUserNotExist = errors.New("user not exists")
ErrorPasswordIncorrect = errors.New("user password incorrect")
Expand Down
Loading