gin框架精通篇(二)

原生数据库使用

导入模块:go get -u github.com/go-sql-driver/mysql

安装 mysql 数据库

安装数据库可能遇到的问题:(网上的方法基本可以解决)
ERROR 1045 (28000): Access denied for user ‘-root’@‘localhost’ (using password: YES)
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)

可视化数据库操作

在这里插入图片描述

// 导包内容
package main

import (
    "database/sql" // 导入sql包处理数据库操作
    "fmt" // 导入fmt包进行格式化输出和错误输出
    "github.com/gin-gonic/gin" // 导入gin包快速构建REST API
    _ "github.com/go-sql-driver/mysql" // 导入MySQL驱动
    "net/http" // 导入http包处理HTTP请求
)

注意别漏了:_ “github.com/go-sql-driver/mysql” // 导入MySQL驱动

var sqlDb *sql.DB // 声明一个sql.DB指针,用于后续的数据库操作
var sqlResponse SqlResponse // sqlResponse是全局的用于封装http返回的结构体
/** 请求结构体 和 响应结构体 */
// SqlUser结构体映射数据库中的user表
type SqlUser struct {
    Name    string `json:"name"` // 用户名
    Age     int    `json:"age"` // 年龄
    Address string `json:"address"` // 地址
}
// SqlResponse结构体用于封装http响应数据
type SqlResponse struct {
    Code    int         `json:"code"` // 响应状态码
    Message string      `json:"message"` // 响应消息
    Data    interface{} `json:"data"` // 响应数据
}
// init函数用于初始化数据库
func init() {
    // MySQL连接字符串
    sqlStr := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8&parseTime=true&loc=Local"
    var err error
    // 打开MySQL连接
    sqlDb, err = sql.Open("mysql", sqlStr)
    if err != nil {
        // 如果连接出错,则输出错误并返回
        fmt.Println("数据库打开出现了问题:", err)
        return
    }
    // 测试与数据库的连接是否存活
    err = sqlDb.Ping()
    if err != nil {
        fmt.Println("数据库打开出现了问题:", err)
        return
    }
}
// 主函数
func main() {
	r := gin.Default()

	r.POST("/sql/insert", insertData)
	r.GET("/sql/read", readData)
	r.GET("/sql/readAll", readAllData)
	r.PUT("/sql/update", updateData)
	r.DELETE("/sql/del", delData)

	r.Run(":9090")
}

// insertData函数处理插入数据的请求
func insertData(context *gin.Context) {
    var u SqlUser
    // 绑定请求中的JSON数据到u结构体
    err := context.Bind(&u)
    if err != nil {
        // 如果绑定出错,设置响应结构体并返回JSON响应
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "参数错误"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }
    // 定义插入SQL语句
    sqlStr := "insert into user(name, age, address) values (?,?,?)"
    // 执行插入操作
    ret, err := sqlDb.Exec(sqlStr, u.Name, u.Age, u.Address)
    if err != nil {
        // 如果插入出错,设置响应结构体并返回JSON响应
        fmt.Println(err)
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "写入失败"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }
    // 插入成功,设置响应结构体
    sqlResponse.Code = http.StatusOK
    sqlResponse.Message = "写入成功"
    sqlResponse.Data = "OK"
    // 返回JSON响应
    context.JSON(http.StatusOK, sqlResponse)
    // 打印插入的ID
    fmt.Println(ret.LastInsertId())
}

在这里插入图片描述

// readData函数处理读取数据的请求:单条数据
func readData(context *gin.Context) {
    name := context.Query("name") // 从查询参数获取name
    // 定义查询SQL语句
    sqlStr := "select age,address from user where name=?"
    var u SqlUser
    // 执行查询,并扫描结果到u结构体
    err := sqlDb.QueryRow(sqlStr, name).Scan(&u.Age, &u.Address)
    if err != nil {
        // 如果查询出错,设置响应结构体并返回JSON响应
        fmt.Println(err)
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "读取失败"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }
    // 查询成功,填充姓名,并设置响应结构体
    u.Name = name
    sqlResponse.Code = http.StatusOK
    sqlResponse.Message = "读取成功"
    sqlResponse.Data = u
    // 返回JSON响应
    context.JSON(http.StatusOK, sqlResponse)
}

