Redis实现接口防重复点击
This commit is contained in:
parent
38e4f2aa04
commit
fec325e383
@ -9,6 +9,7 @@ import com.ruoyi.bookmark.service.ISqMenuService;
|
|||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.domain.entity.SysUser;
|
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.Const;
|
||||||
import com.ruoyi.common.utils.bookmarkhtml.HtmlName;
|
import com.ruoyi.common.utils.bookmarkhtml.HtmlName;
|
||||||
import com.ruoyi.common.utils.bookmarkhtml.ImportHtml;
|
import com.ruoyi.common.utils.bookmarkhtml.ImportHtml;
|
||||||
@ -50,7 +51,6 @@ public class BrowserController extends BaseController {
|
|||||||
private ISqBookmarkService iSqBookmarkService;
|
private ISqBookmarkService iSqBookmarkService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@RequestMapping("/import")
|
@RequestMapping("/import")
|
||||||
@PreAuthorize("@ss.hasPermi('bookmark:bookmark:list')")
|
@PreAuthorize("@ss.hasPermi('bookmark:bookmark:list')")
|
||||||
public AjaxResult importCollect(@RequestParam("htmlFile") MultipartFile htmlFile){
|
public AjaxResult importCollect(@RequestParam("htmlFile") MultipartFile htmlFile){
|
||||||
@ -58,52 +58,19 @@ public class BrowserController extends BaseController {
|
|||||||
SysUser sysUser=getAuthUser();
|
SysUser sysUser=getAuthUser();
|
||||||
Long userID= sysUser.getUserId();
|
Long userID= sysUser.getUserId();
|
||||||
//防止重复上传
|
//防止重复上传
|
||||||
|
Long htmlFlag = iSqMenuService.noRepetition(Const.IMPORTHTML,userID,300L);
|
||||||
|
if(htmlFlag.intValue()!=0){
|
||||||
|
return AjaxResult.success("导入操作频繁请"+htmlFlag.intValue()+"秒后再操作!");
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
//解析HTML
|
||||||
List<HtmlName> list = ImportHtml.addMenuAndBookmark(htmlFile.getInputStream());
|
List<HtmlName> list = ImportHtml.addMenuAndBookmark(htmlFile.getInputStream());
|
||||||
if(null == list || list.isEmpty()){
|
if(null == list || list.isEmpty()){
|
||||||
return AjaxResult.error("未获取到url连接,空书签文件");
|
return AjaxResult.error("未获取到url连接,空书签文件");
|
||||||
}
|
}
|
||||||
//获取所有的 *目录*文件夹
|
//处理导入的html数据
|
||||||
List<HtmlName> listMenu= list.stream().filter(m-> m.getState().equals("0")).collect(Collectors.toList());
|
iSqBookmarkService.addALLBookMarkByHtml(list,userID);
|
||||||
//id排序 防止已添加的父id漏修改 id升序
|
|
||||||
listMenu.sort(Comparator.comparing(HtmlName::getId));
|
|
||||||
//1.添加目录
|
|
||||||
for (HtmlName h : listMenu) {
|
|
||||||
String id=h.getId();
|
|
||||||
//添加 返回id
|
|
||||||
SqMenu sqMenu = new SqMenu(userID,h.getTitle(),Long.valueOf(h.getParentId()), Const.MenuIocURL);
|
|
||||||
int countId = iSqMenuService.insertSqMenu(sqMenu);
|
|
||||||
if(countId!=0){
|
|
||||||
Long k=Long.valueOf(sqMenu.getMenuId().toString());
|
|
||||||
//批量修改对应的父目录id
|
|
||||||
listMenu = ImportHtml.listFilter(listMenu,k,id);
|
|
||||||
//批量修改对应的书签id
|
|
||||||
list = ImportHtml.listFilter(list,k,id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//2.添加书签
|
|
||||||
for (HtmlName h : list) {
|
|
||||||
if (!h.getState().equals("0")&&h.getState().equals(Const.BOOKMARK_STATE_FLAG)) {
|
|
||||||
SqBookmark sqBookmark =new SqBookmark();
|
|
||||||
sqBookmark.setUserid(userID);
|
|
||||||
sqBookmark.setTitle(h.getTitle());
|
|
||||||
sqBookmark.setUrl(h.getUrl());
|
|
||||||
sqBookmark.setUrls(ImportHtml.Urlutils(new URL(h.getUrl())));
|
|
||||||
if(StringUtils.isBlank(h.getDescription())){
|
|
||||||
sqBookmark.setDescription(h.getTitle());
|
|
||||||
}else{
|
|
||||||
sqBookmark.setDescription(h.getDescription());
|
|
||||||
}
|
|
||||||
sqBookmark.setMenuId(Long.valueOf(h.getParentId()));
|
|
||||||
sqBookmark.setCreateTime(new Date());
|
|
||||||
iSqBookmarkService.insertSqBookmark(sqBookmark);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}catch (SSLHandshakeException e){
|
}catch (SSLHandshakeException e){
|
||||||
logger.error("文章解析出错:",e);
|
logger.error("文章解析出错:",e);
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,8 @@ public class Const {
|
|||||||
public static String MenuIocURL= "https://up.raindrop.io/collection/templates/social-media-logos-6/47social.png";
|
public static String MenuIocURL= "https://up.raindrop.io/collection/templates/social-media-logos-6/47social.png";
|
||||||
//已修改父级id的书签
|
//已修改父级id的书签
|
||||||
public static String BOOKMARK_STATE_FLAG= "666";
|
public static String BOOKMARK_STATE_FLAG= "666";
|
||||||
|
//导入书签html功能
|
||||||
|
public static String IMPORTHTML= "IMPORT_HTML";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div >
|
<div >
|
||||||
<div style="width:360px;height:260px;margin: 0 auto;margin-top: 40px">
|
<div style="width:360px;height:260px;margin: 0 auto;margin-top: 40px">
|
||||||
<!-- 用户导入对话框 -->
|
|
||||||
<!-- <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>-->
|
|
||||||
<el-upload
|
<el-upload
|
||||||
ref="upload"
|
ref="upload"
|
||||||
:limit="1"
|
:limit="1"
|
||||||
@ -22,55 +20,21 @@
|
|||||||
将文件拖到此处,或
|
将文件拖到此处,或
|
||||||
<em>点击上传</em>
|
<em>点击上传</em>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="el-upload__tip" slot="tip">-->
|
|
||||||
<!-- <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据-->
|
|
||||||
<!-- <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<div class="el-upload__tip title" slot="tip">提示:仅允许导入".html"格式文件!</div>
|
<div class="el-upload__tip title" slot="tip">提示:仅允许导入".html"格式文件!</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<div slot="footer" class="dialog-footer">
|
<div slot="footer" class="dialog-footer">
|
||||||
<!-- <el-button type="primary" class=" mdui-text-center mdui-btn mdui-btn-raised mdui-text-color-blue-900 mdui-color-light-blue-100" @click="submitFileForm">确 定</el-button>-->
|
|
||||||
<!-- <el-button @click="upload.open = false">取 消</el-button>-->
|
|
||||||
<button @click="submitFileForm" class="isbutton mdui-btn mdui-btn-block mdui-btn-raised mdui-btn-dense mdui-color-blue-100 mdui-ripple">导 入 书 签</button>
|
<button @click="submitFileForm" class="isbutton mdui-btn mdui-btn-block mdui-btn-raised mdui-btn-dense mdui-color-blue-100 mdui-ripple">导 入 书 签</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- </el-dialog>-->
|
|
||||||
|
|
||||||
<!-- <el-button-->
|
<div class="structure">
|
||||||
<!-- type="info"-->
|
<el-radio v-model="structure" label="0">按原目录导入</el-radio>
|
||||||
<!-- icon="el-icon-upload2"-->
|
<el-radio v-model="structure" label="1" disabled>全部导入到一个新目录</el-radio>
|
||||||
<!-- size="mini"-->
|
</div>
|
||||||
<!-- @click="handleImport"-->
|
<el-button type="primary" size="small" @click="submitUpload" plain><i
|
||||||
<!-- v-hasPermi="['system:user:import']"-->
|
class="el-icon-upload el-icon--right">开始导入书签</i></el-button>
|
||||||
<!-- >导入</el-button>-->
|
|
||||||
|
|
||||||
<!-- <el-upload-->
|
|
||||||
<!-- ref="upload"-->
|
|
||||||
<!-- :limit="1"-->
|
|
||||||
<!-- accept=".html"-->
|
|
||||||
<!-- class="upload-demo"-->
|
|
||||||
<!-- :headers="upload.headers"-->
|
|
||||||
<!-- :action="upload.url + '?updateSupport=' + 22"-->
|
|
||||||
<!-- name="htmlFile"-->
|
|
||||||
<!-- :on-progress="handleFileUploadProgress"-->
|
|
||||||
<!-- :on-success="handleFileSuccess"-->
|
|
||||||
<!-- :auto-upload="false"-->
|
|
||||||
|
|
||||||
<!-- drag-->
|
|
||||||
<!-- >-->
|
|
||||||
<!--<!– v-hasPermi="['bookmark:bookmark:export']"–>-->
|
|
||||||
<!-- <i class="el-icon-upload"></i>-->
|
|
||||||
<!-- <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>-->
|
|
||||||
<!-- <div class="el-upload__tip" slot="tip">只能上传浏览器导出的.html后缀文件</div>-->
|
|
||||||
<!-- </el-upload>-->
|
|
||||||
|
|
||||||
<!-- <div class="structure">-->
|
|
||||||
<!-- <el-radio v-model="structure" label="0">按原目录导入</el-radio>-->
|
|
||||||
<!-- <el-radio v-model="structure" label="1" disabled>全部导入到一个新目录</el-radio>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!--<el-button type="primary" size="small" @click="submitUpload" plain><i-->
|
|
||||||
<!--class="el-icon-upload el-icon--right">开始导入书签</i></el-button>-->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -78,7 +42,6 @@
|
|||||||
<div class="text">
|
<div class="text">
|
||||||
<ul>
|
<ul>
|
||||||
<li>注意事项</li>
|
<li>注意事项</li>
|
||||||
<li style="color: #ff2a34">导入300书签需要大约8分钟,请勿短时间重复操作</li>
|
|
||||||
<li>
|
<li>
|
||||||
1、导入的方法是将浏览器里面收藏的网站导出<span style="color: red">HTML文件后缀</span>。然后将导出的HTML文件点击上面的<span style="color: red">开始导入书签</span>。
|
1、导入的方法是将浏览器里面收藏的网站导出<span style="color: red">HTML文件后缀</span>。然后将导出的HTML文件点击上面的<span style="color: red">开始导入书签</span>。
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package com.ruoyi.bookmark.service;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.ruoyi.bookmark.domain.SqBookmark;
|
import com.ruoyi.bookmark.domain.SqBookmark;
|
||||||
|
import com.ruoyi.common.utils.bookmarkhtml.HtmlName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 书签管理Service接口
|
* 书签管理Service接口
|
||||||
@ -111,4 +112,12 @@ public interface ISqBookmarkService
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<SqBookmark> selectByUrlUserID(String url, Long userId);
|
List<SqBookmark> selectByUrlUserID(String url, Long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量添加html导入的数据
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
void addALLBookMarkByHtml(List<HtmlName> list,Long userID);
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package com.ruoyi.bookmark.service;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.ruoyi.bookmark.domain.SqMenu;
|
import com.ruoyi.bookmark.domain.SqMenu;
|
||||||
|
import org.omg.CORBA.INTERNAL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 书签菜单Service接口
|
* 书签菜单Service接口
|
||||||
@ -113,4 +114,15 @@ public interface ISqMenuService
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public void addMenu(Long userID, String title, Long valueOf);
|
public void addMenu(Long userID, String title, Long valueOf);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*防止重复点击上传文件
|
||||||
|
*
|
||||||
|
* @param state 表示某个功能
|
||||||
|
* @param userID 用户ID
|
||||||
|
* @param time key过期时间(秒)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Long noRepetition(String state, Long userID, Long time);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
package com.ruoyi.bookmark.service.impl;
|
package com.ruoyi.bookmark.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
@ -14,6 +18,10 @@ import com.ruoyi.bookmark.mapper.SqTagMapper;
|
|||||||
|
|
||||||
import com.ruoyi.bookmark.service.ISqTagService;
|
import com.ruoyi.bookmark.service.ISqTagService;
|
||||||
|
|
||||||
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
|
import com.ruoyi.common.utils.bookmarkhtml.Const;
|
||||||
|
import com.ruoyi.common.utils.bookmarkhtml.HtmlName;
|
||||||
|
import com.ruoyi.common.utils.bookmarkhtml.ImportHtml;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -303,5 +311,51 @@ public class SqBookmarkServiceImpl implements ISqBookmarkService
|
|||||||
return sqBookmarkMapper.selectByExample(example);
|
return sqBookmarkMapper.selectByExample(example);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addALLBookMarkByHtml(List<HtmlName> list,Long userID) {
|
||||||
|
//获取所有的 *目录*文件夹
|
||||||
|
List<HtmlName> listMenu= list.stream().filter(m-> m.getState().equals("0")).collect(Collectors.toList());
|
||||||
|
//id排序 防止已添加的父id漏修改 id升序
|
||||||
|
listMenu.sort(Comparator.comparing(HtmlName::getId));
|
||||||
|
//1.添加目录
|
||||||
|
for (HtmlName h : listMenu) {
|
||||||
|
String id=h.getId();
|
||||||
|
//添加 返回id
|
||||||
|
SqMenu sqMenu = new SqMenu(userID,h.getTitle(),Long.valueOf(h.getParentId()), Const.MenuIocURL);
|
||||||
|
int countId = sqMenuMapper.insertSqMenu(sqMenu);
|
||||||
|
if(countId!=0){
|
||||||
|
Long k=Long.valueOf(sqMenu.getMenuId().toString());
|
||||||
|
//批量修改对应的父目录id
|
||||||
|
listMenu = ImportHtml.listFilter(listMenu,k,id);
|
||||||
|
//批量修改对应的书签id
|
||||||
|
list = ImportHtml.listFilter(list,k,id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//2.添加书签
|
||||||
|
for (HtmlName h : list) {
|
||||||
|
if (!h.getState().equals("0")&&h.getState().equals(Const.BOOKMARK_STATE_FLAG)) {
|
||||||
|
SqBookmark sqBookmark =new SqBookmark();
|
||||||
|
sqBookmark.setUserid(userID);
|
||||||
|
sqBookmark.setTitle(h.getTitle());
|
||||||
|
sqBookmark.setUrl(h.getUrl());
|
||||||
|
try {
|
||||||
|
sqBookmark.setUrls(ImportHtml.Urlutils(new URL(h.getUrl())));
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
logger.info("导入书签,获取host出错!");
|
||||||
|
}
|
||||||
|
if(StringUtils.isBlank(h.getDescription())){
|
||||||
|
sqBookmark.setDescription(h.getTitle());
|
||||||
|
}else{
|
||||||
|
sqBookmark.setDescription(h.getDescription());
|
||||||
|
}
|
||||||
|
sqBookmark.setMenuId(Long.valueOf(h.getParentId()));
|
||||||
|
sqBookmark.setCreateTime(new Date());
|
||||||
|
sqBookmarkMapper.insertSqBookmark(sqBookmark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,9 @@ package com.ruoyi.bookmark.service.impl;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import com.ruoyi.common.core.redis.RedisUtil;
|
||||||
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -20,6 +23,8 @@ public class SqMenuServiceImpl implements ISqMenuService
|
|||||||
{
|
{
|
||||||
@Autowired
|
@Autowired
|
||||||
private SqMenuMapper sqMenuMapper;
|
private SqMenuMapper sqMenuMapper;
|
||||||
|
@Autowired
|
||||||
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询 目录菜单的 所有父级ID
|
* 查询 目录菜单的 所有父级ID
|
||||||
@ -163,6 +168,26 @@ public class SqMenuServiceImpl implements ISqMenuService
|
|||||||
sqMenuMapper.addMenu(userID,title,parentId);
|
sqMenuMapper.addMenu(userID,title,parentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*防止重复点击上传文件
|
||||||
|
*
|
||||||
|
* @param state 表示某个功能
|
||||||
|
* @param userID 用户ID
|
||||||
|
* @param time key过期时间 (秒)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Long noRepetition(String state, Long userID, Long time) {
|
||||||
|
String key = "BookMark:"+state+":"+userID.toString();
|
||||||
|
String str = redisUtil.get(key);
|
||||||
|
if (str==null){
|
||||||
|
redisUtil.setEx(key,"0",time,TimeUnit.SECONDS);
|
||||||
|
return 0L;
|
||||||
|
}else{
|
||||||
|
return redisUtil.getExpire(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量减少目录下书签数量
|
* 批量减少目录下书签数量
|
||||||
|
Loading…
x
Reference in New Issue
Block a user