kindness

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 18, 2026 License: MIT Imports: 0 Imported by: 0

README

Kindness Framework

🎉 一个基于 Laravel 思想、使用 Go 1.24 泛型构建的现代化 Web 框架

📑 目录

✨ 特性

  • 🔧 IoC 容器 - 类型安全的依赖注入,充分利用 Go 泛型
  • 🎭 门面模式 - Laravel 风格的静态访问接口
  • 🛣️ 优雅路由 - 基于 Gin 的 Laravel 风格路由系统
  • 💾 Eloquent ORM - 基于 GORM 的链式查询构建器
  • ✅ 数据验证 - Laravel 风格的验证规则
  • 📝 日志系统 - 集成 Zap 的高性能结构化日志
  • ⚙️ 配置管理 - 基于 Viper 的灵活配置系统
  • 🎨 模板引擎 - 支持自定义函数的 HTML 模板
  • ⚡ 中间件 - 可扩展的请求处理管道
  • 🔨 Artisan CLI - 基于 Cobra 的命令行工具
  • 📦 Support 组件 - Laravel 风格的 Collection、Str、Arr、Carbon 辅助函数
  • 💾 缓存系统 - 多驱动支持(Memory、File),具备 Remember、Pull、Increment 等高级功能
  • ⚡ 异步队列 - 支持延迟任务、重试机制
  • 🔔 事件系统 - 基于观察者模式的事件分发
  • ⏰ 任务调度 - 支持 Cron 表达式的定时任务
  • 🔌 WebSocket - 实时双向通信支持
  • 🛡️ 认证授权 - JWT、OAuth 2.0 及 RBAC 权限管理
  • 🚀 Kitex RPC - 字节跳动高性能 RPC 框架集成
  • 🌐 GraphQL - 现代化查询语言支持
  • 📉 链路追踪 - 集成 OpenTelemetry 分布式追踪

📦 安装

go get github.com/kindness8023/kindness

🚀 快速开始

创建应用
package main

import (
    "github.com/kindness8023/kindness/foundation"
    "github.com/kindness8023/kindness/router"
    "github.com/kindness8023/kindness/middleware"
)

func main() {
    // 创建应用实例
    app := foundation.New(".")
    
    // 获取路由器
    r := app.Router()
    
    // 添加中间件
    r.Middleware(middleware.Logger(), middleware.Recovery())
    
    // 注册路由
    r.Get("/", func(c *router.Context) {
        c.Success(map[string]interface{}{
            "message": "Hello Kindness!",
        })
    })
    
    // 启动服务器
    app.Run(":8080")
}

📖 核心功能

1. IoC 容器(泛型支持)
import "github.com/kindness8023/kindness/container"

// 注册单例服务
container.Singleton[*MyService](app.Container(), func(c *container.Container) *MyService {
    return &MyService{}
})

// 解析服务(类型安全)
service, err := container.Make[*MyService](app.Container())

// 或使用门面
service := facade.MustMake[*MyService]()
2. 路由系统
r := app.Router()

// 基础路由
r.Get("/users", listUsers)
r.Post("/users", createUser)
r.Put("/users/:id", updateUser)
r.Delete("/users/:id", deleteUser)

// 路由分组
r.Group("/api", func(api *router.Router) {
    api.Middleware(middleware.Auth())
    
    api.Get("/profile", getProfile)
    api.Post("/logout", logout)
})

// 中间件
r.Get("/admin", adminHandler).Middleware(middleware.Auth())
3. Eloquent 风格 ORM(泛型)

Kindness 提供了基于 GORM 封装的泛型查询构建器,支持链式调用、类型安全和丰富的查询功能。

定义模型

继承 database.Model 以自动获得 ID, CreatedAt, UpdatedAt, DeletedAt 字段。

type User struct {
    database.Model
    Name  string `json:"name"`
    Email string `json:"email"`
    Age   int    `json:"age"`
}
数据库配置

支持 MySQL 和 SQLite。

import "github.com/kindness8023/kindness/database"

db := database.New()
err := db.AddConnection("default", database.Config{
    Driver:   "mysql",
    Host:     "127.0.0.1",
    Port:     3306,
    Database: "kindness",
    Username: "root",
    Password: "password",
    Charset:  "utf8mb4",
})
基础查询
// 创建构建器
builder := database.NewBuilder[User](facade.DB.Connection())

