finikes 2 lat temu
rodzic
commit
a9a37db950
40 zmienionych plików z 2595 dodań i 10 usunięć
  1. 29 10
      .gitignore
  2. BIN
      .mvn/wrapper/maven-wrapper.jar
  3. 18 0
      .mvn/wrapper/maven-wrapper.properties
  4. 316 0
      mvnw
  5. 188 0
      mvnw.cmd
  6. 51 0
      pom.xml
  7. 50 0
      src/main/java/com/finikes/matchmaker/BaseDTO.java
  8. 16 0
      src/main/java/com/finikes/matchmaker/BizException.java
  9. 13 0
      src/main/java/com/finikes/matchmaker/MatchmakerApplication.java
  10. 17 0
      src/main/java/com/finikes/matchmaker/Passports.java
  11. 60 0
      src/main/java/com/finikes/matchmaker/filter/AuthFilter.java
  12. 37 0
      src/main/java/com/finikes/matchmaker/filter/CorsFilter.java
  13. 43 0
      src/main/java/com/finikes/matchmaker/filter/RegisterStateFilter.java
  14. 381 0
      src/main/java/com/finikes/matchmaker/member/controller/MemberController.java
  15. 72 0
      src/main/java/com/finikes/matchmaker/member/controller/MemberHousesController.java
  16. 9 0
      src/main/java/com/finikes/matchmaker/member/dao/FamilyMemberDAO.java
  17. 32 0
      src/main/java/com/finikes/matchmaker/member/dao/MemberDAO.java
  18. 9 0
      src/main/java/com/finikes/matchmaker/member/dao/MemberHouseDAO.java
  19. 40 0
      src/main/java/com/finikes/matchmaker/member/dto/MemberFamilyMemberRequestDTO.java
  20. 15 0
      src/main/java/com/finikes/matchmaker/member/dto/MemberFamilyMembersRequestDTO.java
  21. 58 0
      src/main/java/com/finikes/matchmaker/member/entity/FamilyMember.java
  22. 113 0
      src/main/java/com/finikes/matchmaker/member/entity/Member.java
  23. 40 0
      src/main/java/com/finikes/matchmaker/member/entity/MemberHouse.java
  24. 31 0
      src/main/java/com/finikes/matchmaker/member/register/RegisterStep.java
  25. 14 0
      src/main/java/com/finikes/matchmaker/member/register/RegisterStepName.java
  26. 147 0
      src/main/java/com/finikes/matchmaker/member/register/Schedules.java
  27. 96 0
      src/main/java/com/finikes/matchmaker/passport/controller/PassportController.java
  28. 14 0
      src/main/java/com/finikes/matchmaker/passport/dao/PassportDAO.java
  29. 21 0
      src/main/java/com/finikes/matchmaker/passport/dto/LoginDTO.java
  30. 40 0
      src/main/java/com/finikes/matchmaker/passport/entity/Passport.java
  31. 22 0
      src/main/java/com/finikes/matchmaker/util/FileHandler.java
  32. 52 0
      src/main/java/com/finikes/matchmaker/util/HttpServletRequestParams.java
  33. 299 0
      src/main/java/com/finikes/matchmaker/util/HttpUtil.java
  34. 21 0
      src/main/java/com/finikes/matchmaker/util/X509TrustManagerImpl.java
  35. 28 0
      src/main/resources/application.yml
  36. 9 0
      src/main/resources/mapper/FamilyMemberMapper.xml
  37. 9 0
      src/main/resources/mapper/MemberHouseMapper.xml
  38. 151 0
      src/main/resources/mapper/MemberMapper.xml
  39. 21 0
      src/main/resources/mapper/PassportMapper.xml
  40. 13 0
      src/test/java/com/finikes/matchmaker/MatchmakerApplicationTests.java

+ 29 - 10
.gitignore

@@ -1,14 +1,33 @@
-# ---> Java
-*.class
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
 
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
 
-# Package Files #
-*.jar
-*.war
-*.ear
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
 
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
 
+### VS Code ###
+.vscode/

BIN
.mvn/wrapper/maven-wrapper.jar


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

@@ -0,0 +1,18 @@
+# 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.
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar

+ 316 - 0
mvnw

@@ -0,0 +1,316 @@
+#!/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 /usr/local/etc/mavenrc ] ; then
+    . /usr/local/etc/mavenrc
+  fi
+
+  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="`\\unset -f command; \\command -v 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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \
+  $MAVEN_DEBUG_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" \
+  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 188 - 0
mvnw.cmd

@@ -0,0 +1,188 @@
+@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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+
+FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\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%
+
+cmd /C exit /B %ERROR_CODE%

+ 51 - 0
pom.xml

@@ -0,0 +1,51 @@
+<?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.7.11</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.finikes</groupId>
+    <artifactId>matchmaker</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>matchmaker</name>
+    <description>matchmaker</description>
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+    <dependencies>
+        <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.3.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 50 - 0
src/main/java/com/finikes/matchmaker/BaseDTO.java

@@ -0,0 +1,50 @@
+package com.finikes.matchmaker;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BaseDTO {
+    private String code;
+    private String message;
+    private Object content;
+
+    public BaseDTO() {
+        code = "1";
+        message = "OK";
+    }
+
+    public BaseDTO(BizException be) {
+        this.code = be.code;
+        this.message = be.message;
+    }
+
+    public BaseDTO(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public BaseDTO setContent(Object content) {
+        this.content = content;
+        return this;
+    }
+
+    public Object getContent() {
+        return content;
+    }
+}

+ 16 - 0
src/main/java/com/finikes/matchmaker/BizException.java

@@ -0,0 +1,16 @@
+package com.finikes.matchmaker;
+
+public class BizException extends RuntimeException {
+    protected String code;
+    protected String message;
+
+    public BizException(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    @Override
+    public Throwable fillInStackTrace() {
+        return null;
+    }
+}

+ 13 - 0
src/main/java/com/finikes/matchmaker/MatchmakerApplication.java

@@ -0,0 +1,13 @@
+package com.finikes.matchmaker;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class MatchmakerApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(MatchmakerApplication.class, args);
+    }
+
+}

+ 17 - 0
src/main/java/com/finikes/matchmaker/Passports.java

