Compare commits

...

116 Commits
v1 ... v2.2.0

Author SHA1 Message Date
禾几海
7ac3d69da4 单元测试 2020-08-01 12:21:25 +08:00
禾几海
657a200d81 ... 2020-08-01 12:21:03 +08:00
禾几海
85c3541445 修改emailService的bean 2020-08-01 12:20:44 +08:00
禾几海
c6877c2b4a 添加unique约束 2020-08-01 12:19:55 +08:00
禾几海
9e98134003 空值异常 2020-08-01 09:23:48 +08:00
禾几海
7a81d8e4ce 友链申请通过通知,数据防重 2020-08-01 01:41:17 +08:00
禾几海
1b52e27b72 reapply接口 2020-08-01 01:13:15 +08:00
禾几海
cd9d9ff0e6 ... 2020-08-01 01:00:47 +08:00
禾几海
dcf44cefb6 调整,非成功响应情况下返回数据 2020-08-01 01:00:07 +08:00
禾几海
d83e4de9a3 ... 2020-07-31 23:26:30 +08:00
禾几海
9c949576aa 抓取网页信息,进行数据处理 2020-07-31 23:18:05 +08:00
禾几海
85b24891be 使用htmlunit获取js渲染后的数据 2020-07-31 23:16:56 +08:00
禾几海
da95470993 修改异常 2020-07-31 21:49:05 +08:00
禾几海
3b368c92cb 修改数据库字段 2020-07-31 21:19:48 +08:00
禾几海
ad5271f740 添加请求实体,修改请求 2020-07-31 21:19:33 +08:00
禾几海
d2cf640133 调整 2020-07-31 21:19:10 +08:00
禾几海
4a2abc47cc 修改HttpUtil 2020-07-31 21:17:35 +08:00
禾几海
6b29cd39d4 修改getResponse的类型参数 2020-07-31 20:34:00 +08:00
禾几海
69da168fc1 抽离json -> Response 对象的方法 2020-07-31 20:28:37 +08:00
禾几海
f375def613 active-profiles 2020-07-25 17:32:02 +08:00
禾几海
af43657b5b null值异常 2020-07-24 21:09:17 +08:00
禾几海
526b73b4f8 优化提示 2020-07-24 16:47:26 +08:00
禾几海
d9db98849a 调整测试基类 2020-07-23 23:32:42 +08:00
禾几海
6c3645ba15 增加获取已删除数据的选项 2020-07-23 23:08:03 +08:00
禾几海
43a5e2ab2f 抽离Mock请求的方法,过渡到jackson 2020-07-23 23:02:53 +08:00
禾几海
739256424f . 2020-07-18 16:48:04 +08:00
禾几海
3c839ad8ca 数据库建表语句和测试数据 2020-07-18 13:33:33 +08:00
禾几海
efbd5b3d72 删除逻辑 2020-07-18 13:32:50 +08:00
禾几海
5ba7e684fa 生成sitemap过滤文章 2020-07-18 12:32:42 +08:00
禾几海
f7c1726d51 添加deleted字段 2020-07-18 12:30:53 +08:00
禾几海
5504abe3e0 Other.java -> CommonController.java 2020-07-18 12:29:07 +08:00
禾几海
5aeec0cfe4 . 2020-07-11 14:14:36 +08:00
禾几海
e2fe41c2e0 换用knife4j,swaggerUI 2020-07-11 14:12:57 +08:00
禾几海
48f485b378 . 2020-07-11 10:52:24 +08:00
禾几海
6ee8fb65c3 ci 2020-07-11 10:52:13 +08:00
禾几海
2106bf4d94 pr 的ci测试 2020-05-27 18:11:27 +08:00
禾几海
72cef158a1 异常 2020-05-27 18:07:55 +08:00
禾几海
2ef9073650 调整评论的接口 2020-05-27 16:30:17 +08:00
禾几海
260ae53c8d 调整 2020-05-27 13:28:48 +08:00
禾几海
21adedea84 IDEA代码优化 2020-05-26 14:03:46 +08:00
禾几海
7d7a0fc82d 修改对象类型 2020-05-26 14:01:27 +08:00
禾几海
4770c37f4f 修改Response 2020-05-26 14:00:17 +08:00
禾几海
450978ecd9 修改Response 的date响应字段 2020-05-26 13:59:36 +08:00
禾几海
4035c7e024 更改sql文件 2020-05-26 12:56:57 +08:00
禾几海
7aebaaa98b . 2020-05-26 12:54:51 +08:00
禾几海
03cb04ab06 修复bug 2020-05-26 12:54:24 +08:00
禾几海
aa882406d0 Service,dao层,视图,模型修改 单元测试 2020-05-26 12:34:35 +08:00
禾几海
fde9b8511c Service层修改 单元测试 2020-05-26 00:27:50 +08:00
禾几海
9582725b3a 修改 单元测试 2020-05-26 00:16:09 +08:00
禾几海
2f27578bb0 dao层修改 2020-05-26 00:13:57 +08:00
禾几海
d3757c5880 dao层修改 2020-05-26 00:10:34 +08:00
禾几海
c39dac30fb Service层修改 单元测试 2020-05-26 00:10:09 +08:00
禾几海
73a1d3eadf Service层修改 单元测试 2020-05-25 23:04:41 +08:00
禾几海
4e383b6598 Service层修改 单元测试 2020-05-25 22:48:57 +08:00
禾几海
030aaaca25 Service层修改 单元测试 2020-05-25 22:44:18 +08:00
禾几海
d19e5b6286 Service层修改 单元测试 2020-05-25 22:18:50 +08:00
禾几海
c4ed6602e7 rename method 2020-05-25 22:06:13 +08:00
禾几海
ae7d063fdd Service层修改 单元测试 2020-05-25 22:05:46 +08:00
禾几海
67a1b1faf9 Service层修改 单元测试 2020-05-25 21:43:53 +08:00
禾几海
9e6868b638 dao层修改 单元测试 2020-05-25 14:48:05 +08:00
禾几海
9185ff8f58 dao层修改 单元测试 2020-05-25 13:50:11 +08:00
禾几海
190e1624ca dao层修改 单元测试 2020-05-25 00:20:36 +08:00
禾几海
86b6bae6e6 dao层修改 单元测试 2020-05-25 00:02:26 +08:00
禾几海
0adf936085 dao层修改 单元测试 2020-05-24 23:54:13 +08:00
禾几海
4f63f7b3d5 dao层修改 单元测试 2020-05-24 22:54:51 +08:00
禾几海
0136435a41 dao层修改 单元测试 2020-05-24 22:02:41 +08:00
禾几海
87de48b5a0 dao层修改 单元测试 2020-05-24 22:00:06 +08:00
禾几海
732bbe4444 修改sql 2020-05-24 19:22:38 +08:00
禾几海
9b6293fbeb 修改查询语句 2020-05-23 13:27:30 +08:00
禾几海
bc20173084 数据表改动 2020-05-23 00:16:08 +08:00
禾几海
59b7be00eb 添加密码修改的api 2020-05-19 19:53:38 +08:00
禾几海
2f6a9679da 修复跨域情况下前台获取不到Authorization响应字段 2020-05-18 08:30:50 +08:00
小海
5b8700930b 修改测试的接口地址 2020-04-23 17:57:05 +08:00
小海
18477706d1 添加github对应的url 2020-04-23 17:30:57 +08:00
小海
cd7e6b6378 修改接口名和响应内容 2020-04-23 16:34:04 +08:00
小海
d934fbe284 提取网络请求部分 2020-04-23 16:12:03 +08:00
小海
55589c6a59 修复响应码错误bug 2020-04-22 15:23:19 +08:00
小海
4ab402ccf8 更新readme 2020-04-17 13:27:21 +08:00
小海
c74aea6c3b 移除gitlab ci 2020-04-17 13:27:06 +08:00
小海
7c2b8d8d28 更新配置文件 2020-04-17 13:01:42 +08:00
小海
6798cae1b8 忘记添加环境变量 2020-04-17 12:41:19 +08:00
小海
ba7a02c5c0 Update mavenpublish.yml 2020-04-17 12:37:35 +08:00
小海
bd50cfc339 Update mavenpublish.yml 2020-04-17 12:13:51 +08:00
小海
e282e16fd3 update mavenpublish.yml 2020-04-17 11:56:43 +08:00
小海
18366b7aa4 Merge branch 'master' of https://github.com/xiaohai2271/blog-backEnd 2020-04-17 11:43:27 +08:00
小海
66dffbfefe 配置ci调整配置文件 2020-04-17 11:29:52 +08:00
小海
a7cd83a6b5 Update mavenpublish.yml 2020-04-17 11:11:12 +08:00
小海
0a5921b66d add github ci 2020-04-17 11:09:48 +08:00
小海
e04238f0c9 更新token 2020-04-16 23:26:41 +08:00
小海
09cb012b14 可能出现为空的情况 2020-04-16 23:25:49 +08:00
小海
922b83e169 修复小bug 2020-04-06 19:47:32 +08:00
小海
1cd6e0d7c9 修改部分api以及响应数据结构 2020-04-06 15:26:41 +08:00
小海
ec0b17151c 新增必应每日一图图片获取接口 2020-04-03 17:22:10 +08:00
小海
98430a34f6 修复一个小Bug 2020-03-29 14:17:29 +08:00
小海
23ee331609 修改响应码 2020-03-29 14:16:46 +08:00
小海
ebddbc0ecf 修改响应的Tag的articles字段类型 2020-03-29 14:16:17 +08:00
小海
8181fab48d 修改响应的Category的articles字段类型 2020-03-29 13:55:59 +08:00
小海
7ba287d261 更新Tag 2019-12-04 16:30:51 +08:00
小海
1745a5d821 Fix NullPointer Exception 2019-12-04 15:54:45 +08:00
小海
9a4a930426 用户访问情况记录 2019-12-04 15:28:01 +08:00
小海
a0eaddafec . 2019-12-04 15:25:50 +08:00
小海
450f308f1e 自动注入HttpServletRequest 2019-12-04 14:43:10 +08:00
小海
86bb5e1b13 . 2019-12-04 14:38:49 +08:00
小海
a4c2ec1272 修改JwtUtil的部分方法 2019-12-04 14:08:45 +08:00
小海
2945d091ee Update README.md 2019-12-04 12:08:03 +08:00
小海
900d84b15e Add Test coverage 2019-12-04 11:35:42 +08:00
小海
d9aac0fbd8 自动部署 2019-12-01 13:28:19 +08:00
小海
28aa7cf7e3 Add maven wrapper 2019-12-01 12:42:01 +08:00
小海
7972f4d473 . 2019-11-30 23:08:30 +08:00
小海
79ec6fcc91 Add CI status 2019-11-30 22:56:56 +08:00
小海
1f736dc9c9 修改获取测试资源的方式 2019-11-29 23:58:55 +08:00
小海
55ccff3451 关闭两个不稳定的测试 2019-11-29 23:26:53 +08:00
小海
a5811364c7 添加CI测试 2019-11-29 23:22:20 +08:00
小海
a77dc695f6 修复可能存在的异常 2019-11-29 23:21:32 +08:00
小海
753ea5c9a1 将私钥都分离放到配置文件中 2019-11-29 21:29:48 +08:00
小海
19e0697a01 . 2019-11-29 21:29:07 +08:00
128 changed files with 5266 additions and 3267 deletions

47
.github/workflows/deplay.yml vendored Normal file
View File

@@ -0,0 +1,47 @@
# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java#apache-maven-with-a-settings-path
name: Deplay
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
env:
APPLICATION_PROPERTIES_TEST: ${{ secrets.APPLICATION_PROPERTIES_TEST }}
APPLICATION_PROPERTIES_PROD: ${{ secrets.APPLICATION_PROPERTIES_PROD }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build jar file
run: echo $APPLICATION_PROPERTIES_PROD|base64 -d> src/main/resources/application-prod.properties && mvn -B package --file pom.xml
- name: SCP
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
password: ${{ secrets.SSH_PASSWORD }}
port: ${{ secrets.SSH_PORT }}
source: "target/blog-0.0.1-SNAPSHOT.jar"
target: "/www/wwwroot/api.celess.cn"
- name: Run SSH command
uses: garygrossgarten/github-action-ssh@v0.5.0
with:
command: cd /www/wwwroot/api.celess.cn && bash build.sh
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
password: ${{ secrets.SSH_PASSWORD }}
port: ${{ secrets.SSH_PORT }}

29
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java#apache-maven-with-a-settings-path
name: pr Test
on:
push:
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
env:
APPLICATION_PROPERTIES_TEST: ${{ secrets.APPLICATION_PROPERTIES_TEST }}
APPLICATION_PROPERTIES_PROD: ${{ secrets.APPLICATION_PROPERTIES_PROD }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Test
run: echo $APPLICATION_PROPERTIES_TEST|base64 -d > src/main/resources/application-test.properties && mvn -B test --file pom.xml

4
.gitignore vendored
View File

@@ -1,8 +1,10 @@
.idea/ .idea/
*.imi *.imi
*.iml
target/ target/
# 本地项目的私有文件 # 本地项目的私有文件
back-end/blog-dev.sql back-end/blog-dev.sql
src/main/resources/application-prod.properties
src/main/resources/application-dev.properties src/main/resources/application-dev.properties
src/main/resources/application-prod.properties
src/main/resources/application-test.properties

View File

@@ -1,38 +1,32 @@
/* /*
Licensed to the Apache Software Foundation (ASF) under one * Copyright 2012-2019 the original author or authors.
or more contributor license agreements. See the NOTICE file *
distributed with this work for additional information * Licensed under the Apache License, Version 2.0 (the "License");
regarding copyright ownership. The ASF licenses this file * you may not use this file except in compliance with the License.
to you under the Apache License, Version 2.0 (the * You may obtain a copy of the License at
"License"); you may not use this file except in compliance *
with the License. You may obtain a copy of the License at * https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
https://www.apache.org/licenses/LICENSE-2.0 import java.net.*;
import java.io.*;
Unless required by applicable law or agreed to in writing, import java.nio.channels.*;
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.Properties; import java.util.Properties;
public class MavenWrapperDownloader { public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.5";
/** /**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/ */
private static final String DEFAULT_DOWNLOAD_URL = private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
"https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/** /**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
@@ -80,13 +74,13 @@ public class MavenWrapperDownloader {
} }
} }
} }
System.out.println("- Downloading from: : " + url); System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if (!outputFile.getParentFile().exists()) { if (!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) { if (!outputFile.getParentFile().mkdirs()) {
System.out.println( System.out.println(
"- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
} }
} }
System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
@@ -102,6 +96,16 @@ public class MavenWrapperDownloader {
} }
private static void downloadFileFromURL(String urlString, File destination) throws Exception { private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString); URL website = new URL(urlString);
ReadableByteChannel rbc; ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream()); rbc = Channels.newChannel(website.openStream());

Binary file not shown.

View File

@@ -1 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.2/apache-maven-3.6.2-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar

View File

@@ -1,7 +1,5 @@
# 小海博客后端管理系统 # 小海博客后端管理系统
![Build Staus](https://github.com/xiaohai2271/blog-backEnd/workflows/Blog%20backEnd%20CI/badge.svg?branch=master&event=push) ![coverage report](https://gitlab.com/xiaohai2271/blog-backEnd/badges/master/coverage.svg) ![GitHub](https://img.shields.io/github/license/xiaohai2271/blog-backEnd) [![Website](https://img.shields.io/website?up_message=%E5%B0%8F%E6%B5%B7%E5%8D%9A%E5%AE%A2&url=https%3A%2F%2Fwww.celess.cn)](https://www.celess.cn)
## 基于Springboot的后端博客管理系统 ## 基于Springboot的后端博客管理系统

149
blog.iml
View File

@@ -1,149 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
<facet type="web" name="Web">
<configuration>
<webroots />
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.16" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.16" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.16" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.14.Final" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.5.RELEASE" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.15" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.3.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.1.3.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.3.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.11.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.23.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.9.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.5.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.1.5.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.6" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.10" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.10" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-core:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.6.1" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.6.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:18.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.0.0.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.6.1" level="project" />
<orderEntry type="library" name="Maven: com.youbenzi:MDTool:1.2.3" level="project" />
<orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: net.sf.json-lib:json-lib:jdk15:2.4" level="project" />
<orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.0" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.5" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
<orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" />
<orderEntry type="library" name="Maven: com.qiniu:qiniu-java-sdk:7.2.27" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.squareup.okhttp3:okhttp:3.14.4" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-mail:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.sun.mail:javax.mail:1.6.2" level="project" />
<orderEntry type="library" name="Maven: javax.activation:activation:1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.4.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.33.Final" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.1" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.1" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.12" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.12" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.10" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:2.0" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-core:1.0.8" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-api:1.0.8" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-runtime:1.0.8" level="project" />
<orderEntry type="library" name="Maven: com.dyuproject.protostuff:protostuff-collectionschema:1.0.8" level="project" />
<orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.20" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" />
</component>
</module>

204
blog.sql
View File

@@ -1,58 +1,86 @@
CREATE DATABASE `blog`; CREATE DATABASE if not exists `blog`;
USE blog; USE blog;
CREATE TABLE `user`
(
`u_id` int not null primary key auto_increment,
`u_email` varchar(50) not null,
`u_pwd` varchar(40) not null comment '密码',
`u_email_status` boolean default false comment '邮箱验证状态',
`u_avatar` varchar(255) default null comment '用户头像',
`u_desc` tinytext COLLATE utf8mb4_unicode_ci default null comment '用户的描述',
`u_recently_landed_time` datetime default null comment '最近的登录时间',
`u_display_name` varchar(30) COLLATE utf8mb4_unicode_ci default null comment '展示的昵称',
`u_role` varchar(40) not null default 'user' comment '权限组',
`status` tinyint(1) not null default 0 comment '账户状态',
unique key `uni_user_id` (`u_id`),
unique key `uni_user_email` (`u_email`)
) comment '用户表';
CREATE TABLE `tag_category`
(
`t_id` bigint(20) primary key auto_increment,
`t_name` varchar(255) not null,
`is_category` boolean not null default true,
`is_delete` boolean not null default false comment '该数据是否被删除'
) comment '标签和分类表';
CREATE TABLE `article` CREATE TABLE `article`
( (
`a_id` bigint(20) primary key auto_increment, `a_id` bigint(20) primary key auto_increment,
`a_title` varchar(255) not null unique comment '文章标题', `a_title` varchar(255) COLLATE utf8mb4_unicode_ci not null unique comment '文章标题',
`a_summary` varchar(255) not null comment '文章摘要', `a_summary` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '文章摘要',
`a_md_content` longtext not null comment '文章Markdown内容', `a_md_content` longtext COLLATE utf8mb4_unicode_ci not null comment '文章Markdown内容',
`a_tags_id` varchar(255) not null comment '标签id \',\'处于最尾端',
`a_category_id` bigint(20) not null comment '分类的id',
`a_url` tinytext default null comment '转载文章的原文链接', `a_url` tinytext default null comment '转载文章的原文链接',
`a_author_id` bigint(20) not null comment '作者id', `a_author_id` int not null comment '作者id',
`a_is_open` boolean default true comment '文章是否可见',
`a_is_original` boolean default true comment '文章是否原创', `a_is_original` boolean default true comment '文章是否原创',
`next_a_id` bigint(20) default -1 comment '下篇文章id',
`pre_a_id` bigint(20) default -1 comment '前一篇文章的id',
`a_reading_number` int default 0 comment '文章阅读数', `a_reading_number` int default 0 comment '文章阅读数',
`a_publish_date` datetime not null comment '文章发布时间', `a_like` int default 0 comment '文章点赞数',
`a_update_date` datetime default null comment '文章的更新时间' `a_dislike` int default 0 comment '文章不喜欢数',
) DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci,comment '文章'; `a_category_id` bigint not null comment '文章分类id',
`a_publish_date` datetime default CURRENT_TIMESTAMP comment '文章发布时间',
`a_update_date` datetime default null comment '文章的更新时间',
`a_is_open` boolean default true comment '文章是否可见',
`is_delete` boolean not null default false comment '该数据是否被删除',
foreign key (a_category_id) references tag_category (t_id),
foreign key (a_author_id) references user (u_id)
) DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_general_ci,comment '文章表';
CREATE TABLE `tag` CREATE TABLE `article_tag`
( (
`tag_id` bigint(20) primary key auto_increment, `at_id` bigint(20) primary key auto_increment,
`tag_name` varchar(255) unique not null, `a_id` bigint(20) not null comment '文章id',
`articles` tinytext default null comment 'tag对应的文章id' `t_id` bigint not null comment 'tag/category 的id',
) comment '标签表'; foreign key (a_id) references article (a_id),
foreign key (t_id) references tag_category (t_id)
CREATE table `category` ) comment '文章标签表';
(
`c_id` bigint(20) primary key auto_increment,
`c_name` varchar(255) unique not null,
`articles` varchar(255) comment '分类下的文章'
)comment '分类表';
CREATE TABLE `comment` CREATE TABLE `comment`
( (
`co_id` bigint(20) primary key auto_increment, `co_id` bigint(20) primary key auto_increment,
`co_article_id` bigint(20) default -1 comment '文章id', `co_page_path` varchar(255) not null comment '评论/留言的页面',
`is_comment` boolean default true comment '是否是评论', `co_content` text COLLATE utf8mb4_unicode_ci not null comment '评论/留言内容',
`author_id` bigint(20) not null comment '留言者id',
`co_content` text not null comment '评论/留言内容',
`co_date` datetime not null comment '评论/留言的日期', `co_date` datetime not null comment '评论/留言的日期',
`co_status` tinyint not null default 0 comment '评论的状态',
`co_pid` bigint not null default -1 comment '评论/留言的父id', `co_pid` bigint not null default -1 comment '评论/留言的父id',
`co_response_id` tinytext `co_from_author_id` int not null comment '留言者id',
) DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci,comment '评论/留言表'; `co_to_author_id` int default null comment '评论的作者id'
) DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_general_ci,comment '评论/留言表';
CREATE TABLE `links` CREATE TABLE `links`
( (
`site_id` bigint(20) primary key auto_increment, `l_id` bigint(20) primary key auto_increment,
`site_name` varchar(255) not null comment '友站名称', `l_name` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '友站名称',
`is_open` boolean default true comment '是否公开', `l_is_open` boolean default true comment '是否公开',
`site_url` varchar(255) not null comment '首页地址' `l_url` varchar(255) unique not null comment '首页地址',
`l_icon_path` varchar(255) not null comment '友链的icon地址',
`l_desc` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '友链的说明描述',
`is_delete` boolean not null default false comment '该数据是否被删除',
`l_email` varchar(255) comment '网站管理员的邮箱',
`l_notification` boolean default false comment '是否通知了'
) comment '友站表'; ) comment '友站表';
CREATE TABLE `visitor` CREATE TABLE `visitor`
@@ -60,33 +88,91 @@ CREATE TABLE `visitor`
`v_id` bigint(20) primary key auto_increment, `v_id` bigint(20) primary key auto_increment,
`v_date` datetime not null comment '访问时间', `v_date` datetime not null comment '访问时间',
`v_ip` varchar(255) not null comment '访客ip', `v_ip` varchar(255) not null comment '访客ip',
`v_user_agent` text comment '访客ua' `v_user_agent` text comment '访客ua',
`is_delete` boolean not null default false comment '该数据是否被删除'
) comment '访客表'; ) comment '访客表';
CREATE TABLE `web_update`
CREATE TABLE IF NOT EXISTS `web_update`
( (
`update_id` bigint(20) primary key auto_increment, `wu_id` int primary key auto_increment,
`update_info` varchar(255) not null comment '更新内容', `wu_info` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '更新内容',
`update_time` datetime not null comment '更新时间' `wu_time` datetime not null comment '更新时间',
`is_delete` boolean not null default false comment '该数据是否被删除'
) comment '更新内容表'; ) comment '更新内容表';
create table `user` CREATE VIEW articleView
( (articleId, title, summary, mdContent, url, isOriginal, readingCount, likeCount, dislikeCount,
`u_id` int not null primary key auto_increment, publishDate, updateDate, isOpen,
`u_email` varchar(50) not null, categoryId, categoryName, tagId, tagName,
`u_uid` varchar(40) default null comment '用户唯一标识码', authorId, userEmail, userAvatar, userDisplayName, isDelete)
`u_pwd` varchar(40) not null comment '密码', as
`email_status` boolean default false comment '邮箱验证状态', select article.a_id as articleId,
`u_avatar` varchar(255) comment '用户头像', article.a_title as title,
`u_desc` tinytext comment '用户的描述', article.a_summary as summary,
`recently_landed_time` datetime comment '最近的登录时间', article.a_md_content as mdContent,
`email_verify_id` varchar(40) comment '用于找回密码或验证邮箱的id', article.a_url as url,
`display_name` varchar(30) comment '展示的昵称', article.a_is_original as isOriginal,
`role` varchar(40) not null default 'user' comment '权限组', article.a_reading_number as readingCount,
unique key `uni_user_id` (`u_id`), article.a_like as likeCount,
unique key `uni_user_uid` (`u_uid`), article.a_dislike as dislikeCount,
unique key `uni_user_email` (`u_email`) article.a_publish_date as publishDate,
) comment '用户表'; article.a_update_date as updateDate,
article.a_is_open as isOpen,
category.t_id as categoryId,
category.t_name as categoryName,
tag.t_id as tagId,
tag.t_name as tagName,
user.u_id as authorId,
user.u_email as userEmail,
user.u_avatar as userAvatar,
user.u_display_name as userDisplayName,
article.is_delete as isDelete
from article,
tag_category as tag,
tag_category as category,
article_tag,
user
where article.a_id = article_tag.a_id
and article_tag.t_id = tag.t_id
and tag.is_category = false
and article.a_category_id = category.t_id
and category.is_category = true
and article.a_author_id = user.u_id;
CREATE VIEW commentView
(commentId, pagePath, content, date, status, pid, toAuthorId, toAuthorEmail, toAuthorDisplayName,
toAuthorAvatar, fromAuthorId, fromAuthorEmail, fromAuthorDisplayName,
fromAuthorAvatar)
as
select cuT.co_id as commentId,
cuT.co_page_path as pagePath,
cuT.co_content as content,
cuT.co_date as date,
cuT.co_status as status,
cuT.co_pid as pid,
cuT.co_to_author_id as toAuthorId,
cuT.toEmail as toAuthorEmail,
cuT.toDisplayName as toAuthorDisplayName,
cuT.toAvatar as toAuthorAvatar,
userFrom.u_id as fromAuthorId,
userFrom.u_email as fromAuthorEmail,
userFrom.u_display_name as fromAuthorDisplayName,
userFrom.u_avatar as fromAuthorAvatar
from (select comment.co_id,
comment.co_page_path,
comment.co_content,
comment.co_date,
comment.co_status,
comment.co_pid,
comment.co_from_author_id,
comment.co_to_author_id,
userTo.u_email as toEmail,
userTo.u_display_name as toDisplayName,
userTo.u_avatar as toAvatar
from comment
left join user userTo on (comment.co_to_author_id = userTo.u_id)
) as cuT,
user as userFrom
where cuT.co_from_author_id = userFrom.u_id;

8
build.sh Normal file
View File

@@ -0,0 +1,8 @@
#!/bin/sh
echo "查询已存在进程"
pgrep -af blog-0.0.1-SNAPSHOT.jar
echo "结束已存在进程"
pkill -f blog-0.0.1-SNAPSHOT.jar
echo "开始运行小海博客"
nohup java -jar -Dfile.encoding=UTF-8 blog-0.0.1-SNAPSHOT.jar >blog.log &
echo "更新结束"

204
dev.sql Normal file

File diff suppressed because one or more lines are too long

164
mvnw vendored
View File

