IrisAdmin 练手项目经验分享和学习

IrisAdmin

Code Coverage Go Report Card GoDoc Licenses

简体中文 | English

项目地址

GITHUB | GITEE

简单项目仅供学习,欢迎指点!

相关文档

交流方式

Gitter

iris 学习记录分享


项目介绍

项目由多个服务构成,每个服务有不同的功能.
  • [viper_server]
    • 服务配置初始化,并生成本地配置文件
    • 需要实现 func getViperConfig() viper_server.ViperConfig 方法
package cache

import (
    "fmt"

    "github.com/fsnotify/fsnotify"
    "github.com/snowlyg/iris-admin/g"
    "github.com/snowlyg/iris-admin/server/viper_server"
    "github.com/spf13/viper"
)

var CONFIG Redis

type Redis struct {
    DB       int    `mapstructure:"db" json:"db" yaml:"db"`
    Addr     string `mapstructure:"addr" json:"addr" yaml:"addr"`
    Password string `mapstructure:"password" json:"password" yaml:"password"`
    PoolSize int    `mapstructure:"pool-size" json:"poolSize" yaml:"pool-size"`
}

// getViperConfig 获取初始化配置
func getViperConfig() viper_server.ViperConfig {
    configName := "redis"
    db := fmt.Sprintf("%d", CONFIG.DB)
    poolSize := fmt.Sprintf("%d", CONFIG.PoolSize)
    return viper_server.ViperConfig{
        Directory: g.ConfigDir,
        Name:      configName,
        Type:      g.ConfigType,
        Watch: func(vi *viper.Viper) error {
            if err := vi.Unmarshal(&CONFIG); err != nil {
                return fmt.Errorf("反序列化错误: %v", err)
            }
            // 监控配置文件变化
            vi.SetConfigName(configName)
            vi.WatchConfig()
            vi.OnConfigChange(func(e fsnotify.Event) {
                fmt.Println("配置发生变化:", e.Name)
                if err := vi.Unmarshal(&CONFIG); err != nil {
                    fmt.Printf("反序列化错误: %v \n", err)
                }
            })
            return nil
        },
        // 注意:设置默认配置值的时候,前面不能有空格等其他符号.必须紧贴左侧.
        Default: []byte(`
db: ` + db + `
addr: "` + CONFIG.Addr + `"
password: "` + CONFIG.Password + `"
pool-size: ` + poolSize),
    }
}
  • [zap_server]

    • 服务日志记录
    • 通过全局变量 zap_server.ZAPLOG 记录对应级别的日志
      zap_server.ZAPLOG.Info("注册数据表错误", zap.Any("err", err))
      zap_server.ZAPLOG.Debug("注册数据表错误", zap.Any("err", err))
      zap_server.ZAPLOG.Error("注册数据表错误", zap.Any("err", err))
      ...
  • [database]

    • 数据服务 [目前仅支持 mysql]
    • 通过单列 database.Instance() 操作数据
      database.Instance().Model(&User{}).Where("name = ?","name").Find(&user)
      ...
  • [casbin]

    • 权限控制管理服务
    • 使用 casbin 第三方包实现
    • 并通过 index.Use(casbin.Casbin()) 使用中间件,实现接口权限认证
  • [cache]
    • 缓存驱动服务
    • 通过单列 cache.Instance() 操作数据
      // InitDriver 初始化认证
      func (ws *WebServer) InitDriver() error {
      err := multi.InitDriver(
          &multi.Config{
              DriverType:      CONFIG.System.CacheType,
              UniversalClient: cache.Instance()},
      )
      if err != nil {
          return fmt.Errorf("初始化认证驱动错误 %w", err)
      }
      if multi.AuthDriver == nil {
          return ErrAuthDriverEmpty
      }
      return nil
      }
      

- [operation]
- - 系统操作日志服务
- - 并通过 `index.Use(operation.OperationRecord())` 使用中间件,实现接口自动生成操作日志

