瀏覽代碼

first commit

v_grhhuang 9 月之前
當前提交
42df31eac7
共有 75 個文件被更改,包括 4363 次插入0 次删除
  1. 2 0
      .gitignore
  2. 8 0
      .idea/.gitignore
  3. 8 0
      .idea/modules.xml
  4. 9 0
      .idea/slow_wild_api.iml
  5. 16 0
      .vscode/launch.json
  6. 541 0
      api/slow_wild.api
  7. 16 0
      apps/etc/slowwild.yaml
  8. 5 0
      apps/internal/code/errorcode.go
  9. 15 0
      apps/internal/config/config.go
  10. 24 0
      apps/internal/handler/commentdeletehandler.go
  11. 25 0
      apps/internal/handler/createposthandler.go
  12. 25 0
      apps/internal/handler/finduserhandler.go
  13. 25 0
      apps/internal/handler/followuserhandler.go
  14. 25 0
      apps/internal/handler/getfanshandler.go
  15. 25 0
      apps/internal/handler/getfollowshandler.go
  16. 25 0
      apps/internal/handler/getpostcommentlisthandler.go
  17. 25 0
      apps/internal/handler/getposthandler.go
  18. 25 0
      apps/internal/handler/getpostlisthandler.go
  19. 25 0
      apps/internal/handler/getreplylisthandler.go
  20. 25 0
      apps/internal/handler/gettaghandler.go
  21. 25 0
      apps/internal/handler/gettaglisthandler.go
  22. 25 0
      apps/internal/handler/getuserinfohandler.go
  23. 25 0
      apps/internal/handler/getuserpostcollectionlisthandler.go
  24. 25 0
      apps/internal/handler/getuserpostlikelisthandler.go
  25. 25 0
      apps/internal/handler/getuserpostlisthandler.go
  26. 25 0
      apps/internal/handler/getuserprofilehandler.go
  27. 25 0
      apps/internal/handler/loginhandler.go
  28. 25 0
      apps/internal/handler/postcollectionhandler.go
  29. 25 0
      apps/internal/handler/postcommenthandler.go
  30. 25 0
      apps/internal/handler/postcommentupvotehandler.go
  31. 25 0
      apps/internal/handler/postdeletehandler.go
  32. 25 0
      apps/internal/handler/postreplyhandler.go
  33. 25 0
      apps/internal/handler/postsharehandler.go
  34. 25 0
      apps/internal/handler/postupvotehandler.go
  35. 25 0
      apps/internal/handler/registerhandler.go
  36. 177 0
      apps/internal/handler/routes.go
  37. 25 0
      apps/internal/handler/searchusernamehandler.go
  38. 25 0
      apps/internal/handler/unfollowuserhandler.go
  39. 42 0
      apps/internal/logic/commentdeletelogic.go
  40. 30 0
      apps/internal/logic/createpostlogic.go
  41. 30 0
      apps/internal/logic/finduserlogic.go
  42. 30 0
      apps/internal/logic/followuserlogic.go
  43. 30 0
      apps/internal/logic/getfanslogic.go
  44. 30 0
      apps/internal/logic/getfollowslogic.go
  45. 30 0
      apps/internal/logic/getpostcommentlistlogic.go
  46. 30 0
      apps/internal/logic/getpostlistlogic.go
  47. 32 0
      apps/internal/logic/getpostlogic.go
  48. 30 0
      apps/internal/logic/getreplylistlogic.go
  49. 30 0
      apps/internal/logic/gettaglistlogic.go
  50. 30 0
      apps/internal/logic/gettaglogic.go
  51. 30 0
      apps/internal/logic/getuserinfologic.go
  52. 30 0
      apps/internal/logic/getuserpostcollectionlistlogic.go
  53. 30 0
      apps/internal/logic/getuserpostlikelistlogic.go
  54. 30 0
      apps/internal/logic/getuserpostlistlogic.go
  55. 32 0
      apps/internal/logic/getuserprofilelogic.go
  56. 30 0
      apps/internal/logic/loginlogic.go
  57. 30 0
      apps/internal/logic/postcollectionlogic.go
  58. 30 0
      apps/internal/logic/postcommentlogic.go
  59. 30 0
      apps/internal/logic/postcommentupvotelogic.go
  60. 30 0
      apps/internal/logic/postdeletelogic.go
  61. 30 0
      apps/internal/logic/postreplylogic.go
  62. 30 0
      apps/internal/logic/postsharelogic.go
  63. 30 0
      apps/internal/logic/postupvotelogic.go
  64. 30 0
      apps/internal/logic/registerlogic.go
  65. 30 0
      apps/internal/logic/searchusernamelogic.go
  66. 30 0
      apps/internal/logic/unfollowuserlogic.go
  67. 68 0
      apps/internal/middleware/optionaljwtmiddleware.go
  68. 25 0
      apps/internal/response/response.go
  69. 25 0
      apps/internal/svc/servicecontext.go
  70. 461 0
      apps/internal/types/types.go
  71. 32 0
      apps/internal/utils/token.go
  72. 32 0
      apps/slowwild.go
  73. 994 0
      doc/slow_wild.md
  74. 93 0
      go.mod
  75. 281 0
      go.sum

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+./.idea
+./.vscode

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/slow_wild_api.iml" filepath="$PROJECT_DIR$/.idea/slow_wild_api.iml" />
+    </modules>
+  </component>
+</project>

+ 9 - 0
.idea/slow_wild_api.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="Go" enabled="true" />
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 16 - 0
.vscode/launch.json

@@ -0,0 +1,16 @@
+{
+  // 使用 IntelliSense 了解相关属性。 
+  // 悬停以查看现有属性的描述。
+  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+  "version": "0.2.0",
+  "configurations": [
+    {
+      "name": "Launch Package",
+      "type": "go",
+      "request": "launch",
+      "mode": "auto",
+      "program": "${workspaceFolder}/apps",
+      "cwd": "${workspaceFolder}/apps"
+    }
+  ]
+}

+ 541 - 0
api/slow_wild.api

