️ feat: add main page layout with navigation and footer

feat: create random labels page

feat: implement login page with OpenID Connect support

feat: add Gravatar component for user avatars

feat: create Navbar component with navigation menu

chore: create Sidebar component placeholder

feat: implement login form with OIDC and email/password options

feat: add reusable button component

feat: create card component for structured content display

feat: implement input component for forms

feat: create label component for form labels

feat: add navigation menu component for site navigation

chore: add configuration file for site metadata

feat: implement device context for responsive design

feat: add utility functions for class name management

feat: define OIDC configuration model

feat: define base response model for API responses

feat: define user model for user data

feat: implement i18n for internationalization support

feat: add English and Chinese translations for login

chore: create index for locale resources

chore: add blog home view placeholder
This commit is contained in:
2025-07-24 09:22:50 +08:00
parent 19c8a9eac5
commit 9ca307f4d9
57 changed files with 2453 additions and 108 deletions

View File

@ -2,8 +2,10 @@ package repo
import (
"github.com/snowykami/neo-blog/internal/model"
"github.com/snowykami/neo-blog/pkg/constant"
"github.com/snowykami/neo-blog/pkg/errs"
"net/http"
"slices"
)
type postRepo struct{}
@ -45,9 +47,34 @@ func (p *postRepo) UpdatePost(post *model.Post) error {
return nil
}
func (p *postRepo) ListPosts(limit, offset int) ([]model.Post, error) {
func (p *postRepo) ListPosts(currentUserID uint, keywords []string, page, size uint64, orderedBy string, reverse bool) ([]model.Post, error) {
var posts []model.Post
if err := GetDB().Limit(limit).Offset(offset).Find(&posts).Error; err != nil {
if !slices.Contains(constant.OrderedByEnumPost, orderedBy) {
return nil, errs.New(http.StatusBadRequest, "invalid ordered_by parameter", nil)
}
order := orderedBy
if reverse {
order += " ASC"
} else {
order += " DESC"
}
query := GetDB().Model(&model.Post{}).Preload("User")
if currentUserID > 0 {
query = query.Where("is_private = ? OR (is_private = ? AND user_id = ?)", false, true, currentUserID)
} else {
query = query.Where("is_private = ?", false)
}
if len(keywords) > 0 {
for _, keyword := range keywords {
if keyword != "" {
// 使用LIKE进行模糊匹配搜索标题、内容和标签
query = query.Where("title LIKE ? OR content LIKE ? OR tags LIKE ?",
"%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
}
}
}
query = query.Order(order).Offset(int((page - 1) * size)).Limit(int(size))
if err := query.Find(&posts).Error; err != nil {
return nil, err
}
return posts, nil