├── .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 | --------------------------------------------------------------------------------