百万级并发IM即时消息系统(4)用户基本CRUD

前置:

代码层次还是由低到高:model层数据库操作->service层封装->路由层调用业务

手把手详细教你如何使用go-swagger文档 - 掘金 (juejin.cn)

golang swagger注解说明_go swagger 注释_mctlilac的博客-CSDN博客

Gin篇:gorm 使用 - -零 - 博客园 (cnblogs.com)

1)get方式获取参数context.Query("xxx")

golang gin 获取请求中的查询参数,并设置默认值 - golang - 大象笔记 (sunzhongwei.com)

2)post方式获取参数context.Request.FormValue("xxx")

作用基本同上:可以查询url后的?参数、href超链里?后参数

Golang 中Ruquest.FormValue方法_goland formvalue_Kotlin20180728的博客-CSDN博客

1.路由层

	//用户模块r.POST("/user/getUserList", service.GetUserList) //遇到指定请求,调用service层的函数r.POST("/user/createUser", service.CreateUser)//r.GET("/user/createUser", service.CreateUser)  //用于swagger UI测试r.POST("/user/deleteUser", service.DeleteUser)r.POST("/user/updateUser", service.UpdateUser)r.POST("/user/findUserByNameAndPwd", service.FindUserByNameAndPwd)r.POST("/user/find", service.FindByID)

2.service层,这里都是post方式

1).用户增加

func CreateUser(c *gin.Context) {user := models.UserBasic{}//get请求专用c.Query查询请求URL ?后面的参数// user.Name = c.Query("name")// password := c.Query("password")// repassword := c.Query("repassword")//post请求用函数FormValue//设置属性值user.Name = c.Request.FormValue("name")password := c.Request.FormValue("password")repassword := c.Request.FormValue("Identity")fmt.Println(user.Name, "  >>>>>>>>>>>  ", password, repassword)salt := fmt.Sprintf("%06d", rand.Int31())data := models.FindUserByName(user.Name)if user.Name == "" || password == "" || repassword == "" {c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "用户名或密码不能为空!","data":    user,})return}if data.Name != "" {c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "用户名已注册!","data":    user,})return}if password != repassword {c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "两次密码不一致!","data":    user,})return}//user.PassWord = passworduser.PassWord = utils.MakePassword(password, salt)user.Salt = saltfmt.Println(user.PassWord)user.LoginTime = time.Now()user.LoginOutTime = time.Now()user.HeartbeatTime = time.Now()models.CreateUser(user)c.JSON(200, gin.H{"code":    0, //  0成功   -1失败"message": "新增用户成功!","data":    user,})
}

2).删除

