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

go+mysql+cocos实现游戏搭建

盲目的学了一段时间了,刚开始从Box2d开始学习,明白了很多,Box2d是物理模型的基础,是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos,也是小程序开发的利器,而golang是一款高效的httprouter服务器,如果考虑安全肯定是没有tcp的安全。用起来太容易了,可以快速的游戏服务。

1.数据库连接:

数据库用的是gorm,连接数据库一个需要

_ "github.com/go-sql-driver/mysql"

"github.com/jinzhu/gorm"

mysql的驱动和gorm库支持。代码如下:

package mysqldb_testimport ("fmt""log"mymodals "main/modals""time"_ "github.com/go-sql-driver/mysql""github.com/jinzhu/gorm""github.com/userlll1986/main/config"
)var Db *gorm.DB
var err error// User 结构体声明
// type User struct {
// 	UserId    int64  `gorm:"primaryKey;autoIncrement"`
// 	UserName  string `gorm:"not null;type:varchar(32)"`
// 	UserPwd   string `gorm:"not null;type:varchar(128)"`
// 	UserPhone string `gorm:"unique;type:varchar(32)"`
// }// 数据库配置
func InitDb(config *config.Config) {url := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",config.Data.Username,config.Data.Password,config.Data.Ip,config.Data.Part,config.Data.DataBase,)// 这个地方要注意,不要写称 :=  写成 = 才对Db, err = gorm.Open(config.Data.Category, url)// 设置表前缀gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {//fmt.Println("db.DefaultTableNameHandler", config.Data.Prefix, defaultTableName)return config.Data.Prefix + defaultTableName}if err != nil {log.Fatalf("连接数据库【%s:%s/%s】失败, 失败的原因:【%s】", config.Data.Ip, config.Data.Part, config.Data.DataBase, err)}// db配置输出SQL语句Db.LogMode(config.Data.Sql)// 使用表名不适用复数Db.SingularTable(true)// 连接池配置Db.DB().SetMaxOpenConns(20)Db.DB().SetMaxIdleConns(10)Db.DB().SetConnMaxLifetime(10 * time.Second)// 判断是否需要用来映射结构体到到数据库// fmt.Println(config.Data.Init.Status)if config.Data.Init.Status {// 自动迁移数据库表结构// err := Db.AutoMigrate(&User{})// if err != nil {// 	fmt.Println("数据库表迁移失败!", err)// } else {// 	fmt.Println("数据库表迁移成功!")// }// 插入单条数据// var user = User{UserName: "wjj", UserPwd: "123", UserPhone: "111"}// Db.Create(&user)// var users = []User{// 	{UserName: "th", UserPwd: "123", UserPhone: "222"},// 	{UserName: "lhf", UserPwd: "123", UserPhone: "333"},// 	{UserName: "zcy", UserPwd: "123", UserPhone: "444"},// }// for _, user := range users {// 	Db.Create(&user)// }// 查询全部记录var users []mymodals.UserDb.Find(&users)Db.Where("user_name = ?", "wjj").Find(&users)// Db.First(&users)// // 打印结果// fmt.Println(users)// 查询总数// var users []User// var totalSize int64// Db.Find(&users).Count(&totalSize)// fmt.Println("记录总数:", totalSize)// 查询user_id为1的记录// var stu User// Db.Where("user_id = ?", 1).Find(&stu)// // 修改stu姓名为wjj1// stu.UserName = "wjj1"// // 修改(按照主键修改)// Db.Save(&stu)// var stu User// Db.Model(&stu).Where("user_id = ?", 1).Update("user_name", "wjj2")// var fields = map[string]interface{}{"user_name": "WJJ", "user_pwd": "999"}// fmt.Println(fields)// Db.Model(&stu).Where("user_id = ?", 1).Updates(fields)// // 删除// var user = User{UserId: 1}// Db.Delete(&user)// 按照条件删除// Db.Where("user_id = ?", 10).Delete(&User{})}log.Printf("连接数据库【%s:%s/%s】成功", config.Data.Ip, config.Data.Part, config.Data.DataBase)
}

 代码中注释的部分没有删除,有数据库自迁移和增删改查的基本操作在里面。
 

2.先分享一下主程序,这样看起来比较容易理解。

