添加分类显示回收站 稍后看

This commit is contained in:
WangHao
2021-04-26 22:27:52 +08:00
parent 4131d8bdca
commit 900076723f
24 changed files with 941 additions and 252 deletions

View File

@ -2,18 +2,16 @@ package com.ruoyi.web.controller.yunbookmark;
import com.ruoyi.bookmark.domain.SqBookmark;
import com.ruoyi.bookmark.domain.SqMenu;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.bookmark.service.ISqBookmarkService;
import com.ruoyi.bookmark.service.ISqMenuService;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisUtil;
import com.ruoyi.common.utils.bookmarkhtml.Const;
import com.ruoyi.common.utils.bookmarkhtml.HtmlName;
import com.ruoyi.common.utils.bookmarkhtml.ImportHtml;
import com.ruoyi.common.utils.StringUtils;
import org.jsoup.HttpStatusException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -25,13 +23,10 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.net.ssl.SSLHandshakeException;
import java.net.URL;
import java.util.Comparator;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
/**
@ -50,9 +45,9 @@ public class BrowserController extends BaseController {
@Autowired
private ISqBookmarkService iSqBookmarkService;
//导入
@RequestMapping("/import")
@PreAuthorize("@ss.hasPermi('bookmark:browser:export')")
@PreAuthorize("@ss.hasPermi('bookmark:browser:import')")
public AjaxResult importCollect(@RequestParam("htmlFile") MultipartFile htmlFile){
long startTime = System.currentTimeMillis();
logger.info("开始上传状态是:"+ startTime );
@ -88,7 +83,7 @@ public class BrowserController extends BaseController {
long endTime = System.currentTimeMillis();
float seconds = (endTime - startTime) / 1000F;
logger.info("导入用时:"+ Float.toString(seconds) );
logger.info("导入用时:"+ seconds +"");
return AjaxResult.success("导入成功");
@ -96,34 +91,31 @@ public class BrowserController extends BaseController {
// /**
// * 导入收藏文章
// */
// public void importHtml(Map<String, String> map,Long menuID,Long userId){
// for(Entry<String, String> entry : map.entrySet()){
// try {
// //获取URL后查询最新的URL信息
// Map<String, String> result = ImportHtml.getCollectFromUrl(entry.getKey());
// SqBookmark sqBookmark =new SqBookmark();
// sqBookmark.setUserid(userId);
// sqBookmark.setTitle(entry.getValue());
// sqBookmark.setUrl(entry.getKey());
// sqBookmark.setUrls(ImportHtml.Urlutils(new URL(entry.getKey())));
// if(StringUtils.isBlank(result.get("description"))){
// sqBookmark.setDescription(entry.getValue());
// }else{
// sqBookmark.setDescription(result.get("description"));
// }
// sqBookmark.setMenuId(menuID);
// sqBookmark.setCreateTime(new Date());
// iSqBookmarkService.insertSqBookmark(sqBookmark);
// } catch (Exception e) {
// logger.error("导入存储异常:",e);
// }
// }
//
// }
/**
* 导出全部书签
*/
@RequestMapping("/export")
// @PreAuthorize("@ss.hasPermi('bookmark:browser:export')")
public void exportCollect(HttpServletResponse response) {
long startTime = System.currentTimeMillis();
logger.info("导出书签:" + startTime + "用户ID:" + getAuthUser().getUserId());
try {
String fileName = "cqy_" + DateUtil.now() + ".html";
StringBuilder sb = iSqBookmarkService.exportToHtml(getAuthUser().getUserId());
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Access-Control-Expose-Headers", "content-disposition"); //Access-Control-Expose-Headers 让前端可以取Content-Disposition
response.setHeader("content-disposition", "attachment;filename=" + fileName);
response.setHeader("Pargam", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.getWriter().print(sb);
} catch (Exception e) {
logger.error("异常:", e);
}
long endTime = System.currentTimeMillis();
float seconds = (endTime - startTime) / 1000F;
logger.info("导出用时:" + seconds+"");
}
}

View File