@@ -34,31 +34,32 @@
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files # MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then if [ -z "$MAVEN_SKIP_RC" ]; then
if [ -f /etc/mavenrc ] ; then if [ -f /etc/mavenrc ]; then
. /etc/mavenrc . /etc/mavenrc
fi fi
if [ -f "$HOME/.mavenrc" ] ; then if [ -f "$HOME/.mavenrc" ]; then
. "$HOME/.mavenrc" . "$HOME/.mavenrc"
fi fi
fi fi
# OS specific support. $var _must_ be set to either true or false. # OS specific support. $var _must_ be set to either true or false.
cygwin=false; cygwin=false
darwin=false; darwin=false
mingw=false mingw=false
case "`uname`" in case "$(uname)" in
CYGWIN*) cygwin=true ;; CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;; MINGW*) mingw=true ;;
Darwin*) darwin=true Darwin*)
darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`" export JAVA_HOME="$(/usr/libexec/java_home)"
else else
export JAVA_HOME="/Library/Java/Home" export JAVA_HOME="/Library/Java/Home"
fi fi
@@ -66,97 +67,102 @@ case "`uname`" in
;; ;;
esac esac
if [ -z "$JAVA_HOME" ] ; then if [ -z "$JAVA_HOME" ]; then
if [ -r /etc/gentoo-release ] ; then if [ -r /etc/gentoo-release ]; then
JAVA_HOME=`java-config --jre-home` JAVA_HOME=$(java-config --jre-home)
fi fi
fi fi
if [ -z "$M2_HOME" ] ; then if [ -z "$M2_HOME" ]; then
## resolve links - $0 may be a link to maven's home ## resolve links - $0 may be a link to maven's home
PRG="$0" PRG="$0"
# need this for relative symlinks # need this for relative symlinks
while [ -h "$PRG" ] ; do while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"` ls=$(ls -ld "$PRG")
link=`expr "$ls" : '.*-> \(.*\)$'` link=$(expr "$ls" : '.*-> \(.*\)$')
if expr "$link" : '/.*' > /dev/null; then if expr "$link" : '/.*' >/dev/null; then
PRG="$link" PRG="$link"
else else
PRG="`dirname "$PRG"`/$link" PRG="$(dirname "$PRG")/$link"
fi fi
done done
saveddir=`pwd` saveddir=$(pwd)
M2_HOME=`dirname "$PRG"`/.. M2_HOME=$(dirname "$PRG")/..
# make it fully qualified # make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd` M2_HOME=$(cd "$M2_HOME" && pwd)
cd "$saveddir" cd "$saveddir"
# echo Using m2 at $M2_HOME # echo Using m2 at $M2_HOME
fi fi
# For Cygwin, ensure paths are in UNIX format before anything is touched # For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then if $cygwin; then
[ -n "$M2_HOME" ] && [ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"` M2_HOME=$(cygpath --unix "$M2_HOME")
[ -n "$JAVA_HOME" ] && [ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"` JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
[ -n "$CLASSPATH" ] && [ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"` CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
fi fi
# For Mingw, ensure paths are in UNIX format before anything is touched # For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then if $mingw; then
[ -n "$M2_HOME" ] && [ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`" M2_HOME="$( (
cd "$M2_HOME"
pwd
))"
[ -n "$JAVA_HOME" ] && [ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" JAVA_HOME="$( (
# TODO classpath? cd "$JAVA_HOME"
pwd
))"
fi fi
if [ -z "$JAVA_HOME" ]; then if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`" javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10. # readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink` readLink=$(which readlink)
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then
if $darwin ; then if $darwin; then
javaHome="`dirname \"$javaExecutable\"`" javaHome="$(dirname \"$javaExecutable\")"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac"
else else
javaExecutable="`readlink -f \"$javaExecutable\"`" javaExecutable="$(readlink -f \"$javaExecutable\")"
fi fi
javaHome="`dirname \"$javaExecutable\"`" javaHome="$(dirname \"$javaExecutable\")"
javaHome=`expr "$javaHome" : '\(.*\)/bin'` javaHome=$(expr "$javaHome" : '\(.*\)/bin')
JAVA_HOME="$javaHome" JAVA_HOME="$javaHome"
export JAVA_HOME export JAVA_HOME
fi fi
fi fi
fi fi
if [ -z "$JAVACMD" ] ; then if [ -z "$JAVACMD" ]; then
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ]; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java" JAVACMD="$JAVA_HOME/jre/sh/java"
else else
JAVACMD="$JAVA_HOME/bin/java" JAVACMD="$JAVA_HOME/bin/java"
fi fi
else else
JAVACMD="`which java`" JAVACMD="$(which java)"
fi fi
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ]; then
echo "Error: JAVA_HOME is not defined correctly." >&2 echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2 echo " We cannot execute $JAVACMD" >&2
exit 1 exit 1
fi fi
if [ -z "$JAVA_HOME" ] ; then if [ -z "$JAVA_HOME" ]; then
echo "Warning: JAVA_HOME environment variable is not set." echo "Warning: JAVA_HOME environment variable is not set."
fi fi
@@ -166,22 +172,24 @@ CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# first directory with .mvn subdirectory is considered project base directory # first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() { find_maven_basedir() {
if [ -z "$1" ] if [ -z "$1" ]; then
then
echo "Path not specified to find_maven_basedir" echo "Path not specified to find_maven_basedir"
return 1 return 1
fi fi
basedir="$1" basedir="$1"
wdir="$1" wdir="$1"
while [ "$wdir" != '/' ] ; do while [ "$wdir" != '/' ]; do
if [ -d "$wdir"/.mvn ] ; then if [ -d "$wdir"/.mvn ]; then
basedir=$wdir basedir=$wdir
break break
fi fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc) # workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd` wdir=$(
cd "$wdir/.."
pwd
)
fi fi
# end of workaround # end of workaround
done done
@@ -191,13 +199,13 @@ find_maven_basedir() {
# concatenates all lines of a file # concatenates all lines of a file
concat_lines() { concat_lines() {
if [ -f "$1" ]; then if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")" echo "$(tr -s '\n' ' ' <"$1")"
fi fi
} }
BASE_DIR=`find_maven_basedir "$(pwd)"` BASE_DIR=$(find_maven_basedir "$(pwd)")
if [ -z "$BASE_DIR" ]; then if [ -z "$BASE_DIR" ]; then
exit 1; exit 1
fi fi
########################################################################################## ##########################################################################################
@@ -212,31 +220,54 @@ else
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi fi
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
fi
while IFS="=" read key value; do while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;; case "$key" in wrapperUrl)
jarUrl="$value"
break
;;
esac esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" done <"$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl" echo "Downloading from: $jarUrl"
fi fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget > /dev/null; then if command -v wget >/dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget" echo "Found wget ... using wget"
fi fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath" wget "$jarUrl" -O "$wrapperJarPath"
elif command -v curl > /dev/null; then else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi
elif command -v curl >/dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl" echo "Found curl ... using curl"
fi fi
curl -o "$wrapperJarPath" "$jarUrl" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else else
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download" echo "Falling back to using Java to download"
fi fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=$(cygpath --path --windows "$javaClass")
fi
if [ -e "$javaClass" ]; then if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then if [ "$MVNW_VERBOSE" = true ]; then
@@ -268,15 +299,20 @@ MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java # For Cygwin, switch paths to Windows format before running java
if $cygwin; then if $cygwin; then
[ -n "$M2_HOME" ] && [ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"` M2_HOME=$(cygpath --path --windows "$M2_HOME")
[ -n "$JAVA_HOME" ] && [ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
[ -n "$CLASSPATH" ] && [ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"` CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
[ -n "$MAVEN_PROJECTBASEDIR" ] && [ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
fi fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \ exec "$JAVACMD" \

29
mvnw.cmd vendored
View File

@@ -37,7 +37,7 @@
@echo off @echo off
@REM set title of command window @REM set title of command window
title %0 title %0
@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME @REM set %HOME% to equivalent of $HOME
@@ -120,23 +120,44 @@ SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
) )
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data. @REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% ( if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR% echo Found %WRAPPER_JAR%
)
) else ( ) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ... echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL% echo Downloading from: %DOWNLOAD_URL%
powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" )
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR% echo Finished downloading %WRAPPER_JAR%
)
) )
@REM End of extension @REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error if ERRORLEVEL 1 goto error
goto end goto end

65
pom.xml
View File

@@ -55,12 +55,12 @@
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId> <artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version> <version>2.9.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>com.github.xiaoymin</groupId>
<artifactId>springfox-swagger-ui</artifactId> <artifactId>swagger-bootstrap-ui</artifactId>
<version>2.6.1</version> <version>1.9.6</version>
</dependency> </dependency>
<!--MarkDown 2 html --> <!--MarkDown 2 html -->
@@ -148,6 +148,29 @@
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
<version>0.9.1</version> <version>0.9.1</version>
</dependency> </dependency>
<!-- OkHttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.3.72</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.42.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
@@ -156,6 +179,40 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
</plugin> </plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<executions>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.3.72</version>
<executions>
<execution>
<id>compile</id>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins> </plugins>
</build> </build>

View File

@@ -1,5 +1,6 @@
package cn.celess.blog.configuration; package cn.celess.blog.configuration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfiguration;
@@ -13,6 +14,9 @@ import org.springframework.web.filter.CorsFilter;
*/ */
@Configuration @Configuration
public class CorsConfig { public class CorsConfig {
@Value("${spring.profiles.active}")
private String activeModel;
@Bean @Bean
public CorsFilter corsFilter() { public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
@@ -22,14 +26,17 @@ public class CorsConfig {
config.addAllowedOrigin("https://celess.cn"); config.addAllowedOrigin("https://celess.cn");
config.addAllowedOrigin("https://www.celess.cn"); config.addAllowedOrigin("https://www.celess.cn");
// 本地调试时的跨域 // 本地调试时的跨域
if (!"prod".equals(activeModel)) {
config.addAllowedOrigin("http://localhost:4200"); config.addAllowedOrigin("http://localhost:4200");
config.addAllowedOrigin("http://127.0.0.1:4200"); config.addAllowedOrigin("http://127.0.0.1:4200");
}
config.addAllowedHeader("*"); config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET"); config.addAllowedMethod("GET");
config.addAllowedMethod("POST"); config.addAllowedMethod("POST");
config.addAllowedMethod("PUT"); config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE"); config.addAllowedMethod("DELETE");
config.addExposedHeader("Authorization");
config.setAllowCredentials(true); config.setAllowCredentials(true);
config.setMaxAge(10800L); config.setMaxAge(10800L);
source.registerCorsConfiguration("/**", config); source.registerCorsConfiguration("/**", config);

View File

@@ -19,11 +19,9 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
public class InterceptorConfig implements WebMvcConfigurer { public class InterceptorConfig implements WebMvcConfigurer {
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MultipleSubmitFilter()).addPathPatterns("/*"); registry.addInterceptor(new MultipleSubmitFilter()).addPathPatterns("/**");
registry.addInterceptor(new VisitorRecord()).addPathPatterns("/**");
registry.addInterceptor(authenticationFilter()).addPathPatterns("/**"); registry.addInterceptor(authenticationFilter()).addPathPatterns("/**");
// visitor 输出信息杂乱 暂时放弃使用
// registry.addInterceptor(new VisitorRecord()).addPathPatterns("/*");
} }
@Bean @Bean
@@ -31,11 +29,11 @@ public class InterceptorConfig implements WebMvcConfigurer {
return new AuthenticationFilter(); return new AuthenticationFilter();
} }
// // session listener register bean @Bean
// @Bean public ServletListenerRegistrationBean<SessionListener> servletListenerRegistrationBean() {
// public ServletListenerRegistrationBean<SessionListener> servletListenerRegistrationBean() { // session listener register bean
// ServletListenerRegistrationBean<SessionListener> slrBean = new ServletListenerRegistrationBean<SessionListener>(); ServletListenerRegistrationBean<SessionListener> slrBean = new ServletListenerRegistrationBean<SessionListener>();
// slrBean.setListener(new SessionListener()); slrBean.setListener(new SessionListener());
// return slrBean; return slrBean;
// } }
} }

View File

@@ -7,6 +7,7 @@ import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.swagger2.annotations.EnableSwagger2;
@@ -25,7 +26,7 @@ public class SwaggerConfig {
@Bean @Bean
public Docket createRestApi() { public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2) return new Docket(DocumentationType.SWAGGER_2)
.enable("dev".equals(environment)) .enable(!"prod".equals(environment))
.apiInfo(apiInfo()) .apiInfo(apiInfo())
.select() .select()
.apis(RequestHandlerSelectors.basePackage("cn.celess.blog")) .apis(RequestHandlerSelectors.basePackage("cn.celess.blog"))
@@ -37,7 +38,7 @@ public class SwaggerConfig {
return new ApiInfoBuilder() return new ApiInfoBuilder()
.title("小海博客的APi") .title("小海博客的APi")
.description("小海博客的APi") .description("小海博客的APi")
.contact("小海") .contact(new Contact("小海", "https://www.celess.cn", "a@celess.cn"))
.version("1.0") .version("1.0")
.build(); .build();
} }

View File

@@ -1,10 +1,10 @@
package cn.celess.blog.configuration.filter; package cn.celess.blog.configuration.filter;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Response;
import cn.celess.blog.service.UserService; import cn.celess.blog.service.UserService;
import cn.celess.blog.util.JwtUtil; import cn.celess.blog.util.JwtUtil;
import cn.celess.blog.util.RedisUtil; import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.ResponseUtil;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -21,6 +21,11 @@ import java.io.IOException;
* @Description: 鉴权拦截器 * @Description: 鉴权拦截器
*/ */
public class AuthenticationFilter implements HandlerInterceptor { public class AuthenticationFilter implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);
private static final String USER_PREFIX = "/user";
private static final String ADMIN_PREFIX = "/admin";
private static final String ROLE_ADMIN = "admin";
private static final String ROLE_USER = "user";
@Autowired @Autowired
JwtUtil jwtUtil; JwtUtil jwtUtil;
@Autowired @Autowired
@@ -28,25 +33,22 @@ public class AuthenticationFilter implements HandlerInterceptor {
@Autowired @Autowired
UserService userService; UserService userService;
private static final Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);
private static final String USER_PREFIX = "/user";
private static final String ADMIN_PREFIX = "/admin";
private static final String ROLE_ADMIN = "admin";
private static final String ROLE_USER = "user";
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String path = request.getRequestURI(); String path = request.getRequestURI();
path = path.replaceAll("/+", "/"); path = path.replaceAll("/+", "/");
int indexOf = path.indexOf("/", 1); int indexOf = path.indexOf("/", 1);
String rootPath = indexOf == -1 ? path : path.substring(0, indexOf); String rootPath = indexOf == -1 ? path : path.substring(0, indexOf);
String jwtStr = request.getHeader("Authorization");
if (jwtStr != null && !jwtStr.isEmpty() && !jwtUtil.isTokenExpired(jwtStr)) {
// 已登录 记录当前email
request.getSession().setAttribute("email", jwtUtil.getUsernameFromToken(jwtStr));
}
// 不需要鉴权的路径 // 不需要鉴权的路径
if (!USER_PREFIX.equals(rootPath.toLowerCase()) && !ADMIN_PREFIX.equals(rootPath.toLowerCase())) { if (!USER_PREFIX.equals(rootPath.toLowerCase()) && !ADMIN_PREFIX.equals(rootPath.toLowerCase())) {
return true; return true;
} }
String jwtStr = request.getHeader("Authorization");
if (jwtStr == null || jwtStr.isEmpty()) { if (jwtStr == null || jwtStr.isEmpty()) {
return writeResponse(ResponseEnum.HAVE_NOT_LOG_IN, response, request); return writeResponse(ResponseEnum.HAVE_NOT_LOG_IN, response, request);
} }
@@ -54,11 +56,19 @@ public class AuthenticationFilter implements HandlerInterceptor {
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request); return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
} }
String email = jwtUtil.getUsernameFromToken(jwtStr); String email = jwtUtil.getUsernameFromToken(jwtStr);
if (!redisUtil.hasKey(email + "-login") || jwtUtil.isTokenExpired(jwtStr)) { if (jwtUtil.isTokenExpired(jwtStr)) {
// 登陆过期 // 登陆过期
return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request); return writeResponse(ResponseEnum.LOGIN_EXPIRED, response, request);
} }
if (!redisUtil.hasKey(email + "-login")) {
return writeResponse(ResponseEnum.LOGOUT, response, request);
}
String role = userService.getUserRoleByEmail(email); String role = userService.getUserRoleByEmail(email);
if (role.equals(ROLE_USER) || role.equals(ROLE_ADMIN)) {
// 更新token
String token = jwtUtil.updateTokenDate(jwtStr);
response.setHeader("Authorization", token);
}
if (role.equals(ROLE_ADMIN)) { if (role.equals(ROLE_ADMIN)) {
// admin // admin
return true; return true;
@@ -74,7 +84,7 @@ public class AuthenticationFilter implements HandlerInterceptor {
response.setHeader("Content-Type", "application/json;charset=UTF-8"); response.setHeader("Content-Type", "application/json;charset=UTF-8");
try { try {
logger.info("鉴权失败,[code:{},msg:{},path:{}]", e.getCode(), e.getMsg(), request.getRequestURI() + "?" + request.getQueryString()); logger.info("鉴权失败,[code:{},msg:{},path:{}]", e.getCode(), e.getMsg(), request.getRequestURI() + "?" + request.getQueryString());
response.getWriter().println(JSONObject.fromObject(ResponseUtil.response(e, null))); response.getWriter().println(JSONObject.fromObject(Response.response(e, null)));
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }

View File

@@ -28,7 +28,7 @@ public class MultipleSubmitFilter implements HandlerInterceptor {
// 请求参数和路径均相同 且请求时间间隔小于 WAIT_TIME // 请求参数和路径均相同 且请求时间间隔小于 WAIT_TIME
response.setContentType("application/json"); response.setContentType("application/json");
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
Response result = new Response(ResponseEnum.FAILURE.getCode(), "重复请求", null, System.currentTimeMillis()); Response result = new Response(ResponseEnum.FAILURE.getCode(), "重复请求", null);
response.getWriter().println(result.toString()); response.getWriter().println(result.toString());
return false; return false;
} }

View File

@@ -21,14 +21,18 @@ public class VisitorRecord implements HandlerInterceptor {
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession(); HttpSession session = request.getSession();
HashMap<String, Integer> visitDetail = (HashMap<String, Integer>) session.getAttribute("visitDetail"); HashMap<String, Integer> visitDetail = (HashMap<String, Integer>) session.getAttribute("visitDetail");
if (visitDetail == null) {
return true;
}
// 获取访问次数 // 获取访问次数
Integer count = visitDetail.get(RequestUtil.getCompleteUrlAndMethod(request)); Integer count = visitDetail.get(RequestUtil.getCompleteUrlAndMethod(request));
// 自增 // 自增
count = count == null ? 1 : ++count; count = count == null ? 1 : ++count;
// 更新 // 更新
visitDetail.put(RequestUtil.getCompleteUrlAndMethod(request), count); visitDetail.put(RequestUtil.getCompleteUrlAndMethod(request), count);
session.setAttribute("ip",request.getRemoteAddr()); session.setAttribute("ip", request.getRemoteAddr());
return true; return true;
} }
} }

View File

@@ -1,9 +1,7 @@
package cn.celess.blog.configuration.listener; package cn.celess.blog.configuration.listener;
import cn.celess.blog.entity.User;
import cn.celess.blog.util.RedisUserUtil; import cn.celess.blog.util.RedisUserUtil;
import org.slf4j.Logger; import lombok.extern.log4j.Log4j2;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.annotation.WebListener; import javax.servlet.annotation.WebListener;
@@ -17,20 +15,21 @@ import java.util.HashMap;
* @Date: 2019/10/18 15:33 * @Date: 2019/10/18 15:33
* @Description: 监听session的情况 * @Description: 监听session的情况
*/ */
@Log4j2
@WebListener @WebListener
public class SessionListener implements HttpSessionListener { public class SessionListener implements HttpSessionListener {
@Autowired @Autowired
RedisUserUtil redisUserUtil; RedisUserUtil redisUserUtil;
@Autowired @Autowired
HttpServletRequest request; HttpServletRequest request;
private static final Logger logger = LoggerFactory.getLogger(SessionListener.class);
@Override @Override
public void sessionCreated(HttpSessionEvent se) { public void sessionCreated(HttpSessionEvent se) {
// TODO : can move 'visit' api to here // TODO : can move 'visit' api to here
se.getSession().setAttribute("visitDetail", new HashMap<String, Integer>()); se.getSession().setAttribute("visitDetail", new HashMap<String, Integer>());
// se.getSession().setMaxInactiveInterval(10);// 10s for debug // 10s for debug
logger.info("新增一个Session[{}]", se.getSession().getId()); // se.getSession().setMaxInactiveInterval(10);
// log.info("新增一个Session[{}]", se.getSession().getId());
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -39,12 +38,15 @@ public class SessionListener implements HttpSessionListener {
HashMap<String, Integer> visitDetail = (HashMap<String, Integer>) se.getSession().getAttribute("visitDetail"); HashMap<String, Integer> visitDetail = (HashMap<String, Integer>) se.getSession().getAttribute("visitDetail");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("ip => ").append(se.getSession().getAttribute("ip")); sb.append("ip => ").append(se.getSession().getAttribute("ip"));
User user = redisUserUtil.get(request); if (visitDetail.size() == 0) {
return;
}
sb.append("\t登录情况 => "); sb.append("\t登录情况 => ");
sb.append(user == null ? "游客访问" : user.getEmail()); String email = (String) se.getSession().getAttribute("email");
sb.append(email == null ? "游客访问" : email);
visitDetail.forEach((s, integer) -> { visitDetail.forEach((s, integer) -> {
sb.append("\n").append("Method:[").append(s.split(":")[1]).append("]\tTimes:[").append(integer).append("]\tPath:[").append(s.split(":")[0]).append("]"); sb.append("\n").append("Method:[").append(s.split(":")[1]).append("]\tTimes:[").append(integer).append("]\tPath:[").append(s.split(":")[0]).append("]");
}); });
logger.info(sb.toString()); log.info(sb.toString());
} }
} }

View File

@@ -3,15 +3,17 @@ package cn.celess.blog.controller;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.model.ArticleModel; import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.ArticleReq; import cn.celess.blog.entity.request.ArticleReq;
import cn.celess.blog.service.ArticleService; import cn.celess.blog.service.ArticleService;
import cn.celess.blog.util.RedisUserUtil; import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.ResponseUtil;
import cn.celess.blog.util.SitemapGenerateUtil; import cn.celess.blog.util.SitemapGenerateUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -36,7 +38,7 @@ public class ArticleController {
public Response create(@RequestBody ArticleReq body) { public Response create(@RequestBody ArticleReq body) {
ArticleModel articleModel = articleService.create(body); ArticleModel articleModel = articleService.create(body);
sitemapGenerateUtil.createSitemap(); sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(articleModel); return Response.success(articleModel);
} }
/** /**
@@ -49,7 +51,7 @@ public class ArticleController {
public Response delete(@RequestParam("articleID") long articleId) { public Response delete(@RequestParam("articleID") long articleId) {
boolean delete = articleService.delete(articleId); boolean delete = articleService.delete(articleId);
sitemapGenerateUtil.createSitemap(); sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(delete); return Response.success(delete);
} }
/** /**
@@ -62,7 +64,7 @@ public class ArticleController {
public Response update(@RequestBody ArticleReq body) { public Response update(@RequestBody ArticleReq body) {
ArticleModel update = articleService.update(body); ArticleModel update = articleService.update(body);
sitemapGenerateUtil.createSitemap(); sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(update); return Response.success(update);
} }
/** /**
@@ -80,13 +82,13 @@ public class ArticleController {
public Response retrieveOneById(@PathVariable("articleID") long articleId, public Response retrieveOneById(@PathVariable("articleID") long articleId,
@RequestParam(value = "update", defaultValue = "false") boolean is4update, @RequestParam(value = "update", defaultValue = "false") boolean is4update,
HttpServletRequest request) { HttpServletRequest request) {
ArticleModel article = articleService.retrieveOneByID(articleId, is4update); ArticleModel article = articleService.retrieveOneById(articleId, is4update);
if (article.getOpen()) { if (article.getOpen()) {
return ResponseUtil.success(article); return Response.success(article);
} else if (article.getAuthorId().equals(redisUserUtil.get(request).getId())) { } else if (article.getAuthor().getId().equals(redisUserUtil.get().getId())) {
return ResponseUtil.success(article); return Response.success(article);
} }
return ResponseUtil.response(ResponseEnum.PERMISSION_ERROR, null); return Response.response(ResponseEnum.PERMISSION_ERROR, null);
} }
/** /**
@@ -99,7 +101,7 @@ public class ArticleController {
@GetMapping("/articles") @GetMapping("/articles")
public Response articles(@RequestParam(name = "page", defaultValue = "1") int page, public Response articles(@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "5") int count) { @RequestParam(name = "count", defaultValue = "5") int count) {
return ResponseUtil.success(articleService.retrievePageForOpen(count, page)); return Response.success(articleService.retrievePageForOpen(count, page));
} }
/** /**
@@ -111,8 +113,9 @@ public class ArticleController {
*/ */
@GetMapping("/admin/articles") @GetMapping("/admin/articles")
public Response adminArticles(@RequestParam(name = "page", defaultValue = "1") int page, public Response adminArticles(@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "10") int count) { @RequestParam(name = "count", defaultValue = "10") int count,
return ResponseUtil.success(articleService.adminArticles(count, page)); @RequestParam(name = "deleted", defaultValue = "false") boolean deleted) {
return Response.success(articleService.adminArticles(count, page, deleted));
} }
/** /**
@@ -127,7 +130,7 @@ public class ArticleController {
public Response findByCategory(@PathVariable("name") String name, public Response findByCategory(@PathVariable("name") String name,
@RequestParam(name = "page", defaultValue = "1") int page, @RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "10") int count) { @RequestParam(name = "count", defaultValue = "10") int count) {
return ResponseUtil.success(articleService.findByCategory(name, page, count)); return Response.success(articleService.findByCategory(name, page, count));
} }
/** /**
@@ -142,13 +145,13 @@ public class ArticleController {
public Response findByTag(@PathVariable("name") String name, public Response findByTag(@PathVariable("name") String name,
@RequestParam(name = "page", defaultValue = "1") int page, @RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam(name = "count", defaultValue = "10") int count) { @RequestParam(name = "count", defaultValue = "10") int count) {
return ResponseUtil.success(articleService.findByTag(name, page, count)); return Response.success(articleService.findByTag(name, page, count));
} }
@GetMapping("/createSitemap") @GetMapping("/createSitemap")
public Response createSitemap() { public Response createSitemap() {
sitemapGenerateUtil.createSitemap(); sitemapGenerateUtil.createSitemap();
return ResponseUtil.success(null); return Response.success(null);
} }
} }

View File

@@ -2,7 +2,6 @@ package cn.celess.blog.controller;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.service.CategoryService; import cn.celess.blog.service.CategoryService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -24,7 +23,7 @@ public class CategoryController {
*/ */
@PostMapping("/admin/category/create") @PostMapping("/admin/category/create")
public Response addOne(@RequestParam("name") String name) { public Response addOne(@RequestParam("name") String name) {
return ResponseUtil.success(categoryService.create(name)); return Response.success(categoryService.create(name));
} }
/** /**
@@ -35,7 +34,7 @@ public class CategoryController {
*/ */
@DeleteMapping("/admin/category/del") @DeleteMapping("/admin/category/del")
public Response deleteOne(@RequestParam("id") long id) { public Response deleteOne(@RequestParam("id") long id) {
return ResponseUtil.success(categoryService.delete(id)); return Response.success(categoryService.delete(id));
} }
/** /**
@@ -48,7 +47,7 @@ public class CategoryController {
@PutMapping("/admin/category/update") @PutMapping("/admin/category/update")
public Response updateOne(@RequestParam("id") Long id, public Response updateOne(@RequestParam("id") Long id,
@RequestParam("name") String name) { @RequestParam("name") String name) {
return ResponseUtil.success(categoryService.update(id, name)); return Response.success(categoryService.update(id, name));
} }
/** /**
@@ -57,7 +56,8 @@ public class CategoryController {
* @return Response * @return Response
*/ */
@GetMapping("/categories") @GetMapping("/categories")
public Response getPage() { public Response getPage(@RequestParam(name = "page", defaultValue = "1") int page,
return ResponseUtil.success(categoryService.retrievePage()); @RequestParam(name = "count", defaultValue = "1000") int count) {
return Response.success(categoryService.retrievePage(page, count));
} }
} }

View File

