ç®Âä»Â
è¿Â个项ç®æ¯ä¸Â个ç®ÂÃ¥ÂÂçÂÂ社åºè¯Âé¢Âç³»ç»ÂãÂÂgiteeå°åÂÂï¼ÂÃ¥ÂÂèÂÂéÂÂè®ÂèÂÂ¥CommunityTopics:(gitee.com)
æÂÂ使ç¨亠MVCï¼ÂModel-View-Controllerï¼Âæ¶æÂÂ模å¼Âï¼ÂÃ¥Â
¶ä¸ controller
Ã¥ÂÂ
è´Âè´£æ§å¶请æ±Âå¤ÂçÂÂï¼Âservice
Ã¥ÂÂ
è´Âè´£å¤ÂçÂÂä¸Âå¡é»è¾Âï¼Ârepository
Ã¥ÂÂ
è´Âè´£ä¸Âæ°æ®åºÂ交äºÂãÂÂ
main
å 主è¦Âè´Âè´£å¯å¨æÂÂå¡åÂÂå®Âä¹Âè·¯ç±ï¼Âå ·ä½ÂçÂÂä¸Âå¡é»è¾Âå¨堶ä»Âå ä¸Âå®Âç°ãÂÂ- 为äºÂä¿Âè¯Â代ç ÂçÂÂå¯æ©å±Âæ§åÂÂå¤Âç¨æ§ï¼Â项ç®éÂÂç¨äºÂÃ¥ÂÂä¾Â模å¼Âï¼Âä¾Âå¦Â
NewTopicDaoInstance
ãÂÂNewUserDaoInstance
Ã¥ÂÂNewPostDaoInstance
å½æ°ï¼Âç¡®ä¿ÂäºÂå¨堨å±ÂèÂÂå´å åªæÂÂä¸Â个å®Âä¾Âï¼Âé¿å ÂäºÂå¤Â次åÂÂ建å®Âä¾ÂÃ¥ÂÂèµÂæºÂ浪费ã - 使ç¨äºÂ并åÂÂæ¹å¼ÂæÂ¥æÂÂé«Âæ°æ®æ¥询çÂÂæÂÂçÂÂï¼Âä¾Âå¦Âå¨
prepareInfo()
æ¹æ³Âä¸Â并åÂÂè·åÂÂè¯Âé¢Âä¿¡æ¯åÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表ï¼ÂéÂÂè¿Âsync.WaitGroup
æÂ¥çÂÂ徠两个æÂÂä½Âå®ÂæÂÂÃ¥ÂÂÃ¥ÂÂè¿Âè¡ÂÃ¥ÂÂç»Âå¤ÂçÂÂãÂÂ
Ã¥ÂÂç»Âä¼Âæ·»å jwtéªÂè¯Âï¼Â并添å è¿Â代ç Âä»ÂåºÂï¼ÂæÂÂèÂÂè»ï¼ÂæÂÂå¾Âå¤Âä¸Â好çÂÂå°æ¹è¿Â请带佬æÂÂç¹
ç»ÂæÂÂï¼Â
-
main
ï¼Â- è´Â责项ç®çÂÂå ¥å£ï¼ÂÃ¥ÂÂå§Âå Gin å¼ÂæÂÂÃ¥ÂÂè·¯ç±ãÂÂ
- å®Âä¹ÂäºÂ两个路ç±ï¼ÂÃ¥ÂÂå«å¤ÂçÂÂå¸ÂÃ¥ÂÂ页é¢信æ¯æ¥询åÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂ请æ±ÂãÂÂ
"/community/page/get/:id"
è·¯ç±å¤ÂçÂÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂ请æ±Âï¼Âè°Âç¨controller.QueryPageInfo
å¤ÂçÂÂå½æ°ãÂÂ"/community/post/publish"
è·¯ç±å¤ÂçÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂ请æ±Âï¼Âè°Âç¨controller.PostPublish
å¤ÂçÂÂå½æ°ãÂÂ
-
controller
ï¼Â- è´Âè´£å¤Âç HTTP 请æ±ÂÃ¥ÂÂè·¯ç±å¤ÂçÂÂé»è¾ÂãÂÂ
QueryPageInfo
å½æ°ï¼Âå¤ÂçÂÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂ请æ±Âï¼Âè°Âç¨service.QueryPageInfo
å½æ°ãÂÂPostPublish
å½æ°ï¼Âå¤ÂçÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂ请æ±Âï¼Âè°Âç¨service.PostPublish
å½æ°ãÂÂPageData
ç»ÂæÂÂä½Âï¼Âç¨äºÂå°Â裠è¿ÂÃ¥ÂÂç»Â客æ·端ç JSON æ°æ®ãÂÂ
-
service
ï¼Â- å®Âä¹ÂäºÂä¸Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂÃ¥ÂÂ页é¢信æ¯æ¥询ç¸堳çÂÂæÂÂå¡å½æ°ï¼Âå¤ÂçÂÂå ·ä½ÂçÂÂä¸Âå¡é»è¾ÂãÂÂ
PostPublish
å½æ°ï¼Âç¨äºÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂï¼Âè°Âç¨NewPublishPostFlow
Ã¥ÂÂ建ä¸Â个PublishPostFlow
å®Âä¾Âï¼Â并è°Âç¨堶Do()
æ¹æ³Âæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨ÂãÂÂNewPublishPostFlow
å½æ°ï¼Âç¨äºÂÃ¥ÂÂ建ä¸Â个PublishPostFlow
å®Âä¾ÂãÂÂPublishPostFlow
ç»ÂæÂÂä½Âï¼Âç¨äºÂç»Âç»Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨Âï¼Âå å«äºÂÃ¥ÂÂæ°校éªÂãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæ°æ®åºÂæÂÂä½Âï¼Â以åÂÂè¿ÂÃ¥ÂÂå¸ÂÃ¥ÂÂä¿¡æ¯åÂÂå¯è½çÂÂéÂÂ误ãÂÂQueryPageInfo
å½æ°ï¼Âç¨äºÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯ï¼Âè°Âç¨NewQueryPageInfoFlow
Ã¥ÂÂ建ä¸Â个QueryPageInfoFlow
å®Âä¾Âï¼Â并è°Âç¨堶Do()
æ¹æ³Âæ§è¡Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨ÂãÂÂNewQueryPageInfoFlow
å½æ°ï¼Âç¨äºÂÃ¥ÂÂ建ä¸Â个QueryPageInfoFlow
å®Âä¾ÂãÂÂQueryPageInfoFlow
ç»ÂæÂÂä½Âï¼Âç¨äºÂç»Âç»Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨Âï¼Âå å«äºÂÃ¥ÂÂæ°校éªÂãÂÂÃ¥ÂÂå¤Âä¿¡æ¯åÂÂç»Âç»Â页é¢信æ¯çÂÂæÂÂä½ÂãÂÂ
-
repository
ï¼Â- è´Âè´£ä¸Âæ°æ®åºÂ交äºÂï¼Âå å«äºÂ对è¯Âé¢ÂãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂç¨æ·æ°æ®表çÂÂç»ÂæÂÂä½ÂÃ¥ÂÂç¸åºÂçÂÂæ°æ®åºÂæÂÂä½Âæ¹æ³ÂãÂÂ
- Ã¥ÂÂ
å«äºÂ
Topic
ãÂÂPost
Ã¥ÂÂUser
ç»ÂæÂÂä½Âï¼ÂÃ¥ÂÂå«代表è¯Âé¢ÂãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂç¨æ·çÂÂæ°æ®模åÂÂã - Ã¥ÂÂ
å«äºÂ
TopicDao
ãÂÂPostDao
Ã¥ÂÂUserDao
ç»ÂæÂÂä½Âï¼Âç¨äºÂæ§è¡Â对åºÂæ°æ®表çÂÂæ°æ®åºÂæÂÂä½Âã Init
å½æ°ï¼Âç¨äºÂÃ¥ÂÂå§ÂÃ¥ÂÂæ°æ®åºÂè¿ÂæÂ¥ãÂÂ
ç»ÂæÂÂä½Â说æÂÂï¼Â
PageData
ï¼Âç¨äºÂå°Â裠è¿ÂÃ¥ÂÂç»Â客æ·端ç JSON æ°æ®ï¼Âå æ¬Code
ï¼Âè¿ÂÃ¥ÂÂç¶æÂÂç Âï¼ÂãÂÂMsg
ï¼Âè¿ÂÃ¥ÂÂæ¶Âæ¯ï¼ÂÃ¥ÂÂData
ï¼Âè¿ÂÃ¥ÂÂæ°æ®ï¼ÂÃ¥ÂÂ段ãÂÂPost
ï¼Â代表å¸ÂÃ¥ÂÂçÂÂæ°æ®模åÂÂï¼Âå å«å¸ÂÃ¥ÂÂçÂÂÃ¥ÂÂ个åÂÂ段信æ¯ãÂÂTopic
ï¼Â代表è¯Âé¢ÂçÂÂæ°æ®模åÂÂï¼Âå å«è¯Âé¢ÂçÂÂÃ¥ÂÂ个åÂÂ段信æ¯ãÂÂUser
ï¼Â代表ç¨æ·çÂÂæ°æ®模åÂÂï¼Âå å«ç¨æ·çÂÂÃ¥ÂÂ个åÂÂ段信æ¯ãÂÂPostInfo
ï¼Âç¨äºÂç»Âç»Âå¸ÂÃ¥ÂÂä¿¡æ¯ï¼Âå æ¬å¸ÂÃ¥ÂÂæ¬身çÂÂä¿¡æ¯åÂÂÃ¥ÂÂå¸Â该å¸ÂÃ¥ÂÂçÂÂç¨æ·信æ¯ãÂÂTopicInfo
ï¼Âç¨äºÂç»Âç»Âè¯Âé¢Âä¿¡æ¯ï¼Âå æ¬è¯Âé¢Âæ¬身çÂÂä¿¡æ¯åÂÂÃ¥ÂÂ建该è¯Âé¢ÂçÂÂç¨æ·信æ¯ãÂÂPageInfo
ï¼Âç¨äºÂç»Âç»Â页é¢信æ¯ï¼Âå æ¬è¯Âé¢Âä¿¡æ¯åÂÂç¸堳çÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表ãÂÂ
å½æ°说æÂÂï¼Â
QueryPageInfo
ï¼Âå¤ÂçÂÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂ请æ±Âï¼Âè°Âç¨service.QueryPageInfo
å½æ°è¿Âè¡Âå¤ÂçÂÂï¼Â并è¿ÂÃ¥ÂÂæ¥询ç»ÂæÂÂãÂÂPostPublish
ï¼Âå¤ÂçÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂ请æ±Âï¼Âè°Âç¨service.PostPublish
å½æ°è¿Âè¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸Âï¼Â并è¿ÂÃ¥ÂÂÃ¥ÂÂå¸ÂÃ¥ÂÂçÂÂå¸ÂÃ¥ÂÂä¿¡æ¯åÂÂå¯è½çÂÂéÂÂ误ãÂÂNewPublishPostFlow
ï¼Âç¨äºÂÃ¥ÂÂ建ä¸Â个å¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨Âå®Âä¾ÂãÂÂPublishPostFlow.Do()
ï¼Âæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨Âï¼Âå æÂŒÂÂæ°æ£ÂæÂ¥ãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæ°æ®åºÂæÂÂä½Âï¼Â并è¿ÂÃ¥ÂÂÃ¥ÂÂå¸ÂÃ¥ÂÂçÂÂå¸ÂÃ¥ÂÂä¿¡æ¯åÂÂå¯è½çÂÂéÂÂ误ãÂÂNewQueryPageInfoFlow
ï¼Âç¨äºÂÃ¥ÂÂ建ä¸Â个æ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨Âå®Âä¾ÂãÂÂQueryPageInfoFlow.Do()
ï¼Âæ§è¡Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨Âï¼Âå æÂŒÂÂæ°æ£ÂæÂ¥ãÂÂÃ¥ÂÂå¤Âä¿¡æ¯åÂÂç»Âç»Â页é¢信æ¯ï¼Â并è¿ÂÃ¥ÂÂ页é¢信æ¯åÂÂå¯è½çÂÂéÂÂ误ãÂÂInit
ï¼Âç¨äºÂÃ¥ÂÂå§ÂÃ¥ÂÂæ°æ®åºÂè¿ÂæÂ¥ï¼Â并è¿ÂÃ¥ÂÂæ°æ®åºÂ对象db
ãÂÂ
é»è¾ÂæµÂç¨Âï¼Â
-
å¸ÂÃ¥ÂÂÃ¥ÂÂå¸Âé»è¾Âï¼Â
main
å å¯å¨ Gin å¼ÂæÂÂï¼Â并å®Âä¹ÂäºÂ两个路ç±"/community/page/get/:id"
Ã¥ÂÂ"/community/post/publish"
ãÂÂ- å½Â访é®
"/community/page/get/:id"
è·¯ç±æ¶ï¼ÂGin å¼ÂæÂÂè°Âç¨controller.QueryPageInfo
å¤ÂçÂÂå½æ°ï¼Âå¤ÂçÂÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂ请æ±Âã - å½Â访é®
"/community/post/publish"
è·¯ç±æ¶ï¼ÂGin å¼ÂæÂÂè°Âç¨controller.PostPublish
å¤ÂçÂÂå½æ°ï¼Âå¤ÂçÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂ请æ±Âã controller.PostPublish
è°Âç¨service.PostPublish
å½æ°ï¼Â该å½æ°ç¨äºÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂãÂÂservice.PostPublish
Ã¥ÂÂ建äºÂä¸Â个PublishPostFlow
å®Âä¾Âï¼Â并è°Âç¨堶Do()
æ¹æ³Âæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨ÂãÂÂPublishPostFlow
å®Âä¾ÂçÂÂDo()
æ¹æ³Âæ£ÂæÂ¥åÂÂæ°ï¼Âå¦Âç¨æ· ID Ã¥ÂÂå¸ÂÃ¥ÂÂå 容çÂÂÃ¥ÂÂæ³Âæ§ï¼Âç¶åÂÂæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæ°æ®åºÂæÂÂä½Âï¼Â并è¿ÂÃ¥ÂÂÃ¥ÂÂå¸ÂÃ¥ÂÂçÂÂå¸ÂÃ¥ÂÂä¿¡æ¯åÂÂå¯è½çÂÂéÂÂ误ãÂÂ
-
页é¢信æ¯æ¥询é»è¾Âï¼Â
- å½Â访é®
"/community/page/get/:id"
è·¯ç±æ¶ï¼ÂGin å¼ÂæÂÂè°Âç¨controller.QueryPageInfo
å¤ÂçÂÂå½æ°ï¼Âå¤ÂçÂÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂ请æ±Âã controller.QueryPageInfo
è°Âç¨service.QueryPageInfo
å½æ°ï¼Â该å½æ°ç¨äºÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯ãÂÂservice.QueryPageInfo
Ã¥ÂÂ建äºÂä¸Â个QueryPageInfoFlow
å®Âä¾Âï¼Â并è°Âç¨堶Do()
æ¹æ³Âæ§è¡Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨ÂãÂÂQueryPageInfoFlow
å®Âä¾ÂçÂÂDo()
æ¹æ³Âæ£ÂæÂ¥åÂÂæ°ï¼Âå¦Âè¯Â颠ID çÂÂÃ¥ÂÂæ³Âæ§ï¼Âç¶åÂÂè°Âç¨prepareInfo()
æ¹æ³ÂÃ¥ÂÂå¤Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯æÂÂéÂÂçÂÂæ°æ®ãÂÂprepareInfo()
æ¹æ³Â使ç¨并åÂÂæ¹å¼ÂÃ¥ÂÂå«è·åÂÂè¯Âé¢Âä¿¡æ¯åÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表ï¼Â并éÂÂè¿Âsync.WaitGroup
çÂÂ徠两个æÂÂä½Âå®ÂæÂÂÃ¥ÂÂÃ¥ÂÂè¿Âè¡ÂÃ¥ÂÂç»Âå¤ÂçÂÂãÂÂç¶åÂÂè·åÂÂç¸堳çÂÂç¨æ·信æ¯ï¼Â并å°Âè¯Âé¢Âä¿¡æ¯åÂÂç¸堳çÂÂå¸ÂÃ¥ÂÂä¿¡æ¯ç»ÂÃ¥ÂÂæÂÂPageInfo
ç»ÂæÂÂä½Âè¿ÂÃ¥ÂÂãÂÂ
- å½Â访é®
æÂÂ件说æÂÂ
server.go
使ç¨ Gin æ¡Âæ¶ç Goï¼ÂGolangï¼ÂWeb åºÂç¨ç¨ÂåºÂãÂÂå®Â建ç«ÂäºÂä¸Â个ç®ÂÃ¥ÂÂç Web æÂÂå¡å¨ï¼Â并æÂÂä¾Â两个端ç¹æÂ¥å¤ÂçÂÂä¸Â社åºè¯Âé¢Âç³»ç»Âç¸堳ç HTTP 请æ±ÂãÂÂä¸Âé¢对代ç Âè¿Âè¡Â解æÂÂï¼Â
- 导堥è¯Âå¥ï¼Â
import (
"communityTopics/controller"
"communityTopics/repository"
"fmt"
"github.com/gin-gonic/gin"
)
å¨è¿Âé¨åÂÂ代ç Âä¸Âï¼Â导堥äºÂå¿ è¦ÂçÂÂå ã”github.com/gin-gonic/gin” æ¯ Gin æ¡Âæ¶ï¼Âç¨äºÂÃ¥ÂÂ建 Web æÂÂå¡å¨4communityTopics/controller” å “communityTopics/repository” ï¼ÂÃ¥ÂÂå«å å«äºÂä¸Âå¡é»è¾ÂÃ¥ÂÂæ°æ®访é®æÂÂä½ÂãÂÂ
main
å½æ°ï¼Â
func main() {
repository.Init() // å¨è¿ÂéÂÂÃ¥ÂÂå§ÂÃ¥ÂÂä»ÂåºÂï¼Âæ°æ®åºÂæÂÂæ°æ®åÂÂå¨ï¼ÂãÂÂ
engine := gin.Default() // 使ç¨é»Â认ä¸Âé´件ï¼ÂæÂ¥å¿ÂãÂÂæ¢å¤Âï¼ÂÃ¥ÂÂ建ä¸Â个æ°ç Gin è·¯ç±å¨ãÂÂ
// å®Âä¹Âä¸Â个ç¨äºÂè·åÂÂ社åº页é¢信æ¯çÂÂè·¯ç±ï¼Âæ ¹æ®è¯Â颠IDãÂÂ
engine.GET("/community/page/get/:id", func(c *gin.Context) {
topicId := c.Param("id") // ä» URL Ã¥ÂÂæ°ä¸ÂæÂÂÃ¥ÂÂè¯Â颠IDãÂÂ
data := controller.QueryPageInfo(topicId) // è°Âç¨æ§å¶å¨å½æ°æÂ¥æ¥询页é¢信æ¯ãÂÂ
c.JSON(200, data) // 以 JSON æ ¼å¼Âè¿ÂÃ¥ÂÂ页é¢信æ¯æ°æ®ãÂÂ
})
// å®Âä¹Âä¸Â个ç¨äºÂÃ¥ÂÂå¸Â社åºå¸ÂÃ¥ÂÂçÂÂè·¯ç±ãÂÂ
engine.POST("/community/post/publish", func(c *gin.Context) {
userId := "1" // Ã¥ÂÂ设æµÂè¯Âç®çÂÂä¸ÂçÂÂç¨æ· IDãÂÂ
topicId := c.Query("tid") // ä»Â请池URL ä¸ÂæÂÂå "tid" æ¥询åÂÂæ°ãÂÂ
rootId := c.Query("rid") // ä»Â请池URL ä¸ÂæÂÂå "rid" æ¥询åÂÂæ°ãÂÂ
content := c.PostForm("content") // ä»Â请æ±Âä½Âï¼Â表åÂÂæ°æ®ï¼Âä¸ÂæÂÂå "content" Ã¥ÂÂæ°ãÂÂ
content = "æÂÂæ¯æµÂè¯Âè¯Â论" // å°ÂÃ¥ÂÂ
容设置为åºå®ÂÃ¥ÂÂ符串 "æÂÂæ¯æµÂè¯Âè¯Â论"ãÂÂå¯è½æ¯为äºÂæµÂè¯Âç®çÂÂãÂÂ
fmt.Println(userId, topicId, rootId, &content) // æÂÂå°æÂÂÃ¥ÂÂçÂÂå¼ï¼Âç¨äºÂè°Âè¯Âï¼ÂãÂÂ
// è°Âç¨æ§å¶å¨å½æ°æÂ¥åÂÂå¸Âå¸ÂÃ¥ÂÂï¼Â并è·åÂÂÃ¥ÂÂåºÂæ°æ®ãÂÂ
data := controller.PostPublish(userId, topicId, rootId, &content)
c.JSON(200, data) // 以 JSON æ ¼å¼Âè¿ÂÃ¥ÂÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂçÂÂç»ÂæÂÂæ°æ®ãÂÂ
})
engine.Run() // å¯å¨ Web æÂÂå¡å¨ï¼ÂçÂÂå¬é»Â认端å£ 8080ãÂÂ
}
代ç Âå±Â示äºÂ使ç¨ Gin æ¡Âæ¶ç Go Web åºÂç¨ç¨ÂåºÂçÂÂåºæ¬ç»ÂæÂÂãÂÂæ ¹æ® controller
å repository
Ã¥ÂÂ
çÂÂå®Âç°ï¼Â该åºÂç¨ç¨ÂåºÂå¯è½å¤ÂçÂÂ社åºè¯Âé¢Âä¿¡æ¯çÂÂæ£Âç´¢åÂÂÃ¥ÂÂå¸Âæ°çÂÂ社åºå¸ÂÃ¥ÂÂãÂÂGET
端ç¹ç¨äºÂæ ¹æ®ç»Âå®ÂçÂÂè¯Â颠ID è·åÂÂ页é¢信æ¯ï¼ÂPOST
端ç¹ç¨äºÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂï¼Â并åÂÂ
å«ç¸åÂ
³çÂÂä¿¡æ¯ï¼Âå¦Âç¨æ· IDãÂÂè¯Â颠IDãÂÂæ ¹å¸Âå IDï¼Âå¦ÂæÂÂæ¯对åÂ
ÂÃ¥ÂÂå¸ÂÃ¥ÂÂçÂÂÃ¥ÂÂå¤Âï¼Â以åÂÂÃ¥ÂÂ
容ãÂÂ
pageDate.go
代ç Âå®Âä¹ÂäºÂä¸Â个åÂÂ为 PageData
çÂÂç»ÂæÂÂä½Âï¼Âç¨äºÂå°Âè£Â
Ã¥ÂÂåºÂæ°æ®ï¼ÂéÂÂ常ç¨äºÂå¨æ§å¶å¨ä¸Âè¿ÂÃ¥ÂÂç»Â客æ·端çÂÂæ°æ®ãÂÂç»ÂæÂÂä½ÂÃ¥ÂÂ
å«ä¸Â个åÂÂ段ï¼Â
Code
ï¼Âç±»åÂÂ为int64
ï¼Âï¼Â表示åÂÂåºÂç¶æÂÂç Âï¼Âç¨äºÂæ Âè¯Â请æ±ÂçÂÂå¤ÂçÂÂç»ÂæÂÂï¼Âä¾Â妠200 表示æÂÂÃ¥ÂÂï¼Â400 表示客æ·端éÂÂ误ï¼Â500 表示æÂÂå¡å¨éÂÂ误çÂÂãÂÂMsg
ï¼Âç±»åÂÂ为string
ï¼Âï¼Â表示åÂÂåºÂæ¶Âæ¯ï¼ÂéÂÂ常ç¨äºÂÃ¥ÂÂ客æ·端è¿ÂÃ¥ÂÂä¸Âå¤ÂçÂÂç»ÂæÂÂç¸堳çÂÂä¸ÂäºÂæÂÂÃ¥ÂÂä¿¡æ¯ï¼Âæ¯Â妠“Success” 表示æÂÂÃ¥ÂÂ4Bad Request” 表示客æ·端请æ±ÂéÂÂ误çÂÂãÂÂData
ï¼Âç±»åÂÂ为interface{}
ï¼Âï¼Â表示åÂÂåºÂæ°æ®çÂÂ主ä½Âå 容ï¼Âå®Âæ¯ä¸Â个空æÂ¥å£类åÂÂï¼Âå æ¤å¯以åÂÂå¨任ä½Âç±»åÂÂçÂÂæ°æ®ï¼Âå æμæ¾°æ®类åÂÂãÂÂç»ÂæÂÂä½ÂãÂÂÃ¥ÂÂçÂÂãÂÂæ å°ÂçÂÂãÂÂ
å¨该ç»ÂæÂÂä½Âä¸Âï¼ÂÃ¥ÂÂ段æ Âç¾ï¼Âtagï¼Âjson:"..."
ç¨äºÂæÂÂå®Âå¨åºÂÃ¥ÂÂÃ¥ÂÂ为 JSON æ°æ®æ¶çÂÂÃ¥ÂÂ段åÂÂ称ãÂÂè¿Âæ ·ï¼Âå¨å°Âç»ÂæÂÂä½Â对象转æ¢为 JSON æ ¼å¼Âæ¶ï¼ÂÃ¥ÂÂ段åÂÂ称å°ÂæÂÂçÂ
§æ Âç¾æÂÂå®ÂçÂÂÃ¥ÂÂ称è¿Âè¡Âæ å°ÂãÂÂ
示ä¾Â使ç¨æ¹å¼Âï¼Â
// Ã¥ÂÂ建ä¸Â个 PageData å®Âä¾Âï¼Â并设置ç¸åºÂçÂÂÃ¥ÂÂ段å¼ãÂÂ
response := PageData{
Code: 200,
Msg: "Success",
Data: map[string]string{
"key1": "value1",
"key2": "value2",
},
}
// å° PageData å®Âä¾Â转æ¢为 JSON æ ¼å¼ÂçÂÂæ°æ®ï¼Â并è¿ÂÃ¥ÂÂç»Â客æ·端ãÂÂ
c.JSON(200, response)
ä¸Â述示ä¾Âä¸Âï¼ÂæÂÂ们åÂÂ建äºÂä¸Â个åÂÂ为 response
ç PageData
å®Âä¾Âï¼Â设置亠Code
å Msg
Ã¥ÂÂ段çÂÂå¼ï¼ÂÃ¥ÂÂæ¶å¨ Data
Ã¥ÂÂ段ä¸ÂÃ¥ÂÂå¨äºÂä¸Â个åÂÂ符串é®å¼对çÂÂæ å°ÂãÂÂç¶åÂÂï¼Â使ç¨ Gin ç c.JSON
æ¹æ³Âå°Â该ç»ÂæÂÂä½Âå®Âä¾Â转æ¢为 JSON æ ¼å¼ÂçÂÂæ°æ®ï¼Â并è¿ÂÃ¥ÂÂç»Â客æ·端ä½Â为 HTTP Ã¥ÂÂåºÂãÂÂ
post_publish.go
å®Âç¨äºÂå¤ÂçÂÂ社åºå¸ÂÃ¥ÂÂçÂÂÃ¥ÂÂå¸Âï¼Â并è°Âç¨亠service
Ã¥ÂÂ
ä¸ÂçÂÂå½æ°æÂ¥å®ÂæÂÂå®ÂéÂÂ
çÂÂä¸Âå¡é»è¾ÂãÂÂå½æ°æÂ¥åÂÂä¸ÂäºÂÃ¥ÂÂæ°ï¼Âæ ¹æ®è¿ÂäºÂÃ¥ÂÂæ°æ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸Âé»è¾Âï¼Â并è¿ÂÃ¥ÂÂä¸Â个 PageData
ç»ÂæÂÂä½ÂæÂÂéÂÂä½Â为ç»ÂæÂÂãÂÂ
å½æ°ç¾åÂÂï¼Â
func PostPublish(userIdStr string, topicIdStr string, rootIdStr string, content *string) *PageData
Ã¥ÂÂæ°说æÂÂï¼Â
userIdStr
ï¼Âç±»åÂÂ为string
ï¼Âï¼Â表示ç¨æ· IDï¼Âè¿ÂéÂÂÃ¥ÂÂ设æ¯以åÂÂ符串形å¼Âä¼ å ¥ãÂÂtopicIdStr
ï¼Âç±»åÂÂ为string
ï¼Âï¼Â表示è¯Â颠IDï¼ÂÃ¥ÂÂæ ·åÂÂ设æ¯以åÂÂ符串形å¼Âä¼ å ¥ãÂÂrootIdStr
ï¼Âç±»åÂÂ为string
ï¼Âï¼Â表示根å¸Âå IDï¼ÂÃ¥ÂÂæ ·åÂÂ设æ¯以åÂÂ符串形å¼Âä¼ å ¥ãÂÂå¦ÂæÂÂæ¯åÂÂå¤Âå¸ÂÃ¥ÂÂï¼ÂÃ¥ÂÂæ ¹æ®æ¤ ID 表示åÂÂå¤ÂçÂÂç®æ Âå¸ÂÃ¥ÂÂãÂÂcontent
ï¼Âç±»åÂÂ为*string
ï¼Âï¼ÂæÂÂÃ¥ÂÂå 容åÂÂ符串çÂÂæÂÂéÂÂãÂÂÃ¥ÂÂ设å¸ÂÃ¥ÂÂå 容éÂÂè¿ÂæÂÂéÂÂä¼ éÂÂï¼Âè¿Âæ ·å¯以æ¹便å°å¨å½æ°å 修æ¹å 容ãÂÂ
å½æ°è¿ÂÃ¥ÂÂå¼ï¼Â
- è¿ÂÃ¥ÂÂå¼为
*PageData
ï¼Â表示å¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂç»ÂæÂÂï¼Âå å«äºÂÃ¥ÂÂåºÂç¶æÂÂç ÂãÂÂæ¶Âæ¯åÂÂå¯è½çÂÂæ°æ®ãÂÂ
å½æ°æµÂç¨Âï¼Â
- å°Â
userIdStr
ãÂÂtopicIdStr
Ã¥ÂÂrootIdStr
è¿ÂäºÂÃ¥ÂÂ符串类åÂÂçÂÂÃ¥ÂÂæ°转æ¢为int64
ç±»åÂÂãÂÂè¿ÂéÂÂ使ç¨strconv.ParseInt
å½æ°æÂ¥å®Âç°转æ¢ãÂÂå¦ÂæÂÂ转æ¢åºéÂÂï¼Âä¼Âè¿ÂÃ¥ÂÂä¸Â个带æÂÂéÂÂ误信æ¯çÂÂPageData
ç»ÂæÂÂä½ÂæÂÂéÂÂï¼Â表示转æ¢失败ã - è°Âç¨
service.PostPublish
å½æ°ï¼Â并传堥转æ¢åÂÂçÂÂÃ¥ÂÂæ°以åÂÂcontent
æÂÂéÂÂãÂÂ该å½æ°ç¨äºÂå®Âé å¤ÂçÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂä¸Âå¡é»è¾Âï¼Â并è¿ÂÃ¥ÂÂÃ¥ÂÂå¸Âç»ÂæÂÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ã - å¦ÂæÂÂ
service.PostPublish
å½æ°æ§è¡Âè¿Âç¨Âä¸Âåºç°éÂÂ误ï¼Âä¼Âè¿ÂÃ¥ÂÂä¸Â个带æÂÂéÂÂ误信æ¯çÂÂPageData
ç»ÂæÂÂä½ÂæÂÂéÂÂï¼Â表示åÂÂå¸Â失败ã - å¦ÂæÂÂä¸ÂÃ¥ÂÂ顺å©ï¼Âå°Â
data
ï¼Âç±service.PostPublish
è¿ÂÃ¥ÂÂçÂÂæ°æ®ï¼Âå¡«å  å°PageData
ç»ÂæÂÂä½Âä¸Âï¼Â并è¿ÂÃ¥ÂÂä¸Â个表示åÂÂå¸ÂæÂÂÃ¥ÂÂçÂÂPageData
ç»ÂæÂÂä½ÂæÂÂéÂÂãÂÂ
注æÂÂäºÂ项ï¼Â
- è¿ÂéÂÂçÂÂ
PageData
ç»ÂæÂÂä½Âä¸Âä¹ÂÃ¥ÂÂå®Âä¹ÂçÂÂPageData
ç»ÂæÂÂä½Âæ¯åÂÂä¸Â个ç»ÂæÂÂä½ÂãÂÂå®Âç¨äºÂå°Âå¤ÂçÂÂç»ÂæÂÂå°Â裠æÂÂä¸Â个ç»Âä¸ÂçÂÂæ ¼å¼Âï¼Âæ¹便å¨æ§å¶å¨ä¸Âè¿ÂÃ¥ÂÂç»Â客æ·端ã - å¨å®Âé åºÂç¨ä¸Âï¼Âå¯è½è¿ÂéÂÂè¦Â对å¸ÂÃ¥ÂÂå 容è¿Âè¡Âæ ¡éªÂÃ¥ÂÂå¤ÂçÂÂï¼Â以确ä¿Âè¾Âå ¥çÂÂæ°æ®符åÂÂè¦Âæ±Âï¼Âé¿å Âæ½Âå¨çÂÂå®Âå ¨é®é¢ÂãÂÂ
- å½æ°ä¸ÂçÂÂéÂÂ误å¤ÂçÂÂæ¯ç®ÂÃ¥ÂÂå°å°ÂéÂÂ误信æ¯è¿ÂÃ¥ÂÂç»Â客æ·端ï¼Âå®Âé åºÂç¨ä¸Âå¯è½éÂÂè¦Âæ´å 详ç»ÂçÂÂéÂÂ误å¤ÂçÂÂï¼Âæ¯Âå¦Âè®°å½ÂæÂ¥å¿ÂãÂÂä¸ÂÃ¥ÂÂç±»åÂÂçÂÂéÂÂ误è¿ÂÃ¥ÂÂä¸ÂÃ¥ÂÂçÂÂç¶æÂÂç ÂçÂÂãÂÂ
示ä¾Âç¨æ³Âï¼Â
content := "è¿Âæ¯ä¸Â个æµÂè¯Âå¸ÂÃ¥ÂÂÃ¥ÂÂ
容"
result := controller.PostPublish("123", "456", "789", &content)
å¨ä¸Â述示ä¾Âä¸Âï¼ÂæÂÂ们è°Âç¨ PostPublish
å½æ°ï¼Â并传åÂ
¥åÂÂ符串类åÂÂçÂÂÃ¥ÂÂæ°ï¼Âç¨æ· IDãÂÂè¯Â颠IDãÂÂæ ¹å¸Âå IDï¼Â以åÂÂÃ¥ÂÂ
容åÂÂ符串çÂÂæÂÂéÂÂãÂÂå½æ°å°Âæ ¹æ®åÂÂæ°æ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸Âé»è¾Âï¼Â并è¿ÂÃ¥ÂÂä¸Â个 PageData
ç»ÂæÂÂä½ÂæÂÂéÂÂä½Â为åÂÂå¸Âç»ÂæÂÂãÂÂ
query_page_info.go
å®Âç¨äºÂæ ¹æ®è¯Â颠ID æ¥询页é¢信æ¯ï¼Â并è°Âç¨亠service
Ã¥ÂÂ
ä¸ÂçÂÂå½æ°æÂ¥å¤ÂçÂÂå®ÂéÂÂ
çÂÂä¸Âå¡é»è¾ÂãÂÂå½æ°æÂ¥åÂÂè¯Â颠ID çÂÂÃ¥ÂÂ符串形å¼Âä½Â为åÂÂæ°ï¼Âå°ÂÃ¥Â
¶è½¬æ¢为 int64
ç±»åÂÂï¼Â并è¿ÂÃ¥ÂÂä¸Â个 PageData
ç»ÂæÂÂä½ÂæÂÂéÂÂä½Â为æ¥询ç»ÂæÂÂãÂÂ
å½æ°ç¾åÂÂï¼Â
func QueryPageInfo(topicIdStr string) *PageData
Ã¥ÂÂæ°说æÂÂï¼Â
topicIdStr
ï¼Âç±»åÂÂ为string
ï¼Âï¼Â表示è¯Â颠IDï¼ÂÃ¥ÂÂ设æ¯以åÂÂ符串形å¼Âä¼ å ¥ãÂÂ
å½æ°è¿ÂÃ¥ÂÂå¼ï¼Â
- è¿ÂÃ¥ÂÂå¼为
*PageData
ï¼Â表示æ¥询ç»ÂæÂÂï¼Âå å«äºÂÃ¥ÂÂåºÂç¶æÂÂç ÂãÂÂæ¶Âæ¯åÂÂå¯è½çÂÂæ°æ®ãÂÂ
å½æ°æµÂç¨Âï¼Â
- å°Â
topicIdStr
è¿Â个åÂÂ符串类åÂÂçÂÂÃ¥ÂÂæ°转æ¢为int64
ç±»åÂÂãÂÂè¿ÂéÂÂ使ç¨strconv.ParseInt
å½æ°æÂ¥å®Âç°转æ¢ãÂÂå¦ÂæÂÂ转æ¢åºéÂÂï¼Âä¼Âè¿ÂÃ¥ÂÂä¸Â个带æÂÂéÂÂ误信æ¯çÂÂPageData
ç»ÂæÂÂä½ÂæÂÂéÂÂï¼Â表示转æ¢失败ã - è°Âç¨
service.QueryPageInfo
å½æ°ï¼Â并传堥转æ¢åÂÂçÂÂè¯Â颠IDãÂÂ该å½æ°ç¨äºÂå®Âé å¤ÂçÂÂæ¥询页é¢信æ¯çÂÂä¸Âå¡é»è¾Âï¼Â并è¿ÂÃ¥ÂÂæ¥询ç»ÂæÂÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ã - å¦ÂæÂÂ
service.QueryPageInfo
å½æ°æ§è¡Âè¿Âç¨Âä¸Âåºç°éÂÂ误ï¼Âä¼Âè¿ÂÃ¥ÂÂä¸Â个带æÂÂéÂÂ误信æ¯çÂÂPageData
ç»ÂæÂÂä½ÂæÂÂéÂÂï¼Â表示æ¥询失败ã - å¦ÂæÂÂä¸ÂÃ¥ÂÂ顺å©ï¼Âå°Â
pageInfo
ï¼Âç±service.QueryPageInfo
è¿ÂÃ¥ÂÂçÂÂæ°æ®ï¼Âå¡«å  å°PageData
ç»ÂæÂÂä½Âä¸Âï¼Â并è¿ÂÃ¥ÂÂä¸Â个表示æ¥询æÂÂÃ¥ÂÂçÂÂPageData
ç»ÂæÂÂä½ÂæÂÂéÂÂãÂÂ
注æÂÂäºÂ项ï¼Â
- è¿ÂéÂÂçÂÂ
PageData
ç»ÂæÂÂä½Âä¸Âä¹ÂÃ¥ÂÂå®Âä¹ÂçÂÂPageData
ç»ÂæÂÂä½Âæ¯åÂÂä¸Â个ç»ÂæÂÂä½ÂãÂÂå®Âç¨äºÂå°Âå¤ÂçÂÂç»ÂæÂÂå°Â裠æÂÂä¸Â个ç»Âä¸ÂçÂÂæ ¼å¼Âï¼Âæ¹便å¨æ§å¶å¨ä¸Âè¿ÂÃ¥ÂÂç»Â客æ·端ã - å¨å®Âé åºÂç¨ä¸Âï¼Âå¯è½è¿ÂéÂÂè¦Âè¿Âè¡Âæ´å¤ÂæÂÂçÂÂé»è¾Âå¤ÂçÂÂÃ¥ÂÂæ°æ®æ¥询ï¼Â以è¿ÂÃ¥ÂÂæ´丰å¯ÂçÂÂ页é¢信æ¯ãÂÂ
- å½æ°ä¸ÂçÂÂéÂÂ误å¤ÂçÂÂæ¯ç®ÂÃ¥ÂÂå°å°ÂéÂÂ误信æ¯è¿ÂÃ¥ÂÂç»Â客æ·端ï¼Âå®Âé åºÂç¨ä¸Âå¯è½éÂÂè¦Âæ´å 详ç»ÂçÂÂéÂÂ误å¤ÂçÂÂï¼Âæ¯Âå¦Âè®°å½ÂæÂ¥å¿ÂãÂÂä¸ÂÃ¥ÂÂç±»åÂÂçÂÂéÂÂ误è¿ÂÃ¥ÂÂä¸ÂÃ¥ÂÂçÂÂç¶æÂÂç ÂçÂÂãÂÂ
示ä¾Âç¨æ³Âï¼Â
result := controller.QueryPageInfo("123")
å¨ä¸Â述示ä¾Âä¸Âï¼ÂæÂÂ们è°Âç¨ QueryPageInfo
å½æ°ï¼Â并传åÂ
¥è¯Â颠ID çÂÂÃ¥ÂÂ符串形å¼Âä½Â为åÂÂæ°ãÂÂå½æ°å°Âæ ¹æ®è¯Â颠ID æ¥询页é¢信æ¯ï¼Â并è¿ÂÃ¥ÂÂä¸Â个 PageData
ç»ÂæÂÂä½ÂæÂÂéÂÂä½Â为æ¥询ç»ÂæÂÂãÂÂ
DBInit.go
ç¨äºÂÃ¥ÂÂå§ÂÃ¥ÂÂÃ¥ÂÂ管çÂÂæ°æ®åºÂè¿ÂæÂ¥ãÂÂå¨è¿ÂéÂÂï¼Âå®Â使ç¨亠GORM (Go ORM) åºÂæÂ¥è¿ÂæÂÂ¥ MySQL æ°æ®åºÂï¼Â并å¨åÂÂå§ÂÃ¥ÂÂæ¶åÂÂ建ä¸Â个åÂ
¨å±ÂçÂÂæ°æ®åºÂè¿ÂæÂ¥åÂÂé db
ãÂÂ
代ç Â解éÂÂï¼Â
- 导堥è¯Âå¥ï¼Â
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
è¿ÂéÂÂ导堥亠GORM ç¸堳çÂÂå ï¼Âå æ¬ MySQL 驱å¨ãÂÂGORM 主åºÂ以å GORM æÂ¥å¿Â模åÂÂãÂÂ
- Ã¥Â
¨å±ÂÃ¥ÂÂéÂÂ
db
ï¼Â
var db *gorm.DB
å®Âä¹ÂäºÂä¸Â个åÂ
¨å±ÂÃ¥ÂÂé db
ï¼Âç¨äºÂä¿Âå GORM æ°æ®åºÂè¿ÂæÂ¥ãÂÂ
Init()
å½æ°ï¼Â
func Init() error {
// æ°æ®åºÂè¿ÂæÂ¥åÂÂ符串ï¼ÂDSNï¼Âï¼ÂæÂÂå®ÂäºÂæ°æ®åºÂçÂÂå°åÂÂãÂÂç¨æ·åÂÂãÂÂå¯Âç ÂãÂÂæ°æ®åºÂÃ¥ÂÂ称çÂÂä¿¡æ¯ãÂÂ
dsn := "root:123456@tcp(127.0.0.1:3306)/communityTopics?charset=utf8mb4&parseTime=True&loc=Local"
// 使ç¨ GORM æÂÂå¼ MySQL æ°æ®åºÂè¿ÂæÂ¥ï¼ÂÃ¥ÂÂ建æ°æ®åºÂè¿Âæ¥对象 dbãÂÂ
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info), // 使ç¨é»Â认çÂÂæÂ¥å¿Âè®°å½Âå¨ï¼Â设置æÂ¥å¿Â模å¼Â为 InfoãÂÂ
})
return err // è¿ÂÃ¥ÂÂè¿ÂæÂ¥è¿Âç¨Âä¸ÂçÂÂéÂÂ误ï¼Âå¦ÂæÂÂæÂÂï¼ÂãÂÂ
}
å¨ Init()
å½æ°ä¸Âï¼Âå®Âé¦ÂÃ¥Â
Â设置æ°æ®åºÂè¿ÂæÂ¥åÂÂ符串 dsn
ï¼ÂÃ¥Â
¶ä¸ÂÃ¥ÂÂ
å«æ°æ®åºÂå°åÂÂãÂÂç¨æ·åÂÂãÂÂå¯Âç ÂãÂÂæ°æ®åºÂÃ¥ÂÂ称çÂÂä¿¡æ¯ãÂÂç¶åÂÂï¼Â使ç¨ GORM ç gorm.Open
å½æ°æÂÂå¼ MySQL æ°æ®åºÂè¿ÂæÂ¥ï¼Â并传åÂ
¥ç¸åºÂç MySQL 驱å¨åÂÂéÂ
Â置信æ¯ãÂÂè¿Âæ ·ï¼ÂÃ¥Â
¨å±ÂÃ¥ÂÂé db
å°ÂæÂÂæÂÂ对æ°æ®åºÂçÂÂè¿ÂæÂ¥ãÂÂ
è¿ÂÃ¥ÂÂå¼为 error
ï¼Âç¨äºÂ表示æ°æ®åºÂè¿ÂæÂ¥è¿Âç¨Âä¸Âæ¯å¦åºç°éÂÂ误ãÂÂå¦ÂæÂÂè¿ÂæÂ¥æÂÂÃ¥ÂÂï¼Âè¿Âå nil
ï¼Âå¦åÂÂè¿ÂÃ¥ÂÂè¿ÂæÂ¥è¿Âç¨Âä¸ÂçÂÂéÂÂ误ãÂÂ
注æÂÂäºÂ项ï¼Â
- æ¤å¤Â使ç¨çÂÂæ¯ GORM v2 çÂÂæÂÂåºÂãÂÂGORM æ¯ä¸Â个ä¼Âç§Âç ORM åºÂï¼Âå®Âç®ÂÃ¥ÂÂäºÂæ°æ®åºÂæÂÂä½ÂÃ¥ÂÂæ°æ®模åÂÂçÂÂ管çÂÂãÂÂ
- æ°æ®åºÂè¿ÂæÂ¥åÂÂ符串
dsn
éÂÂè¦Âæ ¹æ®å®Âé æ åÂ抨Âè¡Âé Âç½®ï¼Âå æ¾°æ®åºÂçÂÂç¨æ·åÂÂãÂÂå¯Âç ÂãÂÂå°åÂÂãÂÂ端å£å·åÂÂæ°æ®åºÂÃ¥ÂÂ称çÂÂä¿¡æ¯ã - å¨å®Âé åºÂç¨ä¸Âï¼Âå¯è½è¿ÂéÂÂè¦Â设置è¿Âæ¥池大å°ÂãÂÂ趠æ¶æ¶é´çÂÂæ°æ®åºÂè¿ÂæÂ¥ç¸堳çÂÂé Âç½®ãÂÂæ¤å¤ÂçÂÂ代ç ÂåªæÂÂä¾ÂäºÂåºæÂÂæ°æ®åºÂè¿ÂæÂ¥é¨åÂÂãÂÂ
- å¨åÂÂå§ÂÃ¥ÂÂæ¶è°Âç¨
repository.Init()
æÂ¥åÂÂå§ÂÃ¥ÂÂæ°æ®åºÂè¿ÂæÂ¥ï¼Âä¿Âè¯Âæ°æ®åºÂè¿ÂæÂ¥çÂÂå¯ä¸Âæ§åÂÂå¤Âç¨æ§ãÂÂ
示ä¾Âç¨æ³Âï¼Â
err := repository.Init()
if err != nil {
// å¤ÂçÂÂæ°æ®åºÂè¿ÂæÂ¥éÂÂ误ãÂÂ
}
// ç¨ÂåºÂçÂÂÃ¥Â
¶ä»Âé¨åÂÂå¯以使ç¨åÂ
¨å±ÂÃ¥ÂÂé db æÂ¥æ§è¡Âæ°æ®åºÂæÂÂä½ÂãÂÂ
以ä¸Â代ç Âæ¯ä¸Â个åºæÂÂæ°æ®åºÂè¿ÂæÂ¥åÂÂå§ÂÃ¥ÂÂçÂÂ示ä¾ÂãÂÂå¨å®Âé åºÂç¨ä¸Âï¼Âè¿ÂéÂÂè¦Âæ ¹æ®堷ä½ÂéÂÂæ±Âè¿Âè¡Âæ°æ®åºÂ模åÂÂå®Âä¹ÂãÂÂæ°æ®æÂÂä½Âå½æ°ç¼ÂÃ¥ÂÂçÂÂå·¥ä½ÂãÂÂ
post.go
å®Âä¹ÂäºÂÃ¥ÂÂ为 Post
çÂÂç»ÂæÂÂä½Âï¼Â表示æ°æ®åºÂä¸ÂçÂÂå¸ÂÃ¥ÂÂ表ãÂÂÃ¥ÂÂæ¶ï¼Âè¿ÂÃ¥ÂÂ
å«äºÂä¸Â个åÂÂ为 PostDao
çÂÂç»ÂæÂÂä½Âï¼Âç¨äºÂæ§è¡Âä¸Âå¸ÂÃ¥ÂÂæ°æ®ç¸åÂ
³çÂÂæ°æ®åºÂæÂÂä½ÂãÂÂ
代ç Â解éÂÂï¼Â
Post
ç»ÂæÂÂä½Âï¼Â
type Post struct {
Id int64 `gorm:"column:id"`
UserId int64 `gorm:"column:user_id"`
TopicId int64 `gorm:"column:topic_id"`
RootId int `gorm:"column:root_id"`
Content string `gorm:"column:content"`
Likes int64 `gorm:"column:likes;default:0"`
CreateTime int64 `gorm:"autoUpdateTime:milli"`
}
Post
ç»ÂæÂÂä½Âå®Âä¹ÂäºÂå¸ÂÃ¥ÂÂçÂÂÃ¥ÂÂ段ï¼Â并使ç¨亠GORM ç struct tagï¼Âç»ÂæÂÂæ Âç¾ï¼ÂæÂ¥æÂÂå®Âæ¯Â个åÂÂ段ä¸Âæ°æ®åºÂ表ä¸ÂçÂÂÃ¥ÂÂÃ¥ÂÂ对åºÂÃ¥Â
³ç³»ãÂÂè¿Âæ ·ï¼ÂGORM å°±è½å¤Âæ ¹æ®ç»ÂæÂÂä½ÂÃ¥ÂÂ段èªå¨æ å°Âå°æ°æ®åºÂ表çÂÂÃ¥ÂÂä¸ÂãÂÂ
func (Post) TableName() string
æ¹æ³Âï¼Â
func (Post) TableName() string {
return "post"
}
TableName()
æ¹æ³Âç¨äºÂæÂÂå® Post
ç»ÂæÂÂä½ÂæÂÂ对åºÂçÂÂæ°æ®åºÂ表åÂÂ称æ¯ “post”ãÂÂGORM å¨è¿Âè¡Âæ°æ®åºÂæÂÂä½Âæ¶å°Âä¼Âæ ¹æ®该æ¹æ³Âè¿ÂÃ¥ÂÂçÂÂ表åÂÂè¿Âè¡Âæ¥询ãÂÂæÂÂÃ¥Â
¥çÂÂæÂÂä½ÂãÂÂ
PostDao
ç»ÂæÂÂä½Âï¼Â
type PostDao struct{}
PostDao
ç»ÂæÂÂä½Âæ¯ä¸Â个空ç»ÂæÂÂä½Âï¼Â没æÂÂä»»ä½ÂÃ¥ÂÂ段ï¼Âå®Âç¨äºÂç»Âç»Âä¸Âå¸ÂÃ¥ÂÂæ°æ®ç¸åÂ
³çÂÂæ°æ®åºÂæÂÂä½Âå½æ°ãÂÂ
- Ã¥Â
¨å±ÂÃ¥ÂÂéÂÂ
postDao
Ã¥ÂÂpostOnce
ï¼Â
var (
postDao *PostDao
postOnce sync.Once
)
postDao
æ¯ä¸Â个æÂÂå PostDao
ç»ÂæÂÂä½ÂçÂÂæÂÂéÂÂï¼Âç¨äºÂå¨åÂÂä¾Â模å¼Âä¸Âä¿ÂæÂÂä¸Â个 PostDao
å®Âä¾ÂãÂÂpostOnce
æ¯ä¸Â个 sync.Once
ç±»åÂÂçÂÂÃ¥ÂÂéÂÂï¼Âç¨äºÂç¡®ä¿ÂåªæÂÂå¨第ä¸Â次è°Âç¨æ¶æÂÂä¼ÂÃ¥ÂÂ建 PostDao
å®Âä¾ÂãÂÂ
NewPostDaoInstance()
å½æ°ï¼Â
func NewPostDaoInstance() *PostDao {
postOnce.Do(
func() {
postDao = &PostDao{}
})
return postDao
}
NewPostDaoInstance()
å½æ°ç¨äºÂè·å PostDao
çÂÂå®Âä¾ÂãÂÂå®Â使ç¨ sync.Once
æÂ¥ä¿Âè¯ÂåªåÂÂ建ä¸Â个å®Âä¾Âï¼Â并éÂÂè¿Âè¿ÂÃ¥ÂÂæÂÂé postDao
æÂ¥æÂÂä¾Â对å¯ä¸Âå®Âä¾ÂçÂÂ访é®ãÂÂ
PostDao
ç»ÂæÂÂä½ÂçÂÂæ¹æ³Âï¼Â
QueryPostById(id int64) (*Post, error)
ï¼Âæ ¹æ®å¸Âå ID æ¥询åÂÂ个å¸ÂÃ¥ÂÂä¿¡æ¯ï¼Â并è¿ÂÃ¥ÂÂå¸ÂÃ¥ÂÂç»ÂæÂÂä½ÂæÂÂéÂÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂQueryPostByTopicId(topicId int64) ([]*Post, error)
ï¼Âæ ¹æ®è¯Â颠ID æ¥询ç¸堳å¸ÂÃ¥ÂÂä¿¡æ¯ï¼Â并è¿ÂÃ¥ÂÂå¸ÂÃ¥ÂÂç»ÂæÂÂä½ÂÃ¥ÂÂçÂÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂCreatePost(post *Post) error
ï¼ÂÃ¥ÂÂ建ä¸Â个æ°çÂÂå¸ÂÃ¥ÂÂï¼Â并å°Âå¸ÂÃ¥ÂÂç»ÂæÂÂä½ÂæÂÂå ¥æ°æ®åºÂï¼Âè¿ÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂ
è¿ÂäºÂæ¹æ³Â使ç¨ db
Ã¥Â
¨å±ÂÃ¥ÂÂéÂÂï¼Âå¨ Init()
å½æ°ä¸ÂÃ¥ÂÂå§ÂÃ¥ÂÂï¼ÂæÂ¥æ§è¡Âæ°æ®åºÂæÂÂä½Âï¼ÂéÂÂè¿ GORM æÂÂä¾Âç API æÂ¥å®ÂæÂÂæ°æ®çÂÂæ¥询åÂÂæÂÂÃ¥Â
¥æÂÂä½ÂãÂÂ
注æÂÂäºÂ项ï¼Â
PostDao
ç»ÂæÂÂä½Âä¸ÂçÂÂæ¹æ³Âæ¯ç¨æÂ¥å¤ÂçÂÂå¸ÂÃ¥ÂÂæ°æ®ä¸Âæ°æ®åºÂä¹Âé´çÂÂ交äºÂï¼Âè¿ÂäºÂæ¹æ³Âæ§è¡ÂäºÂç¸åºÂçÂÂæ°æ®åºÂæÂÂä½Âï¼Â并è¿ÂÃ¥ÂÂæ°æ®æÂÂéÂÂ误信æ¯ãÂÂ- 为äºÂä¿Âè¯Âæ°æ®çÂÂå®Âå ¨æ§åÂÂä¸Âè´æ§ï¼Âå¯以å¨è¿ÂäºÂæ¹æ³Âä¸Âå 堥äºÂå¡å¤ÂçÂÂçÂÂÃ¥ÂÂè½ï¼Âç¡®ä¿ÂæÂÂä½ÂçÂÂÃ¥ÂÂÃ¥ÂÂæ§ãÂÂ
- æ¤å¤ÂçÂÂ示ä¾Â代ç Âåªå±Â示äºÂä¸Âå¸ÂÃ¥ÂÂç¸堳çÂÂæ°æ®åºÂæÂÂä½Âï¼Âå®Âé åºÂç¨ä¸Âå¯è½è¿ÂéÂÂè¦Âå®Âä¹Âå ¶ä»Âæ°æ®表çÂÂç»ÂæÂÂä½ÂÃ¥ÂÂç¸åºÂçÂÂæÂÂä½Âæ¹æ³ÂãÂÂ
示ä¾Âç¨æ³Âï¼Â
postDao := repository.NewPostDaoInstance()
// æ¥询å¸ÂÃ¥ÂÂä¿¡æ¯
post, err := postDao.QueryPostById(123)
if err != nil {
// å¤ÂçÂÂæ¥询éÂÂ误ãÂÂ
}
// Ã¥ÂÂ建æ°å¸ÂÃ¥ÂÂ
newPost := &repository.Post{
UserId: 1,
TopicId: 456,
Content: "è¿Âæ¯ä¸Â个æ°å¸ÂÃ¥ÂÂ",
}
err = postDao.CreatePost(newPost)
if err != nil {
// å¤ÂçÂÂÃ¥ÂÂ建å¸ÂÃ¥ÂÂéÂÂ误ãÂÂ
}
topic.go
å®Âä¹ÂäºÂÃ¥ÂÂ为 Topic
çÂÂç»ÂæÂÂä½Âï¼Â表示æ°æ®åºÂä¸ÂçÂÂè¯Âé¢Â表ãÂÂÃ¥ÂÂæ¶ï¼Âè¿ÂÃ¥ÂÂ
å«äºÂä¸Â个åÂÂ为 TopicDao
çÂÂç»ÂæÂÂä½Âï¼Âç¨äºÂæ§è¡Âä¸Âè¯Âé¢Âæ°æ®ç¸åÂ
³çÂÂæ°æ®åºÂæÂÂä½ÂãÂÂ
代ç Â解éÂÂï¼Â
Topic
ç»ÂæÂÂä½Âï¼Â
type Topic struct {
Id int64 `gorm:"column:id"`
UserId int64 `gorm:"column:user_id"`
Title string `gorm:"column:title"`
Content string `gorm:"column:content"`
CreateTime int64 `gorm:"autoCreateTime;column:create_time"`
ViewCount int64 `gorm:"column:view_count;default:0"`
}
Topic
ç»ÂæÂÂä½Âå®Âä¹ÂäºÂè¯Âé¢ÂçÂÂÃ¥ÂÂ段ï¼Â并使ç¨亠GORM ç struct tagï¼Âç»ÂæÂÂæ Âç¾ï¼ÂæÂ¥æÂÂå®Âæ¯Â个åÂÂ段ä¸Âæ°æ®åºÂ表ä¸ÂçÂÂÃ¥ÂÂÃ¥ÂÂ对åºÂÃ¥Â
³ç³»ãÂÂè¿Âæ ·ï¼ÂGORM å°±è½å¤Âæ ¹æ®ç»ÂæÂÂä½ÂÃ¥ÂÂ段èªå¨æ å°Âå°æ°æ®åºÂ表çÂÂÃ¥ÂÂä¸ÂãÂÂ
func (Topic) TableName() string
æ¹æ³Âï¼Â
func (Topic) TableName() string {
return "topic"
}
TableName()
æ¹æ³Âç¨äºÂæÂÂå® Topic
ç»ÂæÂÂä½ÂæÂÂ对åºÂçÂÂæ°æ®åºÂ表åÂÂ称æ¯ “topic”ãÂÂGORM å¨è¿Âè¡Âæ°æ®åºÂæÂÂä½Âæ¶å°Âä¼Âæ ¹æ®该æ¹æ³Âè¿ÂÃ¥ÂÂçÂÂ表åÂÂè¿Âè¡Âæ¥询ãÂÂæÂÂÃ¥Â
¥çÂÂæÂÂä½ÂãÂÂ
TopicDao
ç»ÂæÂÂä½Âï¼Â
type TopicDao struct{}
TopicDao
ç»ÂæÂÂä½Âæ¯ä¸Â个空ç»ÂæÂÂä½Âï¼Â没æÂÂä»»ä½ÂÃ¥ÂÂ段ï¼Âå®Âç¨äºÂç»Âç»Âä¸Âè¯Âé¢Âæ°æ®ç¸åÂ
³çÂÂæ°æ®åºÂæÂÂä½Âå½æ°ãÂÂ
- Ã¥Â
¨å±ÂÃ¥ÂÂéÂÂ
topicDao
Ã¥ÂÂtopicOnce
ï¼Â
var (
topicDao *TopicDao
topicOnce sync.Once
)
topicDao
æ¯ä¸Â个æÂÂå TopicDao
ç»ÂæÂÂä½ÂçÂÂæÂÂéÂÂï¼Âç¨äºÂå¨åÂÂä¾Â模å¼Âä¸Âä¿ÂæÂÂä¸Â个 TopicDao
å®Âä¾ÂãÂÂtopicOnce
æ¯ä¸Â个 sync.Once
ç±»åÂÂçÂÂÃ¥ÂÂéÂÂï¼Âç¨äºÂç¡®ä¿ÂåªæÂÂå¨第ä¸Â次è°Âç¨æ¶æÂÂä¼ÂÃ¥ÂÂ建 TopicDao
å®Âä¾ÂãÂÂ
NewTopicDaoInstance()
å½æ°ï¼Â
func NewTopicDaoInstance() *TopicDao {
topicOnce.Do(
func() {
topicDao = &TopicDao{}
})
return topicDao
}
NewTopicDaoInstance()
å½æ°ç¨äºÂè·å TopicDao
çÂÂå®Âä¾ÂãÂÂå®Â使ç¨ sync.Once
æÂ¥ä¿Âè¯ÂåªåÂÂ建ä¸Â个å®Âä¾Âï¼Â并éÂÂè¿Âè¿ÂÃ¥ÂÂæÂÂé topicDao
æÂ¥æÂÂä¾Â对å¯ä¸Âå®Âä¾ÂçÂÂ访é®ãÂÂ
TopicDao
ç»ÂæÂÂä½ÂçÂÂæ¹æ³Âï¼Â
QueryTopicById(id int64) (*Topic, error)
ï¼Âæ ¹æ®è¯Â颠ID æ¥询åÂÂ个è¯Âé¢Âä¿¡æ¯ï¼Â并è¿ÂÃ¥ÂÂè¯Âé¢Âç»ÂæÂÂä½ÂæÂÂéÂÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂAddTopic(topic *Topic) error
ï¼Âæ°å¢Âä¸Â个è¯Âé¢Âï¼Â并å°Âè¯Âé¢Âç»ÂæÂÂä½ÂæÂÂå ¥æ°æ®åºÂï¼Âè¿ÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂ
è¿ÂäºÂæ¹æ³Â使ç¨ db
Ã¥Â
¨å±ÂÃ¥ÂÂéÂÂï¼Âå¨ Init()
å½æ°ä¸ÂÃ¥ÂÂå§ÂÃ¥ÂÂï¼ÂæÂ¥æ§è¡Âæ°æ®åºÂæÂÂä½Âï¼ÂéÂÂè¿ GORM æÂÂä¾Âç API æÂ¥å®ÂæÂÂæ°æ®çÂÂæ¥询åÂÂæÂÂÃ¥Â
¥æÂÂä½ÂãÂÂ
注æÂÂäºÂ项ï¼Â
TopicDao
ç»ÂæÂÂä½Âä¸ÂçÂÂæ¹æ³Âæ¯ç¨æÂ¥å¤ÂçÂÂè¯Âé¢Âæ°æ®ä¸Âæ°æ®åºÂä¹Âé´çÂÂ交äºÂï¼Âè¿ÂäºÂæ¹æ³Âæ§è¡ÂäºÂç¸åºÂçÂÂæ°æ®åºÂæÂÂä½Âï¼Â并è¿ÂÃ¥ÂÂæ°æ®æÂÂéÂÂ误信æ¯ãÂÂ- 为äºÂä¿Âè¯Âæ°æ®çÂÂå®Âå ¨æ§åÂÂä¸Âè´æ§ï¼Âå¯以å¨è¿ÂäºÂæ¹æ³Âä¸Âå 堥äºÂå¡å¤ÂçÂÂçÂÂÃ¥ÂÂè½ï¼Âç¡®ä¿ÂæÂÂä½ÂçÂÂÃ¥ÂÂÃ¥ÂÂæ§ãÂÂ
- æ¤å¤ÂçÂÂ示ä¾Â代ç Âåªå±Â示äºÂä¸Âè¯Âé¢Âç¸堳çÂÂæ°æ®åºÂæÂÂä½Âï¼Âå®Âé åºÂç¨ä¸Âå¯è½è¿ÂéÂÂè¦Âå®Âä¹Âå ¶ä»Âæ°æ®表çÂÂç»ÂæÂÂä½ÂÃ¥ÂÂç¸åºÂçÂÂæÂÂä½Âæ¹æ³ÂãÂÂ
示ä¾Âç¨æ³Âï¼Â
topicDao := repository.NewTopicDaoInstance()
// æ¥询è¯Âé¢Âä¿¡æ¯
topic, err := topicDao.QueryTopicById(123)
if err != nil {
// å¤ÂçÂÂæ¥询éÂÂ误ãÂÂ
}
// Ã¥ÂÂ建æ°è¯Âé¢Â
newTopic := &repository.Topic{
UserId: 1,
Title: "æ°è¯Âé¢Âæ Âé¢Â",
Content: "è¿Âæ¯ä¸Â个æ°è¯Âé¢ÂÃ¥ÂÂ
容",
}
err = topicDao.AddTopic(newTopic)
if err != nil {
// å¤ÂçÂÂÃ¥ÂÂ建è¯Âé¢ÂéÂÂ误ãÂÂ
}
user.go
å®Âä¹ÂäºÂÃ¥ÂÂ为 User
çÂÂç»ÂæÂÂä½Âï¼Â表示æ°æ®åºÂä¸ÂçÂÂç¨æ·表ãÂÂÃ¥ÂÂæ¶ï¼Âè¿ÂÃ¥ÂÂ
å«äºÂä¸Â个åÂÂ为 UserDao
çÂÂç»ÂæÂÂä½Âï¼Âç¨äºÂæ§è¡Âä¸Âç¨æ·æ°æ®ç¸åÂ
³çÂÂæ°æ®åºÂæÂÂä½ÂãÂÂ
代ç Â解éÂÂï¼Â
User
ç»ÂæÂÂä½Âï¼Â
type User struct {
Id int64 `gorm:"column:id"`
Name string `gorm:"column:name"`
Avatar string `gorm:"column:avatar"`
Level int `gorm:"column:level"`
CreateTime int64 `gorm:"column:create_time"`
}
User
ç»ÂæÂÂä½Âå®Âä¹ÂäºÂç¨æ·çÂÂÃ¥ÂÂ段ï¼Â并使ç¨亠GORM ç struct tagï¼Âç»ÂæÂÂæ Âç¾ï¼ÂæÂ¥æÂÂå®Âæ¯Â个åÂÂ段ä¸Âæ°æ®åºÂ表ä¸ÂçÂÂÃ¥ÂÂÃ¥ÂÂ对åºÂÃ¥Â
³ç³»ãÂÂè¿Âæ ·ï¼ÂGORM å°±è½å¤Âæ ¹æ®ç»ÂæÂÂä½ÂÃ¥ÂÂ段èªå¨æ å°Âå°æ°æ®åºÂ表çÂÂÃ¥ÂÂä¸ÂãÂÂ
func (User) TableName() string
æ¹æ³Âï¼Â
func (User) TableName() string {
return "user"
}
TableName()
æ¹æ³Âç¨äºÂæÂÂå® User
ç»ÂæÂÂä½ÂæÂÂ对åºÂçÂÂæ°æ®åºÂ表åÂÂ称æ¯ “user”ãÂÂGORM å¨è¿Âè¡Âæ°æ®åºÂæÂÂä½Âæ¶å°Âä¼Âæ ¹æ®该æ¹æ³Âè¿ÂÃ¥ÂÂçÂÂ表åÂÂè¿Âè¡Âæ¥询ãÂÂæÂÂÃ¥Â
¥çÂÂæÂÂä½ÂãÂÂ
UserDao
ç»ÂæÂÂä½Âï¼Â
type UserDao struct{}
UserDao
ç»ÂæÂÂä½Âæ¯ä¸Â个空ç»ÂæÂÂä½Âï¼Â没æÂÂä»»ä½ÂÃ¥ÂÂ段ï¼Âå®Âç¨äºÂç»Âç»Âä¸Âç¨æ·æ°æ®ç¸åÂ
³çÂÂæ°æ®åºÂæÂÂä½Âå½æ°ãÂÂ
- Ã¥Â
¨å±ÂÃ¥ÂÂéÂÂ
userDao
Ã¥ÂÂuserOnce
ï¼Â
var (
userDao *UserDao
userOnce sync.Once
)
userDao
æ¯ä¸Â个æÂÂå UserDao
ç»ÂæÂÂä½ÂçÂÂæÂÂéÂÂï¼Âç¨äºÂå¨åÂÂä¾Â模å¼Âä¸Âä¿ÂæÂÂä¸Â个 UserDao
å®Âä¾ÂãÂÂuserOnce
æ¯ä¸Â个 sync.Once
ç±»åÂÂçÂÂÃ¥ÂÂéÂÂï¼Âç¨äºÂç¡®ä¿ÂåªæÂÂå¨第ä¸Â次è°Âç¨æ¶æÂÂä¼ÂÃ¥ÂÂ建 UserDao
å®Âä¾ÂãÂÂ
NewUserDaoInstance()
å½æ°ï¼Â
func NewUserDaoInstance() *UserDao {
userOnce.Do(
func() {
userDao = &UserDao{}
})
return userDao
}
NewUserDaoInstance()
å½æ°ç¨äºÂè·å UserDao
çÂÂå®Âä¾ÂãÂÂå®Â使ç¨ sync.Once
æÂ¥ä¿Âè¯ÂåªåÂÂ建ä¸Â个å®Âä¾Âï¼Â并éÂÂè¿Âè¿ÂÃ¥ÂÂæÂÂé userDao
æÂ¥æÂÂä¾Â对å¯ä¸Âå®Âä¾ÂçÂÂ访é®ãÂÂ
UserDao
ç»ÂæÂÂä½ÂçÂÂæ¹æ³Âï¼Â
QueryUserById(id int64) (*User, error)
ï¼Âæ ¹æ®ç¨æ· ID æ¥询åÂÂ个ç¨æ·信æ¯ï¼Â并è¿ÂÃ¥ÂÂç¨æ·ç»ÂæÂÂä½ÂæÂÂéÂÂÃ¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂQueryUserByIds(ids []int64) (map[int64]*User, error)
ï¼Âæ ¹æ®ç¨æ· ID Ã¥ÂÂ表æ¹éÂÂæ¥询ç¨æ·信æ¯ï¼Â并è¿ÂÃ¥ÂÂç¨æ· ID å°ç¨æ·ç»ÂæÂÂä½ÂçÂÂæ å°Â以åÂÂå¯è½çÂÂéÂÂ误ãÂÂ
è¿ÂäºÂæ¹æ³Â使ç¨ db
Ã¥Â
¨å±ÂÃ¥ÂÂéÂÂï¼Âå¨ Init()
å½æ°ä¸ÂÃ¥ÂÂå§ÂÃ¥ÂÂï¼ÂæÂ¥æ§è¡Âæ°æ®åºÂæÂÂä½Âï¼ÂéÂÂè¿ GORM æÂÂä¾Âç API æÂ¥å®ÂæÂÂæ°æ®çÂÂæ¥询ãÂÂ
注æÂÂäºÂ项ï¼Â
UserDao
ç»ÂæÂÂä½Âä¸ÂçÂÂæ¹æ³Âæ¯ç¨æÂ¥å¤ÂçÂÂç¨æ·æ°æ®ä¸Âæ°æ®åºÂä¹Âé´çÂÂ交äºÂï¼Âè¿ÂäºÂæ¹æ³Âæ§è¡ÂäºÂç¸åºÂçÂÂæ°æ®åºÂæÂÂä½Âï¼Â并è¿ÂÃ¥ÂÂæ°æ®æÂÂéÂÂ误信æ¯ãÂÂ- 为äºÂä¿Âè¯Âæ°æ®çÂÂå®Âå ¨æ§åÂÂä¸Âè´æ§ï¼Âå¯以å¨è¿ÂäºÂæ¹æ³Âä¸Âå 堥äºÂå¡å¤ÂçÂÂçÂÂÃ¥ÂÂè½ï¼Âç¡®ä¿ÂæÂÂä½ÂçÂÂÃ¥ÂÂÃ¥ÂÂæ§ãÂÂ
- æ¤å¤ÂçÂÂ示ä¾Â代ç Âåªå±Â示äºÂä¸Âç¨æ·ç¸堳çÂÂæ°æ®åºÂæÂÂä½Âï¼Âå®Âé åºÂç¨ä¸Âå¯è½è¿ÂéÂÂè¦Âå®Âä¹Âå ¶ä»Âæ°æ®表çÂÂç»ÂæÂÂä½ÂÃ¥ÂÂç¸åºÂçÂÂæÂÂä½Âæ¹æ³ÂãÂÂ
示ä¾Âç¨æ³Âï¼Â
userDao := repository.NewUserDaoInstance()
// æ¥询åÂÂ个ç¨æ·信æ¯
user, err := userDao.QueryUserById(123)
if err != nil {
// å¤ÂçÂÂæ¥询éÂÂ误ãÂÂ
}
// æ¹éÂÂæ¥询ç¨æ·信æ¯
userIds := []int64{1, 2, 3}
userMap, err := userDao.QueryUserByIds(userIds)
if err != nil {
// å¤ÂçÂÂæ¹éÂÂæ¥询éÂÂ误ãÂÂ
}
post_publish.go
å®Âä¹ÂäºÂä¸Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸Âç¸åÂ
³çÂÂæÂÂå¡å½æ°ãÂÂ主è¦ÂÃ¥ÂÂ
æ¬ PostPublish
å½æ°ç¨äºÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂï¼Â以å PublishPostFlow
ç»ÂæÂÂä½ÂÃ¥ÂÂç¸åÂ
³æ¹æ³Âç¨äºÂæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨ÂãÂÂ
代ç Â解éÂÂï¼Â
PostPublish
å½æ°ï¼Â
func PostPublish(userId int64, topicId int64, rootId int64, content *string) (*PostInfo, error) {
return NewPublishPostFlow(userId, topicId, rootId, content).Do()
}
PostPublish
å½æ°ç¨äºÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂãÂÂå®ÂæÂ¥æ¶ç¨æ· ID (userId
)ãÂÂè¯Â颠ID (topicId
)ãÂÂæ ¹å¸Âå ID (rootId
) Ã¥ÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ
容 (content
) ä½Â为åÂÂæ°ï¼Â并è¿ÂÃ¥ÂÂä¸Â个 *PostInfo
Ã¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂPostInfo
Ã¥ÂÂ
å«äºÂÃ¥ÂÂå¸ÂçÂÂå¸ÂÃ¥ÂÂä¿¡æ¯以åÂÂç¸åÂ
³çÂÂç¨æ·信æ¯ãÂÂ
NewPublishPostFlow
å½æ°ï¼Â
func NewPublishPostFlow(userId int64, topicId int64, rootId int64, content *string) *PublishPostFlow {
return &PublishPostFlow{
userId: userId,
topicId: topicId,
content: content,
rootId: rootId,
}
}
NewPublishPostFlow
å½æ°ç¨äºÂÃ¥ÂÂ建ä¸Â个 PublishPostFlow
çÂÂå®Âä¾Âï¼Âç¨äºÂæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨ÂãÂÂå®ÂæÂ¥æ¶ç¨æ· IDãÂÂè¯Â颠IDãÂÂæ ¹å¸Âå ID Ã¥ÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ
容ä½Â为åÂÂæ°ï¼Â并è¿ÂÃ¥ÂÂä¸Â个 PublishPostFlow
çÂÂæÂÂéÂÂãÂÂ
PublishPostFlow
ç»ÂæÂÂä½Âï¼Â
type PublishPostFlow struct {
userId int64
content *string
topicId int64
rootId int64
postId int64
post *repository.Post
}
PublishPostFlow
ç»ÂæÂÂä½Âç¨äºÂç»Âç»Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨Âï¼ÂÃ¥ÂÂ
å«äºÂç¨æ· IDãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ
容ãÂÂè¯Â颠IDãÂÂæ ¹å¸Âå IDãÂÂÃ¥ÂÂå¸ÂÃ¥ÂÂçÂÂå¸Âå ID (postId
) 以åÂÂå¸ÂÃ¥ÂÂä¿¡æ¯ (post
)ãÂÂ
func (f *PublishPostFlow) Do() (*PostInfo, error)
æ¹æ³Âï¼ÂDo()
æ¹æ³Âç¨äºÂæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæµÂç¨ÂãÂÂå®Âå æÂŒÂÂæ°æ£ÂæÂ¥ãÂÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂÃ¥ÂÂè·åÂÂç¨æ·信æ¯çÂÂæ¥骤ï¼Â并è¿ÂÃ¥ÂÂPostInfo
Ã¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂfunc (f *PublishPostFlow) checkParam() error
æ¹æ³Âï¼ÂcheckParam()
æ¹æ³Âç¨äºÂæ£ÂæÂ¥å¸ÂÃ¥ÂÂÃ¥ÂÂå¸Âæ¶çÂÂÃ¥ÂÂæ°æ¯å¦åÂÂæ³ÂãÂÂå®Âæ£ÂæÂ¥ç¨æ· ID æ¯å¦大亠0ï¼Âå¸ÂÃ¥ÂÂå 容æ¯å¦é¿度ä¸Â趠迠500 个åÂÂ符ãÂÂfunc (f *PublishPostFlow) publish() error
æ¹æ³Âï¼Âpublish()
æ¹æ³Âç¨äºÂæ§è¡Âå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂçÂÂæ°æ®åºÂæÂÂä½ÂãÂÂå®ÂÃ¥ÂÂ建äºÂä¸Â个repository.Post
å®Âä¾Â并å°Âå ¶æÂÂå ¥æ°æ®åºÂãÂÂ
注æÂÂäºÂ项ï¼Â
- è¿Â段代ç Â主è¦Âå®Âç°äºÂä¸Â个ç®ÂÃ¥ÂÂçÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂå¸ÂæµÂç¨Âï¼Âå æÂŒÂÂæ°æ£ÂæÂ¥åÂÂæ°æ®åºÂæÂÂå ¥æÂÂä½ÂãÂÂ
- å¨å®Âé åºÂç¨ä¸Âï¼Âå¯è½è¿ÂéÂÂè¦Âå¢Âå æ´å¤ÂæÂÂçÂÂé»è¾Âï¼Âå¦ÂæÂÂéÂÂéªÂè¯ÂãÂÂå¸ÂÃ¥ÂÂçÂÂÃ¥ÂÂå¤ÂÃ¥ÂÂè¯Â论çÂÂÃ¥ÂÂè½ãÂÂ
PostInfo
çÂÂå®Âä¹Âæªå¨代ç Âä¸Âç»Âåºï¼Âå¯è½æ¯ä¸Â个å å«äºÂå¸ÂÃ¥ÂÂä¿¡æ¯åÂÂç¨æ·信æ¯çÂÂç»ÂæÂÂä½ÂãÂÂ
示ä¾Âç¨æ³Âï¼Â
userId := int64(123)
topicId := int64(456)
rootId := int64(0)
content := "è¿Âæ¯ä¸Â个æµÂè¯Âå¸ÂÃ¥ÂÂÃ¥ÂÂ
容"
postInfo, err := service.PostPublish(userId, topicId, rootId, &content)
if err != nil {
// å¤ÂçÂÂÃ¥ÂÂå¸Âå¸ÂÃ¥ÂÂéÂÂ误ãÂÂ
}
// 使ç¨ postInfo Ã¥ÂÂç¸åÂ
³ä¿¡æ¯è¿Âè¡ÂÃ¥ÂÂç»Âå¤ÂçÂÂãÂÂ
query_page_info.go
å®Âä¹ÂäºÂä¸Âå¸ÂÃ¥ÂÂ页é¢信æ¯æ¥询ç¸åÂ
³çÂÂæÂÂå¡å½æ°ãÂÂ主è¦ÂÃ¥ÂÂ
æ¬ QueryPageInfo
å½æ°ç¨äºÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯ï¼Â以å QueryPageInfoFlow
ç»ÂæÂÂä½ÂÃ¥ÂÂç¸åÂ
³æ¹æ³Âç¨äºÂæ§è¡Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨ÂãÂÂ
代ç Â解éÂÂï¼Â
PostInfo
ç»ÂæÂÂä½Âï¼Â
type PostInfo struct {
Post *repository.Post
User *repository.User
}
PostInfo
ç»ÂæÂÂä½Âç¨äºÂç»Âç»Âå¸ÂÃ¥ÂÂä¿¡æ¯ï¼ÂÃ¥ÂÂ
æ¬å¸ÂÃ¥ÂÂæ¬身çÂÂä¿¡æ¯åÂÂÃ¥ÂÂå¸Â该å¸ÂÃ¥ÂÂçÂÂç¨æ·信æ¯ãÂÂ
TopicInfo
ç»ÂæÂÂä½Âï¼Â
type TopicInfo struct {
Topic *repository.Topic
User *repository.User
}
TopicInfo
ç»ÂæÂÂä½Âç¨äºÂç»Âç»Âè¯Âé¢Âä¿¡æ¯ï¼ÂÃ¥ÂÂ
æ¬è¯Âé¢Âæ¬身çÂÂä¿¡æ¯åÂÂÃ¥ÂÂ建该è¯Âé¢ÂçÂÂç¨æ·信æ¯ãÂÂ
PageInfo
ç»ÂæÂÂä½Âï¼Â
type PageInfo struct {
TopicInfo *TopicInfo
PostList []*PostInfo
}
PageInfo
ç»ÂæÂÂä½Âç¨äºÂç»Âç»Â页é¢信æ¯ï¼ÂÃ¥ÂÂ
æ¬è¯Âé¢Âä¿¡æ¯ï¼ÂTopicInfo
ï¼ÂÃ¥ÂÂç¸åÂ
³çÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表ï¼ÂPostList
ï¼ÂãÂÂ
QueryPageInfo
å½æ°ï¼Â
func QueryPageInfo(topicId int64) (*PageInfo, error) {
return NewQueryPageInfoFlow(topicId).Do()
}
QueryPageInfo
å½æ°ç¨äºÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯ãÂÂå®ÂæÂ¥æ¶è¯Â颠ID ä½Â为åÂÂæ°ï¼Â并è¿ÂÃ¥ÂÂä¸Â个 *PageInfo
Ã¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂPageInfo
Ã¥ÂÂ
å«äºÂè¯Âé¢Âä¿¡æ¯åÂÂç¸åÂ
³çÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表ãÂÂ
NewQueryPageInfoFlow
å½æ°ï¼Â
func NewQueryPageInfoFlow(topicId int64) *QueryPageInfoFlow {
return &QueryPageInfoFlow{
topicId: topicId,
}
}
NewQueryPageInfoFlow
å½æ°ç¨äºÂÃ¥ÂÂ建ä¸Â个 QueryPageInfoFlow
çÂÂå®Âä¾Âï¼Âç¨äºÂæ§è¡Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨ÂãÂÂå®ÂæÂ¥æ¶è¯Â颠ID ä½Â为åÂÂæ°ï¼Â并è¿ÂÃ¥ÂÂä¸Â个 QueryPageInfoFlow
çÂÂæÂÂéÂÂãÂÂ
QueryPageInfoFlow
ç»ÂæÂÂä½Âï¼Â
type QueryPageInfoFlow struct {
topicId int64
topic *repository.Topic
pageInfo *PageInfo
posts []*repository.Post
userMap map[int64]*repository.User
}
QueryPageInfoFlow
ç»ÂæÂÂä½Âç¨äºÂç»Âç»Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨Âï¼ÂÃ¥ÂÂ
å«äºÂè¯Â颠IDãÂÂè¯Âé¢Âä¿¡æ¯ãÂÂ页é¢信æ¯ãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表以åÂÂç¨æ· ID å°ç¨æ·信æ¯çÂÂæ å°ÂãÂÂ
func (f *QueryPageInfoFlow) Do() (*PageInfo, error)
æ¹æ³Âï¼ÂDo()
æ¹æ³Âç¨äºÂæ§è¡Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂæµÂç¨ÂãÂÂå®Âå æÂŒÂÂæ°æ£ÂæÂ¥ãÂÂÃ¥ÂÂå¤Âä¿¡æ¯åÂÂç»Âç»Â页é¢信æ¯çÂÂæ¥骤ï¼Â并è¿ÂÃ¥ÂÂPageInfo
Ã¥ÂÂå¯è½çÂÂéÂÂ误ãÂÂfunc (f *QueryPageInfoFlow) checkParam() error
æ¹æ³Âï¼ÂcheckParam()
æ¹æ³Âç¨äºÂæ£ÂæÂ¥æ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯æ¶çÂÂÃ¥ÂÂæ°æ¯å¦åÂÂæ³ÂãÂÂå®Âæ£ÂæÂ¥è¯Â颠ID æ¯å¦大亠0ãÂÂfunc (f *QueryPageInfoFlow) prepareInfo() error
æ¹æ³Âï¼ÂprepareInfo()
æ¹æ³Âç¨äºÂÃ¥ÂÂå¤Âæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯æÂÂéÂÂçÂÂæ°æ®ãÂÂå®Âå æ·åÂÂè¯Âé¢Âä¿¡æ¯ãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表åÂÂç¨æ·信æ¯çÂÂæÂÂä½ÂãÂÂfunc (f *QueryPageInfoFlow) packPageInfo() error
æ¹æ³Âï¼ÂpackPageInfo()
æ¹æ³Âç¨äºÂç»Âç»Â页é¢信æ¯ãÂÂå®Âå°Âè¯Âé¢Âä¿¡æ¯åÂÂç¸堳çÂÂå¸ÂÃ¥ÂÂä¿¡æ¯ç»ÂÃ¥ÂÂæÂÂä¸Â个PageInfo
ç»ÂæÂÂä½ÂãÂÂ
注æÂÂäºÂ项ï¼Â
- è¿Â段代ç Âå®Âç°äºÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂÃ¥ÂÂè½ï¼ÂÃ¥ÂÂ
揷åÂÂè¯Âé¢Âä¿¡æ¯ãÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表åÂÂç¨æ·信æ¯ï¼Â并å°Âå®Â们ç»Âç»ÂæÂÂ
PageInfo
ç»ÂæÂÂä½Âè¿ÂÃ¥ÂÂã - 为äºÂæÂÂé«Âæ¥询æÂÂçÂÂï¼Â使ç¨äºÂ并åÂÂæ¹å¼ÂÃ¥ÂÂå«è·åÂÂè¯Âé¢Âä¿¡æ¯åÂÂå¸ÂÃ¥ÂÂÃ¥ÂÂ表ï¼Â并éÂÂè¿Â
sync.WaitGroup
çÂÂ徠两个æÂÂä½Âå®ÂæÂÂÃ¥ÂÂÃ¥ÂÂè¿Âè¡ÂÃ¥ÂÂç»Âå¤ÂçÂÂã - æ¤å¤ÂçÂÂ示ä¾Â代ç Âåªå±Â示äºÂæ¥询å¸ÂÃ¥ÂÂ页é¢信æ¯çÂÂé»è¾Âï¼Âå®Âé åºÂç¨ä¸Âå¯è½è¿ÂéÂÂè¦Âå¤ÂçÂÂæ´å¤ÂçÂÂä¸Âå¡é»è¾ÂÃ¥ÂÂéÂÂ误å¤ÂçÂÂãÂÂ
示ä¾Âç¨æ³Âï¼Â
topicId := int64(123)
pageInfo, err := service.QueryPageInfo(topicId)
if err != nil {
// å¤ÂçÂÂæ¥询页é¢信æ¯éÂÂ误ãÂÂ
}
// 使ç¨ pageInfo Ã¥ÂÂç¸åÂ
³ä¿¡æ¯è¿Âè¡Â页é¢å±Â示ãÂÂ