@ -44,16 +44,6 @@ public class SqBookmarkController extends BaseController
private ISqBookmarkService sqBookmarkService;
// /**
// * 测试通用mapper
// */
// @GetMapping("/selectByID")
// public TableDataInfo selectByID( Long userID) {
// List<SqBookmark> list = sqBookmarkService.selectByID(userID);
// return getDataTable(list);
// }
/**
* 删除重复的书签
*/
@ -133,6 +123,19 @@ public class SqBookmarkController extends BaseController
return getDataTable(list);
}
/**
* 查询书签管理列表 聚合>> 星标 稍后看 最新书签
*/
// @PreAuthorize("@ss.hasPermi('bookmark:bookmark:list')")
@GetMapping("/listByUserAndPolymerization")
public TableDataInfo listByUserAndPolymerization(SqBookmark sqBookmark)
{
sqBookmark.setUserid(getAuthUser().getUserId());
startPage();
List<SqBookmark> list = sqBookmarkService.listByUserAndPolymerization(sqBookmark);
return getDataTable(list);
}
/**
* 查询书签管理列表

View File

@ -0,0 +1,36 @@
<!DOCTYPE >
<!-- This is an automatically generated file.
It will be read and overwritten.
DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL>
<DT><H3 ADD_DATE="1584277207" LAST_MODIFIED="0">收藏夹栏</H3>
<DL>
<DT><H3 ADD_DATE="1584277207" LAST_MODIFIED="0">一级2</H3>
<DL>
<DT><A HREF="https://www.huodongxing.com/go/tl24" TARGET="_blank">第二十四届前端早早聊大会 | 前端搞算法 - 在线直播 预约</A>
</DL>
<DT><H3 ADD_DATE="1584277207" LAST_MODIFIED="0">一级</H3>
<DL>
<DT><A HREF="https://juejin.cn/" TARGET="_blank">掘金 - 代码不止,掘金不停</A>
<DT><H3 ADD_DATE="1584277207" LAST_MODIFIED="0">二级</H3>
<DL>
<DT><A HREF="https://juejin.cn/pin/6952704146197708837" TARGET="_blank">【掘金读书会】掘金x异步 -
掘金</A>
</DL>
</DL>
<DT><H3 ADD_DATE="1584277207" LAST_MODIFIED="0">一级3</H3>
<DL>
<DT><A HREF="https://juejin.cn/post/6951649464637636622" TARGET="_blank">从 0 开始手把手带你搭建一套规范的 Vue3.x
项目工程</A>
<DT><H3 ADD_DATE="1584277207" LAST_MODIFIED="0">二级3-1</H3>
<DL>
<DT><A HREF="https://juejin.cn/post/6947987257034965000"
TARGET="_blank">我,是如何度过人生最艰难的时刻的</A>
</DL>
</DL>
</DL>
</dl>

View File

@ -0,0 +1,136 @@
package com.ruoyi.web.test.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HtmlUtil;
import com.ruoyi.bookmark.domain.SqBookmark;
import com.ruoyi.bookmark.domain.SqMenu;
import com.ruoyi.bookmark.service.ISqBookmarkService;
import com.ruoyi.bookmark.service.ISqMenuService;
import com.ruoyi.common.utils.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Auther: Wang
* @Date: 2021/04/19 21:16
* 功能描述:
*/
public class HtmlTest extends BaseSpringBootTest {
@Autowired
private ISqMenuService iSqMenuService;
@Autowired
private ISqBookmarkService iSqBookmarkService;
@Test
public void test3() {
String favoritesId = "2";
if(StringUtils.isNotBlank(favoritesId))
{
HttpServletResponse response=null;
try {
String fileName = "cqy_" + DateUtil.now() + ".html";
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" +
"<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n" +
"<TITLE>Bookmarks</TITLE>\n" +
"<H1>Bookmarks</H1>");
sb.append("<DL>\n");
sb.append(exportToHtml(1L));
sb.append("</DL>\n");
//1:使用File类创建一个要操作的文件路径
File file = new File("D:" + File.separator + "demo" + File.separator + fileName);
if(!file.getParentFile().exists()){ //如果文件的目录不存在
file.getParentFile().mkdirs(); //创建目录
}
//2: 实例化OutputString 对象
OutputStream output = new FileOutputStream(file);
//3: 准备好实现内容的输出
//将字符串变为字节数组
byte data[] = sb.toString().getBytes();
output.write(data);
//4: 资源操作的最后必须关闭
output.close();
} catch (Exception e) {
logger.error("异常:", e);
}
}
}
/**
* 导出到html文件
* @param
*/
public StringBuilder exportToHtml(Long userId){
SqMenu sqMenu=new SqMenu();
sqMenu.setUserId(userId);
SqBookmark sqBookmark = new SqBookmark();
sqBookmark.setUserid(userId);
//目录
List<SqMenu> menuList = iSqMenuService.selectSqMenuList(sqMenu);
Map<Long, List<SqMenu>> mapMenu = menuList.stream().collect(Collectors.groupingBy(SqMenu::getParentId));
//书签
List<SqBookmark> bookMarkList = iSqBookmarkService.selectSqBookmarkList(sqBookmark);
Map<Long, List<SqBookmark>> mapBookMark = bookMarkList.stream().collect(Collectors.groupingBy(SqBookmark::getMenuId));
List<SqMenu> sqMenuList = mapMenu.get(0L);
StringBuilder str = new StringBuilder();
str = traverseFile_recursion(sqMenuList,str,mapBookMark,mapMenu);
return str;
}
/**
* @Description:递归书签导出功能
*
* @param * @param sqMenuList
* @param str
* @param mapBookMark
* @param mapMenu
* @return java.lang.StringBuilder
* @Date
* @author: wanghao
*
*/
public StringBuilder traverseFile_recursion (List<SqMenu> sqMenuList,StringBuilder str,Map<Long, List<SqBookmark>> mapBookMark,Map<Long, List<SqMenu>> mapMenu) {
if (sqMenuList != null && !sqMenuList.isEmpty()) {
for (SqMenu f : sqMenuList) {
str.append("<DT><H3 ADD_DATE=\"1584277207\" LAST_MODIFIED=\"0\">").append(f.getMenuName()).append("</H3>\n");
str.append("<DL>\n");
List<SqBookmark> bookmarksList = mapBookMark.get(f.getMenuId());
if (bookmarksList != null && !bookmarksList.isEmpty()) {
for (SqBookmark b : bookmarksList) {
str.append("<DT><A HREF=\""+b.getUrl()+"\" TARGET=\"_blank\">"+b.getTitle()+"</A>\n");
}
}
traverseFile_recursion(mapMenu.get(f.getMenuId()),str,mapBookMark,mapMenu);
str.append("</DL>\n");
}
}
return str;
}
}

