杭州--9

来源:互联网 发布:长虹人工智能电视 编辑:程序博客网 时间:2024/06/10 05:28
ctrl+s保存,并重新编译
在routers里面,第二个参数写成指向controller的指针应该是为了在controllers里重写Get方法
controllers里面先定义一个嵌入了beego.Controller的结构体UserDetailController
,然后重写这个结构体的get方法:func (this *UserDetailController) Get(){...}
然后在这个Get方法里先获取id:  id := this.GetString("id")
将“id”传入到model中,并获取model的返回的表结构: um,_ := models.GetUserDetail(id)
处理从model中获取的数据:idcard := um.Id_card,这个string类型,可以转换strconv.Atoi(um.Id)
model 中的处理:先定义一个结构体,里面有若干个字段名(方便在controllers里面取值),里面用到beego里的orm
定义函数,参数为传入值,函数第一个返回值一般是上面构建的结构体,第二个返回值为err
先写sql语句,sql := `select * from users`
o := orm.NewOrm()
声明一个上面的结构体 :var udv UsermteDetailView
将sql作为o.Raw()的参数代入,将udv的指针作为QueryRow()的参数:err := o.Raw(sql).QueryRow(&udv)
QueryRow(&udv)应该是将数据库检索的视图注入到udv里面
最后返回,return udv,err
routers.go 里面,mysql_uri = root:123456@tcp(192.168.1.220:3306)/zcm?charset=utf8&loc=Asia%2FShanghai
 123456是密码,192.168.1.220是地址


在model里面的fmt.Println()输出在服务端,可以用这个方法进行测试
在sql语句后面加上where 1=1,是为了方便将动态sql语句拼接在后面 


标的代码分析:
routers包里:beego.Router("/zcm/admin/ProductList/:begin", &controllers.ProductListController{}) //标的管理
controllers包里:1、定义一个嵌入beego.Controller的类型 ProductListController{}(简称plc)
2、重写plc的Get()方法,注意这个函数的receiver是&plc
3、获取一系列通过前端页面的name=“pid”等获取的空值
4、将这些空值注入到this.Data["biao"] = biao
5、定义condition := ""
6、判断如果pid这些不为空,则对condition进行扩充
7、begin := this.Ctx.Input.Params[":begin"]
8、再声明 var count int,err1 error
9、判断:
if begin == "1" {
count = 0 //如果为1,count = 0
} else {
count, err1 = strconv.Atoi(begin)//如果不为1,假如为2,对2进行类型转换,其返回值赋值给count,是否转换成功的结果赋值给err1
count = (count - 1) * 15//对count进行运算
}
if err1 != nil {//err1不为空,即类型转换失败
this.Data["data"] = err1.Error()
this.Data["productchoose"] = "nav_curr"
this.TplNames = "result.html"


}
scount := strconv.Itoa(count)//再将count转换为string类型
10、声明一个切片,var productlist []models.ProductView,元素为model里面的一个类型
11、再定义一个err error
12、判断sh是否等于“on_sell”,如果是,将"condition,scount"作为参数执行GetProuductList2(),
把返回值赋值给productlist
13、如果不是等于“on_sell",执行GetProuductList函数,相同操作
然后转向model里面,
1、model里面会先定义一个类型,ProductView{}
2、定义一个GetProductList()函数,接收两个string类型参数,返回值是以pv为元素的切片和error
3、这个函数里先定义一个类型切片 :var product []ProductView和 o := orm.NewOrm() 
4、写sql这个变量,在判断如果condition不为空,则将其加入在sql后面
5、再写order by语句和limit语句
6、_,err := o.Raw(sql).QueryRows(&product)
7、如果err不为空,函数返回nil,err,如果err为空,函数返回 product,nil


controller里面第二段分析:
1、pagecount,_ := models.GetProductCount(condition),返回值为2000
2、定义page int,pagelen := 15,pagec := 0
3、判断如果pagecount不为空,或者不等于0,对pagecount转型成int,第一个返回值赋值给page
  pagec = page/pagelen  2000/15   per := page%pagelen 取余
4、如果取余为0,pagec += 1,如果不为0,将一个字符注入this.Data["productchoose"]
  this.Layout = "layout/layout.html"    this.TplNames = "pro...html"
5、将begin转换为int,返回值赋予cccc
6、判断,如果pagec(商)小于等于5,注入一些数据this.Data["max"] = strconv.Itoa(pagec),
 最后填充this.Data["condition"]
7、如果pagec大于5,注入数据,与上面略有差异
8、判断如果npid不等于空,将npid转换为int型pid2,执行models.GetProductByIntid(pid2),返回productview,err3
9、如果err3为空(即成功查询数据库),this.Data["json"] = map[string]interface{...}
 如果不为空,即查询数据库库失败,this.Ctx.WriteStrin("false")
第三段:
1、如果productlist(以结构体为元素的切片)等于空或者err不为空,即查询有错误,
 设置首页
2、如果报错为空,且productlist>0,把productlist的第一个取出来,并获得id,再把id转换为int
3、代入第一个model函数,查询数据库,在controller里面返回一个结构体,um1;代入第二个参数,返回结构体p1
4、如果p1不为空,将p1.PidChecking取出,转换为int,代入GetContinueProduct,返回一个结构体,取出结构体里的name和id
5、设置首页


views界面取controller里面的this.Data["name"] = per.Name  
<h>姓名:{{.name}}<h>
0 0