- [web]
- - web_iris Go-Iris 框架服务
- - 使用 [github.com/kataras/iris/v12](https://github.com/kataras/iris) 第三方包实现
- - web 框架服务需要实现 `type WebFunc interface {}`  接口
```go
// WebFunc 框架服务接口
// - GetTestClient 测试客户端
// - GetTestLogin 测试登录
// - AddWebStatic 添加静态页面
// - InitDriver 初始化认证
// - AddUploadStatic 上传文件路径
// - Run 启动
type WebFunc interface {
    GetTestClient(t *testing.T) *httptest.Client
    GetTestLogin(t *testing.T, url string, res httptest.Responses, datas ...interface{}) *httptest.Client
    AddWebStatic(perfix string)
    AddUploadStatic()
    InitDriver() error
    InitRouter() error
    Run()
}

数据初始化

简单初始化.
  • 使用原生方法 AutoMigrate() 自动迁移初始化数据表
    package main
    

import (
“github.com/snowlyg/iris-admin/server/web”
“github.com/snowlyg/iris-admin/server/web/web_iris”
“github.com/snowlyg/iris-admin-rbac/iris/perm”
“github.com/snowlyg/iris-admin-rbac/iris/role”
“github.com/snowlyg/iris-admin/server/database”
“github.com/snowlyg/iris-admin/server/operation”
)

func main() {
database.Instance().AutoMigrate(&perm.Permission{},&role.Role{},&user.User{},&operation.Oplog{})
}


##### 自定义迁移工具初始化.
- 使用 `gormigrate` 第三方依赖包实现数据的迁移控制,方便后续的升级和开发
- 使用方法详情见 [iris-admin-cmd](https://github.com/snowlyg/iris-admin-example/blob/main/iris/cmd/main.go)
---

#### 简单使用
- 获取依赖包,注意必须带上 `master` 版本
```sh
 go get github.com/snowlyg/iris-admin@master
  • 添加 main.go 文件
    package main
    

import (
“github.com/snowlyg/iris-admin/server/web”
“github.com/snowlyg/iris-admin/server/web/web_iris”
)

func main() {
wi := web_iris.Init()
web.Start(wi)
}


#### 启动项目
- 第一次启动项目后,配置文件会自动生成到 `config` 目录下.
- 同时会生成一个 `rbac_model.conf` 文件到项目根目录,该文件用于 casbin 权鉴的规则.
```sh
go run main.go

添加模块

  • 如果需要权鉴管理,可以使用 iris-admin-rbac 项目快速集成权鉴功能
  • 可以使用 AddModule() 增加其他 admin模块
    package main
    

import (
rbac “github.com/snowlyg/iris-admin-rbac/iris”
“github.com/snowlyg/iris-admin/server/web”
“github.com/snowlyg/iris-admin/server/web/web_iris”
)

func main() {
wi := web_iris.Init()
rbacParty := web_iris.Party{
Perfix: “/api/v1”,
PartyFunc: rbac.Party(),
}
wi.AddModule(rbacParty)
web.Start(web_iris.Init())
}


#### 设置静态文件路径
- 已经默认内置了一个静态文件访问路径
- 静态文件将会上传到 `/static/upload` 目录
- 可以修改配置项 `static-path` 修改默认目录
```yaml
system:
  addr: "127.0.0.1:8085"
  cache-type: ""
  db-type: ""
  level: debug
  static-path: /static/upload
  static-prefix: /upload
  time-format: "2006-01-02 15:04:05"
  web-prefix: /admin
  web-path: ./dist

设置其他静态文件路径

  • 设置其他静态文件路径,可以使用 AddStatic 方法
    package main
    

import (
“github.com/kataras/iris/v12”
“github.com/snowlyg/iris-admin/server/web”
)

func main() {
webServer := web_iris.Init()
fsOrDir := iris.Dir(filepath.Join(dir.GetCurrentAbPath(), “/other”))
webServer.AddStatic(“/other”,fsOrDir)
webServer.Run()
}


#### 配合前端使用
- 编译前端页面默认 `dist` 目录
- 可以修改配置项 `web-path` 修改默认目录
```go
package main

import (
    "github.com/kataras/iris/v12"
    "github.com/snowlyg/iris-admin/server/web"
)

func main() {
    webServer := web_iris.Init()
    webServer.AddWebStatic("/")
    webServer.Run()
}

简单用例

RBAC

感谢

JetBrains 对本项目的支持。

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!