【2 beego学习 - 项目导入与项目知识点】
0 项目导入
1 在英文路径下新建一个同名的项目,拷贝其他数据到这个文件
bee new 同名项目名
cd 同名项目名
go mod tidy
go get -u -v github.com/astaxie/beego
go get 同名项目名/models
2 拷贝部分的项目文件到新目录
bee run 运行的其他错误,按照提示安装文件
1 后端获取前端传递的数据 post与get
前端get可以使用href
前端post使用表单
get和参数
删除
post和参数
<form name = logon method="post" action="/updateArticle?articleId={{.article.Id}}" enctype="multipart/form-data">
<input type="text" class="input_txt2" name="articleName" >
前端通过表单发送数据, 后端在路由的get或者post的方法中,获取数据
this.GetString():获取字符串类型值
this.GetInt():获取整型值
this.GetFloat:获取浮点型值
…
this.GetFile():获取上传的文件
作用:接收前端传递过来的数据,不管是get请求还是post请求,都能接收。
参数: 是传递数据的key值,一般情况下是form表单中 标签的name属性值
返回值:根据返回类型不同,返回值也不一样,最常用的GetString()只有一个返回值,如果没有取到值
就返回空字符串,其他几个函数会返回一个错误类型。获取的值一般是 标签
里面的value属性值。至于比较特殊的,我们用到的时候给大家做介绍。
知道了获取数据函数,我们就可以获取前端传递过来的数据啦。
<form method="post" action="/addArticle" enctype="multipart/form-data">
<input type="text" class="input_txt2" name="articleName" >func (c *ArticleController) HandleAddArticle() {articleName := c.GetString("articleName")
}
2 前端获取后端传递的数据
普通数据
注意前面有个点
c.Data["errmsg"] = "添加数据不完整"
<h1>{{.errmsg}}</h1?
切片数据-循环展示数据
后端
func(this*ArticleController)ShowArticleList(){//指定表o := orm.NewOrm()qs := o.QueryTable("Article")var articles []models.Article_,err := qs.All(&articles)if err != nil{beego.Info("查询数据错误")}//传递数据this.Data["articles"] = articlesthis.TplName = "index.html"
}
前端for循环展示1
{{range $index,$val := .articles}}<tr><td>{{$val.ArtiName}}</td><td><a href="/showArticleDetail?articleId={{$val.Id}}">查看详情</a></td><td> {{$val.Atime.Format "2006-01-02-15:04:05"}}</td><td>{{$val.Acount}}</td><td><a href="#" class="dels">删除</a></td><td><a href="#">编辑</a></td><td>财经新闻</td></tr>
{{end}}
前端for循环展示2 (省略了 i n d e x , index, index,val,直接使用属性)
{{range .types}}<tr><td>{{.Id}}</td><td>{{.TypeName}}</td><td><a href="javascript:;" class="edit">删除</a></td></tr>{{end}}
3 文件上传
1 前端设置enctype属性
<form method="post" action="/addArticle" enctype="multipart/form-data">
2 后端接口
func (c *ArticleController) HandleAddArticle() {
//获取数据articleName := c.GetString("articleName")content := c.GetString("content")
//数据校验if articleName == "" || content == "" {c.Data["errmsg"] = "添加数据不完整"c.TplName = "add.html"return}fmt.Println(articleName, content)
//获取上传的文件file, head, err := c.GetFile("uploadname")defer file.Close()if err != nil {c.Data["errmsg"] = "上传失败"c.TplName = "add.html"return}//1.文件大小if head.Size > 5000000 {c.Data["errmsg"] = "文件太大,请重新上传"c.TplName = "add.html"return}//2.文件格式//a.jpgext := path.Ext(head.Filename)if ext != ".jpg" && ext != ".png" && ext != ".jpeg" {c.Data["errmsg"] = "文件格式错误。请重新上传"c.TplName = "add.html"return}//3.防止重名,以时间戳命名timestamp := time.Now().Unix()timeStr := strconv.Itoa(int(timestamp))fileName := timeStr + ext//存储c.SaveToFile("uploadname", "./static/img/"+fileName)//3.处理数据//插入操作o := orm.NewOrm()var article models.Articlearticle.ArtiName = articleNamearticle.Acontent = contentarticle.Aimg = "/static/img/" + fileNameo.Insert(&article)//4.返回页面c.Redirect("/showArticleList", 302)}
循环中比较数据
比较TypeName ,和typeName是否相等,决定下拉框是否选中
{{range .types}}{{if compare .TypeName $.typeName}}<option selected="true">{{.TypeName}}</option>{{else}}<option>{{.TypeName}}</option>{{end}}{{end}}
4 分页
后端分页,
//展示文章列表页
func(this*ArticleController)ShowArticleList(){//获取数据//高级查询//指定表o := orm.NewOrm()qs := o.QueryTable("Article")//querysetervar articles []models.Article//_,err := qs.All(&articles)//if err != nil{// beego.Info("查询数据错误")//}//查询总记录数count,_ := qs.Count()//获取总页数pageSize := 2pageCount := math.Ceil(float64(count) / float64(pageSize))
//获取页码pageIndex,err:= this.GetInt("pageIndex")if err != nil{pageIndex = 1}//获取数据//作用就是获取数据库部分数据,第一个参数,获取几条,第二个参数,从那条数据开始获取,返回值还是querySeter//起始位置计算start := (pageIndex - 1)*pageSize
//获取指定数量的数据qs.Limit(pageSize,start).All(&articles)//传递数据this.Data["pageIndex"] = pageIndexthis.Data["pageCount"] = int(pageCount)this.Data["count"] = countthis.Data["articles"] = articlesthis.TplName = "index.html"
}
分页逻辑(首页末页,上一页下一页)
html,
通过视图传递一个参数 | 前面是传递的参数,后一个是视图名,{{显示视图对应函数的返回值}}
通过视图传递多个参数 视图名在前面,空格 后面是参数,{{显示视图对应函数的返回值}}
<ul class="pagenation"><li><a href="showArticleList?pageIndex=1">首页</a></li><li><a href="showArticleList?pageIndex={{.pageIndex | prepage}}">上一页 </a> </li><li> <a href="showArticleList?pageIndex={{nextpage .pageIndex .pageCount}}">下一页</a></li><li><a href="/showArticleList?pageIndex={{.pageCount}}">末页</a></li><li>共{{.count}}条记录/共{{.pageCount}}页/当前{{.pageIndex}}页</li></ul>
main.go,通过添加视图,并绑定视图与函数的关系,来执行函数
func main() {
//绑定视图和函数beego.AddFuncMap("prepage", ShowPrePage)beego.AddFuncMap("nextpage", ShowNextPage)beego.Run()
}
//上一页
func ShowPrePage(pageIndex int) int {if pageIndex == 1 {return pageIndex}var pageIndex2 = pageIndex - 1return pageIndex2
}
//下一页
func ShowNextPage(pageIndex int, pageCount int) int {if pageIndex == pageCount {return pageIndex}var pageIndex2 = pageIndex + 1return pageIndex2
}
5 弹窗提示
$(“选择器”)
<head><script type="text/javascript">window.onload = function (ev) {$(".dels").click(function () {if(!confirm("是否确认删除")){return false}})}</script>
</head>
6 多表相关(数据定义)
1.一对多(外键)
rel(fk)和reverse(many)成对出现,表示一对多的关系,一是变量,多是切片,类型是对应的表名
type Article struct {Id int `orm:"pk;auto"`//多ArticleType *ArticleType `orm:"rel(fk)"`
}// 类型表
type ArticleType struct {Id intTypeName string `orm:"size(20)"`// 1Articles []*Article `orm:"reverse(many)"`
}
多对多(创建关系表)
reverse(many)和rel(m2m)成对出现表示多对多关系,都是使用切片定义,类型是表名,本质是创建了关系表
// 定义一个结构体
type User struct {Id intArticles []*Article `orm:"reverse(many)"`
}type Article struct {Id int `orm:"pk;auto"`ArtiName string `orm:"size(20)"`Users []*User `orm:"rel(m2m)"`
}
6 多表相关(数据操作)
1.一对多(插入操作)
只需要在文章表插入类型对象即可。代码如下:
o := orm.NewOrm()
//多
article := models.Article{}
//一
artiType := models.ArticleType{Id:id}
//查询一的外键
o.Read(&artiType)
//多赋值
article.ArticleType = &artiType
//多插入
o.Insert(&article)
2.一对多(查询操作)
当需要在当前表查询其他表的数据时,使用这种方式.,但是当表没有关联表的数据时,不会找到记录
比如此处,关联文章类型表,来查询文章表的数据.没有文章类型的数据是找不到的,因为没有外键.
ORM做多表查询的时候默认是惰性查询,即不明确指出来要做多表查询,即便是两个表之间存在关系,ORM也不会给两个表做关联。指定多表查询的函数是RelatedSel()。参数是要关联的表名,可以有多个。如果没有关联,那么就是单表查询.代码如下:
o.QueryTable("要查询的表-多").RelatedSel("要关联的表-一").Count()
count,err = o.QueryTable("Article").RelatedSel("ArticleType").Count()
如果关联表的那个字段没有值,那么数据查不到
根据选中的类型查询相应类型文章
通过Filter(“表名__表字段”, 表字段值)进行过滤,相当于where
//根据选中的类型查询相应类型文章typeName := this.GetString("select")qs.Limit(pageSize, start).RelatedSel("ArticleType").Filter("ArticleType__TypeName", typeName).All(&articles)
7 beego中Session和Cookie
Cookie
用来一定时间的保存用户数据,数据存储在客户端(网站的客户端就是浏览器),启用的时候能设置Cookie的有效时间,当时间截至的时候,Cookie失效.
Beego中对Cookie的存取删
Beego把数据存储到Cookie中代码如下:
this.Ctx.SetCookie(key,value,time)//第一个参数是Cookie的key值,第二个参数是Cookie的value值,第三个参数是设置的Cookie的有效时间。
取Cookie的代码如下:
this.Ctx.GetCookie(key)//参数是Cookie的key值,返回值是对应的value值。当没有对应的Cookie或者Cookie已失效,返回空字符串
删除Cookie的代码如下:
this.Ctx.SetCookie(key,value,0)//第一个参数是Cookie的key值,第二个参数任意值,第三个参数把Cookie的值设置为小于0,就马上失效。
Session
也是用来一定时间的保存用户数据,不过数据存储在服务器,Beego启用Sesssion的时候需要在配置文件中开启Session功能。在Beego使用中,一般不设置Session的时间,当浏览器关闭的时候,Session失效。
app.conf
sessionon=true
**Beego中对Session的存取 **
如果想要在项目中使用Session功能,需要先在配置文件中设置Sessionon=true
Beego存储Session的代码:
this.SetSession(key,value)//两个参数,一个是Session的key,第二个是Session的Value
获取Session的代码如下:
this.GetSession(key)//参数是Session的key值,返回值是Session对应的value值,类型是interface{}
删除Session的代码如下:
this.DelSession(key)//参数是Session的key值
我们通过表格来分析他们的不同
不同点 | Cookie | Session |
---|---|---|
数据存储位置 | 客户端 | 服务器 |
数据安全性(相比较而言) | 低 | 高 |
生命周期 | 随着设置时间的结束,生命周期结束 | 当浏览器关闭的时候,生命周期结束 |
适用场景 | 对安全性要求不高的,需要存储时间较长的数据 | 安全性要求搞,不需要长期存储的数据 |
相关文章:

【2 beego学习 - 项目导入与项目知识点】
0 项目导入 1 在英文路径下新建一个同名的项目,拷贝其他数据到这个文件 bee new 同名项目名 cd 同名项目名 go mod tidy go get -u -v github.com/astaxie/beego go get 同名项目名/models2 拷贝部分的项目文件到新目录 bee run 运行的其他错误,按照提示安装文件 1 后端获取…...

Langchain-ChatGLM配置文件参数测试
1 已知可能影响对话效果的参数(位于configs/model_config.py文件): # 文本分句长度 SENTENCE_SIZE 100# 匹配后单段上下文长度 CHUNK_SIZE 250 # 传入LLM的历史记录长度 LLM_HISTORY_LEN 3 # 知识库检索时返回的匹配内容条数 VECTO…...
测试QT读写锁(QReadWriteLock )和互斥锁(QReadWriteLock )的执行效率
上代码: #include <QCoreApplication> #include <QElapsedTimer> #include <QtConcurrent> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);qSetMessagePattern("(%{time hh:mm:ss.zzz} %{thre…...

如何在 Windows 中免费合并 PDF 文件 [在线和离线]
PDF是一种广泛使用的文件格式,具有兼容性好、安全性高、易于打印、方便浏览等众多优点。在工作和学习过程中,经常需要将同一类型的PDF文件合并起来,以方便传输和查看,使得合并PDF文件成为一种重要的数据整合方法。 如果您想知道如…...

【LLM】金融大模型场景和大模型Lora微调实战
文章目录 一、金融大模型背景二、大模型的研究问题三、大模型技术路线四、LLaMA家族模型五、Lora模型微调的原理六、大模型Lora微调实战Reference 一、金融大模型背景 金融行业需要垂直领域LLM,因为存在金融安全和数据大多数存储在本地,在风控、精度、实…...

途乐证券股市资讯-英伟达,又创历史新高!美股全线上涨
当地时间13日,美股三大股指集体收涨,纳指、标普500指数双双改写2022年4月以来的新高。到收盘,道指涨0.14%,报34395.14点;纳指涨1.58%,报14138.57点;标普500指数涨0.85%,报4510.04点。…...

MySQL表聚合函数
前言 哈喽,各位小伙伴大家好,本篇文章为大家介绍几个MySQL中常用的聚合函数,什么是聚合函数,相信第一次看到这个名词的小伙伴是比较懵的,举个例子,比如说统计表中数据的个数,就可以使用MySQL中提…...

JavaWeb 速通XML
目录 一、XML快速入门 1.基本介绍 : 2.入门案例 : 二、XML语法 0.文件结构 : 1.文档声明 : 2. 元素 : 3.属性 : 4.注释 : 5.CDATA节 : PS : XML转义符 : 三、Dom4j 1.关于XML解析技术 : 2 Dom4j介绍 : 3.Dom4j使用 : 1 获取Document对象的三种方式 2 …...

redis浅析
一 什么是NoSQL? Nosql not only sql(不仅仅是SQL) 关系型数据库:列行,同一个表下数据的结构是一样的。 非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。 NoSQL泛指非关系…...

四种缓存的避坑总结
背景 分布式、缓存、异步和多线程被称为互联网开发的四大法宝。今天我总结一下项目开发中常接触的四种缓存实际项目中遇到过的问题。 JVM堆内缓存 JVM堆内缓存因为可以避免memcache、redis等集中式缓存网络通信故障问题,目前还在项目中广泛使用。 堆内缓存需要注…...

flutter开发实战-flutter二维码条形码扫一扫功能实现
flutter开发实战-flutter二维码条形码扫一扫功能实现 flutter开发实战-flutter二维码扫一扫功能实现,要使用到摄像头的原生的功能,使用的是插件:scan 效果图如下 一、扫一扫插件scan # 扫一扫scan: ^1.6.01.1 iOS权限设置 <key>NSCa…...

一篇文章了解Redis分布式锁
Redis分布式锁 什么是分布式锁? redis分布式锁是一种基于redis实现的锁机制,它用于在多并发分布式环境下控制并发访问共享资源。在多个应用程序或是进程访问共享资源时,分布式锁可以确保只有一个进程可以访问该资源,不会发生…...

记录第一次组装电脑遇到的坑
京东装机大师配置清单如下: 主板cpu安装 本次安装拆了两次主板 原因1.主板侧面有个金属板需要从内部安装 2.cpu风扇有个板需要装在主板底下 显卡比较大个要最后装,要不然可能要拆好几次 装系统时候 u盘启动认不出来,他妈的是因为机箱上的usb…...

右键pdf文件没有打印
问题描述 右键点pdf文件,弹出的菜单找不到打印选项。网上找了很多办法,然并卵啊。还是得靠自己慢慢摸索。 原因分析 新安装的win11系统,pdf文件默认可以用windows自带的edge浏览器打开。但是edge浏览器没有能力提供右键打印功能。 解决办法…...
什么是CDN?CDN的原理和作用是什么?
一:什么是CDN CDN全称Content Delivery Network,即内容分发网络。 CDN是Content Delivery Network(内容分发网络)的缩写,是一种利用分布式节点技术,在全球部署服务器,即时地将网站、应用、视频…...

链路传播(Propagate)机制及使用场景
服务间链路追踪传播机制是指在微服务架构中,通过记录和跟踪服务之间的请求和响应信息,来实现对服务间链路的追踪和监控。这种机制可以帮助开发人员快速定位服务间出现的问题,并进行优化和调整。 具体来说,服务间链路追踪传播机制…...
pytorch技巧总结1:学习率调整方法
pytorch技巧总结1:学习率调整方法 前言 这个系列,我会把一些我觉得有用、有趣的关于pytorch的小技巧进行总结,希望可以帮助到有需要的朋友。 免责申明 本人水平有限,若有误写、漏写,请大家温柔的批评指正。 目录…...

谈谈VPN是什么、类型、使用场景、工作原理
作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解VPN是什么、以及它的类型、使用场景、工作原理。 目录 一、VPN是什么? 二、VPN的类型 1、站点对站点VPN 2、…...

windows 下载安装Redis,并配置开机自启动
windows 下载安装Redis,并配置开机自启动 1. 下载 地址:https://github.com/tporadowski/redis/releases Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包,之后解压 打…...

2. CSS3的新特性
2.1CSS3的现状 ●新增的CSS3特性有兼容性问题, ie9才支持 ●移动端支持优于PC端 ●不断改进中 ●应用相对广泛 ●现阶段主要学习: 新增选择器和盒子模型以及其他特性 CSS3给我们新增了选择器,可以更加便捷,更加自由的选择目标元素: 1.属性选择器 2.结构伪类选择器…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...