View File

@ -0,0 +1,47 @@
<DL>
<DT><H3>收藏夹栏</H3>
<DL>
<DT>
<H3 ADD_DATE="1618847296" LAST_MODIFIED="1618847407">一级2</H3>
<DL>
<DT>
<A HREF="https://www.huodongxing.com/go/tl24" ADD_DATE="1618847403"
ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAB6ElEQVQ4jU2SO2uUYRSEZ+b9NhtzMRcDigiKoJVgkSaNhUGxsLDQytIqlW38A/4CLdLZWVna2amNhDTxAkJYAwlGJCoxhuxu9pux+LIinPI8MOc5Q2xeQYAQIaJmGDGSBZS6BkxGsBJVDGMC/wFO6n4cJ7CAcWEkJixGVfJvu8B1cU5o6nz79BynTmn6ZJl+9Xvta+8H0UIIq0IIU6g8OFwcu/Z4bqnCSKe/c+j+z8He4sT8JCae7DyvNFY7PAYiosC+3LqwMHa1V/fXu52V3Rerv14vn3vUxihMotCB1YQWLaT0XdexoAczt99denZz9m6CkgIXRLESCRYwxKJCkei6R2JOs0euBcEFFiJaFa2hHDFEkERQkoFrpiSEBYrNDUlp8sAFEAiSAAAoJUFCuJCikahq3tEos+E4SQCKPdclpc0KFlTiMBIjWnRBNMq2KCMEHS+fvXd/7vrHg21gJCYhmFWjKCEyun6w2el+uzh6BoGRN3ufVrZfbvX/FI7XNQghFF3iUpsFY2/3PsyvP1zaePpu/7PIzuH3zv6W0mJEDDvGtRuNUFpMGTg46rU0cWdmYeNw9/3+l9IUKUKAiFq91Qg+Np1SXA2cetAF2i2OpKnqMcDhH6w0WFgnjNqajGljuE2AAP4CW2c6UNfg92YAAAAASUVORK5CYII=">第二十四届前端早早聊大会
| 前端搞算法 - 在线直播 预约报名-前端早早聊活动-活动行</A>
</DL>
<DT><H3 ADD_DATE="1618847280" LAST_MODIFIED="1618847363">一级</H3>
<DL>
<DT><H3 ADD_DATE="1618847339" LAST_MODIFIED="1618847379">二级</H3>
<DL>
<DT><A HREF="https://juejin.cn/pin/6952704146197708837" ADD_DATE="1618847363"
ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABU0lEQVQ4jcXSvUsVYBQG8N+5XpeuSBFNQTnkZERI0RIRiDi0KQnh1mB7mBDB9QWTkKB/oIaIBkNwdDAaBEGCaoqamvpAGhpL4upp8CJXvVfafKbD+zzn6zkvR43oyExlTc0z/PDJtMXYaierdCzQYwDDGDXg7P/PNJndu3HJPvfzZFuuLeo5rOQ3Ja8f4EqOKrmh5GDr894VKt7gBVaUvAtuZpeZnMeCbfNKfGhNCQ/ytKpJ4ZESm7vdeI5l6RTO2zZuNlab/HFM+eNxRbcTwgTWzOSZHUEsabiCi0JNw2BL8gW8k0ZU9VaU+IhL2MB79RwCD+Oz3y7jmrn43vTolrQurfrlqrn42rJNhpJFyb/qeW+fgVUlnyi5qZ539npw8BI3hJfCa9zGMemV0G/LmNl4e3iBnY7nsCR1oVf4gnElfu6XHv6VezxtejOtRKOj9kjxD4w4cYS3SWCbAAAAAElFTkSuQmCC">【掘金读书会】掘金x异步
- 掘金</A>
</DL>
<DT><A HREF="https://juejin.cn/" ADD_DATE="1618847358"
ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABU0lEQVQ4jcXSvUsVYBQG8N+5XpeuSBFNQTnkZERI0RIRiDi0KQnh1mB7mBDB9QWTkKB/oIaIBkNwdDAaBEGCaoqamvpAGhpL4upp8CJXvVfafKbD+zzn6zkvR43oyExlTc0z/PDJtMXYaierdCzQYwDDGDXg7P/PNJndu3HJPvfzZFuuLeo5rOQ3Ja8f4EqOKrmh5GDr894VKt7gBVaUvAtuZpeZnMeCbfNKfGhNCQ/ytKpJ4ZESm7vdeI5l6RTO2zZuNlab/HFM+eNxRbcTwgTWzOSZHUEsabiCi0JNw2BL8gW8k0ZU9VaU+IhL2MB79RwCD+Oz3y7jmrn43vTolrQurfrlqrn42rJNhpJFyb/qeW+fgVUlnyi5qZ539npw8BI3hJfCa9zGMemV0G/LmNl4e3iBnY7nsCR1oVf4gnElfu6XHv6VezxtejOtRKOj9kjxD4w4cYS3SWCbAAAAAElFTkSuQmCC">掘金
- 代码不止,掘金不停</A>
</DL>
<DT><H3 ADD_DATE="1618847309" LAST_MODIFIED="1618847390">一级3</H3>
<DL>
<DT>
<H3 ADD_DATE="1618847324" LAST_MODIFIED="1618847403">二级3-1</H3>
<DL>
<DT><A HREF="https://juejin.cn/post/6947987257034965000" ADD_DATE="1618847390"
ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABU0lEQVQ4jcXSvUsVYBQG8N+5XpeuSBFNQTnkZERI0RIRiDi0KQnh1mB7mBDB9QWTkKB/oIaIBkNwdDAaBEGCaoqamvpAGhpL4upp8CJXvVfafKbD+zzn6zkvR43oyExlTc0z/PDJtMXYaierdCzQYwDDGDXg7P/PNJndu3HJPvfzZFuuLeo5rOQ3Ja8f4EqOKrmh5GDr894VKt7gBVaUvAtuZpeZnMeCbfNKfGhNCQ/ytKpJ4ZESm7vdeI5l6RTO2zZuNlab/HFM+eNxRbcTwgTWzOSZHUEsabiCi0JNw2BL8gW8k0ZU9VaU+IhL2MB79RwCD+Oz3y7jmrn43vTolrQurfrlqrn42rJNhpJFyb/qeW+fgVUlnyi5qZ539npw8BI3hJfCa9zGMemV0G/LmNl4e3iBnY7nsCR1oVf4gnElfu6XHv6VezxtejOtRKOj9kjxD4w4cYS3SWCbAAAAAElFTkSuQmCC">我,是如何度过人生最艰难的时刻的</A>
</DL>
<DT><A HREF="https://juejin.cn/post/6951649464637636622" ADD_DATE="1618847379"
ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABU0lEQVQ4jcXSvUsVYBQG8N+5XpeuSBFNQTnkZERI0RIRiDi0KQnh1mB7mBDB9QWTkKB/oIaIBkNwdDAaBEGCaoqamvpAGhpL4upp8CJXvVfafKbD+zzn6zkvR43oyExlTc0z/PDJtMXYaierdCzQYwDDGDXg7P/PNJndu3HJPvfzZFuuLeo5rOQ3Ja8f4EqOKrmh5GDr894VKt7gBVaUvAtuZpeZnMeCbfNKfGhNCQ/ytKpJ4ZESm7vdeI5l6RTO2zZuNlab/HFM+eNxRbcTwgTWzOSZHUEsabiCi0JNw2BL8gW8k0ZU9VaU+IhL2MB79RwCD+Oz3y7jmrn43vTolrQurfrlqrn42rJNhpJFyb/qeW+fgVUlnyi5qZ539npw8BI3hJfCa9zGMemV0G/LmNl4e3iBnY7nsCR1oVf4gnElfu6XHv6VezxtejOtRKOj9kjxD4w4cYS3SWCbAAAAAElFTkSuQmCC">
0 开始手把手带你搭建一套规范的 Vue3.x 项目工程环境</A>
</DL>
</DL>
</DL>