port := os.Getenv("PORT")if port == "" {port = "8080"log.Printf("Defaulting to port %s", port)}// 读取配置文件myconfig := config.NewConfig()myconfig.ReadConfig()// 初始化数据库连接mysqldb_test.InitDb(myconfig)// Starts a new Gin instance with no middle-warer := gin.New()// 使用 Recovery 中间件r.Use(gin.Recovery())// 使用 Logger 中间件r.Use(gin.Logger())// 使用 CORSMiddleware 中间件r.Use(corsMiddleware())// 使用限流中间件r.Use(limiter.Middleware)//使用数据库中间件// 将db作为中间件传递给路由处理函数r.Use(func(c *gin.Context) {c.Set("db", mysqldb_test.Db)c.Next()})// 在路由处理函数中可以通过c.MustGet("db").(*gorm.DB)获取到db对象,然后进行数据库操作// 创建Redis客户端redisClient := redis.NewClient(&redis.Options{Addr:     "127.0.0.1:54372", // Redis服务器地址Password: "123456",          // Redis密码DB:       0,                 // Redis数据库编号})// 使用Redis中间件r.Use(func(c *gin.Context) {// 在Gin的上下文中设置Redis客户端c.Set("redis", redisClient)// 继续处理后续的请求c.Next()})// 定义路由和处理函数r.GET("/get/:key", func(c *gin.Context) {// 从上下文中获取Redis客户端redisClient := c.MustGet("redis").(*redis.Client)// 从URL参数中获取键名key := c.Param("key")// 使用Redis客户端进行GET操作val, err := redisClient.Get(c, key).Result()if err == redis.Nil {c.JSON(200, gin.H{"result": fmt.Sprintf("Key '%s' not found", key),})} else if err != nil {c.JSON(500, gin.H{"error": err.Error(),})} else {c.JSON(200, gin.H{"result": val,})}})// 添加ES中间件,暂不使用//r.Use(ElasticSearchMiddleware())// 定义路由// r.GET("/", func(c *gin.Context) {// 	// 从上下文中获取ES客户端// 	esClient := c.MustGet("esClient").(*elastic.Client)// 	// 使用ES客户端进行查询// 	// 这里只是一个示例,具体的ES查询操作可以根据实际需求进行修改// 	_, _, err := esClient.Ping().Do(c.Request.Context())// 	if err != nil {// 		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to ping Elasticsearch"})// 		return// 	}// 	c.JSON(http.StatusOK, gin.H{"message": "Hello from Gin with Elasticsearch middleware!"})// })// 创建RabbitMQ连接conn, err := amqp.Dial("amqp://lafba13j4134:llhafaif99973@localhost:5672/")if err != nil {fmt.Println("连接RabbitMQ失败:", err)return}defer conn.Close()// 添加RabbitMQ中间件r.Use(RabbitMQMiddleware(conn, "my_queue"))

这里有数据库中间件(第一部分讲的),日志中间件,限流中间件,rabbitmq中间件等。

下面会每一部分加上代码,这些中间件很容易使用,加一些代码就能直接使用,很方便。

3,下面是跨域请求中间件:

