From 9206d0ec5dee0b369cb3f7088b26a64ee5713142 Mon Sep 17 00:00:00 2001 From: Lixin <2563946749@qq.com> Date: Sun, 10 Nov 2024 22:56:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 33 +++ .mvn/.gitignore | 33 +++ .mvn/mvnw | 259 ++++++++++++++++++ .mvn/mvnw.cmd | 149 ++++++++++ .mvn/wrapper/maven-wrapper.properties | 19 ++ mvnw | 259 ++++++++++++++++++ mvnw.cmd | 149 ++++++++++ pom.xml | 114 ++++++++ src/.gitignore | 33 +++ .../springboot1/Springboot1Application.java | 13 + .../lixin/springboot1/springboot1/Test.java | 32 +++ .../controller/JSONController.java | 19 ++ .../controller/LoginController.java | 51 ++++ .../controller/PersonController.java | 70 +++++ .../controller/StudentController.java | 113 ++++++++ .../controller/TestController.java | 26 ++ .../springboot1/dao/OrderMapper.java | 12 + .../springboot1/dao/PersonMapper.java | 14 + .../springboot1/dao/ProductMapper.java | 12 + .../springboot1/dao/StuCardMapper.java | 12 + .../springboot1/dao/StudentMapper.java | 18 ++ .../springboot1/springboot1/model/Order.java | 14 + .../springboot1/springboot1/model/Person.java | 15 + .../springboot1/model/Product.java | 10 + .../springboot1/springboot1/model/Result.java | 61 +++++ .../springboot1/model/StuCard.java | 10 + .../springboot1/model/Student.java | 29 ++ .../springboot1/springboot1/model/User.java | 11 + .../springboot1/service/IStudentService.java | 26 ++ .../springboot1/service/PersonService.java | 13 + .../service/impl/IStudentServiceImpl.java | 22 ++ .../service/impl/PersonServiceImpl.java | 39 +++ src/main/resources/application.properties | 22 ++ src/main/resources/img/1234.png | Bin 0 -> 54871 bytes src/main/resources/mapper/OrderMapper.xml | 21 ++ src/main/resources/mapper/PersonMapper.xml | 37 +++ src/main/resources/mapper/ProductMapper.xml | 10 + src/main/resources/mapper/StuCardMapper.xml | 24 ++ src/main/resources/mapper/StudentMapper.xml | 7 + .../resources/templates/addpersonpage.html | 19 ++ src/main/resources/templates/fail.html | 11 + src/main/resources/templates/login.html | 23 ++ src/main/resources/templates/main.html | 11 + src/main/resources/templates/news.html | 12 + src/main/resources/templates/personpage.html | 59 ++++ src/main/resources/templates/sucess.html | 10 + src/main/resources/templates/test.html | 24 ++ src/main/resources/templates/updata.html | 20 ++ src/mvnw | 259 ++++++++++++++++++ src/mvnw.cmd | 149 ++++++++++ .../Springboot1ApplicationTests.java | 13 + 51 files changed, 2421 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/.gitignore create mode 100644 .mvn/mvnw create mode 100644 .mvn/mvnw.cmd create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/.gitignore create mode 100644 src/main/java/com/lixin/springboot1/springboot1/Springboot1Application.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/Test.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/controller/JSONController.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/controller/LoginController.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/controller/PersonController.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/controller/StudentController.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/controller/TestController.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/dao/OrderMapper.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/dao/PersonMapper.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/dao/ProductMapper.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/dao/StuCardMapper.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/dao/StudentMapper.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/model/Order.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/model/Person.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/model/Product.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/model/Result.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/model/StuCard.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/model/Student.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/model/User.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/service/IStudentService.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/service/PersonService.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/service/impl/IStudentServiceImpl.java create mode 100644 src/main/java/com/lixin/springboot1/springboot1/service/impl/PersonServiceImpl.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/img/1234.png create mode 100644 src/main/resources/mapper/OrderMapper.xml create mode 100644 src/main/resources/mapper/PersonMapper.xml create mode 100644 src/main/resources/mapper/ProductMapper.xml create mode 100644 src/main/resources/mapper/StuCardMapper.xml create mode 100644 src/main/resources/mapper/StudentMapper.xml create mode 100644 src/main/resources/templates/addpersonpage.html create mode 100644 src/main/resources/templates/fail.html create mode 100644 src/main/resources/templates/login.html create mode 100644 src/main/resources/templates/main.html create mode 100644 src/main/resources/templates/news.html create mode 100644 src/main/resources/templates/personpage.html create mode 100644 src/main/resources/templates/sucess.html create mode 100644 src/main/resources/templates/test.html create mode 100644 src/main/resources/templates/updata.html create mode 100644 src/mvnw create mode 100644 src/mvnw.cmd create mode 100644 src/test/java/com/lixin/springboot1/springboot1/Springboot1ApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/.gitignore b/.mvn/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.mvn/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/mvnw b/.mvn/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/.mvn/mvnw @@ -0,0 +1,259 @@ +#!/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 +# +# http://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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + 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" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/.mvn/mvnw.cmd b/.mvn/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/.mvn/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@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 http://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 Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# 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 +# +# http://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. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/mvnw @@ -0,0 +1,259 @@ +#!/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 +# +# http://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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + 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" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@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 http://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 Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e4cb3eb --- /dev/null +++ b/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.3 + + + com.lixin.springboot1 + springboot1 + 0.0.1-SNAPSHOT + springboot1 + springboot1 + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.baomidou + mybatis-plus-spring-boot3-starter + 3.5.7 + + + + + mysql + mysql-connector-java + 8.0.25 + + + + + com.baomidou + mybatis-plus-generator + 3.5.7 + + + org.freemarker + freemarker + 2.3.31 + + + org.example + untitled + 1.0-SNAPSHOT + compile + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/src/main/java/com/lixin/springboot1/springboot1/Springboot1Application.java b/src/main/java/com/lixin/springboot1/springboot1/Springboot1Application.java new file mode 100644 index 0000000..d49915a --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/Springboot1Application.java @@ -0,0 +1,13 @@ +package com.lixin.springboot1.springboot1; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Springboot1Application { + + public static void main(String[] args) { + SpringApplication.run(Springboot1Application.class, args); + } + +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/Test.java b/src/main/java/com/lixin/springboot1/springboot1/Test.java new file mode 100644 index 0000000..003f4c8 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/Test.java @@ -0,0 +1,32 @@ +package com.lixin.springboot1.springboot1; + +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; + +import java.nio.file.Paths; + +public class Test { + public static void main(String[] args) { + FastAutoGenerator.create("jdbc:mysql://10.33.66.120:3306/mybatis202201020133?serverTimezone=UTC", + "202201020133", "@hnucm1254") + .globalConfig(builder -> builder + .author("张三") + .outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java") + .commentDate("yyyy-MM-dd") + ) + .packageConfig(builder -> builder + .parent("com.baomidou.mybatisplus") + .entity("model") + .mapper("mapper") + .service("service") + .serviceImpl("service.impl") + .xml("mapper.xml") + ) + .strategyConfig(builder -> builder + .entityBuilder() + .enableLombok() + ) + .templateEngine(new FreemarkerTemplateEngine()) + .execute(); + } +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/controller/JSONController.java b/src/main/java/com/lixin/springboot1/springboot1/controller/JSONController.java new file mode 100644 index 0000000..9275c64 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/controller/JSONController.java @@ -0,0 +1,19 @@ +package com.lixin.springboot1.springboot1.controller; + +import com.lixin.springboot1.springboot1.model.User; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class JSONController { + @ResponseBody + @RequestMapping("/getuser") + public User test(){ + User user = new User(); + user.setId(1); + user.setName("张三"); + user.setAge(20); + return user; + } +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/controller/LoginController.java b/src/main/java/com/lixin/springboot1/springboot1/controller/LoginController.java new file mode 100644 index 0000000..87c42d0 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/controller/LoginController.java @@ -0,0 +1,51 @@ +package com.lixin.springboot1.springboot1.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.UUID; + +@Controller +public class LoginController { + + @RequestMapping("/uploadcommit") + public String upload(MultipartFile file){ + //保存文件 + File file1 = new File("D:/data/"); + String filename = UUID.randomUUID().toString()+file.getOriginalFilename(); + try { + file.transferTo(new File(file1,filename)); + } catch (Exception e) { + e.printStackTrace(); + } + return "sucess.html"; + } + + + @RequestMapping("/news/newsid") + public String news(@PathVariable String newsid, Model model){ + model.addAttribute("newsid",newsid); + return "news.html"; + } + + + @RequestMapping("/login") + public String login(){ + return "login.html"; + } + @RequestMapping("/logincommit") + public String logincommit(String username, String password, Model model){ + //todo 数据库查询登录 + //MySQL8.0.12 + + if (username.equals("admin")&&password.equals("123456")) { + model.addAttribute("username", username); + return "main.html"; + } + return "fail.html"; + } +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/controller/PersonController.java b/src/main/java/com/lixin/springboot1/springboot1/controller/PersonController.java new file mode 100644 index 0000000..95ebd63 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/controller/PersonController.java @@ -0,0 +1,70 @@ +package com.lixin.springboot1.springboot1.controller; + +import com.lixin.springboot1.springboot1.model.Person; +import com.lixin.springboot1.springboot1.model.StuCard; +import com.lixin.springboot1.springboot1.service.PersonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.text.AttributedString; + +@Controller +public class PersonController { + + @Autowired + private PersonService personService; + + @RequestMapping("/personpage") + public String getALLPerson(Model model){ + model.addAttribute("personList",personService.getAllPerson()); + return "personpage.html"; + } +//转发到添加页面 + @RequestMapping("/addpersonpage") + public String addPerson() { + return "addpersonpage.html"; + } + @RequestMapping("/addpersoncommit") + public String addPersonCommit(String name, int age,String stuid,String classname) { + Person person = new Person(); + person.setName(name); + person.setAge(age); + StuCard stuCard = new StuCard(); + stuCard.setClassname(classname); + stuCard.setStuid(stuid); + person.setStuCard(stuCard); + personService.addPerson(person); + return "redirect:/personpage"; + } + @RequestMapping("/deleteperson") + public String deletePerson(int id, int stuid) { + personService.deletePerson(id, stuid); + return "redirect:/personpage"; + } + @RequestMapping("/updatepersonpage") + public String updatePersonpage(int id,String name,int age,String stuid,String classname,int stucardid,Model model) { + model.addAttribute("id",id); + model.addAttribute("name",name); + model.addAttribute("age",age); + model.addAttribute("stuid",stuid); + model.addAttribute("classname",classname); + model.addAttribute("stucardid",stucardid); + return "updata.html"; + } + @RequestMapping("/updatepersoncommit") + public String updatePersonCommit(int id,String name,int age,String stuid,String classname,int stucardid) { + Person person = new Person(); + person.setId(id); + person.setAge(age); + person.setName(name); + StuCard stuCard = new StuCard(); + stuCard.setClassname(classname); + stuCard.setId(stucardid); + stuCard.setStuid(stuid); + person.setStuCard(stuCard); + personService.updatePerson(person); + return "redirect:/personpage"; + } +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/controller/StudentController.java b/src/main/java/com/lixin/springboot1/springboot1/controller/StudentController.java new file mode 100644 index 0000000..4ed4d8d --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/controller/StudentController.java @@ -0,0 +1,113 @@ +package com.lixin.springboot1.springboot1.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.lixin.springboot1.springboot1.model.Student; +import com.lixin.springboot1.springboot1.model.Result; +import com.lixin.springboot1.springboot1.service.IStudentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; + + +import java.io.File; +import java.util.List; +import java.util.UUID; + +/** + *

