Beego 使用教程 8:Session 和 Cookie

news2024/11/17 22:42:09

beego 是一个用于Go编程语言的开源、高性能的 web 框架

beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask

beego 官网:http://beego.gocn.vip/

上面的 beego 官网如果访问不到,看这篇文章《beego 官网文档本地环境搭建》

注意:本文的 beego 文档使用的就是本地环境搭建的文档,因为官网文档已经不可用了

beego 官方 github 仓库:https://github.com/beego/beego

上一讲,讲了 beego 页面视图,需要的朋友可以查看《Beego 使用教程 7:Web 文件上传下载和错误处理》

这一讲,讲解 session 和 cookie。代码使用上一讲的代码

目录

1、Session 使用

1.1、基本使用

1.2、修改 cookies 名称

1.3、修改 session 存储位置

1.4、修改 session 存储在 redis

2、Cookie 使用

2.1、普通 Cookie 处理

2.2、加密 Cookie 处理


1、Session 使用

beego 内置了 session 模块,目前 session 模块支持的后端引擎包括 memory、cookie、file、mysql、redis、couchbase、memcache、postgres,用户也可以根据相应的接口实现自己的引擎

使用 session 前需要先开启,可通过代码设置或配置文件开启

web.BConfig.WebConfig.Session.SessionOn = true

配置文件配置,在 app.conf 中配置

sessionon = true

笔者使用在配置文件中配置的方式

1.1、基本使用

默认session 存储在 内存中

app.conf 配置文件开启 session 使用

在 controller 目录下新建 session.go ,代码是下面内容

package controller

import (
	"github.com/beego/beego/v2/server/web"
	"strconv"
)

type SessionController struct {
	web.Controller
}

func (this *SessionController) GetUserInfo() {
	user := this.GetSession("user")
	if user == nil {
		this.SetSession("user", int(1))
	} else {
		this.SetSession("user", user.(int)+1)
	}
	res := "ok"
	if user != nil {
		res = res + strconv.Itoa(user.(int))
	}
	this.Ctx.WriteString(res)
}

GetSession 获取session,SetSession 往session 中添加数据,更多的 session 相关方法看下图

在 main.go 中添加 GetUserInfo 的路由

package main

import (
	"beego-demo/controller"
	"beego-demo/filter"
	"fmt"
	"github.com/beego/beego/v2/core/config"
	"github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context"
	"html/template"
	"net/http"
)

func main() {
	//通过config获取自定义配置
	workername, _ := config.String("workername")
	fmt.Println(workername)

	//执行定时任务
	//go job.DemoTask()

	//注册自动路由
	//web.AutoPrefix("api", &controller.UserController{})
	web.CtrlGet("/name", (*controller.UserController).Name)
	web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
	web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
	//返回页面
	web.CtrlGet("/page/index", (*controller.PageController).Index)
	web.CtrlGet("/page/f", (*controller.PageController).F)
	web.CtrlGet("/page/main", (*controller.PageController).Main)
	//web输入参数
	web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)
	web.CtrlGet("/getparam", (*controller.ParamController).GetParam)
	web.CtrlPost("/postparam", (*controller.ParamController).PostParam)
	web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)
	//上传文件
	web.CtrlPost("/upload", (*controller.FileController).Upload)
	//下载文件
	web.CtrlGet("/download", (*controller.FileController).Download)
	//错误处理
	web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)
	web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)
	web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)
	web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)
	//注册错误处理函数
	web.ErrorController(&controller.ErrorController{})

	//session
	web.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)

	//注册函数式路由
	controller.RegisterFunctionalRoutes()
	//web命名空间
	controller.RegisterNamespaceRoutes()

	//过滤器
	filter.RegisterFilters()

	//开启 Admin 管理后台
	web.BConfig.Listen.EnableAdmin = true
	web.BConfig.Listen.AdminAddr = "localhost"
	web.BConfig.Listen.AdminPort = 8088

	//web.BConfig.WebConfig.ViewsPath = "pages"

	//开启post 请求 bind绑定请求体
	web.BConfig.CopyRequestBody = true

	//查看已注册路由
	tree := web.PrintTree()
	methods := tree["Data"].(web.M)
	for k, v := range methods {
		fmt.Printf("%s => %v\n", k, v)
	}

	//自定义模板函数
	web.AddFuncMap("bookName", bookName)

	//自定义401返回
	web.ErrorHandler("401", page401)
	//自定义404返回
	web.ErrorHandler("404", page404)

	web.ErrorHandler("dbError", dbError)

	web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {
		if err := recover(); err != nil {
			context.WriteString(fmt.Sprintf("you panic, err: %v", err))
		}
	}

	web.Run()
}