func corsMiddleware() gin.HandlerFunc {return func(c *gin.Context) {// 允许所有的跨域请求c.Header("Access-Control-Allow-Origin", "*")c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")c.Header("Access-Control-Allow-Headers", "Content-Type, Authorization")c.Header("Access-Control-Max-Age", "86400") // 预检请求缓存时间,单位为秒// 处理预检请求if c.Request.Method == "OPTIONS" {c.AbortWithStatus(200)return}// 继续处理其他请求c.Next()}
}

4,限流中间件

var (limiter = NewLimiter(10, 1*time.Minute) // 设置限流器,允许每分钟最多请求10次
)// NewLimiter 创建限流器
func NewLimiter(limit int, duration time.Duration) *Limiter {return &Limiter{limit:      limit,duration:   duration,timestamps: make(map[string][]int64),}
}// Limiter 限流器
type Limiter struct {limit      int                // 限制的请求数量duration   time.Duration      // 时间窗口timestamps map[string][]int64 // 请求的时间戳
}// Middleware 限流中间件
func (l *Limiter) Middleware(c *gin.Context) {ip := c.ClientIP() // 获取客户端IP地址// 检查请求时间戳切片是否存在if _, ok := l.timestamps[ip]; !ok {l.timestamps[ip] = make([]int64, 0)}now := time.Now().Unix() // 当前时间戳// 移除过期的请求时间戳for i := 0; i < len(l.timestamps[ip]); i++ {if l.timestamps[ip][i] < now-int64(l.duration.Seconds()) {l.timestamps[ip] = append(l.timestamps[ip][:i], l.timestamps[ip][i+1:]...)i--}}// 检查请求数量是否超过限制if len(l.timestamps[ip]) >= l.limit {c.JSON(429, gin.H{"message": "Too Many Requests",})c.Abort()return}// 添加当前请求时间戳到切片l.timestamps[ip] = append(l.timestamps[ip], now)// 继续处理请求c.Next()
}

5,redis中间件

// 创建Redis客户端redisClient := redis.NewClient(&redis.Options{Addr:     "127.0.0.1:54372", // Redis服务器地址Password: "123456",          // Redis密码DB:       0,                 // Redis数据库编号})// 使用Redis中间件r.Use(func(c *gin.Context) {// 在Gin的上下文中设置Redis客户端c.Set("redis", redisClient)// 继续处理后续的请求c.Next()})

中间件等使用很简单,直接c.MustGet("redis").(*redis.Client)直接取出来就能使用,c是gin.Context类型,是请求传的参数。

6,go和cocos通讯

在gin端:

func login(c *gin.Context) {var req mymodals.AccountServiceRequestif err := c.ShouldBindJSON(&req); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}if req.Type == "AccountService" && req.Tag == "account_login" {if resp, err := myaccount.CallFunc("Account_login", c, req.Type, req.Tag, req.Body); err != nil {fmt.Println("Error:", err)var resp mymodals.AccountServiceResponseresp.Result = "error"resp.Body.Length = 1resp.Body.Detail = err.Error()c.JSON(http.StatusBadRequest, resp)} else {fmt.Println("Result of bar: ", resp[0].Interface())c.JSON(http.StatusOK, resp[0].Interface())}} else if req.Type == "AccountService" {if resp, err := myaccount.CallFunc(req.Tag, c, req.Type, req.Tag, req.Body); err != nil {fmt.Println("Error:", err)var resp mymodals.AccountServiceResponseresp.Result = "error"resp.Body.Length = 1resp.Body.Detail = err.Error()c.JSON(http.StatusBadRequest, resp)} else {fmt.Println("Result of bar:", resp[0].Interface())c.JSON(http.StatusOK, resp[0].Interface())}}
}

CallFunc用的是反射机制,通过传过来的参数调用函数。反射调用的具体函数如下,这里面调用了数据库中间价,做了token验证。

func Account_login(c *gin.Context, Type string, Tag string, Body map[string]interface{}) mymodals.AccountServiceResponse {// 这里进行实际的登录验证逻辑log.Printf("Account_login: %v,%v,%v", Type, Tag, Body)// 例如:检查用户名和密码是否匹配,验证码是否正确等var users []mymodals.Uservar db = c.MustGet("db").(*gorm.DB)db.Where("user_name = ?", Body["username"].(string)).Find(&users)var resp mymodals.AccountServiceResponseresp.Type = "AccountService"resp.Tag = "account_login"//增加token验证token, err := authjwt.GenerateToken(Body["username"].(string))if err != nil {// ctx.JSON(http.StatusInternalServerError, gin.H{// 	"code":    500, // Token生成错误// 	"message": "请重新登录",// })var resp mymodals.AccountServiceResponseresp.Result = "error"resp.Body.Length = 1resp.Body.Detail = err.Error()// c.JSON(http.StatusBadRequest, resp)return resp}if len(users) > 0 {// 验证密码是否正确hashedPassword := hashPassword(Body["password"].(string))log.Printf("hashedPassword: %s", hashedPassword)if users[0].UserPwd == Body["password"].(string) {// 登录成功, 记录登录日志// c.JSON(http.StatusOK, gin.H{"result": "ok"})resp.Result = "ok"resp.Body.Length = 1resp.Body.Token = token// return} else {resp.Result = "error"resp.Body.Length = 1resp.Body.Detail = "用户名或密码错误"}} else {resp.Result = "error"resp.Body.Length = 1resp.Body.Detail = "用户名或密码错误"}log.Printf("登录响应: %v", resp)return resp// 将响应数据发送给客户端// c.JSON(http.StatusOK, resp)
}

