├── .gitignore ├── .mvn └── wrapper │ ├── MavenWrapperDownloader.java │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── mvnw ├── mvnw.cmd ├── pom.xml ├── readme.md └── src ├── main ├── java │ └── com │ │ └── poi │ │ └── dudu │ │ ├── DuduApplication.java │ │ ├── base │ │ ├── BaseRequest.java │ │ ├── KnightInterceptors.java │ │ └── Response.java │ │ ├── config │ │ ├── CorsConfig.java │ │ ├── HibernateModuleConfig.java │ │ └── SwaggerConfig.java │ │ ├── controller │ │ ├── HomeController.java │ │ ├── RoleController.java │ │ └── UserController.java │ │ ├── data │ │ ├── AnimeDetail.java │ │ ├── AnimeDetailEntry.java │ │ ├── AnimeDetailPipe.java │ │ ├── AnimeSpiderEntry.java │ │ ├── AnimeSummaryView.java │ │ ├── DataCollector.java │ │ └── MainPipeline.java │ │ ├── domain │ │ ├── Anime.java │ │ ├── Home.java │ │ ├── Recommend.java │ │ ├── Role.java │ │ ├── Type.java │ │ └── User.java │ │ ├── mapper │ │ ├── AnimeRepository.java │ │ ├── RecommendRepository.java │ │ ├── RoleRepository.java │ │ ├── TypeRepository.java │ │ └── UserRepository.java │ │ └── service │ │ ├── AnimeService.java │ │ ├── HomeService.java │ │ ├── RoleService.java │ │ ├── UserService.java │ │ └── impl │ │ ├── AnimeServiceImpl.java │ │ ├── HomeServiceImpl.java │ │ ├── RoleServiceImpl.java │ │ └── UserServiceImpl.java └── resources │ └── application.yml └── test └── java └── com └── poi └── dudu └── DuduApplicationTests.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/MavenWrapperDownloader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2007-present the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import java.net.*; 18 | import java.io.*; 19 | import java.nio.channels.*; 20 | import java.util.Properties; 21 | 22 | public class MavenWrapperDownloader { 23 | 24 | private static final String WRAPPER_VERSION = "0.5.6"; 25 | /** 26 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. 27 | */ 28 | private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" 29 | + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; 30 | 31 | /** 32 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to 33 | * use instead of the default one. 34 | */ 35 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH = 36 | ".mvn/wrapper/maven-wrapper.properties"; 37 | 38 | /** 39 | * Path where the maven-wrapper.jar will be saved to. 40 | */ 41 | private static final String MAVEN_WRAPPER_JAR_PATH = 42 | ".mvn/wrapper/maven-wrapper.jar"; 43 | 44 | /** 45 | * Name of the property which should be used to override the default download url for the wrapper. 46 | */ 47 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; 48 | 49 | public static void main(String args[]) { 50 | System.out.println("- Downloader started"); 51 | File baseDirectory = new File(args[0]); 52 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); 53 | 54 | // If the maven-wrapper.properties exists, read it and check if it contains a custom 55 | // wrapperUrl parameter. 56 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); 57 | String url = DEFAULT_DOWNLOAD_URL; 58 | if (mavenWrapperPropertyFile.exists()) { 59 | FileInputStream mavenWrapperPropertyFileInputStream = null; 60 | try { 61 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); 62 | Properties mavenWrapperProperties = new Properties(); 63 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); 64 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); 65 | } catch (IOException e) { 66 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); 67 | } finally { 68 | try { 69 | if (mavenWrapperPropertyFileInputStream != null) { 70 | mavenWrapperPropertyFileInputStream.close(); 71 | } 72 | } catch (IOException e) { 73 | // Ignore ... 74 | } 75 | } 76 | } 77 | System.out.println("- Downloading from: " + url); 78 | 79 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); 80 | if (!outputFile.getParentFile().exists()) { 81 | if (!outputFile.getParentFile().mkdirs()) { 82 | System.out.println( 83 | "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); 84 | } 85 | } 86 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); 87 | try { 88 | downloadFileFromURL(url, outputFile); 89 | System.out.println("Done"); 90 | System.exit(0); 91 | } catch (Throwable e) { 92 | System.out.println("- Error downloading"); 93 | e.printStackTrace(); 94 | System.exit(1); 95 | } 96 | } 97 | 98 | private static void downloadFileFromURL(String urlString, File destination) throws Exception { 99 | if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { 100 | String username = System.getenv("MVNW_USERNAME"); 101 | char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); 102 | Authenticator.setDefault(new Authenticator() { 103 | @Override 104 | protected PasswordAuthentication getPasswordAuthentication() { 105 | return new PasswordAuthentication(username, password); 106 | } 107 | }); 108 | } 109 | URL website = new URL(urlString); 110 | ReadableByteChannel rbc; 111 | rbc = Channels.newChannel(website.openStream()); 112 | FileOutputStream fos = new FileOutputStream(destination); 113 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 114 | fos.close(); 115 | rbc.close(); 116 | } 117 | 118 | } 119 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eisuto/DuDu/3618e1b397b6b3742af1ac39e4ba149aaee68ea9/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Mingw, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | fi 118 | 119 | if [ -z "$JAVA_HOME" ]; then 120 | javaExecutable="`which javac`" 121 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 122 | # readlink(1) is not available as standard on Solaris 10. 123 | readLink=`which readlink` 124 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 125 | if $darwin ; then 126 | javaHome="`dirname \"$javaExecutable\"`" 127 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 128 | else 129 | javaExecutable="`readlink -f \"$javaExecutable\"`" 130 | fi 131 | javaHome="`dirname \"$javaExecutable\"`" 132 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 133 | JAVA_HOME="$javaHome" 134 | export JAVA_HOME 135 | fi 136 | fi 137 | fi 138 | 139 | if [ -z "$JAVACMD" ] ; then 140 | if [ -n "$JAVA_HOME" ] ; then 141 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 142 | # IBM's JDK on AIX uses strange locations for the executables 143 | JAVACMD="$JAVA_HOME/jre/sh/java" 144 | else 145 | JAVACMD="$JAVA_HOME/bin/java" 146 | fi 147 | else 148 | JAVACMD="`which java`" 149 | fi 150 | fi 151 | 152 | if [ ! -x "$JAVACMD" ] ; then 153 | echo "Error: JAVA_HOME is not defined correctly." >&2 154 | echo " We cannot execute $JAVACMD" >&2 155 | exit 1 156 | fi 157 | 158 | if [ -z "$JAVA_HOME" ] ; then 159 | echo "Warning: JAVA_HOME environment variable is not set." 160 | fi 161 | 162 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 163 | 164 | # traverses directory structure from process work directory to filesystem root 165 | # first directory with .mvn subdirectory is considered project base directory 166 | find_maven_basedir() { 167 | 168 | if [ -z "$1" ] 169 | then 170 | echo "Path not specified to find_maven_basedir" 171 | return 1 172 | fi 173 | 174 | basedir="$1" 175 | wdir="$1" 176 | while [ "$wdir" != '/' ] ; do 177 | if [ -d "$wdir"/.mvn ] ; then 178 | basedir=$wdir 179 | break 180 | fi 181 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 182 | if [ -d "${wdir}" ]; then 183 | wdir=`cd "$wdir/.."; pwd` 184 | fi 185 | # end of workaround 186 | done 187 | echo "${basedir}" 188 | } 189 | 190 | # concatenates all lines of a file 191 | concat_lines() { 192 | if [ -f "$1" ]; then 193 | echo "$(tr -s '\n' ' ' < "$1")" 194 | fi 195 | } 196 | 197 | BASE_DIR=`find_maven_basedir "$(pwd)"` 198 | if [ -z "$BASE_DIR" ]; then 199 | exit 1; 200 | fi 201 | 202 | ########################################################################################## 203 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 204 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 205 | ########################################################################################## 206 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 207 | if [ "$MVNW_VERBOSE" = true ]; then 208 | echo "Found .mvn/wrapper/maven-wrapper.jar" 209 | fi 210 | else 211 | if [ "$MVNW_VERBOSE" = true ]; then 212 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 213 | fi 214 | if [ -n "$MVNW_REPOURL" ]; then 215 | jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 216 | else 217 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 218 | fi 219 | while IFS="=" read key value; do 220 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 221 | esac 222 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 223 | if [ "$MVNW_VERBOSE" = true ]; then 224 | echo "Downloading from: $jarUrl" 225 | fi 226 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 227 | if $cygwin; then 228 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` 229 | fi 230 | 231 | if command -v wget > /dev/null; then 232 | if [ "$MVNW_VERBOSE" = true ]; then 233 | echo "Found wget ... using wget" 234 | fi 235 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 236 | wget "$jarUrl" -O "$wrapperJarPath" 237 | else 238 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" 239 | fi 240 | elif command -v curl > /dev/null; then 241 | if [ "$MVNW_VERBOSE" = true ]; then 242 | echo "Found curl ... using curl" 243 | fi 244 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 245 | curl -o "$wrapperJarPath" "$jarUrl" -f 246 | else 247 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f 248 | fi 249 | 250 | else 251 | if [ "$MVNW_VERBOSE" = true ]; then 252 | echo "Falling back to using Java to download" 253 | fi 254 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 255 | # For Cygwin, switch paths to Windows format before running javac 256 | if $cygwin; then 257 | javaClass=`cygpath --path --windows "$javaClass"` 258 | fi 259 | if [ -e "$javaClass" ]; then 260 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 261 | if [ "$MVNW_VERBOSE" = true ]; then 262 | echo " - Compiling MavenWrapperDownloader.java ..." 263 | fi 264 | # Compiling the Java class 265 | ("$JAVA_HOME/bin/javac" "$javaClass") 266 | fi 267 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 268 | # Running the downloader 269 | if [ "$MVNW_VERBOSE" = true ]; then 270 | echo " - Running MavenWrapperDownloader.java ..." 271 | fi 272 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 273 | fi 274 | fi 275 | fi 276 | fi 277 | ########################################################################################## 278 | # End of extension 279 | ########################################################################################## 280 | 281 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 282 | if [ "$MVNW_VERBOSE" = true ]; then 283 | echo $MAVEN_PROJECTBASEDIR 284 | fi 285 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 286 | 287 | # For Cygwin, switch paths to Windows format before running java 288 | if $cygwin; then 289 | [ -n "$M2_HOME" ] && 290 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 291 | [ -n "$JAVA_HOME" ] && 292 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 293 | [ -n "$CLASSPATH" ] && 294 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 295 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 296 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 297 | fi 298 | 299 | # Provide a "standardized" way to retrieve the CLI args that will 300 | # work with both Windows and non-Windows executions. 301 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" 302 | export MAVEN_CMD_LINE_ARGS 303 | 304 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 305 | 306 | exec "$JAVACMD" \ 307 | $MAVEN_OPTS \ 308 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 309 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 310 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 311 | -------------------------------------------------------------------------------- /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 "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\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/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" 124 | 125 | FOR /F "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%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.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% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 162 | if ERRORLEVEL 1 goto error 163 | goto end 164 | 165 | :error 166 | set ERROR_CODE=1 167 | 168 | :end 169 | @endlocal & set ERROR_CODE=%ERROR_CODE% 170 | 171 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 172 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 173 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 174 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 175 | :skipRcPost 176 | 177 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 178 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 179 | 180 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 181 | 182 | exit /B %ERROR_CODE% 183 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.4.4 9 | 10 | 11 | com.poi 12 | dudu 13 | 0.0.1-SNAPSHOT 14 | dudu 15 | Demo project for Spring Boot 16 | 17 | 1.8 18 | 19 | 20 | 21 | 22 | com.geccocrawler 23 | gecco 24 | 1.3.0 25 | 26 | 27 | io.springfox 28 | springfox-boot-starter 29 | 3.0.0 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-web 35 | 36 | 37 | 38 | org.springframework.boot 39 | spring-boot-starter-tomcat 40 | 41 | 42 | 43 | 44 | 45 | org.springframework.boot 46 | spring-boot-starter-undertow 47 | 48 | 49 | 50 | org.springframework.boot 51 | spring-boot-devtools 52 | runtime 53 | true 54 | 55 | 56 | mysql 57 | mysql-connector-java 58 | runtime 59 | 60 | 61 | org.projectlombok 62 | lombok 63 | true 64 | 65 | 66 | org.springframework.boot 67 | spring-boot-starter-test 68 | test 69 | 70 | 71 | org.springframework.boot 72 | spring-boot-starter-data-jpa 73 | 74 | 75 | com.alibaba 76 | fastjson 77 | 1.2.75 78 | 79 | 80 | 81 | com.fasterxml.jackson.datatype 82 | jackson-datatype-hibernate5 83 | 2.10.1 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | org.springframework.boot 92 | spring-boot-maven-plugin 93 | 94 | 95 | 96 | org.projectlombok 97 | lombok 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 基于SpringBoot Nginx的流媒体动漫点播网站 2 | 3 | 项目重构 4 | 5 | go版本移至(https://github.com/eisuto/dudu-go) 6 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/DuduApplication.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.SpringBootConfiguration; 5 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | 8 | @SpringBootApplication 9 | public class DuduApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(DuduApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/base/BaseRequest.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.base; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 基本请求对象 7 | * 8 | * @author eisuto 9 | */ 10 | @Data 11 | public class BaseRequest { 12 | /** 13 | * 搜索关键字 14 | */ 15 | private String keyword; 16 | /** 17 | * 当前页数 18 | */ 19 | private Integer number; 20 | /** 21 | * 页大小 22 | */ 23 | private Integer size; 24 | /** 25 | * 总页数 26 | */ 27 | private Integer totalPages; 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/base/KnightInterceptors.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.base; 2 | 3 | 4 | import org.springframework.web.servlet.HandlerInterceptor; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | import javax.servlet.http.HttpSession; 9 | 10 | /** 11 | * @author eisuto 12 | */ 13 | public class KnightInterceptors implements HandlerInterceptor { 14 | @Override 15 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 16 | HttpSession session = request.getSession(); 17 | return session.getAttribute("userId") != null; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/base/Response.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.base; 2 | 3 | import lombok.Data; 4 | import org.springframework.http.ResponseEntity; 5 | 6 | import java.io.Serializable; 7 | import java.util.ArrayList; 8 | import java.util.Vector; 9 | 10 | /** 11 | * @author eisuto 12 | */ 13 | @Data 14 | public class Response implements Serializable { 15 | private static final long serialVersionUID = 3886133510113334083L; 16 | private Integer code; 17 | private String msg; 18 | private T data; 19 | 20 | public Response(Integer code, String msg, T data) { 21 | this.code = code; 22 | this.msg = msg; 23 | this.data = data; 24 | } 25 | 26 | public Response(T data) { 27 | this(200, "操作成功", data); 28 | } 29 | 30 | public Response() { 31 | this(null); 32 | } 33 | 34 | /** 35 | * 操作失败时 36 | */ 37 | public void fail(){ 38 | this.code = 400; 39 | this.msg = "操作失败"; 40 | } 41 | 42 | public Response success(T data){ 43 | return new Response<>(data); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.config; 2 | import com.poi.dudu.base.KnightInterceptors; 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 5 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 7 | 8 | /** 9 |  * 预处理 10 |  * @author eisuto 11 |  * @time 12 |  */ 13 | @Configuration 14 | public class CorsConfig implements WebMvcConfigurer { 15 | 16 | 17 | 18 | /** 19 | * 登录拦截 20 | * @param registry 21 | */ 22 | @Override 23 | public void addInterceptors(InterceptorRegistry registry) { 24 | registry.addInterceptor(new KnightInterceptors()).addPathPatterns( 25 | "/user/space" 26 | ); 27 | } 28 | 29 | @Override 30 | public void addCorsMappings(CorsRegistry registry) { 31 | registry.addMapping("/**") 32 | .allowedOrigins("*") 33 | .allowedMethods("*") 34 | .allowedHeaders("*") 35 | .exposedHeaders("*"); 36 | } 37 | } -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/config/HibernateModuleConfig.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.config; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 8 | 9 | @Configuration 10 | public class HibernateModuleConfig { 11 | @Bean 12 | public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 13 | MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 14 | ObjectMapper objectMapper = jsonConverter.getObjectMapper(); 15 | objectMapper.registerModule(new Hibernate5Module()); 16 | return jsonConverter; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/config/SwaggerConfig.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import springfox.documentation.builders.ApiInfoBuilder; 6 | import springfox.documentation.builders.PathSelectors; 7 | import springfox.documentation.builders.RequestHandlerSelectors; 8 | import springfox.documentation.oas.annotations.EnableOpenApi; 9 | import springfox.documentation.service.ApiInfo; 10 | import springfox.documentation.spi.DocumentationType; 11 | import springfox.documentation.spring.web.plugins.Docket; 12 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 13 | 14 | /** 15 | * @author eisuto 16 | */ 17 | 18 | @EnableOpenApi 19 | @Configuration 20 | public class SwaggerConfig { 21 | @Bean 22 | public Docket createRestApi() { 23 | return new Docket( 24 | // 设置使用 OpenApi 3.0 规范 25 | DocumentationType.OAS_30) 26 | // 配置项目基本信息 27 | .apiInfo(apiInfo()) 28 | // 设置项目组名 29 | //.groupName("xxx组") 30 | // 选择那些路径和api会生成document 31 | .select() 32 | // 对所有api进行监控 33 | .apis(RequestHandlerSelectors.any()) 34 | // 如果需要指定对某个包的接口进行监控,则可以配置如下 35 | //.apis(RequestHandlerSelectors.basePackage("mydlq.swagger.example.controller")) 36 | // 对所有路径进行监控 37 | .paths(PathSelectors.any()) 38 | // 忽略以"/error"开头的路径,可以防止显示如404错误接口 39 | .paths(PathSelectors.regex("/error.*").negate()) 40 | // 忽略以"/actuator"开头的路径 41 | .paths(PathSelectors.regex("/actuator.*").negate()) 42 | .build(); 43 | } 44 | 45 | private ApiInfo apiInfo() { 46 | return new ApiInfoBuilder() 47 | // 文档标题 48 | .title("dudu动漫网站接口文档") 49 | // 文档版本 50 | .version("0.0.1") 51 | // 设置许可声明信息 52 | .license("Apache LICENSE 2.0") 53 | // 设置许可证URL地址 54 | .licenseUrl("https://github/my-dlq") 55 | .build(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/controller/HomeController.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.controller; 2 | 3 | import com.poi.dudu.base.Response; 4 | import com.poi.dudu.service.HomeService; 5 | import io.swagger.annotations.Api; 6 | import io.swagger.annotations.ApiImplicitParam; 7 | import io.swagger.annotations.ApiImplicitParams; 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.PostMapping; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RestController; 14 | 15 | import javax.annotation.Resource; 16 | 17 | 18 | /** 19 | * 主页控制器 20 | * @author eisuto 21 | */ 22 | @Api(tags = "首页") 23 | @RestController 24 | @RequestMapping("/home") 25 | public class HomeController { 26 | 27 | @Resource 28 | HomeService homeService; 29 | 30 | 31 | @ApiOperation(value = "获取首页数据", notes = "目前只有推荐数据") 32 | @GetMapping("/data") 33 | public Response data() { 34 | return homeService.data(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/controller/RoleController.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.controller; 2 | 3 | import java.util.List; 4 | 5 | import com.poi.dudu.base.Response; 6 | import com.poi.dudu.domain.Role; 7 | import com.poi.dudu.service.RoleService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.data.domain.Page; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.PutMapping; 13 | import org.springframework.web.bind.annotation.DeleteMapping; 14 | import org.springframework.web.bind.annotation.PathVariable; 15 | import org.springframework.web.bind.annotation.RequestBody; 16 | import org.springframework.web.bind.annotation.RequestMapping; 17 | import org.springframework.web.bind.annotation.RestController; 18 | 19 | /** 20 | * 角色Controller 21 | * 22 | * @author eisuto 23 | * @date 2021-04-07 24 | */ 25 | @RestController 26 | @RequestMapping("/api/system/role") 27 | public class RoleController { 28 | @Autowired 29 | private RoleService roleService; 30 | 31 | /** 32 | * 查询角色列表 33 | */ 34 | 35 | @GetMapping("/list") 36 | public Response list(Role role) { 37 | Response response = new Response(); 38 | response.setData(roleService.selectRoleList(role)); 39 | return response; 40 | } 41 | 42 | 43 | /** 44 | * 获取角色详细信息 45 | */ 46 | @GetMapping(value = "/{id}") 47 | public Response getInfo(@PathVariable("id") Long id) { 48 | Response response = new Response(); 49 | response.setData(roleService.selectRoleById(id)); 50 | return response; 51 | } 52 | 53 | /** 54 | * 新增角色 55 | */ 56 | @PostMapping 57 | public Response add(@RequestBody Role role) { 58 | Response response = new Response(); 59 | response.setData(roleService.insertRole(role)); 60 | return response; 61 | } 62 | 63 | /** 64 | * 修改角色 65 | */ 66 | @PutMapping 67 | public Response edit(@RequestBody Role role) { 68 | Response response = new Response(); 69 | response.setData(roleService.updateRole(role)); 70 | return response; 71 | } 72 | 73 | /** 74 | * 删除角色 75 | */ 76 | @DeleteMapping("/{ids}") 77 | public Response remove(@PathVariable Long[] ids) { 78 | roleService.deleteRoleByIds(ids); 79 | return new Response(); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.controller; 2 | 3 | import com.poi.dudu.base.BaseRequest; 4 | import com.poi.dudu.base.Response; 5 | import com.poi.dudu.domain.User; 6 | import com.poi.dudu.service.UserService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiImplicitParam; 9 | import io.swagger.annotations.ApiImplicitParams; 10 | import io.swagger.annotations.ApiOperation; 11 | import org.springframework.web.bind.annotation.*; 12 | 13 | import javax.annotation.Resource; 14 | import javax.servlet.http.HttpSession; 15 | import java.util.HashMap; 16 | import java.util.Map; 17 | 18 | /** 19 | * 用户相关 控制器 20 | * 21 | * @author eisuto 22 | */ 23 | @Api(tags = "用户相关(登录注册在此)") 24 | @RestController 25 | @RequestMapping("/user") 26 | public class UserController { 27 | 28 | @Resource 29 | UserService userService; 30 | 31 | /** 32 | * 登录 33 | */ 34 | @ApiOperation(value = "登录", notes = "手机号、邮箱、用户名均可") 35 | @ApiImplicitParams({ 36 | @ApiImplicitParam(name = "name", value = "手机号、邮箱、用户名", required = true), 37 | @ApiImplicitParam(name = "password", value = "密码", required = true), 38 | }) 39 | @PostMapping("/login") 40 | public Response login(User user) throws Exception { 41 | User resUser = userService.login(user); 42 | Response response = new Response<>(resUser); 43 | if(resUser == null){ 44 | response.fail(); 45 | } 46 | return response; 47 | } 48 | 49 | /** 50 | * 注册 51 | */ 52 | @ApiOperation(value = "注册", notes = "用户注册") 53 | @ApiImplicitParams({ 54 | @ApiImplicitParam(name = "email", value = "邮箱", required = true), 55 | @ApiImplicitParam(name = "verifyCode", value = "验证码(默认传1234)", required = true), 56 | @ApiImplicitParam(name = "password", value = "密码", required = true), 57 | }) 58 | @PostMapping("/register") 59 | public Response register(User user) throws Exception { 60 | User resUser = userService.register(user); 61 | Response response = new Response<>(resUser); 62 | if(resUser == null){ 63 | response.fail(); 64 | } 65 | return response; 66 | } 67 | 68 | /** 69 | * 获取验证码 70 | */ 71 | @ApiOperation(value = "获取验证码", notes = "此验证码用于注册") 72 | @GetMapping("/getVerifyCode") 73 | public Response getVerifyCode(){ 74 | return new Response<>(); 75 | } 76 | 77 | 78 | 79 | /** 80 | * 获取用户列表 81 | */ 82 | @GetMapping("/users") 83 | public Response usersList(BaseRequest base) throws Exception { 84 | return userService.usersList(base); 85 | } 86 | 87 | /** 88 | * 后台 - 添加 89 | */ 90 | @PostMapping("/users") 91 | public Response userAdd(@RequestBody User user) throws Exception { 92 | return userService.usersAdd(user); 93 | } 94 | 95 | /** 96 | * 后台 - 批量删除 97 | */ 98 | @DeleteMapping("/users/{ids}") 99 | public Response userDel(@PathVariable Long[] ids) throws Exception { 100 | Response response = new Response<>(); 101 | int i = userService.userDel(ids); 102 | if (i == 0) { 103 | response.fail(); 104 | } 105 | return response; 106 | } 107 | 108 | 109 | } 110 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/data/AnimeDetail.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.data; 2 | 3 | import com.geccocrawler.gecco.annotation.Attr; 4 | import com.geccocrawler.gecco.annotation.Href; 5 | import com.geccocrawler.gecco.annotation.HtmlField; 6 | import com.geccocrawler.gecco.spider.HtmlBean; 7 | 8 | public class AnimeDetail implements HtmlBean { 9 | @Attr("href") 10 | @HtmlField(cssPath = "res_links_a") 11 | private String pan; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/data/AnimeDetailEntry.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.data; 2 | 3 | import com.geccocrawler.gecco.annotation.Gecco; 4 | import com.geccocrawler.gecco.annotation.RequestParameter; 5 | import com.geccocrawler.gecco.spider.HtmlBean; 6 | import lombok.Data; 7 | 8 | @Data 9 | @Gecco(matchUrl = "https://www.agefans.cc/detail/{id}",pipelines = "animeDetailPipe") 10 | public class AnimeDetailEntry implements HtmlBean { 11 | private AnimeDetail animeDetail; 12 | 13 | @RequestParameter("id") 14 | private int id; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/data/AnimeDetailPipe.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.data; 2 | 3 | import com.geccocrawler.gecco.pipeline.Pipeline; 4 | 5 | public class AnimeDetailPipe implements Pipeline { 6 | 7 | @Override 8 | public void process(AnimeDetailEntry newsDetailEntry) { 9 | AnimeDetail newsDetail = newsDetailEntry.getAnimeDetail(); 10 | System.out.println(newsDetail); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/data/AnimeSpiderEntry.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.data; 2 | 3 | import com.geccocrawler.gecco.GeccoEngine; 4 | import com.geccocrawler.gecco.annotation.Gecco; 5 | import com.geccocrawler.gecco.annotation.HtmlField; 6 | import com.geccocrawler.gecco.annotation.Request; 7 | import com.geccocrawler.gecco.annotation.Text; 8 | import com.geccocrawler.gecco.request.HttpRequest; 9 | import com.geccocrawler.gecco.spider.HtmlBean; 10 | import lombok.Data; 11 | 12 | import java.util.List; 13 | 14 | @Data 15 | @Gecco(matchUrl = "https://www.agefans.cc/catalog/all-all-all-all-all-time-{page}", pipelines = {"mainPipeline", "animeDetailPipe"}) 16 | public class AnimeSpiderEntry implements HtmlBean { 17 | @Request 18 | private HttpRequest request; 19 | 20 | @HtmlField(cssPath = ".blockcontent1") 21 | private List animeSummaryViews; 22 | 23 | @Text 24 | @HtmlField(cssPath = ".pbutton asciifont > a") 25 | private String nextPage; 26 | 27 | public static void main(String[] args) { 28 | GeccoEngine.create() 29 | .classpath("com.poi.dudu.data") 30 | .start("https://www.agefans.cc/catalog/all-all-all-all-all-time-1") 31 | .thread(5) 32 | .interval(500) 33 | .start(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/data/AnimeSummaryView.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.data; 2 | 3 | import com.geccocrawler.gecco.annotation.Href; 4 | import com.geccocrawler.gecco.annotation.HtmlField; 5 | import com.geccocrawler.gecco.annotation.Text; 6 | import com.geccocrawler.gecco.spider.HtmlBean; 7 | import lombok.Data; 8 | 9 | import javax.persistence.Column; 10 | import javax.persistence.Lob; 11 | import java.sql.Date; 12 | 13 | @Data 14 | public class AnimeSummaryView implements HtmlBean { 15 | @Text 16 | @HtmlField(cssPath = ".cell_imform_name") 17 | private String cnName; 18 | 19 | private String jpName; 20 | 21 | private String img; 22 | 23 | //Href(click = true)能够让解析出来的链接直接放入待解析队列 24 | @Href(click = true) 25 | @HtmlField(cssPath = ".cell_imform_name") 26 | private String detailUrl; 27 | 28 | /** 29 | * 剧情类型 30 | */ 31 | private String types; 32 | 33 | /** 34 | * 首播时间 35 | */ 36 | private Date firstPlayDate; 37 | 38 | 39 | /** 40 | * 放送状态 41 | */ 42 | private String status; 43 | 44 | /** 45 | * 制作公司 46 | */ 47 | private String company; 48 | 49 | /** 50 | * 原作者 51 | */ 52 | private String author; 53 | 54 | 55 | /** 56 | * 简介 57 | */ 58 | private String summary; 59 | 60 | 61 | 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/data/DataCollector.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.data; 2 | 3 | /** 4 | * 动画数据爬取服务 5 | */ 6 | public class DataCollector { 7 | public static void main(String[] args) { 8 | 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/data/MainPipeline.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.data; 2 | 3 | import com.geccocrawler.gecco.annotation.PipelineName; 4 | import com.geccocrawler.gecco.pipeline.Pipeline; 5 | import com.geccocrawler.gecco.request.HttpRequest; 6 | import com.geccocrawler.gecco.scheduler.SchedulerContext; 7 | 8 | import java.util.List; 9 | 10 | //注意,这里的PipelineName中的值必须与入口类中的pipelines对应 11 | @PipelineName("mainPipeline") 12 | public class MainPipeline implements Pipeline { 13 | 14 | @Override 15 | public void process(AnimeSpiderEntry newsSpiderEntry) { 16 | HttpRequest request = newsSpiderEntry.getRequest(); 17 | List newsSummaryViews = newsSpiderEntry.getAnimeSummaryViews(); 18 | for(AnimeSummaryView newsSummaryView : newsSummaryViews) { 19 | System.out.println(newsSummaryView); 20 | } 21 | //获取下一页url 22 | int nextPage = Integer.parseInt(newsSpiderEntry.getNextPage()) + 1; 23 | //将下一页的url加入待解析队列 24 | String nextPageurl = "https://www.agefans.cc/catalog/all-all-all-all-all-time-" + nextPage; 25 | SchedulerContext.into(request.subRequest(nextPageurl)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/domain/Anime.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.domain; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIdentityInfo; 4 | import com.fasterxml.jackson.annotation.JsonIgnore; 5 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 6 | import com.fasterxml.jackson.annotation.ObjectIdGenerators; 7 | import lombok.Data; 8 | 9 | import javax.persistence.*; 10 | import java.sql.Date; 11 | import java.util.HashSet; 12 | import java.util.Set; 13 | 14 | /** 15 | * 动画 16 | * @author eisuto 17 | */ 18 | @Data 19 | @Entity 20 | @Table(name = "anime") 21 | @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) 22 | public class Anime { 23 | @Id 24 | @GeneratedValue 25 | private Long id; 26 | 27 | /** 28 | * 名称 中文 29 | */ 30 | @Column 31 | private String nameChinese; 32 | 33 | /** 34 | * 名称 日文 35 | */ 36 | @Column 37 | private String nameJapanese; 38 | 39 | /** 40 | * 图片路径 41 | */ 42 | @Column 43 | private String imgPath; 44 | 45 | /** 46 | * 类型 - 多对多 47 | */ 48 | 49 | @ManyToMany(targetEntity = Type.class, cascade = CascadeType.ALL) 50 | @JoinTable(name = "anime_type", 51 | joinColumns = {@JoinColumn(name = "anime_id", referencedColumnName = "id")}, 52 | inverseJoinColumns = {@JoinColumn(name = "type_id", referencedColumnName = "id")} 53 | ) 54 | private Set types; 55 | 56 | /** 57 | * 首播时间 58 | */ 59 | @Column 60 | private Date firstPlayDate; 61 | 62 | 63 | /** 64 | * 放送状态 65 | */ 66 | @Column 67 | private String status; 68 | 69 | /** 70 | * 制作公司 71 | */ 72 | @Column 73 | private String company; 74 | 75 | /** 76 | * 原作者 77 | */ 78 | private String author; 79 | 80 | 81 | /** 82 | * 简介 83 | */ 84 | @Lob 85 | @Column(columnDefinition="text") 86 | private String summary; 87 | 88 | } 89 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/domain/Home.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.domain; 2 | 3 | import lombok.Data; 4 | import org.hibernate.annotations.Table; 5 | 6 | import javax.persistence.Entity; 7 | import java.util.List; 8 | 9 | /** 10 | * 首页数据 11 | * 12 | * @author eisut 13 | */ 14 | @Data 15 | public class Home { 16 | /** 17 | * 推荐动画列表 18 | */ 19 | public List recommendList; 20 | 21 | /** 22 | * 周放送列表 23 | */ 24 | public List> liveList; 25 | 26 | 27 | /** 28 | * 排行榜 29 | */ 30 | public List leaderboard; 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/domain/Recommend.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.domain; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.*; 6 | 7 | /** 8 | * 首页推荐 9 | * @author eisuto 10 | */ 11 | @Data 12 | @Entity 13 | @Table(name = "recommend") 14 | public class Recommend { 15 | @Id 16 | @GeneratedValue 17 | private Long id; 18 | @Column 19 | private String animeName; 20 | @Column 21 | private String animeLink; 22 | @Column 23 | private String imgLink; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/domain/Role.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.domain; 2 | 3 | import lombok.Data; 4 | import org.hibernate.annotations.CreationTimestamp; 5 | 6 | import javax.persistence.*; 7 | import java.util.Date; 8 | 9 | /** 10 | * 角色 11 | * @author eisuto 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "role") 16 | public class Role{ 17 | 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private Long id; 21 | 22 | @Column 23 | private String name; 24 | 25 | @Column 26 | private Integer status; 27 | 28 | @CreationTimestamp 29 | @Column 30 | private Date createTime; 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/domain/Type.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.domain; 2 | 3 | import com.fasterxml.jackson.annotation.*; 4 | import lombok.Data; 5 | 6 | import javax.persistence.*; 7 | import java.util.HashSet; 8 | import java.util.Set; 9 | 10 | /** 11 | * 动画类型 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "type") 16 | @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) 17 | public class Type { 18 | @Id 19 | @GeneratedValue 20 | private Long id; 21 | 22 | /** 23 | * 类型名称 24 | */ 25 | @Column 26 | private String name; 27 | 28 | /** 29 | * 动画 - 多对多 30 | */ 31 | @JsonIgnore 32 | @ManyToMany(mappedBy = "types") //配置多表关系 33 | private Set animes = new HashSet<>(); 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/domain/User.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.domain; 2 | 3 | import lombok.Data; 4 | import org.hibernate.annotations.CreationTimestamp; 5 | import org.hibernate.annotations.UpdateTimestamp; 6 | 7 | import javax.persistence.*; 8 | import java.util.Date; 9 | 10 | /** 11 | * @author eisuto 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "user") 16 | public class User { 17 | @TableGenerator( 18 | name = "plusOne", 19 | initialValue = 10000, 20 | allocationSize = 1 21 | ) 22 | @Id 23 | @GeneratedValue(strategy = GenerationType.TABLE,generator = "plusOne") 24 | private Long id; 25 | 26 | @Column 27 | private String name; 28 | 29 | @Column 30 | private String password; 31 | 32 | @Column 33 | private Integer level; 34 | 35 | @Column 36 | private String email; 37 | 38 | @Column 39 | private String phone; 40 | 41 | @Column 42 | private String avatar; 43 | 44 | @CreationTimestamp 45 | @Column 46 | private Date createTime; 47 | 48 | @UpdateTimestamp 49 | @Column 50 | private Date loginTime; 51 | 52 | private String verifyCode; 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/mapper/AnimeRepository.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.mapper; 2 | 3 | import com.poi.dudu.domain.Anime; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 6 | import org.springframework.data.jpa.repository.Query; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author eisuto 12 | */ 13 | public interface AnimeRepository extends JpaRepository, JpaSpecificationExecutor { 14 | 15 | Anime findOneByNameChinese(String name); 16 | 17 | // /** 18 | // * 推荐动画 随机10条 19 | // */ 20 | // List findFirstByOrderBy(); 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/mapper/RecommendRepository.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.mapper; 2 | 3 | import com.poi.dudu.domain.Recommend; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 首页推荐 9 | * @author eisuto 10 | */ 11 | @Repository 12 | public interface RecommendRepository extends JpaRepository { 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/mapper/RoleRepository.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.mapper; 2 | 3 | import com.poi.dudu.domain.Role; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author eisuto 9 | */ 10 | @Repository 11 | public interface RoleRepository extends JpaRepository { 12 | /** 13 | * 批量删除 14 | * @param ids 15 | * @return 16 | */ 17 | void deleteByIdIn(Long[] ids); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/mapper/TypeRepository.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.mapper; 2 | 3 | import com.poi.dudu.domain.Type; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author eisuto 11 | */ 12 | public interface TypeRepository extends JpaRepository, JpaSpecificationExecutor { 13 | 14 | Type findOneByName(String name); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/mapper/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.mapper; 2 | 3 | import com.poi.dudu.domain.User; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.Modifying; 6 | import org.springframework.data.jpa.repository.Query; 7 | import org.springframework.data.repository.query.Param; 8 | import org.springframework.stereotype.Repository; 9 | import org.springframework.transaction.annotation.Transactional; 10 | 11 | 12 | /** 13 | * @author eisuto 14 | */ 15 | @Repository 16 | public interface UserRepository extends JpaRepository { 17 | 18 | /** 19 | * 登录 20 | * @return 21 | */ 22 | @Query(value = 23 | "select u from User u " + 24 | "where u.password = :password and (u.name = :name or u.phone =:name or u.email =:name)") 25 | User login(@Param("password") String password,@Param("name") String name); 26 | 27 | /** 28 | * 检查用户是否存在 29 | * 查询是否有相同的用户名、邮箱、手机号 30 | */ 31 | @Query(value = 32 | "select u from User u where u.name =:name or u.phone = :name or u.email = :name") 33 | User checkExist(@Param("name") String name); 34 | 35 | 36 | 37 | /** 38 | * 批量删除 39 | * @param ids 40 | * @return 41 | */ 42 | @Modifying 43 | @Transactional 44 | Integer deleteByIdIn(Long[] ids); 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/AnimeService.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service; 2 | 3 | import com.poi.dudu.base.Response; 4 | 5 | /** 6 | * 动画相关服务层接口 7 | * @author eisuto 8 | */ 9 | public interface AnimeService { 10 | /** 11 | * 给动画添加类型 12 | * @return 13 | */ 14 | Response addTypeToAnime(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/HomeService.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service; 2 | 3 | import com.poi.dudu.base.Response; 4 | 5 | /** 6 | * 主页服务层 7 | * @author eisut 8 | */ 9 | public interface HomeService { 10 | 11 | /** 12 | * 主页数据 13 | * @return 14 | */ 15 | Response data(); 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service; 2 | 3 | import com.poi.dudu.domain.Role; 4 | import org.springframework.data.domain.Page; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 角色Service接口 10 | * 11 | * @author eisuto 12 | * @date 2021-04-07 13 | */ 14 | public interface RoleService { 15 | /** 16 | * 查询角色 17 | * 18 | * @param id 角色ID 19 | * @return 角色 20 | */ 21 | public Role selectRoleById(Long id); 22 | 23 | /** 24 | * 查询角色列表 25 | * 26 | * @param role 角色 27 | * @return 角色集合 28 | */ 29 | public Page selectRoleList(Role role); 30 | 31 | /** 32 | * 新增角色 33 | * 34 | * @param role 角色 35 | * @return 结果 36 | */ 37 | public boolean insertRole(Role role); 38 | 39 | /** 40 | * 修改角色 41 | * 42 | * @param role 角色 43 | * @return 结果 44 | */ 45 | public boolean updateRole(Role role); 46 | 47 | /** 48 | * 批量删除角色 49 | * 50 | * @param ids 需要删除的角色ID 51 | * @return 结果 52 | */ 53 | public void deleteRoleByIds(Long[] ids); 54 | 55 | /** 56 | * 删除角色信息 57 | * 58 | * @param id 角色ID 59 | * @return 结果 60 | */ 61 | public void deleteRoleById(Long id); 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service; 2 | 3 | import com.poi.dudu.base.BaseRequest; 4 | import com.poi.dudu.base.Response; 5 | import com.poi.dudu.domain.User; 6 | 7 | /** 8 | * 用户相关 服务层 9 | * 10 | * @author eisuto 11 | */ 12 | public interface UserService { 13 | /** 14 | * 注册 15 | * 16 | * @param user 信息 17 | * @return 18 | * @throws Exception 19 | */ 20 | User register(User user) throws Exception; 21 | 22 | /** 23 | * 登录 24 | * 25 | * @param user 信息 26 | * @return info 27 | * @throws Exception 28 | */ 29 | User login(User user) throws Exception; 30 | 31 | /** 32 | * 空间 33 | * 34 | * @param user 信息 35 | * @return 36 | * @throws Exception 37 | */ 38 | Response space(User user) throws Exception; 39 | 40 | /** 41 | * 用户列表 42 | * @param page 43 | * @return 44 | * @throws Exception 45 | */ 46 | Response usersList(BaseRequest page) throws Exception; 47 | 48 | /** 49 | * 管理员 添加 50 | * @param user 51 | * @return 52 | * @throws Exception 53 | */ 54 | Response usersAdd(User user) throws Exception; 55 | 56 | /** 57 | * 管理员 删除 58 | * @param ids 59 | * @return 60 | * @throws Exception 61 | */ 62 | Integer userDel(Long[] ids) throws Exception; 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/impl/AnimeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service.impl; 2 | 3 | import com.poi.dudu.base.Response; 4 | import com.poi.dudu.domain.Anime; 5 | import com.poi.dudu.domain.Type; 6 | import com.poi.dudu.mapper.AnimeRepository; 7 | import com.poi.dudu.mapper.TypeRepository; 8 | import com.poi.dudu.service.AnimeService; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Service; 11 | 12 | import java.util.Set; 13 | 14 | /** 15 | * 动画相关服务层 16 | * 17 | * @author eisuto 18 | */ 19 | @Service 20 | public class AnimeServiceImpl implements AnimeService { 21 | @Autowired 22 | AnimeRepository animeRepository; 23 | 24 | @Autowired 25 | TypeRepository typeRepository; 26 | 27 | /** 28 | * 给动画添加类型 29 | * 30 | * @return 31 | */ 32 | @Override 33 | public Response addTypeToAnime() { 34 | Anime anime = animeRepository.findOneByNameChinese("超能力女儿"); 35 | Type type = typeRepository.findOneByName("搞笑"); 36 | Set selectedTypes = anime.getTypes(); 37 | selectedTypes.add(type); 38 | anime.setTypes(selectedTypes); 39 | animeRepository.save(anime); 40 | return new Response<>(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/impl/HomeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service.impl; 2 | 3 | import com.poi.dudu.base.Response; 4 | import com.poi.dudu.domain.Anime; 5 | import com.poi.dudu.domain.Home; 6 | import com.poi.dudu.domain.Recommend; 7 | import com.poi.dudu.domain.Type; 8 | import com.poi.dudu.mapper.AnimeRepository; 9 | import com.poi.dudu.mapper.RecommendRepository; 10 | import com.poi.dudu.mapper.TypeRepository; 11 | import com.poi.dudu.service.HomeService; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.beans.factory.annotation.Qualifier; 14 | import org.springframework.data.domain.Page; 15 | import org.springframework.data.domain.PageRequest; 16 | import org.springframework.data.domain.Pageable; 17 | import org.springframework.stereotype.Service; 18 | 19 | import javax.annotation.Resource; 20 | import java.util.List; 21 | import java.util.Set; 22 | 23 | /** 24 | * @author eisuto 25 | */ 26 | @Service 27 | public class HomeServiceImpl implements HomeService { 28 | 29 | 30 | @Autowired 31 | AnimeRepository animeRepository; 32 | 33 | 34 | 35 | /** 36 | * 主页数据 37 | */ 38 | @Override 39 | public Response data() { 40 | Home home = new Home(); 41 | Pageable pageable = PageRequest.of(0, 10); 42 | Page repositoryAll = animeRepository.findAll(pageable); 43 | home.setRecommendList(repositoryAll.toList() ); 44 | return new Response<>(home); 45 | } 46 | 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/impl/RoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service.impl; 2 | 3 | import com.poi.dudu.domain.Role; 4 | import com.poi.dudu.mapper.RoleRepository; 5 | import com.poi.dudu.service.RoleService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.data.domain.Page; 8 | import org.springframework.data.domain.PageRequest; 9 | import org.springframework.stereotype.Service; 10 | 11 | 12 | /** 13 | * 角色Service业务层处理 14 | * 15 | * @author eisuto 16 | * @date 2021-04-07 17 | */ 18 | @Service 19 | public class RoleServiceImpl implements RoleService { 20 | 21 | @Autowired 22 | RoleRepository roleRepository; 23 | 24 | /** 25 | * 查询角色 26 | * 27 | * @param id 角色ID 28 | * @return 角色 29 | */ 30 | @Override 31 | public Role selectRoleById(Long id) { 32 | return roleRepository.findById(id).orElse(null); 33 | } 34 | 35 | /** 36 | * 查询角色列表 37 | * 38 | * @param role 角色 39 | * @return 角色集合 40 | */ 41 | @Override 42 | public Page selectRoleList(Role role) { 43 | // //Repository 44 | // Page roles = roleRepository.findAll(null); 45 | // return roles; 46 | return null; 47 | } 48 | 49 | /** 50 | * 新增角色 51 | * 52 | * @param role 角色 53 | * @return 结果 54 | */ 55 | @Override 56 | public boolean insertRole(Role role) { 57 | Role r = roleRepository.save(role); 58 | return r != null; 59 | } 60 | 61 | /** 62 | * 修改角色 63 | * 64 | * @param role 角色 65 | * @return 结果 66 | */ 67 | @Override 68 | public boolean updateRole(Role role) { 69 | Role r = roleRepository.save(role); 70 | return r != null; 71 | } 72 | 73 | /** 74 | * 批量删除角色 75 | * 76 | * @param ids 需要删除的角色ID 77 | * @return 结果 78 | */ 79 | @Override 80 | public void deleteRoleByIds(Long[] ids) { 81 | roleRepository.deleteByIdIn(ids); 82 | } 83 | 84 | /** 85 | * 删除角色信息 86 | * 87 | * @param id 角色ID 88 | * @return 结果 89 | */ 90 | @Override 91 | public void deleteRoleById(Long id) { 92 | roleRepository.deleteById(id); 93 | } 94 | } 95 | 96 | -------------------------------------------------------------------------------- /src/main/java/com/poi/dudu/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu.service.impl; 2 | 3 | import com.poi.dudu.base.BaseRequest; 4 | import com.poi.dudu.base.Response; 5 | import com.poi.dudu.domain.User; 6 | import com.poi.dudu.mapper.UserRepository; 7 | import com.poi.dudu.service.UserService; 8 | import org.springframework.data.domain.Page; 9 | import org.springframework.data.domain.PageRequest; 10 | import org.springframework.stereotype.Service; 11 | 12 | import javax.annotation.Resource; 13 | 14 | 15 | /** 16 | * 用户相关业务 服务层实现 17 | * 18 | * @author eisuto 19 | */ 20 | @Service 21 | public class UserServiceImpl implements UserService { 22 | @Resource 23 | UserRepository userRepository; 24 | 25 | /** 26 | * 注册 27 | * @return 28 | */ 29 | @Override 30 | public User register(User user) { 31 | 32 | if(user.getVerifyCode().equals("1234")){ 33 | if(userRepository.checkExist(user.getName())==null){ 34 | return userRepository.save(user); 35 | } 36 | } 37 | return null; 38 | } 39 | 40 | /** 41 | * 登录 42 | * @return 43 | */ 44 | @Override 45 | public User login(User user) { 46 | return userRepository.login(user.getPassword(), user.getName()); 47 | } 48 | 49 | /** 50 | * 空间 51 | * 52 | * @param user 信息 53 | * @return 54 | */ 55 | @Override 56 | public Response space(User user) { 57 | return null; 58 | } 59 | 60 | /** 61 | * 用户列表 62 | * 63 | * @param page 分页 64 | * @return 65 | */ 66 | @Override 67 | public Response usersList(BaseRequest page) { 68 | Response response = new Response<>(); 69 | Page users = userRepository.findAll(PageRequest.of(page.getNumber()-1, page.getSize())); 70 | response.setData(users); 71 | return response; 72 | } 73 | 74 | /** 75 | * 管理员 添加用户 76 | * 77 | * @param user 78 | * @return 79 | */ 80 | @Override 81 | public Response usersAdd(User user) { 82 | Response response = new Response<>(); 83 | User re = userRepository.save(user); 84 | response.setData(re); 85 | return response; 86 | } 87 | 88 | /** 89 | * 管理员 删除 90 | * 91 | * @param ids 92 | * @return 93 | * @throws Exception 94 | */ 95 | @Override 96 | public Integer userDel(Long[] ids) throws Exception { 97 | return userRepository.deleteByIdIn(ids); 98 | } 99 | 100 | 101 | } 102 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8090 3 | servlet: 4 | context-path: / 5 | 6 | spring: 7 | data: 8 | web: 9 | pageable: 10 | one-indexed-parameters: true 11 | jpa: 12 | show-sql: true 13 | hibernate: 14 | ddl-auto: update 15 | datasource: 16 | driver-class-name: com.mysql.cj.jdbc.Driver 17 | url: jdbc:mysql://82.156.231.128:3306/dudu?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true 18 | username: root 19 | password: Waabd!23 20 | jackson: 21 | date-format: yyyy-MM-dd HH:mm:ss 22 | time-zone: GMT+8 23 | serialization: 24 | write-dates-as-timestamps: false 25 | 26 | -------------------------------------------------------------------------------- /src/test/java/com/poi/dudu/DuduApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.poi.dudu; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class DuduApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | --------------------------------------------------------------------------------