Redis实现接口防重复点击
This commit is contained in:
		| @@ -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); | ||||
|         } | ||||
|   | ||||
| @@ -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"; | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -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--> | ||||
| <!--    >--> | ||||
| <!--<!–      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>--> | ||||
|     <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>。 | ||||
|  | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -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); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 批量减少目录下书签数量 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user