简体中文 | English
简单项目仅供学习,欢迎指点!
-
If you don't have a QQ account, you can into the iris-go-tenancy/community .
-
微信群请加微信号:
c25vd2x5Z19jaGluYQ==
- [viper_server]
-
- 服务配置初始化,并生成本地配置文件
-
- 使用 github.com/spf13/viper 第三方包实现
-
- 需要实现
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]
-
- 服务日志记录
-
- 使用 go.uber.org/zap 第三方包实现
-
- 通过全局变量
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]
-
- 使用 gorm.io/gorm 第三方包实现
-
- 通过单列
database.Instance()
操作数据
- 通过单列
database.Instance().Model(&User{}).Where("name = ?","name").Find(&user)
...
-
[casbin]
-
- 权限控制管理服务
-
- 使用 casbin 第三方包实现
-
- 并通过
index.Use(casbin.Casbin())
使用中间件,实现接口权限认证
- 并通过
-
[cache]
-
- 缓存驱动服务
-
- 使用 github.com/go-redis/redis 第三方包实现
-
- 通过单列
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 第三方包实现
-
- web 框架服务需要实现
type WebFunc interface {}
接口
- web 框架服务需要实现
// WebFunc 框架服务接口
// - GetTestClient 测试客户端
// - GetTestLogin 测试登录
// - AddWebStatic 添加静态页面
// - InitDriver 初始化认证
// - AddUploadStatic 上传文件路径
// - Run 启动
type WebFunc interface {
GetTestClient(t *testing.T) *tests.Client
GetTestLogin(t *testing.T, url string, res tests.Responses, datas ...map[string]interface{}) *tests.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/modules/v1/perm"
"github.com/snowlyg/iris-admin/modules/v1/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
package main
import (
"github.com/snowlyg/iris-admin/server/web"
"github.com/snowlyg/iris-admin/server/web/web_iris"
)
func main() {
web.Start(web_iris.Init())
}
- 第一次启动项目后,配置文件会自动生成到
config
目录下. - 同时会生成一个
rbac_model.conf
文件到项目根目录,该文件用于 casbin 权鉴的规则.
go run main.go
- 框架默认内置了v1 版本的基础认证模块
- 可以使用 AddModule() 增加其他 admin模块
package main
import (
v1 "github.com/snowlyg/iris-admin/modules/v1"
"github.com/snowlyg/iris-admin/server/web"
"github.com/snowlyg/iris-admin/server/web/web_iris"
)
func main() {
wi := web_iris.Init()
v1Party := web_iris.Party{
Perfix: "/api/v1",
PartyFunc: v1.Party(),
}
wi.AddModule(v1Party)
web.Start(web_iris.Init())
}
- 已经默认内置了一个静态文件访问路径
- 静态文件将会上传到
/static/upload
目录 - 可以修改配置项
static-path
修改默认目录
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: /
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
修改默认目录
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()
}
- 前端页面参考/借用:【前端只简单实现预览效果】
- gin-vue-admin
- vue-element-admin
- 测试前在
main_test.go
文件所在目录新建redis_pwd.txt
和redis_pwd.txt
两个文件,分别填入redis
和mysql
的密码 - 测试使用依赖库 helper/tests 是基于 httpexpect/v2 的简单封装
- 接口单元测试例子
JetBrains 对本项目的支持。