首页 > 其他分享 >Chat App 项目之解析(九)

Chat App 项目之解析(九)

时间:2024-08-22 12:53:55浏览次数:6  
标签:http err nil App 用户 Chat Error 解析 log

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读468次,点赞12次,收藏3次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以查看和管理聊天记录。本文将详细介绍index.html文件的实现细节,包括代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141330140Chat App 项目之解析(二)-CSDN博客文章浏览阅读496次,点赞10次,收藏16次。在前一篇博客中,我们介绍了 Chat App 的主页index.html。本篇将深入探讨用户注册页面,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141330781Chat App 项目之解析(三)-CSDN博客文章浏览阅读426次,点赞18次,收藏17次。在前一篇博客中,我们介绍了用户注册页面。本篇将深入探讨用户登录页面login.html,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。login.html。https://blog.csdn.net/qq_45519030/article/details/141331037

Chat App 项目之解析(四)-CSDN博客文章浏览阅读705次,点赞28次,收藏19次。在前一篇博客中,我们详细介绍了用户登录页面login.html。本篇将深入探讨聊天室页面chat.html,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。chat.html。https://blog.csdn.net/qq_45519030/article/details/141331411Chat App 项目之解析(五)-CSDN博客文章浏览阅读890次,点赞25次,收藏7次。在前一篇博客中,我们详细介绍了聊天室页面chat.html。本篇将深入探讨样式表styles.css,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。styles.css。https://blog.csdn.net/qq_45519030/article/details/141331696Chat App 项目之解析(六)-CSDN博客文章浏览阅读274次,点赞18次,收藏14次。在前一篇博客中,我们详细介绍了样式表styles.css。本篇将深入探讨管理员登录页面,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141331943Chat App 项目之解析(七)-CSDN博客文章浏览阅读842次,点赞16次,收藏9次。在前一篇博客中,我们详细介绍了管理员登录页面。本篇将深入探讨管理员聊天记录页面,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141332107Chat App 项目之解析(八)-CSDN博客文章浏览阅读681次,点赞14次,收藏22次。在前一篇博客中,我们详细介绍了管理员聊天记录页面。本篇将深入探讨后端服务server.go,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。用户认证模块:负责用户的注册和登录。WebSocket 通信模块:实现客户端与服务器之间的实时消息传递。数据库模块:存储用户信息和聊天记录。管理员接口:提供管理员查看、删除和过滤聊天记录的功能。用户在线状态管理:实时显示用户的在线状态。消息加密与解密:确保消息在传输过程中的安全性。用户权限控制:实现更复杂的用户权限管理。用户注册。https://blog.csdn.net/qq_45519030/article/details/141332531

我们接着上一篇后端内容接着讲!

用户在线状态管理

用户在线状态管理模块负责实时显示用户的在线状态。服务器维护一个在线用户列表,当用户连接或断开 WebSocket 连接时,更新该列表并通知所有客户端。

功能介绍
  • 在线状态管理:实时显示用户的在线状态。

示例代码:在线状态管理
package main

import (
    "encoding/json"
    "log"
    "net/http"
    "sync"

    "github.com/gorilla/websocket"
)

func onlineStatusHandler(w http.ResponseWriter, r *http.Request) {
    if err != nil {
        log.Println("Error upgrading connection:", err)
        return
    }
    defer conn.Close()

    if email == "" {
        http.Error(w, "Invalid email", http.StatusBadRequest)
        return
    }

    onlineUsersMutex.Lock()

    defer func() {
        onlineUsersMutex.Lock()
    }()

    for {
        if err != nil {
            log.Println("Error reading message:", err)
            break
        }
    }
}

func broadcastOnlineUsers() {
    for {
        onlineUsersMutex.Lock()
        onlineUsersMutex.Unlock()

        msg, err := json.Marshal(users)
        if err != nil {
            log.Println("Error marshalling online users:", err)
            continue
        }

        for conn := range connections {
            if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
                log.Println("Error writing message:", err)
                continue
            }
        }

    }
}

代码解释

  • onlineStatusHandler 函数处理用户在线状态的 WebSocket 连接。
  • 使用 onlineUsersMutex 互斥锁管理在线用户列表,确保并发安全。
  • broadcastOnlineUsers 函数定期广播在线用户列表给所有连接的客户端。

消息加密与解密

消息加密与解密模块确保消息在传输过程中的安全性。服务器在发送消息前对其进行加密,客户端在接收消息后对其进行解密。

