Template-分页列表-多条件搜索

发布时间 2023-12-22 16:42:11作者: 青烟绕指柔
package main

import (
	"2112aGorm/models"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"html/template"
	"io"
	"math"
	"net/http"
	"os"
	"strconv"
)

var db *gorm.DB

func init() {
	dsn := "root:root@tcp(127.0.0.1:8889)/2112a"
	db, _ = gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

// 添加
func GoodsAdd(w http.ResponseWriter, r *http.Request) {
	if r.Method == "POST" {
		// to do 商品添加
		name := r.FormValue("name")
		price, _ := strconv.ParseFloat(r.FormValue("price"), 64)
		number, _ := strconv.Atoi(r.FormValue("number"))
		cate := r.FormValue("cate")

		//接收文件
		file, header, err := r.FormFile("img")
		if err != nil {
			fmt.Println("文件获取失败")
			return
		}
		defer file.Close()
		//定义文件
		path := "static/img/" + header.Filename
		//创建文件
		newFile, err := os.OpenFile(path, os.O_RDONLY|os.O_WRONLY|os.O_CREATE, 0777) //读4  写2  执行1
		if err != nil {
			fmt.Println("文件创建失败")
			return
		}
		// 克拷文件
		_, err = io.Copy(newFile, file)
		if err != nil {
			fmt.Println("文件上传失败")
			return
		}
		goods := models.Goods{
			Name:   name,
			Price:  price,
			Number: number,
			Cate:   cate,
			Img:    path,
		}

		err = db.Table("goods").Create(&goods).Error
		if err != nil {
			fmt.Println("添加失败")
			return
		}
		//页面跳转
		http.Redirect(w, r, "/goods/list", 302)

	}
	if r.Method == "GET" {
		// 显示表单
		temp, err := template.ParseFiles("./views/form.html")
		if err != nil {
			fmt.Println("模版解析失败")
			return
		}
		temp.Execute(w, nil)
	}
}

// 列表
func GoodsList(w http.ResponseWriter, r *http.Request) {

	keyword := r.FormValue("keyword")
	cate := r.FormValue("cate")
	priceMin, _ := strconv.ParseFloat(r.FormValue("min_price"), 64)
	priceMax, _ := strconv.ParseFloat(r.FormValue("max_price"), 64)
	// 构建查询条件表达式
	query := db.Table("goods")
	if keyword != "" {
		query = query.Where("name LIKE ?", "%"+keyword+"%")
	}
	if cate != "" {
		query = query.Where("cate = ?", cate)
	}
	if priceMin > 0 && priceMax > 0 {
		query = query.Where("price BETWEEN ? AND ?", priceMin, priceMax)
	}
	//1.总数
	var count int64
	query.Count(&count)
	//2.每页显示条数
	size := 5
	//3.总页数
	sum := int(math.Ceil(float64(count) / float64(size)))
	//4.当前页
	now, _ := strconv.Atoi(r.URL.Query().Get("p"))
	if now == 0 {
		now = 1
	}
	//5.偏移量
	offset := (now - 1) * size

	var goods []models.Goods
	query.Table("goods").Limit(size).Offset(offset).Find(&goods)

	//上一页
	up := now - 1
	if up < 1 {
		up = 1
	}
	// 下一页
	down := now + 1
	if down > sum {
		down = sum
	}
	// 数字页码
	var pages []int
	for i := 1; i <= sum; i++ {
		pages = append(pages, i)
	}
	// 解析模版
	temp, err := template.ParseFiles("./views/list.html")
	if err != nil {
		fmt.Println("列表解析失败")
		return
	}
	// 定义map
	list := make(map[string]interface{})
	list["goods"] = goods
	list["sum"] = sum
	list["up"] = up
	list["down"] = down
	list["pages"] = pages
	list["now"] = now
	list["keyword"] = keyword
	list["cate"] = cate
	list["max_price"] = priceMax
	list["min_price"] = priceMin

	//渲染
	temp.Execute(w, list)

}

func main() {
	http.HandleFunc("/goods/add", GoodsAdd)
	http.HandleFunc("/goods/list", GoodsList)

	// 创建静态文件处理器
	staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("./static")))
	// 将处理器注册到路由中
	http.Handle("/static/", staticHandler)

	http.ListenAndServe("localhost:8080", nil)
}


-----------------------------------------------------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html>
<head>
<title>表格分页样式</title>
<link rel="stylesheet" type="text/css" href="/static/css/list.css">
</head>
<body>

<div class="container">

<form>
<input type="search" name="keyword" value="{{.keyword}}">

<select name="cate">
<option value="">请选择分类</option>
<option value="数码">数码</option>
<option value="服装">服装</option>
<option value="儿童">儿童</option>
</select>

<input type="text" name="min_price" style="width: 30px">-<input type="text" name="max_price" style="width: 30px">

<button type="submit">搜索</button>
</form>

<table id="myTable">
<thead>
<tr>
<th>编号</th>
<th>名称</th>
<th>价格</th>
<th>库存</th>
<th>分类</th>
<th>图片</th>
</tr>
</thead>
<tbody>
{{range .goods}}
<tr>
<td>{{.Id}}</td>
<td>{{.Name}}</td>
<td>¥{{.Price}}</td>
<td>{{.Number}}</td>
<td>{{.Cate}}</td>
<td><img src="/{{.Img}}" width="120px"></td>
</tr>
{{end}}
<!-- 其他商品行 -->
</tbody>
</table>
<div class="pagination">
<a href="?p={{.up}}&keyword={{.keyword}}&cate={{.cate}}&min_price={{.min_price}}&max_price={{.max_price}}">&laquo; 上一页</a>
{{range .pages}}
{{if eq $.now .}}
<a href="?p={{.}}&keyword={{$.keyword}}&cate={{$.cate}}&min_price={{$.min_price}}&max_price={{$.max_price}}" class="active">{{.}}</a>
{{else }}
<a href="?p={{.}}&keyword={{$.keyword}}&cate={{$.cate}}&min_price={{$.min_price}}&max_price={{$.max_price}}">{{.}}</a>
{{end}}
{{end}}
<a href="?p={{.down}}&keyword={{.keyword}}&cate={{.cate}}&min_price={{.min_price}}&max_price={{.max_price}}">下一页 &raquo;</a>
</div>
</div>

</body>
</html>
</body>
</html>