(二)goweb千锋教育练习项目

43 篇文章 1 订阅
30 篇文章 0 订阅

1.分页栏功能的实现

在TbItemDao.go中添加函数实现查询总个数

/*
如果返回值为<0表示查询失败
 */
func selCount() (count int){
	rows,err:=commons.Dql("select count(*) from tb_item")
	if err!=nil{
		fmt.Println(err)
		return -1
	}
	rows.Next()
	rows.Scan(&count)
	commons.CloseConn()
	return
}

在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//当前页显示的数据
		e.Total=selCount()//添加的代码,设置总个数
		return
	}
	return nil
}

2.多表查询正确显示

  • 在item文件夹下新建cat文件夹
  • 在cat中新建TbItemCat.go
package cat
//商品类目
type TbItemCat struct {
	Id int
	ParentId int
	Name string
	Status byte
	SortOrder int8
	IsParent byte
	Created string
	Updated string
}
  • 在item/cat下新建TbItemCatDao.go实现根据主键查询
package cat

import (
	"commons"
	"fmt"
)

func selByIdDao(id int) (t *TbItemCat){
	rows,err:=commons.Dql("select * from tb_item_cat where id=?",id)
	if err!=nil{
		fmt.Println(err)
		return nil
	}
	if rows.Next(){
		t =new (TbItemCat)
		rows.Scan(&t.Id,&t.ParentId,&t.Name,&t.Status,&t.SortOrder,&t.IsParent,&t.Created,&t.Updated)
	}
	commons.CloseConn()
	return
}
  • 在item/cat下新建TbItemCatService.go,并把函数暴露
package cat

//根据id查询类目
func ShowCatByIdService(id int) *TbItemCat {
	return selByIdDao(id)
}
  • 在item/TbItem.go中添加代码
//给页面使用,实现商品类目
type TbItemChild struct {
	TbItem
	CategoryName string
}
  • 修改item/TbItemService.go中代码
package item

import (
	"commons"
	"item/cat"
)

func showItemService(page,rows int) (e *commons.Datagrid){
	ts:=selByPageDao(rows,page)
	if ts!=nil{
		itemChildren :=make([]TbItemChild,0)
		for i:=0;i<len(ts);i++{
			var itemChild TbItemChild
			itemChild.Id = ts[i].Id
			itemChild.Updated=ts[i].Updated
			itemChild.Created=ts[i].Created
			itemChild.Status=ts[i].Status
			itemChild.Barcode=ts[i].Barcode
			//itemChild.Cid=ts[i].Cid
			//itemChild.Image=ts[i].Image
			itemChild.Price=ts[i].Price
			itemChild.Num=ts[i].Num
			itemChild.SellPoint=ts[i].SellPoint
			itemChild.Title=ts[i].Title
			itemChild.CategoryName = cat.ShowCatByIdService(ts[i].Cid).Name
			itemChildren= append(itemChildren,itemChild)
		}
		e= new(commons.Datagrid)
		e.Rows=itemChildren
		e.Total=selCount()
		return
	}
	return nil
}

3.商品删除

  • 在TbItemDao中添加函数,实现删除
/*
返回值如果小于0表示更新失败
 */
func updStatusByIdsDao(ids []string,status int) int{
	if len(ids)<=0{
		return -1
	}
	sql:="update tb_item set status=? where "
	for i:=0;i<len(ids);i++{
		sql+=" id="+ids[i]
		if i<len(ids)-1{
			sql+=" or "
		}
	}
	count,err := commons.Dml(sql,status)
	if err!=nil{
		fmt.Println(err)
		return -1
	}
	return int(count)
}
  • 在TbItemService.go中添加函数
//删除商品
func delByIdsService(ids string) (e commons.EgoResult){
	count:=updStatusByIdsDao(strings.Split(ids,","),3)
	if count>0{
		e.Status=200
	}
	return
}
  • 在TbItemController.go中添加函数,并修改ItemHandler()函数内容
//商品删除
func delByIdsController(w http.ResponseWriter, r *http.Request) {
	ids:=r.FormValue("ids")
	er:=delByIdsService(ids)
	b,_:=json.Marshal(er)
	w.Header().Set("Content-Type","application/json;charset=utf-8")
	w.Write(b)
}
func ItemHandler() {
	commons.Router.HandleFunc("/showItem", showItemController)
	commons.Router.HandleFunc("/item/delete", delByIdsController)
}

4.商品上架

  • 在TbItemService中添加函数实现商品上架
//商品上架
func instockService(ids string) (e commons.EgoResult){
	count:=updStatusByIdsDao(strings.Split(ids,","),1)
	if count>0{
		e.Status=200
	}
	return
}
  • 在TbItemController中添加函数,并修改Itemhandler()函数中内容
//商品上架
func instockController(w http.ResponseWriter, r *http.Request) {
	ids:=r.FormValue("ids")
	er:=instockService(ids)
	b,_:=json.Marshal(er)
	w.Header().Set("Content-Type","application/json;charset=utf-8")
	w.Write(b)
}
func ItemHandler() {
	commons.Router.HandleFunc("/showItem", showItemController)
	commons.Router.HandleFunc("/item/delete", delByIdsController)
	commons.Router.HandleFunc("/item/instock", instockController)
}

