Преглед изворни кода

demo for data analysis project

Majj пре 6 година
комит
e3c93c6729
88 измењених фајлова са 2324 додато и 0 уклоњено
  1. 31 0
      .gitignore
  2. 118 0
      .mvn/wrapper/MavenWrapperDownloader.java
  3. BIN
      .mvn/wrapper/maven-wrapper.jar
  4. 2 0
      .mvn/wrapper/maven-wrapper.properties
  5. 310 0
      mvnw
  6. 182 0
      mvnw.cmd
  7. 134 0
      pom.xml
  8. 13 0
      src/main/java/se/cloud/analysis/AnalysisApplication.java
  9. 31 0
      src/main/java/se/cloud/analysis/controller/EventController.java
  10. 16 0
      src/main/java/se/cloud/analysis/controller/HelloController.java
  11. 82 0
      src/main/java/se/cloud/analysis/controller/LearningController.java
  12. 21 0
      src/main/java/se/cloud/analysis/controller/RedisController.java
  13. 77 0
      src/main/java/se/cloud/analysis/controller/TaskController.java
  14. 64 0
      src/main/java/se/cloud/analysis/controller/UserController.java
  15. 31 0
      src/main/java/se/cloud/analysis/dao/EventDao.java
  16. 24 0
      src/main/java/se/cloud/analysis/dao/ExerciseDao.java
  17. 21 0
      src/main/java/se/cloud/analysis/dao/GLessonDao.java
  18. 22 0
      src/main/java/se/cloud/analysis/dao/GoalDao.java
  19. 27 0
      src/main/java/se/cloud/analysis/dao/KnowledgeDao.java
  20. 25 0
      src/main/java/se/cloud/analysis/dao/ScoreDao.java
  21. 37 0
      src/main/java/se/cloud/analysis/dao/TaskDao.java
  22. 22 0
      src/main/java/se/cloud/analysis/dao/UserDao.java
  23. 20 0
      src/main/java/se/cloud/analysis/domain/Event.java
  24. 15 0
      src/main/java/se/cloud/analysis/domain/Exercise.java
  25. 9 0
      src/main/java/se/cloud/analysis/domain/Goal.java
  26. 9 0
      src/main/java/se/cloud/analysis/domain/GoalLesson.java
  27. 11 0
      src/main/java/se/cloud/analysis/domain/Knowledge.java
  28. 11 0
      src/main/java/se/cloud/analysis/domain/Score.java
  29. 36 0
      src/main/java/se/cloud/analysis/domain/Task.java
  30. 26 0
      src/main/java/se/cloud/analysis/domain/User.java
  31. 18 0
      src/main/java/se/cloud/analysis/exception/GlobalException.java
  32. 32 0
      src/main/java/se/cloud/analysis/exception/GlobalExceptionHandler.java
  33. 35 0
      src/main/java/se/cloud/analysis/redis/BaseKey.java
  34. 8 0
      src/main/java/se/cloud/analysis/redis/KeyPrefix.java
  35. 64 0
      src/main/java/se/cloud/analysis/redis/RedisService.java
  36. 20 0
      src/main/java/se/cloud/analysis/redis/UserKey.java
  37. 67 0
      src/main/java/se/cloud/analysis/result/CodeMsg.java
  38. 58 0
      src/main/java/se/cloud/analysis/result/Result.java
  39. 35 0
      src/main/java/se/cloud/analysis/service/EventService.java
  40. 39 0
      src/main/java/se/cloud/analysis/service/ExerciseService.java
  41. 52 0
      src/main/java/se/cloud/analysis/service/GoalService.java
  42. 59 0
      src/main/java/se/cloud/analysis/service/StatusService.java
  43. 72 0
      src/main/java/se/cloud/analysis/service/TaskService.java
  44. 122 0
      src/main/java/se/cloud/analysis/service/UserService.java
  45. 21 0
      src/main/java/se/cloud/analysis/utils/MD5Util.java
  46. 17 0
      src/main/java/se/cloud/analysis/utils/SaltUtil.java
  47. 9 0
      src/main/java/se/cloud/analysis/utils/UUIDUtil.java
  48. 11 0
      src/main/java/se/cloud/analysis/vo/GoalLessonVO.java
  49. 39 0
      src/main/java/se/cloud/analysis/vo/InformationVO.java
  50. 17 0
      src/main/java/se/cloud/analysis/vo/LoginVO.java
  51. 13 0
      src/main/java/se/cloud/analysis/vo/RecommendationVO.java
  52. 20 0
      src/main/java/se/cloud/analysis/vo/RegisterVO.java
  53. 15 0
      src/main/java/se/cloud/analysis/vo/StatusVO.java
  54. 13 0
      src/main/java/se/cloud/analysis/vo/TaskDetailVO.java
  55. 1 0
      src/main/resources/application.properties
  56. 28 0
      src/main/resources/application.yml
  57. 0 0
      src/main/resources/static/index.html
  58. 0 0
      src/main/resources/static/static/css/app.ab549fb2.css
  59. 1 0
      src/main/resources/static/static/css/chunk-1c9ebc78.cc28df39.css
  60. 1 0
      src/main/resources/static/static/css/chunk-2061cd58.626c217d.css
  61. 1 0
      src/main/resources/static/static/css/chunk-4889d482.0880708b.css
  62. 0 0
      src/main/resources/static/static/css/chunk-4de1c2b6.a37cd815.css
  63. 1 0
      src/main/resources/static/static/css/chunk-506d5108.363db6df.css
  64. 1 0
      src/main/resources/static/static/css/chunk-5eb9e756.e403bdea.css
  65. 1 0
      src/main/resources/static/static/css/chunk-651c4a80.a1cfec7e.css
  66. 1 0
      src/main/resources/static/static/css/chunk-b343171e.7f709b4e.css
  67. 1 0
      src/main/resources/static/static/css/chunk-d5734dbc.b5dd69d9.css
  68. 1 0
      src/main/resources/static/static/css/chunk-d708c094.4c2e8727.css
  69. 0 0
      src/main/resources/static/static/css/chunk-elementUI.ded27da0.css
  70. 0 0
      src/main/resources/static/static/css/chunk-libs.56265064.css
  71. BIN
      src/main/resources/static/static/fonts/element-icons.535877f5.woff
  72. BIN
      src/main/resources/static/static/fonts/element-icons.732389de.ttf
  73. BIN
      src/main/resources/static/static/img/404.a57b6f31.png
  74. BIN
      src/main/resources/static/static/img/404_cloud.0f4bc32b.png
  75. 0 0
      src/main/resources/static/static/js/app.2100f3a6.js
  76. 0 0
      src/main/resources/static/static/js/chunk-1c9ebc78.5eefc74c.js
  77. 0 0
      src/main/resources/static/static/js/chunk-2061cd58.3d9f56e7.js
  78. 0 0
      src/main/resources/static/static/js/chunk-2d20957c.b6d12977.js
  79. 0 0
      src/main/resources/static/static/js/chunk-4889d482.fcefc37c.js
  80. 1 0
      src/main/resources/static/static/js/chunk-4de1c2b6.1996b5e4.js
  81. 1 0
      src/main/resources/static/static/js/chunk-506d5108.5957353a.js
  82. 0 0
      src/main/resources/static/static/js/chunk-5eb9e756.49af0265.js
  83. 0 0
      src/main/resources/static/static/js/chunk-651c4a80.88228896.js
  84. 0 0
      src/main/resources/static/static/js/chunk-b343171e.fc5e63c0.js
  85. 0 0
      src/main/resources/static/static/js/chunk-d5734dbc.d2961e22.js
  86. 1 0
      src/main/resources/static/static/js/chunk-d708c094.1ae0946f.js
  87. 0 0
      src/main/resources/static/static/js/chunk-elementUI.5dc3be45.js
  88. 0 0
      src/main/resources/static/static/js/chunk-libs.a17db165.js

+ 31 - 0
.gitignore

@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/

+ 118 - 0
.mvn/wrapper/MavenWrapperDownloader.java

