【2 beego学习 - 项目导入与项目知识点】

news2024/11/15 10:53:00

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"] = articles
	this.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.jpg
	ext := 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.Article
	article.ArtiName = articleName
	article.Acontent = content
	article.Aimg = "/static/img/" + fileName

	o.Insert(&article)

	//4.返回页面
	c.Redirect("/showArticleList", 302)

}

4 分页

后端分页,


//展示文章列表页
func(this*ArticleController)ShowArticleList(){
	//获取数据
	//高级查询
	//指定表
	o := orm.NewOrm()
	qs := o.QueryTable("Article")//queryseter
	var articles []models.Article
	//_,err := qs.All(&articles)
	//if err != nil{
	//	beego.Info("查询数据错误")
	//}
	//查询总记录数
	count,_ := qs.Count()
	//获取总页数
	pageSize := 2

	pageCount := 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"] = pageIndex
	this.Data["pageCount"] = int(pageCount)
	this.Data["count"] = count
	this.Data["articles"] = articles
	this.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 - 1
	return pageIndex2
}
//下一页
func ShowNextPage(pageIndex int, pageCount int) int {
	if pageIndex == pageCount {
		return pageIndex
	}
	var pageIndex2 = pageIndex + 1
	return 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       int
	TypeName string `orm:"size(20)"`
	// 1
	Articles []*Article `orm:"reverse(many)"`
}

多对多(创建关系表)

reverse(many)和rel(m2m)成对出现表示多对多关系,都是使用切片定义,类型是表名,本质是创建了关系表

