Gin-Go学习笔记三:Gin-Web框架 JS分页

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布局

 

posted @ 2017-12-20 10:21  夜未央天未明  阅读(8910)  评论(12编辑  收藏  举报