@@ -0,0 +1,541 @@
+syntax = "v1"
+
+info (
+	title:   "SlowWildServer API"
+	desc:    "This is the API definition for SlowWildServer"
+	version: "1.0.0"
+)
+
+type (
+	UserEntity {
+		id                   int64  `json:"id"`
+		avatar               string `json:"avatar"`
+		nickname             string `json:"nickname"`
+		username             string `json:"username"`
+		phone                string `json:"phone"`
+		status               int32  `json:"status"`
+		sex                  int32  `json:"sex"`
+		follows              int64  `json:"follows"`
+		followings           int64  `json:"followings"`
+		get_likes_count      int32  `json:"get_likes_count"`
+		get_collection_count int32  `json:"get_collection_count"`
+	}
+	UserInfo {
+		id       int64  `json:"id"`
+		avatar   string `json:"avatar"`
+		nickname string `json:"nickname"`
+		sex      int32  `json:"sex"`
+	}
+	FollowUserInfo {
+		user             UserInfo `json:"user"`
+		is_mutual_follow bool     `json:"is_mutual_follow"`
+	}
+	LoginAndRegisterRsp {
+		token  string `json:"token"`
+		expire int64  `json:"expire"`
+	}
+	LoginReq {
+		phone      string `json:"phone"`
+		password   string `json:"password"`
+		code       string `json:"code"`
+		login_type int32  `json:"login_type"`
+		login_ip   string `json:"login_ip"`
+	}
+	RegisterReq {
+		phone    string `json:"phone"`
+		nickname string `json:"nickname"`
+		password string `json:"password"`
+		avatar   string `json:"avatar"`
+		sex      int32  `json:"sex"`
+		username string `json:"username"`
+		code     string `json:"code"`
+	}
+	GetUserInfoReq {
+		user_id       int64 `json:"user_id"`
+		query_user_id int64 `json:"query_user_id"`
+	}
+	GetUserInfoResp {
+		id        int64  `json:"id"`
+		avatar    string `json:"avatar"`
+		nickname  string `json:"nickname"`
+		sex       int32  `json:"sex"`
+		is_follow bool   `json:"is_follow"`
+	}
+	FindUserReq {
+		username string  `json:"username"`
+		phone    string  `json:"phone"`
+		ids      []int64 `json:"ids"`
+	}
+	FindUserResp {
+		user_list []UserInfo `json:"user_list"`
+	}
+	FollowUserReq {
+		user_id        int64 `json:"user_id"`
+		follow_user_id int64 `json:"follow_user_id"`
+	}
+	FollowUserRes {
+		success bool `json:"success"`
+	}
+	UnFollowUserReq {
+		user_id           int64 `json:"user_id"`
+		un_follow_user_id int64 `json:"un_follow_user_id"`
+	}
+	UnFollowUserRes {
+		success bool `json:"success"`
+	}
+	GetFollowingReq {
+		user_id       int64 `json:"user_id"`
+		page_size     int32 `json:"page_size"`
+		page          int32 `json:"page"`
+		query_user_id int64 `json:"query_user_id"`
+	}
+	GetFollowingRes {
+		list  []FollowUserInfo `json:"list"`
+		total int64            `json:"total"`
+	}
+	GetFollowReq {
+		user_id       int64 `json:"user_id"`
+		page_size     int32 `json:"page_size"`
+		page          int32 `json:"page"`
+		query_user_id int64 `json:"query_user_id"`
+	}
+	GetFollowRes {
+		list  []FollowUserInfo `json:"list"`
+		total int64            `json:"total"`
+	}
+	GetUserProfileReq {
+		user_id int64 `json:"user_id"`
+	}
+	GetUserProfileRes {
+		id                   int64  `json:"id"`
+		nickname             string `json:"nickname"`
+		username             string `json:"username"`
+		status               int32  `json:"status"`
+		avatar               string `json:"avatar"`
+		phone                string `json:"phone"`
+		tweet_count          int32  `json:"tweet_count"`
+		is_following         bool   `json:"is_following"`
+		created_on           int64  `json:"created_on"`
+		follows              int64  `json:"follows"`
+		fans                 int64  `json:"fans"`
+		get_likes_count      int32  `json:"get_likes_count"`
+		get_collection_count int32  `json:"get_collection_count"`
+		sex                  int32  `json:"sex"`
+	}
+	SearchUsernameReq {
+		keyword   string `json:"keyword"`
+		page      int32  `json:"page"`
+		page_size int32  `json:"page_size"`
+		user_id   int64  `json:"user_id"`
+	}
+	SearchUsernameItem {
+		nickname  string `json:"nickname"`
+		avatar    string `json:"avatar"`
+		id        int64  `json:"id"`
+		sex       int32  `json:"sex"`
+		is_follow bool   `json:"is_follow"`
+	}
+	SearchUsernameRes {
+		list  []SearchUsernameItem `json:"list"`
+		total int64                `json:"total"`
+	}
+	CreateTag {
+		name string `json:"name"`
+		id   int64  `json:"id"`
+	}
+	CreatePostReq {
+		user_id     int64       `json:"user_id"`
+		title       string      `json:"title"`
+		content     string      `json:"content"`
+		tags        []CreateTag `json:"tags"`
+		at_user_ids []int64     `json:"at_user_ids"`
+		post_type   int32       `json:"post_type"`
+		visibility  int32       `json:"visibility"`
+		images      []string    `json:"images"`
+		video_cover string      `json:"video_cover"`
+		video_url   string      `json:"video_url"`
+		ip          string      `json:"ip"`
+		ip_loc      string      `json:"ip_loc"`
+	}
+	CreatePostRsp {
+		post_id int64 `json:"post_id"`
+	}
+	GetTagListReq {
+		page      int32  `json:"page"`
+		page_size int32  `json:"page_size"`
+		tag_name  string `json:"tag_name"`
+		sort_by   int32  `json:"sort_by"`
+	}
+	TagItem {
+		name       string   `json:"name"`
+		hot_num    int64    `json:"hot_num"`
+		user       UserInfo `json:"user"`
+		id         int64    `json:"id"`
+		created_on int64    `json:"created_on"`
+	}
+	GetTagListRsp {
+		tag_list []TagItem `json:"tag_list"`
+		total    int32     `json:"total"`
+	}
+	GetTagReq {
+		tag_id  int64 `json:"tag_id"`
+		user_id int64 `json:"user_id"`
+	}
+	GetTagRsp {
+		name         string   `json:"name"`
+		hot_num      int64    `json:"hot_num"`
+		user         UserInfo `json:"user"`
+		id           int64    `json:"id"`
+		created_on   int64    `json:"created_on"`
+		post_count   int64    `json:"post_count"`
+		follow_count int64    `json:"follow_count"`
+		is_followed  bool     `json:"is_followed"`
+	}
+	GetPostListReq {
+		page        int32  `json:"page"`
+		page_size   int32  `json:"page_size"`
+		search_type int32  `json:"search_type"`
+		sort_type   int32  `json:"sort_type"`
+		keyword     string `json:"keyword"`
+		user_id     int64  `json:"user_id"`
+	}
+	GetPostListItem {
+		id               int64     `json:"id"`
+		user             UserInfo  `json:"user"`
+		title            string    `json:"title"`
+		content_summary  string    `json:"content_summary"`
+		post_type        int32     `json:"post_type"`
+		comment_count    int64     `json:"comment_count"`
+		upvote_count     int64     `json:"upvote_count"`
+		collection_count int64     `json:"collection_count"`
+		share_count      int64     `json:"share_count"`
+		visibility       int32     `json:"visibility"`
+		ip_loc           string    `json:"ip_loc"`
+		hot_num          int64     `json:"hot_num"`
+		images           []string  `json:"images"`
+		video_url        string    `json:"video_url"`
+		video_cover      string    `json:"video_cover"`
+		created_on       int64     `json:"created_on"`
+		tags             []TagItem `json:"tags"`
+		is_liked         bool      `json:"is_liked"`
+		is_collected     bool      `json:"is_collected"`
+		is_mine          bool      `json:"is_mine"`
+	}
+	GetPostListRsp {
+		list  []GetPostListItem `json:"list"`
+		total int64             `json:"total"`
+	}
+	GetPostReq {
+		user_id int64 `json:"user_id"`
+		post_id int64 `json:"post_id"`
+	}
+	GetPostRsp {
+		id                int64      `json:"id"`
+		user              UserInfo   `json:"user"`
+		title             string     `json:"title"`
+		content_summary   string     `json:"content_summary"`
+		post_type         int32      `json:"post_type"`
+		comment_count     int64      `json:"comment_count"`
+		upvote_count      int64      `json:"upvote_count"`
+		collection_count  int64      `json:"collection_count"`
+		share_count       int64      `json:"share_count"`
+		visibility        int32      `json:"visibility"`
+		ip_loc            string     `json:"ip_loc"`
+		hot_num           int64      `json:"hot_num"`
+		images            []string   `json:"images"`
+		video_url         string     `json:"video_url"`
+		video_cover       string     `json:"video_cover"`
+		content           string     `json:"content"`
+		created_on        int64      `json:"created_on"`
+		tags              []TagItem  `json:"tags"`
+		with_user         []UserInfo `json:"with_user"`
+		latest_replied_on int64      `json:"latest_replied_on"`
+		is_liked          bool       `json:"is_liked"`
+		is_collected      bool       `json:"is_collected"`
+		is_mine           bool       `json:"is_mine"`
+	}
+	PostUpvoteReq {
+		post_id int64 `json:"post_id"`
+		user_id int64 `json:"user_id"`
+	}
+	PostUpvoteRsp {
+		success bool `json:"success"`
+	}
+	PostCollectionReq {
+		post_id int64 `json:"post_id"`
+		user_id int64 `json:"user_id"`
+	}
+	PostCollectionRsp {
+		success bool `json:"success"`
+	}
+	PostShareReq {
+		post_id int64 `json:"post_id"`
+		user_id int64 `json:"user_id"`
+	}
+	PostShareRsp {
+		success bool `json:"success"`
+	}
+	PostCommentReq {
+		post_id    int64  `json:"post_id"`
+		user_id    int64  `json:"user_id"`
+		content    string `json:"content"`
+		image      string `json:"image"`
+		at_user_id int64  `json:"at_user_id"`
+		ip         string `json:"ip"`
+		ip_loc     string `json:"ip_loc"`
+	}
+	PostCommentRsp {
+		comment_id int64 `json:"comment_id"`
+	}
+	PostReplyReq {
+		post_id     int64  `json:"post_id"`
+		user_id     int64  `json:"user_id"`
+		content     string `json:"content"`
+		image       string `json:"image"`
+		at_user_id  int64  `json:"at_user_id"`
+		ip          string `json:"ip"`
+		ip_loc      string `json:"ip_loc"`
+		comment_id  int64  `json:"comment_id"`
+		to_reply_id int64  `json:"to_reply_id"`
+	}
+	PostReplyRsp {
+		reply_id int64 `json:"reply_id"`
+	}
+	GetPostCommentListReq {
+		page      int32 `json:"page"`
+		page_size int32 `json:"page_size"`
+		post_id   int64 `json:"post_id"`
+		user_id   int64 `json:"user_id"`
+	}
+	RepliesItem {
+		id           int64      `json:"id"`
+		post_id      int64      `json:"post_id"`
+		user         UserInfo   `json:"user"`
+		ip_loc       string     `json:"ip_loc"`
+		content      string     `json:"content"`
+		image        string     `json:"image"`
+		with_user    []UserInfo `json:"with_user"`
+		upvote_count int64      `json:"upvote_count"`
+		is_liked     bool       `json:"is_liked"`
+		is_mine      bool       `json:"is_mine"`
+		created_on   int64      `json:"created_on"`
+	}
+	CommentItem {
+		id           int64         `json:"id"`
+		post_id      int64         `json:"post_id"`
+		user         UserInfo      `json:"user"`
+		ip_loc       string        `json:"ip_loc"`
+		content      string        `json:"content"`
+		image        string        `json:"image"`
+		with_user    []UserInfo    `json:"with_user"`
+		reply_count  int64         `json:"reply_count"`
+		upvote_count int64         `json:"upvote_count"`
+		reply_item   []RepliesItem `json:"reply_item"`
+		is_liked     bool          `json:"is_liked"`
+		is_mine      bool          `json:"is_mine"`
+		created_on   int64         `json:"created_on"`
+	}
+	GetPostCommentListRsp {
+		list  []CommentItem `json:"list"`
+		total int64         `json:"total"`
+	}
+	GetReplyListReq {
+		page       int32 `json:"page"`
+		page_size  int32 `json:"page_size"`
+		comment_id int64 `json:"comment_id"`
+		user_id    int64 `json:"user_id"`
+	}
+	GetReplyListRsp {
+		list  []RepliesItem `json:"list"`
+		total int64         `json:"total"`
+	}
+	PostCommentUpvoteReq {
+		user_id      int64 `json:"user_id"`
+		comment_id   int64 `json:"comment_id"`
+		comment_type int32 `json:"comment_type"`
+	}
+	PostCommentUpvoteRsp {
+		success bool `json:"success"`
+	}
+	PostDeleteReq {
+		user_id int64 `json:"user_id"`
+		post_id int64 `json:"post_id"`
+	}
+	PostDeleteRsp {
+		success bool `json:"success"`
+	}
+	CommentDeleteReq {
+		user_id      int64 `json:"user_id"`
+		comment_id   int64 `json:"comment_id"`
+		comment_type int32 `json:"comment_type"`
+	}
+	CommentDeleteRsp {
+		success bool `json:"success"`
+	}
+	GetUserPostListReq {
+		user_id       int64 `json:"user_id"`
+		page          int64 `json:"page"`
+		page_size     int64 `json:"page_size"`
+		query_user_id int64 `json:"query_user_id"`
+	}
+	GetUserPostListRsp {
+		list  []GetPostListItem `json:"list"`
+		total int64             `json:"total"`
+	}
+	GetUserPostCollectionListReq {
+		user_id       int64 `json:"user_id"`
+		page          int64 `json:"page"`
+		page_size     int64 `json:"page_size"`
+		query_user_id int64 `json:"query_user_id"`
+	}
+	GetUserPostCollectionListRsp {
+		list  []GetPostListItem `json:"list"`
+		total int64             `json:"total"`
+	}
+	GetUserPostLikeListReq {
+		user_id       int64 `json:"user_id"`
+		page          int64 `json:"page"`
+		page_size     int64 `json:"page_size"`
+		query_user_id int64 `json:"query_user_id"`
+	}
+	GetUserPostLikeListRsp {
+		list  []GetPostListItem `json:"list"`
+		total int64             `json:"total"`
+	}
+)
+
+@server (
+	perfix: /v1
+)
+service slowwild {
+	@doc "登录方法"
+	@handler login
+	post /api/user/login (LoginReq) returns (LoginAndRegisterRsp)
+
+	@doc "用户注册"
+	@handler register
+	post /api/user/register (RegisterReq) returns (LoginAndRegisterRsp)
+}
+
+@server (
+	perfix: /v1
+	jwt:    Auth // 开启 jwt 认证
+)
+service slowwild {
+	@doc "获取用户信息"
+	@handler getUserInfo
+	get /api/user/info (GetUserInfoReq) returns (GetUserInfoResp)
+
+	@doc "查询用户"
+	@handler findUser
+	post /api/user/find (FindUserReq) returns (FindUserResp)
+
+	@doc "关注用户"
+	@handler followUser
+	post /api/user/follow (FollowUserReq) returns (FollowUserRes)
+
+	@doc "取消关注用户"
+	@handler unfollowUser
+	post /api/user/unfollow (UnFollowUserReq) returns (UnFollowUserRes)
+
+	@doc "获取粉丝"
+	@handler getFans
+	get /api/user/fans (GetFollowingReq) returns (GetFollowingRes)
+
+	@doc "获取关注列表"
+	@handler getFollows
+	get /api/user/follows (GetFollowReq) returns (GetFollowRes)
+
+	@doc "获取用户信息"
+	@handler getUserProfile
+	get /api/user/profile (GetUserProfileReq) returns (GetUserProfileRes)
+
+	@doc "搜索用户"
+	@handler searchUsername
+	get /api/user/search (SearchUsernameReq) returns (SearchUsernameRes)
+}
+
+@server (
+	perfix: /v1
+	jwt:    Auth
+)
+service slowwild {
+	@doc "创建帖子"
+	@handler createPost
+	post /api/post/create (CreatePostReq) returns (CreatePostRsp)
+
+	@doc "帖子点赞"
+	@handler postUpvote
+	post /api/post/upvote (PostUpvoteReq) returns (PostUpvoteRsp)
+
+	@doc "帖子收藏"
+	@handler postCollection
+	post /api/post/collection (PostCollectionReq) returns (PostCollectionRsp)
+
+	@doc "帖子分享"
+	@handler postShare
+	post /api/post/share (PostShareReq) returns (PostShareRsp)
+
+	@doc "发布评论"
+	@handler postComment
+	post /api/post/comment (PostCommentReq) returns (PostCommentRsp)
+
+	@doc "回复评论"
+	@handler postReply
+	post /api/post/reply (PostReplyReq) returns (PostReplyRsp)
+
+	@doc "评论点赞"
+	@handler postCommentUpvote
+	post /api/post/comment/upvote (PostCommentUpvoteReq) returns (PostCommentUpvoteRsp)
+
+	@doc "帖子删除"
+	@handler postDelete
+	post /api/post/delete (PostDeleteReq) returns (PostDeleteRsp)
+
+	@doc "评论删除"
+	@handler commentDelete
+	post /api/comment/delete (CommentDeleteReq) returns (CommentDeleteRsp)
+}
+
+@server (
+	perfix:     /v1
+	middleware: OptionalJwtMiddleware
+)
+service slowwild {
+	@doc "获取话题列表"
+	@handler getTagList
+	get /api/tag/list (GetTagListReq) returns (GetTagListRsp)
+
+	@doc "获取话题详情"
+	@handler getTag
+	get /api/tag (GetTagReq) returns (GetTagRsp)
+
+	@doc "获取帖子列表"
+	@handler getPostList
+	get /api/post/list (GetPostListReq) returns (GetPostListRsp)
+
+	@doc "获取帖子详情"
+	@handler getPost
+	get /api/post (GetPostReq) returns (GetPostRsp)
+
+	@doc "获取评论列表"
+	@handler getPostCommentList
+	get /api/post/comment/list (GetPostCommentListReq) returns (GetPostCommentListRsp)
+
+	@doc "获取回复列表"
+	@handler getReplyList
+	get /api/post/reply/list (GetReplyListReq) returns (GetReplyListRsp)
+
+	@doc "获取用户发布的帖子列表"
+	@handler getUserPostList
+	get /api/user/post/list (GetUserPostListReq) returns (GetUserPostListRsp)
+
+	@doc "获取用户收藏的帖子列表"
+	@handler getUserPostCollectionList
+	get /api/user/post/collection/list (GetUserPostCollectionListReq) returns (GetUserPostCollectionListRsp)
+
+	@doc "获取用户点赞的帖子列表"
+	@handler getUserPostLikeList
+	get /api/user/post/like/list (GetUserPostLikeListReq) returns (GetUserPostLikeListRsp)
+}
+

