pagenavi.go 1.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package utils
  2. import (
  3. "strconv"
  4. )
  5. type PageNaviEngine struct {
  6. ctx *Context
  7. }
  8. func NewPageNaviEngine(ctx *Context) *PageNaviEngine {
  9. return &PageNaviEngine{ctx: ctx}
  10. }
  11. // GetPageList 获取列表
  12. func (t *PageNaviEngine) GetPageList(target interface{}, sql string, limit []int, sqlArgs ...interface{}) (int64, error) {
  13. countSQL := "select count(*) as cnt from (" + sql + ") as virtualTable"
  14. countSQLorArgs := []interface{}{countSQL}
  15. for _, arg := range sqlArgs {
  16. countSQLorArgs = append(countSQLorArgs, arg)
  17. }
  18. cntRes, err := t.ctx.DB.Query(countSQLorArgs...)
  19. if err != nil {
  20. return 0, err
  21. }
  22. cntStr := string(cntRes[0]["cnt"])
  23. cnt, _ := strconv.ParseInt(cntStr, 10, 64)
  24. newSQL := t.PackLimitToSQL(sql, limit)
  25. err = t.ctx.DB.SQL(newSQL, sqlArgs...).Find(target)
  26. if err != nil {
  27. return 0, err
  28. }
  29. return cnt, nil
  30. }
  31. // PackLimitToSQL 添加 limit 语句到 sql 最后
  32. func (t *PageNaviEngine) PackLimitToSQL(sql string, limit []int) string {
  33. switch len(limit) {
  34. case 1:
  35. return sql + " LIMIT " + strconv.Itoa(limit[0])
  36. case 2:
  37. return sql + " LIMIT " + strconv.Itoa(limit[0]) + " OFFSET " + strconv.Itoa(limit[1])
  38. default:
  39. return sql
  40. }
  41. }