@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+            + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if (mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if (mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if (!outputFile.getParentFile().exists()) {
+            if (!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}

BIN
.mvn/wrapper/maven-wrapper.jar


+ 2 - 0
.mvn/wrapper/maven-wrapper.properties

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

+ 310 - 0
mvnw

@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 182 - 0
mvnw.cmd

@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%

+ 134 - 0
pom.xml

@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.4.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>se.cloud</groupId>
+    <artifactId>analysis</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>analysis</name>
+    <description>Data analysis for student who study in the whole system.</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.6</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.58</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>aliyun-repos</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>aliyun-plugin</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>

+ 13 - 0
src/main/java/se/cloud/analysis/AnalysisApplication.java

@@ -0,0 +1,13 @@
+package se.cloud.analysis;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AnalysisApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AnalysisApplication.class, args);
+    }
+
+}

+ 31 - 0
src/main/java/se/cloud/analysis/controller/EventController.java

@@ -0,0 +1,31 @@
+package se.cloud.analysis.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import se.cloud.analysis.domain.Event;
+import se.cloud.analysis.result.CodeMsg;
+import se.cloud.analysis.result.Result;
+import se.cloud.analysis.service.EventService;
+
+@RestController
+@RequestMapping("/event")
+public class EventController {
+
+    @Autowired
+    private EventService eventService;
+
+    @PostMapping(value = "/create")
+    public Result<CodeMsg> createEvent(Event event) {
+        if (eventService.isExist(event)){
+            return Result.error(CodeMsg.EVENT_ALREADY_EXISTS);
+        }
+        int res = eventService.addEvent(event);
+        if (res == 1) {
+            return Result.success(CodeMsg.SUCCESS);
+        }
+        return Result.error(CodeMsg.SERVER_ERROR);
+    }
+}

+ 16 - 0
src/main/java/se/cloud/analysis/controller/HelloController.java

@@ -0,0 +1,16 @@
+package se.cloud.analysis.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping
+public class HelloController {
+
+    @GetMapping(value = "/hello")
+    public String hello() {
+        return "Hello World!";
+    }
+
+}

+ 82 - 0
src/main/java/se/cloud/analysis/controller/LearningController.java

@@ -0,0 +1,82 @@
+package se.cloud.analysis.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import se.cloud.analysis.domain.Goal;
+import se.cloud.analysis.result.CodeMsg;
+import se.cloud.analysis.result.Result;
+import se.cloud.analysis.service.ExerciseService;
+import se.cloud.analysis.service.GoalService;
+import se.cloud.analysis.service.StatusService;
+import se.cloud.analysis.service.UserService;
+import se.cloud.analysis.vo.GoalLessonVO;
+import se.cloud.analysis.vo.RecommendationVO;
+import se.cloud.analysis.vo.StatusVO;
+
+@RestController
+@RequestMapping(value = "/learning")
+public class LearningController {
+
+    @Autowired
+    private GoalService goalService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private StatusService statusService;
+
+    @Autowired
+    private ExerciseService exerciseService;
+
+    @GetMapping(value = "/goal/update")
+    public Result<CodeMsg> updateGoal(@RequestParam("email") String email, @RequestParam("target") String target) {
+        Goal goal = goalService.getGoalByEmail(email);
+        int res;
+        if (goal == null) {
+            goal = new Goal();
+            goal.setEmail(email);
+            goal.setTarget(target);
+            res = goalService.addGoal(goal);
+        } else {
+            goal.setTarget(target);
+            res = goalService.updateGoal(goal);
+        }
+        if (res == 1) {
+            return Result.success(CodeMsg.SUCCESS);
+        }
+        return Result.error(CodeMsg.SERVER_ERROR);
+    }
+
+    @GetMapping(value = "/goal")
+    public Result<GoalLessonVO> getGoalAndLesson(@RequestParam("email") String email) {
+        if (userService.getUserByEmail(email) == null) {
+            return Result.error(CodeMsg.USER_NOT_EXISTS);
+        }
+        return Result.success(goalService.getGoalAndLessons(email));
+    }
+
+    @GetMapping(value = "/status")
+    public Result<StatusVO> getStatus(@RequestParam("email") String email) {
+        if (userService.getUserByEmail(email) == null) {
+            return Result.error(CodeMsg.USER_NOT_EXISTS);
+        }
+        return Result.success(statusService.getStatus(email));
+    }
+
+    @GetMapping(value = "recommendation")
+    public Result<RecommendationVO> getRecommendation(@RequestParam("email") String email, @RequestParam("page") int page) {
+        if (userService.getUserByEmail(email) == null) {
+            return Result.error(CodeMsg.USER_NOT_EXISTS);
+        }
+        int count = exerciseService.getExerciseCount(email);
+        RecommendationVO recommendationVO = new RecommendationVO();
+        recommendationVO.setPages(exerciseService.getPages(email));
+        recommendationVO.setPage(page);
+        recommendationVO.setExerciseList(exerciseService.getExerciseList(email, page));
+        return Result.success(recommendationVO);
+    }
+}

+ 21 - 0
src/main/java/se/cloud/analysis/controller/RedisController.java

@@ -0,0 +1,21 @@
+package se.cloud.analysis.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/redis")
+public class RedisController {
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+    @GetMapping("/set")
+    public void setData(@RequestParam("key") String key, @RequestParam("value") String value) {
+        redisTemplate.opsForValue().set(key, value);
+    }
+}

+ 77 - 0
src/main/java/se/cloud/analysis/controller/TaskController.java

@@ -0,0 +1,77 @@
+package se.cloud.analysis.controller;
+
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import se.cloud.analysis.domain.Task;
+import se.cloud.analysis.result.CodeMsg;
+import se.cloud.analysis.result.Result;
+import se.cloud.analysis.service.TaskService;
+import se.cloud.analysis.service.UserService;
+import se.cloud.analysis.vo.TaskDetailVO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@RestController
+@RequestMapping("/task")
+public class TaskController {
+
+    @Autowired
+    private TaskService taskService;
+
+    @Autowired
+    private UserService userService;
+
+    @PostMapping("/draft")
+    public Result<CodeMsg> draftTask(@Valid Task task) {
+        Task find = taskService.getTaskByEmailAndName(task.getUserEmail(), task.getTaskName());
+        if (find != null) {
+            return Result.error(CodeMsg.TASK_ALREADY_EXISTS);
+        }
+        task.setIsDone("no");
+        if (taskService.addTask(task)) {
+            return Result.success(CodeMsg.SUCCESS);
+        }
+        return Result.error(CodeMsg.SERVER_ERROR);
+    }
+
+    @GetMapping("/list")
+    public Result<List<Task>> getTaskList(@Param("email") String email) {
+        if (userService.getUserByEmail(email) == null) {
+            return Result.error(CodeMsg.USER_NOT_EXISTS);
+        }
+        return Result.success(taskService.getTaskList(email));
+    }
+
+    @GetMapping("/detail")
+    public Result<TaskDetailVO> getDetailTask(@Param("email") String email, @RequestParam("id") int id) {
+        if (taskService.getTaskById(id) == null) {
+            return Result.error(CodeMsg.TASK_NOT_EXISTS);
+        }
+        TaskDetailVO taskDetailVO = taskService.getTaskDetail(email, id);
+        return Result.success(taskDetailVO);
+    }
+
+    @GetMapping("/detail/delete")
+    public Result<CodeMsg> deleteTask(@RequestParam("id") int id) {
+        Task task = taskService.getTaskById(id);
+        if (task == null) {
+            return Result.error(CodeMsg.TASK_NOT_EXISTS);
+        }
+        int res = taskService.deleteTask(id);
+        if (res == 1) {
+            return Result.success(CodeMsg.SUCCESS);
+        }
+        return Result.error(CodeMsg.SERVER_ERROR);
+    }
+
+    @PostMapping("/detail/update")
+    public Result<CodeMsg> updateTask(@Valid Task task) {
+        int res = taskService.updateTask(task);
+        if (res == 1) {
+            return Result.success(CodeMsg.SUCCESS);
+        }
+        return Result.error(CodeMsg.SERVER_ERROR);
+    }
+}

+ 64 - 0
src/main/java/se/cloud/analysis/controller/UserController.java