func DeleteUser(c *gin.Context) {user := models.UserBasic{}id, _ := strconv.Atoi(c.Query("id"))fmt.Println(id)user.ID = uint(id)models.DeleteUser(user)c.JSON(200, gin.H{"code":    0, //  0成功   -1失败"message": "删除用户成功!","data":    user,})}

3).修改

func UpdateUser(c *gin.Context) {user := models.UserBasic{}id, _ := strconv.Atoi(c.PostForm("id"))user.ID = uint(id)user.Name = c.PostForm("name")user.PassWord = c.PostForm("password")user.Phone = c.PostForm("phone")user.Avatar = c.PostForm("icon")user.Email = c.PostForm("email")fmt.Println("update :", user)_, err := govalidator.ValidateStruct(user)if err != nil {fmt.Println(err)c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "修改参数不匹配!","data":    user,})} else {models.UpdateUser(user)c.JSON(200, gin.H{"code":    0, //  0成功   -1失败"message": "修改用户成功!","data":    user,})}}

4).查

func FindUserByNameAndPwd(c *gin.Context) {data := models.UserBasic{}//name := c.Query("name")//password := c.Query("password")name := c.Request.FormValue("name")password := c.Request.FormValue("password")fmt.Println(name, password)user := models.FindUserByName(name)if user.Name == "" {c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "该用户不存在","data":    data,})return}flag := utils.ValidPassword(password, user.Salt, user.PassWord)if !flag {c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "密码不正确","data":    data,})return}pwd := utils.MakePassword(password, user.Salt)data = models.FindUserByNameAndPwd(name, pwd)c.JSON(200, gin.H{"code":    0, //  0成功   -1失败"message": "登录成功","data":    data,})
}func FindUserByNameAndPwd(c *gin.Context) {data := models.UserBasic{}//name := c.Query("name")//password := c.Query("password")name := c.Request.FormValue("name")password := c.Request.FormValue("password")fmt.Println(name, password)user := models.FindUserByName(name)if user.Name == "" {c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "该用户不存在","data":    data,})return}flag := utils.ValidPassword(password, user.Salt, user.PassWord)if !flag {c.JSON(200, gin.H{"code":    -1, //  0成功   -1失败"message": "密码不正确","data":    data,})return}pwd := utils.MakePassword(password, user.Salt)data = models.FindUserByNameAndPwd(name, pwd)c.JSON(200, gin.H{"code":    0, //  0成功   -1失败"message": "登录成功","data":    data,})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELK安装、部署、调试(五)filebeat的安装与配置

1.介绍 logstash 也可以收集日志,但是数据量大时太消耗系统新能。而filebeat是轻量级的,占用系统资源极少。 Filebeat 由两个主要组件组成:harvester 和 prospector。 采集器 harvester 的主要职责是读取单个文件的内容。读取每个文件&…

编译链接实战(14)符号重定位与重定位表

文章目录 1、什么是符号重定位2、重定位表1、什么是符号重定位 符号重定位的存在是为了解决程序中的符号引用问题。当一个可执行文件或共享库被编译时,其中可能会引用其他对象文件或共享库中定义的函数、变量或其他符号。这些引用通常以符号的名称表示,而不是实际的内存地址…

机器学习技术(六)——有监督学习算法之线性回归算法实操

机器学习技术(五)——有监督学习之线性回归算法实操 引言: 机器学习监督算法是一种基于已有标记数据的学习方法,通过对已知输入和输出数据的学习,建立一个模型来预测新的输入数据的输出。这种算法模仿人类的学习过程&a…

安防监控/视频汇聚平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?

安防监控/云存储/磁盘阵列存储/视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RT…

Web 应用开发 - 实训一 网页开发

Web应用开发 实训一 网页开发 一、预习: 1、阅读:教材P1-P39 2、要掌握知识要点:表单标记、超链接标记、CSS的引用方式、CSS选择器、DOM、JavaScript的引入(内嵌式、外链式)、JavaScript的使用(事件处理…

服务器允许ssh登录root

用vim打开/etc/ssh/sshd_config sudo vim /etc/ssh/sshd_config将sshd_config中的PermitRootLogin属性改为yes ... PermitRootLogin yes ...重启sshd服务 sudo service sshd restart

docker 笔记2 Docker镜像和数据卷

参考: 1.镜像是什么?(面试题) 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文…

微信小程序-生成canvas图片并保存到手机相册

wxml页面 <button class"rightbtn bottomBtnCss" catch:tap"canvasImg"><image src{{imgUrl}}/images/mine/jspj-icon.png class"restNumImg"></image><text class"btnText">生成图片</text></but…

算法笔记——路径问题

在引入介绍如何写一个算法的时候&#xff0c;我们先引入一个题作为例子 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 作为刚开始学习算法的我们&#xff0c;看到这个题目的时候&#xff0c;应该想好以下的问题&#xff1a; 1.状态表示 我们要用什么来表…

Windows7安装SSH客户端的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

SQL sever中库管理

目录 一、创建数据库 1.1库界面方式 1.2SQL命令方式 二、修改数据库 2.1库界面方式 2.2SQL命令方式 三、删除数据库 3.1库界面方式 3.2SQL命令方式 四、附加和分离数据库 4.1附加和分离数据库概述 4.2作用 4.3附加和分离数据库方法 4.4示例 一、创建数据库 1.1库…

第 3 章 栈和队列 (循环队列)

1. 背景说明 和顺序栈相类似&#xff0c;在队列的顺序存储结构中&#xff0c;除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外&#xff0c; 尚需附设两个指针 front 和 rear 分别指示队列头元素及队列尾元素的位置。约定&#xff1a;初始化建空队列时&#x…

力扣:81. 搜索旋转排序数组 II(Python3)

题目&#xff1a; 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 [nums[k], nums[k1], .…

XmlDocument.SelectNodes 不起作用

今天采用Xpath读取Xml节点&#xff0c;怎么都读不出。 问题分析&#xff1a; 错误代码如下&#xff1a; XmlDocument xmlD new XmlDocument();xmlD.PreserveWhitespace true;xmlD.LoadXml(xStr);xmlD.SelectNodes("job-scheduling-data/schedule/job");经排查 do…

Python学习笔记——从面试题出发学习Python

Python学习笔记——从面试题出发学习Python Python学习笔记——从面试题出发学习Python1. 可变数据类型与不可变数据类型&#xff0c;深拷贝与浅拷贝&#xff0c;函数参数的传递机制1.1 变量与对象1.2 可变数据类型与不可变数据类型1.3 深拷贝与浅拷贝1.4 函数参数的传递机制1.…

element-plus的周选择器 一周从周一开始

1、代码 1&#xff09;、template中 <el-date-picker v-model"value1" type"week" format"[Week] ww" placeholder"巡访周" change"change"value-format"YYYY-MM-DD" /> 2&#xff09;、方法中 import…

Matlab(画图初阶)

目录 1.plot()函数 2. hold(添加新绘图是否保留旧绘图) 3. Plot Style 3.1 线型 3.2 标记 3.3 颜色 ​编辑 4. legend() 5.X 、Y and Title&#xff1f; 6. Text()和annotation() 7.line(创建基本线条) 7.1 基本语法 7.2 指定线条属性 7.3 更改线条属性 8.图像属性 8.1 …

c++入门一

参考&#xff1a;https://www.learncpp.com/cpp-tutorial/ When you finish, you will not only know how to program in C, you will know how NOT to program in C, which is arguably as important. Tired or unhappy programmers make mistakes, and debugging code tends…

软考高级架构师——6、软件架构设计

像学写文章一样&#xff0c;在学会字、词、句之后&#xff0c;就应上升到段落&#xff0c;就应追求文章的“布局谋 篇”&#xff0c;这就是架构。通俗地讲&#xff0c;软件架构设计就是软件系统的“布局谋篇”。 人们在软件工程实践中&#xff0c;逐步认识到了软件架构的重要性…

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力

一. 样例介绍 本篇Codelab基于自适应布局和响应式布局&#xff0c;实现购物应用在手机、折叠屏、平板不同屏幕尺寸设备上按不同设计显示。通过三层工程结构组织代码&#xff0c;实现一次开发&#xff0c;多端部署 。 手机运行效果如图所示&#xff1a; 折叠屏运行效果图&#x…