一、目录结构

我们建立RBAC应用的目录结构如下图所示

config目录:配置文件例如数据库连接信息

controller目录:所有请求注入控制器来进行处理

model目录:与数据表映射和请求响应需要用到的结构体

static目录:应用静态文件gin需要加载这些静态文件以供应用使用

view目录:应用模板视图文件存放处

二、使用Docker搭建一个简单的mysql环境(确保系统已安装docker)

1.拉取镜像

docker pull mysql:5.7.28

2.镜像拉取成功后,我们在宿主机上来定义Mysql的配置文件,用于挂载容器中的配置文件

新建文件:/usr/local/docker/mysql/my.cnf

[mysql]
prompt = [\\u@\\p][\\d]>\\_
auto-rehash[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
datadir     = /var/lib/mysql
#log-error  = /var/log/mysql/error.log
bind-address    = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
port=3306
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
autocommit = 1
server-id = 11
character_set_server=utf8mb4
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
max_allowed_packet = 64M
event_scheduler = 1

4.根据镜像生成Mysql容器

docker run -d \
--name mysql \
-p 3306:3306 \
-v /usr/local/docker/mysql/my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-e MYSQL_ROOT_PASSWORD=root \
--restart="always" \
mysql:5.7.28

上面命令运行了一个mysql实例,并且设置了密码为:root

我们进入容器并创建一个数据库名为:ginrbac

三.使用Gorm来连接并生成Rbac的表结构

什么是ORM?

即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。

Gorm中文文档地址:https://gorm.io/zh_CN/docs/index.html

1.我们在主目录下新建一个config.ini文件,来作为我们的配置文件内容如下:

#gin运行模式:'debug','release'
AppMode = debug
#运行的端口号
AppPort = 8081
#mysql相关配置
MysqlUser = root
MysqlPwd  = root
MysqlDb   = ginrbac
MysqlOption = "charset=utf8mb4&parseTime=True&loc=Local"

我们使用:https://github.com/go-ini/ini类库来读取配置文件

首先我们安装需要用到的2个类库

go get -u gopkg.in/ini.v1
go get -u github.com/jinzhu/gorm"

2.我们在model目录下新建3个文件来对应“用色”,“用户”,“权限”表

2.1 role.go文件:

package modelimport ("github.com/jinzhu/gorm"
)type Role struct {gorm.ModelName   string `json:"name" gorm:"type:VARCHAR(30);not null;comment:'角色名称'"`Rules  string `json:"rules" gorm:"type:VARCHAR(255);not null;comment:'角色拥有的权限节点'"`Status int    `json:"status" gorm:"type:TINYINT(1);not null;default:1;comment:'状态:1 启用 0 禁用'"`
}

2.2 user.go文件:

package modelimport ("github.com/jinzhu/gorm"
)type User struct {gorm.ModelUsername string `json:"username" gorm:"type:varchar(50);not null; comment:'用户名'"`Password string `json:"password" gorm:"type:varchar(128);not null; comment:'密码'"`RoleId   int    `json:"role_id" gorm:"type:int;not null; comment:'角色id'"`Status   int    `json:"status" gorm:"type:TINYINT(1);not null; comment:'状态:1启用 0禁用';default:1"`
}

2.3 node.go文件(权限节点表):

package modelimport ("github.com/jinzhu/gorm"
)type Node struct {gorm.ModelName   string `json:"name" gorm:"type:VARCHAR(50);not null;comment:'节点名称'"`Path   string `json:"path" gorm:"type:VARCHAR(50);not null;comment:'节点路径'"`Pid    int    `json:"pid" gorm:"type:INT(11);not null;comment:'所属节点id'"`Sort   int    `json:"sort" gorm:"type:INT(4);not null;default:0;comment:'排序'"`Icon   string `json:"icon" gorm:"type:VARCHAR(50);default:'';comment:'图标'"`IsMenu int    `json:"is_menu" gorm:"type:TINYINT(1);not null;default:1;comment:'是否是菜单项 1 不是 2 是'"`Status int    `json:"status" gorm:"type:TINYINT(1);not null;default:1;comment:'状态:1 启用 0 禁用'"`
}

3.我们在config目录下新建config.go文件内容如下:

 package configimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jinzhu/gorm""gopkg.in/ini.v1""log""myblog/model"
)var Conf *config //应用配置变量,可以通过它来读取
var Db *gorm.DB  //应用mysql连接池type config struct {AppMode     stringAppPort     stringMysqlUser   stringMysqlPwd    stringMysqlIpPort stringMysqlDb     stringMysqlOption string
}func init() {initConfig()initDb()   //调用同级目录下db.go中的方法genTable() //生成修改表结构
}
func initConfig() {cfg, err := ini.Load("./config.ini")if err != nil {log.Panic("加载ini错误!")}Conf = &config{}err = cfg.MapTo(Conf)if err != nil {log.Panic("解析ini文件错误", err)}
}func initDb() {var err error//gorm.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local")dnsStr := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", Conf.MysqlUser, Conf.MysqlPwd, Conf.MysqlIpPort, Conf.MysqlDb, Conf.MysqlOption)Db, err = gorm.Open("mysql", dnsStr)if err != nil {log.Panic("连接mysql有错误:", err)}
}
func genTable() {Db.AutoMigrate(&model.User{})Db.AutoMigrate(&model.Role{})Db.AutoMigrate(&model.Node{})
}

