一. 查询功能分析

  • 从item.html页面中复制部分脚本
    • datagrid请求的url为/showItem
    • 填充的列属性中数据除了tb_item表以外,还有CategoryName是商品对应的类目名称,存在于tb_item_cat表中,所以在查询时是两表查询
  1. $('#item_table').datagrid({
  2. url: '/showItem',
  3. columns: [[
  4. {field: 'Id', title: '商品ID', width: 100},
  5. {field: 'Title', title: '商品标题', width: 100},
  6. {field: 'CategoryName', title: '叶子类目', width: 100},
  7. {field: 'SellPoint', title: '卖点', width: 100},
  8. {field: 'Price', title: '价格', width: 100},
  9. {field: 'Num', title: '库存数量', width: 100},
  10. {field: 'Barcode', title: '条形码', width: 100},
  11. {field: 'Status', title: '状态', width: 100},
  12. {field: 'Created', title: '创建日期', width: 100},
  13. {field: 'Updated', title: '更新日期', width: 100}
  14. ]],
  • EasyUI中Datagrid分页时要求返回数据格式为:(不是EgoResult了,否则无法正确显示)
  1. {"rows":当前页数据,"total":总条数}

二.代码实现

  • 在commons文件夹下新建EasyUI.go
  1. package commons
  2. type Datagrid struct {
  3. //当前页显示的数据
  4. Rows interface{} `json:"rows"`
  5. //总个数
  6. Total int `json:"total"`
  7. }
  • 在src下新建文件夹item,并在item文件夹下新建TbItem.go
  1. package item
  2. //商品
  3. type TbItem struct {
  4. Id int
  5. Title string
  6. SellPoint string
  7. Price int
  8. Num int
  9. Barcode string
  10. Image string
  11. Cid int
  12. Status int8
  13. Created string
  14. Updated string
  15. }
  • 在item下新建TbItemDao.go实现数据访问,注意当数据库中有NULL值时的转换
  1. package item
  2. import (
  3. "commons"
  4. "fmt"
  5. "database/sql"
  6. )
  7. /*
  8. rows:每页显示的条数
  9. page:当前第几页
  10. */
  11. func selByPageDao(rows,page int) []TbItem{
  12. //第一个表示:从哪条开始查询,0算起 第二个:查询几个
  13. r,err:=commons.Dql("select * from tb_item limit ?,?",rows*(page-1),rows)
  14. if err!=nil{
  15. fmt.Println(err)
  16. return nil
  17. }
  18. ts:=make([]TbItem,0)
  19. for r.Next(){
  20. var t TbItem
  21. var s sql.NullString
  22. //如果直接使用t.Barcode由于数据库中列为Null导致填充错误
  23. r.Scan(&t.Id,&t.Title,&t.SellPoint,&t.Price,&t.Num,&s,&t.Image,&t.Cid,&t.Status,&t.Created,&t.Updated)
  24. t.Barcode=s.String
  25. ts=append(ts,t)
  26. }
  27. commons.CloseConn()
  28. return ts
  29. }
  • 在item文件夹下新建TbItemService.go编写业务代码
    • 目前不考虑总个数的问题
  1. package item
  2. import "commons"
  3. func showItemService(page,rows int) (e *commons.Datagrid){
  4. ts:=selByPageDao(rows,page)
  5. if ts!=nil{
  6. e= new(commons.Datagrid)
  7. e.Rows=ts
  8. return
  9. }
  10. return nil
  11. }
  • 在item文件夹下新建TbItemController.go编写控制器
  1. package item
  2. import (
  3. "net/http"
  4. "strconv"
  5. "encoding/json"
  6. "commons"
  7. )
  8. func ItemHandler(){
  9. commons.Router.HandleFunc("/showItem",showItemController)
  10. }
  11. //显示商品信息
  12. func showItemController(w http.ResponseWriter,r *http.Request){
  13. page,_:=strconv.Atoi(r.FormValue("page"))
  14. rows,_:=strconv.Atoi(r.FormValue("rows"))
  15. datagrid:=showItemService(page,rows)
  16. b,_:=json.Marshal(datagrid)
  17. w.Header().Set("Content-Type","application/json;charset=utf-8")
  18. w.Write(b)
  19. }
  • 修改main.go代码,添加item模块的引用
  1. package main
  2. import (
  3. "net/http"
  4. "html/template"
  5. "user"
  6. "commons"
  7. "github.com/gorilla/mux"
  8. "item"
  9. )
  10. //显示登录页面
  11. func welcome(w http.ResponseWriter, r *http.Request) {
  12. t, _ := template.ParseFiles("view/login.html")
  13. t.Execute(w, nil)
  14. }
  15. //restful显示页面
  16. func showPage(w http.ResponseWriter, r *http.Request){
  17. vars:=mux.Vars(r)
  18. t,_:=template.ParseFiles("view/"+vars["page"]+".html")
  19. t.Execute(w,nil)
  20. }
  21. func main() {
  22. commons.Router.PathPrefix("/static").Handler(http.StripPrefix("/static/",http.FileServer(http.Dir("static"))))
  23. commons.Router.HandleFunc("/",welcome)
  24. //满足/page/{page}格式的处理
  25. commons.Router.HandleFunc("/page/{page}",showPage)
  26. //用户
  27. user.UserHandler()
  28. //商品
  29. item.ItemHandler()
  30. http.ListenAndServe(":80",commons.Router)
  31. }