golang web 分页查询数据库数据,并以表格形式显示数据

1、目录结构

在这里插入图片描述

2、login.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
        <form action="/login" method="post" enctype="application/x-www-form-urlencoded" novalidate="off">
            <table>
                <tr>
                    <td>
                        查询方式
                        <select name="select_option">
                            <option>查询该型号数据</option>
                            <option>下一页</option>
                            <option>上一页</option>
                            <option>最后一页</option>
                            <option>自定义页码</option>
                        </select>
                    </td>
                    <td>
                        <div>
                            自定义页码<input type="number" name="pageNum" />
                        </div>
                    </td>
          <td>
            <div>
                      型号<input type="text" name="erp_product_model" />
                  </div>
          </td>
          
          <td>
            <div>
                      <input type="submit" value="查询" />
                  </div>
          </td>
        </tr>
      </table>
        </form>
    
    <div style="color: red;">{{.query_fail}}</div>
    <div>{{.nowPage}} / {{.allPage}}</div>
    <table border='1'>
      {{range.items}}
      <tr><td>{{.Myid}}</td><td>{{.Erp_product_model}}</td><td>{{.Fdc_machine}}</td><td>{{.Erp_queue_qty}}</td><td>{{.Fdc_level}}</td><td>{{.Fdc_man}}</td><td>{{.Erp_product_item}}</td><td>{{.Erp_wip_job}}</td><td>{{.Fdc_lot}}</td><td>{{.Fdc_start_time}}</td></tr>
      {{end}}
    </table>
    
    {{.comment}}
    
    </body>
</html>

3、mian.go

