小调整
This commit is contained in:
parent
8b7edea000
commit
4f1a2f717e
54
README.md
54
README.md
|
@ -1,18 +1,62 @@
|
||||||
## wp-go
|
## wp-go
|
||||||
|
|
||||||
一个go写的WordPress的前端,功能比较简单,只有列表页和详情页,rss2,主题只有twentyfifteen和twentyseventeen两套主题,插件的话只有一个简单的列表页的摘要生成和enlighter代码高亮。本身只用于展示文章,添加评论走的转发请求到php的WordPress。因为大量用了泛型功能,所以要求go的版本在1.19及以上,越新越好。。。。
|
一个go写的WordPress的前端,功能比较简单,只有列表页和详情页,rss2,主题只有twentyfifteen和twentyseventeen两套主题,插件的话只有一个简单的列表页的摘要生成和enlighter代码高亮。本身只用于展示文章及评论。因为大量用了泛型功能,所以要求go的版本在1.19及以上,越新越好。。。
|
||||||
|
|
||||||
#### 特色功能
|
#### 特色功能
|
||||||
|
|
||||||
- 多种缓存配置
|
- 基本实现全站缓存,并且可防止缓存击穿
|
||||||
|
- 列表页也可以高亮语法格式化显示代码
|
||||||
|
- 简易插件扩展开发机制、配置后支持热加载更新
|
||||||
|
- 丰富繁杂的配置,呃,配置是有点儿多,虽然大部分都是可选项。。。
|
||||||
- 添加评论或panic时发邮件通知,包涵栈调用和请求信息
|
- 添加评论或panic时发邮件通知,包涵栈调用和请求信息
|
||||||
- 简单的流量限制中间件
|
- 简单的流量限制中间件,可以限制全瞬时最大请求数量
|
||||||
- 除配置文件外将所有静态资源都打包到执行文件中
|
- 除配置文件外将所有静态资源都打包到执行文件中
|
||||||
- 支持密码查看,且cookie信息可被php版所验证
|
- 支持密码查看,且cookie信息可被php版所验证
|
||||||
- 支持rss2订阅
|
- 支持rss2订阅
|
||||||
- 热更新配置、清空缓存
|
- 热更新配置、切换主题、清空缓存
|
||||||
- kill -SIGUSR1 PID 更新配置和清空缓存
|
- kill -SIGUSR1 PID 更新配置和清空缓存
|
||||||
- kill -SIGUSR2 PID 清空缓存
|
- kill -SIGUSR2 PID 清空缓存
|
||||||
|
|
||||||
|
#### 数据显示支持程度
|
||||||
|
|
||||||
|
| 页表 | 支持程度 |
|
||||||
|
|-----|--------------------------------------------|
|
||||||
|
| 列表页 | 首页/搜索/归档/分类/标签/作者 分页列表 |
|
||||||
|
| 详情页 | 显示内容、评论并可以添加评论(转发的php处理,需要配置php版的添加评论的url) |
|
||||||
|
| 侧边栏 | 目前固定 近期文章、近期评论、规档、分类、条目/评论feed |
|
||||||
|
|
||||||
|
#### 后台设置支持程度
|
||||||
|
|
||||||
|
- 设置-
|
||||||
|
- 常规
|
||||||
|
- 站点标题
|
||||||
|
- 副标题
|
||||||
|
- 阅读
|
||||||
|
- 博客页面至多显示数量
|
||||||
|
- Feed中显示最近数量
|
||||||
|
- 讨论
|
||||||
|
- 其他评论设置-启用评论嵌套,最多嵌套层数
|
||||||
|
- 在每个页面顶部显示 `新旧`评论
|
||||||
|
|
||||||
|
#### 主题支持程度
|
||||||
|
|
||||||
|
| twentyfifteen | twentyseventeen |
|
||||||
|
|---------------|-----------------|
|
||||||
|
| 站点身份 | 站点身份 |
|
||||||
|
| 颜色 | 颜色 |
|
||||||
|
| 页眉图片 | 页眉媒体 (暂不支持视频) |
|
||||||
|
| 背景图片 | 额外css |
|
||||||
|
| 额外css | |
|
||||||
|
|
||||||
|
#### 插件机制
|
||||||
|
|
||||||
|
分为对列表页文章数据的修改的插件和对影响整个程序表现的插件
|
||||||
|
|
||||||
|
| 列表页文章数据插件 | 整个程序表现的插件 |
|
||||||
|
|----------------------|----------------|
|
||||||
|
| passwordProject 密码保护 | enlighter 代码高亮 |
|
||||||
|
| digest 自动生成指定长度的摘要 | |
|
||||||
|
|
||||||
#### 其它
|
#### 其它
|
||||||
用的gin框架和sqlx,在外面封装了层查询的方法。后台可以设置的比较少,大部分设置还没打通。
|
|
||||||
|
用的gin框架和sqlx,在外面封装了层查询的方法。
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/fthvgb1/wp-go/helper/slice"
|
"github.com/fthvgb1/wp-go/helper/slice"
|
||||||
str "github.com/fthvgb1/wp-go/helper/strings"
|
str "github.com/fthvgb1/wp-go/helper/strings"
|
||||||
"github.com/fthvgb1/wp-go/internal/pkg/models"
|
"github.com/fthvgb1/wp-go/internal/pkg/models"
|
||||||
|
"github.com/fthvgb1/wp-go/internal/wpconfig"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -137,8 +138,12 @@ type CommonCommentFormat struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c CommonCommentFormat) Sort(i, j *Comments) bool {
|
func (c CommonCommentFormat) Sort(i, j *Comments) bool {
|
||||||
|
order := wpconfig.GetOption("comment_order")
|
||||||
|
if order == "asc" {
|
||||||
return i.CommentDate.UnixNano() < j.CommentDate.UnixNano()
|
return i.CommentDate.UnixNano() < j.CommentDate.UnixNano()
|
||||||
}
|
}
|
||||||
|
return i.CommentDate.UnixNano() > j.CommentDate.UnixNano()
|
||||||
|
}
|
||||||
|
|
||||||
func (c CommonCommentFormat) FormatLi(ctx *gin.Context, m models.Comments, depth int, isTls bool, eo, parent string) string {
|
func (c CommonCommentFormat) FormatLi(ctx *gin.Context, m models.Comments, depth int, isTls bool, eo, parent string) string {
|
||||||
return FormatLi(CommonLi(), ctx, m, depth, isTls, eo, parent)
|
return FormatLi(CommonLi(), ctx, m, depth, isTls, eo, parent)
|
||||||
|
|
|
@ -644,3 +644,54 @@ func Test_finds(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGets(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
ctx context.Context
|
||||||
|
q QueryCondition
|
||||||
|
}
|
||||||
|
type testCase[T Model] struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want T
|
||||||
|
wantErr bool
|
||||||
|
}
|
||||||
|
tests := []testCase[options]{
|
||||||
|
{
|
||||||
|
name: "t1",
|
||||||
|
args: args{
|
||||||
|
ctx: ctx,
|
||||||
|
q: Conditions(Where(SqlBuilder{
|
||||||
|
{"option_id", "11"},
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
want: options{
|
||||||
|
OptionId: 11,
|
||||||
|
OptionName: "comments_notify",
|
||||||
|
OptionValue: "1",
|
||||||
|
Autoload: "yes",
|
||||||
|
},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := Gets[options](tt.args.ctx, tt.args.q)
|
||||||
|
gots, _ := gets[options](glob, tt.args.ctx, tt.args.q)
|
||||||
|
gotss, _ := GetsFromDB[options](glob, tt.args.ctx, tt.args.q)
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("Gets() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, gots) {
|
||||||
|
t.Errorf("Gets() got = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, gotss) {
|
||||||
|
t.Errorf("Gets() got = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("Gets() got = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user