From b2d13575d13d520e1bb242911a371ccd0e781117 Mon Sep 17 00:00:00 2001 From: zhangzq Date: Mon, 18 May 2026 15:58:26 +0800 Subject: [PATCH] init --- .gitattributes | 2 + .mvn/wrapper/maven-wrapper.properties | 3 + mvnw | 295 ++++++++++++++++++ mvnw.cmd | 189 +++++++++++ pom.xml | 111 +++++++ wms-bootstrap/pom.xml | 97 ++++++ .../nl/bootstrap/WmsBootstrapApplication.java | 17 + .../src/main/resources/application.yml | 11 + wms-busanalytics/pom.xml | 74 +++++ wms-common/pom.xml | 74 +++++ .../org/nl/common/WmsCommonApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../nl/common/WmsCommonApplicationTests.java | 13 + wms-dispatch/pom.xml | 74 +++++ .../dispatch/WmsTaskdispatchApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../WmsTaskdispatchApplicationTests.java | 13 + wms-gateway/pom.xml | 74 +++++ .../org/nl/gateway/WmsGatewayApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../gateway/WmsGatewayApplicationTests.java | 13 + wms-iam/pom.xml | 38 +++ wms-iam/wms-iam-api/pom.xml | 72 +++++ .../src/main/java/org/nl/iam/dto/Init.java | 8 + .../java/org/nl/iam/feignApi/IamFeignApi.java | 12 + wms-iam/wms-iam-server/pom.xml | 50 +++ .../org/nl/iam/WmsIamServerApplication.java | 15 + .../org/nl/iam/controller/IamController.java | 20 ++ .../src/main/resources/application.properties | 1 + wms-inventory/pom.xml | 74 +++++ .../WmsInventoryserviceApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../WmsInventoryserviceApplicationTests.java | 13 + wms-matedata/pom.xml | 74 +++++ wms-matedata/wms-matedata-api/.gitattributes | 2 + .../.mvn/wrapper/maven-wrapper.properties | 3 + wms-matedata/wms-matedata-api/mvnw | 295 ++++++++++++++++++ wms-matedata/wms-matedata-api/mvnw.cmd | 189 +++++++++++ wms-matedata/wms-matedata-api/pom.xml | 74 +++++ .../matedata/WmsMatedataApiApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../WmsMatedataApiApplicationTests.java | 13 + .../wms-matedata-server/.gitattributes | 2 + .../.mvn/wrapper/maven-wrapper.properties | 3 + wms-matedata/wms-matedata-server/mvnw | 295 ++++++++++++++++++ wms-matedata/wms-matedata-server/mvnw.cmd | 189 +++++++++++ wms-matedata/wms-matedata-server/pom.xml | 74 +++++ .../WmsMatedataServerApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../WmsMatedataServerApplicationTests.java | 13 + wms-warehouse/pom.xml | 74 +++++ .../l/warehouse/WmsWarehouseApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../WmsWarehouseApplicationTests.java | 13 + 服务交互时序图.png | Bin 0 -> 79227 bytes 项目说明.md | 40 +++ 56 files changed, 2814 insertions(+) create mode 100644 .gitattributes create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 wms-bootstrap/pom.xml create mode 100644 wms-bootstrap/src/main/java/org/nl/bootstrap/WmsBootstrapApplication.java create mode 100644 wms-bootstrap/src/main/resources/application.yml create mode 100644 wms-busanalytics/pom.xml create mode 100644 wms-common/pom.xml create mode 100644 wms-common/src/main/java/org/nl/common/WmsCommonApplication.java create mode 100644 wms-common/src/main/resources/application.properties create mode 100644 wms-common/src/test/java/org/nl/common/WmsCommonApplicationTests.java create mode 100644 wms-dispatch/pom.xml create mode 100644 wms-dispatch/src/main/java/org/nl/dispatch/WmsTaskdispatchApplication.java create mode 100644 wms-dispatch/src/main/resources/application.properties create mode 100644 wms-dispatch/src/test/java/org/nl/dispatch/WmsTaskdispatchApplicationTests.java create mode 100644 wms-gateway/pom.xml create mode 100644 wms-gateway/src/main/java/org/nl/gateway/WmsGatewayApplication.java create mode 100644 wms-gateway/src/main/resources/application.properties create mode 100644 wms-gateway/src/test/java/org/nl/gateway/WmsGatewayApplicationTests.java create mode 100644 wms-iam/pom.xml create mode 100644 wms-iam/wms-iam-api/pom.xml create mode 100644 wms-iam/wms-iam-api/src/main/java/org/nl/iam/dto/Init.java create mode 100644 wms-iam/wms-iam-api/src/main/java/org/nl/iam/feignApi/IamFeignApi.java create mode 100644 wms-iam/wms-iam-server/pom.xml create mode 100644 wms-iam/wms-iam-server/src/main/java/org/nl/iam/WmsIamServerApplication.java create mode 100644 wms-iam/wms-iam-server/src/main/java/org/nl/iam/controller/IamController.java create mode 100644 wms-iam/wms-iam-server/src/main/resources/application.properties create mode 100644 wms-inventory/pom.xml create mode 100644 wms-inventory/src/main/java/org/nl/inventoryservice/WmsInventoryserviceApplication.java create mode 100644 wms-inventory/src/main/resources/application.properties create mode 100644 wms-inventory/src/test/java/org/nl/inventoryservice/WmsInventoryserviceApplicationTests.java create mode 100644 wms-matedata/pom.xml create mode 100644 wms-matedata/wms-matedata-api/.gitattributes create mode 100644 wms-matedata/wms-matedata-api/.mvn/wrapper/maven-wrapper.properties create mode 100755 wms-matedata/wms-matedata-api/mvnw create mode 100644 wms-matedata/wms-matedata-api/mvnw.cmd create mode 100644 wms-matedata/wms-matedata-api/pom.xml create mode 100644 wms-matedata/wms-matedata-api/src/main/java/org/nl/matedata/WmsMatedataApiApplication.java create mode 100644 wms-matedata/wms-matedata-api/src/main/resources/application.properties create mode 100644 wms-matedata/wms-matedata-api/src/test/java/org/nl/matedata/WmsMatedataApiApplicationTests.java create mode 100644 wms-matedata/wms-matedata-server/.gitattributes create mode 100644 wms-matedata/wms-matedata-server/.mvn/wrapper/maven-wrapper.properties create mode 100755 wms-matedata/wms-matedata-server/mvnw create mode 100644 wms-matedata/wms-matedata-server/mvnw.cmd create mode 100644 wms-matedata/wms-matedata-server/pom.xml create mode 100644 wms-matedata/wms-matedata-server/src/main/java/org/nl/matedata/WmsMatedataServerApplication.java create mode 100644 wms-matedata/wms-matedata-server/src/main/resources/application.properties create mode 100644 wms-matedata/wms-matedata-server/src/test/java/org/nl/matedata/WmsMatedataServerApplicationTests.java create mode 100644 wms-warehouse/pom.xml create mode 100644 wms-warehouse/src/main/java/org/l/warehouse/WmsWarehouseApplication.java create mode 100644 wms-warehouse/src/main/resources/application.properties create mode 100644 wms-warehouse/src/test/java/org/l/warehouse/WmsWarehouseApplicationTests.java create mode 100644 服务交互时序图.png create mode 100644 项目说明.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..5291372 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.15/apache-maven-3.9.15-bin.zip diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..bd8896b --- /dev/null +++ b/mvnw @@ -0,0 +1,295 @@ +#!/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.4 +# +# 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:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# 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 <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.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${scriptName#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 + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" + +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi +fi + +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi + +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$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..92450f9 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,189 @@ +<# : 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.4 +@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 -eq $False) { "/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_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::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 + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -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..18064af --- /dev/null +++ b/pom.xml @@ -0,0 +1,111 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.10 + + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + wms-cloud + pom + + 21 + 21 + 21 + UTF-8 + 1.18.44 + 2023.0.5 + 2023.0.1.2 + + + + wms-bootstrap + wms-iam + wms-matedata + wms-dispatch + wms-busanalytics + wms-common + wms-gateway + wms-inventory + wms-warehouse + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + UTF-8 + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + + diff --git a/wms-bootstrap/pom.xml b/wms-bootstrap/pom.xml new file mode 100644 index 0000000..ba92f3b --- /dev/null +++ b/wms-bootstrap/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + + wms-bootstrap + jar + + + + + org.nl + wms-gateway + 0.0.1-SNAPSHOT + + + + + org.nl + wms-iam-server + 0.0.1-SNAPSHOT + + + + + org.nl + wms-iam-api + 0.0.1-SNAPSHOT + + + + + org.nl + wms-inventory + 0.0.1-SNAPSHOT + + + org.nl + wms-warehouse + 0.0.1-SNAPSHOT + + + org.nl + wms-dispatch + 0.0.1-SNAPSHOT + + + + + org.nl + wms-common + 0.0.1-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + org.nl.bootstrap.WmsBootstrapApplication + + + + + repackage + + + + + + + diff --git a/wms-bootstrap/src/main/java/org/nl/bootstrap/WmsBootstrapApplication.java b/wms-bootstrap/src/main/java/org/nl/bootstrap/WmsBootstrapApplication.java new file mode 100644 index 0000000..8560dc6 --- /dev/null +++ b/wms-bootstrap/src/main/java/org/nl/bootstrap/WmsBootstrapApplication.java @@ -0,0 +1,17 @@ +package org.nl.bootstrap; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = { + "org.nl" // 扫描 iam 模块 +}) +public class WmsBootstrapApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsBootstrapApplication.class, args); + } + +} diff --git a/wms-bootstrap/src/main/resources/application.yml b/wms-bootstrap/src/main/resources/application.yml new file mode 100644 index 0000000..39de469 --- /dev/null +++ b/wms-bootstrap/src/main/resources/application.yml @@ -0,0 +1,11 @@ +server: + port: 8081 +spring: + cloud: + discovery: + enabled: false # 禁用服务发现客户端(不去注册中心找其他服务) + nacos: + discovery: + enabled: false # 禁用 Nacos 服务注册(不把自己注册到 Nacos) + config: + enabled: false # 禁用 Nacos 配置中心(不从 Nacos 拉取配置) diff --git a/wms-busanalytics/pom.xml b/wms-busanalytics/pom.xml new file mode 100644 index 0000000..76bda75 --- /dev/null +++ b/wms-busanalytics/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + org.nl + wms-busanalytics + 0.0.1-SNAPSHOT + wms-bi + wms-bi + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-common/pom.xml b/wms-common/pom.xml new file mode 100644 index 0000000..7287a10 --- /dev/null +++ b/wms-common/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + org.nl + wms-common + 0.0.1-SNAPSHOT + wms-common + wms-common + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-common/src/main/java/org/nl/common/WmsCommonApplication.java b/wms-common/src/main/java/org/nl/common/WmsCommonApplication.java new file mode 100644 index 0000000..ab7b7fe --- /dev/null +++ b/wms-common/src/main/java/org/nl/common/WmsCommonApplication.java @@ -0,0 +1,13 @@ +package org.nl.common; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsCommonApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsCommonApplication.class, args); + } + +} diff --git a/wms-common/src/main/resources/application.properties b/wms-common/src/main/resources/application.properties new file mode 100644 index 0000000..ab421bf --- /dev/null +++ b/wms-common/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-common diff --git a/wms-common/src/test/java/org/nl/common/WmsCommonApplicationTests.java b/wms-common/src/test/java/org/nl/common/WmsCommonApplicationTests.java new file mode 100644 index 0000000..bf8b456 --- /dev/null +++ b/wms-common/src/test/java/org/nl/common/WmsCommonApplicationTests.java @@ -0,0 +1,13 @@ +package org.nl.common; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WmsCommonApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/wms-dispatch/pom.xml b/wms-dispatch/pom.xml new file mode 100644 index 0000000..2fb80ba --- /dev/null +++ b/wms-dispatch/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + org.nl + wms-dispatch + 0.0.1-SNAPSHOT + wms-taskdispatch + wms-taskdispatch + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-dispatch/src/main/java/org/nl/dispatch/WmsTaskdispatchApplication.java b/wms-dispatch/src/main/java/org/nl/dispatch/WmsTaskdispatchApplication.java new file mode 100644 index 0000000..f9c0203 --- /dev/null +++ b/wms-dispatch/src/main/java/org/nl/dispatch/WmsTaskdispatchApplication.java @@ -0,0 +1,13 @@ +package org.nl.dispatch; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsTaskdispatchApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsTaskdispatchApplication.class, args); + } + +} diff --git a/wms-dispatch/src/main/resources/application.properties b/wms-dispatch/src/main/resources/application.properties new file mode 100644 index 0000000..39a98d7 --- /dev/null +++ b/wms-dispatch/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-taskdispatch diff --git a/wms-dispatch/src/test/java/org/nl/dispatch/WmsTaskdispatchApplicationTests.java b/wms-dispatch/src/test/java/org/nl/dispatch/WmsTaskdispatchApplicationTests.java new file mode 100644 index 0000000..262b68a --- /dev/null +++ b/wms-dispatch/src/test/java/org/nl/dispatch/WmsTaskdispatchApplicationTests.java @@ -0,0 +1,13 @@ +package org.nl.dispatch; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WmsTaskdispatchApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/wms-gateway/pom.xml b/wms-gateway/pom.xml new file mode 100644 index 0000000..c9d0219 --- /dev/null +++ b/wms-gateway/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + org.nl + wms-gateway + 0.0.1-SNAPSHOT + wms-gateway + wms-gateway + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-gateway/src/main/java/org/nl/gateway/WmsGatewayApplication.java b/wms-gateway/src/main/java/org/nl/gateway/WmsGatewayApplication.java new file mode 100644 index 0000000..f16506d --- /dev/null +++ b/wms-gateway/src/main/java/org/nl/gateway/WmsGatewayApplication.java @@ -0,0 +1,13 @@ +package org.nl.gateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsGatewayApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsGatewayApplication.class, args); + } + +} diff --git a/wms-gateway/src/main/resources/application.properties b/wms-gateway/src/main/resources/application.properties new file mode 100644 index 0000000..d944f29 --- /dev/null +++ b/wms-gateway/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-gateway diff --git a/wms-gateway/src/test/java/org/nl/gateway/WmsGatewayApplicationTests.java b/wms-gateway/src/test/java/org/nl/gateway/WmsGatewayApplicationTests.java new file mode 100644 index 0000000..4711350 --- /dev/null +++ b/wms-gateway/src/test/java/org/nl/gateway/WmsGatewayApplicationTests.java @@ -0,0 +1,13 @@ +package org.nl.gateway; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WmsGatewayApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/wms-iam/pom.xml b/wms-iam/pom.xml new file mode 100644 index 0000000..945e036 --- /dev/null +++ b/wms-iam/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + wms-iam + 0.0.1-SNAPSHOT + wms-iam + pom + + 21 + + + wms-iam-api + wms-iam-server + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + diff --git a/wms-iam/wms-iam-api/pom.xml b/wms-iam/wms-iam-api/pom.xml new file mode 100644 index 0000000..3e38350 --- /dev/null +++ b/wms-iam/wms-iam-api/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + org.nl + wms-iam + 0.0.1-SNAPSHOT + ../pom.xml + + wms-iam-api + 0.0.1-SNAPSHOT + wms-iam-api + + 21 + + + + + org.springframework.cloud + spring-cloud-openfeign-core + provided + + + + org.projectlombok + lombok + provided + + + org.springframework.boot + spring-boot-starter-web + provided + + + + com.fasterxml.jackson.core + jackson-annotations + provided + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + true + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar-no-fork + + + + + + + + diff --git a/wms-iam/wms-iam-api/src/main/java/org/nl/iam/dto/Init.java b/wms-iam/wms-iam-api/src/main/java/org/nl/iam/dto/Init.java new file mode 100644 index 0000000..c0a0de2 --- /dev/null +++ b/wms-iam/wms-iam-api/src/main/java/org/nl/iam/dto/Init.java @@ -0,0 +1,8 @@ +package org.nl.iam.dto; + +import lombok.Data; + +@Data +public class Init { + private String msg; +} diff --git a/wms-iam/wms-iam-api/src/main/java/org/nl/iam/feignApi/IamFeignApi.java b/wms-iam/wms-iam-api/src/main/java/org/nl/iam/feignApi/IamFeignApi.java new file mode 100644 index 0000000..b2bf276 --- /dev/null +++ b/wms-iam/wms-iam-api/src/main/java/org/nl/iam/feignApi/IamFeignApi.java @@ -0,0 +1,12 @@ +package org.nl.iam.feignApi; + +import org.nl.iam.dto.Init; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +@FeignClient(name = "wms-iam-server",url = "http://localhost:8011", path = "/api/iam") +public interface IamFeignApi { + + @GetMapping("/init") + Init init(); +} diff --git a/wms-iam/wms-iam-server/pom.xml b/wms-iam/wms-iam-server/pom.xml new file mode 100644 index 0000000..19c4e94 --- /dev/null +++ b/wms-iam/wms-iam-server/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + org.nl + wms-iam + 0.0.1-SNAPSHOT + ../pom.xml + + wms-iam-server + 0.0.1-SNAPSHOT + wms-iam-server + + + org.springframework.boot + spring-boot-starter-web + + + + org.nl + wms-iam-api + 0.0.1-SNAPSHOT + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + org.projectlombok + lombok + provided + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/wms-iam/wms-iam-server/src/main/java/org/nl/iam/WmsIamServerApplication.java b/wms-iam/wms-iam-server/src/main/java/org/nl/iam/WmsIamServerApplication.java new file mode 100644 index 0000000..87e655b --- /dev/null +++ b/wms-iam/wms-iam-server/src/main/java/org/nl/iam/WmsIamServerApplication.java @@ -0,0 +1,15 @@ +package org.nl.iam; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsIamServerApplication { + static { + System.out.println("=======加载WmsIamServer======="); + } + public static void main(String[] args) { + SpringApplication.run(WmsIamServerApplication.class, args); + } + +} diff --git a/wms-iam/wms-iam-server/src/main/java/org/nl/iam/controller/IamController.java b/wms-iam/wms-iam-server/src/main/java/org/nl/iam/controller/IamController.java new file mode 100644 index 0000000..e2cb792 --- /dev/null +++ b/wms-iam/wms-iam-server/src/main/java/org/nl/iam/controller/IamController.java @@ -0,0 +1,20 @@ +package org.nl.iam.controller; + +import lombok.RequiredArgsConstructor; +import org.nl.iam.dto.Init; +import org.nl.iam.feignApi.IamFeignApi; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/iam") +public class IamController implements IamFeignApi { + + @Override + public Init init() { + final Init init = new Init(); + init.setMsg("初始化成功"); + return init; + } +} diff --git a/wms-iam/wms-iam-server/src/main/resources/application.properties b/wms-iam/wms-iam-server/src/main/resources/application.properties new file mode 100644 index 0000000..61e089b --- /dev/null +++ b/wms-iam/wms-iam-server/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-iam-server diff --git a/wms-inventory/pom.xml b/wms-inventory/pom.xml new file mode 100644 index 0000000..fcae1dd --- /dev/null +++ b/wms-inventory/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.15-SNAPSHOT + + + org.nl + wms-inventory + 0.0.1-SNAPSHOT + wms-inventoryservice + wms-inventoryservice + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-inventory/src/main/java/org/nl/inventoryservice/WmsInventoryserviceApplication.java b/wms-inventory/src/main/java/org/nl/inventoryservice/WmsInventoryserviceApplication.java new file mode 100644 index 0000000..838783f --- /dev/null +++ b/wms-inventory/src/main/java/org/nl/inventoryservice/WmsInventoryserviceApplication.java @@ -0,0 +1,13 @@ +package org.nl.inventoryservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsInventoryserviceApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsInventoryserviceApplication.class, args); + } + +} diff --git a/wms-inventory/src/main/resources/application.properties b/wms-inventory/src/main/resources/application.properties new file mode 100644 index 0000000..7929a31 --- /dev/null +++ b/wms-inventory/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-inventoryservice diff --git a/wms-inventory/src/test/java/org/nl/inventoryservice/WmsInventoryserviceApplicationTests.java b/wms-inventory/src/test/java/org/nl/inventoryservice/WmsInventoryserviceApplicationTests.java new file mode 100644 index 0000000..0692aa7 --- /dev/null +++ b/wms-inventory/src/test/java/org/nl/inventoryservice/WmsInventoryserviceApplicationTests.java @@ -0,0 +1,13 @@ +package org.nl.inventoryservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WmsInventoryserviceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/wms-matedata/pom.xml b/wms-matedata/pom.xml new file mode 100644 index 0000000..f886cda --- /dev/null +++ b/wms-matedata/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + org.nl + wms-matedata + 0.0.1-SNAPSHOT + wms-matedata + wms-matedata + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-matedata/wms-matedata-api/.gitattributes b/wms-matedata/wms-matedata-api/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/wms-matedata/wms-matedata-api/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/wms-matedata/wms-matedata-api/.mvn/wrapper/maven-wrapper.properties b/wms-matedata/wms-matedata-api/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..5291372 --- /dev/null +++ b/wms-matedata/wms-matedata-api/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.15/apache-maven-3.9.15-bin.zip diff --git a/wms-matedata/wms-matedata-api/mvnw b/wms-matedata/wms-matedata-api/mvnw new file mode 100755 index 0000000..bd8896b --- /dev/null +++ b/wms-matedata/wms-matedata-api/mvnw @@ -0,0 +1,295 @@ +#!/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.4 +# +# 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:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# 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 <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.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${scriptName#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 + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" + +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi +fi + +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi + +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/wms-matedata/wms-matedata-api/mvnw.cmd b/wms-matedata/wms-matedata-api/mvnw.cmd new file mode 100644 index 0000000..92450f9 --- /dev/null +++ b/wms-matedata/wms-matedata-api/mvnw.cmd @@ -0,0 +1,189 @@ +<# : 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.4 +@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 -eq $False) { "/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_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::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 + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -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/wms-matedata/wms-matedata-api/pom.xml b/wms-matedata/wms-matedata-api/pom.xml new file mode 100644 index 0000000..28309ab --- /dev/null +++ b/wms-matedata/wms-matedata-api/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.15-SNAPSHOT + + + org.nl + wms-matedata-api + 0.0.1-SNAPSHOT + wms-matedata-api + wms-matedata-api + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-matedata/wms-matedata-api/src/main/java/org/nl/matedata/WmsMatedataApiApplication.java b/wms-matedata/wms-matedata-api/src/main/java/org/nl/matedata/WmsMatedataApiApplication.java new file mode 100644 index 0000000..7bd47d8 --- /dev/null +++ b/wms-matedata/wms-matedata-api/src/main/java/org/nl/matedata/WmsMatedataApiApplication.java @@ -0,0 +1,13 @@ +package org.nl.matedata; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsMatedataApiApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsMatedataApiApplication.class, args); + } + +} diff --git a/wms-matedata/wms-matedata-api/src/main/resources/application.properties b/wms-matedata/wms-matedata-api/src/main/resources/application.properties new file mode 100644 index 0000000..da053f0 --- /dev/null +++ b/wms-matedata/wms-matedata-api/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-matedata-api diff --git a/wms-matedata/wms-matedata-api/src/test/java/org/nl/matedata/WmsMatedataApiApplicationTests.java b/wms-matedata/wms-matedata-api/src/test/java/org/nl/matedata/WmsMatedataApiApplicationTests.java new file mode 100644 index 0000000..606d203 --- /dev/null +++ b/wms-matedata/wms-matedata-api/src/test/java/org/nl/matedata/WmsMatedataApiApplicationTests.java @@ -0,0 +1,13 @@ +package org.nl.matedata; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WmsMatedataApiApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/wms-matedata/wms-matedata-server/.gitattributes b/wms-matedata/wms-matedata-server/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/wms-matedata/wms-matedata-server/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/wms-matedata/wms-matedata-server/.mvn/wrapper/maven-wrapper.properties b/wms-matedata/wms-matedata-server/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..5291372 --- /dev/null +++ b/wms-matedata/wms-matedata-server/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.15/apache-maven-3.9.15-bin.zip diff --git a/wms-matedata/wms-matedata-server/mvnw b/wms-matedata/wms-matedata-server/mvnw new file mode 100755 index 0000000..bd8896b --- /dev/null +++ b/wms-matedata/wms-matedata-server/mvnw @@ -0,0 +1,295 @@ +#!/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.4 +# +# 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:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# 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 <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.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${scriptName#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 + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" + +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi +fi + +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi + +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/wms-matedata/wms-matedata-server/mvnw.cmd b/wms-matedata/wms-matedata-server/mvnw.cmd new file mode 100644 index 0000000..92450f9 --- /dev/null +++ b/wms-matedata/wms-matedata-server/mvnw.cmd @@ -0,0 +1,189 @@ +<# : 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.4 +@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 -eq $False) { "/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_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::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 + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -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/wms-matedata/wms-matedata-server/pom.xml b/wms-matedata/wms-matedata-server/pom.xml new file mode 100644 index 0000000..804c8a8 --- /dev/null +++ b/wms-matedata/wms-matedata-server/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.15-SNAPSHOT + + + org.nl + wms-matedata-server + 0.0.1-SNAPSHOT + wms-matedata-server + wms-matedata-server + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-matedata/wms-matedata-server/src/main/java/org/nl/matedata/WmsMatedataServerApplication.java b/wms-matedata/wms-matedata-server/src/main/java/org/nl/matedata/WmsMatedataServerApplication.java new file mode 100644 index 0000000..6e0607b --- /dev/null +++ b/wms-matedata/wms-matedata-server/src/main/java/org/nl/matedata/WmsMatedataServerApplication.java @@ -0,0 +1,13 @@ +package org.nl.matedata; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsMatedataServerApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsMatedataServerApplication.class, args); + } + +} diff --git a/wms-matedata/wms-matedata-server/src/main/resources/application.properties b/wms-matedata/wms-matedata-server/src/main/resources/application.properties new file mode 100644 index 0000000..c00ddd4 --- /dev/null +++ b/wms-matedata/wms-matedata-server/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-matedata-server diff --git a/wms-matedata/wms-matedata-server/src/test/java/org/nl/matedata/WmsMatedataServerApplicationTests.java b/wms-matedata/wms-matedata-server/src/test/java/org/nl/matedata/WmsMatedataServerApplicationTests.java new file mode 100644 index 0000000..d3898e4 --- /dev/null +++ b/wms-matedata/wms-matedata-server/src/test/java/org/nl/matedata/WmsMatedataServerApplicationTests.java @@ -0,0 +1,13 @@ +package org.nl.matedata; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WmsMatedataServerApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/wms-warehouse/pom.xml b/wms-warehouse/pom.xml new file mode 100644 index 0000000..d291eaf --- /dev/null +++ b/wms-warehouse/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.nl + wms-cloud + 0.0.1-SNAPSHOT + ../pom.xml + + org.nl + wms-warehouse + 0.0.1-SNAPSHOT + wms-warehouse + wms-warehouse + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + diff --git a/wms-warehouse/src/main/java/org/l/warehouse/WmsWarehouseApplication.java b/wms-warehouse/src/main/java/org/l/warehouse/WmsWarehouseApplication.java new file mode 100644 index 0000000..6a82ad7 --- /dev/null +++ b/wms-warehouse/src/main/java/org/l/warehouse/WmsWarehouseApplication.java @@ -0,0 +1,13 @@ +package org.l.warehouse; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WmsWarehouseApplication { + + public static void main(String[] args) { + SpringApplication.run(WmsWarehouseApplication.class, args); + } + +} diff --git a/wms-warehouse/src/main/resources/application.properties b/wms-warehouse/src/main/resources/application.properties new file mode 100644 index 0000000..60877eb --- /dev/null +++ b/wms-warehouse/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=wms-warehouse diff --git a/wms-warehouse/src/test/java/org/l/warehouse/WmsWarehouseApplicationTests.java b/wms-warehouse/src/test/java/org/l/warehouse/WmsWarehouseApplicationTests.java new file mode 100644 index 0000000..f548682 --- /dev/null +++ b/wms-warehouse/src/test/java/org/l/warehouse/WmsWarehouseApplicationTests.java @@ -0,0 +1,13 @@ +package org.l.warehouse; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WmsWarehouseApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/服务交互时序图.png b/服务交互时序图.png new file mode 100644 index 0000000000000000000000000000000000000000..444baa116d1d64c1ca07a4eb85449f6743f3c0a0 GIT binary patch literal 79227 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 YlI9DGg{_XJpn-p6B;;@B-qiK|KQ@zAZU6uP literal 0 HcmV?d00001 diff --git a/项目说明.md b/项目说明.md new file mode 100644 index 0000000..17ab13f --- /dev/null +++ b/项目说明.md @@ -0,0 +1,40 @@ +## 项目调用参考服务交互时序图 +## 项目技术要求 +#### 1.springboot使用3.2.10版本,对应jdk21,编译统一使用jdk21版本 +#### 2.springcloud使用alibaba版本 +2023.0.5 +2023.0.1.2 +#### 3.nacos自行搭建,yml配置如下 + nacos: + discovery: + server-addr: localhost:8848 + namespace: dev + enabled: true +#### 4.FeignClient目前通过指定url方式 +后续各模块集群部署时可使用Spring Cloud LoadBalancer做负载均衡 +#### 5.数据库持久层框架使用mybatis-plus + +## 项目结构说明 +wms-cloud ---根 +|--wms-gateway 登录鉴权 +|--wms-iam 用户管理 用户菜单部门权限 +| |---wms-iam-api 对外feign接口 +| |---wms-iam-server 服务实现模块 +。。。。。。 +示例:1.财务模块 创建了api,gateWay应用wms-iam-api调用 +http://localhost:8012/api/gateway + +## 开发规范 +1.所有实体对象统一驼峰命名 +2.controller层参数接收,返回必须使用实体对象,并在api模块定义 +3.各子模块业务上如server有多个功能模块按如下结构定义 +|----xxx-server +org.nl.xxx +|-- 功能模块1 +|-controller +|-service +|-mapper +|-entity +|-dto +|-impl +