从前端,到后端,除了Gin框架本身,完全不依赖第三方库,极简实现,无比丝滑。 流程梳理 客户端生成一个AES密钥(建议存Cookie里) 服务端生成一对RSA密钥(private.pem+public.pem) 服务端开启一个接口,接收任意请求方法都行,将RSA公钥以Set-Cookie标头直接塞到客户端浏览器Cookie里面(记得以base64传…
简单记个笔记 这里的ID是unit类型,而RoleLevel是int类型,使用strconv包解决 userIDStr := strconv.FormatUint(uint64(userTable.ID), 10) roleLevelStr := strconv.Itoa(userTable.RoleLevel)
除了登录接口以外,其他接口都需要邮件验证 注意事项 一定要设置好频繁请求限制中间件,防止验证码爆破。 注册 验证码邮件发送接口-注册 请求方法:post,请求参数:email 后端检查数据库用户表是否已存在用户email,如已存在则拒绝注册,如未存在则生成6位数随机数字作为验证码为后续发送邮件先做准备 将验证码存入redis,设置有效期(redis…
zap+lumberjack 日志记录+日志切割2件套 包地址 "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore" zap核心概念 日志级别: DebugLevel: 调试信息。 InfoLevel: 一般信息。 WarnLevel: 警告信息。…
当今虽有HTTPS,但一些重要数据如果需要存在客户端,还是要进行额外加密,同时更能确保传输过程安全。对于少量数据的加解密,非对称加密RSA还是非常好用的,如果是大量数据要考虑使用AES+RSA混合加密。 下方示例中前端纯HTML+JS,后端使用Go(Gin框架)。 HTML 使用公钥数据加密并将加密后的数据发送POST请求到后端。 <!DOC…
通过记录IP的访问次数到Redis,来限制频繁请求/访问接口。可以动态地在响应内容中显示实际的限制频率。需要注意当前的响应内容message是以分钟为单位作提醒,由于rl.Expires.Minutes()可能会返回一个浮点数,所以使用int()来将其转换为整数。如果需要更精确的时间单位表示(比如秒)还需自行修改。 调用示例 全局使用和单独使用 f…
Gin的路由没有降级什么的,设置了静态文件端点的话后方会自动带*号捕获往后的所有路由,也就是说会直接报panic,因为直接与所有端点冲突了。 方法1 不设置为根路由而是其他自定义的端点,比如下方定义/web端点,./html表示:将项目目录下的名为html的文件夹内部所有文件作为静态资源可访问(需要加后缀) r.Static("/web", "./…
默认是软删除,除非加入Unscoped()方法才是真正的永久删除: // 软删除 func (br *BaseRepository[T]) Delete(entity T, id uint) error { return br.DB.Delete(&entity, id).Error } // 硬删除 func (br *BaseR…
设置为上海时区正确示范,需要转义斜杠为%2f DSN: "username:password@tcp(localhost:3306)/tablename?charset=utf8mb4&parseTime=True&loc=Asia%2fShanghai" 正常的本地时区情况 DSN: "username:password@tcp(…
已解决目前网络上其他教程的坑。 安装依赖 go get github.com/swaggo/swag/cmd/swag go get github.com/swaggo go get github.com/swaggo/gin-swagger 初始化gin-swagger swag init 集成到现有项目 对于小白的提醒:下方两个示例文件中,im…