// S单侧防潮箱查询 project main.go
package main
import (
    _ "S单侧防潮箱查询/mysql-1.4"
    "database/sql"
    "fmt"
    "html/template"
    "log"
    "net/http"
    "strconv"
)
type Item struct {
    Myid              sql.NullInt64
    Erp_product_model sql.NullString
    Fdc_machine       sql.NullString
    Erp_queue_qty     sql.NullInt64
    Fdc_level         sql.NullString
    Fdc_man           sql.NullString
    Erp_product_item  sql.NullString
    Erp_wip_job       sql.NullString
    Fdc_lot           sql.NullString
    Fdc_start_time    sql.NullString
}
type item_len struct {
    all_len int
}
// 声明全局变量
var db *sql.DB
var allPage, nowPage int = 1, 1
// 初始化数据库连接
func initDB() (err error) {
    dsn := "FDC:fdc@tcp(172.16.3.xxx:3306)/xxx?charset=utf8&parseTime=True&allowOldPasswords=1"
    db, err = sql.Open("mysql", dsn) // 打开一个数据库连接,不会校验用户名和密码是否正确
    if err != nil {
        return err
    }
    err = db.Ping()
    if err != nil {
        return err
    }
    return
}
// 获取该型号总行数(型号)
func getlen(erp_product_model string) int {
    var myLen = 0
    err := initDB() // 连接数据库
    if err != nil {
        log.Println("getlen()数据库连接失败,", err)
        return 0
    }
    fmt.Println("getlen()数据库连接成功")
    s := "SELECT count(*) as allLen FROM wip WHERE erp_product_model='" + erp_product_model + "' GROUP BY erp_product_model "
    r, err := db.Query(s)
    var myallLen item_len
    // defer r.Close()
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        for r.Next() {
            r.Scan(&myallLen.all_len)
            myLen = myallLen.all_len
        }
    }
    defer r.Close() //断开数据库连接
    return myLen
}
// 获取查询结果集(型号, 分页起始位置, 分页结束位置)
func get_select(erp_product_model string, start_site string, end_site string) []Item {
    var items = make([]Item, 0)
    // items = []Item{}  //清空数据
    dberr := initDB() // 连接数据库
    if dberr != nil {
        log.Println("数据库连接失败,", dberr)
        return items
    }
    //获取详细数据
    var s = "SELECT (@i:=@i+1) AS id,erp_product_model,fdc_machine,erp_queue_qty,fdc_level,fdc_man,erp_product_item,erp_wip_job,fdc_lot,fdc_start_time FROM wip,(SELECT @i:=0) AS itable  WHERE erp_product_model='" + erp_product_model + "' LIMIT " + start_site + ", " + end_site
    dbr, dberr := db.Query(s)
    fmt.Println(s)
    var b Item
    if dberr != nil {
        fmt.Printf("dberr: %v\n", dberr)
    } else {
        for dbr.Next() {
            dbr.Scan(&b.Myid, &b.Erp_product_model, &b.Fdc_machine, &b.Erp_queue_qty, &b.Fdc_level, &b.Fdc_man, &b.Erp_product_item, &b.Erp_wip_job, &b.Fdc_lot, &b.Fdc_start_time)
            items = append(items, b) // 准备好参数
        }
    }
    defer dbr.Close() //断开数据库连接
    return items
}
// 主函数加载的页面
func loginhanler(w http.ResponseWriter, r *http.Request) {
    // 如果是post请求,注意先后顺序;即用户点击提交按钮
    if r.Method == http.MethodPost {
        // 解析表单,并且校验
        r.ParseForm()
        erp_product_model := r.FormValue("erp_product_model") //型号
        select_option := r.FormValue("select_option")         //查询方式
        pageNum, _ := strconv.Atoi(r.FormValue("pageNum"))    //自定义页码
        var query_fail = ""                                   // 无法查询结果的提示
        var perPageNum = 10                                   //每页显示数目
        // 如果输入正确,则发送cookie,并给出反馈
        if erp_product_model != "" { //型号不为空
            if select_option == "查询该型号数据" {
                nowPage = 1 //初始化当前页码
                allPage = 1 //初始化总页码
                // 获取总行数
                var myallLen = 0
                myallLen = getlen(erp_product_model)
                if myallLen != 0 {
                    if myallLen/perPageNum == 0 { //可以整除
                        allPage = myallLen / perPageNum
                    } else { //不能整除
                        allPage = myallLen/perPageNum + 1
                    }
                }
            } else if select_option == "下一页" {
                if nowPage < allPage {
                    nowPage++
                } else {
                    // 无法查询结果的提示
                    query_fail = "没有下一页了"
                }
            } else if select_option == "上一页" {
                if nowPage > 1 {
                    nowPage--
                } else {
                    // 无法查询结果的提示
                    query_fail = "没有上一页了"
                }
            } else if select_option == "最后一页" {
                nowPage = allPage
            } else { //自定义页码
                if pageNum <= allPage && pageNum >= 1 {
                    nowPage = pageNum
                } else {
                    // 无法查询结果的提示
                    query_fail = "页码错误"
                }
            }
            start_site := strconv.Itoa((nowPage - 1) * perPageNum)
            perPageNumStr := strconv.Itoa(perPageNum)
            items := make([]Item, 0)
            // items = []Item{} //清空数据
            items = get_select(erp_product_model, start_site, perPageNumStr)
            // 解析模板
            t, err := template.ParseFiles("html/login.html")
            if err != nil {
                log.Fatal(err)
            }
            if query_fail == "页码错误" {
                items = []Item{} //清空数据
            }
            data := map[string]interface{}{
                "userName":   erp_product_model,
                "allPage":    allPage,
                "nowPage":    nowPage,
                "query_fail": query_fail,
                "items":      items,
            }
            // 渲染模板
            t.Execute(w, data)
        } else { //型号为空
            // 解析模板
            t, err := template.ParseFiles("html/login.html")
            if err != nil {
                log.Fatal(err)
            }
            items := []Item{}
            // 无法查询结果的提示
            query_fail := "请输入型号,本次数据查询失败"
            allPage = 1
            nowPage = 1
            data := map[string]interface{}{
                "items":      items,
                "query_fail": query_fail,
                "allPage":    allPage,
                "nowPage":    nowPage,
            }
            // 渲染模板
            t.Execute(w, data)
        }
    } else { //用户没有点击按钮
        // 解析模板
        t, err := template.ParseFiles("html/login.html")
        if err != nil {
            log.Fatal(err)
        }
        // 准备好参数
        items := []Item{}
        data := map[string]interface{}{
            "items":   items,
            "allPage": allPage,
            "nowPage": nowPage,
        }
        // 渲染模板
        t.Execute(w, data)
    }
}
// 程序入口
func main() {
    fmt.Println("S单侧防潮箱查询......")
    mux := http.NewServeMux()
    // 访问http: //localhost:8000/login;会调用loginhanler()函数
    mux.HandleFunc("/login", loginhanler)
    server := &http.Server{
        Addr:    ":8000",
        Handler: mux,
    }
    err := server.ListenAndServe()
    if err != nil {
        log.Fatal(err)
    }
}

4、执行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值