// 自定义模板函数添加书名号
func bookName(in string) (out string) {
	out = "《" + in + "》"
	return
}

func page401(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")
	data := make(map[string]interface{})
	data["content"] = "没有访问权限"
	t.Execute(rw, data)
}

func page404(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")
	data := make(map[string]interface{})
	data["content"] = "页面没找到"
	t.Execute(rw, data)
}

func dbError(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")
	data := make(map[string]interface{})
	data["content"] = "我是自定义字符串错误类型处理函数"
	t.Execute(rw, data)
}

运行效果

浏览器访问:http://localhost:9090/getUserInfo

1.2、修改 cookies 名称

Session 默认是保存在用户的浏览器 cookies 里面的,默认名是 beegosessionID

通过代码 web.BConfig.WebConfig.Session.SessionName 设置,或配置 sessionname

笔者使用配置 sessionname 修改 cookie 名称,改成 JSESSIONID

默认的名称可以通过访问后,浏览器F12打开开发者工具查看,看下图

修改后重启项目,重新打开浏览器,访问:http://localhost:9090/getUserInfo

1.3、修改 session 存储位置

默认 session 存储在内存 memory 中,可以修改其存储在 file、mysql、redis 等

通过代码 web.BConfig.WebConfig.Session.SessionProvider 或配置文件参数 sessionprovider 修改

笔者下面讲解奖session 存储在 file 中,笔者使用配置文件的方式

# 设置 Session 的引擎,默认是 memory,目前支持还有 file、mysql、redis 等
sessionprovider = file
# 设置对应 file、mysql、redis 引擎的保存路径或者链接地址,默认值是空
sessionproviderconfig = E:\tmp\file\session

app.conf 文件内容看下图

重启项目,访问:http://localhost:9090/getUserInfo

1.4、修改 session 存储在 redis

将 session 存储在 redis 比较常见,下面说明

redis 相关配置

sessionprovider = redis
# Redis 配置信息如下所示 表示链接的地址,连接池,访问密码,没有保持为空
sessionproviderconfig = "127.0.0.1:6379,10,123456"

redis 密码配置在配置信息中 

添加 beego redis 依赖,在项目根目录执行下面命令

go get github.com/beego/beego/v2/server/web/session/redis

再执行下面命令

go mod tidy

在 main.go 中匿名引入 redis 引擎对应的包

_ "github.com/beego/beego/v2/server/web/session/redis"

main.go 代码

package main

import (
	"beego-demo/controller"
	"beego-demo/filter"
	"fmt"
	"github.com/beego/beego/v2/core/config"
	"github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context"
	_ "github.com/beego/beego/v2/server/web/session/redis"
	"html/template"
	"net/http"
)

func main() {
	//通过config获取自定义配置
	workername, _ := config.String("workername")
	fmt.Println(workername)

	//执行定时任务
	//go job.DemoTask()

	//注册自动路由
	//web.AutoPrefix("api", &controller.UserController{})
	web.CtrlGet("/name", (*controller.UserController).Name)
	web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
	web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
	//返回页面
	web.CtrlGet("/page/index", (*controller.PageController).Index)
	web.CtrlGet("/page/f", (*controller.PageController).F)
	web.CtrlGet("/page/main", (*controller.PageController).Main)
	//web输入参数
	web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)
	web.CtrlGet("/getparam", (*controller.ParamController).GetParam)
	web.CtrlPost("/postparam", (*controller.ParamController).PostParam)
	web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)
	//上传文件
	web.CtrlPost("/upload", (*controller.FileController).Upload)
	//下载文件
	web.CtrlGet("/download", (*controller.FileController).Download)
	//错误处理
	web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)
	web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)
	web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)
	web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)
	//注册错误处理函数
	web.ErrorController(&controller.ErrorController{})

	//session
	web.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)

	//注册函数式路由
	controller.RegisterFunctionalRoutes()
	//web命名空间
	controller.RegisterNamespaceRoutes()

	//过滤器
	filter.RegisterFilters()

	//开启 Admin 管理后台
	web.BConfig.Listen.EnableAdmin = true
	web.BConfig.Listen.AdminAddr = "localhost"
	web.BConfig.Listen.AdminPort = 8088

	//web.BConfig.WebConfig.ViewsPath = "pages"

	//开启post 请求 bind绑定请求体
	web.BConfig.CopyRequestBody = true

	//查看已注册路由
	tree := web.PrintTree()
	methods := tree["Data"].(web.M)
	for k, v := range methods {
		fmt.Printf("%s => %v\n", k, v)
	}

	//自定义模板函数
	web.AddFuncMap("bookName", bookName)

	//自定义401返回
	web.ErrorHandler("401", page401)
	//自定义404返回
	web.ErrorHandler("404", page404)

	web.ErrorHandler("dbError", dbError)

	web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {
		if err := recover(); err != nil {
			context.WriteString(fmt.Sprintf("you panic, err: %v", err))
		}
	}

	web.Run()
}