// 查找单个
user, err := builder.Find(1)
user, err := builder.Where("email", "alice@example.com").First()

// 获取所有
users, err := builder.Where("age", ">", 18).Get()

// 分页查询
pagination, err := builder.Paginate(1, 15)
// pagination.Data, pagination.Total, pagination.TotalPages
高级查询
builder.
    WhereIn("status", []int{1, 2, 3}).
    WhereBetween("age", 18, 30).
    WhereNull("confirmed_at").
    OrderBy("created_at", "DESC").
    Limit(10).
    Get()
事务处理
err := facade.Query[User]().Transaction(func(tx *database.Builder[User]) error {
    if err := tx.Create(&User{Name: "Bob"}); err != nil {
        return err // 自动回滚
    }
    return nil // 自动提交
})
分块处理 (Chunk)

用于处理大数据量,避免内存溢出。

facade.Query[User]().Chunk(100, func(users []User) error {
    for _, user := range users {
        // 处理用户...
    }
    return nil
})
软删除

默认使用软删除(如果模型包含 DeletedAt)。

// 软删除
facade.Query[User]().Where("id", 1).Delete()

// 永久删除
facade.Query[User]().Where("id", 1).ForceDelete()
4. 数据验证
import "github.com/kindness8023/kindness/validation"

// 创建验证器
validator := validation.Make(map[string]interface{}{
    "name": "Alice",
    "email": "alice@example.com",
    "age": 25,
}, map[string]string{
    "name": "required|min:3|max:50",
    "email": "required|email",
    "age": "required|numeric",
})

// 执行验证
if !validator.Validate() {
    errors := validator.Errors()
    // 处理错误
}

// 获取第一个错误
firstError := validator.First()
5. 配置管理
import "github.com/kindness8023/kindness/facade"

// 获取配置
appName := facade.Config.GetString("app.name")
debug := facade.Config.GetBool("app.debug")
port := facade.Config.GetInt("server.port")

// 获取环境变量
dbHost := facade.Config.Env("DB_HOST", "localhost")

// 设置配置
facade.Config.Set("custom.key", "value")
6. 日志系统
import (
    "github.com/kindness8023/kindness/facade"
    "github.com/kindness8023/kindness/log"
)

// 基础日志
facade.Log.Info("User logged in")
facade.Log.Error("Failed to connect database")

// 带字段的结构化日志
facade.Log.Info("User created", 
    log.String("name", "Alice"),
    log.Int("age", 25),
    log.String("email", "alice@example.com"),
)

// 错误日志
facade.Log.Error("Database error", log.Error(err))

// 创建带上下文的日志器
logger := facade.Log.With(
    log.String("request_id", "abc123"),
    log.String("user_id", "1"),
)
logger.Info("Processing request")
7. 中间件
import "github.com/kindness8023/kindness/middleware"

// 内置中间件
r.Middleware(
    middleware.Logger(),      // 请求日志
    middleware.Recovery(),    // 错误恢复
    middleware.CORS(),        // 跨域支持
    middleware.Auth(),        // 认证
    middleware.Throttle(60, time.Minute), // 限流
)

// 自定义中间件
func CustomMiddleware() router.HandlerFunc {
    return func(c *router.Context) {
        // 前置处理
        start := time.Now()
        
        c.Next()
        
        // 后置处理
        duration := time.Since(start)
        facade.Log.Info("Request completed", 
            log.String("duration", duration.String()),
        )
    }
}
8. 模板引擎
import "github.com/kindness8023/kindness/view"

// 创建引擎
engine := view.New("./resources/views")
engine.Load()

// 渲染模板
html, _ := engine.Render("welcome", map[string]interface{}{
    "title": "Welcome",
    "name": "Alice",
})

// 在路由中使用
r.Get("/welcome", func(c *router.Context) {
    engine, _ := router.Make[*view.Engine](c)
    html, _ := engine.Render("welcome", map[string]interface{}{
        "name": "Guest",
    })
    c.HTML(200, html, nil)
})
9. Artisan 命令
import "github.com/kindness8023/kindness/console"

