JS 分頁
1> JS分頁,業務邏輯
(1) 分頁采用的是一個叫jquery.pagination.js的一個jquery插件
(2) 需要jquery的支持,此項目中使用到的是jquery-2.1.1.min.js
(3) 分頁需要的參數有:記錄總數,每頁顯示個數,頁碼
(4) 添加搜索的條件,作為查詢使用
2> 編寫新的model,命名為person.go.其代碼如下:
package models import ( "log" "fmt" db "GinLearn/GinLearn/database" ) //表結構 type Person struct { Id int `json:"id" form:"id"` FirstName string `json:"first_name" form:"first_name"` LastName string `json:"last_name" form:"last_name"` } //新增記錄 func (p *Person) AddPerson() bool { rs, err := db.SqlDB.Exec("INSERT INTO person(first_name, last_name) VALUES (?, ?)", p.FirstName, p.LastName) if err != nil { return false } id, err := rs.LastInsertId() fmt.Println(id) if err!=nil{ return false }else{ return true } } //修改記錄 func (p *Person) EditPerson() bool { rs, err := db.SqlDB.Exec("UPDATE person set first_name=?,last_name=? where id=?", p.FirstName, p.LastName,p.Id) if err != nil { return false } id, err := rs.RowsAffected() fmt.Println(id) if err!=nil{ return false }else{ return true } } //刪除記錄 func DeletePerson(Id int) bool { rs, err := db.SqlDB.Exec("Delete From person where id=?", Id) if err != nil { return false } id, err := rs.RowsAffected() fmt.Println(id) if err!=nil{ return false }else{ return true } } //得到記錄列表 func GetPersonList(pageno,pagesize int,search string) (persons []Person) { fmt.Println("搜索參數:"+search) persons = make([]Person, 0) //SQL查詢分頁語句 if search!=""{ rows, err := db.SqlDB.Query("SELECT id, first_name, last_name FROM person where 1=1 and last_name like '%"+search+"%' or first_name like '%"+search+"%' limit ?,?",(pageno-1)*pagesize,pagesize) if err != nil { return nil } defer rows.Close() //數據添加到數據集中 for rows.Next() { var person Person rows.Scan(&person.Id, &person.FirstName, &person.LastName) persons = append(persons, person) } if err = rows.Err(); err != nil { return nil } }else{ rows, err := db.SqlDB.Query("SELECT id, first_name, last_name FROM person where 1=1 limit ?,?",(pageno-1)*pagesize,pagesize) if err != nil { return nil } defer rows.Close() //數據添加到數據集中 for rows.Next() { var person Person rows.Scan(&person.Id, &person.FirstName, &person.LastName) persons = append(persons, person) } if err = rows.Err(); err != nil { return nil } } return persons } //得到記錄數 func GetRecordNum(search string) int { num:=0; //SQL查詢分頁語句 if search!=""{ rows, err := db.SqlDB.Query("SELECT id, first_name, last_name FROM person where 1=1 and first_name like '%?%' or last_name '%?%'",search,search) if err != nil { return 0 } defer rows.Close() //數據添加到數據集中 for rows.Next() { num++; } }else{ rows, err := db.SqlDB.Query("SELECT id, first_name, last_name FROM person where 1=1") if err != nil { return 0 } defer rows.Close() //數據添加到數據集中 //數據添加到數據集中 for rows.Next() { num++; } } return num } //得到用戶數據 func GetPersonById(Id int) (p *Person) { var person Person //根據ID查詢得到對象 err := db.SqlDB.QueryRow("SELECT id, first_name, last_name FROM person WHERE id=?", Id).Scan( &person.Id, &person.FirstName, &person.LastName, ) //打印錯誤 if err != nil { log.Println(err) } //返回對象 return &person }
3> 控制器person.go,其代碼如下:
package apis import ( "fmt" "strconv" "net/http" "log" "github.com/gin-gonic/gin" . "GinLearn/GinLearn/models" ) //初始頁面 func IndexApi(c *gin.Context) { c.String(http.StatusOK, "Hello World!") } //渲染html頁面 func ShowHtmlPage(c *gin.Context) { c.HTML(http.StatusOK, "index.html", gin.H{ "title": "GIN: HTML頁面", }) } //列表頁面 func ListHtml(c *gin.Context) { c.HTML(http.StatusOK, "list.html", gin.H{ "title": "GIN: 用戶列表頁面", }) } //列表頁面數據 func GetDataList(c *gin.Context) { //得到請求的參數 search:=c.PostForm("search") num:=c.PostForm("pageno") pageno,err:= strconv.Atoi(num) if err!=nil{ log.Fatalln(err) } //得到數據集 datalist:=GetPersonList(pageno,3,search) //得到記錄的總數 count:=GetRecordNum(search) //返回結果 c.JSON(http.StatusOK, gin.H{ "datalist": datalist, "count":count, "pagesize":3, "pageno":pageno, }) } //列表頁面數據 func PageNextData(c *gin.Context) { //得到請求的參數 search:=c.PostForm("search") num:=c.PostForm("pageno") pageno,err:= strconv.Atoi(num) if err!=nil{ log.Fatalln(err) } //得到數據集 datalist:=GetPersonList(pageno,3,search) //得到記錄的總數 count:=GetRecordNum(search) //返回結果 c.JSON(http.StatusOK, gin.H{ "datalist": datalist, "count":count, "pagesize":3, "pageno":pageno, }) } //新增頁面 func AddHtml(c *gin.Context){ c.HTML(http.StatusOK, "add.html", gin.H{ "title": "GIN: 新增用戶頁面", }) } //新增記錄 func AddPersonApi(c *gin.Context) { //得到請求的參數 firstName := c.PostForm("first_name") lastName := c.PostForm("last_name") fmt.Println("執行到此處A") //賦值 p := Person{FirstName: firstName, LastName: lastName} //調用模型中的新增的方法 ra:= p.AddPerson() //返回結果 c.JSON(http.StatusOK, gin.H{ "success": ra, }) c.Redirect(http.StatusOK,"/home/list") } //編輯頁面 func EditHtml(c *gin.Context){ //得到URL請求的參數 num:=c.Query("id") id,err:= strconv.Atoi(num) if err!=nil{ log.Fatalln(err) } p:=GetPersonById(id) if p==nil{ fmt.Println("得到數據錯誤") }else{ fmt.Println(p) fmt.Println("得到數據正確") } c.HTML(http.StatusOK, "edit.html", gin.H{ "title": "GIN: 編輯用戶頁面", "id":p.Id, "firstname":p.FirstName, "lastname":p.LastName, }) } //編輯記錄 func EditPersonApi(c *gin.Context) { fmt.Println("執行到此處") //得到請求的參數 num:=c.PostForm("id") fmt.Println(num) id,err:= strconv.Atoi(num) if err!=nil{ log.Fatalln(err) } firstName := c.PostForm("first_name") lastName := c.PostForm("last_name") //賦值 p := GetPersonById(id) p.FirstName=firstName p.LastName=lastName //調用模型中的編輯的方法 ra:= p.EditPerson() //返回結果 c.JSON(http.StatusOK, gin.H{ "success": ra, }) c.Redirect(http.StatusOK,"/home/list") } //刪除記錄 func DeletePersonApi(c *gin.Context) { //得到請求的參數 num:=c.PostForm("id") fmt.Println(num) id,err:= strconv.Atoi(num) if err!=nil{ log.Fatalln(err) } //調用模型中的刪除的方法 ra:= DeletePerson(id) if ra == false { log.Fatalln("刪除失敗") } //返回結果 c.JSON(http.StatusOK, gin.H{ "success": ra, }) }
4> 路由配置如下:
package routers import ( "github.com/gin-gonic/gin" . "GinLearn/GinLearn/apis" ) func InitRouter() *gin.Engine{ router := gin.Default() //Hello World router.GET("/", IndexApi) //渲染html頁面 router.LoadHTMLGlob("views/*") router.GET("/home/index", ShowHtmlPage) //列表頁面 router.GET("/home/list", ListHtml) router.POST("/home/PageData", GetDataList) router.POST("/home/PageNextData", PageNextData) //新增頁面 router.GET("/home/add", AddHtml) router.POST("/home/saveadd", AddPersonApi) //編輯頁面 router.GET("/home/edit", EditHtml) router.POST("/home/saveedit", EditPersonApi) //刪除 router.POST("/home/delete", DeletePersonApi) return router }
5> 新建list.html作為分頁展示,新建add.html和edit.html頁面,作為數據的新增和編輯,其具體代碼如下:
1->list.html頁面代碼如下:
<!DOCTYPE html> <html> <head> <title>首頁 - 用戶列表頁面</title> <script type="text/javascript" src="/static/js/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="/static/js/jquery.paginationNew.js"></script> <style> .am-cf{ height: 50px; margin-top: 30px; line-height: 50px; text-align: center; vertical-align: middle; margin-left: 40%; } .am-fr{ float: left; line-height: 50px; text-align: center; vertical-align: middle; height: 50px; margin-top: -15px; } .am-pagination{ list-style:none; height: 50px; line-height: 50px; text-align: center; vertical-align: middle; } .am-pagination li{ float:left; margin-left: 10px; } .am-pagination li a{ text-decoration:none; } .am-jl{ float: left; margin-left: 20px; } .am-active{ color: #f00; } </style> </head> <body> <div class="row pull-right" style="margin-bottom: 20px;margin-right: 5px;text-align:right;margin-right: 40px;"> <input type="text" placeholder="請輸入名稱" id="txt_search"/> <button class="" onclick="search()">搜索</button> <button class="" onclick="adddata()">新增</button> </div> <table class="table table-striped table-hover table-bordered "> <thead> <th style="text-align: center">ID</th> <th style="text-align: center">姓氏</th> <th style="text-align: center">名稱</th> <th style="text-align: center">操作</th> </thead> <tbody id="sortable"> </tbody> </table> <!--分頁部分--> <div style="margin: 20px 0px 10px 0;"> <table style="margin: 0 auto;"> <tr> <td> <div id="pagination" class="pagination"></div> </td> </tr> </table> </div> <script type="text/javascript"> //頁面的初始化 $(function () { //分頁數據 InitData(); }) //搜索頁面 function search(){ var search = $("#txt_search").val();//名稱 InitData(); } //使用分頁插件pagination分頁顯示1 function InitData() { var search = $("#txt_search").val();//名稱 $.ajax({ async: false, type: "post", url: "/home/PageData", data: { search: search, pageno:0 }, success: function (data) { console.log('首頁數據') console.log(data) var Count = data.count var PageSize = data.pagesize; var Page =data.pageno; $("#pagination").pagination(Count, { callback: pageselectCallback, num_edge_entries: 1, prev_text: "上一頁", prev_show_always: true, next_text: "下一頁", next_show_always: true, items_per_page: PageSize, current_page: Page, link_to: '#__aurl=!/home/PageData', num_display_entries: 4 }); } }); } //使用分頁插件分頁后的回調函數2 function pageselectCallback(page_id, jq) { var search = $("#txt_search").val();//名稱 $.ajax({ async: false, type: "post", url: "/home/PageNextData", data: { search: search, pageno: (parseInt(page_id) + parseInt(1)), }, success: function (data) { console.log('下一頁的數據') console.log(data) console.log(data.datalist) htmlData(data.datalist) } }); } function htmlData(data){ var html=''; for(var i=0;i<data.length;i++){ html+='<tr class="sort-item" id="module_'+data[i].id+'" value="'+data[i].id+'">'; html+=' <td style="text-align: center;width: 350px;"><span class="label label-default" >'+data[i].id+'</span></td>'; html+=' <td style="text-align: center;width: 350px;" ><strong>'+data[i].first_name+'</strong></td>'; html+=' <td style="text-align: center;width: 350px;" ><strong>'+data[i].last_name+'</strong></td>'; html+=' <td style="text-align: center;width: 350px;"><button onclick="editdata('+data[i].id+')">編輯</button><button onclick="deletedata('+data[i].id+')">刪除</button></td>'; html+='</tr>'; } $("#sortable").html(html); } //新增數據 function adddata(){ window.location.href="/home/add"; } //編輯數據 function editdata(id){ window.location.href="/home/edit?id="+id; } //刪除數據 function deletedata(id){ $.ajax({ async: false, type: "post", url: "/home/delete", data: { id: id }, success: function (data) { if(data){ alert("刪除成功") //初始化數據 InitData(); }else{ alert("刪除失敗") } } }); } </script> </body> </html>
2->add.html頁面代碼如下:
<!DOCTYPE html> <html> <head> <title>首頁 - 新增用戶頁面</title> <link rel="shortcut icon" href="/static/img/favicon.png" /> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"/> <script type="text/javascript" src="/static/js/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="form-group"> <label for="text">姓氏:</label> <input type="text" class="form-control" id="firstname" placeholder="姓氏" /> </div> <div class="form-group"> <label for="number">名稱:</label> <input type="text" class="form-control" id="lastname" placeholder="名稱" /> </div> <button class="btn btn-default" onclick="save()">提交</button> <button class="btn btn-primary" onclick="reset()"></button>>重置</button> </div> <!--Js部分--> <script type="text/javascript"> //保存 function save(){ $.ajax({ type: "post", url: "/home/saveadd", data: { "first_name":$("#firstname").val(), "last_name":$("#lastname").val(), }, success: function (data) { console.log(data) if(data){ alert("新增成功") window.location.href="/home/list"; }else{ alert("新增失敗") return false; } } }); } //重置 function reset(){ $("#firstname").val(''); $("#lastname").val(''); } </script> </body> </html>
3->edit.html頁面代碼如下:
<!DOCTYPE html> <html> <head> <title>首頁 - 新增用戶頁面</title> <link rel="shortcut icon" href="/static/img/favicon.png" /> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"/> <script type="text/javascript" src="/static/js/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="/static/bootstrap/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="form-group"> <label for="text">姓氏:</label> <input type="text" class="form-control" id="firstname" placeholder="姓氏" value="{{.firstname}}"/> </div> <div class="form-group"> <label for="number">名稱:</label> <input type="text" class="form-control" id="lastname" placeholder="名稱" value="{{.lastname}}"/> </div> <input type="hidden" id="idval" value="{{.id}}"/> <button class="btn btn-default" onclick="save()">提交</button> <button class="btn btn-primary" onclick="reset()">重置</button> </div> <!--Js部分--> <script type="text/javascript"> //保存 function save(){ $.ajax({ type: "post", url: "/home/saveedit", data: { "id": $("#idval").val(), "first_name":$("#firstname").val(), "last_name":$("#lastname").val(), }, success: function (data) { console.log(data) if(data.success){ alert("保存成功") window.location.href="/home/list"; }else{ alert("保存失敗") } } }); } //重置 function reset(){ $("#firstname").val(''); $("#lastname").val(''); } </script> </body> </html>
6> Main.go的代碼如下:
package main import ( db "GinLearn/GinLearn/database" router "GinLearn/GinLearn/routers" ) func main() { //數據庫 defer db.SqlDB.Close() //路由部分 router:=router.InitRouter() //靜態資源 router.Static("/static", "./static") //運行的端口 router.Run(":8000") }
7> 數據庫配置文件mysql.go的代碼如下:
package database import ( "database/sql" _ "github.com/go-sql-driver/mysql" "log" ) var SqlDB *sql.DB func init() { var err error SqlDB, err = sql.Open("mysql", "root:123456@tcp(192.168.1.87:3306)/test?parseTime=true") if err != nil { log.Fatal(err.Error()) } err = SqlDB.Ping() if err != nil { log.Fatal(err.Error()) } }
8> 運行起來的效果如下:
9> 下一章節,講bootstrap布局