Beispiel #1
0
        public async Task <bool> UpdateArticle(UpdateArticleDto updateArticleDto)
        {
            int articleId = updateArticleDto.ArticleId;

            //从数据库查询该Id的文章
            var article = await _articleRepository.FirstOrDefaultAsync(a => a.Id == articleId);

            if (article == null)
            {
                //文章不存在
                _logger.LogError("文章不存在,更新失败");
                return(false);
            }

            //获取文章原本的完整的路径
            string completePath = article.ArticleUrl;
            //获取文章新的内容
            string newArticleContent = updateArticleDto.ArticleContent;
            //切割文章内容,去掉首字符串
            string articleContentNormal = SplitString.SplitStringWithStart(newArticleContent);

            //将新的内容更新至文件
            var result = await FileOperate.UpdateArticleContentAsync(completePath, articleContentNormal, _logger);

            if (result == false)
            {
                //更新硬盘文档失败
                _logger.LogError("从硬盘更新文章失败,更新失败");
                return(false);
            }

            //硬盘上的文件更新成功,更新数据库
            article.ArticleName          = updateArticleDto.ArticleName;
            article.ArticleTags          = updateArticleDto.ArticleTags;
            article.TypeId               = updateArticleDto.TypeId;
            article.LastModificationTime = updateArticleDto.LastModificationTime;
            article.Introduce            = updateArticleDto.Introduce;
            article.IsRecommend          = updateArticleDto.IsRecommend;

            //更新数据库
            Article updateMysqlResult = await _articleRepository.UpdateAsync(article);

            if (updateMysqlResult == null)
            {
                //更新数据库失败,可以尝试重试机制
                _logger.LogError("数据库更新失败,更新失败");
                return(false);
            }
            //更新成功,更新缓存
            //将该文章Id和RedisArticle组合,作为Redis键名
            string redisArticleKey = PostConsts.ArticleBaseKey + articleId;
            await _cacheManager.GetCache(PostConsts.RedisForArticleStore).SetAsync(redisArticleKey, updateMysqlResult);

            return(true);
        }
Beispiel #2
0
        public async Task <string> PostArticle([FromBody] NewArticleDto newArticleDto)
        {
            //获取到文章后,首先将文章内容存储到对应路径的硬盘上
            //文章内容以test-editormd-markdown-doc=开头,格式为Json字符串
            //切割文章内容
            string splitString = SplitString.SplitStringWithStart(newArticleDto.ArticleContent);

            if (splitString.IsNullOrWhiteSpace())
            {
                _logger.LogError("文章内容为空");
                return("文章内容为空");
            }

            var result = await FileOperate.StoreToTxtFileAsync(splitString, newArticleDto.ArticleName, _logger);

            if (result != "")
            {
                //不为空,表示存储成功,返回了存储路径
                newArticleDto.ArticleUrl = result;

                //AutoMapper映射
                Article newArticle = newArticleDto.MapTo <Article>();

                //默认浏览次数为1
                newArticle.PageView = 1;

                //存储数据库
                try
                {
                    //存入数据库,并获取文章Id
                    var ArticleId = await _articleRepository.InsertAndGetIdAsync(newArticle);

                    //将该文章Id和RedisArticle组合,作为Redis键名
                    string redisArticleKey = PostConsts.ArticleBaseKey + ArticleId;
                    //存入Redis缓存
                    await _cacheManager.GetCache(PostConsts.RedisForArticleStore).SetAsync(redisArticleKey, newArticle);

                    return(ArticleId.ToString());
                }
                catch (Exception ex)
                {
                    _logger.LogError(exception: ex, "错误信息:" + ex.Message);
                    return("发布文章出现异常");
                }
            }
            else
            {
                _logger.LogError("存储文章到硬盘时出现错误");
                return("发布文章失败");
            }
        }