完善添加评论

This commit is contained in:
xing 2022-11-08 17:41:01 +08:00
parent 5407a74aa3
commit ec2aa30eb6
5 changed files with 51 additions and 25 deletions

View File

@ -6,23 +6,27 @@ import (
"fmt"
"github.com/gin-gonic/gin"
"github/fthvgb1/wp-go/actions/common"
"github/fthvgb1/wp-go/cache"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/logs"
"github/fthvgb1/wp-go/mail"
"github/fthvgb1/wp-go/models/wp"
"io"
"net/http"
"net/http/cookiejar"
"net/url"
"strconv"
"strings"
"time"
)
var commentCache = cache.NewMapCacheByFn[string, string](nil, 15*time.Minute)
func PostComment(c *gin.Context) {
jar, _ := cookiejar.New(nil)
cli := &http.Client{
Jar: jar,
Timeout: time.Second * 3,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
data, err := c.GetRawData()
defer func() {
@ -44,18 +48,28 @@ func PostComment(c *gin.Context) {
return
}
defer req.Body.Close()
for k, v := range c.Request.Header {
req.Header.Set(k, v[0])
}
req.Header = c.Request.Header.Clone()
res, err := cli.Do(req)
if err != nil {
if err != nil && err != http.ErrUseLastResponse {
return
}
if res.Request.Response != nil && res.Request.Response.StatusCode == http.StatusFound {
for _, cookie := range res.Request.Response.Cookies() {
c.SetCookie(cookie.Name, cookie.Value, cookie.MaxAge, cookie.Path, cookie.Domain, cookie.Secure, cookie.HttpOnly)
if res.StatusCode == http.StatusFound {
u := res.Header.Get("Location")
up, err := url.Parse(u)
if err != nil {
return
}
cu, err := url.Parse(config.Conf.PostCommentUrl)
if err != nil {
return
}
up.Host = cu.Host
ress, err := http.DefaultClient.Get(up.String())
if err != nil {
return
}
//c.Redirect(http.StatusFound, res.Request.Response.Header.Get("Location"))
cc := c.Copy()
go func() {
id, err := strconv.ParseUint(i, 10, 64)
@ -72,11 +86,13 @@ func PostComment(c *gin.Context) {
err = mail.SendMail([]string{config.Conf.Mail.User}, su, comment)
logs.ErrPrintln(err, "发送邮件", config.Conf.Mail.User, su, comment)
}()
s, err := io.ReadAll(res.Body)
s, err := io.ReadAll(ress.Body)
if err != nil {
return
}
c.String(http.StatusOK, string(s))
commentCache.Set(up.RawQuery, string(s))
c.Redirect(http.StatusFound, res.Header.Get("Location"))
return
}
s, err := io.ReadAll(res.Body)

View File

@ -39,12 +39,16 @@ func Detail(c *gin.Context) {
"categories": categoryItems,
"recentComments": recentComments,
}
isApproveComment := false
defer func() {
status := http.StatusOK
if err != nil {
status = http.StatusInternalServerError
c.Error(err)
}
if isApproveComment == true {
return
}
c.HTML(status, "twentyfifteen/posts/detail.gohtml", h)
}()
id := c.Param("id")
@ -74,6 +78,12 @@ func Detail(c *gin.Context) {
if post.PostPassword != "" && pw != post.PostPassword {
common.PasswdProjectContent(&post)
showComment = false
} else if s, ok := commentCache.Get(c.Request.URL.RawQuery); ok && s != "" && (post.PostPassword == "" || post.PostPassword != "" && pw == post.PostPassword) {
c.Writer.WriteHeader(http.StatusOK)
c.Writer.Header().Set("Content-Type", "text/html; charset=utf-8")
_, err = c.Writer.WriteString(s)
isApproveComment = true
return
}
plugins.ApplyPlugin(plugins.NewPostPlugin(c, plugins.Detail), &post)
comments, err := common.PostComments(c, post.Id)

View File

@ -38,6 +38,7 @@ func InitFeed() {
func ClearCache() {
postFeedCache.ClearExpired()
commentCache.ClearExpired()
}
func isCacheExpired(c *gin.Context, lastTime time.Time) bool {
@ -55,7 +56,7 @@ func isCacheExpired(c *gin.Context, lastTime time.Time) bool {
}
func Feed(c *gin.Context) {
if !isCacheExpired(c, feedCache.SetTime()) {
if !isCacheExpired(c, feedCache.GetLastSetTime()) {
c.Status(http.StatusNotModified)
} else {
r, err := feedCache.GetCache(c, time.Second, c)
@ -65,7 +66,7 @@ func Feed(c *gin.Context) {
c.Error(err)
return
}
setFeed(r[0], c, feedCache.SetTime())
setFeed(r[0], c, feedCache.GetLastSetTime())
}
}
@ -126,7 +127,7 @@ func setFeed(s string, c *gin.Context, t time.Time) {
func PostFeed(c *gin.Context) {
id := c.Param("id")
if !isCacheExpired(c, postFeedCache.GetSetTime(id)) {
if !isCacheExpired(c, postFeedCache.GetLastSetTime(id)) {
c.Status(http.StatusNotModified)
} else {
s, err := postFeedCache.GetCache(c, id, time.Second, c, id)
@ -136,7 +137,7 @@ func PostFeed(c *gin.Context) {
c.Error(err)
return
}
setFeed(s, c, postFeedCache.GetSetTime(id))
setFeed(s, c, postFeedCache.GetLastSetTime(id))
}
}
@ -205,7 +206,7 @@ func postFeed(arg ...any) (x string, err error) {
}
func CommentsFeed(c *gin.Context) {
if !isCacheExpired(c, commentsFeedCache.SetTime()) {
if !isCacheExpired(c, commentsFeedCache.GetLastSetTime()) {
c.Status(http.StatusNotModified)
} else {
r, err := commentsFeedCache.GetCache(c, time.Second, c)
@ -215,7 +216,7 @@ func CommentsFeed(c *gin.Context) {
c.Error(err)
return
}
setFeed(r[0], c, commentsFeedCache.SetTime())
setFeed(r[0], c, commentsFeedCache.GetLastSetTime())
}
}

8
cache/map.go vendored
View File

@ -31,7 +31,7 @@ func (m *MapCache[K, V]) SetCacheFunc(fn func(...any) (V, error)) {
m.cacheFunc = fn
}
func (m *MapCache[K, V]) GetSetTime(k K) (t time.Time) {
func (m *MapCache[K, V]) GetLastSetTime(k K) (t time.Time) {
r, ok := m.data.Load(k)
if ok {
t = r.setTime
@ -93,13 +93,13 @@ func (m *MapCache[K, V]) Flush() {
m.data = safety.NewMap[K, mapCacheStruct[V]]()
}
func (m *MapCache[K, V]) Get(k K) V {
func (m *MapCache[K, V]) Get(k K) (V, bool) {
r, ok := m.data.Load(k)
if ok {
return r.data
return r.data, ok
}
var rr V
return rr
return rr, false
}
func (m *MapCache[K, V]) Set(k K, v V) {

3
cache/slice.go vendored
View File

@ -22,8 +22,7 @@ type slice[T any] struct {
incr int
}
func (c *SliceCache[T]) SetTime() time.Time {
func (c *SliceCache[T]) GetLastSetTime() time.Time {
return c.v.Load().setTime
}