// 自定义模板函数添加书名号
func bookName(in string) (out string) {
	out = "《" + in + "》"
	return
}

func page401(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")
	data := make(map[string]interface{})
	data["content"] = "没有访问权限"
	t.Execute(rw, data)
}

func page404(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")
	data := make(map[string]interface{})
	data["content"] = "页面没找到"
	t.Execute(rw, data)
}

func dbError(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")
	data := make(map[string]interface{})
	data["content"] = "我是自定义字符串错误类型处理函数"
	t.Execute(rw, data)
}

启动 redis 后,浏览器请求:http://localhost:9090/getUserInfo

可在redis 中查看session 信息,笔者使用 redis 工具查看

2、Cookie 使用

Beego 通过Context直接封装了对普通 Cookie 的处理方法,可以直接使用

2.1、普通 Cookie 处理

修改 session.go 为下面代码

package controller

import (
	"github.com/beego/beego/v2/server/web"
	"strconv"
)

type SessionController struct {
	web.Controller
}

func (this *SessionController) GetUserInfo() {
	user := this.GetSession("user")
	if user == nil {
		this.SetSession("user", int(1))
	} else {
		this.SetSession("user", user.(int)+1)
	}
	res := "ok"
	if user != nil {
		res = res + strconv.Itoa(user.(int))
	}
	this.Ctx.WriteString(res)
}

func (this *SessionController) PutCookie() {
	// 设置cookie 和 过期时间
	this.Ctx.SetCookie("name", "web cookie", 10)

	this.Ctx.WriteString("SetCookie ok")
}

func (this *SessionController) ReadCookie() {
	name := this.Ctx.GetCookie("name")
	this.Ctx.WriteString(name)
}

在 main.go 中添加路由

package main

import (
	"beego-demo/controller"
	"beego-demo/filter"
	"fmt"
	"github.com/beego/beego/v2/core/config"
	"github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context"
	_ "github.com/beego/beego/v2/server/web/session/redis"
	"html/template"
	"net/http"
)

func main() {
	//通过config获取自定义配置
	workername, _ := config.String("workername")
	fmt.Println(workername)

	//执行定时任务
	//go job.DemoTask()

	//注册自动路由
	//web.AutoPrefix("api", &controller.UserController{})
	web.CtrlGet("/name", (*controller.UserController).Name)
	web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
	web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
	//返回页面
	web.CtrlGet("/page/index", (*controller.PageController).Index)
	web.CtrlGet("/page/f", (*controller.PageController).F)
	web.CtrlGet("/page/main", (*controller.PageController).Main)
	//web输入参数
	web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)
	web.CtrlGet("/getparam", (*controller.ParamController).GetParam)
	web.CtrlPost("/postparam", (*controller.ParamController).PostParam)
	web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)
	//上传文件
	web.CtrlPost("/upload", (*controller.FileController).Upload)
	//下载文件
	web.CtrlGet("/download", (*controller.FileController).Download)
	//错误处理
	web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)
	web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)
	web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)
	web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)
	//注册错误处理函数
	web.ErrorController(&controller.ErrorController{})

	//session
	web.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)
	//cookie
	web.CtrlGet("/putCookie", (*controller.SessionController).PutCookie)
	web.CtrlGet("/readCookie", (*controller.SessionController).ReadCookie)

	//注册函数式路由
	controller.RegisterFunctionalRoutes()
	//web命名空间
	controller.RegisterNamespaceRoutes()

	//过滤器
	filter.RegisterFilters()

	//开启 Admin 管理后台
	web.BConfig.Listen.EnableAdmin = true
	web.BConfig.Listen.AdminAddr = "localhost"
	web.BConfig.Listen.AdminPort = 8088

	//web.BConfig.WebConfig.ViewsPath = "pages"

	//开启post 请求 bind绑定请求体
	web.BConfig.CopyRequestBody = true

	//查看已注册路由
	tree := web.PrintTree()
	methods := tree["Data"].(web.M)
	for k, v := range methods {
		fmt.Printf("%s => %v\n", k, v)
	}

	//自定义模板函数
	web.AddFuncMap("bookName", bookName)

	//自定义401返回
	web.ErrorHandler("401", page401)
	//自定义404返回
	web.ErrorHandler("404", page404)

	web.ErrorHandler("dbError", dbError)

	web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {
		if err := recover(); err != nil {
			context.WriteString(fmt.Sprintf("you panic, err: %v", err))
		}
	}

	web.Run()
}