// 创建命令
cmd := console.NewCommand("make:controller", "Create a controller", 
    func(cmd *cobra.Command, args []string) error {
        name := args[0]
        // 创建控制器逻辑
        return nil
    },
)

// 注册命令
app.Console().Register(cmd.Command)

// 运行控制台
app.RunConsole()
10. Support 组件

Collection - 集合操作:

import "github.com/kindness8023/kindness/support"

// 创建集合
numbers := support.Collect([]int{1, 2, 3, 4, 5})

// Filter - 过滤
evens := numbers.Filter(func(n int) bool {
    return n%2 == 0
})

// Map - 映射转换
squared := support.Map(numbers, func(n int) int {
    return n * n
})

// 统计
sum := support.SumInt(numbers)      // 求和
avg := support.AvgInt(numbers)      // 平均值
max, _ := support.MaxInt(numbers)   // 最大值

// 链式操作
result := numbers.Take(3).Reverse().All()

Str - 字符串辅助:

str := support.StringHelper

// 命名风格转换
str.Snake("HelloWorld")        // "hello_world"
str.Camel("hello_world")       // "helloWorld"
str.Studly("hello_world")      // "HelloWorld"
str.Kebab("HelloWorld")        // "hello-world"

// 字符串操作
str.Limit("长文本", 10, "...")   // 限制长度
str.Slug("Hello World!")       // "hello-world"
str.Before(url, "/path")       // 获取之前
str.After(url, "//")           // 获取之后

// 验证
str.IsEmail("test@example.com") // true
str.IsURL("https://example.com") // true

Arr - 数组辅助:

arr := support.ArrayHelper

// 嵌套数组操作(点号路径)
data := map[string]interface{}{
    "user": map[string]interface{}{
        "name": "Alice",
        "profile": map[string]interface{}{
            "age": 25,
        },
    },
}

arr.Get(data, "user.profile.age")           // 25
arr.Set(data, "user.profile.city", "Beijing")
arr.Has(data, "user.name")                  // true

// 数组操作
arr.Only(map, "name", "email")   // 只保留指定键
arr.Except(map, "password")      // 排除指定键
arr.Pluck(users, "name")         // 提取字段

// 集合操作
arr.Diff(arr1, arr2)      // 差集
arr.Intersect(arr1, arr2) // 交集
arr.Union(arr1, arr2)     // 并集

Helper - 辅助函数:

import "github.com/kindness8023/kindness/support"

// Optional 可选值
opt := support.NewOptional(value)
if opt.IsPresent() {
    fmt.Println(opt.Get())
}

// Tap - 执行回调但返回原值
result := support.Tap(value, func(v string) {
    fmt.Println(v)
})

// 环境变量
dbHost := support.Env("DB_HOST", "localhost")
debug := support.EnvBool("DEBUG", false)
port := support.EnvInt("PORT", 8080)

// 调试
support.Dump(data)    // 打印调试信息
support.DD(data)      // Dump and Die

// 检查
support.Blank("")     // true
support.Filled("hi")  // true

Carbon - 日期时间:

import "github.com/kindness8023/kindness/support"

// 创建时间
now := support.Now()                        // 当前时间
today := support.Today()                    // 今天零点
tomorrow := support.Tomorrow()              // 明天
yesterday := support.Yesterday()            // 昨天

// 创建指定时间
birthday := support.Create(1990, 5, 15, 10, 30, 0)
timestamp := support.CreateFromTimestamp(1640000000)

// 格式化
now.ToDateString()         // "2024-01-15"
now.ToTimeString()         // "15:04:05"
now.ToDateTimeString()     // "2024-01-15 15:04:05"
now.Format("2006年01月02日") // 自定义格式

// 时间计算
now.AddDays(7)             // +7天
now.SubMonths(3)           // -3个月
now.AddHours(5)            // +5小时

// 时间比较
now.IsToday()              // 是否为今天
now.IsFuture()             // 是否为未来
now.IsWeekend()            // 是否为周末
now.Between(start, end)    // 是否在范围内

// 时间范围
now.StartOfDay()           // 当天零点
now.EndOfMonth()           // 月末
now.StartOfWeek()          // 周一零点