@@ -1,10 +1,8 @@
package cn.celess.blog.controller; package cn.celess.blog.controller;
import cn.celess.blog.entity.Comment;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.request.CommentReq; import cn.celess.blog.entity.request.CommentReq;
import cn.celess.blog.service.CommentService; import cn.celess.blog.service.CommentService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -26,76 +24,96 @@ public class CommentController {
*/ */
@PostMapping("/user/comment/create") @PostMapping("/user/comment/create")
public Response addOne(@RequestBody CommentReq reqBody) { public Response addOne(@RequestBody CommentReq reqBody) {
return ResponseUtil.success(commentService.create(reqBody)); return Response.success(commentService.create(reqBody));
} }
@DeleteMapping("/user/comment/del") @DeleteMapping("/user/comment/del")
public Response delete(@RequestParam("id") long id) { public Response delete(@RequestParam("id") long id) {
return ResponseUtil.success(commentService.delete(id)); return Response.success(commentService.delete(id));
} }
@PutMapping("/user/comment/update") @PutMapping("/user/comment/update")
public Response update(@RequestBody CommentReq reqBody) { public Response update(@RequestBody CommentReq reqBody) {
return ResponseUtil.success(commentService.update(reqBody)); return Response.success(commentService.update(reqBody));
} }
/** /**
* 获取所有的一级评论 * 获取所有的评论
* *
* @param articleId 文章id * @param pagePath pagePath
* @param count 单页数据量 * @param count 单页数据量
* @param page 页码 * @param page 页码
* @return Response * @return Response
*/ */
@GetMapping("/comments") @GetMapping("/comments/{pagePath}/{pid}")
public Response commentsOfArticle(@RequestParam("articleId") long articleId, public Response commentsOfArticle(@PathVariable("pagePath") String pagePath, @PathVariable(value = "pid") long pid,
@RequestParam(value = "count", required = false, defaultValue = "10") int count, @RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) { @RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByArticle(articleId, -1, page, count)); String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePageByPageAndPid(path, pid, page, count));
} }
/** /**
* 通过pid获取数据 * 通过pid获取数据
* *
* @param pid * @param pagePath pagePath
* @param count * @param count count
* @param page * @param page page
* @return * @return Response
*/ */
@GetMapping("/comment/pid/{pid}") @GetMapping("/comment/pagePath/{pagePath}")
public Response retrievePage(@PathVariable("pid") long pid, public Response retrievePage(@PathVariable("pagePath") String pagePath,
@RequestParam(value = "count", required = false, defaultValue = "10") int count, @RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) { @RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByPid(pid, page, count)); String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePage(path, page, count));
} }
/** @GetMapping("/user/comment/pagePath/{pagePath}")
* 获取所以的一级留言 public Response userComment(@PathVariable("pagePath") String pagePath,
*
* @param count
* @param page
* @return
*/
@GetMapping("/leaveMsg")
public Response retrievePageOfLeaveMsg(@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByTypeAndPid(false, -1, page, count));
}
@GetMapping("/admin/comment/type/{type}")
public Response retrievePageAdmin(
@PathVariable("type") int isComment,
@RequestParam(value = "count", required = false, defaultValue = "10") int count, @RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) { @RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByType(1 == isComment, page, count)); String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePageByAuthor(path, page, count));
} }
@GetMapping("/user/comment/type/{type}") @GetMapping("/admin/comment/pagePath/{pagePath}")
public Response retrievePageByAuthor( public Response adminComment(@PathVariable("pagePath") String pagePath,
@PathVariable(value = "type") int isComment,
@RequestParam(value = "count", required = false, defaultValue = "10") int count, @RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) { @RequestParam(value = "page", required = false, defaultValue = "1") int page) {
return ResponseUtil.success(commentService.retrievePageByAuthor(1 == isComment, page, count)); String path = "";
if (pagePath.contains("article+")) {
path = "article/" + pagePath.split("\\+", 2)[1];
} else {
path = pagePath;
}
if ("*".equals(pagePath)) {
path = null;
}
return Response.success(commentService.retrievePageByPage(path, page, count));
} }
} }

View File

@@ -6,15 +6,19 @@ import cn.celess.blog.entity.model.QiniuResponse;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.service.CountService; import cn.celess.blog.service.CountService;
import cn.celess.blog.service.QiniuService; import cn.celess.blog.service.QiniuService;
import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.RedisUtil; import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.ResponseUtil;
import cn.celess.blog.util.VeriCodeUtil; import cn.celess.blog.util.VeriCodeUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@@ -33,7 +37,7 @@ import java.util.concurrent.TimeUnit;
* @date : 2019/04/02 22:03 * @date : 2019/04/02 22:03
*/ */
@RestController @RestController
public class Other { public class CommonController {
public static final Logger logger = LoggerFactory.getLogger(Object.class); public static final Logger logger = LoggerFactory.getLogger(Object.class);
@Autowired @Autowired
@@ -51,11 +55,10 @@ public class Other {
Map<String, Long> countMap = new HashMap<>(); Map<String, Long> countMap = new HashMap<>();
countMap.put("articleCount", countService.getArticleCount()); countMap.put("articleCount", countService.getArticleCount());
countMap.put("commentCount", countService.getCommentCount()); countMap.put("commentCount", countService.getCommentCount());
countMap.put("leaveMsgCount", countService.getLeaveMessageCount());
countMap.put("categoryCount", countService.getCategoriesCount()); countMap.put("categoryCount", countService.getCategoriesCount());
countMap.put("tagCount", countService.getTagsCount()); countMap.put("tagCount", countService.getTagsCount());
countMap.put("visitorCount", countService.getVisitorCount()); countMap.put("visitorCount", countService.getVisitorCount());
return ResponseUtil.success(countMap); return Response.success(countMap);
} }
@@ -70,12 +73,13 @@ public class Other {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames(); Enumeration<String> headerNames = request.getHeaderNames();
String str = null; String str = null;
while ((str = headerNames.nextElement()) != null) { while (headerNames.hasMoreElements()) {
str = headerNames.nextElement();
map.put(str, request.getHeader(str)); map.put(str, request.getHeader(str));
} }
map.put("sessionID", request.getSession().getId()); map.put("sessionID", request.getSession().getId());
map.put("request.getRemoteAddr()", request.getRemoteAddr()); map.put("request.getRemoteAddr()", request.getRemoteAddr());
return ResponseUtil.success(map); return Response.success(map);
} }
/** /**
@@ -118,10 +122,10 @@ public class Other {
if (code.equals(codeStr)) { if (code.equals(codeStr)) {
request.getSession().removeAttribute("code"); request.getSession().removeAttribute("code");
request.getSession().setAttribute("verImgCodeStatus", true); request.getSession().setAttribute("verImgCodeStatus", true);
return ResponseUtil.success("验证成功"); return Response.success("验证成功");
} else { } else {
request.getSession().removeAttribute("code"); request.getSession().removeAttribute("code");
return ResponseUtil.failure("验证失败,请重新获取验证码"); return Response.failure("验证失败,请重新获取验证码");
} }
} }
@@ -131,8 +135,6 @@ public class Other {
* FUCK !!! * FUCK !!!
* *
* @param file 文件 * @param file 文件
* @return
* @throws IOException
*/ */
@PostMapping("/imgUpload") @PostMapping("/imgUpload")
public void upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("editormd-image-file") MultipartFile file) throws IOException { public void upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("editormd-image-file") MultipartFile file) throws IOException {
@@ -154,11 +156,12 @@ public class Other {
return; return;
} }
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
assert fileName != null;
String mime = fileName.substring(fileName.lastIndexOf(".")); String mime = fileName.substring(fileName.lastIndexOf("."));
if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) || if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) ||
".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) { ".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) {
QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime); QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime);
jsonObject.put("success", 0); jsonObject.put("success", 1);
jsonObject.put("message", "上传成功"); jsonObject.put("message", "上传成功");
jsonObject.put("url", "http://cdn.celess.cn/" + qiniuResponse.key); jsonObject.put("url", "http://cdn.celess.cn/" + qiniuResponse.key);
response.getWriter().println(jsonObject.toString()); response.getWriter().println(jsonObject.toString());
@@ -169,4 +172,14 @@ public class Other {
jsonObject.put("message", "上传失败,请上传图片文件"); jsonObject.put("message", "上传失败,请上传图片文件");
response.getWriter().println(jsonObject.toString()); response.getWriter().println(jsonObject.toString());
} }
@GetMapping("/bingPic")
public Response bingPic() {
JSONObject imageObj;
imageObj = JSONObject.fromObject(HttpUtil.get("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN"));
JSONArray jsonArray = imageObj.getJSONArray("images");
String imageName = jsonArray.getJSONObject(0).getString("url");
return Response.success("https://cn.bing.com" + imageName);
}
} }

View File

@@ -3,14 +3,14 @@ package cn.celess.blog.controller;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.PartnerSite; import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.request.LinkApplyReq;
import cn.celess.blog.entity.request.LinkReq; import cn.celess.blog.entity.request.LinkReq;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.service.MailService; import cn.celess.blog.service.MailService;
import cn.celess.blog.service.PartnerSiteService; import cn.celess.blog.service.PartnerSiteService;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.RedisUtil; import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.RegexUtil; import cn.celess.blog.util.RegexUtil;
import cn.celess.blog.util.ResponseUtil;
import cn.celess.blog.util.DateFormatUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -37,17 +37,17 @@ public class LinksController {
@PostMapping("/admin/links/create") @PostMapping("/admin/links/create")
public Response create(@RequestBody LinkReq reqBody) { public Response create(@RequestBody LinkReq reqBody) {
return ResponseUtil.success(partnerSiteService.create(reqBody)); return Response.success(partnerSiteService.create(reqBody));
} }
@DeleteMapping("/admin/links/del/{id}") @DeleteMapping("/admin/links/del/{id}")
public Response del(@PathVariable("id") long id) { public Response del(@PathVariable("id") long id) {
return ResponseUtil.success(partnerSiteService.del(id)); return Response.success(partnerSiteService.del(id));
} }
@PutMapping("/admin/links/update") @PutMapping("/admin/links/update")
public Response update(@RequestBody LinkReq reqBody) { public Response update(@RequestBody LinkReq reqBody) {
return ResponseUtil.success(partnerSiteService.update(reqBody)); return Response.success(partnerSiteService.update(reqBody));
} }
@GetMapping("/links") @GetMapping("/links")
@@ -60,40 +60,22 @@ public class LinksController {
sites.add(p); sites.add(p);
} }
} }
return ResponseUtil.success(sites); return Response.success(sites);
} }
@GetMapping("/admin/links") @GetMapping("/admin/links")
public Response all(@RequestParam("page") int page, public Response all(@RequestParam("page") int page,
@RequestParam("count") int count) { @RequestParam("count") int count) {
return ResponseUtil.success(partnerSiteService.PartnerSitePages(page, count)); return Response.success(partnerSiteService.partnerSitePages(page, count));
} }
@PostMapping("/apply") @PostMapping("/apply")
public Response apply(@RequestParam("name") String name, public Response apply(@RequestBody() LinkApplyReq linkApplyReq) {
@RequestParam("url") String url) { return Response.success(partnerSiteService.apply(linkApplyReq));
// TODO :: 弃用发送邮件的方式。
if (name == null || name.replaceAll(" ", "").isEmpty()) {
return ResponseUtil.response(ResponseEnum.PARAMETERS_ERROR, null);
} }
if (!RegexUtil.urlMatch(url)) {
return ResponseUtil.response(ResponseEnum.PARAMETERS_URL_ERROR, null);
}
String applyTimeStr = redisUtil.get(request.getRemoteAddr() + "-Apply");
int applyTime = 0;
if (applyTimeStr != null) {
applyTime = Integer.parseInt(applyTimeStr);
}
if (applyTime == 10) {
throw new MyException(ResponseEnum.FAILURE.getCode(), "申请次数已达10次请2小时后重试");
}
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("友链申请:" + name);
message.setTo("a@celess.cn");
message.setText("name:" + name + "\nurl:" + url + "\n" + DateFormatUtil.getNow());
Boolean send = mailService.send(message);
redisUtil.setEx(request.getRemoteAddr() + "-Apply", applyTime + 1 + "", 2, TimeUnit.HOURS);
return send ? ResponseUtil.success("") : ResponseUtil.failure("");
@PostMapping("/reapply")
public Response reapply(@RequestParam("key") String key) {
return Response.success(partnerSiteService.reapply(key));
} }
} }

View File

@@ -1,9 +1,8 @@
package cn.celess.blog.controller; package cn.celess.blog.controller;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.Tag; import cn.celess.blog.entity.model.TagModel;
import cn.celess.blog.service.TagService; import cn.celess.blog.service.TagService;
import cn.celess.blog.util.ResponseUtil;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -23,48 +22,37 @@ public class TagController {
@PostMapping("/admin/tag/create") @PostMapping("/admin/tag/create")
public Response addOne(@RequestParam("name") String name) { public Response addOne(@RequestParam("name") String name) {
return ResponseUtil.success(tagService.create(name)); return Response.success(tagService.create(name));
} }
@DeleteMapping("/admin/tag/del") @DeleteMapping("/admin/tag/del")
public Response delOne(@RequestParam("id") long id) { public Response delOne(@RequestParam("id") long id) {
return ResponseUtil.success(tagService.delete(id)); return Response.success(tagService.delete(id));
} }
@PutMapping("/admin/tag/update") @PutMapping("/admin/tag/update")
public Response updateOne(@RequestParam("id") Long id, @RequestParam("name") String name) { public Response updateOne(@RequestParam("id") Long id, @RequestParam("name") String name) {
return ResponseUtil.success(tagService.update(id, name)); return Response.success(tagService.update(id, name));
}
@GetMapping("/tag/id/{id}")
public Response retrieveOneById(@PathVariable("id") long id) {
return ResponseUtil.success(tagService.retrieveOneById(id));
}
@GetMapping("/tag/name/{name}")
public Response retrieveOneByName(@PathVariable("name") String name) {
return ResponseUtil.success(tagService.retrieveOneByName(name));
} }
@GetMapping("/tags") @GetMapping("/tags")
public Response getPage(@RequestParam(required = false, defaultValue = "10", value = "count") int count, public Response getPage(@RequestParam(required = false, defaultValue = "10", value = "count") int count,
@RequestParam(required = false, defaultValue = "1", value = "page") int page) { @RequestParam(required = false, defaultValue = "1", value = "page") int page) {
return ResponseUtil.success(tagService.retrievePage(page, count)); return Response.success(tagService.retrievePage(page, count));
} }
@GetMapping("/tags/nac") @GetMapping("/tags/nac")
public Response getTagNameAndCount() { public Response getTagNameAndCount() {
List<JSONObject> nameAndCount = new ArrayList<>(); List<JSONObject> nameAndCount = new ArrayList<>();
List<Tag> all = tagService.findAll(); List<TagModel> all = tagService.findAll();
for (Tag t : all) { for (TagModel t : all) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("name", t.getName()); jsonObject.put("name", t.getName());
String articles = t.getArticles(); jsonObject.put("size", t.getArticles().size());
jsonObject.put("size", articles == null ? 0 : articles.split(",").length);
nameAndCount.add(jsonObject); nameAndCount.add(jsonObject);
} }
return ResponseUtil.success(nameAndCount); return Response.success(nameAndCount);
} }
} }

View File

@@ -4,7 +4,6 @@ import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.LoginReq;
import cn.celess.blog.entity.request.UserReq; import cn.celess.blog.entity.request.UserReq;
import cn.celess.blog.service.UserService; import cn.celess.blog.service.UserService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -23,28 +22,28 @@ public class UserController {
@PostMapping("/login") @PostMapping("/login")
public Response login(@RequestBody LoginReq loginReq) { public Response login(@RequestBody LoginReq loginReq) {
return ResponseUtil.success(userService.login(loginReq)); return Response.success(userService.login(loginReq));
} }
@PostMapping("/registration") @PostMapping("/registration")
public Response registration(@RequestParam("email") String email, public Response registration(@RequestParam("email") String email,
@RequestParam("password") String password) { @RequestParam("password") String password) {
return ResponseUtil.success(userService.registration(email, password)); return Response.success(userService.registration(email, password));
} }
@GetMapping("/logout") @GetMapping("/logout")
public Response logout() { public Response logout() {
return ResponseUtil.success(userService.logout()); return Response.success(userService.logout());
} }
@PutMapping("/user/userInfo/update") @PutMapping("/user/userInfo/update")
public Response updateInfo(String desc, String displayName) { public Response updateInfo(String desc, String displayName) {
return ResponseUtil.success(userService.update(desc, displayName)); return Response.success(userService.update(desc, displayName));
} }
@GetMapping("/user/userInfo") @GetMapping("/user/userInfo")
public Response getUserInfo() { public Response getUserInfo() {
return ResponseUtil.success(userService.getUserInfoBySession()); return Response.success(userService.getUserInfoBySession());
} }
/** /**
@@ -58,7 +57,7 @@ public class UserController {
@ResponseBody @ResponseBody
public Response upload(@RequestParam("file") MultipartFile file) throws IOException { public Response upload(@RequestParam("file") MultipartFile file) throws IOException {
if (file.isEmpty()) { if (file.isEmpty()) {
return ResponseUtil.failure("上传失败,请选择文件"); return Response.failure("上传失败,请选择文件");
} }
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
String mime = fileName.substring(fileName.lastIndexOf(".")); String mime = fileName.substring(fileName.lastIndexOf("."));
@@ -66,56 +65,64 @@ public class UserController {
".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) { ".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) {
return (Response) userService.updateUserAavatarImg(file.getInputStream(), mime); return (Response) userService.updateUserAavatarImg(file.getInputStream(), mime);
} }
return ResponseUtil.failure("请上传图片文件"); return Response.failure("请上传图片文件");
} }
@PostMapping("/sendResetPwdEmail") @PostMapping("/sendResetPwdEmail")
public Response sendResetPwdEmail(@RequestParam("email") String email) { public Response sendResetPwdEmail(@RequestParam("email") String email) {
return ResponseUtil.success(userService.sendResetPwdEmail(email)); return Response.success(userService.sendResetPwdEmail(email));
} }
@PostMapping("/sendVerifyEmail") @PostMapping("/sendVerifyEmail")
public Response sendVerifyEmail(@RequestParam("email") String email) { public Response sendVerifyEmail(@RequestParam("email") String email) {
return ResponseUtil.success(userService.sendVerifyEmail(email)); return Response.success(userService.sendVerifyEmail(email));
} }
@PostMapping("/emailVerify") @PostMapping("/emailVerify")
public Response emailVerify(@RequestParam("verifyId") String verifyId, public Response emailVerify(@RequestParam("verifyId") String verifyId,
@RequestParam("email") String mail) { @RequestParam("email") String mail) {
return ResponseUtil.success(userService.verifyEmail(verifyId, mail)); return Response.success(userService.verifyEmail(verifyId, mail));
} }
@PostMapping("/resetPwd") @PostMapping("/resetPwd")
public Response resetPwd(@RequestParam("verifyId") String verifyId, public Response resetPwd(@RequestParam("verifyId") String verifyId,
@RequestParam("email") String email, @RequestParam("email") String email,
@RequestParam("pwd") String pwd) { @RequestParam("pwd") String pwd) {
return ResponseUtil.success(userService.reSetPwd(verifyId, email, pwd)); return Response.success(userService.reSetPwd(verifyId, email, pwd));
} }
@PostMapping("/user/setPwd")
public Response setPwd(@RequestParam("pwd") String pwd,
@RequestParam("newPwd") String newPwd,
@RequestParam("confirmPwd") String confirmPwd) {
return Response.success(userService.setPwd(pwd, newPwd, confirmPwd));
}
@DeleteMapping("/admin/user/delete") @DeleteMapping("/admin/user/delete")
public Response multipleDelete(@RequestBody Integer[] ids) { public Response multipleDelete(@RequestBody Integer[] ids) {
return ResponseUtil.success(userService.deleteUser(ids)); return Response.success(userService.deleteUser(ids));
} }
@DeleteMapping("/admin/user/delete/{id}") @DeleteMapping("/admin/user/delete/{id}")
public Response delete(@PathVariable("id") Integer id) { public Response delete(@PathVariable("id") Integer id) {
return ResponseUtil.success(userService.deleteUser(new Integer[]{id})); return Response.success(userService.deleteUser(new Integer[]{id}));
} }
@PutMapping("/admin/user") @PutMapping("/admin/user")
public Response updateInfoByAdmin(@RequestBody UserReq user) { public Response updateInfoByAdmin(@RequestBody UserReq user) {
return ResponseUtil.success(userService.adminUpdate(user)); return Response.success(userService.adminUpdate(user));
} }
@GetMapping("/admin/users") @GetMapping("/admin/users")
public Response getAllUser(@RequestParam("page") int pageNum, @RequestParam("count") int count) { public Response getAllUser(@RequestParam("page") int pageNum, @RequestParam("count") int count) {
return ResponseUtil.success(userService.getUserList(pageNum, count)); return Response.success(userService.getUserList(pageNum, count));
} }
@GetMapping("/emailStatus/{email}") @GetMapping("/emailStatus/{email}")
public Response getEmailStatus(@PathVariable("email") String email) { public Response getEmailStatus(@PathVariable("email") String email) {
return ResponseUtil.success(userService.getStatusOfEmail(email)); return Response.success(userService.getStatusOfEmail(email));
} }

View File

@@ -3,7 +3,6 @@ package cn.celess.blog.controller;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.service.CountService; import cn.celess.blog.service.CountService;
import cn.celess.blog.service.VisitorService; import cn.celess.blog.service.VisitorService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -22,29 +21,29 @@ public class VisitorController {
@GetMapping("/visitor/count") @GetMapping("/visitor/count")
public Response getVisitorCount() { public Response getVisitorCount() {
return ResponseUtil.success(countService.getVisitorCount()); return Response.success(countService.getVisitorCount());
} }
@GetMapping("/admin/visitor/page") @GetMapping("/admin/visitor/page")
public Response page(@RequestParam(value = "count", required = false, defaultValue = "10") int count, public Response page(@RequestParam(value = "count", required = false, defaultValue = "10") int count,
@RequestParam(value = "page", required = false, defaultValue = "1") int page, @RequestParam(value = "page", required = false, defaultValue = "1") int page,
@RequestParam(value = "showLocation", required = false, defaultValue = "false") boolean showLocation) { @RequestParam(value = "showLocation", required = false, defaultValue = "false") boolean showLocation) {
return ResponseUtil.success(visitorService.visitorPage(page, count, showLocation)); return Response.success(visitorService.visitorPage(page, count, showLocation));
} }
@PostMapping("/visit") @PostMapping("/visit")
public Response add(HttpServletRequest request) { public Response add(HttpServletRequest request) {
return ResponseUtil.success(visitorService.addVisitor(request)); return Response.success(visitorService.addVisitor(request));
} }
@GetMapping("/dayVisitCount") @GetMapping("/dayVisitCount")
public Response dayVisitCount() { public Response dayVisitCount() {
return ResponseUtil.success(countService.getDayVisitCount()); return Response.success(countService.getDayVisitCount());
} }
@GetMapping("/ip/{ip}") @GetMapping("/ip/{ip}")
public Response ipLocation(@PathVariable("ip") String ip) { public Response ipLocation(@PathVariable("ip") String ip) {
return ResponseUtil.success(visitorService.location(ip)); return Response.success(visitorService.location(ip));
} }
/** /**
@@ -55,6 +54,6 @@ public class VisitorController {
*/ */
@GetMapping("/ip") @GetMapping("/ip")
public Response getIp(HttpServletRequest request) { public Response getIp(HttpServletRequest request) {
return ResponseUtil.success(request.getRemoteAddr()); return Response.success(request.getRemoteAddr());
} }
} }

View File

