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 ;
-
- }
-
}