// 自定义模板函数添加书名号
func bookName(in string) (out string) {
	out = "《" + in + "》"
	return
}

func page401(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")
	data := make(map[string]interface{})
	data["content"] = "没有访问权限"
	t.Execute(rw, data)
}

func page404(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")
	data := make(map[string]interface{})
	data["content"] = "页面没找到"
	t.Execute(rw, data)
}

func dbError(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")
	data := make(map[string]interface{})
	data["content"] = "我是自定义字符串错误类型处理函数"
	t.Execute(rw, data)
}

运行效果

浏览器请求:http://localhost:9090/putCookie

和 http://localhost:9090/readCookie

存储 cookie 和 获取 cookie

2.2、加密 Cookie 处理

Beego 提供了两个方法用于辅助 Cookie 加密处理,它采用了sha256来作为加密算法,下面Secret则是加密的密钥

修改 session.go 为下面代码

package controller

import (
	"github.com/beego/beego/v2/server/web"
	"strconv"
)

type SessionController struct {
	web.Controller
}

func (this *SessionController) GetUserInfo() {
	user := this.GetSession("user")
	if user == nil {
		this.SetSession("user", int(1))
	} else {
		this.SetSession("user", user.(int)+1)
	}
	res := "ok"
	if user != nil {
		res = res + strconv.Itoa(user.(int))
	}
	this.Ctx.WriteString(res)
}

func (this *SessionController) PutCookie() {
	// 设置cookie 和 过期时间
	this.Ctx.SetCookie("name", "web cookie", 10)

	this.Ctx.WriteString("SetCookie ok")
}

func (this *SessionController) ReadCookie() {
	name := this.Ctx.GetCookie("name")
	this.Ctx.WriteString(name)
}

func (this *SessionController) PutSecureCookie() {
	//my-secret 是加密的密钥
	this.Ctx.SetSecureCookie("my-secret", "name", "web cookie")
	this.Ctx.WriteString("SetSecureCookie ok")
}

func (this *SessionController) ReadSecureCookie() {
	name, _ := this.Ctx.GetSecureCookie("my-secret", "name")
	this.Ctx.WriteString(name)
}

在 main.go 中添加路由

package main

import (
	"beego-demo/controller"
	"beego-demo/filter"
	"fmt"
	"github.com/beego/beego/v2/core/config"
	"github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context"
	_ "github.com/beego/beego/v2/server/web/session/redis"
	"html/template"
	"net/http"
)

