添加分类显示回收站 稍后看
This commit is contained in:
@ -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+"秒");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询书签管理列表
|
||||
|
@ -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>
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -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>
|
Reference in New Issue
Block a user