├── .gitignore
├── .mvn
└── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── LICENSE
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
├── sql
├── README.md
├── adkblog-6.15.sql
├── adkblog-6.26.sql
└── adkblog-7.04.sql
└── src
├── main
├── java
│ └── com
│ │ └── myblog
│ │ └── adkblog
│ │ ├── AdkblogApplication.java
│ │ ├── common
│ │ ├── ratelimit
│ │ │ ├── Limit.java
│ │ │ └── LimitAop.java
│ │ └── redis
│ │ │ ├── Cache.java
│ │ │ └── CacheAop.java
│ │ ├── config
│ │ ├── MybatisPlusConfig.java
│ │ ├── RedisConfig.java
│ │ ├── SwwagerConfig.java
│ │ ├── ThreadPoolConfig.java
│ │ ├── WebMVCConfig.java
│ │ └── WebSocketConfig.java
│ │ ├── controller
│ │ ├── ArticleController.java
│ │ ├── BgmDataController.java
│ │ ├── BgmRankController.java
│ │ ├── CommentController.java
│ │ ├── LikeOrCollectController.java
│ │ ├── LoginController.java
│ │ ├── MessageController.java
│ │ ├── PictureController.java
│ │ ├── RegisterCoontroller.java
│ │ ├── SenFunController.java
│ │ ├── TagController.java
│ │ ├── UploadController.java
│ │ ├── UserController.java
│ │ ├── WebsocketController.java
│ │ └── YhdmController.java
│ │ ├── dao
│ │ └── mapper
│ │ │ ├── ArticleBodyMapper.java
│ │ │ ├── ArticleIndexViewMapper.java
│ │ │ ├── ArticleMapper.java
│ │ │ ├── ArticleTagMapper.java
│ │ │ ├── ArticleUserCollectMapper.java
│ │ │ ├── ArticleUserLikeMapper.java
│ │ │ ├── BgmCalendarMapper.java
│ │ │ ├── CommentMapper.java
│ │ │ ├── MessageMapper.java
│ │ │ ├── PictureMapper.java
│ │ │ ├── TagMapper.java
│ │ │ ├── UserMapper.java
│ │ │ └── dos
│ │ │ ├── ArticleTip.java
│ │ │ ├── Count.java
│ │ │ └── GroupByTime.java
│ │ ├── handler
│ │ └── LoginInterceptor.java
│ │ ├── pojo
│ │ ├── Article.java
│ │ ├── ArticleBody.java
│ │ ├── ArticleIndexView.java
│ │ ├── ArticleRecord.java
│ │ ├── ArticleTag.java
│ │ ├── ArticleUserCollect.java
│ │ ├── ArticleUserLike.java
│ │ ├── Comment.java
│ │ ├── Message.java
│ │ ├── Picture.java
│ │ ├── Tag.java
│ │ ├── User.java
│ │ ├── WsMessage.java
│ │ └── bgm
│ │ │ └── CalendarItem.java
│ │ ├── service
│ │ ├── ArticleService.java
│ │ ├── AsyncMethod.java
│ │ ├── BgmApiService.java
│ │ ├── BgmRankService.java
│ │ ├── CollectOrLikeService.java
│ │ ├── CommentService.java
│ │ ├── Impl
│ │ │ ├── ArticleServiceImpl.java
│ │ │ ├── AsyncMethodImpl.java
│ │ │ ├── BgmApiServiceImpl.java
│ │ │ ├── BgmRankServiceImpl.java
│ │ │ ├── CollectOrLikeServiceImpl.java
│ │ │ ├── CommentServiceImpl.java
│ │ │ ├── LoginServiceImpl.java
│ │ │ ├── MessageServiceImpl.java
│ │ │ ├── PictureServiceImpl.java
│ │ │ ├── SenFunServiceImpl.java
│ │ │ ├── TagServiceImpl.java
│ │ │ ├── UserServiceImpl.java
│ │ │ └── YhdmServiceImpl.java
│ │ ├── LoginService.java
│ │ ├── MessageService.java
│ │ ├── PictureService.java
│ │ ├── SenFunService.java
│ │ ├── TagService.java
│ │ ├── UserService.java
│ │ └── YhdmService.java
│ │ ├── utils
│ │ ├── AliossUtils.java
│ │ ├── JWTUtils.java
│ │ ├── Myutils.java
│ │ ├── SaveImg.java
│ │ ├── SpiderUtils.java
│ │ └── UserThreadLocal.java
│ │ └── vo
│ │ ├── Common
│ │ ├── Epinfo.java
│ │ ├── ErrorCode.java
│ │ ├── ListInfoVo.java
│ │ └── Result.java
│ │ ├── Params
│ │ ├── ArticleBodyParams.java
│ │ ├── ArticleParams.java
│ │ ├── BgmBrowserParams.java
│ │ ├── CommentParams.java
│ │ ├── LikeOrCollectParams.java
│ │ ├── LoginParams.java
│ │ ├── MessageParams.java
│ │ ├── PageParams.java
│ │ ├── PicParams.java
│ │ ├── RegisterParams.java
│ │ └── UpdateUserParams.java
│ │ ├── Transfer
│ │ ├── BgmCollections.java
│ │ ├── BgmImages.java
│ │ ├── CalendarItemVo.java
│ │ ├── Rating.java
│ │ └── WeekDay.java
│ │ └── Views
│ │ ├── ArticleBodyVo.java
│ │ ├── ArticleVo.java
│ │ ├── BannerVo.java
│ │ ├── BgmRankVo.java
│ │ ├── BgmVo.java
│ │ ├── CalendarVo.java
│ │ ├── CommentVo.java
│ │ ├── MessageVo.java
│ │ ├── PicVo.java
│ │ ├── SenfunSearchVo.java
│ │ ├── SenfunVideoVo.java
│ │ ├── TagVo.java
│ │ ├── UserAllVo.java
│ │ ├── UserVo.java
│ │ ├── YhdmSearchVo.java
│ │ └── YhdmVideoVo.java
└── resources
│ ├── application-dev.yml
│ ├── application-prod.yml
│ ├── application.properties
│ ├── com
│ └── myblog
│ │ └── adkblog
│ │ └── dao
│ │ └── mapper
│ │ ├── ArticleMapper.xml
│ │ ├── BgmCalendarMapper.xml
│ │ └── TagMapper.xml
│ └── static
│ └── img
│ └── logo.png
└── test
└── java
└── com
└── myblog
└── adkblog
└── AdkblogApplicationTests.java
/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**/target/
5 | !**/src/test/**/target/
6 |
7 | ### STS ###
8 | .apt_generated
9 | .classpath
10 | .factorypath
11 | .project
12 | .settings
13 | .springBeans
14 | .sts4-cache
15 |
16 | ### IntelliJ IDEA ###
17 | .idea
18 | *.iws
19 | *.iml
20 | *.ipr
21 |
22 | ### NetBeans ###
23 | /nbproject/private/
24 | /nbbuild/
25 | /dist/
26 | /nbdist/
27 | /.nb-gradle/
28 | build/
29 | !**/src/main/**/build/
30 | !**/src/test/**/build/
31 |
32 | ### VS Code ###
33 | .vscode/
34 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ADKcodeXD/ADKblog-backend/c62c03931ea10e6d6698797a17a37eadbe873981/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
2 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
3 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 ADK
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ADKblog-backend-client
2 | ADK blog 网站的后端实现源码
3 | 基于Springboot
4 |
5 | 利用redis作为中间缓存
6 |
7 | ## 环境
8 |
9 | - java JDK1.8
10 |
11 | - Springboot 2.5.3
12 | - mysql 8.0
13 | - redis 6.0.8
14 |
15 | ## 架构以及目录结构
16 |
17 | - adkblog
18 |
19 | - common //共用文件夹 存放注解之类的东西
20 |
21 | - config //配置bean
22 | - controller //控制层 接口转发层
23 | - dao/mapper //持久层 存放mapper
24 | - dos //中间数据
25 |
26 | - handler //拦截器
27 | - pojo //实体类
28 | - service //业务层 业务逻辑的具体实现接口
29 | - serviceImpl //接口实现
30 |
31 | - utils //工具类
32 | - vo //页面显示类
33 |
34 |
--------------------------------------------------------------------------------
/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM https://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM set title of command window
39 | title %0
40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
42 |
43 | @REM set %HOME% to equivalent of $HOME
44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45 |
46 | @REM Execute a user defined script before this one
47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
49 | if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
50 | if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
51 | :skipRcPre
52 |
53 | @setlocal
54 |
55 | set ERROR_CODE=0
56 |
57 | @REM To isolate internal variables from possible post scripts, we use another setlocal
58 | @setlocal
59 |
60 | @REM ==== START VALIDATION ====
61 | if not "%JAVA_HOME%" == "" goto OkJHome
62 |
63 | echo.
64 | echo Error: JAVA_HOME not found in your environment. >&2
65 | echo Please set the JAVA_HOME variable in your environment to match the >&2
66 | echo location of your Java installation. >&2
67 | echo.
68 | goto error
69 |
70 | :OkJHome
71 | if exist "%JAVA_HOME%\bin\java.exe" goto init
72 |
73 | echo.
74 | echo Error: JAVA_HOME is set to an invalid directory. >&2
75 | echo JAVA_HOME = "%JAVA_HOME%" >&2
76 | echo Please set the JAVA_HOME variable in your environment to match the >&2
77 | echo location of your Java installation. >&2
78 | echo.
79 | goto error
80 |
81 | @REM ==== END VALIDATION ====
82 |
83 | :init
84 |
85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86 | @REM Fallback to current working directory if not found.
87 |
88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90 |
91 | set EXEC_DIR=%CD%
92 | set WDIR=%EXEC_DIR%
93 | :findBaseDir
94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
95 | cd ..
96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
97 | set WDIR=%CD%
98 | goto findBaseDir
99 |
100 | :baseDirFound
101 | set MAVEN_PROJECTBASEDIR=%WDIR%
102 | cd "%EXEC_DIR%"
103 | goto endDetectBaseDir
104 |
105 | :baseDirNotFound
106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107 | cd "%EXEC_DIR%"
108 |
109 | :endDetectBaseDir
110 |
111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112 |
113 | @setlocal EnableExtensions EnableDelayedExpansion
114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116 |
117 | :endReadAdditionalConfig
118 |
119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122 |
123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
124 |
125 | FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
127 | )
128 |
129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data.
131 | if exist %WRAPPER_JAR% (
132 | if "%MVNW_VERBOSE%" == "true" (
133 | echo Found %WRAPPER_JAR%
134 | )
135 | ) else (
136 | if not "%MVNW_REPOURL%" == "" (
137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
138 | )
139 | if "%MVNW_VERBOSE%" == "true" (
140 | echo Couldn't find %WRAPPER_JAR%, downloading it ...
141 | echo Downloading from: %DOWNLOAD_URL%
142 | )
143 |
144 | powershell -Command "&{"^
145 | "$webclient = new-object System.Net.WebClient;"^
146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
148 | "}"^
149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
150 | "}"
151 | if "%MVNW_VERBOSE%" == "true" (
152 | echo Finished downloading %WRAPPER_JAR%
153 | )
154 | )
155 | @REM End of extension
156 |
157 | @REM Provide a "standardized" way to retrieve the CLI args that will
158 | @REM work with both Windows and non-Windows executions.
159 | set MAVEN_CMD_LINE_ARGS=%*
160 |
161 | %MAVEN_JAVA_EXE% ^
162 | %JVM_CONFIG_MAVEN_PROPS% ^
163 | %MAVEN_OPTS% ^
164 | %MAVEN_DEBUG_OPTS% ^
165 | -classpath %WRAPPER_JAR% ^
166 | "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
167 | %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
168 | if ERRORLEVEL 1 goto error
169 | goto end
170 |
171 | :error
172 | set ERROR_CODE=1
173 |
174 | :end
175 | @endlocal & set ERROR_CODE=%ERROR_CODE%
176 |
177 | if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
178 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
179 | if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
180 | if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
181 | :skipRcPost
182 |
183 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
184 | if "%MAVEN_BATCH_PAUSE%"=="on" pause
185 |
186 | if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
187 |
188 | cmd /C exit /B %ERROR_CODE%
189 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | org.springframework.boot
7 | spring-boot-starter-parent
8 | 2.5.3
9 |
10 |
11 | com.adk
12 | blogproject
13 | 0.0.1-SNAPSHOT
14 | blogproject
15 | A personal Blog for me
16 |
17 | 1.8
18 |
19 |
20 |
21 | org.springframework.boot
22 | spring-boot-starter-web
23 |
24 |
25 |
26 | org.springframework.boot
27 | spring-boot-devtools
28 | runtime
29 | true
30 |
31 |
32 |
33 | mysql
34 | mysql-connector-java
35 | runtime
36 |
37 |
38 |
39 | junit
40 | junit
41 | 4.12
42 | test
43 |
44 |
45 |
46 | io.jsonwebtoken
47 | jjwt
48 | 0.9.1
49 |
50 |
51 |
52 | commons-codec
53 | commons-codec
54 | 1.10
55 |
56 |
57 | org.springframework.boot
58 | spring-boot-starter-data-redis
59 |
60 |
61 |
62 | com.alibaba
63 | fastjson
64 | 1.2.75
65 |
66 |
67 |
68 | commons-io
69 | commons-io
70 | 2.4
71 |
72 |
73 |
74 | org.apache.commons
75 | commons-lang3
76 | 3.12.0
77 |
78 |
79 | org.springframework.boot
80 | spring-boot-starter-freemarker
81 |
82 |
83 |
84 | org.springframework.boot
85 | spring-boot-starter-aop
86 |
87 |
88 |
89 | org.lionsoul
90 | ip2region
91 | 1.7.2
92 |
93 |
94 |
95 | nl.basjes.parse.useragent
96 | yauaa
97 | 5.20
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | cn.hutool
112 | hutool-all
113 | 5.3.3
114 |
115 |
116 |
117 | org.springframework.boot
118 | spring-boot-starter-mail
119 |
120 |
121 | org.springframework.boot
122 | spring-boot-configuration-processor
123 | true
124 |
125 |
126 | org.hibernate.validator
127 | hibernate-validator
128 | 6.0.17.Final
129 |
130 |
131 | javax.validation
132 | validation-api
133 | 2.0.1.Final
134 |
135 |
136 |
137 | digest
138 | digest
139 | 1.4.4
140 |
141 |
142 |
143 |
144 | com.baomidou
145 | mybatis-plus-boot-starter
146 | 3.4.3
147 |
148 |
149 |
150 | org.projectlombok
151 | lombok
152 |
153 |
154 |
155 | joda-time
156 | joda-time
157 | 2.10.10
158 |
159 |
160 |
161 | com.google.code.gson
162 | gson
163 | 2.8.5
164 |
165 |
166 | com.aliyun.oss
167 | aliyun-sdk-oss
168 | 3.10.2
169 |
170 |
171 |
172 |
173 | org.jsoup
174 | jsoup
175 | 1.11.3
176 |
177 |
178 |
179 |
180 |
181 | org.springframework.boot
182 | spring-boot-starter-websocket
183 |
184 |
185 |
186 |
187 | io.springfox
188 | springfox-swagger-ui
189 | 2.9.2
190 |
191 |
192 |
193 | io.springfox
194 | springfox-swagger2
195 | 2.9.2
196 |
197 |
198 |
199 |
200 |
201 |
202 | org.springframework.boot
203 | spring-boot-maven-plugin
204 |
205 |
206 |
207 | org.projectlombok
208 | lombok
209 |
210 |
211 |
212 |
213 |
214 | org.apache.maven.plugins
215 | maven-resources-plugin
216 | 3.1.0
217 |
218 |
219 |
220 |
221 |
222 | dev
223 |
224 | true
225 |
226 |
227 | dev
228 |
229 |
230 |
231 | prod
232 |
233 | prod
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
--------------------------------------------------------------------------------
/sql/README.md:
--------------------------------------------------------------------------------
1 | # 数据库文件
2 |
3 | - 本后端采用了mysql8.0作为数据库
4 |
5 | - 数据库中有bl\_开头和admin\_的表
6 |
7 | - bl\_开头的表是用于前台交互的,admin\_开头的表是用于博客后台的权限认证以及管理的。
8 | - 后台暂时未整理(其实有点残废
9 |
10 | ## 如何运行
11 |
12 | 安装好数据库后,输入命令
13 |
14 | ```bash
15 | mysql -u username -p password
16 |
17 | source [路径名]\adkblog.sql
18 | ```
19 |
20 | 建议安装宝塔进行数据库的管理
21 |
22 | ## 数据库字段格式
23 |
24 | 本数据库字符集格式为utf8mb4
25 |
26 | 排序规则为utf8mb4_general_ci
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/sql/adkblog-6.15.sql:
--------------------------------------------------------------------------------
1 | /*
2 | Navicat Premium Data Transfer
3 |
4 | Source Server : iknow
5 | Source Server Type : MySQL
6 | Source Server Version : 80022
7 | Source Host : localhost:3306
8 | Source Schema : blog
9 |
10 | Target Server Type : MySQL
11 | Target Server Version : 80022
12 | File Encoding : 65001
13 |
14 | Date: 15/06/2022 21:35:38
15 | */
16 |
17 | SET NAMES utf8mb4;
18 | SET FOREIGN_KEY_CHECKS = 0;
19 |
20 | -- ----------------------------
21 | -- Table structure for admin_permission
22 | -- ----------------------------
23 | DROP TABLE IF EXISTS `admin_permission`;
24 | CREATE TABLE `admin_permission` (
25 | `id` int NOT NULL AUTO_INCREMENT,
26 | `permission_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
27 | `permission_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
28 | PRIMARY KEY (`id`) USING BTREE
29 | ) ENGINE = InnoDB AUTO_INCREMENT = 28 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
30 |
31 | -- ----------------------------
32 | -- Table structure for admin_role
33 | -- ----------------------------
34 | DROP TABLE IF EXISTS `admin_role`;
35 | CREATE TABLE `admin_role` (
36 | `id` bigint NOT NULL AUTO_INCREMENT,
37 | `role_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
38 | `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
39 | PRIMARY KEY (`id`) USING BTREE
40 | ) ENGINE = InnoDB AUTO_INCREMENT = 1503273040931237891 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
41 |
42 | -- ----------------------------
43 | -- Table structure for admin_role_permission
44 | -- ----------------------------
45 | DROP TABLE IF EXISTS `admin_role_permission`;
46 | CREATE TABLE `admin_role_permission` (
47 | `id` bigint NOT NULL AUTO_INCREMENT,
48 | `permission_id` int NULL DEFAULT NULL,
49 | `role_id` bigint NULL DEFAULT NULL,
50 | PRIMARY KEY (`id`) USING BTREE
51 | ) ENGINE = InnoDB AUTO_INCREMENT = 143 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
52 |
53 | -- ----------------------------
54 | -- Table structure for admin_role_user
55 | -- ----------------------------
56 | DROP TABLE IF EXISTS `admin_role_user`;
57 | CREATE TABLE `admin_role_user` (
58 | `id` bigint NOT NULL AUTO_INCREMENT,
59 | `user_id` bigint NULL DEFAULT NULL,
60 | `role_id` bigint NULL DEFAULT NULL,
61 | PRIMARY KEY (`id`) USING BTREE
62 | ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
63 |
64 | -- ----------------------------
65 | -- Table structure for admin_user
66 | -- ----------------------------
67 | DROP TABLE IF EXISTS `admin_user`;
68 | CREATE TABLE `admin_user` (
69 | `id` bigint NOT NULL AUTO_INCREMENT,
70 | `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
71 | `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
72 | `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
73 | PRIMARY KEY (`id`) USING BTREE
74 | ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
75 |
76 | -- ----------------------------
77 | -- Table structure for bl_article
78 | -- ----------------------------
79 | DROP TABLE IF EXISTS `bl_article`;
80 | CREATE TABLE `bl_article` (
81 | `id` bigint NOT NULL AUTO_INCREMENT,
82 | `summary` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
83 | `create_date` bigint NULL DEFAULT NULL,
84 | `view_counts` int NULL DEFAULT NULL,
85 | `comment_counts` int NULL DEFAULT NULL,
86 | `author_id` bigint NULL DEFAULT NULL,
87 | `body_id` bigint NULL DEFAULT NULL,
88 | `article_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
89 | `banner` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
90 | `like_counts` int NULL DEFAULT 0,
91 | `collect_counts` int NULL DEFAULT 0,
92 | `enable` int NULL DEFAULT 1,
93 | PRIMARY KEY (`id`) USING BTREE
94 | ) ENGINE = InnoDB AUTO_INCREMENT = 1503580210130280451 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
95 |
96 | -- ----------------------------
97 | -- Table structure for bl_article_body
98 | -- ----------------------------
99 | DROP TABLE IF EXISTS `bl_article_body`;
100 | CREATE TABLE `bl_article_body` (
101 | `id` bigint NOT NULL,
102 | `content` blob NULL,
103 | `html` blob NULL,
104 | `article_id` bigint NULL DEFAULT NULL,
105 | PRIMARY KEY (`id`) USING BTREE
106 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
107 |
108 | -- ----------------------------
109 | -- Table structure for bl_article_index
110 | -- ----------------------------
111 | DROP TABLE IF EXISTS `bl_article_index`;
112 | CREATE TABLE `bl_article_index` (
113 | `id` bigint NOT NULL DEFAULT 111111,
114 | `summary` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
115 | `create_date` bigint NULL DEFAULT NULL,
116 | `view_counts` int NULL DEFAULT NULL,
117 | `comment_counts` int NULL DEFAULT NULL,
118 | `author_id` bigint NULL DEFAULT NULL,
119 | `body_id` bigint NULL DEFAULT NULL,
120 | `article_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
121 | `banner` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
122 | `like_counts` int NULL DEFAULT 0,
123 | `collect_counts` int NULL DEFAULT 0,
124 | `enable` int NULL DEFAULT 1,
125 | PRIMARY KEY (`id`) USING BTREE
126 | ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;
127 |
128 | -- ----------------------------
129 | -- Table structure for bl_article_tag
130 | -- ----------------------------
131 | DROP TABLE IF EXISTS `bl_article_tag`;
132 | CREATE TABLE `bl_article_tag` (
133 | `id` bigint NOT NULL AUTO_INCREMENT,
134 | `article_id` bigint NULL DEFAULT NULL,
135 | `tag_id` bigint NULL DEFAULT NULL,
136 | PRIMARY KEY (`id`) USING BTREE
137 | ) ENGINE = InnoDB AUTO_INCREMENT = 1503580210142863362 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
138 |
139 | -- ----------------------------
140 | -- Table structure for bl_article_user_collect
141 | -- ----------------------------
142 | DROP TABLE IF EXISTS `bl_article_user_collect`;
143 | CREATE TABLE `bl_article_user_collect` (
144 | `id` bigint NOT NULL AUTO_INCREMENT,
145 | `article_id` bigint NULL DEFAULT NULL,
146 | `user_id` bigint NULL DEFAULT NULL,
147 | `create_time` bigint NULL DEFAULT 1644910923192,
148 | PRIMARY KEY (`id`) USING BTREE
149 | ) ENGINE = InnoDB AUTO_INCREMENT = 1500472056781692930 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
150 |
151 | -- ----------------------------
152 | -- Table structure for bl_article_user_like
153 | -- ----------------------------
154 | DROP TABLE IF EXISTS `bl_article_user_like`;
155 | CREATE TABLE `bl_article_user_like` (
156 | `id` bigint NOT NULL AUTO_INCREMENT,
157 | `article_id` bigint NULL DEFAULT NULL,
158 | `user_id` bigint NULL DEFAULT NULL,
159 | `create_time` bigint NULL DEFAULT 1644910923192,
160 | PRIMARY KEY (`id`) USING BTREE
161 | ) ENGINE = InnoDB AUTO_INCREMENT = 1503647203147603970 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
162 |
163 | -- ----------------------------
164 | -- Table structure for bl_comment
165 | -- ----------------------------
166 | DROP TABLE IF EXISTS `bl_comment`;
167 | CREATE TABLE `bl_comment` (
168 | `id` bigint NOT NULL AUTO_INCREMENT,
169 | `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
170 | `author_id` bigint NULL DEFAULT NULL,
171 | `create_date` bigint NULL DEFAULT NULL,
172 | `article_id` bigint NULL DEFAULT NULL,
173 | `parent_id` bigint NULL DEFAULT NULL,
174 | `level` int NULL DEFAULT NULL,
175 | `to_uid` bigint NULL DEFAULT NULL,
176 | PRIMARY KEY (`id`) USING BTREE
177 | ) ENGINE = InnoDB AUTO_INCREMENT = 1503426468328202243 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
178 |
179 | -- ----------------------------
180 | -- Table structure for bl_message
181 | -- ----------------------------
182 | DROP TABLE IF EXISTS `bl_message`;
183 | CREATE TABLE `bl_message` (
184 | `id` bigint NOT NULL AUTO_INCREMENT,
185 | `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
186 | `author_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
187 | `contact` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
188 | `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
189 | `create_date` bigint NULL DEFAULT NULL,
190 | PRIMARY KEY (`id`) USING BTREE
191 | ) ENGINE = InnoDB AUTO_INCREMENT = 1499963982723600387 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
192 |
193 | -- ----------------------------
194 | -- Table structure for bl_tag
195 | -- ----------------------------
196 | DROP TABLE IF EXISTS `bl_tag`;
197 | CREATE TABLE `bl_tag` (
198 | `id` int NOT NULL AUTO_INCREMENT,
199 | `tag_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
200 | PRIMARY KEY (`id`) USING BTREE
201 | ) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
202 |
203 | -- ----------------------------
204 | -- Table structure for bl_user
205 | -- ----------------------------
206 | DROP TABLE IF EXISTS `bl_user`;
207 | CREATE TABLE `bl_user` (
208 | `id` bigint NOT NULL AUTO_INCREMENT,
209 | `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
210 | `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
211 | `role` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
212 | `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
213 | `date` bigint NULL DEFAULT NULL,
214 | `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
215 | `introduce` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
216 | `banner` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
217 | `gender` int NULL DEFAULT NULL,
218 | `nickname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
219 | PRIMARY KEY (`id`) USING BTREE
220 | ) ENGINE = InnoDB AUTO_INCREMENT = 1503549150864564226 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
221 |
222 | SET FOREIGN_KEY_CHECKS = 1;
223 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/AdkblogApplication.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
6 | import org.springframework.scheduling.annotation.EnableAsync;
7 |
8 | @SpringBootApplication
9 | @EnableAsync
10 | public class AdkblogApplication {
11 |
12 | public static void main(String[] args) {
13 | SpringApplication.run(AdkblogApplication.class, args);
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/common/ratelimit/Limit.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.common.ratelimit;
2 |
3 | import java.lang.annotation.*;
4 |
5 | @Documented
6 | @Target(ElementType.METHOD)
7 | @Retention(RetentionPolicy.RUNTIME)
8 | public @interface Limit {
9 | // 默认一个小时
10 | long time() default 3000;
11 | //默认只能请求一次
12 | int value() default 1;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/common/ratelimit/LimitAop.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.common.ratelimit;
2 |
3 | import com.myblog.adkblog.vo.Common.ErrorCode;
4 | import com.myblog.adkblog.vo.Common.Result;
5 | import net.jodah.expiringmap.ExpirationPolicy;
6 | import net.jodah.expiringmap.ExpiringMap;
7 | import org.aspectj.lang.ProceedingJoinPoint;
8 | import org.aspectj.lang.annotation.Around;
9 | import org.aspectj.lang.annotation.Aspect;
10 | import org.aspectj.lang.annotation.Pointcut;
11 | import org.springframework.stereotype.Component;
12 | import org.springframework.web.context.request.RequestAttributes;
13 | import org.springframework.web.context.request.RequestContextHolder;
14 | import org.springframework.web.context.request.ServletRequestAttributes;
15 |
16 | import javax.servlet.http.HttpServletRequest;
17 | import java.util.concurrent.ConcurrentHashMap;
18 | import java.util.concurrent.TimeUnit;
19 |
20 | @Aspect
21 | @Component
22 | public class LimitAop {
23 | private static ConcurrentHashMap> map=new ConcurrentHashMap<>();
24 |
25 | @Pointcut("@annotation(limit)")
26 | public void controllerAspect(Limit limit){
27 |
28 | }
29 |
30 | @Around("controllerAspect(limit)")
31 | public Object doAround(ProceedingJoinPoint pjp,Limit limit) throws Throwable {
32 | // 获得request对象
33 | RequestAttributes ra = RequestContextHolder.getRequestAttributes();
34 | ServletRequestAttributes sra = (ServletRequestAttributes) ra;
35 | HttpServletRequest request = sra.getRequest();
36 |
37 | // 获取Map value对象, 如果没有则返回默认值
38 | // //getOrDefault获取参数,获取不到则给默认值
39 | ExpiringMap em = map.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build());
40 | Integer Count = em.getOrDefault(request.getRemoteAddr(), 0);
41 | // result的值就是被拦截方法的返回值
42 |
43 | if (Count >= limit.value()) {
44 | // 超过次数,不执行目标方法
45 | return Result.fail(ErrorCode.RATE_LIMIT.getCode(), ErrorCode.RATE_LIMIT.getMsg());
46 | } else if (Count == 0) {
47 | // 第一次请求时,设置有效时间
48 | em.put(request.getRemoteAddr(), Count + 1, ExpirationPolicy.CREATED, limit.time(), TimeUnit.MILLISECONDS);
49 | } else {
50 | em.put(request.getRemoteAddr(), Count + 1);
51 | }
52 | // 只要请求失败 那么就直接返回 不计入次数内(接口限制的是数据库的写入 并不限制其他的
53 | Object result = pjp.proceed();
54 | if (result instanceof Result) {
55 | Object data = ((Result) result).getData();
56 | if (data == null) {
57 | //建立于所有失败请求都不会设置data的前提下
58 | em.put(request.getRemoteAddr(), Count - 1);
59 | return result;
60 | }
61 | }
62 | map.put(request.getRequestURI(), em);
63 | return result;
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/common/redis/Cache.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.common.redis;
2 |
3 | import java.lang.annotation.*;
4 |
5 | @Documented
6 | @Target(ElementType.METHOD)
7 | @Retention(RetentionPolicy.RUNTIME)
8 | public @interface Cache {
9 | //默认时间 一小时内缓存有用
10 | long expire() default 1000 * 60 * 60;
11 |
12 | String name() default "defaultcache";
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/common/redis/CacheAop.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.common.redis;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.myblog.adkblog.vo.Common.Result;
5 | import org.apache.commons.codec.digest.DigestUtils;
6 | import org.apache.commons.lang3.StringUtils;
7 | import org.aspectj.lang.ProceedingJoinPoint;
8 | import org.aspectj.lang.Signature;
9 | import org.aspectj.lang.annotation.Around;
10 | import org.aspectj.lang.annotation.Aspect;
11 | import org.aspectj.lang.annotation.Pointcut;
12 | import org.springframework.beans.factory.annotation.Autowired;
13 | import org.springframework.data.redis.core.RedisTemplate;
14 | import org.springframework.stereotype.Component;
15 |
16 | import java.time.Duration;
17 |
18 | @Aspect
19 | @Component
20 | public class CacheAop {
21 | @Autowired
22 | private RedisTemplate redisTemplate;
23 |
24 | @Pointcut("@annotation(cache)")
25 | public void controllerCache(Cache cache) {
26 | }
27 |
28 | @Around("controllerCache(cache)")
29 | public Object around(ProceedingJoinPoint pjp, Cache cache) {
30 | try {
31 | Signature signature = pjp.getSignature();
32 | //类名
33 | String className = pjp.getTarget().getClass().getSimpleName();
34 | //调用的方法名
35 | String methodName = signature.getName();
36 | //从pjp中获取参数的类型 并事先预设好用一个数组存放
37 | Class[] parameterTypes = new Class[pjp.getArgs().length];
38 | //获取了参数的数量
39 | Object[] args = pjp.getArgs();
40 | //参数
41 | String params = "";
42 | for (int i = 0; i < args.length; i++) {
43 | if (args[i] != null) {
44 | params += JSON.toJSONString(args[i]);
45 | parameterTypes[i] = args[i].getClass();
46 | } else {
47 | parameterTypes[i] = null;
48 | }
49 | }
50 | if (StringUtils.isNotEmpty(params)) {
51 | //加密 以防出现key过长以及字符转义获取不到的情况
52 | params = DigestUtils.md5Hex(params);
53 | }
54 | //rediskey的组成 当前的缓存名+“::”分割符号+当前类名+"::"分割符号+“方法名”+""::"+参数(md5加密了)
55 | //示例: article::ArticleController::getArticle::e255678%#!shaiufa77parmsshgasiu
56 | //也就是参数不同也会一并将结果存入redis缓存
57 | String redisKey = cache.name() + "::" + className + "::" + methodName + "::" + params;
58 | String redisValue = redisTemplate.opsForValue().get(redisKey);
59 | if (StringUtils.isNotEmpty(redisValue)) {
60 | Result result = JSON.parseObject(redisValue, Result.class);
61 | return result;
62 | }
63 | //如果没有找到相应结果 就会从切点中获取返回的对应的结果
64 | Object proceed = pjp.proceed();
65 | if (proceed instanceof Result) {
66 | //设置 返回结果 只有data不为空且状态为success时 才会存入缓存
67 | if (((Result) proceed).isSuccess() && ((Result) proceed).getData() != null) {
68 | redisTemplate.opsForValue().set(redisKey, JSON.toJSONString(proceed), Duration.ofMillis(cache.expire()));
69 | }
70 | }
71 | return proceed;
72 | } catch (Throwable throwable) {
73 | throwable.printStackTrace();
74 | }
75 | return Result.fail(999, "系统错误");
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/config/MybatisPlusConfig.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.config;
2 |
3 |
4 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
5 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
6 | import org.mybatis.spring.annotation.MapperScan;
7 | import org.springframework.context.annotation.Bean;
8 | import org.springframework.context.annotation.Configuration;
9 |
10 | @Configuration
11 | @MapperScan("com.myblog.adkblog.dao.mapper")
12 | public class MybatisPlusConfig {
13 |
14 | //配置分页插件
15 | @Bean
16 | public MybatisPlusInterceptor mybatisPlusInterceptor(){
17 | MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
18 | interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
19 | return interceptor;
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/config/RedisConfig.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.config;
2 |
3 | import org.springframework.context.annotation.Bean;
4 | import org.springframework.context.annotation.Configuration;
5 | import org.springframework.data.redis.connection.RedisConnectionFactory;
6 | import org.springframework.data.redis.core.RedisTemplate;
7 | import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
8 | import org.springframework.data.redis.serializer.StringRedisSerializer;
9 |
10 | @Configuration
11 | public class RedisConfig {
12 | @Bean
13 | public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
14 | RedisTemplate redisTemplate = new RedisTemplate<>();
15 |
16 | redisTemplate.setConnectionFactory(factory);
17 |
18 | redisTemplate.setKeySerializer(new StringRedisSerializer());
19 |
20 | redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
21 |
22 | return redisTemplate;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/config/SwwagerConfig.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.config;
2 |
3 |
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 | import springfox.documentation.builders.ApiInfoBuilder;
7 | import springfox.documentation.service.ApiInfo;
8 | import springfox.documentation.spi.DocumentationType;
9 | import springfox.documentation.spring.web.plugins.Docket;
10 | import springfox.documentation.swagger2.annotations.EnableSwagger2;
11 |
12 | @Configuration
13 | @EnableSwagger2//开启Swagger2
14 | public class SwwagerConfig {
15 |
16 | //配置Swagger的Bean实例
17 | @Bean
18 | public Docket swaggerSpringMvcPlugin() {
19 | return new Docket(DocumentationType.SWAGGER_2)
20 | .apiInfo(apiInfo());
21 | }
22 |
23 | //配置API的基本信息(会在http://项目实际地址/swagger-ui.html页面显示)
24 | private ApiInfo apiInfo() {
25 | return new ApiInfoBuilder()
26 | .title("文章后台Api接口文档")
27 | .description("api接口文档描述")
28 | .version("1.0")
29 | .build();
30 | }
31 | }
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/config/ThreadPoolConfig.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.config;
2 |
3 | import org.springframework.context.annotation.Bean;
4 | import org.springframework.context.annotation.Configuration;
5 | import org.springframework.scheduling.annotation.EnableAsync;
6 | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
7 |
8 | import java.util.concurrent.Executor;
9 |
10 | /**
11 | * 线程池配置
12 | * 用于多线程 不阻塞主线程
13 | */
14 | @Configuration
15 | @EnableAsync
16 | public class ThreadPoolConfig {
17 | //java多线程 线程池 异步执行相关的知识
18 | //需要进一步学习
19 | @Bean("taskExecutor")
20 | public Executor asyncServiceExecutor(){
21 | ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
22 | // 设置核心线程数
23 | executor.setCorePoolSize(5);
24 | // 设置最大线程数
25 | executor.setMaxPoolSize(20);
26 | //配置队列大小
27 | executor.setQueueCapacity(Integer.MAX_VALUE);
28 | // 设置线程活跃时间(秒)
29 | executor.setKeepAliveSeconds(60);
30 | // 设置默认线程名称
31 | executor.setThreadNamePrefix("adkblog");
32 | // 等待所有任务结束后再关闭线程池
33 | executor.setWaitForTasksToCompleteOnShutdown(true);
34 | //执行初始化
35 | executor.initialize();
36 | return executor;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/config/WebMVCConfig.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.config;
2 |
3 | import com.myblog.adkblog.handler.LoginInterceptor;
4 | import org.springframework.beans.factory.annotation.Autowired;
5 | import org.springframework.context.annotation.Configuration;
6 | import org.springframework.web.servlet.config.annotation.CorsRegistry;
7 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
8 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
9 |
10 | @Configuration
11 | public class WebMVCConfig implements WebMvcConfigurer {
12 | @Autowired
13 | private LoginInterceptor loginInterceptor;
14 | //跨域设置 可以实现前后端分离的端口号不同的情况
15 | static final String ORIGINS[]=new String[]{"GET","POST","DELETE","PUT"};
16 | @Override
17 | public void addCorsMappings(CorsRegistry registry) {
18 | registry.addMapping("/**")
19 | .allowedOriginPatterns("*")
20 | .allowCredentials(true)
21 | .allowedMethods(ORIGINS)
22 | .maxAge(3600);
23 | }
24 | @Override
25 | public void addInterceptors(InterceptorRegistry registry) {
26 | registry.addInterceptor(loginInterceptor)
27 | .addPathPatterns("/articles/publish")
28 | .addPathPatterns("/comments/addcomment")
29 | .addPathPatterns("/tags/add")
30 | .addPathPatterns("/articles/myarticle")
31 | .addPathPatterns("/articles/updatemyarticle")
32 | .addPathPatterns("/articles/deletemyarticle/**")
33 | .addPathPatterns("/articles/switcharticlestate/**")
34 | .addPathPatterns("/login/logout")
35 | .addPathPatterns("/ws/**");
36 | //添加一个登录拦截器
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/config/WebSocketConfig.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.config;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 | import org.springframework.messaging.simp.config.MessageBrokerRegistry;
7 | import org.springframework.web.socket.config.annotation.*;
8 | import org.springframework.web.socket.server.standard.ServerEndpointExporter;
9 |
10 | @Configuration
11 | public class WebSocketConfig {
12 | @Bean
13 | public ServerEndpointExporter serverEndpointExporter(){
14 | return new ServerEndpointExporter();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/ArticleController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.ratelimit.Limit;
4 | import com.myblog.adkblog.common.redis.Cache;
5 | import com.myblog.adkblog.service.ArticleService;
6 | import com.myblog.adkblog.vo.Params.ArticleParams;
7 | import com.myblog.adkblog.vo.Params.PageParams;
8 | import com.myblog.adkblog.vo.Common.Result;
9 | import io.swagger.annotations.Api;
10 | import io.swagger.annotations.ApiOperation;
11 | import org.apache.commons.lang3.StringUtils;
12 | import org.springframework.beans.factory.annotation.Autowired;
13 | import org.springframework.web.bind.annotation.*;
14 |
15 | @RestController
16 | @RequestMapping("articles")
17 | @Api(tags="文章相关Api")
18 | public class ArticleController {
19 |
20 | @Autowired
21 | private ArticleService articleService;
22 | /**
23 | * 文章发布
24 | */
25 | @PostMapping("publish")
26 | @ApiOperation("发布文章api")
27 | @Limit(time = 60000,value = 1)//一分钟内只能请求一次
28 | public Result publish(@RequestBody ArticleParams articleParams){
29 | return articleService.publish(articleParams);
30 | }
31 | @PostMapping("myarticle")
32 | @ApiOperation("获取我自己发布的文章")
33 | public Result getMyArticles(@RequestBody PageParams pageParams){
34 | return articleService.getMyArticles(pageParams);
35 | }
36 | @PostMapping("updatemyarticle")
37 | @ApiOperation("修改我发布的文章")
38 | public Result updateMyArticle(@RequestBody ArticleParams articleParams){
39 | return articleService.updateMyArticle(articleParams);
40 | }
41 | @PostMapping("deletemyarticle/{id}")
42 | @ApiOperation("删除我发布的文章")
43 | public Result deleteMyArticle(@PathVariable("id") String id){
44 | return articleService.deleteMyArticle(id);
45 | }
46 | @PostMapping("switcharticlestate/{id}")
47 | @ApiOperation("切换文章的状态(公开/私有)")
48 | public Result switchArticleState(@PathVariable("id") String id){
49 | return articleService.switchArticleState(id);
50 | }
51 | @PostMapping("articlelistcount")
52 | @ApiOperation("获取文章列表Api 有一个文章列表的长度")
53 | @Cache(expire = 1 * 60 * 1000, name = "articleListCount")//1分钟的缓存有效
54 | public Result listArticleWithCount(@RequestBody PageParams pageParams){
55 | return articleService.listArticleWithCount(pageParams);
56 | }
57 | //文章主体
58 | @PostMapping("article/{id}")
59 | @ApiOperation("获取文章详情api")
60 | public Result findArticleById(@PathVariable("id")Long id,@RequestHeader("Authorization")String token){
61 | /**
62 | * 通过pathvariable来获取链接中的id值
63 | */
64 | if(StringUtils.isBlank(token)){
65 | token="null";
66 | }
67 | return articleService.findArticleById(id,token);
68 | }
69 |
70 | @GetMapping("indexbanner")
71 | @ApiOperation("获取首页轮播图数据Api")
72 | @Cache(name = "indexBanner")
73 | public Result getIndexBanner(){
74 | return articleService.getIndexBanner();
75 | }
76 |
77 | @GetMapping("articletime")
78 | @ApiOperation("获取文章归档数据Api")
79 | @Cache(name = "articleTime")
80 | public Result getGroupByTime(){
81 | return articleService.getGroupByTime();
82 | }
83 |
84 | @PostMapping("indexarticle")
85 | @ApiOperation("获取首页文章Api")
86 | @Cache(name = "indexArticle")
87 | public Result getIndexArticle(@RequestBody PageParams pageParams){
88 | return articleService.getIndexArticle(pageParams);
89 | }
90 |
91 | //搜索建议 只取十条
92 | @GetMapping("searchtip")
93 | @ApiOperation("获取搜索建议Api")
94 | @Cache(name = "searchTip")
95 | public Result getSearchTip(@RequestParam String keyword){
96 | return articleService.getSearchTip(keyword);
97 | }
98 |
99 |
100 | }
101 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/BgmDataController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.redis.Cache;
4 | import com.myblog.adkblog.service.BgmApiService;
5 | import com.myblog.adkblog.vo.Common.Result;
6 | import io.swagger.annotations.Api;
7 | import io.swagger.annotations.ApiImplicitParam;
8 | import io.swagger.annotations.ApiImplicitParams;
9 | import io.swagger.annotations.ApiOperation;
10 | import org.apache.ibatis.annotations.Param;
11 | import org.springframework.beans.factory.annotation.Autowired;
12 | import org.springframework.web.bind.annotation.GetMapping;
13 | import org.springframework.web.bind.annotation.PathVariable;
14 | import org.springframework.web.bind.annotation.RequestMapping;
15 | import org.springframework.web.bind.annotation.RestController;
16 |
17 | @RestController
18 | @RequestMapping("bgm")
19 | @Api(tags = "用于直接请求Bangumi接口 并支持缓存")
20 | public class BgmDataController {
21 | @Autowired
22 | private BgmApiService bgmApiService;
23 |
24 | @GetMapping("calendar")
25 | @ApiOperation("获取每日更新番剧")
26 | @Cache(expire = 1000 * 60 * 60 * 24 * 1, name = "bgmCalendar") //一天过期 防止换季更新不及时
27 | public Result getCalendar() {
28 | return bgmApiService.getCalendar();
29 | }
30 |
31 | @GetMapping("subject/{id}")
32 | @ApiOperation("获取条目的简略信息")
33 | @Cache(expire = 1000 * 60 * 60 * 24 * 1, name = "bgmSubject") //也是一天过期 不过其实可以很久才过期 没啥必要一天 为了减少缓存吧
34 | @ApiImplicitParams({
35 | @ApiImplicitParam(name = "id", value = "条目id", required = true, dataType = "int", paramType = "params"),
36 | })
37 | public Result getSubjectEasy(@PathVariable("id") int subjectId) {
38 | return bgmApiService.getSubjectByV0(subjectId);
39 | }
40 |
41 | @GetMapping("subjectAll/{id}")
42 | @ApiOperation("获取条目的所有信息")
43 | @Cache(expire = 1000 * 60 * 60 * 24 * 1, name = "bgmSubjectAll") //也是一天过期 不过其实可以很久才过期 没啥必要一天 为了减少缓存吧
44 | @ApiImplicitParams({
45 | @ApiImplicitParam(name = "id", value = "条目id", required = true, dataType = "int", paramType = "Path"),
46 | @ApiImplicitParam(name = "responseGroup", value = "定义返回大小", required = true, dataType = "String", paramType = "param"),
47 | @ApiImplicitParam(name = "timestamp", value = "时间戳", required = true, dataType = "String", paramType = "param")
48 | })
49 | public Result getSubjectAll(@PathVariable("id") int subjectId,
50 | @Param("responseGroup") String responseGroup,
51 | @Param("timestamp") String timestamp) {
52 | return bgmApiService.getSubject(subjectId, responseGroup, timestamp);
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/BgmRankController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.redis.Cache;
4 | import com.myblog.adkblog.service.BgmRankService;
5 | import com.myblog.adkblog.vo.Params.BgmBrowserParams;
6 | import com.myblog.adkblog.vo.Common.Result;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.PostMapping;
11 | import org.springframework.web.bind.annotation.RequestBody;
12 | import org.springframework.web.bind.annotation.RequestMapping;
13 | import org.springframework.web.bind.annotation.RestController;
14 |
15 | @RestController
16 | @RequestMapping("bgmrank")
17 | @Api(tags="Bangumi动漫信息相关Api")
18 | public class BgmRankController {
19 | @Autowired
20 | private BgmRankService bgmRankService;
21 | //利用爬虫爬取bgm首页的排行榜
22 | //由于基本不会变动 缓存设置为七天过期
23 | //七天防止数据过多
24 | @PostMapping("getindex")
25 | @ApiOperation(value = "获取动漫排行榜信息Api")
26 | @Cache(expire = 1000 * 60 * 60 * 24 * 7)
27 | public Result getBgmRankData(@RequestBody BgmBrowserParams bgmBrowserParams) {
28 | return bgmRankService.getBrowser(bgmBrowserParams);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/CommentController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.ratelimit.Limit;
4 | import com.myblog.adkblog.service.CommentService;
5 | import com.myblog.adkblog.vo.Views.CommentVo;
6 | import com.myblog.adkblog.vo.Params.CommentParams;
7 | import com.myblog.adkblog.vo.Params.PageParams;
8 | import com.myblog.adkblog.vo.Common.Result;
9 | import io.swagger.annotations.*;
10 | import org.springframework.beans.factory.annotation.Autowired;
11 | import org.springframework.web.bind.annotation.*;
12 |
13 | @RestController
14 | @RequestMapping("comment")
15 | @Api(tags="评论相关Api")
16 | public class CommentController {
17 | @Autowired
18 | private CommentService commentService;
19 |
20 | @PostMapping("addcomment")
21 | @ApiOperation("添加评论Api")
22 | @Limit()
23 | public Result addComment(@RequestBody CommentParams commentParams){
24 | return commentService.addComment(commentParams);
25 | }
26 |
27 | @PostMapping("article/{id}")
28 | @ApiOperation("获取某文章评论Api")
29 | @ApiImplicitParams({
30 | @ApiImplicitParam(name = "id" ,value = "文章id",required = true,dataType = "Long",paramType = "params"),
31 | @ApiImplicitParam(name = "pageParams" ,value = "分页查询参数",required = true,dataType = "PageParams",paramType = "body")
32 | })
33 | public Result getComments(@PathVariable("id") Long id, @RequestBody PageParams pageParams){
34 | return commentService.findCommentByArticleId(id,pageParams);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/LikeOrCollectController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.service.CollectOrLikeService;
4 | import com.myblog.adkblog.vo.Views.ArticleVo;
5 | import com.myblog.adkblog.vo.Common.ListInfoVo;
6 | import com.myblog.adkblog.vo.Params.PageParams;
7 | import com.myblog.adkblog.vo.Common.Result;
8 | import io.swagger.annotations.*;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.*;
11 |
12 | @RestController
13 | @RequestMapping("userset")
14 | @Api(tags="留言板Api")
15 | public class LikeOrCollectController {
16 | @Autowired
17 | private CollectOrLikeService collectOrLikeService;
18 | @PostMapping("findmycollect")
19 | @ApiOperation(value = "获取用户收藏Api" ,notes = "获取用户收藏Api")
20 | @ApiImplicitParams({
21 | @ApiImplicitParam(value = "认证请求头",required = true,paramType = "String"),
22 | @ApiImplicitParam(name = "pageParams" ,value = "分页查询参数",required = true,dataType = "PageParams",paramType = "body")
23 | })
24 | public Result> getMyCollect(@RequestBody PageParams pageParams, @RequestHeader("Authorization")String token){
25 | return collectOrLikeService.getMyCollect(pageParams,token);
26 | }
27 |
28 | @PostMapping("findmylike")
29 | @ApiOperation(value = "获取用户所有点赞文章Api" ,notes = "获取用户点赞Api")
30 | @ApiImplicitParams({
31 | @ApiImplicitParam(value = "认证请求头",required = true,paramType = "String"),
32 | @ApiImplicitParam(name = "pageParams" ,value = "分页查询参数",required = true,dataType = "PageParams",paramType = "body")
33 | })
34 | public Result> getMyLiked(@RequestBody PageParams pageParams, @RequestHeader("Authorization")String token){
35 | return collectOrLikeService.getMyLiked(pageParams,token);
36 | }
37 |
38 | @DeleteMapping("deletemycollect/{id}")
39 | @ApiOperation(value = "删除用户收藏文章Api" ,notes = "删除用户收藏文章")
40 | @ApiImplicitParams({
41 | @ApiImplicitParam(value = "认证请求头",required = true,paramType = "String"),
42 | @ApiImplicitParam(name = "articleId" ,value = "文章id",required = true,dataType = "String",paramType = "Param")
43 | })
44 | public Result deleteMyCollect(@PathVariable("id") String articleId, @RequestHeader("Authorization")String token){
45 | return collectOrLikeService.deleteMyCollect(articleId,token);
46 | }
47 |
48 | @DeleteMapping("deletemyliked/{id}")
49 | @ApiOperation(value = "删除用户点赞过的文章Api" ,notes = "删除用户点赞文章")
50 | @ApiImplicitParams({
51 | @ApiImplicitParam(value = "认证请求头",required = true,paramType = "String"),
52 | @ApiImplicitParam(name = "articleId" ,value = "文章id",required = true,dataType = "String",paramType = "Param")
53 | })
54 | public Result deleteMyLiked(@PathVariable("id") String articleId, @RequestHeader("Authorization")String token){
55 | return collectOrLikeService.deleteMyLiked(articleId,token);
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/LoginController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.service.LoginService;
4 | import com.myblog.adkblog.vo.Params.LoginParams;
5 | import com.myblog.adkblog.vo.Common.Result;
6 | import io.swagger.annotations.Api;
7 | import io.swagger.annotations.ApiOperation;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.web.bind.annotation.*;
10 |
11 | @RestController
12 | @RequestMapping("login")
13 | @Api(tags="登录Api")
14 | public class LoginController {
15 | @Autowired
16 | private LoginService loginService;
17 | @PostMapping
18 | @ApiOperation("登录Api")
19 | public Result login(@RequestBody LoginParams loginParams){
20 | return loginService.login(loginParams);
21 | }
22 |
23 | @PostMapping("/logout")
24 | @ApiOperation("用户登出api")
25 | public Result logout(@RequestHeader("Authorization")String token){
26 | return loginService.logout(token);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/MessageController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 |
4 | import com.myblog.adkblog.common.ratelimit.Limit;
5 | import com.myblog.adkblog.service.MessageService;
6 | import com.myblog.adkblog.vo.Params.MessageParams;
7 | import com.myblog.adkblog.vo.Params.PageParams;
8 | import com.myblog.adkblog.vo.Common.Result;
9 | import io.swagger.annotations.Api;
10 | import io.swagger.annotations.ApiOperation;
11 | import org.springframework.beans.factory.annotation.Autowired;
12 | import org.springframework.web.bind.annotation.*;
13 |
14 | @RestController
15 | @RequestMapping("message")
16 | @Api(tags="留言板Api")
17 | public class MessageController {
18 |
19 | @Autowired
20 | private MessageService messageService;
21 |
22 | @PostMapping("findmsg")
23 | @ApiOperation("获取留言信息Api")
24 | public Result getMessage(@RequestBody PageParams pageParams){
25 | return messageService.getMessage(pageParams);
26 | }
27 |
28 | @PostMapping("addmsg")
29 | @ApiOperation("添加留言的Api")
30 | @Limit()
31 | public Result addMessage(@RequestBody MessageParams messageParams){
32 | return messageService.addMessage(messageParams);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/PictureController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 |
4 | import com.myblog.adkblog.common.ratelimit.Limit;
5 | import com.myblog.adkblog.common.redis.Cache;
6 | import com.myblog.adkblog.service.PictureService;
7 | import com.myblog.adkblog.vo.Common.Result;
8 | import com.myblog.adkblog.vo.Params.PageParams;
9 | import com.myblog.adkblog.vo.Params.PicParams;
10 | import io.swagger.annotations.Api;
11 | import io.swagger.annotations.ApiOperation;
12 | import io.swagger.annotations.Authorization;
13 | import org.apache.ibatis.annotations.Param;
14 | import org.springframework.beans.factory.annotation.Autowired;
15 | import org.springframework.web.bind.annotation.*;
16 |
17 | @RestController
18 | @RequestMapping("pic")
19 | @Api(tags="画廊API")
20 | public class PictureController {
21 | @Autowired
22 | private PictureService pictureService;
23 | /**
24 | * params 分页参数
25 | * @return 一个列表
26 | */
27 | @PostMapping("getPics")
28 | @ApiOperation("获取图片by分页参数")
29 | @Cache(expire = 5000 ,name = "piclist")
30 | public Result getPics(@RequestBody PageParams pageParams){
31 | return pictureService.getPics(pageParams);
32 | }
33 |
34 | @PostMapping("addPic")
35 | @ApiOperation("添加图片")
36 | @Limit(time = 10000,value = 2)
37 | public Result addPic(@RequestBody PicParams picParams, @RequestHeader("Authorization")String token){
38 | return pictureService.addPic(picParams,token);
39 | }
40 |
41 | @GetMapping("likePic")
42 | @ApiOperation("点赞图片")
43 | @Limit(time = 60000,value = 20)
44 | public Result likePic(@Param("id") String id){
45 | return pictureService.likePic(id);
46 | }
47 |
48 | @PostMapping("getMyPics")
49 | @ApiOperation("获取自己发布的图片")
50 | public Result getMyPics(@RequestBody PageParams pageParams,@RequestHeader("Authorization")String token){
51 | return pictureService.getMyPics(pageParams,token);
52 | }
53 |
54 | @PostMapping("deleteMyPic/{id}")
55 | @ApiOperation("删除自己发布的图片")
56 | public Result deleteMyPics(@PathVariable("id")String id,@RequestHeader("Authorization")String token){
57 | return pictureService.deleteMyPics(id,token);
58 | }
59 |
60 | @PostMapping("updateMyPic")
61 | @ApiOperation("修改图片信息 无法改变图片地址!")
62 | public Result updateMyPics(@RequestBody PicParams picParams,@RequestHeader("Authorization")String token){
63 | return pictureService.updateMyPics(picParams,token);
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/RegisterCoontroller.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.ratelimit.Limit;
4 | import com.myblog.adkblog.service.LoginService;
5 | import com.myblog.adkblog.vo.Params.RegisterParams;
6 | import com.myblog.adkblog.vo.Common.Result;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.PostMapping;
11 | import org.springframework.web.bind.annotation.RequestBody;
12 | import org.springframework.web.bind.annotation.RequestMapping;
13 | import org.springframework.web.bind.annotation.RestController;
14 |
15 | @RestController
16 | @RequestMapping("register")
17 | @Api(tags="注册Api")
18 | public class RegisterCoontroller {
19 | @Autowired
20 | private LoginService loginService;
21 |
22 | @PostMapping
23 | @ApiOperation("注册用户Api")
24 | @Limit(time = 60000,value = 1) //同一ip 一分钟内只能注册一次
25 | public Result login(@RequestBody RegisterParams registerParams){
26 | return loginService.register(registerParams);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/SenFunController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.redis.Cache;
4 | import com.myblog.adkblog.service.SenFunService;
5 | import com.myblog.adkblog.service.YhdmService;
6 | import com.myblog.adkblog.vo.Common.Result;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.GetMapping;
11 | import org.springframework.web.bind.annotation.RequestMapping;
12 | import org.springframework.web.bind.annotation.RequestParam;
13 | import org.springframework.web.bind.annotation.RestController;
14 |
15 | @RestController
16 | @RequestMapping("senfun")
17 | @Api(tags = "senfun动漫网站爬虫")
18 | /**
19 | * 暂时弃用 不好爬
20 | */
21 | public class SenFunController {
22 |
23 | @Autowired
24 | private SenFunService senFunService;
25 | /**
26 | * params 分集的数据 分集连接id 然后返回一个video url
27 | * @return url
28 | */
29 | @GetMapping("getvideourl")
30 | @ApiOperation("获取senfun的搜索结果")
31 | @Cache(expire = 1000 * 60 * 60 * 24 * 7, name = "senfun")//由于这种数据一般不会变化 设置七天的缓存
32 | public Result getSearchResult(@RequestParam String keywords){
33 | return senFunService.getSearchResult(keywords);
34 | // return Result.success(null);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/TagController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.ratelimit.Limit;
4 | import com.myblog.adkblog.service.TagService;
5 | import com.myblog.adkblog.vo.Params.PageParams;
6 | import com.myblog.adkblog.vo.Common.Result;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.web.bind.annotation.*;
11 |
12 | @RestController
13 | @RequestMapping("tags")
14 | @Api(tags="标签相关Api")
15 | public class TagController {
16 |
17 | @Autowired
18 | private TagService tagService;
19 | @GetMapping("all")
20 | @ApiOperation("获取所有标签Api")
21 | public Result findAll(){
22 | return tagService.findAll();
23 | }
24 |
25 | @GetMapping("add")
26 | @ApiOperation("添加标签Api")
27 | @Limit(time = 120000,value = 5)//两分钟内只能添加五个标签
28 | public Result addTag(@RequestParam String tagName){
29 | return tagService.addTag(tagName);
30 | }
31 |
32 | @PostMapping("taglist")
33 | @ApiOperation("分页获取标签Api")
34 | public Result getTagList(@RequestBody PageParams pageParams){
35 | return tagService.tagList(pageParams);
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/UploadController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.ratelimit.Limit;
4 | import com.myblog.adkblog.utils.AliossUtils;
5 | import com.myblog.adkblog.vo.Common.ErrorCode;
6 | import com.myblog.adkblog.vo.Common.Result;
7 | import io.swagger.annotations.Api;
8 | import io.swagger.annotations.ApiOperation;
9 | import org.apache.commons.lang3.StringUtils;
10 | import org.springframework.beans.factory.annotation.Autowired;
11 | import org.springframework.web.bind.annotation.PostMapping;
12 | import org.springframework.web.bind.annotation.RequestMapping;
13 | import org.springframework.web.bind.annotation.RequestParam;
14 | import org.springframework.web.bind.annotation.RestController;
15 | import org.springframework.web.multipart.MultipartFile;
16 |
17 | import java.io.IOException;
18 | import java.util.UUID;
19 |
20 |
21 | @RestController
22 | @RequestMapping("upload")
23 | @Api(tags = "上传图片Api")
24 | public class UploadController {
25 |
26 | @Autowired
27 | private AliossUtils aliossUtils;
28 |
29 | @PostMapping("img")
30 | @ApiOperation("上传图片")
31 | @Limit(time = 1000,value = 3)
32 | public Result upload(@RequestParam("image") MultipartFile file){
33 | //获得文件原始名
34 | String originalFilename = file.getOriginalFilename();
35 | //使用uuid new文件名
36 | String fileName = UUID.randomUUID().toString() + "." + StringUtils.substringAfterLast(originalFilename, ".");
37 | String url="";
38 | try{
39 | url = aliossUtils.upload(file, fileName);
40 | } catch (IOException e) {
41 | e.printStackTrace();
42 | } finally {
43 | if(!StringUtils.isBlank(url)){
44 | return Result.success(url);
45 | }else {
46 | return Result.fail(ErrorCode.UPLOAD_ERROR.getCode(),ErrorCode.UPLOAD_ERROR.getMsg());
47 | }
48 | }
49 |
50 | }
51 | @PostMapping("imglocal")
52 | @ApiOperation("上传图片至本地oss")
53 | @Limit(time = 1000,value = 3)
54 | public Result uploadLocal(@RequestParam("image") MultipartFile file){
55 | //获得文件原始名
56 | String originalFilename = file.getOriginalFilename();
57 | //使用uuid new文件名
58 | String fileName = UUID.randomUUID().toString() + "." + StringUtils.substringAfterLast(originalFilename, ".");
59 | String url="";
60 | try{
61 | url = aliossUtils.saveToLocalfs(file, fileName);
62 | } catch (IOException e) {
63 | e.printStackTrace();
64 | } finally {
65 | if(!StringUtils.isBlank(url)){
66 | return Result.success(url);
67 | }else {
68 | return Result.fail(ErrorCode.UPLOAD_ERROR.getCode(),ErrorCode.UPLOAD_ERROR.getMsg());
69 | }
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/UserController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.ratelimit.Limit;
4 | import com.myblog.adkblog.pojo.User;
5 | import com.myblog.adkblog.service.UserService;
6 | import com.myblog.adkblog.vo.Params.LikeOrCollectParams;
7 | import com.myblog.adkblog.vo.Params.UpdateUserParams;
8 | import com.myblog.adkblog.vo.Common.Result;
9 | import com.myblog.adkblog.vo.Views.UserVo;
10 | import io.swagger.annotations.Api;
11 | import io.swagger.annotations.ApiImplicitParam;
12 | import io.swagger.annotations.ApiImplicitParams;
13 | import io.swagger.annotations.ApiOperation;
14 | import org.springframework.beans.BeanUtils;
15 | import org.springframework.beans.factory.annotation.Autowired;
16 | import org.springframework.web.bind.annotation.*;
17 |
18 | @RestController
19 | @RequestMapping("user")
20 | @Api(tags = "用户信息相关Api")
21 | public class UserController {
22 | @Autowired
23 | private UserService userService;
24 |
25 | @GetMapping("currentUser")
26 | @ApiOperation("根据Token获取当前用户信息")
27 | public Result currentUser(@RequestHeader("Authorization")String token){
28 | return userService.findUserByToken(token);
29 | }
30 |
31 | @GetMapping("user")
32 | @ApiOperation("获取用户ById")
33 | public Result findUserById(@RequestParam Long userId){
34 | User user = userService.findUserById(userId);
35 | UserVo userVo =new UserVo();
36 | BeanUtils.copyProperties(user, userVo);
37 | return Result.success(userVo);
38 | }
39 |
40 | @GetMapping("currentUserAll")
41 | @ApiOperation("获取当前用户所有信息")
42 | public Result findUserById(@RequestHeader("Authorization")String token){
43 | return userService.findUserAllByToken(token);
44 | }
45 |
46 | @PostMapping("updateUserInfo")
47 | @ApiOperation(value = "更新用户信息Api" ,notes = "更新用户信息Api")
48 | @ApiImplicitParams({
49 | @ApiImplicitParam(value = "认证请求头",required = true,paramType = "String")
50 | })
51 | @Limit(time = 60000,value = 3)//一分钟内3次修改
52 | public Result updateUserInfoByToken(@RequestHeader("Authorization")String token,@RequestBody UpdateUserParams updateUserParams){
53 | return userService.updateUserInfoByToken(token,updateUserParams);
54 | }
55 |
56 | @PostMapping("like")
57 | @ApiOperation("点赞文章Api")
58 | public Result likeArticle(@RequestBody LikeOrCollectParams likeParams, @RequestHeader("Authorization")String token){
59 | return userService.likeArticle(likeParams,token);
60 | }
61 | @PostMapping("collect")
62 | @ApiOperation("收藏文章Api")
63 | public Result collectArticle(@RequestBody LikeOrCollectParams likeParams, @RequestHeader("Authorization")String token){
64 | return userService.collectArticle(likeParams,token);
65 | }
66 |
67 | // @PostMapping("collect")
68 | // public Result likeArticle(@RequestBody LikeOrCollectParams likeParams, @RequestHeader("Authorization")String token){
69 | // return userService.likeArticle(likeParams,token);
70 | // }
71 | }
72 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/WebsocketController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.google.gson.Gson;
4 | import com.google.gson.GsonBuilder;
5 |
6 | import com.myblog.adkblog.pojo.User;
7 | import com.myblog.adkblog.pojo.WsMessage;
8 | import com.myblog.adkblog.service.UserService;
9 |
10 | import com.myblog.adkblog.vo.Views.UserVo;
11 | import org.springframework.beans.BeanUtils;
12 | import org.springframework.beans.factory.annotation.Autowired;
13 |
14 | import org.springframework.stereotype.Component;
15 |
16 |
17 | import javax.websocket.*;
18 | import javax.websocket.server.PathParam;
19 | import javax.websocket.server.ServerEndpoint;
20 | import java.util.ArrayList;
21 | import java.util.Map;
22 | import java.util.Set;
23 | import java.util.concurrent.ConcurrentHashMap;
24 |
25 | @ServerEndpoint("/wschat/{username}")
26 | @Component
27 | public class WebsocketController {
28 |
29 | public static UserService userService;
30 |
31 | public static final Map sessionMap=new ConcurrentHashMap<>();
32 |
33 | //由于单例模式和websocket的多对象模式冲突 需要这样注入service对象
34 | @Autowired
35 | public void setApplicationContext(UserService userService){
36 | WebsocketController.userService=userService;
37 | }
38 |
39 | @OnOpen
40 | public void onOpen(Session session, @PathParam("username") String username){
41 | System.out.println(username);
42 | User user = userService.findUserByUsername(username);
43 | if(user==null){
44 | //连接失败 return
45 | return;
46 | }
47 | UserVo userVo = new UserVo();
48 | BeanUtils.copyProperties(user,userVo);
49 | userVo.setId(user.getId().toString());
50 | Gson gson = new GsonBuilder().disableHtmlEscaping().create();;
51 | sessionMap.put(userVo,session);
52 |
53 | WsMessage wsMessage = new WsMessage();
54 | wsMessage.setType(1);
55 | wsMessage.setUserVo(userVo);
56 | ArrayList users = new ArrayList<>();
57 | for (UserVo vo: sessionMap.keySet()) {
58 | users.add(vo);
59 | }
60 |
61 | wsMessage.setMsg(users);
62 | wsMessage.setCreateTime(System.currentTimeMillis());
63 |
64 | String json = gson.toJson(wsMessage);
65 | //广播 所有在线用户 处理
66 | boardcastAllMsg(json);
67 | }
68 |
69 | /**
70 | * 群聊 广播所有客户端 消息
71 | * @param message
72 | */
73 | private void boardcastAllMsg(String message){
74 | Set users = sessionMap.keySet();
75 | try {
76 | for (UserVo user : users) {
77 | Session session = sessionMap.get(user);
78 | session.getBasicRemote().sendText(message);
79 | }
80 | }catch (Exception e){
81 | e.printStackTrace();
82 | }
83 | }
84 |
85 | @OnMessage
86 | public void OnMessage(Session session, @PathParam("username") String username,String message){
87 | User user = userService.findUserByUsername(username);
88 | if(user==null){
89 | //没有找到用户 直接 return
90 | return;
91 | }
92 | UserVo userVo = new UserVo();
93 | BeanUtils.copyProperties(user,userVo);
94 | userVo.setId(user.getId().toString());
95 | //服务端接收到消息
96 | //发送回去 群发回去
97 | WsMessage wsMessage = new WsMessage();
98 | wsMessage.setType(2);
99 | wsMessage.setUserVo(userVo);
100 | wsMessage.setMsg(message);
101 | wsMessage.setCreateTime(System.currentTimeMillis());
102 | boardcastAllMsg(new Gson().toJson(wsMessage));
103 | }
104 |
105 | @OnClose
106 | public void onClose(Session session,@PathParam("username") String username){
107 | WsMessage wsMessage = new WsMessage();
108 | for (UserVo userVo : sessionMap.keySet()) {
109 | if(userVo.getUsername().equals(username)){
110 | wsMessage.setUserVo(userVo);
111 | sessionMap.remove(userVo);
112 | }
113 | }
114 | wsMessage.setType(3);
115 | wsMessage.setMsg(username+"离开了聊天室");
116 | wsMessage.setCreateTime(System.currentTimeMillis());
117 | boardcastAllMsg(new Gson().toJson(wsMessage));
118 | }
119 |
120 | @OnError
121 | public void onError(Throwable throwable) {
122 | throwable.printStackTrace();
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/controller/YhdmController.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.controller;
2 |
3 | import com.myblog.adkblog.common.redis.Cache;
4 | import com.myblog.adkblog.service.YhdmService;
5 | import com.myblog.adkblog.vo.Common.Result;
6 | import io.swagger.annotations.Api;
7 | import io.swagger.annotations.ApiOperation;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.web.bind.annotation.GetMapping;
10 | import org.springframework.web.bind.annotation.RequestMapping;
11 | import org.springframework.web.bind.annotation.RequestParam;
12 | import org.springframework.web.bind.annotation.RestController;
13 |
14 | @RestController
15 | @RequestMapping("yhdm")
16 | @Api(tags = "樱花动漫爬虫Api")
17 | public class YhdmController {
18 | @Autowired
19 | private YhdmService yhdmService;
20 |
21 | /**
22 | * params 分集的数据 分集连接id 然后返回一个video url
23 | * @return url
24 | */
25 | @GetMapping("getvideourl")
26 | @ApiOperation("获取视频URL api")
27 | @Cache(expire = 1000 * 60 * 60 * 24 * 7, name = "yhdm")//由于这种数据一般不会变化 设置七天的缓存
28 | public Result getVideoUrl(@RequestParam String url){
29 | return yhdmService.getVideoUrl(url);
30 | // return Result.success(null);
31 | }
32 |
33 | /**
34 | * 应该返回一个集合 然后取最相关的一个或者两个 并且找到结果 获取分集数据并返回
35 | * @return
36 | */
37 | @GetMapping("getsearchinfo")
38 | @ApiOperation("获取搜索结果 Api")
39 | @Cache(expire = 1000 * 60 * 60 * 24 * 7, name = "yhdm")//由于这种数据一般不会变化 设置七天的缓存
40 | public Result getSearchInfo(@RequestParam String keywords){
41 | return yhdmService.getSearchInfo(keywords);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/ArticleBodyMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 |
4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5 | import com.myblog.adkblog.pojo.ArticleBody;
6 | import org.springframework.stereotype.Repository;
7 |
8 | /**
9 | * 通过继承BaseMapper
10 | * MybatisPlus可以直接封装一个Article的表进去
11 | * 并且不需要写接口,可以直接使用mybatisPlus封装的方法进行查询。
12 | */
13 | @Repository
14 | public interface ArticleBodyMapper extends BaseMapper {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/ArticleIndexViewMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.baomidou.mybatisplus.core.metadata.IPage;
5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 | import com.myblog.adkblog.dao.mapper.dos.GroupByTime;
7 | import com.myblog.adkblog.pojo.Article;
8 | import com.myblog.adkblog.pojo.ArticleIndexView;
9 | import org.springframework.stereotype.Repository;
10 |
11 | import java.util.List;
12 |
13 | @Repository
14 | public interface ArticleIndexViewMapper extends BaseMapper {
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/ArticleMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.baomidou.mybatisplus.core.metadata.IPage;
5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 | import com.myblog.adkblog.dao.mapper.dos.ArticleTip;
7 | import com.myblog.adkblog.dao.mapper.dos.GroupByTime;
8 | import com.myblog.adkblog.pojo.Article;
9 | import org.springframework.stereotype.Repository;
10 |
11 | import java.util.List;
12 |
13 | @Repository
14 | public interface ArticleMapper extends BaseMapper {
15 | IPage listArticle(Page page,Long authorId, List tagIds, String year, String month,String orderRole,String keyword,Integer pannel);
16 |
17 | List getGroupByTime();
18 |
19 | IPage articleTip(Page page, String keyword);
20 |
21 | /**
22 | * 全部选择 祛去除了enable 和isprivate的选项
23 | * @param page
24 | * @param authorId
25 | * @param tagIds
26 | * @param year
27 | * @param month
28 | * @param orderRole
29 | * @param keyword
30 | * @return
31 | */
32 | IPage listAllArticle(Page page,Long authorId, List tagIds, String year, String month,String orderRole,String keyword,Integer pannel);
33 |
34 | // Count selectCountByQuery(Long authorId, Long tagId, String year, String month, String orderRole);
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/ArticleTagMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 |
4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5 | import com.myblog.adkblog.pojo.ArticleTag;
6 | import org.springframework.stereotype.Repository;
7 |
8 | @Repository
9 | public interface ArticleTagMapper extends BaseMapper {
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/ArticleUserCollectMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.myblog.adkblog.pojo.ArticleUserCollect;
5 | import org.springframework.stereotype.Repository;
6 |
7 | @Repository
8 | public interface ArticleUserCollectMapper extends BaseMapper {
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/ArticleUserLikeMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.myblog.adkblog.pojo.ArticleUserLike;
5 | import org.springframework.stereotype.Repository;
6 |
7 | @Repository
8 | public interface ArticleUserLikeMapper extends BaseMapper {
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/BgmCalendarMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.myblog.adkblog.dao.mapper.dos.GroupByTime;
5 | import com.myblog.adkblog.pojo.ArticleUserLike;
6 | import com.myblog.adkblog.pojo.bgm.CalendarItem;
7 | import org.springframework.stereotype.Repository;
8 |
9 | import java.util.List;
10 |
11 | @Repository
12 | public interface BgmCalendarMapper extends BaseMapper {
13 | List selectListByWeekDay(Integer weekday,Long stamp);
14 | CalendarItem selectOneById(Integer id);
15 | void insertOne(CalendarItem item);
16 | void updateOne(CalendarItem item);
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/CommentMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.myblog.adkblog.pojo.Comment;
5 | import org.springframework.stereotype.Repository;
6 |
7 | @Repository
8 | public interface CommentMapper extends BaseMapper {
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/MessageMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.baomidou.mybatisplus.core.metadata.IPage;
5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 | import com.myblog.adkblog.pojo.Article;
7 | import com.myblog.adkblog.pojo.Message;
8 | import org.springframework.stereotype.Repository;
9 |
10 | @Repository
11 | public interface MessageMapper extends BaseMapper {
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/PictureMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.baomidou.mybatisplus.core.metadata.IPage;
5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 | import com.myblog.adkblog.pojo.Article;
7 | import com.myblog.adkblog.pojo.Picture;
8 | import org.springframework.stereotype.Repository;
9 |
10 | @Repository
11 | public interface PictureMapper extends BaseMapper {
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/TagMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.myblog.adkblog.pojo.Tag;
5 | import org.springframework.stereotype.Repository;
6 |
7 | import java.util.List;
8 |
9 | @Repository
10 | public interface TagMapper extends BaseMapper {
11 | List findTagByArticleId(Long articleid);
12 | Integer addTag(String tagName);
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/UserMapper.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper;
2 |
3 | import com.baomidou.mybatisplus.annotation.TableName;
4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5 | import com.myblog.adkblog.pojo.User;
6 | import org.springframework.stereotype.Repository;
7 |
8 | @Repository
9 | @TableName("bgm_calendar")
10 | public interface UserMapper extends BaseMapper {
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/dos/ArticleTip.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper.dos;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class ArticleTip {
7 | String articleName;
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/dos/Count.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper.dos;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class Count {
7 | private Integer count;
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/dao/mapper/dos/GroupByTime.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.dao.mapper.dos;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class GroupByTime {
7 | private String date;
8 | private Integer num;
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/handler/LoginInterceptor.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.handler;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.myblog.adkblog.pojo.User;
5 | import com.myblog.adkblog.service.LoginService;
6 | import com.myblog.adkblog.utils.UserThreadLocal;
7 | import com.myblog.adkblog.vo.Common.ErrorCode;
8 | import com.myblog.adkblog.vo.Common.Result;
9 | import org.apache.commons.lang3.StringUtils;
10 | import org.springframework.beans.factory.annotation.Autowired;
11 | import org.springframework.stereotype.Component;
12 | import org.springframework.web.method.HandlerMethod;
13 | import org.springframework.web.servlet.HandlerInterceptor;
14 |
15 | import javax.servlet.http.HttpServletRequest;
16 | import javax.servlet.http.HttpServletResponse;
17 |
18 | /**
19 | * 登录拦截器
20 | * 用于拦截资源
21 | * 继承HandlerInterceptor这个类
22 | */
23 | @Component
24 | public class LoginInterceptor implements HandlerInterceptor {
25 | @Autowired
26 | private LoginService loginService;
27 |
28 | /**
29 | * 执行方法之前执行该方法 preHandle
30 | * @param request
31 | * @param response
32 | * @param handler
33 | * @return
34 | * @throws Exception
35 | */
36 | @Override
37 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
38 | //1、判断请求的接口路径 是否为controller中的方法
39 | //2、判断token是否为空 为空则进行拦截
40 | //3、使用loginservice中的check进行token认证
41 | //4、写完拦截器后需要到webmvcconfig中配置拦截器,将该类加进去。
42 | if(!(handler instanceof HandlerMethod)){
43 | return true;
44 | }
45 |
46 | String token= request.getHeader("Authorization");
47 |
48 |
49 | if(StringUtils.isBlank(token)){
50 | Result result=Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
51 | response.setContentType("application/json;charset=utf-8");
52 | response.getWriter().print(JSON.toJSONString(result));
53 | return false;
54 | }
55 |
56 | User user = loginService.checkToken(token);
57 |
58 | if(user==null){
59 | Result result=Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
60 | response.setContentType("application/json;charset=utf-8");
61 | response.getWriter().print(JSON.toJSONString(result));
62 | return false;
63 | }
64 |
65 | UserThreadLocal.put(user);
66 | //然后我们就可以在controller层直接获取对象
67 | return true;
68 | }
69 |
70 | @Override
71 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
72 | UserThreadLocal.remove();
73 | }
74 | }
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/Article.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import lombok.AllArgsConstructor;
5 | import lombok.Data;
6 | import lombok.NoArgsConstructor;
7 |
8 | @Data
9 | @AllArgsConstructor
10 | @NoArgsConstructor
11 | @ApiModel("文章实体类")
12 | public class Article {
13 | private Long id;
14 |
15 | private String articleName;
16 |
17 | private String summary;
18 |
19 | private Integer viewCounts;
20 |
21 | private Integer commentCounts;
22 |
23 | private Integer likeCounts;
24 |
25 | private Integer collectCounts;
26 |
27 | private String banner;
28 |
29 | private Long createDate;
30 |
31 | private Long authorId;
32 |
33 | private Long bodyId;
34 | //用于筛选是否为私人文章
35 | private Integer isPrivate;
36 | //用于筛选是否为公开文章
37 | private Integer enable;
38 | //用于筛选板块
39 | private Integer pannel;
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/ArticleBody.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import lombok.AllArgsConstructor;
5 | import lombok.Data;
6 | import lombok.NoArgsConstructor;
7 |
8 | @Data
9 | @AllArgsConstructor
10 | @NoArgsConstructor
11 | @ApiModel("文章详细")
12 | public class ArticleBody {
13 | private Long id;
14 | private String content;
15 | private String html;
16 | private Long articleId;
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/ArticleIndexView.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import com.baomidou.mybatisplus.annotation.TableName;
4 | import lombok.AllArgsConstructor;
5 | import lombok.Data;
6 | import lombok.NoArgsConstructor;
7 |
8 |
9 | public class ArticleIndexView extends Article{
10 | private Integer enableIndex;
11 |
12 | public Integer getEnableIndex() {
13 | return enableIndex;
14 | }
15 |
16 | public void setEnableIndex(Integer enableIndex) {
17 | this.enableIndex = enableIndex;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/ArticleRecord.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Data
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class ArticleRecord {
11 | private Long id;
12 | private Long articleId;
13 | private Long userId;
14 | private Long createTime;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/ArticleTag.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class ArticleTag {
7 | private Long id;
8 |
9 | private Long articleId;
10 |
11 | private Integer tagId;
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/ArticleUserCollect.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 |
8 | public class ArticleUserCollect extends ArticleRecord{
9 |
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/ArticleUserLike.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 |
8 | public class ArticleUserLike extends ArticleRecord {
9 |
10 | }
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/Comment.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Data
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class Comment {
11 | private Long id;
12 | private Long authorId;
13 | private Long parentId;
14 | private Integer level;
15 | private Long createDate;
16 | private String content;
17 | private Long toUid;
18 | private Long articleId;
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/Message.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Data
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class Message {
11 | private Long id;
12 | private String authorName;
13 | private String content;
14 | private String contact;
15 | private String avatar;
16 | private Long createDate;
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/Picture.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class Picture {
7 | private Long id;
8 | private String url;
9 | private Long uid;
10 | private String title;
11 | private String summary;
12 | private Long createTime;
13 | private Integer origin;
14 | private Integer likes;
15 | private Integer tag;
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/Tag.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Data
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class Tag {
11 |
12 | private Integer id;
13 |
14 | private String tagName;
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/User.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Data
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class User {
11 | private Long id;
12 | private String avatar;
13 | private Long date;
14 | private String role;
15 | private String username;
16 | private String password;
17 | private String email;
18 | private String introduce;
19 | private String nickname;
20 | private String banner;
21 | private Integer gender;
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/WsMessage.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo;
2 |
3 | import com.myblog.adkblog.vo.Views.UserVo;
4 | import lombok.Data;
5 |
6 | @Data
7 | public class WsMessage {
8 | //type 1系统消息 2群聊消息
9 | private Integer type;
10 | //如果为null 前端处理
11 | private UserVo userVo;
12 | private T msg;
13 | private Long createTime;
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/pojo/bgm/CalendarItem.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.pojo.bgm;
2 |
3 | import com.baomidou.mybatisplus.annotation.TableName;
4 | import lombok.Data;
5 |
6 | @Data
7 | @TableName("bgm_calendar")
8 | public class CalendarItem {
9 | private Integer id;
10 | private String url;
11 | private Integer type;
12 | private String name;
13 | private String name_cn;
14 | private String summary;
15 | private Integer total;
16 | private Float score;
17 | private Integer rank;
18 | private String large;
19 | private String common;
20 | private String small;
21 | private String medium;
22 | private String grid;
23 | private Integer doing;
24 | private Long air_date;
25 | private Integer air_weekday;
26 | private String count;//直接存放json格式文件
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/ArticleService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Params.ArticleParams;
4 | import com.myblog.adkblog.vo.Params.PageParams;
5 | import com.myblog.adkblog.vo.Common.Result;
6 |
7 | public interface ArticleService {
8 |
9 | Result publish(ArticleParams articleParams);
10 |
11 | Result findArticleById(Long id,String token);
12 |
13 | Result getIndexBanner();
14 |
15 | Result listArticleWithCount(PageParams pageParams);
16 |
17 | void updateViewCountsById(Long id);
18 |
19 | Result getGroupByTime();
20 |
21 | Result getIndexArticle(PageParams pageParams);
22 |
23 | Result getSearchTip(String keyword);
24 |
25 | Result getMyArticles(PageParams pageParams);
26 |
27 | Result updateMyArticle(ArticleParams articleParams);
28 |
29 | Result deleteMyArticle(String articleId);
30 |
31 | Result switchArticleState(String id);
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/AsyncMethod.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | public interface AsyncMethod {
4 |
5 | void setCalendarImg() throws Exception;
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/BgmApiService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Common.Result;
4 |
5 | import java.text.ParseException;
6 |
7 | public interface BgmApiService {
8 |
9 | Result getCalendar();
10 |
11 | Result getSubjectByV0(int subjectId);
12 |
13 | Result getSubject(int subjectId, String responseGroup, String timestamp);
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/BgmRankService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Params.BgmBrowserParams;
4 | import com.myblog.adkblog.vo.Common.Result;
5 |
6 | public interface BgmRankService {
7 | Result getBrowser(BgmBrowserParams bgmBrowserParams);
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/CollectOrLikeService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Views.ArticleVo;
4 | import com.myblog.adkblog.vo.Common.ListInfoVo;
5 | import com.myblog.adkblog.vo.Params.PageParams;
6 | import com.myblog.adkblog.vo.Common.Result;
7 |
8 | public interface CollectOrLikeService {
9 |
10 | Result> getMyCollect(PageParams pageParams, String token);
11 |
12 | Result> getMyLiked(PageParams pageParams, String token);
13 |
14 | Result deleteMyCollect(String articleId, String token);
15 |
16 | Result deleteMyLiked(String articleId, String token);
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/CommentService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Views.CommentVo;
4 | import com.myblog.adkblog.vo.Params.CommentParams;
5 | import com.myblog.adkblog.vo.Params.PageParams;
6 | import com.myblog.adkblog.vo.Common.Result;
7 |
8 | import java.util.List;
9 |
10 | public interface CommentService {
11 | Result addComment(CommentParams commentParams);
12 |
13 | Result findCommentByArticleId(Long id, PageParams pageParams);
14 |
15 | List findCommentsByParentId(Long id);
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/AsyncMethodImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.myblog.adkblog.dao.mapper.BgmCalendarMapper;
4 | import com.myblog.adkblog.pojo.bgm.CalendarItem;
5 | import com.myblog.adkblog.service.AsyncMethod;
6 | import com.myblog.adkblog.utils.AliossUtils;
7 | import com.myblog.adkblog.utils.Myutils;
8 | import com.myblog.adkblog.utils.SaveImg;
9 | import org.springframework.beans.factory.annotation.Autowired;
10 | import org.springframework.scheduling.annotation.Async;
11 | import org.springframework.stereotype.Service;
12 |
13 | import java.util.List;
14 |
15 | @Service
16 | public class AsyncMethodImpl implements AsyncMethod {
17 | @Autowired
18 | private AliossUtils aliossUtils;
19 | @Autowired
20 | private BgmCalendarMapper bgmCalendarMapper;
21 | @Autowired
22 | private SaveImg saveImg;
23 | @Async("saveImg")
24 | public void setCalendarImg() throws Exception {
25 | System.out.println("线程开始-------------------------------"+Thread.currentThread().getName()+Thread.currentThread().isAlive());
26 | for (int i = 1; i <= 7; i++){
27 | Long timestamp = Myutils.getTimestamp();
28 | //在run方法填写要执行的操作
29 | List calendarItems = bgmCalendarMapper.selectListByWeekDay(i,timestamp);
30 | for (CalendarItem calendarItem : calendarItems) {
31 | //反正这个只是后台跑的线程 我知道这样好像有点shit 不过随便了
32 | calendarItem.setCommon(aliossUtils.uploadBgmImage(saveImg.saveImgLocal(calendarItem.getCommon())));;
33 | calendarItem.setLarge(aliossUtils.uploadBgmImage(saveImg.saveImgLocal(calendarItem.getLarge())));;
34 | calendarItem.setGrid(aliossUtils.uploadBgmImage(saveImg.saveImgLocal(calendarItem.getGrid())));;
35 | calendarItem.setMedium(aliossUtils.uploadBgmImage(saveImg.saveImgLocal(calendarItem.getMedium())));;
36 | calendarItem.setSmall(aliossUtils.uploadBgmImage(saveImg.saveImgLocal(calendarItem.getSmall())));;
37 | bgmCalendarMapper.updateOne(calendarItem);
38 | }
39 | }
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/BgmApiServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.myblog.adkblog.dao.mapper.BgmCalendarMapper;
5 | import com.myblog.adkblog.pojo.bgm.CalendarItem;
6 | import com.myblog.adkblog.service.AsyncMethod;
7 | import com.myblog.adkblog.service.BgmApiService;
8 | import com.myblog.adkblog.utils.AliossUtils;
9 | import com.myblog.adkblog.utils.Myutils;
10 | import com.myblog.adkblog.utils.SaveImg;
11 | import com.myblog.adkblog.utils.SpiderUtils;
12 | import com.myblog.adkblog.vo.Common.ErrorCode;
13 | import com.myblog.adkblog.vo.Common.Result;
14 | import com.myblog.adkblog.vo.Transfer.*;
15 | import com.myblog.adkblog.vo.Views.CalendarVo;
16 | import lombok.SneakyThrows;
17 | import org.springframework.beans.BeanUtils;
18 | import org.springframework.beans.factory.annotation.Autowired;
19 | import org.springframework.scheduling.annotation.Async;
20 | import org.springframework.stereotype.Service;
21 | import java.text.DateFormat;
22 | import java.text.ParseException;
23 | import java.text.SimpleDateFormat;
24 | import java.util.ArrayList;
25 | import java.util.Calendar;
26 | import java.util.Date;
27 | import java.util.List;
28 | import java.util.concurrent.Callable;
29 | import java.util.concurrent.FutureTask;
30 |
31 | @Service
32 | public class BgmApiServiceImpl implements BgmApiService {
33 |
34 | @Autowired
35 | private SpiderUtils spiderUtils;
36 | @Autowired
37 | private BgmCalendarMapper bgmCalendarMapper;
38 | @Autowired
39 | private AsyncMethod asyncMethod;
40 | @Override
41 | public Result getCalendar() {
42 | //可以预想一件事情 那就是只在1月 4月 7月 10月 接口的信息才会有更新 那么就可以在分别特定的时刻 去请求接口
43 | //并且保存到数据库中 (避免网络请求
44 | //所以就把所有的网络请求封装到一个类中 (称之为工具类 使用这个类来统一进行网络请求)
45 | //定义一个二维数组 常量 用于存放数据
46 | String ja[] = {"月耀日", "火耀日", "水耀日", "木耀日", "金耀日", "土耀日", "日耀日"};
47 | String cn[] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
48 | String en[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
49 | //数据库操作
50 | try {
51 | ArrayList resList = new ArrayList<>();
52 | for (int i = 1; i <= 7; i++) {
53 | WeekDay weekDay = new WeekDay();
54 | weekDay.setCn(cn[i - 1]);
55 | weekDay.setEn(en[i - 1]);
56 | weekDay.setJa(ja[i - 1]);
57 | weekDay.setId(i);
58 | CalendarVo res = new CalendarVo();
59 | res.setWeekday(weekDay);
60 | //这里进行数据库操作 将所有weekday一样的拿出来
61 | //====================================================================================
62 | Long timestamp = Myutils.getTimestamp();
63 | List calendarItems =
64 | bgmCalendarMapper.selectListByWeekDay(i,timestamp);
65 | res.setItems(copyList(calendarItems));
66 | resList.add(res);
67 | }
68 | //如果数据库中没有获取到数据 或者说 时间隔得太久远了 (15天以上 那么就要去网络请求新的数据更新数据库)
69 | //但是由于这个需求有点玄学 那就设置为 每个月固定几天会刷新(所以这里缓存就要设置的时间短一点)
70 | Boolean needFlush=false;
71 | Calendar calendar = Calendar.getInstance();
72 | int date = calendar.get(Calendar.DATE);
73 | if(date==1||date==15||date==28||date==30||date==7||date==21){
74 | needFlush=true;
75 | }
76 | for (CalendarVo calendarVo : resList) {
77 | if(calendarVo.getItems().size()==0)
78 | needFlush=true;
79 | }
80 | if(needFlush) {
81 | //这个是从网络获取到的最新数据 将最新的数据 全部更新到数据库中 (覆盖或者保存)
82 | ArrayList calendarVo = spiderUtils.getClaendarApi();
83 | for (CalendarVo vo : calendarVo) {
84 | for (CalendarItemVo item : vo.getItems()) {
85 | CalendarItem calendarItem = new CalendarItem();
86 | BeanUtils.copyProperties(item,calendarItem);
87 | calendarItem.setAir_date(Myutils.getTimestamp(item.getAir_date()));
88 | if(item.getCollection()!=null){
89 | calendarItem.setDoing(item.getCollection().getDoing());
90 | }
91 | if(item.getImages()!=null){
92 | calendarItem.setCommon(item.getImages().getCommon());
93 | calendarItem.setLarge(item.getImages().getLarge());
94 | calendarItem.setGrid(item.getImages().getGrid());
95 | calendarItem.setMedium(item.getImages().getMedium());
96 | calendarItem.setSmall(item.getImages().getSmall());
97 | }
98 | if(item.getRating()!=null){
99 | calendarItem.setScore(item.getRating().getScore());
100 | calendarItem.setTotal(item.getRating().getTotal());
101 | calendarItem.setCount(item.getRating().getCount().toString());
102 | }
103 | CalendarItem has = bgmCalendarMapper.selectOneById(item.getId());
104 | if(has==null){
105 | bgmCalendarMapper.insertOne(calendarItem);
106 | }else{
107 | bgmCalendarMapper.updateOne(calendarItem);
108 | }
109 | }
110 | }
111 | // asyncMethod.setCalendarImg();
112 | Result success = Result.success(calendarVo);
113 | return success;
114 | }else {
115 | return Result.success(resList);
116 | }
117 | } catch (Exception e) {
118 | e.printStackTrace();
119 | return Result.fail(ErrorCode.API_ERROR.getCode(), ErrorCode.API_ERROR.getMsg());
120 | }
121 | }
122 |
123 | @Override
124 | public Result getSubjectByV0(int subjectId) {
125 | String path ="/v0/subjects/" + subjectId;
126 | try{
127 | Object subjectV0 = spiderUtils.getSubjectByPath(path);
128 | return Result.success(subjectV0);
129 | }catch (Exception e){
130 | e.printStackTrace();
131 | return Result.fail(ErrorCode.API_ERROR.getCode(), ErrorCode.API_ERROR.getMsg());
132 | }
133 | }
134 | @Override
135 | public Result getSubject(int subjectId, String responseGroup, String timestamp) {
136 | String path ="/subject/" + subjectId + "?" + "responseGroup=" + responseGroup;
137 | if (timestamp != null) {
138 | path += "&" + "timestamp=" + timestamp;
139 | }
140 | try {
141 | Object subject = spiderUtils.getSubjectByPath(path);
142 | return Result.success(subject);
143 | } catch (Exception e) {
144 | e.printStackTrace();
145 | return Result.fail(ErrorCode.API_ERROR.getCode(), ErrorCode.API_ERROR.getMsg());
146 | }
147 | }
148 |
149 |
150 | /**
151 | * 用于复制每一个数据库中存放的calendarItem 将其转换为页面显示的vo
152 | *
153 | * @param calendarItem
154 | * @return CalendarItemVo
155 | */
156 | private CalendarItemVo copy(CalendarItem calendarItem) throws ParseException {
157 | CalendarItemVo copyItem = new CalendarItemVo();
158 | BeanUtils.copyProperties(calendarItem,copyItem);
159 | //处理不能处理的 例如 时间戳的转换
160 | copyItem.setAir_date(Myutils.getTime(calendarItem.getAir_date()));
161 | BgmImages bgmImages = new BgmImages();
162 | bgmImages.setCommon(calendarItem.getCommon());
163 | bgmImages.setGrid(calendarItem.getGrid());
164 | bgmImages.setLarge(calendarItem.getLarge());
165 | bgmImages.setMedium(calendarItem.getMedium());
166 | bgmImages.setSmall(calendarItem.getSmall());
167 | copyItem.setImages(bgmImages);
168 | Rating rating = new Rating();
169 | rating.setCount(JSON.parse(calendarItem.getCount()));
170 | rating.setScore(calendarItem.getScore());
171 | rating.setTotal(calendarItem.getTotal());
172 | copyItem.setRating(rating);
173 | BgmCollections bgmCollections = new BgmCollections();
174 | bgmCollections.setDoing(calendarItem.getDoing());
175 | copyItem.setCollection(bgmCollections);
176 | return copyItem;
177 | }
178 |
179 | private List copyList(List calendarItemList) throws ParseException {
180 | ArrayList res = new ArrayList<>();
181 | for (CalendarItem calendarItem : calendarItemList) {
182 | res.add(copy(calendarItem));
183 | }
184 | return res;
185 | }
186 |
187 | }
188 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/BgmRankServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.myblog.adkblog.service.BgmRankService;
4 | import com.myblog.adkblog.vo.Views.BgmRankVo;
5 | import com.myblog.adkblog.vo.Common.ErrorCode;
6 | import com.myblog.adkblog.vo.Common.ListInfoVo;
7 | import com.myblog.adkblog.vo.Params.BgmBrowserParams;
8 | import com.myblog.adkblog.vo.Common.Result;
9 | import org.jsoup.Connection;
10 | import org.jsoup.Jsoup;
11 | import org.jsoup.nodes.Document;
12 | import org.jsoup.nodes.Element;
13 | import org.jsoup.select.Elements;
14 | import org.springframework.stereotype.Service;
15 |
16 | import java.io.IOException;
17 | import java.util.ArrayList;
18 |
19 | import static com.myblog.adkblog.utils.Myutils.getNumInString;
20 | import static com.myblog.adkblog.utils.Myutils.getRandomNum;
21 |
22 |
23 | @Service
24 | public class BgmRankServiceImpl implements BgmRankService {
25 | private String baseUrl="https://bgm.tv/anime/browser";
26 | // private String baseUrl="https://baidu.com";
27 | private String[] userAgents={"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
28 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0",
29 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36",
30 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
31 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
32 | "Mozilla/5.0 (Linux; Android 10; HLK-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.92 Mobile Safari/537.36",
33 | "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"};
34 | @Override
35 | public Result getBrowser(BgmBrowserParams bgmBrowserParams) {
36 | //获取首页以及排名等
37 | //拼接规则 type 直接是path拼接上去 如果有airtime 则加上airtimepath 后面加上参数
38 | //也就是:https://bgm.tv/anime/browser/(type)/(airtime)/(airtime-value)?(sort=?)&(page=?)&(orderby=?)
39 |
40 | //3.24 更新 前面的anime 其实是一个大类 有anime real music等
41 | //还需要改掉这个大类别
42 | ArrayList results = new ArrayList<>();
43 | ListInfoVo listInfoVo = new ListInfoVo<>();
44 | try {
45 | String url=baseUrl;
46 | if(bgmBrowserParams.getBigType()!=null){
47 | url=String.format("https://bgm.tv/%s/browser,",bgmBrowserParams.getBigType());
48 | }
49 | if(bgmBrowserParams.getTag()!=null){
50 | //需要去掉browser 并且加上/tag/? 并且这里的animetype是不起作用的
51 | url=url.replace("browser","tag/");
52 | url+=bgmBrowserParams.getTag();
53 | }
54 | if(bgmBrowserParams.getType()!=null){
55 | url+="/"+bgmBrowserParams.getType();
56 | }
57 | if(bgmBrowserParams.getAirtime()!=null){
58 | url+="/airtime/"+bgmBrowserParams.getAirtime();
59 | }
60 | Connection connection = Jsoup.connect(url);
61 | connection.userAgent(userAgents[getRandomNum(userAgents.length)]);
62 | connection.timeout(8000);
63 | if(bgmBrowserParams.getPage()!=null){
64 | connection.data("page",bgmBrowserParams.getPage().toString());
65 | }
66 | if(bgmBrowserParams.getOrder()!=null){
67 | connection.data("orderby",bgmBrowserParams.getOrder());
68 | }
69 | if(bgmBrowserParams.getSort()!=null){
70 | connection.data("sort",bgmBrowserParams.getSort());
71 | }
72 | Document doc = connection.get();
73 | //开始爬虫
74 | Element browserItemList = doc.getElementById("browserItemList");
75 | Elements items = browserItemList.getElementsByTag("li");
76 | for (Element item : items) {
77 | BgmRankVo bgmRankVo = new BgmRankVo();
78 | bgmRankVo.setId(Integer.parseInt(item.attr("id").split("_")[1]));
79 | //获取下面的a标签
80 | Element imgAtag = item.getElementsByTag("a").get(0);
81 | String src = imgAtag.select(".image img").attr("src");
82 | //处理图片链接
83 | StringBuffer sb=new StringBuffer(src);
84 | sb.insert(0,"https:");
85 | bgmRankVo.setImageUrl(sb.toString());
86 | //获取信息
87 | Elements innerTitle = item.select(".inner h3");
88 | Elements small = innerTitle.select("small");
89 | String name="";
90 | String nameCn="";
91 | if(!small.isEmpty()){
92 | name=small.get(0).text();
93 | nameCn=innerTitle.select("a").get(0).text();
94 | }else{
95 | //只有原名 没有译名
96 | name=innerTitle.get(0).text();
97 | }
98 | bgmRankVo.setNameCn(nameCn);
99 | bgmRankVo.setName(name);
100 | //获取排名
101 | Elements rank = item.select(".inner .rank");
102 | if(!rank.isEmpty()){
103 | String rankText = rank.text();
104 | int rankReal = getNumInString(rankText);
105 | bgmRankVo.setRank(rankReal);
106 | }
107 | //获取缩略信息
108 | Elements info = item.select(".inner .info");
109 | if(!info.isEmpty()){
110 | String infoDetail = info.get(0).text();
111 | bgmRankVo.setInfoTip(infoDetail);
112 | }
113 | //获取评分
114 | Elements rate = item.select(".inner .rateInfo");
115 | if(!rate.isEmpty()){
116 | Elements score = rate.select(".fade");
117 | if(!score.isEmpty()){
118 | bgmRankVo.setScore(Double.parseDouble(score.get(0).text()));
119 | }
120 | Elements counts = rate.select(".tip_j");
121 | if(!counts.isEmpty()){
122 | int count = getNumInString(counts.get(0).text());
123 | bgmRankVo.setCount(count);
124 | }
125 | }
126 | results.add(bgmRankVo);
127 | }
128 | //爬取页数
129 | int pageTotal=0;
130 | Elements page_inner = doc.getElementsByClass("page_inner");
131 | if(!page_inner.isEmpty()){
132 | String[] num = page_inner.get(0).text().split("/");
133 | if(num.length==1){
134 | //少于10页 直接获取>>后的
135 | char a=num[0].charAt(num[0].indexOf('›')-1);
136 | int i = Integer.parseInt(String.valueOf(a));
137 | pageTotal=i;
138 | }else{
139 | pageTotal =getNumInString(num[1]);
140 | }
141 | }
142 | listInfoVo.setPages(pageTotal);
143 | }catch (IOException e){
144 | System.out.println(e);
145 | return Result.fail(ErrorCode.TIME_OUT.getCode(),ErrorCode.TIME_OUT.getMsg());
146 | }
147 | listInfoVo.setResults(results);
148 | return Result.success(listInfoVo);
149 | }
150 |
151 |
152 |
153 |
154 |
155 | }
156 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/CollectOrLikeServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
5 | import com.myblog.adkblog.dao.mapper.ArticleMapper;
6 | import com.myblog.adkblog.dao.mapper.ArticleUserCollectMapper;
7 | import com.myblog.adkblog.dao.mapper.ArticleUserLikeMapper;
8 | import com.myblog.adkblog.pojo.*;
9 | import com.myblog.adkblog.service.CollectOrLikeService;
10 | import com.myblog.adkblog.service.LoginService;
11 | import com.myblog.adkblog.service.TagService;
12 | import com.myblog.adkblog.service.UserService;
13 | import com.myblog.adkblog.vo.Common.ErrorCode;
14 | import com.myblog.adkblog.vo.Common.ListInfoVo;
15 | import com.myblog.adkblog.vo.Common.Result;
16 | import com.myblog.adkblog.vo.Params.PageParams;
17 | import com.myblog.adkblog.vo.Views.ArticleVo;
18 | import com.myblog.adkblog.vo.Views.UserVo;
19 | import org.joda.time.DateTime;
20 | import org.springframework.beans.BeanUtils;
21 | import org.springframework.beans.factory.annotation.Autowired;
22 | import org.springframework.stereotype.Service;
23 |
24 | import java.util.ArrayList;
25 | import java.util.List;
26 |
27 | @Service
28 | public class CollectOrLikeServiceImpl implements CollectOrLikeService {
29 |
30 | @Autowired
31 | private LoginService loginService;
32 | @Autowired
33 | private ArticleUserCollectMapper articleUserCollectMapper;
34 | @Autowired
35 | private ArticleUserLikeMapper articleUserLikeMapper;
36 | @Autowired
37 | private ArticleMapper articleMapper;
38 | @Autowired
39 | private TagService tagService;
40 | @Autowired
41 | private UserService userService;
42 | @Override
43 | public Result> getMyCollect(PageParams pageParams, String token) {
44 | Page page=new Page<>(pageParams.getPage(),pageParams.getPagesize());
45 | ListInfoVo infoVo = new ListInfoVo<>();
46 | User user = loginService.checkToken(token);
47 | if(user==null){
48 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
49 | }
50 | LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
51 | queryWrapper.eq(ArticleUserCollect::getUserId,user.getId());
52 | Page articleUserCollectPage = articleUserCollectMapper.selectPage(page, queryWrapper);
53 | List records = articleUserCollectPage.getRecords();
54 | ArrayList collectIds = new ArrayList<>();
55 |
56 | for (ArticleUserCollect record : records) {
57 | collectIds.add(record.getArticleId());
58 | }
59 | //这里获取到了 所有的收藏的时间点
60 | if(records.size()==0) {
61 | infoVo.setLength((long) 0);
62 | return Result.success(infoVo);
63 | }
64 | List articles = articleMapper.selectBatchIds(collectIds);
65 | //统一不需要body 所以都设置为null
66 | List articleVos = copyList(articles,records);
67 | infoVo.setResults(articleVos);
68 | infoVo.setLength(articleUserCollectPage.getTotal());
69 |
70 | return Result.success(infoVo);
71 | }
72 |
73 | @Override
74 | public Result> getMyLiked(PageParams pageParams, String token) {
75 | Page page=new Page<>(pageParams.getPage(),pageParams.getPagesize());
76 | ListInfoVo infoVo = new ListInfoVo<>();
77 | User user = loginService.checkToken(token);
78 | if(user==null){
79 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
80 | }
81 | LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
82 | queryWrapper.eq(ArticleUserLike::getUserId,user.getId());
83 | Page articleUserLikePage = articleUserLikeMapper.selectPage(page, queryWrapper);
84 | List records = articleUserLikePage.getRecords();
85 | ArrayList collectIds = new ArrayList<>();
86 |
87 | for (ArticleUserLike record : records) {
88 | collectIds.add(record.getArticleId());
89 | }
90 | //这里获取到了 所有的收藏的时间点
91 | if(records.size()==0) {
92 | infoVo.setLength((long) 0);
93 | return Result.success(infoVo);
94 | }
95 | List articles = articleMapper.selectBatchIds(collectIds);
96 | //统一不需要body 所以都设置为null
97 | List articleVos = copyList(articles,records);
98 |
99 | infoVo.setResults(articleVos);
100 | infoVo.setLength(articleUserLikePage.getTotal());
101 |
102 | return Result.success(infoVo);
103 | }
104 |
105 | @Override
106 | public Result deleteMyCollect(String articleId, String token) {
107 | User user = loginService.checkToken(token);
108 | if(user==null){
109 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
110 | }
111 | LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
112 | lambdaQueryWrapper.eq(ArticleUserCollect::getArticleId,Long.valueOf(articleId));
113 | lambdaQueryWrapper.eq(ArticleUserCollect::getUserId,user.getId());
114 | articleUserCollectMapper.delete(lambdaQueryWrapper);
115 | return Result.success(null);
116 | }
117 |
118 | @Override
119 | public Result deleteMyLiked(String articleId, String token) {
120 | User user = loginService.checkToken(token);
121 | if(user==null){
122 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
123 | }
124 | LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
125 | lambdaQueryWrapper.eq(ArticleUserLike::getArticleId,Long.valueOf(articleId));
126 | lambdaQueryWrapper.eq(ArticleUserLike::getUserId,user.getId());
127 | articleUserLikeMapper.delete(lambdaQueryWrapper);
128 | return Result.success(null);
129 | }
130 |
131 | /**
132 | * 由于不需要很多多余的信息 所以直接返回一个简单的vo即可
133 | * @param article
134 | * @return
135 | */
136 | private ArticleVo copy(Article article){
137 | ArticleVo articleVo = new ArticleVo();
138 | BeanUtils.copyProperties(article,articleVo);
139 | //将查到的long型的数据转换为string赋值给前端展示对象
140 | String id=article.getId().toString();
141 | articleVo.setId(id);
142 | //该工具类可以将不同bean相同的属性copy过去,但是类型不同是不可以copy的
143 | //手动将日期的long类型转换为字符串
144 | articleVo.setCreateDate(new DateTime(article.getCreateDate()).toString("yyyy-MM-dd HH:mm"));
145 | //由于并不是所有的接口都需要作者名和标签名
146 | //因此设置两个参数 isTag和isAuthor 来判断是否设置这两个参数
147 | Long articleid=article.getId();
148 | articleVo.setTags(tagService.findTagByArticleId(articleid));
149 | articleVo.setIsCollected(true);
150 | //获取作者 信息
151 | Long authorId = article.getAuthorId();
152 | UserVo userVo = userService.findUserVoById(authorId);
153 | articleVo.setAuthorVo(userVo);
154 | articleVo.setAuthor(userVo.getUsername());
155 | return articleVo;
156 | }
157 |
158 | private List copyList(List list,List records){
159 | ArrayList res = new ArrayList<>();
160 | for (int i=0;i page=new Page<>(pageParams.getPage(),pageParams.getPagesize());
61 | LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
62 | //如果 指定按时间排序 那么按照倒序
63 | queryWrapper.eq(Comment::getArticleId,id);
64 | queryWrapper.eq(Comment::getLevel,1);
65 | if(pageParams.getOrderRole()!=null&& pageParams.getOrderRole().equals("a")){
66 | queryWrapper.orderByAsc(Comment::getCreateDate);
67 | }else {
68 | queryWrapper.orderByDesc(Comment::getCreateDate);
69 | }
70 | //分页 不需要条件 选择十条即可
71 | IPage commentIPage = commentMapper.selectPage(page,queryWrapper);
72 | //获取到records
73 | List records = commentIPage.getRecords();
74 | List commentVoList=copyList(records);
75 | ListInfoVo commentVoListInfoVo = new ListInfoVo<>();
76 | commentVoListInfoVo.setResults(commentVoList);
77 | commentVoListInfoVo.setLength(commentIPage.getTotal());
78 | return Result.success(commentVoListInfoVo);
79 | }
80 |
81 | @Override
82 | public List findCommentsByParentId(Long id) {
83 | LambdaQueryWrapper queryWrapper=new LambdaQueryWrapper<>();
84 | queryWrapper.eq(Comment::getParentId,id);
85 | queryWrapper.eq(Comment::getLevel,2);
86 | queryWrapper.orderByAsc(Comment::getCreateDate);
87 | List commentList = commentMapper.selectList(queryWrapper);
88 | List commentVoList=copyList(commentList);
89 | return commentVoList;
90 | }
91 |
92 | private List copyList(List commentList) {
93 | List commentVoList=new ArrayList<>();
94 | for (Comment comment:commentList){
95 | commentVoList.add(copy(comment));
96 | }
97 | return commentVoList;
98 | }
99 |
100 | private CommentVo copy(Comment comment) {
101 | CommentVo commentVo=new CommentVo();
102 | BeanUtils.copyProperties(comment,commentVo);
103 | commentVo.setCreateDate(new DateTime(comment.getCreateDate()).toString("yyyy-MM-dd HH:mm"));
104 | commentVo.setId(comment.getId().toString());
105 | //作者信息
106 | Long authorId = comment.getAuthorId();
107 | UserVo userVo = userService.findUserVoById(authorId);
108 | commentVo.setUser(userVo);
109 | //子评论
110 | Integer level = comment.getLevel();
111 | if (level==1){
112 | Long id2 =comment.getId();
113 | List commentVoList=findCommentsByParentId(id2);
114 | commentVo.setChildrens(commentVoList);
115 | }
116 | if(level>1){
117 | Long toUid = comment.getToUid();
118 | UserVo toUser = userService.findUserVoById(toUid);
119 | commentVo.setToUser(toUser);
120 | }
121 | return commentVo;
122 | }
123 |
124 |
125 | }
126 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/LoginServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.myblog.adkblog.dao.mapper.UserMapper;
5 | import com.myblog.adkblog.pojo.User;
6 | import com.myblog.adkblog.service.LoginService;
7 | import com.myblog.adkblog.service.UserService;
8 | import com.myblog.adkblog.utils.JWTUtils;
9 | import com.myblog.adkblog.utils.UserThreadLocal;
10 | import com.myblog.adkblog.vo.Common.ErrorCode;
11 | import com.myblog.adkblog.vo.Params.LoginParams;
12 | import com.myblog.adkblog.vo.Params.RegisterParams;
13 | import com.myblog.adkblog.vo.Common.Result;
14 | import org.apache.commons.codec.digest.DigestUtils;
15 | import org.apache.commons.lang3.StringUtils;
16 | import org.springframework.beans.factory.annotation.Autowired;
17 | import org.springframework.data.redis.core.RedisTemplate;
18 | import org.springframework.stereotype.Service;
19 |
20 | import java.util.Map;
21 | import java.util.concurrent.TimeUnit;
22 |
23 | @Service
24 | public class LoginServiceImpl implements LoginService {
25 | @Autowired
26 | private UserService userService;
27 | @Autowired
28 | private UserMapper userMapper;
29 | @Autowired
30 | private RedisTemplate redisTemplate;
31 |
32 | private static final String slat = "adkblog@@#!%$%#%$12";
33 |
34 | @Override
35 | public Result login(LoginParams loginParams) {
36 | String username = loginParams.getUsername();
37 | String password = loginParams.getPassword();
38 | if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
39 | return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMsg());
40 | }
41 | password = DigestUtils.md5Hex(password + slat);
42 | User user = userService.findUser(username, password);
43 | if (user == null) {
44 | return Result.fail(ErrorCode.ACCOUNT_PWD_NOT_EXIST.getCode(), ErrorCode.ACCOUNT_PWD_NOT_EXIST.getMsg());
45 | }
46 | String token = JWTUtils.createToken(user.getId());
47 | if (!StringUtils.isBlank(redisTemplate.opsForValue().get("TOKEN_" + token))) {
48 | return Result.fail(ErrorCode.IS_LOGINING.getCode(), ErrorCode.IS_LOGINING.getMsg());
49 | }
50 | //redis 中默认设置一天过期
51 | redisTemplate.opsForValue().set("TOKEN_" + token, JSON.toJSONString(user), 5, TimeUnit.DAYS);
52 |
53 | return Result.success(token);
54 | }
55 |
56 | @Override
57 | public Result register(RegisterParams registerParams) {
58 | String username=registerParams.getUsername();
59 | String password=registerParams.getPassword();
60 | String nickname=registerParams.getNickname();
61 | if (StringUtils.isBlank(username)||StringUtils.isBlank(password)){
62 | return Result.fail(ErrorCode.ACCOUNT_PWD_NOT_EXIST.getCode(),ErrorCode.ACCOUNT_PWD_NOT_EXIST.getMsg());
63 | }
64 |
65 | User user=userService.findUserByUsername(username);
66 | if(user!=null){
67 | return Result.fail(ErrorCode.ACCOUNT_EXIST.getCode(),ErrorCode.ACCOUNT_EXIST.getMsg());
68 | }
69 | User newer=new User();
70 | newer.setAvatar("/default_avatar.png");
71 | newer.setUsername(registerParams.getUsername());
72 | newer.setPassword(DigestUtils.md5Hex(registerParams.getPassword()+slat));
73 | newer.setNickname(registerParams.getNickname());
74 | newer.setDate(System.currentTimeMillis());
75 | newer.setRole("GUEST");
76 | newer.setBanner("/default_banner.png");
77 | newer.setIntroduce("用一句话介绍自己吧~");
78 | newer.setGender(1);
79 | userService.saveUser(newer);
80 | //通过jwt加密用户类 并获取token
81 | String token = JWTUtils.createToken(newer.getId());
82 |
83 | //redis 中默认设置一天过期
84 | redisTemplate.opsForValue().set("TOKEN_" + token, JSON.toJSONString(newer), 1, TimeUnit.DAYS);
85 |
86 | return Result.success(token);
87 | }
88 |
89 | @Override
90 | public User checkToken(String token) {
91 | if (StringUtils.isBlank(token)) {
92 | return null;
93 | }
94 | //使用jwtutils来进行token的检验,若不合法则返回空值
95 | Map map = JWTUtils.checkToken(token);
96 | if (map == null) {
97 | return null;
98 | }
99 | //去redis 取出用户的信息缓存
100 | String userJson = redisTemplate.opsForValue().get("TOKEN_" + token);
101 | if (StringUtils.isBlank(userJson)) {
102 | return null;
103 | }
104 | //用阿里巴巴的fastjson将字符串解析成对象
105 | User user = JSON.parseObject(userJson, User.class);
106 | //update in 2022.6.15 引入redis
107 | //暂时不用redis 直接解析去mysql中获取
108 | //User user = userMapper.selectById((Serializable) map.get("userId"));
109 | return user;
110 | }
111 |
112 | @Override
113 | public Result logout(String token) {
114 | User user = UserThreadLocal.get();
115 | redisTemplate.delete("TOKEN_"+token);
116 | return Result.success(null);
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/MessageServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 | import com.baomidou.mybatisplus.core.metadata.IPage;
5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 | import com.myblog.adkblog.dao.mapper.MessageMapper;
7 | import com.myblog.adkblog.pojo.Message;
8 | import com.myblog.adkblog.service.MessageService;
9 | import com.myblog.adkblog.vo.Common.ErrorCode;
10 | import com.myblog.adkblog.vo.Common.ListInfoVo;
11 | import com.myblog.adkblog.vo.Views.MessageVo;
12 | import com.myblog.adkblog.vo.Params.MessageParams;
13 | import com.myblog.adkblog.vo.Params.PageParams;
14 | import com.myblog.adkblog.vo.Common.Result;
15 | import org.joda.time.DateTime;
16 | import org.springframework.beans.BeanUtils;
17 | import org.springframework.beans.factory.annotation.Autowired;
18 | import org.springframework.stereotype.Service;
19 |
20 | import java.util.ArrayList;
21 | import java.util.List;
22 |
23 | @Service
24 | public class MessageServiceImpl implements MessageService {
25 | @Autowired
26 | private MessageMapper messageMapper;
27 | @Override
28 | public Result addMessage(MessageParams messageParams) {
29 | if(messageParams.getAuthorName()==null ||messageParams.getContent()==null || messageParams.getContact()==null){
30 | return Result.fail(ErrorCode.PARAMS_ERROR.getCode(),ErrorCode.PARAMS_ERROR.getMsg());
31 | }
32 | Message message = new Message();
33 | //头像为空 默认设置为该路径
34 | if(messageParams.getAvatar()==null){
35 | messageParams.setAvatar("/default_avatar.png");
36 | }
37 | BeanUtils.copyProperties(messageParams,message);
38 | message.setCreateDate(System.currentTimeMillis());
39 | messageMapper.insert(message);
40 | return Result.success(null);
41 | }
42 |
43 | @Override
44 | public Result getMessage(PageParams pageParams) {
45 | //分页插件
46 | Page page=new Page<>(pageParams.getPage(),pageParams.getPagesize());
47 | LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
48 | //如果 指定按时间排序 那么按照倒序
49 | if(pageParams.getOrderRole()!=null&& pageParams.getOrderRole().equals("a")){
50 | queryWrapper.orderByAsc(Message::getCreateDate);
51 | }else {
52 | queryWrapper.orderByDesc(Message::getCreateDate);
53 | }
54 | //分页 不需要条件 选择十条即可
55 | IPage messageIPage = messageMapper.selectPage(page, queryWrapper);
56 | //获取到records
57 | List records = messageIPage.getRecords();
58 | List messageVoList = new ArrayList<>();
59 | //复制到vo里面
60 | for (Message record : records) {
61 | messageVoList.add(copy(record));
62 | }
63 | ListInfoVo messageVoListInfoVo = new ListInfoVo<>();
64 | messageVoListInfoVo.setLength(page.getTotal());
65 | messageVoListInfoVo.setResults(messageVoList);
66 | return Result.success(messageVoListInfoVo);
67 | }
68 |
69 | public MessageVo copy(Message message){
70 | MessageVo messageVo = new MessageVo();
71 | BeanUtils.copyProperties(message,messageVo);
72 | messageVo.setId(message.getId().toString());
73 | messageVo.setCreateDate(new DateTime(message.getCreateDate()).toString("yyyy-MM-dd HH:mm"));
74 | return messageVo;
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/PictureServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
5 | import com.myblog.adkblog.dao.mapper.PictureMapper;
6 | import com.myblog.adkblog.pojo.Picture;
7 | import com.myblog.adkblog.pojo.User;
8 | import com.myblog.adkblog.service.LoginService;
9 | import com.myblog.adkblog.service.PictureService;
10 | import com.myblog.adkblog.service.UserService;
11 | import com.myblog.adkblog.utils.Myutils;
12 | import com.myblog.adkblog.vo.Common.ErrorCode;
13 | import com.myblog.adkblog.vo.Common.ListInfoVo;
14 | import com.myblog.adkblog.vo.Common.Result;
15 | import com.myblog.adkblog.vo.Params.PageParams;
16 | import com.myblog.adkblog.vo.Params.PicParams;
17 | import com.myblog.adkblog.vo.Views.PicVo;
18 | import com.myblog.adkblog.vo.Views.UserVo;
19 | import org.springframework.beans.BeanUtils;
20 | import org.springframework.beans.factory.annotation.Autowired;
21 | import org.springframework.stereotype.Service;
22 |
23 | import java.text.ParseException;
24 | import java.util.ArrayList;
25 | import java.util.List;
26 |
27 | @Service
28 | public class PictureServiceImpl implements PictureService {
29 | @Autowired
30 | private PictureMapper pictureMapper;
31 | @Autowired
32 | private UserService userService;
33 | @Autowired
34 | private LoginService loginService;
35 | @Override
36 | public Result getPics(PageParams pageParams) {
37 | Page page=new Page<>(pageParams.getPage(),pageParams.getPagesize());
38 | LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
39 | if(pageParams.getOrderRole()!=null&&pageParams.getOrderRole().equals("like")){
40 | queryWrapper.orderByDesc(Picture::getLikes);
41 | }else{
42 | queryWrapper.orderByDesc(Picture::getCreateTime);
43 | }
44 | if(pageParams.getTag()!=null && pageParams.getTag()!=0){
45 | queryWrapper.eq(Picture::getTag,pageParams.getTag());
46 | }
47 | if(pageParams.getIsOrigin()!=null){
48 | if(pageParams.getIsOrigin()==1){
49 | queryWrapper.eq(Picture::getOrigin,1);
50 | }
51 | }
52 | Page pic = pictureMapper.selectPage(page, queryWrapper);
53 | List records = pic.getRecords();
54 | try {
55 | ListInfoVo res = new ListInfoVo<>();
56 | res.setLength(pic.getTotal());
57 | List picVos = copyList(records);
58 | res.setResults(picVos);
59 | return Result.success(res);
60 | }catch (Exception e){
61 | e.printStackTrace();
62 | return Result.fail(ErrorCode.API_ERROR.getCode(),ErrorCode.API_ERROR.getMsg());
63 | }
64 | }
65 |
66 | @Override
67 | public Result addPic(PicParams picParams, String token) {
68 | User user = loginService.checkToken(token);
69 | if(user==null)
70 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
71 | Picture picture = new Picture();
72 | picture.setCreateTime(System.currentTimeMillis());
73 | picture.setUid(user.getId());
74 | picture.setSummary(picParams.getSummary());
75 | picture.setTitle(picParams.getTitle());
76 | picture.setUrl(picParams.getUrl());
77 | picture.setOrigin(picParams.getIsOrigin());
78 | picture.setTag(picParams.getTag());
79 | pictureMapper.insert(picture);
80 | return Result.success(1);
81 | }
82 |
83 | @Override
84 | public Result likePic(String picId) {
85 | Picture picture = new Picture();
86 | Picture pic = pictureMapper.selectById(Long.valueOf(picId));
87 | picture.setId(pic.getId());
88 | picture.setLikes(pic.getLikes()+1);
89 | pictureMapper.updateById(picture);
90 | return Result.success(1);
91 | }
92 |
93 | @Override
94 | public Result getMyPics(PageParams pageParams,String token) {
95 | User user = loginService.checkToken(token);
96 | if(user==null)
97 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
98 | Page page=new Page<>(pageParams.getPage(),pageParams.getPagesize());
99 | LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
100 | if(pageParams.getOrderRole()!=null&&pageParams.getOrderRole().equals("like")){
101 | queryWrapper.orderByDesc(Picture::getLikes);
102 | }else{
103 | queryWrapper.orderByDesc(Picture::getCreateTime);
104 | }
105 | if(pageParams.getTag()!=null && pageParams.getTag()!=0){
106 | queryWrapper.eq(Picture::getTag,pageParams.getTag());
107 | }
108 | if(pageParams.getIsOrigin()!=null){
109 | if(pageParams.getIsOrigin()==1){
110 | queryWrapper.eq(Picture::getOrigin,1);
111 | }
112 | }
113 | queryWrapper.eq(Picture::getUid,user.getId());
114 | Page pic = pictureMapper.selectPage(page, queryWrapper);
115 | List records = pic.getRecords();
116 | try {
117 | ListInfoVo res = new ListInfoVo<>();
118 | res.setLength(pic.getTotal());
119 | List picVos = copyList(records);
120 | res.setResults(picVos);
121 | return Result.success(res);
122 | }catch (Exception e){
123 | e.printStackTrace();
124 | return Result.fail(ErrorCode.API_ERROR.getCode(),ErrorCode.API_ERROR.getMsg());
125 | }
126 | }
127 |
128 | @Override
129 | public Result deleteMyPics(String id, String token) {
130 | User user = loginService.checkToken(token);
131 | if(user==null)
132 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
133 | Picture picture = pictureMapper.selectById(Long.valueOf(id));
134 | if(!picture.getUid().equals(user.getId()))
135 | return Result.fail(ErrorCode.NO_PERMISSION.getCode(),ErrorCode.NO_PERMISSION.getMsg());
136 | pictureMapper.deleteById(Long.valueOf(id));
137 | return Result.success(null);
138 | }
139 |
140 | @Override
141 | public Result updateMyPics(PicParams picParams, String token) {
142 | User user = loginService.checkToken(token);
143 | if(user==null)
144 | return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
145 | Picture picture = new Picture();
146 | picture.setId(Long.valueOf(picParams.getId()));
147 | picture.setTag(picParams.getTag());
148 | picture.setOrigin(picParams.getIsOrigin());
149 | picture.setTitle(picParams.getTitle());
150 | picture.setSummary(picParams.getSummary());
151 | pictureMapper.updateById(picture);
152 | return Result.success(null);
153 | }
154 |
155 | public List copyList(List pictures) throws ParseException {
156 | List picVos = new ArrayList<>();
157 | for (Picture picture : pictures) {
158 | picVos.add(copy(picture));
159 | }
160 | return picVos;
161 | }
162 | public PicVo copy(Picture picture) throws ParseException {
163 | PicVo picVo = new PicVo();
164 | BeanUtils.copyProperties(picture,picVo);
165 | picVo.setId(picture.getId().toString());
166 | picVo.setCreateTime(Myutils.getTime(picture.getCreateTime()));
167 | UserVo userVoById = userService.findUserVoById(picture.getUid());
168 | picVo.setAuthor(userVoById);
169 | return picVo;
170 | }
171 | }
172 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/SenFunServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.myblog.adkblog.service.SenFunService;
4 | import com.myblog.adkblog.utils.Myutils;
5 | import com.myblog.adkblog.vo.Common.Epinfo;
6 | import com.myblog.adkblog.vo.Common.ErrorCode;
7 | import com.myblog.adkblog.vo.Common.Result;
8 | import com.myblog.adkblog.vo.Views.SenfunSearchVo;
9 | import com.myblog.adkblog.vo.Views.SenfunVideoVo;
10 | import org.jsoup.Connection;
11 | import org.jsoup.Jsoup;
12 | import org.jsoup.nodes.Document;
13 | import org.jsoup.nodes.Element;
14 | import org.jsoup.select.Elements;
15 | import org.springframework.stereotype.Service;
16 |
17 | import java.net.URL;
18 | import java.util.ArrayList;
19 | import java.util.List;
20 |
21 | @Service
22 | public class SenFunServiceImpl implements SenFunService {
23 | private String searchUrl="https://senfun.net/search.html?wd=";
24 | private String baseUrl="https://senfun.net";
25 | @Override
26 | public Result getSearchResult(String keywords) {
27 | try {
28 | Connection connection = Jsoup.connect(searchUrl+keywords);
29 | connection.userAgent(Myutils.getRandomAgent());
30 | connection.timeout(8000);
31 | Document doc = connection.get();
32 | Elements moduleMain = doc.select(".module .module-main .module-items");
33 | ArrayList senfuns = new ArrayList<>();
34 | if(!moduleMain.isEmpty()){
35 | Element element = moduleMain.get(0);
36 | Elements items = element.select(".module-card-item");
37 | if(!items.isEmpty()){
38 | for (Element item : items) {
39 | //这里就是所有的搜索结果 把他们存进一个类中
40 | SenfunSearchVo senfunSearchVo = new SenfunSearchVo();
41 | Element tag = item.selectFirst(".module-card-item-class");
42 | Element infolist = item.selectFirst(".module-card-item-info");
43 | Element title = infolist.selectFirst(".module-card-item-title");
44 | Element a = item.selectFirst(".module-card-item-footer");
45 | Element watchlink = a.selectFirst("a");
46 | senfunSearchVo.setLink(watchlink.attr("href"));
47 | senfunSearchVo.setTag(tag.text());
48 | senfunSearchVo.setTitle(title.text());
49 | senfuns.add(senfunSearchVo);
50 | }
51 | }
52 | }
53 | return Result.success(senfuns);
54 | }catch (Exception e){
55 | e.printStackTrace();
56 | return Result.fail(ErrorCode.API_ERROR.getCode(),ErrorCode.API_ERROR.getMsg());
57 | }
58 | }
59 |
60 | /**
61 | * 这里由于senfun使用了一点加密手段 仅凭我的爬虫能力实在是无法胜任该爬取工作 所以暂时先摆了。
62 | * @param path
63 | * @return
64 | */
65 | @Override
66 | public Result getVideoUrl(String path){
67 | try {
68 | Connection connection = Jsoup.connect(baseUrl+path);
69 | connection.userAgent(Myutils.getRandomAgent());
70 | connection.timeout(10000);
71 | Document doc = connection.get();
72 | //获取播放分集
73 | Element playlist = doc.selectFirst(".module .module-main .module-player-side");
74 | Element playlistcontainer = playlist.selectFirst(".player-list");
75 | Element pannel = playlistcontainer.selectFirst(".module-list");
76 | Elements select = pannel.select(".module-play-list-link");
77 | SenfunVideoVo senfun = new SenfunVideoVo();
78 | List eplist = new ArrayList<>();
79 | for (Element element : select) {
80 | Epinfo epinfo = new Epinfo();
81 | epinfo.setEpTitle(element.text());
82 | epinfo.setEpUrl(element.attr("href"));
83 | eplist.add(epinfo);
84 | }
85 | senfun.setEpinfoList(eplist);
86 | Element element = doc.selectFirst(".module .module-main .player-box .player-box-main");
87 | // Element iframe = element.getElementById("install");
88 | System.out.println(element);
89 | System.out.println(senfun);
90 | return null;
91 | }catch (Exception e){
92 | e.printStackTrace();
93 | return Result.fail(ErrorCode.API_ERROR.getCode(),ErrorCode.API_ERROR.getMsg());
94 | }
95 | }
96 | public static void main(String[] args) {
97 | new SenFunServiceImpl().getVideoUrl("/watch/427/2/1.html");
98 | }
99 | }
100 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/TagServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 | import com.baomidou.mybatisplus.core.metadata.IPage;
5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 | import com.myblog.adkblog.dao.mapper.TagMapper;
7 | import com.myblog.adkblog.pojo.Tag;
8 | import com.myblog.adkblog.service.TagService;
9 | import com.myblog.adkblog.vo.Common.ListInfoVo;
10 | import com.myblog.adkblog.vo.Params.PageParams;
11 | import com.myblog.adkblog.vo.Common.Result;
12 | import com.myblog.adkblog.vo.Views.TagVo;
13 | import org.springframework.beans.BeanUtils;
14 | import org.springframework.beans.factory.annotation.Autowired;
15 | import org.springframework.stereotype.Service;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | @Service
21 | public class TagServiceImpl implements TagService {
22 | @Autowired
23 | private TagMapper tagMapper;
24 | @Override
25 | public Result findAll() {
26 | List tags = tagMapper.selectList(new LambdaQueryWrapper<>());
27 | List tagVos = copyList(tags);
28 | return Result.success(tagVos);
29 | }
30 |
31 | @Override
32 | public List findTagByArticleId(Long articleid) {
33 | List tags = tagMapper.findTagByArticleId(articleid);
34 | return copyList(tags);
35 | }
36 |
37 | @Override
38 | public Result addTag(String tagName) {
39 | tagMapper.addTag(tagName);
40 | return Result.success(null);
41 | }
42 |
43 | @Override
44 | public Result tagList(PageParams pageParams) {
45 | //分页查询标签
46 | Page page=new Page<>(pageParams.getPage(),pageParams.getPagesize());
47 | LambdaQueryWrapper tagLambdaQueryWrapper = new LambdaQueryWrapper<>();
48 | IPage tagIPage = tagMapper.selectPage(page,tagLambdaQueryWrapper);
49 | List records = tagIPage.getRecords();
50 | List articleVoList = copyList(records);
51 | ListInfoVo result = new ListInfoVo<>();
52 | result.setResults(articleVoList);
53 | result.setLength(tagIPage.getTotal());
54 |
55 | return Result.success(result);
56 | }
57 |
58 | /**
59 | * copy类
60 | * @param tag
61 | * @return
62 | */
63 | public TagVo copy(Tag tag){
64 | TagVo tagVo = new TagVo();
65 | BeanUtils.copyProperties(tag,tagVo);
66 | return tagVo;
67 | }
68 | public List copyList(List tagList){
69 | List tagVoList = new ArrayList<>();
70 | for (Tag tag : tagList) {
71 | tagVoList.add(copy(tag));
72 | }
73 | return tagVoList;
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/Impl/YhdmServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service.Impl;
2 |
3 | import com.myblog.adkblog.service.YhdmService;
4 | import com.myblog.adkblog.utils.Myutils;
5 | import com.myblog.adkblog.vo.Common.Epinfo;
6 | import com.myblog.adkblog.vo.Common.ListInfoVo;
7 | import com.myblog.adkblog.vo.Common.Result;
8 | import com.myblog.adkblog.vo.Views.YhdmSearchVo;
9 | import com.myblog.adkblog.vo.Views.YhdmVideoVo;
10 | import lombok.Data;
11 | import org.jsoup.Connection;
12 | import org.jsoup.Jsoup;
13 | import org.jsoup.nodes.Document;
14 | import org.jsoup.nodes.Element;
15 | import org.jsoup.select.Elements;
16 | import org.springframework.stereotype.Service;
17 |
18 | import java.util.ArrayList;
19 |
20 | import static com.myblog.adkblog.utils.Myutils.getNumInString;
21 | import static com.myblog.adkblog.utils.Myutils.getRandomNum;
22 |
23 | @Service
24 | public class YhdmServiceImpl implements YhdmService {
25 |
26 | private String searchUrl="http://www.yinghuacd.com/search/";
27 | private String baseUrl="http://www.yinghuacd.com/";
28 | @Override
29 | public Result getSearchInfo(String keywords) {
30 | String url=searchUrl+keywords;
31 | ArrayList res = new ArrayList<>();
32 | ListInfoVo resultList = new ListInfoVo<>();
33 | try {
34 | Connection connection = Jsoup.connect(url);
35 | connection.userAgent(Myutils.getRandomAgent());
36 | connection.timeout(8000);
37 | Document doc = connection.get();
38 | Elements lpic = doc.select(".area .fire .lpic");
39 | //获取到下面的ul
40 | Element element = lpic.get(0);
41 | Elements lpicul = element.getElementsByTag("ul");
42 | ArrayList itemUrls = new ArrayList<>();
43 | //获取搜索结果前三关联的条目
44 | //备注 由于樱花动漫的搜索逻辑是 最相关的在前面 所以需要获取分页数据 找到最后一页并且倒序插入
45 | //每一页结果为20条
46 | Elements pages = lpic.get(0).getElementsByClass("pages");
47 | if(!pages.isEmpty()){
48 | Element totalnum = pages.get(0).getElementById("totalnum");
49 | int total = getNumInString(totalnum.text());
50 | int page= (int) Math.ceil(total/20.0);
51 | //重新发起请求
52 | url=searchUrl+keywords+"/?page="+page;
53 | connection = Jsoup.connect(url);
54 | connection.userAgent(Myutils.getRandomAgent());
55 | connection.timeout(8000);
56 | doc = connection.get();
57 | lpic = doc.select(".area .fire .lpic");
58 | lpicul = lpic.get(0).getElementsByTag("ul");
59 | }
60 | if(!lpicul.isEmpty()){
61 | //如果是有分页数据的 我们需要到最后一页去寻找相应的搜索结果
62 |
63 | Elements lis = lpicul.get(0).getElementsByTag("li");
64 | if(!lis.isEmpty()) {
65 | int count=lis.size();
66 | if(count>5) count=5;
67 | int size=lis.size();
68 | //搜索三条关联条目
69 | for(int i=0;i0){
87 | for (TempDos itemUrl : itemUrls) {
88 | YhdmSearchVo yhdmSearchVo = new YhdmSearchVo();
89 | yhdmSearchVo.setTitle(itemUrl.title);
90 | Connection connection1 = Jsoup.connect(itemUrl.getUrl());
91 | connection1.userAgent(Myutils.getRandomAgent());
92 | connection1.timeout(8000);
93 | Document doc2 = connection1.get();
94 | Elements movurl = doc2.getElementsByClass("movurl");
95 | ArrayList eplist = new ArrayList<>();
96 | if(!movurl.isEmpty()){
97 | //获取到ul
98 | Elements ul = movurl.get(0).getElementsByTag("ul");
99 | if(!ul.isEmpty()){
100 | Elements lis = ul.get(0).getElementsByTag("li");
101 | if(!lis.isEmpty()){
102 | for (Element li : lis) {
103 | Epinfo epinfo = new Epinfo();
104 | Elements a = li.getElementsByTag("a");
105 | if(!a.isEmpty()){
106 | Element a1 = a.get(0);
107 | String epUrl = a1.attr("href");
108 | epinfo.setEpTitle(a1.text());
109 | epinfo.setEpUrl(epUrl);
110 | eplist.add(epinfo);
111 | }
112 | }
113 | }
114 | }
115 | }
116 | yhdmSearchVo.setEpInfo(eplist);
117 | res.add(yhdmSearchVo);
118 | }
119 | }
120 | }catch (Exception e){
121 | System.out.println(e);
122 | }
123 | resultList.setResults(res);
124 | resultList.setLength((long) res.size());
125 | return Result.success(resultList);
126 | }
127 |
128 | @Override
129 | public Result getVideoUrl(String url) {
130 | //传进来的是 5479-2的样子 把分集数据和视频url一同返回过去
131 | String connectUrl=baseUrl+"/v/"+url+".html";
132 | YhdmVideoVo yhdmVideoVo = new YhdmVideoVo();
133 | try {
134 | Connection connection = Jsoup.connect(connectUrl);
135 | connection.userAgent(Myutils.getRandomAgent());
136 | connection.timeout(8000);
137 | Document doc=connection.get();
138 | Elements select = doc.select(".bofang div");
139 | if(!select.isEmpty()){
140 | Element div = select.get(0);
141 | String videoUrl = div.attr("data-vid");
142 | String[] urls = videoUrl.split("$");
143 | yhdmVideoVo.setVideoUrl(urls[0]);
144 | }
145 | Elements ul = doc.select(".movurls ul");
146 | if(!ul.isEmpty()){
147 | Elements li = ul.get(0).getElementsByTag("li");
148 | ArrayList eplist = new ArrayList<>();
149 | if(!li.isEmpty()){
150 | for (Element element : li) {
151 | Epinfo epinfo = new Epinfo();
152 | epinfo.setEpTitle(element.text());
153 | epinfo.setEpUrl(element.getElementsByTag("a").attr("href"));
154 | eplist.add(epinfo);
155 | }
156 | yhdmVideoVo.setEpInfo(eplist);
157 | }
158 | }
159 | Elements select1 = doc.select(".gohome");
160 | if(!select1.isEmpty()){
161 | Elements h1 = select1.get(0).getElementsByTag("h1");
162 | if(!h1.isEmpty()){
163 | String animename = h1.get(0).text();
164 | yhdmVideoVo.setTitle(animename);
165 | }
166 | }
167 | }catch (Exception e){
168 | e.printStackTrace();
169 | }
170 | return Result.success(yhdmVideoVo);
171 | }
172 |
173 | @Data
174 | class TempDos{
175 | String url;
176 | String title;
177 | }
178 |
179 | }
180 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/LoginService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.pojo.User;
4 | import com.myblog.adkblog.vo.Params.LoginParams;
5 | import com.myblog.adkblog.vo.Params.RegisterParams;
6 | import com.myblog.adkblog.vo.Common.Result;
7 |
8 | public interface LoginService {
9 | Result login(LoginParams loginParams);
10 | Result register(RegisterParams registerParams);
11 | User checkToken(String token);
12 | Result logout(String token);
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/MessageService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Params.MessageParams;
4 | import com.myblog.adkblog.vo.Params.PageParams;
5 | import com.myblog.adkblog.vo.Common.Result;
6 |
7 | public interface MessageService {
8 |
9 | Result addMessage(MessageParams messageParams);
10 |
11 | Result getMessage(PageParams pageParams);
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/PictureService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Common.Result;
4 | import com.myblog.adkblog.vo.Params.PageParams;
5 | import com.myblog.adkblog.vo.Params.PicParams;
6 |
7 | public interface PictureService {
8 | Result getPics(PageParams pageParams);
9 |
10 | Result addPic(PicParams picParams, String token);
11 |
12 | Result likePic(String picId);
13 |
14 | Result getMyPics(PageParams pageParams, String token);
15 |
16 | Result deleteMyPics(String id, String token);
17 |
18 | Result updateMyPics(PicParams picParams, String token);
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/SenFunService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Common.Result;
4 |
5 | public interface SenFunService {
6 | Result getSearchResult(String keywords);
7 | Result getVideoUrl(String path);
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/TagService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Params.PageParams;
4 | import com.myblog.adkblog.vo.Common.Result;
5 | import com.myblog.adkblog.vo.Views.TagVo;
6 |
7 | import java.util.List;
8 |
9 | public interface TagService {
10 |
11 | Result findAll();
12 |
13 | List findTagByArticleId(Long articleid);
14 |
15 | Result addTag(String tagName);
16 |
17 | Result tagList(PageParams pageParams);
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/UserService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.pojo.User;
4 | import com.myblog.adkblog.vo.Params.LikeOrCollectParams;
5 | import com.myblog.adkblog.vo.Params.UpdateUserParams;
6 | import com.myblog.adkblog.vo.Common.Result;
7 | import com.myblog.adkblog.vo.Views.UserVo;
8 | import org.springframework.stereotype.Repository;
9 |
10 | @Repository
11 | public interface UserService {
12 | User findUser(String username,String password);
13 | void saveUser(User user);
14 | User findUserByUsername(String username);
15 | Result findUserByToken(String token);
16 | User findUserById(Long id);
17 | Result findUserAllByToken(String token);
18 | UserVo findUserVoById(Long authorId);
19 | UserVo findUserVoByToken(String token);
20 | Result updateUserInfoByToken(String token, UpdateUserParams updateUserParams);
21 | Result likeArticle(LikeOrCollectParams likeParams,String token);
22 | Result collectArticle(LikeOrCollectParams likeParams, String token);
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/service/YhdmService.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.service;
2 |
3 | import com.myblog.adkblog.vo.Common.Result;
4 |
5 | public interface YhdmService {
6 | Result getSearchInfo(String keywords);
7 |
8 | Result getVideoUrl(String url);
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/utils/AliossUtils.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.utils;
2 |
3 | import com.aliyun.oss.ClientException;
4 | import com.aliyun.oss.OSS;
5 | import com.aliyun.oss.OSSClientBuilder;
6 | import com.aliyun.oss.OSSException;
7 | import com.aliyun.oss.model.ObjectMetadata;
8 | import com.aliyun.oss.model.PutObjectRequest;
9 | import org.springframework.beans.factory.annotation.Value;
10 | import org.springframework.scheduling.annotation.Async;
11 | import org.springframework.stereotype.Repository;
12 | import org.springframework.web.multipart.MultipartFile;
13 |
14 | import java.io.*;
15 | import java.text.SimpleDateFormat;
16 | import java.util.Date;
17 |
18 | @Repository
19 | public class AliossUtils {
20 |
21 | @Value("${aliyun.endpoint}")
22 | private String endpoint;
23 | @Value("${aliyun.accessKeyId}")
24 | private String accessKeyId;
25 | @Value("${aliyun.accessKeySecret}")
26 | private String accessKeySecret;
27 | @Value("${aliyun.bucketName}")
28 | private String bucketName;
29 | @Value("${fileabsolutepath}")
30 | private String absloutePath;
31 | @Value("${ossurl}")
32 | private String ossUrl;
33 | public String upload(MultipartFile file, String fileName) throws IOException {
34 | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
35 | // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
36 | String objectName = sdf.format(new Date()) + "/" + fileName;
37 | // 创建OSSClient实例。
38 | OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
39 | ObjectMetadata objectMetadata = new ObjectMetadata();
40 | objectMetadata.setContentType(file.getContentType());
41 | ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(file.getBytes()),
42 | objectMetadata);
43 | //这里改成 内网访问的二级域名+路径名(objectname)
44 | String url=ossUrl+objectName;
45 | if (ossClient != null) {
46 | ossClient.shutdown();
47 | }
48 | return url;
49 | }
50 | /**
51 | * 提供本地的路径 上传文件至oss 传完之后删除本地文件
52 | * @param path 本地图片路径
53 | * @return 返回一个图片地址
54 | */
55 | @Async("uploadImage")
56 | public String uploadBgmImage(String path){
57 | // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
58 | String filename=path;
59 | String objectName = "bgmimage" + "/" + filename;
60 | // 创建OSSClient实例。
61 | OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
62 | // OSS ossClient = new OSSClientBuilder().build("oss-cn-guangzhou.aliyuncs.com", "LTAI5t78YcsGmmK8uLsF2QFE", "IhMuAqG3KiocDyNrJYQPqLBLO2m8k4");
63 | File file = new File(path);
64 | PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file);
65 | // PutObjectRequest putObjectRequest = new PutObjectRequest("firssst", objectName, file);
66 | ossClient.putObject(putObjectRequest);
67 | Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 5);
68 | String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();
69 | // String url = ossClient.generatePresignedUrl("firssst", objectName, expiration).toString();
70 | String regex="\\?";
71 | String[] split = url.split(regex);
72 | if(ossClient!=null){
73 | ossClient.shutdown();
74 | }
75 | //删除文件
76 | file.delete();
77 | return split[0];
78 | }
79 | /**
80 | * 保存图片到本地目录(ossfs)并将其连接返回给数据库
81 | * @param file
82 | * @param fileName
83 | * @return
84 | */
85 | public String saveToLocalfs(MultipartFile file, String fileName) throws Exception {
86 | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
87 | // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
88 | String filePath =absloutePath+"/"+ sdf.format(new Date()) + "/" + fileName;
89 | //通过输入流获取图片数据
90 | InputStream is = file.getInputStream();
91 | //得到图片的二进制数据,以二进制封装得到数据,具有通用性
92 | byte[] data = SaveImg.readInputStream(is);
93 | File fle = new File(filePath); // 本地目录
94 | File parentFile = fle.getParentFile();
95 | if(!parentFile.exists()){
96 | parentFile.mkdir();
97 | }
98 | if(fle.exists()){
99 | //其实吧 这个分支应该不太存在额。。。
100 | //TODO 通过比对文件的MD5一致性 判断文件是否一致 并且返回文件
101 | }
102 | FileOutputStream fops = new FileOutputStream(fle);
103 | fops.write(data);
104 | fops.flush();
105 | fops.close();
106 | return filePath;
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/utils/JWTUtils.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.utils;
2 |
3 |
4 | import io.jsonwebtoken.Jwt;
5 | import io.jsonwebtoken.JwtBuilder;
6 | import io.jsonwebtoken.Jwts;
7 | import io.jsonwebtoken.SignatureAlgorithm;
8 |
9 | import java.util.Date;
10 | import java.util.HashMap;
11 | import java.util.Map;
12 |
13 | public class JWTUtils {
14 |
15 | private static final String jwtToken = "123456adk!@#$$";
16 |
17 | public static String createToken(Long userId){
18 | Map claims = new HashMap<>();
19 | claims.put("userId",userId);
20 | JwtBuilder jwtBuilder = Jwts.builder()
21 | .signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
22 | .setClaims(claims) // body数据,要唯一,自行设置
23 | .setIssuedAt(new Date()) // 设置签发时间
24 | .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
25 | String token = jwtBuilder.compact();
26 | return token;
27 | }
28 |
29 | public static Map checkToken(String token){
30 | try {
31 | Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
32 | return (Map) parse.getBody();
33 | }catch (Exception e){
34 | e.printStackTrace();
35 | }
36 | return null;
37 |
38 | }
39 |
40 |
41 | }
42 |
43 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/utils/SaveImg.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.utils;
2 |
3 | import org.springframework.beans.factory.annotation.Value;
4 | import org.springframework.scheduling.annotation.Async;
5 | import org.springframework.stereotype.Component;
6 |
7 | import java.io.ByteArrayOutputStream;
8 | import java.io.File;
9 | import java.io.FileOutputStream;
10 | import java.io.InputStream;
11 | import java.net.HttpURLConnection;
12 | import java.net.URL;
13 |
14 | @Component
15 | public class SaveImg {
16 |
17 | @Value("${bangumi.agent}")
18 | private String bgmUserAgent; // bgm接口的agent数据
19 |
20 | /**
21 | * 传入一张网络图片 然后会自动保存到本地服务器下的/temp/xxx.jpg
22 | * @param img 要保存的网络图片的地址
23 | * @return localPath 本地存放的文件地址
24 | * @throws Exception
25 | */
26 | @Async("saveImg")
27 | public String saveImgLocal(String img) throws Exception {
28 | //定义一个URL对象,就是你想下载的图片的URL地址
29 | System.setProperty("http.proxyHost", "localhost");
30 | System.setProperty("http.proxyPort", "10809");
31 | System.setProperty("https.proxyHost", "localhost");
32 | System.setProperty("https.proxyPort", "10809");
33 | URL url = new URL(img);
34 | //打开连接
35 | HttpURLConnection conn = (HttpURLConnection) url.openConnection();
36 | conn.setRequestProperty("User-Agent","ADKCodeXd/ADK-Blog(https://github.com/ADKcodeXD/Myblog-Vue3viteTs)");
37 | //设置请求方式为"GET"
38 | conn.setRequestMethod("GET");
39 | //超时响应时间为10秒
40 | conn.setConnectTimeout(10 * 1000);
41 | //通过输入流获取图片数据
42 | InputStream is = conn.getInputStream();
43 | //得到图片的二进制数据,以二进制封装得到数据,具有通用性
44 | byte[] data = readInputStream(is);
45 | //创建一个文件对象用来保存图片,默认保存当前工程的temp下
46 | String[] arrs=img.split("/");
47 | String fileName=arrs[arrs.length-1];
48 | File file = new File(fileName); // 本地目录
49 | FileOutputStream fops = new FileOutputStream(file);
50 | fops.write(data);
51 | fops.flush();
52 | fops.close();
53 | return fileName;
54 | }
55 |
56 | public static byte[] readInputStream(InputStream inStream) throws Exception {
57 | ByteArrayOutputStream outStream = new ByteArrayOutputStream();
58 | //创建一个Buffer字符串
59 | byte[] buffer = new byte[1024];
60 | //每次读取的字符串长度,如果为-1,代表全部读取完毕
61 | int len;
62 | //使用一个输入流从buffer里把数据读取出来
63 | while ((len = inStream.read(buffer)) != -1) {
64 | //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
65 | outStream.write(buffer, 0, len);
66 | }
67 | //关闭输入流
68 | inStream.close();
69 | //把outStream里的数据写入内存
70 | return outStream.toByteArray();
71 | }
72 |
73 | }
74 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/utils/SpiderUtils.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.utils;
2 |
3 | import com.alibaba.fastjson.JSON;
4 | import com.arronlong.httpclientutil.HttpClientUtil;
5 | import com.arronlong.httpclientutil.builder.HCB;
6 | import com.arronlong.httpclientutil.common.HttpConfig;
7 | import com.arronlong.httpclientutil.common.HttpHeader;
8 | import com.arronlong.httpclientutil.common.SSLs;
9 | import com.fasterxml.jackson.databind.ObjectMapper;
10 | import com.myblog.adkblog.vo.Views.CalendarVo;
11 | import org.apache.http.Header;
12 | import org.apache.http.client.HttpClient;
13 | import org.springframework.beans.factory.annotation.Value;
14 | import org.springframework.stereotype.Component;
15 |
16 | import java.util.ArrayList;
17 |
18 | @Component
19 | public class SpiderUtils {
20 | /**
21 | * 这是一个爬虫接口类,用于爬取bgm接口数据 以及樱花动漫或者各种其他网站的数据
22 | */
23 | @Value("${bangumi.api}")
24 | private String baseUrl; //bangumi的api地址
25 | @Value("${bangumi.agent}")
26 | private String bgmUserAgent; // bgm接口的agent数据
27 |
28 | /**
29 | * 用于请求接口的公共方法 只需要传入一个url就能自动进行请求
30 | * @param url
31 | */
32 | private Object getDataWithHttpUtils(String url){
33 | Header[] headers = HttpHeader.custom()
34 | .userAgent(bgmUserAgent)
35 | .build();
36 | try {
37 | HCB hcb = HCB.custom()
38 | .sslpv(SSLs.SSLProtocolVersion.TLSv1_2);
39 | HttpClient build = hcb.build();
40 | String result = HttpClientUtil.get(HttpConfig.custom().url(url).client(build).headers(headers));
41 | Object res = JSON.parse(result);
42 | return res;
43 | } catch (Exception e) {
44 | e.printStackTrace();
45 | return null;
46 | }
47 | }
48 |
49 | /**
50 | * 用于获取每季新番的方法
51 | * @return
52 | */
53 | public ArrayList getClaendarApi() throws Exception {
54 | String url=baseUrl+"/calendar";
55 | ArrayList res = new ArrayList<>();
56 | //这里确实有些magic 不过大家知道每日新番是一个7size的数组就行
57 | ObjectMapper objectMapper = new ObjectMapper();
58 | Object sourceData =getDataWithHttpUtils(url);
59 | ArrayList arrayList = objectMapper.convertValue(sourceData, ArrayList.class);
60 | for(int i=0;i LOCAL=new ThreadLocal<>();
14 |
15 | public static void put(User user){
16 | LOCAL.set(user);
17 | }
18 | public static User get(){
19 | return LOCAL.get();
20 | }
21 | public static void remove(){
22 | LOCAL.remove();
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Common/Epinfo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Common;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class Epinfo {
7 | private String epTitle;
8 | private String epUrl;
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Common/ErrorCode.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Common;
2 |
3 | public enum ErrorCode {
4 | /**
5 | * 枚举各种不同的错误码
6 | * 以方便进行错误信息提醒
7 | */
8 | PARAMS_ERROR(10001, "参数有误"),
9 | ACCOUNT_PWD_NOT_EXIST(10002, "用户名或密码不存在"),
10 | TOKEN_ERROR(10003, "token不合法"),
11 | ACCOUNT_EXIST(10004, "账号已存在"),
12 | NO_PERMISSION(70001, "无访问权限"),
13 | SESSION_TIME_OUT(90001, "会话超时"),
14 | NO_LOGIN(90002, "该功能需要登录才能使用"),
15 | TIME_OUT(40004, "请求超时 请刷新或者重试"),
16 | UPLOAD_ERROR(20001, "上传失败"),
17 | IS_LOGINING(10005, "您已经登录了~"),
18 | API_ERROR(12345, "API请求有误"),
19 | RATE_LIMIT(48484, "你好像请求的次数太快了~休息一会吧");
20 |
21 | ErrorCode(int code, String msg) {
22 | this.code = code;
23 | this.msg = msg;
24 | }
25 |
26 | public int getCode() {
27 | return code;
28 | }
29 |
30 | public void setCode(int code) {
31 | this.code = code;
32 | }
33 |
34 | public String getMsg() {
35 | return msg;
36 | }
37 |
38 | public void setMsg(String msg) {
39 | this.msg = msg;
40 | }
41 |
42 | private int code;
43 | private String msg;
44 | }
45 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Common/ListInfoVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Common;
2 |
3 | import lombok.Data;
4 |
5 | import java.util.List;
6 | @Data
7 | public class ListInfoVo {
8 |
9 | private Long length;
10 | private Integer pages;
11 | private List results;
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Common/Result.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Common;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import lombok.AllArgsConstructor;
5 | import lombok.Data;
6 | import lombok.NoArgsConstructor;
7 |
8 |
9 | @AllArgsConstructor
10 | @NoArgsConstructor
11 | @ApiModel(value = "返回结果集")
12 | @Data
13 | public class Result {
14 | //是否请求成功状态
15 | private boolean success;
16 | //状态码
17 | private int code;
18 | //返回信息
19 | private String msg;
20 | //返回数据的主体
21 | private T data;
22 |
23 |
24 | //静态方法,当请求成功时 调用该方法返回给网页
25 | public static Result success(Object data){
26 | return new Result(true,200,"success",data);
27 | }
28 |
29 | public static Result fail(int code,String msg){
30 | return new Result(false,code,msg,null);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/ArticleBodyParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 |
7 | @Data
8 | @ApiModel("文章详细信息参数")
9 | public class ArticleBodyParams {
10 | @ApiModelProperty("文章内容 content 非html格式")
11 | private String content;
12 | @ApiModelProperty("文章内容html格式")
13 | private String contentHtml;
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/ArticleParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import com.myblog.adkblog.vo.Views.TagVo;
4 | import io.swagger.annotations.ApiModel;
5 | import io.swagger.annotations.ApiModelProperty;
6 | import lombok.Data;
7 |
8 | import java.util.List;
9 |
10 | @Data
11 | @ApiModel("发布文章参数model")
12 | public class ArticleParams {
13 | @ApiModelProperty("文章id 设置错了")
14 | private Long id;
15 | @ApiModelProperty("文章详情 content 和html部分 需要分别获取")
16 | private ArticleBodyParams body;
17 | @ApiModelProperty("文章摘要 必须")
18 | private String summary;
19 | @ApiModelProperty("文章标签的集合 为一个数组")
20 | private List tags;
21 | @ApiModelProperty("文章名")
22 | private String articleName;
23 | @ApiModelProperty("文章头图的链接 是url")
24 | private String banner;
25 | @ApiModelProperty("文章板块 pannel")
26 | private Integer pannel;
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/BgmBrowserParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import io.swagger.annotations.ApiParam;
6 | import lombok.Data;
7 |
8 | @Data
9 | @ApiModel("获取bangumi动漫信息的参数实体类")
10 | public class BgmBrowserParams {
11 | @ApiParam("类型 只接受五种 分别是web tv movie ova misc")
12 | private String type;
13 | @ApiParam("时间 格式为2022-1或者2022")
14 | private String airtime;
15 | @ApiParam("排序方式 只接受三种 rank date title")
16 | private String sort;
17 | @ApiParam("orderby 可以以某个字母为开头进行筛选 只接受a-z")
18 | private String order;
19 | @ApiParam("页数 一页最多为20条数据")
20 | private Integer page;
21 | @ApiParam("标签 可接受任意标签")
22 | private String tag;
23 | @ApiParam("大类 接受五个类型 分别为music real book anime game")
24 | private String bigType;
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/CommentParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import io.swagger.annotations.ApiParam;
6 | import lombok.Data;
7 |
8 | @Data
9 | @ApiModel("发送评论的参数")
10 | public class CommentParams {
11 | @ApiParam("评论作者id")
12 | private Long authorId;
13 | @ApiParam("文章id")
14 | private Long articleId;
15 | @ApiParam("给某个用户的目标用户的uid")
16 | private Long toUid;
17 | @ApiParam("父级评论的id")
18 | private Long parentId;
19 | @ApiParam("评论主体")
20 | private String content;
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/LikeOrCollectParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class LikeOrCollectParams {
7 | public String articleId;
8 | public Boolean flag;
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/LoginParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class LoginParams {
7 | private String username;
8 | private String password;
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/MessageParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class MessageParams {
7 | private String authorName;
8 | private String content;
9 | private String contact;
10 | private String avatar;
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/PageParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import io.swagger.annotations.ApiParam;
4 | import lombok.Data;
5 |
6 | import java.util.List;
7 |
8 | /*
9 | 这是用来存放pageparams参数的一个类
10 | vo包params用来存放post的参数体
11 | */
12 | @Data
13 | public class PageParams {
14 | //这个是用于分页插件的参数体,默认为第一页 每页十条数据
15 | @ApiParam(value = "分页当前页数 默认第一页",required = true)
16 | private int page=1;
17 | @ApiParam(value = "分页大小 默认一页十条数据",required = true)
18 | private int pagesize=10;
19 | @ApiParam("文章作者id")
20 | private Long authorId;
21 | @ApiParam("标签的id数组")
22 | private List tagIds;
23 | @ApiParam("年份 示例2022")
24 | private String year;
25 | @ApiParam("月份 实例1")
26 | private String month;
27 | @ApiParam("排序规则 按照相应的字段进行排序 或者输入a 可以倒序")
28 | private String orderRole;
29 | @ApiParam("搜索关键字")
30 | private String keyword;
31 | @ApiParam("搜索文章的板块用的")
32 | private Integer pannel;
33 | @ApiParam("这是搜索画廊用的")
34 | private Integer tag;
35 | @ApiParam("这是搜索画廊用的+1 是否原创")
36 | private Integer isOrigin;
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/PicParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class PicParams {
7 | private String id;
8 | private String url;
9 | private String title;
10 | private String summary;
11 | private Integer isOrigin;
12 | private Integer tag;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/RegisterParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class RegisterParams {
7 | private String username;
8 | private String nickname;
9 | private String password;
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Params/UpdateUserParams.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Params;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class UpdateUserParams {
7 | private String avatar;
8 | private String nickname;
9 | private String introduce;
10 | private String banner;
11 | private String gender;
12 | private String email;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Transfer/BgmCollections.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Transfer;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class BgmCollections {
7 | private Integer doing; //在看人数
8 | private Integer on_hold; //搁置
9 | private Integer dropped; //抛弃
10 | private Integer collect; //看过
11 | private Integer wish; //想看
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Transfer/BgmImages.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Transfer;
2 |
3 | import lombok.Data;
4 |
5 |
6 | @Data
7 | /**
8 | * bgm的图片展示类
9 | */
10 | public class BgmImages {
11 | private String large;
12 | private String common;
13 | private String medium;
14 | private String small;
15 | private String grid;
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Transfer/CalendarItemVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Transfer;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class CalendarItemVo {
7 | private Integer id;
8 | private String url;
9 | private Integer type;
10 | private String name;
11 | private String name_cn;
12 | private String summary;
13 | private String air_date;
14 | private Integer air_weekday;
15 | private Integer rank;
16 | private Rating rating;
17 | private BgmImages images;
18 | private BgmCollections collection;
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Transfer/Rating.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Transfer;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class Rating {
7 | private Integer total;
8 | private Object count; //这个是json文件转成objec 前端再做解析
9 | private Float score;
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Transfer/WeekDay.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Transfer;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class WeekDay {
7 | private String en;
8 | private String ja;
9 | private String cn;
10 | private Integer id;
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/ArticleBodyVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class ArticleBodyVo {
7 | private String content;
8 | private String html;
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/ArticleVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 |
4 | import io.swagger.annotations.ApiModel;
5 | import lombok.Data;
6 |
7 | import java.util.List;
8 |
9 | /**
10 | * 数据库中我们直接查到的数据
11 | * 并不能直接扔到网页中
12 | * 需要封装到一个vo对象中
13 | * 进行展示
14 | * 也就是要进行id到具体对象的映射
15 | * 直接拿到数据库中的一些id和long类型的数据,是没办法直接给别人看的,要进行id到对象的转换和映射
16 | */
17 | @Data
18 | @ApiModel("文章类")
19 | public class ArticleVo {
20 | private String id;
21 |
22 | private String articleName;
23 |
24 | private String summary;
25 |
26 | private Integer commentCounts;
27 |
28 | private Integer viewCounts;
29 |
30 | /**
31 | * 创建时间
32 | */
33 | private String createDate;
34 |
35 | private String author;
36 |
37 | private UserVo authorVo;
38 |
39 | private String banner;
40 |
41 | private ArticleBodyVo body;
42 |
43 | private List tags;
44 |
45 | private Boolean isLiked;
46 |
47 | private Boolean isCollected;
48 |
49 | private Integer likeCounts;
50 |
51 | private Integer collectCounts;
52 |
53 | private Integer isPrivate;
54 |
55 | private Integer pannel;
56 | }
57 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/BannerVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class BannerVo {
7 | private String id;
8 | private String banner;
9 | private String articleName;
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/BgmRankVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class BgmRankVo {
7 | private Integer id;
8 | private String name;
9 | private String nameCn;
10 | private Integer rank;
11 | private String infoTip;
12 | private double score;
13 | private Integer count;
14 | private String imageUrl;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/BgmVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class BgmVo {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/CalendarVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import com.myblog.adkblog.vo.Transfer.CalendarItemVo;
4 | import com.myblog.adkblog.vo.Transfer.WeekDay;
5 | import lombok.Data;
6 |
7 | import java.util.List;
8 |
9 | @Data
10 | public class CalendarVo {
11 | private List items;
12 | private WeekDay weekday;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/CommentVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import io.swagger.annotations.ApiModel;
4 | import io.swagger.annotations.ApiModelProperty;
5 | import lombok.Data;
6 |
7 | import java.util.List;
8 |
9 | @Data
10 | @ApiModel("评论显示Vo类")
11 | public class CommentVo {
12 | @ApiModelProperty("id")
13 | private String id;
14 | @ApiModelProperty("评论内容主体")
15 | private String content;
16 | @ApiModelProperty("用户类")
17 | private UserVo user;
18 | @ApiModelProperty("评论等级 有一级评论和二级评论")
19 | private Integer level;
20 | @ApiModelProperty("创建日期 为一个Long类型的时间戳")
21 | private String createDate;
22 | @ApiModelProperty("子级评论")
23 | private List childrens;
24 | @ApiModelProperty("评论给某个用户的用户类")
25 | private UserVo toUser;
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/MessageVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class MessageVo {
7 | private String id;
8 | private String authorName;
9 | private String content;
10 | private String contact;
11 | private String avatar;
12 | private String createDate;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/PicVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class PicVo {
7 | private String url;
8 | private String title;
9 | private String id;
10 | private String summary;
11 | private UserVo author;
12 | private String createTime;
13 | private Integer origin;
14 | private Integer tag;
15 | private Integer likes;
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/SenfunSearchVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class SenfunSearchVo {
7 | String title;
8 | String link;
9 | String tag;
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/SenfunVideoVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import com.myblog.adkblog.vo.Common.Epinfo;
4 | import lombok.Data;
5 |
6 | import java.util.List;
7 |
8 | @Data
9 | public class SenfunVideoVo {
10 | String epTitle;
11 | String epUrl;
12 | List epinfoList;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/TagVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class TagVo {
7 | // @JsonSerialize(using = ToStringSerializer.class)
8 | private Integer id;
9 |
10 | private String tagName;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/UserAllVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Data
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class UserAllVo {
11 | private String id;
12 | private String avatar;
13 | private String date;
14 | private String role;
15 | private String username;
16 | private String email;
17 | private String introduce;
18 | private String nickname;
19 | private String banner;
20 | private Integer gender;
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/UserVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | @Data
8 | @AllArgsConstructor
9 | @NoArgsConstructor
10 | public class UserVo {
11 | private String id;
12 | private String username;
13 | private String role;
14 | private String avatar;
15 | private String nickname;
16 | private String introduce;
17 | private String banner;
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/YhdmSearchVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import com.myblog.adkblog.vo.Common.Epinfo;
4 | import lombok.Data;
5 |
6 | import java.util.List;
7 |
8 | @Data
9 | public class YhdmSearchVo {
10 | private String title;
11 | private List epInfo;
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/myblog/adkblog/vo/Views/YhdmVideoVo.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog.vo.Views;
2 |
3 | import com.myblog.adkblog.vo.Common.Epinfo;
4 | import lombok.Data;
5 |
6 | import java.util.List;
7 |
8 | @Data
9 | public class YhdmVideoVo {
10 | private String title;
11 | private String videoUrl;
12 | private List epInfo;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/resources/application-dev.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | datasource:
3 | url: jdbc:mysql://localhost:3306/myblognew?userUnicode=true&characterEncoding=UTF-8&serverTimeZone=UTC
4 | driver-class-name: com.mysql.cj.jdbc.Driver
5 | username: root
6 | password: 123456
7 |
8 | application:
9 | name: adk_blog
10 | servlet:
11 | multipart:
12 | max-file-size: 5MB
13 | max-request-size: 6MB
14 | redis:
15 | port: 6379
16 | host: 127.0.0.1
17 | password:
18 | lettuce:
19 | pool:
20 | max-active: 5
21 | max-wait: -1
22 | max-idle: 500
23 | min-idle: 0
24 | timeout: 5000
25 |
26 | mybatis-plus:
27 | configuration:
28 | log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
29 |
30 | global-config:
31 | db-config:
32 | table-prefix: bl_
33 | # 内网访问 就需要改成内网来进行
34 | aliyun:
35 | accessKeyId: your keyId
36 | accessKeySecret: your keysecret
37 | endpoint: your endpoint #开发环境直接使用公网上传图片
38 | bucketName: your bucketName
39 | server:
40 | port: 8888
41 | bangumi:
42 | api: https://api.bgm.tv
43 | agent: your agent
44 |
45 | fileabsolutepath: D:\
46 | ossurl: your oss url
47 | sitemapPath: D:\
48 | baseUrl: your website
--------------------------------------------------------------------------------
/src/main/resources/application-prod.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | datasource:
3 | url: jdbc:mysql://localhost:3306/website?userUnicode=true&characterEncoding=UTF-8&serverTimeZone=UTC
4 | driver-class-name: com.mysql.cj.jdbc.Driver
5 | username: root
6 | password:
7 |
8 | application:
9 | name: adk_blog
10 | servlet:
11 | multipart:
12 | max-file-size: 5MB
13 | max-request-size: 6MB
14 | redis:
15 | port: 6379
16 | host: 127.0.0.1
17 | password:
18 | lettuce:
19 | pool:
20 | max-active: 5
21 | max-wait: -1
22 | max-idle: 500
23 | min-idle: 0
24 | timeout: 5000
25 |
26 | mybatis-plus:
27 | configuration:
28 | log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
29 |
30 | global-config:
31 | db-config:
32 | table-prefix: bl_
33 |
34 | # 内网访问 就需要改成内网来进行
35 | aliyun:
36 | accessKeyId: your keyId
37 | accessKeySecret: your keysecret
38 | endpoint: your endpoint #开发环境直接使用公网上传图片
39 | bucketName: your bucketName
40 | server:
41 | port: 4567
42 | bangumi:
43 | api: https://api.bgm.tv
44 | agent: your agent
45 |
46 | fileabsolutepath: D:\
47 | ossurl: your oss url
48 | sitemapPath: D:\
49 | baseUrl: your website
--------------------------------------------------------------------------------
/src/main/resources/application.properties:
--------------------------------------------------------------------------------
1 | spring.profiles.active=dev
--------------------------------------------------------------------------------
/src/main/resources/com/myblog/adkblog/dao/mapper/ArticleMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
70 |
71 |
113 |
114 |
120 |
121 |
128 |
129 |
--------------------------------------------------------------------------------
/src/main/resources/com/myblog/adkblog/dao/mapper/BgmCalendarMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
13 |
19 |
20 | INSERT INTO bgm_calendar
21 | (`id`, `url`, `type`, `name`, `name_cn`, `summary`, `total`, `score`, `rank`, `large`, `common`, `small`, `medium`, `grid`, `doing`, `air_date`, `air_weekday`, `count`)
22 | VALUES (#{id}, #{url}, #{type}, #{name}, #{name_cn}, #{summary},#{total},#{score}, #{rank}, #{large}, #{common},
23 | #{small}, #{medium}, #{grid}, #{doing},#{air_date}, #{air_weekday}, #{count})
24 |
25 |
26 | update bgm_calendar
27 | set `name` = #{name}, `name_cn`=#{name_cn}, `summary` =#{summary},`total` =#{total},`score` =#{score},`rank`=#{rank},
28 | `doing` =#{doing},`air_date` =#{air_date},`air_weekday` =#{air_weekday},`count` =#{count}
29 | where id = #{id}
30 |
31 |
--------------------------------------------------------------------------------
/src/main/resources/com/myblog/adkblog/dao/mapper/TagMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | insert into bl_tag (tag_name)
8 | values (#{tagName})
9 |
10 |
15 |
--------------------------------------------------------------------------------
/src/main/resources/static/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ADKcodeXD/ADKblog-backend/c62c03931ea10e6d6698797a17a37eadbe873981/src/main/resources/static/img/logo.png
--------------------------------------------------------------------------------
/src/test/java/com/myblog/adkblog/AdkblogApplicationTests.java:
--------------------------------------------------------------------------------
1 | package com.myblog.adkblog;
2 |
3 | import org.junit.Test;
4 |
5 |
6 |
7 | class AdkblogApplicationTests {
8 |
9 | }
10 |
--------------------------------------------------------------------------------