@@ -0,0 +1,64 @@
+package se.cloud.analysis.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import se.cloud.analysis.domain.User;
+import se.cloud.analysis.result.CodeMsg;
+import se.cloud.analysis.result.Result;
+import se.cloud.analysis.service.UserService;
+import se.cloud.analysis.vo.InformationVO;
+import se.cloud.analysis.vo.LoginVO;
+import se.cloud.analysis.vo.RegisterVO;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+
+@RestController
+@RequestMapping(value = "/user")
+public class UserController {
+
+    private static Logger logger = LoggerFactory.getLogger(UserController.class);
+
+    @Autowired
+    private UserService userService;
+
+    @GetMapping(value = "/information")
+    public Result<InformationVO> getInformation(@RequestParam(value = "email") String email) {
+        return Result.success(userService.getInformationByEmail(email));
+    }
+
+    @GetMapping(value = "/token")
+    public Result<InformationVO> getLoginInfo(@CookieValue(value = UserService.COOKIE_NAME_TOKEN, required = false) String cookieToken) {
+        return Result.success(userService.getInformationByToken(cookieToken));
+    }
+
+    @PostMapping(value = "/login")
+    public Result<Boolean> login(HttpServletResponse response, @Valid LoginVO loginVO) {
+        return Result.success(userService.login(response, loginVO));
+    }
+
+    @PostMapping(value = "/register")
+    public Result<Boolean> register(@Valid RegisterVO registerVO) {
+        return Result.success(userService.register(registerVO));
+    }
+
+    @PostMapping(value = "/update")
+    public Result<CodeMsg> updateInformation(User user) {
+        User user1 = userService.getUserByEmail(user.getEmail());
+        if (user1 == null) {
+            return Result.error(CodeMsg.USER_NOT_EXISTS);
+        }
+        int res = userService.updateUser(user);
+        if (res == 1) {
+            return Result.success(CodeMsg.SUCCESS);
+        }
+        return Result.error(CodeMsg.SERVER_ERROR);
+    }
+
+}

+ 31 - 0
src/main/java/se/cloud/analysis/dao/EventDao.java

@@ -0,0 +1,31 @@
+package se.cloud.analysis.dao;
+
+import lombok.Data;
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.Event;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface EventDao {
+
+    @Select("select * from event where user_email = #{userEmail}")
+    public List<Event> getEventListByEmail(@Param("userEmail") String userEmail);
+
+    @Select("select * from event where user_email = #{userEmail} and type = #{type}")
+    public List<Event> getEventListByEmailAndType(@Param("userEmail") String userEmail, @Param("type") String type);
+
+    @Select("select * from event where user_email = #{userEmail} and type = 'task' and task_name = #{taskName}")
+    public List<Event> getTaskEventByEmailAndTaskName(@Param("userEmail") String userEmail, @Param("taskName") String taskName);
+
+    @Insert("insert into event(user_email,type,task_name,time,description)values(#{userEmail},#{type},#{taskName},#{time},#{description})")
+    public int insert(Event event);
+
+    @Delete("delete from event where id = #{id}")
+    public int delete(@Param("id") int id);
+
+    @Select("select * from event where user_email = #{userEmail} and type = #{type} and task_name = #{taskName} and time = #{time} and description = #{description}")
+    public Event getSpecifiedEvent(Event event);
+}

+ 24 - 0
src/main/java/se/cloud/analysis/dao/ExerciseDao.java

@@ -0,0 +1,24 @@
+package se.cloud.analysis.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.Exercise;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface ExerciseDao {
+
+    @Select("select * from exercise where user_email = #{email} and done = 0 limit #{index},#{limit}")
+    public List<Exercise> getExerciseByEmail(@Param("email") String email,@Param("index") int index, @Param("limit") int limit);
+
+    @Insert("insert into exercise(title,level_1,level_2,point,url,user_email,done)values(#{title},#{level1},#{level2},#{point},#{url},#{userEmail},#{done})")
+    public int insert(Exercise exercise);
+
+    @Update("update exercise set done = 1 where id = #{id}")
+    public int markDone(@Param("id") int id);
+
+    @Select("select count(*) from exercise where user_email = #{email}")
+    public int getCountByEmail(@Param("email") String email);
+}

+ 21 - 0
src/main/java/se/cloud/analysis/dao/GLessonDao.java

@@ -0,0 +1,21 @@
+package se.cloud.analysis.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.GoalLesson;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface GLessonDao {
+
+    @Insert("insert into goal_lesson(goal,lesson)values(#{goal},#{lesson})")
+    public int addLessonToGoal(GoalLesson goalLesson);
+
+    @Delete("delete from goal_lesson where goal = #{goal} and lesson = #{lesson}")
+    public int deleteLessonOfGoal(GoalLesson goalLesson);
+
+    @Select("select lesson from goal_lesson where goal = #{goal}")
+    public List<String> getLessonsOfGoal(@Param("goal") String goal);
+}

+ 22 - 0
src/main/java/se/cloud/analysis/dao/GoalDao.java

@@ -0,0 +1,22 @@
+package se.cloud.analysis.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.Goal;
+
+@Mapper
+@Repository
+public interface GoalDao {
+
+    @Select("select * from goal where email = #{email}")
+    public Goal getGoalByEmail(@Param("email") String email);
+
+    @Insert("insert into goal(email,target)values(#{email},#{target})")
+    public int insert(Goal goal);
+
+    @Update("update goal set target = #{target} where email = #{email}")
+    public int update(Goal goal);
+
+    @Delete("delete from goal where email = #{email}")
+    public int delete(@Param("email") String email);
+}

+ 27 - 0
src/main/java/se/cloud/analysis/dao/KnowledgeDao.java

@@ -0,0 +1,27 @@
+package se.cloud.analysis.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.Knowledge;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface KnowledgeDao {
+
+    @Select("select * from knowledge where goal = #{goal} and level_1 = #{level1} and level_2 = #{level2}")
+    public List<Knowledge> getKnowledgeByGoalAndLevel1AndLevel2(@Param("goal") String goal, @Param("level1") String level1, @Param("level2") String level2);
+
+    @Select("select * from knowledge where goal = #{goal}")
+    public List<Knowledge> getKnowledgeByGoal(@Param("goal") String goal);
+
+    @Select("select * from knowledge")
+    public List<Knowledge> getAllKnowledge();
+
+    @Insert("insert into knowledge(level_1,level_2,knowledge)values(#{level1},#{level2},#{knowledge})")
+    public int update(Knowledge knowledge);
+
+    @Delete("delete from knowledge where level_1 = #{level1} and level_2 = {level2} and knowledge = #{knowledge}")
+    public int delete(Knowledge knowledge);
+}

+ 25 - 0
src/main/java/se/cloud/analysis/dao/ScoreDao.java

@@ -0,0 +1,25 @@
+package se.cloud.analysis.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.Score;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface ScoreDao {
+
+    @Select("select * from score where email = #{email}")
+    public List<Score> getAllScoresByEmail(@Param("email") String email);
+
+    @Select("select * from score where email = #{email} and level_1 = #{level1}")
+    public List<Score> getScoresByEmailAndLevel1(@Param("email") String email, @Param("level1") String level1);
+
+    @Insert("insert into score(email,level_1,level_2,score)values(#{email},#{level1},#{level2},#{score})")
+    public int insert(Score score);
+
+    @Update("update score set score = #{score} where email = #{email} and level_1 = #{level1} and level_2 = #{level2}")
+    public int update(Score score);
+
+}

+ 37 - 0
src/main/java/se/cloud/analysis/dao/TaskDao.java

@@ -0,0 +1,37 @@
+package se.cloud.analysis.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.Task;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface TaskDao {
+
+    @Select("select * from task where user_email = #{userEmail}")
+    public List<Task> getTaskByEmail(@Param("userEmail") String userEmail);
+
+    @Select("select * from task where id = #{taskId}")
+    public Task getTaskById(@Param("taskId") int taskId);
+
+    @Select("select * from task where user_email = #{userEmail} and task_name = #{taskName}")
+    public Task getTaskByEmailAndName(@Param("userEmail") String userEmail, @Param("taskName") String taskName);
+
+    @Update("update task set task_name = #{taskName}, type = #{type}, start = #{start}, end = #{end}, description = #{description} where user_email = #{userEmail} and task_name = #{taskName}")
+    public int update(Task task);
+
+    @Update("update task set is_done = #{isDone}")
+    public int markDone(String isDone);
+
+    @Insert("insert into task(task_name,user_email,type,start,end,is_done,description)values(#{taskName},#{userEmail},#{type},#{start},#{end},#{isDone},#{description})")
+    public int insert(Task task);
+
+    @Delete("delete from task where id = #{taskId}")
+    public int deleteById(@Param("taskId") int taskId);
+
+    @Delete("delete from task where user_email = #{userEmail} and task_name = #{taskName}")
+    public int deleteByEmailAndName(@Param("userEmail") String userEmail, @Param("taskName") String taskName);
+
+}

+ 22 - 0
src/main/java/se/cloud/analysis/dao/UserDao.java

