pull/50/head
sunface 4 years ago
parent 956adfb8eb
commit 00d9d1e56e

@ -78,7 +78,7 @@ const PostsPage = () => {
const editPost = (post: Post) => { const editPost = (post: Post) => {
if (post.url.trim() === "") { if (post.url.trim() === "") {
router.push(`/story/post/${post.id}`) router.push(`/editor/post/${post.id}`)
} else { } else {
setCurrentPost(post) setCurrentPost(post)
onOpen() onOpen()
@ -86,7 +86,7 @@ const PostsPage = () => {
} }
const onDeletePost= async (id) => { const onDeletePost= async (id) => {
await requestApi.delete(`/storyt/post/${id}`) await requestApi.delete(`/story/post/${id}`)
getPosts() getPosts()
toast({ toast({
description: "删除成功", description: "删除成功",

@ -57,9 +57,6 @@ var sqlTables = map[string]string{
url VARCHAR(255), url VARCHAR(255),
cover VARCHAR(255), cover VARCHAR(255),
brief TEXT, brief TEXT,
likes INTEGER DEFAULT 0,
views INTEGER DEFAULT 0,
comments INTEGER DEFAULT 0,
status tinyint NOT NULL, status tinyint NOT NULL,
created DATETIME NOT NULL, created DATETIME NOT NULL,
updated DATETIME updated DATETIME
@ -112,7 +109,6 @@ var sqlTables = map[string]string{
icon VARCHAR(255), icon VARCHAR(255),
cover VARCHAR(255), cover VARCHAR(255),
md TEXT, md TEXT,
follower_count INTEGER DEFAULT 0,
created DATETIME NOT NULL, created DATETIME NOT NULL,
updated DATETIME updated DATETIME
); );
@ -124,12 +120,15 @@ var sqlTables = map[string]string{
"tags_using": `CREATE TABLE IF NOT EXISTS tags_using ( "tags_using": `CREATE TABLE IF NOT EXISTS tags_using (
tag_id VARCHAR(255), tag_id VARCHAR(255),
target_type VARCHAR(1),
target_id VARCHAR(255) target_id VARCHAR(255)
); );
CREATE INDEX IF NOT EXISTS tags_using_tagid CREATE INDEX IF NOT EXISTS tags_using_tagid
ON tags_using (tag_id); ON tags_using (tag_id);
CREATE INDEX IF NOT EXISTS tags_using_targetid CREATE INDEX IF NOT EXISTS tags_using_targetid
ON tags_using (target_id); ON tags_using (target_id);
CREATE INDEX IF NOT EXISTS tags_using_idtype
ON tags_using (tag_id,target_type);
`, `,
"comments": `CREATE TABLE IF NOT EXISTS comments ( "comments": `CREATE TABLE IF NOT EXISTS comments (
@ -137,7 +136,6 @@ var sqlTables = map[string]string{
target_id VARCHAR(255), target_id VARCHAR(255),
creator VARCHAR(255), creator VARCHAR(255),
MD TEXT, MD TEXT,
likes INTEGER DEFAULT 0,
created DATETIME NOT NULL, created DATETIME NOT NULL,
updated DATETIME updated DATETIME
); );

@ -73,7 +73,7 @@ func EditComment(c *models.Comment) *e.Error {
func GetComments(storyID string) (models.Comments, *e.Error) { func GetComments(storyID string) (models.Comments, *e.Error) {
comments := make(models.Comments, 0) comments := make(models.Comments, 0)
rows, err := db.Conn.Query("SELECT id,target_id,creator,md,likes,created,updated FROM comments WHERE target_id=?", storyID) rows, err := db.Conn.Query("SELECT id,target_id,creator,md,created,updated FROM comments WHERE target_id=?", storyID)
if err != nil && err != sql.ErrNoRows { if err != nil && err != sql.ErrNoRows {
logger.Warn("get comments error", "error", err) logger.Warn("get comments error", "error", err)
return comments, e.New(http.StatusInternalServerError, e.Internal) return comments, e.New(http.StatusInternalServerError, e.Internal)
@ -82,7 +82,7 @@ func GetComments(storyID string) (models.Comments, *e.Error) {
for rows.Next() { for rows.Next() {
c := &models.Comment{} c := &models.Comment{}
var rawMd []byte var rawMd []byte
err := rows.Scan(&c.ID, &c.TargetID, &c.CreatorID, &rawMd, &c.Likes, &c.Created, &c.Updated) err := rows.Scan(&c.ID, &c.TargetID, &c.CreatorID, &rawMd, &c.Created, &c.Updated)
if err != nil { if err != nil {
logger.Warn("scan comment error", "error", err) logger.Warn("scan comment error", "error", err)
continue continue
@ -94,6 +94,8 @@ func GetComments(storyID string) (models.Comments, *e.Error) {
c.Creator = &models.UserSimple{ID: c.CreatorID} c.Creator = &models.UserSimple{ID: c.CreatorID}
err = c.Creator.Query() err = c.Creator.Query()
c.Likes = GetLikes(c.ID)
comments = append(comments, c) comments = append(comments, c)
} }
@ -105,8 +107,8 @@ func GetComments(storyID string) (models.Comments, *e.Error) {
func GetComment(id string) (*models.Comment, *e.Error) { func GetComment(id string) (*models.Comment, *e.Error) {
c := &models.Comment{} c := &models.Comment{}
var rawMd []byte var rawMd []byte
err := db.Conn.QueryRow("SELECT id,target_id,creator,md,likes,created,updated FROM comments WHERE id=?", id).Scan( err := db.Conn.QueryRow("SELECT id,target_id,creator,md,created,updated FROM comments WHERE id=?", id).Scan(
&c.ID, &c.TargetID, &c.CreatorID, &rawMd, &c.Likes, &c.Created, &c.Updated, &c.ID, &c.TargetID, &c.CreatorID, &rawMd, &c.Created, &c.Updated,
) )
if err != nil { if err != nil {
logger.Warn("get comment error", "error", err) logger.Warn("get comment error", "error", err)
@ -116,6 +118,7 @@ func GetComment(id string) (*models.Comment, *e.Error) {
md, _ := utils.Uncompress(rawMd) md, _ := utils.Uncompress(rawMd)
c.Md = string(md) c.Md = string(md)
c.Likes = GetLikes(c.ID)
return c, nil return c, nil
} }
@ -140,25 +143,35 @@ func DeleteComment(id string) *e.Error {
} }
count += 1 count += 1
_, err = db.Conn.Exec("UPDATE comments_count SET count=count-? WHERE story_id=?", count, storyID) tx, err := db.Conn.Begin()
if err != nil {
logger.Warn("start sql transaction error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal)
}
_, err = tx.Exec("UPDATE comments_count SET count=count-? WHERE story_id=?", count, storyID)
if err != nil { if err != nil {
logger.Warn("update comments_count error", "error", err) logger.Warn("update comments_count error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal) return e.New(http.StatusInternalServerError, e.Internal)
} }
// delete children replies // delete children replies
_, err = db.Conn.Exec("DELETE FROM comments WHERE target_id=?", id) _, err = tx.Exec("DELETE FROM comments WHERE target_id=?", id)
if err != nil { if err != nil {
logger.Warn("delete comment replies error", "error", err) logger.Warn("delete comment replies error", "error", err)
tx.Rollback()
return e.New(http.StatusInternalServerError, e.Internal) return e.New(http.StatusInternalServerError, e.Internal)
} }
_, err = db.Conn.Exec("DELETE FROM comments WHERE id=?", id) _, err = tx.Exec("DELETE FROM comments WHERE id=?", id)
if err != nil { if err != nil {
logger.Warn("delete comment error", "error", err) logger.Warn("delete comment error", "error", err)
tx.Rollback()
return e.New(http.StatusInternalServerError, e.Internal) return e.New(http.StatusInternalServerError, e.Internal)
} }
tx.Commit()
return nil return nil
} }

@ -2,7 +2,6 @@ package story
import ( import (
"database/sql" "database/sql"
"fmt"
"net/http" "net/http"
"time" "time"
@ -16,27 +15,53 @@ func Like(storyID string, userId string) *e.Error {
return e.New(http.StatusNotFound, e.NotFound) return e.New(http.StatusNotFound, e.NotFound)
} }
tbl := getStorySqlTable(storyID)
// 查询当前like状态 // 查询当前like状态
liked := GetLiked(storyID, userId) liked := GetLiked(storyID, userId)
var count int
err := db.Conn.QueryRow("SELECT count FROM likes_count WHERE story_id=?", storyID).Scan(&count)
if err != nil && err != sql.ErrNoRows {
logger.Warn("query likes count error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal)
}
exist = !(err == sql.ErrNoRows)
tx, err := db.Conn.Begin()
if err != nil {
logger.Warn("start like transaction error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal)
}
if liked { if liked {
// 已经喜欢过该篇文章,更改为不喜欢 // 已经喜欢过该篇文章,更改为不喜欢
_, err := db.Conn.Exec("DELETE FROM likes WHERE story_id=? and user_id=?", storyID, userId) _, err := tx.Exec("DELETE FROM likes WHERE story_id=? and user_id=?", storyID, userId)
if err != nil { if err != nil {
return e.New(http.StatusInternalServerError, e.Internal) return e.New(http.StatusInternalServerError, e.Internal)
} }
count = count - 1
db.Conn.Exec(fmt.Sprintf("UPDATE %s SET likes=likes-1 WHERE id=?", tbl), storyID)
} else { } else {
_, err := db.Conn.Exec("INSERT INTO likes (story_id,user_id,created) VALUES (?,?,?)", storyID, userId, time.Now()) _, err := tx.Exec("INSERT INTO likes (story_id,user_id,created) VALUES (?,?,?)", storyID, userId, time.Now())
if err != nil { if err != nil {
logger.Warn("add like error", "error", err) logger.Warn("add like error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal) return e.New(http.StatusInternalServerError, e.Internal)
} }
db.Conn.Exec(fmt.Sprintf("UPDATE %s SET likes=likes+1 WHERE id=?", tbl), storyID) count = count + 1
} }
var err0 error
if !exist {
_, err0 = tx.Exec("INSERT INTO likes_count (story_id,count) VALUES (?,?)", storyID, count)
} else {
_, err0 = tx.Exec("UPDATE likes_count SET count=? WHERE story_id=?", count, storyID)
}
if err0 != nil {
logger.Warn("add like error", "error", err0)
tx.Rollback()
return e.New(http.StatusInternalServerError, e.Internal)
}
tx.Commit()
return nil return nil
} }
@ -55,3 +80,13 @@ func GetLiked(storyID string, userID string) bool {
return liked return liked
} }
func GetLikes(storyID string) int {
var likes int
err := db.Conn.QueryRow("SELECT count FROM likes_count WHERE story_id=?", storyID).Scan(&likes)
if err != nil && err != sql.ErrNoRows {
logger.Warn("get like count error", "error", err)
}
return likes
}

@ -107,26 +107,35 @@ func SubmitPost(c *gin.Context) (map[string]string, *e.Error) {
} }
func DeletePost(id string) *e.Error { func DeletePost(id string) *e.Error {
_, err := db.Conn.Exec("DELETE FROM posts WHERE id=?", id) tx, err := db.Conn.Begin()
if err != nil {
logger.Warn("start sql transaction error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal)
}
_, err = tx.Exec("DELETE FROM posts WHERE id=?", id)
if err != nil { if err != nil {
logger.Warn("delete post error", "error", err) logger.Warn("delete post error", "error", err)
return e.New(http.StatusInternalServerError, e.Internal) return e.New(http.StatusInternalServerError, e.Internal)
} }
// delete tags // delete tags
err = tags.DeleteTargetTags(id) err = tags.DeleteTargetTags(tx, id)
if err != nil { if err != nil {
logger.Warn("delete post tags error", "error", err) logger.Warn("delete post tags error", "error", err)
tx.Rollback()
} }
tx.Commit()
return nil return nil
} }
func GetPost(id string, slug string) (*models.Post, *e.Error) { func GetPost(id string, slug string) (*models.Post, *e.Error) {
ar := &models.Post{} ar := &models.Post{}
var rawmd []byte var rawmd []byte
err := db.Conn.QueryRow("select id,slug,title,md,url,cover,brief,creator,likes,views,created,updated from posts where id=? or slug=?", id, slug).Scan( err := db.Conn.QueryRow("select id,slug,title,md,url,cover,brief,creator,created,updated from posts where id=? or slug=?", id, slug).Scan(
&ar.ID, &ar.Slug, &ar.Title, &rawmd, &ar.URL, &ar.Cover, &ar.Brief, &ar.CreatorID, &ar.Likes, &ar.Views, &ar.Created, &ar.Updated, &ar.ID, &ar.Slug, &ar.Title, &rawmd, &ar.URL, &ar.Cover, &ar.Brief, &ar.CreatorID, &ar.Created, &ar.Updated,
) )
if err != nil { if err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
@ -149,13 +158,7 @@ func GetPost(id string, slug string) (*models.Post, *e.Error) {
ar.Tags = t ar.Tags = t
ar.RawTags = rawTags ar.RawTags = rawTags
// add views count ar.Likes = GetLikes(ar.ID)
_, err = db.Conn.Exec("UPDATE posts SET views=? WHERE id=?", ar.Views+1, ar.ID)
if err != nil {
logger.Warn("update post view count error", "error", err)
}
//get bookmared
return ar, nil return ar, nil
} }

@ -15,7 +15,7 @@ import (
func HomePosts(user *models.User, filter string) (models.Posts, *e.Error) { func HomePosts(user *models.User, filter string) (models.Posts, *e.Error) {
rows, err := db.Conn.Query("select id,slug,title,url,cover,brief,likes,views,creator,created,updated from posts") rows, err := db.Conn.Query("select id,slug,title,url,cover,brief,creator,created,updated from posts")
if err != nil && err != sql.ErrNoRows { if err != nil && err != sql.ErrNoRows {
logger.Warn("get user posts error", "error", err) logger.Warn("get user posts error", "error", err)
return nil, e.New(http.StatusInternalServerError, e.Internal) return nil, e.New(http.StatusInternalServerError, e.Internal)
@ -28,7 +28,7 @@ func HomePosts(user *models.User, filter string) (models.Posts, *e.Error) {
} }
func UserPosts(user *models.User, uid string) (models.Posts, *e.Error) { func UserPosts(user *models.User, uid string) (models.Posts, *e.Error) {
rows, err := db.Conn.Query("select id,slug,title,url,cover,brief,likes,views,creator,created,updated from posts where creator=?", uid) rows, err := db.Conn.Query("select id,slug,title,url,cover,brief,creator,created,updated from posts where creator=?", uid)
if err != nil && err != sql.ErrNoRows { if err != nil && err != sql.ErrNoRows {
logger.Warn("get user posts error", "error", err) logger.Warn("get user posts error", "error", err)
return nil, e.New(http.StatusInternalServerError, e.Internal) return nil, e.New(http.StatusInternalServerError, e.Internal)
@ -50,7 +50,7 @@ func TagPosts(user *models.User, tagID string) (models.Posts, *e.Error) {
ids := strings.Join(postIDs, "','") ids := strings.Join(postIDs, "','")
q := fmt.Sprintf("select id,slug,title,url,cover,brief,likes,views,creator,created,updated from posts where id in ('%s')", ids) q := fmt.Sprintf("select id,slug,title,url,cover,brief,creator,created,updated from posts where id in ('%s')", ids)
rows, err := db.Conn.Query(q) rows, err := db.Conn.Query(q)
if err != nil && err != sql.ErrNoRows { if err != nil && err != sql.ErrNoRows {
logger.Warn("get user posts error", "error", err) logger.Warn("get user posts error", "error", err)
@ -80,7 +80,7 @@ func BookmarkPosts(user *models.User, filter string) (models.Posts, *e.Error) {
ids := strings.Join(postIDs, "','") ids := strings.Join(postIDs, "','")
q := fmt.Sprintf("select id,slug,title,url,cover,brief,likes,views,creator,created,updated from posts where id in ('%s')", ids) q := fmt.Sprintf("select id,slug,title,url,cover,brief,creator,created,updated from posts where id in ('%s')", ids)
rows, err = db.Conn.Query(q) rows, err = db.Conn.Query(q)
if err != nil && err != sql.ErrNoRows { if err != nil && err != sql.ErrNoRows {
logger.Warn("get user posts error", "error", err) logger.Warn("get user posts error", "error", err)
@ -107,7 +107,7 @@ func getPosts(user *models.User, rows *sql.Rows) models.Posts {
posts := make(models.Posts, 0) posts := make(models.Posts, 0)
for rows.Next() { for rows.Next() {
ar := &models.Post{} ar := &models.Post{}
err := rows.Scan(&ar.ID, &ar.Slug, &ar.Title, &ar.URL, &ar.Cover, &ar.Brief, &ar.Likes, &ar.Views, &ar.CreatorID, &ar.Created, &ar.Updated) err := rows.Scan(&ar.ID, &ar.Slug, &ar.Title, &ar.URL, &ar.Cover, &ar.Brief, &ar.CreatorID, &ar.Created, &ar.Updated)
if err != nil { if err != nil {
logger.Warn("scan post error", "error", err) logger.Warn("scan post error", "error", err)
continue continue
@ -125,9 +125,11 @@ func getPosts(user *models.User, rows *sql.Rows) models.Posts {
if user != nil { if user != nil {
ar.Liked = GetLiked(ar.ID, user.ID) ar.Liked = GetLiked(ar.ID, user.ID)
} }
ar.Likes = GetLikes(ar.ID)
// 获取当前登录用户的bookmark // 获取当前登录用户的bookmark
ar.Bookmarked, _ = Bookmarked(user.ID, ar.ID) ar.Bookmarked, _ = Bookmarked(user.ID, ar.ID)
posts = append(posts, ar) posts = append(posts, ar)
} }

@ -17,14 +17,3 @@ func Exist(id string) bool {
return false return false
} }
} }
func getStorySqlTable(id string) string {
switch id[:1] {
case models.IDTypePost:
return "posts"
case models.IDTypeComment:
return "comments"
default:
return "unknown"
}
}

@ -180,7 +180,7 @@ func UpdateTargetTags(targetID string, tags []string) error {
} }
for _, tag := range tags { for _, tag := range tags {
_, err = db.Conn.Exec("INSERT INTO tags_using (tag_id,target_id) VALUES (?,?)", tag, targetID) _, err = db.Conn.Exec("INSERT INTO tags_using (tag_id,target_type,target_id) VALUES (?,?,?)", tag, models.GetIDType(targetID), targetID)
if err != nil { if err != nil {
logger.Warn("add post tag error", "error", err) logger.Warn("add post tag error", "error", err)
} }
@ -189,8 +189,14 @@ func UpdateTargetTags(targetID string, tags []string) error {
return nil return nil
} }
func DeleteTargetTags(targetID string) error { func DeleteTargetTags(tx *sql.Tx, targetID string) error {
_, err := db.Conn.Exec("DELETE FROM tags_using WHERE target_id=?", targetID) var err error
if tx != nil {
_, err = tx.Exec("DELETE FROM tags_using WHERE target_id=?", targetID)
} else {
_, err = db.Conn.Exec("DELETE FROM tags_using WHERE target_id=?", targetID)
}
if err != nil { if err != nil {
return err return err
} }

@ -6,3 +6,26 @@ const (
IDTypeUser = "3" IDTypeUser = "3"
IDTypeTag = "4" IDTypeTag = "4"
) )
func GetIDType(id string) string {
if id == "" {
return ""
}
return id[:1]
}
func GetIdTypeTable(id string) string {
switch id[:1] {
case IDTypePost:
return "posts"
case IDTypeComment:
return "comments"
case IDTypeUser:
return "user"
case IDTypeTag:
return "tags"
default:
return "unknown"
}
}

Loading…
Cancel
Save