Html2Text 方法实现
This commit is contained in:
parent
67c332a40e
commit
f684510fcb
@ -71,7 +71,7 @@ public class WebMvcConfigurer extends WebMvcConfigurationSupport {
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
// TODO 先不拦截接口,进行测试
|
||||
registry.addInterceptor(restAuthTokenInterceptor()).addPathPatterns("/api/**")
|
||||
.excludePathPatterns("/api/v1/**");
|
||||
.excludePathPatterns("/api/v1/console/**","/api/v1/article/articles/**","/api/v1/article/detail/**");
|
||||
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,9 @@ public class ArticleDTO {
|
||||
/** 浏览总数 */
|
||||
private Integer articleViewCount ;
|
||||
/** 预览内容 */
|
||||
private Integer articlePreviewContent ;
|
||||
private String articlePreviewContent ;
|
||||
/** 文章内容 */
|
||||
private String articleContent ;
|
||||
/** 评论总数 */
|
||||
private Integer commentCount ;
|
||||
/** 过去时长 */
|
||||
|
@ -28,7 +28,7 @@ public class Article implements Serializable,Cloneable {
|
||||
/** 浏览总数 */
|
||||
private Integer articleViewCount;
|
||||
/** 预览内容 */
|
||||
private Integer articlePreviewContent ;
|
||||
private String articlePreviewContent ;
|
||||
/** 评论总数 */
|
||||
private Integer commentCount ;
|
||||
/** 文章永久链接 */
|
||||
|
20
src/main/java/com/rymcu/vertical/entity/ArticleContent.java
Normal file
20
src/main/java/com/rymcu/vertical/entity/ArticleContent.java
Normal file
@ -0,0 +1,20 @@
|
||||
package com.rymcu.vertical.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class ArticleContent {
|
||||
|
||||
private Integer idArticle;
|
||||
|
||||
private String articleContent;
|
||||
|
||||
private String articleContentHtml;
|
||||
|
||||
private Date createdTime;
|
||||
|
||||
private Date updatedTime;
|
||||
|
||||
}
|
@ -4,6 +4,7 @@ import com.rymcu.vertical.core.mapper.Mapper;
|
||||
import com.rymcu.vertical.dto.ArticleDTO;
|
||||
import com.rymcu.vertical.dto.Author;
|
||||
import com.rymcu.vertical.entity.Article;
|
||||
import com.rymcu.vertical.entity.ArticleContent;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
@ -18,4 +19,6 @@ public interface ArticleMapper extends Mapper<Article> {
|
||||
Integer insertArticleContent(@Param("idArticle") Integer idArticle, @Param("articleContent") String articleContent, @Param("articleContentHtml") String articleContentHtml);
|
||||
|
||||
Integer updateArticleContent(@Param("idArticle") Integer idArticle, @Param("articleContent") String articleContent, @Param("articleContentHtml") String articleContentHtml);
|
||||
|
||||
ArticleContent selectArticleContent(@Param("idArticle") Integer idArticle);
|
||||
}
|
||||
|
@ -4,8 +4,12 @@ import com.rymcu.vertical.core.service.AbstractService;
|
||||
import com.rymcu.vertical.dto.ArticleDTO;
|
||||
import com.rymcu.vertical.dto.Author;
|
||||
import com.rymcu.vertical.entity.Article;
|
||||
import com.rymcu.vertical.entity.ArticleContent;
|
||||
import com.rymcu.vertical.mapper.ArticleMapper;
|
||||
import com.rymcu.vertical.service.ArticleService;
|
||||
import com.rymcu.vertical.util.Html2TextUtil;
|
||||
import com.rymcu.vertical.util.Utils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@ -28,7 +32,7 @@ public class ArticleServiceImpl extends AbstractService<Article> implements Arti
|
||||
public List<ArticleDTO> articles(String searchText, String tag) {
|
||||
List<ArticleDTO> list = articleMapper.selectArticles(searchText, tag);
|
||||
list.forEach(article->{
|
||||
article = genArticle(article);
|
||||
article = genArticle(article,0);
|
||||
});
|
||||
return list;
|
||||
}
|
||||
@ -53,6 +57,14 @@ public class ArticleServiceImpl extends AbstractService<Article> implements Arti
|
||||
article = articleMapper.selectByPrimaryKey(idArticle);
|
||||
article.setArticleTitle(articleTitle);
|
||||
article.setArticleTags(articleTags);
|
||||
if(StringUtils.isNotBlank(articleContentHtml)){
|
||||
Integer length = articleContentHtml.length();
|
||||
if(length>200){
|
||||
length = 200;
|
||||
}
|
||||
String articlePreviewContent = articleContentHtml.substring(0,length);
|
||||
article.setArticlePreviewContent(Html2TextUtil.getContent(articlePreviewContent));
|
||||
}
|
||||
article.setUpdatedTime(new Date());
|
||||
articleMapper.updateArticleContent(article.getIdArticle(),articleContent,articleContentHtml);
|
||||
}
|
||||
@ -64,13 +76,28 @@ public class ArticleServiceImpl extends AbstractService<Article> implements Arti
|
||||
@Override
|
||||
public ArticleDTO findArticleDTOById(Integer id) {
|
||||
ArticleDTO articleDTO = articleMapper.selectArticleDTOById(id);
|
||||
articleDTO = genArticle(articleDTO);
|
||||
articleDTO = genArticle(articleDTO,1);
|
||||
return articleDTO;
|
||||
}
|
||||
|
||||
private ArticleDTO genArticle(ArticleDTO article) {
|
||||
private ArticleDTO genArticle(ArticleDTO article,Integer type) {
|
||||
Author author = articleMapper.selectAuthor(article.getArticleAuthorId());
|
||||
article.setArticleAuthor(author);
|
||||
article.setTimeAgo(Utils.getTimeAgo(article.getUpdatedTime()));
|
||||
if(type == 1){
|
||||
ArticleContent articleContent = articleMapper.selectArticleContent(article.getIdArticle());
|
||||
article.setArticleContent(articleContent.getArticleContentHtml());
|
||||
} else {
|
||||
if(StringUtils.isBlank(article.getArticlePreviewContent())){
|
||||
ArticleContent articleContent = articleMapper.selectArticleContent(article.getIdArticle());
|
||||
Integer length = articleContent.getArticleContentHtml().length();
|
||||
if(length>200){
|
||||
length = 200;
|
||||
}
|
||||
String articlePreviewContent = articleContent.getArticleContentHtml().substring(0,length);
|
||||
article.setArticlePreviewContent(Html2TextUtil.getContent(articlePreviewContent));
|
||||
}
|
||||
}
|
||||
return article;
|
||||
}
|
||||
}
|
||||
|
43
src/main/java/com/rymcu/vertical/util/Html2TextUtil.java
Normal file
43
src/main/java/com/rymcu/vertical/util/Html2TextUtil.java
Normal file
@ -0,0 +1,43 @@
|
||||
package com.rymcu.vertical.util;
|
||||
|
||||
import javax.swing.text.html.HTMLEditorKit;
|
||||
import javax.swing.text.html.parser.ParserDelegator;
|
||||
import java.io.*;
|
||||
|
||||
public class Html2TextUtil extends HTMLEditorKit.ParserCallback {
|
||||
|
||||
private static Html2TextUtil html2Text = new Html2TextUtil();
|
||||
|
||||
private StringBuffer s;
|
||||
|
||||
public Html2TextUtil() {
|
||||
}
|
||||
|
||||
public void parse(String html) throws IOException {
|
||||
InputStream inputStream = new ByteArrayInputStream(html.getBytes());
|
||||
Reader reader = new InputStreamReader(inputStream);
|
||||
ParserDelegator delegator = new ParserDelegator();
|
||||
s = new StringBuffer();
|
||||
// the third parameter is TRUE to ignore charset directive
|
||||
delegator.parse(reader, this, Boolean.TRUE);
|
||||
}
|
||||
|
||||
public void handleText(char[] text, int pos) {
|
||||
s.append(text);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
public static String getContent(String str) {
|
||||
try {
|
||||
html2Text.parse(str);
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
return html2Text.getText();
|
||||
}
|
||||
|
||||
}
|
@ -6,6 +6,10 @@ import org.apache.shiro.session.InvalidSessionException;
|
||||
import org.apache.shiro.session.Session;
|
||||
import org.apache.shiro.subject.Subject;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.time.*;
|
||||
import java.util.Date;
|
||||
|
||||
public class Utils {
|
||||
public static final String HASH_ALGORITHM = "SHA-1";
|
||||
public static final int HASH_INTERATIONS = 1024;
|
||||
@ -57,4 +61,48 @@ public class Utils {
|
||||
Integer code = (int)((Math.random()*9+1)*100000);
|
||||
return code;
|
||||
}
|
||||
|
||||
public static String getTimeAgo(Date date) {
|
||||
|
||||
String timeAgo;
|
||||
|
||||
Instant instant = date.toInstant();
|
||||
ZoneId zone = ZoneId.systemDefault();
|
||||
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
|
||||
LocalDate oldLocalDate = localDateTime.toLocalDate();
|
||||
|
||||
LocalDate today = LocalDate.now();
|
||||
|
||||
Period p = Period.between(oldLocalDate, today);
|
||||
if(p.getYears() > 0){
|
||||
timeAgo = p.getYears()+" 年前 ";
|
||||
}else if(p.getMonths() > 0){
|
||||
timeAgo = p.getMonths()+" 月前 ";
|
||||
}else if(p.getDays() > 0){
|
||||
timeAgo = p.getDays()+" 天前 ";
|
||||
}else {
|
||||
long to = System.currentTimeMillis();
|
||||
long from = date.getTime();
|
||||
int hours = (int) ((to - from)/(1000 * 60 * 60));
|
||||
if(hours > 0){
|
||||
timeAgo = hours+" 小时前 ";
|
||||
}else {
|
||||
int minutes = (int) ((to - from)/(1000 * 60));
|
||||
if(minutes > 0){
|
||||
timeAgo = " 刚刚 ";
|
||||
}else {
|
||||
timeAgo = minutes+" 分钟前 ";
|
||||
}
|
||||
}
|
||||
}
|
||||
return timeAgo;
|
||||
}
|
||||
|
||||
public static void main(String[] args){
|
||||
LocalDate localDate = LocalDate.parse("2019-11-15");
|
||||
ZoneId zone = ZoneId.systemDefault();
|
||||
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
|
||||
String s = getTimeAgo(Date.from(instant));
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ public class ArticleController {
|
||||
return GlobalResultGenerator.genSuccessResult(map);
|
||||
}
|
||||
|
||||
@GetMapping("/{id}")
|
||||
@GetMapping("/detail/{id}")
|
||||
public GlobalResult detail(@PathVariable Integer id){
|
||||
ArticleDTO articleDTO = articleService.findArticleDTOById(id);
|
||||
Map map = new HashMap<>();
|
||||
|
@ -30,6 +30,7 @@
|
||||
<result column="article_tags" property="articleTags"></result>
|
||||
<result column="article_view_count" property="articleViewCount"></result>
|
||||
<result column="article_preview_content" property="articlePreviewContent"></result>
|
||||
<result column="article_content" property="articleContent"></result>
|
||||
<result column="comment_count" property="commentCount"></result>
|
||||
<result column="time_ago" property="timeAgo"></result>
|
||||
<result column="article_permalink" property="articlePermalink"></result>
|
||||
@ -37,9 +38,16 @@
|
||||
<result column="updated_time" property="updatedTime"></result>
|
||||
</resultMap>
|
||||
<resultMap id="AuthorResultMap" type="com.rymcu.vertical.dto.Author">
|
||||
<result column="id" jdbcType="VARCHAR" property="idUser"/>
|
||||
<result column="nickname" jdbcType="VARCHAR" property="userNickname"/>
|
||||
<result column="avatar_url" jdbcType="VARCHAR" property="userAvatarURL"/>
|
||||
<result column="id" property="idUser"/>
|
||||
<result column="nickname" property="userNickname"/>
|
||||
<result column="avatar_url" property="userAvatarURL"/>
|
||||
</resultMap>
|
||||
<resultMap id="ArticleContentResultMap" type="com.rymcu.vertical.entity.ArticleContent">
|
||||
<result column="id_article" property="idArticle"/>
|
||||
<result column="article_content" property="articleContent"/>
|
||||
<result column="article_content_html" property="articleContentHtml"/>
|
||||
<result column="created_time" property="createdTime"/>
|
||||
<result column="updated_time" property="updatedTime"/>
|
||||
</resultMap>
|
||||
<insert id="insertArticleContent">
|
||||
insert into article_content (id_article,article_content,article_content_html,created_time,updated_time)
|
||||
@ -49,7 +57,7 @@
|
||||
update article_content set article_content = #{articleContent},article_content_html = #{articleContentHtml},updated_time = sysdate() where id_article = #{idArticle}
|
||||
</update>
|
||||
<select id="selectArticles" resultMap="DTOResultMap">
|
||||
select art.*,su.nickname,su.avatar_url from article art left join sys_user su on art.article_author_id = su.id
|
||||
select art.*,su.nickname,su.avatar_url from article art left join sys_user su on art.article_author_id = su.id order by updated_time desc
|
||||
</select>
|
||||
<select id="selectAuthor" resultMap="AuthorResultMap">
|
||||
select * from sys_user where id = #{id}
|
||||
@ -57,4 +65,7 @@
|
||||
<select id="selectArticleDTOById" resultMap="DTOResultMap">
|
||||
select art.*,su.nickname,su.avatar_url from article art left join sys_user su on art.article_author_id = su.id where art.id = #{id}
|
||||
</select>
|
||||
<select id="selectArticleContent" resultMap="ArticleContentResultMap">
|
||||
select article_content_html from article_content where id_article = #{idArticle}
|
||||
</select>
|
||||
</mapper>
|
Loading…
Reference in New Issue
Block a user