Compare commits
2 Commits
1b1e3bf8f3
...
26950a37bb
Author | SHA1 | Date | |
---|---|---|---|
|
26950a37bb | ||
|
eab6db83eb |
|
@ -92,8 +92,10 @@ func GetPostsByIds(a ...any) (m map[uint64]models.Posts, err error) {
|
||||||
func SearchPostIds(args ...any) (ids PostIds, err error) {
|
func SearchPostIds(args ...any) (ids PostIds, err error) {
|
||||||
ctx := args[0].(context.Context)
|
ctx := args[0].(context.Context)
|
||||||
q := args[1].(model.QueryCondition)
|
q := args[1].(model.QueryCondition)
|
||||||
|
page := args[2].(int)
|
||||||
|
pageSize := args[3].(int)
|
||||||
q.Fields = "ID"
|
q.Fields = "ID"
|
||||||
res, total, err := model.Pagination[models.Posts](ctx, q)
|
res, total, err := model.Pagination[models.Posts](ctx, q, page, pageSize)
|
||||||
for _, posts := range res {
|
for _, posts := range res {
|
||||||
ids.Ids = append(ids.Ids, posts.Id)
|
ids.Ids = append(ids.Ids, posts.Id)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ func (h *Handle) CalBodyClass() {
|
||||||
|
|
||||||
func (h *Handle) BodyClass(class ...string) string {
|
func (h *Handle) BodyClass(class ...string) string {
|
||||||
if constraints.Ok != h.Stats {
|
if constraints.Ok != h.Stats {
|
||||||
return "error404"
|
class = append(class, "error404")
|
||||||
}
|
}
|
||||||
switch h.Scene {
|
switch h.Scene {
|
||||||
case constraints.Home:
|
case constraints.Home:
|
||||||
|
|
|
@ -40,8 +40,6 @@ func NewHandle(c *gin.Context, scene int, theme string) *Handle {
|
||||||
Session: sessions.Default(c),
|
Session: sessions.Default(c),
|
||||||
GinH: gin.H{},
|
GinH: gin.H{},
|
||||||
Scene: scene,
|
Scene: scene,
|
||||||
Code: http.StatusOK,
|
|
||||||
Stats: constraints.Ok,
|
|
||||||
ThemeMods: mods,
|
ThemeMods: mods,
|
||||||
Scripts: make(map[string][]func(*Handle) string),
|
Scripts: make(map[string][]func(*Handle) string),
|
||||||
}
|
}
|
||||||
|
@ -75,21 +73,42 @@ func (h *Handle) GetPassword() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handle) Render() {
|
func (h *Handle) ExecHandleFns() {
|
||||||
|
for _, fn := range h.HandleFns {
|
||||||
|
fn(h)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handle) PreTemplate() {
|
||||||
if h.Templ == "" {
|
if h.Templ == "" {
|
||||||
h.Templ = str.Join(h.Theme, "/posts/index.gohtml")
|
h.Templ = str.Join(h.Theme, "/posts/index.gohtml")
|
||||||
if h.Scene == constraints.Detail {
|
if h.Scene == constraints.Detail {
|
||||||
h.Templ = str.Join(h.Theme, "/posts/detail.gohtml")
|
h.Templ = str.Join(h.Theme, "/posts/detail.gohtml")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, fn := range h.HandleFns {
|
}
|
||||||
fn(h)
|
func (h *Handle) PreCodeAndStats() {
|
||||||
|
if h.Stats != 0 && h.Code != 0 {
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
switch h.Stats {
|
||||||
|
case constraints.Ok:
|
||||||
|
h.Code = http.StatusOK
|
||||||
|
case constraints.ParamError, constraints.Error404:
|
||||||
|
h.Code = http.StatusNotFound
|
||||||
|
case constraints.InternalErr:
|
||||||
|
h.Code = http.StatusInternalServerError
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handle) Render() {
|
||||||
|
h.PreCodeAndStats()
|
||||||
|
h.PreTemplate()
|
||||||
|
h.ExecHandleFns()
|
||||||
h.PushHeadScript(constraints.HeadScript, CalSiteIcon, CalCustomCss)
|
h.PushHeadScript(constraints.HeadScript, CalSiteIcon, CalCustomCss)
|
||||||
h.PlushComponent("customLogo", CalCustomLogo)
|
h.PlushComponent("customLogo", CalCustomLogo)
|
||||||
h.CalMultipleScript()
|
h.CalMultipleScript()
|
||||||
h.CalBodyClass()
|
h.CalBodyClass()
|
||||||
|
|
||||||
h.C.HTML(h.Code, h.Templ, h.GinH)
|
h.C.HTML(h.Code, h.Templ, h.GinH)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
str "github.com/fthvgb1/wp-go/helper/strings"
|
str "github.com/fthvgb1/wp-go/helper/strings"
|
||||||
"github.com/fthvgb1/wp-go/internal/pkg/cache"
|
"github.com/fthvgb1/wp-go/internal/pkg/cache"
|
||||||
|
@ -9,7 +10,6 @@ import (
|
||||||
"github.com/fthvgb1/wp-go/internal/pkg/models"
|
"github.com/fthvgb1/wp-go/internal/pkg/models"
|
||||||
"github.com/fthvgb1/wp-go/internal/plugins"
|
"github.com/fthvgb1/wp-go/internal/plugins"
|
||||||
"github.com/fthvgb1/wp-go/internal/wpconfig"
|
"github.com/fthvgb1/wp-go/internal/wpconfig"
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type DetailHandle struct {
|
type DetailHandle struct {
|
||||||
|
@ -38,11 +38,19 @@ func (d *DetailHandle) CheckAndGetPost() (err error) {
|
||||||
id := str.ToInteger[uint64](d.C.Param("id"), 0)
|
id := str.ToInteger[uint64](d.C.Param("id"), 0)
|
||||||
maxId, err := cache.GetMaxPostId(d.C)
|
maxId, err := cache.GetMaxPostId(d.C)
|
||||||
logs.ErrPrintln(err, "get max post id")
|
logs.ErrPrintln(err, "get max post id")
|
||||||
if id > maxId || id <= 0 || err != nil {
|
if id > maxId || id <= 0 {
|
||||||
|
d.Stats = constraints.ParamError
|
||||||
|
err = errors.New("无效的文档id")
|
||||||
|
d.Class = append(d.Class, "error404")
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
post, err := cache.GetPostById(d.C, id)
|
post, err := cache.GetPostById(d.C, id)
|
||||||
if post.Id == 0 || err != nil || post.PostStatus != "publish" {
|
if post.Id == 0 || err != nil || post.PostStatus != "publish" {
|
||||||
|
d.Stats = constraints.Error404
|
||||||
|
logs.ErrPrintln(err, "获取id失败")
|
||||||
|
err = errors.New(str.Join("无效的文档id "))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,12 +108,6 @@ func (d *DetailHandle) Render() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DetailHandle) Details() {
|
func (d *DetailHandle) Details() {
|
||||||
err := d.BuildDetailData()
|
_ = d.BuildDetailData()
|
||||||
if err != nil {
|
|
||||||
d.Stats = constraints.Error404
|
|
||||||
d.Code = http.StatusNotFound
|
|
||||||
d.C.HTML(d.Code, d.Templ, d.GinH)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
d.Render()
|
d.Render()
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
"github.com/fthvgb1/wp-go/internal/plugins"
|
"github.com/fthvgb1/wp-go/internal/plugins"
|
||||||
"github.com/fthvgb1/wp-go/model"
|
"github.com/fthvgb1/wp-go/model"
|
||||||
"github.com/fthvgb1/wp-go/plugin/pagination"
|
"github.com/fthvgb1/wp-go/plugin/pagination"
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type IndexHandle struct {
|
type IndexHandle struct {
|
||||||
|
@ -58,8 +57,6 @@ func (i *IndexHandle) GetIndexData() (posts []models.Posts, totalRaw int, err er
|
||||||
|
|
||||||
q := model.QueryCondition{
|
q := model.QueryCondition{
|
||||||
Where: i.Param.Where,
|
Where: i.Param.Where,
|
||||||
Page: i.Param.Page,
|
|
||||||
Limit: i.Param.PageSize,
|
|
||||||
Order: model.SqlBuilder{{i.Param.OrderBy, i.Param.Order}},
|
Order: model.SqlBuilder{{i.Param.OrderBy, i.Param.Order}},
|
||||||
Join: i.Param.Join,
|
Join: i.Param.Join,
|
||||||
In: [][]any{i.Param.PostType, i.Param.PostStatus},
|
In: [][]any{i.Param.PostType, i.Param.PostStatus},
|
||||||
|
@ -67,11 +64,11 @@ func (i *IndexHandle) GetIndexData() (posts []models.Posts, totalRaw int, err er
|
||||||
switch i.Scene {
|
switch i.Scene {
|
||||||
case constraints.Home, constraints.Category, constraints.Tag, constraints.Author:
|
case constraints.Home, constraints.Category, constraints.Tag, constraints.Author:
|
||||||
|
|
||||||
posts, totalRaw, err = cache.PostLists(i.C, i.Param.CacheKey, i.C, q)
|
posts, totalRaw, err = cache.PostLists(i.C, i.Param.CacheKey, i.C, q, i.Param.Page, i.Param.PageSize)
|
||||||
|
|
||||||
case constraints.Search:
|
case constraints.Search:
|
||||||
|
|
||||||
posts, totalRaw, err = cache.SearchPost(i.C, i.Param.CacheKey, i.C, q)
|
posts, totalRaw, err = cache.SearchPost(i.C, i.Param.CacheKey, i.C, q, i.Param.Page, i.Param.PageSize)
|
||||||
|
|
||||||
case constraints.Archive:
|
case constraints.Archive:
|
||||||
|
|
||||||
|
@ -91,7 +88,6 @@ func (i *IndexHandle) Pagination() {
|
||||||
q = fmt.Sprintf("?%s", q)
|
q = fmt.Sprintf("?%s", q)
|
||||||
}
|
}
|
||||||
paginations := pagination.NewParsePagination(i.TotalRows, i.Param.PageSize, i.Param.Page, i.Param.PaginationStep, q, i.C.Request.URL.Path)
|
paginations := pagination.NewParsePagination(i.TotalRows, i.Param.PageSize, i.Param.Page, i.Param.PaginationStep, q, i.C.Request.URL.Path)
|
||||||
|
|
||||||
i.GinH["pagination"] = pagination.Paginate(i.PageEle, paginations)
|
i.GinH["pagination"] = pagination.Paginate(i.PageEle, paginations)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -99,13 +95,14 @@ func (i *IndexHandle) Pagination() {
|
||||||
func (i *IndexHandle) BuildIndexData(parm *IndexParams) (err error) {
|
func (i *IndexHandle) BuildIndexData(parm *IndexParams) (err error) {
|
||||||
err = i.ParseIndex(parm)
|
err = i.ParseIndex(parm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
i.Stats = constraints.ParamError
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
posts, totalRows, err := i.GetIndexData()
|
posts, totalRows, err := i.GetIndexData()
|
||||||
if err != nil && err != sql.ErrNoRows {
|
if err != nil && err != sql.ErrNoRows {
|
||||||
|
i.Stats = constraints.Error404
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
i.GinH["posts"] = posts
|
|
||||||
i.Posts = posts
|
i.Posts = posts
|
||||||
i.TotalRows = totalRows
|
i.TotalRows = totalRows
|
||||||
|
|
||||||
|
@ -135,12 +132,6 @@ func (i *IndexHandle) Render() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *IndexHandle) Indexs() {
|
func (i *IndexHandle) Indexs() {
|
||||||
err := i.BuildIndexData(NewIndexParams(i.C))
|
_ = i.BuildIndexData(NewIndexParams(i.C))
|
||||||
if err != nil {
|
|
||||||
i.Stats = constraints.Error404
|
|
||||||
i.Code = http.StatusNotFound
|
|
||||||
i.C.HTML(i.Code, i.Templ, i.GinH)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
i.Render()
|
i.Render()
|
||||||
}
|
}
|
||||||
|
|
16
internal/theme/twentyseventeen/posts/error.gohtml
Normal file
16
internal/theme/twentyseventeen/posts/error.gohtml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{{template "layout/base" .}}
|
||||||
|
|
||||||
|
{{define "content"}}
|
||||||
|
<div class="site-content-contain">
|
||||||
|
<div id="content" class="site-content">
|
||||||
|
<div class="wrap">
|
||||||
|
<div id="primary" class="content-area">
|
||||||
|
<main id="main" class="site-main">
|
||||||
|
{{template "layout/empty"}}
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
"github.com/fthvgb1/wp-go/internal/theme/common"
|
"github.com/fthvgb1/wp-go/internal/theme/common"
|
||||||
"github.com/fthvgb1/wp-go/internal/wpconfig"
|
"github.com/fthvgb1/wp-go/internal/wpconfig"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"net/http"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -57,10 +56,8 @@ var listPostsPlugins = func() map[string]common.Plugin[models.Posts, *common.Han
|
||||||
func index(next common.HandleFn[*common.Handle], i *common.IndexHandle) {
|
func index(next common.HandleFn[*common.Handle], i *common.IndexHandle) {
|
||||||
err := i.BuildIndexData(common.NewIndexParams(i.C))
|
err := i.BuildIndexData(common.NewIndexParams(i.C))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
i.Stats = constraints.Error404
|
i.Templ = str.Join(ThemeName, "/posts/error.gohtml")
|
||||||
i.Code = http.StatusNotFound
|
i.Render()
|
||||||
i.CalBodyClass()
|
|
||||||
i.C.HTML(i.Code, i.Templ, i.GinH)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
i.PostsPlugins = listPostsPlugins
|
i.PostsPlugins = listPostsPlugins
|
||||||
|
@ -71,10 +68,8 @@ func index(next common.HandleFn[*common.Handle], i *common.IndexHandle) {
|
||||||
func detail(next common.HandleFn[*common.Handle], d *common.DetailHandle) {
|
func detail(next common.HandleFn[*common.Handle], d *common.DetailHandle) {
|
||||||
err := d.BuildDetailData()
|
err := d.BuildDetailData()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
d.Code = http.StatusNotFound
|
d.Templ = str.Join(ThemeName, "/posts/error.gohtml")
|
||||||
d.Stats = constraints.Error404
|
d.Render()
|
||||||
d.GinH["bodyClass"] = d.BodyClass()
|
|
||||||
d.C.HTML(d.Code, d.Templ, d.GinH)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if d.Post.Thumbnail.Path != "" {
|
if d.Post.Thumbnail.Path != "" {
|
||||||
|
|
|
@ -8,7 +8,6 @@ type QueryCondition struct {
|
||||||
Order SqlBuilder
|
Order SqlBuilder
|
||||||
Join SqlBuilder
|
Join SqlBuilder
|
||||||
Having SqlBuilder
|
Having SqlBuilder
|
||||||
Page int
|
|
||||||
Limit int
|
Limit int
|
||||||
Offset int
|
Offset int
|
||||||
In [][]any
|
In [][]any
|
||||||
|
@ -68,12 +67,6 @@ func Having(having SqlBuilder) Condition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Page(page int) Condition {
|
|
||||||
return func(c *QueryCondition) {
|
|
||||||
c.Page = page
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Limit(limit int) Condition {
|
func Limit(limit int) Condition {
|
||||||
return func(c *QueryCondition) {
|
return func(c *QueryCondition) {
|
||||||
c.Limit = limit
|
c.Limit = limit
|
||||||
|
|
|
@ -9,10 +9,11 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func pagination[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r []T, total int, err error) {
|
func pagination[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) (r []T, total int, err error) {
|
||||||
if q.Page < 1 {
|
if page < 1 || pageSize < 1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
q.Limit = pageSize
|
||||||
qx := QueryCondition{
|
qx := QueryCondition{
|
||||||
Where: q.Where,
|
Where: q.Where,
|
||||||
Having: q.Having,
|
Having: q.Having,
|
||||||
|
@ -42,45 +43,41 @@ func pagination[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r [
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
offset := 0
|
offset := 0
|
||||||
if q.Page > 1 {
|
if page > 1 {
|
||||||
offset = (q.Page - 1) * q.Limit
|
offset = (page - 1) * q.Limit
|
||||||
}
|
}
|
||||||
if offset >= total {
|
if offset >= total {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
q.Offset = offset
|
q.Offset = offset
|
||||||
m := ctx.Value("handle=>")
|
m := ctx.Value("handle=>toMap")
|
||||||
if m == nil {
|
if m == nil {
|
||||||
r, err = finds[T](db, ctx, q)
|
r, err = finds[T](db, ctx, q)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mm, ok := m.(string)
|
mm, ok := m.(*[]map[string]string)
|
||||||
if ok && mm == "toMap" {
|
if ok {
|
||||||
v := ctx.Value("map")
|
|
||||||
mx, er := findToStringMap[T](db, ctx, q)
|
mx, er := findToStringMap[T](db, ctx, q)
|
||||||
if er != nil {
|
if er != nil {
|
||||||
err = er
|
err = er
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
vv := v.(*[]map[string]string)
|
*mm = mx
|
||||||
*vv = mx
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func paginationToMap[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r []map[string]string, total int, err error) {
|
func paginationToMap[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) (r []map[string]string, total int, err error) {
|
||||||
ctx = context.WithValue(ctx, "handle=>", "toMap")
|
ctx = context.WithValue(ctx, "handle=>toMap", &r)
|
||||||
ctx = context.WithValue(ctx, "map", &r)
|
_, total, err = pagination[T](db, ctx, q, page, pageSize)
|
||||||
_, total, err = pagination[T](db, ctx, q)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func PaginationToMap[T Model](ctx context.Context, q QueryCondition) (r []map[string]string, total int, err error) {
|
func PaginationToMap[T Model](ctx context.Context, q QueryCondition, page, pageSize int) (r []map[string]string, total int, err error) {
|
||||||
return paginationToMap[T](globalBb, ctx, q)
|
return paginationToMap[T](globalBb, ctx, q, page, pageSize)
|
||||||
}
|
}
|
||||||
func PaginationToMapFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r []map[string]string, total int, err error) {
|
func PaginationToMapFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) (r []map[string]string, total int, err error) {
|
||||||
return paginationToMap[T](db, ctx, q)
|
return paginationToMap[T](db, ctx, q, page, pageSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
func FindOneById[T Model, I constraints.Integer](ctx context.Context, id I) (T, error) {
|
func FindOneById[T Model, I constraints.Integer](ctx context.Context, id I) (T, error) {
|
||||||
|
|
|
@ -468,6 +468,8 @@ func Test_pagination(t *testing.T) {
|
||||||
db dbQuery
|
db dbQuery
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
q QueryCondition
|
q QueryCondition
|
||||||
|
page int
|
||||||
|
pageSize int
|
||||||
}
|
}
|
||||||
type testCase[T Model] struct {
|
type testCase[T Model] struct {
|
||||||
name string
|
name string
|
||||||
|
@ -487,10 +489,12 @@ func Test_pagination(t *testing.T) {
|
||||||
Group: "post_type",
|
Group: "post_type",
|
||||||
Having: SqlBuilder{{"ID", ">", "1", "int"}},
|
Having: SqlBuilder{{"ID", ">", "1", "int"}},
|
||||||
},
|
},
|
||||||
|
page: 1,
|
||||||
|
pageSize: 2,
|
||||||
},
|
},
|
||||||
wantR: func() (r []post) {
|
wantR: func() (r []post) {
|
||||||
|
|
||||||
err := glob.Selects(ctx, &r, "select post_type,count(*) ID from wp_posts group by post_type having `ID`> 1")
|
err := glob.Selects(ctx, &r, "select post_type,count(*) ID from wp_posts group by post_type having `ID`> 1 limit 2")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -502,7 +506,7 @@ func Test_pagination(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
gotR, gotTotal, err := pagination[post](tt.args.db, tt.args.ctx, tt.args.q)
|
gotR, gotTotal, err := pagination[post](tt.args.db, tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize)
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("pagination() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("pagination() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
|
@ -522,6 +526,8 @@ func Test_paginationToMap(t *testing.T) {
|
||||||
db dbQuery
|
db dbQuery
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
q QueryCondition
|
q QueryCondition
|
||||||
|
page int
|
||||||
|
pageSize int
|
||||||
}
|
}
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -537,10 +543,10 @@ func Test_paginationToMap(t *testing.T) {
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
q: QueryCondition{
|
q: QueryCondition{
|
||||||
Fields: "ID",
|
Fields: "ID",
|
||||||
Limit: 2,
|
|
||||||
Page: 1,
|
|
||||||
Where: SqlBuilder{{"ID < 200"}},
|
Where: SqlBuilder{{"ID < 200"}},
|
||||||
},
|
},
|
||||||
|
page: 1,
|
||||||
|
pageSize: 2,
|
||||||
},
|
},
|
||||||
wantR: []map[string]string{{"ID": "63"}, {"ID": "64"}},
|
wantR: []map[string]string{{"ID": "63"}, {"ID": "64"}},
|
||||||
wantTotal: 4,
|
wantTotal: 4,
|
||||||
|
@ -552,10 +558,10 @@ func Test_paginationToMap(t *testing.T) {
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
q: QueryCondition{
|
q: QueryCondition{
|
||||||
Fields: "ID",
|
Fields: "ID",
|
||||||
Limit: 2,
|
|
||||||
Page: 2,
|
|
||||||
Where: SqlBuilder{{"ID < 200"}},
|
Where: SqlBuilder{{"ID < 200"}},
|
||||||
},
|
},
|
||||||
|
page: 2,
|
||||||
|
pageSize: 2,
|
||||||
},
|
},
|
||||||
wantR: []map[string]string{{"ID": "190"}, {"ID": "193"}},
|
wantR: []map[string]string{{"ID": "190"}, {"ID": "193"}},
|
||||||
wantTotal: 4,
|
wantTotal: 4,
|
||||||
|
@ -563,11 +569,11 @@ func Test_paginationToMap(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
gotR, gotTotal, err := PaginationToMap[post](tt.args.ctx, tt.args.q)
|
gotR, gotTotal, err := PaginationToMap[post](tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize)
|
||||||
fmt.Println(gotR, gotTotal, err)
|
fmt.Println(gotR, gotTotal, err)
|
||||||
gotR, gotTotal, err = PaginationToMapFromDB[post](tt.args.db, tt.args.ctx, tt.args.q)
|
gotR, gotTotal, err = PaginationToMapFromDB[post](tt.args.db, tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize)
|
||||||
fmt.Println(gotR, gotTotal, err)
|
fmt.Println(gotR, gotTotal, err)
|
||||||
gotR, gotTotal, err = paginationToMap[post](tt.args.db, tt.args.ctx, tt.args.q)
|
gotR, gotTotal, err = paginationToMap[post](tt.args.db, tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize)
|
||||||
|
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("paginationToMap() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("paginationToMap() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
|
|
@ -41,7 +41,7 @@ func chunkFind[T Model](db dbQuery, ctx context.Context, perLimit int, q QueryCo
|
||||||
var offset int
|
var offset int
|
||||||
for {
|
for {
|
||||||
if 1 == i {
|
if 1 == i {
|
||||||
rr, total, err = pagination[T](db, ctx, q)
|
rr, total, err = pagination[T](db, ctx, q, 1, perLimit)
|
||||||
} else {
|
} else {
|
||||||
q.Offset = offset
|
q.Offset = offset
|
||||||
q.Limit = perLimit
|
q.Limit = perLimit
|
||||||
|
@ -100,7 +100,7 @@ func chunk[T Model, R any](db dbQuery, ctx context.Context, perLimit int, fn fun
|
||||||
var offset int
|
var offset int
|
||||||
for {
|
for {
|
||||||
if 1 == i {
|
if 1 == i {
|
||||||
rr, total, err = pagination[T](db, ctx, q)
|
rr, total, err = pagination[T](db, ctx, q, 1, perLimit)
|
||||||
} else {
|
} else {
|
||||||
q.Offset = offset
|
q.Offset = offset
|
||||||
q.Limit = perLimit
|
q.Limit = perLimit
|
||||||
|
@ -127,16 +127,16 @@ func chunk[T Model, R any](db dbQuery, ctx context.Context, perLimit int, fn fun
|
||||||
|
|
||||||
// Pagination 同
|
// Pagination 同
|
||||||
//
|
//
|
||||||
// Condition 中可使用 Where Fields From Group Having Join Order Page Limit In 函数
|
// Condition 中可使用 Where Fields From Group Having Join Order Limit In 函数
|
||||||
func Pagination[T Model](ctx context.Context, q QueryCondition) ([]T, int, error) {
|
func Pagination[T Model](ctx context.Context, q QueryCondition, page, pageSize int) ([]T, int, error) {
|
||||||
return pagination[T](globalBb, ctx, q)
|
return pagination[T](globalBb, ctx, q, page, pageSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PaginationFromDB 同 Pagination 方便多个db使用
|
// PaginationFromDB 同 Pagination 方便多个db使用
|
||||||
//
|
//
|
||||||
// Condition 中可使用 Where Fields Group Having Join Order Page Limit In 函数
|
// Condition 中可使用 Where Fields Group Having Join Order Limit In 函数
|
||||||
func PaginationFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition) ([]T, int, error) {
|
func PaginationFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) ([]T, int, error) {
|
||||||
return pagination[T](db, ctx, q)
|
return pagination[T](db, ctx, q, page, pageSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Column[V Model, T any](ctx context.Context, fn func(V) (T, bool), q QueryCondition) ([]T, error) {
|
func Column[V Model, T any](ctx context.Context, fn func(V) (T, bool), q QueryCondition) ([]T, error) {
|
||||||
|
|
|
@ -180,6 +180,8 @@ func TestPagination(t *testing.T) {
|
||||||
type args struct {
|
type args struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
q QueryCondition
|
q QueryCondition
|
||||||
|
page int
|
||||||
|
pageSize int
|
||||||
}
|
}
|
||||||
type testCase[T Model] struct {
|
type testCase[T Model] struct {
|
||||||
name string
|
name string
|
||||||
|
@ -197,10 +199,10 @@ func TestPagination(t *testing.T) {
|
||||||
Where(SqlBuilder{
|
Where(SqlBuilder{
|
||||||
{"ID", "in", ""},
|
{"ID", "in", ""},
|
||||||
}),
|
}),
|
||||||
Page(1),
|
|
||||||
Limit(5),
|
|
||||||
In([][]any{slice.ToAnySlice(number.Range(431, 440, 1))}...),
|
In([][]any{slice.ToAnySlice(number.Range(431, 440, 1))}...),
|
||||||
),
|
),
|
||||||
|
page: 1,
|
||||||
|
pageSize: 5,
|
||||||
},
|
},
|
||||||
want: func() (r []post) {
|
want: func() (r []post) {
|
||||||
r, err := Select[post](ctx, "select * from "+post{}.Table()+" where ID in (?,?,?,?,?)", slice.ToAnySlice(number.Range(431, 435, 1))...)
|
r, err := Select[post](ctx, "select * from "+post{}.Table()+" where ID in (?,?,?,?,?)", slice.ToAnySlice(number.Range(431, 435, 1))...)
|
||||||
|
@ -217,7 +219,7 @@ func TestPagination(t *testing.T) {
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
got, got1, err := Pagination[post](tt.args.ctx, tt.args.q)
|
got, got1, err := Pagination[post](tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize)
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("Pagination() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("Pagination() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
|
@ -333,7 +335,7 @@ func Test_getField(t *testing.T) {
|
||||||
db := glob
|
db := glob
|
||||||
field := "count(*)"
|
field := "count(*)"
|
||||||
q := Conditions()
|
q := Conditions()
|
||||||
wantR := "385"
|
wantR := "406"
|
||||||
wantErr := false
|
wantErr := false
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
gotR, err := getField[options](db, ctx, field, q)
|
gotR, err := getField[options](db, ctx, field, q)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user