diff --git a/route/route.go b/route/route.go index 1846d42..2afc4ca 100644 --- a/route/route.go +++ b/route/route.go @@ -43,15 +43,27 @@ func InitRouter() *gin.Engine { // 不正规的方式是 改成 /v1/users/names,假定 name 也是资源 r.GET("/v1/user/all/name", v1.GetUserAllUserName) - r.GET("/v1/sys/init/check", v1.GetSystemInitCheck) - r.GET("/v1/guide/check", v1.GetGuideCheck) - r.GET("/v1/debug", v1.GetSystemConfigDebug) + // @tiger - 1)不要把同一个词汇按单词来分割。2)同领域的 API 应该放在同路径下。 + r.GET("/v1/sys/init/check", v1.GetSystemInitCheck) // 这里改成 /v1/sys/init_check + r.GET("/v1/guide/check", v1.GetGuideCheck) // 这里改成 /v1/sys/guide_check + r.GET("/v1/debug", v1.GetSystemConfigDebug) // 这里改成 /v1/sys/debug + // @tiger - 如果遵循 RESTful avatar 本身并不是资源,而是属性;资源是 user + // 所以正规的方法是 改成 /v1/user/:id 然后返回 user 对象,具体 avatar 由前端自行抽取 + // 不正规的方式是 改成 /v1/user/:id/avatar,假定 avatar 也是资源 r.GET("/v1/user/avatar/:id", v1.GetUserAvatar) + + // @tiger - 如果遵循 RESTful image 本身并不是资源,而是属性;资源是 user + // 所以正规的方法是 改成 /v1/user/:id 然后返回 user 对象,具体 image 由前端自行抽取 + // 不正规的方式是 改成 /v1/user/:id/image,假定 image 也是资源 r.GET("/v1/user/image", v1.GetUserImage) + // @tiger - 不要把同一个词汇按单词来分割,改成 /v1/sys/socket_port r.GET("/v1/sys/socket/port", v1.GetSystemSocketPort) + + // @tiger - (nice-to-have)开源项目应该删除所有注释代码,增加代码整洁性。或者增加注释说明 //r.POST("/v1/user/refresh/token", v1.PostUserRefreshToken) + v1Group := r.Group("/v1") v1Group.Use(jwt2.JWT()) @@ -59,6 +71,7 @@ func InitRouter() *gin.Engine { v1UserGroup := v1Group.Group("/user") v1UserGroup.Use() { + // @tiger - info 一词名没有指定性,容易产生困扰。改成 /current v1UserGroup.GET("/info", v1.GetUserInfo) v1UserGroup.PUT("/username", v1.PutUserName) v1UserGroup.PUT("/password", v1.PutUserPwd) diff --git a/route/v1/system.go b/route/v1/system.go index 4b57278..51d8d72 100644 --- a/route/v1/system.go +++ b/route/v1/system.go @@ -470,7 +470,7 @@ func GetSystemSocketPort(c *gin.Context) { model.Result{ Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), - Data: config.ServerInfo.SocketPort, + Data: config.ServerInfo.SocketPort, // @tiger 这里最好封装成 {'port': ...} 的形式,来增加出参的上下文 }) } diff --git a/route/v1/user.go b/route/v1/user.go index 1032e51..ab33f77 100644 --- a/route/v1/user.go +++ b/route/v1/user.go @@ -188,6 +188,8 @@ func GetUserAvatar(c *gin.Context) { if user.Id > 0 { path = user.Avatar } + + // @tiger - RESTful 规范下不应该返回文件本身内容,而是返回文件的静态URL,由前端去解析 c.File(path) } @@ -324,13 +326,14 @@ func GetUserInfo(c *gin.Context) { user := service.MyService.User().GetUserInfoById(id) //***** + // @tiger - 应该和 PostUserLogin 中的 user 对象一致。而不是重构一系列字段。 var u = make(map[string]string, 5) - u["user_name"] = user.UserName - u["head"] = user.Avatar + u["user_name"] = user.UserName // 改成 username + u["head"] = user.Avatar // 应该和 /v1/user/avatar/:id 一致,改成 avatar u["email"] = user.Email u["description"] = user.NickName - u["nick_name"] = user.NickName - u["id"] = strconv.Itoa(user.Id) + u["nick_name"] = user.NickName // 改成 nickname + u["id"] = strconv.Itoa(user.Id) // (nice-to-have) 最佳实践是用随机字符来代表 ID。顺序数字有可预测性 //** @@ -596,6 +599,8 @@ func GetUserImage(c *gin.Context) { defer fileTmp.Close() fileName := path.Base(filePath) + + // @tiger - RESTful 规范下不应该返回文件本身内容,而是返回文件的静态URL,由前端去解析 c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url2.PathEscape(fileName)) c.File(filePath) }