Redis实现接口防重复点击

This commit is contained in:
WangHao 2021-02-13 20:52:17 +08:00
parent 38e4f2aa04
commit fec325e383
7 changed files with 117 additions and 85 deletions

View File

@ -9,6 +9,7 @@ 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;
@ -50,7 +51,6 @@ public class BrowserController extends BaseController {
private ISqBookmarkService iSqBookmarkService;
@RequestMapping("/import")
@PreAuthorize("@ss.hasPermi('bookmark:bookmark:list')")
public AjaxResult importCollect(@RequestParam("htmlFile") MultipartFile htmlFile){
@ -58,52 +58,19 @@ public class BrowserController extends BaseController {
SysUser sysUser=getAuthUser();
Long userID= sysUser.getUserId();
//防止重复上传
Long htmlFlag = iSqMenuService.noRepetition(Const.IMPORTHTML,userID,300L);
if(htmlFlag.intValue()!=0){
return AjaxResult.success("导入操作频繁请"+htmlFlag.intValue()+"秒后再操作!");
}
try {
//解析HTML
List<HtmlName> list = ImportHtml.addMenuAndBookmark(htmlFile.getInputStream());
if(null == list || list.isEmpty()){
return AjaxResult.error("未获取到url连接,空书签文件");
}
//获取所有的 *目录*文件夹
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 = 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);
}
}
//处理导入的html数据
iSqBookmarkService.addALLBookMarkByHtml(list,userID);
}catch (SSLHandshakeException e){
logger.error("文章解析出错:",e);
}

View File

@ -32,6 +32,8 @@ public class Const {
public static String MenuIocURL= "https://up.raindrop.io/collection/templates/social-media-logos-6/47social.png";
//已修改父级id的书签
public static String BOOKMARK_STATE_FLAG= "666";
//导入书签html功能
public static String IMPORTHTML= "IMPORT_HTML";

View File

@ -1,8 +1,6 @@
<template>
<div >
<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
ref="upload"
:limit="1"
@ -22,55 +20,21 @@
将文件拖到此处
<em>点击上传</em>
</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>
</el-upload>
<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>
</div>
</div>
<!-- </el-dialog>-->
<!-- <el-button-->
<!-- type="info"-->
<!-- icon="el-icon-upload2"-->
<!-- size="mini"-->
<!-- @click="handleImport"-->
<!-- v-hasPermi="['system:user:import']"-->
<!-- >导入</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-->
<!-- >-->
<!--&lt;!&ndash; v-hasPermi="['bookmark:bookmark:export']"&ndash;&gt;-->
<!-- <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&#45;&#45;right">开始导入书签</i></el-button>-->
<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">
<ul>
<li>注意事项</li>
<li style="color: #ff2a34">导入300书签需要大约8分钟,请勿短时间重复操作</li>
<li>
1导入的方法是将浏览器里面收藏的网站导出<span style="color: red">HTML文件后缀</span>然后将导出的HTML文件点击上面的<span style="color: red">开始导入书签</span>

View File

@ -2,6 +2,7 @@ package com.ruoyi.bookmark.service;
import java.util.List;
import com.ruoyi.bookmark.domain.SqBookmark;
import com.ruoyi.common.utils.bookmarkhtml.HtmlName;
/**
* 书签管理Service接口
@ -111,4 +112,12 @@ public interface ISqBookmarkService
* @return
*/
List<SqBookmark> selectByUrlUserID(String url, Long userId);
/**
* 批量添加html导入的数据
*
* @param
* @return
*/
void addALLBookMarkByHtml(List<HtmlName> list,Long userID);
}

View File

@ -2,6 +2,7 @@ package com.ruoyi.bookmark.service;
import java.util.List;
import com.ruoyi.bookmark.domain.SqMenu;
import org.omg.CORBA.INTERNAL;
/**
* 书签菜单Service接口
@ -113,4 +114,15 @@ public interface ISqMenuService
* @return
*/
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);
}

View File

@ -1,7 +1,11 @@
package com.ruoyi.bookmark.service.impl;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.*;
import java.util.stream.Collectors;
import cn.hutool.core.date.DateUtil;
import com.github.pagehelper.PageHelper;
@ -14,6 +18,10 @@ import com.ruoyi.bookmark.mapper.SqTagMapper;
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.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -303,5 +311,51 @@ public class SqBookmarkServiceImpl implements ISqBookmarkService
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);
}
}
}
}

View File

@ -2,6 +2,9 @@ package com.ruoyi.bookmark.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.ruoyi.common.core.redis.RedisUtil;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -20,6 +23,8 @@ public class SqMenuServiceImpl implements ISqMenuService
{
@Autowired
private SqMenuMapper sqMenuMapper;
@Autowired
private RedisUtil redisUtil;
/**
* 查询 目录菜单的 所有父级ID
@ -163,6 +168,26 @@ public class SqMenuServiceImpl implements ISqMenuService
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);
}
}
/**
* 批量减少目录下书签数量