当前位置: 代码网 > it编程>前端脚本>Golang > 如何通过go自定义一个分页插件

如何通过go自定义一个分页插件

2024年05月18日 Golang 我要评论
建议看这个之前,先看看这个:go操作mysql · go语言中文文档 (topgoer.com)嗯...也不能叫做分页插件,就是一个分页工具类。下载依赖go get github.com

 建议看这个之前,先看看这个:go操作mysql · go语言中文文档 (topgoer.com)

嗯...也不能叫做分页插件,就是一个分页工具类。

下载依赖

go get github.com/go-sql-driver/mysql 
go get github.com/jmoiron/sqlx

sql_util 

我们自定义一个sql_util,用来封装数据库连接操作。executecud()执行增删改操作。executeselectall()执行查询操作。目前没有查询单个的,而且查询到全部数据,判断查询数据长度即可。jointsqlstr() : 负责拼接sql字符串模版和动态绑定的参数

package sql

import (
	"back-me/main/util"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
	"strings"
)

const (
	username = "root"
	password = "123456"
	host     = "localhost"
	port     = 3306
	dbname   = "fdis"
)


var db *sqlx.db

func init() {
	connecttodatabase()
}

// 连接数据库
func connecttodatabase() {
	datasourcename := fmt.sprintf("%s:%s@tcp(%s:%d)/%s?parsetime=true&loc=local", username, password, host, port, dbname)

	db, err := sqlx.open("mysql", datasourcename)
	if err != nil {
		util.log.error("sql connection error:" + err.error())
	}

	// 检查是否连接成功
	err = db.ping()
	if err != nil {
		util.log.error("sql connection error:" + err.error())
	}
	db = db
}

// 执行增删改操作
func executecud(sql string, params ...interface{}) int64 {
	sql = jointsqlstr(sql, params...)
	conn, err := db.begin()
	if err != nil {
		util.log.error("sql error:" + err.error())
		return -1
	}

	r, err := conn.exec(sql)
	if err != nil {
		util.log.error("sql error:" + err.error())
		conn.rollback()
		return -1
	}
	id, err := r.lastinsertid()
	if err != nil {
		util.log.error("sql error:" + err.error())
		conn.rollback()
		return -1
	}
	conn.commit()
	return id
}

// 执行select all
func executeselectall(stc interface{}, sql string, params ...interface{}) error {
	sql = jointsqlstr(sql, params...)
	err := db.select(stc, sql)
	if err != nil {
		util.log.error("sql select error:" + err.error())
		return err
	}
	return nil
}



// 1 5 | 0 5
// 2 5 | 5 5
// 3 5 | 10 5

func jointsqlstr(sqlstr string, args ...interface{}) string {
	// 以%s分割
	strs := strings.split(sqlstr, "%s")
	if len(strs) == 0 {
		return sqlstr
	}
	newsql := ""
	for i, _ := range strs {
		newsql += strs[i]
		if i != len(strs)-1 {
			switch args[i].(type) {
			case string:
				newsql += args[i].(string)
				break
			case int:
				newsql += fmt.sprintf("%v", args[i].(int))
				break
			case uint:
				newsql += fmt.sprintf("%v", args[i].(uint))
				break
			}
		}

	}
	return newsql
}

page_util

 通过,page_util来封装分页相关操作。selectpage(): 传入我们查询的数据,响应一个封装好的pageresult结构体。

package page

import (
	"back-me/main/model"
	"errors"
	"reflect"
)

var pageerror = errors.new("page or pagesize cannot be < 1")

type pager struct {
	page     int `json:"page"`
	pagesize int `json:"pagesize"`
}

func newpager(page int, pagesize int) (*pager, error) {
	if page < 1 || pagesize < 1 {
		return nil, pageerror
	}
	return &pager{
		page,
		pagesize,
	}, nil
}

func (p *pager) selectpage(data interface{}) *model.pageresult {
	page := p.page
	pagesize := p.pagesize
	page = (page - 1) * pagesize
	start := page
	end := page + pagesize
	l := reflect.valueof(data).elem().len()

	if l-1 < start {
		return model.newpageresult1(nil, 0, page, pagesize)
	} else if l-1 >= start && l-1 <= end {
		return model.newpageresult1(subdata(data, start, l), l, p.page, p.pagesize)
	} else {
		return model.newpageresult1(subdata(data, start, end), l, p.page, p.pagesize)
	}
}

// 包前不包后
func subdata(data any, start int, end int) interface{} {
	v := reflect.valueof(data)
	v = v.elem()
	return v.slice(start, end).interface()
}

result

分页数据公共封装响应。

package model

type pageresult struct {
	data     any    `json:"data"`
	code     int    `json:"code"`
	mes      string `json:"mes"`
	total    int    `json:"total"`
	page     int    `json:"page"`
	pagesize int    `json:"pagesize"`
}

func newpageresult(data any, code int, mes string, total int, page int, pagesize int) *pageresult {
	return &pageresult{
		data, code, mes, total, page, pagesize,
	}
}

// newpageresult1
func newpageresult1(data any, total int, page int, pagesize int) *pageresult {
	return newpageresult(data, 200, "ok", total, page, pagesize)
}

测试

func testselectpage(t *testing.t) {
	var uservos []vo.user // 查询出的数据,最终封装到这里面
	var sqlstr = "select * from `tx_user`  where password  like '%s' limit 0, 2" // %s 就是占位符,被后面传入的参数替换
	sql.executeselectall(&uservos, sqlstr, "%")
	// 分页
	// 0 1
	// 2 3
	// start <
	newpager, err := page.newpager(1, 2)
	if err != nil {
		fmt.println("error:", err.error())
	}
	pageresult := newpager.selectpage(&uservos)
	fmt.println(pageresult)
}

总结 

到此这篇关于如何通过go自定义一个分页插件的文章就介绍到这了,更多相关go自定义分页插件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com