@@ -2,7 +2,6 @@ package cn.celess.blog.controller;
import cn.celess.blog.entity.Response; import cn.celess.blog.entity.Response;
import cn.celess.blog.service.WebUpdateInfoService; import cn.celess.blog.service.WebUpdateInfoService;
import cn.celess.blog.util.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -17,31 +16,32 @@ public class WebUpdateInfoController {
@PostMapping("/admin/webUpdate/create") @PostMapping("/admin/webUpdate/create")
public Response create(@RequestParam("info") String info) { public Response create(@RequestParam("info") String info) {
return ResponseUtil.success(webUpdateInfoService.create(info)); return Response.success(webUpdateInfoService.create(info));
} }
@DeleteMapping("/admin/webUpdate/del/{id}") @DeleteMapping("/admin/webUpdate/del/{id}")
public Response del(@PathVariable("id") long id) { public Response del(@PathVariable("id") long id) {
return ResponseUtil.success(webUpdateInfoService.del(id)); return Response.success(webUpdateInfoService.del(id));
} }
@PutMapping("/admin/webUpdate/update") @PutMapping("/admin/webUpdate/update")
public Response update(@RequestParam("id") long id, @RequestParam("info") String info) { public Response update(@RequestParam("id") long id, @RequestParam("info") String info) {
return ResponseUtil.success(webUpdateInfoService.update(id, info)); return Response.success(webUpdateInfoService.update(id, info));
} }
@GetMapping("/webUpdate") @GetMapping("/webUpdate")
public Response findAll() { public Response findAll() {
return ResponseUtil.success(webUpdateInfoService.findAll()); return Response.success(webUpdateInfoService.findAll());
} }
@GetMapping("/webUpdate/pages") @GetMapping("/webUpdate/pages")
public Response page(@RequestParam("page") int page, @RequestParam("count") int count) { public Response page(@RequestParam("page") int page, @RequestParam("count") int count) {
return ResponseUtil.success(webUpdateInfoService.pages(count, page)); return Response.success(webUpdateInfoService.pages(count, page));
} }
@GetMapping("/lastestUpdateTime")
@GetMapping("/lastestUpdate")
public Response lastestUpdateTime() { public Response lastestUpdateTime() {
return ResponseUtil.success(webUpdateInfoService.getLastestUpdateTime()); return Response.success(webUpdateInfoService.getLastestUpdateTime());
} }

View File

@@ -0,0 +1,23 @@
package cn.celess.blog.enmu;
import lombok.Getter;
/**
* @Author: 小海
* @Date: 2020-05-25 08:58
* @Desc:
*/
@Getter
public enum CommentStatusEnum {
// 正常
NORMAL(0, "正常"),
DELETED(3, "已删除");
private final int code;
private final String msg;
CommentStatusEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
}

View File

@@ -1,27 +0,0 @@
package cn.celess.blog.enmu;
import lombok.Getter;
/**
* @Author: 小海
* @Date 2019/06/29 00:00
* @Description 文章数据模型转换的级别(响应参数的选择)
*/
@Getter
public enum LevelEnum {
//低级
LOW(0),
//中级
MIDDLE(1),
//另一个级别的转化
BETWEEN_M_AND_H(2),
//高级
HEIGHT(3);
private int levelCode;
LevelEnum(int levelCode) {
this.levelCode = levelCode;
}
}

View File

@@ -11,59 +11,71 @@ public enum ResponseEnum {
FAILURE(-1, "失败"), FAILURE(-1, "失败"),
ERROR(-2, "错误"), ERROR(-2, "错误"),
DATA_IS_DELETED(1000, "数据已被删除"),
//文章类 //文章类
ARTICLE_NOT_EXIST(201, "文章不存在"), ARTICLE_NOT_EXIST(2010, "文章不存在"),
ARTICLE_HAS_EXIST(202, "文章已存在"), ARTICLE_HAS_EXIST(2020, "文章已存在"),
ARTICLE_NOT_PUBLIC(203, "文章暂未公开"), ARTICLE_NOT_PUBLIC(2030, "文章暂未公开"),
ARTICLE_NOT_BELONG_YOU(204, "无权限操作别人的文章"), ARTICLE_NOT_BELONG_YOU(2040, "无权限操作别人的文章"),
//用户类 //用户类
HAVE_NOT_LOG_IN(301, "还未登录"), HAVE_NOT_LOG_IN(3010, "还未登录"),
PERMISSION_ERROR(302, "没有此权限"), PERMISSION_ERROR(3020, "没有此权限"),
USER_NOT_EXIST(303, "用户不存在"), USER_NOT_EXIST(3030, "用户不存在"),
USERNAME_HAS_EXIST(304, "用户名已存在"), USERNAME_HAS_EXIST(3040, "用户名已存在"),
USERNAME_TOO_SHORT(305, "用户名太短"), USERNAME_TOO_SHORT(3050, "用户名太短"),
PASSWORD_TOO_SHORT_OR_LONG(306, "密码长度过长或者过短"), PASSWORD_TOO_SHORT_OR_LONG(3060, "密码长度过长或者过短"),
LOGIN_FAILURE(310, "登录失败,用户名/密码不正确"), LOGIN_FAILURE(3100, "登录失败,用户名/密码不正确"),
USEREMAIL_NULL(331, "未设置邮箱"), USEREMAIL_NULL(3310, "未设置邮箱"),
USEREMAIL_NOT_VERIFY(332, "邮箱未验证"), USEREMAIL_NOT_VERIFY(3320, "邮箱未验证"),
LOGIN_LATER(350, "错误次数已达5次请稍后再试"), LOGIN_LATER(3500, "错误次数已达5次请稍后再试"),
PWD_SAME(360, "新密码与原密码相同"), PWD_SAME(3601, "新密码与原密码相同"),
LOGIN_EXPIRED(370, "登陆过期"), PWD_NOT_SAME(3602, "新密码与原密码不相同"),
LOGIN_EXPIRED(3700, "登陆过期"),
LOGOUT(3710, "账户已注销"),
PWD_WRONG(3800, "密码不正确"),
JWT_EXPIRED(3810, "Token过期"),
JWT_MALFORMED(3820, "Token格式不对"),
JWT_SIGNATURE(3830, "Token签名错误"),
JWT_NOT_SUPPORT(3840, "不支持的Token"),
//标签 //标签
TAG_NOT_EXIST(401, "标签不存在"), TAG_NOT_EXIST(4010, "标签不存在"),
TAG_HAS_EXIST(402, "标签已存在"), TAG_HAS_EXIST(4020, "标签已存在"),
//分类 //分类
CATEGORY_NOT_EXIST(501, "分类不存在"), CATEGORY_NOT_EXIST(5010, "分类不存在"),
CATEGORY_HAS_EXIST(502, "分类已存在"), CATEGORY_HAS_EXIST(5020, "分类已存在"),
//评论/留言 //评论/留言
COMMENT_NOT_EXIST(601, "评论/留言不存在"), COMMENT_NOT_EXIST(6010, "评论/留言不存在"),
COMMENT_HAS_EXIST(602, "评论/留言已存在,请不要重复提交"), COMMENT_HAS_EXIST(6020, "评论/留言已存在,请不要重复提交"),
//webUdpateInfo amd PartnerSite //webUdpateInfo amd PartnerSite
DATA_NOT_EXIST(701, "数据不存在"), DATA_NOT_EXIST(7010, "数据不存在"),
DATA_HAS_EXIST(702, "数据已存在"), DATA_HAS_EXIST(7020, "数据已存在"),
//其他 //其他
APPLY_LINK_NO_ADD_THIS_SITE(7200, "暂未在您的网站中抓取到本站链接"),
DATA_EXPIRED(7300, "数据过期"),
CANNOT_GET_DATA(7400, "暂无法获取到数据"),
//提交更新之前,没有获取数据/, //提交更新之前,没有获取数据/,
DID_NOT_GET_THE_DATA(802, "非法访问"), DID_NOT_GET_THE_DATA(8020, "非法访问"),
IMG_CODE_TIMEOUT(810, "验证码已失效"), IMG_CODE_TIMEOUT(8100, "验证码已失效"),
IMG_CODE_DIDNOTVERIFY(820, "请先验证验证码"), IMG_CODE_DIDNOTVERIFY(8200, "请先验证验证码"),
VERIFY_ERROR(830, "验证失败"), VERIFY_ERROR(8300, "验证失败"),
PARAMETERS_ERROR(850, "参数错误"), PARAMETERS_ERROR(8500, "参数错误"),
PARAMETERS_URL_ERROR(851, "链接格式错误"), PARAMETERS_URL_ERROR(8510, "链接格式错误"),
PARAMETERS_EMAIL_ERROR(852, "邮箱格式错误"), PARAMETERS_EMAIL_ERROR(8520, "邮箱格式错误"),
PARAMETERS_PHONE_ERROR(853, "手机格式错误"), PARAMETERS_PHONE_ERROR(8530, "手机格式错误"),
PARAMETERS_QQ_ERROR(854, "QQ格式错误"), PARAMETERS_QQ_ERROR(8540, "QQ格式错误"),
PARAMETERS_PWD_ERROR(855, "密码格式错误"), PARAMETERS_PWD_ERROR(8550, "密码格式错误"),
VERIFY_OUT(840, "已经验证过了"); VERIFY_OUT(8400, "已经验证过了");
private final int code;
private int code; private final String msg;
private String msg;
ResponseEnum(int code, String msg) { ResponseEnum(int code, String msg) {

View File

@@ -0,0 +1,23 @@
package cn.celess.blog.enmu;
import lombok.Getter;
/**
* @Author: 小海
* @Date: 2020-05-24 16:31
* @Desc:
*/
@Getter
public enum RoleEnum {
// admin 权限
ADMIN_ROLE("admin"),
// user 权限
USER_ROLE("user");
private final String roleName;
RoleEnum(String roleName) {
this.roleName = roleName;
}
}

View File

@@ -0,0 +1,39 @@
package cn.celess.blog.enmu;
/**
* @Author: 小海
* @Date: 2020-05-22 21:32
* @Desc:
*/
public enum UserAccountStatusEnum {
/**
* 账户正常
*/
NORMAL(0, "正常"),
/**
* 账户被锁定
*/
LOCKED(1, "锁定"),
/**
* 账户被删除
*/
DELETED(2, "已删除");
private final int code;
private final String desc;
UserAccountStatusEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
}

View File

@@ -3,6 +3,7 @@ package cn.celess.blog.entity;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -41,16 +42,6 @@ public class Article {
private Date updateDate = null; private Date updateDate = null;
private Long categoryId;
private String tagsId;
private Long authorId;
private Long preArticleId;
private Long nextArticleId;
private Long readingNumber; private Long readingNumber;
/** /**
@@ -58,4 +49,15 @@ public class Article {
*/ */
private Boolean open; private Boolean open;
private Category category;
private List<Tag> tags;
private Integer likeCount;
private Integer dislikeCount;
private User user;
private boolean deleted = false;
} }

View File

@@ -0,0 +1,26 @@
package cn.celess.blog.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: 小海
* @Date: 2020-05-24 14:52
* @Desc:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ArticleTag {
private Long id;
private Article article;
private TagCategory tag;
public ArticleTag(Article article, TagCategory tag) {
this.article = article;
this.tag = tag;
}
}

View File

@@ -1,20 +1,14 @@
package cn.celess.blog.entity; package cn.celess.blog.entity;
import lombok.NoArgsConstructor;
import lombok.Data;
/** /**
* @author : xiaohai * @author : xiaohai
* @date : 2019/03/28 22:18 * @date : 2019/03/28 22:18
*/ */
@Data @NoArgsConstructor
public class Category { public class Category extends TagCategory {
public Category(String name) {
private Long id; super.setName(name);
}
private String name;
private String articles;
} }

View File

@@ -14,27 +14,21 @@ public class Comment {
private Long id; private Long id;
/** private int status;
* 是评论还是留言 0:评论 其他1留言
*/
private Boolean type;
private Long authorID; private String pagePath;
private String content; private String content;
private Long articleID;
private Date date; private Date date;
/** private User fromUser;
* 回应着ID 默认为顶级回复
*/
private String responseId = "";
private User toUser;
/** /**
* 评论的父ID * 评论的父ID
*/ */
private Long pid; private Long pid;
// private boolean delete;
} }

View File

@@ -19,6 +19,16 @@ public class PartnerSite {
private Boolean open; private Boolean open;
private String iconPath;
private String desc;
private Boolean delete = false;
private String email;
private Boolean notification = true;
public PartnerSite() { public PartnerSite() {
} }

View File

@@ -1,5 +1,6 @@
package cn.celess.blog.entity; package cn.celess.blog.entity;
import cn.celess.blog.enmu.ResponseEnum;
import lombok.Data; import lombok.Data;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
@@ -10,20 +11,49 @@ import java.io.Serializable;
* @date : 2019/03/28 15:24 * @date : 2019/03/28 15:24
*/ */
@Data @Data
public class Response implements Serializable { public class Response<T> implements Serializable {
private int code; private int code;
private String msg; private String msg;
private Object result; private T result;
private long date;
public Response() { public Response() {
} }
public Response(int code, String msg, Object result, long date) { public Response(int code, String msg, T result) {
this.code = code; this.code = code;
this.msg = msg; this.msg = msg;
this.result = result; this.result = result;
this.date = date; }
/**
* 成功相应
*
* @param result 结果
* @return Response
*/
public static Response success(Object result) {
return new Response(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), result);
}
/**
* 失败的响应
*
* @param result 结果
* @return Response
*/
public static Response failure(String result) {
return new Response(ResponseEnum.FAILURE.getCode(), ResponseEnum.FAILURE.getMsg(), result);
}
/**
* 其他的响应
*
* @param r 枚举常量
* @param result 结果
* @return Response
*/
public static Response response(ResponseEnum r, String result) {
return new Response(r.getCode(), r.getMsg(), result);
} }
@Override @Override

View File

@@ -1,16 +1,15 @@
package cn.celess.blog.entity; package cn.celess.blog.entity;
import lombok.Data; import lombok.NoArgsConstructor;
/** /**
* @author : xiaohai * @author : xiaohai
* @date : 2019/03/28 22:19 * @date : 2019/03/28 22:19
*/ */
@Data @NoArgsConstructor
public class Tag { public class Tag extends TagCategory {
private Long id;
private String name; public Tag(String name) {
super.setName(name);
private String articles; }
} }

View File

@@ -0,0 +1,19 @@
package cn.celess.blog.entity;
import lombok.Data;
/**
* @Author: 小海
* @Date: 2020-05-24 14:03
* @Desc:
*/
@Data
public class TagCategory {
private Long id;
private String name;
private Boolean category = true;
private Boolean deleted = false;
}

View File

@@ -2,6 +2,7 @@ package cn.celess.blog.entity;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date; import java.util.Date;
@@ -10,6 +11,7 @@ import java.util.Date;
* @date : 2019/03/28 14:52 * @date : 2019/03/28 14:52
*/ */
@Data @Data
@NoArgsConstructor
public class User { public class User {
private Long id; private Long id;
@@ -18,12 +20,6 @@ public class User {
*/ */
private String email; private String email;
/**
* 用户唯一标识码
*/
@JsonIgnore
private String uid;
/** /**
* 密码 * 密码
*/ */
@@ -46,15 +42,12 @@ public class User {
private Date recentlyLandedDate; private Date recentlyLandedDate;
/**
* 随机码 用户验证邮箱/找回密码
* 暂时废弃这一字段
*/
private String emailVerifyId;
private String role = "user"; private String role = "user";
public User() { private int status;
}
public User(String email, String pwd) {
this.email = email;
this.pwd = pwd;
}
} }

View File

@@ -15,6 +15,7 @@ public class Visitor {
private String ip; private String ip;
private Date date; private Date date;
private String ua; private String ua;
private boolean delete;
public Visitor(String ip, Date date, String ua) { public Visitor(String ip, Date date, String ua) {
this.ip = ip; this.ip = ip;

View File

@@ -17,11 +17,12 @@ public class WebUpdate {
private Date updateTime; private Date updateTime;
private boolean delete;
public WebUpdate() { public WebUpdate() {
} }
public WebUpdate(String updateInfo, Date updateTime) { public WebUpdate(String updateInfo) {
this.updateInfo = updateInfo; this.updateInfo = updateInfo;
this.updateTime = updateTime;
} }
} }

View File

@@ -1,9 +1,10 @@
package cn.celess.blog.entity.model; package cn.celess.blog.entity.model;
import cn.celess.blog.entity.Tag;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.io.Serializable; import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -57,40 +58,30 @@ public class ArticleModel {
/** /**
* 标签 * 标签
*/ */
private String[] tags; private List<Tag> tags;
/** /**
* 作者 * 作者
*/ */
private Long authorId; private UserModel author;
/** private ArticleModel preArticle;
* 作者名字
*/
private String authorName;
/** private ArticleModel nextArticle;
* 上一篇文章
*/
private Long preArticleId;
/**
* 下一篇文章
*/
private Long nextArticleId;
private String preArticleTitle;
private String nextArticleTitle;
/** /**
* 阅读数 * 阅读数
*/ */
private Long readingNumber; private Long readingNumber;
private Integer likeCount;
private Integer dislikeCount;
/** /**
* 文章的状态 true公开 false:不公开 * 文章的状态 true公开 false:不公开
*/ */
private Boolean open; private Boolean open;
private boolean deleted;
} }

View File

@@ -0,0 +1,24 @@
package cn.celess.blog.entity.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Author: 小海
* @Date: 2020-03-29 12:18
* @Desc:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CategoryModel {
private Long id;
private String name;
private List<ArticleModel> articles;
private boolean deleted;
}

View File

@@ -3,7 +3,7 @@ package cn.celess.blog.entity.model;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Date; import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -14,44 +14,31 @@ import java.util.Date;
public class CommentModel { public class CommentModel {
private long id; private long id;
/** private UserModel fromUser;
* 是评论还是留言 0:评论 其他1留言
*/
private boolean isComment;
private String authorName; private UserModel toUser;
private String authorAvatarImgUrl;
/** /**
* 内容 * 内容
*/ */
private String content; private String content;
/**
* 文章ID
*/
private long articleID;
/** /**
* 文章标题 * 文章标题
*/ */
private String articleTitle; private String pagePath;
/** /**
* 发布日期 * 发布日期
*/ */
private String date; private String date;
/**
* 回应着ID 默认为顶级回复
*/
private String responseId = "";
/** /**
* 评论的父ID * 评论的父ID
*/ */
private long pid = -1; private Long pid;
private List<CommentModel> respComment;
private int status;
} }

View File

@@ -0,0 +1,38 @@
package cn.celess.blog.entity.model;
import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Author: 小海
* @Date: 2020-05-25 17:13
* @Desc:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageData<T> {
private List<T> list;
private long total;
private int pageSize;
private int pageNum;
public PageData(PageInfo pageInfo) {
this.pageNum = pageInfo.getPageNum();
this.pageSize = pageInfo.getPageSize();
this.total = pageInfo.getTotal();
}
public PageData(PageInfo pageInfo, List<T> data) {
this(pageInfo);
this.list = data;
}
}

View File

@@ -0,0 +1,25 @@
package cn.celess.blog.entity.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Author: 小海
* @Date: 2020-03-29 13:56
* @Desc:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TagModel {
private Long id;
private String name;
private List<ArticleModel> articles;
private boolean deleted;
}

View File

@@ -37,4 +37,6 @@ public class UserModel {
private String role = "user"; private String role = "user";
private String token; private String token;
private int status;
} }

View File

@@ -21,4 +21,6 @@ public class WebUpdateModel {
this.info = info; this.info = info;
this.time = time; this.time = time;
} }
private boolean deleted;
} }

View File

@@ -11,7 +11,7 @@ public class ArticleReq {
private Long id; private Long id;
private String title; private String title;
private String mdContent; private String mdContent;
private String tags; private String[] tags;
private Boolean type; private Boolean type;
private String url; private String url;
private String category; private String category;

View File

@@ -9,9 +9,8 @@ import lombok.Data;
@Data @Data
public class CommentReq { public class CommentReq {
private Long id; private Long id;
private Boolean comment;
private String content; private String content;
private Long pid; private long pid = -1;
private Long articleID; private String pagePath;
private String responseId; private long toUserId = -1;
} }

View File

@@ -0,0 +1,17 @@
package cn.celess.blog.entity.request;
import lombok.Data;
/**
* @author : xiaohai
* @date : 2020/07/31 20:50
*/
@Data
public class LinkApplyReq {
private String name;
private String email;
private String url;
private String linkUrl;
private String desc;
private String iconPath;
}

View File

@@ -11,5 +11,7 @@ public class LinkReq {
private long id; private long id;
private String name; private String name;
private String url; private String url;
private String iconPath;
private String desc;
private boolean open; private boolean open;
} }

View File

@@ -26,12 +26,11 @@ import javax.servlet.http.HttpServletRequest;
@ControllerAdvice @ControllerAdvice
public class ExceptionHandle { public class ExceptionHandle {
public static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@Autowired @Autowired
MailService mailService; MailService mailService;
@Autowired @Autowired
HttpServletRequest request; HttpServletRequest request;
public static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@Value("${spring.profiles.active}") @Value("${spring.profiles.active}")
private String activeModel; private String activeModel;
@@ -40,28 +39,29 @@ public class ExceptionHandle {
public Response handle(Exception e) { public Response handle(Exception e) {
//自定义错误 //自定义错误
if (e instanceof MyException) { if (e instanceof MyException) {
logger.debug("返回了自定义的exception,[code={},msg={}]", ((MyException) e).getCode(), e.getMessage()); MyException exception = (MyException) e;
return new Response(((MyException) e).getCode(), e.getMessage(), null, System.currentTimeMillis()); logger.debug("返回了自定义的exception,[code={},msg={},result={}]", exception.getCode(), e.getMessage(), exception.getResult());
return new Response(exception.getCode(), e.getMessage(), exception.getResult());
} }
//请求路径不支持该方法 //请求路径不支持该方法
if (e instanceof HttpRequestMethodNotSupportedException) { if (e instanceof HttpRequestMethodNotSupportedException) {
logger.debug("遇到请求路径与请求方法不匹配的请求,[msg={}path:{},method:{}]", e.getMessage(),request.getRequestURL(),request.getMethod()); logger.debug("遇到请求路径与请求方法不匹配的请求,[msg={}path:{},method:{}]", e.getMessage(), request.getRequestURL(), request.getMethod());
return new Response(ResponseEnum.ERROR.getCode(), e.getMessage(), null, System.currentTimeMillis()); return new Response(ResponseEnum.ERROR.getCode(), e.getMessage(), null);
} }
//数据输入类型不匹配 //数据输入类型不匹配
if (e instanceof MethodArgumentTypeMismatchException) { if (e instanceof MethodArgumentTypeMismatchException) {
logger.debug("输入类型不匹配,[msg={}]", e.getMessage()); logger.debug("输入类型不匹配,[msg={}]", e.getMessage());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null, System.currentTimeMillis()); return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null);
} }
//数据验证失败 //数据验证失败
if (e instanceof BindException) { if (e instanceof BindException) {
logger.debug("数据验证失败,[msg={}]", e.getMessage()); logger.debug("数据验证失败,[msg={}]", e.getMessage());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null, System.currentTimeMillis()); return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null);
} }
//数据输入不完整 //数据输入不完整
if (e instanceof MissingServletRequestParameterException) { if (e instanceof MissingServletRequestParameterException) {
logger.debug("数据输入不完整,[msg={}]", e.getMessage()); logger.debug("数据输入不完整,[msg={}]", e.getMessage());
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null, System.currentTimeMillis()); return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null);
} }
// 发送错误信息到邮箱 // 发送错误信息到邮箱
@@ -70,7 +70,7 @@ public class ExceptionHandle {
sendMessage(e); sendMessage(e);
} }
e.printStackTrace(); e.printStackTrace();
return new Response(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null, System.currentTimeMillis()); return new Response(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null);
} }
/** /**

View File

@@ -1,13 +1,16 @@
package cn.celess.blog.exception; package cn.celess.blog.exception;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import lombok.Data;
/** /**
* @author : xiaohai * @author : xiaohai
* @date : 2019/03/28 16:56 * @date : 2019/03/28 16:56
*/ */
@Data
public class MyException extends RuntimeException { public class MyException extends RuntimeException {
private int code; private int code;
private Object result;
public MyException(int code, String msg) { public MyException(int code, String msg) {
super(msg); super(msg);
@@ -24,11 +27,9 @@ public class MyException extends RuntimeException {
this.code = e.getCode(); this.code = e.getCode();
} }
public int getCode() { public MyException(ResponseEnum e, String msg, Object result) {
return code; super(e.getMsg());
} this.code = e.getCode();
this.result = result;
public void setCode(int code) {
this.code = code;
} }
} }

View File

@@ -1,7 +1,7 @@
package cn.celess.blog.mapper; package cn.celess.blog.mapper;
import cn.celess.blog.entity.Article; import cn.celess.blog.entity.Article;
import org.apache.ibatis.annotations.*; import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@@ -21,21 +21,15 @@ public interface ArticleMapper {
int update(Article a); int update(Article a);
int updateNextArticleId(long targetArticleID, long nextArticleID);
int updatePreArticleId(long targetArticleID, long preArticleID);
long getLastestArticleId();
Article getLastestArticle(); Article getLastestArticle();
Article findArticleById(long id); Article findArticleById(long id);
boolean existsByTitle(String title); boolean existsByTitle(String title);
boolean existsById(long id); boolean isDeletedById(long id);
List<Article> findAllByAuthorId(long authorID); List<Article> findAllByAuthorId(long authorId);
List<Article> findAllByOpen(boolean isOpen); List<Article> findAllByOpen(boolean isOpen);
@@ -43,15 +37,15 @@ public interface ArticleMapper {
List<Article> findAllByCategoryId(long id); List<Article> findAllByCategoryId(long id);
List<Article> findAllByCategoryIdAndOpen(long id);
List<Article> findAll(); List<Article> findAll();
Article getSimpleInfo(long id); Article getPreArticle(Long id);
List<Article> getSimpleInfoByCategory(long categoryId); Article getNextArticle(Long id);
List<Article> getSimpleInfoByTag(List<String> idList); int updateReadingNumber(long id);
int setReadingNumber(long number, long id);
long count(); long count();

View File

@@ -0,0 +1,35 @@
package cn.celess.blog.mapper;
import cn.celess.blog.entity.ArticleTag;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author: 小海
* @Date: 2020-05-24 14:21
* @Desc:
*/
@Mapper
@Repository
public interface ArticleTagMapper {
int insert(ArticleTag articleTag);
int update(ArticleTag articleTag);
ArticleTag findOneById(Long id);
int deleteById(Long id);
int deleteByArticleId(Long articleId);
List<ArticleTag> findAllByArticleId(Long articleId);
int deleteMultiById(List<ArticleTag> articleTags);
List<ArticleTag> findArticleByTag(Long tagId);
List<ArticleTag> findArticleByTagAndOpen(Long tagId);
}

View File

@@ -34,7 +34,7 @@ public interface CategoryMapper {
String getNameById(long id); String getNameById(long id);
Long getIDByName(String name); Long getIdByName(String name);
Category getLastestCategory(); Category getLastestCategory();

View File

@@ -8,8 +8,8 @@ import java.util.List;
/** /**
* @Author: 小海 * @Author: 小海
* @Date 2019/06/30 16:19 * @Date: 2019/06/30 16:19
* @Description * @Description:
*/ */
@Mapper @Mapper
@Repository @Repository
@@ -18,11 +18,9 @@ public interface CommentMapper {
int updateContent(String content, long id); int updateContent(String content, long id);
int updateResponder(String responder, long id);
int delete(long id); int delete(long id);
int deleteByArticleId(long articleId); int deleteByPagePath(String pagePath);
boolean existsById(long id); boolean existsById(long id);
@@ -30,19 +28,17 @@ public interface CommentMapper {
Comment getLastestComment(); Comment getLastestComment();
List<Comment> findAllByAuthorIDAndType(long id, boolean isComment); List<Comment> findAllByFromUser(long id);
List<Comment> findAllByPId(long pid); List<Comment> findAllByPid(long pid);
List<Comment> findAllByArticleID(long articleId); List<Comment> findAllByPagePath(String pagePath);
List<Comment> findAllByArticleIDAndPId(long articleID, long pid); List<Comment> findAllByPagePathAndFromUser(String pagePath, long userId);
List<Comment> findCommentsByTypeAndPId(boolean isComment, long pid); List<Comment> findAllByPagePathAndPidAndNormal(String pagePath, long pid);
List<Comment> findAllByPId(int pid); long countByPagePath(String pagePath);
List<Comment> findAllByType(boolean isComment); long count();
long countByType(boolean isComment);
} }

View File

@@ -26,10 +26,6 @@ public interface TagMapper {
Boolean existsByName(String name); Boolean existsByName(String name);
Long getIDByName(String name);
String getNameById(long id);
Tag getLastestTag(); Tag getLastestTag();
List<Tag> findAll(); List<Tag> findAll();

View File

@@ -4,7 +4,6 @@ import cn.celess.blog.entity.User;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@@ -16,13 +15,13 @@ import java.util.List;
@Repository @Repository
public interface UserMapper { public interface UserMapper {
int addUser(String email, String pwd); int addUser(User user);
int updateInfo(String desc, String displayName, long id); int updateInfo(String desc, String displayName, long id);
int updateAvatarImgUrl(String avatarImgUrl, long id); int updateAvatarImgUrl(String avatarImgUrl, long id);
int updateLoginTime(String email, Date date); int updateLoginTime(String email);
int updateEmailStatus(String email, boolean status); int updateEmailStatus(String email, boolean status);
@@ -50,7 +49,9 @@ public interface UserMapper {
int delete(long id); int delete(long id);
int setUserRole(Long uid, String role); int lock(long id);
int setUserRole(Long id, String role);
List<User> findAll(); List<User> findAll();

View File

@@ -20,5 +20,7 @@ public interface VisitorMapper {
List<Visitor> findAll(); List<Visitor> findAll();
List<Visitor> findAllNotDeleted();
long count(); long count();
} }

View File

@@ -4,7 +4,6 @@ import cn.celess.blog.entity.WebUpdate;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@@ -27,5 +26,7 @@ public interface WebUpdateInfoMapper {
List<WebUpdate> findAll(); List<WebUpdate> findAll();
Date getLastestOne(); List<WebUpdate> findAllNotDeleted();
WebUpdate getLastestOne();
} }

View File

@@ -1,8 +1,8 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.model.ArticleModel; import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.ArticleReq; import cn.celess.blog.entity.request.ArticleReq;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -39,11 +39,11 @@ public interface ArticleService {
/** /**
* 获取一篇文章的数据 * 获取一篇文章的数据
* *
* @param articleID 文章id * @param articleId 文章id
* @param is4update 是否是因文章更新而请求数据 * @param is4update 是否是因文章更新而请求数据
* @return 文章数据 * @return 文章数据
*/ */
ArticleModel retrieveOneByID(long articleID, boolean is4update); ArticleModel retrieveOneById(long articleId, boolean is4update);
/** /**
* 管理员 获取分页数据 * 管理员 获取分页数据
@@ -52,7 +52,7 @@ public interface ArticleService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo adminArticles(int count, int page); PageData<ArticleModel> adminArticles(int count, int page, boolean deleted);
/** /**
* 获取文章状态为开放的文章 * 获取文章状态为开放的文章
@@ -61,7 +61,7 @@ public interface ArticleService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo retrievePageForOpen(int count, int page); PageData<ArticleModel> retrievePageForOpen(int count, int page);
/** /**
* 根据分类名获取文章数据 * 根据分类名获取文章数据
@@ -71,7 +71,7 @@ public interface ArticleService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo findByCategory(String name, int page, int count); PageData<ArticleModel> findByCategory(String name, int page, int count);
/** /**
* 根据标签名获取文章数据 * 根据标签名获取文章数据
@@ -81,5 +81,5 @@ public interface ArticleService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo findByTag(String name, int page, int count); PageData<ArticleModel> findByTag(String name, int page, int count);
} }

View File

@@ -1,10 +1,9 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.Category; import cn.celess.blog.entity.model.CategoryModel;
import cn.celess.blog.entity.model.PageData;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
* @date : 2019/03/28 22:42 * @date : 2019/03/28 22:42
@@ -17,15 +16,7 @@ public interface CategoryService {
* @param name 分类名 * @param name 分类名
* @return 所增加的分类数据 * @return 所增加的分类数据
*/ */
Category create(String name); CategoryModel create(String name);
/**
* 增加一个分类
*
* @param category 分类对象
* @return 所增加的分类数据
*/
Category create(Category category);
/** /**
* 通过id删除分类 * 通过id删除分类
@@ -42,13 +33,13 @@ public interface CategoryService {
* @param name 分类名字 * @param name 分类名字
* @return 更新后的分类的数据 * @return 更新后的分类的数据
*/ */
Category update(Long id, String name); CategoryModel update(Long id, String name);
/** /**
* 获取全部的分类数据 * 获取全部的分类数据
* *
* @return 全部的分类数据 * @return 全部的分类数据
*/ */
List<Category> retrievePage(); PageData<CategoryModel> retrievePage(int page, int count);
} }

View File

@@ -1,10 +1,12 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.model.CommentModel; import cn.celess.blog.entity.model.CommentModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.CommentReq; import cn.celess.blog.entity.request.CommentReq;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
* @date : 2019/03/29 16:58 * @date : 2019/03/29 16:58
@@ -38,64 +40,52 @@ public interface CommentService {
/** /**
* 分页获取数据 * 分页获取数据
* *
* @param isComment true评论 false留言 * @param pagePath pagePath
* @param count 单页数据量 * @param count 单页数据量
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<CommentModel> retrievePage(Boolean isComment, int page, int count); PageData<CommentModel> retrievePage(String pagePath, int page, int count);
/** /**
* 通过pid获取数据 * 通过pid获取数据
* *
* @param pid 父id * @param pid 父id
* @param count 单页数据量
* @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<CommentModel> retrievePageByPid(long pid, int page, int count); List<CommentModel> retrievePageByPid(long pid);
/** /**
* 根据评论者获取数据 * 根据评论者获取数据
* *
* @param isComment true评论 false留言 * @param pagePath pagePath
* @param count 单页数据量 * @param count 单页数据量
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<CommentModel> retrievePageByAuthor(Boolean isComment, int page, int count); PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count);
/**
* 根据文章获取数据
*
* @param articleID 文章id
* @param pid 父id
* @param count 单页数据量
* @param page 数据页
* @return 分页数据
*/
PageInfo<CommentModel> retrievePageByArticle(long articleID, long pid, int page, int count);
/** /**
* 根据数据的type和pid获取数据 * 根据数据的type和pid获取数据
* *
* @param isComment true评论 false留言 * @param pagePath pagePath
* @param pid 父id * @param pid 父id
* @param count 单页数据量 * @param count 单页数据量
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<CommentModel> retrievePageByTypeAndPid(Boolean isComment, int pid, int page, int count); PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count);
/** /**
* 根据type获取数据 * 根据type获取数据
* *
* @param isComment true评论 false留言 * @param pagePath pagePath
* @param count 单页数据量 * @param count 单页数据量
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<CommentModel> retrievePageByType(Boolean isComment, int page, int count); PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count);
} }

View File

@@ -36,13 +36,6 @@ public interface CountService {
*/ */
long getTagsCount(); long getTagsCount();
/**
* 获取留言数量
*
* @return 留言数量
*/
long getLeaveMessageCount();
/** /**
* 获取用户量 * 获取用户量
* *

View File

@@ -1,8 +1,9 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.PartnerSite; import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.LinkApplyReq;
import cn.celess.blog.entity.request.LinkReq; import cn.celess.blog.entity.request.LinkReq;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@@ -44,7 +45,7 @@ public interface PartnerSiteService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<PartnerSite> PartnerSitePages(int page, int count); PageData<PartnerSite> partnerSitePages(int page, int count);
/** /**
* 获取全部数据 * 获取全部数据
@@ -53,4 +54,19 @@ public interface PartnerSiteService {
*/ */
List<PartnerSite> findAll(); List<PartnerSite> findAll();
/**
* 申请友链
*
* @param linkApplyReq linkApplyReq
* @return linkApplyReq
*/
PartnerSite apply(LinkApplyReq linkApplyReq);
/**
* 重写申请友链
*
* @param key key
* @return msg
*/
String reapply(String key);
} }

View File

@@ -1,7 +1,7 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.Tag; import cn.celess.blog.entity.model.PageData;
import com.github.pagehelper.PageInfo; import cn.celess.blog.entity.model.TagModel;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@@ -18,16 +18,7 @@ public interface TagService {
* @param name 标签名 * @param name 标签名
* @return 新增后的数据 * @return 新增后的数据
*/ */
Tag create(String name); TagModel create(String name);
/**
* 新增数据
*
* @param tag tag对象
* @return 新增后的数据
*/
Tag create(Tag tag);
/** /**
* 删除数据 * 删除数据
@@ -44,24 +35,7 @@ public interface TagService {
* @param name 改名的name值 * @param name 改名的name值
* @return 更新后的数据 * @return 更新后的数据
*/ */
Tag update(Long id, String name); TagModel update(Long id, String name);
/**
* 查询单个标签信息
*
* @param tagId id
* @return 标签的数据
*/
Tag retrieveOneById(long tagId);
/**
* 通过name查询标签的信息
*
* @param name tag的名称
* @return 标签数据
*/
Tag retrieveOneByName(String name);
/** /**
* 分页获取标签数据 * 分页获取标签数据
@@ -70,13 +44,13 @@ public interface TagService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<Tag> retrievePage(int page, int count); PageData<TagModel> retrievePage(int page, int count);
/** /**
* 获取全部标签数据 * 获取全部标签数据
* *
* @return 标签数据列表 * @return 标签数据列表
*/ */
List<Tag> findAll(); List<TagModel> findAll();
} }

View File

@@ -1,16 +1,12 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.User; import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.UserModel; import cn.celess.blog.entity.model.UserModel;
import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.LoginReq;
import cn.celess.blog.entity.request.UserReq; import cn.celess.blog.entity.request.UserReq;
import com.github.pagehelper.PageInfo;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream; import java.io.InputStream;
import java.util.List;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -42,14 +38,6 @@ public interface UserService {
*/ */
Object logout(); Object logout();
/**
* 获取用户头像的链接
*
* @param id 用户id
* @return 头像链接
*/
String getAvatarImg(long id);
/** /**
* 更新用户数据 * 更新用户数据
* *
@@ -83,14 +71,6 @@ public interface UserService {
*/ */
String getUserRoleByEmail(String email); String getUserRoleByEmail(String email);
/**
* 通过邮箱获取用户的信息
*
* @param email 用户邮箱
* @return 用户信息
*/
User getUserInfoByEmail(String email);
/** /**
* 获取邮箱是否注册过 * 获取邮箱是否注册过
* *
@@ -99,14 +79,6 @@ public interface UserService {
*/ */
boolean isExistOfEmail(String email); boolean isExistOfEmail(String email);
/**
* 获取用户的name 优先返回displayName 否则返回email
*
* @param id 用户id
* @return name
*/
String getNameById(long id);
/** /**
* 发送重置密码邮件 * 发送重置密码邮件
* *
@@ -157,7 +129,7 @@ public interface UserService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<UserModel> getUserList(Integer page, Integer count); PageData<UserModel> getUserList(Integer page, Integer count);
/** /**
* 更改用户信息 * 更改用户信息
@@ -174,4 +146,14 @@ public interface UserService {
* @return true:存在 false不存在 * @return true:存在 false不存在
*/ */
boolean getStatusOfEmail(String email); boolean getStatusOfEmail(String email);
/**
* 设置密码
*
* @param pwd pwd
* @param newPwd newPwd
* @param confirmPwd confirmPwd
* @return UserModel
*/
UserModel setPwd(String pwd, String newPwd, String confirmPwd);
} }

View File

@@ -1,7 +1,7 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.VisitorModel; import cn.celess.blog.entity.model.VisitorModel;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -20,7 +20,7 @@ public interface VisitorService {
* @param showLocation 是否显示位置信息 开启改选项数据响应超慢 * @param showLocation 是否显示位置信息 开启改选项数据响应超慢
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<VisitorModel> visitorPage(int page, int count, boolean showLocation); PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation);
/** /**
* 新增访客 * 新增访客

View File

@@ -1,7 +1,8 @@
package cn.celess.blog.service; package cn.celess.blog.service;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.WebUpdateModel; import cn.celess.blog.entity.model.WebUpdateModel;
import com.github.pagehelper.PageInfo; import net.sf.json.JSONObject;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@@ -44,7 +45,7 @@ public interface WebUpdateInfoService {
* @param page 数据页 * @param page 数据页
* @return 分页数据 * @return 分页数据
*/ */
PageInfo<WebUpdateModel> pages(int count, int page); PageData<WebUpdateModel> pages(int count, int page);
/** /**
* 获取全部的更新记录 * 获取全部的更新记录
@@ -58,5 +59,5 @@ public interface WebUpdateInfoService {
* *
* @return * @return
*/ */
String getLastestUpdateTime(); JSONObject getLastestUpdateTime();
} }