功能介绍
  • 消息加密:在发送消息前对其进行加密。
  • 消息解密:在接收消息后对其进行解密。

示例代码:消息加密与解密
package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/base64"
    "io"
    "log"
)

func encrypt(text []byte) (string, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }

    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return "", err
    }

    stream := cipher.NewCFBEncrypter(block, iv)

    return base64.URLEncoding.EncodeToString(ciphertext), nil
}

func decrypt(cryptoText string) ([]byte, error) {
    ciphertext, err := base64.URLEncoding.DecodeString(cryptoText)
    if err != nil {
        return nil, err
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]

    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)

    return ciphertext, nil
}

func messageHandlerWithEncryption(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("Error upgrading connection:", err)
        return
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println("Error reading message:", err)
            connMutex.Lock()
            connMutex.Unlock()
            break
        }

        if err := json.Unmarshal(message, &msg); err != nil {
            log.Println("Error unmarshalling message:", err)
            continue
        }

        encryptedMessage, err := encrypt([]byte(msg.Message))
        if err != nil {
            log.Println("Error encrypting message:", err)
            continue
        }

        msg.Message = encryptedMessage

        log.Printf("Received message from %s: %s\n", msg.Email, msg.Message)

        if err != nil {
            log.Println("Error inserting message:", err)
        }

        for conn := range connections {
            if err := conn.WriteJSON(msg); err != nil {
                log.Println("Error writing message:", err)
                continue
            }
        }
    }
}

代码解释

  • encrypt 函数对消息进行加密。
  • decrypt 函数对消息进行解密。
  • messageHandlerWithEncryption 函数处理 WebSocket 消息,并在发送消息前对其进行加密。

用户权限控制

用户权限控制模块实现更复杂的用户权限管理。服务器根据用户的角色和权限,限制其访问某些功能和数据。

功能介绍
  • 权限管理:根据用户的角色和权限,限制其访问某些功能和数据。

示例代码:用户权限控制
package main

import (
    "log"
    "net/http"
)

func adminOnly(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        email := r.Header.Get("Email")

        var role string
        if err != nil {
            log.Println("Error querying user role:", err)
            return
        }

        if role != "admin" {
            http.Error(w, "Forbidden", http.StatusForbidden)
            return
        }

        h(w, r)
    }
}

func userOnly(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        email := r.Header.Get("Email")
        if email == "" {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }

        if err != nil {
            log.Println("Error querying user role:", err)
            http.Error(w, "Internal server error", http.StatusInternalServerError)
            return
        }

        if role != "user" && role != "admin" {
            http.Error(w, "Forbidden", http.StatusForbidden)
            return
        }

        h(w, r)
    }
}

