持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
文章的发布状态
文章的发布状态有三种:
- 公开
- 自己可见
- 草稿
<el-form-item label="发布形式">
<el-radio-group v-model="article.artStatus">
<el-radio :label="1">全部可见</el-radio>
<el-radio :label="2">仅我可见</el-radio>
</el-radio-group>
</el-form-item>
文章发布
前面已经将铺垫都准备好了,接下来我们还要实现一个发布的功能,这个和保存草稿的功能基本类似。
handleSubmit() {
this.showDialog = true;
if (this.article.title.trim() == "") {
this.$message.error("文章标题不能为空");
return false;
}
if (this.article.content.trim() == "") {
this.$message.error("文章内容不能为空");
return false;
}
if (this.article.categoryName == null) {
this.$message.error("文章分类不能为空");
return false;
}
if (this.article.tagNameList.length == 0) {
this.$message.error("文章标签不能为空");
return false;
}
var body = this.article;
addArticle(body).then(res => {
if(res.code === 200) {
this.$message({
type: 'success',
message: '文章发表成功!'
});
} else {
this.$message({
type: 'error',
message: '文章发表失败!'
});
}
})
},
写完之后,我们再测试一下正式发布文章。
看到数据库有数据了,我们的文章发布功能就全部完成了。
4、列表
这个列表相信大家已经写了很多遍了,现在可以说大概的思路应该掌握在手,这里我对后端又进行了处理,以前的bug也修复了一些,我这里先把后端改的代码来说一下。
4.1、功能修改
1、首先修改了根据分类id查找分类信息
这里的改动不大,主要是改动了查询的sql语句。
<select id="getById" resultMap="BaseResultMap">
select * from person_category where category_id = #{categoryId, jdbcType=INTEGER}
</select>
2、修改文章查询的接口,这里改动的稍微有点大。
这边我把文章的标签给拆开了,减少了数据库查询的语句。
@Override
@PostConstruct
public void init() {
List<Article> articleList = articleMapper.findAll();
try {
getTagsOrCategory(articleList);
for(Article article : articleList) {
articleMap.put(article.getId(), article);
}
log.info("文章缓存数据加载完成");
} catch (Exception e) {
log.error("文章缓存数据加载失败!", e.getMessage());
}
}
@Override
public List<Article> getArticlePage(ArticleBO articleBO) {
int pageNum = articleBO.getPageNum();
int pageSize = articleBO.getPageSize();
PageHelper.startPage(pageNum,pageSize);
List<Article> articleList = articleMapper.getArticlePage(articleBO);
getTagsOrCategory(articleList);
return articleList;
}
public void getTagsOrCategory(List<Article> list) {
if (list != null) {
for (Article article : list) {
//查询分类
Category category = categoryService.findById(article.getCategoryId());
if (category == null) {
article.setCategoryName("无分类");
} else {
article.setCategoryName(category.getCategoryName());
}
List<Tag> tagList = new ArrayList<>();
List<ArticleTag> articleTags = articleTagService.findArticleTagById(article.getId());
if (articleTags != null) {
for (ArticleTag articleTag : articleTags) {
Tag tag = tagService.findTagById(articleTag.getTagId());
tagList.add(tag);
}
}
article.setTagList(tagList);
}
}
}
查询的接口如参要再包一层body
/**
* 文章列表
* @param articleBO
* @return
*/
@ApiOperation(value = "文章列表")
@PostMapping("list")
public JsonResult<Object> listPage(@RequestBody @Valid PageRequestApi<ArticleBO> articleBO) {
List<Article> articleList = articleService.getArticlePage(articleBO.getBody());
PageInfo pageInfo = new PageInfo(articleList);
PageRequest pageRequest = new PageRequest();
pageRequest.setPageNum(articleBO.getBody().getPageNum());
pageRequest.setPageSize(articleBO.getBody().getPageSize());
PageResult pageResult = PageUtil.getPageResult(pageRequest, pageInfo);
return JsonResult.success(pageResult);
}
ArticleBO.java类:
package com.blog.personalblog.bo;
import lombok.Data;
/**
* @author: SuperMan
* @create: 2021-12-31
*/
@Data
public class ArticleBO {
/**
* 分类id
*/
private Integer categoryId;
/**
* 发布,默认0, 0-发布, 1-草稿
*/
private Integer artStatus;
/**
* 文章标题
*/
private String title;
/**
* 页码
*/
private int pageNum;
/**
* 每页的数据条数
*/
private int pageSize;
}
大家对以上的代码应该都能看的懂,我们再去修改一下xml文件。以下只是删掉了对标签的查询。
<resultMap id="BaseResultMap" type="com.blog.personalblog.entity.Article">
<result column="id" jdbcType="INTEGER" property="id"/>
<result column="author" jdbcType="VARCHAR" property="author"/>
<result column="title" jdbcType="VARCHAR" property="title"/>
<result column="user_id" jdbcType="INTEGER" property="userId"/>
<result column="category_id" jdbcType="INTEGER" property="categoryId"/>
<result column="content" jdbcType="VARCHAR" property="content"/>
<result column="views" jdbcType="BIGINT" property="views"/>
<result column="total_words" jdbcType="BIGINT" property="totalWords"/>
<result column="commentable_id" jdbcType="INTEGER" property="commentableId"/>
<result column="art_status" jdbcType="INTEGER" property="artStatus"/>
<result column="description" jdbcType="VARCHAR" property="description"/>
<result column="image_url" jdbcType="VARCHAR" property="imageUrl"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
<result column="categoryname" jdbcType="VARCHAR" property="categoryName"></result>
</resultMap>
<select id="getArticlePage" resultMap="BaseResultMap" parameterType="com.blog.personalblog.bo.ArticleBO">
SELECT
a.*,
u.category_name categoryname
FROM person_article a
left JOIN person_category u on a.category_id = u.category_id
<where>
<if test="articleBO.title != null">
and a.title like '%${articleBO.title}%'
</if>
<if test="articleBO.categoryId != null">
and a.category_id = #{articleBO.categoryId}
</if>
<if test="articleBO.artStatus != null">
and a.art_status = #{articleBO.artStatus}
</if>
</where>
</select>
3、根据文章id查找文章
这个功能我根据前端的需要,重新写了一个返回类,用做编辑的时候数据回显的时候使用。
新增了了一个vo包,然后在包内新建一个ArticleVO.java
package com.blog.personalblog.vo;
import com.blog.personalblog.entity.Tag;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author: SuperMan
* @create: 2022-10-10
**/
@Data
public class ArticleVO {
/**
* 文章id
*/
private Integer id;
/**
* 作者
*/
private String author;
/**
* 文章标题
*/
private String title;
/**
* 用户id
*/
private Integer userId;
/**
* 分类id
*/
private Integer categoryId;
/**
* 文章内容
*/
private String content;
/**
* 文章浏览量
*/
private Long views;
/**
* 文章总字数
*/
private Long totalWords;
/**
* 评论id
*/
private Integer commentableId;
/**
* 发布,默认1, 1-发布, 2-仅我可见 3-草稿
*/
private Integer artStatus;
/**
* 描述
*/
private String description;
/**
* 文章logo
*/
private String imageUrl;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 文章标签
*/
private List<Tag> tagList;
private List<String> tagNameList;
/**
* 分类名称
*/
private String categoryName;
}
然后修改查询的接口
/**
* 根据文章id查找文章
* @param articleId
* @return
*/
ArticleVO findById(Integer articleId);
实现类:
@Override
public ArticleVO findById(Integer articleId) {
Article article = articleMap.get(articleId);
ArticleVO articleVO = BeanUtil.copyProperties(article, ArticleVO.class);
List<String> tagNameList = new ArrayList<>();
if (articleVO != null) {
if (articleVO.getTagList() != null) {
for (Tag tag : articleVO.getTagList()) {
tagNameList.add(tag.getTagName());
}
}
}
articleVO.setTagNameList(tagNameList);
articleVO.setCategoryName(article.getCategoryName());
return articleVO;
}
接口也要修改一下返回类。
/**
* 根据文章id查找
* @param id
* @return
*/
@ApiOperation(value = "根据文章id查找")
@GetMapping("/getArticle/{id}")
@OperationLogSys(desc = "根据文章id查找", operationType = OperationType.SELECT)
public JsonResult<Object> getArticleById(@PathVariable(value = "id") int id) {
ArticleVO article = articleService.findById(id);
return JsonResult.success(article);
}
基本上就修改了这几个地方,接下来开始写文章列表的页面。