func main() {
	//通过config获取自定义配置
	workername, _ := config.String("workername")
	fmt.Println(workername)

	//执行定时任务
	//go job.DemoTask()

	//注册自动路由
	//web.AutoPrefix("api", &controller.UserController{})
	web.CtrlGet("/name", (*controller.UserController).Name)
	web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
	web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
	//返回页面
	web.CtrlGet("/page/index", (*controller.PageController).Index)
	web.CtrlGet("/page/f", (*controller.PageController).F)
	web.CtrlGet("/page/main", (*controller.PageController).Main)
	//web输入参数
	web.CtrlGet("/pathparam/:name", (*controller.ParamController).PathParam)
	web.CtrlGet("/getparam", (*controller.ParamController).GetParam)
	web.CtrlPost("/postparam", (*controller.ParamController).PostParam)
	web.CtrlPost("/bindparam", (*controller.ParamController).BindParam)
	//上传文件
	web.CtrlPost("/upload", (*controller.FileController).Upload)
	//下载文件
	web.CtrlGet("/download", (*controller.FileController).Download)
	//错误处理
	web.CtrlGet("/getUserName", (*controller.ErrorHandlerController).GetUserName)
	web.CtrlGet("/getUserAge", (*controller.ErrorHandlerController).GetUserAge)
	web.CtrlGet("/getUserAddr", (*controller.ErrorHandlerController).GetUserAddr)
	web.CtrlGet("/getUserGender", (*controller.ErrorHandlerController).GetUserGender)
	//注册错误处理函数
	web.ErrorController(&controller.ErrorController{})

	//session
	web.CtrlGet("/getUserInfo", (*controller.SessionController).GetUserInfo)
	//cookie
	web.CtrlGet("/putCookie", (*controller.SessionController).PutCookie)
	web.CtrlGet("/readCookie", (*controller.SessionController).ReadCookie)
	web.CtrlGet("/putSecureCookie", (*controller.SessionController).PutSecureCookie)
	web.CtrlGet("/readSecureCookie", (*controller.SessionController).ReadSecureCookie)

	//注册函数式路由
	controller.RegisterFunctionalRoutes()
	//web命名空间
	controller.RegisterNamespaceRoutes()

	//过滤器
	filter.RegisterFilters()

	//开启 Admin 管理后台
	web.BConfig.Listen.EnableAdmin = true
	web.BConfig.Listen.AdminAddr = "localhost"
	web.BConfig.Listen.AdminPort = 8088

	//web.BConfig.WebConfig.ViewsPath = "pages"

	//开启post 请求 bind绑定请求体
	web.BConfig.CopyRequestBody = true

	//查看已注册路由
	tree := web.PrintTree()
	methods := tree["Data"].(web.M)
	for k, v := range methods {
		fmt.Printf("%s => %v\n", k, v)
	}

	//自定义模板函数
	web.AddFuncMap("bookName", bookName)

	//自定义401返回
	web.ErrorHandler("401", page401)
	//自定义404返回
	web.ErrorHandler("404", page404)

	web.ErrorHandler("dbError", dbError)

	web.BConfig.RecoverFunc = func(context *context.Context, config *web.Config) {
		if err := recover(); err != nil {
			context.WriteString(fmt.Sprintf("you panic, err: %v", err))
		}
	}

	web.Run()
}

// 自定义模板函数添加书名号
func bookName(in string) (out string) {
	out = "《" + in + "》"
	return
}

func page401(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("401.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/401.html")
	data := make(map[string]interface{})
	data["content"] = "没有访问权限"
	t.Execute(rw, data)
}

func page404(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("404.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/404.html")
	data := make(map[string]interface{})
	data["content"] = "页面没找到"
	t.Execute(rw, data)
}

func dbError(rw http.ResponseWriter, r *http.Request) {
	t, _ := template.New("dberror.html").ParseFiles(web.BConfig.WebConfig.ViewsPath + "/dberror.html")
	data := make(map[string]interface{})
	data["content"] = "我是自定义字符串错误类型处理函数"
	t.Execute(rw, data)
}

运行效果

浏览器请求:http://localhost:9090/putCookie

和 http://localhost:9090/readCookie

存储 cookie 和 获取 cookie

更多API用法可以查看官方文档


 

下一讲:《Beego 使用教程 9:ORM 操作数据库(上)》

至此完

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

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

相关文章

AI架构设计7:TGI

这个专栏主要关注围绕着AI运用于实际的业务场景所需的系统架构设计。整体基于云原生技术,结合开源领域的LLMOps或者MLOps技术,充分运用低代码构建高性能、高效率和敏捷响应的AI中台。该专栏需要具备一定的计算机基础。 若在某个环节出现卡点,…

质量评估门户:您AI内容的质量守护者

在当今这个内容饥渴和内容疯狂的世界里,AI驱动的内容创作既是一种流行趋势,有时也是一个改变游戏规则的存在。但强大的能力伴随着巨大的责任……即确保质量的责任。 想象一下:你拥有一个AI[和创意团队],他们以闪电般的速度输出博…

unity制作app(9)--拍照 相册 上传照片

1.传输照片(任何较大的数据)都需要扩展服务器的内存空间。 2.还需要base64编码 2.1客户端发送位置的编码 2.2服务器接收部分的代码

全球首个AI代理驱动的元宇宙生态Wondra,让Web3再次伟大

前段时间,因为OpenAI的Sora发布、英伟达财报的发布,英伟达市值直逼2.5万亿美金,使得Crypto行业的AI赛道热度飙升,WLD,AGIX,FET等项目都有了不俗的表现。而这几天,因为大盘整体向好,再…

css中实现背景方格

background: rgba(241,241,241,0.1); background-image:linear-gradient(90deg, rgba(241,243,244,1) 10%, transparent 0),linear-gradient(rgba()241,243,244,1 10%, transparent 0); background-size: 10px 10px; 表现出来的样子就是这个样子