7.cocos端协议的发送和接收

import { _decorator, Component, Node,Button,EventMouse,EditBox,Label } from 'cc';
import { setGlobalData, getGlobalData } from './global';
const { ccclass, property } = _decorator;@ccclass('login')
export class login extends Component {@property(Button)private btnLogin: Button | null = null; // @property(Button)private btnLogout: Button | null = null; // @property(EditBox)private editBoxUsername: EditBox | null = null; // 用户名输入框@property(EditBox)private editBoxPassword: EditBox | null = null; // 密码输入框@property(Label)private errorMessage: Label | null = null; // 用于显示错误信息的 Labelstart() {if (this.btnLogin) {// // 监听鼠标进入 Mask 事件this.btnLogin.node.on("click", this.onMouseClickMask, this);}if (this.errorMessage) {this.errorMessage.node.active = false;}if (this.btnLogout) {this.btnLogout.node.on("click", this.onMouseClickLogout, this);}}private onMouseClickLogout(event: EventMouse) {console.log('鼠标点击了 Logout 按钮');// 在这里添加你点击后想要执行的逻辑// 关闭当前游戏窗口cc.director.loadScene("EmptyScene");}update(deltaTime: number) {}private onMouseClickMask(event: EventMouse) {console.log('鼠标点击了 Mask 区域');// 在这里添加你点击后想要执行的逻辑const username = this.editBoxUsername ? this.editBoxUsername.string : "";const password = this.editBoxPassword ? this.editBoxPassword.string : "";const ip = "127.0.0.1"; // 获取客户端的 IP 地址,这里假设为固定的 IPconst captcha = "12345"; // 从输入框获取验证码const proving = "北京市"; // 从输入框获取省份const machineCode = "machine123"; // 获取机器码const clientType = "ios"; // 客户端类型const data = JSON.stringify({type: "AccountService",tag: "account_login",body: {username: username,password: password,ip: ip,captcha: captcha,proving: proving,machineCode: machineCode,client_type: clientType}});fetch('http://localhost:8080/v2/login', {method: 'POST',headers: {'Content-Type': 'application/json',},body: data,}).then(response => response.json()).then(data => this.handleLoginResponse(data)).catch((error) => console.error('Error:', error));}handleLoginResponse(response: any): void {if (response.result === "ok") {console.log("登录成功",response,response.body.token);// 在这里可以进行登录成功的处理逻辑setGlobalData(response.body.token); // 获取登录成功后的 Token// 例如:跳转到游戏主界面cc.director.loadScene("hall");} else {console.log("登录失败:", response.body.detail);// 在这里可以进行登录失败的处理逻辑// 例如:显示错误提示if (this.errorMessage) {this.errorMessage.string = response.body.detail;this.errorMessage.node.active = true;// 设置 3 秒后自动隐藏错误信息setTimeout(() => {this.errorMessage.node.active = false;}, 3000);}// cc.find('Canvas/ErrorMessage').getComponent(cc.Label).string = response.body.detail;}}
}

相关文章:

go+mysql+cocos实现游戏搭建

盲目的学了一段时间了&#xff0c;刚开始从Box2d开始学习&#xff0c;明白了很多&#xff0c;Box2d是物理模型的基础&#xff0c;是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos&#xff0c;也是小程序开发的利器&#xff0c;而golang是一款高效…...

Linux 网络基础(二) (传输协议层:UDP、TCP)

目录 一、传输层的意义 二、端口号 1、五元组标识一个通信 2、端口号范围划分 3、知名端口号&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口号 4、绑定端口号数目问题 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…...

Vue常用指令入门

1. v-for 作用&#xff1a;用于遍历对象或数组 注意&#xff1a;需要提供key属性&#xff0c;可以提高性能和避免渲染错误&#xff0c;值通常为index或item.id <li v-for"(item, index) in items" :key"index">{{ item }} </li>2. v-if,v-el…...

【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos

