package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"strconv"
)
var Friend_List []User
type UserListResponse struct {
Response
UserList []User `json:"user_list"`
}
func removeElement(slice []User, element User) []User {
for i, v := range slice {
if v.Id == element.Id {
print("找到了")
return append(slice[:i], slice[i+1:]...)
}
}
return slice
}
// RelationAction no practical effect, just check if token is valid
func RelationAction(c *gin.Context) {
token := c.Query("token") // 获取的是当前用户的token
user_id := c.Query("to_user_id") // 获取的是关注方用户的id
action_type := c.Query("action_type")
fmt.Print(token, user_id)
u := usersLoginInfo[token]
id1 := u.Id // 当前用户的id
id2, err := strconv.Atoi(user_id) // 目标用户的id
if err != nil {
fmt.Println(err)
}
people := QueryUserOne(id2)
if action_type == "1" {
for i, v := range Follower_List {
if v.Id == int64(id2) {
Follower_List[i].IsFollow = true
}
}
for i, v := range PublishVideos {
if v.Author.Id == int64(id2) {
PublishVideos[i].Author.IsFollow = true
}
}
InsertFollow(id1, int64(id2))
people.IsFollow = true
Follow_List = append(Follow_List, people)
UpdateFollowCount(id1, int64(len(Follow_List)))
u1 := usersLoginInfo[token]
u1.FollowCount++
usersLoginInfo[token] = u1
token2 := Userid_Query_Token(id2)
u2 := usersLoginInfo[token2]
u2.FollowerCount++
usersLoginInfo[token2] = u2
UpdateFollowerCount(int64(id2), people.FollowerCount+1)
} else {
for i, v := range Follower_List {
if v.Id == int64(id2) {
Follower_List[i].IsFollow = false
}
}
for i, v := range PublishVideos {
if v.Author.Id == int64(id2) {
PublishVideos[i].Author.IsFollow = false
}
}
DeleteFollow(id1, int64(id2))
fmt.Println(people)
Follow_List = removeElement(Follow_List, people)
UpdateFollowCount(id1, int64(len(Follow_List)))
UpdateFollowerCount(int64(id2), people.FollowerCount-1)
u1 := usersLoginInfo[token]
u1.FollowCount--
usersLoginInfo[token] = u1
token2 := Userid_Query_Token(id2)
u2 := usersLoginInfo[token2]
u2.FollowerCount--
usersLoginInfo[token2] = u2
}
if _, exist := usersLoginInfo[token]; exist {
c.JSON(http.StatusOK, Response{StatusCode: 0})
} else {
c.JSON(http.StatusOK, Response{StatusCode: 1, StatusMsg: "User doesn't exist"})
}
}
func FollowList(c *gin.Context) {
c.JSON(http.StatusOK, UserListResponse{
Response: Response{
StatusCode: 0,
},
UserList: Follow_List,
})
}
func FollowerList(c *gin.Context) {
c.JSON(http.StatusOK, UserListResponse{
Response: Response{
StatusCode: 0,
},
UserList: Follower_List,
})
}
func FriendList(c *gin.Context) {
Friend_List = []User{}
fmt.Println("好友列表")
user_id := c.Query("user_id")
id2, err := strconv.Atoi(user_id)
if err != nil {
fmt.Println(err)
}
for _, u := range Follow_List {
status := QueryIsFollow(u.Id, int64(id2))
if status {
Friend_List = append(Friend_List, u)
}
}
for _, u := range Friend_List {
chatKey := genChatKey(int64(id2), u.Id)
tempChat[chatKey] = []Message{}
QueryMessage(int64(id2), u.Id, chatKey)
QueryMessage(u.Id, int64(id2), chatKey)
}
c.JSON(http.StatusOK, UserListResponse{
Response: Response{
StatusCode: 0,
},
UserList: Friend_List,
})
}
当我们深入探究这段代码,可以发现它背后的逻辑和功能的精妙之处。这个代码文件构建了一个简单而实用的社交网络关系管理系统,以下是更详细的分析。
代码开头,通过导入必要的包,我们看到了github.com/gin-gonic/gin的引入,它是一个流行的Golang Web框架,简化了处理HTTP请求和构建API的过程,从而让开发人员能够更专注于核心业务逻辑的实现。
随后定义的UserListResponse结构体,不仅包含了Response字段以封装API响应信息,还有一个UserList字段。这种设计遵循了现代API设计的最佳实践,将响应数据和元数据分开,以增强可读性和可维护性。
removeElement函数的实现体现了Go语言强大的切片操作能力。通过遍历切片中的元素,它找到与目标元素匹配的索引,然后使用切片的切割和追加操作,高效地移除了目标元素。这种做法在大数据量下也能保持良好的性能。
RelationAction函数则承担了处理用户关系的核心逻辑。根据传入的参数,它判断要执行的关系操作类型,如关注或取消关注。在这个过程中,它不仅更新了用户列表中的关注状态,还更新了关注数和粉丝数,这种即时更新可以有效反映用户之间的关系变化。
FollowList、FollowerList和FriendList函数分别处理获取关注列表、粉丝列表和好友列表的请求。这些列表的构建不仅考虑了关注关系,还考虑了相互关注的情况,从而将双向关系更清晰地展示给用户。而为每对好友生成聊天键,并初始化聊天消息列表,则为未来可能的消息功能埋下了伏笔。
在整个代码中,注释的使用使得代码逻辑更加清晰易懂。开发者可以通过注释快速理解每个函数的目的和操作流程,这对于协同开发和代码维护非常有帮助 在代码中,我们可以看到关注(Follow)和粉丝(Follower)之间的双向关系被精心处理。当用户执行关注操作时,不仅仅是更新关注列表,还更新了被关注用户的粉丝列表,这种细致入微的数据同步机制使得用户之间的关系始终保持一致。
值得注意的是,代码通过UserLoginInfo来管理用户登录信息,这可能是一个用于存储用户令牌和相关信息的数据结构。这种机制可以确保用户在进行关注等操作时,处于合法和登录状态,从而加强了系统的安全性和可控性。
在FriendList函数中,通过分析用户之间的关注关系,找出相互关注的用户,形成了好友列表。同时,为每对好友生成一个聊天键,并初始化一个空的聊天消息列表,这种设计为未来的消息功能奠定了基础。用户不仅可以在社交平台上建立关系,还可以通过消息功能进行实时的互动和交流。
此外,代码中的注释是宝贵的说明资源。每个函数都有相应的注释,解释了函数的目的、输入参数和关键步骤,这为其他开发人员理解和协作提供了便利。注释的存在使得代码具备更高的可读性和可维护性,有助于项目的长期发展和维护。 值得一提的是,代码在处理关注关系时,不仅仅是修改数据,还关心着用户的关注状态。通过更新用户的关注状态,代码成功地将逻辑操作和数据状态相结合,体现了面向对象设计的优势。这种设计使得操作和状态变更变得高度内聚,减少了代码出错的可能性。
此外,这个代码片段还体现了对系统性能的关注。在关注和取消关注操作中,它使用了高效的切片操作,以及通过映射表(usersLoginInfo)来管理用户的登录状态。这种关注细节和性能优化使得代码在处理大量用户和数据时仍然能够保持高效稳定。
在实现中,这段代码还考虑了错误处理。通过捕捉错误并进行适当的处理,代码保证了在发生异常情况时,系统可以做出适当的响应,避免了系统崩溃或异常终止。
在本代码片段中,注释起到了重要的角色,解释了每个函数的用途和实现方法。这种注释不仅便于维护者理解代码,还可以作为使用者的文档,使得其他开发人员能够更快速地上手和使用这些功能。
总的来说,这段代码不仅仅是一份源码,更是一个工程艺术的体现。通过合理的设计、高效的数据结构和对关键细节的精心处理,它创造了一个功能强大且可扩展的社交网络关系管理系统。在现代社交媒体的潮流下,这样的系统为人们建立和维护联系提供了重要的基础设施。这段代码的成功不仅在于其功能的实现,更在于其所蕴含的设计智慧,为开发者们提供了一个极佳的示范,展示了如何在Golang和Gin框架下构建出高效、健壮且易于扩展的应用。未来,这种设计哲学将会为更多社交平台的发展提供灵感和借鉴。