// 人类可读
now.DiffForHumans()        // "5分钟前" / "2小时后"
now.DiffInDays(other)      // 相差天数

// Getter/Setter
now.GetYear()              // 获取年份
now.SetMonth(12)           // 设置月份
11. 缓存系统 (Cache)

多驱动支持:

import "github.com/kindness8023/kindness/cache"

// 内存缓存
memDriver := cache.NewMemoryDriver()
store := cache.NewStore(memDriver, "app")

// 文件缓存
fileDriver, _ := cache.NewFileDriver("./storage/cache")
fileStore := cache.NewStore(fileDriver, "file")

// 缓存管理器(多驱动)
manager := cache.NewManager()
manager.AddStore("default", store)
manager.AddStore("file", fileStore)

基础操作:

// Put/Get
store.Put("key", "value", 5*time.Minute)
if value, ok := store.Get("key"); ok {
    fmt.Println(value)
}

// Forever 永久存储
store.Forever("config", map[string]interface{}{
    "app": "Kindness",
})

// Has/Forget
if store.Has("key") {
    store.Forget("key")
}

// Flush 清空
store.Flush()

高级功能:

// Remember - 缓存穿透防护
data, _ := store.Remember("users", 5*time.Minute, func() interface{} {
    // 只在缓存不存在时执行
    return fetchUsersFromDB()
})

// Pull - 获取并删除
value, _ := store.Pull("temp")

// Add - 仅当不存在时添加
success := store.Add("key", "value", 5*time.Minute)

// Increment/Decrement
store.Put("counter", int64(10), 0)
store.Increment("counter", 5)  // 15
store.Decrement("counter", 3)  // 12

// 批量操作
store.PutMultiple(map[string]interface{}{
    "key1": "value1",
    "key2": "value2",
}, 5*time.Minute)
values := store.GetMultiple([]string{"key1", "key2"})

// 类型化获取
age, ok := store.GetInt("age")
price, ok := store.GetFloat("price")
active, ok := store.GetBool("active")

门面使用:

import "github.com/kindness8023/kindness/facade"

// 基础操作
facade.Cache.Put("key", "value", 5*time.Minute)
value, _ := facade.Cache.Get("key")

// 切换驱动
facade.Cache.Store("file").Put("key", "value", 10*time.Minute)

// Remember
data, _ := facade.Cache.Remember("key", 5*time.Minute, func() interface{} {
    return expensiveOperation()
})
12. 队列与任务 (Queue)

Kindness 提供了一个强大的异步队列系统,支持多种驱动、延迟任务和自动重试。

import (
    "github.com/kindness8023/kindness/facade"
    "github.com/kindness8023/kindness/queue"
)

// 定义任务处理器
handler := func(job *queue.Job) error {
    var data map[string]interface{}
    job.UnmarshalPayload(&data)
    fmt.Printf("Processing job: %v\n", data)
    return nil
}

// 推送任务到队列
facade.Queue.Push(queue.NewJob("default", map[string]string{
    "user_id": "123",
}))

// 延迟任务
facade.Queue.Later(queue.NewJob("default", "payload"), 10*time.Minute)

// 在 Worker 中消费
worker := queue.NewWorker(facade.Queue.Driver())
worker.Start("default")
13. 事件系统 (Event)

基于观察者模式的解耦利器。

import "github.com/kindness8023/kindness/facade"

// 监听事件
facade.Event.Listen("user.registered", func(event event.Event) {
    user := event.Data().(*User)
    fmt.Printf("Welcome %s!\n", user.Name)
})

// 触发事件
facade.Event.Dispatch(event.NewBaseEvent("user.registered", user))
14. 任务调度 (Schedule)

支持 Cron 格式的定时任务管理。

import "github.com/kindness8023/kindness/facade"

// 注册定时任务
facade.Schedule.EveryMinute("check_status", func() {
    // 执行逻辑
})

facade.Schedule.DailyAt("report", 23, 59, func() {
    // 生成日报
})

// 启动调度器
facade.Schedule.Start()
15. WebSocket

内置基于 Gorilla WebSocket 的实时通信支持。

import "github.com/kindness8023/kindness/websocket"

// 注册 WebSocket 路由
hub := websocket.NewHub()
go hub.Run()

r.Get("/ws", websocket.HandleWebSocket(hub))

