sql server 递归分页并返回记录总数_Gin-Go学习笔记三:Gin-Web框架 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> 运行起来的效果如下:

abf9de796d864ba24877165c115b23e9.png

93cbca3c3167bb4d49a0d34f48f06d1f.png

9d6d4a88f4dcd30e2d34e70b055388b2.png

291dc28299b891dbe8d533ef59392e20.png

4f72756886534b63255373409879e40b.png

0f61b1e2d7db2c8734246727a52d9004.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值