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、执行结果