基于 gin + websocket 即时通讯项目 (一、项目初始化)

基于 gin + websocket 即时通讯项目

1、安装环境与初始化

  • 搜索各种包官网

https://pkg.go.dev/

image-20231118154355946

1.1 安装 grom


go get -u gorm.io/grom

image-20231118150809109

1.2 安装 MySQL 驱动


go get -u gorm.io/driver/sqlite

go get -u gorm.io/driver/mysql

image-20231118154812322

1.3 安装 gin


go get -u github.com/gin-gonic/gin

image-20231118151601161

1.4 安装 viper


go get github.com/spf13/viper

image-20231118154236141

1.5 安装 gin


go get github.com/googollee/go-socket.io

image-20231117151053131

1.6 安装 swaggo


  • 安装

go get -u github.com/swaggo/swag/cmd/swag

go install github.com/swaggo/swag/cmd/swag@latest

go get -u github.com/swaggo/gin-swagger

go get -u github.com/swaggo/files

image-20231118170958972

  • 初始化

swag init

image-20231118171305741

  • 配置

  • app

    • router
      • router.go
package router

import (
	"app/docs"
	"app/service"
	"github.com/gin-gonic/gin"
	swaggerfiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

func Router() *gin.Engine {
	r := gin.Default()
	r.GET("swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
	docs.SwaggerInfo.BasePath = ""

	r.GET("/index", service.GetIndex)

	userGroup := r.Group("api/user")
	userGroup.GET("/getUserList", service.GetUserList)
	return r
}

  • app
    • service
      • user.go
package service

import (
	"app/dto"
	"github.com/gin-gonic/gin"
)

// @title 查询所有用户
// @version 1.0
// @Tags 用户
// @contact.name 通过用户手机号获取购物车信息
// @Success 200 {string} data
// @Router /api/user/getUserList [get]
// @host 127.0.0.1:9999
func GetUserList(ctx *gin.Context) {
	data := dto.GetUserList()
	ctx.JSON(200, gin.H{"data": data})
}

注意: 注解之后需要重新初始化 然后重启项目

swag init

在这在这里插入图片描述
里插入图片描述

  • 访问

http://127.0.0.1:8888/swagger/index.html

image-20231118172734822

1.7 数据库初始化


  • app
    • config
      • application.yml

数据库配置文件:

server:
  port: 8888

mysql:
  diverName: mysql
  host: 127.0.0.1
  port: 3306
  database: chatapp
  username: root
  password: 123456
  charset: utf8mb4

  • app
    • utils
      • system_init.go

数据库 MySQL 初始化文件:

package utils

import (
	"fmt"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

var DB *gorm.DB

func InitDB() *gorm.DB {
	viper.SetConfigName("application")	// 你的数据库配置 yml 文件名
	viper.AddConfigPath("config")		// yml 的文件路径
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println(err)
	}
	host := viper.GetString("mysql.host")
	port := viper.GetString("mysql.port")
	database := viper.GetString("mysql.database")
	username := viper.GetString("mysql.username")
	password := viper.GetString("mysql.password")
	charset := viper.GetString("mysql.charset")
    // 自定义 log 日志
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags),
		logger.Config{
			SlowThreshold: time.Second,
			LogLevel:      logger.Info,
			Colorful:      true,
		})
	db, err := gorm.Open(mysql.Open(username+`:`+password+`@tcp(`+host+`:`+port+`)/`+database+`?charset=`+charset+`&parseTime=true&loc=Local`),
		&gorm.Config{Logger: newLogger})
	if err != nil {
		panic("failed to connect database, err: " + err.Error())
	}
	//db.AutoMigrate(&models.UserBasic{})		// 迁移数据
	DB = db
	return db
}

func GetDB() *gorm.DB {
	return DB
}

  • app
    • models
      • userBasic.go
package models

import (
	"gorm.io/gorm"
	"time"
)

type UserBasic struct {
	gorm.Model
	Name          string
	Password      string
	Phone         string
	Email         string
	Identity      uint64    // 唯一标识
	ClientIp      string    // 设备
	ClientPort    string    // 端口
	LoginTime     time.Time // 登录时间
	HeartBeatTime time.Time // 心跳
	LoginOutTime  time.Time // 登出时间
	IsLoginOut    bool      // 是否下线
	DeviceInfo    string    //设备信息
}