关于数据集的整理 Cholec80 胆囊切除手术视频数据集介绍 https://zhuanlan.zhihu.com/p/700024359 数据集信息 Cholec80 数据集 是一个针对内窥镜引导 下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注&#xff0c;标…...

UML统一建模

UML UML&#xff08;统一建模语言&#xff09;介绍 UML&#xff08;统一建模语言&#xff09;介绍 面向对象软件开发需要经过OOA面向对象分析、OOD面向对象设计和OOP面向对象编程三个阶段。OOA对目标系统进行分析并寄哪里分析模型&#xff0c;并将之文档化&#xff0c;OOD用面向…...

Ubuntu下安装和卸载MySQL

Ubuntu下安装和卸载MySQL 下面的演示系统版本&#xff1a;Ubuntu 24.04 更新系统软件包 在开始安装之前&#xff0c;建议先更新系统的软件包列表&#xff0c;以确保所有依赖项是最新的。 sudo apt update && sudo apt upgrade -y安装MySQL服务器 Ubuntu的官方软件…...

物联网技术赋能:复杂环境下的能源数据零丢失

安科瑞顾强 在全球能源挑战日益严峻的背景下&#xff0c;高效节能已成为各行业的核心诉求。无论是商业综合体、工业厂房还是公共设施&#xff0c;如何实现能源的精细化管理成为关键课题。安科瑞能耗云平台凭借其创新技术与多功能服务&#xff0c;为企业提供了一站式能源管理解…...

卷积神经网络综述

摘要 本文对卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;进行了全面综述。首先介绍了卷积神经网络的发展历程&#xff0c;包括早期的理论基础和关键突破。接着详细阐述了卷积神经网络的结构组成&#xff0c;包括卷积层、池化层、全连接层…...

SpringBoot3设置maven package直接打包成二进制可执行文件

注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package&#xff08;注意&#xff1a;使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…...

在 Anaconda 上安装多版本 Python 解释器并在 PyCharm 中配置

默认已安装好 Anaconda 和 PyCharm &#xff0c;想在 Anaconda 上安装最新版本的 Python 解释器。 一、在 Anaconda 上创建虚拟环境 在连网状态下进入系统的命令提示符&#xff08;快捷键&#xff1a;win r &#xff0c;输入 cmd 即可&#xff09;&#xff0c;输入如下命令&a…...

AES (高级加密标准)

原理详解 AES是一种对称加密算法&#xff0c;使用相同的密钥进行加密和解密。它采用替代-置换网络(SPN)结构&#xff0c;主要步骤包括&#xff1a; 密钥扩展&#xff1a;从初始密钥派生多轮密钥 初始轮&#xff1a;AddRoundKey&#xff08;轮密钥加&#xff09; 主轮&#xff…...

Git拉分支技巧:从零开始创建并推送分支

Git拉分支技巧&#xff1a;从零开始创建并推送分支 在团队协作开发中&#xff0c;Git 分支管理是不可或缺的技能。合理地创建、同步和推送分支&#xff0c;不仅能提高开发效率&#xff0c;还能避免代码冲突。本文将基于以下技巧&#xff0c;详细讲解如何从零开始创建并推送一个…...

线性回归之归一化(normalization)

文章目录 归一化与梯度下降归一化的必要性&#xff1a;从特征量纲到梯度下降问题背景矛盾与低效归一化的作用 归一化提高模型精度的原因归一化的本质常见归一化方法最大值最小值归一化示例说明优缺点分析 标准归一化具体机制示例说明 强调 归一化与梯度下降 归一化与梯度下降 &…...

mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)

一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录页面 &#xff08;默认用户名和密码都为admin,进入后…...

【玩泰山派】MISC(杂项)- linux桌面环境

文章目录 linux桌面环境linux四大桌面环境概述ubuntu基于四大桌面环境的版本 显示管理器gdm3&#xff08;GNOME Display Manager&#xff09;lightdm&#xff08;Lightweight Display Manager&#xff09;SDDM&#xff08;Simple Desktop Display Manager&#xff09;KDM&#…...

MVCC介绍

MVCC&#xff08;多版本并发控制&#xff09;详解 MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 是一种数据库并发控制技术&#xff0c;核心思想是通过维护数据的多个版本来实现读写操作的无锁并发&#xff0c;从而在高并发场景下提升性能。它广泛用于 MyS…...