+ * 前端控制器 + *

+ * + * @author 张三 + * @since 2024-10-18 + */ + +@CrossOrigin +@Controller +@RequestMapping("/student") +public class StudentController { + @Autowired + IStudentService iStudentService; + + + + + @ResponseBody + @RequestMapping("/uploadcommit") + public Result upload(MultipartFile file){ + //保存文件 + File file1 = new File("D:/data/"); + String filename = UUID.randomUUID().toString()+file.getOriginalFilename(); + try { + file.transferTo(new File(file1,filename)); + } catch (Exception e) { + e.printStackTrace(); + } + return Result.ok().put("data",filename); + } + + + @ResponseBody + @RequestMapping("/studentlist") + public Result getStudentList(){ + List list = iStudentService.list(); + return Result.ok().put("data",list); + } + + @ResponseBody + @RequestMapping("getStudentlist1") + public Result getStudentList1(){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("name","text"); + + List list = iStudentService.list(queryWrapper); + return Result.ok().put("data",list); + } + + @ResponseBody + @RequestMapping("/addstudent") + public Result addStudent(Student student){ + boolean result=iStudentService.save(student); + if (result){ + return Result.ok(); + } + return Result.error(); + } + + @ResponseBody + @RequestMapping("/login") + public Result login(String username,String password){ + //todo => 查询数据库 + if (username.equals("admin") && password.equals("123456")){ + return Result.ok("登陆成功"); + } + return Result.error("登陆失败"); + } + + + + @ResponseBody + @RequestMapping("/updateStudent") + public Result updateStudent(Student student){ + boolean result=iStudentService.saveOrUpdate(student); + if (result){ + return Result.ok(); + } + return Result.error(); + } + + @ResponseBody + @RequestMapping("/deleteStudent") + public Result deleteStudent(int id) { + boolean result = iStudentService.removeById(id); + if (result) { + return Result.ok(); + } + return Result.error(); + } + +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/controller/TestController.java b/src/main/java/com/lixin/springboot1/springboot1/controller/TestController.java new file mode 100644 index 0000000..56e90ac --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/controller/TestController.java @@ -0,0 +1,26 @@ +package com.lixin.springboot1.springboot1.controller; + +import com.lixin.springboot1.springboot1.model.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; + +import java.util.ArrayList; +import java.util.List; + +@Controller +public class TestController { + @org.springframework.web.bind.annotation.RequestMapping("/test") + public String test(Model model){ + List userList = new ArrayList<>(); + for (int i = 0; i < 10; i++){ + User user = new User(); + user.setId(i); + user.setName("张三"+i); + user.setAge(20+i); + userList.add(user); + } + model.addAttribute("userList",userList); + model.addAttribute("name","张三"); + return "test.html"; + } +} \ No newline at end of file diff --git a/src/main/java/com/lixin/springboot1/springboot1/dao/OrderMapper.java b/src/main/java/com/lixin/springboot1/springboot1/dao/OrderMapper.java new file mode 100644 index 0000000..64f3c6e --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/dao/OrderMapper.java @@ -0,0 +1,12 @@ +package com.lixin.springboot1.springboot1.dao; + +import com.lixin.springboot1.springboot1.model.Order; +import com.lixin.springboot1.springboot1.model.StuCard; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface OrderMapper { + public List findOrderByPersonId(String personId); +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/dao/PersonMapper.java b/src/main/java/com/lixin/springboot1/springboot1/dao/PersonMapper.java new file mode 100644 index 0000000..639d0d4 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/dao/PersonMapper.java @@ -0,0 +1,14 @@ +package com.lixin.springboot1.springboot1.dao; + +import com.lixin.springboot1.springboot1.model.Person; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +//实现不是Java类中 写到配置文件中 +@Mapper +public interface PersonMapper { + public List getAllPerson(); + public int addPerson(Person person); + public int deletePerson(int id); + public int updatePerson(Person person); +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/dao/ProductMapper.java b/src/main/java/com/lixin/springboot1/springboot1/dao/ProductMapper.java new file mode 100644 index 0000000..1a8bf41 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/dao/ProductMapper.java @@ -0,0 +1,12 @@ +package com.lixin.springboot1.springboot1.dao; + +import com.lixin.springboot1.springboot1.model.Order; +import com.lixin.springboot1.springboot1.model.Product; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ProductMapper { + public List findProductByOrderId(int orderId); +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/dao/StuCardMapper.java b/src/main/java/com/lixin/springboot1/springboot1/dao/StuCardMapper.java new file mode 100644 index 0000000..84c27bd --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/dao/StuCardMapper.java @@ -0,0 +1,12 @@ +package com.lixin.springboot1.springboot1.dao; + +import com.lixin.springboot1.springboot1.model.StuCard; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StuCardMapper { + public StuCard findStuCardById(int id); + public int addStuCard(StuCard stuCard); + public int deleteStuCard(int id); + public int updateStuCard(StuCard stuCard); +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/dao/StudentMapper.java b/src/main/java/com/lixin/springboot1/springboot1/dao/StudentMapper.java new file mode 100644 index 0000000..718b3c1 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/dao/StudentMapper.java @@ -0,0 +1,18 @@ +package com.lixin.springboot1.springboot1.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lixin.springboot1.springboot1.model.Student; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author 张三 + * @since 2024-10-18 + */ +@Mapper +public interface StudentMapper extends BaseMapper { +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/model/Order.java b/src/main/java/com/lixin/springboot1/springboot1/model/Order.java new file mode 100644 index 0000000..38cf7b4 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/model/Order.java @@ -0,0 +1,14 @@ +package com.lixin.springboot1.springboot1.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class Order { + private int id; + private String orderinfo; + private int orderprice; + private int personid; + private List productList; +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/model/Person.java b/src/main/java/com/lixin/springboot1/springboot1/model/Person.java new file mode 100644 index 0000000..57d6f2b --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/model/Person.java @@ -0,0 +1,15 @@ +package com.lixin.springboot1.springboot1.model; + +import lombok.Data; + +import java.util.List; + +//Data 替代getter setter方法 +@Data +public class Person { + private int id; + private String name; + private int age; + private StuCard stuCard; + private List orderList; +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/model/Product.java b/src/main/java/com/lixin/springboot1/springboot1/model/Product.java new file mode 100644 index 0000000..e837745 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/model/Product.java @@ -0,0 +1,10 @@ +package com.lixin.springboot1.springboot1.model; + +import lombok.Data; + +@Data +public class Product { + private int id; + private String productname; + private int productprice; +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/model/Result.java b/src/main/java/com/lixin/springboot1/springboot1/model/Result.java new file mode 100644 index 0000000..61b05d4 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/model/Result.java @@ -0,0 +1,61 @@ +package com.lixin.springboot1.springboot1.model; + + +import java.io.Serial; +import java.util.HashMap; +import java.util.Map; +/** + * 返回数据封装类 + */ +public class Result extends HashMap { + @Serial + private static final long serialVersionUID = 1L; + + public Result() { + put("code", 0); + put("msg", "success"); + } + + public static Result error() { + return error(500, "未知异常,请联系管理员"); + } + + public static Result error(String msg) { + return error(500, msg); + } + + public static Result error(int code, String msg) { + Result r = new Result(); + r.put("code", code); + r.put("msg", msg); + return r; + } + + public static Result ok(String msg) { + Result r = new Result(); + r.put("msg", msg); + return r; + } + + + public static Result ok(Object obj) { + Result r = new Result(); + r.put("data", obj); + return r; + } + + public static Result ok(Map map) { + Result r = new Result(); + r.putAll(map); + return r; + } + + public static Result ok() { + return new Result(); + } + + public Result put(String key, Object value) { + super.put(key, value); + return this; + } +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/model/StuCard.java b/src/main/java/com/lixin/springboot1/springboot1/model/StuCard.java new file mode 100644 index 0000000..ac7581a --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/model/StuCard.java @@ -0,0 +1,10 @@ +package com.lixin.springboot1.springboot1.model; + +import lombok.Data; +//Data代替set +@Data +public class StuCard { + private int id; + private String classname; + private String stuid; +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/model/Student.java b/src/main/java/com/lixin/springboot1/springboot1/model/Student.java new file mode 100644 index 0000000..447d7a0 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/model/Student.java @@ -0,0 +1,29 @@ +package com.lixin.springboot1.springboot1.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * + *

+ * + * @author 张三 + * @since 2024-10-18 + */ +@Getter +@Setter +public class Student implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer age; + + private String name; +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/model/User.java b/src/main/java/com/lixin/springboot1/springboot1/model/User.java new file mode 100644 index 0000000..6957f21 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/model/User.java @@ -0,0 +1,11 @@ +package com.lixin.springboot1.springboot1.model; + +import lombok.Data; + +//替代所有的成员变量的get和set方法 +@Data +public class User { + private int id; + private String name; + private int age; +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/service/IStudentService.java b/src/main/java/com/lixin/springboot1/springboot1/service/IStudentService.java new file mode 100644 index 0000000..2ae3bfa --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/service/IStudentService.java @@ -0,0 +1,26 @@ +package com.lixin.springboot1.springboot1.service; + + + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.lixin.springboot1.springboot1.model.Student; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author 张三 + * @since 2024-10-18 + */ +public interface IStudentService extends IService { + + //boolean save(com.lixin.springboot1.springboot1.model.Student student); + + //boolean saveOrUpdate(com.lixin.springboot1.springboot1.model.Student student); + + //List list(QueryWrapper queryWrapper); +} \ No newline at end of file diff --git a/src/main/java/com/lixin/springboot1/springboot1/service/PersonService.java b/src/main/java/com/lixin/springboot1/springboot1/service/PersonService.java new file mode 100644 index 0000000..48a487a --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/service/PersonService.java @@ -0,0 +1,13 @@ +package com.lixin.springboot1.springboot1.service; + +import com.lixin.springboot1.springboot1.model.Person; + +import java.util.List; + +public interface PersonService { + public List getAllPerson(); + public int addPerson(Person person); + public int deletePerson(int id,int stuid); + public int updatePerson(Person person); + +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/service/impl/IStudentServiceImpl.java b/src/main/java/com/lixin/springboot1/springboot1/service/impl/IStudentServiceImpl.java new file mode 100644 index 0000000..87fd672 --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/service/impl/IStudentServiceImpl.java @@ -0,0 +1,22 @@ +package com.lixin.springboot1.springboot1.service.impl; + + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lixin.springboot1.springboot1.dao.StudentMapper; +import com.lixin.springboot1.springboot1.model.Student; +import com.lixin.springboot1.springboot1.service.IStudentService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author 张三 + * @since 2024-10-18 + */ +@Service +public class IStudentServiceImpl extends ServiceImpl implements IStudentService { + +} diff --git a/src/main/java/com/lixin/springboot1/springboot1/service/impl/PersonServiceImpl.java b/src/main/java/com/lixin/springboot1/springboot1/service/impl/PersonServiceImpl.java new file mode 100644 index 0000000..a8345ed --- /dev/null +++ b/src/main/java/com/lixin/springboot1/springboot1/service/impl/PersonServiceImpl.java @@ -0,0 +1,39 @@ +package com.lixin.springboot1.springboot1.service.impl; + +import com.lixin.springboot1.springboot1.dao.PersonMapper; +import com.lixin.springboot1.springboot1.dao.StuCardMapper; +import com.lixin.springboot1.springboot1.model.Person; +import com.lixin.springboot1.springboot1.service.PersonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PersonServiceImpl implements PersonService { + @Autowired + PersonMapper personMapper; + @Autowired + StuCardMapper stuCardMapper; + @Override + public List getAllPerson() { + return personMapper.getAllPerson(); + } + + @Override + public int addPerson(Person person) { + stuCardMapper.addStuCard(person.getStuCard()); + return personMapper.addPerson(person); + } + + @Override + public int deletePerson(int id,int stuid) { + stuCardMapper.deleteStuCard(stuid); + return personMapper.deletePerson(id); + } + @Override + public int updatePerson(Person person) { + stuCardMapper.updateStuCard(person.getStuCard()); + return personMapper.updatePerson(person); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..040c2c5 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,22 @@ +spring.application.name=springboot1 +#server.port=8080 +spring.web.resources.static-locations=classpath:/img/,file:D:/data/ +spring.servlet.multipart.max-file-size=1000MB +spring.servlet.multipart.max-request-size=100000MB +# ??????? +# ?????? +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# ????? +spring.datasource.name=defaultDataSource +# ??????? +spring.datasource.url=jdbc:mysql://10.33.66.120:3306/mybatis202201020133?serverTimezone=UTC +# ??????&??? +spring.datasource.username=202201020133 +spring.datasource.password=@hnucm1254 +#??????????MyBatis?? +#??Mybatis?Mapper?? +mybatis-plus.mapper-locations=classpath:mapper/*.xml +#??Mybatis????? +mybatis-plus.type-aliases-package=com.lixin.springboot1.springboot1.model +#???? +logging.level.com.lixin.springboot1.springboot1 = debug \ No newline at end of file diff --git a/src/main/resources/img/1234.png b/src/main/resources/img/1234.png new file mode 100644 index 0000000000000000000000000000000000000000..a44cca252fd656b680375f526579f13fea2b32e7 GIT binary patch literal 54871 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 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/PersonMapper.xml b/src/main/resources/mapper/PersonMapper.xml new file mode 100644 index 0000000..a9f2336 --- /dev/null +++ b/src/main/resources/mapper/PersonMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + insert into person(name,age,stucardid) values(#{name},#{age},#{stuCard.id}) + + + + delete from person where id=#{id} + + + + update person set name=#{name},age=#{age} where id=#{id} + + \ No newline at end of file diff --git a/src/main/resources/mapper/ProductMapper.xml b/src/main/resources/mapper/ProductMapper.xml new file mode 100644 index 0000000..2dbfd70 --- /dev/null +++ b/src/main/resources/mapper/ProductMapper.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/StuCardMapper.xml b/src/main/resources/mapper/StuCardMapper.xml new file mode 100644 index 0000000..73294b5 --- /dev/null +++ b/src/main/resources/mapper/StuCardMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + insert into stucard(classname,stuid) values(#{classname},#{stuid}) + + + + delete from stucard where id=#{id} + + + + update stucard set classname=#{classname},stuid=#{stuid} where id=#{id} + + + \ No newline at end of file diff --git a/src/main/resources/mapper/StudentMapper.xml b/src/main/resources/mapper/StudentMapper.xml new file mode 100644 index 0000000..9716683 --- /dev/null +++ b/src/main/resources/mapper/StudentMapper.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/addpersonpage.html b/src/main/resources/templates/addpersonpage.html new file mode 100644 index 0000000..c58a2da --- /dev/null +++ b/src/main/resources/templates/addpersonpage.html @@ -0,0 +1,19 @@ + + + + + Title + + +

添加用户页面

+ +
+
+
+
+
+ +
+返回用户列表 + + \ No newline at end of file diff --git a/src/main/resources/templates/fail.html b/src/main/resources/templates/fail.html new file mode 100644 index 0000000..dc03bbe --- /dev/null +++ b/src/main/resources/templates/fail.html @@ -0,0 +1,11 @@ + + + + + Title + + +

登录失败

+ + + \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..3549806 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,23 @@ + + + + + Title + + +

登陆界面

+ +
+
+ +
+ + + +
+
+
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/main.html b/src/main/resources/templates/main.html new file mode 100644 index 0000000..f273bb0 --- /dev/null +++ b/src/main/resources/templates/main.html @@ -0,0 +1,11 @@ + + + + + Title + + +

主界面

+登陆成功 + + \ No newline at end of file diff --git a/src/main/resources/templates/news.html b/src/main/resources/templates/news.html new file mode 100644 index 0000000..0658414 --- /dev/null +++ b/src/main/resources/templates/news.html @@ -0,0 +1,12 @@ + + + + + Title + + +

新闻界面

+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/personpage.html b/src/main/resources/templates/personpage.html new file mode 100644 index 0000000..7b9f0f4 --- /dev/null +++ b/src/main/resources/templates/personpage.html @@ -0,0 +1,59 @@ + + + + + Title + + +

Person 列表页面

+添加用户 + + + + + + + + + + + + + + + + + +
+
+ + + + + +
id姓名年龄订单班级学号删除操作更新操作
+
    +
  • + + +
    + + +
    +
  • +
+
+ + + 更新 +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/sucess.html b/src/main/resources/templates/sucess.html new file mode 100644 index 0000000..d6599e7 --- /dev/null +++ b/src/main/resources/templates/sucess.html @@ -0,0 +1,10 @@ + + + + + Title + + +

上传成功

+ + \ No newline at end of file diff --git a/src/main/resources/templates/test.html b/src/main/resources/templates/test.html new file mode 100644 index 0000000..96814ae --- /dev/null +++ b/src/main/resources/templates/test.html @@ -0,0 +1,24 @@ + + + + + Title + + +

hello world!!!

+
+ + + + + + + + + + + +
id姓名年龄
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/updata.html b/src/main/resources/templates/updata.html new file mode 100644 index 0000000..8aa2615 --- /dev/null +++ b/src/main/resources/templates/updata.html @@ -0,0 +1,20 @@ + + + + + Title + + +

更新页面

+ +
+
+
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/src/mvnw b/src/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/src/mvnw @@ -0,0 +1,259 @@ +#!/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 +# +# http://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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + 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" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/src/mvnw.cmd b/src/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/src/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@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 http://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 Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/src/test/java/com/lixin/springboot1/springboot1/Springboot1ApplicationTests.java b/src/test/java/com/lixin/springboot1/springboot1/Springboot1ApplicationTests.java new file mode 100644 index 0000000..0eb2ff3 --- /dev/null +++ b/src/test/java/com/lixin/springboot1/springboot1/Springboot1ApplicationTests.java @@ -0,0 +1,13 @@ +package com.lixin.springboot1.springboot1; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class Springboot1ApplicationTests { + + @Test + void contextLoads() { + } + +}