View File

@@ -1,35 +1,33 @@
package cn.celess.blog.service.serviceimpl; package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.LevelEnum;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.enmu.RoleEnum;
import cn.celess.blog.entity.*; import cn.celess.blog.entity.*;
import cn.celess.blog.entity.model.ArticleModel; import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.ArticleReq; import cn.celess.blog.entity.request.ArticleReq;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper; import cn.celess.blog.mapper.*;
import cn.celess.blog.mapper.CategoryMapper;
import cn.celess.blog.mapper.CommentMapper;
import cn.celess.blog.mapper.TagMapper;
import cn.celess.blog.service.ArticleService; import cn.celess.blog.service.ArticleService;
import cn.celess.blog.service.UserService; import cn.celess.blog.service.UserService;
import cn.celess.blog.util.DateFormatUtil; import cn.celess.blog.util.ModalTrans;
import cn.celess.blog.util.RedisUserUtil; import cn.celess.blog.util.RedisUserUtil;
import cn.celess.blog.util.RegexUtil; import cn.celess.blog.util.RegexUtil;
import cn.celess.blog.util.StringFromHtmlUtil; import cn.celess.blog.util.StringFromHtmlUtil;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.youbenzi.mdtool.tool.MDTool; import com.youbenzi.mdtool.tool.MDTool;
import org.slf4j.Logger; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import sun.security.krb5.internal.PAData;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
@@ -37,8 +35,8 @@ import java.util.List;
* @date : 2019/03/28 15:21 * @date : 2019/03/28 15:21
*/ */
@Service @Service
@Slf4j
public class ArticleServiceImpl implements ArticleService { public class ArticleServiceImpl implements ArticleService {
public static final Logger logger = LoggerFactory.getLogger(ArticleServiceImpl.class);
@Autowired @Autowired
ArticleMapper articleMapper; ArticleMapper articleMapper;
@@ -50,6 +48,8 @@ public class ArticleServiceImpl implements ArticleService {
@Autowired @Autowired
CommentMapper commentMapper; CommentMapper commentMapper;
@Autowired @Autowired
ArticleTagMapper articleTagMapper;
@Autowired
UserService userService; UserService userService;
@Autowired @Autowired
HttpServletRequest request; HttpServletRequest request;
@@ -79,466 +79,286 @@ public class ArticleServiceImpl implements ArticleService {
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) { if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} }
if (reqBody.getTags() == null || reqBody.getTags().replaceAll(" ", "").isEmpty()) { if (reqBody.getTags() == null || reqBody.getTags().length == 0) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} }
if (articleMapper.existsByTitle(reqBody.getTitle())) {
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
}
// 查看是否存在已有的分类
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
}
// 构建 需要写入数据库的对象数据
//写入数据库的数据
Article article = new Article(); Article article = new Article();
article.setTitle(reqBody.getTitle()); BeanUtils.copyProperties(reqBody, article);
article.setOpen(reqBody.getOpen());
article.setMdContent(reqBody.getMdContent());
article.setUrl(reqBody.getUrl());
article.setType(reqBody.getType());
article.setAuthorId(redisUserUtil.get(request).getId()); article.setUser(redisUserUtil.get());
article.setPublishDate(new Date());
//防止出现 “null,xxx”这种情况
article.setTagsId("");
//是否需要更新上一篇文章
boolean isUpdatePreArticle = true;
Article preArticle = null;
if (articleMapper.count() == 0) {
isUpdatePreArticle = false;
} else {
//获取最新的一条数据
preArticle = articleMapper.getLastestArticle();
}
if (isUpdatePreArticle) {
logger.info("上一篇文章的id为" + preArticle.getId());
//设置上一篇文章的id
article.setPreArticleId(preArticle.getId());
}
//markdown->html->summary //markdown->html->summary
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent())); String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
//获取摘要 摘要长度为255个字符 //获取摘要 摘要长度为255个字符
String summary = str.length() > 240 ? str.substring(0, 240) + "......" : str; String summary = str.length() > 240 ? str.substring(0, 240) + "......" : str;
//去除转换后存在的空格
String tagStr = reqBody.getTags().replaceAll(" ", "");
article.setSummary(summary); article.setSummary(summary);
if (articleMapper.existsByTitle(article.getTitle())) { article.setCategory(category);
throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
}
//将分类写入数据库
Category category1 = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category1 == null) {
category1 = new Category();
category1.setArticles("");
category1.setName(reqBody.getCategory());
categoryMapper.insert(category1);
}
article.setCategoryId(category1.getId());
//文章存数据库 //文章存数据库
articleMapper.insert(article); articleMapper.insert(article);
//获取新增的文章
if (isUpdatePreArticle) {
//更新上一篇文章的“下一篇文章ID”
articleMapper.updateNextArticleId(preArticle.getId(), article.getId());
}
//无效
// articleMapper.updatePreArticleId(article.getId(), preArticle == null ? -1 : preArticle.getId());
article.setPreArticleId(preArticle == null ? -1 : preArticle.getId());
category1.setArticles(category1.getArticles() + article.getId() + ",");
categoryMapper.update(category1);
//将标签写入数据库 //将标签写入数据库
for (String t : tagStr.split(",")) { for (String tagName : reqBody.getTags()) {
if (t.replaceAll(" ", "").length() == 0) { if (tagName.replaceAll(" ", "").length() == 0) {
//单个标签只含空格 //单个标签只含空格
continue; continue;
} }
Tag tag = tagMapper.findTagByName(t); Tag tag = tagMapper.findTagByName(tagName);
if (tag == null) { if (tag == null) {
tag = new Tag(); tag = new Tag();
tag.setName(t); tag.setName(tagName);
tag.setArticles("");
tagMapper.insert(tag); tagMapper.insert(tag);
} }
tag.setArticles(tag.getArticles() + article.getId() + ","); ArticleTag articleTag = new ArticleTag(article, tag);
article.setTagsId(article.getTagsId() + tag.getId() + ","); articleTagMapper.insert(articleTag);
tagMapper.update(tag);
}
articleMapper.update(article);
return fullTransform(articleMapper.getLastestArticle());
} }
Article articleFromDb = articleMapper.findArticleById(article.getId());
ArticleModel articleModel = ModalTrans.article(articleFromDb);
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(article.getId()), true));
return articleModel;
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public boolean delete(long articleID) { public boolean delete(long articleId) {
Article articleForDel = articleMapper.findArticleById(articleId);
Article articleForDel = articleMapper.findArticleById(articleID);
if (articleForDel == null) { if (articleForDel == null) {
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);//文章不存在 //文章不存在
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
} }
Article preArticle = articleMapper.findArticleById(articleForDel.getPreArticleId()); //对访问情况进行判断 非admin 权限不可删除文章
Article nextArticle = articleMapper.findArticleById(articleForDel.getNextArticleId()); User user = redisUserUtil.get();
if (!RoleEnum.ADMIN_ROLE.getRoleName().equals(user.getRole())) {
//对访问情况进行判断 非博主/非自己文章 拒绝访问
User user = redisUserUtil.get(request);
if (!user.getRole().contains("admin") && !articleForDel.getAuthorId().equals(user.getId())) {
throw new MyException(ResponseEnum.PERMISSION_ERROR); throw new MyException(ResponseEnum.PERMISSION_ERROR);
} }
//删除的文章处于中间位置
if (nextArticle != null && preArticle != null) {
//修改上一篇文章的“下一篇文章”y
articleMapper.updateNextArticleId(articleForDel.getPreArticleId(), articleForDel.getNextArticleId());
//修改下一篇文章的 “上一篇文章”
articleMapper.updatePreArticleId(articleForDel.getNextArticleId(), articleForDel.getPreArticleId());
}
if (preArticle == null && nextArticle != null) {
//删除的是第一篇文章
articleMapper.updatePreArticleId(nextArticle.getId(), -1);
}
if (nextArticle == null && preArticle != null) {
//删除的是最后一篇文章
articleMapper.updateNextArticleId(preArticle.getId(), -1);
}
// delete count 为删除的数据数量
int deleteCount = commentMapper.deleteByArticleId(articleID);
//删除标签中的文章id
String tag = articleForDel.getTagsId();
if (tag.length() > 0) {
String[] tags = tag.split(",");
for (String t : tags) {
if (t != null) {
//查询标签
Tag tag1 = tagMapper.findTagById(Long.parseLong(t));
//去除标签中的articleId中的待删除的文章id
String s = tag1.getArticles().replaceAll(articleForDel.getId() + ",", "");
tag1.setArticles(s);
tagMapper.update(tag1);
}
}
}
//删除分类中的文章id
//获取文章的分类
long categoryId = articleForDel.getCategoryId();
Category category = categoryMapper.findCategoryById(categoryId);
//删除文章id
category.setArticles(category.getArticles().replaceAll(articleForDel.getId() + ",", ""));
//更新
categoryMapper.update(category);
//删除指定文章 //删除指定文章
articleMapper.delete(articleID); articleMapper.delete(articleId);
//articleTagMapper.deleteByArticleId(articleId);
return true; return true;
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public ArticleModel update(ArticleReq reqBody) { public ArticleModel update(ArticleReq reqBody) {
if (reqBody == null) { if (reqBody == null || reqBody.getId() == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} }
// 查找数据
Article article = articleMapper.findArticleById(reqBody.getId());
//数据判断 //数据判断
if (reqBody.getTitle() == null || reqBody.getTitle().replaceAll(" ", "").isEmpty()) { if (reqBody.getTitle() != null && !reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); if (!article.getTitle().equals(reqBody.getTitle()) && articleMapper.existsByTitle(reqBody.getTitle())) {
} else if (reqBody.getMdContent() == null || reqBody.getMdContent().replaceAll(" ", "").isEmpty()) { throw new MyException(ResponseEnum.ARTICLE_HAS_EXIST);
}
article.setTitle(reqBody.getTitle());
}
if (reqBody.getMdContent() != null && !reqBody.getMdContent().replaceAll(" ", "").isEmpty()) {
article.setMdContent(reqBody.getMdContent());
}
//转载 判断链接
if (reqBody.getType() != null) {
if (!reqBody.getType() && reqBody.getUrl() == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} }
//转载 判断链接
if (!reqBody.getType()) { if (!reqBody.getType() && !RegexUtil.urlMatch(reqBody.getUrl())) {
if (reqBody.getUrl() == null || reqBody.getUrl().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} else if (!RegexUtil.urlMatch(reqBody.getUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR); throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
} }
article.setType(reqBody.getType());
article.setUrl(reqBody.getUrl());
} }
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) { if (reqBody.getCategory() != null && !reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category == null) {
category = new Category();
category.setName(reqBody.getCategory());
categoryMapper.insert(category);
}
article.setCategory(category);
} }
// 暂时不更新tags
// if (reqBody.getTags() == null || reqBody.getTags().replaceAll(" ", "").isEmpty()) {
// throw new MyException(ResponseEnum.PARAMETERS_ERROR);
// }
//写入数据库的数据 //写入数据库的数据
Article article = new Article(); article.setOpen(reqBody.getOpen() == null ? article.getOpen() : reqBody.getOpen());
if (reqBody.getId() == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不能为空");
}
article.setId(reqBody.getId());
article.setTitle(reqBody.getTitle());
article.setOpen(reqBody.getOpen());
article.setMdContent(reqBody.getMdContent());
article.setUrl(reqBody.getUrl());
article.setType(reqBody.getType());
Article oldArticle = articleMapper.findArticleById(reqBody.getId());
Category category = categoryMapper.findCategoryById(oldArticle.getCategoryId());
if (!(category.getName()).equals(reqBody.getCategory())) {
//修改更新之前数据 的分类
category.setArticles(category.getArticles().replace(reqBody.getId() + ",", ""));
//更新
categoryMapper.update(category);
//更新 更新之后的分类
Category category1 = categoryMapper.findCategoryByName(reqBody.getCategory());
if (category1 == null) {
category1 = new Category();
category1.setName(reqBody.getCategory());
category1.setArticles(reqBody.getId() + ",");
categoryMapper.insert(category1);
}
article.setCategoryId(category1.getId());
} else {
article.setCategoryId(oldArticle.getCategoryId());
}
// String[] newTags = reqBody.getTags().replaceAll(" ", "").split(",");
// //防止出现 null2这种情况
// article.setTagsId("");
// for (String t : newTags) {
// Tag tag = tagMapper.findTagByName(t);
// if (tag == null) {
// tag = new Tag();
// tag.setName(t);
// tag.setArticles(oldArticle.getId() + ",");
// tag = tagMapper.save(tag);
// article.setTagsId(article.getTagsId() + tag.getId() + ",");
// continue;
// }
// article.setTagsId(article.getTagsId() + tag.getId() + ",");
// }
// TODO:::: tag的更新
article.setTagsId(oldArticle.getTagsId());
article.setUpdateDate(new Date());
// TODO::::换用beansUtil
// 设置不定参数
article.setReadingNumber(oldArticle.getReadingNumber());
article.setPublishDate(oldArticle.getPublishDate());
article.setAuthorId(redisUserUtil.get(request).getId());
article.setPreArticleId(oldArticle.getPreArticleId());
article.setNextArticleId(oldArticle.getNextArticleId());
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent())); String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str); article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str);
articleMapper.update(article); articleMapper.update(article);
List<ArticleTag> allByArticleId = articleTagMapper.findAllByArticleId(article.getId());
List<ArticleTag> updateList = new ArrayList<>();
List<ArticleTag> deleteList = new ArrayList<>();
// 获取要更新 的标签
for (String tag : reqBody.getTags()) {
boolean contain = allByArticleId.stream().anyMatch(articleTag -> articleTag.getTag().getName().equals(tag));
if (!contain) {
ArticleTag articleTag = new ArticleTag();
articleTag.setArticle(article);
Tag tagByName = tagMapper.findTagByName(tag);
if (tagByName == null) {
tagByName = new Tag(tag);
tagMapper.insert(tagByName);
}
articleTag.setTag(tagByName);
updateList.add(articleTag);
}
}
// 获取要删除的标签
allByArticleId.forEach(articleTag -> {
boolean contain = false;
for (String tag : reqBody.getTags()) {
if (articleTag.getTag().getName().equals(tag)) {
contain = true;
break;
}
}
if (!contain) {
deleteList.add(articleTag);
}
});
if (updateList.size() != 0) {
updateList.forEach(articleTag -> articleTagMapper.insert(articleTag));
}
if (deleteList.size() != 0) {
articleTagMapper.deleteMultiById(deleteList);
}
//更新完成移除 //更新完成移除
request.getSession().removeAttribute("article4update"); request.getSession().removeAttribute("article4update");
return fullTransform(article); ArticleModel articleModel = ModalTrans.article(articleMapper.findArticleById(article.getId()));
setPreAndNextArticle(articleModel);
return articleModel;
} }
@Override @Override
public ArticleModel retrieveOneByID(long articleID, boolean is4update) { public ArticleModel retrieveOneById(long articleId, boolean is4update) {
Article article = articleMapper.findArticleById(articleID); Article article = articleMapper.findArticleById(articleId);
if (article == null) { if (article == null) {
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST); throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
} }
if (!article.getOpen()) { if (!article.getOpen()) {
User user = redisUserUtil.getWithOutExc(request); User user = redisUserUtil.getWithOutExc();
if (user == null || "user".equals(user.getRole())) { if (user == null || "user".equals(user.getRole())) {
throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC); throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC);
} }
} }
article.setReadingNumber(article.getReadingNumber() + 1); ArticleModel articleModel = ModalTrans.article(article);
if (is4update) { if (is4update) {
//因更新而获取文章 不需要增加阅读量 //因更新而获取文章 不需要增加阅读量
request.getSession().setAttribute("article4update", article); request.getSession().setAttribute("article4update", article);
return fullTransform(article); return articleModel;
} }
articleMapper.setReadingNumber(article.getReadingNumber() + 1, articleID); setPreAndNextArticle(articleModel);
return fullTransform(article); articleMapper.updateReadingNumber(articleId);
return articleModel;
} }
/** /**
* @param count 数目 * @param count 数目
* @param page 页面 默认减1 * @param page 页面
* @return * @return PageInfo
*/ */
@Override @Override
public PageInfo adminArticles(int count, int page) { public PageData<ArticleModel> adminArticles(int count, int page, boolean deleted) {
PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAll(); List<Article> articleList = articleMapper.findAll();
PageInfo pageInfo = new PageInfo(articleList);
pageInfo.setList(list2list(articleList, LevelEnum.BETWEEN_M_AND_H)); PageData<ArticleModel> pageData = new PageData<>(null, 0, count, page);
return pageInfo; List<Article> collect = articleList.stream().filter(article -> article.isDeleted() == deleted).collect(Collectors.toList());
pageData.setTotal(collect.size());
List<ArticleModel> articleModels = collect.stream()
.peek(article -> article.setMdContent(null))
.map(ModalTrans::article)
.skip((page - 1) * count)
.limit(count)
.collect(Collectors.toList());
pageData.setList(articleModels);
return pageData;
} }
@Override @Override
public PageInfo retrievePageForOpen(int count, int page) { public PageData<ArticleModel> retrievePageForOpen(int count, int page) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Article> articleList = articleMapper.findAllByOpen(true); List<Article> articleList = articleMapper.findAllByOpen(true);
PageInfo pageInfo = new PageInfo(articleList); PageData<ArticleModel> pageData = new PageData<>(new PageInfo<Article>(articleList));
pageInfo.setList(list2list(articleList, LevelEnum.MIDDLE));
return pageInfo; List<ArticleModel> articleModelList = new ArrayList<>();
articleList.forEach(article -> {
ArticleModel model = ModalTrans.article(article, true);
setPreAndNextArticle(model);
articleModelList.add(model);
});
pageData.setList(articleModelList);
return pageData;
} }
@Override @Override
public PageInfo findByCategory(String name, int page, int count) { public PageData<ArticleModel> findByCategory(String name, int page, int count) {
Long idByName = categoryMapper.getIDByName(name); Category category = categoryMapper.findCategoryByName(name);
if (idByName == null) { if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST); throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
} }
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
PageInfo pageInfo = new PageInfo(articleMapper.getSimpleInfoByCategory(idByName)); List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId());
return pageInfo;
List<ArticleModel> modelList = new ArrayList<>();
open.forEach(article -> {
ArticleModel model = ModalTrans.article(article, true);
model.setTags(null);
// setPreAndNextArticle(model);
model.setNextArticle(null);
model.setPreArticle(null);
modelList.add(model);
});
return new PageData<ArticleModel>(new PageInfo<Article>(open), modelList);
} }
@Override @Override
public PageInfo findByTag(String name, int page, int count) { public PageData<ArticleModel> findByTag(String name, int page, int count) {
Tag tag = tagMapper.findTagByName(name); Tag tag = tagMapper.findTagByName(name);
if (tag == null) { if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST); throw new MyException(ResponseEnum.TAG_NOT_EXIST);
} }
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
String[] split = tag.getArticles().split(","); List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId());
List<String> list = Arrays.asList(split); List<ArticleModel> modelList = new ArrayList<>();
List<Article> articleList = articleMapper.getSimpleInfoByTag(list); articleByTag.forEach(articleTag -> {
PageInfo pageInfo = new PageInfo(articleList); ArticleModel model = ModalTrans.article(articleTag.getArticle(), true);
return pageInfo; model.setNextArticle(null);
model.setPreArticle(null);
modelList.add(model);
});
return new PageData<ArticleModel>(new PageInfo<ArticleTag>(articleByTag), modelList);
} }
/** private void setPreAndNextArticle(ArticleModel articleModel) {
* page转换 if (articleModel == null) {
* return;
* @param articleList 数据源
* @param level 转换级别
* @return list
*/
private List<ArticleModel> list2list(List<Article> articleList, LevelEnum level) {
List<ArticleModel> content = new ArrayList<>();
for (Article a : articleList) {
ArticleModel model;
switch (level.getLevelCode()) {
case 0:
model = simpleTransform(a);
break;
case 1:
model = suitableTransform(a);
break;
case 2:
model = suitableTransformForAdmin(a);
break;
case 3:
default:
model = fullTransform(a);
} }
content.add(model); articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(articleModel.getId()), true));
articleModel.setNextArticle(ModalTrans.article(articleMapper.getNextArticle(articleModel.getId()), true));
} }
return content;
}
/**
* 简单的模型转换
* [id,title,summary]
*
* @param a 源数据
* @return 模型
*/
private ArticleModel simpleTransform(Article a) {
ArticleModel model = new ArticleModel();
model.setId(a.getId());
model.setTitle(a.getTitle());
model.setSummary(a.getSummary());
return model;
}
/**
* 中等转换
* [id,title,summary]
* +
* [original,tags,category]
*
* @param a
* @return
*/
private ArticleModel suitableTransform(Article a) {
ArticleModel model = simpleTransform(a);
model.setAuthorName(userService.getNameById(a.getAuthorId()));
model.setPublishDateFormat(DateFormatUtil.get(a.getPublishDate()));
model.setOriginal(a.getType());
model.setCategory(categoryMapper.getNameById(a.getCategoryId()));
String[] split = a.getTagsId().split(",");
String[] tags = new String[split.length];
for (int i = 0; i < split.length; i++) {
if (split[i] == null || "".equals(split[i])) {
continue;
}
tags[i] = tagMapper.getNameById(Long.parseLong(split[i]));
}
model.setTags(tags);
return model;
}
/**
* 中等转换 for admin页面
* [id,title]
* +
* [original,UpdateDate,open,readingNumber]
*
* @param a
* @return
*/
private ArticleModel suitableTransformForAdmin(Article a) {
ArticleModel model = simpleTransform(a);
model.setPublishDateFormat(DateFormatUtil.get(a.getPublishDate()));
model.setUpdateDateFormat(DateFormatUtil.get(a.getUpdateDate()));
model.setReadingNumber(a.getReadingNumber());
model.setOpen(a.getOpen());
model.setOriginal(a.getType());
model.setSummary(null);
return model;
}
/**
* 全转换
* [id,title,summary,original,tags,category]
* +
* [UpdateDate,MdContent,NextArticleId,NextArticleTitle,preArticleId,preArticleTitle,open,url,readingNumber]
*
* @param a
* @return
*/
private ArticleModel fullTransform(Article a) {
ArticleModel model = suitableTransform(a);
model.setUpdateDateFormat(DateFormatUtil.get(a.getUpdateDate()));
model.setMdContent(a.getMdContent());
model.setNextArticleId(a.getNextArticleId());
model.setNextArticleTitle(a.getNextArticleId() == -1 ? "" : articleMapper.getTitleById(a.getNextArticleId()));
model.setPreArticleId(a.getPreArticleId());
model.setPreArticleTitle(a.getPreArticleId() == -1 ? "" : articleMapper.getTitleById(a.getPreArticleId()));
model.setOpen(a.getOpen());
model.setUrl(a.getUrl());
model.setReadingNumber(a.getReadingNumber());
return model;
}
} }

