当前位置: 首页 > news >正文

保定涿州网站建设网站开发大概价格

保定涿州网站建设,网站开发大概价格,网页设计制作网站图片,哪个网站可以做汽车评估登录和注册(handle_auto.go) 文章目录 登录和注册(handle_auto.go)一、所需要的结构体信息二、注册三、登录四、退出 一、所需要的结构体信息 type UserAuth struct{}type LoginReq struct {Username string json:username binding:requiredPassword …登录和注册(handle_auto.go) 文章目录 登录和注册(handle_auto.go)一、所需要的结构体信息二、注册三、登录四、退出 一、所需要的结构体信息 type UserAuth struct{}type LoginReq struct {Username string json:username binding:requiredPassword string json:password binding:required }type RegisterReq struct {Username string json:username binding:requiredPassword string json:password binding:required,min4,max20Code string json:code binding:required }type LoginVO struct {model.UserInfo// 点赞 Set: 用于记录用户点赞过的文章, 评论ArticleLikeSet []string json:article_like_setCommentLikeSet []string json:comment_like_setToken string json:token }二、注册 因为原本的作者没有写注册的功能我就自己写了一个简单的注册功能。 1.注册的路由 base.POST(/register, userAuthAPI.Register) // 注册2.验证码的功能函数 handler层的函数 使用qq邮箱发送验证限制发送时间使用redis存储验证码时间1分钟 func (*UserAuth) SendCode(c *gin.Context) {// 发送验证码限制于1分钟发一次elapsedTime : time.Since(lastEmailSent)remaingTime : time.Minute - elapsedTimeif elapsedTime time.Minute {c.JSON(http.StatusOK, gin.H{message: fmt.Sprintf(发送验证码过于频繁请稍后再试剩余时间%d秒, int(remaingTime.Seconds()))})return}// 从请求参数中获取邮箱地址email : c.Query(email)if email {c.JSON(http.StatusBadRequest, gin.H{error: 未提供邮箱地址})return}// 发送邮件验证码err : SendEmail(email, c)if err ! nil {c.JSON(http.StatusInternalServerError, gin.H{error: 发送邮件失败})return}// 发送邮件成功返回成功响应给前端lastEmailSent time.Now()ReturnSuccess(c, 验证码发送成功) }// 发送邮件到指定邮箱 func SendEmail(email string, c *gin.Context) error {// 邮箱配置信息config : gomail.NewDialer(smtp.qq.com, 465, xxxqq.com, 自己的授权码)//config.TLSConfig.ServerName smtp.qq.com//config.TLSConfig.InsecureSkipVerify false// 创建邮件内容message : gomail.NewMessage()message.SetHeader(From, xxxqq.com)message.SetHeader(To, email)message.SetHeader(Subject, 验证码)// 获取随机验证码computing : utils2.GetRandNums(6)message.SetBody(text/html, fmt.Sprintf(欢迎使用席万里的博客系统这是您的注册验证码%s, computing))// 连接并发送邮件dialer, err : config.Dial()if err ! nil {return err}defer dialer.Close()if err gomail.Send(dialer, message); err ! nil {return err}// 将验证码存到redis中确保输入的是正确的rdb : GetRDB(c)// 以email为keymima为val存入redis只存在1分钟rdb.Set(rctx, email, computing, time.Minute)return nil }3.注册的主功能函数 用到了密码加密随机验证码的生成数据的写入 func (*UserAuth) Register(c *gin.Context) {var req RegisterReqif err : c.ShouldBindJSON(req); err ! nil {ReturnError(c, g2.ErrRequest, err)return}db : GetDB(c)rdb : GetRDB(c)// 检查邮箱是否已经被注册_, err : model.GetUserAuthInfoByName(db, req.Username)if err ! nil {if !errors.Is(err, gorm.ErrRecordNotFound) {ReturnError(c, g2.ErrDbOp, err)return}} else {ReturnError(c, g2.ErrMailAleradyUsed, 邮箱已经被使用)return}// 取出来验证码码做判断 看是否正确computing, err : rdb.Get(rctx, req.Username).Result()if err ! nil {// 处理获取验证码失败的情况ReturnError(c, g2.FailResult, err)return}// 如果验证码不正确则返回错误信息if computing ! req.Code {ReturnError(c, g2.ErrVerificationCode, 验证码错误)return}// 将密码加密hashpassword, _ : utils2.BcryptHash(req.Password)err model.RegisterDB(db, req.Username, hashpassword)if err ! nil {ReturnError(c, g2.ErrDbOp, 注册失败)}ReturnSuccess(c, 注册成功) }4.数据库层的邮箱查重函数 func GetUserAuthInfoByName(db *gorm.DB, name string) (*UserAuth, error) {var userAuth UserAuthresult : db.Where(UserAuth{Username: name}).First(userAuth)return userAuth, result.Error }5.数据查入、生成随机验证码、mimajiammi // 数据查入 // 用户注册 用户名密码 func RegisterDB(db *gorm.DB, username, hashpassword string) error {// 创建新用户认证信息newUserAuth : UserAuth{Model: Model{CreatedAt: time.Now(),UpdatedAt: time.Now(),},Username: username,Password: hashpassword,}// 保存新用户认证信息到数据库if err : db.Create(newUserAuth).Error; err ! nil {return err}return nil } // 生成随机验证码 func GetRandNums(digits int) string {rand.Seed(time.Now().UnixNano())numeric : [10]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}var sb strings.Builderfor i : 0; i digits; i {fmt.Fprintf(sb, %d, numeric[rand.Intn(len(numeric))])}return sb.String() }// 密码加密 func BcryptHash(str string) (string, error) {bytes, err : bcrypt.GenerateFromPassword([]byte(str), bcrypt.DefaultCost)return string(bytes), err }三、登录 登录功能也用到了查重校验密码hash等功能这里不在讲述。 生成jwt token使用MD5加密使用Session存储认证ID使用Redis存储在线信息 func (*UserAuth) Login(c *gin.Context) {var req LoginReqif err : c.ShouldBindJSON(req); err ! nil {ReturnError(c, g2.ErrRequest, err)return}db : GetDB(c)rdb : GetRDB(c)userAuth, err : model.GetUserAuthInfoByName(db, req.Username)if err ! nil {if errors.Is(err, gorm.ErrRecordNotFound) {ReturnError(c, g2.ErrUserNotExist, nil)return}ReturnError(c, g2.ErrDbOp, err)return}// 检查密码是否正确if !utils2.BcryptCheck(req.Password, userAuth.Password) {ReturnError(c, g2.ErrPassword, nil)return// 获取 IP 相关信息 FIXME: 好像无法读取到 ip 信息ipAddress : utils2.IP.GetIpAddress(c)ipSource : utils2.IP.GetIpSourceSimpleIdle(ipAddress)userInfo, err : model.GetUserInfoById(db, userAuth.UserInfoId)if err ! nil {if errors.Is(err, gorm.ErrRecordNotFound) {ReturnError(c, g2.ErrUserNotExist, nil)return}ReturnError(c, g2.ErrDbOp, err)return}roleIds, err : model.GetRoleIdsByUserId(db, userAuth.ID)if err ! nil {ReturnError(c, g2.ErrDbOp, err)return}articleLikeSet, err : rdb.SMembers(rctx, g2.ARTICLE_USER_LIKE_SETstrconv.Itoa(userAuth.ID)).Result()if err ! nil {ReturnError(c, g2.ErrDbOp, err)return}commentLikeSet, err : rdb.SMembers(rctx, g2.COMMENT_USER_LIKE_SETstrconv.Itoa(userAuth.ID)).Result()if err ! nil {ReturnError(c, g2.ErrDbOp, err)return}// 登录信息正确, 生成 Token// UUID 生成方法: ip 浏览器信息 操作系统信息// uuid : utils.MD5(ipAddress browser os)conf : g.Conf.JWTtoken, err : jwt.GenToken(conf.Secret, conf.Issuer, int(conf.Expire), userAuth.ID, roleIds)if err ! nil {ReturnError(c, g2.ErrTokenCreate, err)return}// 更新用户验证信息: ip 信息 上次登录时间err model.UpdateUserLoginInfo(db, userAuth.ID, ipAddress, ipSource)if err ! nil {ReturnError(c, g2.ErrDbOp, err)return}slog.Info(用户登录成功: userAuth.Username)session : sessions.Default(c)session.Set(g2.CTX_USER_AUTH, userAuth.ID)session.Save()// 删除 Redis 中的离线状态offlineKey : g2.OFFLINE_USER strconv.Itoa(userAuth.ID)rdb.Del(rctx, offlineKey).Result()ReturnSuccess(c, LoginVO{UserInfo: *userInfo,ArticleLikeSet: articleLikeSet,CommentLikeSet: commentLikeSet,Token: token,}) }1.use Redis 缓存用户收藏和喜欢的文章 articleLikeSet, err : rdb.SMembers(rctx, g2.ARTICLE_USER_LIKE_SETstrconv.Itoa(userAuth.ID)).Result()if err ! nil {ReturnError(c, g2.ErrDbOp, err)return}commentLikeSet, err : rdb.SMembers(rctx, g2.COMMENT_USER_LIKE_SETstrconv.Itoa(userAuth.ID)).Result()if err ! nil {ReturnError(c, g2.ErrDbOp, err)return}四、退出 func (*UserAuth) Logout(c *gin.Context) {c.Set(g2.CTX_USER_AUTH, nil)// 已经退出登录auth, _ : CurrentUserAuth(c)if auth nil {ReturnSuccess(c, nil)return}session : sessions.Default(c)session.Delete(g2.CTX_USER_AUTH)session.Save()// 删除 Redis 中的在线状态rdb : GetRDB(c)onlineKey : g2.ONLINE_USER strconv.Itoa(auth.ID)rdb.Del(rctx, onlineKey)ReturnSuccess(c, nil) }
http://www.zqtcl.cn/news/655115/

相关文章:

  • 高端企业网站设计公司怎么帮公司做网站建设
  • 湖北专业网站建设维修电话企业网络管理方案
  • 做网站外链wordpress网页怎么上传
  • wordpress站点优化石景山网站开发
  • 企业网站建设的流程店铺推广引流
  • 北京网站优化wyhseo信息化建设杂志社官方网站
  • 网站图片处理方案动漫制作这个专业怎么样
  • 做写手哪个网站好黄页网站建设黄页网站建设
  • 多语言企业网站免费模板网站哪个好
  • 拟一份饰品网站建设合同襄樊门户网站建设
  • 你对网站第一印象受欢迎的广州做网站
  • 网站开发项目的需求分析浙江省城乡建设网站证件查询
  • 整站seo定制简单 大气 网站模版
  • 网站界面设计策划书怎么做云匠网订单多吗
  • html教程 pdf网站建设优化兰州
  • 招聘网站可以同时做两份简历吗外贸网站示例
  • 黑链 对网站的影响企业融资计划书范本
  • 自己的简历怎么制作网站学院网站建设成效
  • 周口seo 网站郑州建站网站的公司
  • 网站布局模板北京装修大概多少钱一平方
  • 德阳网站建设ghxhwl风景网站模板
  • 昌邑网站建设拓者设计吧现代效果图
  • 学校网站建设成功案例网站开发需要学习哪些内容
  • 怎么让公司建设网站seo于刷网站点击
  • 网站建设合同严瑾建设网站宣传
  • 哪个网站做餐饮推广最好深圳市信任网站
  • 网站模板 整站源码广州网站vi设计报价
  • 百度速页建站wordpress审核插件
  • 怎么给网站wordpress专业的vi设计公司
  • 百度关键词在线优化寻找郑州网站优化公司