From 0b03178feb9f5795e9d13739d884834f6da2f6cf Mon Sep 17 00:00:00 2001 From: mayiming <1627832236@qq.com> Date: Tue, 4 Nov 2025 11:42:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E7=AB=A0=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/article/detailarticlehandler.go | 36 +++++++++++++-- .../logic/article/detailarticlelogic.go | 46 +++++++++++++++++-- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/server/internal/article/handler/article/detailarticlehandler.go b/server/internal/article/handler/article/detailarticlehandler.go index 74007468..a0ed864b 100644 --- a/server/internal/article/handler/article/detailarticlehandler.go +++ b/server/internal/article/handler/article/detailarticlehandler.go @@ -4,23 +4,53 @@ package article import ( + "fmt" "net/http" + "strconv" + "strings" "github.com/JACKYMYPERSON/hldrCenter/config" "github.com/JACKYMYPERSON/hldrCenter/internal/article/internal/logic/article" + "github.com/JACKYMYPERSON/hldrCenter/internal/article/internal/model" "github.com/JACKYMYPERSON/hldrCenter/internal/article/internal/types" + "github.com/zeromicro/go-zero/core/stores/sqlx" "github.com/zeromicro/go-zero/rest/httpx" ) func DetailArticleHandler(cfg *config.Config) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req types.DetailArticleReq - if err := httpx.Parse(r, &req); err != nil { - httpx.ErrorCtx(r.Context(), w, err) + pathParts := strings.Split(r.URL.Path, "/") + if len(pathParts) < 3 { // 确保路径格式正确 + httpx.ErrorCtx(r.Context(), w, fmt.Errorf("invalid path format")) return } + idStr := pathParts[3] + id, err := strconv.ParseInt(idStr, 10, 64) + if err != nil { + httpx.ErrorCtx(r.Context(), w, fmt.Errorf("invalid meeting ID")) + return + } + fmt.Println("idStr:", idStr) + req.Id = id - l := article.NewDetailArticleLogic(r.Context(), cfg) + mysqlCfg := cfg.MySQL + dsn := fmt.Sprintf( + "%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=true&loc=Local", + mysqlCfg.Username, + mysqlCfg.Password, + mysqlCfg.Host, + mysqlCfg.Port, + mysqlCfg.Database, + mysqlCfg.Charset, + ) + fmt.Println("接收到articlePost请求") + + conn := sqlx.NewSqlConn("mysql", dsn) + + ArticleModel := model.NewArticleModel(conn) + + l := article.NewDetailArticleLogic(r.Context(), cfg, ArticleModel) resp, err := l.DetailArticle(&req) if err != nil { httpx.ErrorCtx(r.Context(), w, err) diff --git a/server/internal/article/internal/logic/article/detailarticlelogic.go b/server/internal/article/internal/logic/article/detailarticlelogic.go index fa088007..369d72a0 100644 --- a/server/internal/article/internal/logic/article/detailarticlelogic.go +++ b/server/internal/article/internal/logic/article/detailarticlelogic.go @@ -5,8 +5,10 @@ package article import ( "context" + "errors" "github.com/JACKYMYPERSON/hldrCenter/config" + "github.com/JACKYMYPERSON/hldrCenter/internal/article/internal/model" "github.com/JACKYMYPERSON/hldrCenter/internal/article/internal/types" "github.com/zeromicro/go-zero/core/logx" @@ -14,20 +16,54 @@ import ( type DetailArticleLogic struct { logx.Logger - ctx context.Context - cfg *config.Config + ctx context.Context + cfg *config.Config + model model.ArticleModel } -func NewDetailArticleLogic(ctx context.Context, cfg *config.Config) *DetailArticleLogic { +func NewDetailArticleLogic(ctx context.Context, cfg *config.Config, model model.ArticleModel) *DetailArticleLogic { return &DetailArticleLogic{ Logger: logx.WithContext(ctx), ctx: ctx, cfg: cfg, + model: model, } } func (l *DetailArticleLogic) DetailArticle(req *types.DetailArticleReq) (resp *types.DetailArticleResp, err error) { - // todo: add your logic here and delete this line + // 1. 调用数据层查询文章 + article, err := l.model.FindOne(l.ctx, req.Id) + if err != nil { + // 处理查询错误:区分"未找到"和"数据库异常" + if err == errors.New("文章不存在") { + // 文章不存在时,可返回成功但数据为空(或直接返回错误,根据业务需求) + return &types.DetailArticleResp{ + Success: false, + Article: types.Article{}, // 空结构体 + }, nil + } + // 数据库错误(如连接失败)返回原始错误 + return nil, err + } - return + // 2. 转换时间格式(假设数据库查询的是time.Time类型,需转为字符串) + // 若数据库存储的是字符串则可省略此步骤 + typesArticle := types.Article{ + Id: article.Id, + Title: article.Title, + Content: article.Content, + Cover: article.Cover, + CreateAt: article.CreateAt.Format("2006-01-02 15:04:05"), // 转换为"年-月-日 时:分:秒" + UpdateAt: article.UpdateAt.Format("2006-01-02 15:04:05"), + IsDelete: int(article.IsDelete), + Topic: article.Topic, + Excerpt: article.Excerpt, + } + + // 3. 构造响应 + resp = &types.DetailArticleResp{ + Article: typesArticle, + Success: true, + } + return resp, nil }