@@ -0,0 +1,17 @@
+package com.finikes.matchmaker;
+
+import com.finikes.matchmaker.passport.entity.Passport;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+public class Passports {
+    public static final Passport getPassport(HttpServletRequest request) {
+        HttpSession session = request.getSession();
+        if (null == session) {
+            return null;
+        }
+
+        return (Passport) session.getAttribute("PASSPORT");
+    }
+}

+ 60 - 0
src/main/java/com/finikes/matchmaker/filter/AuthFilter.java

@@ -0,0 +1,60 @@
+package com.finikes.matchmaker.filter;
+
+import com.finikes.matchmaker.Passports;
+import com.finikes.matchmaker.passport.entity.Passport;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class AuthFilter implements Filter {
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+        Passport passport = Passports.getPassport(httpServletRequest);
+        String url = httpServletRequest.getRequestURI();
+        String httpMethod = httpServletRequest.getMethod();
+
+        if (pass(passport, url, httpMethod) == -1) {
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("application/json; charset=utf-8");
+            response.getWriter().print("{\"code\":\"201\", \"message\":\"没有登录\"}");
+            return;
+        }
+
+        try {
+            chain.doFilter(request, httpServletResponse);
+        } catch (Exception e) {
+            if (e.getCause() instanceof MaxUploadSizeExceededException) {
+                response.setCharacterEncoding("UTF-8");
+                response.setContentType("application/json; charset=utf-8");
+                response.getWriter().print("{\"code\":\"303\", \"message\":\"文件尺寸不能大于10MB\"}");
+                return;
+            } else {
+                throw e;
+            }
+        }
+    }
+
+    private int pass(Passport passport, String url, String httpMethod) {
+        if (url.startsWith("/login")) {
+            return 1;
+        }
+
+        if (url.startsWith("/login0")) {
+            return 1;
+        }
+
+        if (passport == null) {
+            return -1;
+        }
+
+        return 1;
+    }
+}

+ 37 - 0
src/main/java/com/finikes/matchmaker/filter/CorsFilter.java

@@ -0,0 +1,37 @@
+package com.finikes.matchmaker.filter;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class CorsFilter implements Filter {
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
+//        httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
+        httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
+        httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
+        httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, client_id, uuid, Authorization");
+        httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
+        httpServletResponse.setHeader("Pragma", "no-cache");
+
+        try {
+            chain.doFilter(request, httpServletResponse);
+        } catch (Exception e) {
+            if (e.getCause() instanceof MaxUploadSizeExceededException) {
+                response.setCharacterEncoding("UTF-8");
+                response.setContentType("application/json; charset=utf-8");
+                response.getWriter().print("{\"code\":\"303\", \"message\":\"文件尺寸不能大于10MB\"}");
+                return;
+            } else {
+                throw e;
+            }
+        }
+    }
+}

+ 43 - 0
src/main/java/com/finikes/matchmaker/filter/RegisterStateFilter.java

@@ -0,0 +1,43 @@
+package com.finikes.matchmaker.filter;
+
+import com.finikes.matchmaker.Passports;
+import com.finikes.matchmaker.member.dao.MemberDAO;
+import com.finikes.matchmaker.member.register.Schedules;
+import com.finikes.matchmaker.passport.dao.PassportDAO;
+import com.finikes.matchmaker.passport.entity.Passport;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+@Component
+public class RegisterStateFilter implements Filter {
+    @Autowired
+    private MemberDAO memberDAO;
+
+    @Autowired
+    private PassportDAO passportDAO;
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        Passport passport = Passports.getPassport((HttpServletRequest) request);
+        if (null != passport) {
+            String registerSchedule = memberDAO.findRegisterScheduleByPassport(passport.getId());
+            if(registerSchedule == null) {
+                registerSchedule = "";
+            }
+
+            String[] steps = registerSchedule.split("\\.");
+            for (String step : steps) {
+                if (String.valueOf(Schedules.lastRegisterStep()).equals(step)) {// 说明完成了最后一步
+                    passport.setRegisterState((byte) 1);
+                    passportDAO.updateRegisterState(passport.getId(), (byte) 1);
+                }
+            }
+        }
+
+        chain.doFilter(request, response);
+    }
+}

+ 381 - 0
src/main/java/com/finikes/matchmaker/member/controller/MemberController.java

