首页 > 其他分享 >Template-分页列表-多条件搜索

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

时间:2023-12-22 16:45:23浏览次数:28  
标签:goods 分页 err 列表 FormValue Template query now cate

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>


 

标签:goods,分页,err,列表,FormValue,Template,query,now,cate
From: https://www.cnblogs.com/superzwb/p/17921937.html

相关文章

  • el-select自定义指令用于触底加载分页请求options数据(附上完整代码和接口可直接用)
    问题描述某些情况下,下拉框需要做触底加载,发请求,获取option的数据为了方便复用,笔者封装了一个自定义指令另外也提供了一个简单的接口,用于演示我们先看看效果图效果图思路分析注意事项一el-select要不嵌入到body中为何,不嵌入到body标签中呢?答曰,更加方便自定义指令管理......
  • 操作系统--分页存储管理中逻辑地址转换为物理地址
    【例1】考虑一个由8个页面,每页有1024个字节组成的逻辑空间,把它装入到有32个物理块的存储器中,问:(1)逻辑地址需要多少二进制位表示?(2)物理地址需要多少二进制位表示? 它由两个部分组成:前一部分表示该地址所在页面的页号p;后一部分表示页内地址(页内位移)d。页号的地址位数决定了......
  • python之动态生成列表和重复数据处理
    动态生成列表:range(起始,终点,步长)方法:print(list(range(1,6)))结果:[1,2,3,4,5]print(list(range(1,22,2)))结果:[1,3,5,7,9,11,13,15,17,19,21]列表解析法生成列表:语法包含三部分:表达式用于计算列表中元素的值、循环语句用于获得循环元素、条件判断语句形式1:列......
  • Flutter AnimatedList 实现动态列表
    import'dart:async';import'package:flutter/material.dart';finalGlobalKey_globalKey=GlobalKey();classMyAnimatedListextendsStatelessWidget{constMyAnimatedList({super.key});@overrideWidgetbuild(BuildContextcont......
  • C++ Qt开发:StringListModel字符串列表映射组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStringListModel字符串映射组件的常用方法及灵活运用。QStringListModel是Qt中用于处理字符......
  • Lazada商品评论列表API:电商行业的实时反馈宝库
    一、引言在当前的电商行业中,获取实时、准确的用户反馈数据对于电商业务运营至关重要。Lazada是东南亚地区领先的电商平台之一,提供了丰富的API接口,其中包括获取商品评论列表API,以便第三方开发者能够获取Lazada内的商品评论信息。本文将深入探讨Lazada商品评论列表API在电商行业中的......
  • python之列表的排序、循环、合并
    排序:sorted()显示临时排序cars=['byd','audi','gelly','qirui','chengcheng']print(sorted(cars))print(cars)结果:['audi','byd','chengcheng','gelly','qirui'][�......
  • 列表页删除最后一页的最后一条数据,定位前一页数据
    1、调用后端接口时,返回最大页码数,这样就可以避免//最后一页就剩一条,删除或者取消关注,默认展示前一页if(tableData?.length==0&&currentPage>1){ constbeforePageNum=result?.maxPage==0?1:result?.maxPage; setCurrentPage(beforePageNum);}2、计......
  • delphi cxgrid 过滤列表增加右键
    首先弹出来的下拉过滤列表也是一个form思路,在不改源代码的情况:hook,捕捉  WM_SHOWWINDOW 消息,通过源码得知窗口类名为”TcxGridFilterPopup“ 再通过句柄转得到实例,同时在本单元type一下新的 TcxGridFilterPopup, TcxGridPopupListBox才能访问保护起来的方法跟属性C......
  • Redis 主从集群搭建并使用 RedisTemplate 实现读写分离
    单机版的Redis能够承载并发访问的能力有限,对于绝大多数的系统而言,都是读多写少,系统之所以宕机,一般都是因为并发读操作太高导致的宕机,因此搭建Redis主从集群,实现读写分离,是一种有效的提高并发访问能力的方案。本篇博客介绍在一台虚拟机上,使用docker-compose模拟搭建一个【一......