+ 16 - 0
apps/etc/slowwild.yaml

@@ -0,0 +1,16 @@
+Name: slowwild
+Host: 0.0.0.0
+Port: 8888
+
+SlowwildRpc:
+  Etcd:
+    Hosts:
+      - 121.11.99.220:3379
+    User: root
+    Pass: huang1205@@
+    Key: slowwildserver
+
+Auth:
+  AccessSecret: "bejson822834"
+  AccessExpire: 3600
+

+ 5 - 0
apps/internal/code/errorcode.go

@@ -0,0 +1,5 @@
+package code
+
+const (
+	JWTAuthField = 10001
+)

+ 15 - 0
apps/internal/config/config.go

@@ -0,0 +1,15 @@
+package config
+
+import (
+	"github.com/zeromicro/go-zero/rest"
+	"github.com/zeromicro/go-zero/zrpc"
+)
+
+type Config struct {
+	rest.RestConf
+	Auth struct {
+		AccessSecret string
+		AccessExpire int64
+	}
+	SlowwildRpc zrpc.RpcClientConf
+}

+ 24 - 0
apps/internal/handler/commentdeletehandler.go

@@ -0,0 +1,24 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func commentDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.CommentDeleteReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewCommentDeleteLogic(r.Context(), svcCtx)
+		resp, err := l.CommentDelete(&req)
+		response.Response(w, resp, err)
+	}
+}

