课后作业
1.要求
- 支持对话题发布回帖。
- 回帖id生成需要保证不重复、唯一性。
- 新加回帖追加到本地文件,同时需要更新索引,注意Map的并发安全问题
2.实现思路
- 新增两条路由,用于回帖和查看帖子。
- 全局id变量,每次加一,加锁访问√
- 这个暂时没有实现
3.具体代码 新增两个路由用来查看和回帖子
//查看帖子路由 最终将结果存储在变量`data`中。最后,它将结果以JSON格式返回给客户端,状态码为200
r.GET("/community/page/get/:id", func(c *gin.Context) {
topicId := c.Param("id")
data := handler.QueryPageInfo(topicId)
c.JSON(200, data)
})
//回帖路由。将结果存储在变量`data`中。最后,它将结果以JSON格式返回给客户端,状态码为200
r.POST("/community/post/do", func(c *gin.Context) {
uid, _ := c.GetPostForm("uid")
topicId, _ := c.GetPostForm("topic_id")
content, _ := c.GetPostForm("content")
data := handler.PublishPost(uid, topicId, content)
c.JSON(200, data)
})
使用同步锁防止id重复
func ManyGoWait() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(j int) {
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
对于3.新加回帖追加到本地文件,同时需要更新索引,注意Map的并发安全问题 ,由于时间原因需要再想一想,后续会更新方法
最终代码结构
controller视图层
主要负责处理用户输入的数据,并相应相应数据,包含两个文件
-
publish.go用户发布数据的接口,包括发布话题,以及回复
-
query_page_info.go用户查看数据的接口,可查看话题和对应的回复
data数据库
存储数据的文件,因为只是一个简单的项目,所以并没有用到数据库,而是使用文件存储json格式的文件,包含两个文件
post: 所有回复的信息topic:所有话题的信息
repository 数据层
负责数据库的增删改查,为上层提供了简单易用的接口,包含三个文件
-
db_init.go从文件中读取出所有的数据,并存储到对应的Map中,便于后续的查找 -
post.go- 实现了通过话题id查找对应回复
- 实现了新增回复
- 实现了查找id的最大值(用于实现唯一id)
-
topic.go- 实现了通过id查找对应话题
- 实现了新增话题
- 实现了查找id的最大值(用于实现唯一id)
service
处理业务逻辑,对数据层的数据进行处理,并将结果返回给视图层,只包含一个文件
query_page_info.go: 查找话题及相应回复
server.go
-
程序入口,定义路由,处理路由,调用接口响应请求;