// 广播消息
hub.Broadcast([]byte("Hello everyone!"))
16. 认证与权限 (Auth)

集成了 JWT、OAuth 2.0 和 RBAC 权限管理。

// JWT 认证
token, _ := facade.Auth.JWT().GenerateToken("user_123", "alice", "alice@example.com")

// RBAC 权限验证
if facade.Auth.RBAC().HasPermission("user_123", "post.delete") {
    // 允许操作
}
17. Kitex RPC

字节跳动高性能 RPC 框架集成,完全替代传统 gRPC。

import "github.com/kindness8023/kindness/rpc"

// 创建 Kitex 服务器
svr := rpc.NewServer(":8888")
svr.Run()

// 客户端调用
client, _ := rpc.NewClient("user-service")
18. 微服务 (Microservice)

提供服务注册发现、负载均衡和配置中心。

import "github.com/kindness8023/kindness/microservice"

// 服务注册
registry := microservice.NewMemoryRegistry()
registry.Register(&microservice.ServiceInstance{
    Name: "order-service",
    Address: "192.168.1.10",
    Port: 8081,
})
19. GraphQL
import "github.com/kindness8023/kindness/graphql"

// 定义 Schema 并运行
builder := graphql.NewBuilder()
builder.Query("hello", &graphql.Field{
    Type: "String",
    Resolve: func(ctx context.Context, args map[string]interface{}) (interface{}, error) {
        return "world", nil
    },
})

r.Post("/graphql", graphql.NewServer(builder.Build()).Handler())
20. 分布式追踪 (Tracing)

集成 OpenTelemetry 和 Jaeger。

import "github.com/kindness8023/kindness/tracing"

ctx, span := tracing.StartSpan(ctx, "GetUserInfo")
defer span.End()

// 后续逻辑...

🏗️ 项目结构

your-project/
├── main.go              # 应用入口
├── config.json          # 配置文件
├── routes/              # 路由定义
├── app/
│   ├── controllers/     # 控制器
│   ├── models/          # 模型
│   ├── middleware/      # 中间件
│   └── services/        # 服务
├── resources/
│   └── views/           # 模板文件
├── database/
│   └── migrations/      # 数据库迁移
└── storage/
    ├── logs/            # 日志文件
    └── cache/           # 缓存文件

🔥 完整示例

查看 examples/ 目录获取完整的示例代码:

  • examples/webserver/main.go - Web 应用与路由示例
  • examples/database/main.go - 数据库 ORM 操作全集示例
  • examples/cache/main.go - 缓存系统使用示例
  • examples/carbon/main.go - 时间处理示例
  • examples/support/main.go - 集合与辅助函数示例

📚 依赖包

  • github.com/gin-gonic/gin - HTTP 路由
  • github.com/spf13/cobra - CLI 工具
  • github.com/spf13/viper - 配置管理
  • go.uber.org/zap - 高性能日志
  • gorm.io/gorm - ORM 数据库

Documentation

Overview

Package kindness 是一个基于 Laravel 思想、使用 Go 泛型构建的现代化 Web 框架

主要特性:

  • 类型安全的 IoC 容器(基于泛型)
  • Laravel 风格的门面模式
  • Eloquent 风格的 ORM(基于 GORM)
  • 优雅的路由系统(基于 Gin)
  • 完善的中间件支持
  • 灵活的配置管理(基于 Viper)
  • 高性能日志系统(基于 Zap)
  • Artisan 风格的 CLI(基于 Cobra)

快速开始:

package main

import (
    "github.com/kindness8023/kindness/foundation"
    "github.com/kindness8023/kindness/router"
)

func main() {
    app := foundation.New(".")

    app.Router().Get("/", func(c *router.Context) {
        c.Success(map[string]interface{}{
            "message": "Hello Kindness!",
        })
    })

    app.Run(":8080")
}

Index

Constants

View Source
const (
	// Version 框架版本
	Version = "1.0.0"

	// Name 框架名称
	Name = "Kindness"
)

Variables

This section is empty.

Functions

This section is empty.

Types

This section is empty.

Directories

Path Synopsis
cmd
kindness-cli command
examples
cache command
carbon command
database command
kitex command
support command
webserver command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL