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

news2024/11/22 5:34:59

文章目录

  • 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.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 main

import (
    "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程序

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

func 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配置正确。
  • 创建登录函数 - login()
    在这里插入图片描述
func login(username, password string) bool {
	// 查询数据库中的用户信息
    var storedPassword string
    err := 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
    }
}
  • 修改登录处理器函数 - 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开发的理解,也锻炼了我们解决实际问题的能力。通过测试不同的登录场景,我们验证了系统的功能性和健壮性。总的来说,这是一个提高编程技能和学习新知识的宝贵经验。

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

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

相关文章

25浙江省考--两大模块(数量关系+常识判断)题型积累【2024.12.8考前每日更新】

行政执法C卷&#xff0c;两大模块题量占比&#xff1a;35/115&#xff0c;每题 100 115 \frac{100}{115} 115100​分&#xff0c;时间分配&#xff1a;20~35分钟&#xff0c;留10分钟涂卡 数量关系【题量占比&#xff1a;15/115】【时间分配&#xff1a;15~30分钟】 数字推理…

【掌握未来办公:OnlyOffice 8.2深度使用指南与新功能揭秘】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 一、功能亮点1. PDF文档的协同编辑2. PDF表单的电子签名3. 界面的现代化改造4. 性能的显著提升5. 文…

AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)

一、预训练语言模型概述 ​ 预训练语言模型在自然语言处理领域占据着至关重要的地位。它以其卓越的语言理解和生成能力&#xff0c;成为众多自然语言处理任务的关键工具。 预训练语言模型的发展历程丰富而曲折。从早期的神经网络语言模型开始&#xff0c;逐渐发展到如今的大规…

EulerOS 编译安装 ffmpeg

EulerOS 编译安装 ffmpeg 欧拉系统是国内自主研发的服务器操作系统&#xff0c;EulerOS基于CentOS的源码开发&#xff0c;运行环境兼容CentOS&#xff0c;国内的华为云、天翼云、移动云、联通云均采用欧拉系统。 安装工具包 经实测&#xff0c;在欧拉系统上需要通过yum安装下…

JavaWeb:文件上传1

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

Vue3中使用LogicFlow实现简单流程图

实现结果 实现功能&#xff1a; 拖拽创建节点自定义节点/边自定义快捷键人员选择弹窗右侧动态配置组件配置项获取/回显必填项验证历史记录&#xff08;撤销/恢复&#xff09; 自定义节点与拖拽创建节点 拖拽节点面板node-panel.vue <template><div class"node-…

机器学习——贝叶斯

&#x1f33a;历史文章列表&#x1f33a; 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…

大模型书籍推荐丨这本书必看:大语言模型 基础与前沿(附PDF)

哈喽大家好&#xff01;很久都没有更新大模型这块的书了&#xff0c;今天给大家说一下这本&#xff1a;《大语言模型&#xff1a;基础与前沿》&#xff0c;本书深入阐述了大语言模型的基本概念和算法、研究前沿以及应用&#xff0c;涵盖大语言模型的广泛主题&#xff0c;从基础…

Tofu AI视频处理模块视频输入配置方法

应用Tofu产品对网络视频进行获取做视频处理时&#xff0c;首先需要配置Tofu产品的硬件连接关系与设备IP地址、视频拉流地址。 步骤1 Tofu设备点对点直连或者通过交换机连接到电脑&#xff0c;电脑IP配置到与Tofu默认IP地址同一个网段。 打开软件 点击右上角系统设置 单击左侧…

MTSET可溶于DMSO、DMF、THF等有机溶剂,并在水中有轻微的溶解性,91774-25-3

一、基本信息 中文名称&#xff1a;[2-(三甲基铵)乙基]甲硫基磺酸溴&#xff1b;MTSET巯基反应染料 英文名称&#xff1a;MTSET&#xff1b;[2-(Trimethylammonium)ethyl]methanethiosulfonate Bromide CAS号&#xff1a;91774-25-3 分子式&#xff1a;C6H16BrNO2S2 分子量…

BERT框架详解

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google在2018年提出的一种自然语言处理&#xff08;NLP&#xff09;模型。BERT通过使用Transformer架构&#xff0c;实现了对文本的双向上下文理解&#xff0c;从而在多个NLP任务中取…

定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)

一、QTimer与QRandomGenerator &#xff08;一&#xff09;QTimer&#xff08;定时器&#xff09;[2] QTimer类为定时功能提供了一个高级编程接口。在使用QTimer时&#xff0c;实例化一个QTimer对象并将其timeout()发射信号与合适的信号槽相连接。通过调用QTimer的start()函数…

Linux 进程线程间通信总结

线程 线程共享存储空间主要带来的问题是数据同步和互斥。由于线程在同一进程中运行&#xff0c;它们共享相同的内存空间&#xff0c;任何线程都可以访问共享数据。这样&#xff0c;多个线程并发执行时&#xff0c;可能会导致以下两种主要问题&#xff1a; 互斥问题&#xff0…

什么是RAG? LangChain的RAG实践!

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型&#xff1a; 基于预训练模型&#xff08;当时LLM的概念不像现在这么如日中天&#xff0…

Python 进阶函数教程

Python 进阶函数教程 引言 在 Python 编程中&#xff0c;函数是组织代码、提高可重用性和可读性的关键组成部分。尽管许多初学者掌握了基本的函数定义和调用&#xff0c;但 Python 还提供了许多高级功能&#xff0c;使函数更加灵活和强大。本文将深入探讨 Python 中的高级函数…

ReactPress:深入解析技术方案设计与源码

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress是一个基于React框架开发的开源发布平台&#xff0c;它不仅仅是一个简单的博客系统&#xff0c;更是一个功能全…

c++实现B树(下)

书接上回小吉讲的是B树的搭建和新增方法的实现&#xff08;blog传送门&#x1f6aa;&#xff1a;B树实现上&#xff09;&#xff08;如果有小可爱对B树还不是很了解的话&#xff0c;可以先看完上一篇blog&#xff0c;再来看小吉的这篇blog&#xff09;。那这一篇主要讲的是B树中…

【漏洞分析】Fastjson最新版本RCE漏洞

01漏洞编号 CVE-2022-25845CNVD-2022-40233CNNVD-202206-1037二、Fastjson知多少 万恶之源AutoType Fastjson的主要功能是将Java Bean序列化为JSON字符串&#xff0c;这样得到的字符串就可以通过数据库等方式进行持久化了。 但是&#xff0c;Fastjson在序列化及反序列化的过…

PSRAM,Flash,SRAM,ROM有什么区别

PSRAM、Flash、SRAM 和 ROM 是四种不同类型的存储器&#xff0c;它们在计算机和嵌入式系统中的用途、特性和工作方式各不相同。下面是这四种存储器的区别和各自的特点&#xff1a; ### 1. **SRAM&#xff08;静态随机存取存储器&#xff09;** - **特性**&#xff1a; - **易…

大数据学习13之Scala基础语法(重点)

1. 简介 Scala 是 Scalable Language 的简写&#xff0c;是一门多范式的编程语言。创始人为 Martin Odersky 马丁奥德斯基。 Scala 这个名字来源于 Scalable Language(可伸缩的语言&#xff09;&#xff0c;它是一门基于 JVM 的多范式编程语言&#xff0c;通俗的说&#xff1a;…