神经网络与模型训练过程笔记

1.专有名词 ANN 人工神经网络&#xff0c;一种受生物神经元启发的监督学习算法。输入数据通过网络中的层级函数传递&#xff0c;激活特定神经元。函数复杂度越高&#xff0c;模型对数据的拟合能力越强&#xff0c;预测精度越高。 偏置项 其中x下表从1开始的是输入变量&#xf…...

ASP.NET 0~1学习

变量 string username Request["id"]; 声明并初始化一个字符串变量 username 数据类型 下面列出了常用的数据类型&#xff1a; 类型描述实例int整数&#xff08;全数字&#xff09;103, 12, 5168float浮点数3.14, 3.4e38decimal十进制数字&#xff08;高精度&a…...

optool为macho文件增加动态库

对macho文件有一定理解后,了解下optool是如何给macho文件增加动态库等功能的 optool 源码 环境 macOS 13.4 (22F66) Xcode 14.3.1 0x0 编译 下载源码 $ git clone --recurse-submodules https://github.com/alexzielenski/optool.git修改下Deployment Target,比如改成11.0&…...

【C++】类和对象之日期类的实现(构造、运算符重载)

文章目录 一、日期类要实现的函数二、函数实现1、GetMonthDay获取对应月份的天数2、CheckDate检查日期3、Date构造函数4、Print打印日期5、运算符重载1. 、、-、-2. 前置/--、后置/--3. 两个日期类相减&#xff08;求相差日期&#xff09; 6、比较7、流插入、流提取&#xff0…...

【Rust 精进之路之第9篇-所有权·核心】规则与移动 (Move):Rust 内存安全基石详解

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:没有 GC,Rust 如何管好内存?答案是所有权! 在我们的 Rust 探索之旅中,我们已经学习了变量、数据类型、控制流、函数和强大的构建工具 Cargo。现在,我们将踏入 Rust 最…...

【任务调度】xxl-job入门

xxl- job 入门 附上笔者写的测视示例&#xff1a;chenmeng-test-demos/demo8-task/task-xxl-job at master cmty256/chenmeng-test-demos 官方文档 XXL-JOB官网 源码仓库地址&#xff1a; Github&#xff1a;https://github.com/xuxueli/xxl-job Gitee&#xff1a;http://g…...

Go语言--语法基础4--基本数据类型--浮点数类型

3 、浮点数类型 浮点型用于表示包含小数点的数据&#xff0c;比如 1.234 就是一个浮点型数据。 Go 语言中的浮点类型采用 IEEE-754 标准的表达方式。 float32 精度是小数点后 7 位 float64 精度是小数点后 15 位。 1. 浮点数表示 Go 语言定义了两个类型 float32 和 floa…...

秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全

在之前的文章中&#xff0c;我们探讨了如何通过 WebSockets DTOs 设计实时操作。现在&#xff0c;我们迎来了一项新的挑战&#xff1a;确保 WebSocket 通信在任务执行过程中保持安全。如果敌方潜伏在我们的实时通信渠道中&#xff0c;机密情报可能会被泄露。 任务&#xff1a…...

UID和GID的区别

UID&#xff08;用户标识符&#xff09;和 GID&#xff08;组标识符&#xff09;是 Linux/Unix 系统中用于管理用户和组权限的核心机制&#xff0c;它们的区别主要体现在作用对象和用途上&#xff1a; 目录 1. 定义与作用对象 2. 主要用途 3. 系统保留范围 4. 用户与组的关…...

【网络】通过Samba实现Window挂在Linux服务器路径

有时候我们去进行内网部署时&#xff0c;会遇到客户或者甲方爸爸说&#xff0c;需要将Linux中的某个路径共享出去到Window上&#xff0c;挂载出比如Z:\这种盘符。通过打开Z盘&#xff0c;来查看服务器的指定目录下的数据。 步骤1&#xff1a; 在Linux中安装samba yum install…...

UE5 UI 教程系列全集

https://www.youtube.com/TheRoyalSkies/search?queryUnreal-5%20UI...

论文笔记(七十八)Do generative video models understand physical principles?

