# kratos
**Repository Path**: cuihovah/kratos
## Basic Information
- **Project Name**: kratos
- **Description**: No description available
- **Primary Language**: Go
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-10-12
- **Last Updated**: 2025-11-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🚀 Kratos Web Framework
轻量级 Go Web 框架,支持 **动态接口注册、JWT 鉴权、MongoDB 事务管理、文件上传、统一错误处理**。
适合构建中小型后端 API 服务,结构简洁、易扩展。
---
## ✨ 特性 Highlights
- ⚙️ **XML 动态路由注册**:无需手写 HTTP 路由,自动加载业务函数
- 🔐 **JWT / Cookie 鉴权**:内置 Token 解析与用户验证
- 💾 **MongoDB 原生事务支持**:配置即生效
- 📂 **文件上传封装**:简洁接口快速集成
- 💥 **统一错误与响应结构**:自动生成 trace_id 与堆栈追踪
---
## 📁 目录结构
```
.
├── business/ # 业务逻辑模块
│ ├── serv.go # 服务注册与实现入口
│ ├── access.go # JWT 登录与鉴权
│ ├── uploads.go # 文件上传接口
│ ├── error.go # 错误处理演示
│ └── utils.go # 辅助工具
│
├── repository/ # MongoDB 数据访问层
│ ├── repository.go
│ ├── transcation_log.go
│ └── transcation_record.go
│
├── schema/ # 数据结构定义
│ ├── user.go
│ └── schema.go
│
├── router/ # XML 路由配置文件
│ └── router.xml
│
├── conf.ini # 服务配置文件
├── main.go # 程序启动入口
└── go.mod
````
---
## ⚡ 快速开始(Quick Start)
### 1️⃣ 安装依赖
```bash
go mod tidy
````
---
### 2️⃣ 配置服务
编辑 `conf.ini`:
```ini
[main]
port = 8080
[mongodb]
url = mongodb://localhost:27017
dbname = kratos_demo
```
---
### 3️⃣ 定义路由(router/router.xml)
```xml
login
Login
false
false
uploads
Uploads
false
false
```
---
### 4️⃣ 实现业务逻辑
在 `business/serv.go`:
```go
func (s *Serv) Login(ctx context.Context, token kratos.Token, body []byte, query map[string]string) (interface{}, error) {
var user schema.User
_ = json.Unmarshal(body, &user)
if user.Username != "admin" || user.Password != "123456" {
return nil, kratos.NewError(401, "用户名或密码错误", nil)
}
jwtStr, _ := GenerateJWT(user, "my_secret", map[string]interface{}{
"exp": time.Now().Add(24 * time.Hour).Unix(),
})
kratos.SetCookie(ctx, s.SessionName(), jwtStr)
return bson.M{"token": jwtStr}, nil
}
```
---
### 5️⃣ 启动服务
```bash
go run main.go
```
输出示例:
```
[INFO] Kratos server started on port 8080
[INFO] Routes loaded: login, uploads
```
---
### 6️⃣ 测试接口
**登录:**
```bash
curl -X POST "http://localhost:8080/spdb_view/v1?method=login" \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}'
```
**上传文件:**
```bash
curl -X POST "http://localhost:8080/spdb_view/v1?method=uploads" \
-F "file=@./test.png"
```
---
## 🔑 鉴权机制
* 支持 **Cookie + JWT 双模验证**
* 登录成功后自动写入 Cookie (`sdp_user_token`)
* 受保护接口会在执行前自动解析 Token 并注入 `kratos.Token` 对象
---
## 💥 错误与响应格式
### ✅ 成功响应
```json
{
"code": 0,
"msg": "OK",
"data": { "token": "xxx" },
"response_id": "66e8f...",
"create_at": "2025-10-14T12:34:56+08:00"
}
```
### ❌ 错误响应
```json
{
"code": 3,
"msg": "多层错误测试",
"error": "写入日志失败 <- 数据解析错误 <- DB连接失败"
}
```
---
## ⚙️ 事务支持
只需在 `router.xml` 设置:
```xml
true
```
框架自动为该接口启用 MongoDB 事务,失败自动回滚。
---
## 📦 文件上传
使用 `kratos.GetFormFile(ctx, "file")` 获取文件:
```go
file, header, err := kratos.GetFormFile(ctx, "file")
```
文件保存示例:
```go
path := "./uploads/" + header.Filename
out, _ := os.Create(path)
io.Copy(out, file)
```
---
## 🧠 开发模板(推荐)
```go
func (s *Serv) FunctionName(ctx context.Context, token kratos.Token, body []byte, query map[string]string) (interface{}, error) {
// 1. 参数解析
// 2. 业务逻辑
// 3. 错误封装
// 4. 返回数据
return bson.M{"ok": true}, nil
}
```
在 `router.xml` 中注册:
```xml
function.name
FunctionName
false
true
```
---
## 🧾 响应封装逻辑
框架统一响应结构:
| 字段 | 含义 |
| ------------- | ------------ |
| `code` | 状态码(0 成功) |
| `msg` | 信息提示 |
| `data` | 返回数据 |
| `response_id` | 响应唯一 ID |
| `create_at` | 时间戳 |
| `error` | 错误堆栈信息(仅错误时) |
---
## 💡 建议与扩展
| 功能 | 建议 |
| ---- | ----------------------------- |
| 日志记录 | 结合 `kratos.Error.Log()` 输出到文件 |
| 存储扩展 | 文件上传支持 OSS / MinIO |
| 权限控制 | 在 `GetToken()` 中扩展角色字段 |
| 接口文档 | 可自动解析 `router.xml` 生成 Swagger |
---
## 🧱 License
MIT License © 2025 Cuiyunfeng
---
> 💬 “Kratos 框架让业务开发只关注逻辑,
> 不再被路由、事务、鉴权、错误困扰。”