gorm框架:user role用户角色一对一关联Model编写
一、目录结构
我们建立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编写相关推荐
- Mendix用户角色权限设计思路
在传统的企业应用架构设计中,不可避免需要涉及用户角色权限的设计,其中最为通用的模型是RBAC模型.RBAC(基于角色的访问控制)是指用户通过角色与权限进行关联.即一个用户拥有若干角色,每一个角色拥有 ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- 【SSH框架/国际物流商综平台】-05 单点登录 用户-角色-权限分配 Ztree.js structs2.0 异常框架 细粒度权限控制 BaseEntitity中createby degree
回顾 Shiro安全框架 认证,授权,加密,会话管理(单点登录),缓存,与web集成 单点登录(SSO Single Sign on)的原理 就是将原有的各个系统的会话管理机制,抽取出来交给第三方集中 ...
- 二十五、PHP框架Laravel学习笔记——模型的一对一关联
一.关联概念 关联模型,即:两张或以上的表进行一定规则的绑定关联: 比如:一个学生(学生表)对应一张个人信息卡(信息表),这种就是一对一: 再比如:一篇博文(帖子表)对应多个评论(评论表),这种就是一 ...
- java用户角色权限管理 只显示姓_扩展RBAC用户角色权限设计方案
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...
- Java论坛系统--3.系统用户角色权限表结构设计
通常我们的网站都有权限控制,就像一个公司有产品.开发.运维之分,各自负责各自的业务,相互独立,有相互协作,共同完成一个任务.拥有不同权限的用户查看不同的页面,进行不同的操作. Shiro是一种轻量级的 ...
- GO 学习笔记(四)GORM框架
文章目录 简洁 安装 案例演示 模型定义 连接数据库 (mysql) CRUD 接口 关联 链式操作 错误处理 事务 原生sql和sql生成器 简洁 一个对于golang开发人员比较有好的ORM库 安 ...
- RBAC用户角色权限设计方案
RBAC用户角色权限设计方案 转自http://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html RBAC(Role-Based Acces ...
- SpringSecurity动态加载用户角色权限实现登录及鉴权
本文来说下SpringSecurity如何动态加载用户角色权限实现登录及鉴权 文章目录 概述 动态数据登录验证的基础知识 UserDetails与UserDetailsService接口 实现User ...
最新文章
- 智能卡技术和身份认证
- shell中判断空字符串和有趣的空字符串
- 看看人家 SpringBoot + vue后台管理系统,多么优雅...
- MATLAB中改变默认当前文件夹
- Web 开发中应用 HTML5 技术的10个实例教程
- 按钮button加超链接
- html的表单标记格式,HTML表单标签
- Lnmp上安装Yaf学习(二)
- 深度学习(4) - 神经网络和反向传播算法
- c758f52e87.html,鲁教版初一英语上学期期中试题及答案
- ArcGIS学习总结(九)——将.kml转换为.shp
- 通过朋友间推广APP,根本不可行
- [python]有关Python的import...和from...import...的区别
- 基于腾讯视频影视作品数据分析
- 网页端接入海康监控摄像头画面
- 深圳市专利代理机构名单(截至2016年3月)
- 2021高考志愿填报总结-yy
- 怎样删除oracle注册表信息
- 三种安装httpd的方法
- (转)卡马克卷轴算法研究