@@ -0,0 +1,381 @@
+package com.finikes.matchmaker.member.controller;
+
+import com.finikes.matchmaker.BaseDTO;
+import com.finikes.matchmaker.Passports;
+import com.finikes.matchmaker.member.dao.FamilyMemberDAO;
+import com.finikes.matchmaker.member.dao.MemberDAO;
+import com.finikes.matchmaker.member.dto.MemberFamilyMemberRequestDTO;
+import com.finikes.matchmaker.member.dto.MemberFamilyMembersRequestDTO;
+import com.finikes.matchmaker.member.entity.FamilyMember;
+import com.finikes.matchmaker.member.entity.Member;
+import com.finikes.matchmaker.member.register.RegisterStepName;
+import com.finikes.matchmaker.member.register.Schedules;
+import com.finikes.matchmaker.passport.entity.Passport;
+import com.finikes.matchmaker.util.FileHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@ResponseBody
+public class MemberController {
+    @Value("${upload-root-dir}")
+    private String uploadRootDir;
+
+    @Autowired
+    private MemberDAO memberDAO;
+
+    @Autowired
+    private FamilyMemberDAO familyMemberDAO;
+
+    @RequestMapping(value = "/member", method = RequestMethod.PUT)
+    public BaseDTO registerNameAndMobile(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String name = (String) map.get("name");
+        String mobile = (String) map.get("mobile");
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadNameAndMobile(passportId, name, mobile);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setName(name);
+            member.setMobile(mobile);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_NAME_MOBILE.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 上传身份证信息
+     */
+    @RequestMapping(value = "/member/id/photos", method = RequestMethod.PUT)
+    public BaseDTO registerIdNumber(@RequestParam("front") MultipartFile front, @RequestParam("back") MultipartFile back, @RequestParam("idNumber") String idNumber, HttpServletRequest request) {
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+        try {
+            FileHandler.saveFile(front, "/member/idnumber/front/", String.valueOf(passportId));
+            FileHandler.saveFile(front, "/member/idnumber/back/", String.valueOf(passportId));
+        } catch (IOException e) {
+            e.printStackTrace();
+            return new BaseDTO("000", e.getLocalizedMessage());
+        }
+
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadIdNumber(passportId, idNumber);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setIdNumber(idNumber);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_ID_NUMBER.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 填报家庭成员信息
+     */
+    @RequestMapping(value = "/member/family/member/s", method = RequestMethod.PUT)
+    public BaseDTO registerFamilyMember(@RequestBody MemberFamilyMembersRequestDTO dto, HttpServletRequest request) {
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+
+        if (memberDAO.exist(passportId) == 0) {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            memberDAO.insert(member);
+        }
+
+        List<MemberFamilyMemberRequestDTO> memberFamilyMemberRequestDTOS = dto.getMembers();
+        for (MemberFamilyMemberRequestDTO d : memberFamilyMemberRequestDTOS) {
+            FamilyMember familyMember = new FamilyMember();
+            familyMember.setName(d.getName());
+            familyMember.setOrg(d.getOrg());
+            familyMember.setPassportId(passportId);
+            familyMember.setPost(d.getPost());
+            familyMember.setRole(Byte.parseByte(d.getRole()));
+            familyMemberDAO.insert(familyMember);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_FAMILY.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 上传学历证书照片
+     */
+    @RequestMapping(value = "/member/edu/cert/photo", method = RequestMethod.PUT)
+    public BaseDTO registerEduCert(@RequestParam("certPhoto") MultipartFile certPhoto, HttpServletRequest request) {
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+        try {
+            FileHandler.saveFile(certPhoto, "/member/edu/cert/", String.valueOf(passportId));
+        } catch (IOException e) {
+            e.printStackTrace();
+            return new BaseDTO("000", e.getLocalizedMessage());
+        }
+
+        if (memberDAO.exist(passportId) == 0) {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_EDU_CERT.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 上传个人封面照片
+     */
+    @RequestMapping(value = "/member/cover", method = RequestMethod.PUT)
+    public BaseDTO registerCover(@RequestParam("cover") MultipartFile cover, HttpServletRequest request) {
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+        try {
+            FileHandler.saveFile(cover, "/member/cover/", String.valueOf(passportId));
+        } catch (IOException e) {
+            e.printStackTrace();
+            return new BaseDTO("000", e.getLocalizedMessage());
+        }
+
+        if (memberDAO.exist(passportId) == 0) {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_COVER.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 填报性别
+     */
+    @RequestMapping(value = "/member/gender", method = RequestMethod.PUT)
+    public BaseDTO registerGender(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String gender = (String) map.get("gender");
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+
+        boolean _gender = false;
+        if ("1".equals(gender)) {
+            _gender = true;
+        }
+
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadGender(passportId, _gender);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setGender(_gender);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_GENDER.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 填报年龄
+     */
+    @RequestMapping(value = "/member/age", method = RequestMethod.PUT)
+    public BaseDTO registerAge(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String age = (String) map.get("age");
+        int _age = Integer.parseInt(age);
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+
+        // TODO 算出出生年份
+        Calendar calendar = Calendar.getInstance();
+        int year = calendar.get(Calendar.YEAR);
+
+        String bornYear = String.valueOf(year - _age);
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadBornYear(passportId, bornYear);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setBornYear(bornYear);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_AGE.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 填报家庭是否独生子女
+     */
+    @RequestMapping(value = "/member/family/children/info", method = RequestMethod.PUT)
+    public BaseDTO registerOnly(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String only = (String) map.get("only");
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+
+        boolean _only = false;
+        if ("1".equals(only)) {
+            _only = true;
+        }
+
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadOnly(passportId, _only);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setOnly(_only);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_ONLY.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 填报学历
+     */
+    @RequestMapping(value = "/member/edu", method = RequestMethod.PUT)
+    public BaseDTO registerEdu(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String edu = (String) map.get("edu");
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+
+        byte _edu = Byte.parseByte(edu);
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadEdu(passportId, _edu);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setEdu(_edu);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_EDU_INFO.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 填报最高学历院校
+     */
+    @RequestMapping(value = "/member/school", method = RequestMethod.PUT)
+    public BaseDTO registerSchool(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String school = (String) map.get("school");
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadSchool(passportId, school);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setSchool(school);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_SCHOOL.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+
+    /**
+     * 填报工作情况
+     */
+    @RequestMapping(value = "/member/job", method = RequestMethod.PUT)
+    public BaseDTO registerJobInfo(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String org = (String) map.get("org");
+        String income = (String) map.get("income");
+        Passport passport = Passports.getPassport(request);
+        int passportId = passport.getId();
+
+        byte _income = Byte.parseByte(income);
+        if (memberDAO.exist(passportId) > 0) {
+            memberDAO.uploadOrgAndIncome(passportId, org, _income);
+        } else {
+            Member member = new Member();
+            member.setPassportId(passportId);
+            member.setOrg(org);
+            member.setIncome(_income);
+            memberDAO.insert(member);
+        }
+
+        String registerSchedule = memberDAO.findRegisterScheduleByPassport(passportId);
+        if (null == registerSchedule) {
+            registerSchedule = "";
+        }
+        registerSchedule = Schedules.boostSchedule(registerSchedule, RegisterStepName.REGISTER_JOB_INFO.getName());
+        memberDAO.uploadRegisterSchedule(passportId, registerSchedule);
+
+        return new BaseDTO();
+    }
+}

+ 72 - 0
src/main/java/com/finikes/matchmaker/member/controller/MemberHousesController.java

@@ -0,0 +1,72 @@
+package com.finikes.matchmaker.member.controller;
+
+import com.finikes.matchmaker.BaseDTO;
+import com.finikes.matchmaker.Passports;
+import com.finikes.matchmaker.member.dao.MemberHouseDAO;
+import com.finikes.matchmaker.member.entity.MemberHouse;
+import com.finikes.matchmaker.passport.entity.Passport;
+import com.finikes.matchmaker.util.FileHandler;
+import com.finikes.matchmaker.util.HttpServletRequestParams;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.*;
+
+@Controller
+@ResponseBody
+public class MemberHousesController {
+    @Value("${upload-root-dir}")
+    private String uploadRootDir;
+
+    @Autowired
+    private MemberHouseDAO memberHouseDAO;
+
+    @ResponseBody
+    @RequestMapping(value = "/member/house/s", method = RequestMethod.PUT)
+    public BaseDTO registerHouses(HttpServletRequest request) {
+        Passport passport = Passports.getPassport(request);
+
+        HttpServletRequestParams params = new HttpServletRequestParams(request);
+        Set<String> paramIds = params.getParamIds();
+        List<String> addressParamIds = new ArrayList<>();
+
+        for (String paramId : paramIds) {
+            if (paramId.startsWith("address")) {
+                addressParamIds.add(paramId);
+            }
+        }
+
+        Map<String, MultipartFile> houses = new HashMap<>();
+        for (String addressParamId : addressParamIds) {
+            String index = addressParamId.split("\\.")[1];
+            String certId = "cert." + index;
+            houses.put((String) params.getParam(addressParamId), (MultipartFile) params.getParam(certId));
+        }
+
+        Set<String> keySet = houses.keySet();
+        for (String key : keySet) {
+            MemberHouse house = new MemberHouse();
+            MultipartFile file = houses.get(key);
+            String fileName = UUID.randomUUID().toString().replaceAll("-", "");
+            try {
+                FileHandler.saveFile(file, uploadRootDir + "/member/house/cert/", fileName);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return new BaseDTO("000", e.getLocalizedMessage());
+            }
+            house.setAddress(key);
+            house.setPassportId(passport.getId());
+            house.setCertPath(fileName);
+            memberHouseDAO.insert(house);
+        }
+
+        return new BaseDTO();
+    }
+}

+ 9 - 0
src/main/java/com/finikes/matchmaker/member/dao/FamilyMemberDAO.java

@@ -0,0 +1,9 @@
+package com.finikes.matchmaker.member.dao;
+
+import com.finikes.matchmaker.member.entity.FamilyMember;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface FamilyMemberDAO {
+    void insert(FamilyMember familyMember);
+}

+ 32 - 0
src/main/java/com/finikes/matchmaker/member/dao/MemberDAO.java

@@ -0,0 +1,32 @@
+package com.finikes.matchmaker.member.dao;
+
+import com.finikes.matchmaker.member.entity.Member;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface MemberDAO {
+    String findRegisterScheduleByPassport(int passportId);
+
+    int exist(int passportId);
+
+    void uploadNameAndMobile(@Param("passportId") int passportId, @Param("name") String name, @Param("mobile") String mobile);
+
+    void insert(Member member);
+
+    void uploadRegisterSchedule(@Param("passportId") int passportId,@Param("registerSchedule")  String registerSchedule);
+
+    void uploadIdNumber(@Param("passportId") int passportId, @Param("idNumber") String idNumber);
+
+    void uploadGender(@Param("passportId") int passportId, @Param("gender") boolean gender);
+
+    void uploadBornYear(@Param("passportId") int passportId, @Param("bornYear") String bornYear);
+
+    void uploadOnly(@Param("passportId") int passportId, @Param("only") boolean only);
+
+    void uploadEdu(@Param("passportId") int passportId, @Param("edu") byte edu);
+
+    void uploadSchool(@Param("passportId") int passportId, @Param("school") String school);
+
+    void uploadOrgAndIncome(@Param("passportId") int passportId, @Param("org") String org, @Param("income") byte income);
+}

+ 9 - 0
src/main/java/com/finikes/matchmaker/member/dao/MemberHouseDAO.java

@@ -0,0 +1,9 @@
+package com.finikes.matchmaker.member.dao;
+
+import com.finikes.matchmaker.member.entity.MemberHouse;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MemberHouseDAO {
+    void insert(MemberHouse house);
+}

+ 40 - 0
src/main/java/com/finikes/matchmaker/member/dto/MemberFamilyMemberRequestDTO.java

@@ -0,0 +1,40 @@
+package com.finikes.matchmaker.member.dto;
+
+public class MemberFamilyMemberRequestDTO {
+    private String role;
+    private String name;
+    private String post;
+    private String org;
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPost() {
+        return post;
+    }
+
+    public void setPost(String post) {
+        this.post = post;
+    }
+
+    public String getOrg() {
+        return org;
+    }
+
+    public void setOrg(String org) {
+        this.org = org;
+    }
+}

+ 15 - 0
src/main/java/com/finikes/matchmaker/member/dto/MemberFamilyMembersRequestDTO.java

@@ -0,0 +1,15 @@
+package com.finikes.matchmaker.member.dto;
+
+import java.util.List;
+
+public class MemberFamilyMembersRequestDTO {
+    private List<MemberFamilyMemberRequestDTO> members;
+
+    public List<MemberFamilyMemberRequestDTO> getMembers() {
+        return members;
+    }
+
+    public void setMembers(List<MemberFamilyMemberRequestDTO> members) {
+        this.members = members;
+    }
+}

+ 58 - 0
src/main/java/com/finikes/matchmaker/member/entity/FamilyMember.java

@@ -0,0 +1,58 @@
+package com.finikes.matchmaker.member.entity;
+
+public class FamilyMember {
+    private int id;
+    private int passportId;
+    private Byte role;
+    private String name;
+    private String org;
+    private String post;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getPassportId() {
+        return passportId;
+    }
+
+    public void setPassportId(int passportId) {
+        this.passportId = passportId;
+    }
+
+    public Byte getRole() {
+        return role;
+    }
+
+    public void setRole(Byte role) {
+        this.role = role;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getOrg() {
+        return org;
+    }
+
+    public void setOrg(String org) {
+        this.org = org;
+    }
+
+    public String getPost() {
+        return post;
+    }
+
+    public void setPost(String post) {
+        this.post = post;
+    }
+}

+ 113 - 0
src/main/java/com/finikes/matchmaker/member/entity/Member.java

@@ -0,0 +1,113 @@
+package com.finikes.matchmaker.member.entity;
+
+public class Member {
+    private int passportId;
+    private Boolean gender;
+    private String bornYear;
+    private Byte edu;
+    private String org;
+    private Byte income;
+    private Boolean only;
+    private String idNumber;
+    private String registerSchedule;
+    private String school;
+
+    public Boolean getGender() {
+        return gender;
+    }
+
+    public Boolean getOnly() {
+        return only;
+    }
+
+    public String getSchool() {
+        return school;
+    }
+
+    public void setSchool(String school) {
+        this.school = school;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    private String name;
+    private String mobile;
+
+    public int getPassportId() {
+        return passportId;
+    }
+
+    public void setPassportId(int passportId) {
+        this.passportId = passportId;
+    }
+
+    public void setGender(Boolean gender) {
+        this.gender = gender;
+    }
+
+    public String getBornYear() {
+        return bornYear;
+    }
+
+    public void setBornYear(String bornYear) {
+        this.bornYear = bornYear;
+    }
+
+    public Byte getEdu() {
+        return edu;
+    }
+
+    public void setEdu(Byte edu) {
+        this.edu = edu;
+    }
+
+    public String getOrg() {
+        return org;
+    }
+
+    public void setOrg(String org) {
+        this.org = org;
+    }
+
+    public Byte getIncome() {
+        return income;
+    }
+
+    public void setIncome(Byte income) {
+        this.income = income;
+    }
+
+    public void setOnly(Boolean only) {
+        this.only = only;
+    }
+
+    public String getIdNumber() {
+        return idNumber;
+    }
+
+    public void setIdNumber(String idNumber) {
+        this.idNumber = idNumber;
+    }
+
+    public String getRegisterSchedule() {
+        return registerSchedule;
+    }
+
+    public void setRegisterSchedule(String registerSchedule) {
+        this.registerSchedule = registerSchedule;
+    }
+}

+ 40 - 0
src/main/java/com/finikes/matchmaker/member/entity/MemberHouse.java

@@ -0,0 +1,40 @@
+package com.finikes.matchmaker.member.entity;
+
+public class MemberHouse {
+    private int id;
+    private int passportId;
+    private String address;
+    private String certPath;
+
+    public String getCertPath() {
+        return certPath;
+    }
+
+    public void setCertPath(String certPath) {
+        this.certPath = certPath;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getPassportId() {
+        return passportId;
+    }
+
+    public void setPassportId(int passportId) {
+        this.passportId = passportId;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+}

+ 31 - 0
src/main/java/com/finikes/matchmaker/member/register/RegisterStep.java

@@ -0,0 +1,31 @@
+package com.finikes.matchmaker.member.register;
+
+public class RegisterStep {
+    private boolean enable;
+    private String name;
+    private int sequence;
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(int sequence) {
+        this.sequence = sequence;
+    }
+}

+ 14 - 0
src/main/java/com/finikes/matchmaker/member/register/RegisterStepName.java

@@ -0,0 +1,14 @@
+package com.finikes.matchmaker.member.register;
+
+public enum RegisterStepName {
+    REGISTER_NAME_MOBILE("REGISTER_NAME_MOBILE"), REGISTER_GENDER("REGISTER_GENDER"), REGISTER_AGE("REGISTER_AGE"), REGISTER_EDU_INFO("REGISTER_EDU_INFO"), REGISTER_SCHOOL("REGISTER_SCHOOL"), REGISTER_JOB_INFO("REGISTER_JOB_INFO"), REGISTER_FAMILY("REGISTER_FAMILY"), REGISTER_ONLY("REGISTER_ONLY"), REGISTER_EDU_CERT("REGISTER_EDU_CERT"), REGISTER_ID_NUMBER("REGISTER_ID_NUMBER"), REGISTER_COVER("REGISTER_COVER"), REGISTER_HOUSES("REGISTER_HOUSES");
+    private String name;
+
+    RegisterStepName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 147 - 0
src/main/java/com/finikes/matchmaker/member/register/Schedules.java

@@ -0,0 +1,147 @@
+package com.finikes.matchmaker.member.register;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Schedules {
+    private static final Map<String, RegisterStep> STEPS = new HashMap<>();
+    private static final Map<Integer, RegisterStep> SCHEDULES = SCHEDULES_INIT();
+
+    private static final Map<Integer, RegisterStep> SCHEDULES_INIT() {
+        Map<Integer, RegisterStep> SCHEDULES = new HashMap<>();
+        RegisterStep step = new RegisterStep();
+        String stepName = "REGISTER_NAME_MOBILE";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(1);
+        SCHEDULES.put(1, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_GENDER";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(2);
+        SCHEDULES.put(2, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_AGE";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(3);
+        SCHEDULES.put(3, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_EDU_INFO";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(4);
+        SCHEDULES.put(4, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_SCHOOL";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(5);
+        SCHEDULES.put(5, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_JOB_INFO";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(6);
+        SCHEDULES.put(6, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_FAMILY";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(7);
+        SCHEDULES.put(7, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_ONLY";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(8);
+        SCHEDULES.put(8, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_EDU_CERT";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(9);
+        SCHEDULES.put(9, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_ID_NUMBER";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(10);
+        SCHEDULES.put(10, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_COVER";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(11);
+        SCHEDULES.put(11, step);
+        STEPS.put(stepName, step);
+
+        step = new RegisterStep();
+        stepName = "REGISTER_HOUSES";
+        step.setEnable(true);
+        step.setName(stepName);
+        step.setSequence(12);
+        SCHEDULES.put(12, step);
+        STEPS.put(stepName, step);
+
+        return SCHEDULES;
+    }
+
+    public static final Map<Integer, RegisterStep> getSchedules() {
+        return SCHEDULES;
+    }
+
+    public static final int lastRegisterStep() {
+        return 12;
+    }
+
+    public static final RegisterStep getStep(String stepName) {
+        return STEPS.get(stepName);
+    }
+
+    public static final String boostSchedule(String schedule, String stepName) {
+        String[] steps = schedule.split("\\.");
+        RegisterStep step = STEPS.get(stepName);
+        int stepSequence = step.getSequence();
+        if (!existStep(steps, stepSequence)) {
+            if ("".equals(schedule)) {
+                return String.valueOf(stepSequence);
+            }
+            return schedule + "." + stepSequence;
+        }
+
+        return schedule;
+    }
+
+    private static final boolean existStep(String[] steps, int sequence) {
+        String _sequence = String.valueOf(sequence);
+        for (String step : steps) {
+            if (_sequence.equals(step.trim())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 96 - 0
src/main/java/com/finikes/matchmaker/passport/controller/PassportController.java

@@ -0,0 +1,96 @@
+package com.finikes.matchmaker.passport.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.finikes.matchmaker.BaseDTO;
+import com.finikes.matchmaker.member.dao.MemberDAO;
+import com.finikes.matchmaker.passport.dao.PassportDAO;
+import com.finikes.matchmaker.passport.dto.LoginDTO;
+import com.finikes.matchmaker.passport.entity.Passport;
+import com.finikes.matchmaker.util.HttpUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.HashMap;
+import java.util.Map;
+
+@Controller
+public class PassportController {
+    @Autowired
+    private PassportDAO passportDAO;
+
+    @Autowired
+    private MemberDAO memberDAO;
+
+    @ResponseBody
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    public BaseDTO login(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String code = (String) map.get("code");
+        String wxUrl = "https://api.weixin.qq.com/sns/jscode2session";
+        String wxResponse = HttpUtil.httpsRequest(wxUrl, "GET", "appid=wx57d86edd2c6f438d&secret=d00401715bff62d3de9dd2cd57c1ffcb&js_code=" + code + "&grant_type=authorization_code");
+
+        Map resultMap = null;
+        try {
+            resultMap = new ObjectMapper().readValue(wxResponse, HashMap.class);
+        } catch (Exception e) {
+            return new BaseDTO("000", "SystemError");
+        }
+
+        String openid = (String) resultMap.get("openid");
+        String sessionKey = (String) resultMap.get("session_key");
+        String unionid = (String) resultMap.get("unionid");
+        int errcode = 0;
+        Object _errcode = resultMap.get("errcode");
+        if (null != _errcode) {
+            errcode = (int) _errcode;
+        }
+
+        if (errcode != 0) {
+            return new BaseDTO(String.valueOf(errcode), (String) resultMap.get("errmsg"));
+        }
+
+        Passport passport = passportDAO.findByOpenId(openid);
+        LoginDTO dto = new LoginDTO();
+        if (null == passport) {
+            passport = new Passport();
+            passport.setOpenId(openid);
+            if (null != unionid && !"".equals(unionid)) {
+                passport.setUnionId(unionid);
+            }
+            passportDAO.insert(passport);
+            dto.setPassportInit(false);
+        } else {
+            if (passport.getRegisterState() == 1) {
+                dto.setPassportInit(true);
+            } else {
+                String registerSchedule = memberDAO.findRegisterScheduleByPassport(passport.getId());
+                String[] steps = registerSchedule.split("\\.");
+                for (String step : steps) {
+                    dto.getSteps().add(step);
+                }
+            }
+        }
+
+        HttpSession session = request.getSession();
+        session.setAttribute("PASSPORT", passport);
+
+        return new BaseDTO();
+    }
+
+    @ResponseBody
+    @RequestMapping(value = "/login0", method = RequestMethod.POST)
+    public BaseDTO login0(@RequestBody Map<String, Object> map, HttpServletRequest request) {
+        String openId = (String) map.get("openid");
+        Passport passport = passportDAO.findByOpenId(openId);
+        if (null == passport) {
+            return new BaseDTO("101", "login fail");
+        }
+
+        HttpSession session = request.getSession();
+        session.setAttribute("PASSPORT", passport);
+
+        return new BaseDTO();
+    }
+}

+ 14 - 0
src/main/java/com/finikes/matchmaker/passport/dao/PassportDAO.java

@@ -0,0 +1,14 @@
+package com.finikes.matchmaker.passport.dao;
+
+import com.finikes.matchmaker.passport.entity.Passport;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface PassportDAO {
+    Passport findByOpenId(String openId);
+
+    void insert(Passport passport);
+
+    void updateRegisterState(@Param("id") int id, @Param("state") Byte state);
+}

+ 21 - 0
src/main/java/com/finikes/matchmaker/passport/dto/LoginDTO.java

@@ -0,0 +1,21 @@
+package com.finikes.matchmaker.passport.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoginDTO {
+    private boolean passportInit;
+    private final List<String> steps = new ArrayList<>();
+
+    public boolean isPassportInit() {
+        return passportInit;
+    }
+
+    public void setPassportInit(boolean passportInit) {
+        this.passportInit = passportInit;
+    }
+
+    public List<String> getSteps() {
+        return steps;
+    }
+}

+ 40 - 0
src/main/java/com/finikes/matchmaker/passport/entity/Passport.java

@@ -0,0 +1,40 @@
+package com.finikes.matchmaker.passport.entity;
+
+public class Passport {
+    private int id;
+    private Byte registerState;
+    private String openId;
+    private String unionId;
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public String getUnionId() {
+        return unionId;
+    }
+
+    public void setUnionId(String unionId) {
+        this.unionId = unionId;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public Byte getRegisterState() {
+        return registerState;
+    }
+
+    public void setRegisterState(Byte registerState) {
+        this.registerState = registerState;
+    }
+}

+ 22 - 0
src/main/java/com/finikes/matchmaker/util/FileHandler.java

@@ -0,0 +1,22 @@
+package com.finikes.matchmaker.util;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+
+public class FileHandler {
+    public static String saveFile(MultipartFile file, String dir, String fileName) throws IOException {//将文件保存到本地
+        File path = new File(dir);
+        if (!path.exists()) {//如果当前目录不存在
+            path.mkdir();
+        }
+
+        String[] extNameSubs = file.getOriginalFilename().split("\\.");
+        String extName = extNameSubs[extNameSubs.length - 1];
+        File _file = new File(dir + fileName + "." + extName);
+        file.transferTo(_file);//将此图像保存到file本地
+
+        return extName;
+    }
+}

+ 52 - 0
src/main/java/com/finikes/matchmaker/util/HttpServletRequestParams.java

@@ -0,0 +1,52 @@
+package com.finikes.matchmaker.util;
+
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.multipart.MultipartResolver;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class HttpServletRequestParams {
+    private final Map<String, Class> PARAMS_TYPE = new HashMap<>();
+
+    private final Map<String, Object> PARAMS = new HashMap<>();
+
+    public HttpServletRequestParams(HttpServletRequest request) {
+        //下面这句必须加,不然报错
+        MultipartResolver resolver = new CommonsMultipartResolver(request.getServletContext());
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+
+        //获取上传上来的文件
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
+            MultipartFile file = entry.getValue();
+            String fileName = file.getName();
+            PARAMS_TYPE.put(fileName, file.getClass());
+            PARAMS.put(fileName, file);
+        }
+
+        Map<String, String[]> params = multipartRequest.getParameterMap();
+        Set<String> keySet = params.keySet();
+        for (String key : keySet) {
+            String value = params.get(key)[0];
+            PARAMS_TYPE.put(key, value.getClass());
+            PARAMS.put(key, value);
+        }
+    }
+
+    public Class getParamType(String paramId) {
+        return PARAMS_TYPE.get(paramId);
+    }
+
+    public Object getParam(String paramId) {
+        return PARAMS.get(paramId);
+    }
+
+    public Set<String> getParamIds() {
+        return PARAMS.keySet();
+    }
+}

+ 299 - 0
src/main/java/com/finikes/matchmaker/util/HttpUtil.java

@@ -0,0 +1,299 @@
+package com.finikes.matchmaker.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.ConnectException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+
+
+public class HttpUtil {
+
+    /**
+     * 向指定URL发送GET方法的请求
+     *
+     * @param url   发送请求的URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return URL 所代表远程资源的响应结果
+     */
+    public static String sendGet(String url, String param) {
+        String result = "";
+        BufferedReader in = null;
+        try {
+            String urlNameString = url + "?" + param;
+            URL realUrl = new URL(urlNameString);
+            // 打开和URL之间的连接
+            HttpURLConnection connection = (HttpURLConnection) realUrl
+                    .openConnection();
+            // 设置通用的请求属性
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("user-agent",
+                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 建立实际的连接
+            connection.connect();
+            // 获取所有响应头字段
+            Map<String, List<String>> map = connection.getHeaderFields();
+            // 遍历所有的响应头字段
+            // for (String key : map.keySet()) {
+            // System.out.println(key + "--->" + map.get(key));
+            // }
+            // 定义 BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(
+                    connection.getInputStream(), "utf-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输入流
+        finally {
+            try {
+                if (in != null) {
+                    in.close();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url   发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, String param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        String result = "";
+        try {
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            HttpURLConnection conn = (HttpURLConnection) realUrl
+                    .openConnection();
+            // 设置通用的请求属性
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent",
+                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 发送POST请求必须设置如下两行
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(conn.getOutputStream());
+            // 发送请求参数
+            out.print(param);
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(
+                    conn.getInputStream(), "UTF-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输出流、输入流
+        finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url    发送请求的 URL
+     * @param params 请求的参数集合
+     * @return 远程资源的响应结果
+     */
+    public static String sendPost(String url, Map<String, String> params) {
+        OutputStreamWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try {
+            URL realUrl = new URL(url);
+            HttpURLConnection conn = (HttpURLConnection) realUrl
+                    .openConnection();
+            // 发送POST请求必须设置如下两行
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // POST方法
+            conn.setRequestMethod("POST");
+            // 设置通用的请求属性
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent",
+                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Content-Type",
+                    "application/x-www-form-urlencoded");
+            conn.connect();
+            // 获取URLConnection对象对应的输出流
+            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
+            // 发送请求参数
+            if (params != null) {
+                StringBuilder param = new StringBuilder();
+                for (Map.Entry<String, String> entry : params.entrySet()) {
+                    if (param.length() > 0) {
+                        param.append("&");
+                    }
+                    param.append(entry.getKey());
+                    param.append("=");
+                    param.append(entry.getValue());
+                    // System.out.println(entry.getKey()+":"+entry.getValue());
+                }
+                out.write(param.toString());
+            }
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(
+                    conn.getInputStream(), "UTF-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输出流、输入流
+        finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return result.toString();
+    }
+
+    /**
+     * url编码
+     *
+     * @param str
+     * @param charset
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    public static String urlEncoder(String str, String charset)
+            throws UnsupportedEncodingException {
+        if (str == null) {
+            str = "";
+        }
+        String result = URLEncoder.encode(str, charset);
+        return result;
+    }
+
+    /**
+     * 发送https请求
+     *
+     * @param requestUrl    请求地址
+     * @param requestMethod 请求方式(GET、POST)
+     * @param outputStr     提交的数据
+     * @return 返回微信服务器响应的信息
+     */
+    public static String httpsRequest(String requestUrl, String requestMethod,
+                                      String outputStr) {
+        HttpsURLConnection conn = null;
+        InputStream inputStream = null;
+        InputStreamReader inputStreamReader = null;
+        BufferedReader bufferedReader = null;
+        try {
+            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
+            TrustManager[] tm = {new X509TrustManagerImpl()};
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+            // 从上述SSLContext对象中得到SSLSocketFactory对象
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+            URL url = new URL(requestUrl);
+            conn = (HttpsURLConnection) url.openConnection();
+            conn.setSSLSocketFactory(ssf);
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            conn.setUseCaches(false);
+            // 设置请求方式(GET/POST)
+            conn.setRequestMethod(requestMethod);
+            conn.setRequestProperty("content-type",
+                    "application/x-www-form-urlencoded");
+            // 当outputStr不为null时向输出流写数据
+            if (null != outputStr) {
+                OutputStream outputStream = conn.getOutputStream();
+                // 注意编码格式
+                outputStream.write(outputStr.getBytes("UTF-8"));
+                outputStream.close();
+            }
+            // 从输入流读取返回内容
+            inputStream = conn.getInputStream();
+            inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
+            bufferedReader = new BufferedReader(inputStreamReader);
+            String str = null;
+            StringBuffer buffer = new StringBuffer();
+            while ((str = bufferedReader.readLine()) != null) {
+                buffer.append(str);
+            }
+            return buffer.toString();
+        } catch (ConnectException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 释放资源
+            if (conn != null) {
+                conn.disconnect();
+            }
+            try {
+                if (bufferedReader != null) {
+                    bufferedReader.close();
+                }
+                if (inputStreamReader != null) {
+                    inputStreamReader.close();
+                }
+                if (inputStream != null) {
+                    inputStream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+}
+
+
+

+ 21 - 0
src/main/java/com/finikes/matchmaker/util/X509TrustManagerImpl.java

@@ -0,0 +1,21 @@
+package com.finikes.matchmaker.util;
+
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import javax.net.ssl.X509TrustManager;
+
+public class X509TrustManagerImpl implements X509TrustManager {
+
+    // 检查客户端证书
+    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+    }
+
+    // 检查服务器端证书
+    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+    }
+
+    // 返回受信任的X509证书数组
+    public X509Certificate[] getAcceptedIssuers() {
+        return null;
+    }
+}

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

@@ -0,0 +1,28 @@
+server:
+  port: 8081
+spring:
+  servlet:
+    multipart:
+      max-file-size: 10MB
+      max-request-size: 10MB
+  datasource:
+    # matrix34.tpddns.cn:13306
+    # localhost:3306
+    url: jdbc:mysql://localhost:3306/matchmaker?useSSL=false&useUnicode=true&characterEncoding=utf-8&useAffectedRows=true&serverTimezone=UTC
+    username: root
+    password: 9a41012499f38251
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    hikari:
+      max-lifetime: 3000000
+  main:
+    allow-circular-references: true
+mybatis:
+  mapper-locations: classpath:mapper/*.xml
+  configuration:
+    map-underscore-to-camel-case: true
+logging:
+  level:
+    com:
+      finikes:
+        matchmaker: debug
+upload-root-dir: /home/upload

+ 9 - 0
src/main/resources/mapper/FamilyMemberMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.finikes.matchmaker.member.dao.FamilyMemberDAO">
+    <insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id"
+            parameterType="com.finikes.matchmaker.member.entity.FamilyMember">
+        INSERT INTO t_family_member (passport_id, role, name, org, post)
+        VALUES (#{passportId}, #{role}, #{name}, #{org}, #{post})
+    </insert>
+</mapper>

+ 9 - 0
src/main/resources/mapper/MemberHouseMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.finikes.matchmaker.member.dao.MemberHouseDAO">
+    <insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id"
+            parameterType="com.finikes.matchmaker.member.entity.MemberHouse">
+        INSERT INTO t_member_house (passport_id, address, cert_path)
+        VALUES (#{passportId}, #{address}, #{certPath})
+    </insert>
+</mapper>

+ 151 - 0
src/main/resources/mapper/MemberMapper.xml

@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.finikes.matchmaker.member.dao.MemberDAO">
+    <select id="findRegisterScheduleByPassport" resultType="java.lang.String">
+        SELECT register_schedule as registerSchedule
+        FROM t_member
+        WHERE passport_id = #{passportId}
+    </select>
+
+    <select id="exist" resultType="java.lang.Integer">
+        SELECT count(1)
+        FROM t_member
+        WHERE passport_id = #{passportId}
+    </select>
+
+    <insert id="insert" parameterType="com.finikes.matchmaker.member.entity.Member">
+        INSERT INTO t_member
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="passportId != null">
+                passport_id,
+            </if>
+            <if test="gender != null">
+                gender,
+            </if>
+            <if test="bornYear != null">
+                born_year,
+            </if>
+            <if test="edu != null">
+                edu,
+            </if>
+            <if test="org != null">
+                org,
+            </if>
+            <if test="income != null">
+                income,
+            </if>
+            <if test="only != null">
+                only,
+            </if>
+            <if test="idNumber != null">
+                id_number,
+            </if>
+            <if test="registerSchedule != null">
+                register_schedule,
+            </if>
+            <if test="name != null">
+                name,
+            </if>
+            <if test="mobile != null">
+                mobile,
+            </if>
+            <if test="school != null">
+                school,
+            </if>
+        </trim>
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
+            <if test="passportId != null">
+                #{passportId,jdbcType=INTEGER},
+            </if>
+            <if test="gender != null">
+                #{gender,jdbcType=BIT},
+            </if>
+            <if test="bornYear != null">
+                #{bornYear,jdbcType=VARCHAR},
+            </if>
+            <if test="edu != null">
+                #{edu,jdbcType=TINYINT},
+            </if>
+            <if test="org != null">
+                #{org,jdbcType=VARCHAR},
+            </if>
+            <if test="income != null">
+                #{income,jdbcType=TINYINT},
+            </if>
+            <if test="only != null">
+                #{only,jdbcType=BIT},
+            </if>
+            <if test="idNumber != null">
+                #{idNumber,jdbcType=VARCHAR},
+            </if>
+            <if test="registerSchedule != null">
+                #{registerSchedule,jdbcType=VARCHAR},
+            </if>
+            <if test="name != null">
+                #{name,jdbcType=VARCHAR},
+            </if>
+            <if test="mobile != null">
+                #{mobile,jdbcType=VARCHAR},
+            </if>
+            <if test="school != null">
+                #{school,jdbcType=VARCHAR},
+            </if>
+        </trim>
+    </insert>
+
+    <update id="uploadNameAndMobile">
+        UPDATE t_member
+        SET name   = #{name},
+            mobile = #{mobile}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadOrgAndIncome">
+        UPDATE t_member
+        SET org    = #{org},
+            income = #{income}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadRegisterSchedule">
+        UPDATE t_member
+        SET register_schedule = #{registerSchedule}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadIdNumber">
+        UPDATE t_member
+        SET id_number = #{idNumber}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadGender">
+        UPDATE t_member
+        SET gender = #{gender}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadBornYear">
+        UPDATE t_member
+        SET born_year = #{bornYear}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadOnly">
+        UPDATE t_member
+        SET only = #{only}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadEdu">
+        UPDATE t_member
+        SET edu = #{edu}
+        WHERE passport_id = #{passportId}
+    </update>
+
+    <update id="uploadSchool">
+        UPDATE t_member
+        SET school = #{school}
+        WHERE passport_id = #{passportId}
+    </update>
+</mapper>

+ 21 - 0
src/main/resources/mapper/PassportMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.finikes.matchmaker.passport.dao.PassportDAO">
+    <insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id"
+            parameterType="com.finikes.matchmaker.passport.entity.Passport">
+        INSERT INTO t_passport (open_id, register_state, union_id)
+        VALUES (#{openId}, #{registerState}, #{unionId})
+    </insert>
+
+    <update id="updateRegisterState">
+        UPDATE t_passport
+        SET register_state = #{state}
+        WHERE id = #{id}
+    </update>
+
+    <select id="findByOpenId" resultType="com.finikes.matchmaker.passport.entity.Passport">
+        SELECT id as id, register_state as registerState, open_id as openId, union_id as unionId
+        FROM t_passport
+        WHERE open_id = #{openId}
+    </select>
+</mapper>

+ 13 - 0
src/test/java/com/finikes/matchmaker/MatchmakerApplicationTests.java

@@ -0,0 +1,13 @@
+package com.finikes.matchmaker;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MatchmakerApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}