diff --git a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/consumer/PinyinUpdateConsumer.java b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/consumer/PinyinUpdateConsumer.java index 84cb73b..a42f22a 100644 --- a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/consumer/PinyinUpdateConsumer.java +++ b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/consumer/PinyinUpdateConsumer.java @@ -40,6 +40,6 @@ public class PinyinUpdateConsumer implements RedisConsumer { bookmarkDao.updateSearchKey(bookmarks.get(i).getBookmarkId(), resList.get(i)); } //更新本用户书签更新时间 - RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_TIME, new UserBookmarkUpdate(bookmarks.get(0).getUserId())); + RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_VERSION, new UserBookmarkUpdate(bookmarks.get(0).getUserId())); } } diff --git a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/BookmarkServiceImpl.java b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/BookmarkServiceImpl.java index d1352c3..ca99c96 100644 --- a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/BookmarkServiceImpl.java +++ b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/BookmarkServiceImpl.java @@ -74,7 +74,7 @@ public class BookmarkServiceImpl implements BookmarkService { dealBookmark(userId, elements.get(i), path, sortBase + count + i - 1, bookmarks); } } - RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_TIME, new UserBookmarkUpdate(userId, System.currentTimeMillis())); + updateVersion(userId); RedisUtil.addToMq(RedisConstant.BOOKMARK_INSERT_ES, bookmarks); RedisUtil.addToMq(RedisConstant.BOOKMARK_PINYIN_CHANGE, bookmarks); @@ -172,8 +172,8 @@ public class BookmarkServiceImpl implements BookmarkService { bookmarkDao.deleteUserBookmark(userId, bookmarkIdList); } set.addAll(bookmarkIdList.stream().map(String::valueOf).collect(Collectors.toSet())); - RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_TIME, new UserBookmarkUpdate(userId, System.currentTimeMillis())); RedisUtil.addToMq(RedisConstant.BOOKMARK_DELETE_ES, set); + updateVersion(userId); } @Override @@ -191,7 +191,7 @@ public class BookmarkServiceImpl implements BookmarkService { if (bookmark.getType() == 0) { RedisUtil.addToMq(RedisConstant.BOOKMARK_INSERT_ES, Collections.singleton(bookmark)); } - RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_TIME, new UserBookmarkUpdate(userId, System.currentTimeMillis())); + updateVersion(userId); return bookmark; } @@ -204,7 +204,7 @@ public class BookmarkServiceImpl implements BookmarkService { if (bookmark.getType() == 0) { RedisUtil.addToMq(RedisConstant.BOOKMARK_INSERT_ES, Collections.singleton(bookmark)); } - RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_TIME, new UserBookmarkUpdate(userId, System.currentTimeMillis())); + updateVersion(userId); } @@ -225,7 +225,7 @@ public class BookmarkServiceImpl implements BookmarkService { } //更新被移动节点的path和sort bookmarkDao.updatePathAndSort(userId, body.getBookmarkId(), body.getTargetPath(), body.getSort()); - RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_TIME, new UserBookmarkUpdate(userId, System.currentTimeMillis())); + updateVersion(userId); } @Override @@ -239,5 +239,16 @@ public class BookmarkServiceImpl implements BookmarkService { return esUtil.search(EsConstant.BOOKMARK_INDEX, builder, BookmarkEs.class); } + /** + * 功能描述: 向mq发送消息通知,数据更新 + * + * @param userId userId + * @author fanxb + * @date 2020/5/10 12:07 + */ + private void updateVersion(int userId) { + RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_VERSION, userId); + } + } diff --git a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/PinYinServiceImpl.java b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/PinYinServiceImpl.java index 693b1b7..6e461f0 100644 --- a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/PinYinServiceImpl.java +++ b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/impl/PinYinServiceImpl.java @@ -61,7 +61,7 @@ public class PinYinServiceImpl implements PinYinService { i = bookmarks.get(SIZE - 1).getBookmarkId(); } //更新所有用户的上次刷新时间 - RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_TIME, new UserBookmarkUpdate(-1, System.currentTimeMillis())); + RedisUtil.addToMq(RedisConstant.BOOKMARK_UPDATE_VERSION, new UserBookmarkUpdate(-1, System.currentTimeMillis())); } @Override diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/consumer/UserInfoUpdateConsumer.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/consumer/UserInfoUpdateConsumer.java index fff51c1..1bf4148 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/consumer/UserInfoUpdateConsumer.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/consumer/UserInfoUpdateConsumer.java @@ -12,7 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author fanxb * @date 2020/1/26 上午11:54 */ -@MqConsumer(RedisConstant.BOOKMARK_UPDATE_TIME) +@MqConsumer(RedisConstant.BOOKMARK_UPDATE_VERSION) public class UserInfoUpdateConsumer implements RedisConsumer { @Autowired @@ -20,11 +20,11 @@ public class UserInfoUpdateConsumer implements RedisConsumer { @Override public void deal(String message) { - UserBookmarkUpdate item = JSON.parseObject(message, UserBookmarkUpdate.class); - if (item.getUserId() == -1) { - userDao.updateAllBookmarkUpdateTime(item.getUpdateTime()); + int userId = Integer.parseInt(message); + if (userId == -1) { + userDao.updateAllBookmarkUpdateVersion(); } else { - userDao.updateLastBookmarkUpdateTime(item); + userDao.updateLastBookmarkUpdateTime(userId); } } } diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java index 1ae4d16..a1b290f 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/dao/UserDao.java @@ -123,8 +123,8 @@ public interface UserDao { * @author fanxb * @date 2020/1/26 下午3:47 */ - @Update("update user set bookmarkChangeTime=#{updateTime} where userId=#{userId}") - void updateLastBookmarkUpdateTime(UserBookmarkUpdate item); + @Update("update user set version=version+1 where userId=#{userId}") + void updateLastBookmarkUpdateTime(int userId); /** * 功能描述: 更新所有用户的更新时间 @@ -133,6 +133,6 @@ public interface UserDao { * @author 123 * @date 2020/3/29 18:18 */ - @Update("update user set bookmarkChangeTime=#{time}") - void updateAllBookmarkUpdateTime(long time); + @Update("update user set version=version+1") + void updateAllBookmarkUpdateVersion(); } diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/constant/RedisConstant.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/constant/RedisConstant.java index 1baa6cd..8dea283 100644 --- a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/constant/RedisConstant.java +++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/constant/RedisConstant.java @@ -14,7 +14,7 @@ public class RedisConstant { /** * 某用户书签数据更新时间,该队列左进右出 */ - public static final String BOOKMARK_UPDATE_TIME = "bookmark_update_time"; + public static final String BOOKMARK_UPDATE_VERSION = "bookmark_update_version"; /** * 某个用户上传了文件夹,需要进行书签转化 */ diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/User.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/User.java index e30a494..61db2d5 100644 --- a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/User.java +++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/User.java @@ -1,6 +1,7 @@ package com.fanxb.bookmark.common.entity; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; @@ -22,28 +23,12 @@ public class User { private String email; private String newEmail; private String icon; - @JsonIgnore + @JSONField(serialize = false) private String password; private long createTime; private long lastLoginTime; /** - * 上次更新书签时间 + * 书签同步版本 */ - private long bookmarkChangeTime; - - public static void main(String[] args) { - User user1 = new User(); - User user2 = new User(); - Map map = new HashMap<>(); - map.put(user1, user2); - NewUserObj obj = new NewUserObj(); - obj.setMap(map); - NewUserObj newObj = JSON.parseObject(JSON.toJSONString(obj), NewUserObj.class); - System.out.println(newObj.getMap().get(user1)); - } - - @Data - public static class NewUserObj { - private Map map; - } + private int version; } diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/filter/LoginFilter.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/filter/LoginFilter.java index 2f9cc59..ebdb723 100644 --- a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/filter/LoginFilter.java +++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/filter/LoginFilter.java @@ -133,7 +133,7 @@ public class LoginFilter implements Filter { UserContextHolder.set(context); return true; } catch (Exception e) { - log.error("jwt解密失败:{}", jwt, e); + log.error("jwt解密失败:{},原因:{}", jwt, e.getMessage()); return false; } } diff --git a/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java b/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java index 7f413c3..14740c4 100644 --- a/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java +++ b/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java @@ -1,9 +1,15 @@ package com.fanxb.bookmark.web; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.support.config.FastJsonConfig; +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.context.annotation.Bean; +import org.springframework.http.converter.HttpMessageConverter; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -22,4 +28,17 @@ public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } + + @Bean + public HttpMessageConverters fastJsonHttpMessageConverters() { + // 1.定义一个converters转换消息的对象 + FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); + // 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据 + FastJsonConfig fastJsonConfig = new FastJsonConfig(); + fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect); + // 3.在converter中添加配置信息 + fastConverter.setFastJsonConfig(fastJsonConfig); + // 5.返回HttpMessageConverters对象 + return new HttpMessageConverters(fastConverter); + } } diff --git a/bookMarkService/web/src/main/resources/db/migration/V10__用户表用版本代替修改时间.sql b/bookMarkService/web/src/main/resources/db/migration/V10__用户表用版本代替修改时间.sql new file mode 100644 index 0000000..f31d778 --- /dev/null +++ b/bookMarkService/web/src/main/resources/db/migration/V10__用户表用版本代替修改时间.sql @@ -0,0 +1,4 @@ +update bookmark.user +set bookmarkChangeTime=0; +ALTER TABLE `bookmark`.`user` + CHANGE COLUMN `bookmarkChangeTime` `version` int(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `lastLoginTime`; diff --git a/front/src/pages/manage/Feedback/index.jsx b/front/src/pages/manage/Feedback/index.jsx index 30e7bd1..8c29f4c 100644 --- a/front/src/pages/manage/Feedback/index.jsx +++ b/front/src/pages/manage/Feedback/index.jsx @@ -1,8 +1,8 @@ -import React from "react"; -import { Input, Select, Button, message } from "antd"; -import styles from "./index.module.less"; -import MainLayout from "../../../layout/MainLayout"; -import httpUtil from "../../../util/httpUtil"; +import React from 'react'; +import { Input, Select, Button, message } from 'antd'; +import styles from './index.module.less'; +import MainLayout from '../../../layout/MainLayout'; +import httpUtil from '../../../util/httpUtil'; const { TextArea } = Input; const { Option } = Select; @@ -11,15 +11,15 @@ class Feedback extends React.Component { constructor(props) { super(props); this.state = { - content: "", + content: '', //1:bug反馈,2:功能建议 - type: "bug" + type: 'bug' }; } async submit() { - await httpUtil.put("/feedback", this.state); - message.success("创建成功"); + await httpUtil.put('/feedback', this.state); + message.success('创建成功'); this.props.history.goBack(); } @@ -30,29 +30,19 @@ class Feedback extends React.Component {
反馈页面
- this.setState({ type: value })}> 建议通过 - + github 反馈
- +
) : null} - + 使用帮助
{isEdit ? ( - ) : null} -
@@ -218,9 +173,7 @@ class OverView extends React.Component { > {renderTreeNodes.call(this, treeData)} - {isInit && treeData.length === 0 ? ( - - ) : null} + {isInit && treeData.length === 0 ? : null} diff --git a/front/src/util/cacheUtil.js b/front/src/util/cacheUtil.js index 077db32..12baf5b 100644 --- a/front/src/util/cacheUtil.js +++ b/front/src/util/cacheUtil.js @@ -1,44 +1,29 @@ /* eslint-disable no-undef */ -import httpUtil from "./httpUtil"; -import config from "./config"; - -/** - * web版本 - */ -export const WEB_VERSION = "webVersion"; +import httpUtil from './httpUtil'; /** * 全部书签数据key */ -export const TREE_LIST_KEY = "treeListData"; +export const TREE_LIST_KEY = 'treeListData'; /** - * 获取全部书签时间 + * 当前用户书签版本 */ -export const TREE_LIST_TIME_KEY = "treeListDataTime"; -/** - * 书签数据所属用户 - */ -export const TREE_LIST_USER_ID = "treeListDataUserId"; +export const TREE_LIST_VERSION_KEY = 'treeDataVersion'; /** * 缓存书签数据 */ export async function cacheBookmarkData() { - let currentId = JSON.parse(window.atob(window.token.split(".")[1])).userId; - let cacheId = await localforage.getItem(TREE_LIST_USER_ID); - let webVersion = await localforage.getItem(WEB_VERSION); - if ((currentId && currentId !== cacheId) || config.version !== webVersion) { - await localforage.setItem(WEB_VERSION, config.version); - await clearCache(); - } - let res = await localforage.getItem(TREE_LIST_KEY); + let key = getCacheKey(); + let res = await localforage.getItem(key); + //如果没有缓存 if (!res) { - res = await httpUtil.get("/bookmark/currentUser"); - if (!res[""]) { - res[""] = []; + res = await httpUtil.get('/bookmark/currentUser'); + if (!res['']) { + res[''] = []; } - await localforage.setItem(TREE_LIST_KEY, res); - await localforage.setItem(TREE_LIST_TIME_KEY, Date.now()); - await localforage.setItem(TREE_LIST_USER_ID, currentId); + let version = (await httpUtil.get('/user/currentUserInfo')).version; + await localforage.setItem(key, res); + await localforage.setItem(TREE_LIST_VERSION_KEY, version); } window[TREE_LIST_KEY] = res; } @@ -59,27 +44,26 @@ export function getBookmarkList(path) { * @return 返回true说明未过期,否则说明过期了 */ export async function checkCacheStatus() { - let date = await localforage.getItem(TREE_LIST_TIME_KEY, Date.now()); - let userInfo = await httpUtil.get("/user/currentUserInfo"); - return !date || date > userInfo.bookmarkChangeTime; + let version = await localforage.getItem(TREE_LIST_VERSION_KEY); + let realVersion = (await httpUtil.get('/user/currentUserInfo')).version; + return version >= realVersion; } /** * 清楚缓存数据 */ export async function clearCache() { - await localforage.removeItem(TREE_LIST_KEY); - await localforage.removeItem(TREE_LIST_TIME_KEY); - await localforage.removeItem(TREE_LIST_USER_ID); + await localforage.removeItem(getCacheKey()); + await localforage.removeItem(TREE_LIST_VERSION_KEY); } /** - * 更新本地缓存数据的时间 + * 更新本地缓存 */ export async function updateCurrentChangeTime() { - await localforage.setItem(TREE_LIST_TIME_KEY, Date.now()); - await localforage.setItem(TREE_LIST_TIME_KEY, Date.now()); - await localforage.setItem(TREE_LIST_KEY, window[TREE_LIST_KEY]); + let version = await localforage.getItem(TREE_LIST_VERSION_KEY); + await localforage.setItem(TREE_LIST_VERSION_KEY, version + 1); + await localforage.setItem(getCacheKey(), window[TREE_LIST_KEY]); } /** @@ -91,13 +75,13 @@ export async function addNode(currentNode, node) { debugger; let treeDataMap = window[TREE_LIST_KEY]; if (currentNode) { - let key = currentNode.path + "." + currentNode.bookmarkId; + let key = currentNode.path + '.' + currentNode.bookmarkId; if (!treeDataMap[key]) { treeDataMap[key] = []; } treeDataMap[key].push(node); } else { - treeDataMap[""].push(node); + treeDataMap[''].push(node); } await updateCurrentChangeTime(); } @@ -117,7 +101,7 @@ export async function deleteNodes(nodeList) { } //如果是文件夹还是把他的子节点删除 if (item.type === 1) { - let key = item.path + "." + item.bookmarkId; + let key = item.path + '.' + item.bookmarkId; Object.keys(data).forEach(one => { if (one.startsWith(key)) { delete data[one]; @@ -147,7 +131,7 @@ export async function moveNode(info) { const body = { bookmarkId: current.bookmarkId, sourcePath: current.path, - targetPath: "", + targetPath: '', //-1 表示排在最后 sort: -1 }; @@ -166,14 +150,13 @@ export async function moveNode(info) { } } else { //移动到一个文件夹下面 - body.targetPath = target.path + "." + target.bookmarkId; + body.targetPath = target.path + '.' + target.bookmarkId; let targetList = data[body.targetPath]; if (!targetList) { targetList = []; data[body.targetPath] = targetList; } - body.sort = - targetList.length > 0 ? targetList[targetList.length - 1].sort + 1 : 1; + body.sort = targetList.length > 0 ? targetList[targetList.length - 1].sort + 1 : 1; targetList.push(current); } //更新节点的path和对应子节点path @@ -183,9 +166,9 @@ export async function moveNode(info) { if (body.sourcePath !== body.targetPath) { let keys = Object.keys(data); //旧路径 - let oldPath = body.sourcePath + "." + current.bookmarkId; + let oldPath = body.sourcePath + '.' + current.bookmarkId; //新路径 - let newPath = body.targetPath + "." + current.bookmarkId; + let newPath = body.targetPath + '.' + current.bookmarkId; keys.forEach(item => { if (!item.startsWith(oldPath)) { return; @@ -219,12 +202,20 @@ export async function keySearch(content) { if (item.searchKey.indexOf(content) > -1) { res.push(item); if (res.length >= 12) { - console.info("搜索耗时:" + (Date.now() - time1)); + console.info('搜索耗时:' + (Date.now() - time1)); return res; } } } } - console.info("搜索耗时:" + (Date.now() - time1)); + console.info('搜索耗时:' + (Date.now() - time1)); return res; } + +/** + * 获取localstore缓存的key + */ +export function getCacheKey() { + let currentId = JSON.parse(window.atob(window.token.split('.')[1])).userId; + return currentId + TREE_LIST_KEY; +}