package com.jspxcms.core.domain;
import com.google.common.base.Objects;
import com.jspxcms.common.file.FilesEx;
import com.jspxcms.common.util.Reflections;
import com.jspxcms.common.util.Strings;
import com.jspxcms.common.web.Anchor;
import com.jspxcms.common.web.ImageAnchor;
import com.jspxcms.common.web.ImageAnchorBean;
import com.jspxcms.common.web.PageUrlResolver;
import com.jspxcms.core.constant.Constants;
import com.jspxcms.core.domain.InfoOrg.InfoOrgComparator;
import com.jspxcms.core.support.Commentable;
import com.jspxcms.core.support.Context;
import com.jspxcms.core.support.Siteable;
import com.jspxcms.core.support.TitleText;
import com.jspxcms.ext.domain.InfoFavorite;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.hibernate.annotations.MapKeyType;
import org.hibernate.annotations.SortComparator;
import org.hibernate.annotations.Type;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.lexer.Lexer;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.util.SimpleNodeIterator;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlTransient;
import java.sql.Timestamp;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.jspxcms.core.constant.Constants.DYNAMIC_SUFFIX;
import static com.jspxcms.core.constant.Constants.SITE_PREFIX;
import static javax.persistence.CascadeType.PERSIST;
import static javax.persistence.CascadeType.REMOVE;
/**
* Info
*
* @author liufang
*/
@Entity
@Table(name = "cms_info")
public class Info implements java.io.Serializable, Anchor, Siteable, Commentable, PageUrlResolver {
private static final long serialVersionUID = 1L;
/**
* 附件类型
*/
public static final String ATTACH_TYPE = "info";
/**
* 评论类型
*/
public static final String COMMENT_TYPE = "Info";
/**
* 评分标记
*/
public static final String SCORE_MARK = "InfoScore";
/**
* Digg标记
*/
public static final String DIGG_MARK = "InfoDigg";
/**
* 模型类型
*/
public static final String MODEL_TYPE = "info";
/**
* 工作流类型
*/
public static final int WORKFLOW_TYPE = 1;
/**
* 审核中
*/
public static final String AUDITING = "1";
/**
* 正常
*/
public static final String NORMAL = "A";
/**
* 草稿
*/
public static final String DRAFT = "B";
/**
* 投稿
*/
public static final String CONTRIBUTION = "C";
/**
* 退稿
*/
public static final String REJECTION = "D";
/**
* 采集
*/
public static final String COLLECTED = "E";
/**
* 待发布
*/
public static final String TOBE_PUBLISH = "F";
/**
* 已过期
*/
public static final String EXPIRED = "G";
/**
* 推送
*/
public static final String PUSH = "H";
/**
* 删除
*/
public static final String DELETED = "X";
/**
* 归档
*/
public static final String ARCHIVE = "Z";
/**
* 替换标识:栏目ID
*/
public static final String PATH_NODE_ID = "{node_id}";
/**
* 替换标识:栏目编码
*/
public static final String PATH_NODE_NUMBER = "{node_number}";
/**
* 替换标识:内容ID
*/
public static final String PATH_INFO_ID = "{info_id}";
/**
* 替换标识:年
*/
public static final String PATH_YEAR = "{year}";
/**
* 替换标识:月
*/
public static final String PATH_MONTH = "{month}";
/**
* 替换标识:日
*/
public static final String PATH_DAY = "{day}";
/**
* 信息正文KEY
*/
public static final String INFO_TEXT = "text";
/**
* 分页标签
*/
public static final String PAGEBREAK_OPEN = "[PageBreak]";
public static final String PAGEBREAK_CLOSE = "[/PageBreak]";
public static final Pattern PAGEBREAK_PATTERN = Pattern
.compile("([\\s\\S]*?)(<div>\\s*?|<p>\\s*?)?\\[PageBreak\\]([\\s\\S]*?)\\[/PageBreak\\](\\s*?</div>|\\s*?</p>)?");
/**
* 获取没有分页信息的正文
*
* @return
*/
@Transient
public static String getTextWithoutPageBreak(String text) {
if (text == null) {
return text;
}
// 末尾加上分页,便于处理
text += PAGEBREAK_OPEN + PAGEBREAK_CLOSE;
StringBuilder sb = new StringBuilder();
Matcher m = PAGEBREAK_PATTERN.matcher(text);
while (m.find()) {
sb.append(m.group(1));
}
return sb.toString();
}
@Transient
public static String getDescription(Map<String, String> map, String title) {
String html = map != null ? map.get(INFO_TEXT) : null;
String text = getTextWithoutPageBreak(html);
String desciption = Strings.getTextFromHtml(text, 450);
return StringUtils.isNotBlank(desciption) ? desciption : title;
}
/**
* 获取正文中第一张图片
*
* @param map
* @return
*/
@Transient
public static List<String> getTextImages(Map<String, String> map) {
List<String> textImages = new ArrayList<String>();
String html = map != null ? map.get(INFO_TEXT) : null;
if (StringUtils.isBlank(html)) {
return textImages;
}
try {
Parser parser = new Parser(new Lexer(html));
NodeFilter filter = new TagNameFilter("img");
NodeList nodes = parser.extractAllNodesThatMatch(filter);
SimpleNodeIterator it = nodes.elements();
while (it.hasMoreNodes()) {
ImageTag tag = (ImageTag) it.nextNode();
String textImage = tag.getAttribute("src");
if (StringUtils.isNotBlank(textImage)) {
textImages.add(textImage);
}
}
} catch (ParserException e) {
// 忽略
}
return textImages;
}
/**
* 获得分页的InfoText(标题、正文)列表
*
* @return
*/
@Transient
public List<TitleText> getTextList() {
List<TitleText> list = new ArrayList<TitleText>();
String text = getText();
String title = getFullTitleOrTitle();
if (text != null) {
text += PAGEBREAK_OPEN + PAGEBREAK_CLOSE;
Matcher m = PAGEBREAK_PATTERN.matcher(text);
while (m.find()) {
list.add(new TitleText(title, m.group(1)));
String t = m.group(3);
if (StringUtils.isBlank(t)) {
t = title;
}
}
} else {
list.add(new TitleText(title, ""));
}
return list;
}
/**
* 获取没有分页信息的正文
*
* @return
*/
@Transient
public String getTextWithoutPageBreak() {
String text = getText();
return getTextWithoutPageBreak(text);
}
/**
* 获取没有html的正文
*
* @return
*/
@Transient
public String getPlainText() {
String text = getTextWithoutPageBreak();
return Strings.getTextFromHtml(text);
}
@Transient
public String getDescription() {
String desciption = getMetaDescription();
if (StringUtils.isBlank(desciption)) {
String text = getTextWithoutPageBreak();
desciption = Strings.getTextFromHtml(text, 450);
if (StringUtils.isBlank(desciption)) {
desciption = getTitle();
}
desciption = StringUtils.trim(desciption);
return desciption;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【项目资源】:包含前端、后端、移动开发、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源,毕业设计等各种技术项目的源码。包括C++、Java、python、web、C#、EDA等项目的源码。 【适用人群】:适用于希望学习不同技术领域的初学者或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
资源推荐
资源详情
资源评论
收起资源包目录
java 的新闻发布系统 (2000个子文件)
bootstrap.css 143KB
bootstrap.css 143KB
bootstrap.css 143KB
bootstrap.css 142KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap.css 117KB
AdminLTE.css 108KB
style.css 97KB
jquery.minicolors.css 96KB
bootstrap.min.css 95KB
AdminLTE.min.css 88KB
AdminLTE-without-plugins.css 88KB
AdminLTE-without-plugins.min.css 72KB
ionicons.css 56KB
ionicons.min.css 50KB
_all-skins.css 46KB
ueditor.css 43KB
_all-skins.min.css 40KB
font-awesome.css 37KB
ueditor.min.css 34KB
docs.css 30KB
font-awesome.min.css 30KB
jquery-ui.css 27KB
ambiance.css 26KB
bootstrap-theme.css 26KB
bootstrap-theme.css 26KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
bootstrap-theme.min.css 23KB
bootstrap-theme.min.css 23KB
docs.min.css 22KB
_all.css 21KB
video-js.css 21KB
image.css 18KB
bootstrap-theme.css 16KB
AdminLTE-bootstrap-social.css 15KB
_all.css 15KB
bootstrap-theme.min.css 15KB
video.css 15KB
attachment.css 14KB
_all.css 14KB
_all.css 13KB
zhongshanPark.css 13KB
AdminLTE-bootstrap-social.min.css 12KB
video-js.min.css 11KB
flipclock.css 10KB
awesome.css 8KB
codemirror.css 8KB
shCoreDefault.css 7KB
global_bak.css 6KB
metroStyle.css 6KB
zTreeStyle.css 6KB
style.css 6KB
default.css 6KB
qunit.css 5KB
non-responsive.css 5KB
global.css 5KB
common.css 5KB
mdn-like.css 5KB
solarized.css 5KB
skin-black-light.css 5KB
skin-blue-light.css 4KB
skin-purple-light.css 4KB
skin-yellow-light.css 4KB
skin-green-light.css 4KB
skin-red-light.css 4KB
skin-black-light.min.css 4KB
skin-black.css 4KB
skin-blue-light.min.css 4KB
scrawl.css 4KB
skin-yellow-light.min.css 4KB
skin-purple-light.min.css 4KB
skin-green-light.min.css 4KB
skin-red-light.min.css 4KB
skin-blue.css 3KB
skin-yellow.css 3KB
skin-purple.css 3KB
skin-black.min.css 3KB
skin-green.css 3KB
skin-red.css 3KB
pygments-manni.css 3KB
skin-blue.min.css 3KB
skin-purple.min.css 3KB
skin-yellow.min.css 3KB
skin-green.min.css 3KB
codemirror.css 3KB
AdminLTE-select2.css 3KB
main.css 3KB
skin-red.min.css 3KB
xq-dark.css 3KB
charts.css 3KB
AdminLTE-select2.min.css 3KB
carousel.css 2KB
cover.css 2KB
blog.css 2KB
background.css 2KB
lesser-dark.css 2KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
白话Learning
- 粉丝: 4487
- 资源: 2904
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- jdk - 22.0.2 - windows graalVM
- jdk - 22.0.2 - windows
- 496785224932493FLUENT_VOF&熔化_2D (不含仿真数据).zip
- jdk - 22.0.2 - macos
- 在Windows系统中管理Mac磁盘的实用工具-在Windows系统中创建并使用Mac磁盘,读取Mac磁盘中的文件
- PFC理论基础与Matlab仿真模型学习笔记(1)-PFC电路概述
- 吞食天地2马腾传.nes
- 西部数据发布的一款西数硬盘检测修复工具-支持WD-L/WD-ROYL板,能进行硬盘软复位,可识别硬盘查看或清除-供大家学习参考
- wwwwwwwwwwwwwwwwwww
- 利用恒源云在云端租用GPU服务器训练YOLOv8模型(包括Linux系统命令讲解)_恒源云跑模型-CSDN博客.html
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功