th.Data["err"] = "密码错误"
</form>
{{.err}}
<div class="login_bg"></div>
Data的错误信息可以直接在前端页面显示出来,用两个大括号来调用
//th.Redirect() 页面跳转,会改变页面路径
//th.TplName = 页面渲染,传递数据(错误信息)
//(镜像跳转)给前端返回一个页面 (路径,状态码)
th.Redirect("/login",302)
镜像跳转(给前端返回一个跳转页面)
http状态码
1xx 请求发送成功,请继续发请求
2xx 请求成功
3xx 资源转移(重定向) 300 301 302
4xx 请求端错误,请求的没有没有 401 402 404
5xx 服务器端错误 500
<form method="post" action="add" enctype="multipart/form-data">
在前端页面的表单中指定路由模式,和路径 通知服务器接受上传的数据
//1.把图片存到服务器
th.SaveToFile("uploadname","./static/img/"+head.Filename)
函数的路径参数要以./开头
//用上传时间解决文件被覆盖
time.Now().Format("2006-01-02-15-04-05")
//获取文件后缀函数
ext := path.Ext(head.Filename)
//beego.Info(head.Filename,ext)
//2.校验文件类型
if ext != ".jpg" && ext != ".png" && ext != "jpeg" {
th.Data["errmsg"] = "非法图片,再给你一次机会!"
th.TplName = "add.html"
return
}
//3.校验文件大小
if head.Size > 500000{
th.Data["errmsg"] = "整那么大干啥?服务器钱你给啊?"
th.TplName = "add.html"
return
}
上传文件校验步骤
//指定获取数据库的表名
table := o.QueryTable("Article")
用表名来获取数据库信息
{{range .articles}}
<tr>
<td>{{.Title}}</td>
<td><a href="#">查看详情</a></td>
<td>{{.Time.Format "2006-01-02 15:04:05"}}</td>
<td>{{.Content}}</td>
<td><a href="#" class="dels">删除</a></td>
<td><a href="#">编辑</a></td>
<td>财经新闻</td>
</tr>
{{end}}
beego的视图语法,用来把数据库得到的数据展示在前端页面上
//分页处理
//1.获取总记录数
count, err := table.Count()
//错误处理
if err != nil {
beego.Error("查询数据条目数错误!")
th.TplName = "index.html"
return
}
//2.定义每页显示的条数
pageIndex := int64(2)
//获取总页数.用浮点型传入参数后,会向上取整(整形会向下取整)
pageCount := math.Ceil(float64(count) / float64(pageIndex))
//在执行过程中打印提示信息
beego.Info("count=",count,"pageIndex=",pageIndex,"pageCount=",pageCount)
分页处理
//只获取展示部分数据(获取部分数据)参数(展示数量,展示起始位置) 把数据放入容器
table.Limit(page,start).All(&articles)
获取部分数据函数
<li><a href="/index?pageIndex=1">首页</a></li>
{{/*通过管道传参给pre*/}}
<li><a href="/index?pageIndex={{.pageIndex | pre}}">上一页 </a> </li>
{{/*通过空格传递参数*/}}
<li> <a href="index?pageIndex={{next .pageIndex .pageCount}}">下一页</a></li>
<li><a href="/index?pageIndex={{.pageCount}}">末页</a></li>
<li>共{{.count}}条记录/共{{.pageCount}}页/当前{{.pageIndex}}页</li>
前端的分页处理
//定义一个翻页运算函数
func getPre(pageIndex int)int {
//判断范围
if pageIndex-1 <= 0 {
return pageIndex
}
return pageIndex -1
}
func getNext(pageIndex int,pageCount int)int {
//判断范围
if pageIndex + 1 > pageCount {
return pageCount
}
return pageIndex + 1
}
翻页运算
//阅读数量的增加
article.ReadNum += 1
//更新数据库数据(对象)
o.Update(&article)
用update来更新数据库,达到阅读数量的实现
{{/*隐藏域传值*/}}
<input name="articleId" value="{{.article.Id}}" hidden="hidden">
用隐藏域来传值,避免代码显示在前端网页上
//封装一个上传函数
func UploadFunc(th *ArticleController,filePath string)string {
file, head, err := th.GetFile(filePath)
defer file.Close()
if err != nil {
return ""
}
//用上传时间解决文件被覆盖
time.Now().Format("2006-01-02-15-04-05")
//获取文件后缀函数
ext := path.Ext(head.Filename)
//beego.Info(head.Filename,ext)
//2.校验文件类型
if ext != ".jpg" && ext != ".png" && ext != "jpeg" {
th.Data["errmsg"] = "非法图片,再给你一次机会!"
th.TplName = "add.html"
return ""
}
//3.校验文件大小
if head.Size > 500000 {
th.Data["errmsg"] = "整那么大干啥?服务器钱你给啊?"
th.TplName = "add.html"
return ""
}
//在执行过程中打印信息
//beego.Info(file,head)
//把前端上传来的数据进行处理
//1.把图片存到服务器
th.SaveToFile(filePath, "./static/img/"+head.Filename+ext)
return "/static/img/"+head.Filename+ext
}
封装函数(以便反复更新利用)
<script type="text/javascript">
$(".dels").click(function(){
if(!confirm("谁怂谁孙子,删不删?")){
return false
}
})
</script>
js前端提示框,取消和确认
//和属性表建立多对多的关系
Articles []*Article`orm:"reverse(many)"`
//和类型表建立多对一关系
ArticleType *ArticleType`orm:"rel(fk)"`
//和用户表建立多对多的正向关系
Users []*User`orm:"rel(m2m)"`
//和属性表建立一对多反向的关系
Articles []*Article`orm:"reverse(many)"`
models下 建立表与表之间的关系
{{range .articleTypes}}
<tr>
<td>{{.Id}}</td>
<td>{{.TypeName}}</td>
<td><a href="javascript:;" class="edit">删除</a></td>
</tr>
{{end}}
用视图函数把数据展示在视图页面
//多表一起查询(把文章和类型表格一起查询)
table.Limit(page,start).RelatedSel("ArticleType").All(&articles)
查询多表关联数据操作
$(".dels").click(function(){
if(!confirm("谁怂谁孙子,删不删?")){
return false
}
})
$("#select").change(function () {
$("#form").submit()
})
用js语句来触发时间,对后端进行get请求
//保存登录用户名
//调用cookie函数(key,value,保存时间)
th.Ctx.SetCookie("userName",userName,3600 *24)
用cookie来储存用户名
cookie
在客户端.浏览器
能够设置生存时间,当设置的时间失效的时候,就失效
一般安全性要求不高数据用cookie储存
session
在一定时间内保存用户数据
在服务器端
当浏览器关闭的时候,session失效
安全性要求高的数据一般存在session
//清除登录用户栏的信息
th.Ctx.SetCookie("userName",userName,-1)
当失效时间设置为-1的时候,立刻清除数据
if userName != ""{
th.Data["userName"] = userName
//设置复选框的初始状态
th.Data["checked"] = "checked"
}else {
th.Data["userName"] = userName
//如果有用户登录信息的话则复选框为空
th.Data["checked"] = ""
登录页面账户信息的复选框的设置
//在APP.conf配置文件内开启session的存储功能
sessionon = true
//设置session
th.SetSession("userName",userName)
func (th *ArticleController)ShowIndex() {
//校验session
userName := th.GetSession("userName")
//退出登录时删除session
th.DelSession("userName")
用session把用户登录信息保存到服务器
//第一种获取用户浏览记录
//o.LoadRelated(&article,"Users")
//第二种多对多获取浏览记录的查询方法(只能获取部分数据)
table := o.QueryTable("User")
//创建一个临时容器
var users []models.User
//多对多的过滤查询 去重函数 把查询的的数据放入容器
table.Filter("Articles__Article__Id",article.Id).Distinct().All(&users)
//把数据传递给前端
th.Data["users"] = users
获取用户浏览记录操作