Compare commits
246 Commits
v2
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14c9a95a61 | ||
|
|
2d649b0373 | ||
|
|
4ed8939945 | ||
|
|
2c287b5c08 | ||
|
|
d07b1f9b96 | ||
|
|
4879a4bb79 | ||
|
|
027b81c006 | ||
|
|
1c976f1310 | ||
|
|
a544e1bd54 | ||
|
|
5a00e6c62f | ||
|
|
07e84ab875 | ||
|
|
a6c91fc3f1 | ||
|
|
fb88f90b70 | ||
|
|
692ce19320 | ||
|
|
5c7e3344c9 | ||
|
|
6ac9c69ff9 | ||
|
|
c6a5de6335 | ||
|
|
ab13a1713f | ||
|
|
f8ee1da333 | ||
|
|
366ce4b829 | ||
|
|
fa120a6da5 | ||
|
|
ef2f98e45f | ||
|
|
7e700b6499 | ||
|
|
c1c7f38ee9 | ||
|
|
fd509e0042 | ||
|
|
330d4d525a | ||
|
|
8c18abf120 | ||
|
|
113a054bea | ||
|
|
6d3739517a | ||
|
|
c8e93c45c7 | ||
|
|
32de31a21e | ||
|
|
cc20df91e6 | ||
|
|
71d79ed008 | ||
|
|
f7ff494ea4 | ||
|
|
971f48c5f9 | ||
|
|
e1522a8cc1 | ||
|
|
3cc4989960 | ||
|
|
8c751e6e76 | ||
|
|
af47631126 | ||
|
|
2107a1c100 | ||
|
|
2eac16dbe4 | ||
|
|
d248e15cea | ||
|
|
91a818d293 | ||
|
|
65c31e96b4 | ||
|
|
81b4851e42 | ||
|
|
9c580cf6d9 | ||
|
|
9eea5b3db9 | ||
|
|
eacb2e29f3 | ||
|
|
fafee4f918 | ||
|
|
30a4c11366 | ||
|
|
5632d47674 | ||
|
|
15b5d89554 | ||
|
|
79426dbe24 | ||
|
|
b3b19dbc45 | ||
|
|
87ec6d24ca | ||
|
|
0148c5e3f5 | ||
|
|
7cff3b9c08 | ||
|
|
a354f48edf | ||
|
|
2cd2dc93d7 | ||
|
|
d5fbc0fbf1 | ||
|
|
b29362eb8c | ||
|
|
d7c6cca683 | ||
|
|
8020eaeff3 | ||
|
|
aedcaf207b | ||
|
|
af9bf9ef46 | ||
|
|
b38ce4c8ce | ||
|
|
3d3548b984 | ||
|
|
4be9eda566 | ||
|
|
e5711746fb | ||
|
|
cc9cf8b1e8 | ||
|
|
ff076f8366 | ||
|
|
dd9ae0b3f9 | ||
|
|
0e7d5f2d23 | ||
|
|
1de1af2a54 | ||
|
|
857a3d9473 | ||
|
|
78efa62476 | ||
|
|
674812c5c6 | ||
|
|
14ce46c312 | ||
|
|
5f5fbadfd8 | ||
|
|
c153d9a0e3 | ||
|
|
18d35809f5 | ||
|
|
75e2424f75 | ||
|
|
b6c4251198 | ||
|
|
fc1bfa0e4f | ||
|
|
e37de0e177 | ||
|
|
082662af66 | ||
|
|
0c0e2404d0 | ||
|
|
71f82bfe32 | ||
|
|
61ce2fddad | ||
|
|
a245f259f7 | ||
|
|
aa22369b13 | ||
|
|
8c3866afe6 | ||
|
|
2c85c3eaac | ||
|
|
2559937e02 | ||
|
|
8de4be602e | ||
|
|
1f88995884 | ||
|
|
c879fbff5f | ||
|
|
f6020bf8d0 | ||
|
|
418b1d78e5 | ||
|
|
98ed489bb1 | ||
|
|
cfdd818829 | ||
|
|
3afbef009f | ||
|
|
8f4d1cd6c8 | ||
|
|
0ba7e06695 | ||
|
|
512d04f3e9 | ||
|
|
ada8f67171 | ||
|
|
6e12331e61 | ||
|
|
81ee71adf1 | ||
|
|
7e7332694e | ||
|
|
8db690a55f | ||
|
|
0b40522e93 | ||
|
|
9026ba0732 | ||
|
|
f5f2437fa4 | ||
|
|
0bcca091e1 | ||
|
|
3c69baa4ad | ||
|
|
baf5b1bbb7 | ||
|
|
38621bcfa4 | ||
|
|
cf435a588f | ||
|
|
feab26f4f7 | ||
|
|
578dbe6cc5 | ||
|
|
f3b03f4853 | ||
|
|
ee85b1f175 | ||
|
|
925e816f7a | ||
|
|
a59bb7f231 | ||
|
|
7f17c20e01 | ||
|
|
6eabb3ab22 | ||
|
|
72674f4612 | ||
|
|
9b460ff33c | ||
|
|
a26946a583 | ||
|
|
01407aba7e | ||
|
|
a54e04abf3 | ||
|
|
450b4a40bd | ||
|
|
9f883d12df | ||
|
|
c17b56b436 | ||
|
|
b55a50d548 | ||
|
|
4c9b193857 | ||
|
|
18a8c916c3 | ||
|
|
99f2907621 | ||
|
|
939b06d0a9 | ||
|
|
a7f947a017 | ||
|
|
40e1f4d6ab | ||
|
|
6b77655c16 | ||
|
|
7ff44fd73e | ||
|
|
c9f91bf2c1 | ||
|
|
03fcddb971 | ||
|
|
dc851e84a4 | ||
|
|
b34acee733 | ||
|
|
d46dada23a | ||
|
|
47e5030f52 | ||
|
|
94c9fc1c46 | ||
|
|
bdcfaef5f8 | ||
|
|
3b6439c5cf | ||
|
|
938a051487 | ||
|
|
a04b51a82e | ||
|
|
ee4c4bd87e | ||
|
|
e70ad72523 | ||
|
|
c466ddddea | ||
|
|
7257f23ef6 | ||
|
|
7c96151830 | ||
|
|
5a47803611 | ||
|
|
af9f243a83 | ||
|
|
3c8abc895a | ||
|
|
9ffa293d24 | ||
|
|
d13ab4e522 | ||
|
|
2fce2d8a1c | ||
|
|
6eb7d01875 | ||
|
|
aa751dbba1 | ||
|
|
14ff60ecfc | ||
|
|
5dae647885 | ||
|
|
bf2abd6072 | ||
|
|
a62b395a8a | ||
|
|
5059859ae4 | ||
|
|
ecdbf8e21c | ||
|
|
c69eee7027 | ||
|
|
8e8a7c809d | ||
|
|
c6a97e4c5b | ||
|
|
d50cd93e55 | ||
|
|
e32600d892 | ||
|
|
d473b5931b | ||
|
|
ab6f9d894d | ||
|
|
49ee7c73e2 | ||
|
|
4a65df2a7d | ||
|
|
b6c6cda4ae | ||
|
|
a9efb1c04d | ||
|
|
4ac430445d | ||
|
|
7ac3d69da4 | ||
|
|
657a200d81 | ||
|
|
85c3541445 | ||
|
|
c6877c2b4a | ||
|
|
9e98134003 | ||
|
|
7a81d8e4ce | ||
|
|
1b52e27b72 | ||
|
|
cd9d9ff0e6 | ||
|
|
dcf44cefb6 | ||
|
|
d83e4de9a3 | ||
|
|
9c949576aa | ||
|
|
85b24891be | ||
|
|
da95470993 | ||
|
|
3b368c92cb | ||
|
|
ad5271f740 | ||
|
|
d2cf640133 | ||
|
|
4a2abc47cc | ||
|
|
6b29cd39d4 | ||
|
|
69da168fc1 | ||
|
|
f375def613 | ||
|
|
d6cede718b | ||
|
|
7922ea558f | ||
|
|
f65c96fa2d | ||
|
|
af43657b5b | ||
|
|
1bfd2d713e | ||
|
|
ffed0d5cd0 | ||
|
|
b9094c1345 | ||
|
|
e9209d1852 | ||
|
|
9900605e1a | ||
|
|
883a78e872 | ||
|
|
c7016dcf5f | ||
|
|
526b73b4f8 | ||
|
|
66b2b26b15 | ||
|
|
f1d3a79919 | ||
|
|
003f74f5f1 | ||
|
|
2f6253c175 | ||
|
|
aa3ee5db72 | ||
|
|
d340ba8218 | ||
|
|
7be1c9dfb0 | ||
|
|
b7f26cbfdb | ||
|
|
d9db98849a | ||
|
|
6c3645ba15 | ||
|
|
43a5e2ab2f | ||
|
|
739256424f | ||
|
|
3c839ad8ca | ||
|
|
efbd5b3d72 | ||
|
|
5ba7e684fa | ||
|
|
f7c1726d51 | ||
|
|
5504abe3e0 | ||
|
|
5aeec0cfe4 | ||
|
|
e2fe41c2e0 | ||
|
|
48f485b378 | ||
|
|
6ee8fb65c3 | ||
|
|
de5e40e6b8 | ||
|
|
2106bf4d94 | ||
|
|
72cef158a1 | ||
|
|
d1f08b58c0 | ||
|
|
8b255372dd | ||
|
|
f88bf105a9 | ||
|
|
0e26eab2e6 | ||
|
|
778c2dba58 |
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
12
.github/dependabot.yml
vendored
Normal file
12
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "maven" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
open-pull-requests-limit: 10
|
||||
49
.github/workflows/build.yml
vendored
Normal file
49
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- "doc/**"
|
||||
- "**/README.md"
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- "doc/**"
|
||||
- "**/README.md"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: "!contains(github.event.head_commit.message, '[skip ci]')" # 如果 commit 信息包含以下关键字则跳过该任务
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
KEY: ${{ secrets.WEB_HOOK_ACCESS_KEY }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 1.8
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 1.8
|
||||
|
||||
- name: Sync repository
|
||||
uses: x-dr/sync-repo-to-gitee@v1.0
|
||||
env:
|
||||
# 在 Settings->Secrets 配置 GITEE_KEY
|
||||
SSH_KEY: ${{ secrets.GITEE_KEY }}
|
||||
with:
|
||||
# GitHub存储库的SSH URL.
|
||||
github-repo: git@github.com:xiaohai2271/blog-backEnd.git
|
||||
# Gitee存储库的SSH URL.
|
||||
gitee-repo: git@gitee.com:xiaohai2271/blog-backEnd.git
|
||||
|
||||
- name: Cache local Maven repository
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-maven-
|
||||
|
||||
- name: Unit Test
|
||||
run: mvn package -B -pl blog-deploy -am
|
||||
47
.github/workflows/mavenpublish.yml
vendored
47
.github/workflows/mavenpublish.yml
vendored
@@ -1,47 +0,0 @@
|
||||
# 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: Blog backEnd CI
|
||||
|
||||
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_TEST|base64 -d > src/main/resources/application-test.properties && 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 }}
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -4,7 +4,5 @@
|
||||
target/
|
||||
|
||||
# 本地项目的私有文件
|
||||
back-end/blog-dev.sql
|
||||
src/main/resources/application-dev.properties
|
||||
blog-deploy/src/main/resources/application-dev.properties
|
||||
src/main/resources/application-prod.properties
|
||||
src/main/resources/application-test.properties
|
||||
|
||||
17
.mvn/wrapper/MavenWrapperDownloader.java
vendored
17
.mvn/wrapper/MavenWrapperDownloader.java
vendored
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
* Copyright 2007-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "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
|
||||
* http://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,
|
||||
@@ -13,7 +13,6 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.nio.channels.*;
|
||||
@@ -21,12 +20,12 @@ import java.util.Properties;
|
||||
|
||||
public class MavenWrapperDownloader {
|
||||
|
||||
private static final String WRAPPER_VERSION = "0.5.5";
|
||||
private static final String WRAPPER_VERSION = "0.5.6";
|
||||
/**
|
||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
|
||||
*/
|
||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
|
||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
||||
|
||||
/**
|
||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
|
||||
@@ -55,7 +54,7 @@ public class MavenWrapperDownloader {
|
||||
// wrapperUrl parameter.
|
||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
|
||||
String url = DEFAULT_DOWNLOAD_URL;
|
||||
if (mavenWrapperPropertyFile.exists()) {
|
||||
if(mavenWrapperPropertyFile.exists()) {
|
||||
FileInputStream mavenWrapperPropertyFileInputStream = null;
|
||||
try {
|
||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
|
||||
@@ -66,7 +65,7 @@ public class MavenWrapperDownloader {
|
||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
|
||||
} finally {
|
||||
try {
|
||||
if (mavenWrapperPropertyFileInputStream != null) {
|
||||
if(mavenWrapperPropertyFileInputStream != null) {
|
||||
mavenWrapperPropertyFileInputStream.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -77,8 +76,8 @@ public class MavenWrapperDownloader {
|
||||
System.out.println("- Downloading from: " + url);
|
||||
|
||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
|
||||
if (!outputFile.getParentFile().exists()) {
|
||||
if (!outputFile.getParentFile().mkdirs()) {
|
||||
if(!outputFile.getParentFile().exists()) {
|
||||
if(!outputFile.getParentFile().mkdirs()) {
|
||||
System.out.println(
|
||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
|
||||
}
|
||||
|
||||
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
Binary file not shown.
4
.mvn/wrapper/maven-wrapper.properties
vendored
4
.mvn/wrapper/maven-wrapper.properties
vendored
@@ -1,2 +1,2 @@
|
||||
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
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 小海
|
||||
Copyright (c) 2020 禾几海
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
38
README.md
38
README.md
@@ -1,11 +1,23 @@
|
||||
# 小海博客后端管理系统
|
||||
   [](https://www.celess.cn)
|
||||
## 基于Springboot的后端博客管理系统
|
||||
<h1 align="center">
|
||||
小海博客后端管理系统
|
||||
</h1>
|
||||
|
||||
<div align="center">
|
||||
|
||||
基于Springboot的后端博客管理系统
|
||||
|
||||
[](https://github.com/xiaohai2271/blog-backEnd)
|
||||
[](https://github.com/xiaohai2271/blog-backEnd)
|
||||
[](https://github.com/xiaohai2271/blog-backEnd)
|
||||
[](https://github.com/xiaohai2271/blog-backEnd)
|
||||
[](https://github.com/xiaohai2271/blog-backEnd)
|
||||
[](https://github.com/xiaohai2271/blog-backEnd)
|
||||
[](https://github.com/xiaohai2271/blog-backEnd)
|
||||
[](https://www.celess.cn)
|
||||
</div>
|
||||
|
||||
### 主要使用的技术
|
||||
> 请配合前端项目一起食用 [https://github.com/xiaohai2271/blog-frontEnd](https://github.com/xiaohai2271/blog-frontEnd)
|
||||
## 🎈主要使用的技术
|
||||
|
||||
| 使用的技术 | 名称 | 版本 |
|
||||
| :--------------: | :--------: | :-----------: |
|
||||
@@ -18,18 +30,16 @@
|
||||
| 接口文档 | Swagger | 2.6.1 |
|
||||
| 数据库连接池 | druid | 1.1.14 |
|
||||
| 缓存(线上环境) | redis | 3.0.6 |
|
||||
|数据库|mysql|5.7|
|
||||
| 数据库 |mysql |5.7 |
|
||||
|
||||
### 接口文档
|
||||
## 🔨如何构建
|
||||
详情参照[Build](./doc/Build.md)文档
|
||||
|
||||
项目采用swagger2,接口文档自动生成,具体为 http://ip:端口/swagger-ui.html
|
||||
|
||||
### 📝TODO
|
||||
## 📒接口文档
|
||||
项目采用swagger2,接口文档自动生成,具体为 http://ip:port/doc.html
|
||||
|
||||
- [x] 密码重置
|
||||
- [x] 信息修改
|
||||
- [ ] 接入qq登录
|
||||
或者参照[离线API文档](./doc/API.md)
|
||||
|
||||
### 📌FIXME
|
||||
|
||||
- [ ] `/write` 图片上传的跨域问题
|
||||
## ☀授权协议
|
||||
[MIT](./LICENSE)
|
||||
|
||||
45
blog-article/pom.xml
Normal file
45
blog-article/pom.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>blog</artifactId>
|
||||
<groupId>cn.celess</groupId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>blog-article</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>cn.celess</groupId>
|
||||
<artifactId>blog-common</artifactId>
|
||||
<version>${blog-common.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.celess</groupId>
|
||||
<artifactId>blog-user</artifactId>
|
||||
<version>${blog-user.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--MarkDown 2 html -->
|
||||
<dependency>
|
||||
<groupId>com.youbenzi</groupId>
|
||||
<artifactId>MDTool</artifactId>
|
||||
<version>1.2.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.minidev</groupId>
|
||||
<artifactId>json-smart</artifactId>
|
||||
<version>2.4.7</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,18 @@
|
||||
package cn.celess.article;
|
||||
|
||||
import cn.celess.common.CommonApplication;
|
||||
import cn.celess.user.UserApplication;
|
||||
import org.springframework.boot.Banner;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.core.SpringVersion;
|
||||
|
||||
@SpringBootApplication(scanBasePackageClasses = {ArticleApplication.class, CommonApplication.class, UserApplication.class})
|
||||
public class ArticleApplication {
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(ArticleApplication.class)
|
||||
.main(SpringVersion.class)
|
||||
.bannerMode(Banner.Mode.CONSOLE)
|
||||
.run(args);
|
||||
}
|
||||
}
|
||||
@@ -1,153 +1,161 @@
|
||||
package cn.celess.blog.controller;
|
||||
|
||||
import cn.celess.blog.enmu.ResponseEnum;
|
||||
import cn.celess.blog.entity.Response;
|
||||
import cn.celess.blog.entity.model.ArticleModel;
|
||||
import cn.celess.blog.entity.request.ArticleReq;
|
||||
import cn.celess.blog.service.ArticleService;
|
||||
import cn.celess.blog.util.RedisUserUtil;
|
||||
import cn.celess.blog.util.SitemapGenerateUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:18
|
||||
*/
|
||||
@RestController
|
||||
public class ArticleController {
|
||||
@Autowired
|
||||
ArticleService articleService;
|
||||
@Autowired
|
||||
SitemapGenerateUtil sitemapGenerateUtil;
|
||||
@Autowired
|
||||
RedisUserUtil redisUserUtil;
|
||||
|
||||
/**
|
||||
* 新建一篇文章
|
||||
*
|
||||
* @param body 请求数据
|
||||
* @return Response
|
||||
*/
|
||||
@PostMapping("/admin/article/create")
|
||||
public Response create(@RequestBody ArticleReq body) {
|
||||
ArticleModel articleModel = articleService.create(body);
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
return Response.success(articleModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过文章id 删除一篇文章
|
||||
*
|
||||
* @param articleId 文章id
|
||||
* @return Response
|
||||
*/
|
||||
@DeleteMapping("/admin/article/del")
|
||||
public Response delete(@RequestParam("articleID") long articleId) {
|
||||
boolean delete = articleService.delete(articleId);
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
return Response.success(delete);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新文章
|
||||
*
|
||||
* @param body 请求数据
|
||||
* @return Response
|
||||
*/
|
||||
@PutMapping("/admin/article/update")
|
||||
public Response update(@RequestBody ArticleReq body) {
|
||||
ArticleModel update = articleService.update(body);
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
return Response.success(update);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过id查找一篇文章
|
||||
* 公开 =>返回数据
|
||||
* 不公开
|
||||
* *** =>作者 返回数据
|
||||
* *** =>其他 抛出错误
|
||||
*
|
||||
* @param articleId 文章id
|
||||
* @param is4update 是否是更新
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/article/articleID/{articleID}")
|
||||
public Response retrieveOneById(@PathVariable("articleID") long articleId,
|
||||
@RequestParam(value = "update", defaultValue = "false") boolean is4update,
|
||||
HttpServletRequest request) {
|
||||
ArticleModel article = articleService.retrieveOneById(articleId, is4update);
|
||||
if (article.getOpen()) {
|
||||
return Response.success(article);
|
||||
} else if (article.getAuthor().getId().equals(redisUserUtil.get().getId())) {
|
||||
return Response.success(article);
|
||||
}
|
||||
return Response.response(ResponseEnum.PERMISSION_ERROR, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页获取所有文章状态为开放的的文章
|
||||
*
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/articles")
|
||||
public Response articles(@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "5") int count) {
|
||||
return Response.success(articleService.retrievePageForOpen(count, page));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页获取所有文章
|
||||
*
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/admin/articles")
|
||||
public Response adminArticles(@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "10") int count) {
|
||||
return Response.success(articleService.adminArticles(count, page));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过分类获取文章(文章摘要)
|
||||
*
|
||||
* @param name 分类名
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/articles/category/{name}")
|
||||
public Response findByCategory(@PathVariable("name") String name,
|
||||
@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "10") int count) {
|
||||
return Response.success(articleService.findByCategory(name, page, count));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过标签名获取文章(文章摘要)
|
||||
*
|
||||
* @param name 标签名
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/articles/tag/{name}")
|
||||
public Response findByTag(@PathVariable("name") String name,
|
||||
@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "10") int count) {
|
||||
return Response.success(articleService.findByTag(name, page, count));
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/createSitemap")
|
||||
public Response createSitemap() {
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
return Response.success(null);
|
||||
}
|
||||
}
|
||||
package cn.celess.article.controller;
|
||||
|
||||
import cn.celess.article.util.SitemapGenerateUtil;
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.dto.ArticleReq;
|
||||
import cn.celess.common.entity.vo.ArticleModel;
|
||||
import cn.celess.common.service.ArticleService;
|
||||
import cn.celess.common.util.EnvironmentUtil;
|
||||
import cn.celess.user.util.RedisUserUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:18
|
||||
*/
|
||||
@RestController
|
||||
public class ArticleController {
|
||||
@Autowired
|
||||
ArticleService articleService;
|
||||
@Autowired
|
||||
SitemapGenerateUtil sitemapGenerateUtil;
|
||||
@Autowired
|
||||
RedisUserUtil redisUserUtil;
|
||||
|
||||
/**
|
||||
* 新建一篇文章
|
||||
*
|
||||
* @param body 请求数据
|
||||
* @return Response
|
||||
*/
|
||||
@PostMapping("/admin/article/create")
|
||||
public Response create(@RequestBody ArticleReq body) {
|
||||
ArticleModel articleModel = articleService.create(body);
|
||||
if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) {
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
}
|
||||
return Response.success(articleModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过文章id 删除一篇文章
|
||||
*
|
||||
* @param articleId 文章id
|
||||
* @return Response
|
||||
*/
|
||||
@DeleteMapping("/admin/article/del")
|
||||
public Response delete(@RequestParam("articleID") long articleId) {
|
||||
boolean delete = articleService.delete(articleId);
|
||||
if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) {
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
}
|
||||
return Response.success(delete);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新文章
|
||||
*
|
||||
* @param body 请求数据
|
||||
* @return Response
|
||||
*/
|
||||
@PutMapping("/admin/article/update")
|
||||
public Response update(@RequestBody ArticleReq body) {
|
||||
ArticleModel update = articleService.update(body);
|
||||
if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) {
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
}
|
||||
return Response.success(update);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过id查找一篇文章
|
||||
* 公开 =>返回数据
|
||||
* 不公开
|
||||
* *** =>作者 返回数据
|
||||
* *** =>其他 抛出错误
|
||||
*
|
||||
* @param articleId 文章id
|
||||
* @param is4update 是否是更新
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/article/articleID/{articleID}")
|
||||
public Response retrieveOneById(@PathVariable("articleID") long articleId,
|
||||
@RequestParam(value = "update", defaultValue = "false") boolean is4update,
|
||||
HttpServletRequest request) {
|
||||
ArticleModel article = articleService.retrieveOneById(articleId, is4update);
|
||||
if (article.getOpen()) {
|
||||
return Response.success(article);
|
||||
} else if (article.getAuthor().getId().equals(redisUserUtil.get().getId())) {
|
||||
return Response.success(article);
|
||||
}
|
||||
return Response.response(ResponseEnum.PERMISSION_ERROR, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页获取所有文章状态为开放的的文章
|
||||
*
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/articles")
|
||||
public Response articles(@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "5") int count) {
|
||||
return Response.success(articleService.retrievePageForOpen(count, page));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页获取所有文章
|
||||
*
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/admin/articles")
|
||||
public Response adminArticles(@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "10") int count,
|
||||
@RequestParam(name = "deleted", required = false) Boolean deleted) {
|
||||
return Response.success(articleService.adminArticles(count, page, deleted));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过分类获取文章(文章摘要)
|
||||
*
|
||||
* @param name 分类名
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/articles/category/{name}")
|
||||
public Response findByCategory(@PathVariable("name") String name,
|
||||
@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "10") int count) {
|
||||
return Response.success(articleService.findByCategory(name, page, count));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过标签名获取文章(文章摘要)
|
||||
*
|
||||
* @param name 标签名
|
||||
* @param page 页码
|
||||
* @param count 单页数据量
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/articles/tag/{name}")
|
||||
public Response findByTag(@PathVariable("name") String name,
|
||||
@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "10") int count) {
|
||||
return Response.success(articleService.findByTag(name, page, count));
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/createSitemap")
|
||||
public Response createSitemap() {
|
||||
sitemapGenerateUtil.createSitemap();
|
||||
return Response.success(null);
|
||||
}
|
||||
}
|
||||
@@ -1,359 +1,368 @@
|
||||
package cn.celess.blog.service.serviceimpl;
|
||||
|
||||
import cn.celess.blog.enmu.ResponseEnum;
|
||||
import cn.celess.blog.enmu.RoleEnum;
|
||||
import cn.celess.blog.entity.*;
|
||||
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.exception.MyException;
|
||||
import cn.celess.blog.mapper.*;
|
||||
import cn.celess.blog.service.ArticleService;
|
||||
import cn.celess.blog.service.UserService;
|
||||
import cn.celess.blog.util.ModalTrans;
|
||||
import cn.celess.blog.util.RedisUserUtil;
|
||||
import cn.celess.blog.util.RegexUtil;
|
||||
import cn.celess.blog.util.StringFromHtmlUtil;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.youbenzi.mdtool.tool.MDTool;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:21
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class ArticleServiceImpl implements ArticleService {
|
||||
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
|
||||
@Autowired
|
||||
TagMapper tagMapper;
|
||||
@Autowired
|
||||
CategoryMapper categoryMapper;
|
||||
@Autowired
|
||||
CommentMapper commentMapper;
|
||||
@Autowired
|
||||
ArticleTagMapper articleTagMapper;
|
||||
@Autowired
|
||||
UserService userService;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Autowired
|
||||
RedisUserUtil redisUserUtil;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ArticleModel create(ArticleReq reqBody) {
|
||||
if (reqBody == null) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
//数据判断
|
||||
if (reqBody.getTitle() == null || reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
|
||||
} else if (reqBody.getMdContent() == null || reqBody.getMdContent().replaceAll(" ", "").isEmpty()) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
//转载 判断链接
|
||||
if (!reqBody.getType()) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
if (reqBody.getTags() == null || reqBody.getTags().length == 0) {
|
||||
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();
|
||||
BeanUtils.copyProperties(reqBody, article);
|
||||
|
||||
article.setUser(redisUserUtil.get());
|
||||
|
||||
//markdown->html->summary
|
||||
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
|
||||
//获取摘要 摘要长度为255个字符
|
||||
String summary = str.length() > 240 ? str.substring(0, 240) + "......" : str;
|
||||
article.setSummary(summary);
|
||||
|
||||
article.setCategory(category);
|
||||
|
||||
//文章存数据库
|
||||
articleMapper.insert(article);
|
||||
//将标签写入数据库
|
||||
for (String tagName : reqBody.getTags()) {
|
||||
if (tagName.replaceAll(" ", "").length() == 0) {
|
||||
//单个标签只含空格
|
||||
continue;
|
||||
}
|
||||
Tag tag = tagMapper.findTagByName(tagName);
|
||||
if (tag == null) {
|
||||
tag = new Tag();
|
||||
tag.setName(tagName);
|
||||
tagMapper.insert(tag);
|
||||
}
|
||||
ArticleTag articleTag = new ArticleTag(article, tag);
|
||||
articleTagMapper.insert(articleTag);
|
||||
}
|
||||
Article articleFromDb = articleMapper.findArticleById(article.getId());
|
||||
|
||||
ArticleModel articleModel = ModalTrans.article(articleFromDb);
|
||||
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(article.getId()), true));
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean delete(long articleId) {
|
||||
Article articleForDel = articleMapper.findArticleById(articleId);
|
||||
|
||||
if (articleForDel == null) {
|
||||
//文章不存在
|
||||
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
|
||||
}
|
||||
|
||||
//对访问情况进行判断 非admin 权限不可删除文章
|
||||
User user = redisUserUtil.get();
|
||||
if (!RoleEnum.ADMIN_ROLE.getRoleName().equals(user.getRole())) {
|
||||
throw new MyException(ResponseEnum.PERMISSION_ERROR);
|
||||
}
|
||||
//删除指定文章
|
||||
articleMapper.delete(articleId);
|
||||
|
||||
articleTagMapper.deleteByArticleId(articleId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public ArticleModel update(ArticleReq reqBody) {
|
||||
if (reqBody == null || reqBody.getId() == null) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
// 查找数据
|
||||
Article article = articleMapper.findArticleById(reqBody.getId());
|
||||
|
||||
//数据判断
|
||||
if (reqBody.getTitle() != null && !reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
|
||||
if (!article.getTitle().equals(reqBody.getTitle()) && articleMapper.existsByTitle(reqBody.getTitle())) {
|
||||
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);
|
||||
}
|
||||
|
||||
if (!reqBody.getType() && !RegexUtil.urlMatch(reqBody.getUrl())) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_URL_ERROR);
|
||||
}
|
||||
article.setType(reqBody.getType());
|
||||
article.setUrl(reqBody.getUrl());
|
||||
}
|
||||
if (reqBody.getCategory() != null && !reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
|
||||
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
|
||||
if (category == null) {
|
||||
category = new Category();
|
||||
category.setName(reqBody.getCategory());
|
||||
categoryMapper.insert(category);
|
||||
}
|
||||
article.setCategory(category);
|
||||
}
|
||||
|
||||
//写入数据库的数据
|
||||
article.setOpen(reqBody.getOpen() == null ? article.getOpen() : reqBody.getOpen());
|
||||
String str = StringFromHtmlUtil.getString(MDTool.markdown2Html(article.getMdContent()));
|
||||
article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str);
|
||||
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");
|
||||
ArticleModel articleModel = ModalTrans.article(articleMapper.findArticleById(article.getId()));
|
||||
setPreAndNextArticle(articleModel);
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArticleModel retrieveOneById(long articleId, boolean is4update) {
|
||||
Article article = articleMapper.findArticleById(articleId);
|
||||
if (article == null) {
|
||||
throw new MyException(ResponseEnum.ARTICLE_NOT_EXIST);
|
||||
}
|
||||
if (!article.getOpen()) {
|
||||
User user = redisUserUtil.getWithOutExc();
|
||||
if (user == null || "user".equals(user.getRole())) {
|
||||
throw new MyException(ResponseEnum.ARTICLE_NOT_PUBLIC);
|
||||
}
|
||||
}
|
||||
ArticleModel articleModel = ModalTrans.article(article);
|
||||
|
||||
if (is4update) {
|
||||
//因更新而获取文章 不需要增加阅读量
|
||||
request.getSession().setAttribute("article4update", article);
|
||||
return articleModel;
|
||||
}
|
||||
setPreAndNextArticle(articleModel);
|
||||
articleMapper.updateReadingNumber(articleId);
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param count 数目
|
||||
* @param page 页面 默认减1
|
||||
* @return PageInfo
|
||||
*/
|
||||
@Override
|
||||
public PageData<ArticleModel> adminArticles(int count, int page) {
|
||||
PageHelper.startPage(page, count, "articleId desc");
|
||||
List<Article> articleList = articleMapper.findAll();
|
||||
PageData<ArticleModel> pageData = new PageData<ArticleModel>(new PageInfo<Article>(articleList));
|
||||
List<ArticleModel> articleModelList = new ArrayList<>();
|
||||
articleList.forEach(article -> {
|
||||
ArticleModel articleModel = ModalTrans.article(article);
|
||||
articleModel.setMdContent(null);
|
||||
articleModelList.add(articleModel);
|
||||
});
|
||||
pageData.setList(articleModelList);
|
||||
return pageData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<ArticleModel> retrievePageForOpen(int count, int page) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Article> articleList = articleMapper.findAllByOpen(true);
|
||||
PageData<ArticleModel> pageData = new PageData<>(new PageInfo<Article>(articleList));
|
||||
|
||||
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
|
||||
public PageData<ArticleModel> findByCategory(String name, int page, int count) {
|
||||
Category category = categoryMapper.findCategoryByName(name);
|
||||
if (category == null) {
|
||||
throw new MyException(ResponseEnum.CATEGORY_NOT_EXIST);
|
||||
}
|
||||
PageHelper.startPage(page, count);
|
||||
List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId());
|
||||
|
||||
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
|
||||
public PageData<ArticleModel> findByTag(String name, int page, int count) {
|
||||
Tag tag = tagMapper.findTagByName(name);
|
||||
if (tag == null) {
|
||||
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
|
||||
}
|
||||
PageHelper.startPage(page, count);
|
||||
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId());
|
||||
List<ArticleModel> modelList = new ArrayList<>();
|
||||
articleByTag.forEach(articleTag -> {
|
||||
ArticleModel model = ModalTrans.article(articleTag.getArticle(), true);
|
||||
model.setNextArticle(null);
|
||||
model.setPreArticle(null);
|
||||
modelList.add(model);
|
||||
});
|
||||
return new PageData<ArticleModel>(new PageInfo<ArticleTag>(articleByTag), modelList);
|
||||
}
|
||||
|
||||
private void setPreAndNextArticle(ArticleModel articleModel) {
|
||||
if (articleModel == null) {
|
||||
return;
|
||||
}
|
||||
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(articleModel.getId()), true));
|
||||
articleModel.setNextArticle(ModalTrans.article(articleMapper.getNextArticle(articleModel.getId()), true));
|
||||
}
|
||||
}
|
||||
package cn.celess.article.serviceimpl;
|
||||
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import cn.celess.common.constant.RoleEnum;
|
||||
import cn.celess.common.entity.*;
|
||||
import cn.celess.common.entity.dto.ArticleReq;
|
||||
import cn.celess.common.entity.vo.ArticleModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.exception.BlogResponseException;
|
||||
import cn.celess.common.mapper.*;
|
||||
import cn.celess.common.service.ArticleService;
|
||||
import cn.celess.common.service.UserService;
|
||||
import cn.celess.common.util.ModalTrans;
|
||||
import cn.celess.common.util.RegexUtil;
|
||||
import cn.celess.common.util.StringUtil;
|
||||
import cn.celess.user.util.RedisUserUtil;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.youbenzi.mdtool.tool.MDTool;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:21
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class ArticleServiceImpl implements ArticleService {
|
||||
|
||||
@Resource
|
||||
ArticleMapper articleMapper;
|
||||
|
||||
@Resource
|
||||
TagMapper tagMapper;
|
||||
@Resource
|
||||
CategoryMapper categoryMapper;
|
||||
@Resource
|
||||
CommentMapper commentMapper;
|
||||
@Resource
|
||||
ArticleTagMapper articleTagMapper;
|
||||
@Resource
|
||||
UserService userService;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Resource
|
||||
RedisUserUtil redisUserUtil;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ArticleModel create(ArticleReq reqBody) {
|
||||
if (reqBody == null) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
//数据判断
|
||||
if (reqBody.getTitle() == null || reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
} else if (reqBody.getMdContent() == null || reqBody.getMdContent().replaceAll(" ", "").isEmpty()) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
//转载 判断链接
|
||||
if (!reqBody.getType()) {
|
||||
if (reqBody.getUrl() == null || reqBody.getUrl().replaceAll(" ", "").isEmpty()) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
} else if (!RegexUtil.urlMatch(reqBody.getUrl())) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_URL_ERROR);
|
||||
}
|
||||
}
|
||||
if (reqBody.getCategory() == null || reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
if (reqBody.getTags() == null || reqBody.getTags().length == 0) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
if (articleMapper.existsByTitle(reqBody.getTitle())) {
|
||||
throw new BlogResponseException(ResponseEnum.ARTICLE_HAS_EXIST);
|
||||
}
|
||||
// 查看是否存在已有的分类
|
||||
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
|
||||
if (category == null) {
|
||||
throw new BlogResponseException(ResponseEnum.CATEGORY_NOT_EXIST);
|
||||
}
|
||||
|
||||
// 构建 需要写入数据库的对象数据
|
||||
Article article = new Article();
|
||||
BeanUtils.copyProperties(reqBody, article);
|
||||
|
||||
article.setUser(redisUserUtil.get());
|
||||
|
||||
//markdown->html->summary
|
||||
String str = StringUtil.getString(MDTool.markdown2Html(article.getMdContent()));
|
||||
//获取摘要 摘要长度为255个字符
|
||||
String summary = str.length() > 240 ? str.substring(0, 240) + "......" : str;
|
||||
article.setSummary(summary);
|
||||
|
||||
article.setCategory(category);
|
||||
|
||||
//文章存数据库
|
||||
articleMapper.insert(article);
|
||||
//将标签写入数据库
|
||||
for (String tagName : reqBody.getTags()) {
|
||||
if (tagName.replaceAll(" ", "").length() == 0) {
|
||||
//单个标签只含空格
|
||||
continue;
|
||||
}
|
||||
Tag tag = tagMapper.findTagByName(tagName);
|
||||
if (tag == null) {
|
||||
tag = new Tag();
|
||||
tag.setName(tagName);
|
||||
tagMapper.insert(tag);
|
||||
}
|
||||
ArticleTag articleTag = new ArticleTag(article, tag);
|
||||
articleTagMapper.insert(articleTag);
|
||||
}
|
||||
Article articleFromDb = articleMapper.findArticleById(article.getId());
|
||||
|
||||
ArticleModel articleModel = ModalTrans.article(articleFromDb);
|
||||
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(article.getId()), true));
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean delete(long articleId) {
|
||||
Article articleForDel = articleMapper.findArticleById(articleId);
|
||||
|
||||
if (articleForDel == null) {
|
||||
//文章不存在
|
||||
throw new BlogResponseException(ResponseEnum.ARTICLE_NOT_EXIST);
|
||||
}
|
||||
|
||||
//对访问情况进行判断 非admin 权限不可删除文章
|
||||
User user = redisUserUtil.get();
|
||||
if (!RoleEnum.ADMIN_ROLE.getRoleName().equals(user.getRole())) {
|
||||
throw new BlogResponseException(ResponseEnum.PERMISSION_ERROR);
|
||||
}
|
||||
//删除指定文章
|
||||
articleMapper.delete(articleId);
|
||||
|
||||
//articleTagMapper.deleteByArticleId(articleId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public ArticleModel update(ArticleReq reqBody) {
|
||||
if (reqBody == null || reqBody.getId() == null) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
// 查找数据
|
||||
Article article = articleMapper.findArticleById(reqBody.getId());
|
||||
|
||||
//数据判断
|
||||
if (reqBody.getTitle() != null && !reqBody.getTitle().replaceAll(" ", "").isEmpty()) {
|
||||
if (!article.getTitle().equals(reqBody.getTitle()) && articleMapper.existsByTitle(reqBody.getTitle())) {
|
||||
throw new BlogResponseException(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 BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
|
||||
if (!reqBody.getType() && !RegexUtil.urlMatch(reqBody.getUrl())) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_URL_ERROR);
|
||||
}
|
||||
article.setType(reqBody.getType());
|
||||
article.setUrl(reqBody.getUrl());
|
||||
}
|
||||
if (reqBody.getCategory() != null && !reqBody.getCategory().replaceAll(" ", "").isEmpty()) {
|
||||
Category category = categoryMapper.findCategoryByName(reqBody.getCategory());
|
||||
if (category == null) {
|
||||
category = new Category();
|
||||
category.setName(reqBody.getCategory());
|
||||
categoryMapper.insert(category);
|
||||
}
|
||||
article.setCategory(category);
|
||||
}
|
||||
|
||||
//写入数据库的数据
|
||||
article.setOpen(reqBody.getOpen() == null ? article.getOpen() : reqBody.getOpen());
|
||||
String str = StringUtil.getString(MDTool.markdown2Html(article.getMdContent()));
|
||||
article.setSummary(str.length() > 240 ? str.substring(0, 240) + "......" : str);
|
||||
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");
|
||||
ArticleModel articleModel = ModalTrans.article(articleMapper.findArticleById(article.getId()));
|
||||
setPreAndNextArticle(articleModel);
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Cacheable(value = {"article"}, key = "'retrieveOneById'+#articleId")
|
||||
public ArticleModel retrieveOneById(long articleId, boolean is4update) {
|
||||
Article article = articleMapper.findArticleById(articleId);
|
||||
if (article == null) {
|
||||
throw new BlogResponseException(ResponseEnum.ARTICLE_NOT_EXIST);
|
||||
}
|
||||
if (!article.getOpen()) {
|
||||
User user = redisUserUtil.getWithOutExc();
|
||||
if (user == null || "user".equals(user.getRole())) {
|
||||
throw new BlogResponseException(ResponseEnum.ARTICLE_NOT_PUBLIC);
|
||||
}
|
||||
}
|
||||
ArticleModel articleModel = ModalTrans.article(article);
|
||||
|
||||
if (is4update) {
|
||||
//因更新而获取文章 不需要增加阅读量
|
||||
request.getSession().setAttribute("article4update", article);
|
||||
return articleModel;
|
||||
}
|
||||
setPreAndNextArticle(articleModel);
|
||||
articleMapper.updateReadingNumber(articleId);
|
||||
return articleModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param count 数目
|
||||
* @param page 页面
|
||||
* @return PageInfo
|
||||
*/
|
||||
@Override
|
||||
public PageData<ArticleModel> adminArticles(int count, int page, Boolean deleted) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Article> articleList = articleMapper.findAll();
|
||||
|
||||
PageData<ArticleModel> pageData = new PageData<>(new PageInfo<>(articleList));
|
||||
|
||||
List<Article> collect;
|
||||
if (deleted != null) {
|
||||
collect = articleList.stream().filter(article -> article.isDeleted() == deleted).collect(Collectors.toList());
|
||||
} else {
|
||||
collect = articleList;
|
||||
}
|
||||
List<ArticleModel> articleModels = collect.stream()
|
||||
.peek(article -> article.setMdContent(null))
|
||||
.map(ModalTrans::article)
|
||||
.collect(Collectors.toList());
|
||||
pageData.setList(articleModels);
|
||||
|
||||
return pageData;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Cacheable(value = {"article"}, key = "'retrievePageForOpen:'+#page+':'+#count")
|
||||
public PageData<ArticleModel> retrievePageForOpen(int count, int page) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Article> articleList = articleMapper.findAllByOpen(true);
|
||||
PageData<ArticleModel> pageData = new PageData<>(new PageInfo<>(articleList));
|
||||
|
||||
List<ArticleModel> articleModelList = articleList
|
||||
.stream()
|
||||
.map(article -> setPreAndNextArticle(ModalTrans.article(article, true)))
|
||||
.collect(Collectors.toList());
|
||||
pageData.setList(articleModelList);
|
||||
return pageData;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Cacheable(value = {"article"}, key = "'findByCategory:'+#name")
|
||||
public PageData<ArticleModel> findByCategory(String name, int page, int count) {
|
||||
Category category = categoryMapper.findCategoryByName(name);
|
||||
if (category == null) {
|
||||
throw new BlogResponseException(ResponseEnum.CATEGORY_NOT_EXIST);
|
||||
}
|
||||
PageHelper.startPage(page, count);
|
||||
List<Article> open = articleMapper.findAllByCategoryIdAndOpen(category.getId());
|
||||
|
||||
List<ArticleModel> modelList = open.stream()
|
||||
.map(article -> ModalTrans.article(article, true))
|
||||
.peek(articleModel -> {
|
||||
articleModel.setNextArticle(null);
|
||||
articleModel.setPreArticle(null);
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
return new PageData<>(new PageInfo<>(open), modelList);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Cacheable(value = {"article"}, key = "'findByTag:'+#name")
|
||||
public PageData<ArticleModel> findByTag(String name, int page, int count) {
|
||||
Tag tag = tagMapper.findTagByName(name);
|
||||
if (tag == null) {
|
||||
throw new BlogResponseException(ResponseEnum.TAG_NOT_EXIST);
|
||||
}
|
||||
PageHelper.startPage(page, count);
|
||||
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTagAndOpen(tag.getId());
|
||||
List<ArticleModel> modelList = articleByTag
|
||||
.stream()
|
||||
.map(articleTag -> ModalTrans.article(articleTag.getArticle(), true))
|
||||
.peek(articleModel -> {
|
||||
articleModel.setNextArticle(null);
|
||||
articleModel.setPreArticle(null);
|
||||
}).collect(Collectors.toList());
|
||||
return new PageData<>(new PageInfo<>(articleByTag), modelList);
|
||||
}
|
||||
|
||||
|
||||
private ArticleModel setPreAndNextArticle(ArticleModel articleModel) {
|
||||
if (articleModel == null) {
|
||||
return null;
|
||||
}
|
||||
articleModel.setPreArticle(ModalTrans.article(articleMapper.getPreArticle(articleModel.getId()), true));
|
||||
articleModel.setNextArticle(ModalTrans.article(articleMapper.getNextArticle(articleModel.getId()), true));
|
||||
return articleModel;
|
||||
}
|
||||
}
|
||||
@@ -1,110 +1,111 @@
|
||||
package cn.celess.blog.util;
|
||||
|
||||
import cn.celess.blog.entity.Article;
|
||||
import cn.celess.blog.mapper.ArticleMapper;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.OutputKeys;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/30 17:29
|
||||
* @Description:
|
||||
*/
|
||||
@Component
|
||||
public class SitemapGenerateUtil {
|
||||
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
@Value("${sitemap.path}")
|
||||
private String path;
|
||||
private Map<String, String> urlList;
|
||||
|
||||
private static DocumentBuilder getDocumentBuilder() {
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder db = null;
|
||||
try {
|
||||
db = dbf.newDocumentBuilder();
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return db;
|
||||
}
|
||||
|
||||
@Async
|
||||
public void createSitemap() {
|
||||
initList();
|
||||
if ("".equals(path) || "classpath".equals(path)) {
|
||||
path = System.getProperty("user.dir") + "/sitemap.xml";
|
||||
}
|
||||
File file = new File(path);
|
||||
try {
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
} else {
|
||||
file.createNewFile();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
DocumentBuilder db = getDocumentBuilder();
|
||||
Document document = db.newDocument();
|
||||
document.setXmlVersion("1.0");
|
||||
document.setXmlStandalone(true);
|
||||
Element urlset = document.createElement("urlset");
|
||||
urlset.setAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
|
||||
// 创建url 结点
|
||||
urlList.forEach((s, s2) -> {
|
||||
Element url = document.createElement("url");
|
||||
Element loc = document.createElement("loc");
|
||||
Element lastmod = document.createElement("lastmod");
|
||||
loc.setTextContent(s);
|
||||
lastmod.setTextContent(s2);
|
||||
url.appendChild(loc);
|
||||
url.appendChild(lastmod);
|
||||
urlset.appendChild(url);
|
||||
});
|
||||
document.appendChild(urlset);
|
||||
try {
|
||||
TransformerFactory tff = TransformerFactory.newInstance();
|
||||
Transformer tf = tff.newTransformer();
|
||||
tf.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||
tf.transform(new DOMSource(document), new StreamResult(file));
|
||||
} catch (TransformerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void initList() {
|
||||
urlList = new HashMap<>();
|
||||
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/leaveMsg", DateFormatUtil.getForXmlDate(new Date()));
|
||||
List<Article> articles = articleMapper.findAll();
|
||||
articles.forEach(article -> {
|
||||
urlList.put("https://www.celess.cn/article/" + article.getId(), DateFormatUtil.getForXmlDate(
|
||||
article.getUpdateDate() == null ? article.getPublishDate() : article.getUpdateDate()));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
package cn.celess.article.util;
|
||||
|
||||
|
||||
import cn.celess.common.entity.Article;
|
||||
import cn.celess.common.mapper.ArticleMapper;
|
||||
import cn.celess.common.util.DateFormatUtil;
|
||||
import cn.celess.common.util.EnvironmentUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.OutputKeys;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/30 17:29
|
||||
* @Description:
|
||||
*/
|
||||
@Component
|
||||
public class SitemapGenerateUtil {
|
||||
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
private Map<String, String> urlList;
|
||||
|
||||
private static DocumentBuilder getDocumentBuilder() {
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder db = null;
|
||||
try {
|
||||
db = dbf.newDocumentBuilder();
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return db;
|
||||
}
|
||||
|
||||
@Async
|
||||
public void createSitemap() {
|
||||
initList();
|
||||
String path = EnvironmentUtil.getProperties("sitemap.path", System.getProperty("user.dir"));
|
||||
if ("classpath".equals(path)) {
|
||||
path = System.getProperty("user.dir") + "/sitemap.xml";
|
||||
}
|
||||
File file = new File(path);
|
||||
try {
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
} else {
|
||||
file.createNewFile();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
DocumentBuilder db = getDocumentBuilder();
|
||||
Document document = db.newDocument();
|
||||
document.setXmlVersion("1.0");
|
||||
document.setXmlStandalone(true);
|
||||
Element urlset = document.createElement("urlset");
|
||||
urlset.setAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
|
||||
// 创建url 结点
|
||||
urlList.forEach((s, s2) -> {
|
||||
Element url = document.createElement("url");
|
||||
Element loc = document.createElement("loc");
|
||||
Element lastmod = document.createElement("lastmod");
|
||||
loc.setTextContent(s);
|
||||
lastmod.setTextContent(s2);
|
||||
url.appendChild(loc);
|
||||
url.appendChild(lastmod);
|
||||
urlset.appendChild(url);
|
||||
});
|
||||
document.appendChild(urlset);
|
||||
try {
|
||||
TransformerFactory tff = TransformerFactory.newInstance();
|
||||
Transformer tf = tff.newTransformer();
|
||||
tf.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||
tf.transform(new DOMSource(document), new StreamResult(file));
|
||||
} catch (TransformerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void initList() {
|
||||
urlList = new HashMap<>();
|
||||
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/leaveMsg", DateFormatUtil.getForXmlDate(new Date()));
|
||||
List<Article> articles = articleMapper.findAll().stream().filter(article -> article.getOpen() && !article.isDeleted()).collect(Collectors.toList());
|
||||
articles.forEach(article -> {
|
||||
urlList.put("https://www.celess.cn/article/" + article.getId(), DateFormatUtil.getForXmlDate(
|
||||
article.getUpdateDate() == null ? article.getPublishDate() : article.getUpdateDate()));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
12
blog-article/src/main/resources/banner.txt
Normal file
12
blog-article/src/main/resources/banner.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
${AnsiColor.BRIGHT_GREEN}
|
||||
_ _ _ ____ _ _ _ _
|
||||
| | | | (_) | _ \ | | /\ | | (_) | |
|
||||
| |__| | _ | |_) | | | ___ __ _ ______ / \ _ __ | |_ _ ___ | | ___
|
||||
| __ | | | | _ < | | / _ \ / _` | |______| / /\ \ | '__| | __| | | / __| | | / _ \
|
||||
| | | | | | | |_) | | | | (_) | | (_| | / ____ \ | | | |_ | | | (__ | | | __/
|
||||
|_| |_| |_| |____/ |_| \___/ \__, | /_/ \_\ |_| \__| |_| \___| |_| \___|
|
||||
__/ |
|
||||
|___/
|
||||
${AnsiColor.BRIGHT_RED}
|
||||
Application Version: ${application.version}${application.formatted-version}
|
||||
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
|
||||
@@ -0,0 +1,11 @@
|
||||
package cn.celess.article;
|
||||
|
||||
import cn.celess.common.test.BaseRedisTest;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@SpringBootTest(classes = {ArticleApplication.class})
|
||||
@RunWith(SpringRunner.class)
|
||||
public abstract class ArticleBaseTest extends BaseRedisTest {
|
||||
}
|
||||
@@ -0,0 +1,303 @@
|
||||
package cn.celess.article.controller;
|
||||
|
||||
|
||||
import cn.celess.article.ArticleBaseTest;
|
||||
import cn.celess.common.entity.Article;
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.Tag;
|
||||
import cn.celess.common.entity.dto.ArticleReq;
|
||||
import cn.celess.common.entity.vo.ArticleModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.mapper.ArticleMapper;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import org.junit.Test;
|
||||
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
|
||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.celess.common.constant.ResponseEnum.*;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||
|
||||
public class ArticleControllerTest extends ArticleBaseTest {
|
||||
@Resource
|
||||
ArticleMapper articleMapper;
|
||||
private static final TypeReference<?> ARTICLE_MODEL_TYPE = new TypeReference<Response<ArticleModel>>() {
|
||||
};
|
||||
private static final TypeReference<?> ARTICLE_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<ArticleModel>>>() {
|
||||
};
|
||||
|
||||
@Test
|
||||
public void create() {
|
||||
ArticleReq articleReq = new ArticleReq();
|
||||
// 应该正常通过
|
||||
articleReq.setTitle("test-" + randomStr());
|
||||
articleReq.setMdContent("# test title");
|
||||
articleReq.setCategory("随笔");
|
||||
String[] tagList = {"tag", "category"};
|
||||
articleReq.setTags(tagList);
|
||||
articleReq.setOpen(true);
|
||||
articleReq.setType(true);
|
||||
articleReq.setUrl("http://xxxx.com");
|
||||
MockHttpServletRequestBuilder post = post("/admin/article/create");
|
||||
|
||||
try {
|
||||
getMockData(post, adminLogin(), articleReq).andDo(result -> {
|
||||
Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertNotNull(response.getResult());
|
||||
ArticleModel articleModel = response.getResult();
|
||||
assertNotNull(articleModel.getId());
|
||||
assertNotNull(articleModel.getTitle());
|
||||
assertNotNull(articleModel.getSummary());
|
||||
assertNotNull(articleModel.getOriginal());
|
||||
assertNotNull(articleModel.getTags());
|
||||
assertNotNull(articleModel.getCategory());
|
||||
assertNotNull(articleModel.getPublishDateFormat());
|
||||
assertNotNull(articleModel.getMdContent());
|
||||
assertNotNull(articleModel.getPreArticle());
|
||||
assertNull(articleModel.getNextArticle());
|
||||
assertNotNull(articleModel.getOpen());
|
||||
assertNotNull(articleModel.getReadingNumber());
|
||||
assertNotNull(articleModel.getAuthor());
|
||||
assertNotNull(articleModel.getUrl());
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void delete() {
|
||||
Article article;
|
||||
do {
|
||||
article = articleMapper.getLastestArticle();
|
||||
create();
|
||||
} while (article.isDeleted());
|
||||
assertFalse(article.isDeleted());
|
||||
MockHttpServletRequestBuilder delete = MockMvcRequestBuilders.delete("/admin/article/del?articleID=" + article.getId());
|
||||
try {
|
||||
Article finalArticle = article;
|
||||
getMockData(delete, adminLogin()).andDo(result -> {
|
||||
Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
// 断言删除成功
|
||||
assertTrue(response.getResult());
|
||||
assertTrue(articleMapper.isDeletedById(finalArticle.getId()));
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void update() {
|
||||
Article article = articleMapper.getLastestArticle();
|
||||
ArticleReq articleReq = new ArticleReq();
|
||||
articleReq.setId(article.getId());
|
||||
articleReq.setUrl("http://www.test.test");
|
||||
articleReq.setType(!article.getType());
|
||||
articleReq.setCategory("test");
|
||||
articleReq.setMdContent("test-" + article.getMdContent());
|
||||
articleReq.setOpen(!article.getOpen());
|
||||
String tag1 = randomStr(4);
|
||||
String tag2 = randomStr(4);
|
||||
String[] tagList = {"test", tag1, tag2};
|
||||
articleReq.setTags(tagList);
|
||||
articleReq.setTitle("test-" + article.getTitle());
|
||||
try {
|
||||
getMockData(put("/admin/article/update"), adminLogin(), articleReq).andDo(result -> {
|
||||
Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
ArticleModel a = response.getResult();
|
||||
assertEquals(articleReq.getCategory(), a.getCategory());
|
||||
assertEquals(articleReq.getUrl(), a.getUrl());
|
||||
assertEquals(articleReq.getMdContent(), a.getMdContent());
|
||||
assertEquals(articleReq.getTitle(), a.getTitle());
|
||||
assertEquals(articleReq.getType(), a.getOriginal());
|
||||
// Tag
|
||||
List<Tag> asList = a.getTags();
|
||||
assertEquals(3, asList.size());
|
||||
assertEquals(articleReq.getOpen(), a.getOpen());
|
||||
assertEquals(articleReq.getId(), a.getId());
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void retrieveOneById() {
|
||||
try {
|
||||
long articleID = 3;
|
||||
getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID));
|
||||
getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=true"));
|
||||
|
||||
// 文章不存在
|
||||
getMockData(MockMvcRequestBuilders.get("/article/articleID/-1"))
|
||||
.andDo(result -> assertEquals(ARTICLE_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
|
||||
|
||||
// 正常情况
|
||||
getMockData(MockMvcRequestBuilders.get("/article/articleID/" + articleID + "?update=false")).andDo(result -> {
|
||||
Response<ArticleModel> response = getResponse(result, ARTICLE_MODEL_TYPE);
|
||||
// 断言获取数据成功
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertNotNull(response.getResult());
|
||||
|
||||
ArticleModel a = response.getResult();
|
||||
assertNotNull(a.getTitle());
|
||||
assertNotNull(a.getId());
|
||||
assertNotNull(a.getSummary());
|
||||
assertNotNull(a.getMdContent());
|
||||
assertNotNull(a.getUrl());
|
||||
assertNotNull(a.getUpdateDateFormat());
|
||||
assertTrue(a.getPreArticle() != null || a.getNextArticle() != null);
|
||||
assertNotNull(a.getReadingNumber());
|
||||
assertNotNull(a.getOriginal());
|
||||
assertNotNull(a.getPublishDateFormat());
|
||||
assertNotNull(a.getCategory());
|
||||
assertNotNull(a.getTags());
|
||||
assertNotNull(a.getAuthor());
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void articles() {
|
||||
try {
|
||||
// 测试不带参数访问
|
||||
getMockData(MockMvcRequestBuilders.get("/articles"));
|
||||
getMockData(MockMvcRequestBuilders.get("/articles?page=1&count=5")).andDo(result -> {
|
||||
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
|
||||
// 断言获取数据成功
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
// 结果集非空
|
||||
assertNotNull(response.getResult());
|
||||
// 判断pageInfo是否包装完全
|
||||
PageData<ArticleModel> pageData = response.getResult();
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(5, pageData.getPageSize());
|
||||
// 内容完整
|
||||
for (ArticleModel a : pageData.getList()) {
|
||||
assertNotNull(a.getTitle());
|
||||
assertNotNull(a.getId());
|
||||
assertNotNull(a.getSummary());
|
||||
assertNotNull(a.getOriginal());
|
||||
assertNotNull(a.getPublishDateFormat());
|
||||
assertNotNull(a.getCategory());
|
||||
assertNotNull(a.getTags());
|
||||
assertNotNull(a.getAuthor());
|
||||
assertNull(a.getOpen());
|
||||
assertNull(a.getMdContent());
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void adminArticles() {
|
||||
try {
|
||||
getMockData(get("/admin/articles?page=1&count=5")).andExpect(result ->
|
||||
assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result, ARTICLE_MODEL_PAGE_TYPE).getCode())
|
||||
);
|
||||
|
||||
// User权限登陆
|
||||
getMockData(get("/admin/articles?page=1&count=5"), userLogin()).andDo(result ->
|
||||
assertEquals(PERMISSION_ERROR.getCode(), getResponse(result, ARTICLE_MODEL_PAGE_TYPE).getCode())
|
||||
);
|
||||
for (int i = 0; i < 2; i++) {
|
||||
// admin权限登陆
|
||||
int finalI = i;
|
||||
getMockData(get("/admin/articles?page=1&count=5&deleted=" + (i == 1)), adminLogin()).andDo(result -> {
|
||||
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertNotNull(response.getResult());
|
||||
// 判断pageInfo是否包装完全
|
||||
PageData<ArticleModel> pageData = response.getResult();
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(5, pageData.getPageSize());
|
||||
// 内容完整
|
||||
for (ArticleModel a : pageData.getList()) {
|
||||
assertNotNull(a.getTitle());
|
||||
assertNotNull(a.getId());
|
||||
assertNotNull(a.getOriginal());
|
||||
assertNotNull(a.getPublishDateFormat());
|
||||
assertNotNull(a.getOpen());
|
||||
assertNotNull(a.getReadingNumber());
|
||||
assertNotNull(a.getLikeCount());
|
||||
assertNotNull(a.getDislikeCount());
|
||||
assertEquals((finalI == 1), a.isDeleted());
|
||||
assertNull(a.getMdContent());
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByCategory() {
|
||||
try {
|
||||
// 分类不存在
|
||||
String categoryName = "NoSuchCategory";
|
||||
getMockData(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10"))
|
||||
.andDo(result -> assertEquals(CATEGORY_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
|
||||
// 正常查询
|
||||
categoryName = "linux";
|
||||
getMockData(MockMvcRequestBuilders.get("/articles/category/" + categoryName + "?page=1&count=10"))
|
||||
.andDo(result -> {
|
||||
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
PageData<ArticleModel> pageData = response.getResult();
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(10, pageData.getPageSize());
|
||||
for (ArticleModel arc : pageData.getList()) {
|
||||
assertNotEquals(0, arc.getId().longValue());
|
||||
assertNotNull(arc.getTitle());
|
||||
assertNotNull(arc.getSummary());
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByTag() {
|
||||
try {
|
||||
// 分类不存在
|
||||
String tagName = "NoSuchTag";
|
||||
getMockData(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10"))
|
||||
.andDo(result -> assertEquals(TAG_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
|
||||
// 正常查询
|
||||
tagName = "linux";
|
||||
getMockData(MockMvcRequestBuilders.get("/articles/tag/" + tagName + "?page=1&count=10"))
|
||||
.andDo(result -> {
|
||||
Response<PageData<ArticleModel>> response = getResponse(result, ARTICLE_MODEL_PAGE_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
PageData<ArticleModel> pageData = response.getResult();
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(10, pageData.getPageSize());
|
||||
|
||||
for (ArticleModel arc : pageData.getList()) {
|
||||
assertNotEquals(0, arc.getId().longValue());
|
||||
assertNotNull(arc.getTitle());
|
||||
assertNotNull(arc.getSummary());
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package cn.celess.article.serviceimpl;
|
||||
|
||||
import cn.celess.article.ArticleBaseTest;
|
||||
import cn.celess.common.entity.vo.ArticleModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.mapper.ArticleMapper;
|
||||
import cn.celess.common.service.ArticleService;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class ArticleServiceTest extends ArticleBaseTest {
|
||||
|
||||
@Autowired
|
||||
ArticleService articleService;
|
||||
@Resource
|
||||
ArticleMapper articleMapper;
|
||||
|
||||
@Test
|
||||
public void adminArticles() {
|
||||
// 测deleted参数传值
|
||||
PageData<ArticleModel> pageData = articleService.adminArticles(10, 1, true);
|
||||
assertTrue(pageData.getList().stream().allMatch(ArticleModel::isDeleted));
|
||||
pageData = articleService.adminArticles(10, 1, false);
|
||||
assertFalse(pageData.getList().stream().allMatch(ArticleModel::isDeleted));
|
||||
pageData = articleService.adminArticles(10, 1, null);
|
||||
assertTrue(pageData.getList().stream().anyMatch(ArticleModel::isDeleted));
|
||||
assertTrue(pageData.getList().stream().anyMatch(articleModel -> !articleModel.isDeleted()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void retrievePageForOpen() {
|
||||
PageData<ArticleModel> articleModelPageData = articleService.retrievePageForOpen(10, 1);
|
||||
assertEquals(10, articleModelPageData.getPageSize());
|
||||
assertEquals(1, articleModelPageData.getPageNum());
|
||||
assertEquals(10, articleModelPageData.getList().size());
|
||||
articleModelPageData.getList().forEach(Assert::assertNotNull);
|
||||
|
||||
// 测试open字段
|
||||
articleModelPageData.getList().forEach(articleModel -> {
|
||||
// 当前文章
|
||||
assertTrue(articleMapper.findArticleById(articleModel.getId()).getOpen());
|
||||
if (articleModel.getPreArticle() != null) {
|
||||
assertTrue(articleMapper.findArticleById(articleModel.getPreArticle().getId()).getOpen());
|
||||
}
|
||||
if (articleModel.getNextArticle() != null) {
|
||||
assertTrue(articleMapper.findArticleById(articleModel.getNextArticle().getId()).getOpen());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
33
blog-categorytag/pom.xml
Normal file
33
blog-categorytag/pom.xml
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>blog</artifactId>
|
||||
<groupId>cn.celess</groupId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>blog-categorytag</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>cn.celess</groupId>
|
||||
<artifactId>blog-common</artifactId>
|
||||
<version>${blog-common.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.celess</groupId>
|
||||
<artifactId>blog-user</artifactId>
|
||||
<version>${blog-user.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,19 @@
|
||||
package cn.celess.categorytag;
|
||||
|
||||
|
||||
import cn.celess.common.CommonApplication;
|
||||
import cn.celess.user.UserApplication;
|
||||
import org.springframework.boot.Banner;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.core.SpringVersion;
|
||||
|
||||
@SpringBootApplication(scanBasePackageClasses = {CategoryTagApplication.class, CommonApplication.class, UserApplication.class})
|
||||
public class CategoryTagApplication {
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(CategoryTagApplication.class)
|
||||
.main(SpringVersion.class)
|
||||
.bannerMode(Banner.Mode.CONSOLE)
|
||||
.run(args);
|
||||
}
|
||||
}
|
||||
@@ -1,63 +1,63 @@
|
||||
package cn.celess.blog.controller;
|
||||
|
||||
import cn.celess.blog.entity.Response;
|
||||
import cn.celess.blog.service.CategoryService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 20:36
|
||||
*/
|
||||
@RestController
|
||||
public class CategoryController {
|
||||
|
||||
@Autowired
|
||||
CategoryService categoryService;
|
||||
|
||||
/**
|
||||
* 新增一个分类
|
||||
*
|
||||
* @param name 分类名
|
||||
* @return Response
|
||||
*/
|
||||
@PostMapping("/admin/category/create")
|
||||
public Response addOne(@RequestParam("name") String name) {
|
||||
return Response.success(categoryService.create(name));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除一个分类
|
||||
*
|
||||
* @param id 分类id
|
||||
* @return Response
|
||||
*/
|
||||
@DeleteMapping("/admin/category/del")
|
||||
public Response deleteOne(@RequestParam("id") long id) {
|
||||
return Response.success(categoryService.delete(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新一个分类
|
||||
*
|
||||
* @param id 分类id
|
||||
* @param name 更新后的名字
|
||||
* @return Response
|
||||
*/
|
||||
@PutMapping("/admin/category/update")
|
||||
public Response updateOne(@RequestParam("id") Long id,
|
||||
@RequestParam("name") String name) {
|
||||
return Response.success(categoryService.update(id, name));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有的分类
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/categories")
|
||||
public Response getPage(@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "1000") int count) {
|
||||
return Response.success(categoryService.retrievePage(page, count));
|
||||
}
|
||||
}
|
||||
package cn.celess.categorytag.controller;
|
||||
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.service.CategoryService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 20:36
|
||||
*/
|
||||
@RestController
|
||||
public class CategoryController {
|
||||
|
||||
@Autowired
|
||||
CategoryService categoryService;
|
||||
|
||||
/**
|
||||
* 新增一个分类
|
||||
*
|
||||
* @param name 分类名
|
||||
* @return Response
|
||||
*/
|
||||
@PostMapping("/admin/category/create")
|
||||
public Response addOne(@RequestParam("name") String name) {
|
||||
return Response.success(categoryService.create(name));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除一个分类
|
||||
*
|
||||
* @param id 分类id
|
||||
* @return Response
|
||||
*/
|
||||
@DeleteMapping("/admin/category/del")
|
||||
public Response deleteOne(@RequestParam("id") long id) {
|
||||
return Response.success(categoryService.delete(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新一个分类
|
||||
*
|
||||
* @param id 分类id
|
||||
* @param name 更新后的名字
|
||||
* @return Response
|
||||
*/
|
||||
@PutMapping("/admin/category/update")
|
||||
public Response updateOne(@RequestParam("id") Long id,
|
||||
@RequestParam("name") String name) {
|
||||
return Response.success(categoryService.update(id, name));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有的分类
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/categories")
|
||||
public Response getPage(@RequestParam(name = "page", defaultValue = "1") int page,
|
||||
@RequestParam(name = "count", defaultValue = "1000") int count) {
|
||||
return Response.success(categoryService.retrievePage(page, count));
|
||||
}
|
||||
}
|
||||
@@ -1,58 +1,59 @@
|
||||
package cn.celess.blog.controller;
|
||||
|
||||
import cn.celess.blog.entity.Response;
|
||||
import cn.celess.blog.entity.model.TagModel;
|
||||
import cn.celess.blog.service.TagService;
|
||||
import net.sf.json.JSONObject;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 20:36
|
||||
*/
|
||||
@RestController
|
||||
public class TagController {
|
||||
@Autowired
|
||||
TagService tagService;
|
||||
|
||||
|
||||
@PostMapping("/admin/tag/create")
|
||||
public Response addOne(@RequestParam("name") String name) {
|
||||
return Response.success(tagService.create(name));
|
||||
}
|
||||
|
||||
@DeleteMapping("/admin/tag/del")
|
||||
public Response delOne(@RequestParam("id") long id) {
|
||||
return Response.success(tagService.delete(id));
|
||||
}
|
||||
|
||||
|
||||
@PutMapping("/admin/tag/update")
|
||||
public Response updateOne(@RequestParam("id") Long id, @RequestParam("name") String name) {
|
||||
return Response.success(tagService.update(id, name));
|
||||
}
|
||||
|
||||
@GetMapping("/tags")
|
||||
public Response getPage(@RequestParam(required = false, defaultValue = "10", value = "count") int count,
|
||||
@RequestParam(required = false, defaultValue = "1", value = "page") int page) {
|
||||
return Response.success(tagService.retrievePage(page, count));
|
||||
}
|
||||
|
||||
@GetMapping("/tags/nac")
|
||||
public Response getTagNameAndCount() {
|
||||
List<JSONObject> nameAndCount = new ArrayList<>();
|
||||
List<TagModel> all = tagService.findAll();
|
||||
for (TagModel t : all) {
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.put("name", t.getName());
|
||||
jsonObject.put("size", t.getArticles().size());
|
||||
nameAndCount.add(jsonObject);
|
||||
}
|
||||
return Response.success(nameAndCount);
|
||||
}
|
||||
|
||||
}
|
||||
package cn.celess.categorytag.controller;
|
||||
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.vo.TagModel;
|
||||
import cn.celess.common.service.TagService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 20:36
|
||||
*/
|
||||
@RestController
|
||||
public class TagController {
|
||||
@Autowired
|
||||
TagService tagService;
|
||||
|
||||
|
||||
@PostMapping("/admin/tag/create")
|
||||
public Response addOne(@RequestParam("name") String name) {
|
||||
return Response.success(tagService.create(name));
|
||||
}
|
||||
|
||||
@DeleteMapping("/admin/tag/del")
|
||||
public Response delOne(@RequestParam("id") long id) {
|
||||
return Response.success(tagService.delete(id));
|
||||
}
|
||||
|
||||
|
||||
@PutMapping("/admin/tag/update")
|
||||
public Response updateOne(@RequestParam("id") Long id, @RequestParam("name") String name) {
|
||||
return Response.success(tagService.update(id, name));
|
||||
}
|
||||
|
||||
@GetMapping("/tags")
|
||||
public Response getPage(@RequestParam(required = false, defaultValue = "10", value = "count") int count,
|
||||
@RequestParam(required = false, defaultValue = "1", value = "page") int page) {
|
||||
return Response.success(tagService.retrievePage(page, count));
|
||||
}
|
||||
|
||||
@GetMapping("/tags/nac")
|
||||
public Response getTagNameAndCount() {
|
||||
List<Map<String, Object>> nameAndCount = new ArrayList<>();
|
||||
List<TagModel> all = tagService.findAll();
|
||||
for (TagModel t : all) {
|
||||
Map<String, Object> map = new HashMap<>(2);
|
||||
map.put("name", t.getName());
|
||||
map.put("size", t.getArticles().size());
|
||||
nameAndCount.add(map);
|
||||
}
|
||||
return Response.success(nameAndCount);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
package cn.celess.categorytag.serviceimpl;
|
||||
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import cn.celess.common.entity.Article;
|
||||
import cn.celess.common.entity.Category;
|
||||
import cn.celess.common.entity.vo.ArticleModel;
|
||||
import cn.celess.common.entity.vo.CategoryModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.exception.BlogResponseException;
|
||||
import cn.celess.common.mapper.ArticleMapper;
|
||||
import cn.celess.common.mapper.CategoryMapper;
|
||||
import cn.celess.common.service.CategoryService;
|
||||
import cn.celess.common.util.ModalTrans;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:43
|
||||
*/
|
||||
@Service
|
||||
public class CategoryServiceImpl implements CategoryService {
|
||||
@Autowired
|
||||
CategoryMapper categoryMapper;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
|
||||
@Override
|
||||
public CategoryModel create(String name) {
|
||||
if (categoryMapper.existsByName(name)) {
|
||||
throw new BlogResponseException(ResponseEnum.CATEGORY_HAS_EXIST);
|
||||
}
|
||||
Category category = new Category();
|
||||
category.setName(name);
|
||||
categoryMapper.insert(category);
|
||||
return ModalTrans.category(category);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean delete(long id) {
|
||||
Category category = categoryMapper.findCategoryById(id);
|
||||
if (category == null) {
|
||||
throw new BlogResponseException(ResponseEnum.CATEGORY_NOT_EXIST);
|
||||
}
|
||||
return categoryMapper.delete(id) == 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CategoryModel update(Long id, String name) {
|
||||
if (id == null) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不可为空");
|
||||
}
|
||||
Category category = categoryMapper.findCategoryById(id);
|
||||
category.setName(name);
|
||||
categoryMapper.update(category);
|
||||
return ModalTrans.category(category);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CategoryModel> retrievePage(int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Category> all = categoryMapper.findAll();
|
||||
// 遍历没一个category
|
||||
List<CategoryModel> modelList = all
|
||||
.stream()
|
||||
.map(ModalTrans::category)
|
||||
.peek(categoryModel -> {
|
||||
// 根据category去查article,并赋值给categoryModel
|
||||
List<Article> allByCategoryId = articleMapper.findAllByCategoryId(categoryModel.getId());
|
||||
List<ArticleModel> articleModelList = allByCategoryId
|
||||
.stream()
|
||||
.map(article -> ModalTrans.article(article, true))
|
||||
.peek(articleModel -> {
|
||||
// 去除不必要的字段
|
||||
articleModel.setPreArticle(null);
|
||||
articleModel.setNextArticle(null);
|
||||
articleModel.setTags(null);
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
categoryModel.setArticles(articleModelList);
|
||||
}).collect(Collectors.toList());
|
||||
return new PageData<>(new PageInfo<>(all), modelList);
|
||||
}
|
||||
}
|
||||
@@ -1,100 +1,103 @@
|
||||
package cn.celess.blog.service.serviceimpl;
|
||||
|
||||
import cn.celess.blog.enmu.ResponseEnum;
|
||||
import cn.celess.blog.entity.ArticleTag;
|
||||
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.mapper.ArticleMapper;
|
||||
import cn.celess.blog.mapper.ArticleTagMapper;
|
||||
import cn.celess.blog.mapper.TagMapper;
|
||||
import cn.celess.blog.service.TagService;
|
||||
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.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:29
|
||||
*/
|
||||
@Service
|
||||
public class TagServiceImpl implements TagService {
|
||||
@Autowired
|
||||
TagMapper tagMapper;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
@Autowired
|
||||
ArticleTagMapper articleTagMapper;
|
||||
|
||||
@Override
|
||||
public TagModel create(String name) {
|
||||
boolean b = tagMapper.existsByName(name);
|
||||
if (b) {
|
||||
throw new MyException(ResponseEnum.TAG_HAS_EXIST);
|
||||
}
|
||||
Tag tag = new Tag();
|
||||
tag.setName(name);
|
||||
tagMapper.insert(tag);
|
||||
return ModalTrans.tag(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean delete(long tagId) {
|
||||
Tag tag = tagMapper.findTagById(tagId);
|
||||
if (tag == null) {
|
||||
throw new MyException(ResponseEnum.TAG_NOT_EXIST);
|
||||
}
|
||||
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTag(tagId);
|
||||
// 删除文章
|
||||
articleByTag.forEach(articleTag -> articleMapper.delete(articleTag.getArticle().getId()));
|
||||
return tagMapper.delete(tagId) == 1;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public TagModel update(Long id, String name) {
|
||||
if (id == null) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "缺少ID");
|
||||
}
|
||||
Tag tag = tagMapper.findTagById(id);
|
||||
tag.setName(name);
|
||||
tagMapper.update(tag);
|
||||
return ModalTrans.tag(tag);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<TagModel> retrievePage(int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Tag> tagList = tagMapper.findAll();
|
||||
List<TagModel> modelList = new ArrayList<>();
|
||||
tagList.forEach(tag -> modelList.add(ModalTrans.tag(tag)));
|
||||
return new PageData<TagModel>(new PageInfo<Tag>(tagList), modelList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TagModel> 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;
|
||||
}
|
||||
}
|
||||
package cn.celess.categorytag.serviceimpl;
|
||||
|
||||
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import cn.celess.common.entity.ArticleTag;
|
||||
import cn.celess.common.entity.Tag;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.entity.vo.TagModel;
|
||||
import cn.celess.common.exception.BlogResponseException;
|
||||
import cn.celess.common.mapper.ArticleMapper;
|
||||
import cn.celess.common.mapper.ArticleTagMapper;
|
||||
import cn.celess.common.mapper.TagMapper;
|
||||
import cn.celess.common.service.TagService;
|
||||
import cn.celess.common.util.ModalTrans;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:29
|
||||
*/
|
||||
@Service
|
||||
public class TagServiceImpl implements TagService {
|
||||
@Autowired
|
||||
TagMapper tagMapper;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
@Autowired
|
||||
ArticleTagMapper articleTagMapper;
|
||||
|
||||
@Override
|
||||
public TagModel create(String name) {
|
||||
boolean b = tagMapper.existsByName(name);
|
||||
if (b) {
|
||||
throw new BlogResponseException(ResponseEnum.TAG_HAS_EXIST);
|
||||
}
|
||||
Tag tag = new Tag();
|
||||
tag.setName(name);
|
||||
tagMapper.insert(tag);
|
||||
return ModalTrans.tag(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean delete(long tagId) {
|
||||
Tag tag = tagMapper.findTagById(tagId);
|
||||
if (tag == null) {
|
||||
throw new BlogResponseException(ResponseEnum.TAG_NOT_EXIST);
|
||||
}
|
||||
List<ArticleTag> articleByTag = articleTagMapper.findArticleByTag(tagId);
|
||||
// 删除文章
|
||||
articleByTag.forEach(articleTag -> articleMapper.delete(articleTag.getArticle().getId()));
|
||||
return tagMapper.delete(tagId) == 1;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public TagModel update(Long id, String name) {
|
||||
if (id == null) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR.getCode(), "缺少ID");
|
||||
}
|
||||
Tag tag = tagMapper.findTagById(id);
|
||||
tag.setName(name);
|
||||
tagMapper.update(tag);
|
||||
return ModalTrans.tag(tag);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<TagModel> retrievePage(int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Tag> tagList = tagMapper.findAll();
|
||||
List<TagModel> modelList = new ArrayList<>();
|
||||
tagList.forEach(tag -> modelList.add(ModalTrans.tag(tag)));
|
||||
return new PageData<>(new PageInfo<>(tagList), modelList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TagModel> findAll() {
|
||||
return tagMapper.findAll().stream()
|
||||
.map(ModalTrans::tag)
|
||||
.peek(tagModel -> {
|
||||
List<ArticleTag> articleByTagAndOpen = articleTagMapper.findArticleByTagAndOpen(tagModel.getId());
|
||||
tagModel.setArticles(
|
||||
articleByTagAndOpen
|
||||
.stream()
|
||||
.map(articleTag -> ModalTrans.article(articleTag.getArticle(), true))
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
12
blog-categorytag/src/main/resources/banner.txt
Normal file
12
blog-categorytag/src/main/resources/banner.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
${AnsiColor.BRIGHT_GREEN}
|
||||
_ _ _ ____ _ _______
|
||||
| | | | (_) | _ \ | | |__ __|
|
||||
| |__| | _ | |_) | | | ___ __ _ ______ | | __ _ __ _
|
||||
| __ | | | | _ < | | / _ \ / _` | |______| | | / _` | / _` |
|
||||
| | | | | | | |_) | | | | (_) | | (_| | | | | (_| | | (_| |
|
||||
|_| |_| |_| |____/ |_| \___/ \__, | |_| \__,_| \__, |
|
||||
__/ | __/ |
|
||||
|___/ |___/
|
||||
${AnsiColor.BRIGHT_RED}
|
||||
Application Version: ${application.version}${application.formatted-version}
|
||||
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
|
||||
@@ -0,0 +1,11 @@
|
||||
package cn.celess.categorytag;
|
||||
|
||||
import cn.celess.common.test.BaseTest;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@SpringBootTest(classes = {CategoryTagApplication.class})
|
||||
@RunWith(SpringRunner.class)
|
||||
public abstract class CategoryTagBaseTest extends BaseTest {
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package cn.celess.categorytag.controller;
|
||||
|
||||
import cn.celess.categorytag.CategoryTagBaseTest;
|
||||
import cn.celess.common.entity.Category;
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.vo.CategoryModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.mapper.CategoryMapper;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import static cn.celess.common.constant.ResponseEnum.SUCCESS;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||
|
||||
public class CategoryControllerTest extends CategoryTagBaseTest {
|
||||
|
||||
@Autowired
|
||||
CategoryMapper categoryMapper;
|
||||
private static final TypeReference<?> CATEGORY_MODEL_TYPE = new TypeReference<Response<CategoryModel>>() {
|
||||
};
|
||||
private static final TypeReference<?> CATEGORY_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<CategoryModel>>>() {
|
||||
};
|
||||
|
||||
@Test
|
||||
public void addOne() throws Exception {
|
||||
String categoryName = randomStr(4);
|
||||
getMockData(post("/admin/category/create?name=" + categoryName), adminLogin()).andDo(result -> {
|
||||
Response<CategoryModel> response = getResponse(result, CATEGORY_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
CategoryModel category = response.getResult();
|
||||
assertEquals(categoryName, category.getName());
|
||||
assertNotNull(category.getId());
|
||||
assertNull(category.getArticles());
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deleteOne() throws Exception {
|
||||
Category category = categoryMapper.getLastestCategory();
|
||||
getMockData(delete("/admin/category/del?id=" + category.getId()), adminLogin()).andDo(result -> {
|
||||
Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertTrue(response.getResult());
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateOne() throws Exception {
|
||||
Category category = categoryMapper.getLastestCategory();
|
||||
String name = randomStr(4);
|
||||
getMockData(put("/admin/category/update?id=" + category.getId() + "&name=" + name), adminLogin()).andDo(result -> {
|
||||
// Response<CategoryModel> response = mapper.readValue(result.getResponse().getContentAsString(), new ResponseType<Response<CategoryModel>>());
|
||||
Response<CategoryModel> response = getResponse(result, CATEGORY_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
CategoryModel c = response.getResult();
|
||||
assertEquals(name, c.getName());
|
||||
assertNull(c.getArticles());
|
||||
assertNotNull(c.getId());
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getPage() throws Exception {
|
||||
getMockData(get("/categories")).andDo(result -> {
|
||||
Response<PageData<CategoryModel>> response = getResponse(result, CATEGORY_MODEL_PAGE_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertNotNull(response.getResult());
|
||||
response.getResult().getList().forEach(c -> {
|
||||
assertNotNull(c.getName());
|
||||
assertNotNull(c.getId());
|
||||
assertNotNull(c.getArticles());
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
package cn.celess.categorytag.controller;
|
||||
|
||||
|
||||
import cn.celess.categorytag.CategoryTagBaseTest;
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.Tag;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.entity.vo.TagModel;
|
||||
import cn.celess.common.mapper.TagMapper;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.celess.common.constant.ResponseEnum.*;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||
|
||||
public class TagControllerTest extends CategoryTagBaseTest {
|
||||
@Autowired
|
||||
TagMapper tagMapper;
|
||||
private static final TypeReference<?> TAG_MODEL_TYPE = new TypeReference<Response<TagModel>>() {
|
||||
|
||||
};
|
||||
private static final TypeReference<?> TAG_MODEL_PAGE_TYPE = new TypeReference<Response<PageData<TagModel>>>() {
|
||||
};
|
||||
private static final TypeReference<?> TAG_NAC_LIST_TYPE = new TypeReference<Response<List<Map<String, Object>>>>() {
|
||||
};
|
||||
|
||||
@Test
|
||||
public void addOne() throws Exception {
|
||||
String name = randomStr(4);
|
||||
getMockData(post("/admin/tag/create?name=" + name)).andDo(result -> assertEquals(HAVE_NOT_LOG_IN.getCode(), getResponse(result, STRING_TYPE).getCode()));
|
||||
getMockData(post("/admin/tag/create?name=" + name), userLogin()).andDo(result -> assertEquals(PERMISSION_ERROR.getCode(), getResponse(result, STRING_TYPE).getCode()));
|
||||
getMockData(post("/admin/tag/create?name=" + name), adminLogin()).andDo(result -> {
|
||||
Response<TagModel> response = getResponse(result, TAG_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
TagModel tag = response.getResult();
|
||||
assertNotNull(tag.getId());
|
||||
assertEquals(name, tag.getName());
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void delOne() throws Exception {
|
||||
Tag lastestTag = tagMapper.getLastestTag();
|
||||
assertNotNull(lastestTag.getId());
|
||||
getMockData(delete("/admin/tag/del?id=" + lastestTag.getId()), adminLogin()).andDo(result -> {
|
||||
Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertTrue(response.getResult());
|
||||
});
|
||||
long id = lastestTag.getId() * 2;
|
||||
getMockData(delete("/admin/tag/del?id=" + id), adminLogin())
|
||||
.andDo(result -> assertEquals(TAG_NOT_EXIST.getCode(), getResponse(result, STRING_TYPE).getCode()));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateOne() throws Exception {
|
||||
Tag tag = tagMapper.getLastestTag();
|
||||
assertNotNull(tag.getId());
|
||||
String name = randomStr(4);
|
||||
getMockData(put("/admin/tag/update?id=" + tag.getId() + "&name=" + name), adminLogin()).andDo(result -> {
|
||||
Response<TagModel> response = getResponse(result, TAG_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertNotNull(response.getResult());
|
||||
TagModel t = response.getResult();
|
||||
assertEquals(name, t.getName());
|
||||
assertEquals(tag.getId(), t.getId());
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getPage() throws Exception {
|
||||
getMockData(get("/tags?page=1&count=5")).andDo(result -> {
|
||||
Response<PageData<TagModel>> response = getResponse(result, TAG_MODEL_PAGE_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
// 结果集非空
|
||||
assertNotNull(response.getResult());
|
||||
// 判断pageInfo是否包装完全
|
||||
PageData<TagModel> pageData = response.getResult();
|
||||
assertNotEquals(0, pageData.getTotal());
|
||||
assertEquals(1, pageData.getPageNum());
|
||||
assertEquals(5, pageData.getPageSize());
|
||||
// 内容完整
|
||||
for (TagModel t : pageData.getList()) {
|
||||
assertNotNull(t.getId());
|
||||
assertNotNull(t.getName());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getTagNameAndCount() throws Exception {
|
||||
getMockData(get("/tags/nac")).andDo(result -> {
|
||||
Response<List<Map<String, Object>>> response = getResponse(result, TAG_NAC_LIST_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertNotNull(response.getResult());
|
||||
response.getResult().forEach(o -> {
|
||||
assertNotNull(o.get("name"));
|
||||
assertNotNull(o.get("size"));
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
34
blog-comment/pom.xml
Normal file
34
blog-comment/pom.xml
Normal file
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>blog</artifactId>
|
||||
<groupId>cn.celess</groupId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>blog-comment</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>cn.celess</groupId>
|
||||
<artifactId>blog-common</artifactId>
|
||||
<version>${blog-common.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.celess</groupId>
|
||||
<artifactId>blog-user</artifactId>
|
||||
<version>${blog-user.version}</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,18 @@
|
||||
package cn.celess.comment;
|
||||
|
||||
import cn.celess.common.CommonApplication;
|
||||
import cn.celess.user.UserApplication;
|
||||
import org.springframework.boot.Banner;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.core.SpringVersion;
|
||||
|
||||
@SpringBootApplication(scanBasePackageClasses = {CommentApplication.class, CommonApplication.class, UserApplication.class})
|
||||
public class CommentApplication {
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(CommentApplication.class)
|
||||
.main(SpringVersion.class)
|
||||
.bannerMode(Banner.Mode.CONSOLE)
|
||||
.run(args);
|
||||
}
|
||||
}
|
||||
@@ -1,119 +1,119 @@
|
||||
package cn.celess.blog.controller;
|
||||
|
||||
import cn.celess.blog.entity.Response;
|
||||
import cn.celess.blog.entity.request.CommentReq;
|
||||
import cn.celess.blog.service.CommentService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 20:37
|
||||
*/
|
||||
@RestController
|
||||
public class CommentController {
|
||||
@Autowired
|
||||
CommentService commentService;
|
||||
|
||||
/**
|
||||
* 新增一条评论数据
|
||||
*
|
||||
* @param reqBody 请求数据
|
||||
* @return Response
|
||||
*/
|
||||
@PostMapping("/user/comment/create")
|
||||
public Response addOne(@RequestBody CommentReq reqBody) {
|
||||
return Response.success(commentService.create(reqBody));
|
||||
}
|
||||
|
||||
@DeleteMapping("/user/comment/del")
|
||||
public Response delete(@RequestParam("id") long id) {
|
||||
return Response.success(commentService.delete(id));
|
||||
}
|
||||
|
||||
@PutMapping("/user/comment/update")
|
||||
public Response update(@RequestBody CommentReq reqBody) {
|
||||
return Response.success(commentService.update(reqBody));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有的评论
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 页码
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/comments/{pagePath}/{pid}")
|
||||
public Response commentsOfArticle(@PathVariable("pagePath") String pagePath, @PathVariable(value = "pid") long pid,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count count
|
||||
* @param page page
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/comment/pagePath/{pagePath}")
|
||||
public Response retrievePage(@PathVariable("pagePath") String pagePath,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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("/admin/comment/pagePath/{pagePath}")
|
||||
public Response adminComment(@PathVariable("pagePath") String pagePath,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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));
|
||||
}
|
||||
}
|
||||
package cn.celess.comment.controller;
|
||||
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.dto.CommentReq;
|
||||
import cn.celess.common.service.CommentService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 20:37
|
||||
*/
|
||||
@RestController
|
||||
public class CommentController {
|
||||
@Autowired
|
||||
CommentService commentService;
|
||||
|
||||
/**
|
||||
* 新增一条评论数据
|
||||
*
|
||||
* @param reqBody 请求数据
|
||||
* @return Response
|
||||
*/
|
||||
@PostMapping("/user/comment/create")
|
||||
public Response addOne(@RequestBody CommentReq reqBody) {
|
||||
return Response.success(commentService.create(reqBody));
|
||||
}
|
||||
|
||||
@DeleteMapping("/user/comment/del")
|
||||
public Response delete(@RequestParam("id") long id) {
|
||||
return Response.success(commentService.delete(id));
|
||||
}
|
||||
|
||||
@PutMapping("/user/comment/update")
|
||||
public Response update(@RequestBody CommentReq reqBody) {
|
||||
return Response.success(commentService.update(reqBody));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有的评论
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 页码
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/comments/{pagePath}/{pid}")
|
||||
public Response commentsOfArticle(@PathVariable("pagePath") String pagePath, @PathVariable(value = "pid") long pid,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count count
|
||||
* @param page page
|
||||
* @return Response
|
||||
*/
|
||||
@GetMapping("/comment/pagePath/{pagePath}")
|
||||
public Response retrievePage(@PathVariable("pagePath") String pagePath,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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("/admin/comment/pagePath/{pagePath}")
|
||||
public Response adminComment(@PathVariable("pagePath") String pagePath,
|
||||
@RequestParam(value = "count", required = false, defaultValue = "10") int count,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
|
||||
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));
|
||||
}
|
||||
}
|
||||
@@ -1,158 +1,152 @@
|
||||
package cn.celess.blog.service.serviceimpl;
|
||||
|
||||
import cn.celess.blog.enmu.CommentStatusEnum;
|
||||
import cn.celess.blog.enmu.ResponseEnum;
|
||||
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.PageData;
|
||||
import cn.celess.blog.entity.request.CommentReq;
|
||||
import cn.celess.blog.exception.MyException;
|
||||
import cn.celess.blog.mapper.ArticleMapper;
|
||||
import cn.celess.blog.mapper.CommentMapper;
|
||||
import cn.celess.blog.mapper.UserMapper;
|
||||
import cn.celess.blog.service.CommentService;
|
||||
import cn.celess.blog.util.ModalTrans;
|
||||
import cn.celess.blog.util.RedisUserUtil;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/29 17:05
|
||||
*/
|
||||
@Service
|
||||
public class CommentServiceImpl implements CommentService {
|
||||
@Autowired
|
||||
CommentMapper commentMapper;
|
||||
@Autowired
|
||||
UserMapper userMapper;
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Autowired
|
||||
RedisUserUtil redisUserUtil;
|
||||
|
||||
@Override
|
||||
public CommentModel create(CommentReq reqBody) {
|
||||
if (reqBody == null) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
User user = redisUserUtil.get();
|
||||
Comment pComment = null;
|
||||
if (reqBody.getPid() != -1) {
|
||||
pComment = commentMapper.findCommentById(reqBody.getPid());
|
||||
}
|
||||
//不是一级评论
|
||||
if (reqBody.getPid() != -1 && pComment == null) {
|
||||
//父评论不存在
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
Comment comment = new Comment();
|
||||
comment.setFromUser(user);
|
||||
User userTo = new User();
|
||||
userTo.setId(-1L);
|
||||
if (reqBody.getToUserId() != -1) {
|
||||
userTo = userMapper.findById(reqBody.getToUserId());
|
||||
comment.setToUser(userTo);
|
||||
}
|
||||
comment.setToUser(userTo);
|
||||
userMapper.findById(reqBody.getToUserId());
|
||||
BeanUtils.copyProperties(reqBody, comment);
|
||||
commentMapper.insert(comment);
|
||||
return ModalTrans.comment(commentMapper.findCommentById(comment.getId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean delete(long id) {
|
||||
Comment b = commentMapper.findCommentById(id);
|
||||
if (b == null) {
|
||||
throw new MyException(ResponseEnum.COMMENT_NOT_EXIST);
|
||||
}
|
||||
if (b.getStatus() == CommentStatusEnum.DELETED.getCode()) {
|
||||
throw new MyException(ResponseEnum.DATA_IS_DELETED);
|
||||
}
|
||||
commentMapper.delete(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommentModel update(CommentReq reqBody) {
|
||||
if (reqBody.getId() == null) {
|
||||
throw new MyException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不可为空");
|
||||
}
|
||||
Comment comment = commentMapper.findCommentById(reqBody.getId());
|
||||
if (!comment.getContent().equals(reqBody.getContent())) {
|
||||
commentMapper.updateContent(reqBody.getContent(), reqBody.getId());
|
||||
comment.setContent(reqBody.getContent());
|
||||
}
|
||||
return ModalTrans.comment(comment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePage(String pagePath, int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePathAndPidAndNormal(pagePath, -1);
|
||||
return pageTrans(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CommentModel> retrievePageByPid(long pid) {
|
||||
List<Comment> allByPagePath = commentMapper.findAllByPid(pid);
|
||||
List<CommentModel> commentModels = new ArrayList<>();
|
||||
allByPagePath.forEach(comment -> {
|
||||
if (comment.getStatus() != CommentStatusEnum.DELETED.getCode()) {
|
||||
commentModels.add(ModalTrans.comment(comment));
|
||||
}
|
||||
});
|
||||
|
||||
return commentModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count) {
|
||||
User user = redisUserUtil.get();
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePathAndFromUser(pagePath, user.getId());
|
||||
return pageTrans(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePath(pagePath);
|
||||
return pageTrans(list, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePath(pagePath);
|
||||
return pageTrans(list, true);
|
||||
}
|
||||
|
||||
private PageData<CommentModel> pageTrans(List<Comment> commentList) {
|
||||
return pageTrans(commentList, false);
|
||||
}
|
||||
|
||||
private PageData<CommentModel> pageTrans(List<Comment> commentList, boolean noResponseList) {
|
||||
PageInfo<Comment> p = PageInfo.of(commentList);
|
||||
List<CommentModel> modelList = new ArrayList<>();
|
||||
commentList.forEach(l -> {
|
||||
CommentModel model = ModalTrans.comment(l);
|
||||
if (!noResponseList) {
|
||||
model.setRespComment(this.retrievePageByPid(model.getId()));
|
||||
}
|
||||
modelList.add(model);
|
||||
});
|
||||
return new PageData<CommentModel>(p, modelList);
|
||||
}
|
||||
}
|
||||
package cn.celess.comment.serviceimpl;
|
||||
|
||||
import cn.celess.common.constant.CommentStatusEnum;
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import cn.celess.common.entity.Comment;
|
||||
import cn.celess.common.entity.User;
|
||||
import cn.celess.common.entity.dto.CommentReq;
|
||||
import cn.celess.common.entity.vo.CommentModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.exception.BlogResponseException;
|
||||
import cn.celess.common.mapper.ArticleMapper;
|
||||
import cn.celess.common.mapper.CommentMapper;
|
||||
import cn.celess.common.mapper.UserMapper;
|
||||
import cn.celess.common.service.CommentService;
|
||||
import cn.celess.common.util.ModalTrans;
|
||||
import cn.celess.user.util.RedisUserUtil;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/29 17:05
|
||||
*/
|
||||
@Service
|
||||
public class CommentServiceImpl implements CommentService {
|
||||
@Autowired
|
||||
CommentMapper commentMapper;
|
||||
@Autowired
|
||||
UserMapper userMapper;
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Autowired
|
||||
RedisUserUtil redisUserUtil;
|
||||
|
||||
@Override
|
||||
public CommentModel create(CommentReq reqBody) {
|
||||
if (reqBody == null) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
User user = redisUserUtil.get();
|
||||
Comment pComment = null;
|
||||
if (reqBody.getPid() != -1) {
|
||||
pComment = commentMapper.findCommentById(reqBody.getPid());
|
||||
}
|
||||
//不是一级评论
|
||||
if (reqBody.getPid() != -1 && pComment == null) {
|
||||
//父评论不存在
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR);
|
||||
}
|
||||
Comment comment = new Comment();
|
||||
comment.setFromUser(user);
|
||||
User userTo = new User();
|
||||
userTo.setId(null);
|
||||
if (reqBody.getToUserId() != -1) {
|
||||
userTo = userMapper.findById(reqBody.getToUserId());
|
||||
comment.setToUser(userTo);
|
||||
}
|
||||
comment.setToUser(userTo);
|
||||
userMapper.findById(reqBody.getToUserId());
|
||||
BeanUtils.copyProperties(reqBody, comment);
|
||||
commentMapper.insert(comment);
|
||||
return ModalTrans.comment(commentMapper.findCommentById(comment.getId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean delete(long id) {
|
||||
Comment b = commentMapper.findCommentById(id);
|
||||
if (b == null) {
|
||||
throw new BlogResponseException(ResponseEnum.COMMENT_NOT_EXIST);
|
||||
}
|
||||
if (b.getStatus() == CommentStatusEnum.DELETED.getCode()) {
|
||||
throw new BlogResponseException(ResponseEnum.DATA_IS_DELETED);
|
||||
}
|
||||
commentMapper.delete(id);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommentModel update(CommentReq reqBody) {
|
||||
if (reqBody.getId() == null) {
|
||||
throw new BlogResponseException(ResponseEnum.PARAMETERS_ERROR.getCode(), "id不可为空");
|
||||
}
|
||||
Comment comment = commentMapper.findCommentById(reqBody.getId());
|
||||
if (!comment.getContent().equals(reqBody.getContent())) {
|
||||
commentMapper.updateContent(reqBody.getContent(), reqBody.getId());
|
||||
comment.setContent(reqBody.getContent());
|
||||
}
|
||||
return ModalTrans.comment(comment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePage(String pagePath, int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePathAndPidAndNormal(pagePath, -1);
|
||||
return pageTrans(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CommentModel> retrievePageByPid(long pid) {
|
||||
List<Comment> allByPagePath = commentMapper.findAllByPid(pid);
|
||||
return allByPagePath
|
||||
.stream()
|
||||
.filter(comment -> comment.getStatus() != CommentStatusEnum.DELETED.getCode())
|
||||
.map(ModalTrans::comment)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count) {
|
||||
User user = redisUserUtil.get();
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePathAndFromUser(pagePath, user.getId());
|
||||
return pageTrans(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePath(pagePath);
|
||||
return pageTrans(list, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count) {
|
||||
PageHelper.startPage(page, count);
|
||||
List<Comment> list = commentMapper.findAllByPagePath(pagePath);
|
||||
return pageTrans(list, true);
|
||||
}
|
||||
|
||||
private PageData<CommentModel> pageTrans(List<Comment> commentList) {
|
||||
return pageTrans(commentList, false);
|
||||
}
|
||||
|
||||
private PageData<CommentModel> pageTrans(List<Comment> commentList, boolean noResponseList) {
|
||||
PageInfo<Comment> p = PageInfo.of(commentList);
|
||||
List<CommentModel> modelList = commentList
|
||||
.stream()
|
||||
.map(ModalTrans::comment)
|
||||
.peek(commentModel -> commentModel.setRespComment(this.retrievePageByPid(commentModel.getId())))
|
||||
.collect(Collectors.toList());
|
||||
return new PageData<>(p, modelList);
|
||||
}
|
||||
}
|
||||
12
blog-comment/src/main/resources/banner.txt
Normal file
12
blog-comment/src/main/resources/banner.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
${AnsiColor.BRIGHT_GREEN}
|
||||
_ _ _ ____ _ _____ _
|
||||
| | | | (_) | _ \ | | / ____| | |
|
||||
| |__| | _ | |_) | | | ___ __ _ ______ | | ___ _ __ ___ _ __ ___ ___ _ __ | |_
|
||||
| __ | | | | _ < | | / _ \ / _` | |______| | | / _ \ | '_ ` _ \ | '_ ` _ \ / _ \ | '_ \ | __|
|
||||
| | | | | | | |_) | | | | (_) | | (_| | | |____ | (_) | | | | | | | | | | | | | | __/ | | | | | |_
|
||||
|_| |_| |_| |____/ |_| \___/ \__, | \_____| \___/ |_| |_| |_| |_| |_| |_| \___| |_| |_| \__|
|
||||
__/ |
|
||||
|___/
|
||||
${AnsiColor.BRIGHT_RED}
|
||||
Application Version: ${application.version}${application.formatted-version}
|
||||
Spring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}
|
||||
@@ -0,0 +1,11 @@
|
||||
package cn.celess.comment;
|
||||
|
||||
import cn.celess.common.test.BaseTest;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@SpringBootTest(classes = {CommentApplication.class})
|
||||
@RunWith(SpringRunner.class)
|
||||
public abstract class CommentBaseTest extends BaseTest {
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
package cn.celess.comment.controller;
|
||||
|
||||
import cn.celess.comment.CommentBaseTest;
|
||||
import cn.celess.common.entity.Article;
|
||||
import cn.celess.common.entity.Comment;
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.User;
|
||||
import cn.celess.common.entity.dto.CommentReq;
|
||||
import cn.celess.common.entity.vo.CommentModel;
|
||||
import cn.celess.common.mapper.ArticleMapper;
|
||||
import cn.celess.common.mapper.CommentMapper;
|
||||
import cn.celess.common.mapper.UserMapper;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static cn.celess.common.constant.ResponseEnum.DATA_IS_DELETED;
|
||||
import static cn.celess.common.constant.ResponseEnum.SUCCESS;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||
|
||||
public class CommentControllerTest extends CommentBaseTest {
|
||||
@Autowired
|
||||
ArticleMapper articleMapper;
|
||||
@Autowired
|
||||
UserMapper userMapper;
|
||||
@Autowired
|
||||
CommentMapper commentMapper;
|
||||
private static final TypeReference<?> COMMENT_MODEL_TYPE = new TypeReference<Response<CommentModel>>() {
|
||||
};
|
||||
|
||||
@Test
|
||||
public void addOne() throws Exception {
|
||||
Article article = articleMapper.getLastestArticle();
|
||||
CommentReq commentReq = new CommentReq();
|
||||
commentReq.setPagePath("/article/" + article.getId());
|
||||
commentReq.setContent(randomStr());
|
||||
List<User> all = userMapper.findAll();
|
||||
commentReq.setPid(1L);
|
||||
commentReq.setToUserId(2l);
|
||||
getMockData(post("/user/comment/create"), userLogin(), commentReq).andDo(result -> {
|
||||
Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
CommentModel model = response.getResult();
|
||||
assertNotEquals(0, model.getId());
|
||||
assertEquals(commentReq.getPid(), model.getPid().longValue());
|
||||
assertEquals(1, model.getPid().longValue());
|
||||
assertEquals(commentReq.getContent(), model.getContent());
|
||||
assertNotNull(model.getDate());
|
||||
assertNotNull(model.getFromUser());
|
||||
assertNotNull(model.getToUser());
|
||||
});
|
||||
|
||||
|
||||
commentReq.setPagePath("/article/" + article.getId());
|
||||
commentReq.setContent(randomStr());
|
||||
commentReq.setPid(-1L);
|
||||
commentReq.setToUserId(2);
|
||||
getMockData(post("/user/comment/create"), userLogin(), commentReq).andDo(result -> {
|
||||
Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
CommentModel model = response.getResult();
|
||||
// 响应数据的完整性
|
||||
assertNotEquals(0, model.getId());
|
||||
assertEquals(commentReq.getPid(), model.getPid().longValue());
|
||||
assertEquals(-1, model.getPid().longValue());
|
||||
assertEquals(commentReq.getContent(), model.getContent());
|
||||
assertEquals(commentReq.getPagePath(), "/article/" + article.getId());
|
||||
assertNotNull(model.getDate());
|
||||
assertNotNull(model.getFromUser());
|
||||
assertNotNull(model.getToUser());
|
||||
});
|
||||
|
||||
// 测试二级回复
|
||||
Comment latestComment = commentMapper.getLastestComment();
|
||||
commentReq.setPagePath("/article/" + article.getId());
|
||||
commentReq.setContent(randomStr());
|
||||
commentReq.setPid(latestComment.getId());
|
||||
getMockData(post("/user/comment/create"), userLogin(), commentReq).andDo(result -> {
|
||||
Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
CommentModel model = response.getResult();
|
||||
// 重新获取父评论信息
|
||||
Comment pCommon = commentMapper.findCommentById(latestComment.getId());
|
||||
assertEquals(pCommon.getId(), model.getPid());
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deleteTest() throws Exception {
|
||||
// 准备数据
|
||||
User from = userMapper.findByEmail("zh56462271@qq.com");
|
||||
assertNotNull(from);
|
||||
User to = userMapper.findByEmail("a@celess.cn");
|
||||
assertNotNull(to);
|
||||
|
||||
Comment comment = new Comment();
|
||||
comment.setContent(randomStr(8));
|
||||
comment.setFromUser(from);
|
||||
comment.setToUser(to);
|
||||
comment.setPagePath("/tags");
|
||||
comment.setPid(-1L);
|
||||
commentMapper.insert(comment);
|
||||
comment = commentMapper.findCommentById(comment.getId());
|
||||
// 接口测试
|
||||
long id = comment.getId();
|
||||
assertNotEquals(0, id);
|
||||
getMockData(delete("/user/comment/del?id=" + id), userLogin()).andDo(result -> {
|
||||
Response<Boolean> response = getResponse(result, BOOLEAN_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
assertTrue(response.getResult());
|
||||
});
|
||||
getMockData(delete("/user/comment/del?id=" + id), userLogin())
|
||||
.andDo(result -> assertEquals(DATA_IS_DELETED.getCode(), getResponse(result, COMMENT_MODEL_TYPE).getCode()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void update() throws Exception {
|
||||
Comment comment = commentMapper.getLastestComment();
|
||||
CommentReq commentReq = new CommentReq();
|
||||
commentReq.setId(comment.getId());
|
||||
commentReq.setContent(randomStr());
|
||||
// 不合法数据 setResponseId
|
||||
getMockData(put("/user/comment/update"), userLogin(), commentReq).andDo(result -> {
|
||||
Response<CommentModel> response = getResponse(result, COMMENT_MODEL_TYPE);
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
CommentModel c = response.getResult();
|
||||
assertEquals(commentReq.getContent(), c.getContent());
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
116
blog-common/pom.xml
Normal file
116
blog-common/pom.xml
Normal file
@@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>blog</artifactId>
|
||||
<groupId>cn.celess</groupId>
|
||||
<version>1.0.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>blog-common</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>cn.celess</groupId>
|
||||
<artifactId>blog-resource</artifactId>
|
||||
<version>${blog-resource.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.kstyrc</groupId>
|
||||
<artifactId>embedded-redis</artifactId>
|
||||
<version>0.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid</artifactId>
|
||||
<version>1.2.8</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.sun</groupId>
|
||||
<artifactId>jconsole</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>com.sun</groupId>
|
||||
<artifactId>tools</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis -->
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||
<version>2.2.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- pageHelper -->
|
||||
<dependency>
|
||||
<groupId>com.github.pagehelper</groupId>
|
||||
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||
<version>1.3.0</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!--Email-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-mail</artifactId>
|
||||
</dependency>
|
||||
<!-- TODO: remove this -->
|
||||
<dependency>
|
||||
<groupId>com.qiniu</groupId>
|
||||
<artifactId>qiniu-java-sdk</artifactId>
|
||||
<version>[7.2.0, 7.2.99]</version>
|
||||
</dependency>
|
||||
|
||||
<!-- redis -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.12.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.htmlunit</groupId>
|
||||
<artifactId>htmlunit</artifactId>
|
||||
<version>2.53.0</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- protostuff序列化依赖 -->
|
||||
<dependency>
|
||||
<groupId>com.dyuproject.protostuff</groupId>
|
||||
<artifactId>protostuff-core</artifactId>
|
||||
<version>1.1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.dyuproject.protostuff</groupId>
|
||||
<artifactId>protostuff-runtime</artifactId>
|
||||
<version>1.1.6</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,26 @@
|
||||
package cn.celess.common;
|
||||
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.Banner;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.FilterType;
|
||||
import org.springframework.core.SpringVersion;
|
||||
|
||||
|
||||
@SpringBootApplication(
|
||||
scanBasePackageClasses = {
|
||||
CommonApplication.class
|
||||
}
|
||||
)
|
||||
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = "cn.celess.common.test.BaseRedisTest")})
|
||||
@MapperScan("cn.celess.common.mapper")
|
||||
public class CommonApplication {
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(CommonApplication.class)
|
||||
.main(SpringVersion.class)
|
||||
.bannerMode(Banner.Mode.CONSOLE)
|
||||
.run(args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package cn.celess.common.config;
|
||||
|
||||
import cn.celess.common.util.EnvironmentUtil;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.env.EnvironmentPostProcessor;
|
||||
import org.springframework.boot.logging.DeferredLog;
|
||||
import org.springframework.context.ApplicationEvent;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.env.ConfigurableEnvironment;
|
||||
import org.springframework.core.env.PropertiesPropertySource;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
@Component
|
||||
public class CommonEnvPostProcessor implements EnvironmentPostProcessor, ApplicationListener<ApplicationEvent>, Ordered {
|
||||
public static final DeferredLog log = new DeferredLog();
|
||||
|
||||
private static final String CONFIG_PATH = "/HBlog/config/blog.properties";
|
||||
private static final String SOURCE_NAME = "localize";
|
||||
|
||||
@Override
|
||||
public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication springApplication) {
|
||||
|
||||
EnvironmentUtil.setEnvironment(configurableEnvironment);
|
||||
|
||||
log.info("加载本地配置文件--");
|
||||
//获取环境变量
|
||||
String homeEnv = EnvironmentUtil.getEnv("BLOG_HOME", EnvironmentUtil.getEnv("USERPROFILE"));
|
||||
String configPath = (homeEnv + CONFIG_PATH).replaceAll("[\\|/]+", Matcher.quoteReplacement(File.separator));
|
||||
try (InputStream input = new FileInputStream(configPath)) {
|
||||
Properties properties = new Properties();
|
||||
properties.load(input);
|
||||
PropertiesPropertySource propertySource = new PropertiesPropertySource(SOURCE_NAME, properties);
|
||||
configurableEnvironment.getPropertySources().addLast(propertySource);
|
||||
log.info("成功加载本地配置文件:)");
|
||||
} catch (Exception e) {
|
||||
log.info("加载本地[" + configPath + "]的配置文件失败:(");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(ApplicationEvent event) {
|
||||
log.replayTo(CommonEnvPostProcessor.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.celess.blog.enmu;
|
||||
package cn.celess.common.constant;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -1,89 +1,96 @@
|
||||
package cn.celess.blog.enmu;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:37
|
||||
*/
|
||||
public enum ResponseEnum {
|
||||
// Response enum
|
||||
|
||||
SUCCESS(0, "成功"),
|
||||
FAILURE(-1, "失败"),
|
||||
ERROR(-2, "错误"),
|
||||
|
||||
DATA_IS_DELETED(1000, "数据已被删除"),
|
||||
|
||||
//文章类
|
||||
ARTICLE_NOT_EXIST(2010, "文章不存在"),
|
||||
ARTICLE_HAS_EXIST(2020, "文章已存在"),
|
||||
ARTICLE_NOT_PUBLIC(2030, "文章暂未公开"),
|
||||
ARTICLE_NOT_BELONG_YOU(2040, "无权限操作别人的文章"),
|
||||
|
||||
//用户类
|
||||
HAVE_NOT_LOG_IN(3010, "还未登录"),
|
||||
PERMISSION_ERROR(3020, "没有此权限"),
|
||||
USER_NOT_EXIST(3030, "用户不存在"),
|
||||
USERNAME_HAS_EXIST(3040, "用户名已存在"),
|
||||
USERNAME_TOO_SHORT(3050, "用户名太短"),
|
||||
PASSWORD_TOO_SHORT_OR_LONG(3060, "密码长度过长或者过短"),
|
||||
LOGIN_FAILURE(3100, "登录失败,用户名/密码不正确"),
|
||||
USEREMAIL_NULL(3310, "未设置邮箱"),
|
||||
USEREMAIL_NOT_VERIFY(3320, "邮箱未验证"),
|
||||
LOGIN_LATER(3500, "错误次数已达5次,请稍后再试"),
|
||||
PWD_SAME(3601, "新密码与原密码相同"),
|
||||
PWD_NOT_SAME(3602, "新密码与原密码不相同"),
|
||||
LOGIN_EXPIRED(3700, "登陆过期"),
|
||||
PWD_WRONG(3800, "密码不正确"),
|
||||
|
||||
JWT_EXPIRED(3810, "Token过期"),
|
||||
JWT_MALFORMED(3820, "Token格式不对"),
|
||||
JWT_SIGNATURE(3830, "Token签名错误"),
|
||||
JWT_NOT_SUPPORT(3840, "不支持的Token"),
|
||||
|
||||
//标签
|
||||
TAG_NOT_EXIST(4010, "标签不存在"),
|
||||
TAG_HAS_EXIST(4020, "标签已存在"),
|
||||
|
||||
//分类
|
||||
CATEGORY_NOT_EXIST(5010, "分类不存在"),
|
||||
CATEGORY_HAS_EXIST(5020, "分类已存在"),
|
||||
|
||||
//评论/留言
|
||||
COMMENT_NOT_EXIST(6010, "评论/留言不存在"),
|
||||
COMMENT_HAS_EXIST(6020, "评论/留言已存在,请不要重复提交"),
|
||||
|
||||
//webUdpateInfo amd PartnerSite
|
||||
DATA_NOT_EXIST(7010, "数据不存在"),
|
||||
DATA_HAS_EXIST(7020, "数据已存在"),
|
||||
|
||||
//其他
|
||||
|
||||
//提交更新之前,没有获取数据/,
|
||||
DID_NOT_GET_THE_DATA(8020, "非法访问"),
|
||||
IMG_CODE_TIMEOUT(8100, "验证码已失效"),
|
||||
IMG_CODE_DIDNOTVERIFY(8200, "请先验证验证码"),
|
||||
VERIFY_ERROR(8300, "验证失败"),
|
||||
PARAMETERS_ERROR(8500, "参数错误"),
|
||||
PARAMETERS_URL_ERROR(8510, "链接格式错误"),
|
||||
PARAMETERS_EMAIL_ERROR(8520, "邮箱格式错误"),
|
||||
PARAMETERS_PHONE_ERROR(8530, "手机格式错误"),
|
||||
PARAMETERS_QQ_ERROR(8540, "QQ格式错误"),
|
||||
PARAMETERS_PWD_ERROR(8550, "密码格式错误"),
|
||||
VERIFY_OUT(8400, "已经验证过了");
|
||||
private final int code;
|
||||
private final String msg;
|
||||
|
||||
|
||||
ResponseEnum(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
package cn.celess.common.constant;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:37
|
||||
*/
|
||||
public enum ResponseEnum {
|
||||
// Response enum
|
||||
|
||||
SUCCESS(0, "成功"),
|
||||
FAILURE(-1, "失败"),
|
||||
ERROR(-2, "错误"),
|
||||
|
||||
DATA_IS_DELETED(1000, "数据已被删除"),
|
||||
|
||||
//文章类
|
||||
ARTICLE_NOT_EXIST(2010, "文章不存在"),
|
||||
ARTICLE_HAS_EXIST(2020, "文章已存在"),
|
||||
ARTICLE_NOT_PUBLIC(2030, "文章暂未公开"),
|
||||
ARTICLE_NOT_BELONG_YOU(2040, "无权限操作别人的文章"),
|
||||
|
||||
//用户类
|
||||
HAVE_NOT_LOG_IN(3010, "还未登录"),
|
||||
PERMISSION_ERROR(3020, "没有此权限"),
|
||||
USER_NOT_EXIST(3030, "用户不存在"),
|
||||
USERNAME_HAS_EXIST(3040, "用户名已存在"),
|
||||
USERNAME_TOO_SHORT(3050, "用户名太短"),
|
||||
PASSWORD_TOO_SHORT_OR_LONG(3060, "密码长度过长或者过短"),
|
||||
LOGIN_FAILURE(3100, "登录失败,用户名/密码不正确"),
|
||||
USEREMAIL_NULL(3310, "未设置邮箱"),
|
||||
USEREMAIL_NOT_VERIFY(3320, "邮箱未验证"),
|
||||
LOGIN_LATER(3500, "错误次数已达5次,请稍后再试"),
|
||||
PWD_SAME(3601, "新密码与原密码相同"),
|
||||
PWD_NOT_SAME(3602, "新密码与原密码不相同"),
|
||||
LOGIN_EXPIRED(3700, "登陆过期"),
|
||||
LOGOUT(3710, "账户已注销"),
|
||||
CAN_NOT_USE(3711, "账户不可用"),
|
||||
PWD_WRONG(3800, "密码不正确"),
|
||||
|
||||
JWT_EXPIRED(3810, "Token过期"),
|
||||
JWT_MALFORMED(3820, "Token格式不对"),
|
||||
JWT_SIGNATURE(3830, "Token签名错误"),
|
||||
JWT_NOT_SUPPORT(3840, "不支持的Token"),
|
||||
|
||||
//标签
|
||||
TAG_NOT_EXIST(4010, "标签不存在"),
|
||||
TAG_HAS_EXIST(4020, "标签已存在"),
|
||||
|
||||
//分类
|
||||
CATEGORY_NOT_EXIST(5010, "分类不存在"),
|
||||
CATEGORY_HAS_EXIST(5020, "分类已存在"),
|
||||
|
||||
//评论/留言
|
||||
COMMENT_NOT_EXIST(6010, "评论/留言不存在"),
|
||||
COMMENT_HAS_EXIST(6020, "评论/留言已存在,请不要重复提交"),
|
||||
|
||||
//webUdpateInfo amd PartnerSite
|
||||
DATA_NOT_EXIST(7010, "数据不存在"),
|
||||
DATA_HAS_EXIST(7020, "数据已存在"),
|
||||
|
||||
//其他
|
||||
APPLY_LINK_NO_ADD_THIS_SITE(7200, "暂未在您的网站中抓取到本站链接"),
|
||||
DATA_EXPIRED(7300, "数据过期"),
|
||||
CANNOT_GET_DATA(7400, "暂无法获取到数据"),
|
||||
NO_FILE(7500, "未选择文件,请重新选择"),
|
||||
|
||||
|
||||
//提交更新之前,没有获取数据/,
|
||||
DID_NOT_GET_THE_DATA(8020, "非法访问"),
|
||||
IMG_CODE_TIMEOUT(8100, "验证码已失效"),
|
||||
IMG_CODE_DIDNOTVERIFY(8200, "请先验证验证码"),
|
||||
VERIFY_ERROR(8300, "验证失败"),
|
||||
PARAMETERS_ERROR(8500, "参数错误"),
|
||||
PARAMETERS_URL_ERROR(8510, "链接格式错误"),
|
||||
PARAMETERS_EMAIL_ERROR(8520, "邮箱格式错误"),
|
||||
PARAMETERS_PHONE_ERROR(8530, "手机格式错误"),
|
||||
PARAMETERS_QQ_ERROR(8540, "QQ格式错误"),
|
||||
PARAMETERS_PWD_ERROR(8550, "密码格式错误"),
|
||||
VERIFY_OUT(8400, "已经验证过了");
|
||||
private final int code;
|
||||
private final String msg;
|
||||
|
||||
|
||||
ResponseEnum(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.celess.blog.enmu;
|
||||
package cn.celess.common.constant;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
package cn.celess.common.constant;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.JsonValue;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @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;
|
||||
}
|
||||
|
||||
public static UserAccountStatusEnum get(int code) {
|
||||
for (UserAccountStatusEnum value : UserAccountStatusEnum.values()) {
|
||||
if (value.code == code) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@JsonCreator
|
||||
public static UserAccountStatusEnum get(Map<String, Object> map) {
|
||||
for (UserAccountStatusEnum value : UserAccountStatusEnum.values()) {
|
||||
if (value.code == (int) map.get("code") && value.desc.equals(map.get("desc"))) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@JsonValue
|
||||
public Map<String, Object> toJson() {
|
||||
Map<String, Object> map = new HashMap<>(2);
|
||||
map.put("code", code);
|
||||
map.put("desc", desc);
|
||||
return map;
|
||||
}
|
||||
}
|
||||
@@ -1,63 +1,64 @@
|
||||
package cn.celess.blog.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 14:51
|
||||
*/
|
||||
@Data
|
||||
public class Article {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 摘要
|
||||
*/
|
||||
private String summary;
|
||||
|
||||
/**
|
||||
* Markdown正文
|
||||
*/
|
||||
private String mdContent;
|
||||
|
||||
/**
|
||||
* 文章类型 true(1)为原创 false(0)为转载
|
||||
*/
|
||||
private Boolean type;
|
||||
|
||||
/**
|
||||
* 若为转载 则为转载文章的url
|
||||
*/
|
||||
private String url = null;
|
||||
|
||||
private Date publishDate;
|
||||
|
||||
private Date updateDate = null;
|
||||
|
||||
private Long readingNumber;
|
||||
|
||||
/**
|
||||
* 文章的状态 true:公开 false:不公开
|
||||
*/
|
||||
private Boolean open;
|
||||
|
||||
private Category category;
|
||||
|
||||
private List<Tag> tags;
|
||||
|
||||
private Integer likeCount;
|
||||
|
||||
private Integer dislikeCount;
|
||||
|
||||
private User user;
|
||||
|
||||
private boolean deleted = false;
|
||||
}
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 14:51
|
||||
*/
|
||||
@Data
|
||||
public class Article implements Serializable {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 摘要
|
||||
*/
|
||||
private String summary;
|
||||
|
||||
/**
|
||||
* Markdown正文
|
||||
*/
|
||||
private String mdContent;
|
||||
|
||||
/**
|
||||
* 文章类型 true(1)为原创 false(0)为转载
|
||||
*/
|
||||
private Boolean type;
|
||||
|
||||
/**
|
||||
* 若为转载 则为转载文章的url
|
||||
*/
|
||||
private String url = null;
|
||||
|
||||
private Date publishDate;
|
||||
|
||||
private Date updateDate = null;
|
||||
|
||||
private Long readingNumber;
|
||||
|
||||
/**
|
||||
* 文章的状态 true:公开 false:不公开
|
||||
*/
|
||||
private Boolean open;
|
||||
|
||||
private Category category;
|
||||
|
||||
private List<Tag> tags;
|
||||
|
||||
private Integer likeCount;
|
||||
|
||||
private Integer dislikeCount;
|
||||
|
||||
private User user;
|
||||
|
||||
private boolean deleted = false;
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
package cn.celess.blog.entity;
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2020-05-24 14:52
|
||||
@@ -12,7 +14,7 @@ import lombok.NoArgsConstructor;
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ArticleTag {
|
||||
public class ArticleTag implements Serializable {
|
||||
private Long id;
|
||||
|
||||
private Article article;
|
||||
@@ -1,13 +1,15 @@
|
||||
package cn.celess.blog.entity;
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:18
|
||||
*/
|
||||
@NoArgsConstructor
|
||||
public class Category extends TagCategory {
|
||||
public class Category extends TagCategory implements Serializable {
|
||||
public Category(String name) {
|
||||
super.setName(name);
|
||||
}
|
||||
@@ -1,34 +1,35 @@
|
||||
package cn.celess.blog.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/29 16:47
|
||||
*/
|
||||
|
||||
@Data
|
||||
public class Comment {
|
||||
|
||||
private Long id;
|
||||
|
||||
private int status;
|
||||
|
||||
private String pagePath;
|
||||
|
||||
private String content;
|
||||
|
||||
private Date date;
|
||||
|
||||
private User fromUser;
|
||||
|
||||
private User toUser;
|
||||
/**
|
||||
* 评论的父ID
|
||||
*/
|
||||
private Long pid;
|
||||
|
||||
// private boolean delete;
|
||||
}
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/29 16:47
|
||||
*/
|
||||
|
||||
@Data
|
||||
public class Comment implements Serializable {
|
||||
|
||||
private Long id;
|
||||
|
||||
private int status;
|
||||
|
||||
private String pagePath;
|
||||
|
||||
private String content;
|
||||
|
||||
private Date date;
|
||||
|
||||
private User fromUser;
|
||||
|
||||
private User toUser;
|
||||
/**
|
||||
* 评论的父ID
|
||||
*/
|
||||
private Long pid;
|
||||
|
||||
// private boolean delete;
|
||||
}
|
||||
@@ -1,36 +1,42 @@
|
||||
package cn.celess.blog.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 友链
|
||||
*
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:33
|
||||
*/
|
||||
@Data
|
||||
public class PartnerSite {
|
||||
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
private String url;
|
||||
|
||||
private Boolean open;
|
||||
|
||||
private String iconPath;
|
||||
|
||||
private String desc;
|
||||
|
||||
private Boolean delete = false;
|
||||
|
||||
public PartnerSite() {
|
||||
}
|
||||
|
||||
public PartnerSite(String name, String url, Boolean open) {
|
||||
this.name = name;
|
||||
this.url = url;
|
||||
this.open = open;
|
||||
}
|
||||
}
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 友链
|
||||
*
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:33
|
||||
*/
|
||||
@Data
|
||||
public class PartnerSite implements Serializable {
|
||||
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
private String url;
|
||||
|
||||
private Boolean open;
|
||||
|
||||
private String iconPath;
|
||||
|
||||
private String desc;
|
||||
|
||||
private Boolean delete = false;
|
||||
|
||||
private String email;
|
||||
|
||||
private Boolean notification = true;
|
||||
|
||||
public PartnerSite() {
|
||||
}
|
||||
|
||||
public PartnerSite(String name, String url, Boolean open) {
|
||||
this.name = name;
|
||||
this.url = url;
|
||||
this.open = open;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.Data;
|
||||
import lombok.SneakyThrows;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:24
|
||||
*/
|
||||
@Data
|
||||
public class Response<T> implements Serializable {
|
||||
private int code;
|
||||
private String msg;
|
||||
private T result;
|
||||
|
||||
public Response() {
|
||||
}
|
||||
|
||||
public Response(int code, String msg, T result) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 成功相应
|
||||
*
|
||||
* @param result 结果
|
||||
* @return Response
|
||||
*/
|
||||
public static <T> Response<T> success(T result) {
|
||||
return new Response<T>(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg(), result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 失败的响应
|
||||
*
|
||||
* @param result 结果
|
||||
* @return Response
|
||||
*/
|
||||
public static Response<String> failure(String result) {
|
||||
return new Response<String>(ResponseEnum.FAILURE.getCode(), ResponseEnum.FAILURE.getMsg(), result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 其他的响应
|
||||
*
|
||||
* @param r 枚举常量
|
||||
* @param result 结果
|
||||
* @return Response
|
||||
*/
|
||||
public static <T> Response<T> response(ResponseEnum r, T result) {
|
||||
return new Response<T>(r.getCode(), r.getMsg(), result);
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public String toString() {
|
||||
return new ObjectMapper().writeValueAsString(this);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,15 @@
|
||||
package cn.celess.blog.entity;
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:19
|
||||
*/
|
||||
@NoArgsConstructor
|
||||
public class Tag extends TagCategory {
|
||||
public class Tag extends TagCategory implements Serializable {
|
||||
|
||||
public Tag(String name) {
|
||||
super.setName(name);
|
||||
@@ -1,14 +1,16 @@
|
||||
package cn.celess.blog.entity;
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2020-05-24 14:03
|
||||
* @Desc:
|
||||
*/
|
||||
@Data
|
||||
public class TagCategory {
|
||||
public class TagCategory implements Serializable {
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
@@ -1,53 +1,54 @@
|
||||
package cn.celess.blog.entity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 14:52
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class User {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
@JsonIgnore
|
||||
private String pwd;
|
||||
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
private String displayName;
|
||||
|
||||
private Boolean emailStatus = false;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private String avatarImgUrl;
|
||||
|
||||
private String desc;
|
||||
|
||||
private Date recentlyLandedDate;
|
||||
|
||||
private String role = "user";
|
||||
|
||||
private int status;
|
||||
|
||||
public User(String email, String pwd) {
|
||||
this.email = email;
|
||||
this.pwd = pwd;
|
||||
}
|
||||
}
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 14:52
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class User implements Serializable {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
@JsonIgnore
|
||||
private String pwd;
|
||||
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
private String displayName;
|
||||
|
||||
private Boolean emailStatus = false;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private String avatarImgUrl;
|
||||
|
||||
private String desc;
|
||||
|
||||
private Date recentlyLandedDate;
|
||||
|
||||
private String role = "user";
|
||||
|
||||
private int status;
|
||||
|
||||
public User(String email, String pwd) {
|
||||
this.email = email;
|
||||
this.pwd = pwd;
|
||||
}
|
||||
}
|
||||
@@ -1,28 +1,29 @@
|
||||
package cn.celess.blog.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/02 22:14
|
||||
*/
|
||||
@Data
|
||||
public class Visitor {
|
||||
|
||||
private long id;
|
||||
private String ip;
|
||||
private Date date;
|
||||
private String ua;
|
||||
private boolean delete;
|
||||
|
||||
public Visitor(String ip, Date date, String ua) {
|
||||
this.ip = ip;
|
||||
this.date = date;
|
||||
this.ua = ua;
|
||||
}
|
||||
|
||||
public Visitor() {
|
||||
}
|
||||
}
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/02 22:14
|
||||
*/
|
||||
@Data
|
||||
public class Visitor implements Serializable {
|
||||
|
||||
private long id;
|
||||
private String ip;
|
||||
private Date date;
|
||||
private String ua;
|
||||
private boolean delete;
|
||||
|
||||
public Visitor(String ip, Date date, String ua) {
|
||||
this.ip = ip;
|
||||
this.date = date;
|
||||
this.ua = ua;
|
||||
}
|
||||
|
||||
public Visitor() {
|
||||
}
|
||||
}
|
||||
@@ -1,28 +1,29 @@
|
||||
package cn.celess.blog.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:29
|
||||
*/
|
||||
@Data
|
||||
public class WebUpdate {
|
||||
|
||||
private long id;
|
||||
|
||||
private String updateInfo;
|
||||
|
||||
private Date updateTime;
|
||||
|
||||
private boolean delete;
|
||||
|
||||
public WebUpdate() {
|
||||
}
|
||||
|
||||
public WebUpdate(String updateInfo) {
|
||||
this.updateInfo = updateInfo;
|
||||
}
|
||||
}
|
||||
package cn.celess.common.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:29
|
||||
*/
|
||||
@Data
|
||||
public class WebUpdate implements Serializable {
|
||||
|
||||
private long id;
|
||||
|
||||
private String updateInfo;
|
||||
|
||||
private Date updateTime;
|
||||
|
||||
private boolean delete;
|
||||
|
||||
public WebUpdate() {
|
||||
}
|
||||
|
||||
public WebUpdate(String updateInfo) {
|
||||
this.updateInfo = updateInfo;
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,21 @@
|
||||
package cn.celess.blog.entity.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/01 22:46
|
||||
*/
|
||||
@Data
|
||||
public class ArticleReq {
|
||||
private Long id;
|
||||
private String title;
|
||||
private String mdContent;
|
||||
private String[] tags;
|
||||
private Boolean type;
|
||||
private String url;
|
||||
private String category;
|
||||
private Boolean open = true;
|
||||
}
|
||||
package cn.celess.common.entity.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/01 22:46
|
||||
*/
|
||||
@Data
|
||||
public class ArticleReq implements Serializable {
|
||||
private Long id;
|
||||
private String title;
|
||||
private String mdContent;
|
||||
private String[] tags;
|
||||
private Boolean type;
|
||||
private String url;
|
||||
private String category;
|
||||
private Boolean open = true;
|
||||
}
|
||||
@@ -1,16 +1,18 @@
|
||||
package cn.celess.blog.entity.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/02 10:35
|
||||
*/
|
||||
@Data
|
||||
public class CommentReq {
|
||||
private Long id;
|
||||
private String content;
|
||||
private long pid = -1;
|
||||
private String pagePath;
|
||||
private long toUserId = -1;
|
||||
}
|
||||
package cn.celess.common.entity.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/02 10:35
|
||||
*/
|
||||
@Data
|
||||
public class CommentReq implements Serializable {
|
||||
private Long id;
|
||||
private String content;
|
||||
private long pid = -1;
|
||||
private String pagePath;
|
||||
private long toUserId = -1;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package cn.celess.common.entity.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2020/07/31 20:50
|
||||
*/
|
||||
@Data
|
||||
public class LinkApplyReq implements Serializable {
|
||||
private String name;
|
||||
private String email;
|
||||
private String url;
|
||||
private String linkUrl;
|
||||
private String desc;
|
||||
private String iconPath;
|
||||
}
|
||||
@@ -1,17 +1,19 @@
|
||||
package cn.celess.blog.entity.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/02 11:40
|
||||
*/
|
||||
@Data
|
||||
public class LinkReq {
|
||||
private long id;
|
||||
private String name;
|
||||
private String url;
|
||||
private String iconPath;
|
||||
private String desc;
|
||||
private boolean open;
|
||||
}
|
||||
package cn.celess.common.entity.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/02 11:40
|
||||
*/
|
||||
@Data
|
||||
public class LinkReq implements Serializable {
|
||||
private long id;
|
||||
private String name;
|
||||
private String url;
|
||||
private String iconPath;
|
||||
private String desc;
|
||||
private boolean open;
|
||||
}
|
||||
@@ -1,19 +1,25 @@
|
||||
package cn.celess.blog.entity.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/01 22:47
|
||||
*/
|
||||
@Data
|
||||
public class LoginReq {
|
||||
private String email;
|
||||
private String password;
|
||||
/**
|
||||
* isRememberMe默认为false
|
||||
*/
|
||||
private Boolean isRememberMe = false;
|
||||
|
||||
}
|
||||
|
||||
package cn.celess.common.entity.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/06/01 22:47
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class LoginReq implements Serializable {
|
||||
private String email;
|
||||
private String password;
|
||||
/**
|
||||
* isRememberMe默认为false
|
||||
*/
|
||||
private Boolean isRememberMe = false;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,26 +1,28 @@
|
||||
package cn.celess.blog.entity.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/09/06 13:33
|
||||
* @Description:
|
||||
*/
|
||||
@Data
|
||||
public class UserReq {
|
||||
private Long id;
|
||||
|
||||
private String email;
|
||||
|
||||
private String pwd;
|
||||
|
||||
private String displayName;
|
||||
|
||||
private Boolean emailStatus;
|
||||
|
||||
private String desc;
|
||||
|
||||
private String role;
|
||||
|
||||
}
|
||||
package cn.celess.common.entity.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/09/06 13:33
|
||||
* @Description:
|
||||
*/
|
||||
@Data
|
||||
public class UserReq implements Serializable {
|
||||
private Long id;
|
||||
|
||||
private String email;
|
||||
|
||||
private String pwd;
|
||||
|
||||
private String displayName;
|
||||
|
||||
private Boolean emailStatus;
|
||||
|
||||
private String desc;
|
||||
|
||||
private String role;
|
||||
|
||||
}
|
||||
@@ -1,85 +1,88 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
import cn.celess.blog.entity.Tag;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/23 12:02
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class ArticleModel {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 摘要
|
||||
*/
|
||||
private String summary;
|
||||
|
||||
/**
|
||||
* Markdown正文
|
||||
*/
|
||||
private String mdContent;
|
||||
|
||||
/**
|
||||
* 文章类型 true(1)为原创 false(0)为转载
|
||||
*/
|
||||
private Boolean original;
|
||||
|
||||
/**
|
||||
* 若为转载 则为转载文章的url
|
||||
*/
|
||||
private String url;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
private String publishDateFormat;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private String updateDateFormat;
|
||||
|
||||
/**
|
||||
* 分类
|
||||
*/
|
||||
private String category;
|
||||
|
||||
/**
|
||||
* 标签
|
||||
*/
|
||||
private List<Tag> tags;
|
||||
|
||||
/**
|
||||
* 作者
|
||||
*/
|
||||
private UserModel author;
|
||||
|
||||
private ArticleModel preArticle;
|
||||
|
||||
private ArticleModel nextArticle;
|
||||
|
||||
/**
|
||||
* 阅读数
|
||||
*/
|
||||
private Long readingNumber;
|
||||
|
||||
private Integer likeCount;
|
||||
|
||||
private Integer dislikeCount;
|
||||
|
||||
/**
|
||||
* 文章的状态 true:公开 false:不公开
|
||||
*/
|
||||
private Boolean open;
|
||||
}
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import cn.celess.common.entity.Tag;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/23 12:02
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class ArticleModel implements Serializable {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 摘要
|
||||
*/
|
||||
private String summary;
|
||||
|
||||
/**
|
||||
* Markdown正文
|
||||
*/
|
||||
private String mdContent;
|
||||
|
||||
/**
|
||||
* 文章类型 true(1)为原创 false(0)为转载
|
||||
*/
|
||||
private Boolean original;
|
||||
|
||||
/**
|
||||
* 若为转载 则为转载文章的url
|
||||
*/
|
||||
private String url;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
private String publishDateFormat;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private String updateDateFormat;
|
||||
|
||||
/**
|
||||
* 分类
|
||||
*/
|
||||
private String category;
|
||||
|
||||
/**
|
||||
* 标签
|
||||
*/
|
||||
private List<Tag> tags;
|
||||
|
||||
/**
|
||||
* 作者
|
||||
*/
|
||||
private UserModel author;
|
||||
|
||||
private ArticleModel preArticle;
|
||||
|
||||
private ArticleModel nextArticle;
|
||||
|
||||
/**
|
||||
* 阅读数
|
||||
*/
|
||||
private Long readingNumber;
|
||||
|
||||
private Integer likeCount;
|
||||
|
||||
private Integer dislikeCount;
|
||||
|
||||
/**
|
||||
* 文章的状态 true:公开 false:不公开
|
||||
*/
|
||||
private Boolean open;
|
||||
|
||||
private boolean deleted;
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -14,10 +15,11 @@ import java.util.List;
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CategoryModel {
|
||||
public class CategoryModel implements Serializable {
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
private List<ArticleModel> articles;
|
||||
private boolean deleted;
|
||||
}
|
||||
@@ -1,44 +1,45 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/22 21:50
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class CommentModel {
|
||||
private long id;
|
||||
|
||||
private UserModel fromUser;
|
||||
|
||||
private UserModel toUser;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
private String content;
|
||||
|
||||
/**
|
||||
* 文章标题
|
||||
*/
|
||||
private String pagePath;
|
||||
|
||||
/**
|
||||
* 发布日期
|
||||
*/
|
||||
private String date;
|
||||
|
||||
/**
|
||||
* 评论的父ID
|
||||
*/
|
||||
private Long pid;
|
||||
|
||||
private List<CommentModel> respComment;
|
||||
|
||||
private int status;
|
||||
}
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/22 21:50
|
||||
*/
|
||||
@Setter
|
||||
@Getter
|
||||
public class CommentModel implements Serializable {
|
||||
private long id;
|
||||
|
||||
private UserModel fromUser;
|
||||
|
||||
private UserModel toUser;
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
private String content;
|
||||
|
||||
/**
|
||||
* 文章标题
|
||||
*/
|
||||
private String pagePath;
|
||||
|
||||
/**
|
||||
* 发布日期
|
||||
*/
|
||||
private String date;
|
||||
|
||||
/**
|
||||
* 评论的父ID
|
||||
*/
|
||||
private Long pid;
|
||||
|
||||
private List<CommentModel> respComment;
|
||||
|
||||
private int status;
|
||||
}
|
||||
@@ -1,10 +1,11 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -15,7 +16,7 @@ import java.util.List;
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class PageData<T> {
|
||||
public class PageData<T> implements Serializable {
|
||||
|
||||
private List<T> list;
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/21 22:43
|
||||
*/
|
||||
public class QiniuResponse {
|
||||
public String key;
|
||||
public String hash;
|
||||
public String bucket;
|
||||
public long fsize;
|
||||
}
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/21 22:43
|
||||
*/
|
||||
public class QiniuResponse implements Serializable {
|
||||
public String key;
|
||||
public String hash;
|
||||
public String bucket;
|
||||
public long fsize;
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -14,11 +15,12 @@ import java.util.List;
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class TagModel {
|
||||
public class TagModel implements Serializable {
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
private List<ArticleModel> articles;
|
||||
|
||||
private boolean deleted;
|
||||
}
|
||||
@@ -1,40 +1,45 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/22 23:13
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class UserModel {
|
||||
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
private String displayName;
|
||||
|
||||
private Boolean emailStatus = false;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private String avatarImgUrl;
|
||||
|
||||
private String desc;
|
||||
|
||||
private String recentlyLandedDate;
|
||||
|
||||
private String role = "user";
|
||||
|
||||
private String token;
|
||||
}
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import cn.celess.common.constant.UserAccountStatusEnum;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/22 23:13
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
public class UserModel implements Serializable {
|
||||
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
private String displayName;
|
||||
|
||||
private Boolean emailStatus = false;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private String avatarImgUrl;
|
||||
|
||||
private String desc;
|
||||
|
||||
private String recentlyLandedDate;
|
||||
|
||||
private String role = "user";
|
||||
|
||||
private String token;
|
||||
|
||||
private UserAccountStatusEnum status;
|
||||
}
|
||||
@@ -1,24 +1,26 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/05 16:05
|
||||
*/
|
||||
@Data
|
||||
public class VisitorModel {
|
||||
private long id;
|
||||
|
||||
private String ip;
|
||||
|
||||
private String date;
|
||||
|
||||
private String browserName;
|
||||
|
||||
private String browserVersion;
|
||||
|
||||
private String OSName;
|
||||
|
||||
private String location;
|
||||
}
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/05 16:05
|
||||
*/
|
||||
@Data
|
||||
public class VisitorModel implements Serializable {
|
||||
private long id;
|
||||
|
||||
private String ip;
|
||||
|
||||
private String date;
|
||||
|
||||
private String browserName;
|
||||
|
||||
private String browserVersion;
|
||||
|
||||
private String OSName;
|
||||
|
||||
private String location;
|
||||
}
|
||||
@@ -1,24 +1,28 @@
|
||||
package cn.celess.blog.entity.model;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:32
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class WebUpdateModel {
|
||||
private long id;
|
||||
|
||||
private String info;
|
||||
|
||||
private String time;
|
||||
|
||||
public WebUpdateModel(long id, String info, String time) {
|
||||
this.id = id;
|
||||
this.info = info;
|
||||
this.time = time;
|
||||
}
|
||||
}
|
||||
package cn.celess.common.entity.vo;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:32
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class WebUpdateModel implements Serializable {
|
||||
private long id;
|
||||
|
||||
private String info;
|
||||
|
||||
private String time;
|
||||
|
||||
public WebUpdateModel(long id, String info, String time) {
|
||||
this.id = id;
|
||||
this.info = info;
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
private boolean deleted;
|
||||
}
|
||||
@@ -1,94 +1,98 @@
|
||||
package cn.celess.blog.exception;
|
||||
|
||||
import cn.celess.blog.enmu.ResponseEnum;
|
||||
import cn.celess.blog.entity.Response;
|
||||
import cn.celess.blog.service.MailService;
|
||||
import cn.celess.blog.util.DateFormatUtil;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.mail.SimpleMailMessage;
|
||||
import org.springframework.validation.BindException;
|
||||
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
||||
import org.springframework.web.bind.MissingServletRequestParameterException;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 17:02
|
||||
*/
|
||||
|
||||
@ControllerAdvice
|
||||
public class ExceptionHandle {
|
||||
public static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
|
||||
@Autowired
|
||||
MailService mailService;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
@Value("${spring.profiles.active}")
|
||||
private String activeModel;
|
||||
|
||||
@ExceptionHandler(value = Exception.class)
|
||||
@ResponseBody
|
||||
public Response handle(Exception e) {
|
||||
//自定义错误
|
||||
if (e instanceof MyException) {
|
||||
logger.debug("返回了自定义的exception,[code={},msg={}]", ((MyException) e).getCode(), e.getMessage());
|
||||
return new Response(((MyException) e).getCode(), e.getMessage(), null);
|
||||
}
|
||||
//请求路径不支持该方法
|
||||
if (e instanceof HttpRequestMethodNotSupportedException) {
|
||||
logger.debug("遇到请求路径与请求方法不匹配的请求,[msg={},path:{},method:{}]", e.getMessage(), request.getRequestURL(), request.getMethod());
|
||||
return new Response(ResponseEnum.ERROR.getCode(), e.getMessage(), null);
|
||||
}
|
||||
//数据输入类型不匹配
|
||||
if (e instanceof MethodArgumentTypeMismatchException) {
|
||||
logger.debug("输入类型不匹配,[msg={}]", e.getMessage());
|
||||
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null);
|
||||
}
|
||||
//数据验证失败
|
||||
if (e instanceof BindException) {
|
||||
logger.debug("数据验证失败,[msg={}]", e.getMessage());
|
||||
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null);
|
||||
}
|
||||
//数据输入不完整
|
||||
if (e instanceof MissingServletRequestParameterException) {
|
||||
logger.debug("数据输入不完整,[msg={}]", e.getMessage());
|
||||
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null);
|
||||
}
|
||||
|
||||
// 发送错误信息到邮箱
|
||||
if ("prod".equals(activeModel)) {
|
||||
logger.debug("有一个未捕获的bug,已发送到邮箱");
|
||||
sendMessage(e);
|
||||
}
|
||||
e.printStackTrace();
|
||||
return new Response(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送错误信息
|
||||
*
|
||||
* @param e 错误
|
||||
*/
|
||||
private void sendMessage(Exception e) {
|
||||
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
|
||||
simpleMailMessage.setTo("a@celess.cn");
|
||||
simpleMailMessage.setSubject("服务器出现了错误");
|
||||
StringBuilder msg = new StringBuilder();
|
||||
msg.append("requirePath:\n").append(request.getRequestURL().toString()).append("?").append(request.getQueryString()).append("\n\n\n");
|
||||
msg.append("msg:\n").append(e.getMessage()).append("\n\n\n");
|
||||
msg.append("date:\n").append(DateFormatUtil.getNow()).append("\n\n\n");
|
||||
msg.append("from:\n").append(request.getHeader("User-Agent")).append("\n\n\n");
|
||||
msg.append("ip:\n").append(request.getRemoteAddr()).append("\n\n\n");
|
||||
simpleMailMessage.setText(msg.toString());
|
||||
mailService.AsyncSend(simpleMailMessage);
|
||||
}
|
||||
|
||||
}
|
||||
package cn.celess.common.exception;
|
||||
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.service.MailService;
|
||||
import cn.celess.common.util.DateFormatUtil;
|
||||
import cn.celess.common.util.EnvironmentUtil;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.mail.SimpleMailMessage;
|
||||
import org.springframework.validation.BindException;
|
||||
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
||||
import org.springframework.web.bind.MissingServletRequestParameterException;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 17:02
|
||||
*/
|
||||
|
||||
@ControllerAdvice
|
||||
public class BlogExceptionHandler {
|
||||
public static final Logger logger = LoggerFactory.getLogger(BlogExceptionHandler.class);
|
||||
@Autowired
|
||||
MailService mailService;
|
||||
@Autowired
|
||||
HttpServletRequest request;
|
||||
|
||||
@ExceptionHandler(value = Exception.class)
|
||||
@ResponseBody
|
||||
public Response handle(Exception e) {
|
||||
//自定义错误
|
||||
if (e instanceof BlogResponseException) {
|
||||
BlogResponseException exception = (BlogResponseException) e;
|
||||
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) {
|
||||
logger.debug("遇到请求路径与请求方法不匹配的请求,[msg={},path:{},method:{}]", e.getMessage(), request.getRequestURL(), request.getMethod());
|
||||
return new Response(ResponseEnum.ERROR.getCode(), e.getMessage(), null);
|
||||
}
|
||||
//数据输入类型不匹配
|
||||
if (e instanceof MethodArgumentTypeMismatchException) {
|
||||
logger.debug("输入类型不匹配,[msg={}]", e.getMessage());
|
||||
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null);
|
||||
}
|
||||
//数据验证失败
|
||||
if (e instanceof BindException) {
|
||||
logger.debug("数据验证失败,[msg={}]", e.getMessage());
|
||||
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null);
|
||||
}
|
||||
//数据输入不完整
|
||||
if (e instanceof MissingServletRequestParameterException) {
|
||||
logger.debug("数据输入不完整,[msg={}]", e.getMessage());
|
||||
return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null);
|
||||
}
|
||||
|
||||
// 发送错误信息到邮箱
|
||||
if ("prod".equals(EnvironmentUtil.getProperties("spring.profiles.active", "dev"))) {
|
||||
logger.debug("有一个未捕获的bug,已发送到邮箱");
|
||||
sendMessage(e);
|
||||
}
|
||||
e.printStackTrace();
|
||||
return new Response(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送错误信息
|
||||
*
|
||||
* @param e 错误
|
||||
*/
|
||||
private void sendMessage(Exception e) {
|
||||
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
|
||||
simpleMailMessage.setTo("a@celess.cn");
|
||||
simpleMailMessage.setSubject("服务器出现了错误");
|
||||
StringBuilder msg = new StringBuilder();
|
||||
String queryString = request.getQueryString();
|
||||
msg.append("requirePath:\n").append(request.getRequestURL().toString());
|
||||
if (queryString != null) {
|
||||
msg.append("?").append(queryString);
|
||||
}
|
||||
msg.append("\n\n\n");
|
||||
msg.append("msg:\n").append(e.getMessage()).append("\n\n\n");
|
||||
msg.append("date:\n").append(DateFormatUtil.getNow()).append("\n\n\n");
|
||||
msg.append("from:\n").append(request.getHeader("User-Agent")).append("\n\n\n");
|
||||
msg.append("ip:\n").append(request.getRemoteAddr()).append("\n\n\n");
|
||||
simpleMailMessage.setText(msg.toString());
|
||||
mailService.AsyncSend(simpleMailMessage);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package cn.celess.common.exception;
|
||||
|
||||
import cn.celess.common.constant.ResponseEnum;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 16:56
|
||||
*/
|
||||
@Data
|
||||
public class BlogResponseException extends RuntimeException {
|
||||
private int code;
|
||||
private Object result;
|
||||
|
||||
public BlogResponseException(int code, String msg) {
|
||||
super(msg);
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public BlogResponseException(ResponseEnum e) {
|
||||
super(e.getMsg());
|
||||
this.code = e.getCode();
|
||||
}
|
||||
|
||||
public BlogResponseException(ResponseEnum e, Object result) {
|
||||
super(e.getMsg());
|
||||
this.code = e.getCode();
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
public BlogResponseException(ResponseEnum e, String msg) {
|
||||
super(msg + e.getMsg());
|
||||
this.code = e.getCode();
|
||||
}
|
||||
|
||||
public BlogResponseException(ResponseEnum e, String msg, Object result) {
|
||||
super(e.getMsg());
|
||||
this.code = e.getCode();
|
||||
this.result = result;
|
||||
}
|
||||
}
|
||||
@@ -1,52 +1,55 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.Article;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/27 20:43
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface ArticleMapper {
|
||||
|
||||
int insert(Article a);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(Article a);
|
||||
|
||||
Article getLastestArticle();
|
||||
|
||||
Article findArticleById(long id);
|
||||
|
||||
boolean existsByTitle(String title);
|
||||
|
||||
boolean isDeletedById(long id);
|
||||
|
||||
List<Article> findAllByAuthorId(long authorId);
|
||||
|
||||
List<Article> findAllByOpen(boolean isOpen);
|
||||
|
||||
String getTitleById(long id);
|
||||
|
||||
List<Article> findAllByCategoryId(long id);
|
||||
|
||||
List<Article> findAllByCategoryIdAndOpen(long id);
|
||||
|
||||
List<Article> findAll();
|
||||
|
||||
Article getPreArticle(Long id);
|
||||
|
||||
Article getNextArticle(Long id);
|
||||
|
||||
int updateReadingNumber(long id);
|
||||
|
||||
long count();
|
||||
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.Article;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/27 20:43
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface ArticleMapper {
|
||||
|
||||
int insert(Article a);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(Article a);
|
||||
|
||||
Article getLastestArticle();
|
||||
|
||||
Article findArticleById(long id);
|
||||
|
||||
boolean existsByTitle(String title);
|
||||
|
||||
boolean isDeletedById(long id);
|
||||
|
||||
List<Article> findAllByAuthorId(long authorId);
|
||||
|
||||
List<Article> findAllByOpen(boolean isOpen);
|
||||
|
||||
String getTitleById(long id);
|
||||
|
||||
List<Article> findAllByCategoryId(long id);
|
||||
|
||||
List<Article> findAllByCategoryIdAndOpen(long id);
|
||||
|
||||
List<Article> findAll();
|
||||
|
||||
@Cacheable(value = {"articleDao"}, key = "'getPreArticle:'+#id")
|
||||
Article getPreArticle(Long id);
|
||||
|
||||
@Cacheable(value = {"articleDao"}, key = "'getNextArticle:'+#id")
|
||||
Article getNextArticle(Long id);
|
||||
|
||||
int updateReadingNumber(long id);
|
||||
|
||||
long count();
|
||||
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package cn.celess.blog.mapper;
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.blog.entity.ArticleTag;
|
||||
import cn.celess.common.entity.ArticleTag;
|
||||
import cn.celess.common.entity.Tag;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@@ -27,6 +28,8 @@ public interface ArticleTagMapper {
|
||||
|
||||
List<ArticleTag> findAllByArticleId(Long articleId);
|
||||
|
||||
List<Tag> findTagByArticleId(Long articleId);
|
||||
|
||||
int deleteMultiById(List<ArticleTag> articleTags);
|
||||
|
||||
List<ArticleTag> findArticleByTag(Long tagId);
|
||||
@@ -1,42 +1,42 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.Category;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/30 12:56
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface CategoryMapper {
|
||||
int insert(Category c);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(Category c);
|
||||
|
||||
boolean existsByName(String name);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
Category findCategoryByName(String name);
|
||||
|
||||
Category findCategoryById(long id);
|
||||
|
||||
List<Category> findAll();
|
||||
|
||||
List<String> getAllName();
|
||||
|
||||
String getNameById(long id);
|
||||
|
||||
Long getIdByName(String name);
|
||||
|
||||
Category getLastestCategory();
|
||||
|
||||
long count();
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.Category;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/30 12:56
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface CategoryMapper {
|
||||
int insert(Category c);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(Category c);
|
||||
|
||||
boolean existsByName(String name);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
Category findCategoryByName(String name);
|
||||
|
||||
Category findCategoryById(long id);
|
||||
|
||||
List<Category> findAll();
|
||||
|
||||
List<String> getAllName();
|
||||
|
||||
String getNameById(long id);
|
||||
|
||||
Long getIdByName(String name);
|
||||
|
||||
Category getLastestCategory();
|
||||
|
||||
long count();
|
||||
}
|
||||
@@ -1,44 +1,44 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.Comment;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/30 16:19
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface CommentMapper {
|
||||
int insert(Comment c);
|
||||
|
||||
int updateContent(String content, long id);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int deleteByPagePath(String pagePath);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
Comment findCommentById(long id);
|
||||
|
||||
Comment getLastestComment();
|
||||
|
||||
List<Comment> findAllByFromUser(long id);
|
||||
|
||||
List<Comment> findAllByPid(long pid);
|
||||
|
||||
List<Comment> findAllByPagePath(String pagePath);
|
||||
|
||||
List<Comment> findAllByPagePathAndFromUser(String pagePath, long userId);
|
||||
|
||||
List<Comment> findAllByPagePathAndPidAndNormal(String pagePath, long pid);
|
||||
|
||||
long countByPagePath(String pagePath);
|
||||
|
||||
long count();
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.Comment;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/30 16:19
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface CommentMapper {
|
||||
int insert(Comment c);
|
||||
|
||||
int updateContent(String content, long id);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int deleteByPagePath(String pagePath);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
Comment findCommentById(long id);
|
||||
|
||||
Comment getLastestComment();
|
||||
|
||||
List<Comment> findAllByFromUser(long id);
|
||||
|
||||
List<Comment> findAllByPid(long pid);
|
||||
|
||||
List<Comment> findAllByPagePath(String pagePath);
|
||||
|
||||
List<Comment> findAllByPagePathAndFromUser(String pagePath, long userId);
|
||||
|
||||
List<Comment> findAllByPagePathAndPidAndNormal(String pagePath, long pid);
|
||||
|
||||
long countByPagePath(String pagePath);
|
||||
|
||||
long count();
|
||||
}
|
||||
@@ -1,40 +1,41 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.PartnerSite;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:22
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface PartnerMapper {
|
||||
int insert(PartnerSite site);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(PartnerSite site);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
boolean existsByName(String name);
|
||||
|
||||
boolean existsByUrl(String url);
|
||||
|
||||
PartnerSite findById(long id);
|
||||
|
||||
PartnerSite findByName(String name);
|
||||
|
||||
PartnerSite findByUrl(String url);
|
||||
|
||||
PartnerSite getLastest();
|
||||
|
||||
List<PartnerSite> findAll();
|
||||
|
||||
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.PartnerSite;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:22
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface PartnerMapper {
|
||||
int insert(PartnerSite site);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(PartnerSite site);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
boolean existsByName(String name);
|
||||
|
||||
boolean existsByUrl(String url);
|
||||
|
||||
PartnerSite findById(long id);
|
||||
|
||||
PartnerSite findByName(String name);
|
||||
|
||||
PartnerSite findByUrl(String url);
|
||||
|
||||
PartnerSite getLastest();
|
||||
|
||||
List<PartnerSite> findAll();
|
||||
|
||||
List<PartnerSite> findAll(Boolean deleted);
|
||||
|
||||
}
|
||||
@@ -1,34 +1,34 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.Tag;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/29 22:00
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface TagMapper {
|
||||
int insert(Tag tag);
|
||||
|
||||
int update(Tag tag);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
Tag findTagById(long id);
|
||||
|
||||
Tag findTagByName(String name);
|
||||
|
||||
Boolean existsByName(String name);
|
||||
|
||||
Tag getLastestTag();
|
||||
|
||||
List<Tag> findAll();
|
||||
|
||||
long count();
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.Tag;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/06/29 22:00
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface TagMapper {
|
||||
int insert(Tag tag);
|
||||
|
||||
int update(Tag tag);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
Tag findTagById(long id);
|
||||
|
||||
Tag findTagByName(String name);
|
||||
|
||||
Boolean existsByName(String name);
|
||||
|
||||
Tag getLastestTag();
|
||||
|
||||
List<Tag> findAll();
|
||||
|
||||
long count();
|
||||
}
|
||||
@@ -1,59 +1,61 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.User;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:23
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface UserMapper {
|
||||
|
||||
int addUser(User user);
|
||||
|
||||
int updateInfo(String desc, String displayName, long id);
|
||||
|
||||
int updateAvatarImgUrl(String avatarImgUrl, long id);
|
||||
|
||||
int updateLoginTime(String email);
|
||||
|
||||
int updateEmailStatus(String email, boolean status);
|
||||
|
||||
int updatePwd(String email, String pwd);
|
||||
|
||||
String getPwd(String email);
|
||||
|
||||
boolean existsByEmail(String email);
|
||||
|
||||
User findByEmail(String email);
|
||||
|
||||
User findById(long id);
|
||||
|
||||
String getAvatarImgUrlById(long id);
|
||||
|
||||
String getEmail(long id);
|
||||
|
||||
String getDisPlayName(long id);
|
||||
|
||||
String getRoleByEmail(String email);
|
||||
|
||||
String getRoleById(long id);
|
||||
|
||||
long count();
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int lock(long id);
|
||||
|
||||
int setUserRole(Long id, String role);
|
||||
|
||||
List<User> findAll();
|
||||
|
||||
int update(User user);
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.User;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:23
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface UserMapper {
|
||||
|
||||
int addUser(User user);
|
||||
|
||||
int updateInfo(String desc, String displayName, long id);
|
||||
|
||||
int updateAvatarImgUrl(String avatarImgUrl, long id);
|
||||
|
||||
int updateLoginTime(String email);
|
||||
|
||||
int updateEmailStatus(String email, boolean status);
|
||||
|
||||
int updatePwd(String email, String pwd);
|
||||
|
||||
String getPwd(String email);
|
||||
|
||||
boolean existsByEmail(String email);
|
||||
|
||||
User findByEmail(String email);
|
||||
|
||||
User findById(long id);
|
||||
|
||||
String getAvatarImgUrlById(long id);
|
||||
|
||||
String getEmail(long id);
|
||||
|
||||
String getDisPlayName(long id);
|
||||
|
||||
String getRoleByEmail(String email);
|
||||
|
||||
String getRoleById(long id);
|
||||
|
||||
long count();
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int lock(long id);
|
||||
|
||||
int setUserRole(Long id, String role);
|
||||
|
||||
List<User> findAll(Integer status);
|
||||
|
||||
List<User> findAll();
|
||||
|
||||
int update(User user);
|
||||
}
|
||||
@@ -1,26 +1,26 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.Visitor;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:23
|
||||
* @Description:
|
||||
*/
|
||||
@Repository
|
||||
@Mapper
|
||||
public interface VisitorMapper {
|
||||
int insert(Visitor visitor);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
List<Visitor> findAll();
|
||||
|
||||
List<Visitor> findAllNotDeleted();
|
||||
|
||||
long count();
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.Visitor;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:23
|
||||
* @Description:
|
||||
*/
|
||||
@Repository
|
||||
@Mapper
|
||||
public interface VisitorMapper {
|
||||
int insert(Visitor visitor);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
List<Visitor> findAll();
|
||||
|
||||
List<Visitor> findAllNotDeleted();
|
||||
|
||||
long count();
|
||||
}
|
||||
@@ -1,32 +1,32 @@
|
||||
package cn.celess.blog.mapper;
|
||||
|
||||
import cn.celess.blog.entity.WebUpdate;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:24
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface WebUpdateInfoMapper {
|
||||
int insert(WebUpdate webUpdate);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(long id, String info);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
WebUpdate findById(long id);
|
||||
|
||||
List<WebUpdate> findAll();
|
||||
|
||||
List<WebUpdate> findAllNotDeleted();
|
||||
|
||||
WebUpdate getLastestOne();
|
||||
}
|
||||
package cn.celess.common.mapper;
|
||||
|
||||
import cn.celess.common.entity.WebUpdate;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/07/03 00:24
|
||||
* @Description:
|
||||
*/
|
||||
@Mapper
|
||||
@Repository
|
||||
public interface WebUpdateInfoMapper {
|
||||
int insert(WebUpdate webUpdate);
|
||||
|
||||
int delete(long id);
|
||||
|
||||
int update(long id, String info);
|
||||
|
||||
boolean existsById(long id);
|
||||
|
||||
WebUpdate findById(long id);
|
||||
|
||||
List<WebUpdate> findAll();
|
||||
|
||||
List<WebUpdate> findAllNotDeleted();
|
||||
|
||||
WebUpdate getLastestOne();
|
||||
}
|
||||
@@ -1,85 +1,85 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.ArticleModel;
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.request.ArticleReq;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:20
|
||||
*/
|
||||
@Service
|
||||
public interface ArticleService {
|
||||
/**
|
||||
* 新增一篇文章
|
||||
*
|
||||
* @param reqBody 请求文章的数据
|
||||
* @return 文章数据
|
||||
*/
|
||||
ArticleModel create(ArticleReq reqBody);
|
||||
|
||||
/**
|
||||
* 删除一篇文章
|
||||
*
|
||||
* @param articleID 文章id
|
||||
* @return 删除状态 true:删除成功 false:失败
|
||||
*/
|
||||
boolean delete(long articleID);
|
||||
|
||||
/**
|
||||
* 更新一篇文章
|
||||
*
|
||||
* @param reqBody 请求数据
|
||||
* @return 文章数据
|
||||
*/
|
||||
ArticleModel update(ArticleReq reqBody);
|
||||
|
||||
/**
|
||||
* 获取一篇文章的数据
|
||||
*
|
||||
* @param articleId 文章id
|
||||
* @param is4update 是否是因文章更新而请求数据
|
||||
* @return 文章数据
|
||||
*/
|
||||
ArticleModel retrieveOneById(long articleId, boolean is4update);
|
||||
|
||||
/**
|
||||
* 管理员 获取分页数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> adminArticles(int count, int page);
|
||||
|
||||
/**
|
||||
* 获取文章状态为开放的文章
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> retrievePageForOpen(int count, int page);
|
||||
|
||||
/**
|
||||
* 根据分类名获取文章数据
|
||||
*
|
||||
* @param name 分类名
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> findByCategory(String name, int page, int count);
|
||||
|
||||
/**
|
||||
* 根据标签名获取文章数据
|
||||
*
|
||||
* @param name 标签名
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> findByTag(String name, int page, int count);
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import cn.celess.common.entity.dto.ArticleReq;
|
||||
import cn.celess.common.entity.vo.ArticleModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 15:20
|
||||
*/
|
||||
@Service
|
||||
public interface ArticleService {
|
||||
/**
|
||||
* 新增一篇文章
|
||||
*
|
||||
* @param reqBody 请求文章的数据
|
||||
* @return 文章数据
|
||||
*/
|
||||
ArticleModel create(ArticleReq reqBody);
|
||||
|
||||
/**
|
||||
* 删除一篇文章
|
||||
*
|
||||
* @param articleID 文章id
|
||||
* @return 删除状态 true:删除成功 false:失败
|
||||
*/
|
||||
boolean delete(long articleID);
|
||||
|
||||
/**
|
||||
* 更新一篇文章
|
||||
*
|
||||
* @param reqBody 请求数据
|
||||
* @return 文章数据
|
||||
*/
|
||||
ArticleModel update(ArticleReq reqBody);
|
||||
|
||||
/**
|
||||
* 获取一篇文章的数据
|
||||
*
|
||||
* @param articleId 文章id
|
||||
* @param is4update 是否是因文章更新而请求数据
|
||||
* @return 文章数据
|
||||
*/
|
||||
ArticleModel retrieveOneById(long articleId, boolean is4update);
|
||||
|
||||
/**
|
||||
* 管理员 获取分页数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> adminArticles(int count, int page, Boolean deleted);
|
||||
|
||||
/**
|
||||
* 获取文章状态为开放的文章
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> retrievePageForOpen(int count, int page);
|
||||
|
||||
/**
|
||||
* 根据分类名获取文章数据
|
||||
*
|
||||
* @param name 分类名
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> findByCategory(String name, int page, int count);
|
||||
|
||||
/**
|
||||
* 根据标签名获取文章数据
|
||||
*
|
||||
* @param name 标签名
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<ArticleModel> findByTag(String name, int page, int count);
|
||||
}
|
||||
@@ -1,45 +1,45 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.CategoryModel;
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:42
|
||||
*/
|
||||
@Service
|
||||
public interface CategoryService {
|
||||
/**
|
||||
* 增加一个分类
|
||||
*
|
||||
* @param name 分类名
|
||||
* @return 所增加的分类数据
|
||||
*/
|
||||
CategoryModel create(String name);
|
||||
|
||||
/**
|
||||
* 通过id删除分类
|
||||
*
|
||||
* @param id 分类id
|
||||
* @return 删除状态
|
||||
*/
|
||||
boolean delete(long id);
|
||||
|
||||
/**
|
||||
* 编辑分类的名字
|
||||
*
|
||||
* @param id 分类id
|
||||
* @param name 分类名字
|
||||
* @return 更新后的分类的数据
|
||||
*/
|
||||
CategoryModel update(Long id, String name);
|
||||
|
||||
/**
|
||||
* 获取全部的分类数据
|
||||
*
|
||||
* @return 全部的分类数据
|
||||
*/
|
||||
PageData<CategoryModel> retrievePage(int page, int count);
|
||||
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import cn.celess.common.entity.vo.CategoryModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:42
|
||||
*/
|
||||
@Service
|
||||
public interface CategoryService {
|
||||
/**
|
||||
* 增加一个分类
|
||||
*
|
||||
* @param name 分类名
|
||||
* @return 所增加的分类数据
|
||||
*/
|
||||
CategoryModel create(String name);
|
||||
|
||||
/**
|
||||
* 通过id删除分类
|
||||
*
|
||||
* @param id 分类id
|
||||
* @return 删除状态
|
||||
*/
|
||||
boolean delete(long id);
|
||||
|
||||
/**
|
||||
* 编辑分类的名字
|
||||
*
|
||||
* @param id 分类id
|
||||
* @param name 分类名字
|
||||
* @return 更新后的分类的数据
|
||||
*/
|
||||
CategoryModel update(Long id, String name);
|
||||
|
||||
/**
|
||||
* 获取全部的分类数据
|
||||
*
|
||||
* @return 全部的分类数据
|
||||
*/
|
||||
PageData<CategoryModel> retrievePage(int page, int count);
|
||||
|
||||
}
|
||||
@@ -1,91 +1,92 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.CommentModel;
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.request.CommentReq;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/29 16:58
|
||||
*/
|
||||
@Service
|
||||
public interface CommentService {
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param reqBody 请求数据体
|
||||
* @return 增加的comment数据
|
||||
*/
|
||||
CommentModel create(CommentReq reqBody);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param id comment的id
|
||||
* @return 删除状态
|
||||
*/
|
||||
boolean delete(long id);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param reqBody comment请求体
|
||||
* @return 更新后的数据
|
||||
*/
|
||||
CommentModel update(CommentReq reqBody);
|
||||
|
||||
/**
|
||||
* 分页获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePage(String pagePath, int page, int count);
|
||||
|
||||
/**
|
||||
* 通过pid获取数据
|
||||
*
|
||||
* @param pid 父id
|
||||
* @return 分页数据
|
||||
*/
|
||||
List<CommentModel> retrievePageByPid(long pid);
|
||||
|
||||
|
||||
/**
|
||||
* 根据评论者获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count);
|
||||
|
||||
|
||||
/**
|
||||
* 根据数据的type和pid获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param pid 父id
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count);
|
||||
|
||||
/**
|
||||
* 根据type获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count);
|
||||
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
|
||||
import cn.celess.common.entity.dto.CommentReq;
|
||||
import cn.celess.common.entity.vo.CommentModel;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/29 16:58
|
||||
*/
|
||||
@Service
|
||||
public interface CommentService {
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param reqBody 请求数据体
|
||||
* @return 增加的comment数据
|
||||
*/
|
||||
CommentModel create(CommentReq reqBody);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param id comment的id
|
||||
* @return 删除状态
|
||||
*/
|
||||
boolean delete(long id);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param reqBody comment请求体
|
||||
* @return 更新后的数据
|
||||
*/
|
||||
CommentModel update(CommentReq reqBody);
|
||||
|
||||
/**
|
||||
* 分页获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePage(String pagePath, int page, int count);
|
||||
|
||||
/**
|
||||
* 通过pid获取数据
|
||||
*
|
||||
* @param pid 父id
|
||||
* @return 分页数据
|
||||
*/
|
||||
List<CommentModel> retrievePageByPid(long pid);
|
||||
|
||||
|
||||
/**
|
||||
* 根据评论者获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePageByAuthor(String pagePath, int page, int count);
|
||||
|
||||
|
||||
/**
|
||||
* 根据数据的type和pid获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param pid 父id
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePageByPageAndPid(String pagePath, long pid, int page, int count);
|
||||
|
||||
/**
|
||||
* 根据type获取数据
|
||||
*
|
||||
* @param pagePath pagePath
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<CommentModel> retrievePageByPage(String pagePath, int page, int count);
|
||||
|
||||
}
|
||||
@@ -1,59 +1,59 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/02 22:04
|
||||
*/
|
||||
@Service
|
||||
public interface CountService {
|
||||
/**
|
||||
* 获取评论的数据量
|
||||
*
|
||||
* @return 评论的数据量
|
||||
*/
|
||||
long getCommentCount();
|
||||
|
||||
/**
|
||||
* 获取文章的篇数
|
||||
*
|
||||
* @return 文章的篇数
|
||||
*/
|
||||
long getArticleCount();
|
||||
|
||||
/**
|
||||
* 获取分类数量
|
||||
*
|
||||
* @return 分类数量
|
||||
*/
|
||||
long getCategoriesCount();
|
||||
|
||||
/**
|
||||
* 获取标签数量
|
||||
*
|
||||
* @return 标签数量
|
||||
*/
|
||||
long getTagsCount();
|
||||
|
||||
/**
|
||||
* 获取用户量
|
||||
*
|
||||
* @return 用户量
|
||||
*/
|
||||
long getUserCount();
|
||||
|
||||
/**
|
||||
* 获取总访问量
|
||||
*
|
||||
* @return 总访问量
|
||||
*/
|
||||
long getVisitorCount();
|
||||
|
||||
/**
|
||||
* 获取日访问量
|
||||
*
|
||||
* @return 日访问量
|
||||
*/
|
||||
long getDayVisitCount();
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/02 22:04
|
||||
*/
|
||||
@Service
|
||||
public interface CountService {
|
||||
/**
|
||||
* 获取评论的数据量
|
||||
*
|
||||
* @return 评论的数据量
|
||||
*/
|
||||
long getCommentCount();
|
||||
|
||||
/**
|
||||
* 获取文章的篇数
|
||||
*
|
||||
* @return 文章的篇数
|
||||
*/
|
||||
long getArticleCount();
|
||||
|
||||
/**
|
||||
* 获取分类数量
|
||||
*
|
||||
* @return 分类数量
|
||||
*/
|
||||
long getCategoriesCount();
|
||||
|
||||
/**
|
||||
* 获取标签数量
|
||||
*
|
||||
* @return 标签数量
|
||||
*/
|
||||
long getTagsCount();
|
||||
|
||||
/**
|
||||
* 获取用户量
|
||||
*
|
||||
* @return 用户量
|
||||
*/
|
||||
long getUserCount();
|
||||
|
||||
/**
|
||||
* 获取总访问量
|
||||
*
|
||||
* @return 总访问量
|
||||
*/
|
||||
long getVisitorCount();
|
||||
|
||||
/**
|
||||
* 获取日访问量
|
||||
*
|
||||
* @return 日访问量
|
||||
*/
|
||||
long getDayVisitCount();
|
||||
}
|
||||
@@ -1,27 +1,27 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import org.springframework.mail.SimpleMailMessage;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/22 14:25
|
||||
*/
|
||||
@Service
|
||||
public interface MailService {
|
||||
/**
|
||||
* 异步发生邮件
|
||||
*
|
||||
* @param message SimpleMailMessage对象
|
||||
* @return //
|
||||
*/
|
||||
Boolean AsyncSend(SimpleMailMessage message);
|
||||
|
||||
/**
|
||||
* 同步发送邮件
|
||||
*
|
||||
* @param message SimpleMailMessage对象
|
||||
* @return 发送状态
|
||||
*/
|
||||
Boolean send(SimpleMailMessage message);
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import org.springframework.mail.SimpleMailMessage;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/22 14:25
|
||||
*/
|
||||
@Service
|
||||
public interface MailService {
|
||||
/**
|
||||
* 异步发生邮件
|
||||
*
|
||||
* @param message SimpleMailMessage对象
|
||||
* @return //
|
||||
*/
|
||||
Boolean AsyncSend(SimpleMailMessage message);
|
||||
|
||||
/**
|
||||
* 同步发送邮件
|
||||
*
|
||||
* @param message SimpleMailMessage对象
|
||||
* @return 发送状态
|
||||
*/
|
||||
Boolean send(SimpleMailMessage message);
|
||||
}
|
||||
@@ -1,56 +1,72 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.PartnerSite;
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.request.LinkReq;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:42
|
||||
*/
|
||||
@Service
|
||||
public interface PartnerSiteService {
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param reqBody 数据请求体
|
||||
* @return 新增数据
|
||||
*/
|
||||
PartnerSite create(LinkReq reqBody);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param id 数据id
|
||||
* @return 删除状态
|
||||
*/
|
||||
Boolean del(long id);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param reqBody 数据请求体
|
||||
* @return 更新后的数据
|
||||
*/
|
||||
PartnerSite update(LinkReq reqBody);
|
||||
|
||||
/**
|
||||
* 分页获取数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<PartnerSite> partnerSitePages(int page, int count);
|
||||
|
||||
/**
|
||||
* 获取全部数据
|
||||
*
|
||||
* @return 全部友链数据
|
||||
*/
|
||||
List<PartnerSite> findAll();
|
||||
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import cn.celess.common.entity.PartnerSite;
|
||||
import cn.celess.common.entity.dto.LinkApplyReq;
|
||||
import cn.celess.common.entity.dto.LinkReq;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:42
|
||||
*/
|
||||
@Service
|
||||
public interface PartnerSiteService {
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param reqBody 数据请求体
|
||||
* @return 新增数据
|
||||
*/
|
||||
PartnerSite create(LinkReq reqBody);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param id 数据id
|
||||
* @return 删除状态
|
||||
*/
|
||||
Boolean del(long id);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param reqBody 数据请求体
|
||||
* @return 更新后的数据
|
||||
*/
|
||||
PartnerSite update(LinkReq reqBody);
|
||||
|
||||
/**
|
||||
* 分页获取数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<PartnerSite> partnerSitePages(int page, int count, Boolean deleted);
|
||||
|
||||
/**
|
||||
* 获取全部数据
|
||||
*
|
||||
* @return 全部友链数据
|
||||
*/
|
||||
List<PartnerSite> findAll();
|
||||
|
||||
/**
|
||||
* 申请友链
|
||||
*
|
||||
* @param linkApplyReq linkApplyReq
|
||||
* @return linkApplyReq
|
||||
*/
|
||||
PartnerSite apply(LinkApplyReq linkApplyReq);
|
||||
|
||||
/**
|
||||
* 重写申请友链
|
||||
*
|
||||
* @param key key
|
||||
* @return msg
|
||||
*/
|
||||
String reapply(String key);
|
||||
}
|
||||
@@ -1,31 +1,31 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.QiniuResponse;
|
||||
import com.qiniu.storage.model.FileInfo;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/25 18:15
|
||||
*/
|
||||
@Service
|
||||
public interface QiniuService {
|
||||
/**
|
||||
* 上传文件
|
||||
*
|
||||
* @param is InputStream流
|
||||
* @param fileName 文件名
|
||||
* @return 响应数据
|
||||
*/
|
||||
QiniuResponse uploadFile(InputStream is, String fileName);
|
||||
|
||||
/**
|
||||
* 获取文件列表
|
||||
*
|
||||
* @return 文件列表
|
||||
*/
|
||||
FileInfo[] getFileList();
|
||||
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import cn.celess.common.entity.vo.QiniuResponse;
|
||||
import com.qiniu.storage.model.FileInfo;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/25 18:15
|
||||
*/
|
||||
@Service
|
||||
public interface QiniuService {
|
||||
/**
|
||||
* 上传文件
|
||||
*
|
||||
* @param is InputStream流
|
||||
* @param fileName 文件名
|
||||
* @return 响应数据
|
||||
*/
|
||||
QiniuResponse uploadFile(InputStream is, String fileName);
|
||||
|
||||
/**
|
||||
* 获取文件列表
|
||||
*
|
||||
* @return 文件列表
|
||||
*/
|
||||
FileInfo[] getFileList();
|
||||
|
||||
}
|
||||
@@ -1,56 +1,56 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.model.TagModel;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:23
|
||||
*/
|
||||
@Service
|
||||
public interface TagService {
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param name 标签名
|
||||
* @return 新增后的数据
|
||||
*/
|
||||
TagModel create(String name);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param tagId 标签id
|
||||
* @return 删除状态
|
||||
*/
|
||||
boolean delete(long tagId);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param id 标签id
|
||||
* @param name 改名的name值
|
||||
* @return 更新后的数据
|
||||
*/
|
||||
TagModel update(Long id, String name);
|
||||
|
||||
/**
|
||||
* 分页获取标签数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<TagModel> retrievePage(int page, int count);
|
||||
|
||||
/**
|
||||
* 获取全部标签数据
|
||||
*
|
||||
* @return 标签数据列表
|
||||
*/
|
||||
List<TagModel> findAll();
|
||||
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.entity.vo.TagModel;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 22:23
|
||||
*/
|
||||
@Service
|
||||
public interface TagService {
|
||||
/**
|
||||
* 新增数据
|
||||
*
|
||||
* @param name 标签名
|
||||
* @return 新增后的数据
|
||||
*/
|
||||
TagModel create(String name);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param tagId 标签id
|
||||
* @return 删除状态
|
||||
*/
|
||||
boolean delete(long tagId);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param id 标签id
|
||||
* @param name 改名的name值
|
||||
* @return 更新后的数据
|
||||
*/
|
||||
TagModel update(Long id, String name);
|
||||
|
||||
/**
|
||||
* 分页获取标签数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<TagModel> retrievePage(int page, int count);
|
||||
|
||||
/**
|
||||
* 获取全部标签数据
|
||||
*
|
||||
* @return 标签数据列表
|
||||
*/
|
||||
List<TagModel> findAll();
|
||||
|
||||
}
|
||||
@@ -1,159 +1,159 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.model.UserModel;
|
||||
import cn.celess.blog.entity.request.LoginReq;
|
||||
import cn.celess.blog.entity.request.UserReq;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 18:40
|
||||
*/
|
||||
@Service
|
||||
public interface UserService {
|
||||
/**
|
||||
* 注册
|
||||
*
|
||||
* @param email 邮箱
|
||||
* @param password 密码
|
||||
* @return 注册状态
|
||||
*/
|
||||
Boolean registration(String email, String password);
|
||||
|
||||
/**
|
||||
* 登录
|
||||
*
|
||||
* @param loginReq 请求数据
|
||||
* @return 用户数据
|
||||
*/
|
||||
UserModel login(LoginReq loginReq);
|
||||
|
||||
/**
|
||||
* 注销登录
|
||||
*
|
||||
* @return **
|
||||
*/
|
||||
Object logout();
|
||||
|
||||
/**
|
||||
* 更新用户数据
|
||||
*
|
||||
* @param desc 用户描述
|
||||
* @param displayName 显示昵称
|
||||
* @return 用户数据
|
||||
*/
|
||||
UserModel update(String desc, String displayName);
|
||||
|
||||
/**
|
||||
* 更新头像
|
||||
*
|
||||
* @param is 头像文件的输入流
|
||||
* @param mime 文件的mime
|
||||
* @return 响应数据
|
||||
*/
|
||||
Object updateUserAavatarImg(InputStream is, String mime);
|
||||
|
||||
/**
|
||||
* 获取session中存储的用户资料
|
||||
*
|
||||
* @return 用户资料
|
||||
*/
|
||||
UserModel getUserInfoBySession();
|
||||
|
||||
/**
|
||||
* 获取用户的角色
|
||||
*
|
||||
* @param email 用户的邮箱
|
||||
* @return role
|
||||
*/
|
||||
String getUserRoleByEmail(String email);
|
||||
|
||||
/**
|
||||
* 获取邮箱是否注册过
|
||||
*
|
||||
* @param email 用户邮箱
|
||||
* @return 注册状态
|
||||
*/
|
||||
boolean isExistOfEmail(String email);
|
||||
|
||||
/**
|
||||
* 发送重置密码邮件
|
||||
*
|
||||
* @param email 用户邮箱
|
||||
* @return 发送状态
|
||||
*/
|
||||
Object sendResetPwdEmail(String email);
|
||||
|
||||
/**
|
||||
* 发送验证邮箱邮件
|
||||
*
|
||||
* @param email 用户邮箱
|
||||
* @return 发送状态
|
||||
*/
|
||||
Object sendVerifyEmail(String email);
|
||||
|
||||
/**
|
||||
* 验证邮箱
|
||||
*
|
||||
* @param verifyId 验证码
|
||||
* @param email 邮箱
|
||||
* @return 验证状态
|
||||
*/
|
||||
Object verifyEmail(String verifyId, String email);
|
||||
|
||||
/**
|
||||
* 重置密码
|
||||
*
|
||||
* @param verifyId 验证码
|
||||
* @param email 邮箱
|
||||
* @param pwd 新密码
|
||||
* @return 修改状态
|
||||
*/
|
||||
Object reSetPwd(String verifyId, String email, String pwd);
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
*
|
||||
* @param id 用户id的数组
|
||||
* @return 对应id 的删除状态
|
||||
*/
|
||||
Object deleteUser(Integer[] id);
|
||||
|
||||
/**
|
||||
* 获取用户列表
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<UserModel> getUserList(Integer page, Integer count);
|
||||
|
||||
/**
|
||||
* 更改用户信息
|
||||
*
|
||||
* @param user 用户数据
|
||||
* @return 用户信息
|
||||
*/
|
||||
UserModel adminUpdate(UserReq user);
|
||||
|
||||
/**
|
||||
* 获取电子邮件的存在状态
|
||||
*
|
||||
* @param email email
|
||||
* @return true:存在 false:不存在
|
||||
*/
|
||||
boolean getStatusOfEmail(String email);
|
||||
|
||||
/**
|
||||
* 设置密码
|
||||
*
|
||||
* @param pwd pwd
|
||||
* @param newPwd newPwd
|
||||
* @param confirmPwd confirmPwd
|
||||
* @return UserModel
|
||||
*/
|
||||
UserModel setPwd(String pwd, String newPwd, String confirmPwd);
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import cn.celess.common.entity.dto.LoginReq;
|
||||
import cn.celess.common.entity.dto.UserReq;
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.entity.vo.UserModel;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/30 18:40
|
||||
*/
|
||||
@Service
|
||||
public interface UserService {
|
||||
/**
|
||||
* 注册
|
||||
*
|
||||
* @param email 邮箱
|
||||
* @param password 密码
|
||||
* @return 注册状态
|
||||
*/
|
||||
Boolean registration(String email, String password);
|
||||
|
||||
/**
|
||||
* 登录
|
||||
*
|
||||
* @param loginReq 请求数据
|
||||
* @return 用户数据
|
||||
*/
|
||||
UserModel login(LoginReq loginReq);
|
||||
|
||||
/**
|
||||
* 注销登录
|
||||
*
|
||||
* @return **
|
||||
*/
|
||||
Object logout();
|
||||
|
||||
/**
|
||||
* 更新用户数据
|
||||
*
|
||||
* @param desc 用户描述
|
||||
* @param displayName 显示昵称
|
||||
* @return 用户数据
|
||||
*/
|
||||
UserModel update(String desc, String displayName);
|
||||
|
||||
/**
|
||||
* 更新头像
|
||||
*
|
||||
* @param is 头像文件的输入流
|
||||
* @param mime 文件的mime
|
||||
* @return 响应数据
|
||||
*/
|
||||
Object updateUserAavatarImg(InputStream is, String mime);
|
||||
|
||||
/**
|
||||
* 获取session中存储的用户资料
|
||||
*
|
||||
* @return 用户资料
|
||||
*/
|
||||
UserModel getUserInfoBySession();
|
||||
|
||||
/**
|
||||
* 获取用户的角色
|
||||
*
|
||||
* @param email 用户的邮箱
|
||||
* @return role
|
||||
*/
|
||||
String getUserRoleByEmail(String email);
|
||||
|
||||
/**
|
||||
* 获取邮箱是否注册过
|
||||
*
|
||||
* @param email 用户邮箱
|
||||
* @return 注册状态
|
||||
*/
|
||||
boolean isExistOfEmail(String email);
|
||||
|
||||
/**
|
||||
* 发送重置密码邮件
|
||||
*
|
||||
* @param email 用户邮箱
|
||||
* @return 发送状态
|
||||
*/
|
||||
Object sendResetPwdEmail(String email);
|
||||
|
||||
/**
|
||||
* 发送验证邮箱邮件
|
||||
*
|
||||
* @param email 用户邮箱
|
||||
* @return 发送状态
|
||||
*/
|
||||
Object sendVerifyEmail(String email);
|
||||
|
||||
/**
|
||||
* 验证邮箱
|
||||
*
|
||||
* @param verifyId 验证码
|
||||
* @param email 邮箱
|
||||
* @return 验证状态
|
||||
*/
|
||||
Object verifyEmail(String verifyId, String email);
|
||||
|
||||
/**
|
||||
* 重置密码
|
||||
*
|
||||
* @param verifyId 验证码
|
||||
* @param email 邮箱
|
||||
* @param pwd 新密码
|
||||
* @return 修改状态
|
||||
*/
|
||||
Object reSetPwd(String verifyId, String email, String pwd);
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
*
|
||||
* @param id 用户id的数组
|
||||
* @return 对应id 的删除状态
|
||||
*/
|
||||
Object deleteUser(Integer[] id);
|
||||
|
||||
/**
|
||||
* 获取用户列表
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<UserModel> getUserList(Integer page, Integer count, Integer status);
|
||||
|
||||
/**
|
||||
* 更改用户信息
|
||||
*
|
||||
* @param user 用户数据
|
||||
* @return 用户信息
|
||||
*/
|
||||
UserModel adminUpdate(UserReq user);
|
||||
|
||||
/**
|
||||
* 获取电子邮件的存在状态
|
||||
*
|
||||
* @param email email
|
||||
* @return true:存在 false:不存在
|
||||
*/
|
||||
boolean getStatusOfEmail(String email);
|
||||
|
||||
/**
|
||||
* 设置密码
|
||||
*
|
||||
* @param pwd pwd
|
||||
* @param newPwd newPwd
|
||||
* @param confirmPwd confirmPwd
|
||||
* @return UserModel
|
||||
*/
|
||||
UserModel setPwd(String pwd, String newPwd, String confirmPwd);
|
||||
}
|
||||
@@ -1,40 +1,40 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.model.VisitorModel;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/02 23:03
|
||||
*/
|
||||
@Service
|
||||
public interface VisitorService {
|
||||
/**
|
||||
* 分页获取访客数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @param showLocation 是否显示位置信息 开启改选项数据响应超慢
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation);
|
||||
|
||||
/**
|
||||
* 新增访客
|
||||
*
|
||||
* @param request HttpServletRequest
|
||||
* @return 返回状态 null: 访客信息已记录、爬虫
|
||||
*/
|
||||
VisitorModel addVisitor(HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 获取位置信息
|
||||
*
|
||||
* @param ip ip地址
|
||||
* @return 位置信息
|
||||
*/
|
||||
String location(String ip);
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.entity.vo.VisitorModel;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/04/02 23:03
|
||||
*/
|
||||
@Service
|
||||
public interface VisitorService {
|
||||
/**
|
||||
* 分页获取访客数据
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @param showLocation 是否显示位置信息 开启改选项数据响应超慢
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<VisitorModel> visitorPage(int page, int count, boolean showLocation);
|
||||
|
||||
/**
|
||||
* 新增访客
|
||||
*
|
||||
* @param request HttpServletRequest
|
||||
* @return 返回状态 null: 访客信息已记录、爬虫
|
||||
*/
|
||||
VisitorModel addVisitor(HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* 获取位置信息
|
||||
*
|
||||
* @param ip ip地址
|
||||
* @return 位置信息
|
||||
*/
|
||||
String location(String ip);
|
||||
}
|
||||
@@ -1,63 +1,64 @@
|
||||
package cn.celess.blog.service;
|
||||
|
||||
import cn.celess.blog.entity.model.PageData;
|
||||
import cn.celess.blog.entity.model.WebUpdateModel;
|
||||
import net.sf.json.JSONObject;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:42
|
||||
*/
|
||||
@Service
|
||||
public interface WebUpdateInfoService {
|
||||
/**
|
||||
* 新增记录
|
||||
*
|
||||
* @param info 更新内容
|
||||
* @return 创建状态
|
||||
*/
|
||||
WebUpdateModel create(String info);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param id 数据id
|
||||
* @return 删除状态
|
||||
*/
|
||||
Boolean del(long id);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param id 数据id
|
||||
* @param info 新内容
|
||||
* @return 数据
|
||||
*/
|
||||
WebUpdateModel update(long id, String info);
|
||||
|
||||
/**
|
||||
* 分页获取更新记录
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<WebUpdateModel> pages(int count, int page);
|
||||
|
||||
/**
|
||||
* 获取全部的更新记录
|
||||
*
|
||||
* @return 更新记录
|
||||
*/
|
||||
List<WebUpdateModel> findAll();
|
||||
|
||||
/**
|
||||
* 获取最后更新时间
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
JSONObject getLastestUpdateTime();
|
||||
}
|
||||
package cn.celess.common.service;
|
||||
|
||||
|
||||
import cn.celess.common.entity.vo.PageData;
|
||||
import cn.celess.common.entity.vo.WebUpdateModel;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/05/12 11:42
|
||||
*/
|
||||
@Service
|
||||
public interface WebUpdateInfoService {
|
||||
/**
|
||||
* 新增记录
|
||||
*
|
||||
* @param info 更新内容
|
||||
* @return 创建状态
|
||||
*/
|
||||
WebUpdateModel create(String info);
|
||||
|
||||
/**
|
||||
* 删除数据
|
||||
*
|
||||
* @param id 数据id
|
||||
* @return 删除状态
|
||||
*/
|
||||
Boolean del(long id);
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*
|
||||
* @param id 数据id
|
||||
* @param info 新内容
|
||||
* @return 数据
|
||||
*/
|
||||
WebUpdateModel update(long id, String info);
|
||||
|
||||
/**
|
||||
* 分页获取更新记录
|
||||
*
|
||||
* @param count 单页数据量
|
||||
* @param page 数据页
|
||||
* @return 分页数据
|
||||
*/
|
||||
PageData<WebUpdateModel> pages(int count, int page);
|
||||
|
||||
/**
|
||||
* 获取全部的更新记录
|
||||
*
|
||||
* @return 更新记录
|
||||
*/
|
||||
List<WebUpdateModel> findAll();
|
||||
|
||||
/**
|
||||
* 获取最后更新时间
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
Map<String, Object> getLastestUpdateTime();
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package cn.celess.common.test;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import redis.embedded.RedisServer;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.PreDestroy;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2020/08/14 16:20
|
||||
*/
|
||||
@Configuration
|
||||
@Slf4j
|
||||
public class BaseRedisTest extends BaseTest {
|
||||
private static RedisServer redisServer;
|
||||
|
||||
@PostConstruct
|
||||
public static void startRedis() {
|
||||
try {
|
||||
if (redisServer == null) {
|
||||
redisServer = new RedisServer(6380);
|
||||
redisServer.start();
|
||||
log.info("start Redis success");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("start Redis failed");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@PreDestroy()
|
||||
public static void stopRedis() {
|
||||
if (redisServer.isActive()) {
|
||||
redisServer.stop();
|
||||
log.info("stop Redis success");
|
||||
}
|
||||
}
|
||||
}
|
||||
331
blog-common/src/main/java/cn/celess/common/test/BaseTest.java
Normal file
331
blog-common/src/main/java/cn/celess/common/test/BaseTest.java
Normal file
@@ -0,0 +1,331 @@
|
||||
package cn.celess.common.test;
|
||||
|
||||
import cn.celess.common.entity.Response;
|
||||
import cn.celess.common.entity.dto.LoginReq;
|
||||
import cn.celess.common.entity.vo.QiniuResponse;
|
||||
import cn.celess.common.entity.vo.UserModel;
|
||||
import cn.celess.common.service.MailService;
|
||||
import cn.celess.common.service.QiniuService;
|
||||
import com.fasterxml.jackson.core.JsonParser;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.qiniu.storage.model.FileInfo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.mail.SimpleMailMessage;
|
||||
import org.springframework.mock.web.MockHttpSession;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
import org.springframework.test.context.web.WebAppConfiguration;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.MvcResult;
|
||||
import org.springframework.test.web.servlet.ResultActions;
|
||||
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
|
||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import static cn.celess.common.constant.ResponseEnum.SUCCESS;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2019/08/22 12:46
|
||||
* @Description: 测试基类
|
||||
*/
|
||||
@WebAppConfiguration
|
||||
@ActiveProfiles("test")
|
||||
public abstract class BaseTest {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
protected MockMvc mockMvc;
|
||||
protected final static String Code = "code";
|
||||
protected final static String Result = "result";
|
||||
protected final static String USERE_MAIL = "zh56462271@qq.com";
|
||||
protected final static String ADMIN_EMAIL = "a@celess.cn";
|
||||
|
||||
/**
|
||||
* jackson 序列化/反序列化Json
|
||||
*/
|
||||
protected static final TypeReference<?> BOOLEAN_TYPE = new TypeReference<Response<Boolean>>() {
|
||||
};
|
||||
protected static final TypeReference<?> STRING_TYPE = new TypeReference<Response<String>>() {
|
||||
};
|
||||
protected static final TypeReference<?> OBJECT_TYPE = new TypeReference<Response<Object>>() {
|
||||
};
|
||||
protected static final TypeReference<?> MAP_OBJECT_TYPE = new TypeReference<Response<Map<String, Object>>>() {
|
||||
};
|
||||
|
||||
@Autowired
|
||||
private WebApplicationContext wac;
|
||||
protected MockHttpSession session;
|
||||
|
||||
@Before
|
||||
public void before() {
|
||||
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
|
||||
session = new MockHttpSession();
|
||||
System.out.println("==========> 开始测试 <=========");
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
System.out.println("==========> 测试结束 <=========");
|
||||
}
|
||||
|
||||
/**
|
||||
* admin 权限用户登录
|
||||
*
|
||||
* @return token
|
||||
*/
|
||||
protected String adminLogin() {
|
||||
LoginReq req = new LoginReq();
|
||||
req.setEmail(ADMIN_EMAIL);
|
||||
req.setPassword("123456789");
|
||||
req.setIsRememberMe(true);
|
||||
String token = login(req);
|
||||
assertNotNull(token);
|
||||
return token;
|
||||
}
|
||||
|
||||
/**
|
||||
* user 权限用户登录
|
||||
*
|
||||
* @return token
|
||||
*/
|
||||
protected String userLogin() {
|
||||
LoginReq req = new LoginReq();
|
||||
req.setEmail(USERE_MAIL);
|
||||
req.setPassword("123456789");
|
||||
req.setIsRememberMe(true);
|
||||
String token = login(req);
|
||||
assertNotNull(token);
|
||||
return token;
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录逻辑
|
||||
*
|
||||
* @param req 用户信息
|
||||
* @return token | null
|
||||
*/
|
||||
protected String login(LoginReq req) {
|
||||
String str = null;
|
||||
try {
|
||||
str = getMockData(MockMvcRequestBuilders.post("/login"), null, req)
|
||||
.andReturn().getResponse().getContentAsString();
|
||||
Response<UserModel> response = new ObjectMapper().readValue(str, new TypeReference<Response<UserModel>>() {
|
||||
});
|
||||
assertEquals(SUCCESS.getCode(), response.getCode());
|
||||
String token = response.getResult().getToken();
|
||||
assertNotNull(token);
|
||||
return token;
|
||||
} catch (Exception e) {
|
||||
logger.error("测试登录错误");
|
||||
e.printStackTrace();
|
||||
}
|
||||
assertNotNull(str);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 产生指定长度的随机字符
|
||||
*
|
||||
* @param len len
|
||||
* @return str
|
||||
*/
|
||||
protected String randomStr(int len) {
|
||||
return UUID.randomUUID().toString().replaceAll("-", "").substring(0, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* 产生指定长度的随机字符
|
||||
*
|
||||
* @return str
|
||||
*/
|
||||
protected String randomStr() {
|
||||
return UUID.randomUUID().toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽离的mock请求方法
|
||||
*
|
||||
* @param builder MockHttpServletRequestBuilder :get(...) post(...) ....
|
||||
* @return 返回 ResultActions
|
||||
* @throws Exception exc
|
||||
*/
|
||||
protected ResultActions getMockData(MockHttpServletRequestBuilder builder) throws Exception {
|
||||
return getMockData(builder, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽离的mock请求方法 重载
|
||||
*
|
||||
* @param builder ..
|
||||
* @param token 用户登录的token
|
||||
* @return ..
|
||||
* @throws Exception ..
|
||||
*/
|
||||
protected ResultActions getMockData(MockHttpServletRequestBuilder builder, String token) throws Exception {
|
||||
return getMockData(builder, token, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽离的mock请求方法 重载
|
||||
*
|
||||
* @param builder ..
|
||||
* @param token ..
|
||||
* @param content http中发送的APPLICATION_JSON的json数据
|
||||
* @return ..
|
||||
* @throws Exception ..
|
||||
*/
|
||||
protected ResultActions getMockData(MockHttpServletRequestBuilder builder, String token, Object content) throws Exception {
|
||||
// MockHttpServletRequestBuilder mockHttpServletRequestBuilder = get(url);
|
||||
if (token != null) {
|
||||
builder.header("Authorization", "Bearer "+token);
|
||||
}
|
||||
if (content != null) {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
builder.content(mapper.writeValueAsString(content)).contentType(MediaType.APPLICATION_JSON);
|
||||
logger.debug("param::json->{}", mapper.writeValueAsString(content));
|
||||
}
|
||||
return mockMvc.perform(builder).andExpect(MockMvcResultMatchers.status().isOk());
|
||||
}
|
||||
|
||||
|
||||
protected <T> Response<T> getResponse(String json) {
|
||||
return getResponse(json, OBJECT_TYPE);
|
||||
}
|
||||
|
||||
protected <T> Response<T> getResponse(MvcResult result) {
|
||||
return getResponse(result, OBJECT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据json 信息反序列化成Response对象
|
||||
*
|
||||
* @param json json
|
||||
* @param <T> 泛型
|
||||
* @return Response对象
|
||||
*/
|
||||
protected <T> Response<T> getResponse(String json, TypeReference<?> responseType) {
|
||||
Response<T> response = null;
|
||||
try {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.disable(JsonParser.Feature.AUTO_CLOSE_SOURCE);
|
||||
response = mapper.readValue(json, responseType);
|
||||
} catch (IOException e) {
|
||||
logger.error("解析json Response对象错误,json:[{}]", json);
|
||||
e.printStackTrace();
|
||||
}
|
||||
assertNotNull(response);
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据json 信息反序列化成Response对象
|
||||
*
|
||||
* @param result MvcResult
|
||||
* @param <T> 泛型
|
||||
* @return Response对象
|
||||
*/
|
||||
protected <T> Response<T> getResponse(MvcResult result, TypeReference<?> responseType) {
|
||||
try {
|
||||
return getResponse(result.getResponse().getContentAsString(), responseType);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
logger.error("解析json Response对象错误,result:[{}]", result);
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 修改 mailService 的实现类
|
||||
*
|
||||
* @param service service 类
|
||||
* @param mailFiledName service 中自动注入的mailService字段名
|
||||
*/
|
||||
protected void mockInjectInstance(Object service, String mailFiledName, Object impl) {
|
||||
Field field;
|
||||
try {
|
||||
assertNotNull(service);
|
||||
field = service.getClass().getDeclaredField(mailFiledName);
|
||||
field.setAccessible(true);
|
||||
field.set(service, impl);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Slf4j
|
||||
@Service("mailService")
|
||||
public static class TestMailServiceImpl implements MailService {
|
||||
|
||||
@Override
|
||||
public Boolean AsyncSend(SimpleMailMessage message) {
|
||||
log.debug("异步邮件请求,SimpleMailMessage:[{}]", getJson(message));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean send(SimpleMailMessage message) {
|
||||
log.debug("邮件请求,SimpleMailMessage:[{}]", getJson(message));
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转json
|
||||
*
|
||||
* @param o
|
||||
* @return
|
||||
*/
|
||||
private String getJson(Object o) {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
try {
|
||||
return mapper.writeValueAsString(o);
|
||||
} catch (JsonProcessingException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Slf4j
|
||||
@Service("qiniuService")
|
||||
public static class TestQiNiuServiceImpl implements QiniuService {
|
||||
@Override
|
||||
public QiniuResponse uploadFile(InputStream is, String fileName) {
|
||||
QiniuResponse response = new QiniuResponse();
|
||||
log.debug("上传文件请求,[fileName:{}]", fileName);
|
||||
|
||||
response.key = "key";
|
||||
response.bucket = "bucket";
|
||||
response.hash = "hash";
|
||||
response.fsize = 1;
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileInfo[] getFileList() {
|
||||
log.debug("获取文件列表请求");
|
||||
return new FileInfo[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +1,42 @@
|
||||
package cn.celess.blog.util;
|
||||
|
||||
import javax.xml.datatype.DatatypeConfigurationException;
|
||||
import javax.xml.datatype.DatatypeFactory;
|
||||
import javax.xml.datatype.XMLGregorianCalendar;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 17:22
|
||||
*/
|
||||
public class DateFormatUtil {
|
||||
public static String get(Date date) {
|
||||
if (date == null) {
|
||||
return null;
|
||||
}
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
return sdf.format(date);
|
||||
}
|
||||
|
||||
public static String getForXmlDate(Date date) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZ");
|
||||
GregorianCalendar gc = new GregorianCalendar();
|
||||
String dateString = sdf.format(date);
|
||||
try {
|
||||
gc.setTime(sdf.parse(dateString));
|
||||
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
|
||||
return date2.toString();
|
||||
} catch (DatatypeConfigurationException | ParseException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static String getNow() {
|
||||
return get(new Date());
|
||||
}
|
||||
}
|
||||
package cn.celess.common.util;
|
||||
|
||||
import javax.xml.datatype.DatatypeConfigurationException;
|
||||
import javax.xml.datatype.DatatypeFactory;
|
||||
import javax.xml.datatype.XMLGregorianCalendar;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
/**
|
||||
* @author : xiaohai
|
||||
* @date : 2019/03/28 17:22
|
||||
*/
|
||||
public class DateFormatUtil {
|
||||
public static String get(Date date) {
|
||||
if (date == null) {
|
||||
return null;
|
||||
}
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
return sdf.format(date);
|
||||
}
|
||||
|
||||
public static String getForXmlDate(Date date) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZ");
|
||||
GregorianCalendar gc = new GregorianCalendar();
|
||||
String dateString = sdf.format(date);
|
||||
try {
|
||||
gc.setTime(sdf.parse(dateString));
|
||||
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
|
||||
return date2.toString();
|
||||
} catch (DatatypeConfigurationException | ParseException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static String getNow() {
|
||||
return get(new Date());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package cn.celess.common.util;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
@Slf4j
|
||||
public class EnvironmentUtil {
|
||||
|
||||
private static Environment environment;
|
||||
|
||||
public static String getEnv(String name) {
|
||||
String value = System.getenv(name);
|
||||
if (StringUtils.isBlank(value)) {
|
||||
log.error("没有找到环境变量:" + name);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static String getEnv(String name, String defaultValue) {
|
||||
String env = getEnv(name);
|
||||
if (env == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
return env;
|
||||
}
|
||||
|
||||
public static String getProperties(String key) {
|
||||
String value = environment.getProperty(key);
|
||||
if (StringUtils.isBlank(value)) {
|
||||
log.error("没有找到配置项: {}", key);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static String getProperties(String key, String defaultValue) {
|
||||
return environment.getProperty(key, defaultValue);
|
||||
}
|
||||
|
||||
public static void setEnvironment(Environment environment) {
|
||||
EnvironmentUtil.environment = environment;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package cn.celess.common.util;
|
||||
|
||||
|
||||
import com.gargoylesoftware.htmlunit.BrowserVersion;
|
||||
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
|
||||
import com.gargoylesoftware.htmlunit.Page;
|
||||
import com.gargoylesoftware.htmlunit.WebClient;
|
||||
import com.gargoylesoftware.htmlunit.html.HtmlPage;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @Author: 小海
|
||||
* @Date: 2020-04-23 15:51
|
||||
* @Desc:
|
||||
*/
|
||||
public class HttpUtil {
|
||||
|
||||
/**
|
||||
* 获取http请求的响应
|
||||
*
|
||||
* @param url url链接
|
||||
* @return 请求的响应
|
||||
*/
|
||||
public static String getHttpResponse(String url) {
|
||||
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
|
||||
webClient.getOptions().setCssEnabled(false);
|
||||
webClient.getOptions().setJavaScriptEnabled(false);
|
||||
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
|
||||
webClient.getOptions().setThrowExceptionOnScriptError(false);
|
||||
webClient.getOptions().setDownloadImages(false);
|
||||
webClient.getOptions().setActiveXNative(false);
|
||||
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
|
||||
Page clientPage = webClient.getPage(url);
|
||||
return clientPage.getWebResponse().getContentAsString();
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取渲染后的网页数据
|
||||
*
|
||||
* @param url url链接
|
||||
* @return 经js渲染后的网页源代码
|
||||
*/
|
||||
public static String getAfterRendering(String url) {
|
||||
try (final WebClient webClient = new WebClient(BrowserVersion.BEST_SUPPORTED)) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
package cn.celess.blog.util;
|
||||
package cn.celess.common.util;
|
||||
|
||||
import cn.celess.blog.entity.*;
|
||||
import cn.celess.blog.entity.model.*;
|
||||
|
||||
import cn.celess.common.constant.UserAccountStatusEnum;
|
||||
import cn.celess.common.entity.*;
|
||||
import cn.celess.common.entity.vo.*;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
|
||||
/**
|
||||
@@ -46,6 +48,7 @@ public class ModalTrans {
|
||||
}
|
||||
UserModel userModel = new UserModel();
|
||||
BeanUtils.copyProperties(user, userModel);
|
||||
userModel.setStatus(UserAccountStatusEnum.get(user.getStatus()));
|
||||
userModel.setAvatarImgUrl(user.getAvatarImgUrl() == null || user.getAvatarImgUrl().length() == 0 ?
|
||||
null :
|
||||
"http://cdn.celess.cn/" + user.getAvatarImgUrl());
|
||||
@@ -1,126 +1,126 @@
|
||||
package cn.celess.blog.util;
|
||||
|
||||
|
||||
import com.dyuproject.protostuff.LinkedBuffer;
|
||||
import com.dyuproject.protostuff.ProtostuffIOUtil;
|
||||
import com.dyuproject.protostuff.Schema;
|
||||
import com.dyuproject.protostuff.runtime.RuntimeSchema;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* ProtoStuffSerializerUtil
|
||||
*
|
||||
* @author Sirius
|
||||
* @date 2019-1-8
|
||||
*/
|
||||
public class ProtoStuffSerializerUtil {
|
||||
/**
|
||||
* 序列化对象
|
||||
*
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
public static <T> byte[] serialize(T obj) {
|
||||
if (obj == null) {
|
||||
throw new RuntimeException("序列化对象(" + obj + ")!");
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(obj.getClass());
|
||||
LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
|
||||
byte[] protostuff = null;
|
||||
try {
|
||||
protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("序列化(" + obj.getClass() + ")对象(" + obj + ")发生异常!", e);
|
||||
} finally {
|
||||
buffer.clear();
|
||||
}
|
||||
return protostuff;
|
||||
}
|
||||
|
||||
/**
|
||||
* 反序列化对象
|
||||
*
|
||||
* @param paramArrayOfByte
|
||||
* @param targetClass
|
||||
* @return
|
||||
*/
|
||||
public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
|
||||
if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
|
||||
throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
|
||||
}
|
||||
T instance = null;
|
||||
try {
|
||||
instance = targetClass.newInstance();
|
||||
} catch (InstantiationException e1) {
|
||||
throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e1);
|
||||
} catch (IllegalAccessException e2) {
|
||||
throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e2);
|
||||
}
|
||||
Schema<T> schema = RuntimeSchema.getSchema(targetClass);
|
||||
ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 序列化列表
|
||||
*
|
||||
* @param objList
|
||||
* @return
|
||||
*/
|
||||
public static <T> byte[] serializeList(List<T> objList) {
|
||||
if (objList == null || objList.isEmpty()) {
|
||||
throw new RuntimeException("序列化对象列表(" + objList + ")参数异常!");
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(objList.get(0).getClass());
|
||||
LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
|
||||
byte[] protostuff = null;
|
||||
ByteArrayOutputStream bos = null;
|
||||
try {
|
||||
bos = new ByteArrayOutputStream();
|
||||
ProtostuffIOUtil.writeListTo(bos, objList, schema, buffer);
|
||||
protostuff = bos.toByteArray();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("序列化对象列表(" + objList + ")发生异常!", e);
|
||||
} finally {
|
||||
buffer.clear();
|
||||
try {
|
||||
if (bos != null) {
|
||||
bos.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
return protostuff;
|
||||
}
|
||||
|
||||
/**
|
||||
* 反序列化列表
|
||||
*
|
||||
* @param paramArrayOfByte
|
||||
* @param targetClass
|
||||
* @return
|
||||
*/
|
||||
public static <T> List<T> deserializeList(byte[] paramArrayOfByte, Class<T> targetClass) {
|
||||
if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
|
||||
throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
|
||||
}
|
||||
|
||||
Schema<T> schema = RuntimeSchema.getSchema(targetClass);
|
||||
List<T> result = null;
|
||||
try {
|
||||
result = ProtostuffIOUtil.parseListFrom(new ByteArrayInputStream(paramArrayOfByte), schema);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("反序列化对象列表发生异常!", e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
package cn.celess.common.util;
|
||||
|
||||
|
||||
import com.dyuproject.protostuff.LinkedBuffer;
|
||||
import com.dyuproject.protostuff.ProtostuffIOUtil;
|
||||
import com.dyuproject.protostuff.Schema;
|
||||
import com.dyuproject.protostuff.runtime.RuntimeSchema;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* ProtoStuffSerializerUtil
|
||||
*
|
||||
* @author Sirius
|
||||
* @date 2019-1-8
|
||||
*/
|
||||
public class ProtoStuffSerializerUtil {
|
||||
/**
|
||||
* 序列化对象
|
||||
*
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
public static <T> byte[] serialize(T obj) {
|
||||
if (obj == null) {
|
||||
throw new RuntimeException("序列化对象(" + obj + ")!");
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(obj.getClass());
|
||||
LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
|
||||
byte[] protostuff = null;
|
||||
try {
|
||||
protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("序列化(" + obj.getClass() + ")对象(" + obj + ")发生异常!", e);
|
||||
} finally {
|
||||
buffer.clear();
|
||||
}
|
||||
return protostuff;
|
||||
}
|
||||
|
||||
/**
|
||||
* 反序列化对象
|
||||
*
|
||||
* @param paramArrayOfByte
|
||||
* @param targetClass
|
||||
* @return
|
||||
*/
|
||||
public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
|
||||
if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
|
||||
throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
|
||||
}
|
||||
T instance = null;
|
||||
try {
|
||||
instance = targetClass.newInstance();
|
||||
} catch (InstantiationException e1) {
|
||||
throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e1);
|
||||
} catch (IllegalAccessException e2) {
|
||||
throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e2);
|
||||
}
|
||||
Schema<T> schema = RuntimeSchema.getSchema(targetClass);
|
||||
ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 序列化列表
|
||||
*
|
||||
* @param objList
|
||||
* @return
|
||||
*/
|
||||
public static <T> byte[] serializeList(List<T> objList) {
|
||||
if (objList == null || objList.isEmpty()) {
|
||||
throw new RuntimeException("序列化对象列表(" + objList + ")参数异常!");
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(objList.get(0).getClass());
|
||||
LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);
|
||||
byte[] protostuff = null;
|
||||
ByteArrayOutputStream bos = null;
|
||||
try {
|
||||
bos = new ByteArrayOutputStream();
|
||||
ProtostuffIOUtil.writeListTo(bos, objList, schema, buffer);
|
||||
protostuff = bos.toByteArray();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("序列化对象列表(" + objList + ")发生异常!", e);
|
||||
} finally {
|
||||
buffer.clear();
|
||||
try {
|
||||
if (bos != null) {
|
||||
bos.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
return protostuff;
|
||||
}
|
||||
|
||||
/**
|
||||
* 反序列化列表
|
||||
*
|
||||
* @param paramArrayOfByte
|
||||
* @param targetClass
|
||||
* @return
|
||||
*/
|
||||
public static <T> List<T> deserializeList(byte[] paramArrayOfByte, Class<T> targetClass) {
|
||||
if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
|
||||
throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
|
||||
}
|
||||
|
||||
Schema<T> schema = RuntimeSchema.getSchema(targetClass);
|
||||
List<T> result = null;
|
||||
try {
|
||||
result = ProtostuffIOUtil.parseListFrom(new ByteArrayInputStream(paramArrayOfByte), schema);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("反序列化对象列表发生异常!", e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user