在这里插入图片描述

func readAllData(context *gin.Context) {
    // 从Http请求中获取地址参数(address)
    address := context.Query("address")

    // 定义SQL查询语句,根据特定地址(address)查询与之匹配的所有用户名称(name)和用户年龄(age)
    sqlStr := "select name, age from user where address=?"

    // 使用预定义的sqlDb对象执行刚刚定义的SQL查询语句
    rows, err := sqlDb.Query(sqlStr, address)

    // 如果在执行SQL查询语句过程中出现错误,将错误信息打印到控制台,并向HTTP响应中写入相应的错误信息,然后退出当前函数
    if err != nil {
        fmt.Println(err)
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "读取失败"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }

    // 定时关闭数据库连接
    defer rows.Close()

    // 定义一个空切片,用来存储所有查询到的用户数据
    resUser := make([]SqlUser, 0)

    // 遍历数据库查询结果集rows,提取所有的数据并添加到之前定义的用于存储用户数据的切片中
    for rows.Next() {
        var userTemp SqlUser
        // 将从结果集中获取到的每一行数据相应的字段(name, age)提取出来,赋值给用户结构体(userTemp)对应的字段
        rows.Scan(&userTemp.Name, &userTemp.Age)
        // 将地址字段值设置为查询参数
        userTemp.Address = address
        // 将该用户结构体添加到用户切片中
        resUser = append(resUser, userTemp)
    }

    // 设置HTTP响应的状态码、消息和数据内容,然后将其写入到HTTP响应中。这里写入的数据内容就是查询到的所有用户数据
    sqlResponse.Code = http.StatusOK
    sqlResponse.Message = "读取成功"
    sqlResponse.Data = resUser
    context.JSON(http.StatusOK, sqlResponse)
}

在这里插入图片描述

func updateData(context *gin.Context) {
    // 定义一个SqlUser类型的变量u,用于存储请求中的用户数据
    var u SqlUser
    // 定义一个整型变量count,用于存储数据库查询返回的计数结果
    var count int

    // 使用context.Bind()方法从HTTP请求体中提取数据并绑定到变量u中
    err := context.Bind(&u)
    // 如果在数据绑定过程中发生错误,则向客户端发送参数错误的响应
    if err != nil {
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "参数错误"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }

    // 定义SQL查询字符串,用于检查具有特定名称的用户是否存在于数据库中
    sqlStr := "select count(*) from user where name=?"
    // 执行SQL查询,将查询结果(即用户的数量)存储于变量count中
    err = sqlDb.QueryRow(sqlStr, u.Name).Scan(&count)
    // 如果查询结果显示用户数量为0或查询时发生错误,则向客户端发送数据不存在的响应
    if count <= 0 || err != nil {
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "更新的数据不存在"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }

    // 定义SQL更新字符串,用于更新用户的年龄(age)和地址(address)
    upStr := "update user set age=?, address=? where name=?"
    // 执行SQL更新操作
    ret, err := sqlDb.Exec(upStr, u.Age, u.Address, u.Name)
    // 如果在执行更新操作时发生错误,则向客户端发送更新失败的响应
    if err != nil {
        fmt.Println(err)
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "更新失败"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }

    // 如果更新操作成功,向客户端发送更新成功的响应
    sqlResponse.Code = http.StatusOK
    sqlResponse.Message = "更新成功"
    sqlResponse.Data = "OK"
    context.JSON(http.StatusOK, sqlResponse)

    // 打印到控制台SQL操作返回的结果,这通常用于调试
    // 注意:这里的LastInsertId()在更新操作中可能不会返回有意义的值,需要注意其适用场景
    fmt.Println(ret.LastInsertId())
}

在这里插入图片描述