View File

@@ -3,14 +3,21 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Article; import cn.celess.blog.entity.Article;
import cn.celess.blog.entity.Category; import cn.celess.blog.entity.Category;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.CategoryModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper; import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.CategoryMapper; import cn.celess.blog.mapper.CategoryMapper;
import cn.celess.blog.service.CategoryService; import cn.celess.blog.service.CategoryService;
import cn.celess.blog.util.ModalTrans;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@@ -27,65 +34,56 @@ public class CategoryServiceImpl implements CategoryService {
ArticleMapper articleMapper; ArticleMapper articleMapper;
@Override @Override
public Category create(String name) { public CategoryModel create(String name) {
if (categoryMapper.existsByName(name)) { if (categoryMapper.existsByName(name)) {
throw new MyException(ResponseEnum.CATEGORY_HAS_EXIST); throw new MyException(ResponseEnum.CATEGORY_HAS_EXIST);
} }
Category category = new Category(); Category category = new Category();
category.setName(name); category.setName(name);
category.setArticles("");
categoryMapper.insert(category); categoryMapper.insert(category);
return category; return ModalTrans.category(category);
}
@Override
public Category create(Category category) {
if (category == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
categoryMapper.insert(category);
return category;
} }
@Override @Override
public boolean delete(long id) { public boolean delete(long id) {
Category category = categoryMapper.findCategoryById(id); Category category = categoryMapper.findCategoryById(id);
if (category == null) { if (category == null) {
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST); throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
} }
String[] articleArray = category.getArticles().split(",");
for (int i = 0; i < articleArray.length; i++) {
if (articleArray[i] == null || "".equals(articleArray[i])) {
continue;
}
long articleId = Long.parseLong(articleArray[i]);
Article article = articleMapper.findArticleById(articleId);
if (article == null) {
continue;
}
article.setCategoryId(-1L);
//一个 文章只对应一个分类,分类不存在则文章默认不可见
article.setOpen(false);
articleMapper.update(article);
}
return categoryMapper.delete(id) == 1; return categoryMapper.delete(id) == 1;
} }
@Override @Override
public Category update(Long id, String name) { public CategoryModel update(Long id, String name) {
if (id == null) { if (id == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不可为空"); throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不可为空");
} }
Category category = categoryMapper.findCategoryById(id); Category category = categoryMapper.findCategoryById(id);
category.setName(name); category.setName(name);
categoryMapper.update(category); categoryMapper.update(category);
return category; return ModalTrans.category(category);
} }
@Override @Override
public List<Category> retrievePage() { public PageData<CategoryModel> retrievePage(int page, int count) {
return categoryMapper.findAll(); PageHelper.startPage(page, count);
List<Category> all = categoryMapper.findAll();
List<CategoryModel> modelList = new ArrayList<>();
all.forEach(e -> {
CategoryModel model = ModalTrans.category(e);
List<Article> allByCategoryId = articleMapper.findAllByCategoryId(e.getId());
List<ArticleModel> articleModelList = new ArrayList<>();
allByCategoryId.forEach(article -> {
ArticleModel articleModel = ModalTrans.article(article, true);
articleModel.setPreArticle(null);
articleModel.setNextArticle(null);
articleModel.setTags(null);
articleModelList.add(articleModel);
});
model.setArticles(articleModelList);
modelList.add(model);
});
return new PageData<CategoryModel>(new PageInfo<Category>(all), modelList);
} }
} }

View File

@@ -1,24 +1,27 @@
package cn.celess.blog.service.serviceimpl; package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.CommentStatusEnum;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Comment; import cn.celess.blog.entity.Comment;
import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.CommentModel; import cn.celess.blog.entity.model.CommentModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.CommentReq; import cn.celess.blog.entity.request.CommentReq;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper; import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.CommentMapper; import cn.celess.blog.mapper.CommentMapper;
import cn.celess.blog.mapper.UserMapper;
import cn.celess.blog.service.CommentService; import cn.celess.blog.service.CommentService;
import cn.celess.blog.service.UserService; import cn.celess.blog.util.ModalTrans;
import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.RedisUserUtil; import cn.celess.blog.util.RedisUserUtil;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@@ -30,7 +33,7 @@ public class CommentServiceImpl implements CommentService {
@Autowired @Autowired
CommentMapper commentMapper; CommentMapper commentMapper;
@Autowired @Autowired
UserService userService; UserMapper userMapper;
@Autowired @Autowired
ArticleMapper articleMapper; ArticleMapper articleMapper;
@Autowired @Autowired
@@ -40,52 +43,43 @@ public class CommentServiceImpl implements CommentService {
@Override @Override
public CommentModel create(CommentReq reqBody) { public CommentModel create(CommentReq reqBody) {
if (reqBody == null) { if (reqBody == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} }
long authorID = redisUserUtil.get(request).getId(); User user = redisUserUtil.get();
Comment pComment = null; Comment pComment = null;
if (reqBody.getPid() != null && reqBody.getPid() != -1) { if (reqBody.getPid() != -1) {
pComment = commentMapper.findCommentById(reqBody.getPid()); pComment = commentMapper.findCommentById(reqBody.getPid());
} }
if (reqBody.getPid() == null) {
reqBody.setPid(-1L);
}
//不是一级评论 //不是一级评论
if (reqBody.getPid() != -1 && pComment == null) { if (reqBody.getPid() != -1 && pComment == null) {
//父评论不存在 //父评论不存在
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} }
Comment comment = new Comment(); Comment comment = new Comment();
comment.setAuthorID(authorID); comment.setFromUser(user);
comment.setType(reqBody.getComment()); User userTo = new User();
if (reqBody.getComment()) { userTo.setId(-1L);
//若为评论 if (reqBody.getToUserId() != -1) {
if (reqBody.getArticleID() <= 0) { userTo = userMapper.findById(reqBody.getToUserId());
throw new MyException(ResponseEnum.PARAMETERS_ERROR); comment.setToUser(userTo);
} }
comment.setArticleID(reqBody.getArticleID()); comment.setToUser(userTo);
} else { userMapper.findById(reqBody.getToUserId());
comment.setArticleID(-1L); BeanUtils.copyProperties(reqBody, comment);
}
comment.setContent(reqBody.getContent());
comment.setPid(reqBody.getPid());
comment.setDate(new Date());
comment.setResponseId("");
commentMapper.insert(comment); commentMapper.insert(comment);
if (reqBody.getPid() != -1) { return ModalTrans.comment(commentMapper.findCommentById(comment.getId()));
commentMapper.updateResponder(pComment.getResponseId() + comment.getId() + ",", reqBody.getPid());
}
return trans(comment);
} }
@Override @Override
public boolean delete(long id) { public boolean delete(long id) {
boolean b = commentMapper.existsById(id); Comment b = commentMapper.findCommentById(id);
if (!b) { if (b == null) {
throw new MyException(ResponseEnum.COMMENT_NOT_EXIST); throw new MyException(ResponseEnum.COMMENT_NOT_EXIST);
} }
if (b.getStatus() == CommentStatusEnum.DELETED.getCode()) {
throw new MyException(ResponseEnum.DATA_IS_DELETED);
}
commentMapper.delete(id); commentMapper.delete(id);
return true; return true;
} }
@@ -100,93 +94,65 @@ public class CommentServiceImpl implements CommentService {
commentMapper.updateContent(reqBody.getContent(), reqBody.getId()); commentMapper.updateContent(reqBody.getContent(), reqBody.getId());
comment.setContent(reqBody.getContent()); comment.setContent(reqBody.getContent());
} }
if (!comment.getResponseId().equals(reqBody.getResponseId())) { return ModalTrans.comment(comment);
commentMapper.updateResponder(reqBody.getResponseId(), reqBody.getId());
comment.setResponseId(reqBody.getResponseId());
}
return trans(comment);
}
@Override
public PageInfo<CommentModel> retrievePage(Boolean isComment, int page, int count) {
PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByType(isComment);
PageInfo pageInfo = new PageInfo(commentList);
pageInfo.setList(list2List(commentList));
return pageInfo;
} }
@Override @Override
public PageInfo<CommentModel> retrievePageByPid(long pid, int page, int count) { public PageData<CommentModel> retrievePage(String pagePath, int page, int count) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByPId(pid); List<Comment> list = commentMapper.findAllByPagePathAndPidAndNormal(pagePath, -1);
PageInfo pageInfo = new PageInfo(commentList); return pageTrans(list);
pageInfo.setList(list2List(commentList));
return pageInfo;
} }
@Override @Override
public PageInfo<CommentModel> retrievePageByArticle(long articleID, long pid, int page, int count) { public List<CommentModel> retrievePageByPid(long pid) {
PageHelper.startPage(page, count); List<Comment> allByPagePath = commentMapper.findAllByPid(pid);
List<Comment> commentList = commentMapper.findAllByArticleIDAndPId(articleID, pid); List<CommentModel> commentModels = new ArrayList<>();
PageInfo pageInfo = new PageInfo(commentList); allByPagePath.forEach(comment -> {
pageInfo.setList(list2List(commentList)); if (comment.getStatus() != CommentStatusEnum.DELETED.getCode()) {
return pageInfo; commentModels.add(ModalTrans.comment(comment));
}
});
return commentModels;
} }
@Override @Override
public PageInfo<CommentModel> retrievePageByTypeAndPid(Boolean isComment, int pid, int page, int count) { public PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count) {
User user = redisUserUtil.get();
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findCommentsByTypeAndPId(isComment, pid); List<Comment> list = commentMapper.findAllByPagePathAndFromUser(pagePath, user.getId());
PageInfo pageInfo = new PageInfo(commentList); return pageTrans(list);
pageInfo.setList(list2List(commentList));
return pageInfo;
} }
@Override @Override
public PageInfo<CommentModel> retrievePageByAuthor(Boolean isComment, int page, int count) { public PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByAuthorIDAndType(redisUserUtil.get(request).getId(), isComment); List<Comment> list = commentMapper.findAllByPagePath(pagePath);
PageInfo pageInfo = new PageInfo(commentList); return pageTrans(list, true);
pageInfo.setList(list2List(commentList));
return pageInfo;
} }
@Override @Override
public PageInfo<CommentModel> retrievePageByType(Boolean isComment, int page, int count) { public PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Comment> commentList = commentMapper.findAllByType(isComment); List<Comment> list = commentMapper.findAllByPagePath(pagePath);
PageInfo pageInfo = new PageInfo(commentList); return pageTrans(list, true);
pageInfo.setList(list2List(commentList));
return pageInfo;
} }
private List<CommentModel> list2List(List<Comment> commentList) { private PageData<CommentModel> pageTrans(List<Comment> commentList) {
List<CommentModel> content = new ArrayList<>(); return pageTrans(commentList, false);
for (Comment c : commentList) {
content.add(trans(c));
}
return content;
} }
private CommentModel trans(Comment comment) { private PageData<CommentModel> pageTrans(List<Comment> commentList, boolean noResponseList) {
CommentModel commentModel = new CommentModel(); PageInfo<Comment> p = PageInfo.of(commentList);
commentModel.setId(comment.getId()); List<CommentModel> modelList = new ArrayList<>();
commentModel.setComment(comment.getType()); commentList.forEach(l -> {
commentModel.setContent(comment.getContent()); CommentModel model = ModalTrans.comment(l);
commentModel.setArticleID(comment.getArticleID()); if (!noResponseList) {
commentModel.setDate(DateFormatUtil.get(comment.getDate())); model.setRespComment(this.retrievePageByPid(model.getId()));
commentModel.setResponseId(comment.getResponseId());
commentModel.setPid(comment.getPid());
commentModel.setAuthorName(userService.getNameById(comment.getAuthorID()));
commentModel.setAuthorAvatarImgUrl("http://cdn.celess.cn/" + userService.getAvatarImg(comment.getAuthorID()));
if (comment.getType() && commentModel.getArticleID() > 0) {
commentModel.setArticleTitle(articleMapper.getTitleById(comment.getArticleID()));
} }
return commentModel; modelList.add(model);
});
return new PageData<CommentModel>(p, modelList);
} }
} }

View File

