首页 > 其他分享 >Golang实战项目-B2C电商平台项目(3)

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

时间:2022-12-22 10:34:17浏览次数:65  
标签:rows http commons Golang item func 电商 B2C page

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
   

标签:rows,http,commons,Golang,item,func,电商,B2C,page
From: https://www.cnblogs.com/python9090/p/16997838.html

相关文章

  • Golang 项目部署实战
    一直认为不懂部署的开发工程师不是好的开发工程师,以下以一些实例讲解自己在项目中的Golang后端部署的情况。一般部署脚本应该具有构建、启动、停止、回滚已经查看记录......
  • 部署mall电商系统踩坑记录
    一、mysqldockerrun-p3306:3306--namemysql-v/mydata/mysql/log:/var/log/mysql-v/mydata/mysql/data:/var/lib/mysql-v/mydata/mysql/conf:/etc/mysql-eMY......
  • Golang比php开发好在哪?
    Go语言与PHP有许多不同之处,并且有着天然的优势,以下是Go语言与PHP的一些比较Go语言是一种静态类型的编程语言,而PHP是动态类型的编程语言。这意味着Go语言编译器会在编译......
  • golang对比java的优势_golang语言和其它编程语言的对比
    golang对比java的优势_golang语言和其它编程语言的对比 在软件行业做过一段时间的人都知道,没有万能的编程语言,也没有万能开发框架,更没有万能的解决方案。任何新技术的产......
  • golang接口
    1.ConstrainedGenericTypepackagemainimport( "fmt")typeStringer=interface{String()string}typeIntegerintfunc(iInteger)String()str......
  • golang如何打印变量类型,golang list如何把元素转换为可用类型
    golang打印变量类型方法glist=list.New()fmt.Printf("%T",mylist)结果:*list.Listgolang把list中的any类型转化为目的类型zz:=new(XNSSS)glist.PushBack(zz)f......
  • 对电商销售数据集进行分析
     一、选题背景原因:对电子商务进行分析,利用任何可能影响销售的信息,了解当前趋势和消费者行为的变化,进行数据驱动决策,以增加在线销售额。电子商务分析利用与整个用户......
  • golang 范型编程初学
     写了一个批次执行函数的功能,采用范型,直接上代码 batch实现代码:packageutilsimport( "time")typebatch[Tany]struct{ Array[]T Funcfunc(arr......
  • 区块链,中心去,何曾着眼看君王?用Go语言实现区块链技术,通过Golang秒懂区块链
    区块链技术并不是什么高级概念,它并不比量子力学、泡利不相容原则、哥德巴赫猜想更难以理解,但却也不是什么类似“时间就是金钱”这种妇孺皆知的浅显道理。区块链其实是一套......
  • Golang glog使用详解
    ​​golang/glog​​​ 是C++版本 ​​google/glog​​ 的Go版本实现,基本实现了原生glog的日志格式。在Kuberntes中,glog是默认日志库。glog的使用与特性通用功......