Skip to content

Commit

Permalink
add sqlInjectSafe; add respUsersFavoriteCountMap
Browse files Browse the repository at this point in the history
  • Loading branch information
derekwin committed Feb 21, 2023
1 parent ab3a3c8 commit 77fac74
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 20 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ go get github.com/ClubWeGo/usermicro@latest

go get github.com/ClubWeGo/relationmicro@latest

go get github.com/ClubWeGo/favoritemicro@latest



# 说明
Expand Down
2 changes: 0 additions & 2 deletions biz/handler/core/feed_server.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 41 additions & 3 deletions kitex_server/interaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package kitex_server

import (
"context"
"sync"

"github.com/ClubWeGo/douyin/biz/model/interaction"
"github.com/ClubWeGo/douyin/tools/errno"
Expand Down Expand Up @@ -81,7 +82,44 @@ func CountUserFavorite(ctx context.Context, uid int64) (int64, int64, error) {
return res.FavoriteCount, res.FavoritedCount, nil
}

// TODO : 传入userId切片,批量查询user对应的favorite, total_favorited
func GetFavoriteCountByUserIdSet(idSet []int64) (favoriteSet, favoritedSet []int64, err error) {
return []int64{}, []int64{}, nil
// 传入userId切片,批量查询user对应的favorite, total_favorited
// map[int64][]int64 [FavoriteCount FavoritedCount]
func GetUsersFavoriteCountMap(idSet []int64, respUsersFavoriteCountMap chan map[int64][]int64, wg *sync.WaitGroup, errChan chan error) {
defer wg.Done()

res, err := FavoriteClient.UsersFavoriteCountMethod(context.Background(), &favorite.UsersFavoriteCountReq{
UserIdList: idSet,
})
if err != nil {
respUsersFavoriteCountMap <- map[int64][]int64{}
errChan <- err
return
}
respUsersFavoriteCountMap <- res.FavoriteCountMap
errChan <- nil
}

// 传入videoId切片,批量查询video对应的favorite, favorited
// map[int64]int64 FavoriteCount
func GetVideosFavoriteCountMap(idSet []int64, respVideosFavoriteCountMap chan map[int64]int64, wg *sync.WaitGroup, errChan chan error) {
defer wg.Done()

res, err := FavoriteClient.VideosFavoriteCountMethod(context.Background(), &favorite.VideosFavoriteCountReq{
VideoIdList: idSet,
})
if err != nil {
respVideosFavoriteCountMap <- map[int64]int64{}
errChan <- err
return
}
respVideosFavoriteCountMap <- res.FavoriteCountMap
errChan <- nil
}

// 传入videoId切片和当前用户id,批量查询喜欢情况
func GetIsFavoriteMap() (idSet []int64, currentUser int64, respIsFavoriteMap chan map[int64]bool, wg *sync.WaitGroup, errChan chan error) {
defer wg.Done()

// res, err := FavoriteClient.FavoriteRelationMethod(context.Background(), &favorite.FavoriteRelationReq{})
return
}
20 changes: 16 additions & 4 deletions kitex_server/userservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,13 @@ func GetUserLatestMap(idSet []int64, currentUser int64, respUserMap chan map[int
wgUser.Add(1)
go GetRelationMap(idSet, currentUser, respRelationMap, wgUser, respRelationMapError)

// TODO : TotalFavourited, FavoriteCount,传入查询的userId切片,查对应这两个字段的切片,(结果需要携带UserId):从favorite服务
// 批量查询TotalFavourited, FavoriteCount,传入查询的userId切片
respUsersFavoriteCountMap := make(chan map[int64][]int64, 1) // [FavoriteCount FavoritedCount]
defer close(respRelationMap)
respUsersFavoriteCountMapError := make(chan error, 1)
defer close(respUsersFavoriteCountMapError)
wgUser.Add(1)
go GetUsersFavoriteCountMap(idSet, respUsersFavoriteCountMap, wgUser, respUsersFavoriteCountMapError)

// 等待数据
wgUser.Wait()
Expand All @@ -124,6 +130,12 @@ func GetUserLatestMap(idSet []int64, currentUser int64, respUserMap chan map[int
if err != nil {
errSlice = append(errSlice, err)
}

FavoriteCountMap := <-respUsersFavoriteCountMap
err = <-respUsersFavoriteCountMapError
if err != nil {
errSlice = append(errSlice, err)
}
// TODO: 其他协程的错误处理

errChan <- errSlice // 错误切片
Expand All @@ -139,9 +151,9 @@ func GetUserLatestMap(idSet []int64, currentUser int64, respUserMap chan map[int
Avatar: user.Avatar,
BackgroundImage: user.BackgroundImage,
Signature: user.Signature,
TotalFavourited: "", // TODO: 从获取的数据中拿
WorkCount: VideoCountMap[id].Count, // 最新的count数据
FavoriteCount: 0, // TODO: 从获取的数据中拿
TotalFavourited: strconv.FormatInt(FavoriteCountMap[id][1], 10), // TODO: 从获取的数据中拿
WorkCount: VideoCountMap[id].Count, // 最新的count数据
FavoriteCount: FavoriteCountMap[id][0], // TODO: 从获取的数据中拿
}

}
Expand Down
27 changes: 16 additions & 11 deletions kitex_server/videoservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,32 +52,37 @@ func GetVideoLatestMap(idSet []int64, currentUser int64, respVideoMap chan map[i
wgVideo := &sync.WaitGroup{} // 本函数子协程的wg

// 批量查询视频的 被喜欢数 ,传入视频id的切片,返回对应的FavoriteCount的切片(需携带对应视频id) 从Favorite服务
respVideosFavoriteCountMap := make(chan map[int64]int64, 1)
defer close(respVideosFavoriteCountMap)
respVideosFavoriteCountMapError := make(chan error, 1)
defer close(respVideosFavoriteCountMapError)
wgVideo.Add(1)
go GetVideosFavoriteCountMap(idSet, respVideosFavoriteCountMap, wgVideo, respVideosFavoriteCountMapError)

// 批量查询视频的评论数,传入视频id的切片,返回对应的评论数(需携带对应视频id),从comment服务

// 批量查询 is_favorite, 传入目标视频id切片和currentUser查is_favorite的切片(结果需要携带视频id,douyin里后续需要转成map):从favorite;
GetIsFavoriteMap()

// 等待数据
wgVideo.Wait()

// // 处理协程错误
var errSlice = []error{} // 防止外部设置的chan缓存不够造成阻塞,要求外部设置长度为1的error切片类型
// err := <-respAuthorMapError
// if err != nil {
// errSlice = append(errSlice, err)
// }

// // TODO: 其他协程的错误处理
var errSlice = []error{}
VideosFavoriteCountMap := <-respVideosFavoriteCountMap
err := <-respVideosFavoriteCountMapError
if err != nil {
errSlice = append(errSlice, err)
}

errChan <- errSlice // 记录错误的切片,至少应该返回一个空切片,否则chan会阻塞

// 更新数据
videoLatestMap := make(map[int64]core.Video, len(idSet)) // 视频切片的id是没有重复的
for _, id := range idSet {
videoLatestMap[id] = core.Video{ // 视频id对应的Video存储查到的关键字段
FavoriteCount: 0, // TODO:从拿到的MAP数据更新
CommentCount: 0, // TODO:从拿到的MAP数据更新
IsFavorite: false, // TODO:从拿到的MAP数据更新
FavoriteCount: VideosFavoriteCountMap[id], // TODO:从拿到的MAP数据更新
CommentCount: 0, // TODO:从拿到的MAP数据更新
IsFavorite: false, // TODO:从拿到的MAP数据更新
}
}
respVideoMap <- videoLatestMap // 返回数据
Expand Down
17 changes: 17 additions & 0 deletions tools/safe/sqlsafe.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package safe

import (
"errors"
"regexp"
)

// ref: https://blog.csdn.net/qq_40127376/article/details/108516561
var sqlInjectReg = regexp.MustCompile(`(.*\=.*\-\-.*)|(.*(\+|\-).*)|(.*\w+(%|\$|#|&)\w+.*)|(.*\|\|.*)|(.*\s+(and|or)\s+.*)|(.*\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\b.*)`)

func SqlInjectCheck(input string) error {
reg := sqlInjectReg.FindAllString(input, 1) // 匹配一个就行
if reg != nil {
return errors.New("输入存在非法字段")
}
return nil
}
16 changes: 16 additions & 0 deletions tools/safe/sqlsafe_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package safe

import (
"log"
"testing"
)

func TestSqlInjectCheck(t *testing.T) {
str1 := "select 1"
err := SqlInjectCheck(str1)
if err != nil {
log.Println(err)
return
}
log.Println("no")
}

0 comments on commit 77fac74

Please sign in to comment.