config.go文件中生成表结构的关键函数:genTable()

参考链接:http://gincms.com/blog/detail-2.html

gorm框架:user role用户角色一对一关联Model编写相关推荐

  1. Mendix用户角色权限设计思路

    ​在传统的企业应用架构设计中,不可避免需要涉及用户角色权限的设计,其中最为通用的模型是RBAC模型.RBAC(基于角色的访问控制)是指用户通过角色与权限进行关联.即一个用户拥有若干角色,每一个角色拥有 ...

  2. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  3. 【SSH框架/国际物流商综平台】-05 单点登录 用户-角色-权限分配 Ztree.js structs2.0 异常框架 细粒度权限控制 BaseEntitity中createby degree

    回顾 Shiro安全框架 认证,授权,加密,会话管理(单点登录),缓存,与web集成 单点登录(SSO Single Sign on)的原理 就是将原有的各个系统的会话管理机制,抽取出来交给第三方集中 ...

  4. 二十五、PHP框架Laravel学习笔记——模型的一对一关联

    一.关联概念 关联模型,即:两张或以上的表进行一定规则的绑定关联: 比如:一个学生(学生表)对应一张个人信息卡(信息表),这种就是一对一: 再比如:一篇博文(帖子表)对应多个评论(评论表),这种就是一 ...

  5. java用户角色权限管理 只显示姓_扩展RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  6. Java论坛系统--3.系统用户角色权限表结构设计

    通常我们的网站都有权限控制,就像一个公司有产品.开发.运维之分,各自负责各自的业务,相互独立,有相互协作,共同完成一个任务.拥有不同权限的用户查看不同的页面,进行不同的操作. Shiro是一种轻量级的 ...

  7. GO 学习笔记(四)GORM框架

    文章目录 简洁 安装 案例演示 模型定义 连接数据库 (mysql) CRUD 接口 关联 链式操作 错误处理 事务 原生sql和sql生成器 简洁 一个对于golang开发人员比较有好的ORM库 安 ...

  8. RBAC用户角色权限设计方案

    RBAC用户角色权限设计方案 转自http://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html RBAC(Role-Based Acces ...

  9. SpringSecurity动态加载用户角色权限实现登录及鉴权

    本文来说下SpringSecurity如何动态加载用户角色权限实现登录及鉴权 文章目录 概述 动态数据登录验证的基础知识 UserDetails与UserDetailsService接口 实现User ...

最新文章

  1. 智能卡技术和身份认证
  2. shell中判断空字符串和有趣的空字符串
  3. 看看人家 SpringBoot + vue后台管理系统,多么优雅...
  4. MATLAB中改变默认当前文件夹
  5. Web 开发中应用 HTML5 技术的10个实例教程
  6. 按钮button加超链接
  7. html的表单标记格式,HTML表单标签
  8. Lnmp上安装Yaf学习(二)
  9. 深度学习(4) - 神经网络和反向传播算法
  10. c758f52e87.html,鲁教版初一英语上学期期中试题及答案
  11. ArcGIS学习总结(九)——将.kml转换为.shp
  12. 通过朋友间推广APP,根本不可行
  13. [python]有关Python的import...和from...import...的区别
  14. 基于腾讯视频影视作品数据分析
  15. 网页端接入海康监控摄像头画面
  16. 深圳市专利代理机构名单(截至2016年3月)
  17. 2021高考志愿填报总结-yy
  18. 怎样删除oracle注册表信息
  19. 三种安装httpd的方法
  20. (转)卡马克卷轴算法研究

热门文章

  1. php作业90,php中文网移动端-第九期(191107作业)
  2. java如何打logo,利用java给网站图片打上文本或图片logo
  3. 英语语法---数词详解
  4. numpy(7)-广播
  5. 【Python】Python 远程连接服务器,用它就够了
  6. 【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习
  7. 【深度学习】从梯度下降到 Adam!一文看懂各种神经网络优化算法
  8. 【Python基础】学习Python 一定要吃透这 5 个内置函数
  9. 【NLP】竞赛必备的NLP库
  10. 【Python】值得推荐的12个jupyter lab插件