5.商品下架

  • 在commons/EasyUI.go中添加新的结构体
//tree
type EasyUITree struct {
	Id int `json:"id"`
	Text string `json:"text"`
	State string `json:"state"`
}
  • 在/item/cat/TbItemCatDao.go中添加新函数
/*
根据parent_id查询所有子类目
 */
func selByPid(pid int) (c []TbItemCat){
	rows,err:=commons.Dql("select * from tb_item_cat where parent_id=?",pid)
	if err!=nil{
		fmt.Println(err)
		return nil
	}
	c = make([]TbItemCat,0)
	for rows.Next()  {
		var t TbItemCat
		rows.Scan(&t.Id,&t.ParentId,&t.Name,&t.Status,&t.SortOrder,&t.IsParent,&t.Created,&t.Updated)
		c= append(c,t)
	}
	commons.CloseConn()
	return
}
  • 修改/item/cat/TbItemCat.go中结构体如下
package cat

//商品类目
type TbItemCat struct {
	Id        int
	ParentId  int
	Name      string
	Status    byte
	SortOrder int8
	IsParent  bool//此处由byte修改为bool
	Created   string
	Updated   string
}
  • 在/item/cat/TbItemCatService中添加新函数
func showCatByPidService(pid int) (tree []commons.EasyUITree){
	cats:=selByPid(pid)
	tree=make([]commons.EasyUITree,0)
	for _,n:= range cats{
		state:="open"
		if n.IsParent{
			state="closed"
		}
		tree=append(tree,commons.EasyUITree{n.Id,n.Name,state})
	}
	return
}
  • 在/item/cat下新建TbItemCatController.go
package cat

import (
	"net/http"
	"strconv"
	"encoding/json"
	"commons"
)

func ItemCatHandler(){
	commons.Router.HandleFunc("/item/cat/show",showItemCatController)
}

func showItemCatController(w http.ResponseWriter,r *http.Request){
	id:=r.FormValue("id")
	if id==""{
		id="0"
	}
	idInt,_:=strconv.Atoi(id)
	t:=showCatByPidService(idInt)
	b,_:=json.Marshal(t)
	w.Header().Set("Content-type","application/json;charset=utf-8")
	w.Write(b)
}
  • 在main.go中添加ItemCatHandler()函数的引用
package main

import (
	"net/http"
	"html/template"
	"user"
	"commons"
	"github.com/gorilla/mux"
	"item"
	"item/cat"
)

//显示登录页面
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()
	//商品类目
	cat.ItemCatHandler()
	http.ListenAndServe(":80", commons.Router)
}

6.商品上传照片

  • 在commons/CommonsVars.go 添加全局变量,表示当前项目的URL.同时设定json相关两个变量
package commons

import "github.com/gorilla/mux"

var (
	Router              = mux.NewRouter()
	CurrPath            = "http://localhost:80/"           //当前项目url
	HEADER_CONTENT_TYPE = "Content-Type"                   //Content-Type
	JSON_HEADER         = "application/json;charset=utf-8" //json
)
  • 在item/TbItemService.go添加函数实现图片上传
func imageUploadService(f multipart.File, h *multipart.FileHeader) map[string]interface{} {
	m := make(map[string]interface{})
	b, err := ioutil.ReadAll(f)
	if err != nil {
		m["error"] = 1
		m["message"] = "上传失败,服务器错误"
		return m
	}
	//纳秒时间戳+随机数+扩展名
	rand.Seed(time.Now().UnixNano())
	fileName := "static/images/" + strconv.Itoa(int(time.Now().UnixNano())) + strconv.Itoa(rand.Intn(1000)) + h.Filename[strings.LastIndex(h.Filename, "."):]
	err = ioutil.WriteFile(fileName, b, 0777)
	if err != nil {
		m["error"] = 1
		m["message"] = "上传失败,保存图片时错误"
		return m
	}
	m["error"] = 0
	m["url"] = commons.CurrPath + fileName
	return m
}
  • 在item/TbItemController.go添加函数,并配置映射
//图片上传
func imagesUploadController(w http.ResponseWriter, r *http.Request) {
	file,fileHeader,err:=r.FormFile("imgFile")
	if err!=nil{
		m:=make(map[string]interface{})
		m["error"]=1
		m["message"]="接收图片失败"
		b,_:=json.Marshal(m)
		w.Header().Set(commons.HEADER_CONTENT_TYPE,commons.JSON_HEADER)
		w.Write(b)
		return
	}
	m:=imageUploadService(file,fileHeader)
	b,_:=json.Marshal(m)
	w.Header().Set(commons.HEADER_CONTENT_TYPE,commons.JSON_HEADER)
	w.Write(b)
}

func ItemHandler() {
	commons.Router.HandleFunc("/showItem", showItemController)
	commons.Router.HandleFunc("/item/delete", delByIdsController)
	commons.Router.HandleFunc("/item/instock", instockController)
	commons.Router.HandleFunc("/item/offstock", offstockController)
	commons.Router.HandleFunc("/item/imageupload", imagesUploadController)//图片上传
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值