func (table *UserBasic) TableName() string {
	return "user_basic"
}

  • app
    • main.go
package main

import (
	"app/utils"
)

func main() {
	utils.InitDB()
	err := r.Run(":8888")
	if err != nil {
		return
	}
}

1.8 测试


  • app
    • router
      • router.go
package router

import (
	"app/service"
	"github.com/gin-gonic/gin"
)

func Router() *gin.Engine {
	r := gin.Default()
	r.GET("/index", service.GetIndex)

	userGroup := r.Group("api/user") 	// 路由组
	userGroup.GET("/getUserList", service.GetUserList)
	return r
}

  • app
    • dto
      • user.go
package dto

import (
	"app/models"
	"app/utils"
)

func GetUserList() []*models.UserBasic {
	data := make([]*models.UserBasic, 10)
	utils.GetDB().Debug().Find(&data)		// 查询所有用户
	return data
}

  • app
    • service
      • user.go
package service

import (
	"app/dto"
	"github.com/gin-gonic/gin"
)

func GetUserList(ctx *gin.Context) {
	data := dto.GetUserList()				// 调用 dto 层方法获取数据
	ctx.JSON(200, gin.H{"data": data})		// 返回数据
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab绘制双坐标轴图示例函数yyaxis

一、前言 出于一些需求,我们需要将两个不同属性的参量绘制在同一张图上,但是两个参量属性不同,即单位不同,纵坐标值分布范围不同,此刻,我们只需要将一个参量的值在y轴左侧展示,另一个参量的值在…

buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮

buildAdmin 的表头上添加一些按钮&#xff0c;并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮&#xff0c;仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 &#xff0c; 添加&#xff0c; 编辑&…

一文搞懂设计模式之代理模式

大家好&#xff0c;我是晴天&#xff0c;本周我们又见面了。本周有点发烧感冒&#xff0c;更文有点慢了&#xff0c;请大家见谅。言归正传&#xff0c;本周我们继续一起学习一文搞懂设计模式系列文章之代理模式。 什么是代理模式 我们先来看看 GoF 对代理模式的定义&#xff1…

异步任务线程池——最优雅的方式创建异步任务

对于刚刚从校园出来的菜鸡选手很容易写出自以为没问题的屎山代码&#xff0c;可是当上线后就会立即暴露出问题&#xff0c;这说到底还是基础不够扎实&#xff01;只会背八股文&#xff0c;却不理解&#xff0c;面试头头是道&#xff0c;一旦落地就啥也不是。此处&#xff0c;抛…

搭建mysql主从错误集合

1 mysqld --verbose --help --log-bin-index/tmp/tmp.Frnt2oibYI mysqld: Cant read dir of /etc/mysql/conf.d/ my.cnf是在/etc/mysql/conf.d/文件夹下&#xff0c;所以挂载的时候不要写/etc/mysql 2 COLLATION utf8_unicode_ci is not valid for CHARACTER SET latin1 配…

Linux系统编程学习 NO.9——git、gdb

前言 本篇文章简单介绍了Linux操作系统中两个实用的开发工具git版本控制器和gdb调试器。 git 什么是git&#xff1f; git是一款开源的分布式版本控制软件。它不仅具有网络功能&#xff0c;还是服务端与客户端一体的软件。它可以高效的处理程序项目中的版本管理。它是Linux内…

Flink(七)【输出算子(Sink)】

前言 今天是我写博客的第 200 篇&#xff0c;恍惚间两年过去了&#xff0c;现在已经是大三的学长了。仍然记得两年前第一次写博客的时候&#xff0c;当时学的应该是 Java 语言&#xff0c;菜的一批&#xff0c;写了就删&#xff0c;怕被人看到丢脸。当时就想着自己一年之后&…

WeTab--颜值与实力并存的浏览器插件

一.前言 现在的浏览器花花绿绿&#xff0c;有大量的广告与信息&#xff0c;令人目不暇接。有没有一款好用的浏览器插件可以解决这个问题呢&#xff1f;我愿称WeTab为版本答案。 WeTab的界面&#xff1a; 干净又整洁。最最关键的是还有智能AI供你服务。 这个WeTabAI就像chatgp…

Sam Altman 被罢免细节曝光,投资 100+ 公司或成「话柄」?

2022 年 11 月&#xff0c;ChatGPT 发布掀起 AI 狂潮。时隔 1 年&#xff0c;2023 年 11 月&#xff0c;ChatGPT 之父、Sam Altman 的一项人事巨变&#xff0c;再次掀起了一场 AI 界的风暴&#xff0c;只是这次并不是技术革命&#xff0c;而是 OpenAI 巨头换帅——Sam Altman 被…

高斯积分-Gaussian Quadrature

https://mathworld.wolfram.com/GaussianQuadrature.html

目标检测—YOLO系列(二 ) 全面解读复现YOLOv1 PyTorch

精读论文 前言 从这篇开始&#xff0c;我们将进入YOLO的学习。YOLO是目前比较流行的目标检测算法&#xff0c;速度快且结构简单&#xff0c;其他的目标检测算法如RCNN系列&#xff0c;以后有时间的话再介绍。 本文主要介绍的是YOLOV1&#xff0c;这是由以Joseph Redmon为首的…

Postman接收列表、数组参数@RequestParam List<String> ids

示例如下: 接口定义如下: GetMapping(value "/queryNewMoviePath")public List<Map<String, Object>> queryNewMoviePath(RequestParam List<String> ids ) {return service.queryNewMoviePath(ids);}postman中测试如下&#xff1a; http://loc…

linux、windows 查看java等进程占用资源情况

linux查看进程占用资源情况&#xff1a; top -o %MEM -b -n 1 | grep java | awk {print "PID: "$1" \t 虚拟内存: "$5" \t 物理内存: "$6" \t 共享内存: "$7" \t CPU使用率: "$9"% \t 内存使用率: "$10"%&…

剑指JUC原理-20.并发编程实践

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

C/C++ 运用WMI接口查询系统信息

Windows Management Instrumentation&#xff08;WMI&#xff09;是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口&#xff0c;通过这个接口&#xff0c;可以获取有关计算机系统硬件、操作系统和应用程序的信息&#xf…

Maven依赖管理项目构建工具(保姆级教学---下篇)

对于Maven依赖管理项目构建工具的介绍&#xff0c;我们将其分为上篇和下篇。如果您对文章感兴趣&#xff0c;您可以在此链接中找到上篇详细内容&#xff1a; Maven依赖管理项目构建工具&#xff08;保姆级教学上篇&#xff09;-CSDN博客 一、Maven依赖传递和依赖冲突 1. …

SQL 文本函数

前言 SQL文本函数是SQL语言中非常有用的一类函数&#xff0c;它们用于处理和操作字符串数据。在实际应用中&#xff0c;我们经常需要对数据库中的文本数据进行各种操作&#xff0c;比如提取子串、替换子串、拼接字符串等等。而SQL文本函数可以帮助我们轻松地完成这些任务&#…

Egress Gateway

目录 文章目录 目录本节实战Egress Gateway访问外部服务1.Envoy 转发流量到外部服务2.控制对外部服务的访问3.直接访问外部服务总结 Egress 出口网关1.用 Egress gateway 发起 HTTP 请求2.用 Egress gateway 发起 HTTPS 请求 关于我最后 本节实战 实战名称&#x1f6a9; 实战&…

Scrum框架中的Sprint

上图就是sprint里要做的事。Sprint是scrum框架的核心&#xff0c;是所有的想法、主意转换为价值的地方。所有实现产品目标的必要工作都在sprint里完成&#xff0c;这些工作主要包括Sprint 计划&#xff08;Sprint planning&#xff09;、每日站会&#xff08;Daily Scrum&#…

JavaEE——简单认识HTML

文章目录 一、简单解释 HTML二、认识 HTML 的结构三、了解HTML中的相关标签1.注释标签2.标题标签3.段落标签 p4. 换行标签 br5.格式化标签6.图片标签解释 src解释 alt解释其他有关 img 标签的属性 7.超链接标签 a8.表格标签9.列表标签10.input 标签11. select 下拉菜单以及 div…