# VBase 集成指南

本文档介绍如何将 VBase 作为基础库集成到现有的 Golang 项目中，并使用其权限管理系统。

## 1. 安装

```bash
go get github.com/veypi/vbase
```

## 2. 初始化

在你的应用入口文件（如 `main.go` 或 `init.go`）中进行初始化。

```go
package main

import (
    "github.com/veypi/vbase"
    "github.com/veypi/vbase/cfg"
    "github.com/veypi/vbase/auth"
    "github.com/veypi/vigo"
)

// 1. 创建你的应用 Router
var Router = vigo.NewRouter()

// 2. 创建你的应用 Auth 实例 (指定 Scope)
var AppAuth = auth.Factory.New("my_app")

func init() {
    // 3. 挂载 VBase 路由 (提供登录、用户管理等基础接口)
    Router.Extend("/vb", vbase.Router)

    // 4. 配置数据库连接 (如果尚未配置)
    // export DSN="root:password@tcp(127.0.0.1:3306)/myapp?charset=utf8&parseTime=True"
}

func main() {
    // 5. 初始化数据库迁移
    if err := vbase.Init(); err != nil {
        panic(err)
    }

    // 6. 启动服务
    app := vigo.New("myapp", Router, cfg.Global, nil)
    panic(app.Run())
}
```

## 3. 使用权限系统

### 3.1 定义路由权限

使用 `AppAuth` 实例的中间件方法来保护你的路由。

```go
func init() {
    // 需要登录
    Router.Use(AppAuth.Login())

    // 资源操作示例
    // 假设你的资源是 "article"
    
    // 创建文章 (需要 "article" 的创建权限 Level 1)
    Router.Post("/articles", AppAuth.PermCreate("article"), CreateArticle)

    // 读取文章 (需要 "article:{id}" 的读取权限 Level 2)
    Router.Get("/articles/{id}", AppAuth.PermRead("article:{id}"), GetArticle)

    // 更新文章 (需要 "article:{id}" 的写入权限 Level 4)
    Router.Put("/articles/{id}", AppAuth.PermWrite("article:{id}"), UpdateArticle)

    // 删除文章 (需要 "article:{id}" 的管理员权限 Level 7)
    Router.Delete("/articles/{id}", AppAuth.PermAdmin("article:{id}"), DeleteArticle)
}
```

### 3.2 业务逻辑授权

在创建资源时，通常需要授予创建者管理权限。

```go
func CreateArticle(x *vigo.X, req *ArticleReq) (*Article, error) {
    // 1. 获取当前用户
    userID := AppAuth.UserID(x)
    
    // 2. 创建资源逻辑...
    article := &Article{Title: req.Title, AuthorID: userID}
    db.Create(article)

    // 3. 授予权限
    // 授予用户对该文章的管理员权限 (Level 7)
    // 这样用户后续可以读取、修改、删除该文章
    permissionID := fmt.Sprintf("article:%s", article.ID)
    if err := AppAuth.Grant(x.Context(), userID, permissionID, auth.LevelAdmin); err != nil {
        // 处理错误 (通常记录日志)
        x.Log.Error("Failed to grant permission", "err", err)
    }

    return article, nil
}
```

### 3.3 复杂场景：项目成员管理

假设你有一个项目管理系统，用户可以被邀请加入项目。

```go
// 邀请成员接口
func InviteMember(x *vigo.X, req *InviteReq) error {
    // 检查当前用户是否有权限邀请 (通常需要管理员权限)
    // 这一步由路由中间件 PermAdmin("project:{id}") 保证
    
    // 授予被邀请人读取权限 (Level 2)
    permID := fmt.Sprintf("project:%s", req.ProjectID)
    return AppAuth.Grant(x.Context(), req.TargetUserID, permID, auth.LevelRead)
}
```

## 4. 配置说明

VBase 使用 `cfg` 包管理配置，支持环境变量。

- `DB_DSN`: 数据库连接字符串
- `DB_TYPE`: 数据库类型 (mysql, postgres, sqlite)
- `JWT_SECRET`: JWT 签名密钥 (生产环境务必修改)
- `JWT_ISSUER`: Token 签发者

更多配置详情请参考 [配置文档](./configuration.md)。