@@ -29,7 +29,7 @@ public class CountServiceImpl implements CountService {
@Override @Override
public long getCommentCount() { public long getCommentCount() {
return commentMapper.countByType(true); return commentMapper.count();
} }
@Override @Override
@@ -47,11 +47,6 @@ public class CountServiceImpl implements CountService {
return tagMapper.count(); return tagMapper.count();
} }
@Override
public long getLeaveMessageCount() {
return commentMapper.countByType(false);
}
@Override @Override
public long getUserCount() { public long getUserCount() {
return userMapper.count(); return userMapper.count();

View File

@@ -2,18 +2,31 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.PartnerSite; import cn.celess.blog.entity.PartnerSite;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.request.LinkApplyReq;
import cn.celess.blog.entity.request.LinkReq; import cn.celess.blog.entity.request.LinkReq;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.PartnerMapper; import cn.celess.blog.mapper.PartnerMapper;
import cn.celess.blog.service.MailService;
import cn.celess.blog.service.PartnerSiteService; import cn.celess.blog.service.PartnerSiteService;
import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.JwtUtil;
import cn.celess.blog.util.RedisUtil;
import cn.celess.blog.util.RegexUtil; import cn.celess.blog.util.RegexUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.SneakyThrows;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/** /**
* @author : xiaohai * @author : xiaohai
@@ -23,6 +36,13 @@ import java.util.List;
public class PartnerSiteServiceImpl implements PartnerSiteService { public class PartnerSiteServiceImpl implements PartnerSiteService {
@Autowired @Autowired
PartnerMapper partnerMapper; PartnerMapper partnerMapper;
@Autowired
MailService mailService;
@Autowired
RedisUtil redisUtil;
private static final String SITE_NAME = "小海博客";
private static final String SITE_URL = "celess.cn";
private static final String SITE_EMAIL = "a@celess.cn";
@Override @Override
public PartnerSite create(LinkReq reqBody) { public PartnerSite create(LinkReq reqBody) {
@@ -51,6 +71,12 @@ public class PartnerSiteServiceImpl implements PartnerSiteService {
reqBody.setUrl("http://" + reqBody.getUrl()); reqBody.setUrl("http://" + reqBody.getUrl());
} }
BeanUtils.copyProperties(reqBody, partnerSite); BeanUtils.copyProperties(reqBody, partnerSite);
if (reqBody.getIconPath() == null) {
partnerSite.setIconPath("");
}
if (reqBody.getDesc() == null) {
partnerSite.setDesc("");
}
partnerMapper.insert(partnerSite); partnerMapper.insert(partnerSite);
return partnerSite; return partnerSite;
} }
@@ -79,26 +105,125 @@ public class PartnerSiteServiceImpl implements PartnerSiteService {
if (!reqBody.getUrl().contains("http://") && !reqBody.getUrl().contains("https://")) { if (!reqBody.getUrl().contains("http://") && !reqBody.getUrl().contains("https://")) {
reqBody.setUrl("http://" + reqBody.getUrl()); reqBody.setUrl("http://" + reqBody.getUrl());
} }
if (reqBody.isOpen() != partnerSite.getOpen() && !partnerSite.getNotification() && !StringUtils.isEmpty(partnerSite.getEmail())) {
SimpleMailMessage smm = new SimpleMailMessage();
smm.setTo(partnerSite.getEmail());
smm.setText("您的友链申请,已通过");
smm.setSubject("友链申请通过");
smm.setSentDate(new Date());
mailService.send(smm);
partnerSite.setNotification(true);
}
BeanUtils.copyProperties(reqBody, partnerSite);
partnerMapper.update(partnerSite);
partnerSite.setName(reqBody.getName()); partnerSite.setName(reqBody.getName());
partnerSite.setUrl(reqBody.getUrl()); partnerSite.setUrl(reqBody.getUrl());
partnerSite.setOpen(reqBody.isOpen()); partnerSite.setOpen(reqBody.isOpen());
partnerMapper.update(partnerSite);
return partnerSite; return partnerSite;
} }
@Override @Override
public PageInfo<PartnerSite> PartnerSitePages(int page, int count) { public PageData<PartnerSite> partnerSitePages(int page, int count) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<PartnerSite> sitePage = partnerMapper.findAll(); List<PartnerSite> sitePage = partnerMapper.findAll();
PageInfo pageInfo = new PageInfo(sitePage); PageInfo<PartnerSite> pageInfo = new PageInfo<PartnerSite>(sitePage);
return pageInfo; return new PageData<>(pageInfo, sitePage);
} }
@Override @Override
public List<PartnerSite> findAll() { public List<PartnerSite> findAll() {
List<PartnerSite> all = partnerMapper.findAll(); List<PartnerSite> all = partnerMapper.findAll();
all.forEach(partnerSite -> partnerSite.setDelete(null));
return all; return all;
} }
@SneakyThrows
@Override
public PartnerSite apply(LinkApplyReq linkApplyReq) {
// 空值字段
if (StringUtils.isEmpty(linkApplyReq.getName())
|| StringUtils.isEmpty(linkApplyReq.getUrl())
|| StringUtils.isEmpty(linkApplyReq.getEmail())
|| StringUtils.isEmpty(linkApplyReq.getLinkUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
// 链接不合法
if (!RegexUtil.emailMatch(linkApplyReq.getEmail())) {
throw new MyException(ResponseEnum.PARAMETERS_EMAIL_ERROR);
}
if (!RegexUtil.urlMatch(linkApplyReq.getLinkUrl()) || !RegexUtil.urlMatch(linkApplyReq.getUrl())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
}
if (!StringUtils.isEmpty(linkApplyReq.getIconPath()) && !RegexUtil.urlMatch(linkApplyReq.getIconPath())) {
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
}
// 非强制字段 设置空
if (StringUtils.isEmpty(linkApplyReq.getIconPath())) {
linkApplyReq.setIconPath("");
}
// 抓取页面
String resp = HttpUtil.getAfterRendering(linkApplyReq.getLinkUrl());
if (resp == null) {
throw new MyException(ResponseEnum.CANNOT_GET_DATA);
}
PartnerSite ps = new PartnerSite();
if (resp.contains(SITE_URL)) {
//包含站点
BeanUtils.copyProperties(linkApplyReq, ps);
ps.setNotification(false);
ps.setOpen(false);
boolean exists = partnerMapper.existsByUrl(linkApplyReq.getUrl());
if (!exists) {
partnerMapper.insert(ps);
} else {
ps.setId(partnerMapper.findByUrl(linkApplyReq.getUrl()).getId());
}
SimpleMailMessage smm = new SimpleMailMessage();
smm.setSubject("友链申请");
smm.setText("有一条友链申请" + (exists ? ",已存在的友链链接" : "") + "[\n" + linkApplyReq.toString() + "\n]");
smm.setTo(SITE_EMAIL);
smm.setSentDate(new Date());
mailService.send(smm);
} else {
// 不包含站点
String uuid;
ObjectMapper mapper = new ObjectMapper();
if (redisUtil.hasKey(linkApplyReq.getUrl())) {
uuid = redisUtil.get(linkApplyReq.getUrl());
if (!redisUtil.hasKey(uuid)) {
redisUtil.setEx(uuid, mapper.writeValueAsString(linkApplyReq), 10, TimeUnit.MINUTES);
}
} else {
uuid = UUID.randomUUID().toString().replaceAll("-", "");
redisUtil.setEx(uuid, mapper.writeValueAsString(linkApplyReq), 10, TimeUnit.MINUTES);
redisUtil.setEx(linkApplyReq.getUrl(), uuid, 10, TimeUnit.MINUTES);
}
throw new MyException(ResponseEnum.APPLY_LINK_NO_ADD_THIS_SITE, null, uuid);
}
return ps;
}
@SneakyThrows
@Override
public String reapply(String key) {
if (!redisUtil.hasKey(key)) {
throw new MyException(ResponseEnum.DATA_EXPIRED);
}
String s = redisUtil.get(key);
ObjectMapper mapper = new ObjectMapper();
LinkApplyReq linkApplyReq = mapper.readValue(s, LinkApplyReq.class);
if (linkApplyReq == null) {
throw new MyException(ResponseEnum.DATA_NOT_EXIST);
}
SimpleMailMessage smm = new SimpleMailMessage();
smm.setSubject("友链申请");
smm.setText("有一条未抓取到信息的友链申请,[\n" + linkApplyReq.toString() + "\n]");
smm.setTo(SITE_EMAIL);
smm.setSentDate(new Date());
mailService.send(smm);
redisUtil.delete(key);
redisUtil.delete(linkApplyReq.getUrl());
return "success";
}
} }

View File

@@ -10,9 +10,7 @@ import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager; import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.FileInfo; import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth; import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.InputStream; import java.io.InputStream;
@@ -23,31 +21,29 @@ import java.io.InputStream;
*/ */
@Service @Service
public class QiniuServiceImpl implements QiniuService { public class QiniuServiceImpl implements QiniuService {
private Configuration cfg = new Configuration(Zone.zone2()); private static final Configuration cfg = new Configuration(Zone.zone2());
private UploadManager uploadManager; private static UploadManager uploadManager;
private BucketManager bucketManager; private static BucketManager bucketManager;
private Auth auth; private static Auth auth;
private static String bucket; @Value("${qiniu.accessKey}")
private String accessKey;
@Value("${qiniu.secretKey}")
{ private String secretKey;
/* ***** 必填 ****** @Value("${qiniu.bucket}")
* 七牛的配置 * private String bucket;
* ***** 必填 ******
*/
// accessKeyString,secretKeyString,bucketString请替换为自己的值
String accessKey = "accessKeyString";
String secretKey = "secretKeyString";
bucket = "bucketString";
private void init() {
if (auth == null || uploadManager == null || bucketManager == null) {
auth = Auth.create(accessKey, secretKey); auth = Auth.create(accessKey, secretKey);
uploadManager = new UploadManager(cfg); uploadManager = new UploadManager(cfg);
bucketManager = new BucketManager(auth, cfg); bucketManager = new BucketManager(auth, cfg);
} }
}
@Override @Override
public QiniuResponse uploadFile(InputStream is, String fileName) { public QiniuResponse uploadFile(InputStream is, String fileName) {
init();
//文件存在则删除文件 //文件存在则删除文件
if (continueFile(fileName)) { if (continueFile(fileName)) {
try { try {
@@ -69,6 +65,7 @@ public class QiniuServiceImpl implements QiniuService {
@Override @Override
public FileInfo[] getFileList() { public FileInfo[] getFileList() {
init();
BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, "", 1000, ""); BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, "", 1000, "");
FileInfo[] items = null; FileInfo[] items = null;
while (fileListIterator.hasNext()) { while (fileListIterator.hasNext()) {

View File

@@ -1,18 +1,25 @@
package cn.celess.blog.service.serviceimpl; package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Article; import cn.celess.blog.entity.ArticleTag;
import cn.celess.blog.entity.Tag; import cn.celess.blog.entity.Tag;
import cn.celess.blog.entity.model.ArticleModel;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.TagModel;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.ArticleMapper; import cn.celess.blog.mapper.ArticleMapper;
import cn.celess.blog.mapper.ArticleTagMapper;
import cn.celess.blog.mapper.TagMapper; import cn.celess.blog.mapper.TagMapper;
import cn.celess.blog.service.TagService; import cn.celess.blog.service.TagService;
import cn.celess.blog.util.ModalTrans;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@@ -27,9 +34,11 @@ public class TagServiceImpl implements TagService {
HttpServletRequest request; HttpServletRequest request;
@Autowired @Autowired
ArticleMapper articleMapper; ArticleMapper articleMapper;
@Autowired
ArticleTagMapper articleTagMapper;
@Override @Override
public Tag create(String name) { public TagModel create(String name) {
boolean b = tagMapper.existsByName(name); boolean b = tagMapper.existsByName(name);
if (b) { if (b) {
throw new MyException(ResponseEnum.TAG_HAS_EXIST); throw new MyException(ResponseEnum.TAG_HAS_EXIST);
@@ -37,84 +46,55 @@ public class TagServiceImpl implements TagService {
Tag tag = new Tag(); Tag tag = new Tag();
tag.setName(name); tag.setName(name);
tagMapper.insert(tag); tagMapper.insert(tag);
return tag; return ModalTrans.tag(tag);
}
@Override
public Tag create(Tag tag) {
if (tag == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
}
tagMapper.insert(tag);
return tag;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public boolean delete(long tagId) { public boolean delete(long tagId) {
Tag tag = tagMapper.findTagById(tagId); Tag tag = tagMapper.findTagById(tagId);
if (tag == null) { if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST); throw new MyException(ResponseEnum.TAG_NOT_EXIST);
} }
if (tag.getArticles()==null){ List<ArticleTag> articleByTag = articleTagMapper.findArticleByTag(tagId);
return tagMapper.delete(tagId) == 1; // 删除文章
} articleByTag.forEach(articleTag -> articleMapper.delete(articleTag.getArticle().getId()));
String[] articleArray = tag.getArticles().split(",");
for (int i = 0; i < articleArray.length; i++) {
if (articleArray[i] == null || "".equals(articleArray)) {
continue;
}
long articleID = Long.parseLong(articleArray[i]);
Article article = articleMapper.findArticleById(articleID);
if (article == null) {
continue;
}
article.setTagsId(article.getTagsId().replace(tagId + ",", ""));
articleMapper.update(article);
}
return tagMapper.delete(tagId) == 1; return tagMapper.delete(tagId) == 1;
} }
@Override @Override
public Tag update(Long id,String name) { public TagModel update(Long id, String name) {
if (id == null) { if (id == null) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "缺少ID"); throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "缺少ID");
} }
Tag tagFromDB = tagMapper.findTagById(id); Tag tag = tagMapper.findTagById(id);
tagFromDB.setName(name); tag.setName(name);
tagMapper.update(tag);
tagMapper.update(tagFromDB); return ModalTrans.tag(tag);
return tagFromDB;
} }
@Override @Override
public Tag retrieveOneById(long tagId) { public PageData<TagModel> retrievePage(int page, int count) {
Tag tag = tagMapper.findTagById(tagId);
if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
}
return tag;
}
@Override
public Tag retrieveOneByName(String name) {
Tag tag = tagMapper.findTagByName(name);
if (tag == null) {
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
}
return tag;
}
@Override
public PageInfo<Tag> retrievePage(int page, int count) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
PageInfo pageInfo = new PageInfo(tagMapper.findAll()); List<Tag> tagList = tagMapper.findAll();
return pageInfo; List<TagModel> modelList = new ArrayList<>();
tagList.forEach(tag -> modelList.add(ModalTrans.tag(tag)));
return new PageData<TagModel>(new PageInfo<Tag>(tagList), modelList);
} }
@Override @Override
public List<Tag> findAll() { public List<TagModel> findAll() {
return tagMapper.findAll(); List<TagModel> list = new ArrayList<>();
tagMapper.findAll().forEach(e -> {
TagModel model = ModalTrans.tag(e);
List<ArticleTag> articleByTagAndOpen = articleTagMapper.findArticleByTagAndOpen(e.getId());
List<ArticleModel> articleModelList = new ArrayList<>();
articleByTagAndOpen.forEach(articleTag -> articleModelList.add(ModalTrans.article(articleTag.getArticle(), true)));
model.setArticles(articleModelList);
list.add(model);
});
return list;
} }
} }

View File

@@ -1,7 +1,10 @@
package cn.celess.blog.service.serviceimpl; package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.enmu.RoleEnum;
import cn.celess.blog.entity.Response;
import cn.celess.blog.entity.User; import cn.celess.blog.entity.User;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.QiniuResponse; import cn.celess.blog.entity.model.QiniuResponse;
import cn.celess.blog.entity.model.UserModel; import cn.celess.blog.entity.model.UserModel;
import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.LoginReq;
@@ -26,7 +29,6 @@ import javax.servlet.http.HttpServletRequest;
import java.beans.Transient; import java.beans.Transient;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -74,7 +76,8 @@ public class UserServiceImpl implements UserService {
if (userMapper.existsByEmail(email)) { if (userMapper.existsByEmail(email)) {
throw new MyException(ResponseEnum.USERNAME_HAS_EXIST); throw new MyException(ResponseEnum.USERNAME_HAS_EXIST);
} }
boolean b = userMapper.addUser(email, MD5Util.getMD5(password)) == 1; User user = new User(email, MD5Util.getMD5(password));
boolean b = userMapper.addUser(user) == 1;
if (b) { if (b) {
String verifyId = UUID.randomUUID().toString().replaceAll("-", ""); String verifyId = UUID.randomUUID().toString().replaceAll("-", "");
redisUtil.setEx(email + "-verify", verifyId, 2, TimeUnit.DAYS); redisUtil.setEx(email + "-verify", verifyId, 2, TimeUnit.DAYS);
@@ -116,11 +119,10 @@ public class UserServiceImpl implements UserService {
} }
if (user.getPwd().equals(MD5Util.getMD5(loginReq.getPassword()))) { if (user.getPwd().equals(MD5Util.getMD5(loginReq.getPassword()))) {
logger.info("====> {} 进行权限认证 状态:登录成功 <====", loginReq.getEmail()); logger.info("====> {} 进行权限认证 状态:登录成功 <====", loginReq.getEmail());
userMapper.updateLoginTime(loginReq.getEmail(), new Date()); userMapper.updateLoginTime(loginReq.getEmail());
redisUtil.delete(loginReq.getEmail() + "-passwordWrongTime"); redisUtil.delete(loginReq.getEmail() + "-passwordWrongTime");
// redis 标记 // redis 标记
redisUtil.setEx(loginReq.getEmail() + "-login", JSONObject.fromObject(user).toString(), redisUserUtil.set(user, loginReq.getIsRememberMe());
(loginReq.getIsRememberMe() ? JwtUtil.EXPIRATION_LONG_TIME : JwtUtil.EXPIRATION_SHORT_TIME), TimeUnit.MILLISECONDS);
token = jwtUtil.generateToken(user, loginReq.getIsRememberMe()); token = jwtUtil.generateToken(user, loginReq.getIsRememberMe());
} else { } else {
logger.info("====> {} 进行权限认证 状态:登录失败 <====", loginReq.getEmail()); logger.info("====> {} 进行权限认证 状态:登录失败 <====", loginReq.getEmail());
@@ -138,7 +140,7 @@ public class UserServiceImpl implements UserService {
redisUtil.setEx(loginReq.getEmail() + "-passwordWrongTime", count + "", 2, TimeUnit.HOURS); redisUtil.setEx(loginReq.getEmail() + "-passwordWrongTime", count + "", 2, TimeUnit.HOURS);
throw new MyException(ResponseEnum.LOGIN_FAILURE); throw new MyException(ResponseEnum.LOGIN_FAILURE);
} }
UserModel trans = trans(user); UserModel trans = ModalTrans.userFullInfo(user);
trans.setToken(token); trans.setToken(token);
return trans; return trans;
@@ -159,13 +161,13 @@ public class UserServiceImpl implements UserService {
@Override @Override
public UserModel update(String desc, String displayName) { public UserModel update(String desc, String displayName) {
User user = redisUserUtil.get(request); User user = redisUserUtil.get();
user.setDesc(desc); user.setDesc(desc);
user.setDisplayName(displayName); user.setDisplayName(displayName);
userMapper.updateInfo(desc, displayName, user.getId()); userMapper.updateInfo(desc, displayName, user.getId());
redisUserUtil.set(user); redisUserUtil.set(user);
return trans(user); return ModalTrans.userFullInfo(user);
} }
@Override @Override
@@ -177,34 +179,20 @@ public class UserServiceImpl implements UserService {
return role; return role;
} }
@Override
public User getUserInfoByEmail(String email) {
User user = userMapper.findByEmail(email);
if (user == null) {
throw new MyException(ResponseEnum.USER_NOT_EXIST);
}
return user;
}
@Override
public String getAvatarImg(long id) {
return userMapper.getAvatarImgUrlById(id);
}
@Override @Override
public Object updateUserAavatarImg(InputStream is, String mime) { public Object updateUserAavatarImg(InputStream is, String mime) {
User user = redisUserUtil.get(request); User user = redisUserUtil.get();
QiniuResponse upload = qiniuService.uploadFile(is, user.getEmail() + "_" + user.getId() + mime.toLowerCase()); QiniuResponse upload = qiniuService.uploadFile(is, user.getEmail() + "_" + user.getId() + mime.toLowerCase());
user.setAvatarImgUrl(upload.key); user.setAvatarImgUrl(upload.key);
userMapper.updateAvatarImgUrl(upload.key, user.getId()); userMapper.updateAvatarImgUrl(upload.key, user.getId());
redisUserUtil.set(user); redisUserUtil.set(user);
return ResponseUtil.success(user.getAvatarImgUrl()); return Response.success(user.getAvatarImgUrl());
} }
@Override @Override
public UserModel getUserInfoBySession() { public UserModel getUserInfoBySession() {
User user = redisUserUtil.get(request); User user = redisUserUtil.get();
return trans(user); return ModalTrans.userFullInfo(user);
} }
@Override @Override
@@ -212,18 +200,6 @@ public class UserServiceImpl implements UserService {
return userMapper.existsByEmail(email); return userMapper.existsByEmail(email);
} }
@Override
public String getNameById(long id) {
String name = userMapper.getDisPlayName(id);
if (name == null) {
name = userMapper.getEmail(id);
if (name == null) {
throw new MyException(ResponseEnum.USER_NOT_EXIST);
}
}
return name;
}
/** /**
* 找回密码 * 找回密码
*/ */
@@ -255,7 +231,6 @@ public class UserServiceImpl implements UserService {
return "发送成功!"; return "发送成功!";
} }
//TODO
@Override @Override
public Object sendVerifyEmail(String email) { public Object sendVerifyEmail(String email) {
if (!RegexUtil.emailMatch(email)) { if (!RegexUtil.emailMatch(email)) {
@@ -367,14 +342,12 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public PageInfo<UserModel> getUserList(Integer page, Integer count) { public PageData<UserModel> getUserList(Integer page, Integer count) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<User> all = userMapper.findAll(); List<User> all = userMapper.findAll();
PageInfo pageInfo = PageInfo.of(all);
List<UserModel> modelList = new ArrayList<>(); List<UserModel> modelList = new ArrayList<>();
all.forEach(user -> modelList.add(trans(user))); all.forEach(user -> modelList.add(ModalTrans.userFullInfo(user)));
pageInfo.setList(modelList); return new PageData<UserModel>(PageInfo.of(all), modelList);
return pageInfo;
} }
@Override @Override
@@ -403,8 +376,7 @@ public class UserServiceImpl implements UserService {
user.setPwd(MD5Util.getMD5(userReq.getPwd())); user.setPwd(MD5Util.getMD5(userReq.getPwd()));
} }
if (userReq.getRole() != null) { if (userReq.getRole() != null) {
// TODO:用enum存放角色分类 if (RoleEnum.USER_ROLE.getRoleName().equals(userReq.getRole()) || RoleEnum.ADMIN_ROLE.getRoleName().equals(userReq.getRole())) {
if ("user".equals(userReq.getRole()) || "admin".equals(userReq.getRole())) {
user.setRole(userReq.getRole()); user.setRole(userReq.getRole());
} else { } else {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
@@ -414,7 +386,6 @@ public class UserServiceImpl implements UserService {
if (!RegexUtil.emailMatch(userReq.getEmail())) { if (!RegexUtil.emailMatch(userReq.getEmail())) {
throw new MyException(ResponseEnum.PARAMETERS_EMAIL_ERROR); throw new MyException(ResponseEnum.PARAMETERS_EMAIL_ERROR);
} }
// TODO :: 邮件提醒
user.setEmail(userReq.getEmail()); user.setEmail(userReq.getEmail());
} }
// 数据写入 // 数据写入
@@ -422,11 +393,11 @@ public class UserServiceImpl implements UserService {
if (updateResult == 0) { if (updateResult == 0) {
throw new MyException(ResponseEnum.FAILURE); throw new MyException(ResponseEnum.FAILURE);
} }
if (redisUserUtil.get(request).getId().equals(userReq.getId())) { if (redisUserUtil.get().getId().equals(userReq.getId())) {
redisUserUtil.set(user); redisUserUtil.set(user);
} }
logger.info("修改了用户 [id={}] 的用户的资料", userReq.getId()); logger.info("修改了用户 [id={}] 的用户的资料", userReq.getId());
return trans(user); return ModalTrans.userFullInfo(user);
} }
@Override @Override
@@ -434,16 +405,17 @@ public class UserServiceImpl implements UserService {
return userMapper.existsByEmail(email); return userMapper.existsByEmail(email);
} }
private UserModel trans(User u) { @Override
UserModel user = new UserModel(); public UserModel setPwd(String pwd, String newPwd, String confirmPwd) {
user.setId(u.getId()); User user = redisUserUtil.get();
user.setAvatarImgUrl(u.getAvatarImgUrl() == null ? null : "http://cdn.celess.cn/" + u.getAvatarImgUrl()); String pwd1 = userMapper.getPwd(user.getEmail());
user.setEmail(u.getEmail()); if (!MD5Util.getMD5(pwd).equals(pwd1)) {
user.setDesc(u.getDesc()); throw new MyException(ResponseEnum.PWD_WRONG);
user.setDisplayName(u.getDisplayName() == null ? u.getEmail() : u.getDisplayName()); }
user.setEmailStatus(u.getEmailStatus()); if (!newPwd.equals(confirmPwd)) {
user.setRecentlyLandedDate(DateFormatUtil.get(u.getRecentlyLandedDate())); throw new MyException(ResponseEnum.PWD_NOT_SAME);
user.setRole(u.getRole()); }
return user; userMapper.updatePwd(user.getEmail(), MD5Util.getMD5(newPwd));
return ModalTrans.userFullInfo(userMapper.findByEmail(user.getEmail()));
} }
} }

View File

@@ -2,6 +2,7 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Visitor; import cn.celess.blog.entity.Visitor;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.VisitorModel; import cn.celess.blog.entity.model.VisitorModel;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.VisitorMapper; import cn.celess.blog.mapper.VisitorMapper;
@@ -45,12 +46,10 @@ public class VisitorServiceImpl implements VisitorService {
} }
@Override @Override
public PageInfo<VisitorModel> visitorPage(int page, int count, boolean showLocation) { public PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<Visitor> visitorList = visitorMapper.findAll(); List<Visitor> visitorList = visitorMapper.findAll();
PageInfo pageInfo = new PageInfo(visitorList); return new PageData<VisitorModel>(new PageInfo<Visitor>(visitorList), list2List(visitorList, showLocation));
pageInfo.setList(list2List(visitorList, showLocation));
return pageInfo;
} }
@Override @Override

View File

@@ -2,16 +2,25 @@ package cn.celess.blog.service.serviceimpl;
import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.WebUpdate; import cn.celess.blog.entity.WebUpdate;
import cn.celess.blog.entity.model.PageData;
import cn.celess.blog.entity.model.WebUpdateModel; import cn.celess.blog.entity.model.WebUpdateModel;
import cn.celess.blog.exception.MyException; import cn.celess.blog.exception.MyException;
import cn.celess.blog.mapper.WebUpdateInfoMapper; import cn.celess.blog.mapper.WebUpdateInfoMapper;
import cn.celess.blog.service.WebUpdateInfoService; import cn.celess.blog.service.WebUpdateInfoService;
import cn.celess.blog.util.DateFormatUtil; import cn.celess.blog.util.DateFormatUtil;
import cn.celess.blog.util.HttpUtil;
import cn.celess.blog.util.ModalTrans;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@@ -21,6 +30,7 @@ import java.util.List;
* @date : 2019/05/12 11:43 * @date : 2019/05/12 11:43
*/ */
@Service @Service
@Slf4j
public class WebUpdateInfoServiceImpl implements WebUpdateInfoService { public class WebUpdateInfoServiceImpl implements WebUpdateInfoService {
@Autowired @Autowired
WebUpdateInfoMapper webUpdateInfoMapper; WebUpdateInfoMapper webUpdateInfoMapper;
@@ -31,11 +41,11 @@ public class WebUpdateInfoServiceImpl implements WebUpdateInfoService {
if (info == null || info.replaceAll(" ", "").isEmpty()) { if (info == null || info.replaceAll(" ", "").isEmpty()) {
throw new MyException(ResponseEnum.PARAMETERS_ERROR); throw new MyException(ResponseEnum.PARAMETERS_ERROR);
} }
WebUpdate webUpdate = new WebUpdate(info, new Date()); WebUpdate webUpdate = new WebUpdate(info);
if (webUpdateInfoMapper.insert(webUpdate) == 0) { if (webUpdateInfoMapper.insert(webUpdate) == 0) {
throw new MyException(ResponseEnum.FAILURE); throw new MyException(ResponseEnum.FAILURE);
} }
return trans(webUpdate); return ModalTrans.webUpdate(webUpdateInfoMapper.findById(webUpdate.getId()));
} }
@Override @Override
@@ -57,43 +67,42 @@ public class WebUpdateInfoServiceImpl implements WebUpdateInfoService {
} }
webUpdate.setUpdateInfo(info); webUpdate.setUpdateInfo(info);
webUpdateInfoMapper.update(id, info); webUpdateInfoMapper.update(id, info);
return trans(webUpdate); return ModalTrans.webUpdate(webUpdate);
} }
@Override @Override
public PageInfo<WebUpdateModel> pages(int count, int page) { public PageData<WebUpdateModel> pages(int count, int page) {
PageHelper.startPage(page, count); PageHelper.startPage(page, count);
List<WebUpdate> updateList = webUpdateInfoMapper.findAll(); List<WebUpdate> updateList = webUpdateInfoMapper.findAll();
PageInfo pageInfo = new PageInfo(updateList); return new PageData<WebUpdateModel>(new PageInfo<WebUpdate>(updateList), list2List(updateList));
pageInfo.setList(list2List(updateList));
return pageInfo;
} }
@Override @Override
public List<WebUpdateModel> findAll() { public List<WebUpdateModel> findAll() {
List<WebUpdate> all = webUpdateInfoMapper.findAll(); List<WebUpdate> all = webUpdateInfoMapper.findAll();
List<WebUpdateModel> webUpdateModels = new ArrayList<>(); return list2List(all);
for (WebUpdate w : all) {
webUpdateModels.add(trans(w));
}
return webUpdateModels;
} }
@Override @Override
public String getLastestUpdateTime() { public JSONObject getLastestUpdateTime() {
return DateFormatUtil.get(webUpdateInfoMapper.getLastestOne()); JSONObject jsonObject = new JSONObject();
jsonObject.put("lastUpdateTime", DateFormatUtil.get(webUpdateInfoMapper.getLastestOne().getUpdateTime()));
jsonObject.put("lastUpdateInfo", webUpdateInfoMapper.getLastestOne().getUpdateInfo());
JSONArray array = JSONArray.fromObject(HttpUtil.get("https://api.github.com/repos/xiaohai2271/blog-frontEnd/commits?page=1&per_page=1"));
JSONObject object = array.getJSONObject(0);
JSONObject commit = object.getJSONObject("commit");
jsonObject.put("lastCommit", commit.getString("message"));
jsonObject.put("committerAuthor", commit.getJSONObject("committer").getString("name"));
SimpleDateFormat sdf = new SimpleDateFormat();
Instant parse = Instant.parse(commit.getJSONObject("committer").getString("date"));
jsonObject.put("committerDate", DateFormatUtil.get(Date.from(parse)));
jsonObject.put("commitUrl", "https://github.com/xiaohai2271/blog-frontEnd/tree/" + object.getString("sha"));
return jsonObject;
} }
private List<WebUpdateModel> list2List(List<WebUpdate> webUpdates) { private List<WebUpdateModel> list2List(List<WebUpdate> webUpdates) {
List<WebUpdateModel> webUpdateModels = new ArrayList<>(); List<WebUpdateModel> webUpdateModels = new ArrayList<>();
for (WebUpdate w : webUpdates) { webUpdates.forEach(update -> webUpdateModels.add(ModalTrans.webUpdate(update)));
webUpdateModels.add(trans(w));
}
return webUpdateModels; return webUpdateModels;
} }
private WebUpdateModel trans(WebUpdate webUpdate) {
return new WebUpdateModel(webUpdate.getId(), webUpdate.getUpdateInfo(), DateFormatUtil.get(webUpdate.getUpdateTime()));
}
} }

View File

@@ -0,0 +1,86 @@
package cn.celess.blog.util;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Objects;
/**
* @Author: 小海
* @Date: 2020-04-23 15:51
* @Desc:
*/
public class HttpUtil {
private static final OkHttpClient CLIENT = new OkHttpClient();
/*public static String get(String urlStr) throws IOException {
StringBuffer sb = new StringBuffer();
HttpURLConnection urlConnection = null;
try {
URL url = new URL(urlStr);
//打开http
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
try (
InputStream inputStream = urlConnection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)
) {
//将bufferReader的值给放到buffer里
String str = null;
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
}
} finally {
//断开连接
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return sb.toString();
}
*/
public static String get(String urlStr) {
Request request = new Request.Builder()
.url(urlStr)
.get()
.build();
try (Response response = CLIENT.newCall(request).execute()) {
return Objects.requireNonNull(response.body()).string();
} catch (IOException e) {
return null;
}
}
public static String getAfterRendering(String url) {
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setDownloadImages(false);
webClient.getOptions().setActiveXNative(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
final HtmlPage page = webClient.getPage(url);
return page.asXml();
} catch (IOException e) {
return null;
}
}
}

View File

@@ -1,10 +1,11 @@
package cn.celess.blog.util; package cn.celess.blog.util;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.User; import cn.celess.blog.entity.User;
import io.jsonwebtoken.Claims; import cn.celess.blog.exception.MyException;
import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.*;
import io.jsonwebtoken.Jwts; import lombok.extern.log4j.Log4j2;
import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.Instant; import java.time.Instant;
@@ -18,23 +19,22 @@ import java.util.Map;
* @Description: JWT工具类 * @Description: JWT工具类
*/ */
@Component @Component
@Log4j2
public class JwtUtil { public class JwtUtil {
private static final String CLAIM_KEY_USERNAME = "sub";
/** /**
* 5天(毫秒) * 5天(毫秒)
*/ */
public static final long EXPIRATION_LONG_TIME = 432000000; public static final long EXPIRATION_LONG_TIME = 432000000;
/** /**
* 两小时(毫秒) * 两小时(毫秒)
*/ */
public static final long EXPIRATION_SHORT_TIME = 7200000; public static final long EXPIRATION_SHORT_TIME = 7200000;
private static final String CLAIM_KEY_USERNAME = "sub";
/** /**
* JWT 秘钥需自行设置不可泄露 * JWT 秘钥需自行设置不可泄露
*/ */
private static final String SECRET = "xxx"; @Value("${jwt.secret}")
private String SECRET;
public String generateToken(User user, boolean isRemember) { public String generateToken(User user, boolean isRemember) {
Map<String, Object> claims = new HashMap<>(16); Map<String, Object> claims = new HashMap<>(16);
@@ -47,46 +47,63 @@ public class JwtUtil {
.compact(); .compact();
} }
public Boolean validateToken(String token, User user) { public String updateTokenDate(String token) {
String username = getUsernameFromToken(token); Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
return Jwts.builder()
return (username.equals(user.getEmail()) && !isTokenExpired(token)); .setClaims(claims)
.setExpiration(new Date(claims.getExpiration().getTime() + EXPIRATION_SHORT_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
} }
/** /**
* 获取token是否过期 * 获取token是否过期
*/ */
public Boolean isTokenExpired(String token) { public Boolean isTokenExpired(String token) {
try {
Date expiration = getExpirationDateFromToken(token); Date expiration = getExpirationDateFromToken(token);
return expiration.before(new Date()); return expiration == null || expiration.before(new Date());
} catch (ExpiredJwtException e) {
return true;
}
} }
/** /**
* 根据token获取username * 根据token获取username
*/ */
public String getUsernameFromToken(String token) { public String getUsernameFromToken(String token) {
return getClaimsFromToken(token).getSubject(); Claims claims = getClaimsFromToken(token);
return claims == null ? null : claims.getSubject();
} }
/** /**
* 获取token的过期时间 * 获取token的过期时间
*/ */
public Date getExpirationDateFromToken(String token) { public Date getExpirationDateFromToken(String token) {
return getClaimsFromToken(token).getExpiration(); Claims claims = getClaimsFromToken(token);
return claims == null ? null : claims.getExpiration();
} }
/** /**
* 解析JWT * 解析JWT
*/ */
private Claims getClaimsFromToken(String token) { private Claims getClaimsFromToken(String token) {
Claims claims = Jwts.parser() Claims claims = null;
try {
claims = Jwts.parser()
.setSigningKey(SECRET) .setSigningKey(SECRET)
.parseClaimsJws(token) .parseClaimsJws(token)
.getBody(); .getBody();
} catch (ExpiredJwtException e) {
log.info("JWT令牌过期");
} catch (UnsupportedJwtException e) {
log.info("不支持的JWT令牌");
throw new MyException(ResponseEnum.JWT_NOT_SUPPORT);
} catch (MalformedJwtException e) {
log.info("JWT令牌格式错误");
throw new MyException(ResponseEnum.JWT_MALFORMED);
} catch (SignatureException e) {
log.info("JWT签名错误");
throw new MyException(ResponseEnum.JWT_SIGNATURE);
} catch (IllegalArgumentException e) {
log.debug("JWT非法参数");
}
return claims; return claims;
} }

View File

@@ -0,0 +1,109 @@
package cn.celess.blog.util;
import cn.celess.blog.entity.*;
import cn.celess.blog.entity.model.*;
import org.springframework.beans.BeanUtils;
/**
* @Author: 小海
* @Date: 2020-05-24 18:04
* @Desc:
*/
public class ModalTrans {
public static ArticleModel article(Article article) {
if (article == null) {
return null;
}
ArticleModel articleModel = new ArticleModel();
BeanUtils.copyProperties(article, articleModel);
articleModel.setPublishDateFormat(DateFormatUtil.get(article.getPublishDate()));
articleModel.setUpdateDateFormat(DateFormatUtil.get(article.getUpdateDate()));
articleModel.setOriginal(article.getType());
articleModel.setCategory(article.getCategory().getName());
articleModel.setAuthor(user(article.getUser()));
articleModel.getTags().forEach(tag -> {
tag.setCategory(null);
tag.setDeleted(null);
});
return articleModel;
}
public static ArticleModel article(Article article, boolean noMdContent) {
ArticleModel article1 = article(article);
if (!noMdContent || article1 == null) {
return article1;
}
article1.setMdContent(null);
article1.setOpen(null);
return article1;
}
public static UserModel userFullInfo(User user) {
if (user == null || user.getId() == -1) {
return null;
}
UserModel userModel = new UserModel();
BeanUtils.copyProperties(user, userModel);
userModel.setAvatarImgUrl(user.getAvatarImgUrl() == null || user.getAvatarImgUrl().length() == 0 ?
null :
"http://cdn.celess.cn/" + user.getAvatarImgUrl());
userModel.setDisplayName(user.getDisplayName() == null ? user.getEmail() : user.getDisplayName());
userModel.setRecentlyLandedDate(DateFormatUtil.get(user.getRecentlyLandedDate()));
return userModel;
}
public static UserModel user(User user) {
UserModel model = userFullInfo(user);
if (model == null) {
return null;
}
model.setRole(null);
model.setEmailStatus(null);
return model;
}
public static CategoryModel category(Category category) {
if (category == null) {
return null;
}
CategoryModel model = new CategoryModel();
BeanUtils.copyProperties(category, model);
return model;
}
public static TagModel tag(Tag tag) {
if (tag == null) {
return null;
}
TagModel model = new TagModel();
BeanUtils.copyProperties(tag, model);
return model;
}
public static WebUpdateModel webUpdate(WebUpdate update) {
if (update == null) {
return null;
}
WebUpdateModel model = new WebUpdateModel();
model.setId(update.getId());
model.setInfo(update.getUpdateInfo());
model.setTime(DateFormatUtil.get(update.getUpdateTime()));
return model;
}
public static CommentModel comment(Comment comment) {
if (comment == null) {
return null;
}
CommentModel model = new CommentModel();
BeanUtils.copyProperties(comment, model);
model.setFromUser(user(comment.getFromUser()));
model.setToUser(user(comment.getToUser()));
model.setDate(DateFormatUtil.get(comment.getDate()));
return model;
}
}

View File

@@ -20,16 +20,18 @@ public class RedisUserUtil {
RedisUtil redisUtil; RedisUtil redisUtil;
@Autowired @Autowired
JwtUtil jwtUtil; JwtUtil jwtUtil;
@Autowired
HttpServletRequest request;
public User get(HttpServletRequest request) { public User get() {
User user = getWithOutExc(request); User user = getWithOutExc();
if (user == null) { if (user == null) {
throw new MyException(ResponseEnum.HAVE_NOT_LOG_IN); throw new MyException(ResponseEnum.HAVE_NOT_LOG_IN);
} }
return user; return user;
} }
public User getWithOutExc(HttpServletRequest request) { public User getWithOutExc() {
String token = request.getHeader("Authorization"); String token = request.getHeader("Authorization");
if (token == null || token.isEmpty()) { if (token == null || token.isEmpty()) {
return null; return null;
@@ -39,8 +41,16 @@ public class RedisUserUtil {
} }
public User set(User user) { public User set(User user) {
Long expire = redisUtil.getExpire(user.getEmail() + "-login");
redisUtil.setEx(user.getEmail() + "-login", JSONObject.fromObject(user).toString(), redisUtil.setEx(user.getEmail() + "-login", JSONObject.fromObject(user).toString(),
redisUtil.getExpire(user.getEmail() + "-login"), TimeUnit.MILLISECONDS); expire > 0 ? expire : JwtUtil.EXPIRATION_SHORT_TIME, TimeUnit.MILLISECONDS);
return user;
}
public User set(User user, boolean isRemember) {
redisUtil.setEx(user.getEmail() + "-login", JSONObject.fromObject(user).toString(),
isRemember ? JwtUtil.EXPIRATION_LONG_TIME : JwtUtil.EXPIRATION_SHORT_TIME, TimeUnit.MILLISECONDS);
request.getSession().setAttribute("email", user.getEmail());
return user; return user;
} }
} }

View File

@@ -20,8 +20,8 @@ import java.util.concurrent.TimeUnit;
* Redis工具类 * Redis工具类
* *
* @author WangFan * @author WangFan
* @date 2018-02-24 下午03:09:50
* @version 1.1 (GitHub文档: https://github.com/whvcse/RedisUtil ) * @version 1.1 (GitHub文档: https://github.com/whvcse/RedisUtil )
* @date 2018-02-24 下午03:09:50
*/ */
@Component @Component
@@ -29,14 +29,14 @@ public class RedisUtil {
@Autowired @Autowired
private StringRedisTemplate redisTemplate; private StringRedisTemplate redisTemplate;
public void setRedisTemplate(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public StringRedisTemplate getRedisTemplate() { public StringRedisTemplate getRedisTemplate() {
return this.redisTemplate; return this.redisTemplate;
} }
public void setRedisTemplate(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
/** -------------------key相关操作--------------------- */ /** -------------------key相关操作--------------------- */
/** /**
@@ -196,6 +196,7 @@ public class RedisUtil {
/** /**
* 设置指定 key 的值 * 设置指定 key 的值
*
* @param key * @param key
* @param value * @param value
*/ */
@@ -205,6 +206,7 @@ public class RedisUtil {
/** /**
* 获取指定 key 的值 * 获取指定 key 的值
*
* @param key * @param key
* @return * @return
*/ */
@@ -214,6 +216,7 @@ public class RedisUtil {
/** /**
* 返回 key 中字符串值的子字符 * 返回 key 中字符串值的子字符
*
* @param key * @param key
* @param start * @param start
* @param end * @param end
@@ -259,10 +262,8 @@ public class RedisUtil {
* 设置ASCII码, 字符串'a'的ASCII码是97, 转为二进制是'01100001', 此方法是将二进制第offset位值变为value * 设置ASCII码, 字符串'a'的ASCII码是97, 转为二进制是'01100001', 此方法是将二进制第offset位值变为value
* *
* @param key * @param key
* @param postion * @param offset 位置
* 位置 * @param value 值,true为1, false为0
* @param value
* 值,true为1, false为0
* @return * @return
*/ */
public boolean setBit(String key, long offset, boolean value) { public boolean setBit(String key, long offset, boolean value) {
@@ -274,10 +275,8 @@ public class RedisUtil {
* *
* @param key * @param key
* @param value * @param value
* @param timeout * @param timeout 过期时间
* 过期时间 * @param unit 时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES
* @param unit
* 时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES
* 秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS * 秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS
*/ */
public void setEx(String key, String value, long timeout, TimeUnit unit) { public void setEx(String key, String value, long timeout, TimeUnit unit) {
@@ -289,7 +288,7 @@ public class RedisUtil {
* *
* @param key * @param key
* @param value * @param value
* @return 之前已经存在返回false,不存在返回true * @return 之前已经存在返回false, 不存在返回true
*/ */
public boolean setIfAbsent(String key, String value) { public boolean setIfAbsent(String key, String value) {
return redisTemplate.opsForValue().setIfAbsent(key, value); return redisTemplate.opsForValue().setIfAbsent(key, value);
@@ -300,8 +299,7 @@ public class RedisUtil {
* *
* @param key * @param key
* @param value * @param value
* @param offset * @param offset 从指定位置开始覆写
* 从指定位置开始覆写
*/ */
public void setRange(String key, String value, long offset) { public void setRange(String key, String value, long offset) {
redisTemplate.opsForValue().set(key, value, offset); redisTemplate.opsForValue().set(key, value, offset);
@@ -330,7 +328,7 @@ public class RedisUtil {
* 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 * 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
* *
* @param maps * @param maps
* @return 之前已经存在返回false,不存在返回true * @return 之前已经存在返回false, 不存在返回true
*/ */
public boolean multiSetIfAbsent(Map<String, String> maps) { public boolean multiSetIfAbsent(Map<String, String> maps) {
return redisTemplate.opsForValue().multiSetIfAbsent(maps); return redisTemplate.opsForValue().multiSetIfAbsent(maps);
@@ -340,7 +338,7 @@ public class RedisUtil {
* 增加(自增长), 负数则为自减 * 增加(自增长), 负数则为自减
* *
* @param key * @param key
* @param value * @param increment
* @return * @return
*/ */
public Long incrBy(String key, long increment) { public Long incrBy(String key, long increment) {
@@ -348,9 +346,8 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param value * @param increment
* @return * @return
*/ */
public Double incrByFloat(String key, double increment) { public Double incrByFloat(String key, double increment) {
@@ -526,10 +523,8 @@ public class RedisUtil {
* 获取列表指定范围内的元素 * 获取列表指定范围内的元素
* *
* @param key * @param key
* @param start * @param start 开始位置, 0是开始位置
* 开始位置, 0是开始位置 * @param end 结束位置, -1返回所有
* @param end
* 结束位置, -1返回所有
* @return * @return
*/ */
public List<String> lRange(String key, long start, long end) { public List<String> lRange(String key, long start, long end) {
@@ -548,7 +543,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param value * @param value
* @return * @return
@@ -558,7 +552,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param value * @param value
* @return * @return
@@ -591,7 +584,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param value * @param value
* @return * @return
@@ -601,7 +593,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param value * @param value
* @return * @return
@@ -611,7 +602,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param value * @param value
* @return * @return
@@ -647,8 +637,7 @@ public class RedisUtil {
* 通过索引设置列表元素的值 * 通过索引设置列表元素的值
* *
* @param key * @param key
* @param index * @param index 位置
* 位置
* @param value * @param value
*/ */
public void lSet(String key, long index, String value) { public void lSet(String key, long index, String value) {
@@ -669,10 +658,8 @@ public class RedisUtil {
* 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 * 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
* *
* @param key * @param key
* @param timeout * @param timeout 等待时间
* 等待时间 * @param unit 时间单位
* @param unit
* 时间单位
* @return * @return
*/ */
public String lBLeftPop(String key, long timeout, TimeUnit unit) { public String lBLeftPop(String key, long timeout, TimeUnit unit) {
@@ -693,10 +680,8 @@ public class RedisUtil {
* 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 * 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
* *
* @param key * @param key
* @param timeout * @param timeout 等待时间
* 等待时间 * @param unit 时间单位
* @param unit
* 时间单位
* @return * @return
*/ */
public String lBRightPop(String key, long timeout, TimeUnit unit) { public String lBRightPop(String key, long timeout, TimeUnit unit) {
@@ -734,8 +719,7 @@ public class RedisUtil {
* 删除集合中值等于value得元素 * 删除集合中值等于value得元素
* *
* @param key * @param key
* @param index * @param index index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素;
* index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素;
* index<0, 从尾部开始删除第一个值等于value的元素; * index<0, 从尾部开始删除第一个值等于value的元素;
* @param value * @param value
* @return * @return
@@ -981,8 +965,6 @@ public class RedisUtil {
* 获取集合所有元素 * 获取集合所有元素
* *
* @param key * @param key
* @param otherKeys
* @param destKey
* @return * @return
*/ */
public Set<String> setMembers(String key) { public Set<String> setMembers(String key) {
@@ -1022,7 +1004,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param options * @param options
* @return * @return
@@ -1046,7 +1027,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param values * @param values
* @return * @return
@@ -1056,7 +1036,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param values * @param values
* @return * @return
@@ -1103,10 +1082,8 @@ public class RedisUtil {
* 获取集合的元素, 从小到大排序 * 获取集合的元素, 从小到大排序
* *
* @param key * @param key
* @param start * @param start 开始位置
* 开始位置 * @param end 结束位置, -1查询所有
* @param end
* 结束位置, -1查询所有
* @return * @return
*/ */
public Set<String> zRange(String key, long start, long end) { public Set<String> zRange(String key, long start, long end) {
@@ -1130,10 +1107,8 @@ public class RedisUtil {
* 根据Score值查询集合元素 * 根据Score值查询集合元素
* *
* @param key * @param key
* @param min * @param min 最小值
* * @param max
* @param max
* 最大值
* @return * @return
*/ */
public Set<String> zRangeByScore(String key, double min, double max) { public Set<String> zRangeByScore(String key, double min, double max) {
@@ -1144,10 +1119,8 @@ public class RedisUtil {
* 根据Score值查询集合元素, 从小到大排序 * 根据Score值查询集合元素, 从小到大排序
* *
* @param key * @param key
* @param min * @param min 最小值
* * @param max
* @param max
* 最大值
* @return * @return
*/ */
public Set<TypedTuple<String>> zRangeByScoreWithScores(String key, public Set<TypedTuple<String>> zRangeByScoreWithScores(String key,
@@ -1156,7 +1129,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param min * @param min
* @param max * @param max
@@ -1224,7 +1196,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param min * @param min
* @param max * @param max
@@ -1318,7 +1289,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param otherKeys * @param otherKeys
* @param destKey * @param destKey
@@ -1359,7 +1329,6 @@ public class RedisUtil {
} }
/** /**
*
* @param key * @param key
* @param options * @param options
* @return * @return
@@ -1370,6 +1339,7 @@ public class RedisUtil {
/** /**
* 获取Redis List 序列化 * 获取Redis List 序列化
*
* @param key * @param key
* @param targetClass * @param targetClass
* @param <T> * @param <T>

View File

@@ -1,59 +0,0 @@
package cn.celess.blog.util;
import cn.celess.blog.enmu.ResponseEnum;
import cn.celess.blog.entity.Response;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author : xiaohai
* @date : 2019/03/28 15:32
*/
@ResponseBody
public class ResponseUtil {
/**
* 成功相应
*
* @param result 结果
* @return
*/
public static Response success(Object result) {
Response response = new Response();
response.setCode(ResponseEnum.SUCCESS.getCode());
response.setMsg(ResponseEnum.SUCCESS.getMsg());
response.setDate(System.currentTimeMillis());
response.setResult(result);
return response;
}
/**
* 失败的响应
*
* @param result 结果
* @return
*/
public static Response failure(String result) {
Response response = new Response();
response.setCode(ResponseEnum.FAILURE.getCode());
response.setMsg(ResponseEnum.FAILURE.getMsg());
response.setDate(System.currentTimeMillis());
response.setResult(result);
return response;
}
/**
* 其他的响应
*
* @param r 枚举常量
* @param result 结果
* @return
*/
public static Response response(ResponseEnum r, String result) {
Response response = new Response();
response.setCode(r.getCode());
response.setMsg(r.getMsg());
response.setDate(System.currentTimeMillis());
response.setResult(result);
return response;
}
}

View File

@@ -24,6 +24,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @Author: 小海 * @Author: 小海
@@ -33,16 +34,29 @@ import java.util.Map;
@Component @Component
public class SitemapGenerateUtil { public class SitemapGenerateUtil {
@Autowired
ArticleMapper articleMapper;
@Value("${sitemap.path}") @Value("${sitemap.path}")
private String path; private String path;
private Map<String, String> urlList; private Map<String, String> urlList;
@Autowired private static DocumentBuilder getDocumentBuilder() {
ArticleMapper articleMapper; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
return db;
}
@Async @Async
public void createSitemap() { public void createSitemap() {
initList(); initList();
if ("".equals(path) || "classpath".equals(path)) {
path = System.getProperty("user.dir") + "/sitemap.xml";
}
File file = new File(path); File file = new File(path);
try { try {
if (file.exists()) { if (file.exists()) {
@@ -86,24 +100,12 @@ public class SitemapGenerateUtil {
urlList.put("https://www.celess.cn", DateFormatUtil.getForXmlDate(new Date())); urlList.put("https://www.celess.cn", DateFormatUtil.getForXmlDate(new Date()));
urlList.put("https://www.celess.cn/links", DateFormatUtil.getForXmlDate(new Date())); urlList.put("https://www.celess.cn/links", DateFormatUtil.getForXmlDate(new Date()));
urlList.put("https://www.celess.cn/leaveMsg", DateFormatUtil.getForXmlDate(new Date())); urlList.put("https://www.celess.cn/leaveMsg", DateFormatUtil.getForXmlDate(new Date()));
List<Article> articles = articleMapper.findAll(); List<Article> articles = articleMapper.findAll().stream().filter(article -> article.getOpen()&&!article.isDeleted()).collect(Collectors.toList());
articles.forEach(article -> { articles.forEach(article -> {
urlList.put("https://www.celess.cn/article/" + article.getId(), DateFormatUtil.getForXmlDate( urlList.put("https://www.celess.cn/article/" + article.getId(), DateFormatUtil.getForXmlDate(
article.getUpdateDate() == null ? article.getPublishDate() : article.getUpdateDate())); article.getUpdateDate() == null ? article.getPublishDate() : article.getUpdateDate()));
}); });
} }
private static DocumentBuilder getDocumentBuilder() {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
return db;
}
} }

View File

@@ -1,5 +1,14 @@
server.port=8081 server.port=8081
# 七牛的密钥配置
qiniu.accessKey=
qiniu.secretKey=
qiniu.bucket=
# sitemap 存放地址
sitemap.path=
# 生成JWT时候的密钥
jwt.secret=
spring.jpa.show-sql=false spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.ddl-auto=update
# 上传单个文件的大小 # 上传单个文件的大小

View File

@@ -1,80 +0,0 @@
server.port=8081
sitemap.path=C:\\Users\\zh564\\Desktop\\sitemap.xml
##spring.jpa.show-sql=false
##spring.jpa.hibernate.ddl-auto=update
mybatis.type-handlers-package=cn.celess.blog.mapper.typehandler
# 上传单个文件的大小
spring.servlet.multipart.max-file-size=10MB
# 上传文件的总大小
spring.servlet.multipart.max-request-size=10MB
spring.jackson.default-property-inclusion=non_null
################# 数据库 ##################
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/test_blog?serverTimezone=UCT&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=zhenghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
################## mybatis ##################
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=cn.celess.blog.entity
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql
#### 用于nginx的代理 获取真实ip
server.use-forward-headers = true
server.tomcat.remote-ip-header = X-Real-IP
server.tomcat.protocol-header = X-Forwarded-Proto
############### email ##############
spring.mail.host=smtp.163.com
spring.mail.username=
spring.mail.password=
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
spring.mail.port=465
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false
############### redis ##############
# REDIS (RedisProperties)
# Redis数据库索引默认为0
spring.redis.database=1
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码默认为空
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=-1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000

View File

@@ -3,3 +3,5 @@ spring.profiles.active=prod
####cn.celess.blog.service.serviceimpl.QiniuServiceImpl ####cn.celess.blog.service.serviceimpl.QiniuServiceImpl
logging.level.cn.celess.blog=debug logging.level.cn.celess.blog=debug
logging.level.cn.celess.blog.mapper=info logging.level.cn.celess.blog.mapper=info
## 修改openSource 添加-test 文件用于测试 -prod文件用于线上发布

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.celess.blog.mapper.ArticleTagMapper">
<resultMap id="articleTagResultMap" type="cn.celess.blog.entity.ArticleTag">
<id column="at_id" property="id"/>
<result column="a_id" property="article.id"/>
<result column="t_id" property="tag.id"/>
<association property="article" column="a_id" resultMap="cn.celess.blog.mapper.ArticleMapper.articleResultMap"
javaType="cn.celess.blog.entity.Article">
</association>
<association property="tag" column="t_id" resultMap="cn.celess.blog.mapper.CategoryMapper.categoryResultMap"
javaType="cn.celess.blog.entity.TagCategory">
</association>
</resultMap>
<!--新增-->
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into article_tag(a_id, t_id)
values (#{article.id}, #{tag.id})
</insert>
<!--通过主键修改数据-->
<update id="update">
update article_tag
<set>
<if test="article!=null and article.id != null">
a_id = #{article.id},
</if>
<if test="tag!=null and tag.id != null">
t_id = #{tag.id},
</if>
</set>
where at_id = #{id}
</update>
<!--通过主键删除-->
<delete id="deleteById">
delete
from article_tag
where at_id = #{id};
</delete>
<delete id="deleteMultiById">
delete from article_tag where at_id in
<foreach item="item" collection="list" open="(" close=")" separator=",">
#{item.id}
</foreach>
</delete>
<!--通过主键删除-->
<update id="deleteByArticleId">
delete
from article_tag
where a_id = #{id}
</update>
<select id="findAllByArticleId" resultMap="articleTagResultMap">
select *
from article_tag,
tag_category
where a_id = #{articleId}
and article_tag.t_id = tag_category.t_id
</select>
<select id="findOneById" resultMap="articleTagResultMap">
select *
from article_tag,
article,
tag_category
where article_tag.at_id = #{id}
and article_tag.a_id = article.a_id
and tag_category.t_id = article_tag.t_id
</select>
<select id="findArticleByTag" resultMap="articleTagResultMap">
select *
from tag_category,
article,
article_tag
where tag_category.t_id = #{tagId}
and is_category = false
and tag_category.t_id = article_tag.t_id
and article_tag.a_id = article.a_id
</select>
<select id="findArticleByTagAndOpen" resultMap="articleTagResultMap">
select *
from tag_category,
article,
article_tag
where tag_category.t_id = #{tagId}
and is_category = false
and tag_category.t_id = article_tag.t_id
and article.a_is_open = true
and article_tag.a_id = article.a_id
</select>
</mapper>

View File

@@ -2,83 +2,92 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.celess.blog.mapper.CategoryMapper"> <mapper namespace="cn.celess.blog.mapper.CategoryMapper">
<resultMap id="categoryResultMap" type="cn.celess.blog.entity.Category"> <resultMap id="categoryResultMap" type="cn.celess.blog.entity.Category">
<id column="c_id" property="id"/> <id column="t_id" property="id"/>
<result column="c_name" property="name"/> <result column="t_name" property="name"/>
<result column="is_category" property="category"/>
<result column="is_delete" property="deleted"/>
</resultMap> </resultMap>
<insert id="insert"> <insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into category (c_name, articles) insert into tag_category (t_name, is_category)
values (#{name}, #{articles}); values (#{name}, true);
<selectKey resultType="java.lang.Long" keyProperty="id">
SELECT LAST_INSERT_ID() AS id
</selectKey>
</insert> </insert>
<update id="update"> <update id="update">
update category update tag_category
set c_name=#{name}, set t_name=#{name}
articles=#{articles} where t_id = #{id}
where c_id = #{id} and is_category = true
</update> </update>
<delete id="delete"> <update id="delete">
delete update tag_category
from category set is_delete= true
where c_id = #{id} where t_id = #{id}
</delete> and is_category = true
</update>
<select id="findCategoryByName" resultMap="categoryResultMap"> <select id="findCategoryByName" resultMap="categoryResultMap">
select * select *
from category from tag_category
where c_name = #{name} where t_name = #{name}
and is_category = true
</select> </select>
<select id="findCategoryById" resultMap="categoryResultMap"> <select id="findCategoryById" resultMap="categoryResultMap">
select * select *
from category from tag_category
where c_id = #{id} where t_id = #{id}
and is_category = true
</select> </select>
<select id="findAll" resultMap="categoryResultMap"> <select id="findAll" resultMap="categoryResultMap">
select * select *
from category from tag_category
where is_category = true
</select> </select>
<select id="getAllName" resultType="java.lang.String"> <select id="getAllName" resultType="java.lang.String">
select c_name select t_name
from category from tag_category
where is_category = true
</select> </select>
<select id="getNameById" resultType="java.lang.String"> <select id="getNameById" resultType="java.lang.String">
select c_name select t_name
from category from tag_category
where c_id = #{id} where is_category = true
and t_id = #{id}
</select> </select>
<select id="getIDByName" resultType="java.lang.Long"> <select id="getIdByName" resultType="java.lang.Long">
select c_id select t_id
from category from tag_category
where c_name = #{name} where is_category = true
and t_name = #{name}
</select> </select>
<select id="existsByName" resultType="java.lang.Boolean"> <select id="existsByName" resultType="java.lang.Boolean">
SELECT EXISTS(SELECT * FROM category WHERE c_name = #{name}) SELECT EXISTS(SELECT * FROM tag_category WHERE t_name = #{name} and is_category = true)
</select> </select>
<select id="existsById" resultType="java.lang.Boolean"> <select id="existsById" resultType="java.lang.Boolean">
SELECT EXISTS(SELECT * FROM category WHERE c_id = #{id}) SELECT EXISTS(SELECT * FROM tag_category WHERE t_id = #{id})
</select> </select>
<select id="getLastestCategory" resultMap="categoryResultMap"> <select id="getLastestCategory" resultMap="categoryResultMap">
select * select *
from category from tag_category
order by c_id desc where is_category = true
order by t_id desc
limit 1; limit 1;
</select> </select>
<select id="count" resultType="java.lang.Long"> <select id="count" resultType="java.lang.Long">
select count(*) select count(*)
from category; from tag_category
where is_category = true
and is_delete = false;
</select> </select>
</mapper> </mapper>

View File

@@ -3,21 +3,42 @@
<mapper namespace="cn.celess.blog.mapper.CommentMapper"> <mapper namespace="cn.celess.blog.mapper.CommentMapper">
<resultMap id="commentResultMap" type="cn.celess.blog.entity.Comment"> <resultMap id="commentResultMap" type="cn.celess.blog.entity.Comment">
<id column="co_id" property="id"/> <id column="co_id" property="id"/>
<result column="co_article_id" property="articleID"/> <result column="co_page_path" property="pagePath"/>
<result column="is_comment" property="type"/> <result column="co_status" property="status"/>
<result column="author_id" property="authorID"/>
<result column="co_content" property="content"/> <result column="co_content" property="content"/>
<result column="co_date" property="date"/> <result column="co_date" property="date"/>
<result column="co_pid" property="pid"/> <result column="co_pid" property="pid"/>
<result column="co_response_id" property="responseId"/> <result column="co_from_author_id" property="fromUser.id"/>
<result column="co_to_author_id" property="toUser.id"/>
</resultMap> </resultMap>
<insert id="insert"> <resultMap id="commentViewResultMap" type="cn.celess.blog.entity.Comment">
insert into comment (co_article_id, is_comment, author_id, co_content, co_date, co_pid) <id column="commentId" property="id"/>
VALUES (#{articleID}, #{type}, #{authorID}, #{content}, #{date}, #{pid}) <result column="pagePath" property="pagePath"/>
<selectKey resultType="java.lang.Long" keyProperty="id"> <result column="status" property="status"/>
SELECT LAST_INSERT_ID() AS id <result column="content" property="content"/>
</selectKey> <result column="date" property="date"/>
<result column="pid" property="pid"/>
<result column="fromAuthorId" property="fromUser.id"/>
<result column="toAuthorId" property="toUser.id"/>
<association property="fromUser" column="fromAuthorId" javaType="cn.celess.blog.entity.User">
<id column="fromAuthorId" property="id"/>
<result column="fromAuthorEmail" property="email"/>
<result column="fromAuthorDisplayName" property="displayName"/>
<result column="fromAuthorAvatar" property="avatarImgUrl"/>
</association>
<association property="toUser" column="toAuthorId" javaType="cn.celess.blog.entity.User">
<id column="toAuthorId" property="id"/>
<result column="toAuthorEmail" property="email"/>
<result column="toAuthorDisplayName" property="displayName"/>
<result column="toAuthorAvatar" property="avatarImgUrl"/>
</association>
</resultMap>
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into comment (co_page_path, co_content, co_date, co_pid, co_from_author_id, co_to_author_id, co_status)
VALUES (#{pagePath}, #{content}, now(), #{pid}, #{fromUser.id}, #{toUser.id}, 0)
</insert> </insert>
<update id="updateContent"> <update id="updateContent">
@@ -26,73 +47,85 @@
where co_id = #{id} where co_id = #{id}
</update> </update>
<update id="updateResponder"> <update id="delete">
update comment update comment
set co_response_id =#{responder} set co_status = 3
where co_id = #{id} where co_id = #{id}
</update> </update>
<delete id="delete">
delete <update id="deleteByPagePath">
from comment update comment
where co_id = #{id} set co_status = 3
</delete> where co_page_path = #{path}
<delete id="deleteByArticleId"> </update>
delete
from comment
where co_article_id = #{articleId}
</delete>
<select id="existsById" resultType="java.lang.Boolean"> <select id="existsById" resultType="java.lang.Boolean">
SELECT EXISTS(SELECT * FROM comment WHERE co_id = #{id}) SELECT EXISTS(SELECT * FROM comment WHERE co_id = #{id})
</select> </select>
<select id="findCommentById" resultMap="commentResultMap">
<select id="findCommentById" resultMap="commentViewResultMap">
select * select *
from comment from commentView
where co_id = #{id} where commentId = #{sqid}
</select> </select>
<select id="findAllByAuthorIDAndType" resultMap="commentResultMap">
<select id="findAllByFromUser" resultMap="commentViewResultMap">
select * select *
from comment from commentView
where author_id = #{id} where fromAuthorId = #{id}
and is_comment = #{isComment}
</select> </select>
<select id="findAllByPId" resultMap="commentResultMap">
<select id="findAllByPid" resultMap="commentViewResultMap">
select * select *
from comment from commentView
where co_pid = #{pid} where pid = #{pid}
</select> </select>
<select id="findAllByArticleID" resultMap="commentResultMap">
<select id="findAllByPagePath" resultMap="commentViewResultMap" parameterType="string">
select * select *
from comment from commentView
where co_article_id = #{articleId} <if test="toString() != null ">
where pagePath = #{pagePath}
</if>
</select> </select>
<select id="findAllByArticleIDAndPId" resultMap="commentResultMap">
<select id="findAllByPagePathAndFromUser" resultMap="commentViewResultMap">
select * select *
from comment from commentView
where co_article_id = #{articleID} where
and co_pid = #{pid} <if test="pagePath != null ">
pagePath = #{pagePath} and
</if>
fromAuthorId = #{userId}
</select> </select>
<select id="findCommentsByTypeAndPId" resultMap="commentResultMap">
<select id="findAllByPagePathAndPidAndNormal" resultMap="commentViewResultMap">
select * select *
from comment from commentView
where is_comment = #{isComment} where
and co_pid = #{pid} <if test="pagePath != null ">
pagePath = #{pagePath} and
</if>
pid = #{pid} and status = 0
</select> </select>
<select id="findAllByType" resultMap="commentResultMap">
select * <select id="countByPagePath" resultType="java.lang.Long">
from comment
where is_comment = #{isComment}
</select>
<select id="countByType" resultType="java.lang.Long">
select count(*) select count(*)
from comment from commentView
where is_comment = #{isComment} where pagePath = #{pagePath}
</select> </select>
<select id="getLastestComment" resultMap="commentResultMap">
<select id="getLastestComment" resultMap="commentViewResultMap">
select * select *
from comment from commentView
order by co_id desc order by commentId desc
limit 1 limit 1
</select> </select>
<select id="count" resultType="long">
select count(*)
from comment
where co_status = 0;
</select>
</mapper> </mapper>

View File

@@ -2,69 +2,77 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.celess.blog.mapper.PartnerMapper"> <mapper namespace="cn.celess.blog.mapper.PartnerMapper">
<resultMap id="partnerSiteResultMap" type="cn.celess.blog.entity.PartnerSite"> <resultMap id="partnerSiteResultMap" type="cn.celess.blog.entity.PartnerSite">
<id column="site_id" property="id"/> <id column="l_id" property="id"/>
<result column="site_name" property="name"/> <result column="l_name" property="name"/>
<result column="site_url" property="url"/> <result column="l_url" property="url"/>
<result column="is_open" property="open"/> <result column="l_is_open" property="open"/>
<result column="l_icon_path" property="iconPath"/>
<result column="l_desc" property="desc"/>
<result column="is_delete" property="delete"/>
<result column="l_email" property="email"/>
<result column="l_notification" property="notification"/>
</resultMap> </resultMap>
<insert id="insert" parameterType="cn.celess.blog.entity.PartnerSite"> <insert id="insert" parameterType="cn.celess.blog.entity.PartnerSite" useGeneratedKeys="true" keyProperty="id">
insert into links (site_name, is_open, site_url) insert into links (l_name, l_is_open, l_url, l_icon_path, l_desc, l_email, l_notification, is_delete)
values (#{name}, #{open}, #{url}) values (#{name}, #{open}, #{url}, #{iconPath}, #{desc}, #{email}, #{notification}, false)
<selectKey resultType="java.lang.Long" keyProperty="id">
SELECT LAST_INSERT_ID() AS id
</selectKey>
</insert> </insert>
<update id="update" parameterType="cn.celess.blog.entity.PartnerSite"> <update id="update" parameterType="cn.celess.blog.entity.PartnerSite">
update links set update links
<if test="name!=null">site_name=#{name},</if> <trim prefix="set" suffixOverrides=",">
<if test="url!=null">site_url=#{url},</if> <if test="open!=null">l_is_open=#{open},</if>
<if test="open!=null">is_open=#{open}</if> <if test="iconPath!=null">l_icon_path=#{iconPath},</if>
where site_id=#{id} <if test="desc!=null">l_desc=#{desc},</if>
<if test="url!=null">l_url=#{url},</if>
<if test="name!=null">l_name=#{name},</if>
<if test="notification!=null">l_notification=#{notification},</if>
<if test="email!=null">l_email=#{email}</if>
</trim>
where l_id=#{id}
</update> </update>
<delete id="delete"> <update id="delete">
delete update links
from links set is_delete = true
where site_id = #{id} where l_id = #{id}
</delete> </update>
<select id="existsById" resultType="boolean"> <select id="existsById" resultType="boolean">
SELECT EXISTS(SELECT * FROM links WHERE site_id = #{id}) SELECT EXISTS(SELECT * FROM links WHERE l_id = #{id})
</select> </select>
<select id="existsByName" resultType="boolean"> <select id="existsByName" resultType="boolean">
SELECT EXISTS(SELECT * FROM links WHERE site_name = #{name}) SELECT EXISTS(SELECT * FROM links WHERE l_name = #{name})
</select> </select>
<select id="existsByUrl" resultType="boolean"> <select id="existsByUrl" resultType="boolean">
SELECT EXISTS(SELECT * FROM links WHERE site_url = #{url}) SELECT EXISTS(SELECT * FROM links WHERE l_url = #{url})
</select> </select>
<select id="findById" resultMap="partnerSiteResultMap"> <select id="findById" resultMap="partnerSiteResultMap">
select * select *
from links from links
where site_id = #{id} where l_id = #{id}
</select> </select>
<select id="findByName" resultMap="partnerSiteResultMap"> <select id="findByName" resultMap="partnerSiteResultMap">
select * select *
from links from links
where site_name = #{name} where l_name = #{name}
</select> </select>
<select id="findByUrl" resultMap="partnerSiteResultMap"> <select id="findByUrl" resultMap="partnerSiteResultMap">
select * select *
from links from links
where site_url = #{url} where l_url = #{url}
</select> </select>
<select id="getLastest" resultMap="partnerSiteResultMap"> <select id="getLastest" resultMap="partnerSiteResultMap">
select * select *
from links from links
order by site_id desc order by l_id desc
limit 1 limit 1
</select> </select>
<select id="findAll" resultMap="partnerSiteResultMap"> <select id="findAll" resultMap="partnerSiteResultMap">

Some files were not shown because too many files have changed in this diff Show More