获得徽章 13
- #青训营 x 字节后端训练营#
5.30打卡
今天学习了ozzo-validation库,这是一个数据校验库
- 校验基本数据类型 Validate() 函数
第一个参数是要检验的数据,后面是可变参数传入校验规则,例如validation.Required, validation.Length(2,10)...
在校验时,按照传入的规则一一检验,其中有一个不满足就会返回错误,并显示错误信息
- 校验结构体 ValidateStruct
第一个参数传入的是要检验的结构体,之后是可变参数传入检验的字段
使用validation.Field来指定字段,第一个参数是具体字段的指针,之后是检验规则
只有但所有字段都通过校验,才返回nil,否则返回错误,错误信息中可以看到是那些字段没有通过校验,不满足那些规则
展开评论点赞 - #青训营 x 字节后端训练营#
5.29打卡
今天学习了go中的testify测试库,了解到了可以利用其中的assert断言子库来简化一些简单的测试案例,
比如判断相等:
- 之前的方法
if got != expected {
t.Errorf("expect %d, but got %d", expected, got)
}
- 使用assert
assert.Equal(t, got, expected, "they should be equal")
代码更简洁明了
mock - 测试替身
构造一个仿对象,提供和原对象一样的接口,在测试中用仿对象来代替原对象(在原对象难构造,特别是涉及外部资源时使用)
展开评论点赞 - #青训营 x 字节后端训练营#
5.15打卡
今天学习了一些常见的性能优化
1.在使用make()初始化切片时提供容量信息
2.在已有切片基础上进行切片时,不会创建新的底层数组,如果底层数组很大,新建的切片可能只使用了其中的一小段,底层数据中其他的内存得不到释放,这时可以使用copy 替代 re-slice
3.map预分配内存也可以减少内存拷贝和Rehash的消耗
4.字符串拼接使用strings.Builder
5.使用空结构体节省内存 - 空结构体不占据内存空间,可作为占位符使用
6.在并发编程中,如果我们要包含的是一个变量而不是一段代码,可以使用atomic包来代替sync.Mutex, 提高效率展开评论点赞 - #青训营 x 字节后端训练营#
5.10打卡
今天结合了之前几天的内容,完成了一个简单的用户登入
密码使用了bcrypt加密,在注册用户时,将加密后的username和password保存到数据库中,用于后续的登入检验
使用了JWT身份认证,在用户登入完成密码的检验后,根据自定义的claims来生成tokenstring,将tokenstring发送给前端,
之后前端每次请求时,带上一个Authorization的请求头部,其值为tokenstring
后续请求时,会先检验tokenstring,验证用户身份,在用casbin来管理权限,判断当前用户是否有权访问某些资源
之后要做的:token过期了怎么办
目前想到的俩个方法
1.强制用户登出
2.刷新token,但token要怎么发送给前端,前端又如何判断token刷新了,把token保存到cookie中吗展开评论点赞 - #青训营 x 字节后端训练营#
5.9打卡
今天学习了casbin库,使用casbin可以实现灵活的访问权限控制
casbin将访问控制模型抽象到一个基于 PERM(Policy,Effect,Request,Matchers) 元模型的配置文件(模型文件)中
使用model.conf文件来编写模型,
对于策略可以使用使用policy.csv来保存也可以使用数据库
1.使用policy.csv来存储文件
e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")获取Enforcer对象,
ok, err := e.Enforce(sub, obj, act) 来检查权限,ok为true表明拥有该权限
2.使用Gorm Adapter将策略存储到数据库中
使用sqlite:
a.创建casbin_rule表
b.连接数据库
c.创建adapter
adapter, err := gormadapter.NewAdapterByDB(db)
d.获取Enforcer对象
e, err := casbin.NewEnforcer("./model.conf", adapter)
动态添加策略使用e.AddPolicy()函数
保存策略使用e.SavePolicy()函数展开评论点赞 - #青训营 x 字节后端训练营#
5.7打卡
今天学习了使用gorm完成数据库的连接和创建用户表
先用使用Viper读取项目配置文件,将相关信息保存到全局的配置变量GL_CONFIG中
使用函数GetDSN读取GL_CONFIG中的相关变量值来返回数据库连接的相关参数的字符串
连接postgres:
gorm.Open(postgres.Open(dsn), &gorm.Config{}) 获取 *gorm.DB, 将它保存到全局变量GL_DB中
创建了user结构体,使用AutoMigrate来自动创建和更新表结构
user结构体中的变量可以适当定义标签:
`gorm:"primary_key"` 定义主键
`gorm:"column:user_name"` 定义该字段在数据库中的列名
AUTO_INCREMENT 定义自增
not null 定义no null 约束
...展开赞过11