func delData(context *gin.Context) {
    // 从HTTP请求的查询参数中获取需要删除的用户的名称
    name := context.Query("name")
    // 定义一个整型变量count,用于存储数据库查询返回的计数结果
    var count int

    // 定义SQL查询字符串,用于检查具有特定名称的用户是否存在于数据库中
    sqlStr := "select count(*) from user where name=?"
    // 执行SQL查询,将查询结果(即用户的数量)存储于变量count中
    err := sqlDb.QueryRow(sqlStr, name).Scan(&count)
    // 如果查询结果显示用户数量为0或查询时发生错误,则向客户端发送数据不存在的响应
    if count <= 0 || err != nil {
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "删除的数据不存在"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }

    // 定义SQL删除字符串,用于从数据库中删除具有特定名称的用户
    delStr := "delete from user where name=?"
    // 执行SQL删除操作
    ret, err := sqlDb.Exec(delStr, name)
    // 如果在执行删除操作时发生错误,则向客户端发送删除失败的响应
    if err != nil {
        sqlResponse.Code = http.StatusBadRequest
        sqlResponse.Message = "删除的数据不存在"
        sqlResponse.Data = "error"
        context.JSON(http.StatusOK, sqlResponse)
        return
    }

    // 如果删除成功,向客户端发送删除成功的响应
    sqlResponse.Code = http.StatusOK
    sqlResponse.Message = "删除成功"
    sqlResponse.Data = "OK"
    context.JSON(http.StatusOK, sqlResponse)

    // 打印到控制台SQL操作返回的结果,这通常用于调试
    // 注意:这里的LastInsertId()在删除操作中可能不会返回有意义的值,因为它更适用于插入操作
    fmt.Println(ret.LastInsertId())
}

在这里插入图片描述

xorm框架

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql" // 导入MySQL驱动
	"github.com/go-xorm/xorm"
	"net/http"
	"time"
)

var x *xorm.Engine
var xormResponse XormResponse

type Stu struct {
	Id      int64     `xorm:"pk autoincr" json:"id"`
	StuNum  string    `xorm:"unique" json:"stu_num"`
	Name    string    `json:"name"`
	Age     int       `json:"age"`
	Created time.Time `xorm:"created" json:"created"`
	Updated time.Time `xorm:"updated" json:"updated"`
}