Do generative video models understand physical principles? 文章概括Physics-IQ基准数据集评估协议为什么要创建一个真实世界的Physics-IQ数据集模型物理理解的评估指标动作发生在哪里&#xff1f;空间IoU&#xff08;Spatial IoU&#xff09;动作在哪里、何时发生&#xf…...

Viper配置管理笔记

一、什么是 Viper&#xff1f; Viper 是 Go 语言的一个强大工具&#xff0c;就像一个超级管家&#xff0c;专门负责帮你打理程序的各种配置。它能把配置文件&#xff08;比如 JSON、YAML、TOML 等格式&#xff09;里的内容读出来&#xff0c;还能监控配置文件的变化&#xff0…...

visual studio无法跳转到函数定义、变量定义、跳转函数位置不准问题解决

参考&#xff1a;https://blog.csdn.net/snakehacker/article/details/135438353 程序有时会出现大部分函数都不能准确的从头文件中正确定位到函数定位,这是因为数据库错乱造成的,可以通过重构数据库来解决,操作方法如下&#xff1a; 菜单栏&#xff1a;工具——选项 文本编辑…...

【Rust 精进之路之第15篇-枚举 Enum】定义、变体与数据关联:表达多种可能性

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:当值拥有“选项”——超越结构体的表达力 在上一篇【结构体 Struct】中,我们学习了如何使用结构体将多个相关的数据字段组合成一个有意义的整体。结构体非常适合表示那些…...

C++ 相关系统软件简介与学习方法【最水的一期】

C 作为一种强大的C 相关系统软件简介编程语言&#xff0c;广泛应用于系统软件开发领域。以下为你介绍几款基于 C 开发的典型系统软件及其特点&#xff1a; 操作系统内核 部分操作系统内核采用 C 开发&#xff0c;例如某些嵌入式操作系统。C 的高性能、底层硬件访问能力和强大的…...

【Linux我做主】GDB调试工具完全指南

Linux下GDB调试工具完全指南&#xff1a;25个核心命令详解与实战示例 github地址 有梦想的电信狗 前言 GDB&#xff08;GNU Debugger&#xff09;是Linux开发中不可或缺的调试工具&#xff0c;尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验&#xff0…...

基于SpringBoot3实现MyBatis-Plus(SSMP)整合快速入门CURD(增删改查)

目录 一、快速搭建SpringBoot-Web工程脚手架。 1.1 Spring Initializr 初始化工程。(官方提供) 1.2 工程脚手架初始化详细步骤。(IDEA2024.1.1) 二、MyBatis-Plus的特性与快速上手。 2.1 官网地址与基本特性。 2.2 快速上手技术栈基础。 2.3 Spring Boot2 的 MyBatis-Plus Star…...

短视频电商新纪元:TikTok Shop全球蓝海争夺战进入关键窗口期

一、流量重构&#xff1a;TikTok Shop改写全球电商版图 2024年&#xff0c;全球跨境电商市场迎来新一轮洗牌。当Temu、Shein等平台深陷“低价内卷”泥潭时&#xff0c;TikTok Shop凭借日均30亿次的短视频流量&#xff0c;正在开辟一条“内容即货架”的颠覆性赛道。最新数据显示…...

uniapp-商城-29-vuex 关于系统状态的管理

按照我们前面讲的&#xff0c;vuex&#xff0c;的使用方式&#xff1a; 步骤如下&#xff1a; 1 先创建store 文件夹 2 在 store 中 创建一个 index.js 3、 在 store 中&#xff0c;创建一个modules文件夹 4、在store中&#xff0c;创建一个getters.js 5、在modules文件…...

Qt中修改了UI设计文件后编译不生效问题的解决办法

复制工程过来后&#xff1a; 1、删除build文件 2、删除.user文件&#xff0c;恢复为文件最初的那样 3、执行make distclean,删除所有由先前构建过程生成的文件 4、再次打开工程&#xff0c;修改ui文件编译生效&#xff01;...

Python 项目环境配置与 Vanna 安装避坑指南 (PyCharm + venv)

在进行 Python 项目开发时&#xff0c;一个干净、隔离且配置正确的开发环境至关重要。尤其是在使用像 PyCharm 这样的集成开发环境 (IDE) 时&#xff0c;正确理解和配置虚拟环境 (Virtual Environment) 是避免许多常见问题的关键。本文结合之前安装 Vanna 库时遇到的问题&#…...