// 定义一个结构体
type User struct {
	Id       int
	Articles []*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失效。

**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值

我们通过表格来分析他们的不同

不同点CookieSession
数据存储位置客户端服务器
数据安全性(相比较而言)
生命周期随着设置时间的结束,生命周期结束当浏览器关闭的时候,生命周期结束
适用场景对安全性要求不高的,需要存储时间较长的数据安全性要求搞,不需要长期存储的数据

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

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

相关文章

微软MFC技术中的消息队列及消息处理

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊微软MFC技术中的消息队列及消息处理。 MFC应用程序中由Windows 系统以消息的形式发送给应用程序的窗口。窗口接收和处理消息之后&#xff0c;把控制返回给Windows。Windows系统在同一时间可显示多…

HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题

导航&#xff1a; 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式常见面试题源码_vincewm的博客-CSDN博客 目录 一、底层 1.1 HashMap数据结构 1.2 扩容机制 1.3 put()流程 1.4 HashMap是如何计算…

电话号码的字母组合问题

解题思路&#xff1a; 当我第一眼看到这题的时候&#xff0c;我直接举出来一个列子“258”&#xff0c;直接套用多重for循环遍历可以罗列出来&#xff0c;但是根据数字组合的长度不能确定for循环的多少&#xff08;除非把所有for循环个数情况都罗列一遍&#xff09; 所以只能…

几种常用接口调用方式介绍

API&#xff0c;全称叫做Application Programming interface&#xff0c;也就是应用程序接口&#xff0c;API是一些预先定义的函数&#xff0c;我是学Java的&#xff0c;当我要使用这些函数的时候&#xff0c;便可以直接调用Java API&#xff0c;不用去访问源码&#xff0c;也不…

Linux设备驱动程序(四)——调试技术

文章目录 前言一、内核中的调试技术二、通过打印调试1、printk2、重定向控制台消息3、消息如何被记录4、开启及关闭消息5、速度限制6、打印设备编号 三、通过查询调试1、使用 /proc 文件系统①、在/proc中实现文件②、创建自己的 /proc 文件③、seq_file 接口 2、ioctl 方法 四…

Chatbot UI 和 ChatGLM2-6B 的集成

Chatbot UI 和 ChatGLM2-6B 的集成 0. 背景1. 部署 Chatbot UI2. 部署 ChatGLM2-6B3. 修改 ChatGLM2-6B 项目的 openai_api.py4. 修改 Chatbot UI 的配置5. 访问 Chatbot UI 0. 背景 尝试将 Chatbot UI 和 ChatGLM2-6B 的进行集成&#xff0c; ChatGLM2-6B 提供 API 服务&…

精确时钟同步协议ptp/IEEE-1588v2协议-------(2)主从时钟之间的消息交互与时钟同步过程

本文目录 1、主时钟和从时钟之间的消息交互流2、延时delay和偏移offset的计算2.1、延时delay的计算2.2、偏移offset的计算 主时钟和从时钟之间&#xff0c;通过sync, follow up, delay request, delay response这四条消息&#xff0c;完成时钟同步过程。PTP时钟同步系统能工作的…

word绘制横向表格

最近写小论文&#xff0c;表格太宽需要绘制横向表格&#xff0c;找了半天教程说的都不是很详细&#xff0c;我学习了一下决定自己写个教程。 我要在一和二之间创建一个横向表格。首先在一后面添加一个分节符号。布局->分隔符->分节负下一页。 再在二之前添加一个分节符号…

新耀东方|安全狗亮相2023第二届上海网络安全博览会

7月5日至7日&#xff0c;“新耀东方-2023第二届上海网络安全博览会暨高峰论坛”在上海顺利举办。此次大会由上海市信息网络安全管理协会、国家计算机网络应急技术处理协调中心上海分中心、(ISC)2上海分会、上海市普陀区科学技术委员会、上海市网络安全产业示范园共同主办。 作为…

左神算法之中级提升(2)

目录 [案例1】 【题目描述】 【思路解析1】 【思路解析2】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】今日头条2018面试题 第四题 【输入描述】 【思路解析】 【…

对于没有任何基础的初学者,云计算该怎样学习?

想学习任何一门专业技能&#xff0c;可以按下面这一套逻辑梳理&#xff01; 1&#xff09;了解基本内容 云计算这个技术是做什么的&#xff1f;适用哪些场景&#xff1f;有什么优点和缺点&#xff1f; 同时建议先找技术大纲&#xff0c;至少要学哪些技能点&#xff0c;可以网…

Layui之入门

目录 一、layui介绍 1.是什么 2.谁开发的 3.特点 二、layui&#xff0c;easyui和bootstrap的区别 1.layui、easyui与bootstrap的对比 2. layui和bootstrap对比&#xff08;这两个都属于UI渲染框架&#xff09; 3. layui和easyui对比 三、基础使用 四、登录注册实例讲解 …

医院陪诊小程序开发|陪诊小程序定制|陪诊服务app成品

陪诊小程序的功能开发对于陪诊行业有以下好处&#xff1a;   提高服务效率&#xff1a;陪诊小程序可以提供在线预约功能&#xff0c;方便用户随时预约合适的陪诊人员&#xff0c;减少了繁琐的人工沟通和安排工作&#xff0c;提高了服务效率。   增加服务范围&#xff1a;通…

基于matlab将图像标记器多边形转换为标记的块图像以进行语义分割(附源码)

一、前言 此示例演示如何将存储在对象中的多边形标签转换为适用于语义分割工作流的标记阻止图像。 可以使用计算机视觉工具箱中的图像标记器应用来标记太大而无法放入内存和多分辨率图像的图像。有关详细信息&#xff0c;请参阅在图像标记器&#xff08;计算机视觉工具箱&…

uniapp zjy-calendar日历,uni-calendar日历增强版

一、zjy-calendar简介 zjy-calendar日历是对uniapp uni-calendar日历的增强&#xff0c;支持圆点和文字自定义颜色。 二、使用方法 源使用说明&#xff1a;https://uniapp.dcloud.net.cn/component/uniui/uni-calendar.html 1、下载导入 https://ext.dcloud.net.cn/plugin?…

web-php

目录 基础 注释 php程序的组成 php的数据类型 php代码的运行 代码 显示时间 输出账户名和密码 后端对前端的数据进行验证处理代码 连接数据库的代码 前后端代码相结合验证&#xff0c;实现登录接口验证 login.html login.php register.html register.php error…

大模型调用工具魔搭GPT——一键调用魔搭社区上百个AI模型的API

为了让模型开发变得更容易,阿里云在发布会现场推出了一款令开发者耳目一新的工具:ModelScopeGPT(魔搭GPT)。它能够通过担任“中枢模型”的大语言模型一键调用魔搭社区其他的AI模型,实现大模型和小模型协同完成复杂任务。 这类智能调用工具被业界普遍看好。ModelScopeGP…

Android Handler被弃用,那么以后怎么使用Handler,或者类似的功能

Android API30左右&#xff0c;Android应用在使用传统写法使用Handler类的时候会显示删除线&#xff0c;并提示相关的方法已经被弃用&#xff0c;不建议使用。 Handler handler new Handler(){Overridepublic void handleMessage(NonNull Message msg) {super.handleMessage(…

分配操作菜单

目录 概述介绍数据库后端前端效果展示 概述 在写后台管理系统时, 我们可以根据不同的登录人,给予不同的功能菜单 如 :给楼栋管理员登录时分配(楼栋管理,宿舍管理) 所以在数据库就要创建: 1.登录人与角色表, 2再给角色表分配操作菜单 登录时查询对应的操作菜单,将数据响应给前端…

ASPICE软件工具链之Jira教程

Jira使用教程 一、什么是Jira? 二、Jira的使用教程 功能介绍: 创建工作流 工作流方案 设置字段流程 字段配置 界面方案 界面方案创建流程 问题类型界面方案 将项目与预先创建的方案关联 配置总流程 创建项目 设置项目 添加工作流 添加界面配置方案 设置Scrum 看板泳道图 一…