+ 25 - 0
apps/internal/handler/createposthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func createPostHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.CreatePostReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewCreatePostLogic(r.Context(), svcCtx)
+		resp, err := l.CreatePost(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/finduserhandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func findUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.FindUserReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewFindUserLogic(r.Context(), svcCtx)
+		resp, err := l.FindUser(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/followuserhandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func followUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.FollowUserReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewFollowUserLogic(r.Context(), svcCtx)
+		resp, err := l.FollowUser(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getfanshandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getFansHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetFollowingReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetFansLogic(r.Context(), svcCtx)
+		resp, err := l.GetFans(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getfollowshandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getFollowsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetFollowReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetFollowsLogic(r.Context(), svcCtx)
+		resp, err := l.GetFollows(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getpostcommentlisthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getPostCommentListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetPostCommentListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetPostCommentListLogic(r.Context(), svcCtx)
+		resp, err := l.GetPostCommentList(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getposthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getPostHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetPostReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetPostLogic(r.Context(), svcCtx)
+		resp, err := l.GetPost(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getpostlisthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getPostListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetPostListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetPostListLogic(r.Context(), svcCtx)
+		resp, err := l.GetPostList(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getreplylisthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getReplyListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetReplyListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetReplyListLogic(r.Context(), svcCtx)
+		resp, err := l.GetReplyList(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/gettaghandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getTagHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetTagReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetTagLogic(r.Context(), svcCtx)
+		resp, err := l.GetTag(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/gettaglisthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getTagListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetTagListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetTagListLogic(r.Context(), svcCtx)
+		resp, err := l.GetTagList(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getuserinfohandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getUserInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetUserInfoReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetUserInfoLogic(r.Context(), svcCtx)
+		resp, err := l.GetUserInfo(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getuserpostcollectionlisthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getUserPostCollectionListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetUserPostCollectionListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetUserPostCollectionListLogic(r.Context(), svcCtx)
+		resp, err := l.GetUserPostCollectionList(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getuserpostlikelisthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getUserPostLikeListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetUserPostLikeListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetUserPostLikeListLogic(r.Context(), svcCtx)
+		resp, err := l.GetUserPostLikeList(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getuserpostlisthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getUserPostListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetUserPostListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetUserPostListLogic(r.Context(), svcCtx)
+		resp, err := l.GetUserPostList(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/getuserprofilehandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func getUserProfileHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GetUserProfileReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewGetUserProfileLogic(r.Context(), svcCtx)
+		resp, err := l.GetUserProfile(&req)
+		response.Response(w, resp, err) 
+
+	}
+}

+ 25 - 0
apps/internal/handler/loginhandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func loginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.LoginReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewLoginLogic(r.Context(), svcCtx)
+		resp, err := l.Login(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/postcollectionhandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func postCollectionHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PostCollectionReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewPostCollectionLogic(r.Context(), svcCtx)
+		resp, err := l.PostCollection(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/postcommenthandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func postCommentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PostCommentReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewPostCommentLogic(r.Context(), svcCtx)
+		resp, err := l.PostComment(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/postcommentupvotehandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func postCommentUpvoteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PostCommentUpvoteReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewPostCommentUpvoteLogic(r.Context(), svcCtx)
+		resp, err := l.PostCommentUpvote(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/postdeletehandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func postDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PostDeleteReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewPostDeleteLogic(r.Context(), svcCtx)
+		resp, err := l.PostDelete(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/postreplyhandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func postReplyHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PostReplyReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewPostReplyLogic(r.Context(), svcCtx)
+		resp, err := l.PostReply(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/postsharehandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func postShareHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PostShareReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewPostShareLogic(r.Context(), svcCtx)
+		resp, err := l.PostShare(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/postupvotehandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func postUpvoteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PostUpvoteReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewPostUpvoteLogic(r.Context(), svcCtx)
+		resp, err := l.PostUpvote(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/registerhandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func registerHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.RegisterReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewRegisterLogic(r.Context(), svcCtx)
+		resp, err := l.Register(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 177 - 0
apps/internal/handler/routes.go

@@ -0,0 +1,177 @@
+// Code generated by goctl. DO NOT EDIT.
+package handler
+
+import (
+	"net/http"
+
+	"slow_wild_api/apps/internal/svc"
+
+	"github.com/zeromicro/go-zero/rest"
+)
+
+func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
+	server.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/user/login",
+				Handler: loginHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/user/register",
+				Handler: registerHandler(serverCtx),
+			},
+		},
+	)
+
+	server.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/user/fans",
+				Handler: getFansHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/user/find",
+				Handler: findUserHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/user/follow",
+				Handler: followUserHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/user/follows",
+				Handler: getFollowsHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/user/info",
+				Handler: getUserInfoHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/user/profile",
+				Handler: getUserProfileHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodGet,
+				Path:    "/api/user/search",
+				Handler: searchUsernameHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/user/unfollow",
+				Handler: unfollowUserHandler(serverCtx),
+			},
+		},
+		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),
+	)
+
+	server.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/comment/delete",
+				Handler: commentDeleteHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/collection",
+				Handler: postCollectionHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/comment",
+				Handler: postCommentHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/comment/upvote",
+				Handler: postCommentUpvoteHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/create",
+				Handler: createPostHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/delete",
+				Handler: postDeleteHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/reply",
+				Handler: postReplyHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/share",
+				Handler: postShareHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/api/post/upvote",
+				Handler: postUpvoteHandler(serverCtx),
+			},
+		},
+		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),
+	)
+
+	server.AddRoutes(
+		rest.WithMiddlewares(
+			[]rest.Middleware{serverCtx.OptionalJwtMiddleware},
+			[]rest.Route{
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/post",
+					Handler: getPostHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/post/comment/list",
+					Handler: getPostCommentListHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/post/list",
+					Handler: getPostListHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/post/reply/list",
+					Handler: getReplyListHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/tag",
+					Handler: getTagHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/tag/list",
+					Handler: getTagListHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/user/post/collection/list",
+					Handler: getUserPostCollectionListHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/user/post/like/list",
+					Handler: getUserPostLikeListHandler(serverCtx),
+				},
+				{
+					Method:  http.MethodGet,
+					Path:    "/api/user/post/list",
+					Handler: getUserPostListHandler(serverCtx),
+				},
+			}...,
+		),
+	)
+}

+ 25 - 0
apps/internal/handler/searchusernamehandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func searchUsernameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.SearchUsernameReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewSearchUsernameLogic(r.Context(), svcCtx)
+		resp, err := l.SearchUsername(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 25 - 0
apps/internal/handler/unfollowuserhandler.go

@@ -0,0 +1,25 @@
+package handler
+
+import (
+	"github.com/zeromicro/go-zero/rest/httpx"
+	"net/http"
+	"slow_wild_api/apps/internal/logic"
+	"slow_wild_api/apps/internal/response"
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+)
+
+func unfollowUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.UnFollowUserReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewUnfollowUserLogic(r.Context(), svcCtx)
+		resp, err := l.UnfollowUser(&req)
+		response.Response(w, resp, err) //②
+
+	}
+}

+ 42 - 0
apps/internal/logic/commentdeletelogic.go

@@ -0,0 +1,42 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type CommentDeleteLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewCommentDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CommentDeleteLogic {
+	return &CommentDeleteLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *CommentDeleteLogic) CommentDelete(req *types.CommentDeleteReq) (resp *types.CommentDeleteRsp, err error) {
+	resp = &types.CommentDeleteRsp{
+		Success: false,
+	}
+	res, dErr := l.svcCtx.SlowWildPb.CommentDelete(l.ctx, &slowwildserver.CommentDeleteReq{
+		CommentId:   req.Comment_id,
+		CommentType: req.Comment_type,
+	})
+	if dErr != nil {
+		return nil, dErr
+	}
+	if res.Success {
+		resp.Success = true
+	}
+	return
+}

+ 30 - 0
apps/internal/logic/createpostlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type CreatePostLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewCreatePostLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreatePostLogic {
+	return &CreatePostLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *CreatePostLogic) CreatePost(req *types.CreatePostReq) (resp *types.CreatePostRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/finduserlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type FindUserLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewFindUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FindUserLogic {
+	return &FindUserLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *FindUserLogic) FindUser(req *types.FindUserReq) (resp *types.FindUserResp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/followuserlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type FollowUserLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewFollowUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FollowUserLogic {
+	return &FollowUserLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *FollowUserLogic) FollowUser(req *types.FollowUserReq) (resp *types.FollowUserRes, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getfanslogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetFansLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetFansLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetFansLogic {
+	return &GetFansLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetFansLogic) GetFans(req *types.GetFollowingReq) (resp *types.GetFollowingRes, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getfollowslogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetFollowsLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetFollowsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetFollowsLogic {
+	return &GetFollowsLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetFollowsLogic) GetFollows(req *types.GetFollowReq) (resp *types.GetFollowRes, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getpostcommentlistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetPostCommentListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetPostCommentListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPostCommentListLogic {
+	return &GetPostCommentListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetPostCommentListLogic) GetPostCommentList(req *types.GetPostCommentListReq) (resp *types.GetPostCommentListRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getpostlistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetPostListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetPostListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPostListLogic {
+	return &GetPostListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetPostListLogic) GetPostList(req *types.GetPostListReq) (resp *types.GetPostListRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 32 - 0
apps/internal/logic/getpostlogic.go

@@ -0,0 +1,32 @@
+package logic
+
+import (
+	"context"
+	"fmt"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetPostLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetPostLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPostLogic {
+	return &GetPostLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetPostLogic) GetPost(req *types.GetPostReq) (resp *types.GetPostRsp, err error) {
+	value := l.ctx.Value("user_id")
+	fmt.Println("存储的字段是:", value)
+
+	return
+}

+ 30 - 0
apps/internal/logic/getreplylistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetReplyListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetReplyListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetReplyListLogic {
+	return &GetReplyListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetReplyListLogic) GetReplyList(req *types.GetReplyListReq) (resp *types.GetReplyListRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/gettaglistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetTagListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetTagListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetTagListLogic {
+	return &GetTagListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetTagListLogic) GetTagList(req *types.GetTagListReq) (resp *types.GetTagListRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/gettaglogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetTagLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetTagLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetTagLogic {
+	return &GetTagLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetTagLogic) GetTag(req *types.GetTagReq) (resp *types.GetTagRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getuserinfologic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetUserInfoLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserInfoLogic {
+	return &GetUserInfoLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetUserInfoLogic) GetUserInfo(req *types.GetUserInfoReq) (resp *types.GetUserInfoResp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getuserpostcollectionlistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetUserPostCollectionListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetUserPostCollectionListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserPostCollectionListLogic {
+	return &GetUserPostCollectionListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetUserPostCollectionListLogic) GetUserPostCollectionList(req *types.GetUserPostCollectionListReq) (resp *types.GetUserPostCollectionListRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getuserpostlikelistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetUserPostLikeListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetUserPostLikeListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserPostLikeListLogic {
+	return &GetUserPostLikeListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetUserPostLikeListLogic) GetUserPostLikeList(req *types.GetUserPostLikeListReq) (resp *types.GetUserPostLikeListRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/getuserpostlistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetUserPostListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetUserPostListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserPostListLogic {
+	return &GetUserPostListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetUserPostListLogic) GetUserPostList(req *types.GetUserPostListReq) (resp *types.GetUserPostListRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 32 - 0
apps/internal/logic/getuserprofilelogic.go

@@ -0,0 +1,32 @@
+package logic
+
+import (
+	"context"
+	"fmt"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetUserProfileLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGetUserProfileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserProfileLogic {
+	return &GetUserProfileLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *GetUserProfileLogic) GetUserProfile(req *types.GetUserProfileReq) (resp *types.GetUserProfileRes, err error) {
+	value := l.ctx.Value("user_id")
+	fmt.Println("存储的字段是:", value)
+
+	return
+}

+ 30 - 0
apps/internal/logic/loginlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type LoginLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginLogic {
+	return &LoginLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.LoginAndRegisterRsp, err error) {
+	// todo: add your logic here and delete this line
+	
+	return
+}

+ 30 - 0
apps/internal/logic/postcollectionlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type PostCollectionLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPostCollectionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostCollectionLogic {
+	return &PostCollectionLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PostCollectionLogic) PostCollection(req *types.PostCollectionReq) (resp *types.PostCollectionRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/postcommentlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type PostCommentLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPostCommentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostCommentLogic {
+	return &PostCommentLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PostCommentLogic) PostComment(req *types.PostCommentReq) (resp *types.PostCommentRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/postcommentupvotelogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type PostCommentUpvoteLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPostCommentUpvoteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostCommentUpvoteLogic {
+	return &PostCommentUpvoteLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PostCommentUpvoteLogic) PostCommentUpvote(req *types.PostCommentUpvoteReq) (resp *types.PostCommentUpvoteRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/postdeletelogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type PostDeleteLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPostDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostDeleteLogic {
+	return &PostDeleteLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PostDeleteLogic) PostDelete(req *types.PostDeleteReq) (resp *types.PostDeleteRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/postreplylogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type PostReplyLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPostReplyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostReplyLogic {
+	return &PostReplyLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PostReplyLogic) PostReply(req *types.PostReplyReq) (resp *types.PostReplyRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/postsharelogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type PostShareLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPostShareLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostShareLogic {
+	return &PostShareLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PostShareLogic) PostShare(req *types.PostShareReq) (resp *types.PostShareRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/postupvotelogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type PostUpvoteLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPostUpvoteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PostUpvoteLogic {
+	return &PostUpvoteLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PostUpvoteLogic) PostUpvote(req *types.PostUpvoteReq) (resp *types.PostUpvoteRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/registerlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type RegisterLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewRegisterLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RegisterLogic {
+	return &RegisterLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *RegisterLogic) Register(req *types.RegisterReq) (resp *types.LoginAndRegisterRsp, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/searchusernamelogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SearchUsernameLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewSearchUsernameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SearchUsernameLogic {
+	return &SearchUsernameLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *SearchUsernameLogic) SearchUsername(req *types.SearchUsernameReq) (resp *types.SearchUsernameRes, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 30 - 0
apps/internal/logic/unfollowuserlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"slow_wild_api/apps/internal/svc"
+	"slow_wild_api/apps/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UnfollowUserLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewUnfollowUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UnfollowUserLogic {
+	return &UnfollowUserLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *UnfollowUserLogic) UnfollowUser(req *types.UnFollowUserReq) (resp *types.UnFollowUserRes, err error) {
+	// todo: add your logic here and delete this line
+
+	return
+}

+ 68 - 0
apps/internal/middleware/optionaljwtmiddleware.go

@@ -0,0 +1,68 @@
+package middleware
+
+import (
+	"context"
+	"errors"
+	"net/http"
+	"strings"
+
+	"github.com/golang-jwt/jwt/v4"
+)
+
+const (
+	jwtAudience    = "aud"
+	jwtExpire      = "exp"
+	jwtId          = "jti"
+	jwtIssueAt     = "iat"
+	jwtIssuer      = "iss"
+	jwtNotBefore   = "nbf"
+	jwtSubject     = "sub"
+	noDetailReason = "no detail reason"
+)
+
+type OptionalJwtMiddleware struct {
+	Secret string
+}
+
+func NewOptionalJwtMiddleware(secret string) *OptionalJwtMiddleware {
+	return &OptionalJwtMiddleware{
+		Secret: secret,
+	}
+}
+
+func (m *OptionalJwtMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		// 尝试从请求头中获取 JWT 令牌
+		tokenString := r.Header.Get("Authorization")
+		ctx := r.Context()
+		if len(tokenString) > 0 {
+			// 如果提供了 JWT 令牌,则验证它
+			tokenValue := strings.Split(tokenString, " ")
+
+			if len(tokenValue) == 2 {
+				parsedToken, err := jwt.Parse(tokenValue[1], func(token *jwt.Token) (interface{}, error) {
+					if _, ok := token.Method.(*jwt.SigningMethodHMAC); ok {
+						return []byte(m.Secret), nil
+					}
+					return nil, errors.New("failed to parse token")
+				})
+
+				if err == nil {
+					if claims, ok := parsedToken.Claims.(jwt.MapClaims); ok && parsedToken.Valid {
+						// 将解析到的 claims 添加到请求上下文中
+						for k, v := range claims {
+							switch k {
+							case jwtAudience, jwtExpire, jwtId, jwtIssueAt, jwtIssuer, jwtNotBefore, jwtSubject:
+								// ignore the standard claims
+							default:
+								ctx = context.WithValue(ctx, k, v)
+							}
+						}
+					}
+				}
+			}
+		}
+		newReq := r.WithContext(ctx)
+		next(w, newReq)
+	}
+}

+ 25 - 0
apps/internal/response/response.go

@@ -0,0 +1,25 @@
+package response
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+type Body struct {
+	Code int         `json:"code"`
+	Msg  string      `json:"msg"`
+	Data interface{} `json:"data,omitempty"`
+}
+
+func Response(w http.ResponseWriter, resp interface{}, err error) {
+	var body Body
+	if err != nil {
+		body.Code = -1
+		body.Msg = err.Error()
+	} else {
+		body.Msg = "OK"
+		body.Data = resp
+	}
+	httpx.OkJson(w, body)
+}

+ 25 - 0
apps/internal/svc/servicecontext.go

@@ -0,0 +1,25 @@
+package svc
+
+import (
+	"slow_wild_api/apps/internal/config"
+	"slow_wild_api/apps/internal/middleware"
+
+	"git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserverclient"
+	"github.com/zeromicro/go-zero/rest"
+)
+
+type ServiceContext struct {
+	Config     config.Config
+	SlowWildPb slowwildserverclient.SlowWildServer
+
+	OptionalJwtMiddleware rest.Middleware
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	return &ServiceContext{
+		Config: c,
+		// SlowWildPb: slowwildserverclient.NewSlowWildServer(zrpc.MustNewClient(c.SlowwildRpc)),
+		// 定义可选的 JWT 中间件
+		OptionalJwtMiddleware: middleware.NewOptionalJwtMiddleware(c.Auth.AccessSecret).Handle,
+	}
+}

+ 461 - 0
apps/internal/types/types.go

@@ -0,0 +1,461 @@
+// Code generated by goctl. DO NOT EDIT.
+package types
+
+type CommentDeleteReq struct {
+	User_id      int64 `json:"user_id"`
+	Comment_id   int64 `json:"comment_id"`
+	Comment_type int32 `json:"comment_type"`
+}
+
+type CommentDeleteRsp struct {
+	Success bool `json:"success"`
+}
+
+type CommentItem struct {
+	Id           int64         `json:"id"`
+	Post_id      int64         `json:"post_id"`
+	User         UserInfo      `json:"user"`
+	Ip_loc       string        `json:"ip_loc"`
+	Content      string        `json:"content"`
+	Image        string        `json:"image"`
+	With_user    []UserInfo    `json:"with_user"`
+	Reply_count  int64         `json:"reply_count"`
+	Upvote_count int64         `json:"upvote_count"`
+	Reply_item   []RepliesItem `json:"reply_item"`
+	Is_liked     bool          `json:"is_liked"`
+	Is_mine      bool          `json:"is_mine"`
+	Created_on   int64         `json:"created_on"`
+}
+
+type CreatePostReq struct {
+	User_id     int64       `json:"user_id"`
+	Title       string      `json:"title"`
+	Content     string      `json:"content"`
+	Tags        []CreateTag `json:"tags"`
+	At_user_ids []int64     `json:"at_user_ids"`
+	Post_type   int32       `json:"post_type"`
+	Visibility  int32       `json:"visibility"`
+	Images      []string    `json:"images"`
+	Video_cover string      `json:"video_cover"`
+	Video_url   string      `json:"video_url"`
+	Ip          string      `json:"ip"`
+	Ip_loc      string      `json:"ip_loc"`
+}
+
+type CreatePostRsp struct {
+	Post_id int64 `json:"post_id"`
+}
+
+type CreateTag struct {
+	Name string `json:"name"`
+	Id   int64  `json:"id"`
+}
+
+type FindUserReq struct {
+	Username string  `json:"username"`
+	Phone    string  `json:"phone"`
+	Ids      []int64 `json:"ids"`
+}
+
+type FindUserResp struct {
+	User_list []UserInfo `json:"user_list"`
+}
+
+type FollowUserInfo struct {
+	User             UserInfo `json:"user"`
+	Is_mutual_follow bool     `json:"is_mutual_follow"`
+}
+
+type FollowUserReq struct {
+	User_id        int64 `json:"user_id"`
+	Follow_user_id int64 `json:"follow_user_id"`
+}
+
+type FollowUserRes struct {
+	Success bool `json:"success"`
+}
+
+type GetFollowReq struct {
+	User_id       int64 `json:"user_id"`
+	Page_size     int32 `json:"page_size"`
+	Page          int32 `json:"page"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+
+type GetFollowRes struct {
+	List  []FollowUserInfo `json:"list"`
+	Total int64            `json:"total"`
+}
+
+type GetFollowingReq struct {
+	User_id       int64 `json:"user_id"`
+	Page_size     int32 `json:"page_size"`
+	Page          int32 `json:"page"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+
+type GetFollowingRes struct {
+	List  []FollowUserInfo `json:"list"`
+	Total int64            `json:"total"`
+}
+
+type GetPostCommentListReq struct {
+	Page      int32 `json:"page"`
+	Page_size int32 `json:"page_size"`
+	Post_id   int64 `json:"post_id"`
+	User_id   int64 `json:"user_id"`
+}
+
+type GetPostCommentListRsp struct {
+	List  []CommentItem `json:"list"`
+	Total int64         `json:"total"`
+}
+
+type GetPostListItem struct {
+	Id               int64     `json:"id"`
+	User             UserInfo  `json:"user"`
+	Title            string    `json:"title"`
+	Content_summary  string    `json:"content_summary"`
+	Post_type        int32     `json:"post_type"`
+	Comment_count    int64     `json:"comment_count"`
+	Upvote_count     int64     `json:"upvote_count"`
+	Collection_count int64     `json:"collection_count"`
+	Share_count      int64     `json:"share_count"`
+	Visibility       int32     `json:"visibility"`
+	Ip_loc           string    `json:"ip_loc"`
+	Hot_num          int64     `json:"hot_num"`
+	Images           []string  `json:"images"`
+	Video_url        string    `json:"video_url"`
+	Video_cover      string    `json:"video_cover"`
+	Created_on       int64     `json:"created_on"`
+	Tags             []TagItem `json:"tags"`
+	Is_liked         bool      `json:"is_liked"`
+	Is_collected     bool      `json:"is_collected"`
+	Is_mine          bool      `json:"is_mine"`
+}
+
+type GetPostListReq struct {
+	Page        int32  `json:"page"`
+	Page_size   int32  `json:"page_size"`
+	Search_type int32  `json:"search_type"`
+	Sort_type   int32  `json:"sort_type"`
+	Keyword     string `json:"keyword"`
+	User_id     int64  `json:"user_id"`
+}
+
+type GetPostListRsp struct {
+	List  []GetPostListItem `json:"list"`
+	Total int64             `json:"total"`
+}
+
+type GetPostReq struct {
+	User_id int64 `json:"user_id"`
+	Post_id int64 `json:"post_id"`
+}
+
+type GetPostRsp struct {
+	Id                int64      `json:"id"`
+	User              UserInfo   `json:"user"`
+	Title             string     `json:"title"`
+	Content_summary   string     `json:"content_summary"`
+	Post_type         int32      `json:"post_type"`
+	Comment_count     int64      `json:"comment_count"`
+	Upvote_count      int64      `json:"upvote_count"`
+	Collection_count  int64      `json:"collection_count"`
+	Share_count       int64      `json:"share_count"`
+	Visibility        int32      `json:"visibility"`
+	Ip_loc            string     `json:"ip_loc"`
+	Hot_num           int64      `json:"hot_num"`
+	Images            []string   `json:"images"`
+	Video_url         string     `json:"video_url"`
+	Video_cover       string     `json:"video_cover"`
+	Content           string     `json:"content"`
+	Created_on        int64      `json:"created_on"`
+	Tags              []TagItem  `json:"tags"`
+	With_user         []UserInfo `json:"with_user"`
+	Latest_replied_on int64      `json:"latest_replied_on"`
+	Is_liked          bool       `json:"is_liked"`
+	Is_collected      bool       `json:"is_collected"`
+	Is_mine           bool       `json:"is_mine"`
+}
+
+type GetReplyListReq struct {
+	Page       int32 `json:"page"`
+	Page_size  int32 `json:"page_size"`
+	Comment_id int64 `json:"comment_id"`
+	User_id    int64 `json:"user_id"`
+}
+
+type GetReplyListRsp struct {
+	List  []RepliesItem `json:"list"`
+	Total int64         `json:"total"`
+}
+
+type GetTagListReq struct {
+	Page      int32  `json:"page"`
+	Page_size int32  `json:"page_size"`
+	Tag_name  string `json:"tag_name"`
+	Sort_by   int32  `json:"sort_by"`
+}
+
+type GetTagListRsp struct {
+	Tag_list []TagItem `json:"tag_list"`
+	Total    int32     `json:"total"`
+}
+
+type GetTagReq struct {
+	Tag_id  int64 `json:"tag_id"`
+	User_id int64 `json:"user_id"`
+}
+
+type GetTagRsp struct {
+	Name         string   `json:"name"`
+	Hot_num      int64    `json:"hot_num"`
+	User         UserInfo `json:"user"`
+	Id           int64    `json:"id"`
+	Created_on   int64    `json:"created_on"`
+	Post_count   int64    `json:"post_count"`
+	Follow_count int64    `json:"follow_count"`
+	Is_followed  bool     `json:"is_followed"`
+}
+
+type GetUserInfoReq struct {
+	User_id       int64 `json:"user_id"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+
+type GetUserInfoResp struct {
+	Id        int64  `json:"id"`
+	Avatar    string `json:"avatar"`
+	Nickname  string `json:"nickname"`
+	Sex       int32  `json:"sex"`
+	Is_follow bool   `json:"is_follow"`
+}
+
+type GetUserPostCollectionListReq struct {
+	User_id       int64 `json:"user_id"`
+	Page          int64 `json:"page"`
+	Page_size     int64 `json:"page_size"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+
+type GetUserPostCollectionListRsp struct {
+	List  []GetPostListItem `json:"list"`
+	Total int64             `json:"total"`
+}
+
+type GetUserPostLikeListReq struct {
+	User_id       int64 `json:"user_id"`
+	Page          int64 `json:"page"`
+	Page_size     int64 `json:"page_size"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+
+type GetUserPostLikeListRsp struct {
+	List  []GetPostListItem `json:"list"`
+	Total int64             `json:"total"`
+}
+
+type GetUserPostListReq struct {
+	User_id       int64 `json:"user_id"`
+	Page          int64 `json:"page"`
+	Page_size     int64 `json:"page_size"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+
+type GetUserPostListRsp struct {
+	List  []GetPostListItem `json:"list"`
+	Total int64             `json:"total"`
+}
+
+type GetUserProfileReq struct {
+	User_id int64 `json:"user_id"`
+}
+
+type GetUserProfileRes struct {
+	Id                   int64  `json:"id"`
+	Nickname             string `json:"nickname"`
+	Username             string `json:"username"`
+	Status               int32  `json:"status"`
+	Avatar               string `json:"avatar"`
+	Phone                string `json:"phone"`
+	Tweet_count          int32  `json:"tweet_count"`
+	Is_following         bool   `json:"is_following"`
+	Created_on           int64  `json:"created_on"`
+	Follows              int64  `json:"follows"`
+	Fans                 int64  `json:"fans"`
+	Get_likes_count      int32  `json:"get_likes_count"`
+	Get_collection_count int32  `json:"get_collection_count"`
+	Sex                  int32  `json:"sex"`
+}
+
+type LoginAndRegisterRsp struct {
+	Token  string `json:"token"`
+	Expire int64  `json:"expire"`
+}
+
+type LoginReq struct {
+	Phone      string `json:"phone"`
+	Password   string `json:"password"`
+	Code       string `json:"code"`
+	Login_type int32  `json:"login_type"`
+	Login_ip   string `json:"login_ip"`
+}
+
+type PostCollectionReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+}
+
+type PostCollectionRsp struct {
+	Success bool `json:"success"`
+}
+
+type PostCommentReq struct {
+	Post_id    int64  `json:"post_id"`
+	User_id    int64  `json:"user_id"`
+	Content    string `json:"content"`
+	Image      string `json:"image"`
+	At_user_id int64  `json:"at_user_id"`
+	Ip         string `json:"ip"`
+	Ip_loc     string `json:"ip_loc"`
+}
+
+type PostCommentRsp struct {
+	Comment_id int64 `json:"comment_id"`
+}
+
+type PostCommentUpvoteReq struct {
+	User_id      int64 `json:"user_id"`
+	Comment_id   int64 `json:"comment_id"`
+	Comment_type int32 `json:"comment_type"`
+}
+
+type PostCommentUpvoteRsp struct {
+	Success bool `json:"success"`
+}
+
+type PostDeleteReq struct {
+	User_id int64 `json:"user_id"`
+	Post_id int64 `json:"post_id"`
+}
+
+type PostDeleteRsp struct {
+	Success bool `json:"success"`
+}
+
+type PostReplyReq struct {
+	Post_id     int64  `json:"post_id"`
+	User_id     int64  `json:"user_id"`
+	Content     string `json:"content"`
+	Image       string `json:"image"`
+	At_user_id  int64  `json:"at_user_id"`
+	Ip          string `json:"ip"`
+	Ip_loc      string `json:"ip_loc"`
+	Comment_id  int64  `json:"comment_id"`
+	To_reply_id int64  `json:"to_reply_id"`
+}
+
+type PostReplyRsp struct {
+	Reply_id int64 `json:"reply_id"`
+}
+
+type PostShareReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+}
+
+type PostShareRsp struct {
+	Success bool `json:"success"`
+}
+
+type PostUpvoteReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+}
+
+type PostUpvoteRsp struct {
+	Success bool `json:"success"`
+}
+
+type RegisterReq struct {
+	Phone    string `json:"phone"`
+	Nickname string `json:"nickname"`
+	Password string `json:"password"`
+	Avatar   string `json:"avatar"`
+	Sex      int32  `json:"sex"`
+	Username string `json:"username"`
+	Code     string `json:"code"`
+}
+
+type RepliesItem struct {
+	Id           int64      `json:"id"`
+	Post_id      int64      `json:"post_id"`
+	User         UserInfo   `json:"user"`
+	Ip_loc       string     `json:"ip_loc"`
+	Content      string     `json:"content"`
+	Image        string     `json:"image"`
+	With_user    []UserInfo `json:"with_user"`
+	Upvote_count int64      `json:"upvote_count"`
+	Is_liked     bool       `json:"is_liked"`
+	Is_mine      bool       `json:"is_mine"`
+	Created_on   int64      `json:"created_on"`
+}
+
+type SearchUsernameItem struct {
+	Nickname  string `json:"nickname"`
+	Avatar    string `json:"avatar"`
+	Id        int64  `json:"id"`
+	Sex       int32  `json:"sex"`
+	Is_follow bool   `json:"is_follow"`
+}
+
+type SearchUsernameReq struct {
+	Keyword   string `json:"keyword"`
+	Page      int32  `json:"page"`
+	Page_size int32  `json:"page_size"`
+	User_id   int64  `json:"user_id"`
+}
+
+type SearchUsernameRes struct {
+	List  []SearchUsernameItem `json:"list"`
+	Total int64                `json:"total"`
+}
+
+type TagItem struct {
+	Name       string   `json:"name"`
+	Hot_num    int64    `json:"hot_num"`
+	User       UserInfo `json:"user"`
+	Id         int64    `json:"id"`
+	Created_on int64    `json:"created_on"`
+}
+
+type UnFollowUserReq struct {
+	User_id           int64 `json:"user_id"`
+	Un_follow_user_id int64 `json:"un_follow_user_id"`
+}
+
+type UnFollowUserRes struct {
+	Success bool `json:"success"`
+}
+
+type UserEntity struct {
+	Id                   int64  `json:"id"`
+	Avatar               string `json:"avatar"`
+	Nickname             string `json:"nickname"`
+	Username             string `json:"username"`
+	Phone                string `json:"phone"`
+	Status               int32  `json:"status"`
+	Sex                  int32  `json:"sex"`
+	Follows              int64  `json:"follows"`
+	Followings           int64  `json:"followings"`
+	Get_likes_count      int32  `json:"get_likes_count"`
+	Get_collection_count int32  `json:"get_collection_count"`
+}
+
+type UserInfo struct {
+	Id       int64  `json:"id"`
+	Avatar   string `json:"avatar"`
+	Nickname string `json:"nickname"`
+	Sex      int32  `json:"sex"`
+}

+ 32 - 0
apps/internal/utils/token.go

@@ -0,0 +1,32 @@
+package utils
+
+import (
+	"context"
+	"encoding/json"
+	"github.com/golang-jwt/jwt/v4"
+)
+
+const Identify = "user_auth_id"
+
+func GetJwtToken(secretKey string, iat, seconds int64, uid int64) (string, error) {
+	claims := make(jwt.MapClaims)
+	claims["exp"] = iat + seconds
+	claims["iat"] = iat
+	claims[Identify] = uid
+
+	token := jwt.New(jwt.SigningMethodHS256)
+	token.Claims = claims
+
+	return token.SignedString([]byte(secretKey))
+}
+
+func GetUid(ctx context.Context) int64 {
+	if id, ok := ctx.Value(Identify).(json.Number); ok {
+		i, _ := id.Int64()
+		return i
+	}
+	if id, ok := ctx.Value(Identify).(float64); ok {
+		return int64(id)
+	}
+	return 0
+}

+ 32 - 0
apps/slowwild.go

@@ -0,0 +1,32 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+
+	"slow_wild_api/apps/internal/config"
+	"slow_wild_api/apps/internal/handler"
+	"slow_wild_api/apps/internal/svc"
+
+	"github.com/zeromicro/go-zero/core/conf"
+	"github.com/zeromicro/go-zero/rest"
+)
+
+var configFile = flag.String("f", "etc/slowwild.yaml", "the config file")
+
+func main() {
+	flag.Parse()
+
+	var c config.Config
+	conf.MustLoad(*configFile, &c)
+
+	server := rest.MustNewServer(c.RestConf, rest.WithCors())
+	defer server.Stop()
+
+	ctx := svc.NewServiceContext(c)
+	handler.RegisterHandlers(server, ctx)
+
+	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
+	server.Start()
+
+}

+ 994 - 0
doc/slow_wild.md

@@ -0,0 +1,994 @@
+### 1. "登录方法"
+
+1. route definition
+
+- Url: /api/user/login
+- Method: POST
+- Request: `LoginReq`
+- Response: `LoginAndRegisterRsp`
+
+2. request definition
+
+
+
+```golang
+type LoginReq struct {
+	Phone string `json:"phone"`
+	Password string `json:"password"`
+	Code string `json:"code"`
+	Login_type int32 `json:"login_type"`
+	Login_ip string `json:"login_ip"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type LoginAndRegisterRsp struct {
+	Token string `json:"token"`
+	Expire int64 `json:"expire"`
+}
+```
+
+### 2. "用户注册"
+
+1. route definition
+
+- Url: /api/user/register
+- Method: POST
+- Request: `RegisterReq`
+- Response: `LoginAndRegisterRsp`
+
+2. request definition
+
+
+
+```golang
+type RegisterReq struct {
+	Phone string `json:"phone"`
+	Nickname string `json:"nickname"`
+	Password string `json:"password"`
+	Avatar string `json:"avatar"`
+	Sex int32 `json:"sex"`
+	Username string `json:"username"`
+	Code string `json:"code"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type LoginAndRegisterRsp struct {
+	Token string `json:"token"`
+	Expire int64 `json:"expire"`
+}
+```
+
+### 3. "获取粉丝"
+
+1. route definition
+
+- Url: /api/user/fans
+- Method: GET
+- Request: `GetFollowingReq`
+- Response: `GetFollowingRes`
+
+2. request definition
+
+
+
+```golang
+type GetFollowingReq struct {
+	User_id int64 `json:"user_id"`
+	Page_size int32 `json:"page_size"`
+	Page int32 `json:"page"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetFollowingRes struct {
+	List []FollowUserInfo `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 4. "查询用户"
+
+1. route definition
+
+- Url: /api/user/find
+- Method: POST
+- Request: `FindUserReq`
+- Response: `FindUserResp`
+
+2. request definition
+
+
+
+```golang
+type FindUserReq struct {
+	Username string `json:"username"`
+	Phone string `json:"phone"`
+	Ids []int64 `json:"ids"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type FindUserResp struct {
+	User_list []UserInfo `json:"user_list"`
+}
+```
+
+### 5. "关注用户"
+
+1. route definition
+
+- Url: /api/user/follow
+- Method: POST
+- Request: `FollowUserReq`
+- Response: `FollowUserRes`
+
+2. request definition
+
+
+
+```golang
+type FollowUserReq struct {
+	User_id int64 `json:"user_id"`
+	Follow_user_id int64 `json:"follow_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type FollowUserRes struct {
+	Success bool `json:"success"`
+}
+```
+
+### 6. "获取关注列表"
+
+1. route definition
+
+- Url: /api/user/follows
+- Method: GET
+- Request: `GetFollowReq`
+- Response: `GetFollowRes`
+
+2. request definition
+
+
+
+```golang
+type GetFollowReq struct {
+	User_id int64 `json:"user_id"`
+	Page_size int32 `json:"page_size"`
+	Page int32 `json:"page"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetFollowRes struct {
+	List []FollowUserInfo `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 7. "获取用户信息"
+
+1. route definition
+
+- Url: /api/user/info
+- Method: GET
+- Request: `GetUserInfoReq`
+- Response: `GetUserInfoResp`
+
+2. request definition
+
+
+
+```golang
+type GetUserInfoReq struct {
+	User_id int64 `json:"user_id"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetUserInfoResp struct {
+	Id int64 `json:"id"`
+	Avatar string `json:"avatar"`
+	Nickname string `json:"nickname"`
+	Sex int32 `json:"sex"`
+	Is_follow bool `json:"is_follow"`
+}
+```
+
+### 8. "获取用户信息"
+
+1. route definition
+
+- Url: /api/user/profile
+- Method: GET
+- Request: `GetUserProfileReq`
+- Response: `GetUserProfileRes`
+
+2. request definition
+
+
+
+```golang
+type GetUserProfileReq struct {
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetUserProfileRes struct {
+	Id int64 `json:"id"`
+	Nickname string `json:"nickname"`
+	Username string `json:"username"`
+	Status int32 `json:"status"`
+	Avatar string `json:"avatar"`
+	Phone string `json:"phone"`
+	Tweet_count int32 `json:"tweet_count"`
+	Is_following bool `json:"is_following"`
+	Created_on int64 `json:"created_on"`
+	Follows int64 `json:"follows"`
+	Fans int64 `json:"fans"`
+	Get_likes_count int32 `json:"get_likes_count"`
+	Get_collection_count int32 `json:"get_collection_count"`
+	Sex int32 `json:"sex"`
+}
+```
+
+### 9. "搜索用户"
+
+1. route definition
+
+- Url: /api/user/search
+- Method: GET
+- Request: `SearchUsernameReq`
+- Response: `SearchUsernameRes`
+
+2. request definition
+
+
+
+```golang
+type SearchUsernameReq struct {
+	Keyword string `json:"keyword"`
+	Page int32 `json:"page"`
+	Page_size int32 `json:"page_size"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type SearchUsernameRes struct {
+	List []SearchUsernameItem `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 10. "取消关注用户"
+
+1. route definition
+
+- Url: /api/user/unfollow
+- Method: POST
+- Request: `UnFollowUserReq`
+- Response: `UnFollowUserRes`
+
+2. request definition
+
+
+
+```golang
+type UnFollowUserReq struct {
+	User_id int64 `json:"user_id"`
+	Un_follow_user_id int64 `json:"un_follow_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type UnFollowUserRes struct {
+	Success bool `json:"success"`
+}
+```
+
+### 11. "评论删除"
+
+1. route definition
+
+- Url: /api/comment/delete
+- Method: POST
+- Request: `CommentDeleteReq`
+- Response: `CommentDeleteRsp`
+
+2. request definition
+
+
+
+```golang
+type CommentDeleteReq struct {
+	User_id int64 `json:"user_id"`
+	Comment_id int64 `json:"comment_id"`
+	Comment_type int32 `json:"comment_type"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type CommentDeleteRsp struct {
+	Success bool `json:"success"`
+}
+```
+
+### 12. "帖子收藏"
+
+1. route definition
+
+- Url: /api/post/collection
+- Method: POST
+- Request: `PostCollectionReq`
+- Response: `PostCollectionRsp`
+
+2. request definition
+
+
+
+```golang
+type PostCollectionReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type PostCollectionRsp struct {
+	Success bool `json:"success"`
+}
+```
+
+### 13. "发布评论"
+
+1. route definition
+
+- Url: /api/post/comment
+- Method: POST
+- Request: `PostCommentReq`
+- Response: `PostCommentRsp`
+
+2. request definition
+
+
+
+```golang
+type PostCommentReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+	Content string `json:"content"`
+	Image string `json:"image"`
+	At_user_id int64 `json:"at_user_id"`
+	Ip string `json:"ip"`
+	Ip_loc string `json:"ip_loc"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type PostCommentRsp struct {
+	Comment_id int64 `json:"comment_id"`
+}
+```
+
+### 14. "评论点赞"
+
+1. route definition
+
+- Url: /api/post/comment/upvote
+- Method: POST
+- Request: `PostCommentUpvoteReq`
+- Response: `PostCommentUpvoteRsp`
+
+2. request definition
+
+
+
+```golang
+type PostCommentUpvoteReq struct {
+	User_id int64 `json:"user_id"`
+	Comment_id int64 `json:"comment_id"`
+	Comment_type int32 `json:"comment_type"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type PostCommentUpvoteRsp struct {
+	Success bool `json:"success"`
+}
+```
+
+### 15. "创建帖子"
+
+1. route definition
+
+- Url: /api/post/create
+- Method: POST
+- Request: `CreatePostReq`
+- Response: `CreatePostRsp`
+
+2. request definition
+
+
+
+```golang
+type CreatePostReq struct {
+	User_id int64 `json:"user_id"`
+	Title string `json:"title"`
+	Content string `json:"content"`
+	Tags []CreateTag `json:"tags"`
+	At_user_ids []int64 `json:"at_user_ids"`
+	Post_type int32 `json:"post_type"`
+	Visibility int32 `json:"visibility"`
+	Images []string `json:"images"`
+	Video_cover string `json:"video_cover"`
+	Video_url string `json:"video_url"`
+	Ip string `json:"ip"`
+	Ip_loc string `json:"ip_loc"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type CreatePostRsp struct {
+	Post_id int64 `json:"post_id"`
+}
+```
+
+### 16. "帖子删除"
+
+1. route definition
+
+- Url: /api/post/delete
+- Method: POST
+- Request: `PostDeleteReq`
+- Response: `PostDeleteRsp`
+
+2. request definition
+
+
+
+```golang
+type PostDeleteReq struct {
+	User_id int64 `json:"user_id"`
+	Post_id int64 `json:"post_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type PostDeleteRsp struct {
+	Success bool `json:"success"`
+}
+```
+
+### 17. "回复评论"
+
+1. route definition
+
+- Url: /api/post/reply
+- Method: POST
+- Request: `PostReplyReq`
+- Response: `PostReplyRsp`
+
+2. request definition
+
+
+
+```golang
+type PostReplyReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+	Content string `json:"content"`
+	Image string `json:"image"`
+	At_user_id int64 `json:"at_user_id"`
+	Ip string `json:"ip"`
+	Ip_loc string `json:"ip_loc"`
+	Comment_id int64 `json:"comment_id"`
+	To_reply_id int64 `json:"to_reply_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type PostReplyRsp struct {
+	Reply_id int64 `json:"reply_id"`
+}
+```
+
+### 18. "帖子分享"
+
+1. route definition
+
+- Url: /api/post/share
+- Method: POST
+- Request: `PostShareReq`
+- Response: `PostShareRsp`
+
+2. request definition
+
+
+
+```golang
+type PostShareReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type PostShareRsp struct {
+	Success bool `json:"success"`
+}
+```
+
+### 19. "帖子点赞"
+
+1. route definition
+
+- Url: /api/post/upvote
+- Method: POST
+- Request: `PostUpvoteReq`
+- Response: `PostUpvoteRsp`
+
+2. request definition
+
+
+
+```golang
+type PostUpvoteReq struct {
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type PostUpvoteRsp struct {
+	Success bool `json:"success"`
+}
+```
+
+### 20. "获取帖子详情"
+
+1. route definition
+
+- Url: /api/post
+- Method: GET
+- Request: `GetPostReq`
+- Response: `GetPostRsp`
+
+2. request definition
+
+
+
+```golang
+type GetPostReq struct {
+	User_id int64 `json:"user_id"`
+	Post_id int64 `json:"post_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetPostRsp struct {
+	Id int64 `json:"id"`
+	User UserInfo `json:"user"`
+	Title string `json:"title"`
+	Content_summary string `json:"content_summary"`
+	Post_type int32 `json:"post_type"`
+	Comment_count int64 `json:"comment_count"`
+	Upvote_count int64 `json:"upvote_count"`
+	Collection_count int64 `json:"collection_count"`
+	Share_count int64 `json:"share_count"`
+	Visibility int32 `json:"visibility"`
+	Ip_loc string `json:"ip_loc"`
+	Hot_num int64 `json:"hot_num"`
+	Images []string `json:"images"`
+	Video_url string `json:"video_url"`
+	Video_cover string `json:"video_cover"`
+	Content string `json:"content"`
+	Created_on int64 `json:"created_on"`
+	Tags []TagItem `json:"tags"`
+	With_user []UserInfo `json:"with_user"`
+	Latest_replied_on int64 `json:"latest_replied_on"`
+	Is_liked bool `json:"is_liked"`
+	Is_collected bool `json:"is_collected"`
+	Is_mine bool `json:"is_mine"`
+}
+
+type UserInfo struct {
+	Id int64 `json:"id"`
+	Avatar string `json:"avatar"`
+	Nickname string `json:"nickname"`
+	Sex int32 `json:"sex"`
+}
+```
+
+### 21. "获取评论列表"
+
+1. route definition
+
+- Url: /api/post/comment/list
+- Method: GET
+- Request: `GetPostCommentListReq`
+- Response: `GetPostCommentListRsp`
+
+2. request definition
+
+
+
+```golang
+type GetPostCommentListReq struct {
+	Page int32 `json:"page"`
+	Page_size int32 `json:"page_size"`
+	Post_id int64 `json:"post_id"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetPostCommentListRsp struct {
+	List []CommentItem `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 22. "获取帖子列表"
+
+1. route definition
+
+- Url: /api/post/list
+- Method: GET
+- Request: `GetPostListReq`
+- Response: `GetPostListRsp`
+
+2. request definition
+
+
+
+```golang
+type GetPostListReq struct {
+	Page int32 `json:"page"`
+	Page_size int32 `json:"page_size"`
+	Search_type int32 `json:"search_type"`
+	Sort_type int32 `json:"sort_type"`
+	Keyword string `json:"keyword"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetPostListRsp struct {
+	List []GetPostListItem `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 23. "获取回复列表"
+
+1. route definition
+
+- Url: /api/post/reply/list
+- Method: GET
+- Request: `GetReplyListReq`
+- Response: `GetReplyListRsp`
+
+2. request definition
+
+
+
+```golang
+type GetReplyListReq struct {
+	Page int32 `json:"page"`
+	Page_size int32 `json:"page_size"`
+	Comment_id int64 `json:"comment_id"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetReplyListRsp struct {
+	List []RepliesItem `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 24. "获取话题详情"
+
+1. route definition
+
+- Url: /api/tag
+- Method: GET
+- Request: `GetTagReq`
+- Response: `GetTagRsp`
+
+2. request definition
+
+
+
+```golang
+type GetTagReq struct {
+	Tag_id int64 `json:"tag_id"`
+	User_id int64 `json:"user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetTagRsp struct {
+	Name string `json:"name"`
+	Hot_num int64 `json:"hot_num"`
+	User UserInfo `json:"user"`
+	Id int64 `json:"id"`
+	Created_on int64 `json:"created_on"`
+	Post_count int64 `json:"post_count"`
+	Follow_count int64 `json:"follow_count"`
+	Is_followed bool `json:"is_followed"`
+}
+
+type UserInfo struct {
+	Id int64 `json:"id"`
+	Avatar string `json:"avatar"`
+	Nickname string `json:"nickname"`
+	Sex int32 `json:"sex"`
+}
+```
+
+### 25. "获取话题列表"
+
+1. route definition
+
+- Url: /api/tag/list
+- Method: GET
+- Request: `GetTagListReq`
+- Response: `GetTagListRsp`
+
+2. request definition
+
+
+
+```golang
+type GetTagListReq struct {
+	Page int32 `json:"page"`
+	Page_size int32 `json:"page_size"`
+	Tag_name string `json:"tag_name"`
+	Sort_by int32 `json:"sort_by"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetTagListRsp struct {
+	Tag_list []TagItem `json:"tag_list"`
+	Total int32 `json:"total"`
+}
+```
+
+### 26. "获取用户收藏的帖子列表"
+
+1. route definition
+
+- Url: /api/user/post/collection/list
+- Method: GET
+- Request: `GetUserPostCollectionListReq`
+- Response: `GetUserPostCollectionListRsp`
+
+2. request definition
+
+
+
+```golang
+type GetUserPostCollectionListReq struct {
+	User_id int64 `json:"user_id"`
+	Page int64 `json:"page"`
+	Page_size int64 `json:"page_size"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetUserPostCollectionListRsp struct {
+	List []GetPostListItem `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 27. "获取用户点赞的帖子列表"
+
+1. route definition
+
+- Url: /api/user/post/like/list
+- Method: GET
+- Request: `GetUserPostLikeListReq`
+- Response: `GetUserPostLikeListRsp`
+
+2. request definition
+
+
+
+```golang
+type GetUserPostLikeListReq struct {
+	User_id int64 `json:"user_id"`
+	Page int64 `json:"page"`
+	Page_size int64 `json:"page_size"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetUserPostLikeListRsp struct {
+	List []GetPostListItem `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+
+### 28. "获取用户发布的帖子列表"
+
+1. route definition
+
+- Url: /api/user/post/list
+- Method: GET
+- Request: `GetUserPostListReq`
+- Response: `GetUserPostListRsp`
+
+2. request definition
+
+
+
+```golang
+type GetUserPostListReq struct {
+	User_id int64 `json:"user_id"`
+	Page int64 `json:"page"`
+	Page_size int64 `json:"page_size"`
+	Query_user_id int64 `json:"query_user_id"`
+}
+```
+
+
+3. response definition
+
+
+
+```golang
+type GetUserPostListRsp struct {
+	List []GetPostListItem `json:"list"`
+	Total int64 `json:"total"`
+}
+```
+

+ 93 - 0
go.mod

@@ -0,0 +1,93 @@
+module slow_wild_api
+
+go 1.22.0
+
+toolchain go1.22.7
+
+require (
+	git.banshen.xyz/huangguangrong/slow_wild_protobuff v0.1.7
+	github.com/golang-jwt/jwt/v4 v4.5.1
+	github.com/zeromicro/go-zero v1.8.0
+)
+
+require (
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+	github.com/cespare/xxhash/v2 v2.3.0 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+	github.com/fatih/color v1.18.0 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.2 // indirect
+	github.com/go-openapi/swag v0.22.4 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang/mock v1.6.0 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/google/gnostic-models v0.6.8 // indirect
+	github.com/google/go-cmp v0.6.0 // indirect
+	github.com/google/gofuzz v1.2.0 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.17.9 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+	github.com/openzipkin/zipkin-go v0.4.3 // indirect
+	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+	github.com/prometheus/client_golang v1.20.5 // indirect
+	github.com/prometheus/client_model v0.6.1 // indirect
+	github.com/prometheus/common v0.55.0 // indirect
+	github.com/prometheus/procfs v0.15.1 // indirect
+	github.com/redis/go-redis/v9 v9.7.0 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.15 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.15 // indirect
+	go.opentelemetry.io/otel v1.32.0 // indirect
+	go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.32.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.32.0 // indirect
+	go.opentelemetry.io/otel/trace v1.32.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.3.1 // indirect
+	go.uber.org/atomic v1.10.0 // indirect
+	go.uber.org/automaxprocs v1.6.0 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	go.uber.org/zap v1.24.0 // indirect
+	golang.org/x/net v0.34.0 // indirect
+	golang.org/x/oauth2 v0.24.0 // indirect
+	golang.org/x/sys v0.29.0 // indirect
+	golang.org/x/term v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	golang.org/x/time v0.9.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect
+	google.golang.org/grpc v1.70.0 // indirect
+	google.golang.org/protobuf v1.36.5 // indirect
+	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+	k8s.io/api v0.29.3 // indirect
+	k8s.io/apimachinery v0.29.4 // indirect
+	k8s.io/client-go v0.29.3 // indirect
+	k8s.io/klog/v2 v2.110.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
+	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
+)

+ 281 - 0
go.sum

@@ -0,0 +1,281 @@
+git.banshen.xyz/huangguangrong/slow_wild_protobuff v0.1.7 h1:60g8xVMAa0XSX1TNTQ3znzzho1aGQ0948yNiAGvjoNM=
+git.banshen.xyz/huangguangrong/slow_wild_protobuff v0.1.7/go.mod h1:RvtFTWaCnJcB8iy/clOqBoimd7UxSx5+KB96G+bdq5c=
+github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE=
+github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis/v2 v2.34.0 h1:mBFWMaJSNL9RwdGRyEDoAAv8OQc5UlEhLDQggTglU/0=
+github.com/alicebob/miniredis/v2 v2.34.0/go.mod h1:kWShP4b58T1CW0Y5dViCd5ztzrDqRWqM3nksiyXk5s8=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
+github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
+github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
+github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
+github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
+github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
+github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=
+github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
+github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
+github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
+github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
+github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg=
+github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
+github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg=
+github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c=
+github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
+github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
+github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
+github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
+github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
+github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
+github.com/zeromicro/go-zero v1.8.0 h1:4g/8VW+fOyM51HZYPeI3mXIZdEX+Fl6SsdYX2H5PYw4=
+github.com/zeromicro/go-zero v1.8.0/go.mod h1:xDBF+/iDzj30zPvu6HNUIbpz1J6+/g3Sx9D/DytJfss=
+go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk=
+go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM=
+go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA=
+go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU=
+go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4=
+go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU=
+go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
+go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 h1:s0PHtIkN+3xrbDOpt2M8OTG92cWqUESvzh2MxiR5xY8=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0/go.mod h1:hZlFbDbRt++MMPCCfSJfmhkGIWnX1h3XjkfxZUjLrIA=
+go.opentelemetry.io/otel/exporters/zipkin v1.24.0 h1:3evrL5poBuh1KF51D9gO/S+N/1msnm4DaBqs/rpXUqY=
+go.opentelemetry.io/otel/exporters/zipkin v1.24.0/go.mod h1:0EHgD8R0+8yRhUYJOGR8Hfg2dpiJQxDOszd5smVO9wM=
+go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
+go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
+go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
+go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
+go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
+go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
+go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
+go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
+go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
+go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
+golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a h1:OAiGFfOiA0v9MRYsSidp3ubZaBnteRUyn3xB2ZQ5G/E=
+google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:hgh8P4EuoxpsuKMXX/To36nOFD7vixReXgn8lPGnt+o=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
+google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
+google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
+google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
+google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
+gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw=
+k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80=
+k8s.io/apimachinery v0.29.4 h1:RaFdJiDmuKs/8cm1M6Dh1Kvyh59YQFDcFuFTSmXes6Q=
+k8s.io/apimachinery v0.29.4/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
+k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg=
+k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0=
+k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
+k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
+k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
+k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=