func main() {
    log.Println("Starting server on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

代码解释

  • adminOnly 函数是一个中间件,用于限制只有管理员角色的用户才能访问特定的处理函数。
  • userOnly 函数是一个中间件,用于限制只有用户或管理员角色的用户才能访问特定的处理函数。
  • 在 main 函数中,使用这些中间件来保护特定的API端点。

安全性考虑

在实现上述功能的同时,我们也考虑了一些安全性问题:

  1. 密码存储:用户的密码在存储时应该进行加密处理,避免明文存储带来的安全风险。
  2. 输入验证:在处理用户输入时,应该进行严格的验证,防止SQL注入和XSS攻击。
  3. 访问控制:管理员接口应该进行严格的访问控制,确保只有授权的管理员才能访问。
  4. 消息加密:在消息传输过程中进行加密,确保消息的安全性。
  5. 用户权限控制:根据用户的角色和权限,限制其访问某些功能和数据。

总结

本文深入探讨了如何使用 Go 语言构建一个功能完备的实时聊天系统,该系统不仅支持用户注册、登录,还提供了管理员接口用于管理聊天记录。

此外,我们还扩展了系统的功能,包括用户在线状态管理、消息加密和解密、以及更复杂的用户权限控制。

希望本项目能为对实时通信系统感兴趣的读者提供一些参考和帮助。

完整详细代码请访问以下链接(godev/ChatAPP):

GitHub - alexjjzc/godev: go language developmentgo language development. Contribute to alexjjzc/godev development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/alexjjzc/godev

标签:http,err,nil,App,用户,Chat,Error,解析,log
From: https://blog.csdn.net/qq_45519030/article/details/141334094

相关文章

  • uinapp-V3 创建项目
    1.去官网下在:网址:*1.uni-app官网(dcloud.io)*2.VisualStudioCode-CodeEditing.Redefined下载往后就是这两个app图标:因为我们最后打包都是通过HBuilderX打包所以尽量使用HBuilderX编写vueV3项目HBuilderX 下载需要看系统是Windows还是MacOSX下载对应的......
  • 国内外ChatGPT镜像网站集合【2024-8月最新】~
     一、GPT4o& &4.0turbo&GPT4omini介绍总有人问我,GPT4o、GPT4.0和GPT3.5有什么区别?国内怎么才能用上,听说很复杂以一张表来表达他们的区别吧GPT3.5、GPT3.5Turbo、GPT4.0均已经被官方放弃维护,也就是说我们其实已经使用不到这几个模型了。目前官方主流开放的模型有GP......
  • 一网打尽,国内外ChatGPT镜像网站集合【2024-08最新】AI编程、AI写作、AI对话、AI翻译、
    一网打尽,我经过一年多搜集的各种AI工具,使用的都是最强最新的大语言模型,都是在各自领域独领风骚的产品。1:【AI站点】AIPlus 推荐指数:⭐️⭐️⭐️⭐️⭐️推荐理由:一个AI综合网站,有多个GPT和绘画站,每个站点都很流畅且可用2:【AI编程】https://zed.dev/推荐指数:⭐️⭐️⭐️⭐️⭐️推荐理......
  • LLM | 一文带你揭秘大语言模型ChatGPT的原理
    本文包含大量AI干货预计阅读时间:10分钟本文学习目标:定义语言模型和大型语言模型(LLM)。介绍关键的LLM概念,包括TransFormer和自注意力机制。介绍LLM提示工程、微调和Rag,以及当今热门的大语言模型应用。前言在当今的科技时代,大型语言模型(LLM)正以惊人的速度发展并......
  • 零成本搭建个人 APP 和小程序后台
    前言前面也说了,通过GitHubPages+GitHubActions只是解决了动态数据展示,但是要零成本得完成将用户信息存储下来,并实现数据交互呢?我开始是想用云文档,种种原因,我还是希望有个自己能二次修改的后台,于是就选择了Vercel+Railway方式。虽然网上也有很多人介绍这俩平台的玩法,但都......
  • 从开发者视角解析提示词工程:大模型时代的新型编程范式
    1.引言在人工智能飞速发展的今天,大语言模型(LLM)、智能代理(Agent)、检索增强生成(RAG)、以及提示词工程(PromptEngineering)这些词语频繁出现在我们的技术讨论中。今天,我们来聊聊提示词工程,看看它怎么成为开发者手中一种新型的“编程语言”。2.传统软件开发流程回顾说到软件开发,大......
  • 短视频图文带货:计划建模的深度解析与实践
    随着数字营销的快速发展,短视频图文带货已经成为了一种日益重要的营销手段。相较于传统的营销方式,短视频图文带货具有更高的互动性和传播性,能够更好地吸引和留住用户。然而,如何做好短视频图文带货并非易事。许多商家和品牌虽然投入了大量的人力物力,但最终效果并不理想。这其中的......
  • Goby 漏洞发布|泛微 e-cology v10 appThirdLogin 权限绕过漏洞【漏洞复现】
    漏洞名称:泛微e-cologyv10appThirdLogin权限绕过漏洞EnglishName:Weavere-cologyv10appThirdLoginPermissionBypassVulnerabilityCVSScore:7.5漏洞描述:泛微新一代数字化运营构建平台E10,是基于原eteams平台之上全新研发,同时融合了原E9产品的所有功能,最终研发出全新......
  • 霸王餐返利APP的技术架构与业务模型分析
    霸王餐返利APP的技术架构与业务模型分析大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!霸王餐返利APP作为一种新型的电商导购平台,通过提供用户参与霸王餐活动的机会,结合返利机制,吸引用户参与并促进消费。本文将深入分析霸王餐返利APP......
  • df['料品分类'].apply(format_value) 是一个 Pandas 操作,用于对 DataFrame 中的 '料品
    df['料品分类'].apply(format_value)是一个Pandas操作,用于对DataFrame中的'料品分类'列的每个值应用一个名为format_value的函数,并将处理后的结果返回给这一列。分解解释df['料品分类']:这部分代码选择DataFramedf中名为'料品分类'的列。df是一个PandasDat......