@@ -0,0 +1,22 @@
+package se.cloud.analysis.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import se.cloud.analysis.domain.User;
+
+@Repository
+@Mapper
+public interface UserDao {
+
+    @Select("select * from user where email = #{email}")
+    public User getUserByEmail(@Param("email") String email);
+
+    @Insert("insert into user(id, name, email, phone, password, salt, sex, birthday ,education, school, is_work, company, awards)values(#{id},#{name},#{email},#{phone},#{password},#{salt},#{sex},#{birthday},#{education},#{school},#{isWork},#{company},#{awards})")
+    public int insertUser(User user);
+
+    @Update("update user set name = #{name}, phone = #{phone}, sex = #{sex}, birthday = #{birthday}, education = #{education}, school = #{school}, is_work = #{isWork}, company = #{company}, awards = #{awards} where email = #{email}")
+    public int updateUser(User user);
+
+    @Delete("delete from user where email = #{email}")
+    public int deleteUser(String email);
+}

+ 20 - 0
src/main/java/se/cloud/analysis/domain/Event.java

@@ -0,0 +1,20 @@
+package se.cloud.analysis.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class Event {
+    private int id;
+    private String userEmail;
+    private String type;
+    private String taskName;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date time;
+    private String description;
+
+}

+ 15 - 0
src/main/java/se/cloud/analysis/domain/Exercise.java

@@ -0,0 +1,15 @@
+package se.cloud.analysis.domain;
+
+import lombok.Data;
+
+@Data
+public class Exercise {
+    private int id;
+    private String title;
+    private String level1;
+    private String level2;
+    private String point;
+    private String url;
+    private String userEmail;
+    private boolean done;
+}

+ 9 - 0
src/main/java/se/cloud/analysis/domain/Goal.java

@@ -0,0 +1,9 @@
+package se.cloud.analysis.domain;
+
+import lombok.Data;
+
+@Data
+public class Goal {
+    private String email;
+    private String target;
+}

+ 9 - 0
src/main/java/se/cloud/analysis/domain/GoalLesson.java

@@ -0,0 +1,9 @@
+package se.cloud.analysis.domain;
+
+import lombok.Data;
+
+@Data
+public class GoalLesson {
+    private String goal;
+    private String lesson;
+}

+ 11 - 0
src/main/java/se/cloud/analysis/domain/Knowledge.java

@@ -0,0 +1,11 @@
+package se.cloud.analysis.domain;
+
+import lombok.Data;
+
+@Data
+public class Knowledge {
+    private String goal;
+    private String level1;
+    private String level2;
+    private String knowledge;
+}

+ 11 - 0
src/main/java/se/cloud/analysis/domain/Score.java

@@ -0,0 +1,11 @@
+package se.cloud.analysis.domain;
+
+import lombok.Data;
+
+@Data
+public class Score {
+    private String email;
+    private String level1;
+    private String level2;
+    private double score;
+}

+ 36 - 0
src/main/java/se/cloud/analysis/domain/Task.java

@@ -0,0 +1,36 @@
+package se.cloud.analysis.domain;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+@Data
+public class Task {
+    private int id;
+    // 同一用户不可创建两个名字相同的任务
+    @NotNull
+    private String taskName;
+    @NotNull
+    @Email
+    private String userEmail;
+    @NotNull
+    private String type;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @NotNull
+    private Date start;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @NotNull
+    private Date end;
+
+    private String isDone;
+    private String description;
+}

+ 26 - 0
src/main/java/se/cloud/analysis/domain/User.java

@@ -0,0 +1,26 @@
+package se.cloud.analysis.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class User {
+    private int id;
+    private String name;
+    private String email;
+    private String phone;
+    private String password;
+    private String salt;
+    private String sex;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthday;
+    private String education;
+    private String school;
+    private String isWork;
+    private String company;
+    private String awards;
+}

+ 18 - 0
src/main/java/se/cloud/analysis/exception/GlobalException.java

@@ -0,0 +1,18 @@
+package se.cloud.analysis.exception;
+
+import se.cloud.analysis.result.CodeMsg;
+
+public class GlobalException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    private CodeMsg codeMsg;
+
+    public GlobalException(CodeMsg codeMsg) {
+        super(codeMsg.toString());
+        this.codeMsg = codeMsg;
+    }
+
+    public CodeMsg getCodeMsg() {
+        return codeMsg;
+    }
+}

+ 32 - 0
src/main/java/se/cloud/analysis/exception/GlobalExceptionHandler.java

@@ -0,0 +1,32 @@
+package se.cloud.analysis.exception;
+
+import org.springframework.validation.BindException;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import se.cloud.analysis.result.CodeMsg;
+import se.cloud.analysis.result.Result;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@ControllerAdvice
+@ResponseBody
+public class GlobalExceptionHandler {
+
+    @ExceptionHandler(value = Exception.class)
+    public Result<String> exceptionHandler(HttpServletRequest request, Exception exception) {
+        if (exception instanceof GlobalException) {
+            GlobalException ex = (GlobalException) exception;
+            return Result.error(ex.getCodeMsg());
+        } else if (exception instanceof BindException) {
+            org.springframework.validation.BindException ex = (BindException) exception;
+            List<ObjectError> errors = ex.getAllErrors();
+            String msg = errors.get(0).getDefaultMessage();
+            return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
+        } else {
+            return Result.error(CodeMsg.SERVER_ERROR);
+        }
+    }
+}

+ 35 - 0
src/main/java/se/cloud/analysis/redis/BaseKey.java

@@ -0,0 +1,35 @@
+package se.cloud.analysis.redis;
+
+public abstract class BaseKey implements KeyPrefix {
+
+    private int expireSeconds;
+
+    private String prefix;
+
+    private String key;
+
+    protected static final int DEFAULT_EXPIRE_SECONDS = 172800;
+
+    public BaseKey(int expireSeconds, String prefix, String key) {
+        this.expireSeconds = expireSeconds;
+        this.prefix = prefix;
+        this.key = key;
+    }
+
+    @Override
+    public int getExpireSeconds() {
+        return expireSeconds;
+    }
+
+    @Override
+    public String getPrefix() {
+        String className = getClass().getSimpleName();
+        return className + ":" + prefix;
+    }
+
+    public String getKey() {
+        String prefix = getPrefix();
+        return prefix + ":" + key;
+    }
+
+}

+ 8 - 0
src/main/java/se/cloud/analysis/redis/KeyPrefix.java

@@ -0,0 +1,8 @@
+package se.cloud.analysis.redis;
+
+public interface KeyPrefix {
+
+    public int getExpireSeconds();
+
+    public String getPrefix();
+}

+ 64 - 0
src/main/java/se/cloud/analysis/redis/RedisService.java

