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)//图片上传
}