diff --git a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/controller/BookmarkController.java b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/controller/BookmarkController.java index 942b985..42912e4 100644 --- a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/controller/BookmarkController.java +++ b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/controller/BookmarkController.java @@ -2,6 +2,7 @@ package com.fanxb.bookmark.business.bookmark.controller; import com.fanxb.bookmark.business.bookmark.service.BookmarkService; import com.fanxb.bookmark.common.entity.Result; +import com.fanxb.bookmark.common.util.UserContextHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -28,8 +29,9 @@ public class BookmarkController { * @date 2019/7/9 14:20 */ @GetMapping("/currentUser") - public Result getUserBookmarkTree() { - return null; + public Result getCurrentUserBookmarkTree() { + int userId = UserContextHolder.get().getUserId(); + return Result.success(bookmarkService.getOneBookmarkTree(userId)); } /** @@ -43,7 +45,7 @@ public class BookmarkController { */ @PutMapping("/uploadBookmarkFile") public Result uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("path") String path) throws Exception { - bookmarkService.parseBookmarkFile(file.getInputStream(), path); + bookmarkService.parseBookmarkFile(UserContextHolder.get().getUserId(), file.getInputStream(), path); return Result.success(null); } diff --git a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/dao/BookmarkDao.java b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/dao/BookmarkDao.java index cba97ba..a9842f6 100644 --- a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/dao/BookmarkDao.java +++ b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/dao/BookmarkDao.java @@ -4,6 +4,8 @@ import com.fanxb.bookmark.common.entity.Bookmark; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; +import java.util.List; + /** * 类功能简述: * 类功能详述: @@ -46,4 +48,14 @@ public interface BookmarkDao { * @date 2019/7/8 17:35 */ Integer selectMaxSort(@Param("userId") int userId, @Param("path") String path); + + /** + * Description: 根据用户id获取其所有数据 + * + * @param userId userid + * @return java.util.List + * @author fanxb + * @date 2019/7/9 18:55 + */ + List getListByUserId(int userId); } diff --git a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/BookmarkService.java b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/BookmarkService.java index 0cb0f2d..a9debb0 100644 --- a/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/BookmarkService.java +++ b/bookMarkService/business/bookmark/src/main/java/com/fanxb/bookmark/business/bookmark/service/BookmarkService.java @@ -11,6 +11,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 类功能简述: @@ -30,8 +34,16 @@ public class BookmarkService { @Autowired private BookmarkDao bookmarkDao; + /** + * Description: 解析书签文件 + * + * @param stream 输入流 + * @param path 存放路径 + * @author fanxb + * @date 2019/7/9 18:44 + */ @Transactional(rollbackFor = Exception.class) - public void parseBookmarkFile(InputStream stream, String path) throws Exception { + public void parseBookmarkFile(int userId, InputStream stream, String path) throws Exception { Document doc = Jsoup.parse(stream, "utf-8", ""); Elements elements = doc.select("html>body>dl>dt"); //获取当前层sort最大值 @@ -45,14 +57,43 @@ public class BookmarkService { Elements firstChildren = elements.get(0).child(1).children(); count = firstChildren.size(); for (int j = 0; j < count; j++) { - dealBookmark(firstChildren.get(j), path, sortBase + j); + dealBookmark(userId, firstChildren.get(j), path, sortBase + j); } } else { - dealBookmark(elements.get(i), path, sortBase + count + i - 1); + dealBookmark(userId, elements.get(i), path, sortBase + count + i - 1); } } } + /** + * Description: 获取某个用户的书签树 + * + * @param userId 用户id + * @return void + * @author fanxb + * @date 2019/7/9 18:45 + */ + public List getOneBookmarkTree(int userId) { + List list = bookmarkDao.getListByUserId(userId); + Map> map = new HashMap<>(50); + list.forEach(item -> { + map.computeIfAbsent(item.getPath(), k -> new ArrayList<>()); + map.get(item.getPath()).add(item); + }); + List res = map.get(""); + res.forEach(item -> insertToBookmarkTree(item, map)); + return res; + } + + private void insertToBookmarkTree(Bookmark node, Map> map) { + String path = node.getPath(); + String key = path + (path.length() == 0 ? "" : ".") + node.getBookmarkId().toString(); + if (map.containsKey(key)) { + node.setChildren(map.get(key)); + node.getChildren().forEach(item -> insertToBookmarkTree(item, map)); + } + } + /** * Description: 处理html节点,解析出文件夹和书签 * @@ -62,20 +103,20 @@ public class BookmarkService { * @author fanxb * @date 2019/7/8 14:49 */ - private void dealBookmark(Element ele, String path, int sort) { + private void dealBookmark(int userId, Element ele, String path, int sort) { if (!DT.equalsIgnoreCase(ele.tagName())) { return; } Element first = ele.child(0); if (A.equalsIgnoreCase(first.tagName())) { //说明为链接 - Bookmark node = new Bookmark(1, path, first.ownText(), first.attr("href"), first.attr("icon") + Bookmark node = new Bookmark(userId, path, first.ownText(), first.attr("href"), first.attr("icon") , Long.valueOf(first.attr("add_date")) * 1000, sort); //存入数据库 insertOne(node); } else { //说明为文件夹 - Bookmark node = new Bookmark(1, path, first.ownText(), Long.valueOf(first.attr("add_date")) * 1000, sort); + Bookmark node = new Bookmark(userId, path, first.ownText(), Long.valueOf(first.attr("add_date")) * 1000, sort); Integer sortBase = 0; if (insertOne(node)) { sortBase = bookmarkDao.selectMaxSort(node.getUserId(), path); @@ -86,13 +127,13 @@ public class BookmarkService { String childPath = path.length() == 0 ? node.getBookmarkId().toString() : path + "." + node.getBookmarkId(); Elements children = ele.child(1).children(); for (int i = 0, size = children.size(); i < size; i++) { - dealBookmark(children.get(i), childPath, sortBase + i + 1); + dealBookmark(userId, children.get(i), childPath, sortBase + i + 1); } } } /** - * Description: + * Description: 插入一条书签,如果已经存在同名书签将跳过 * * @param node node * @return boolean 如果已经存在返回true,否则false diff --git a/bookMarkService/business/bookmark/src/main/resources/mapper/bookmark-bookmarkMapper.xml b/bookMarkService/business/bookmark/src/main/resources/mapper/bookmark-bookmarkMapper.xml index 9650d45..1add3f8 100644 --- a/bookMarkService/business/bookmark/src/main/resources/mapper/bookmark-bookmarkMapper.xml +++ b/bookMarkService/business/bookmark/src/main/resources/mapper/bookmark-bookmarkMapper.xml @@ -28,5 +28,19 @@ where userId = #{userId} and path = #{path} + + \ No newline at end of file diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java index e2ee4e6..42c42d3 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java @@ -22,6 +22,20 @@ public class UserController { @Autowired private UserService userService; + /** + * Description: 获取验证码 + * + * @param email 邮箱 + * @return com.fanxb.bookmark.common.entity.Result + * @author fanxb + * @date 2019/7/5 17:37 + */ + @GetMapping("/authCode") + public Result getAuthCode(@Param("email") String email) { + userService.sendAuthCode(email); + return Result.success(null); + } + /** * Description: 注册用户 * @@ -50,16 +64,18 @@ public class UserController { } /** - * Description: 获取验证码 + * Description: 重置密码 * - * @param email 邮箱 + * @param body 重置密码表单 * @return com.fanxb.bookmark.common.entity.Result * @author fanxb - * @date 2019/7/5 17:37 + * @date 2019/7/9 19:57 */ - @GetMapping("/authCode") - public Result getAuthCode(@Param("email") String email) { - userService.sendAuthCode(email); + @PostMapping("/resetPassword") + public Result resetPassword(@RequestBody RegisterBody body) { + userService.resetPassword(body); return Result.success(null); } + + } 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 4ef4178..7636c32 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 @@ -26,13 +26,13 @@ public interface UserDao { /** * Description: 通过用户名或者email获取用户信息 * - * @param name username + * @param name username * @param email email * @return com.fanxb.bookmark.common.entity.User * @author fanxb * @date 2019/7/6 16:45 */ - User selectByUsernameOrEmail(@Param("name") String name,@Param("email") String email); + User selectByUsernameOrEmail(@Param("name") String name, @Param("email") String email); /** * Description: 更新用户上次登录时间 @@ -43,4 +43,14 @@ public interface UserDao { * @date 2019/7/6 16:46 */ void updateLastLoginTime(@Param("time") long time, @Param("userId") int userId); + + /** + * Description: 更新一个参数 + * + * @param password 新密码 + * @param email 邮箱 + * @author fanxb + * @date 2019/7/9 20:03 + */ + void resetPassword(@Param("password") String password,@Param("email") String email); } diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/service/UserService.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/service/UserService.java index e368edc..11e0890 100644 --- a/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/service/UserService.java +++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/service/UserService.java @@ -34,7 +34,7 @@ public class UserService { /** * 长期jwt失效时间 */ - private static final long LONG_EXPIRE_TIME = 30 * TimeUtil.DAY_MS; + private static final long LONG_EXPIRE_TIME = 30L * TimeUtil.DAY_MS; @Autowired private UserDao userDao; @@ -122,4 +122,26 @@ public class UserService { userDao.updateLastLoginTime(System.currentTimeMillis(), userInfo.getUserId()); return res; } + + /** + * Description: 重置密码 + * + * @param body 重置密码 由于参数和注册差不多,所以用同一个表单 + * @author fanxb + * @date 2019/7/9 19:59 + */ + public void resetPassword(RegisterBody body) { + User user = userDao.selectByUsernameOrEmail(body.getEmail(), body.getEmail()); + if (user == null) { + throw new FormDataException("用户不存在"); + } + String codeKey = Constant.authCodeKey(body.getEmail()); + String realCode = RedisUtil.get(codeKey, String.class); + if (StringUtil.isEmpty(realCode) || (!realCode.equals(body.getAuthCode()))) { + throw new FormDataException("验证码错误"); + } + RedisUtil.delete(codeKey); + String newPassword = HashUtil.sha1(HashUtil.md5(body.getPassword())); + userDao.resetPassword(newPassword, body.getEmail()); + } } diff --git a/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml b/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml index 7ee6a89..495e26c 100644 --- a/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml +++ b/bookMarkService/business/user/src/main/resources/mapper/user-userMapper.xml @@ -19,12 +19,19 @@ createTime from user where username = #{name} or email = #{email} + limit 1 update user set lastLoginTime = #{time} - where userId= #{userId} + where userId = #{userId} + + + + update user + set password = #{password} + where email = #{email} diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/Bookmark.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/Bookmark.java index 91b0db6..37da3c4 100644 --- a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/Bookmark.java +++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/Bookmark.java @@ -2,7 +2,7 @@ package com.fanxb.bookmark.common.entity; import lombok.Data; -import java.util.ArrayList; +import java.util.List; /** * 类功能简述:书签树 @@ -20,16 +20,16 @@ public class Bookmark { /** * 类型:0:文件夹,1:具体的书签 */ - private int type; - private int userId; + private Integer type; + private Integer userId; private String path; private String name; private String url; private String icon; - private int sort; - private long addTime; - private long createTime; - private ArrayList children; + private Integer sort; + private Long addTime; + private Long createTime; + private List children; public Bookmark() { } diff --git a/bookMarkService/web/src/main/resources/application.yml b/bookMarkService/web/src/main/resources/application.yml index 355c863..0501671 100644 --- a/bookMarkService/web/src/main/resources/application.yml +++ b/bookMarkService/web/src/main/resources/application.yml @@ -6,6 +6,8 @@ server: # 不要在最后加/ context-path: /bookmark/api spring: + jackson: + default-property-inclusion: non_null servlet: # 表单配置 multipart: diff --git a/bookMarkService/web/src/main/resources/db/migration/V1__init.sql b/bookMarkService/web/src/main/resources/db/migration/V1__init.sql index e69de29..e651f0c 100644 --- a/bookMarkService/web/src/main/resources/db/migration/V1__init.sql +++ b/bookMarkService/web/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,77 @@ +/* + Navicat Premium Data Transfer + + Source Server : 10.82.17.91_3307 + Source Server Type : MySQL + Source Server Version : 80016 + Source Host : 10.82.17.91:3307 + Source Schema : bookmark + + Target Server Type : MySQL + Target Server Version : 80016 + File Encoding : 65001 + + Date: 10/07/2019 17:10:57 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for bookmark +-- ---------------------------- +DROP TABLE IF EXISTS `bookmark`; +CREATE TABLE `bookmark` ( + `bookmarkId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `userId` int(10) UNSIGNED NOT NULL COMMENT '所属用户id', + `path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '节点路径,不包含自身', + `type` tinyint(4) NOT NULL COMMENT '节点类别', + `name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `icon` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `sort` int(10) UNSIGNED NOT NULL, + `addTime` bigint(20) NOT NULL COMMENT '添加书签时间', + `createTime` bigint(20) UNSIGNED NOT NULL, + PRIMARY KEY (`bookmarkId`) USING BTREE, + INDEX `userId_path_index`(`userId`, `path`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 325 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + + +-- ---------------------------- +-- Table structure for url +-- ---------------------------- +DROP TABLE IF EXISTS `url`; +CREATE TABLE `url` ( + `urlId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `method` enum('GET','POST','PUT','DELETE') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '0:公共接口,1:需登陆鉴权', + PRIMARY KEY (`urlId`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'url表,用于记录url' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of url +-- ---------------------------- +INSERT INTO `url` VALUES (1, 'GET', '/bookmark/currentUser', 1); +INSERT INTO `url` VALUES (2, 'PUT', '/bookmark/uploadBookmarkFile', 1); +INSERT INTO `url` VALUES (3, 'PUT', '/user', 0); +INSERT INTO `url` VALUES (4, 'POST', '/user/login', 0); +INSERT INTO `url` VALUES (5, 'GET', '/user/authCode', 0); +INSERT INTO `url` VALUES (6, 'POST', '/user/resetPassword', 0); + +-- ---------------------------- +-- Table structure for user +-- ---------------------------- +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `userId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名20位以内数字,字母组合', + `email` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `password` char(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '明文(6-20位数字密码组合)+userId 进行sha1签名', + `createTime` bigint(20) NOT NULL DEFAULT 0, + `lastLoginTime` bigint(20) NOT NULL DEFAULT 0, + PRIMARY KEY (`userId`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1;