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

Go语言实现用户登录Web应用

文章目录

  • 1. Go语言Web框架
    • 1.1 框架比较
    • 1.2 安装Gin框架
  • 2. 实现用户登录功能
    • 2.1 创建项目目录
    • 2.2 打开项目目录
    • 2.3 创建登录Go程序
    • 2.4 创建模板页面
      • 2.4.1 登录页面
      • 2.4.2 登录成功页面
      • 2.4.3 登录失败页面
  • 3. 测试用户登录项目
    • 3.1 运行登录主程序
    • 3.2 访问登录页面
    • 3.3 演示登录成功
    • 3.4 演示登录失败
  • 4. 改进版 —— 引入数据库
    • 4.1 创建数据与表
    • 4.2 安装数据库驱动
    • 4.3 修改登录Go程序
      • 4.3.1 导入数据库相关包
      • 4.3.2 创建初始化函数
      • 4.3.3 创建登录函数
      • 4.3.4 修改登录处理器函数
    • 4.4 测试用户登录项目
      • 4.4.1 运行登录Go程序
      • 4.4.2 访问登录页面
      • 4.4.3 演示登录成功
      • 4.4.4 演示登录失败
  • 5. 实战总结

1. Go语言Web框架

1.1 框架比较

  • Gin框架以其高性能和简洁的API设计而闻名,适合构建RESTful API和Web应用。Echo框架则提供了更多的中间件支持和更灵活的路由配置。Beego框架则提供了一个全功能的解决方案,包括ORM、缓存、日志等。

1.2 安装Gin框架

  • 执行命令:go get -u github.com/gin-gonic/gin
    在这里插入图片描述
  • 查看是否安装成功,执行命令:go list github.com/gin-gonic/gin
    在这里插入图片描述

2. 实现用户登录功能

2.1 创建项目目录

  • go_work里创建login目录,然后在login里创建templates
    在这里插入图片描述

2.2 打开项目目录

  • 在VsCode里打开login目录
    在这里插入图片描述

2.3 创建登录Go程序

  • login目录里创建login.go
    在这里插入图片描述
package mainimport ("net/http""github.com/gin-gonic/gin""path/filepath"  "log"   
)func main() {// 创建一个带有默认中间件Logger和Recovery的Gin路由器实例router := gin.Default()    // 使用filepath.Glob获取所有.tmpl模板文件的路径tmplFiles, err := filepath.Glob("templates/*.tmpl")if err != nil {log.Fatal("Error reading templates: ", err)}// 加载模板文件router.LoadHTMLFiles(tmplFiles...)    // 显示登录页面router.GET("/", func(c *gin.Context) {c.HTML(http.StatusOK, "login.tmpl", nil)})// 处理登录请求router.POST("/login", loginHandler)// 成功页面路由router.GET("/success", func(c *gin.Context) {// 从查询参数中获取用户名username := c.Query("username")// 将用户名传递给模板c.HTML(http.StatusOK, "success.tmpl", gin.H{"username": username})})// 失败页面路由router.GET("/failure", func(c *gin.Context) {// 从查询参数中获取用户名username := c.Query("username")c.HTML(http.StatusOK, "failure.tmpl", gin.H{"username": username})})// 启动服务器router.Run(":8080")
}// loginHandler 处理用户登录请求
func loginHandler(c *gin.Context) {// 获取表单数据username := c.PostForm("username")password := c.PostForm("password")// 假设的用户名和密码if username == "无心剑" && password == "903213" {        // 登录成功,跳转到success页面,并带查询参数c.Redirect(http.StatusFound, "success?username=" + username)} else {// 登录失败,跳转到failure页面,并带查询参数c.Redirect(http.StatusFound, "failure?username=" + username)}
}
  • 代码说明:这段Go代码使用Gin框架创建了一个简单的Web服务器,用于处理用户登录,并根据登录结果重定向到成功或失败页面。服务器在8080端口启动,提供三个路由:根路由(“/”)显示登录页面,“/login"处理登录逻辑,”/success"和"/failure"分别显示登录成功和失败的信息。登录成功后,用户名作为查询参数传递给成功页面的模板,失败页面同理。使用filepath.Glob获取所有模板文件并加载,模板文件存放在templates目录下。登录验证逻辑假设用户名为"无心剑",密码为"903213"。

2.4 创建模板页面

2.4.1 登录页面

  • templates里创建login.tmpl文件
    在这里插入图片描述