type XormResponse struct {
	Code    int         `json:"code"`    // 响应状态码
	Message string      `json:"message"` // 响应消息
	Data    interface{} `json:"data"`    // 响应数据
}
func init() {
	sqlStr := "root:123456@tcp(127.0.0.1:3306)/xorm?charset=utf8&parseTime=true&loc=Local"
	var err error
	x, err = xorm.NewEngine("mysql", sqlStr)
	if err != nil {
		fmt.Println("数据库连接失败", err)
		return
	}
	err = x.Sync(new(Stu))
	if err != nil {
		fmt.Println("数据库同步错误", err)
		return
	}
	fmt.Println("数据库初始化成功", err)
}
func main() {
	r := gin.Default()

	r.POST("/xorm/insert", insertData)
	r.GET("/xorm/read", readData)
	r.GET("/xorm/mulread", mulReadData)
	r.PUT("/xorm/update", xormUpdateData)
	r.DELETE("/xorm/del", delData)

	r.Run(":9090")
}
func insertData(context *gin.Context) {
	var s Stu
	err := context.Bind(&s)
	if err != nil {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "参数错误"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	affected, err := x.Insert(s)
	if affected <= 0 || err != nil {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "写入失败"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	xormResponse.Code = http.StatusOK
	xormResponse.Message = "写入成功"
	xormResponse.Data = "OK"
	context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func readData(context *gin.Context) {
	stuNum := context.Query("stu_num")
	var stus []Stu
	err := x.Where("stu_num=?", stuNum).Find(&stus)
	if err != nil {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "查询错误"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	xormResponse.Code = http.StatusOK
	xormResponse.Message = "查询成功"
	xormResponse.Data = stus
	context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func mulReadData(context *gin.Context) {
	name := context.Query("name")
	var stus []Stu
	err := x.Where("name=?", name).And("age>20").Limit(10, 0).Asc("age").Find(&stus)
	if err != nil {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "查询错误"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	xormResponse.Code = http.StatusOK
	xormResponse.Message = "查询成功"
	xormResponse.Data = stus
	context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func xormUpdateData(context *gin.Context) {
	var s Stu
	err := context.Bind(&s)
	if err != nil {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "参数错误"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	var stus []Stu
	err = x.Where("stu_num=?", s.StuNum).Find(&stus)
	if err != nil || len(stus) <= 0 {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "数据不存在"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	affected, err := x.Where("stu_num=?", s.StuNum).Update(&Stu{Name: s.Name, Age: s.Age})
	if err != nil || affected <= 0 {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "修改失败"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	xormResponse.Code = http.StatusBadRequest
	xormResponse.Message = "修改成功"
	xormResponse.Data = "OK"
	context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

func delData(context *gin.Context) {
	stuNum := context.Query("stu_num")
	var stus []Stu
	err := x.Where("name=?", stuNum).Find(&stus)
	if err != nil {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "没有此条数据"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	affected, err := x.Where("stu_num=?", stuNum).Delete(&Stu{})
	if err != nil || affected <= 0 {
		xormResponse.Code = http.StatusBadRequest
		xormResponse.Message = "删除失败"
		xormResponse.Data = "error"
		context.JSON(http.StatusOK, xormResponse)
		return
	}
	xormResponse.Code = http.StatusBadRequest
	xormResponse.Message = "删除成功"
	xormResponse.Data = "OK"
	context.JSON(http.StatusOK, xormResponse)
}

在这里插入图片描述

gorm框架

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"net/http"
	"time"
)

type Product struct {
	ID             int       `gorm:"primaryKey;autoIncrement" json:"id"`
	Number         string    `gorm:"unique" json:"number"`
	Category       string    `gorm:"type:varchar(256);not null" json:"category"`
	Name           string    `gorm:"type:varchar(20);not null" json:"name"`
	MadeIn         string    `gorm:"type:varchar(128);not null" json:"madeIn"`
	ProductionTime time.Time `json:"production_time"`
}

type GormResponse struct {
	Code    int         `json:"code"`    // 响应状态码
	Message string      `json:"message"` // 响应消息
	Data    interface{} `json:"data"`    // 响应数据
}

var gormResponse GormResponse

var gormDB *gorm.DB
func init() {
	var err error
	sqlStr := "root:123456@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=true&loc=Local"
	gormDB, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败", err)
		return
	}
}

func main() {
	r := gin.Default()

	r.POST("/gorm/insert", insetData)
	r.GET("/gorm/read", readData)
	r.GET("/gorm/readAll", readAllData)
	r.PUT("/gorm/update", updateData)
	r.DELETE("/gorm/del", delData)

	r.Run(":9090")
}
func errorTouch(context *gin.Context) {
	defer func() {
		err := recover()
		if err != nil {
			gormResponse.Code = http.StatusBadRequest
			gormResponse.Message = "错误"
			gormResponse.Data = err
			context.JSON(http.StatusOK, gormResponse)
		}
	}()
}
func insetData(context *gin.Context) {
	errorTouch(context)
	var p Product
	err := context.Bind(&p)
	if err != nil {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "参数错误"
		gormResponse.Data = err
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	tx := gormDB.Create(&p)
	if tx.RowsAffected <= 0 {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "写入失败"
		gormResponse.Data = "error"
		context.JSON(http.StatusBadRequest, gormResponse)
		return
	}
	gormResponse.Code = http.StatusOK
	gormResponse.Message = "写入成功"
	gormResponse.Data = "ok"
	context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func readData(context *gin.Context) {
	errorTouch(context)
	number := context.Query("number")
	product := Product{}
	tx := gormDB.Where("number=?", number).First(&product)
	if tx.Error != nil {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "查询错误"
		gormResponse.Data = tx.Error
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	gormResponse.Code = http.StatusBadRequest
	gormResponse.Message = "查询成功"
	gormResponse.Data = product
	context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func readAllData(context *gin.Context) {
	category := context.Query("category")
	products := make([]Product, 10)
	tx := gormDB.Where("category=?", category).Find(&products).Limit(10)
	if tx.Error != nil {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "查询错误"
		gormResponse.Data = tx.Error
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	gormResponse.Code = http.StatusOK
	gormResponse.Message = "查询成功"
	gormResponse.Data = products
	context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func updateData(context *gin.Context) {
	errorTouch(context)
	var p Product
	err := context.Bind(&p)
	if err != nil {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "参数错误"
		gormResponse.Data = err
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	var count int64
	gormDB.Model(&Product{}).Where("number=?", p.Number).Count(&count)
	if count <= 0 {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "数据不存在"
		gormResponse.Data = "error"
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	tx := gormDB.Model(&Product{}).Where("number=?", p.Number).Updates(&p)
	if tx.RowsAffected <= 0 {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "写入失败"
		gormResponse.Data = "error"
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	gormResponse.Code = http.StatusOK
	gormResponse.Message = "更新成功"
	gormResponse.Data = "ok"
	context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

func delData(context *gin.Context) {
	errorTouch(context)
	number := context.Query("number")
	var count int64
	gormDB.Model(&Product{}).Where("number=?", number).Count(&count)
	if count <= 0 {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "数据不存在"
		gormResponse.Data = "error"
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	tx := gormDB.Where("number=?", number).Delete(&Product{})
	if tx.RowsAffected <= 0 {
		gormResponse.Code = http.StatusBadRequest
		gormResponse.Message = "删除失败"
		gormResponse.Data = "error"
		context.JSON(http.StatusOK, gormResponse)
		return
	}
	gormResponse.Code = http.StatusOK
	gormResponse.Message = "删除成功"
	gormResponse.Data = "ok"
	context.JSON(http.StatusOK, gormResponse)
}

在这里插入图片描述

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

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

相关文章

ROS基础学习-话题通信机制研究

研究ROS通信机制 研究ROS通信机制 0.前言1.话题通信1.1 理论模型1.2 话题通讯的基本操作1.2.1 C++1.2.2 Python中使用自己的虚拟环境包1.2.2.1 参考11.2.2.2 参考21.2.2.3 /usr/bin/env:“python”:没有那个文件或目录1.2.3 Python1.2.2.1 发布方1.2.2.2 订阅方1.2.2.3 添加可执…

在 GPT-4o 释放完整能力前,听听实时多模态 AI 创业者的一手经验 | 编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 5 月中旬 GPT-4o 的发布&#xff0c;让人与 AI 的交互&#xff0c;从对话框的文本交流加速推进…

《Ai学习笔记》自然语言处理 (Natural Language Processing):常见机器阅读理解模型(上)02

Glove 词向量&#xff1a; 在机器理解中的词的表示&#xff1a; 词袋&#xff08;bow,bag of words&#xff09; one-hot 词向量 word2vec glove 目的&#xff1a;将一个词转换成一个向量 Word2vec 是一种用于生成词向量的工具包&#xff0c;由Google在2013年开源推出…

AI视频换脸!最快的方法,100%成功,完全免费,无需配置、打开即用

这是一款百分百完全免费&#xff0c;超级好用又简单的AI视频换脸工具&#xff0c;不仅效果非常不错而且支持CPU和GPU解码&#xff0c;即使电脑上没有独立显卡&#xff0c;你也可以通过电脑上的CPU要进解码&#xff0c;虽然我之前给他介绍好几个有关AI视频&#xff0c;比如像这个…

css 渐变色边框

效果图&#xff1a; 代码&#xff1a; <style>:root{--br-radius: 12px;}.list{position: relative;}.list_tle{margin-top: 15px;margin-bottom: 5px;}.item{position: relative;display: inline-flex;} .br1 {padding: 10px 16px;clip-path: inset(0 round 6px);borde…

kafka3.6.1版本学习

kafka目录结构 bin linux系统下可执行脚本文件 bin/windows windows系统下可执行脚本文件 config 配置文件 libs 依赖类库 licenses 许可信息 site-docs 文档 logs 服务日志 启动ZooKeeper 进入Kafka解压缩文件夹的config目录&#xff0c;修改zookeeper.properties配置文件 #t…

Sqoop的安装与测试

这里写目录标题 什么是Sqoop?Sqoop的安装与配置安装测试 什么是Sqoop? Sqoop就是hadoop和mysql的一个中间介质 , 作用就是可以将hadoop中的数据传到mysql中 , 或将mysql中的数据导入到hadoop中 Sqoop的安装与配置 安装 详细代码 //解压安装 [roothadoop soft]# tar -zxv…

【光伏干货】光伏无人机巡检步骤

随着光伏产业的迅速发展和无人机技术的日益成熟&#xff0c;光伏无人机巡检已成为提高光伏电站运维效率、降低运维成本的重要手段。本文将详细介绍光伏无人机巡检的步骤&#xff0c;帮助读者更好地理解和应用这一技术。 一、前期准备 1、设备检查&#xff1a;对无人机及其相关…

13 VUE学习:组件v-model

基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 [defineModel()]宏&#xff1a; <!-- Child.vue --> <script setup> const model defineModel()function update() {model.value } </script><te…

我的心情JSP+Servlet+JDBC+MySQL

系统概述 本系统采用JSPServletJDBCMySQL技术进行开发&#xff0c;包括查看我的心情列表&#xff0c; 编辑我的心情信息、新增我的心情。使用方法 将项目从idea中导入&#xff0c;然后配置项目的结构&#xff0c;包括jdk,库&#xff0c;模块&#xff0c;项目&#xff0c;工件…

分支机构多,如何确保文件跨域传输安全可控?

随着企业全球化发展&#xff0c;分支机构的分布越来越广泛&#xff0c;跨域文件传输需求也随之增加。然而&#xff0c;跨域文件传输面临的数据安全和传输效率问题&#xff0c;使得构建一个安全、可控的文件交换系统成为迫切需求。FileLink跨网文件交换系统通过综合的技术手段和…

开发者的福音:免去搭建服务,让你的应用开发变得像吃蛋糕一样简单!

传统应用开发的"噩梦" 想象一下&#xff0c;你正在准备一场盛大的晚宴&#xff0c;但必须从零开始建造厨房、种植食材、甚至学习烹饪技巧。这就是传统应用开发的现状——你不仅要设计数据库、编写API接口&#xff0c;还要处理对象存储、实时数据库、云数据库等一系列…

图卷积神经网络的简史 及其与卷积神经网络的异同

图卷积神经网络&#xff08;GCN&#xff09;已经在处理图结构数据方面取得了巨大的成功。在本小节中&#xff0c;我们将深入探讨图卷积神经网络的起源、发展历程&#xff0c;并提供一个简单的Python代码实现示例&#xff0c;以帮助读者更好地理解这一概念。 图卷积神经网络的简…

分类内按规则拆分一行变多行

Excel的A列是分类列&#xff0c;B列是由">"连接起来的多个字符串&#xff0c;可以看成是合并后的明细&#xff1a; AB1IDRule: Condition2470210642217Test3470251569449Doors & Hardware > Door Jambs> 119mm4470251602217Bathroom > Stone Tops &…

Jmeter元件及基本作用域

&#x1f680;从今天开始学习性能测试工具——Jmeter&#xff0c;小梦也是先学习了下Jmeter的元件概念以及其基本的作用域&#xff0c;整理了下笔记&#xff0c;希望不管是从事开发领域还是测试领域的朋友们&#xff0c;我们一起学习下Jmeter工具&#xff0c;提升工作中的技能&…

TikTok电商带货特训营,跟随时代潮流,跨境掘金(8节课)

课程内容&#xff1a; 1-先导课 2-一、店铺运营认知与思路 3-二、店铺风控注意事项 4-三、美区Tiktok前期工作-1店铺入驻模式 5-三、美区Tiktok前期工作-2指纹浏览器介绍 6-三、美区Tiktok前期工作-4绑定电话号码 7-三、美区Tiktok前期工作-5添加仓库地址 8-三、美区Ti…

【LabVIEW FPGA入门】同步C系列模块

1.同步使用循环定时器VI计时循环速率的系列模块 数字模块SAR ADC 模块多路复用模块 数字通道可以在一个时钟周期内执行。模拟通道需要多个时钟周期。 同步模拟模块的每个通道有一个 ADC&#xff0c;采集的数据在通道之间没有明显的偏差。多路复用模块使用多路复用器通过单个 A…

苹果与OpenAI合作在即:iOS 18中的ChatGPT引发期待与担忧

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Pytorch 1.9.0环境安装

pytorch官方链接: https://pytorch.org/get-started/previous-versions/ 安装指令&#xff1a;conda install pytorch1.9.0 torchvision0.10.0 torchaudio0.9.0 cudatoolkit11.3 -c pytorch -c conda-forge 报错&#xff1a;Solving environment: unsuccessful initial attemp…

机器学习(五) -- 监督学习(4) -- 集成学习方法-随机森林

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;3&#xff09; -- 决策树 下篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;5&#xff09; -- 线性回归1 前言 tips&#xff1a;标题前有“***”…