diff --git a/pom.xml b/pom.xml index c7566ea..cd18ed8 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,12 @@ org.springframework.boot spring-boot-starter-mail + + + cn.hutool + hutool-all + 5.3.7 + org.jsoup @@ -72,6 +78,17 @@ java-jwt 3.4.0 + + + commons-fileupload + commons-fileupload + 1.4 + + + commons-io + commons-io + 2.5 + @@ -111,11 +128,24 @@ fastjson 1.2.47 + - org.apache.commons - commons-lang3 - 3.4 + org.lionsoul + ip2region + 2.6.5 + + io.springfox + springfox-swagger2 + 2.7.0 + + + io.springfox + springfox-swagger-ui + 2.7.0 + + + com.alibaba.fastjson2 diff --git a/src/main/java/com/lovenav/configuration/MyWebConfigurer.java b/src/main/java/com/lovenav/configuration/MyWebConfigurer.java index f366cba..b13b3a7 100644 --- a/src/main/java/com/lovenav/configuration/MyWebConfigurer.java +++ b/src/main/java/com/lovenav/configuration/MyWebConfigurer.java @@ -8,7 +8,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class MyWebConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(new UserInterceptor()).addPathPatterns("/*/**").excludePathPatterns("/error","/login","/register","/findThePassword","/verifyCode","/sendActiveCode"); +// registry.addInterceptor(new UserInterceptor()).addPathPatterns("/*/**").excludePathPatterns("/error","/login","/register","/findThePassword","/verifyCode","/sendActiveCode"); WebMvcConfigurer.super.addInterceptors(registry); } } diff --git a/src/main/java/com/lovenav/controller/AttachmentController.java b/src/main/java/com/lovenav/controller/AttachmentController.java new file mode 100644 index 0000000..504cef1 --- /dev/null +++ b/src/main/java/com/lovenav/controller/AttachmentController.java @@ -0,0 +1,92 @@ +package com.lovenav.controller; + +import com.lovenav.entity.Attachment; +import com.lovenav.entity.Config; +import com.lovenav.service.AttachmentService; +import com.lovenav.service.ConfigService; +import org.apache.catalina.core.ApplicationContext; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.support.ServletContextResource; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.ServletContext; +import java.io.*; +import java.util.HashMap; + +import static java.lang.System.out; + +@RestController +public class AttachmentController { + //附件上传 + @Autowired + AttachmentService attachmentService; + @Autowired + ConfigService configService; + //上传附件 + @RequestMapping("/uploadfile") + public HashMap uploadFile(MultipartFile multipartFile,String cate,Config config) throws IOException {//@RequestPart("photos") MultipartFile multipartFile + HashMap map=new HashMap<>(); + Long id=null; + if (multipartFile==null){ + map.put("msg","文件不能为空!"); + return map; + } + out.println(multipartFile.getOriginalFilename()); + map=attachmentService.upload(multipartFile,cate,id); + config.setValue(map.get("id")); + config.setType("image"); + map.put("msg",configService.addConfig(config)); + return map; + } + + + + @GetMapping(value = "/getAttachment",produces =MediaType.IMAGE_JPEG_VALUE)//,produces = MediaType.IMAGE_JPEG_VALUE + @ResponseBody + public ResponseEntity getAttachment(Config config) throws Exception { + byte[] bytes1 ; + Config config1=configService.selectAlreadyExist(config); + HttpHeaders headers = new HttpHeaders(); + if (config1==null){ + bytes1= "没有该Config!".getBytes(); + headers.setContentType(MediaType.APPLICATION_JSON); + return new ResponseEntity(bytes1, headers, HttpStatus.NOT_FOUND); + } + Attachment attachment =attachmentService.selectAttachment(Long.valueOf(config1.getValue())); + if (attachment==null){ + bytes1= "没有该Attachment!".getBytes(); + headers.setContentType(MediaType.APPLICATION_JSON); + return new ResponseEntity(bytes1, headers, HttpStatus.NOT_FOUND); + } + String fileUrl=attachment.getPath()+attachment.getFileName()+attachment.getSuffix(); + out.println(fileUrl); + out.println(attachment.getSuffix().replace(".","")); + File file = new File(fileUrl); + FileInputStream inputStream = new FileInputStream(file); + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes, 0, inputStream.available()); + //设置ContentType的值 IMAGE_JPEG在浏览器返回图片 + if(attachment.getSuffix().replace(".","").equals("png")){ + headers.setContentType(MediaType.IMAGE_PNG); + }else if (attachment.getSuffix().replace(".","").equals("jpeg")){ + headers.setContentType(MediaType.IMAGE_JPEG); + }else{ + bytes= "没有该文件!".getBytes(); + headers.setContentType(MediaType.APPLICATION_JSON); + return new ResponseEntity(bytes, headers, HttpStatus.NOT_FOUND); + } + // 内容是字节流 + return new ResponseEntity(bytes, headers, HttpStatus.OK); + + } + + +} diff --git a/src/main/java/com/lovenav/controller/ConfigController.java b/src/main/java/com/lovenav/controller/ConfigController.java index 3263842..39d8dc0 100644 --- a/src/main/java/com/lovenav/controller/ConfigController.java +++ b/src/main/java/com/lovenav/controller/ConfigController.java @@ -1,30 +1,47 @@ package com.lovenav.controller; import com.lovenav.entity.Config; +import com.lovenav.service.AttachmentService; import com.lovenav.service.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Date; + @RestController public class ConfigController { + //配置文件操作 @Autowired ConfigService configService; + @Autowired + AttachmentService attachmentService; @RequestMapping("/updateConfig") public String updateConfig(Config config){ - if (configService.updateConfis(config)==1){ - return "更新成功"; + Date date=new Date(); + int date1=Integer.valueOf(date.toString()); + config.setUpdatetime(date1); + if (config==null){ + return "配置文件不能为空!"; } - else { - return "更新配置失败"; + if (configService.updateConfig(config)==1){ + + return "更新成功!"; } + else if (configService.updateConfig(config)==2){ + return "不存在名称为"+config.getName()+"的配置文件,请先添加!"; + } + return "更新失败!"; } - @RequestMapping("/addConfig") + @RequestMapping("/addConfigString") public String addConfig(Config config){ if (config.getName()==null||config.getValue()==null){ return "属性值不能为空"; }else { + Date date=new Date(); + int date1=Integer.valueOf(date.toString()); + config.setUpdatetime(date1); return configService.addConfig(config); } diff --git a/src/main/java/com/lovenav/controller/UrlAccessController.java b/src/main/java/com/lovenav/controller/UrlAccessController.java new file mode 100644 index 0000000..63c68a2 --- /dev/null +++ b/src/main/java/com/lovenav/controller/UrlAccessController.java @@ -0,0 +1,36 @@ +package com.lovenav.controller; + +import com.lovenav.entity.UrlAccess; +import com.lovenav.service.UrlAccessService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Date; +import java.util.HashMap; + +@RestController +public class UrlAccessController { + + @Autowired + UrlAccessService urlAccessService; + + //浏览url,访问量加1 + @RequestMapping("/addUrlAccessViews") + public String addUrlAccessViews(UrlAccess urlAccess){ + String result=urlAccessService.inreaseUrlViews(urlAccess); + return result; + } + + @RequestMapping("/getUrlAccess") + public HashMap getUrlAccess(UrlAccess urlAccess){ + HashMap map=new HashMap<>(); + map=urlAccessService.getUrlAccess(urlAccess); + if (map.isEmpty()){ + Date date=new Date(); + map.put(date,"查不到该数据"); + return map; + } + return map; + } +} diff --git a/src/main/java/com/lovenav/controller/UrlAndCateController.java b/src/main/java/com/lovenav/controller/UrlAndCateController.java index 98859da..f3c473f 100644 --- a/src/main/java/com/lovenav/controller/UrlAndCateController.java +++ b/src/main/java/com/lovenav/controller/UrlAndCateController.java @@ -13,6 +13,7 @@ import com.lovenav.entity.UrlList; import com.lovenav.service.UrlCateListService; import com.lovenav.service.UrlListService; import com.lovenav.vo.CateAndUrl; +import io.swagger.models.auth.In; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; @@ -53,15 +54,15 @@ public class UrlAndCateController { UserDao userDao; //处理JSON @RequestMapping("/disposeJson") - public String disposeJson(@RequestBody String data2 ,String email) + public String disposeJson(@RequestBody String data2 ,Integer userId) { String jsonString; //先转换成ObjectMapper类型 ObjectNode objectNode = objectMapper.createObjectNode(); try { JsonNode rootNode = objectMapper.readTree(data2); - disposeBookmarkFunction1(rootNode,"top",email); - countCateContainUrlNumber(email); + disposeBookmarkFunction1(rootNode,"top",userId); + countCateContainUrlNumber(userId); HashMap result = new HashMap<>(); result.put("code", 200); result.put("msg", "查询成功"); @@ -71,23 +72,35 @@ public class UrlAndCateController { } return jsonString; } - public void disposeBookmarkFunction1(JsonNode rootNode,String parent,String email) + public void disposeBookmarkFunction1(JsonNode rootNode,String parent,Integer userId) { for(int i=0;i urlLists = urlListService.selectUrListByNeedLogin(); List cateAndUrlList = new ArrayList<>(); Set parentSet = new HashSet<>(); + List integers = new ArrayList<>(); for( int i = 0 ; i < urlLists.size() ; i++) { String parentString = urlCateListService.selectUrListCateByUrlCateId(urlLists.get(i).getCateId()); String [] parentList = parentString.split(","); - System.out.println(parentString); for(String parent : parentList) { if(parent.equals("0")){ @@ -182,8 +196,13 @@ public class UrlAndCateController { parentSet.add(parent); } } - - for (String str : parentSet) { + for(String str : parentSet) + { + integers.add(Integer.valueOf(str)); + } + Collections.sort(integers); + for (Integer str : integers) { + System.out.println(str); UrlCateList urlCateList =urlCateListService.selectByPrimaryKey(Integer.valueOf(str)); CateAndUrl cateAndUrl = new CateAndUrl(); cateAndUrl.setFloder("true"); @@ -283,11 +302,11 @@ public class UrlAndCateController { } - public String countCateContainUrlNumber(String email){ + public String countCateContainUrlNumber(Integer userId){ HashMap result = new HashMap<>(); result.put("code", 200); result.put("msg", "查询成功"); - result.put("data",urlCateListService.countCateContainUrlNumber(email)); + result.put("data",urlCateListService.countCateContainUrlNumber(userId)); String jsonString = JSONObject.toJSONString(result); return jsonString; } @@ -444,12 +463,13 @@ public class UrlAndCateController { public String disposeBookmarkExhibitedToJsonNew(){ List urlLists = urlListService.selectUrListByNeedLogin(); List cateAndUrlList = new ArrayList<>(); + CateAndUrl pub = new CateAndUrl(); Set parentSet = new HashSet<>(); for( int i = 0 ; i < urlLists.size() ; i++) { String parentString = urlCateListService.selectUrListCateByUrlCateId(urlLists.get(i).getCateId()); + if(parentString == null) continue; String [] parentList = parentString.split(","); - System.out.println(parentString); for(String parent : parentList) { if(parent.equals("0")){ @@ -458,18 +478,22 @@ public class UrlAndCateController { parentSet.add(parent); } } - for (String str : parentSet) { + List ls=Arrays.asList(parentSet.toArray(new String[0])); + Collections.sort(ls); + for (String str : ls) { + System.out.println(str); UrlCateList urlCateList =urlCateListService.selectByPrimaryKey(Integer.valueOf(str)); CateAndUrl cateAndUrl = new CateAndUrl(); cateAndUrl.setFloder("true"); cateAndUrl.setName(urlCateList.getName()); cateAndUrl.setParentId(urlCateList.getRootCateId()); cateAndUrl.setCateId(urlCateList.getId()); + cateAndUrl.setNumber(urlCateList.getUrlNumber()); cateAndUrlList.add(cateAndUrl); } for( int i = 0 ; i < urlLists.size() ; i++){ UrlList urlList = urlLists.get(i); - if(urlList.getStatus() == 0 ) continue ; + if(urlList.getStatus() == 1 ) continue ; CateAndUrl cateAndUrl = new CateAndUrl(); cateAndUrl.setFloder("false"); cateAndUrl.setName(urlList.getName()); @@ -489,13 +513,27 @@ public class UrlAndCateController { cateAndUrl.setIsAd(urlList.getIsAd()); cateAndUrl.setIsTop(urlList.getIsTop()); cateAndUrl.setIsEncrypt(urlList.getIsEncrypt()); + int flag =0 ; for(CateAndUrl cateAndUrl1 : cateAndUrlList){ - if(cateAndUrl.getParentId() == cateAndUrl1.getCateId()) + if(String.valueOf(urlList.getCateId()).equals(cateAndUrl1.getCateId()+"")) { + flag = 1; cateAndUrl1.getChildUC().add(cateAndUrl); break; } } + if(flag == 0) + { + pub.setName("默认文件夹"); + + pub.getChildUC().add(cateAndUrl); + } + } + + if(pub.getChildUC().size()!=0) + { + pub.setNumber(Long.valueOf(pub.getChildUC().size())); + cateAndUrlList.add(pub); } return JSONObject.toJSONString(cateAndUrlList); @@ -529,6 +567,7 @@ public class UrlAndCateController { cateAndUrl.setName(urlCateList.getName()); cateAndUrl.setParentId(urlCateList.getRootCateId()); cateAndUrl.setCateId(urlCateList.getId()); + cateAndUrl.setNumber(urlCateList.getUrlNumber()); cateAndUrlList.add(cateAndUrl); } @@ -630,7 +669,7 @@ public class UrlAndCateController { } - urlCateListService.countCateContainUrlNumber(userDao.selectByPrimaryKey(Integer.valueOf(userId)).getUserEmail()); + urlCateListService.countCateContainUrlNumber(userDao.selectByPrimaryKey(Integer.valueOf(userId)).getId()); result.put("code", 200); result.put("msg", "处理成功"); return JSONObject.toJSONString(result); diff --git a/src/main/java/com/lovenav/controller/UserController.java b/src/main/java/com/lovenav/controller/UserController.java index a488015..e3a68b4 100644 --- a/src/main/java/com/lovenav/controller/UserController.java +++ b/src/main/java/com/lovenav/controller/UserController.java @@ -1,15 +1,18 @@ package com.lovenav.controller; import com.alibaba.fastjson2.JSONObject; +import com.lovenav.entity.LoginLogs; import com.lovenav.entity.UrlList; import com.lovenav.entity.User; +import com.lovenav.service.ConfigService; +import com.lovenav.service.LoginLogsService; import com.lovenav.service.UserService; -import com.lovenav.utils.MD5Utils; -import com.lovenav.utils.RandomValidateCode; -import com.lovenav.utils.TokenUtils; +import com.lovenav.utils.*; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -34,6 +37,12 @@ public class UserController { UserService userService; @Autowired TokenUtils tokenUtils; + @Autowired + LoginLogsService loginLogsService; + @Autowired + ConfigService configService; + @Autowired + IPutils iPutils; //发送邮箱验证码 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); //这个是我用户Service实现类可以自行替换 @@ -42,8 +51,14 @@ public class UserController { @GetMapping("/sendActiveCode") public String sendActiveCode(HttpSession session, User user){ - - String activecode=userService.sendEmailActivecode(user); + HashMap configMap=new HashMap<>(); + configMap=configService.selectEmailConfig(); + String activecode=userService.sendEmailActivecode(user,configMap); + if (activecode=="配置文件有错误"){ + return "邮箱配置文件有错误,请重新确认!"; + } else if (activecode=="该邮箱不存在") { + return "将要发送的邮箱不存在!"; + } session.setAttribute(user.getUserEmail(),activecode); scheduledExecutorService.schedule(new Runnable() { @Override @@ -80,7 +95,8 @@ public class UserController { return "注册成功!"; } @RequestMapping(value = "/login",produces = {"application/json;charset=UTF-8"}) - public Maplogin(User user,String code,HttpSession session){ + public Maplogin(User user, String code, HttpSession session, HttpServletRequest request){ + LoginLogs loginLogs=new LoginLogs(); Map result=new HashMap<>(); Map map=new HashMap<>(); @@ -99,9 +115,18 @@ public class UserController { return result; } - User user1 = userService.userLogin(user); + + String ip=IPutils.getIpAddress(request); + System.out.println(ip); + + String locat= String.valueOf(IPutils.getLocation(ip)); + User user1 = userService.userLogin(user); if(user1!=null){ + loginLogs.setUserId(user1.getId()); + loginLogs.setLoginIp(ip); + loginLogs.setLocation(locat); + loginLogsService.addLoginLogs(loginLogs); result.put("code",200); map.put("userEmail",user1.getUserEmail()); map.put("userLogin",user1.getUserLogin()); @@ -166,6 +191,9 @@ public class UserController { return map; } - + @RequestMapping("/getAllUsers") + public HashMap getAllUsers(){ + return userService.getAllUsers(); + } } diff --git a/src/main/java/com/lovenav/dao/AttachmentDao.java b/src/main/java/com/lovenav/dao/AttachmentDao.java index 3e05f43..833d60a 100644 --- a/src/main/java/com/lovenav/dao/AttachmentDao.java +++ b/src/main/java/com/lovenav/dao/AttachmentDao.java @@ -1,9 +1,11 @@ package com.lovenav.dao; import com.lovenav.entity.Attachment; +import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Repository +@Mapper public interface AttachmentDao { int deleteByPrimaryKey(Long id); diff --git a/src/main/java/com/lovenav/dao/CommentDao.java b/src/main/java/com/lovenav/dao/CommentDao.java index 3bc1f61..c27d800 100644 --- a/src/main/java/com/lovenav/dao/CommentDao.java +++ b/src/main/java/com/lovenav/dao/CommentDao.java @@ -1,12 +1,14 @@ package com.lovenav.dao; import com.lovenav.entity.Comment; +import com.lovenav.entity.CommentNode; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.stereotype.Repository; import java.util.List; + @Repository @Mapper public interface CommentDao { @@ -25,4 +27,7 @@ public interface CommentDao { List selectAllComment(); List selectByAllReply(int id); + List queryFirstCommentList(int urlid); + + List querySecondCommentList(int UrlId); } \ No newline at end of file diff --git a/src/main/java/com/lovenav/dao/LoginLogsDao.java b/src/main/java/com/lovenav/dao/LoginLogsDao.java index 45cceb2..db618a9 100644 --- a/src/main/java/com/lovenav/dao/LoginLogsDao.java +++ b/src/main/java/com/lovenav/dao/LoginLogsDao.java @@ -1,8 +1,9 @@ package com.lovenav.dao; import com.lovenav.entity.LoginLogs; +import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; - +@Mapper @Repository public interface LoginLogsDao { int deleteByPrimaryKey(Integer id); @@ -16,4 +17,8 @@ public interface LoginLogsDao { int updateByPrimaryKeySelective(LoginLogs record); int updateByPrimaryKey(LoginLogs record); + + LoginLogs selectAlreadyExist(int userId); + + int updateByUserId(LoginLogs record); } \ No newline at end of file diff --git a/src/main/java/com/lovenav/dao/UrlAccessDao.java b/src/main/java/com/lovenav/dao/UrlAccessDao.java index 3322203..d0b0f18 100644 --- a/src/main/java/com/lovenav/dao/UrlAccessDao.java +++ b/src/main/java/com/lovenav/dao/UrlAccessDao.java @@ -1,9 +1,15 @@ package com.lovenav.dao; import com.lovenav.entity.UrlAccess; +import org.apache.ibatis.annotations.MapKey; +import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; +import java.util.Date; +import java.util.HashMap; + @Repository +@Mapper public interface UrlAccessDao { int deleteByPrimaryKey(Integer id); @@ -14,6 +20,11 @@ public interface UrlAccessDao { UrlAccess selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(UrlAccess record); + UrlAccess selectAlreadyExist(UrlAccess urlAccess); int updateByPrimaryKey(UrlAccess record); + + int updateByUrlId(UrlAccess record); + @MapKey("time") + HashMap selectUrlAccess(UrlAccess urlAccess); } \ No newline at end of file diff --git a/src/main/java/com/lovenav/dao/UserDao.java b/src/main/java/com/lovenav/dao/UserDao.java index 09e0bd6..a5fcb47 100644 --- a/src/main/java/com/lovenav/dao/UserDao.java +++ b/src/main/java/com/lovenav/dao/UserDao.java @@ -1,10 +1,13 @@ package com.lovenav.dao; import com.lovenav.entity.User; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; +import java.util.HashMap; + @Mapper @Repository public interface UserDao { @@ -26,6 +29,7 @@ public interface UserDao { User selectByUserLogin(String user_login); int updateByEmail(User user); - + @MapKey("id") + HashMap selectAllUsers(); } \ No newline at end of file diff --git a/src/main/java/com/lovenav/entity/Attachment.java b/src/main/java/com/lovenav/entity/Attachment.java index a4dc887..d4e0975 100644 --- a/src/main/java/com/lovenav/entity/Attachment.java +++ b/src/main/java/com/lovenav/entity/Attachment.java @@ -1,6 +1,7 @@ package com.lovenav.entity; import java.io.Serializable; +import java.util.Date; import lombok.Data; /** @@ -57,7 +58,7 @@ public class Attachment implements Serializable { /** * 创建时间 */ - private Integer createtime; + private Date createtime; private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/src/main/java/com/lovenav/entity/CommentNode.java b/src/main/java/com/lovenav/entity/CommentNode.java new file mode 100644 index 0000000..ff7d1bb --- /dev/null +++ b/src/main/java/com/lovenav/entity/CommentNode.java @@ -0,0 +1,44 @@ +package com.lovenav.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * 功能描述:封装博客评论的BO
+ * 采用链表结构实现 + **/ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class CommentNode extends Comment { + + /** + * 评论的用户信息 + */ + private User user; + + /** + * 下一条回复 + */ + private List nextNodes = new ArrayList<>(); + + public CommentNode ( CommentNode commentNode ) { + super(); + setId(commentNode.getId()); + setUrlId(commentNode.getUrlId()); + setUserId(commentNode.getUserId()); + setContent(commentNode.getContent()); + setRootCommentId(commentNode.getRootCommentId()); + setCommentStatus(commentNode.getCommentStatus()); + setCommentTime(commentNode.getCommentTime()); + setUpdateTime(commentNode.getUpdateTime()); + setRating(commentNode.getRating()); + setLikeCount(commentNode.getLikeCount()); + this.user = commentNode.getUser(); + } +} diff --git a/src/main/java/com/lovenav/entity/IpLocation.java b/src/main/java/com/lovenav/entity/IpLocation.java new file mode 100644 index 0000000..a8fae80 --- /dev/null +++ b/src/main/java/com/lovenav/entity/IpLocation.java @@ -0,0 +1,23 @@ +package com.lovenav.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +@Data +public class IpLocation implements Serializable { + @ApiModelProperty("ip地址") + private String ip; + + @ApiModelProperty("国家") + private String country; + + @ApiModelProperty("省") + private String province; + + @ApiModelProperty("省") + private String city; + + @ApiModelProperty("服务商") + private String isp; +} diff --git a/src/main/java/com/lovenav/entity/LoginLogs.java b/src/main/java/com/lovenav/entity/LoginLogs.java index 9c98a67..fc86e75 100644 --- a/src/main/java/com/lovenav/entity/LoginLogs.java +++ b/src/main/java/com/lovenav/entity/LoginLogs.java @@ -22,7 +22,7 @@ public class LoginLogs implements Serializable { /** * 用户id */ - private Byte userId; + private Integer userId; /** * 登录时间 diff --git a/src/main/java/com/lovenav/entity/UrlAccess.java b/src/main/java/com/lovenav/entity/UrlAccess.java index fed82d1..896bc71 100644 --- a/src/main/java/com/lovenav/entity/UrlAccess.java +++ b/src/main/java/com/lovenav/entity/UrlAccess.java @@ -2,6 +2,8 @@ package com.lovenav.entity; import java.io.Serializable; import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; /** @@ -22,6 +24,7 @@ public class UrlAccess implements Serializable { /** * 日期 */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date time; /** diff --git a/src/main/java/com/lovenav/service/AttachmentService.java b/src/main/java/com/lovenav/service/AttachmentService.java index 6fae390..e7c336e 100644 --- a/src/main/java/com/lovenav/service/AttachmentService.java +++ b/src/main/java/com/lovenav/service/AttachmentService.java @@ -1,9 +1,18 @@ package com.lovenav.service; +import com.lovenav.dao.AttachmentDao; +import com.lovenav.entity.Attachment; +import com.lovenav.entity.Config; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.HashMap; +import java.util.Map; public interface AttachmentService { -// public HashMapstoreFile(MultipartFile multipartFile); + HashMap upload(MultipartFile file,String cate,Long id) throws IOException; + + public HashMapstoreFile(MultipartFile multipartFile,String cate,Long id) throws IOException; + + public Attachment selectAttachment(Long id); } diff --git a/src/main/java/com/lovenav/service/ConfigService.java b/src/main/java/com/lovenav/service/ConfigService.java index b34ca8b..57b629d 100644 --- a/src/main/java/com/lovenav/service/ConfigService.java +++ b/src/main/java/com/lovenav/service/ConfigService.java @@ -6,7 +6,15 @@ import java.util.HashMap; public interface ConfigService { public HashMapgetAllConfig(); - public int updateConfis(Config config); + public int updateConfig(Config config); + + public String addConfig(Config config); + + HashMap selectEmailConfig(); + + public Config selectAlreadyExist(Config config); + + } diff --git a/src/main/java/com/lovenav/service/LoginLogsService.java b/src/main/java/com/lovenav/service/LoginLogsService.java new file mode 100644 index 0000000..c0aa79a --- /dev/null +++ b/src/main/java/com/lovenav/service/LoginLogsService.java @@ -0,0 +1,9 @@ +package com.lovenav.service; + + +import com.lovenav.entity.LoginLogs; + +public interface LoginLogsService { + public String addLoginLogs(LoginLogs loginLogs); + +} diff --git a/src/main/java/com/lovenav/service/UrlAccessService.java b/src/main/java/com/lovenav/service/UrlAccessService.java new file mode 100644 index 0000000..6c3e357 --- /dev/null +++ b/src/main/java/com/lovenav/service/UrlAccessService.java @@ -0,0 +1,13 @@ +package com.lovenav.service; + +import com.lovenav.entity.UrlAccess; + +import java.text.ParseException; +import java.util.Date; +import java.util.HashMap; + +public interface UrlAccessService { + public String inreaseUrlViews(UrlAccess urlAccess); + + public HashMap getUrlAccess(UrlAccess urlAccess); +} diff --git a/src/main/java/com/lovenav/service/UrlCateListService.java b/src/main/java/com/lovenav/service/UrlCateListService.java index 8f43c2c..c93df9a 100644 --- a/src/main/java/com/lovenav/service/UrlCateListService.java +++ b/src/main/java/com/lovenav/service/UrlCateListService.java @@ -8,10 +8,10 @@ import java.util.List; public interface UrlCateListService { - public int selectAndInsertUrlCate(String email , String cateName , String parent); + public int selectAndInsertUrlCate(Integer userId , String cateName , String parent,String icon); public List selectUrListByUserId(Integer userId); - public String countCateContainUrlNumber(String userId); + public String countCateContainUrlNumber(Integer userId); public JSONArray getUrl(String userId); public String selectUrListCateByUrlCateId(Integer cateId); diff --git a/src/main/java/com/lovenav/service/UrlListService.java b/src/main/java/com/lovenav/service/UrlListService.java index b9ec06c..79f4b66 100644 --- a/src/main/java/com/lovenav/service/UrlListService.java +++ b/src/main/java/com/lovenav/service/UrlListService.java @@ -6,7 +6,7 @@ import java.util.List; public interface UrlListService { - public int selectCateAndInsertUrl(String parent,String name , String icon ,String url ,String email ); + public int selectCateAndInsertUrl(String parent,String name , String icon ,String url ,Integer userId ); public List selectUrList(); public UrlList selectUrListByInput(String input); public UrlList selectUrlListByUrlId(Long urlId); diff --git a/src/main/java/com/lovenav/service/UserService.java b/src/main/java/com/lovenav/service/UserService.java index 2e3e0c2..8c0feb1 100644 --- a/src/main/java/com/lovenav/service/UserService.java +++ b/src/main/java/com/lovenav/service/UserService.java @@ -2,12 +2,12 @@ package com.lovenav.service; import com.lovenav.entity.User; - +import java.util.HashMap; public interface UserService { - public String sendEmailActivecode(User user); + public String sendEmailActivecode(User user, HashMapconfigMap); public int UserRegister(User user); public User selectUserAlreadyExist(User user); @@ -16,4 +16,6 @@ public interface UserService { public int updatePassword(User user); + HashMap getAllUsers(); + } diff --git a/src/main/java/com/lovenav/service/serviceImpl/AttachmentServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/AttachmentServiceImpl.java index 68de3f8..f98b683 100644 --- a/src/main/java/com/lovenav/service/serviceImpl/AttachmentServiceImpl.java +++ b/src/main/java/com/lovenav/service/serviceImpl/AttachmentServiceImpl.java @@ -1,6 +1,14 @@ package com.lovenav.service.serviceImpl; +import com.lovenav.dao.AttachmentDao; +import com.lovenav.dao.ConfigDao; +import com.lovenav.entity.Attachment; +import com.lovenav.entity.Config; import com.lovenav.service.AttachmentService; +import com.lovenav.utils.MD5Utils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import org.springframework.util.ResourceUtils; import org.springframework.web.multipart.MultipartFile; @@ -14,45 +22,72 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; - - +@Slf4j +@Service public class AttachmentServiceImpl implements AttachmentService { -// @Override -// public HashMap storeFile(MultipartFile multipartFile) { -// HashMap map = new HashMap<>(); -// } -// File path = null; -//// try { -// path = new File(ResourceUtils.getURL("classpath:").getPath()); -// File upload = new File(path.getAbsolutePath(),"static/img/"); -// Date date=new Date(); -// -// DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); -// String date1=format.format(date); -// String fileName = multipartFile.getOriginalFilename();//文件全名 -// File parentDir = new File(upload.getAbsolutePath()+"/" + date1); -// System.out.println(upload.getAbsolutePath()); -// System.out.println(fileName); -// map -// return -// if(!upload.exists()){ -// upload.mkdirs(); -// } -// if(!parentDir.exists()){ -// parentDir.mkdirs(); -// } -// String suffix = suffix(fileName);//文件后缀 -// String relPath = "/" + yearMonth + "/" + "-" + UUID.randomUUID().toString().replaceAll("-","") + suffix; -// File fileUp = new File(upload.getAbsolutePath()+ relPath); -// file.transferTo(fileUp); -// Map map = new HashMap(); -// map.put("url", "/img" + relPath); -// log.info(relPath); -// return map; -// } catch (FileNotFoundException e) { -// throw e; -// } catch (IOException e) { -// throw e; -// } -// } + @Autowired + AttachmentDao attachmentDao; + + @Override + public HashMap upload(MultipartFile file,String cate,Long id) throws IOException { + HashMap map = storeFile(file,cate,id); + return map; + } + @Override + public HashMap storeFile(MultipartFile multipartFile,String cate,Long id) throws IOException { + HashMap map = new HashMap<>(); + Attachment attachment=new Attachment(); + File path = null; + try { + path = new File(ResourceUtils.getURL("classpath:").getPath()); + File upload = new File(path.getAbsolutePath(),"static/"+cate+"/"); + Date date=new Date(); + + DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); + DateFormat format1 = new SimpleDateFormat("yyyyMM"); + String date1=format.format(date); + String fileName = multipartFile.getOriginalFilename();//文件全名 + String date2=format1.format(date); + File parentDir = new File(upload.getAbsolutePath()+"/" + date2); + if(!upload.exists()){ + upload.mkdirs(); + } + if(!parentDir.exists()){ + parentDir.mkdirs(); + } + String suffix = suffix(fileName);//文件后缀 + String finalFileName=UUID.randomUUID().toString().replaceAll("-",""); + String relPath = "/" + date2 + "/" + finalFileName + suffix; + File fileUp = new File(upload.getAbsolutePath()+ relPath); + + attachment.setCreatetime(date); + attachment.setFileName(finalFileName); + attachment.setPath(upload.getAbsolutePath()+ "/" + date2 + "/"); + attachment.setSuffix(suffix); + attachment.setMd5(MD5Utils.md5(upload.getAbsolutePath()+ relPath)); + attachment.setStorage("local"); + attachment.setId(id); + attachmentDao.insertSelective(attachment); + map.put("id", String.valueOf(attachment.getId())); + multipartFile.transferTo(fileUp); + map.put("url", "/img" + relPath); + log.info(relPath); + return map; + } catch (FileNotFoundException e) { + throw e; + } catch (IOException e) { + throw e; + } + } + + @Override + public Attachment selectAttachment(Long id) { + Attachment attachment=attachmentDao.selectByPrimaryKey(id); + return attachment; + } + + private static String suffix(String fileName) { + int i = fileName.lastIndexOf('.'); + return i == -1 ? "" : fileName.substring(i); + } } diff --git a/src/main/java/com/lovenav/service/serviceImpl/CommentServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/CommentServiceImpl.java index d82491b..096e4bf 100644 --- a/src/main/java/com/lovenav/service/serviceImpl/CommentServiceImpl.java +++ b/src/main/java/com/lovenav/service/serviceImpl/CommentServiceImpl.java @@ -5,6 +5,8 @@ import com.alibaba.fastjson2.JSONObject; import com.lovenav.dao.CommentDao; import com.lovenav.dao.UserDao; import com.lovenav.entity.Comment; +import com.lovenav.entity.CommentNode; +import com.lovenav.entity.User; import com.lovenav.service.CommentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -64,10 +66,16 @@ public class CommentServiceImpl implements CommentService { return JSON.toJSONString(hashMap); } -// 显示评论 +// 显示一级评论和用户信息 public String View_comment(){ - List list = commentDao.selectAllComment(); - return JSON.toJSONString(list); + List list_comment = commentDao.selectAllComment(); + HashMap result = new HashMap<>(); + for(int i=0;i list = commentDao.selectByAllReply(id); return JSON.toJSONString(list); } + + + private boolean addNode (List firstList, CommentNode commentNode ) { + //循环添加 + for (CommentNode node : firstList) { + //判断留言的上一段是否是这条留言(判断这条回复,是否是当前评论的回复) + if (node.getId().equals(commentNode.getRootCommentId())) { + //是,添加,返回true + node.getNextNodes().add(commentNode); + return true; + } else { + //否则递归继续判断 + if (node.getNextNodes().size() != 0) { + if (addNode(node.getNextNodes(), commentNode)) { + return true; + } + } + } + } + return false; + } + + /** + * 功能描述:将查出来的lastId不为null的回复都添加到第一层Node集合中 + * + * @param firstList 第一层评论集合(链表) + * @param thenList 非第一层评论集合(链表) + * @return 所有评论集合(非第一层评论集合对应添加到第一层评论集合,返回) + */ + private List addAllNode ( List firstList, List thenList ) { + while (thenList.size() != 0) { + int size = thenList.size(); + for (int i = 0; i < size; i++) { + if (addNode(firstList, new CommentNode(thenList.get(i)))) { + thenList.remove(i); + i--; + size--; + } + } + } + return firstList; + } + + public List queryObserveByBlogId ( Integer UrlId ) { + //所有未处理的一级评论集合 + List firstCommentList = commentDao.queryFirstCommentList(UrlId); + //所有未处理的二级评论集合 + List secondCommentList = commentDao.querySecondCommentList(UrlId); + + //将二级评论用链表的方式添加到一级评论 + List list = addAllNode(firstCommentList, secondCommentList); + return list; + } } diff --git a/src/main/java/com/lovenav/service/serviceImpl/ConfigServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/ConfigServiceImpl.java index 3c4075a..752d475 100644 --- a/src/main/java/com/lovenav/service/serviceImpl/ConfigServiceImpl.java +++ b/src/main/java/com/lovenav/service/serviceImpl/ConfigServiceImpl.java @@ -17,7 +17,10 @@ public class ConfigServiceImpl implements ConfigService { } @Override - public int updateConfis(Config config) { + public int updateConfig(Config config) { + if (configDao.selectByName(config.getName())==null){ + return 2; + } return configDao.updateByName(config); } @@ -35,5 +38,36 @@ public class ConfigServiceImpl implements ConfigService { } } +//获得邮箱配置的信息,若没有值则采用默认信息 + @Override + public HashMap selectEmailConfig() { + HashMap configMap= new HashMap<>(); + if (configDao.selectByName("email_sendEmail").getValue()!=null){ + configMap.put("email_sendEmail",configDao.selectByName("email_sendEmail").getValue()); + }else { + configMap.put("email_sendEmail","482370576@qq.com"); + return configMap; + } + if (configDao.selectByName("email_host").getValue()!=null){ + configMap.put("email_host",configDao.selectByName("email_host").getValue()); + }else { + configMap.put("email_host","smtp.qq.com"); + return configMap; + } + if (configDao.selectByName("email_password").getValue()!=null){ + configMap.put("email_password",configDao.selectByName("email_password").getValue()); + }else { + configMap.put("email_password","ksuebkfenixhdbbh"); + return configMap; + } + return configMap; + } + + @Override + public Config selectAlreadyExist(Config config) { + + return configDao.selectByName(config.getName()); + } + } diff --git a/src/main/java/com/lovenav/service/serviceImpl/LoginLogsServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/LoginLogsServiceImpl.java new file mode 100644 index 0000000..98e84f3 --- /dev/null +++ b/src/main/java/com/lovenav/service/serviceImpl/LoginLogsServiceImpl.java @@ -0,0 +1,30 @@ +package com.lovenav.service.serviceImpl; + +import com.lovenav.dao.LoginLogsDao; +import com.lovenav.entity.LoginLogs; +import com.lovenav.service.LoginLogsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +@Service +public class LoginLogsServiceImpl implements LoginLogsService { + @Autowired + LoginLogsDao loginLogsDao; + @Override + public String addLoginLogs(LoginLogs loginLogs) { + Date date=new Date(); + loginLogs.setLoginTime(date); + if (loginLogsDao.selectAlreadyExist(loginLogs.getUserId())==null){ + if (loginLogsDao.insertSelective(loginLogs)!=1){ + return "登录日志更新成功!"; + } + }else { + if (loginLogsDao.updateByUserId(loginLogs)!=1){ + return "登录日志更新失败!"; + } + } + return "更新登录日志失败"; + } +} diff --git a/src/main/java/com/lovenav/service/serviceImpl/QRCServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/QRCServiceImpl.java index b4b1373..bb68bbc 100644 --- a/src/main/java/com/lovenav/service/serviceImpl/QRCServiceImpl.java +++ b/src/main/java/com/lovenav/service/serviceImpl/QRCServiceImpl.java @@ -22,39 +22,80 @@ public class QRCServiceImpl implements QRCService{ private CollectIconListDao collectIconListDao; public String QR(CollectIconList collect) throws Exception { - String logoPath ="src/main/resources/static/logo/NAV.png"; + String logoPath = "src/main/resources/static/logo/NAV.png"; String destPath = "src/main/resources/static/qr"; -// 通过传入collect的url_id查找相同网址图片列表 -// List collectIconList = collectIconListDao.selectByUrlid(collect.getUrl_id()); // 通过collect的url_id查找网址id对应网址 UrlList urlList = urlListDao.selectByPrimaryKey(Long.valueOf(collect.getUrl_id())); - List list = collectIconListDao.selectByUrlid(collect.getUrl_id()); - if(list.size()==0){ - if(urlList != null){ -// 将icon下载到本地并存储本地路径 +// 如果表中没有可以插入 + if (list.size() == 0) { +// 如果icon是url + if(QRCodeUtil.notBase64(collect.getIcon_url())){ String icon_url = QRCodeUtil.downloadPicture(collect.getIcon_url()); collect.setIcon_url(icon_url); -// 获取网址url String url = urlList.getUrl(); -// 将网址生成二维码并返回本地路径 +// 将网址生成二维码并返回本地路径 String url_wait = QRCodeUtil.encode(url, logoPath, destPath, true); -// 为collect设置二维码本地路径 collect.setQr_url(url_wait); - collectIconListDao.insert(collect); String base64 = QRCodeUtil.ImageToBase64(url_wait); + collectIconListDao.insert(collect); return JSON.toJSONString(base64); - }else{ - HashMap result = new HashMap<>(); - result.put("code",500); - result.put("msg", "找不到对应网址"); - return JSON.toJSONString(result); } - }else{ - String url_wait = list.get(0).getQr_url(); - String base64 = QRCodeUtil.ImageToBase64(url_wait); - return JSON.toJSONString(base64); + else { + String base64str = QRCodeUtil.delete_profix(collect.getIcon_url()); + String icon_url = QRCodeUtil.GenerateImage(base64str,"src/main/resources/static/icon"); + collect.setIcon_url(icon_url); + + String url = urlList.getUrl(); + String url_wait = QRCodeUtil.encode(url, logoPath, destPath, true); + collect.setQr_url(url_wait); + + String base64 = QRCodeUtil.ImageToBase64(url_wait); + collectIconListDao.insert(collect); + return JSON.toJSONString(base64); + } + } else { + return JSON.toJSONString(QRCodeUtil.ImageToBase64(list.get(0).getQr_url())); } } + +//// 通过传入collect的url_id查找相同网址图片列表 +//// List collectIconList = collectIconListDao.selectByUrlid(collect.getUrl_id()); +// +//// 通过collect的url_id查找网址id对应网址 +// UrlList urlList = urlListDao.selectByPrimaryKey(Long.valueOf(collect.getUrl_id())); +// +// List list = collectIconListDao.selectByUrlid(collect.getUrl_id()); +// if(list.size()==0){ +// if(urlList != null && collect.getIcon_url()!=null){ +//// 将icon下载到本地并存储本地路径 +// String icon_url = QRCodeUtil.downloadPicture(collect.getIcon_url()); +// collect.setIcon_url(icon_url); +// +// +//// 为collect设置二维码本地路径 +// collect.setQr_url(url_wait); +// collectIconListDao.insert(collect); +// String base64 = QRCodeUtil.ImageToBase64(url_wait); +// return JSON.toJSONString(base64); +// }else if(urlList != null && collect.getIcon_url()==null){ +//// 获取网址url +// String url = urlList.getUrl(); +// String url_wait = QRCodeUtil.encode(url, logoPath, destPath, true); +//// 为collect设置二维码本地路径 +// collect.setQr_url(url_wait); +// collectIconListDao.insert(collect); +// String base64 = QRCodeUtil.ImageToBase64(url_wait); +// return JSON.toJSONString(base64); +// } +// }else{ +// String url_wait = list.get(0).getQr_url(); +// String base64 = QRCodeUtil.ImageToBase64(url_wait); +// return JSON.toJSONString(base64); +// } +// return null; +// } + + } diff --git a/src/main/java/com/lovenav/service/serviceImpl/UrlAccessServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/UrlAccessServiceImpl.java new file mode 100644 index 0000000..bc868f5 --- /dev/null +++ b/src/main/java/com/lovenav/service/serviceImpl/UrlAccessServiceImpl.java @@ -0,0 +1,44 @@ +package com.lovenav.service.serviceImpl; + +import com.lovenav.dao.UrlAccessDao; +import com.lovenav.entity.UrlAccess; +import com.lovenav.service.UrlAccessService; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; + +@Service +public class UrlAccessServiceImpl implements UrlAccessService { + @Autowired + UrlAccessDao urlAccessDao; + @Override + public String inreaseUrlViews(UrlAccess urlAccess){ + if (urlAccess.getUrlId()==null){ + return "url的Id不能为空!"; + } + Date date=new Date(); + urlAccess.setTime(date); + urlAccess.setUrlId(2); + UrlAccess urlAccess1=urlAccessDao.selectAlreadyExist(urlAccess); + if (urlAccess1==null){ + urlAccess.setViews(1L); + urlAccessDao.insertSelective(urlAccess); + }else { + urlAccess.setViews(urlAccess1.getViews()+1); + urlAccessDao.updateByUrlId(urlAccess); + } + return "更新成功!"; + } + + @Override + public HashMap getUrlAccess(UrlAccess urlAccess) { + HashMap map=new HashMap<>(); + map=urlAccessDao.selectUrlAccess(urlAccess); + return map; + } +} diff --git a/src/main/java/com/lovenav/service/serviceImpl/UrlCateListServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/UrlCateListServiceImpl.java index ef01e2b..4a22b0d 100644 --- a/src/main/java/com/lovenav/service/serviceImpl/UrlCateListServiceImpl.java +++ b/src/main/java/com/lovenav/service/serviceImpl/UrlCateListServiceImpl.java @@ -27,22 +27,24 @@ public class UrlCateListServiceImpl implements UrlCateListService { UrlListDao urlListDao; @Autowired UserDao userDao; - public int selectAndInsertUrlCate(String email , String cateName , String parent ) + public int selectAndInsertUrlCate(Integer userId , String cateName , String parent,String icon ) { //找用户ID - User user = userDao.selectByEmail(email); - int userId = user.getId(); + parent = parent.substring(1,parent.length()-1); //找父标签有没有 UrlCateList cateParent = urlCateListDao.selectCateByNameAnduserId(parent,userId); - UrlCateList targetCate = new UrlCateList(); + //设置属性 - targetCate.setName(cateName); + targetCate.setName(cateName.substring(1,cateName.length()-1)); targetCate.setUserId(userId); Date date = new Date(); targetCate.setCreatetime(date.getTime()); - + targetCate.setWeigh(Long.valueOf(0)); + targetCate.setStatus(Byte.valueOf(0+"")); + targetCate.setNeedLogin(Byte.valueOf(0+"")); + targetCate.setIco(icon); if(cateParent != null) { targetCate.setRootCateId(cateParent.getId()); @@ -85,10 +87,9 @@ public class UrlCateListServiceImpl implements UrlCateListService { return urlCateListDao.selectByPrimaryKey(id); } - public String countCateContainUrlNumber(String email){ - User user = userDao.selectByEmail(email); - int userId = user.getId(); - List urlCateLists =urlCateListDao.selectUrListByUserId(userId); + public String countCateContainUrlNumber(Integer userId){ + + List urlCateLists =urlCateListDao.selectUrListByUserId(3); List urlLists = urlListDao.selectUrList(); HashMap CateNumber = new HashMap<>(); @@ -96,24 +97,27 @@ public class UrlCateListServiceImpl implements UrlCateListService { { CateNumber.put(urlCateList.getName(),0); } - for(UrlList urlList : urlLists){ - Long id = Long.valueOf(urlList.getCateId()); - while(id!= 0) + for(UrlList urlList : urlLists){ + String parentString = urlCateListDao.selectUrListCateByUrlCateId(urlList.getCateId()); + if (parentString == null) continue; + String [] strings = parentString.split(","); + + for(String str :strings) { + if(str.equals("0")) continue; for(UrlCateList urlCateList :urlCateLists) { - if(id == Long.valueOf(urlCateList.getId())){ + if(urlCateList.getId() == Integer.valueOf(str)){ int cateNum = CateNumber.get(urlCateList.getName())+1; CateNumber.put(urlCateList.getName(),cateNum); - id=Long.valueOf(urlCateList.getRootCateId()); + System.out.println(urlCateList.getName()); break; } } } - } Iterator iterator = CateNumber.entrySet().iterator(); while(iterator.hasNext()) { diff --git a/src/main/java/com/lovenav/service/serviceImpl/UrlLiserServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/UrlLiserServiceImpl.java index cbd2a06..b0eb2f5 100644 --- a/src/main/java/com/lovenav/service/serviceImpl/UrlLiserServiceImpl.java +++ b/src/main/java/com/lovenav/service/serviceImpl/UrlLiserServiceImpl.java @@ -25,22 +25,29 @@ public class UrlLiserServiceImpl implements UrlListService { UrlListDao urlListDao; @Autowired UserDao userDao; - public int selectCateAndInsertUrl(String parent,String name , String icon ,String url ,String email) + public int selectCateAndInsertUrl(String parent,String name , String icon ,String url ,Integer userId) { - //找用户ID - User user = userDao.selectByEmail(email); - int userId = user.getId(); - + parent = parent.substring(1,parent.length()-1); UrlCateList urlCateList = urlCateListDao.selectCateByNameAnduserId(parent,userId); UrlList urlList = new UrlList(); + if (urlCateList == null) + { + urlList.setCateId(0); + }else{ + urlList.setCateId(urlCateList.getId()); + } //设置属性 - urlList.setCateId(urlCateList.getId()); + urlList.setUrl(url); urlList.setIcon(icon); - urlList.setName(name); + urlList.setName(name.substring(1,name.length()-1)); Date date = new Date(); urlList.setCreatetime(date.getTime()); urlList.setViews(Long.valueOf("0")); + urlList.setIsNeedAgent(Byte.valueOf(0+"")); + urlList.setIsAd(Byte.valueOf(0+"")); + urlList.setIsTop(Byte.valueOf(0+"")); + urlList.setStatus(Byte.valueOf(0+"")); Byte b = 0; urlList.setNeedLogin(b); int flag = urlListDao.insert(urlList); diff --git a/src/main/java/com/lovenav/service/serviceImpl/UserServiceImpl.java b/src/main/java/com/lovenav/service/serviceImpl/UserServiceImpl.java index 7528b37..b5931cf 100644 --- a/src/main/java/com/lovenav/service/serviceImpl/UserServiceImpl.java +++ b/src/main/java/com/lovenav/service/serviceImpl/UserServiceImpl.java @@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; +import java.util.HashMap; import java.util.regex.Pattern; @@ -59,8 +60,15 @@ public class UserServiceImpl implements UserService { } @Override - public String sendEmailActivecode(User user) { - return EmailUtils.sendEmail(user); + public HashMap getAllUsers() { + HashMap map=new HashMap<>(); + map=userDao.selectAllUsers(); + return map; + } + + @Override + public String sendEmailActivecode(User user, HashMapconfigMap) { + return EmailUtils.sendEmail(user,configMap); } @Override diff --git a/src/main/java/com/lovenav/utils/EmailUtils.java b/src/main/java/com/lovenav/utils/EmailUtils.java index e13c8d5..1e6c9bc 100644 --- a/src/main/java/com/lovenav/utils/EmailUtils.java +++ b/src/main/java/com/lovenav/utils/EmailUtils.java @@ -5,6 +5,8 @@ package com.lovenav.utils; import com.lovenav.entity.User; +import com.sun.mail.smtp.SMTPSendFailedException; +import com.sun.mail.util.MailConnectException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -14,6 +16,7 @@ import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.File; import java.util.Date; +import java.util.HashMap; import java.util.Properties; /* @@ -22,14 +25,18 @@ import java.util.Properties; * */ public class EmailUtils { - public static String sendEmail(User user) { + public static String sendEmail(User user, HashMap configMap) { //邮箱 lx_teach@163.com - String myAccount = "482370576@qq.com"; - //授权码 java168 - String myPass = "hlilinclupppbice"; - //邮箱服务器 - String SMTPHost = "smtp.qq.com"; +// String myAccount = "482370576@qq.com"; +// //授权码 java168 +// String myPass = "hlilinclupppbice"; +// //邮箱服务器 +// String SMTPHost = "smtp.qq.com"; + String myAccount=configMap.get("email_sendEmail"); + String myPass=configMap.get("email_password"); + String SMTPHost = configMap.get("email_host"); + //设置属性信息 Properties prop = new Properties(); //设置协议 @@ -44,9 +51,13 @@ public class EmailUtils { //设置是否需要调试 session.setDebug(false); //2、创建发送信息 - MimeMessage message = createMsg(session, myAccount, user, activecode); + + + + //4发送信息操作 try { + MimeMessage message = createMsg(session, myAccount, user, activecode); Transport tran = session.getTransport(); //连接 tran.connect(myAccount, myPass); @@ -54,10 +65,18 @@ public class EmailUtils { tran.sendMessage(message, message.getAllRecipients()); //关闭 tran.close(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + + }catch (SMTPSendFailedException s){ + s.printStackTrace(); + return "该邮箱不存在"; + }catch (MailConnectException m){ + m.printStackTrace(); + return "配置文件有错误"; + }catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return "配置文件有错误";} + return activecode; } diff --git a/src/main/java/com/lovenav/utils/IPutils.java b/src/main/java/com/lovenav/utils/IPutils.java new file mode 100644 index 0000000..eb3343b --- /dev/null +++ b/src/main/java/com/lovenav/utils/IPutils.java @@ -0,0 +1,105 @@ +package com.lovenav.utils; + + + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.lovenav.entity.IpLocation; + +import lombok.extern.slf4j.Slf4j; +import org.lionsoul.ip2region.xdb.Searcher; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.apache.commons.io.FileUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.FileCopyUtils; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + + + +@Slf4j +@Service +public class IPutils { + + /** + * 字符常量0 + */ + private static final String ZERO="0"; + /** + * 本级ip + */ + private static final String LOCALHOST="127.0.0.1"; + + + /** + * 获取客户端的IP地址 + */ + public static String getIpAddress(HttpServletRequest request) { + + String ipAddress = request.getHeader("X-Forwarded-For"); + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getRemoteAddr(); + if (LOCALHOST.equals(ipAddress)) { + // 根据网卡取本机配置的IP + InetAddress inet = null; + try { + inet = InetAddress.getLocalHost(); + ipAddress = inet.getHostAddress(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + } + // 对于通过多个代理转发的情况,取第一个非unknown的IP地址。 + // 这里假设第一个IP为真实IP,后面的为代理IP。 + if (ipAddress != null && ipAddress.length() > 15) { + if (ipAddress.indexOf(",") > 0) { + ipAddress = ipAddress.substring(0, ipAddress.indexOf(",")); + } + } + return ipAddress; + } + + /** + * 根据iP获取归属地信息 + * @return + */ + public static IpLocation getLocation(String ip) { + IpLocation location = new IpLocation(); + location.setIp(ip); + try (InputStream inputStream = IPutils.class.getResourceAsStream("/ip2region.xdb");) { + byte[] bytes = IoUtil.readBytes(inputStream); + Searcher searcher = Searcher.newWithBuffer(bytes); + String region = searcher.search(ip); + if (StrUtil.isAllNotBlank(region)) { + // xdb返回格式 国家|区域|省份|城市|ISP, + // 只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0 + String[] result = region.split("\\|"); + location.setCountry(ZERO.equals(result[0])?StrUtil.EMPTY:result[0]); + location.setProvince(ZERO.equals(result[2])?StrUtil.EMPTY:result[2]); + location.setCity(ZERO.equals(result[3])?StrUtil.EMPTY:result[3]); + location.setIsp(ZERO.equals(result[4])?StrUtil.EMPTY:result[4]); + } + searcher.close(); + } catch (Exception e) { + log.error("ip地址解析异常,error:{}",e); + return location; + } + return location; + } +} diff --git a/src/main/java/com/lovenav/utils/QRCodeUtil.java b/src/main/java/com/lovenav/utils/QRCodeUtil.java index 944b46f..232e30e 100644 --- a/src/main/java/com/lovenav/utils/QRCodeUtil.java +++ b/src/main/java/com/lovenav/utils/QRCodeUtil.java @@ -20,6 +20,7 @@ import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.*; +import java.util.regex.Pattern; @Component @Service @@ -431,12 +432,59 @@ public class QRCodeUtil { return (serverPath +"/" + fileName); } + + + // 对字节数组字符串进行Base64解码并生成图片 + //imgFilePath 待保存的本地路径 + public static String GenerateImage(String base64Str, String imgFilePath) throws IOException { + if (base64Str == null) // 图像数据为空 + return null; + Base64.Decoder decoder = Base64.getDecoder(); + + // Base64解码 + byte[] bytes = decoder.decode(base64Str); + for (int i = 0; i < bytes.length; ++i) { + if (bytes[i] < 0) {// 调整异常数据 + bytes[i] += 256; + } + } + //设置图片名称,这个随意 + String date = new Random().nextInt(99999999)+".jpg"; + String fileName = date ; + + // 生成jpg图片 + OutputStream out = new FileOutputStream(imgFilePath +"/" + fileName); + out.write(bytes); + out.flush(); + out.close(); + return (imgFilePath +"/" + fileName); + } + + public static boolean notBase64(String url){ + String reg = "[a-zA-z]+://[^\\s]*"; + boolean isMatch = Pattern.matches(reg, url); + if(isMatch){ + return isMatch; + } + return isMatch; + } + + public static String delete_profix(String base64){ + String delete = "data:image/jpg;base64,"; + String Base64 = base64; + return(base64.replace(delete,"")); + } + + public static void main(String[] args) throws Exception { + + String base64 = "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"; + GenerateImage(base64, "src/main/resources/static/icon"); + System.out.println(GenerateImage(base64, "src/main/resources/static/icon")); // String text = "https://www.baidu.com"; //这里设置自定义网站url // String logoPath ="src/main/resources/static/logo/NAV.png"; // String destPath = "src/main/resources/static/qr"; // String url = QRCodeUtil.encode(text, logoPath, destPath, true); -// QRCodeUtil.ImageToBase64("src/main/resources/static/qr/44672405.jpg"); // System.out.println(url); // String base64 = getBase64(url); // System.out.println(base64); diff --git a/src/main/java/com/lovenav/vo/CateAndUrl.java b/src/main/java/com/lovenav/vo/CateAndUrl.java index 7c08545..0c7ecf2 100644 --- a/src/main/java/com/lovenav/vo/CateAndUrl.java +++ b/src/main/java/com/lovenav/vo/CateAndUrl.java @@ -250,4 +250,14 @@ public class CateAndUrl { public void setIsEncrypt(Byte isEncrypt) { this.isEncrypt = isEncrypt; } + + Long number ; + + public Long getNumber() { + return number; + } + + public void setNumber(Long number) { + this.number = number; + } } diff --git a/src/main/resources/ip2region.xdb b/src/main/resources/ip2region.xdb new file mode 100644 index 0000000..c78b792 Binary files /dev/null and b/src/main/resources/ip2region.xdb differ diff --git a/src/main/resources/mybatis/AttachmentDao.xml b/src/main/resources/mybatis/AttachmentDao.xml index 22379e0..ff8c27a 100644 --- a/src/main/resources/mybatis/AttachmentDao.xml +++ b/src/main/resources/mybatis/AttachmentDao.xml @@ -11,7 +11,7 @@ - + id, `path`, suffix, file_name, `size`, md5, width, height, `storage`, createtime @@ -32,9 +32,9 @@ `storage`, createtime) values (#{path,jdbcType=VARCHAR}, #{suffix,jdbcType=VARCHAR}, #{fileName,jdbcType=VARCHAR}, #{size,jdbcType=DOUBLE}, #{md5,jdbcType=VARCHAR}, #{width,jdbcType=DOUBLE}, #{height,jdbcType=DOUBLE}, - #{storage,jdbcType=OTHER}, #{createtime,jdbcType=INTEGER}) + #{storage,jdbcType=OTHER}, #{createtime,jdbcType=TIMESTAMP}) - + insert into ln_attachment @@ -91,7 +91,7 @@ #{storage,jdbcType=OTHER}, - #{createtime,jdbcType=INTEGER}, + #{createtime,jdbcType=TIMESTAMP}, @@ -123,7 +123,7 @@ `storage` = #{storage,jdbcType=OTHER}, - createtime = #{createtime,jdbcType=INTEGER}, + createtime = #{createtime,jdbcType=TIMESTAMP}, where id = #{id,jdbcType=BIGINT} @@ -138,9 +138,7 @@ width = #{width,jdbcType=DOUBLE}, height = #{height,jdbcType=DOUBLE}, `storage` = #{storage,jdbcType=OTHER}, - createtime = #{createtime,jdbcType=INTEGER} + createtime = #{createtime,jdbcType=TIMESTAMP} where id = #{id,jdbcType=BIGINT} - - \ No newline at end of file diff --git a/src/main/resources/mybatis/CommentDao.xml b/src/main/resources/mybatis/CommentDao.xml index 12f7f52..39cdf8c 100644 --- a/src/main/resources/mybatis/CommentDao.xml +++ b/src/main/resources/mybatis/CommentDao.xml @@ -159,4 +159,39 @@ from ln_comment where root_comment_id = #{rootCommentId,jdbcType=INTEGER} and comment_status = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/LoginLogsDao.xml b/src/main/resources/mybatis/LoginLogsDao.xml index 9f936e6..6c2dfb7 100644 --- a/src/main/resources/mybatis/LoginLogsDao.xml +++ b/src/main/resources/mybatis/LoginLogsDao.xml @@ -4,7 +4,7 @@ - + @@ -12,11 +12,17 @@ id, login_ip, user_id, login_time, `location` + delete from ln_login_logs where id = #{id,jdbcType=INTEGER} @@ -24,7 +30,7 @@ insert into ln_login_logs (login_ip, user_id, login_time, `location`) - values (#{loginIp,jdbcType=VARCHAR}, #{userId,jdbcType=TINYINT}, #{loginTime,jdbcType=TIMESTAMP}, + values (#{loginIp,jdbcType=VARCHAR}, #{userId,jdbcType=INTEGER}, #{loginTime,jdbcType=TIMESTAMP}, #{location,jdbcType=VARCHAR}) @@ -48,7 +54,7 @@ #{loginIp,jdbcType=VARCHAR}, - #{userId,jdbcType=TINYINT}, + #{userId,jdbcType=INTEGER}, #{loginTime,jdbcType=TIMESTAMP}, @@ -65,7 +71,7 @@ login_ip = #{loginIp,jdbcType=VARCHAR}, - user_id = #{userId,jdbcType=TINYINT}, + user_id = #{userId,jdbcType=INTEGER}, login_time = #{loginTime,jdbcType=TIMESTAMP}, @@ -79,9 +85,24 @@ update ln_login_logs set login_ip = #{loginIp,jdbcType=VARCHAR}, - user_id = #{userId,jdbcType=TINYINT}, + user_id = #{userId,jdbcType=INTEGER}, login_time = #{loginTime,jdbcType=TIMESTAMP}, `location` = #{location,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} + + update ln_login_logs + + + login_ip = #{loginIp,jdbcType=VARCHAR}, + + + login_time = #{loginTime,jdbcType=TIMESTAMP}, + + + `location` = #{location,jdbcType=VARCHAR}, + + + where user_id = #{userId,jdbcType=INTEGER} + \ No newline at end of file diff --git a/src/main/resources/mybatis/UrlAccessDao.xml b/src/main/resources/mybatis/UrlAccessDao.xml index 2cea41d..3e01b75 100644 --- a/src/main/resources/mybatis/UrlAccessDao.xml +++ b/src/main/resources/mybatis/UrlAccessDao.xml @@ -15,6 +15,18 @@ from ln_url_access where id = #{id,jdbcType=INTEGER} + + + delete from ln_url_access @@ -73,4 +85,16 @@ views = #{views,jdbcType=BIGINT} where id = #{id,jdbcType=INTEGER} + + update ln_url_access + + + `time` = #{time,jdbcType=TIMESTAMP}, + + + views = #{views,jdbcType=BIGINT}, + + + where url_id = #{urlId,jdbcType=INTEGER} and date_format(time,'%y%m%d') >= date_format(#{time},'%y%m%d') + \ No newline at end of file diff --git a/src/main/resources/mybatis/UrlCateListDao.xml b/src/main/resources/mybatis/UrlCateListDao.xml index 5bb1111..fbb038d 100644 --- a/src/main/resources/mybatis/UrlCateListDao.xml +++ b/src/main/resources/mybatis/UrlCateListDao.xml @@ -32,7 +32,7 @@ select from ln_url_cate_list - where user_id = #{userId,jdbcType=INTEGER} + where user_id = #{userId,jdbcType=INTEGER} order by id - + \ No newline at end of file diff --git a/src/main/resources/static/icon/23161362.jpg b/src/main/resources/static/icon/23161362.jpg new file mode 100644 index 0000000..dbf5e8d Binary files /dev/null and b/src/main/resources/static/icon/23161362.jpg differ diff --git a/src/main/resources/static/icon/53548802.jpg b/src/main/resources/static/icon/53548802.jpg new file mode 100644 index 0000000..dbf5e8d Binary files /dev/null and b/src/main/resources/static/icon/53548802.jpg differ diff --git a/src/main/resources/static/icon/60945714.jpg b/src/main/resources/static/icon/60945714.jpg new file mode 100644 index 0000000..dbf5e8d Binary files /dev/null and b/src/main/resources/static/icon/60945714.jpg differ diff --git a/src/main/resources/static/icon/62202567.jpg b/src/main/resources/static/icon/62202567.jpg new file mode 100644 index 0000000..dbf5e8d Binary files /dev/null and b/src/main/resources/static/icon/62202567.jpg differ diff --git a/src/main/resources/static/icon/84361768.jpg b/src/main/resources/static/icon/84361768.jpg new file mode 100644 index 0000000..dbf5e8d Binary files /dev/null and b/src/main/resources/static/icon/84361768.jpg differ diff --git a/src/main/resources/static/icon/98088501.jpg b/src/main/resources/static/icon/98088501.jpg new file mode 100644 index 0000000..dbf5e8d Binary files /dev/null and b/src/main/resources/static/icon/98088501.jpg differ diff --git a/src/main/resources/static/qr/20949362.jpg b/src/main/resources/static/qr/20949362.jpg new file mode 100644 index 0000000..5e08bde Binary files /dev/null and b/src/main/resources/static/qr/20949362.jpg differ diff --git a/src/main/resources/static/qr/26585916.jpg b/src/main/resources/static/qr/26585916.jpg new file mode 100644 index 0000000..5e08bde Binary files /dev/null and b/src/main/resources/static/qr/26585916.jpg differ diff --git a/src/main/resources/static/qr/73600988.jpg b/src/main/resources/static/qr/73600988.jpg new file mode 100644 index 0000000..5e08bde Binary files /dev/null and b/src/main/resources/static/qr/73600988.jpg differ diff --git a/src/main/resources/static/qr/83334762.jpg b/src/main/resources/static/qr/83334762.jpg new file mode 100644 index 0000000..5e08bde Binary files /dev/null and b/src/main/resources/static/qr/83334762.jpg differ diff --git a/src/main/resources/static/qr/90551957.jpg b/src/main/resources/static/qr/90551957.jpg new file mode 100644 index 0000000..5e08bde Binary files /dev/null and b/src/main/resources/static/qr/90551957.jpg differ diff --git a/src/main/resources/static/qr/95734068.jpg b/src/main/resources/static/qr/95734068.jpg new file mode 100644 index 0000000..5e08bde Binary files /dev/null and b/src/main/resources/static/qr/95734068.jpg differ diff --git a/src/test/java/com/lovenav/LoveNavApplicationTests.java b/src/test/java/com/lovenav/LoveNavApplicationTests.java index 1dcdaef..20eb02e 100644 --- a/src/test/java/com/lovenav/LoveNavApplicationTests.java +++ b/src/test/java/com/lovenav/LoveNavApplicationTests.java @@ -1,21 +1,21 @@ package com.lovenav; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.lovenav.dao.UrlCateListDao; -import com.lovenav.dao.UrlListDao; -import com.lovenav.dao.UserDao; +import com.lovenav.dao.*; +import com.lovenav.entity.Nav; +import com.lovenav.entity.UrlAccess; import com.lovenav.entity.UrlCateList; import com.lovenav.entity.UrlList; import com.lovenav.filter.SensitiveFilter; -import com.lovenav.service.RedisService; -import com.lovenav.service.UrlCateListService; -import com.lovenav.service.UrlListService; -import com.lovenav.service.UserService; +import com.lovenav.service.*; import com.lovenav.vo.CateAndUrl; import org.junit.jupiter.api.Test; +import org.mybatis.spring.annotation.MapperScan; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -24,303 +24,34 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.slf4j.Logger; import java.io.IOException; +import java.io.InputStream; +import java.text.ParseException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; @SpringBootTest + class LoveNavApplicationTests { - @Autowired - private RedisTemplate redisTemplate; - @Autowired - private StringRedisTemplate stringRedisTemplate; - - @Autowired - RedisService redisService ; - - @Autowired - UserService userService ; - - @Autowired - UrlCateListService urlCateListService; - - @Autowired - UrlListService urlListService; - - @Autowired - UserDao userDao; - - @Autowired - SensitiveFilter sensitiveFilter; - @Autowired - ObjectMapper objectMapper; - @Autowired - UrlCateListDao urlCateListDao; - @Autowired - UrlListDao urlListDao; - - private static Logger logger = LoggerFactory.getLogger(LoveNavApplicationTests.class); +@Autowired + UrlAccessService urlAccessService; @Test - void contextLoads() { - - String userId = "2"; - String searchKey="学习"; - String abc = "[91片先生, bilibli, 学习, 阁楼]"; - redisService.addSearchHistoryByUserId(userId, searchKey); - redisService.incrementScoreByUserId(searchKey); - redisService.incrementScore(searchKey); - -// redisService.getSearchHistoryByUserId(userId); - - -// System.out.println(redisService.getSearchHistoryByUserId(userId)); - System.out.println(redisService.getHotList("学")); - } - - @Test - void testStringRedisTemplate() { - - stringRedisTemplate.opsForValue().set("name", "zhenyu"); - //根据键值取出数据 - System.out.println(stringRedisTemplate.opsForValue().get("name")); - } - - @Test - void testServiceImpl() throws IOException { - - String searchKey = "傻逼h"; - String placeholder = "***"; - //非法敏感词汇判断 - SensitiveFilter filter = SensitiveFilter.getInstance(); - String s = filter.replaceSensitiveWord(searchKey, 1, placeholder); - System.out.println(s); - int n = filter.CheckSensitiveWord(searchKey,0,2); - //存在非法字符 - if(n > 0){ - logger.info("这个人输入了非法字符--> {},不知道他到底要查什么~ userid--> {}",searchKey,1); - } + void contextLoads() throws ParseException { + UrlAccess urlAccess=new UrlAccess(); + urlAccess.setUrlId(2); +// urlAccess + System.out.println(urlAccessService.getUrlAccess(urlAccess)); } - @Test - public void disposeBookmark() - { - String data = "\n" + - "[ {\n" + - "\"name\" :\"书签栏\",\n" + - "\"folder\":true,\n" + - "\"children\": [ {\n" + - "\"folder\":false,\n" + - "\"name\" :\"后阁楼_此处安放你的文字\",\n" + - "\"url\": \"http://lxqnsys.com/ hougelou/#/\"\n" + - "}]\n" + - "}, {\n" + - "\"name\" :\"我是文件夹\",\n" + - "\"folder\" : true,\n" + - "\"children\" : [{\n" + - "\"folder\":false,\n" + - "\"name\" :\"理想P卫T_一个简单优雅的在线PPT\",\n" + - "\"url\": \"http:// lxqnsys.com/ ppt/ \"\n" + - "}]\n" + - "\n" + - "}]"; - String data1 = "[\n" + - " {\n" + - " \"name\":\"书签栏\",\n" + - " \"folder\":true,\n" + - " \"children\":[\n" + - " {\n" + - " \"folder\":false,\n" + - " \"name\":\"后阁楼_此处安放你的文字\",\n" + - " \"url\":\"http://lxqnsys.com/ hougelou/#/\"\n" + - " },\n" + - " {\n" + - " \"folder\":true,\n" + - " \"name\":\"seven\",\n" + - " \"url\":\"http://lxqnsys.com/ hougelou/#/\",\n" + - " \"children\":[]\n" + - " }\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"name\":\"我是文件夹\",\n" + - " \"folder\":true,\n" + - " \"children\":[\n" + - " {\n" + - " \"folder\":false,\n" + - " \"name\":\"理想P卫T_一个简单优雅的在线PPT\",\n" + - " \"url\":\"http:// lxqnsys.com/ ppt/ \"\n" + - " }\n" + - " ]\n" + - " }\n" + - "]"; - String data2="[\n" + - " {\n" + - " \"name\":\"书签栏\",\n" + - " \"folder\":true,\n" + - " \"children\":[\n" + - " {\n" + - " \"folder\":false,\n" + - " \"name\":\"后阁楼_此处安放你的文字\",\n" + - " \"url\":\"http://lxqnsys.com/ hougelou/#/\"\n" + - " },\n" + - " {\n" + - " \"folder\":true,\n" + - " \"name\":\"seven\",\n" + - " \"url\":\"http://lxqnsys.com/ hougelou/#/\",\n" + - " \"children\":[]\n" + - " }\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"name\":\"我是文件夹\",\n" + - " \"folder\":true,\n" + - " \"children\":[\n" + - " {\n" + - " \"folder\":false,\n" + - " \"name\":\"理想P卫T_一个简单优雅的在线PPT\",\n" + - " \"url\":\"http:// lxqnsys.com/ ppt/ \"\n" + - " },\n" + - " {\n" + - " \"folder\":true,\n" + - " \"name\":\"eight\",\n" + - " \"url\":\"http://lxqnsys.com/ hougelou/#/\",\n" + - " \"children\":[]\n" + - " }\n" + - " ]\n" + - " }\n" + - "]"; - String mes = "success"; - //先转换成ObjectMapper类型 - ObjectNode objectNode = objectMapper.createObjectNode(); - try { - JsonNode rootNode = objectMapper.readTree(data2); - disposeBookmarkFunction1(rootNode,"top","fadas"); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - - - } - @Test - public void disposeBookmarkFunction1(JsonNode rootNode,String parent,String email) - { - - for(int i=0;i urlCateLists = urlCateListDao.selectUrListByUserId(1); - List urlLists = urlListDao.selectUrList(); - - List cateAndUrlList = new ArrayList<>(); - - - - - //预处理为CateAndUrl对象 - for( int i = 0 ; i < urlCateLists.size() ; i++) - { - CateAndUrl cateAndUrl = new CateAndUrl(); - cateAndUrl.setFloder("true"); - cateAndUrl.setName(urlCateLists.get(i).getName()); - cateAndUrl.setParentId(urlCateLists.get(i).getRootCateId()); - cateAndUrl.setCateId(urlCateLists.get(i).getId()); - cateAndUrlList.add(cateAndUrl); - - } - for( int i = 0 ; i < urlLists.size() ; i++) - { - CateAndUrl cateAndUrl = new CateAndUrl(); - cateAndUrl.setFloder("false"); - cateAndUrl.setName(urlLists.get(i).getName()); - cateAndUrl.setParentId(urlLists.get(i).getCateId()); - cateAndUrl.setUrlId(urlLists.get(i).getId()); - cateAndUrlList.add(cateAndUrl); - - } - - List parentsList = new ArrayList<>(); - //声明返回集合 - List resultList = new ArrayList<>(); - //对全部数据进行遍历 - for (CateAndUrl disease : cateAndUrlList) { - //判断是否是第一梯队,或者说是树的根节点,如果是根节点就加入到父类集合与返回集合 - if (disease.getParentId() == 0) { - parentsList.add(disease); - resultList.add(disease); - } else { - //对于不是第一梯队的数据进行遍历 - for (CateAndUrl parent : parentsList) { - //对数据的pid与父类集合中的父节点进行配对,如果配对成功,就把数据加入到父节点中的子节点集合 - - - if (parent.getFloder().equals("true") ) { - if( parent.getCateId() == disease.getParentId()) - { - parent.getChildUC().add(disease); - //当前数据有可能是别的数据的父节点,加到父类容器 - parentsList.add(disease); - break; - } - - } - if (parent.getFloder().equals("false") ) { - if(parent.getUrlId() == disease.getParentId()) - { - parent.getChildUC().add(disease); - //当前数据有可能是别的数据的父节点,加到父类容器 - parentsList.add(disease); - break; - } - - } - } - } - } - - ObjectMapper mapper = new ObjectMapper(); - // java对象转换为json字符换 - try { - String Json = mapper.writeValueAsString(resultList); - System.out.println(Json); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - - - - - - - - - return ; - - } - }