Golang实战项目-B2C电商平台项目(3)
总体页面的显示
- 由于在main中声明的全局对象无法被其他包调用,所以在commons文件夹下新建CommonVars.go,保证整个项目任何包都可以使这个对象进行设置Handler
package commons
import "github.com/gorilla/mux"
var (
Router = mux.NewRouter()
)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 修改main.go中代码,称为restful风格
package main
import (
"net/http"
"html/template"
"user"
"commons"
"github.com/gorilla/mux"
)
//显示登录页面
func welcome(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("view/login.html")
t.Execute(w, nil)
}
//restfule风格显示页面
func showPage(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
t, _ := template.ParseFiles("view/" + vars["page"] + ".html")
t.Execute(w, nil)
}
func main() {
commons.Router.HandleFunc("/", welcome)
commons.Router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
commons.Router.HandleFunc("/page/{page}", showPage)
//调用所有user模块的handler
user.UserHandler()
http.ListenAndServe(":80", commons.Router)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 修改user/UserController中UserHandler()函数
//所有user模块的handler
func UserHandler() {
commons.Router.HandleFunc("/login", loginController)
}
- 1
- 2
- 3
- 4
查询功能分析
-
从item.html页面中复制部分脚本
- datagrid请求的url为/showItem
- 填充的列属性中数据除了tb_item表以外,还有CategoryName是商品对应的类目名称,存在于tb_item_cat表中,所以在查询时是两表查询
$('#item_table').datagrid({ url: '/showItem', columns: [[ {field: 'Id', title: '商品ID', width: 100}, {field: 'Title', title: '商品标题', width: 100}, {field: 'CategoryName', title: '叶子类目', width: 100}, {field: 'SellPoint', title: '卖点', width: 100}, {field: 'Price', title: '价格', width: 100}, {field: 'Num', title: '库存数量', width: 100}, {field: 'Barcode', title: '条形码', width: 100}, {field: 'Status', title: '状态', width: 100}, {field: 'Created', title: '创建日期', width: 100}, {field: 'Updated', title: '更新日期', width: 100} ]],
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- EasyUI中Datagrid分页时要求返回数据格式为:(不是EgoResult了,否则无法正确显示)
{"rows":当前页数据,"total":总条数}
- 1
代码实现
- package commons
package commons type Datagrid struct { //当前页显示的数据 Rows interface{} `json:"rows"` //总个数 Total int `json:"total"` }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 在src下新建文件夹item,并在item文件夹下新建TbItem.go
package item //商品 type TbItem struct { Id int Title string SellPoint string Price int Num int Barcode string Image string Cid int Status int8 Created string Updated string }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 在item下新建TbItemDao.go实现数据访问,注意当数据库中有NULL值时的转换
package item import ( "commons" "fmt" "database/sql" ) /* rows:每页显示的条数 page:当前第几页 */ func selByPageDao(rows,page int) []TbItem{ //第一个表示:从哪条开始查询,0算起 第二个:查询几个 r,err:=commons.Dql("select * from tb_item limit ?,?",rows*(page-1),rows) if err!=nil{ fmt.Println(err) return nil } ts:=make([]TbItem,0) for r.Next(){ var t TbItem var s sql.NullString //如果直接使用t.Barcode由于数据库中列为Null导致填充错误 r.Scan(&t.Id,&t.Title,&t.SellPoint,&t.Price,&t.Num,&s,&t.Image,&t.Cid,&t.Status,&t.Created,&t.Updated) t.Barcode=s.String ts=append(ts,t) } commons.CloseConn() return ts }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
-
在item文件夹下新建TbItemService.go编写业务代码
-
目前不考虑总个数的问题
package item import "commons" func showItemService(page,rows int) (e *commons.Datagrid){ ts:=selByPageDao(rows,page) if ts!=nil{ e= new(commons.Datagrid) e.Rows=ts return } return nil }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
-
在item文件夹下新建TbItemController.go编写控制器
package item
import (
"net/http"
"strconv"
"encoding/json"
"commons"
)
func ItemHandler(){
commons.Router.HandleFunc("/showItem",showItemController)
}
//显示商品信息
func showItemController(w http.ResponseWriter,r *http.Request){
page,_:=strconv.Atoi(r.FormValue("page"))
rows,_:=strconv.Atoi(r.FormValue("rows"))
datagrid:=showItemService(page,rows)
b,_:=json.Marshal(datagrid)
w.Header().Set("Content-Type","application/json;charset=utf-8")
w.Write(b)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 修改main.go代码,添加item模块的引用
package main
import (
"net/http"
"html/template"
"user"
"commons"
"github.com/gorilla/mux"
"item"
)
//显示登录页面
func welcome(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("view/login.html")
t.Execute(w, nil)
}
//restful显示页面
func showPage(w http.ResponseWriter, r *http.Request){
vars:=mux.Vars(r)
t,_:=template.ParseFiles("view/"+vars["page"]+".html")
t.Execute(w,nil)
}
func main() {
commons.Router.PathPrefix("/static").Handler(http.StripPrefix("/static/",http.FileServer(http.Dir("static"))))
commons.Router.HandleFunc("/",welcome)
//满足/page/{page}格式的处理
commons.Router.HandleFunc("/page/{page}",showPage)
//用户
user.UserHandler()
//商品
item.ItemHandler()
http.ListenAndServe(":80",commons.Router)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33