Golang实战项目-B2C电商平台项目

Posted 旧时星空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang实战项目-B2C电商平台项目相关的知识,希望对你有一定的参考价值。

Golang实战项目-B2C电商平台项目(3)

总体页面的显示

  • 由于在main中声明的全局对象无法被其他包调用,所以在commons文件夹下新建CommonVars.go,保证整个项目任何包都可以使这个对象进行设置Handler
package commons

import "github.com/gorilla/mux"

var (
	Router = mux.NewRouter()
)
  • 修改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)
}
  • 修改user/UserController中UserHandler()函数
//所有user模块的handler
func UserHandler() {
	commons.Router.HandleFunc("/login", loginController)
}

查询功能分析

  • 从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}
                ]],
    
    • EasyUI中Datagrid分页时要求返回数据格式为:(不是EgoResult了,否则无法正确显示)
    {"rows":当前页数据,"total":总条数}
    
    代码实现
    • package commons
    package commons
    
    type Datagrid struct {
    	//当前页显示的数据
    	Rows interface{} `json:"rows"`
    	//总个数
    	Total int `json:"total"`
    }
    
    • 在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
    }
    
    • 在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
    }
    
    • 在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
    }
    
  • 在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)
}
  • 修改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)
}

以上是关于Golang实战项目-B2C电商平台项目的主要内容,如果未能解决你的问题,请参考以下文章

Golang实战项目-B2C电商平台

Golang实战项目-B2C电商平台项目

Golang实战项目-B2C电商平台项目

Golang实战项目-B2C电商平台项目

Golang实战项目-B2C电商平台项目

Golang实战项目-B2C电商平台