@@ -0,0 +1,64 @@
+package se.cloud.analysis.redis;
+
+import com.alibaba.fastjson.JSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class RedisService {
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+    public <T> void set(BaseKey key, T value) {
+        redisTemplate.opsForValue().set(key.getKey(), beanToString(value), key.getExpireSeconds(), TimeUnit.SECONDS);
+    }
+
+    public <T> void set(String key, T value) {
+        redisTemplate.opsForValue().set(key, beanToString(value));
+    }
+
+    public <T> void set(String key, T value, int expireSeconds) {
+        redisTemplate.opsForValue().set(key, beanToString(value), expireSeconds, TimeUnit.SECONDS);
+    }
+
+    public <T> T get(String key, Class<T> clazz) {
+        String str = redisTemplate.opsForValue().get(key);
+        return stringToBean(str, clazz);
+    }
+
+    public static <T> String beanToString(T value) {
+        if(value == null) {
+            return null;
+        }
+        Class<?> clazz = value.getClass();
+        if(clazz == int.class || clazz == Integer.class) {
+            return ""+value;
+        }else if(clazz == String.class) {
+            return (String)value;
+        }else if(clazz == long.class || clazz == Long.class) {
+            return ""+value;
+        }else {
+            return JSON.toJSONString(value);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T stringToBean(String str, Class<T> clazz) {
+        if(str == null || str.length() <= 0 || clazz == null) {
+            return null;
+        }
+        if(clazz == int.class || clazz == Integer.class) {
+            return (T)Integer.valueOf(str);
+        }else if(clazz == String.class) {
+            return (T)str;
+        }else if(clazz == long.class || clazz == Long.class) {
+            return  (T)Long.valueOf(str);
+        }else {
+            return JSON.toJavaObject(JSON.parseObject(str), clazz);
+        }
+    }
+}

+ 20 - 0
src/main/java/se/cloud/analysis/redis/UserKey.java

@@ -0,0 +1,20 @@
+package se.cloud.analysis.redis;
+
+public class UserKey extends BaseKey {
+
+    private UserKey(int expireSeconds, String prefix, String key) {
+        super(expireSeconds, prefix, key);
+    }
+
+    public static UserKey getKeyByToken(int expireSeconds, String key) {
+        return new UserKey(expireSeconds, "tk", key);
+    }
+
+    public static UserKey getKeyByTokenAndDefaultExpireTime(String key) {
+        return new UserKey(DEFAULT_EXPIRE_SECONDS, "tk", key);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(getKeyByTokenAndDefaultExpireTime("b661d30c86974a52a6b495c6c99ad509").getKey());
+    }
+}

+ 67 - 0
src/main/java/se/cloud/analysis/result/CodeMsg.java

@@ -0,0 +1,67 @@
+package se.cloud.analysis.result;
+
+public class CodeMsg {
+
+    private int code;
+    private String msg;
+
+    //通用的错误码
+    public static CodeMsg SUCCESS = new CodeMsg(0, "success");
+    public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常");
+    public static CodeMsg BIND_ERROR = new CodeMsg(500101, "参数校验异常:%s");
+    public static CodeMsg REQUEST_ILLEGAL = new CodeMsg(500102, "请求非法");
+    public static CodeMsg ACCESS_LIMIT_REACHED= new CodeMsg(500104, "访问太频繁!");
+    //登录模块 5002XX
+    public static CodeMsg SESSION_ERROR = new CodeMsg(500210, "Session不存在或者已经失效");
+    public static CodeMsg PASSWORD_EMPTY = new CodeMsg(500211, "登录密码不能为空");
+    public static CodeMsg EMAIL_EMPTY = new CodeMsg(500212, "邮箱不能为空");
+    public static CodeMsg EMAIL_ERROR = new CodeMsg(500213, "邮箱格式错误");
+    public static CodeMsg EMAIL_NOT_EXIST = new CodeMsg(500214, "邮箱不存在");
+    public static CodeMsg PASSWORD_ERROR = new CodeMsg(500215, "密码错误");
+    public static CodeMsg USER_ALREADY_EXISTS = new CodeMsg(500216, "用户已存在");
+    public static CodeMsg USER_NOT_EXISTS = new CodeMsg(500217, "用户不存在");
+    public static CodeMsg TOKEN_HAS_EXPIRED = new CodeMsg(500218, "token已过期");
+    public static CodeMsg TOKEN_EMPTY = new CodeMsg(500219, "token为空");
+    //学习模块 5003XX
+
+    //任务模块 5004XX
+    public static CodeMsg TASK_ALREADY_EXISTS = new CodeMsg(500301, "任务已存在");
+    public static CodeMsg TASK_NOT_EXISTS = new CodeMsg(500302, "任务不存在");
+
+    //事件模块 5005XX
+    public static CodeMsg EVENT_ALREADY_EXISTS = new CodeMsg(500501, "事件已存在");
+
+    private CodeMsg( ) {
+    }
+
+    private CodeMsg( int code,String msg ) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+    public void setCode(int code) {
+        this.code = code;
+    }
+    public String getMsg() {
+        return msg;
+    }
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public CodeMsg fillArgs(Object... args) {
+        int code = this.code;
+        String message = String.format(this.msg, args);
+        return new CodeMsg(code, message);
+    }
+
+    @Override
+    public String toString() {
+        return "CodeMsg [code=" + code + ", msg=" + msg + "]";
+    }
+
+
+}

+ 58 - 0
src/main/java/se/cloud/analysis/result/Result.java

@@ -0,0 +1,58 @@
+package se.cloud.analysis.result;
+
+public class Result<T> {
+
+    private int code;
+    private String msg;
+    private T data;
+
+    /**
+     *  成功时候的调用
+     * */
+    public static  <T> Result<T> success(T data){
+        return new Result<T>(data);
+    }
+
+    /**
+     *  失败时候的调用
+     * */
+    public static  <T> Result<T> error(CodeMsg codeMsg){
+        return new Result<T>(codeMsg);
+    }
+
+    private Result(T data) {
+        this.data = data;
+    }
+
+    private Result(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    private Result(CodeMsg codeMsg) {
+        if(codeMsg != null) {
+            this.code = codeMsg.getCode();
+            this.msg = codeMsg.getMsg();
+        }
+    }
+
+
+    public int getCode() {
+        return code;
+    }
+    public void setCode(int code) {
+        this.code = code;
+    }
+    public String getMsg() {
+        return msg;
+    }
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+    public T getData() {
+        return data;
+    }
+    public void setData(T data) {
+        this.data = data;
+    }
+}

+ 35 - 0
src/main/java/se/cloud/analysis/service/EventService.java

@@ -0,0 +1,35 @@
+package se.cloud.analysis.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import se.cloud.analysis.dao.EventDao;
+import se.cloud.analysis.domain.Event;
+
+import java.util.List;
+
+@Service
+public class EventService {
+
+    @Autowired
+    private EventDao eventDao;
+
+    public List<Event> getAllEventList(String email) {
+        return eventDao.getEventListByEmail(email);
+    }
+
+    public List<Event> getEventListByType(String email, String type) {
+        return eventDao.getEventListByEmailAndType(email, type);
+    }
+
+    public List<Event> getTaskEventList(String email, String taskName) {
+        return eventDao.getTaskEventByEmailAndTaskName(email, taskName);
+    }
+
+    public int addEvent(Event event) {
+        return eventDao.insert(event);
+    }
+
+    public boolean isExist(Event event) {
+        return eventDao.getSpecifiedEvent(event) != null;
+    }
+}

+ 39 - 0
src/main/java/se/cloud/analysis/service/ExerciseService.java

@@ -0,0 +1,39 @@
+package se.cloud.analysis.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import se.cloud.analysis.dao.ExerciseDao;
+import se.cloud.analysis.domain.Exercise;
+
+import java.util.List;
+
+@Service
+public class ExerciseService {
+
+    private static final int DEFAULT_LIMIT = 50;
+
+    @Autowired
+    private ExerciseDao exerciseDao;
+
+    public int addExercise(Exercise exercise) {
+        return exerciseDao.insert(exercise);
+    }
+
+    public int markExerciseDone(int exerciseId) {
+        return exerciseDao.markDone(exerciseId);
+    }
+
+    public List<Exercise> getExerciseList(String email, int page) {
+        int index = (page - 1) * DEFAULT_LIMIT;
+        return exerciseDao.getExerciseByEmail(email, index, DEFAULT_LIMIT);
+    }
+
+    public int getExerciseCount(String email) {
+        return exerciseDao.getCountByEmail(email);
+    }
+
+    public int getPages(String email) {
+        int count = getExerciseCount(email);
+        return count % DEFAULT_LIMIT == 0 ? count / DEFAULT_LIMIT : count / DEFAULT_LIMIT + 1;
+    }
+}

+ 52 - 0
src/main/java/se/cloud/analysis/service/GoalService.java

@@ -0,0 +1,52 @@
+package se.cloud.analysis.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import se.cloud.analysis.dao.GLessonDao;
+import se.cloud.analysis.dao.GoalDao;
+import se.cloud.analysis.domain.Goal;
+import se.cloud.analysis.vo.GoalLessonVO;
+
+import java.util.List;
+
+@Service
+public class GoalService {
+
+    @Autowired
+    private GoalDao goalDao;
+
+    @Autowired
+    private GLessonDao gLessonDao;
+
+    public Goal getGoalByEmail(String email) {
+        return goalDao.getGoalByEmail(email);
+    }
+
+    public int addGoal(Goal goal) {
+        return goalDao.insert(goal);
+    }
+
+    public int updateGoal(Goal goal) {
+        return goalDao.update(goal);
+    }
+
+    public int deleteGoal(String email) {
+        return goalDao.delete(email);
+    }
+
+    public List<String> getLessonsOfGoal(String target) {
+        return gLessonDao.getLessonsOfGoal(target);
+    }
+
+    public GoalLessonVO getGoalAndLessons(String email) {
+        Goal goal = getGoalByEmail(email);
+        if (goal == null) {
+            return null;
+        }
+        List<String> lessons = getLessonsOfGoal(goal.getTarget());
+        GoalLessonVO goalLessonVO = new GoalLessonVO();
+        goalLessonVO.setGoal(goal.getTarget());
+        goalLessonVO.setLessons(lessons);
+        return goalLessonVO;
+    }
+}

+ 59 - 0
src/main/java/se/cloud/analysis/service/StatusService.java

@@ -0,0 +1,59 @@
+package se.cloud.analysis.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import se.cloud.analysis.dao.KnowledgeDao;
+import se.cloud.analysis.dao.ScoreDao;
+import se.cloud.analysis.domain.Goal;
+import se.cloud.analysis.domain.Knowledge;
+import se.cloud.analysis.domain.Score;
+import se.cloud.analysis.vo.StatusVO;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class StatusService {
+
+    @Autowired
+    private ScoreDao scoreDao;
+
+    @Autowired
+    private GoalService goalService;
+
+    @Autowired
+    private KnowledgeDao knowledgeDao;
+
+    public List<Score> getScores(String email) {
+        return scoreDao.getAllScoresByEmail(email);
+    }
+
+    public List<Knowledge> getUserAllKnowledge(String goal) {
+        List<Knowledge> knowledge;
+        if (goal == null) {
+            knowledge = knowledgeDao.getAllKnowledge();
+        } else {
+            knowledge = knowledgeDao.getKnowledgeByGoal(goal);
+        }
+        return knowledge;
+    }
+
+    public StatusVO getStatus(String email) {
+        Goal goal = goalService.getGoalByEmail(email);
+        String target;
+        if (goal == null) {
+            target = null;
+        } else {
+            target = goal.getTarget();
+        }
+        StatusVO statusVO = new StatusVO();
+        statusVO.setEmail(email);
+        statusVO.setGoal(target);
+        statusVO.setKnowledge(getUserAllKnowledge(target));
+        statusVO.setScores(getScores(email));
+        return statusVO;
+    }
+
+}

+ 72 - 0
src/main/java/se/cloud/analysis/service/TaskService.java

@@ -0,0 +1,72 @@
+package se.cloud.analysis.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import se.cloud.analysis.dao.TaskDao;
+import se.cloud.analysis.domain.Event;
+import se.cloud.analysis.domain.Task;
+import se.cloud.analysis.vo.TaskDetailVO;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class TaskService {
+
+    @Autowired
+    private TaskDao taskDao;
+
+    @Autowired
+    private EventService eventService;
+
+    public List<Task> getTaskList(String email) {
+        return taskDao.getTaskByEmail(email);
+    }
+
+    public Task getTaskById(int taskId) {
+        return taskDao.getTaskById(taskId);
+    }
+
+    public boolean addTask(Task task) {
+        // TODO 事务实现
+        Date start = task.getStart();
+        Date end = task.getEnd();
+        Event startEvent = new Event();
+        startEvent.setUserEmail(task.getUserEmail());
+        startEvent.setDescription("创建");
+        startEvent.setTaskName(task.getTaskName());
+        startEvent.setTime(start);
+        startEvent.setType("task");
+        Event endEvent = new Event();
+        endEvent.setUserEmail(task.getUserEmail());
+        endEvent.setDescription("结束");
+        endEvent.setType("task");
+        endEvent.setTime(end);
+        endEvent.setTaskName(task.getTaskName());
+        int startEventRes = eventService.addEvent(startEvent);
+        int endEventRes = eventService.addEvent(endEvent);
+        int taskRes = taskDao.insert(task);
+        return startEventRes + endEventRes + taskRes == 3;
+    }
+
+    public int updateTask(Task task) {
+        return taskDao.update(task);
+    }
+
+    public int deleteTask(int taskId) {
+        return taskDao.deleteById(taskId);
+    }
+
+    public Task getTaskByEmailAndName(String email, String name) {
+        return taskDao.getTaskByEmailAndName(email, name);
+    }
+
+    public TaskDetailVO getTaskDetail(String email, int id) {
+        Task task = getTaskById(id);
+        List<Event> events = eventService.getTaskEventList(email, task.getTaskName());
+        TaskDetailVO taskDetailVO = new TaskDetailVO();
+        taskDetailVO.setEvents(events);
+        taskDetailVO.setTask(task);
+        return taskDetailVO;
+    }
+}

+ 122 - 0
src/main/java/se/cloud/analysis/service/UserService.java

@@ -0,0 +1,122 @@
+package se.cloud.analysis.service;
+
+import jdk.nashorn.internal.objects.Global;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import se.cloud.analysis.dao.UserDao;
+import se.cloud.analysis.domain.User;
+import se.cloud.analysis.exception.GlobalException;
+import se.cloud.analysis.redis.RedisService;
+import se.cloud.analysis.redis.UserKey;
+import se.cloud.analysis.result.CodeMsg;
+import se.cloud.analysis.utils.MD5Util;
+import se.cloud.analysis.utils.SaltUtil;
+import se.cloud.analysis.utils.UUIDUtil;
+import se.cloud.analysis.vo.InformationVO;
+import se.cloud.analysis.vo.LoginVO;
+import se.cloud.analysis.vo.RegisterVO;
+import sun.security.provider.MD5;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+@Service
+public class UserService {
+
+    @Autowired
+    private UserDao userDao;
+
+    @Autowired
+    private RedisService redisService;
+
+    public static final String COOKIE_NAME_TOKEN = "se_education_cloud_data_analysis_token";
+
+    public User getUserByEmail(String email) {
+        return userDao.getUserByEmail(email);
+    }
+
+    public User getUserByToken(String token) {
+        return redisService.get(UserKey.getKeyByTokenAndDefaultExpireTime(token).getKey(), User.class);
+    }
+
+    public int updateUser(User user) {
+        return userDao.updateUser(user);
+    }
+
+    public int delete(String email) {
+        return userDao.deleteUser(email);
+    }
+
+    public InformationVO getInformationByEmail(String email) {
+        User user = getUserByEmail(email);
+        if (user == null) {
+            throw new GlobalException(CodeMsg.EMAIL_NOT_EXIST);
+        } else {
+            return InformationVO.userToInformationVO(user);
+        }
+    }
+
+    public InformationVO getInformationByToken(String token) {
+        if (StringUtils.isEmpty(token)) {
+            throw new GlobalException(CodeMsg.TOKEN_EMPTY);
+        }
+        User user = getUserByToken(token);
+        if (user == null) {
+            throw new GlobalException(CodeMsg.TOKEN_HAS_EXPIRED);
+        }
+        return InformationVO.userToInformationVO(user);
+    }
+
+    public boolean register(RegisterVO registerVO) {
+        if (registerVO == null) {
+            throw new GlobalException(CodeMsg.SERVER_ERROR);
+        }
+        String email = registerVO.getEmail();
+        String formPassword = registerVO.getPassword();
+        String name = registerVO.getName();
+        if (getUserByEmail(email) != null) {
+            throw new GlobalException(CodeMsg.USER_ALREADY_EXISTS);
+        }
+        User user = new User();
+        String randomSalt = SaltUtil.generateRandomSalt();
+        user.setEmail(email);
+        user.setPassword(MD5Util.formPassToDbPass(formPassword, randomSalt));
+        user.setName(name);
+        user.setSalt(randomSalt);
+        if (userDao.insertUser(user) == 1) {
+            return true;
+        } else {
+            throw new GlobalException(CodeMsg.SERVER_ERROR);
+        }
+    }
+
+    public boolean login(HttpServletResponse response, LoginVO loginVO) {
+        if (loginVO == null) {
+            throw new GlobalException(CodeMsg.SERVER_ERROR);
+        }
+        String email = loginVO.getEmail();
+        String formPass = loginVO.getPassword();
+        //判断邮箱是否存在
+        User user = getUserByEmail(email);
+        if (user == null) {
+            throw new GlobalException(CodeMsg.EMAIL_NOT_EXIST);
+        }
+        //验证密码
+        String dbPass = user.getPassword();
+        String dbSalt = user.getSalt();
+        String calculatePass = MD5Util.formPassToDbPass(formPass, dbSalt);
+        if (!calculatePass.equals(dbPass)) {
+            throw  new GlobalException(CodeMsg.PASSWORD_ERROR);
+        }
+        //生成Cookie
+        String token = UUIDUtil.uuid();
+        UserKey redisKey = UserKey.getKeyByTokenAndDefaultExpireTime(token);
+        redisService.set(redisKey, user);
+        Cookie cookie = new Cookie(COOKIE_NAME_TOKEN, token);
+        cookie.setMaxAge(redisKey.getExpireSeconds());
+        cookie.setPath("/");
+        response.addCookie(cookie);
+        return true;
+    }
+}

+ 21 - 0
src/main/java/se/cloud/analysis/utils/MD5Util.java

@@ -0,0 +1,21 @@
+package se.cloud.analysis.utils;
+
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+public class MD5Util {
+
+    private static final String USER_SALT = "8leJRHe2IFjJkjE0NTvh";
+    public static String md5(String src) {
+        return DigestUtils.md5Hex(src);
+    }
+
+    public static String formPassToDbPass(String formPass, String salt) {
+        String str = "" + salt.charAt(0) + salt.charAt(2) + salt.charAt(7) + formPass + salt.charAt(5) + salt.charAt(18) + salt.charAt(12);
+        return md5(str);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(formPassToDbPass("552ce520173c596a1972c3b7343646f7", "uwJ5EQmFzxvgE/5OGlka"));
+    }
+}

+ 17 - 0
src/main/java/se/cloud/analysis/utils/SaltUtil.java

@@ -0,0 +1,17 @@
+package se.cloud.analysis.utils;
+
+import java.security.SecureRandom;
+
+public class SaltUtil {
+
+    public static String generateRandomSalt() {
+        SecureRandom random = new SecureRandom();
+        byte[] bytes = new byte[15];
+        random.nextBytes(bytes);
+        return org.apache.commons.codec.binary.Base64.encodeBase64String(bytes);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(generateRandomSalt());
+    }
+}

+ 9 - 0
src/main/java/se/cloud/analysis/utils/UUIDUtil.java

@@ -0,0 +1,9 @@
+package se.cloud.analysis.utils;
+
+import java.util.UUID;
+
+public class UUIDUtil {
+    public static String uuid() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+}

+ 11 - 0
src/main/java/se/cloud/analysis/vo/GoalLessonVO.java

@@ -0,0 +1,11 @@
+package se.cloud.analysis.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GoalLessonVO {
+    private String goal;
+    private List<String> lessons;
+}

+ 39 - 0
src/main/java/se/cloud/analysis/vo/InformationVO.java

@@ -0,0 +1,39 @@
+package se.cloud.analysis.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import se.cloud.analysis.domain.User;
+
+import java.util.Date;
+
+@Data
+public class InformationVO {
+    private String name;
+    private String email;
+    private String phone;
+    private String sex;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthday;
+    private String education;
+    private String school;
+    private String isWork;
+    private String company;
+    private String awards;
+
+    public static InformationVO userToInformationVO(User user) {
+        InformationVO informationVO = new InformationVO();
+        informationVO.setName(user.getName());
+        informationVO.setEmail(user.getEmail());
+        informationVO.setPhone(user.getPhone());
+        informationVO.setSex(user.getSex());
+        informationVO.setBirthday(user.getBirthday());
+        informationVO.setEducation(user.getEducation());
+        informationVO.setSchool(user.getSchool());
+        informationVO.setIsWork(user.getIsWork());
+        informationVO.setCompany(user.getCompany());
+        informationVO.setAwards(user.getAwards());
+        return informationVO;
+    }
+}

+ 17 - 0
src/main/java/se/cloud/analysis/vo/LoginVO.java

@@ -0,0 +1,17 @@
+package se.cloud.analysis.vo;
+
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class LoginVO {
+    @NotNull
+    @Email
+    private String email;
+    @NotNull
+    @Length(min = 32)
+    private String password;
+}

+ 13 - 0
src/main/java/se/cloud/analysis/vo/RecommendationVO.java

@@ -0,0 +1,13 @@
+package se.cloud.analysis.vo;
+
+import lombok.Data;
+import se.cloud.analysis.domain.Exercise;
+
+import java.util.List;
+
+@Data
+public class RecommendationVO {
+    private int pages;
+    private int page;
+    private List<Exercise> exerciseList;
+}

+ 20 - 0
src/main/java/se/cloud/analysis/vo/RegisterVO.java

@@ -0,0 +1,20 @@
+package se.cloud.analysis.vo;
+
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class RegisterVO {
+    @NotNull
+    @Email
+    private String email;
+    @NotNull
+    @Length(min = 32)
+    private String password;
+    @NotNull
+    @Length(min = 2)
+    private String name;
+}

+ 15 - 0
src/main/java/se/cloud/analysis/vo/StatusVO.java

@@ -0,0 +1,15 @@
+package se.cloud.analysis.vo;
+
+import lombok.Data;
+import se.cloud.analysis.domain.Knowledge;
+import se.cloud.analysis.domain.Score;
+
+import java.util.List;
+
+@Data
+public class StatusVO {
+    private String email;
+    private String goal;
+    private List<Score> scores;
+    private List<Knowledge> knowledge;
+}

+ 13 - 0
src/main/java/se/cloud/analysis/vo/TaskDetailVO.java

@@ -0,0 +1,13 @@
+package se.cloud.analysis.vo;
+
+import lombok.Data;
+import se.cloud.analysis.domain.Event;
+import se.cloud.analysis.domain.Task;
+
+import java.util.List;
+
+@Data
+public class TaskDetailVO {
+    private Task task;
+    private List<Event> events;
+}

+ 1 - 0
src/main/resources/application.properties

@@ -0,0 +1 @@
+

+ 28 - 0
src/main/resources/application.yml

@@ -0,0 +1,28 @@
+server:
+  port: 8080
+spring:
+  application:
+    name: Data-Analysis
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/data_analysis?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
+    username: root
+    password: fanjialin1101
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  redis:
+    database: 0
+    host: localhost
+    port: 6379
+    password:
+    lettuce:
+      pool:
+        max-active: 8
+        max-wait: -1
+        max-idle: 8
+        min-idle: 0
+mybatis:
+  type-aliases-package: se.cloud.analysis.domain
+  configuration:
+    map-underscore-to-camel-case: true
+    default-fetch-size: 100
+    default-statement-timeout: 3000
+  mapper-locations: classpath:se/cloud/analysisi/dao/*.xml

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/index.html


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/css/app.ab549fb2.css


+ 1 - 0
src/main/resources/static/static/css/chunk-1c9ebc78.cc28df39.css

@@ -0,0 +1 @@
+.task-form{margin-top:1.25rem}

+ 1 - 0
src/main/resources/static/static/css/chunk-2061cd58.626c217d.css

@@ -0,0 +1 @@
+.pagination[data-v-781a8350]{margin-top:1.875rem;text-align:center}

+ 1 - 0
src/main/resources/static/static/css/chunk-4889d482.0880708b.css

@@ -0,0 +1 @@
+.process-chart{padding-left:3.125rem;padding-right:3.125rem}.identity-tag{margin-right:.9375rem}.description-item{margin-bottom:.625rem}.timeline{margin-top:1.25rem}

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/css/chunk-4de1c2b6.a37cd815.css


+ 1 - 0
src/main/resources/static/static/css/chunk-506d5108.363db6df.css

@@ -0,0 +1 @@
+.dashboard-container[data-v-49a5ec71]{margin:30px}.dashboard-text[data-v-49a5ec71]{font-size:30px;line-height:46px}

+ 1 - 0
src/main/resources/static/static/css/chunk-5eb9e756.e403bdea.css

@@ -0,0 +1 @@
+.learning-info[data-v-5e29504b]{padding-left:3.125rem;padding-right:3.125rem}.data-chart-radar[data-v-5e29504b]{width:50%}

+ 1 - 0
src/main/resources/static/static/css/chunk-651c4a80.a1cfec7e.css

@@ -0,0 +1 @@
+.goal-container[data-v-59c7630d]{padding-left:1.25rem;padding-top:.625rem}.selector[data-v-59c7630d]{margin-top:1.25rem}.description[data-v-59c7630d],.person-info[data-v-59c7630d]{margin-left:.625rem}.personal-lesson[data-v-59c7630d]{margin-top:1.25rem}

+ 1 - 0
src/main/resources/static/static/css/chunk-b343171e.7f709b4e.css

@@ -0,0 +1 @@
+@supports (-webkit-mask:none) and (not (cater-color:#fff)){.login-container .el-input input{color:#fff}}.login-container .el-input{display:inline-block;height:47px;width:85%}.login-container .el-input input{background:transparent;border:0;-webkit-appearance:none;border-radius:0;padding:12px 5px 12px 15px;color:#fff;height:47px;caret-color:#fff}.login-container .el-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #283443 inset!important;box-shadow:inset 0 0 0 1000px #283443!important;-webkit-text-fill-color:#fff!important}.login-container .el-form-item{border:1px solid hsla(0,0%,100%,.1);background:rgba(0,0,0,.1);border-radius:5px;color:#454545}.login-container[data-v-067fd5bb]{min-height:100%;width:100%;background-color:#2d3a4b;overflow:hidden}.login-container .login-form[data-v-067fd5bb]{position:relative;width:520px;max-width:100%;padding:160px 35px 0;margin:0 auto;overflow:hidden}.login-container .tips[data-v-067fd5bb]{font-size:14px;color:#fff;margin-bottom:10px}.login-container .tips span[data-v-067fd5bb]:first-of-type{margin-right:16px}.login-container .svg-container[data-v-067fd5bb]{padding:6px 5px 6px 15px;color:#889aa4;vertical-align:middle;width:30px;display:inline-block}.login-container .title-container[data-v-067fd5bb]{position:relative}.login-container .title-container .title[data-v-067fd5bb]{font-size:26px;color:#eee;margin:0 auto 40px auto;text-align:center;font-weight:700}.login-container .show-pwd[data-v-067fd5bb]{position:absolute;right:10px;top:7px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}

+ 1 - 0
src/main/resources/static/static/css/chunk-d5734dbc.b5dd69d9.css

@@ -0,0 +1 @@
+.is-selected{color:#1989fa}.task-detail{margin-top:1.25rem}

+ 1 - 0
src/main/resources/static/static/css/chunk-d708c094.4c2e8727.css

@@ -0,0 +1 @@
+.list{margin-top:1.25rem;margin-left:1.25rem;margin-right:1.25rem}.task-card{margin-bottom:1.875rem}.time{font-size:13px;color:#999}.bottom{margin-top:13px;line-height:12px}.button{padding:0;float:right}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/css/chunk-elementUI.ded27da0.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/css/chunk-libs.56265064.css


BIN
src/main/resources/static/static/fonts/element-icons.535877f5.woff


BIN
src/main/resources/static/static/fonts/element-icons.732389de.ttf


BIN
src/main/resources/static/static/img/404.a57b6f31.png


BIN
src/main/resources/static/static/img/404_cloud.0f4bc32b.png


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/app.2100f3a6.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-1c9ebc78.5eefc74c.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-2061cd58.3d9f56e7.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-2d20957c.b6d12977.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-4889d482.fcefc37c.js


+ 1 - 0
src/main/resources/static/static/js/chunk-4de1c2b6.1996b5e4.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4de1c2b6"],{"26fc":function(t,s,a){t.exports=a.p+"static/img/404_cloud.0f4bc32b.png"},"8cdb":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"wscn-http404-container"},[a("div",{staticClass:"wscn-http404"},[t._m(0),t._v(" "),a("div",{staticClass:"bullshit"},[a("div",{staticClass:"bullshit__oops"},[t._v("OOPS!")]),t._v(" "),t._m(1),t._v(" "),a("div",{staticClass:"bullshit__headline"},[t._v(t._s(t.message))]),t._v(" "),a("div",{staticClass:"bullshit__info"},[t._v("Please check that the URL you entered is correct, or click the button below to return to the homepage.")]),t._v(" "),a("a",{staticClass:"bullshit__return-home",attrs:{href:""}},[t._v("Back to home")])])])])},c=[function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"pic-404"},[e("img",{staticClass:"pic-404__parent",attrs:{src:a("a36b"),alt:"404"}}),t._v(" "),e("img",{staticClass:"pic-404__child left",attrs:{src:a("26fc"),alt:"404"}}),t._v(" "),e("img",{staticClass:"pic-404__child mid",attrs:{src:a("26fc"),alt:"404"}}),t._v(" "),e("img",{staticClass:"pic-404__child right",attrs:{src:a("26fc"),alt:"404"}})])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"bullshit__info"},[t._v("All rights reserved\n        "),a("a",{staticStyle:{color:"#20a0ff"},attrs:{href:"https://wallstreetcn.com",target:"_blank"}},[t._v("wallstreetcn")])])}],i={name:"Page404",computed:{message:function(){return"The webmaster said that you can not enter this page..."}}},l=i,n=(a("97ef"),a("2877")),r=Object(n["a"])(l,e,c,!1,null,"c095f994",null);s["default"]=r.exports},"97ef":function(t,s,a){"use strict";var e=a("d3f45"),c=a.n(e);c.a},a36b:function(t,s,a){t.exports=a.p+"static/img/404.a57b6f31.png"},d3f45:function(t,s,a){}}]);

+ 1 - 0
src/main/resources/static/static/js/chunk-506d5108.5957353a.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-506d5108"],{"3af4":function(s,t,n){},9406:function(s,t,n){"use strict";n.r(t);var e=function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("div",{staticClass:"dashboard-container"},[n("div",{staticClass:"dashboard-text"},[s._v("欢迎您! "+s._s(s.name))]),s._v(" "),n("div",[n("p",[s._v("您已累计学习 "+s._s(s.hours)+" 小时")])]),s._v(" "),n("div",[n("p",[s._v("提交了 "+s._s(s.codeRows)+" 行代码")])]),s._v(" "),n("div",[n("p",[s._v("参与了 "+s._s(s.questionsParticipationTimes)+" 次问题讨论")])]),s._v(" "),n("div",[n("p",[s._v("完成了 "+s._s(s.lessons)+" 次课程学习")])])])},a=[],i=(n("7f7f"),n("1c1e"),{name:"Dashboard",data:function(){return{name:"",hours:"56",codeRows:"1000",questionsParticipationTimes:"36",lessons:"12"}},mounted:function(){this.name=this.$store.getters.name}}),o=i,c=(n("bf15"),n("2877")),r=Object(c["a"])(o,e,a,!1,null,"49a5ec71",null);t["default"]=r.exports},bf15:function(s,t,n){"use strict";var e=n("3af4"),a=n.n(e);a.a}}]);

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-5eb9e756.49af0265.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-651c4a80.88228896.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-b343171e.fc5e63c0.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-d5734dbc.d2961e22.js


+ 1 - 0
src/main/resources/static/static/js/chunk-d708c094.1ae0946f.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-d708c094"],{"4bbd":function(t,s,a){},"5afd":function(t,s,a){"use strict";var i=a("4bbd"),e=a.n(i);e.a},"93dc":function(t,s,a){"use strict";a.r(s);var i=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"list-container"},[a("div",{staticClass:"list"},t._l(t.taskList,(function(s){return a("el-card",{staticClass:"task-card",staticStyle:{width:"50%","margin-left":"1.25rem"}},[a("div",{staticClass:"taskDetail"},[a("div",[t._v("任务名称 : "+t._s(s.taskName))]),t._v(" "),a("div",[t._v("类型 : "+t._s(s.type))]),t._v(" "),a("div",[t._v("描述 : "+t._s(s.description))]),t._v(" "),a("div",{staticClass:"bottom clearfix"},[a("time",{staticClass:"time"},[t._v(t._s(s.start)+" - "+t._s(s.end))]),t._v(" "),a("el-button",{staticClass:"button",attrs:{type:"text"},on:{click:function(a){return t.toDetail(t.email,s.id)}}},[t._v("查看详情")])],1)])])})),1)])},e=[],n=a("bd86"),c=a("1c1e"),l={name:"TaskList",data:function(){var t;return t={email:this.$store.getters.email,rows:3,cols:3},Object(n["a"])(t,"email",this.$store.getters.email),Object(n["a"])(t,"taskList",[{id:"",taskName:"",type:"",start:"",end:"",description:""}]),t},methods:{toDetail:function(t,s){this.$router.push({path:"/task/detail",query:{userEmail:t,id:s}})},getTaskList:function(){var t=this;Object(c["a"])("/task/list?email="+this.email,{method:"GET"}).then((function(s){if(0===s.code){var a=s.data;t.taskList=a,console.log(a)}else t.$message(s.msg)}))}},mounted:function(){this.getTaskList()}},r=l,o=(a("5afd"),a("2877")),d=Object(o["a"])(r,i,e,!1,null,null,null);s["default"]=d.exports}}]);

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-elementUI.5dc3be45.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/resources/static/static/js/chunk-libs.a17db165.js


Неке датотеке нису приказане због велике количине промена