<html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>用户登录</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}body {font-family: Arial, sans-serif;background-color: #f5f5f5;}.container {max-width: 300px;margin: 50px auto;background-color: #ffffff;padding: 20px;border-radius: 5px;box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);}h3 {text-align: center;}form {display: flex;flex-direction: column;}label {margin-top: 10px;}input[type="text"],input[type="password"] {width: 100%;padding: 8px;margin-top: 5px;border: 1px solid #ccc;border-radius: 3px;}button {width: 100%;padding: 10px;margin-top: 10px;background-color: #4CAF50;color: white;border: none;border-radius: 3px;cursor: pointer;}button:hover {background-color: #45a049;}        </style></head><body><div class="container"><h3>用户登录</h3><form action="login" method="POST"><input type="text" id="username" name="username" required placeholder="请输入用户名"><input type="password" id="password" name="password" required placeholder="请输入密码"><button type="submit">登录</button>            </form></div></body>
</html>

2.4.2 登录成功页面

  • templates里创建success.tmpl文件
    在这里插入图片描述
<html><head><title>登录成功</title><style>.framed {border: 2px solid #000; /* 设置边框宽度、样式和颜色 */border-radius: 15px; /* 设置圆角边框 */padding: 10px; /* 设置内边距 */width: fit-content; /* 设置宽度为适合内容 */background-color: #f0f0f0; /* 设置背景颜色为浅灰色 */color: #f33; /* 设置文本颜色 */display: inline-block; /* 防止阴影和边框被裁剪 */}.centered {text-align: center; /* 使包含元素的文本居中 */margin-top: 50px; /* 添加上边距 */margin-bottom: 50px; /* 添加下边距 */}</style></head><body><div class="centered"><h3 class="framed">恭喜,{{ .username }}登录成功~</h3></div></body>
</html>

2.4.3 登录失败页面

  • templates里创建failure.tmpl文件
    在这里插入图片描述
<html><head><title>登录失败</title><style>.framed {border: 2px solid #000; /* 设置边框宽度、样式和颜色 */border-radius: 15px; /* 设置圆角边框 */padding: 10px; /* 设置内边距 */width: fit-content; /* 设置宽度为适合内容 */background-color: #f0f0f0; /* 设置背景颜色为浅灰色 */color: #33f; /* 设置文本颜色 */display: inline-block; /* 防止阴影和边框被裁剪 */}.centered {text-align: center; /* 使包含元素的文本居中 */margin-top: 50px; /* 添加上边距 */margin-bottom: 50px; /* 添加下边距 */}</style></head><body><div class="centered"><h3 class="framed">遗憾,{{ .username }}登录失败~</h3></div></body>
</html>

3. 测试用户登录项目

3.1 运行登录主程序

  • 运行login.go程序
    在这里插入图片描述

3.2 访问登录页面

  • 访问http://localhost:8080/
    在这里插入图片描述

3.3 演示登录成功

  • 输入正确的用户名和密码
    在这里插入图片描述
  • 单击【登录】按钮,跳转到登录成功页面
    在这里插入图片描述

3.4 演示登录失败

  • 输入错误的用户名或密码
    在这里插入图片描述
  • 单击【登录】按钮,跳转到登录失败页面
    在这里插入图片描述

4. 改进版 —— 引入数据库

4.1 创建数据与表

  • 数据库testdb与表t_user
    在这里插入图片描述

4.2 安装数据库驱动

  • 执行命令:go get -u github.com/go-sql-driver/mysql
    在这里插入图片描述

4.3 修改登录Go程序

4.3.1 导入数据库相关包

  • 导入"database/sql"_ "github.com/go-sql-driver/mysql"
    在这里插入图片描述
  • 代码说明:“database/sql” 是Go标准库的一部分,用于数据库操作。而 _ “github.com/go-sql-driver/mysql” 这行代码的意思是导入 github.com/go-sql-driver/mysql 包,但不直接使用它的任何公开API。这样做的目的是让该包在程序启动时自动执行它的 init 函数。

4.3.2 创建初始化函数

  • 创建init()函数
    在这里插入图片描述
var db *sql.DBfunc init() {var err error// 设置数据源dsn := "root:903213@tcp(127.0.0.1:3306)/testdb"// 打开数据库db, err = sql.Open("mysql", dsn)if err != nil {log.Fatal("Error connecting to the database: ", err)}if err = db.Ping(); err != nil {log.Fatal("Error pinging the database: ", err)}
}
  • 代码说明:这段代码初始化一个全局的*sql.DB数据库连接对象。init函数在程序启动时自动执行,用于设置数据库数据源(DSN),并尝试打开和测试数据库连接。如果连接失败,程序将记录错误并终止执行。这里使用的DSN包含了用户名、密码、地址和数据库名。确保在运行前数据库服务已启动,并且DSN配置正确。

4.3.3 创建登录函数

  • 创建login()函数
    在这里插入图片描述
func login(username, password string) bool {// 查询数据库中的用户信息var storedPassword stringerr := db.QueryRow("SELECT password FROM t_user WHERE username = ?", username).Scan(&storedPassword)if err != nil {log.Print("Error querying database: ", err)        return false}// 验证密码if password == storedPassword {return true} else {return false}
}

4.3.4 修改登录处理器函数

  • 修改loginHandler()函数代码
    在这里插入图片描述

4.4 测试用户登录项目

4.4.1 运行登录Go程序

  • 运行login.go程序
    在这里插入图片描述

4.4.2 访问登录页面

  • 访问http://localhost:8080/
    在这里插入图片描述

4.4.3 演示登录成功

  • 查看用户表
    在这里插入图片描述
  • 输入第二个用户信息:郑晓红11111
    在这里插入图片描述
  • 单击【登录】按钮,跳转到登录成功页面
    在这里插入图片描述

4.4.4 演示登录失败

  • 输入错误的用户名或密码:张三丰123456
    在这里插入图片描述
  • 单击【登录】按钮,跳转到登录失败页面
    在这里插入图片描述

5. 实战总结

  • 在本次实战项目中,我们成功地使用Go语言的Gin框架开发了一个具有数据库支持的用户登录系统。通过初始化项目结构、编写后端逻辑、设计前端页面,我们实现了一个完整的Web应用。我们学习了如何使用Gin框架处理HTTP请求、如何连接MySQL数据库以及如何使用模板渲染页面。此外,我们还掌握了如何通过查询参数在不同的页面间传递数据。这个项目不仅加深了我们对Web开发的理解,也锻炼了我们解决实际问题的能力。通过测试不同的登录场景,我们验证了系统的功能性和健壮性。总的来说,这是一个提高编程技能和学习新知识的宝贵经验。

相关文章:

Go语言实现用户登录Web应用

文章目录 1. Go语言Web框架1.1 框架比较1.2 安装Gin框架 2. 实现用户登录功能2.1 创建项目目录2.2 打开项目目录2.3 创建登录Go程序2.4 创建模板页面2.4.1 登录页面2.4.2 登录成功页面2.4.3 登录失败页面 3. 测试用户登录项目3.1 运行登录主程序3.2 访问登录页面3.3 演示登录成…...

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况&#xff0c;比如运营商支持大范围的imsi&#xff0c;或者是测试人员写卡位数的问题等等&#xff0c;因此就需要模式匹配&#xff08;包含但不限于正则表达式&#xff09;。 基本概念: 模式匹配涉及定义一个“模式”&a…...

微信小程序中使用离线版阿里云矢量图标

前言 阿里矢量图库提供的在线链接服务仅供平台体验和调试使用&#xff0c;平台不承诺服务的稳定性&#xff0c;企业客户需下载字体包自行发布使用并做好备份。 1.下载图标 将阿里矢量图库的图标先下载下来 解压如下 2.转换格式 贴一个地址用于转换格式&#xff1a;Onlin…...

hive的tblproperties支持修改的属性

文章目录 一、介绍二、查看TBLPROPERTIES属性三、修改TBLPROPERTIES属性 一、介绍 TBLPROPERTIES用途&#xff1a;向表中添加自定义或预定义的元数据属性&#xff0c;并设置它们的赋值。在hive建表时&#xff0c;可设置TBLPROPERTIES参数修改表的元数据&#xff0c;也能通过AL…...

移动端开发

一、一些概念 &#xff08;一&#xff09;、屏幕相关 1、屏幕大小 指屏幕的对角线长度&#xff0c;单位是英寸&#xff08;inch&#xff09;。常用尺寸有&#xff1a;3.5寸、4.7寸、5.0寸、5.5寸、6.0寸等 备注&#xff1a;1英寸&#xff08;inch&#xff09;2.54厘米&…...

光伏行业内卷到什么程度了?

现在每个行业都在内卷&#xff0c;光伏行业也一样在内卷中&#xff0c;但是光伏行业的内卷体现在多个方面&#xff0c;下面给举例。 一、产能竞争激烈&#xff1a; 产能扩张迅速&#xff1a;过去几年&#xff0c;大量资本涌入光伏行业&#xff0c;企业纷纷扩产。例如&#xf…...

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解)

目录 一、前言 二、栈是排列方式 三、栈的单词 四、程序中的栈 五、栈的方法 1.声明并初始化栈 2.往栈里放东西&#xff08;学名&#xff1a;入栈&#xff09; 3.从栈往外拿东西 &#xff08;学名&#xff1a;出栈&#xff09; 4.清空栈 5.遍历 Stack 6.获取Stack的长…...

学习threejs,使用第一视角控制器FirstPersonControls控制相机

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️第一视角控制器FirstPerson…...

odoo17 前端 在头像下拉 dropdown 自定义菜单

odoo17 前端 在头像下拉 dropdown 自定义菜单 其实很简单, 我们先找到原来已经创建好的, 找到代码位置 使用 我的资料 为例 odoo-17.0\addons\hr\static\src\user_menu\my_profile.js /** odoo-module **/import { _t } from "web/core/l10n/translation"; import …...

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中&#xff0c;项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面&#xff0c;分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤&#xff1a; 需求分析…...

GPT-5 要来了:抢先了解其创新突破

Microsoft 的工程师计划于 2024 年 11 月在 Azure 上部署 Orion (GPT-5)。虽然这一版本不会向公众开放&#xff0c;但其上线被视为人工智能领域的一个重要里程碑&#xff0c;并将产生深远的影响。 文章目录 GPT-5 真的要来了GPT-4 的局限性GPT-5 的创新突破与遗留挑战GPT-5 预期…...

@ComponentScan:Spring Boot中的自动装配大师

文章目录 1. 什么是ComponentScan注解&#xff1f;2. 为什么需要ComponentScan注解&#xff1f;3. 如何使用ComponentScan注解&#xff1f;4. ComponentScan注解的高级用法5. 注意事项6. 结语推荐阅读文章 在Spring Boot的世界里&#xff0c;自动装配&#xff08;Auto-wiring&a…...

uniapp 面试题总结常考

uniapp 文件详情 ├── pages # 页面文件夹 │ │── index # index文件夹 │ │ │── index.vue # index页面 ├── static # 静态资源&#xff08;类似于图片 字体图标等&#xff09; │ …...

花了36元给我的个人博客上了一道防御

前言 双11活动薅了个羊毛&#xff0c;1折的价格买了一年的EdgeOne&#xff0c;正好可以为我的个人博客站点保驾护航。本文就来看看个人博客接入EdgeOne后的效果&#xff0c;如果也想薅羊毛的&#xff0c;赶紧去双11活动页面&#xff0c;不要错过这次机会。 EdgeOne 介绍 先简…...

浅谈C++之内存管理

一、基本介绍 内存管理是C最令人切齿痛恨的问题&#xff0c;也是C最有争议的问题&#xff0c;C高手从中获得了更好的性能&#xff0c;更大的自由&#xff0c;C菜鸟的收获则是一遍一遍的检查代码和对C的痛恨&#xff0c;但内存管理在C中无处不在&#xff0c;内存泄漏几乎在每个C…...

719. 找出第 K 小的数对距离

目录 题目解法 题目 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.length 。返回 所有数对距离中 第 k 小的数对距离。…...

【图像压缩感知】论文阅读:Self-supervised Scalable Deep Compressed Sensing

tips&#xff1a;本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。 Title&#xff1a;Self-supervised Scalable Deep Compressed Sensing Journal&#xff1a;IJCV 2024 代码链接&#xff1a;GitHub - Guaishou74851/SCNet: Self-Supervised Scalable Deep Comp…...

Swift 宏(Macro)入门趣谈(一)

概述 苹果在去年 WWDC 23 中就为 Swift 语言新增了“其利断金”的重要小伙伴 Swift 宏&#xff08;Swift Macro&#xff09;。为此&#xff0c;苹果特地用 2 段视频&#xff08;入门和进阶&#xff09;颇为隆重的介绍了它。 那么到底 Swift 宏是什么&#xff1f;有什么用&…...

linux常见资源查询命令(持续更新)

年纪大了&#xff0c;很多命令记不住了&#xff0c;但偶尔也需要用到&#xff0c;通过搜索也需要点时间&#xff0c;特此记录。 不同操作系统命令会有所区别&#xff0c;下面是大部分时候工作的机器系统&#xff1a; CentOS release 7.5 (Final)Kernel \r on an \m 1、实时查…...

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...