Matlab FCM模糊聚类

1、内容简介 Matlab 211-FCM模糊聚类 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

标准的JNI (Java Native Interface) 加载函数 JNI_OnLoad

1.JNI_OnLoad 在 Android Native 开发中&#xff0c;JNI_OnLoad 是动态注册本地方法的标准入口点。以下是一个标准实现示例及其说明&#xff1a; JNI_OnLoad 标准实现 #include <jni.h> #include <string>// 声明本地方法对应的 C/C 函数 jint native_add(JNIEnv…...

微信小程序中使用h5页面预览图片、视频、pdf文件

遇到了这么一个需求&#xff0c;需要在微信小程序中点击文件&#xff0c;进行文件预览。 要求&#xff1a; 图片&#xff1a;长图需要宽度100%高度自适应&#xff1b;横图的话宽度100%&#xff0c;高度居中显示视频&#xff1a;视频不管横向还是竖向都居中显示&#xff0c;有…...

A2A协议详解:打造统一的AI代理通信标准,实现多Agent系统协同

A2A 协议中文说明 文章目录 A2A 解决现有 Agent 问题 Agent 生态系统现状当前面临的主要问题为什么需要统一协议&#xff0c;有个标准采用复用 A2A 解决方案 统一通信标准代理能力发现机制安全协作框架灵活的交互模式 A2A 与 MCP 的关系 MCP 简介两者的区别与联系集成场景协同…...

博客系统案例练习2-用户注册-redis

前言 用户注册 [请求]/user/register[参数]contentType: application/json{"userName":"wangwu","password":"456789","githubUrl": "https://gitee.com/bubble-fish666/spring-cloud","email": &quo…...

【人工智能】推荐开源企业级OCR大模型InternVL3

推荐开源企业级OCR大模型InternVL3 文章参考来源: https://huggingface.co/OpenGVLab/InternVL3-14B-Instruct https://www.aivi.fyi/llms/deploy-InternVL3 InternVL3&#xff0c;这是一个高级多模态大型语言模型 &#xff08;MLLM&#xff09; 系列&#xff0c;展示了卓越的整…...

聊天室项目

一.完善注册页面 1.完善注册页面图标&#xff0c;添加检测注册页面各个登录信息是否完善&#xff0c;并且通过信号和槽与自定义一个计时器&#xff0c;当注册完毕后跳转到显示注册完毕的页面。 2.各个坚持注册页面是否按要求的函数 3.完善主页面&#xff0c;设置信号和槽&…...

并发设计模式实战系列(4):线程池

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第四章线程池&#xff08;Thread Pool&#xff09;​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 线程池核心组件 2. 核心…...

大模型应用案例:主动提问式的 AI 面试官(接入 DeepSeek)

目录 核心逻辑 效果演示 技术选型 大模型应用开发框架&#xff1a;langchain-deepseek UI 展示框架—streamlit 代码获取 后续改进想法 本文附带详细的视频讲解&#xff0c;欢迎小伙伴们来支持—— 【代码宇宙017】大模型&#xff1a;主动提问式的 AI 面试官&#xff0…...

算法笔记—动态规划

1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int tribonacci(int n) {if(n0) return 0;if(n1||n2) return 1;vector<int> dp(4);//初始化dp[0]0; dp[1]1; dp[2]1;for(int i3;i<n1;i){//滚动数组优化需要循环dp[i%4]dp[…...

Vue3集成Element Plus完整指南:从安装到主题定制上

一、Element Plus简介 Element Plus是一套基于Vue 3.0的桌面端组件库&#xff0c;由饿了么前端团队开源维护。它提供了丰富的UI组件&#xff0c;能够帮助开发者快速构建企业级中后台产品。 1. 安装与卸载 bash 复制 下载 # 安装最新版本 npm install element-plus -S# 卸…...

初识javascript

1. JavaScript 基础语法 (1) 变量声明 JavaScript支持三种声明变量的方式&#xff1a; var&#xff1a;传统的变量声明方式&#xff0c;存在作用域问题&#xff08;函数作用域&#xff09;。 let&#xff1a;块级作用域变量声明方式&#xff0c;避免了var的作用域问题。 co…...