回顾java-异常

异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。 需…

vivado改变波形图窗口颜色

点击右上角的设置图标 翻译对照

老板:2个亿的销售额,利润只有55万!电商这个生意真的到头了?

近来,一段对话轰动了半个电商圈的老板,干拼多多,2亿的销售额,利润只有55万! 其实造成这一现象的原因就是“内卷” 说一句电商行业真实的现状,电商发展了十几年,网友对网购已经完全熟悉&#x…

专业上门预约洗衣洗鞋管理系统一站式解决方案

洗衣洗鞋店管理系统一站式解决方案,不仅运营稳定且功能强大,堪称现代生活中的得力助手。 在这个快节奏的时代,人们对便捷性的渴望愈发强烈。洗衣洗鞋作为日常生活中的一项琐碎事务,也亟需一个高效、省心的解决方案。为此&#xf…

双向带头链表实现

目录 一. 逻辑结构图解 1. 节点中存储的值 2.逻辑实现 二. 各种功能实现 1. 创建节点函数 2. 初始化哨兵位 3. 尾插 4. 头插 5. 尾删 6. 头删 7. 打印链表值 8. 查找数据,返回节点地址 9. 指定地址后插入节点 10. 删除指定地址节点 11. 销毁链表 三.…

english语法

从句:简单句连词 介词

接口测试及接口测试常用的工具详解

🍅 视频学习:文末有免费的配套视频可观看 首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息…

17、24年--信息系统工程——数据工程

1、数据建模 数据建模是对现实世界中具体的人、物、活动和概念进行抽象、表示和处理,变成计算机可处理的数据,也就是把现实世界中的数据从现实世界抽象到信息世界和计算机世界。 1.1 数据模型 根据模型应用目的不同,可以将数据模型划分为三类:概念模型、逻辑模型和物理模型…

数组基础-笔记

数组是非常基础的数据结构,实现运用和理解是两回事 数组是存放在连续内存空间上的相同类型的数据的集合 可以方便的通过下表索引的方式获取到下标下对应的数据。 举一个字符数组的例子: 注意两点: 数组下标从0开始 数组内存空间的地址是连…

文心一言 VS 讯飞星火 VS chatgpt (269)-- 算法导论20.2 4题

四、修改 proto-vEB 结构,以支持重复关键字。如果要写代码,请用go语言。 文心一言: 在原始的 van Emde Boas 树(vEB tree)结构中,关键字(key)是唯一的,不允许有重复的关…

数据集005:螺丝螺母目标检测数据集(含数据集下载链接)

数据集简介 背景干净的目标检测数据集。 里面仅仅包含螺丝和螺母两种类别的目标,背景为干净的培养皿。图片数量约420张,train.txt 文件描述每个图片中的目标,label_list 文件描述类别 另附一个验证集合,有10张图片,e…

普乐蛙VR大型航天科普馆VR博物馆太空舱模拟体验馆

主题科普馆、学校、家长、同学们看过来!!想身临其境体验太空漫游、登陆月球、探索月球地貌吗?!以新颖有趣的VR设备体验形式,可以在寓教于乐中学习太空知识、亲自收集月球土壤等等。接下来,就让小编带大家乘…

【代码随想录】【算法训练营】【第21天】 [530]二叉搜索树的最小绝对差 [501]二叉搜索树的众数 [236]二叉树的最近公共祖先

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 21,天气不错的周二~ 题目详情 [530] 二叉搜索树的最小绝对差 题目描述 530 二叉搜索树的最小绝对差 解题思路 前提:二叉搜索树 思路:根据二叉搜索树的中…

Vivado打开之前项目仿真过的波形文件

第一步:顶部菜单 点击:Open Static Simulation 然后在弹出的窗口找到.sim结尾的文件夹,在里面找到wdb结尾的文件,点击ok 第二步:依次点击下方红圈 找到wcfg结尾的文件,点击ok即可

Nat Genet|马丁院士团队利用单细胞和空间多组学描绘宫颈鳞癌免疫微环境图谱

宫颈鳞状细胞癌(CSCC)是宫颈癌最常见的组织学类型。虽然局部疾病预后良好,但晚期、转移性或复发性CSCC的5年生存率仅为16.5%,晚期宫颈癌中对免疫检查点阻断的反应有限。细胞异质性和可塑性是肿瘤进展和肿瘤免疫微环境(TIME)调节的…