commit 3bd3aa3872bfb3caa6eb1ce76ec26effa6104086 Author: huangqizhen Date: Sat Dec 7 09:02:56 2024 +0800 后端整合模块 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/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fff0aec --- /dev/null +++ b/pom.xml @@ -0,0 +1,117 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.6 + + + com.example + demo + 0.0.2-SNAPSHOT + demo + demo + + + 21 + + + + + + + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + javax.xml.bind + jaxb-api + 2.3.1 + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.6 + + + + org.springframework.boot + spring-boot-starter-web + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 3.0.4 + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.mysql + mysql-connector-j + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.mybatis.spring.boot + mybatis-spring-boot-starter-test + 3.0.4 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java new file mode 100644 index 0000000..b9bb538 --- /dev/null +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -0,0 +1,15 @@ +package com.example.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication + +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/src/main/java/com/example/demo/Util/CaptchaUtil.java b/src/main/java/com/example/demo/Util/CaptchaUtil.java new file mode 100644 index 0000000..c26063f --- /dev/null +++ b/src/main/java/com/example/demo/Util/CaptchaUtil.java @@ -0,0 +1,203 @@ +package com.example.demo.Util; + +import jakarta.servlet.http.HttpServletResponse; +import org.apache.tomcat.util.codec.binary.Base64; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Random; + +/** + * Verification Code, 支持Base64 + * @author bobzyh + * + */ +public class CaptchaUtil { + /* + * 宽度 + * 高度 + * 长度 + * 字符集 + */ + private static final int WIDTH = 100; + private static final int HEIGHT = 38; + private static final int CODE_LENGTH = 4; + private static final String CODES = "1234567890ABCDEFGHJKLMNPQRSTUVWXYZ"; + private static final int LINE_COUNT = 15; + + + /** + * + * @param response 向客户端返回图片 + * @return 返回验证码的字符串 + */ + public static String createCaptcha(HttpServletResponse response) { + return createCaptcha(WIDTH, HEIGHT, CODE_LENGTH, response); + } + /** + * + * @param width + * @param height + * @param codeLength + * @param response + * @return + */ + public static String createCaptcha(int width, int height, int codeLength, HttpServletResponse response) { + // 生成字符串 + String captcha = randomCode(codeLength); + + // 生成图片 1+1=? + BufferedImage image = createImage(width, height, captcha); + + // 写入Response + try { + ImageIO.write(image, "jpeg", response.getOutputStream()); + + return captcha; + + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 只创建图片 + * @param captcha + * @return + */ + public static BufferedImage createImage(String captcha){ + return createImage(WIDTH, HEIGHT, captcha); + } + + public static BufferedImage createImage(int width, int height, String captcha) { + int codeLength = captcha.length(); + + // 生成图片 1+1=? + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + + // 获取画板 + Graphics graphics = image.getGraphics(); + + // 绘制背景颜色 + graphics.setColor(randomBgColor()); + graphics.fillRect(0, 0, width, height); + + // 在 "画板"上生成干扰线条 + drawLine(width, height, graphics, LINE_COUNT); + + + // 绘制字符串 + graphics.setFont(new Font("Comic Sans MS", Font.BOLD, 30)); + for (int i = 0; i < captcha.length(); i++) { + graphics.setColor(randomFontColor()); + graphics.drawString(captcha.substring(i, i+1), i*(width/codeLength), (height)/2+30/6*2); + } + + // 释放资源 + graphics.dispose(); + + return image; + } + + public static String createBase64(String captcha){ + BufferedImage imgae = createImage(captcha); + return getBase64(imgae); + } + + public static String getBase64(BufferedImage image){ + String base64 = null; + + try { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + ImageIO.write(image, "jpeg", stream); + base64 = "data:image/jpeg;base64," + Base64.encodeBase64String(stream.toByteArray()); + } catch (IOException e) { + e.printStackTrace(); + } + return base64; + } + + + /** + * 绘制干扰线 + * @param width + * @param height + * @param graphics + * @param count + */ + private static void drawLine(int width, int height, Graphics graphics, int count) { + Random random = new Random(); + + for (int i = 0; i < count; i++) { + graphics.setColor(randomFontColor()); + final int x = random.nextInt(width); + final int y = random.nextInt(height); + final int w = random.nextInt(width); + final int h = random.nextInt(height); + graphics.drawLine(x, y, w, h); + } + + } + + private static Color randomFontColor() { + return randomColor(150, 0); + } + + /** + * 随机生成背景 + * @return + */ + private static Color randomBgColor() { + return randomColor(256, 200); + } + + + /** + * 随机生成颜色 + * @param maxValue + * @param minValue + * @return + */ + private static Color randomColor(int maxValue, int minValue) { + Random random = new Random(); + + int r = minValue+random.nextInt(maxValue-minValue); + int g = minValue+random.nextInt(maxValue-minValue); + int b = minValue+random.nextInt(maxValue-minValue); + + Color color = new Color(r, g, b); + + return color; + } + + /** + * 生成验证码,默认长度4 + * @return + */ + public static String randomCode(){ + return randomCode(CODE_LENGTH); + } + /** + * 生成字符串 + * @param codeLength + * @return + */ + public static String randomCode(int codeLength) { + + StringBuilder captcha = new StringBuilder(); + Random random = new Random(); + + for (int i = 0; i < codeLength; i++) { + int index = random.nextInt(CODES.length());//生成0-字符串长度的数字 + captcha.append(CODES.charAt(index)); + } + + return captcha.toString(); + } + +} diff --git a/src/main/java/com/example/demo/Util/CheckIfNullUtil.java b/src/main/java/com/example/demo/Util/CheckIfNullUtil.java new file mode 100644 index 0000000..11a3f9c --- /dev/null +++ b/src/main/java/com/example/demo/Util/CheckIfNullUtil.java @@ -0,0 +1,7 @@ +package com.example.demo.Util; + +public class CheckIfNullUtil { + public static T defaultIfNull(T value, T defaultValue) { + return value != null ? value : defaultValue; + } +} diff --git a/src/main/java/com/example/demo/Util/JWTUtil.java b/src/main/java/com/example/demo/Util/JWTUtil.java new file mode 100644 index 0000000..7fdda9d --- /dev/null +++ b/src/main/java/com/example/demo/Util/JWTUtil.java @@ -0,0 +1,190 @@ +package com.example.demo.Util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.security.core.userdetails.UserDetails; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; +import java.util.Date; +import java.util.UUID; + +/** + * JWT的工具类 + */ +public class JWTUtil { + + //有效期为 + public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 *1000 一个小时 + + //设置 密钥 + public static final String JWT_KEY = "bobzyh"; + + public static String getUUID(){ + String token = UUID.randomUUID().toString().replaceAll("-", ""); + return token; + } + + /** + * 用户信息创建JWT,默认有效期30分钟 + * @param user + * @return + */ + public static String createJWT(UserDetails user) { + ObjectMapper mapper = new ObjectMapper(); + try { + String json = mapper.writeValueAsString(user); + System.out.println("用户的JSON"); + System.out.println(json); + return createJWT(json, JWT_TTL); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + /** + * 用户信息创建JWT, 指定有效期,单位秒 + * @param user + * @param ttlMillis + * @return + */ + public static String createJWT(UserDetails user, Long ttlMillis) { + ObjectMapper mapper = new ObjectMapper(); + try { + String json = mapper.writeValueAsString(user); + return createJWT(json, ttlMillis); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + /** + * 生成jtw + * @param subject token中要存放的数据(json格式) + * @return + */ + public static String createJWT(String subject) { + JwtBuilder builder = getJwtBuilder(subject, 30*60*1000L, getUUID());// 设置过期时间 + return builder.compact(); + } + + /** + * 生成jtw + * @param subject token中要存放的数据(json格式) + * @param ttlMillis token超时时间 + * @return + */ + public static String createJWT(String subject, Long ttlMillis) { + JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间 + return builder.compact(); + } + + private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) { + SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; //加密算法 + SecretKey secretKey = generalKey(); //密钥 + long nowMillis = System.currentTimeMillis(); //当前时间 + Date now = new Date(nowMillis); + if(ttlMillis==null){ + ttlMillis= JWTUtil.JWT_TTL; + } + long expMillis = nowMillis + ttlMillis; + Date expDate = new Date(expMillis); //过期时间 + return Jwts.builder() + .setId(uuid) //唯一的ID + .setSubject(subject) // 主题 可以是JSON数据 + .setIssuer("sg") // 签发者 + .setIssuedAt(now) // 签发时间 + .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥 + .setExpiration(expDate); + } + + /** + * 创建token + * @param id + * @param subject + * @param ttlMillis + * @return + */ + public static String createJWT(String id, String subject, Long ttlMillis) { + JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间 + return builder.compact(); + } + + /** + * 生成加密后的秘钥 secretKey + * @return + */ + public static SecretKey generalKey() { + byte[] encodedKey = Base64.getDecoder().decode(JWTUtil.JWT_KEY); + SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES"); + return key; + } + + /** + * 解析 + * + * @param jwt + * @return + * @throws Exception + */ + public static Claims parseJWT(String jwt) throws Exception { + SecretKey secretKey = generalKey(); + return Jwts.parser() + .setSigningKey(secretKey) + .parseClaimsJws(jwt) + .getBody(); + } + + /** + * 解析为用户 + * @param jwt + * @return + * @throws Exception + */ + public static UserDetails getUserDetails(String jwt, Class cls) throws Exception { + Claims claims = JWTUtil.parseJWT(jwt); + String json = claims.getSubject(); + ObjectMapper mapper = new ObjectMapper(); + UserDetails user = null; + user = mapper.readValue(json, cls); + + return user; + } + + public static UserDetails getUserDetailsList(String jwt, Class ...cls) throws Exception { + Claims claims = JWTUtil.parseJWT(jwt); + String json = claims.getSubject(); + ObjectMapper mapper = new ObjectMapper(); + if (cls != null && cls.length > 0) { + for (Class cl : cls) { + try { + UserDetails user = mapper.readValue(json, cl); + return user; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + } + return null; + } + + +// public static void main(String[] args) throws Exception { +// +// // 加密 +// String jwt = createJWT("2123"); +// System.out.println(jwt); +// +// // 解密 +// Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2Y2QzZGU0NWRiN2I0MjVlOWJlZTAzYzUyNjY2ODhhYiIsInN1YiI6IjIxMjMiLCJpc3MiOiJzZyIsImlhdCI6MTcxMDgzMTc4NCwiZXhwIjoxNzEwODM1Mzg0fQ.k6RPyIvKX-mrS26YbyaDNVLlihGqTQDeLj2gsrNokCk"); +// String subject = claims.getSubject(); +// System.out.println(subject); +// +// } + +} diff --git a/src/main/java/com/example/demo/Util/MD5Util.java b/src/main/java/com/example/demo/Util/MD5Util.java new file mode 100644 index 0000000..6257d53 --- /dev/null +++ b/src/main/java/com/example/demo/Util/MD5Util.java @@ -0,0 +1,39 @@ +package com.example.demo.Util; + +import java.security.MessageDigest; +import java.util.Base64; +import java.util.Base64.Encoder; + +public class MD5Util { + // MD5双重加密 使用salt + public static String getDBMD5(String str, String salt){ + return getMD5(getMD5(str)+salt); + } + + // MD5加密 + public static String getMD5(String str) { + + String newstr = null; + try { + //确定计算方法 + MessageDigest md5=MessageDigest.getInstance("MD5"); + + //加密后的字符串 + newstr=encryptBASE64(md5.digest(str.getBytes("utf-8"))); + + } catch (Exception e) { + // TODO: handle exception + } + + return newstr; + } + + private static String encryptBASE64(byte[] data) { + // BASE64Encoder encoder = new BASE64Encoder(); + // String encode = encoder.encode(data); + // 从JKD 9开始rt.jar包已废除,从JDK 1.8开始使用java.util.Base64.Encoder + Encoder encoder = Base64.getEncoder(); + String encode = encoder.encodeToString(data); + return encode; + } +} diff --git a/src/main/java/com/example/demo/Util/UploadUtil.java b/src/main/java/com/example/demo/Util/UploadUtil.java new file mode 100644 index 0000000..21c986d --- /dev/null +++ b/src/main/java/com/example/demo/Util/UploadUtil.java @@ -0,0 +1,54 @@ +package com.example.demo.Util; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.util.UUID; + +public class UploadUtil { + + /** + * 将文件保存到指定路径 + * @return + */ + public static String save(MultipartFile file, String path) { + + // 验证文件是不是传了 + if (file.getSize() <= 0) { + return null; + } + + // 验证文件夹是否存在 + File pathFile = new File(path); + if (!pathFile.exists()) { + // 创建 + if (!pathFile.mkdirs()) { + return null; + } + } + + // 生UUID作为新的文件名 + String fileName = UUID.randomUUID().toString(); + String oldName = file.getOriginalFilename(); + + if (oldName.lastIndexOf(".")>=0) { + String suffix = oldName.substring(oldName.lastIndexOf(".")); + fileName += suffix; + } + + // 创建一个文件流 + try (OutputStream out = new FileOutputStream(path + fileName) ){ + // 把上传的文件,写到这个流里面 + out.write(file.getBytes()); + + // 写成功了 + return fileName; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } + + return null; + } +} diff --git a/src/main/java/com/example/demo/config/WebConfig.java b/src/main/java/com/example/demo/config/WebConfig.java new file mode 100644 index 0000000..9a4045d --- /dev/null +++ b/src/main/java/com/example/demo/config/WebConfig.java @@ -0,0 +1,18 @@ +package com.example.demo.config; + +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configurable +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Value("${upload.path}") + private String path; + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/upload/**").addResourceLocations("file:" + path); + } +} diff --git a/src/main/java/com/example/demo/controller/ActivityController.java b/src/main/java/com/example/demo/controller/ActivityController.java new file mode 100644 index 0000000..8a5add9 --- /dev/null +++ b/src/main/java/com/example/demo/controller/ActivityController.java @@ -0,0 +1,66 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.entity.Activity; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.serviceImpl.ActivityServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/recharge/activity") +//SpringMVC的,为当前类的所有处理器方法,添加路径映射的前缀 +@RequiredArgsConstructor +// lombok的,添加一个包含所有final属性的构造器 +@Slf4j //lombok的,自动添加log的对象,用于日志打印 +@CrossOrigin +public class ActivityController { + + @Autowired + ActivityServiceImpl activityService; + + //添加活动管理信息 + @PostMapping("/add") + public Result add(@RequestBody Activity activity) { +// try { + System.out.println("------6---"); + int result=activityService.add(activity); + System.out.println(result); + return Result.success(); +// } catch (Exception e) { +// log.warn(Arrays.toString(e.getStackTrace())); +// return Result.error(e.getMessage()); +// } + + } + + //修改活动管理信息 + @PostMapping("/edit") + public Result edit(@RequestBody Activity activity){ + +// try { + Integer num =activityService.edit(activity); + return Result.success(num); +// } catch (Exception e) { +//// log.error(""+e); +//// return Result.error(e.getMessage()); +//// } + } + //查询活动管理信息--模糊+分页查询 + @PostMapping("/select") + public Result search(@RequestBody Page page){ + Integer pageNum = page.getPageNum(); + Integer pageSize=page.getPageSize(); + Activity activity= page.getActivity(); + if (ObjectUtils.isEmpty(pageNum)){ + return Result.success(activityService.search(activity)); + } + return Result.success(activityService.searchForPage(pageNum,pageSize,activity)); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/AdminController.java b/src/main/java/com/example/demo/controller/AdminController.java new file mode 100644 index 0000000..c85892d --- /dev/null +++ b/src/main/java/com/example/demo/controller/AdminController.java @@ -0,0 +1,62 @@ +package com.example.demo.controller; + + + +import com.example.demo.Util.JWTUtil; +import com.example.demo.domain.entity.Admin; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.sevice.AdminService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/admin") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class AdminController { + + + private final AdminService adminService; + + @PostMapping("/search") + public Result search(@RequestBody Page page){ + if(ObjectUtils.isEmpty(page.getPageNum())){ + return Result.success(adminService.search(page.getAdmin())); + } + else { + return Result.success(adminService.searchForPage(page.getPageNum(), page.getPageSize(), page.getAdmin())); + } + } + + @PostMapping("/login") + public Result login(@RequestBody Admin admin){ + + try { + admin = adminService.login(admin); + String token = JWTUtil.createJWT(admin); + admin.setPassword(null); + return Result.success(token,admin); + } catch (Exception e) { + e.printStackTrace(); + log.error(e.getMessage()); + return Result.error(e.getMessage()); + } + + } + @PostMapping("/userinfo") + public UserDetails getUserInfo(@RequestHeader("token") String token) { + try { + return JWTUtil.getUserDetailsList(token,Admin.class); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + +} diff --git a/src/main/java/com/example/demo/controller/AuditController.java b/src/main/java/com/example/demo/controller/AuditController.java new file mode 100644 index 0000000..7ac10ea --- /dev/null +++ b/src/main/java/com/example/demo/controller/AuditController.java @@ -0,0 +1,63 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.entity.Audit; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.sevice.AuditService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + +@RestController +@RequestMapping("/audit/audit") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class AuditController { + + private final AuditService auditService; + @PostMapping("/add") + public Result add(@RequestBody Audit audit){ + try { + auditService.add(audit); + return Result.success(); + }catch (Exception e){ + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } + @PostMapping("/edit") + public Result edit(@RequestBody Audit audit){ + try { + auditService.edit(audit); + return Result.success(); + }catch (Exception e){ + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } + @PostMapping + public Result search(@RequestBody Page page){ + if(ObjectUtils.isEmpty(page.getPageNum())){ + return Result.success(auditService.search(page.getAudit())); + } + else { + return Result.success(auditService.searchForPage(page.getPageNum(),page.getPageSize(),page.getAudit())); + } + } + @PostMapping("/refund") + public Result searchForPage(@RequestBody Page page){ + if(ObjectUtils.isEmpty(page.getPageNum())){ + return Result.success(auditService.searchForDetail(page.getConsumeDetail())); + } + else { + return Result.success(auditService.searchForConsumeDetail(page.getPageNum(), page.getPageSize(), page.getConsumeDetail())); + } + + } +} + diff --git a/src/main/java/com/example/demo/controller/ConsumeController.java b/src/main/java/com/example/demo/controller/ConsumeController.java new file mode 100644 index 0000000..457e3cc --- /dev/null +++ b/src/main/java/com/example/demo/controller/ConsumeController.java @@ -0,0 +1,71 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.entity.Detail; +import com.example.demo.domain.vo.DetailVo; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.serviceImpl.ConsumeServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/consume") +//SpringMVC的,为当前类的所有处理器方法,添加路径映射的前缀 +@RequiredArgsConstructor +// lombok的,添加一个包含所有final属性的构造器 +@Slf4j //lombok的,自动添加log的对象,用于日志打印 +@CrossOrigin +public class ConsumeController { + @Autowired + ConsumeServiceImpl consumeService; + @PostMapping("/add") +// public Result add(@RequestParam("userId") Integer userId, @RequestBody Detail detail){ + public Result add(@RequestBody Detail detail) throws Exception { +// try { + // System.out.println(userId+"-----------"); + //通过userid获取username,插入到detail +// User user=consumeService.getByUserId(userId); +// detail.setName(user.getName()); +// //添加所属地区 +// Admin admin=consumeService.getByadminId(detail.getAdminId()); +// detail.setArea(admin.getArea()); + Integer result= consumeService.insert(detail); + return Result.success(result); +// } catch (Exception e) { +// log.warn(Arrays.toString(e.getStackTrace())); +// return Result.error(e.getMessage()); +// } + } + + + + @PostMapping("/select") + public Result search(@RequestBody Page page){ + Integer pageNum = page.getPageNum(); + Integer pageSize = page.getPageSize(); + DetailVo detailVo = page.getDetailVo(); + if(ObjectUtils.isEmpty(pageNum)){ + return Result.success(consumeService.search(detailVo)); + } + else { + return Result.success(consumeService.searchForPage(pageNum,pageSize,detailVo)); + } + } + + + @PostMapping("/getDeatil/{jwcode}") + public Result getDeatil(@PathVariable("jwcode") Integer jwcode){ + + return Result.success(consumeService.getDeatil(jwcode)); + } + + @PostMapping("/getProduct") + public Result getProduct(@RequestParam("name") String name){ + System.out.println(name+"name"); + return Result.success( consumeService.getProduct(name)); + } +} diff --git a/src/main/java/com/example/demo/controller/DetailController.java b/src/main/java/com/example/demo/controller/DetailController.java new file mode 100644 index 0000000..b2c3340 --- /dev/null +++ b/src/main/java/com/example/demo/controller/DetailController.java @@ -0,0 +1,42 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.entity.Detail; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.sevice.DetailService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + + +@RestController +@RequestMapping("/detail") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class DetailController { + private final DetailService detailService; + @PostMapping("/add") + public Result add(@RequestBody Detail detail) { + try { + detailService.add(detail); + return Result.success(); + } catch (Exception e) { + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } + @PostMapping + public Result search(@RequestBody Page page) { + if(ObjectUtils.isEmpty(page.getPageNum())){ + return Result.success(detailService.getAllDetail(page.getDetail())); + } + else { + return Result.success(detailService.getDetailByPage(page.getPageNum(), page.getPageSize(), page.getDetail())); + } + } +} diff --git a/src/main/java/com/example/demo/controller/ProductController.java b/src/main/java/com/example/demo/controller/ProductController.java new file mode 100644 index 0000000..b1ef17e --- /dev/null +++ b/src/main/java/com/example/demo/controller/ProductController.java @@ -0,0 +1,23 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.entity.Product; +import com.example.demo.domain.vo.Result; +import com.example.demo.sevice.ProductService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/product") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class ProductController { + private final ProductService productService; + @PostMapping + public Result Product(@RequestBody Product product){ + return Result.success(productService.findAll(product)); + } +} + diff --git a/src/main/java/com/example/demo/controller/RateController.java b/src/main/java/com/example/demo/controller/RateController.java new file mode 100644 index 0000000..68bfc42 --- /dev/null +++ b/src/main/java/com/example/demo/controller/RateController.java @@ -0,0 +1,102 @@ +package com.example.demo.controller; + + + +import com.example.demo.domain.entity.Rate; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.sevice.RateService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + +@RestController +@RequestMapping("/rates") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class RateController { + private final RateService rateService; + + @PostMapping("/add") + public Result add(@RequestBody Rate rate) { + try { + rateService.add(rate); + return Result.success(); + } catch (Exception e) { + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } + @PostMapping("/update") // 将 PUT 改为 POST + public Result update(@RequestBody Rate rate) throws Exception { +// try { + rateService.edit(rate); + return Result.success(); +// } catch (Exception e) { +// log.warn(Arrays.toString(e.getStackTrace())); +// return Result.error(e.getMessage()); +// } + } +// @PutMapping("/update") +// public Result update(@RequestBody Rate rate) { +// try { +// rateService.edit(rate); +// return Result.success(); +// } catch (Exception e) { +// log.warn(Arrays.toString(e.getStackTrace())); +// return Result.error(e.getMessage()); +// } +// } + + @PostMapping("/delete/{rateId}") // 将 DELETE 改为 POST + public Result delete(@PathVariable("rateId") Integer rateId) { + try { + rateService.delete(rateId); + return Result.success(); + } catch (Exception e) { + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } +// @DeleteMapping("/{rateId}") +// public Result delete(@PathVariable("rateId") Integer rateId) { +// try { +// rateService.delete(rateId); +// return Result.success(); +// } catch (Exception e) { +// log.warn(Arrays.toString(e.getStackTrace())); +// return Result.error(e.getMessage()); +// } +// } + + // @GetMapping("/{rateId}") +// public Result get(@PathVariable Integer rateId) { +// return Result.success(rateService.getById(rateId)); +// } +// +// @GetMapping +// public Result search(Integer pageNum, Integer pageSize,Rate rate) { +// if(ObjectUtils.isEmpty(pageNum)){ +// return Result.success(rateService.search(rate)); +// }else{ +// return Result.success(rateService.searchForPage(pageNum,pageSize,rate)); +// } +// } + @PostMapping("/search") // 改为 POST 请求 + public Result search(@RequestBody Page page) { + Integer pageNum = page.getPageNum(); + Integer pageSize = page.getPageSize(); + Rate rate = page.getRate(); + + if (ObjectUtils.isEmpty(pageNum)) { + return Result.success(rateService.search(rate)); + } else { + return Result.success(rateService.searchForPage(pageNum, pageSize, rate)); + } + } +} diff --git a/src/main/java/com/example/demo/controller/RechargeController.java b/src/main/java/com/example/demo/controller/RechargeController.java new file mode 100644 index 0000000..552bf74 --- /dev/null +++ b/src/main/java/com/example/demo/controller/RechargeController.java @@ -0,0 +1,55 @@ +package com.example.demo.controller; + + + +import com.example.demo.domain.entity.Recharge; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.sevice.RechargeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + +@RestController +@RequestMapping("/recharge/recharge") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class RechargeController { + + private final RechargeService rechargeService; + + @PostMapping("/add") + public Result add(@RequestBody Recharge recharge) { + + try { + rechargeService.add(recharge); + return Result.success(); + } catch (Exception e) { + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } + @PostMapping("/edit") + public Result edit(@RequestBody Recharge recharge) { + try { + rechargeService.edit(recharge); + } catch (Exception e) { + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + return Result.success(); + } + @PostMapping + public Result search(@RequestBody Page page) { + if(ObjectUtils.isEmpty(page.getPageNum())){ + return Result.success(rechargeService.search(page.getRechargeVo())); + } + else { + return Result.success(rechargeService.searchForPage(page.getPageNum(), page.getPageSize(), page.getRechargeVo())); + } + } +} diff --git a/src/main/java/com/example/demo/controller/RefundController.java b/src/main/java/com/example/demo/controller/RefundController.java new file mode 100644 index 0000000..1ef48db --- /dev/null +++ b/src/main/java/com/example/demo/controller/RefundController.java @@ -0,0 +1,78 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.entity.Detail; +import com.example.demo.domain.vo.Page; +import com.example.demo.domain.vo.Result; +import com.example.demo.sevice.RefundService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + +@RestController +@RequestMapping("/refund") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class RefundController { + private final RefundService refundService; + + @PostMapping("/add") + public Result add(@RequestBody Detail detail) { +// try { + if (refundService.existsByContactId(detail.getContactId())) { + return Result.error("该订单已退款: " + detail.getContactId()); + } + refundService.add(detail); + refundService.addAudit(detail); + return Result.success(); +// } catch (Exception e) { +// log.warn(Arrays.toString(e.getStackTrace())); +// return Result.error(e.getMessage()); +//// } + } + + @PostMapping("/softDelete") + public Result softDelete(@RequestParam Integer detailId) { +// try { + // 获取旧的明细记录 + Detail oldDetail = refundService.selectByDetailId(detailId); + + if (oldDetail == null || oldDetail.getDetailFlag() ==0) { + return Result.error("该订单不存在: " + detailId); + } + refundService.softDelete(detailId); + return Result.success(); +// } catch (Exception e) { +// log.warn(Arrays.toString(e.getStackTrace())); +// return Result.error(e.getMessage()); +// } + } + + @PostMapping("/update") + public Result update(@RequestBody Detail newDetail) { + try { + refundService.edit(newDetail); + return Result.success(); + } catch (Exception e) { + log.warn(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } + + @PostMapping("/search") + public Result search(@RequestBody Page page) { + Integer pageNum = page.getPageNum(); + Integer pageSize = page.getPageSize(); + Detail detail = page.getDetail(); + + if (ObjectUtils.isEmpty(detail)) { + return Result.success(refundService.search(detail)); + }else{ + return Result.success(refundService.searchForPage(pageNum, pageSize,detail)); + } + } +} diff --git a/src/main/java/com/example/demo/controller/StatisticsController.java b/src/main/java/com/example/demo/controller/StatisticsController.java new file mode 100644 index 0000000..15538be --- /dev/null +++ b/src/main/java/com/example/demo/controller/StatisticsController.java @@ -0,0 +1,72 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.vo.Result; +import com.example.demo.domain.vo.Statistics; +import com.example.demo.sevice.StatisticsService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +@RestController +@RequestMapping("/statistics") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class StatisticsController { + @Autowired + private final StatisticsService statisticsService; + + @PostMapping("/a") + public Result count() { + Statistics statistics = statisticsService.getStatistics(); + return Result.success(statistics); + } + @PostMapping("/b") + public Result select() { + return Result.success(statisticsService.stats()); + } + //--------------------------------------------------------------------------------------// + @PostMapping("/getSumCoin") + public Result getSumCoin(){ + + return Result.success(statisticsService.getSumCoin()); + } + + @PostMapping("/getYearConsumeCoin") + public Result getYearConsumeCoin(){ + return Result.success(statisticsService.getYearConsumeCoin()); + } + @PostMapping("/getDayConsumeCoin") + public Result getDayConsumeCoin(){ + return Result.success(statisticsService.getDayConsumeCoin()); + } + + @PostMapping("/getMediuPayCoin") + public Result getMediuPayCoin(){ + return Result.success(statisticsService.getMediuPayCoin()); + } + + @PostMapping("/getMediuConsumeCoin") + public Result getMediuConsumeCoin(){ + return Result.success(statisticsService.getMediuConsumeCoin()); + } + + @PostMapping("/getMess/{jwcode}") + public Result getMess(@PathVariable("jwcode") Integer jwcode){ + return Result.success(statisticsService.getMess(jwcode)); + } + + @PostMapping("/getMediumAreaPay") + public Result getMediumAreaPay(){ + return Result.success(statisticsService.getMediumAreaPay()); + } + @PostMapping("/getMediumAreaConsume") + public Result getMediumAreaConsume(){ + return Result.success(statisticsService.getMediumAreaConsume()); + } + + +} diff --git a/src/main/java/com/example/demo/controller/UploadController.java b/src/main/java/com/example/demo/controller/UploadController.java new file mode 100644 index 0000000..423990e --- /dev/null +++ b/src/main/java/com/example/demo/controller/UploadController.java @@ -0,0 +1,26 @@ +package com.example.demo.controller; + + + +import com.example.demo.Util.UploadUtil; +import com.example.demo.domain.vo.Result; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequestMapping("/upload") +@CrossOrigin +public class UploadController { + @Value("${upload.path}") + private String path; + + @PostMapping + public Result upload(MultipartFile file) { + String fileName = UploadUtil.save(file,path); + return Result.success(fileName); + } +} diff --git a/src/main/java/com/example/demo/controller/UserController.java b/src/main/java/com/example/demo/controller/UserController.java new file mode 100644 index 0000000..8cf8d40 --- /dev/null +++ b/src/main/java/com/example/demo/controller/UserController.java @@ -0,0 +1,30 @@ +package com.example.demo.controller; + + +import com.example.demo.domain.vo.Result; +import com.example.demo.domain.vo.UserVo; +import com.example.demo.sevice.UserSevice; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; + +@RestController +@RequestMapping("/recharge/user") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class UserController { + private final UserSevice userSevice; + @PostMapping + public Result User(@RequestBody UserVo userVo) throws Exception { + try { + userSevice.search(userVo); + return Result.success(userSevice.search(userVo)); + }catch (Exception e) { + log.error(Arrays.toString(e.getStackTrace())); + return Result.error(e.getMessage()); + } + } +} diff --git a/src/main/java/com/example/demo/domain/entity/Activity.java b/src/main/java/com/example/demo/domain/entity/Activity.java new file mode 100644 index 0000000..e4e026c --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Activity.java @@ -0,0 +1,135 @@ +package com.example.demo.domain.entity; + + + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +@Data +public class Activity { + private Integer activityId ; + private Integer adminId; + private String dept; + private LocalDate startTime; + private LocalDate endTime; + private String activityName; + private BigDecimal rechargeRatio; + private LocalDateTime createTime; + private Integer activityFlag; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private String name; + private Integer status; + private Date startDate; + private Date endDate; + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getActivityFlag() { + return activityFlag; + } + + public void setActivityFlag(Integer activityFlag) { + this.activityFlag = activityFlag; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public BigDecimal getRechargeRatio() { + return rechargeRatio; + } + + public void setRechargeRatio(BigDecimal rechargeRatio) { + this.rechargeRatio = rechargeRatio; + } + + public String getActivityName() { + return activityName; + } + + public void setActivityName(String activityName) { + this.activityName = activityName; + } + + public LocalDate getEndTime() { + return endTime; + } + + public void setEndTime(LocalDate endTime) { + this.endTime = endTime; + } + + public LocalDate getStartTime() { + return startTime; + } + + public void setStartTime(LocalDate startTime) { + this.startTime = startTime; + } + + public String getDept() { + return dept; + } + + public void setDept(String dept) { + this.dept = dept; + } + + public Integer getAdminId() { + return adminId; + } + + public void setAdminId(Integer adminId) { + this.adminId = adminId; + } + + public Integer getActivityId() { + return activityId; + } + + public void setActivityId(Integer activityId) { + this.activityId = activityId; + } +} diff --git a/src/main/java/com/example/demo/domain/entity/Admin.java b/src/main/java/com/example/demo/domain/entity/Admin.java new file mode 100644 index 0000000..f2be10f --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Admin.java @@ -0,0 +1,65 @@ +package com.example.demo.domain.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.io.Serializable; +import java.util.*; + +@Data +@NoArgsConstructor +public class Admin implements UserDetails, Serializable { + private Integer adminId; + private String name; + private String username; + private String password; + private Integer permission; + private String area; + private String adminFlag; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createTime; + + @Override + @JsonIgnore + public Collection getAuthorities() { + Setauthorities = new HashSet<>(); + if(permission == 1){ + + authorities.add(new SimpleGrantedAuthority("ROLE_SUPER_ADMIN")); + }else if(permission == 2){ + authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); + } + return authorities; + } + @Override + @JsonIgnore + public boolean isAccountNonExpired() { + return UserDetails.super.isAccountNonExpired(); + } + + @Override + @JsonIgnore + public boolean isAccountNonLocked() { + return UserDetails.super.isAccountNonLocked(); + } + + @Override + @JsonIgnore + public boolean isCredentialsNonExpired() { + return UserDetails.super.isCredentialsNonExpired(); + } + + @Override + @JsonIgnore + public boolean isEnabled() { + return UserDetails.super.isEnabled(); + } +} + diff --git a/src/main/java/com/example/demo/domain/entity/Audit.java b/src/main/java/com/example/demo/domain/entity/Audit.java new file mode 100644 index 0000000..53b287b --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Audit.java @@ -0,0 +1,27 @@ +package com.example.demo.domain.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@NoArgsConstructor +public class Audit { + private Integer auditId; + private Integer jwcode; + private Integer rechargeId; + private Integer refundId; + private Integer adminId; + private String status; + private Integer AuditFlag; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createTime; + private Date startDate; + private Date endDate; + private String reson; + private Integer detailId; +} diff --git a/src/main/java/com/example/demo/domain/entity/Detail.java b/src/main/java/com/example/demo/domain/entity/Detail.java new file mode 100644 index 0000000..90c532e --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Detail.java @@ -0,0 +1,59 @@ +package com.example.demo.domain.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Date; + +@Data +@NoArgsConstructor +public class Detail { + private Integer detailId; + private String name; + private String jwcode; + private String area; + private Integer activityId; + private String rechargeWay; + private Integer productId; + private String consumePlatform; + private String consumeType; + private String refundType; + private String refundGoods; + private Integer contactId; + private String remark; + private BigDecimal rechargeCoin; + private BigDecimal freeCoin; + private BigDecimal taskCoin; + + private Integer adminId; + private Integer status; + private String updateType; + private Integer detailFlag; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createTime; + + private Date endDate; + private Date startDate; + private String uname; + private Integer firstRecharge; + + private String adminArea; + private String adminName; + private String userName; + private String auditStatus; + private String auditReson; + + + + // @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") +// @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private String productName; + private Integer refundId; + +} diff --git a/src/main/java/com/example/demo/domain/entity/Product.java b/src/main/java/com/example/demo/domain/entity/Product.java new file mode 100644 index 0000000..ffc9937 --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Product.java @@ -0,0 +1,26 @@ +package com.example.demo.domain.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Date; + +@Data +@NoArgsConstructor +public class Product { + private int productId; + private BigDecimal price; + private String name; + private Date listed_time; + private Date down_time; + private String remark; + private String subjects; + private String type; + private String productFlag; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + +} diff --git a/src/main/java/com/example/demo/domain/entity/Rate.java b/src/main/java/com/example/demo/domain/entity/Rate.java new file mode 100644 index 0000000..18c1368 --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Rate.java @@ -0,0 +1,24 @@ +package com.example.demo.domain.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +@Data +@NoArgsConstructor +public class Rate { + private Integer rateId; + private Date startTime; + private Date endTime; + private String currency; + private String exchangeRate; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createTime; + private Date updateTime; + private Integer adminId; + private String adminName; +} diff --git a/src/main/java/com/example/demo/domain/entity/Recharge.java b/src/main/java/com/example/demo/domain/entity/Recharge.java new file mode 100644 index 0000000..827ad5b --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/Recharge.java @@ -0,0 +1,35 @@ +package com.example.demo.domain.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@NoArgsConstructor +public class Recharge { + private Integer rechargeId; + private String jwcode; + private Integer activityId; + private BigDecimal paidGold; + private BigDecimal freeGold; + private BigDecimal rechargeGold; + private String payWay; + private String rechargeWay; + private Date rechargeTime; + private String rechargeVoucher; + private Integer adminId; + private String area; + + private String remark; + private Integer flag; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createTime; + private Date startDate; + private Date endDate; + +} diff --git a/src/main/java/com/example/demo/domain/entity/User.java b/src/main/java/com/example/demo/domain/entity/User.java new file mode 100644 index 0000000..1462ba9 --- /dev/null +++ b/src/main/java/com/example/demo/domain/entity/User.java @@ -0,0 +1,29 @@ +package com.example.demo.domain.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@NoArgsConstructor +public class User { + private Integer userId; + private String name; + private String jwcode; + private String password; + private String phone; + private String email; + private String gender; + private Date birthday; + private String head; + private Integer UserFlag; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createTime; + private String signature; + private BigDecimal sumgold; +} diff --git a/src/main/java/com/example/demo/domain/vo/ConsumeDetail.java b/src/main/java/com/example/demo/domain/vo/ConsumeDetail.java new file mode 100644 index 0000000..c203d2b --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/ConsumeDetail.java @@ -0,0 +1,42 @@ +package com.example.demo.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +@Data +@NoArgsConstructor +public class ConsumeDetail { + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Integer detailId; + private String name; + private String jwcode; + private String area; + private Integer activityId; + private String rechargeWay; + private String goods; + private String consumePlatform; + private String consumeType; + private String refundType; + private String refundGoods; + private Integer contactId; + private String remark; + private Double rechargeCoin; + private Double freeCoin; + private Double taskCoin; + private String conmmitName; + private Integer status; + private String updateType; + private Integer detailFlag; + private Date createTime; + private Integer adminId; + private String reson; + private String user; + private Date startDate; + private Date endDate; + private Integer auditId; + +} diff --git a/src/main/java/com/example/demo/domain/vo/DetailVo.java b/src/main/java/com/example/demo/domain/vo/DetailVo.java new file mode 100644 index 0000000..767b1ea --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/DetailVo.java @@ -0,0 +1,52 @@ +package com.example.demo.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +public class DetailVo { + private Integer detailId; + private String name; + private String jwcode; + private String area; + private Integer activityId; + private String rechargeWay; + private String goods; + private String consumePlatform; + private String consumeType; + private String refundType; + private String refundGoods; + private Integer contactId; + private String remark; + private Double rechargeCoin; + private Double freeCoin; + private Double taskCoin; + private Integer adminId; + private Integer status; + private String updateType; + private Integer detailFlag; + // @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") +// @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + //搜索消费时间 + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime searchStartTime; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime searchEndTime; + + //提交人姓名 + private String adminName; + + //消费金币总数 + private Integer totalCoin; + + // + private String productName; + private String userName; +} diff --git a/src/main/java/com/example/demo/domain/vo/Page.java b/src/main/java/com/example/demo/domain/vo/Page.java new file mode 100644 index 0000000..a539b04 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/Page.java @@ -0,0 +1,105 @@ +package com.example.demo.domain.vo; + + +import com.example.demo.domain.entity.*; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +public class Page { + private Integer pageNum; + private Integer pageSize; + + private RechargeVo rechargeVo; + private Activity activity; + private Rate rate; + private Audit audit; + private ConsumeDetail consumeDetail; + private Detail detail; + private DetailVo detailVo; + private Admin admin; + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public RechargeVo getRechargeVo() { + return rechargeVo; + } + + public void setRechargeVo(RechargeVo rechargeVo) { + this.rechargeVo = rechargeVo; + } + + public Activity getActivity() { + return activity; + } + + public void setActivity(Activity activity) { + this.activity = activity; + } + + public Rate getRate() { + return rate; + } + + public void setRate(Rate rate) { + this.rate = rate; + } + + public Audit getAudit() { + return audit; + } + + public void setAudit(Audit audit) { + this.audit = audit; + } + + public ConsumeDetail getConsumeDetail() { + return consumeDetail; + } + + public void setConsumeDetail(ConsumeDetail consumeDetail) { + this.consumeDetail = consumeDetail; + } + + public Detail getDetail() { + return detail; + } + + public void setDetail(Detail detail) { + this.detail = detail; + } + + public DetailVo getDetailVo() { + return detailVo; + } + + public void setDetailVo(DetailVo detailVo) { + this.detailVo = detailVo; + } + + public Admin getAdmin() { + return admin; + } + + public void setAdmin(Admin admin) { + this.admin = admin; + } +} + + diff --git a/src/main/java/com/example/demo/domain/vo/RechargeVo.java b/src/main/java/com/example/demo/domain/vo/RechargeVo.java new file mode 100644 index 0000000..c2667c5 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/RechargeVo.java @@ -0,0 +1,40 @@ +package com.example.demo.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +@Data +@NoArgsConstructor +public class RechargeVo { + + private Integer rechargeId; + private String jwcode; + private Integer activityId; + private Double paidGold; + private Double freeGold; + private Double rechargeGold; + private String payWay; + private String rechargeWay; + private Date rechargeTime; + private String rechargeVoucher; + private Integer adminId; + private String area; + + + private String remark; + private Integer flag; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date createTime; + private Date startDate; + private Date endDate; + private String username; + private String activityName; + private Integer status; + private String reson; + private String name; + private Integer auditId; +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/Result.java b/src/main/java/com/example/demo/domain/vo/Result.java new file mode 100644 index 0000000..7ca93f6 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/Result.java @@ -0,0 +1,45 @@ +package com.example.demo.domain.vo; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Result { + private Integer code; + private String msg; + private Object data; + + public static Result success(Integer code, String msg, Object data) { + return new Result(code, msg, data); + } + public static Result success(Integer code, Object data) { + return success(code, "操作成功", data); + } + public static Result success(String msg, Object data) {return success(200, msg, data);} + public static Result success(Object data){ + return success(200, data); + } + public static Result success(){ + return success(null); + } + + public static Result error(Integer code, String msg, Object data){ + return new Result(code, msg, data); + } + public static Result error(Integer code, String msg){ + return error(code, msg, null); + } + public static Result error(String msg){ + return error(0, msg); + } + + public String toJson() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(this); + } +} diff --git a/src/main/java/com/example/demo/domain/vo/Statistics.java b/src/main/java/com/example/demo/domain/vo/Statistics.java new file mode 100644 index 0000000..2860e65 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/Statistics.java @@ -0,0 +1,46 @@ +package com.example.demo.domain.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@NoArgsConstructor +public class Statistics { + private BigDecimal rechargeSumCoin; + private BigDecimal freeSumCoin; + private BigDecimal taskSumCoin; + private BigDecimal totalSumCoin; + private BigDecimal rechargeYesterdaySumCoin; + private BigDecimal freeYesterdaySumCoin; + private BigDecimal taskYesterdaySumCoin; + private BigDecimal totalYesterdaySumCoin; + private Integer rechargeCount; + private Integer rechargeCountThisWeek ; + private Integer rechargeCountLastWeek ; + private BigDecimal weekOverWeekRate; + private Integer rechargeCountToday; + private Integer rechargeCountYesterday; + private BigDecimal dayOverDayRate; + private BigDecimal totalCoinSystemSum; + private BigDecimal totalERPSum; + private BigDecimal totalHomilyChartSum; + private BigDecimal totalHomilyLinkSum; + private BigDecimal rechargeCoinSystemSum; + private BigDecimal freeCoinSystemSum; + private BigDecimal taskCoinSystemSum; + private BigDecimal rechargeERPSum; + private BigDecimal freeERPSum; + private BigDecimal taskERPSum; + private BigDecimal rechargeHomilyChartSum; + private BigDecimal freeHomilyChartSum; + private BigDecimal taskHomilyChartSum; + private BigDecimal rechargeHomilyLinkSum; + private BigDecimal freeHomilyLinkSum; + private BigDecimal taskHomilyLinkSum; + private String subject; + private String consumePlatform; + private Integer firstRechargeCountYesterday; + +} diff --git a/src/main/java/com/example/demo/domain/vo/Statisticss.java b/src/main/java/com/example/demo/domain/vo/Statisticss.java new file mode 100644 index 0000000..32928de --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/Statisticss.java @@ -0,0 +1,18 @@ +package com.example.demo.domain.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@NoArgsConstructor +public class Statisticss { + + private List CoinSystemSum; + private List ERPSum; + private List HomilyChartSum; + private List HomilyLinkSum; + +} diff --git a/src/main/java/com/example/demo/domain/vo/SumCoin.java b/src/main/java/com/example/demo/domain/vo/SumCoin.java new file mode 100644 index 0000000..88f8855 --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/SumCoin.java @@ -0,0 +1,73 @@ +package com.example.demo.domain.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class SumCoin { + + //当前金币余量 充值金币 + private Double todayRecharge; + //当前金币余量 免费金币 + private Double todayFree; + //当前金币余量 任务金币 + private Double todayTask; + //当前金币余量 总金币 + private Double todayTotalCoin; + //前一天金币余量 充值金币 + private Double yesterdayRecharge; + //前一天金币余量 免费金币 + private Double yesterdayFree; + //前一天金币余量 任务金币 + private Double yesterdayTask; + //前一天金币余量 总金币 + private Double yesterdayTotalCoin; + //当前金币余量与前一天金币余量之差 + private Double coinDifference; + + + //全年累计消耗金币数 消费总数 + private Double yearConsumeCoin; + //全年累计消耗金币数 退款金币 + private Double yearRefundCoin; + //全年累计消耗金币数 消耗总金币 + private Double yearsumCoin; + + + //全年累计消耗金币数--昨日新增消耗 消费金币 + private Double dayConsumeCoin; + //全年累计消耗金币数--昨日新增消耗 退款总金币 + private Double dayRefundCoin; + //全年累计消耗金币数--昨日新增消耗 消耗总金币 + private Double daysumCoin; + + + //全年累计消耗金币数--下面 消耗充值金币 + private Double yearSumRechargeCoin; + //全年累计消耗金币数--下面 消耗免费金币 + private Double yearSumFreeCoin; + //全年累计消耗金币数--下面 消耗任务金币 + private Double yearSumTaskCoin; + + + //中间-11个月 每月充值金币 + private Double rechargeSumCoin; + //中间-11个月 每月免费金币 + private Double freeSumCoin; + //中间-11个月 每月任务金币 + private Double taskSumCoin; + private String month; + + + private Integer jwcode; + private String area; + + + private Double totalRechargeRefund; + private Double totalTaskRefund; + private Double totalFreeRefund; + private Double totalRecharge; + private Double totalFree; + private Double totalTask; +} diff --git a/src/main/java/com/example/demo/domain/vo/UserVo.java b/src/main/java/com/example/demo/domain/vo/UserVo.java new file mode 100644 index 0000000..f2e485a --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/UserVo.java @@ -0,0 +1,22 @@ +package com.example.demo.domain.vo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@NoArgsConstructor +public class UserVo { + private String jwcode; + private String name; + private Date firstRechargeDate; + private BigDecimal totalRechargeGold; + private BigDecimal totalSpendGold; + private Integer rechargeTimes; + private Integer spendTimes; + private Integer pendingRechargeTimes; + private Integer pendingSpendTimes; + private Integer sumgold; +} diff --git a/src/main/java/com/example/demo/mapper/ActivityMapper.java b/src/main/java/com/example/demo/mapper/ActivityMapper.java new file mode 100644 index 0000000..6d8421e --- /dev/null +++ b/src/main/java/com/example/demo/mapper/ActivityMapper.java @@ -0,0 +1,66 @@ +package com.example.demo.mapper; + + + +import com.example.demo.domain.entity.Activity; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface ActivityMapper { + + //增加活动信息 + @Insert({"insert into activity", + "(admin_id,start_time,end_time,recharge_ratio,activity_name,activity_flag,create_time) " , + "values", + "(#{adminId},#{startTime},#{endTime},#{rechargeRatio},#{activityName},1,now())" + }) + @Options(useGeneratedKeys = true,keyColumn = "activity_id",keyProperty = "activityId") + int add(Activity activity); + + +// 修改活动信息 + @Update({ + "" + }) + int edit(Activity activity); + + + //查询--根据活动id查询活动信息 + @Select({ + "select activity_id from activity where activity_id=#{activityId}" + }) + Activity selectById(Integer activityId); + + //模糊查询--根据活动id查询活动信息 + @Select({ + "" + + }) + List select(Activity activity); + // + + +} diff --git a/src/main/java/com/example/demo/mapper/AdminMapper.java b/src/main/java/com/example/demo/mapper/AdminMapper.java new file mode 100644 index 0000000..776bc21 --- /dev/null +++ b/src/main/java/com/example/demo/mapper/AdminMapper.java @@ -0,0 +1,58 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Admin; +import org.apache.ibatis.annotations.*; + + +import java.util.List; + +@Mapper +public interface AdminMapper { + @Insert({ + "insert into admin", + "(name,username,password,permission,area,admin_flag,create_time)", + "values", + "(#{name},#{username},,#{password},#{permission},#{area},#{admin_flag},now())" + }) + @Options(useGeneratedKeys = true,keyColumn = "admin_id",keyProperty = "adminId") + int insert(Admin admin); + + @Update({ + "" + }) + int update(Admin admin); + @Select({ + "select * from admin", + "where admin_id=#{adminId}" + }) + Admin selectById(Integer adminId); + @Select({ + "select * from admin", + "where username=#{username}" + }) + Admin selectByName(String username); + @Select({ + "" + }) + List select(Admin admin); +} diff --git a/src/main/java/com/example/demo/mapper/AuditMapper.java b/src/main/java/com/example/demo/mapper/AuditMapper.java new file mode 100644 index 0000000..3200df2 --- /dev/null +++ b/src/main/java/com/example/demo/mapper/AuditMapper.java @@ -0,0 +1,71 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Audit; +import com.example.demo.domain.vo.ConsumeDetail; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +@Mapper +public interface AuditMapper { + + @Insert({ + "INSERT INTO audit", + "(jwcode,recharge_id,refund_id,admin_id,reson,detail_id,status,audit_flag)", + "values", + "(#{jwcode},#{rechargeId},#{refundId},#{adminId},#{reson},#{detailId},0,1)" + }) + + int insert(Audit audit); + @Update({ + "" + }) + int update(Audit audit); + + @Select({ + "" + }) + List select(Audit Audit); + @Select({ + "" + }) + List selectCon(ConsumeDetail consumeDetail); +} diff --git a/src/main/java/com/example/demo/mapper/ConsumeMapper.java b/src/main/java/com/example/demo/mapper/ConsumeMapper.java new file mode 100644 index 0000000..ed54eb8 --- /dev/null +++ b/src/main/java/com/example/demo/mapper/ConsumeMapper.java @@ -0,0 +1,82 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Admin; +import com.example.demo.domain.entity.Detail; +import com.example.demo.domain.entity.Product; +import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.DetailVo; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface ConsumeMapper { + + //通过id查询user全部信息 + @Select({ + "select * from user where user_id=#{userId}" + }) + User getByUserId(Integer userId); + + //通过id查询admin全部信息 + @Select({ + "select * from admin where admin_id=#{adminId}" + }) + Admin getByadminId(@Param("adminId") Integer adminId); + //新增消费记录 + @Insert({ + "insert into detail", + "(jwcode,activity_id,recharge_way,product_id,consume_platform,consume_type,refund_type,refund_goods,contact_id,remark,recharge_coin,free_coin,task_coin,admin_id,update_type,detail_flag,create_time)", + "values", + "(#{jwcode},#{activityId},#{rechargeWay},#{productId},'金币系统','购买商品',#{refundType},#{refundGoods},#{contactId},#{remark},#{rechargeCoin},#{freeCoin},#{taskCoin},#{adminId},#{updateType},1,now())" + }) +// 获取自增主键 + @Options(useGeneratedKeys = true,keyColumn = "detail_id",keyProperty = "detailId") + int insert(Detail detail); + + + + //userName + //模糊分页查询,查询消费明细 + @Select({ + "" + }) + List select(DetailVo detailVo); + + + //查询消费信息 + @Select({ + "select * ,product.name as productName from detail " , + "inner join product on detail.product_id= product.product_id ", + "where `detail_flag`=1 AND update_type = '消费' and jwcode=#{jwcode}" + }) + List getDeatil(Integer jwcode); + + + //查询消费信息 + @Select({ + "select * from product", + " where product_flag=1 and name=#{name}", + "GROUP BY name" + }) + List getProduct(String name); + + + +} diff --git a/src/main/java/com/example/demo/mapper/DetailMapper.java b/src/main/java/com/example/demo/mapper/DetailMapper.java new file mode 100644 index 0000000..3af8f44 --- /dev/null +++ b/src/main/java/com/example/demo/mapper/DetailMapper.java @@ -0,0 +1,46 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Detail; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface DetailMapper { + + @Insert({ + "insert into detail", + "(jwcode,activity_id,recharge_way,product_id,consume_platform,consume_type,refund_type,refund_goods," + + "contact_id,remark,recharge_coin,free_coin,task_coin,admin_id,update_type,detail_flag,create_time,first_recharge)", + "values ", + "(#{jwcode},#{activityId},#{rechargeWay},#{productId},#{consumePlatform},#{consumeType},#{refundType}" + + ",#{refundGoods},#{contactId},#{remark},#{rechargeCoin}" + + ",#{freeCoin},#{taskCoin},#{adminId},#{updateType},1,now(),#{firstRecharge})" + }) + @Options(useGeneratedKeys = true,keyColumn = "detail_id",keyProperty = "detailId") + int add(Detail detail); + @Select({ + "SELECT * from detail where detail =#{detail}" + }) + Detail selectById(Integer id); + @Select({ + "" + + }) + List select(Detail detail); +} diff --git a/src/main/java/com/example/demo/mapper/ProductMapper.java b/src/main/java/com/example/demo/mapper/ProductMapper.java new file mode 100644 index 0000000..e66b1f8 --- /dev/null +++ b/src/main/java/com/example/demo/mapper/ProductMapper.java @@ -0,0 +1,16 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Product; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface ProductMapper { + @Select({ + "select * from product" + }) + public List findAll(Product product); +} diff --git a/src/main/java/com/example/demo/mapper/RateMapper.java b/src/main/java/com/example/demo/mapper/RateMapper.java new file mode 100644 index 0000000..875ebfa --- /dev/null +++ b/src/main/java/com/example/demo/mapper/RateMapper.java @@ -0,0 +1,68 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Rate; +import org.apache.ibatis.annotations.*; +import org.apache.ibatis.annotations.Mapper; + + +import java.util.List; + +@Mapper +public interface RateMapper { + + @Insert({ + "insert into rate", + "(start_time,end_time,currency,exchange_rate,create_time,update_time,admin_id)", + "values", + "(#{startTime},#{endTime},#{currency},#{exchangeRate},now(),#{updateTime},#{adminId})" + }) +// 获取自增主键 + @Options(useGeneratedKeys = true,keyColumn = "rate_id",keyProperty = "rateId") + int insert(Rate rate); + + @Delete({ + "delete from rate where rate_id=#{rateId}" + }) + int deleteById(Integer rateId); + + @Update({ + "" + }) + int update(Rate rate); + + @Select({ + "select rate_id from rate where rate_id=#{rateId}" + }) + Rate selectById(Integer rateId); + + @Select({ + "" + + }) + List select(Rate rate); +} diff --git a/src/main/java/com/example/demo/mapper/RechargeMapper.java b/src/main/java/com/example/demo/mapper/RechargeMapper.java new file mode 100644 index 0000000..7e1a87f --- /dev/null +++ b/src/main/java/com/example/demo/mapper/RechargeMapper.java @@ -0,0 +1,56 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Recharge; +import com.example.demo.domain.vo.RechargeVo; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface RechargeMapper { + + @Insert({ + "INSERT INTO recharge", + "(jwcode,activity_id,paid_gold,free_gold,recharge_gold,pay_way,recharge_way,recharge_time,recharge_voucher,admin_id,remark,flag)", + "values ", + "(#{jwcode},#{activityId},#{paidGold},#{freeGold},#{rechargeGold},#{payWay},#{rechargeWay},#{rechargeTime},#{rechargeVoucher},#{adminId},#{remark},1)" + }) + @Options(useGeneratedKeys = true,keyColumn = "recharge_id",keyProperty = "rechargeId") + int insert(Recharge recharge); + + @Update({ + "" + }) + int update(Recharge recharge); + + @Select({ + "" + }) + List select(RechargeVo rechargeVo); +//根据jwcode和充值类型判断有没有,有首充标识设为0,否者设为1 + @Select({"select count(*) from detail", + "where jwcode=#{jwcode} and update_type='充值'"}) + int getAllByjwAndup(String jwcode); +} diff --git a/src/main/java/com/example/demo/mapper/RefundMapper.java b/src/main/java/com/example/demo/mapper/RefundMapper.java new file mode 100644 index 0000000..1e0517b --- /dev/null +++ b/src/main/java/com/example/demo/mapper/RefundMapper.java @@ -0,0 +1,67 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.Detail; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +@Mapper +public interface RefundMapper { + + @Insert({ + "insert into detail", + "(jwcode,refund_type,refund_goods,contact_id,recharge_coin,free_coin,task_coin,remark,admin_id,create_time,update_type)", + "values", + "(#{jwcode},#{refundType},#{refundGoods},#{contactId},#{rechargeCoin},#{freeCoin},#{taskCoin},#{remark},#{adminId},now(),'退款')" + }) + @Options(useGeneratedKeys = true, keyColumn = "detail_id", keyProperty = "detailId") + int insert(Detail detail); + + @Insert({ + "insert into audit", + "(jwcode,refund_id,admin_id,create_time,detail_id)", + "values", + "(#{jwcode},#{detailId},#{adminId},now(),#{detailId})" + }) + int insertAudit(Detail detail); + + // 检查 contactId 是否存在 + @Select("SELECT EXISTS (SELECT 1 FROM detail WHERE contact_id = #{contactId})") + boolean existsByContactId(@Param("contactId") Integer contactId); + + @Update("update detail set detail_flag = 0 where detail_id = #{detailId}") + int update(@Param("detailId") Integer detailId); + + @Select("select * from detail where detail_id = #{detailId} and detail_flag = 1") + Detail selectByDetailId(Integer detailId); + + + @Select({ + "" + }) + List select(Detail detail); +} diff --git a/src/main/java/com/example/demo/mapper/StatisticsMapper.java b/src/main/java/com/example/demo/mapper/StatisticsMapper.java new file mode 100644 index 0000000..9fdfa8a --- /dev/null +++ b/src/main/java/com/example/demo/mapper/StatisticsMapper.java @@ -0,0 +1,269 @@ +package com.example.demo.mapper; + + + +import com.example.demo.domain.vo.Statistics; +import com.example.demo.domain.vo.SumCoin; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface StatisticsMapper { + //全年累计金币数 + @Select("SELECT SUM(recharge_coin) AS rechargeSumCoin, " + + " SUM(free_coin) AS freeSumCoin, " + + " SUM(task_coin) AS taskSumCoin, " + + " (SUM(recharge_coin) + SUM(free_coin) + SUM(task_coin)) AS totalSumCoin " + + "FROM `detail` " + + "WHERE update_type = '充值' " + + " AND create_time >= '2024-01-01' " + + " AND create_time < NOW()") + Statistics getTotalYearCoin(); + + //昨日新增 + @Select("SELECT SUM(recharge_coin) AS rechargeYesterdaySumCoin, " + + " SUM(free_coin) AS freeYesterdaySumCoin, " + + " SUM(task_coin) AS taskYesterdaySumCoin, " + + " (SUM(recharge_coin) + SUM(free_coin) + SUM(task_coin)) AS totalYesterdaySumCoin " + + "FROM `detail` " + + "WHERE update_type = '充值' " + + " AND create_time >= CURDATE() - INTERVAL 1 DAY " + + " AND create_time < CURDATE()") + Statistics getYesterdayNewCoin(); + + //全年累计充值人数 + @Select("SELECT COUNT(jwcode) AS rechargeCount " + + "FROM `detail` " + + "WHERE update_type = '充值' " + + " AND create_time >= '2024-01-01' " + + " AND create_time < NOW()") + int getYearRechargeCount(); + + //这周充值数量 + @Select("SELECT COUNT(jwcode) AS rechargeCountThisWeek " + + "FROM `detail` WHERE update_type = '充值' AND YEARWEEK(create_time, 1) = YEARWEEK(CURDATE(), 1)") + int getRechargeCountThisWeek(); + + //上周充值数量 + @Select("SELECT COUNT(jwcode) AS rechargeCountLastWeek " + + "FROM `detail` WHERE update_type = '充值' AND YEARWEEK(create_time, 1) = YEARWEEK(CURDATE() - INTERVAL 1 WEEK, 1)") + int getRechargeCountLastWeek(); + + //今天的充值数量 + @Select("SELECT COUNT(jwcode) AS rechargeCountToday " + + "FROM `detail` WHERE update_type = '充值' AND create_time >= CURDATE()") + int getRechargeCountToday(); + + //昨天的充值数量 + @Select("SELECT COUNT(jwcode) AS rechargeCountYesterday " + + "FROM `detail` WHERE update_type = '充值' AND create_time >=CURDATE() - INTERVAL 1 DAY AND create_time < CURDATE();") + int getRechargeCountYesterday(); + + //昨日新增首充 + @Select("SELECT COUNT(jwcode) AS firstRechargeCountYesterday "+ + "FROM `detail` WHERE update_type = '充值' AND create_time >=CURDATE() - INTERVAL 1 DAY AND create_time < CURDATE() AND first_recharge = 1") + int getFirstRechargeCountYesterday(); + + //金币系统消费 + @Select("SELECT p.subjects AS subject, " + + " d.consume_platform,"+ + " SUM(d.recharge_coin) AS rechargeCoinSystemSum, " + + " SUM(d.free_coin) AS freeCoinSystemSum, " + + " SUM(d.task_coin) AS taskCoinSystemSum, " + + " (SUM(d.recharge_coin) + SUM(d.free_coin) + SUM(d.task_coin)) AS totalCoinSystemSum " + + "FROM detail d " + + "JOIN product p ON d.product_id = p.product_id " + + "WHERE d.update_type = '消费' AND " + + " d.consume_platform = '金币系统' " + + "GROUP BY p.subjects ") + List getCoinSystemSum(); + + //ERP消费 + @Select("SELECT p.subjects AS subject, " + + " d.consume_platform,"+ + " SUM(d.recharge_coin) AS rechargeERPSum, " + + " SUM(d.free_coin) AS freeERPSum, " + + " SUM(d.task_coin) AS taskERPSum, " + + " (SUM(d.recharge_coin) + SUM(d.free_coin) + SUM(d.task_coin)) AS totalERPSum " + + "FROM detail d " + + "JOIN product p ON d.product_id = p.product_id " + + "WHERE d.update_type = '消费' AND " + + " d.consume_platform = 'ERP系统' " + + "GROUP BY p.subjects ") + List getERPSum(); + // //HomilyChart消费 + @Select("SELECT p.subjects AS subject, " + + " d.consume_platform,"+ + " SUM(d.recharge_coin) AS rechargeHomilyChartSum, " + + " SUM(d.free_coin) AS freeHomilyChartSum, " + + " SUM(d.task_coin) AS taskHomilyChartSum, " + + " (SUM(d.recharge_coin) + SUM(d.free_coin) + SUM(d.task_coin)) AS totalHomilyChartSum " + + "FROM detail d " + + "JOIN product p ON d.product_id = p.product_id " + + "WHERE d.update_type = '消费' AND " + + " d.consume_platform = 'HomilyChart' " + + "GROUP BY p.subjects ") + List getHomilyChartSum(); + + // //HomilyLink消费 + @Select("SELECT p.subjects AS subject, " + + " d.consume_platform,"+ + " SUM(d.recharge_coin) AS rechargeHomilyLinkSum, " + + " SUM(d.free_coin) AS freeHomilyLinkSum, " + + " SUM(d.task_coin) AS taskHomilyLinkSum, " + + " (SUM(d.recharge_coin) + SUM(d.free_coin) + SUM(d.task_coin)) AS totalHomilyLinkSum " + + "FROM detail d " + + "JOIN product p ON d.product_id = p.product_id " + + "WHERE d.update_type = '消费' AND " + + " d.consume_platform = 'HomilyChart' " + + "GROUP BY p.subjects ") + List getHomilyLinkSum(); +//--------------------------------------------------------------------------------------------// + + @Select({"SELECT today.rechargeSumCoin AS todayRecharge," , + "yesterday.rechargeSumCoin AS yesterdayRecharge," , + "today.freeSumCoin AS todayFree,", + "yesterday.freeSumCoin AS yesterdayFree," , + "today.taskSumCoin AS todayTask," , + "yesterday.taskSumCoin AS yesterdayTask," , + "(today.rechargeSumCoin + today.freeSumCoin + today.taskSumCoin) AS todayTotalCoin," , + "(yesterday.rechargeSumCoin + yesterday.freeSumCoin + yesterday.taskSumCoin) AS yesterdayTotalCoin," , + "((today.rechargeSumCoin + today.freeSumCoin + today.taskSumCoin) -(yesterday.rechargeSumCoin + yesterday.freeSumCoin + yesterday.taskSumCoin)) AS coinDifference" , + "FROM (SELECT SUM(recharge_coin) AS rechargeSumCoin, SUM(free_coin) AS freeSumCoin, SUM(task_coin) AS taskSumCoin FROM detail WHERE create_time <= CURRENT_TIMESTAMP) AS today" , + "JOIN ( SELECT SUM(recharge_coin) AS rechargeSumCoin,SUM(free_coin) AS freeSumCoin, SUM(task_coin) AS taskSumCoin FROM detail WHERE DATE(create_time) <= CURDATE() - INTERVAL 1 DAY) AS yesterday"}) + SumCoin getSumCoin(); + + + + + + @Select({"SELECT SUM(CASE WHEN update_type = '消费' THEN recharge_coin ELSE 0 END) AS yearRecharge," , + "SUM(CASE WHEN update_type = '消费' THEN free_coin ELSE 0 END) AS yearFree," + + " SUM(CASE WHEN update_type = '消费' THEN task_coin ELSE 0 END) AS yearTask," + + " SUM(CASE WHEN update_type = '消费' THEN recharge_coin + free_coin + task_coin ELSE 0 END) AS yearConsumeCoin,", + " SUM(CASE WHEN update_type = '退款' THEN recharge_coin ELSE 0 END) AS totalRechargeRefund," , + " SUM(CASE WHEN update_type = '退款' THEN free_coin ELSE 0 END) AS totalFreeRefund," , + " SUM(CASE WHEN update_type = '退款' THEN task_coin ELSE 0 END) AS totalTaskRefund," , + " SUM(CASE WHEN update_type = '退款' THEN recharge_coin + free_coin + task_coin ELSE 0 END) AS yearRefundCoin," , + " SUM(CASE WHEN update_type = '消费' THEN recharge_coin + free_coin + task_coin ELSE 0 END)+SUM(CASE WHEN update_type = '退款' THEN recharge_coin + free_coin + task_coin ELSE 0 END) AS yearsumCoin,", + " SUM(CASE WHEN update_type IN ('消费', '退款') THEN recharge_coin ELSE 0 END) AS yearSumRechargeCoin,", + " SUM(CASE WHEN update_type IN ('消费', '退款') THEN free_coin ELSE 0 END) AS yearSumFreeCoin,", + " SUM(CASE WHEN update_type IN ('消费', '退款') THEN task_coin ELSE 0 END) AS yearSumTaskCoin", + "FROM `detail`WHERE YEAR(create_time) = YEAR(CURRENT_DATE)" , + " AND create_time <= NOW()"}) + SumCoin getYearConsumeCoin(); + + @Select({"SELECT SUM(CASE WHEN update_type = '消费' THEN recharge_coin ELSE 0 END) AS todayRecharge," , + "SUM(CASE WHEN update_type = '消费' THEN free_coin ELSE 0 END) AS todayFree," + + " SUM(CASE WHEN update_type = '消费' THEN task_coin ELSE 0 END) AS todayTask," + + " SUM(CASE WHEN update_type = '消费' THEN recharge_coin + free_coin + task_coin ELSE 0 END) AS dayConsumeCoin,", + " SUM(CASE WHEN update_type = '退款' THEN recharge_coin ELSE 0 END) AS total_recharge_refund," , + " SUM(CASE WHEN update_type = '退款' THEN free_coin ELSE 0 END) AS total_free_refund," , + " SUM(CASE WHEN update_type = '退款' THEN task_coin ELSE 0 END) AS total_task_refund," , + " SUM(CASE WHEN update_type = '退款' THEN recharge_coin + free_coin + task_coin ELSE 0 END) AS dayRefundCoin," , + " SUM(CASE WHEN update_type = '消费' THEN recharge_coin + free_coin + task_coin ELSE 0 END)+SUM(CASE WHEN update_type = '退款' THEN recharge_coin + free_coin + task_coin ELSE 0 END) AS daysumCoin", + "FROM `detail` WHERE DATE(create_time) = CURDATE() - INTERVAL 1 DAY"}) + SumCoin getDayConsumeCoin(); + + +// @Select({"SELECT DATE_FORMAT(create_time, '%Y-%m') AS month," , +// " SUM(recharge_coin) AS rechargeSumCoin," , +// " SUM(free_coin) AS freeSumCoin,", +// " SUM(task_coin) AS taskSumCoin" , +// "FROM `detail`" , +// "WHERE create_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 10 MONTH) AND CURDATE() AND update_type='充值'" , +// "GROUP BY DATE_FORMAT(create_time, '%Y-%m')" , +// "ORDER BY DATE_FORMAT(create_time, '%Y-%m') DESC "}) +// List getMediuPayCoin(); + + @Select({ + "SELECT m.month,", + " COALESCE(SUM(d.recharge_coin), 0) AS rechargeSumCoin,", + " COALESCE(SUM(d.free_coin), 0) AS freeSumCoin,", + " COALESCE(SUM(d.task_coin), 0) AS taskSumCoin", + "FROM (", + " SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL n MONTH), '%Y-%m') AS month", + " FROM (", + " SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3", + " UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7", + " UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10", + " ) AS numbers", + ") AS m", + "LEFT JOIN detail d ON DATE_FORMAT(d.create_time, '%Y-%m') = m.month AND d.update_type = '充值'", + "GROUP BY m.month", + "ORDER BY m.month DESC" + }) + List getMediuPayCoin(); + +// @Select({"SELECT DATE_FORMAT(create_time, '%Y-%m') AS month," , +// " SUM(recharge_coin) AS rechargeSumCoin," , +// " SUM(free_coin) AS freeSumCoin,", +// " SUM(task_coin) AS taskSumCoin" , +// "FROM `detail`" , +// "WHERE create_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 10 MONTH) AND CURDATE() AND update_type='消费'" , +// "GROUP BY DATE_FORMAT(create_time, '%Y-%m')" , +// "ORDER BY DATE_FORMAT(create_time, '%Y-%m') DESC "}) +// List getMediuConsumeCoin(); + + @Select({ + "SELECT m.month,", + " COALESCE(SUM(d.recharge_coin), 0) AS rechargeSumCoin,", + " COALESCE(SUM(d.free_coin), 0) AS freeSumCoin,", + " COALESCE(SUM(d.task_coin), 0) AS taskSumCoin", + "FROM (", + " SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL n MONTH), '%Y-%m') AS month", + " FROM (", + " SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3", + " UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7", + " UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10", + " ) AS numbers", + ") AS m", + "LEFT JOIN detail d ON DATE_FORMAT(d.create_time, '%Y-%m') = m.month AND d.update_type = '消费'", + "GROUP BY m.month", + "ORDER BY m.month DESC" + }) + List getMediuConsumeCoin(); + + @Select({"SELECT today.jwcode," , + "today.rechargeSumCoin AS todayRecharge," , + "today.freeSumCoin AS todayFree,", + "today.taskSumCoin AS todayTask," , + "(today.rechargeSumCoin + today.freeSumCoin + today.taskSumCoin) AS todayTotalCoin" , + "FROM (SELECT jwcode, SUM(recharge_coin) AS rechargeSumCoin, SUM(free_coin) AS freeSumCoin, SUM(task_coin) AS taskSumCoin FROM detail WHERE create_time <= CURRENT_TIMESTAMP) AS today" , + "where jwcode=#{jwcode}"}) + SumCoin getMess(Integer jwcode); + + + @Select({"SELECT ad.area," , + " SUM(d.recharge_coin) AS totalRecharge," , + " SUM(d.free_coin) AS totalFree," , + " SUM(d.task_coin) AS totalTask," , + " (SUM(d.recharge_coin) + SUM(d.free_coin) + SUM(d.task_coin)) AS todayTotalCoin" , + "FROM detail d" , + "INNER JOIN activity a ON d.activity_id = a.activity_id" , + "INNER JOIN admin ad ON a.admin_id = ad.admin_id" , + "where d.update_type='充值'", + "GROUP BY ad.area" , + "ORDER BY ad.area ASC " + }) + + + List getMediumAreaPay(); + + + @Select({"SELECT ad.area," , + " SUM(d.recharge_coin) AS totalRecharge," , + " SUM(d.free_coin) AS totalFree," , + " SUM(d.task_coin) AS totalTask," , + " (SUM(d.recharge_coin) + SUM(d.free_coin) + SUM(d.task_coin)) AS todayTotalCoin" , + "FROM detail d" , + "INNER JOIN admin ad ON ad.admin_id = d.admin_id", + "WHERE d.update_type = '消费'", + "GROUP BY ad.area", + "ORDER BY ad.area ASC" + }) + List getMediumAreaConsume(); + +} diff --git a/src/main/java/com/example/demo/mapper/UserMapper.java b/src/main/java/com/example/demo/mapper/UserMapper.java new file mode 100644 index 0000000..d1effb5 --- /dev/null +++ b/src/main/java/com/example/demo/mapper/UserMapper.java @@ -0,0 +1,73 @@ +package com.example.demo.mapper; + + +import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.UserVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +@Mapper +public interface UserMapper { + @Select({ + "" + }) + User select(String user); + + @Select({ + "SELECT\n" + + " u.jwcode,\n" + + " u.name,\n" + + " MIN(d.create_time) AS first_recharge_date, -- 首充日期\n" + + " SUM(CASE WHEN d.update_type = '充值' THEN d.recharge_coin ELSE 0 END) AS total_recharge_gold, -- 历史金币总数(充值)\n" + + " SUM(CASE WHEN d.update_type = '消费' THEN d.recharge_coin ELSE 0 END) AS total_spend_gold, -- 历史金币总数(消费)\n" + + " COUNT(CASE WHEN d.update_type = '充值' THEN 1 END) AS recharge_times, -- 充值次数\n" + + " COUNT(CASE WHEN d.update_type = '消费' THEN 1 END) AS spend_times, -- 消费次数\n" + + " COUNT(CASE WHEN a.status = 0 AND d.update_type = '充值' THEN 1 END) AS pending_recharge_times, -- 待审核的充值次数\n" + + " COUNT(CASE WHEN a.status = 0 AND d.update_type = '消费' THEN 1 END) AS pending_spend_times, -- 待审核的消费次数\n" + + " u.sumgold\n" + + "FROM\n" + + " user u\n" + + "LEFT JOIN\n" + + " detail d ON u.jwcode = d.jwcode\n" + + "LEFT JOIN\n" + + " audit a ON d.detail_id = a.detail_id AND a.audit_flag = 1 -- 仅考虑有效且待审核的记录\n" + + "WHERE\n" + + " d.detail_flag = 1 AND u.jwcode = #{jwcode} -- 仅考虑有效记录\n" + + "GROUP BY\n" + + " u.jwcode, u.name" + }) + List selectA(UserVo userVo); + + @Select({ + "" + }) + List selectAll(User user); + @Select({ + "select * from user where name=#{name}" + }) + User selectByName(String name); + + @Update({ + "", + }) + int update(User user); +} diff --git a/src/main/java/com/example/demo/security/SecurityConfig.java b/src/main/java/com/example/demo/security/SecurityConfig.java new file mode 100644 index 0000000..8214363 --- /dev/null +++ b/src/main/java/com/example/demo/security/SecurityConfig.java @@ -0,0 +1,145 @@ +package com.example.demo.security; + + + +import com.example.demo.domain.vo.Result; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +/** + * SpringSecurity的配置文件 + */ +@Configuration + +@EnableWebSecurity // 开启Security的支持 +@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启方法注解 + +public class SecurityConfig { + + + @Autowired + TokenFilter tokenFilter; + + // 核心配置 配置一个过滤器链 + @Bean + public SecurityFilterChain configure(HttpSecurity http) throws Exception { + // 这里可以对httpSecurity进行详细的配置 链式调用的配置方式 + http.formLogin(AbstractHttpConfigurer::disable) // 方法引用,禁用表单登录 + .logout(AbstractHttpConfigurer::disable) // 禁用默认退出 + .csrf(AbstractHttpConfigurer::disable) // 禁用csrf的保护,分布式的前后端分离的项目 + // 设定CORS + .cors(cors -> cors.configurationSource(corsConfigurationSource())) + // 禁用Session, + .sessionManagement( session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + // 用户未登录的处理 + .exceptionHandling( exception -> exception.authenticationEntryPoint(authenticationEntryPoint())) + // 用户权限不足的处理 + .exceptionHandling( exception -> exception.accessDeniedHandler(accessDeniedHandler())) + // 配置路径拦截 + .authorizeHttpRequests( request -> + request.requestMatchers( HttpMethod.GET, + // 用户不登录可以访问的路径 + "/captcha", + "/category", + "/product/**", + "/upload/**").permitAll() + .requestMatchers( HttpMethod.POST, + // 用户不登录就可以访问的路径 + "/user/login", "/user", + "/admin/login","/upload/**").permitAll() + .requestMatchers( + "/error","alipay/**" + ).permitAll() + .anyRequest().authenticated() // 其它路径,必须要登录后才能访问 + ); + // 配置Token过滤器, 将过滤器加入到执行链中 + http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class); + + return http.build(); + } + + /** + * 1. 配置认证管理器 + * @param config + * @return + * @throws Exception + */ + @Bean + protected AuthenticationManager authenticationManager( + AuthenticationConfiguration config ) throws Exception { + return config.getAuthenticationManager(); + } + + /** + * 2. 密码编码器 + * @return + */ + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 3. 用户未登录时的错误处理 + * @return + */ + @Bean + public AuthenticationEntryPoint authenticationEntryPoint() { + return ( request, response, authException) -> { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 + response.setContentType("application/json; charset=utf-8"); + response.getWriter().write(Result.error("用户未登录").toJson()); + }; + } + + /** + * 4. 权限不足时的处理 + * @return + */ + @Bean + public AccessDeniedHandler accessDeniedHandler() { + return ( request, response, authException) -> { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403 + response.setContentType("application/json; charset=utf-8"); + response.getWriter().write(Result.error("当前用户权限不足!").toJson()); + }; + } + + /** + * 5. 配置跨域请求 + * @return + */ + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration config = new CorsConfiguration(); + config.addAllowedOriginPattern("*"); // 允许任何的源 + config.addAllowedMethod("*"); // 允许任何的HTTP请求方式 + config.addAllowedHeader("*"); // 允许任何的HTTP头 + config.setAllowCredentials(true); // 允许证书 + config.setMaxAge(3600L); // 设置浏览器预检的时间 + + // 生成源 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + return source; + } +} diff --git a/src/main/java/com/example/demo/security/TokenFilter.java b/src/main/java/com/example/demo/security/TokenFilter.java new file mode 100644 index 0000000..c305359 --- /dev/null +++ b/src/main/java/com/example/demo/security/TokenFilter.java @@ -0,0 +1,53 @@ +package com.example.demo.security; + + + +import com.example.demo.Util.JWTUtil; +import com.example.demo.domain.entity.Admin; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; + +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +public class TokenFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + // 取Token 生成登录信息 + String token = request.getHeader("token"); + // token不为空 + if (StringUtils.hasText(token)){ + // jwt解密 + try { + UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class); + if ( ! ObjectUtils.isEmpty(userDetails)) { + // 将这个用户注册到Security中 + UsernamePasswordAuthenticationToken authenticationToken + + = new UsernamePasswordAuthenticationToken( + userDetails, null, + userDetails.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + } catch (Exception e) { + e.printStackTrace(); + // Token无效, + } + } + // 过滤器放行 + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/ActivityServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/ActivityServiceImpl.java new file mode 100644 index 0000000..423fbed --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/ActivityServiceImpl.java @@ -0,0 +1,70 @@ +package com.example.demo.serviceImpl; + + + +import com.example.demo.domain.entity.Activity; +import com.example.demo.mapper.ActivityMapper; +import com.example.demo.sevice.ActivityService; +import com.github.pagehelper.PageHelper; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.github.pagehelper.PageInfo; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class ActivityServiceImpl implements ActivityService { + + @Autowired + ActivityMapper activityMapper; + @Override + public int add(Activity activity) { + return activityMapper.add(activity); + } + + @Override + public int edit(Activity activity) { + activity.setActivityFlag(0); + return activityMapper.edit(activity); + } + + @Override + public List search(Activity activity) { + + return activityMapper.select(activity); + } + + + + public PageInfo searchForPage(Integer pageNum, Integer pageSize, Activity activity) { +// PageHelper.startPage(pageNum, pageSize); +// List list = activityMapper.select(activity); +// return new PageInfo<>(list); + + PageHelper.startPage(pageNum, pageSize); + List list = activityMapper.select(activity); + LocalDate nowDate = LocalDate.now(); // 获取当前的 LocalDate + list.stream() + .forEach(activity1 -> { + if (nowDate.isBefore(activity1.getStartTime())) { + // 假设 Activity 类有一个 setStatus 方法来设置状态 + activity1.setStatus(0); // 设置新的状态 + activityMapper.edit(activity1); // 保存修改后的对象 + } + else if(nowDate.isAfter(activity1.getEndTime())) { + // 假设 Activity 类有一个 setStatus 方法来设置状态 + activity1.setStatus(2); // 设置新的状态 + activityMapper.edit(activity1); // 保存修改后的对象 + } + else {activity1.setStatus(1); + activityMapper.edit(activity1); + } + }); + return new PageInfo<>(list); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/AdminServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/AdminServiceImpl.java new file mode 100644 index 0000000..3e35cf1 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/AdminServiceImpl.java @@ -0,0 +1,82 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.domain.entity.Admin; +import com.example.demo.mapper.AdminMapper; +import com.example.demo.security.SecurityConfig; +import com.example.demo.sevice.AdminService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; + + +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AdminServiceImpl implements AdminService { + @Autowired + private SecurityConfig securityConfig; + private final AdminMapper adminMapper; + @Autowired + private AuthenticationManager authenticationManager; + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + public int add(Admin admin) { + return adminMapper.insert(admin); + } + + @Override + public int edit(Admin admin) { + return adminMapper.update(admin); + } + + @Override + public Admin findById(Integer adminId) { + return adminMapper.selectById(adminId); + } + + @Override + public Admin findByUsername(String username) { + return adminMapper.selectByName(username); + } + + @Override + public List search(Admin admin) { + return adminMapper.select(admin); + } + + @Override + public PageInfo searchForPage(Integer pageNum, Integer pageSize, Admin admin) { + PageHelper.startPage(pageNum, pageSize); + List list = adminMapper.select(admin); + return new PageInfo<>(list); + + } + + @Override + public Admin login(Admin admin) throws Exception { + UsernamePasswordAuthenticationToken token = + new UsernamePasswordAuthenticationToken(admin.getUsername(),admin.getPassword()); + try { + Authentication authentication = authenticationManager.authenticate(token); + Admin loginAdmin = (Admin) authentication.getPrincipal(); + + return loginAdmin; + }catch (BadCredentialsException exception){ + throw new BadCredentialsException("用户或密码错误"); + + } + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java new file mode 100644 index 0000000..f3abbe3 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java @@ -0,0 +1,55 @@ +package com.example.demo.serviceImpl; + + + + +import com.example.demo.domain.entity.Audit; +import com.example.demo.domain.vo.ConsumeDetail; +import com.example.demo.mapper.AuditMapper; +import com.example.demo.sevice.AuditService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AuditServiceImpl implements AuditService { + private final AuditMapper auditMapper; + + @Override + public int add(Audit audit) { + return auditMapper.insert(audit); + } + + @Override + public int edit(Audit audit) { + return auditMapper.update(audit); + } + + @Override + public List search(Audit audit) { + return auditMapper.select(audit); + } + + @Override + public PageInfo searchForPage(Integer pageNum, Integer pageSize, Audit audit) { + PageHelper.startPage(pageNum,pageSize); + List list= auditMapper.select(audit); + return new PageInfo<>(list); + } + + @Override + public List searchForDetail(ConsumeDetail consumeDetail) { + return auditMapper.selectCon(consumeDetail); + } + + @Override + public PageInfo searchForConsumeDetail(Integer pageNum, Integer pageSize, ConsumeDetail consumeDetail) { + PageHelper.startPage(pageNum,pageSize); + List list= auditMapper.selectCon(consumeDetail); + return new PageInfo<>(list); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java new file mode 100644 index 0000000..5398000 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/ConsumeServiceImpl.java @@ -0,0 +1,84 @@ +package com.example.demo.serviceImpl; + + + +import com.example.demo.domain.entity.Admin; +import com.example.demo.domain.entity.Detail; +import com.example.demo.domain.entity.Product; +import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.DetailVo; +import com.example.demo.mapper.ConsumeMapper; +import com.example.demo.mapper.UserMapper; +import com.example.demo.sevice.ConsumeService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class ConsumeServiceImpl implements ConsumeService { + @Autowired + ConsumeMapper consumeMapper; + private final UserMapper userMapper; + + @Override + //新增消费记录 + public int insert(Detail detail) throws Exception { + BigDecimal paidGold1 =detail.getFreeCoin(); + BigDecimal freeGold1 =detail.getRechargeCoin(); + BigDecimal taskGold1 =detail.getTaskCoin(); + String jwcode = detail.getJwcode(); + User user = userMapper.select(jwcode); + BigDecimal Sumgold =user.getSumgold(); + + Sumgold = Sumgold.subtract(freeGold1).subtract(paidGold1).subtract(taskGold1); + +// 设置更新后的Sumgold回到user对象 + user.setSumgold(Sumgold); + System.out.println(user+"----------------------------------------------------------"); + int result = userMapper.update(user); + if (result != 1) { + throw new Exception("Failed to insert another entity"); + } + //添加表单数据 + result =consumeMapper.insert(detail); + return result; + } + @Override + public User getByUserId(Integer userId) { + return consumeMapper.getByUserId(userId); + } + @Override + public Admin getByadminId(Integer adminId) { + return consumeMapper.getByadminId(adminId); + } + + + @Override + public List search(DetailVo detailVo) { + return consumeMapper.select(detailVo); + } + + + @Override + public PageInfo searchForPage(Integer pageNum, Integer pageSize, DetailVo detailVo) { + PageHelper.startPage(pageNum, pageSize); + List list = consumeMapper.select(detailVo); + return new PageInfo<>(list); + } + + public List getDeatil(Integer jwcode){ + return consumeMapper.getDeatil(jwcode); + } + + public List getProduct(String name){ + return consumeMapper.getProduct(name); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/DetailServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/DetailServiceImpl.java new file mode 100644 index 0000000..39d5e6d --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/DetailServiceImpl.java @@ -0,0 +1,50 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.domain.entity.Detail; +import com.example.demo.mapper.DetailMapper; +import com.example.demo.sevice.DetailService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class DetailServiceImpl implements DetailService { + @Autowired + + private DetailMapper detailMapper; + @Override + public int add(Detail detail) { + return detailMapper.add(detail); + } + + @Override + public int edit(Detail detail) { + return 0; + } + + @Override + public Detail getDetail(int id) { + return null; + } + + @Override + public List getAllDetail(Detail detail) { + return detailMapper.select(detail); + } + + + @Override + public PageInfo getDetailByPage(int pageNum, int pageSize, Detail detail) { + PageHelper.startPage(pageNum, pageSize); + List list= detailMapper.select(detail); + return new PageInfo<>(list); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/ProductServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/ProductServiceImpl.java new file mode 100644 index 0000000..c92ade0 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/ProductServiceImpl.java @@ -0,0 +1,20 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.domain.entity.Product; +import com.example.demo.mapper.ProductMapper; +import com.example.demo.sevice.ProductService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ProductServiceImpl implements ProductService { + private final ProductMapper productMapper; + @Override + public List findAll(Product product) { + return productMapper.findAll(product); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java new file mode 100644 index 0000000..0056cd2 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/RateServiceImpl.java @@ -0,0 +1,56 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.domain.entity.Rate; +import com.example.demo.mapper.RateMapper; +import com.example.demo.sevice.RateService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor + +public class RateServiceImpl implements RateService { + private final RateMapper rateMapper; + @Override + public int add(Rate rate) { + return rateMapper.insert(rate); + } + + @Transactional + @Override + public int edit(Rate rate) { + return rateMapper.update(rate); + } + + @Override + public void delete(Integer rateId) throws Exception { + int result = rateMapper.deleteById(rateId); + if(result == 0){ + throw new Exception("未找到对应的记录,删除失败"); + }; + } + + @Override + public Rate getById(Integer rateId) { + return rateMapper.selectById(rateId); + } + + @Override + public List search(Rate rate) { + return rateMapper.select(rate); + } + + @Override + public PageInfo searchForPage(Integer pageNum, Integer pageSize, Rate rate) { + PageHelper.startPage(pageNum, pageSize); + List list = rateMapper.select(rate); + return new PageInfo<>(list); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java new file mode 100644 index 0000000..053f8c6 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/RechargeServiceImpl.java @@ -0,0 +1,156 @@ +package com.example.demo.serviceImpl; + +import com.example.demo.domain.entity.Audit; +import com.example.demo.domain.entity.Detail; +import com.example.demo.domain.entity.Recharge; +import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.RechargeVo; +import com.example.demo.mapper.AuditMapper; +import com.example.demo.mapper.DetailMapper; +import com.example.demo.mapper.RechargeMapper; +import com.example.demo.mapper.UserMapper; +import com.example.demo.sevice.RechargeService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class RechargeServiceImpl implements RechargeService { + @Autowired + private RechargeMapper rechargeMapper; + @Autowired + private AuditMapper auditMapper; + @Autowired + private DetailMapper detailMapper; + @Autowired + private UserMapper userMapper; + @Override + @Transactional + public int add(Recharge recharge) throws Exception { +// return rechargeMapper.insert(recharge); + + + int result = rechargeMapper.insert(recharge); + if (result != 1) { + throw new Exception("Failed to insert recharge data"); + } + System.out.println(recharge); + + // 检查充值金额是否在有效范围内 + BigDecimal RechargeGold = recharge.getRechargeGold(); + BigDecimal PaidGold = recharge.getPaidGold(); + BigDecimal FreeGold = recharge.getFreeGold(); + + if (RechargeGold.compareTo(BigDecimal.ZERO) < 0 || RechargeGold.compareTo(new BigDecimal("999999")) > 0 || + PaidGold.compareTo(BigDecimal.ZERO) < 0 || PaidGold.compareTo(new BigDecimal("999999")) > 0 || + FreeGold.compareTo(BigDecimal.ZERO) < 0 || FreeGold.compareTo(new BigDecimal("999999")) > 0) { + throw new Exception("充值金额有误,金额必须在0到999999之间!"); + } + + int rechargeId = recharge.getRechargeId(); + Integer jwCode= Integer.valueOf(recharge.getJwcode()); + String JwCode = recharge.getJwcode(); + int activityId = recharge.getActivityId(); + BigDecimal paidGold =recharge.getPaidGold(); + BigDecimal freeGold =recharge.getFreeGold(); + BigDecimal rechargeGold =recharge.getRechargeGold(); + String rechargeWay =recharge.getRechargeWay(); + String remark =recharge.getRemark(); + int adminId =recharge.getAdminId(); + + + Detail detail = new Detail(); + + //根据jwcode和充值类型判断detail有没有,有首充标识设为0,否者设为1 + String jwcode= recharge.getJwcode(); + + Integer count=rechargeMapper.getAllByjwAndup(jwcode); + System.out.println("count:-----"+count); + if(count==0){ + detail.setFirstRecharge(1); + }else{ + detail.setFirstRecharge(0); + } + detail.setJwcode(JwCode); + detail.setActivityId(activityId); + detail.setTaskCoin(paidGold); + detail.setRechargeCoin(rechargeGold); + detail.setFreeCoin(freeGold); + detail.setRechargeWay(rechargeWay); + detail.setRemark(remark); + detail.setUpdateType("充值"); + detail.setAdminId(adminId); + System.out.println(detail); + result = detailMapper.add(detail); + if (result != 1) { + throw new Exception("Failed to insert another entity"); + } + + BigDecimal paidGold1 =recharge.getPaidGold(); + BigDecimal freeGold1 =recharge.getFreeGold(); + User user = userMapper.select(jwcode); + BigDecimal Sumgold =user.getSumgold(); + + Sumgold = Sumgold.add(freeGold1).add(paidGold1); + +// 设置更新后的Sumgold回到user对象 + user.setSumgold(Sumgold); + System.out.println(user+"----------------------------------------------------------"); + result = userMapper.update(user); + if (result != 1) { + throw new Exception("Failed to insert another entity"); + } + + int detailId = detail.getDetailId(); + + System.out.println(detailId); + Audit audit = new Audit(); + audit.setRechargeId(rechargeId); + audit.setJwcode(jwCode); + audit.setDetailId(detailId); + System.out.println(audit+"---------------------------------------"); + result = auditMapper.insert(audit); + if (result != 1) { + throw new Exception("Failed to insert another entity"); + } + + + + return result; + } + + @Override + public int edit(Recharge recharge) throws Exception { + recharge.setFlag(0); + return rechargeMapper.update(recharge); + } + + @Override + public Recharge findById(int id) throws Exception { + return null; + } + + @Override + public List search(RechargeVo rechargeVo) { + return rechargeMapper.select(rechargeVo); + } + + @Override + public PageInfo searchForPage(Integer pageNum, Integer pageSize, RechargeVo rechargeVo) { + PageHelper.startPage(pageNum, pageSize); + List list= rechargeMapper.select(rechargeVo); + return new PageInfo<>(list); + } + @Override + public int getAllByjwAndup(String jwcode) { + + return rechargeMapper.getAllByjwAndup(jwcode); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java new file mode 100644 index 0000000..ebb3626 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java @@ -0,0 +1,87 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.domain.entity.Detail; +import com.example.demo.mapper.RefundMapper; +import com.example.demo.sevice.RefundService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + + +@RequiredArgsConstructor +@Transactional +@Service +public class RefundServiceImpl implements RefundService { + private final RefundMapper refundMapper; + @Override + public int add(Detail detail) { + return refundMapper.insert(detail); + } + + @Override + public int addAudit(Detail detail) { + return refundMapper.insertAudit(detail); + } + + //自动软删除数据加更新数据 + @Override + public void edit(Detail newDetail) { + // 获取旧的明细记录 + Detail oldDetail = refundMapper.selectByDetailId(newDetail.getDetailId()); + + if (oldDetail == null || oldDetail.getDetailFlag() ==0) { + throw new IllegalArgumentException("该记录不存在或已被隐藏!"); + } + + // 软删除旧记录 + refundMapper.update(oldDetail.getDetailId()); + + // 将新的字段值复制到旧记录中,未修改的字段保持旧值 + if (newDetail.getJwcode() == null) newDetail.setJwcode(oldDetail.getJwcode()); + if (newDetail.getRefundType() == null) newDetail.setRefundType(oldDetail.getRefundType()); + if (newDetail.getRefundGoods() == null) newDetail.setRefundGoods(oldDetail.getRefundGoods()); + if (newDetail.getRechargeCoin() == null) newDetail.setRechargeCoin(oldDetail.getRechargeCoin()); + if (newDetail.getFreeCoin() == null) newDetail.setFreeCoin(oldDetail.getFreeCoin()); + if (newDetail.getTaskCoin() == null) newDetail.setTaskCoin(oldDetail.getTaskCoin()); + if (newDetail.getRemark() == null) newDetail.setRemark(oldDetail.getRemark()); + if (newDetail.getAdminId() == null) newDetail.setAdminId(oldDetail.getAdminId()); + + // 插入新记录 + newDetail.setDetailId(null); // 清空 ID,让其自动生成 + newDetail.setDetailFlag(1); // 确保新记录未被删除 + refundMapper.insert(newDetail); + } + + @Override + public boolean existsByContactId(Integer contactId) { + return refundMapper.existsByContactId(contactId); + } + + @Override + public int softDelete(Integer detailId) { + return refundMapper.update(detailId); + } + + @Override + public Detail selectByDetailId(Integer detailId) { + return refundMapper.selectByDetailId(detailId); + } + + @Override + public List search(Detail detail) { + return refundMapper.select(detail); + } + + @Override + public PageInfo searchForPage(Integer pageNum, Integer pageSize, Detail detail) { + PageHelper.startPage(pageNum, pageSize); + List list = refundMapper.select(detail); + return new PageInfo<>(list); + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java new file mode 100644 index 0000000..b52bc8f --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java @@ -0,0 +1,126 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.Util.CheckIfNullUtil; +import com.example.demo.domain.vo.Statistics; +import com.example.demo.domain.vo.Statisticss; +import com.example.demo.domain.vo.SumCoin; +import com.example.demo.mapper.StatisticsMapper; +import com.example.demo.sevice.StatisticsService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.List; + +@RequiredArgsConstructor +@Transactional +@Service +public class StatisticsServiceImpl implements StatisticsService { + private final StatisticsMapper statisticsMapper; + + @Override + public Statistics getStatistics() { + Statistics statistics = new Statistics(); + + // 全年累计数据 + Statistics yearStats = CheckIfNullUtil.defaultIfNull( statisticsMapper.getTotalYearCoin(), new Statistics()); + statistics.setRechargeSumCoin(yearStats.getRechargeSumCoin()); + statistics.setFreeSumCoin(yearStats.getFreeSumCoin()); + statistics.setTaskSumCoin(yearStats.getTaskSumCoin()); + statistics.setTotalSumCoin(yearStats.getTotalSumCoin()); + +// 昨日新增数据 + Statistics yesterdayStats = CheckIfNullUtil.defaultIfNull( statisticsMapper.getYesterdayNewCoin(), new Statistics()); + statistics.setRechargeYesterdaySumCoin(yesterdayStats.getRechargeYesterdaySumCoin()); + statistics.setFreeYesterdaySumCoin(yesterdayStats.getFreeYesterdaySumCoin()); + statistics.setTaskYesterdaySumCoin(yesterdayStats.getTaskYesterdaySumCoin()); + statistics.setTotalYesterdaySumCoin(yesterdayStats.getTotalYesterdaySumCoin()); + // 年累计充值人数 + statistics.setRechargeCount(statisticsMapper.getYearRechargeCount()); + + // 本周和上周充值人数 + int thisWeekCount = statisticsMapper.getRechargeCountThisWeek(); + int lastWeekCount = statisticsMapper.getRechargeCountLastWeek(); + statistics.setRechargeCountThisWeek(thisWeekCount); + statistics.setRechargeCountLastWeek(lastWeekCount); + + // 周同比计算 + BigDecimal weekOverWeekRate = BigDecimal.ZERO;//初始化为 0 表示如果没有足够的数据(如 lastWeekCount == 0),默认周同比增长率为 0。 + if (lastWeekCount > 0) { + weekOverWeekRate = BigDecimal.valueOf((double) (thisWeekCount - lastWeekCount) / lastWeekCount * 100)//将计算结果转换为 BigDecimal 类型,保证高精度。 + .setScale(2, BigDecimal.ROUND_HALF_UP); // 保留两位小数 + } + statistics.setWeekOverWeekRate(weekOverWeekRate); + + //今日和昨日充值人数 + int todayCount = statisticsMapper.getRechargeCountToday(); + int yesterdayCount = statisticsMapper.getRechargeCountYesterday(); + int firstYesterdayCount =statisticsMapper.getFirstRechargeCountYesterday(); + statistics.setRechargeCountToday(todayCount); + statistics.setRechargeCountYesterday(yesterdayCount); + statistics.setFirstRechargeCountYesterday(firstYesterdayCount); + + //日环比计算 + BigDecimal dayOverDayRate = BigDecimal.ZERO; + if (yesterdayCount > 0) { + dayOverDayRate = BigDecimal.valueOf((double) (todayCount - yesterdayCount) / yesterdayCount * 100). + setScale(2, BigDecimal.ROUND_HALF_UP); + } + statistics.setDayOverDayRate(dayOverDayRate); + + return statistics; + } + + @Override + public Statisticss stats() { + Statisticss a = new Statisticss(); + a.setCoinSystemSum(statisticsMapper.getCoinSystemSum()); + a.setERPSum(statisticsMapper.getERPSum()); + a.setHomilyChartSum(statisticsMapper.getHomilyChartSum()); + a.setHomilyLinkSum(statisticsMapper.getHomilyLinkSum()); + return a; + } + +//----------------------------------------------------------------------------------------------------// + + public SumCoin getSumCoin(){ + return statisticsMapper.getSumCoin(); + } + + @Override + public SumCoin getYearConsumeCoin() { + return statisticsMapper.getYearConsumeCoin(); + } + + @Override + public SumCoin getDayConsumeCoin() { + return statisticsMapper.getDayConsumeCoin(); + } + + @Override + public List getMediuPayCoin() { + return statisticsMapper.getMediuPayCoin(); + } + + @Override + public List getMediuConsumeCoin() { + return statisticsMapper.getMediuConsumeCoin(); + } + public SumCoin getMess(Integer jwcode){ + return statisticsMapper.getMess(jwcode); + } + + @Override + public List getMediumAreaPay() { + return statisticsMapper.getMediumAreaPay(); + } + + @Override + public List getMediumAreaConsume() { + return statisticsMapper.getMediumAreaConsume(); + } + + +} diff --git a/src/main/java/com/example/demo/serviceImpl/UserDetailServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/UserDetailServiceImpl.java new file mode 100644 index 0000000..f59dad2 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/UserDetailServiceImpl.java @@ -0,0 +1,27 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.domain.entity.Admin; +import com.example.demo.mapper.AdminMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +@Service +@RequiredArgsConstructor +public class UserDetailServiceImpl implements UserDetailsService { + @Autowired + private AdminMapper adminMapper; + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Admin admin=adminMapper.selectByName(username); + if(ObjectUtils.isEmpty(admin)){ + throw new UsernameNotFoundException("用户名不存在"); + } + return admin; + } +} diff --git a/src/main/java/com/example/demo/serviceImpl/UserServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/UserServiceImpl.java new file mode 100644 index 0000000..569c339 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/UserServiceImpl.java @@ -0,0 +1,37 @@ +package com.example.demo.serviceImpl; + + +import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.UserVo; +import com.example.demo.mapper.UserMapper; +import com.example.demo.sevice.UserSevice; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserSevice { + + private final UserMapper userMapper; + + @Override + public List search(UserVo userVo) throws Exception{ + User sUser = userMapper.select(userVo.getJwcode()); + if(ObjectUtils.isEmpty(sUser)){ + throw new Exception("无此精网号"); + } + return userMapper.selectA(userVo); + } + + @Override + public PageInfo searchForPage(Integer pageNum, Integer pageSize, User user) { + PageHelper.startPage(pageNum,pageSize); + List list= userMapper.selectAll(user); + return new PageInfo<>(list); + } +} diff --git a/src/main/java/com/example/demo/sevice/ActivityService.java b/src/main/java/com/example/demo/sevice/ActivityService.java new file mode 100644 index 0000000..a5b51a8 --- /dev/null +++ b/src/main/java/com/example/demo/sevice/ActivityService.java @@ -0,0 +1,18 @@ +package com.example.demo.sevice; + + + + +import com.example.demo.domain.entity.Activity; + +import java.util.List; + +public interface ActivityService { + + int add(Activity activity); + + int edit(Activity activity); + + List search(Activity activity); + +} diff --git a/src/main/java/com/example/demo/sevice/AdminService.java b/src/main/java/com/example/demo/sevice/AdminService.java new file mode 100644 index 0000000..d319237 --- /dev/null +++ b/src/main/java/com/example/demo/sevice/AdminService.java @@ -0,0 +1,17 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.entity.Admin; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface AdminService { + int add(Admin admin); + int edit(Admin admin); + Admin findById(Integer adminId); + Admin findByUsername(String username); + List search(Admin admin); + PageInfo searchForPage(Integer pageNum, Integer pageSize, Admin admin); + Admin login(Admin admin)throws Exception; +} diff --git a/src/main/java/com/example/demo/sevice/AuditService.java b/src/main/java/com/example/demo/sevice/AuditService.java new file mode 100644 index 0000000..5133730 --- /dev/null +++ b/src/main/java/com/example/demo/sevice/AuditService.java @@ -0,0 +1,19 @@ +package com.example.demo.sevice; + + + +import com.example.demo.domain.entity.Audit; +import com.example.demo.domain.vo.ConsumeDetail; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface AuditService { + int add (Audit audit); + int edit(Audit audit); + List search(Audit audit) ; + PageInfo searchForPage(Integer pageNum, Integer pageSize, Audit audit); + List searchForDetail(ConsumeDetail consumeDetail); + PageInfo searchForConsumeDetail(Integer pageNum, Integer pageSize, ConsumeDetail consumeDetail); +} + diff --git a/src/main/java/com/example/demo/sevice/ConsumeService.java b/src/main/java/com/example/demo/sevice/ConsumeService.java new file mode 100644 index 0000000..1876b69 --- /dev/null +++ b/src/main/java/com/example/demo/sevice/ConsumeService.java @@ -0,0 +1,23 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.entity.Admin; +import com.example.demo.domain.entity.Detail; +import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.DetailVo; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface ConsumeService { + //新增消费记录 + int insert(Detail detail) throws Exception; + + User getByUserId(Integer userId); + + Admin getByadminId(Integer adminId); + + List search(DetailVo detailVo); + + PageInfo searchForPage(Integer pageNum, Integer pageSize, DetailVo detailVo); +} diff --git a/src/main/java/com/example/demo/sevice/DetailService.java b/src/main/java/com/example/demo/sevice/DetailService.java new file mode 100644 index 0000000..e74ef6c --- /dev/null +++ b/src/main/java/com/example/demo/sevice/DetailService.java @@ -0,0 +1,14 @@ +package com.example.demo.sevice; + +import com.example.demo.domain.entity.Detail; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface DetailService { + int add(Detail detail); + int edit(Detail detail); + Detail getDetail(int id); + List getAllDetail(Detail detail); + PageInfo getDetailByPage(int pageNum, int pageSize, Detail detail); +} diff --git a/src/main/java/com/example/demo/sevice/ProductService.java b/src/main/java/com/example/demo/sevice/ProductService.java new file mode 100644 index 0000000..80a8218 --- /dev/null +++ b/src/main/java/com/example/demo/sevice/ProductService.java @@ -0,0 +1,10 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.entity.Product; + +import java.util.List; + +public interface ProductService { + List findAll(Product product); +} diff --git a/src/main/java/com/example/demo/sevice/RateService.java b/src/main/java/com/example/demo/sevice/RateService.java new file mode 100644 index 0000000..88e711b --- /dev/null +++ b/src/main/java/com/example/demo/sevice/RateService.java @@ -0,0 +1,16 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.entity.Rate; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface RateService { + int add(Rate rate) throws Exception; + int edit(Rate rate) throws Exception; + void delete(Integer rateId) throws Exception; + Rate getById(Integer rateId); + List search(Rate rate); + PageInfo searchForPage(Integer pageNum, Integer pageSize, Rate rate); +} diff --git a/src/main/java/com/example/demo/sevice/RechargeService.java b/src/main/java/com/example/demo/sevice/RechargeService.java new file mode 100644 index 0000000..7350f75 --- /dev/null +++ b/src/main/java/com/example/demo/sevice/RechargeService.java @@ -0,0 +1,21 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.entity.Recharge; +import com.example.demo.domain.vo.RechargeVo; +import com.github.pagehelper.PageInfo; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +public interface RechargeService { + @Transactional + int add(Recharge recharge) throws Exception; + int edit(Recharge recharge) throws Exception; + + Recharge findById(int id) throws Exception; + List search(RechargeVo rechargeVo) ; + PageInfo searchForPage(Integer pageNum, Integer pageSize, RechargeVo rechargeVo); + + int getAllByjwAndup(String jwcode); +} diff --git a/src/main/java/com/example/demo/sevice/RefundService.java b/src/main/java/com/example/demo/sevice/RefundService.java new file mode 100644 index 0000000..db2876a --- /dev/null +++ b/src/main/java/com/example/demo/sevice/RefundService.java @@ -0,0 +1,21 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.entity.Detail; +import com.github.pagehelper.PageInfo; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public interface RefundService { + int add(Detail detail) ; + int addAudit(Detail detail); + void edit(Detail newDetail) ; + boolean existsByContactId(Integer contactId); + int softDelete(Integer detailId) ; + Detail selectByDetailId(Integer detailId); + List search(Detail detail); + PageInfo searchForPage(Integer pageNum, Integer pageSize, Detail detail); + +} diff --git a/src/main/java/com/example/demo/sevice/StatisticsService.java b/src/main/java/com/example/demo/sevice/StatisticsService.java new file mode 100644 index 0000000..29132cd --- /dev/null +++ b/src/main/java/com/example/demo/sevice/StatisticsService.java @@ -0,0 +1,25 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.vo.Statistics; +import com.example.demo.domain.vo.Statisticss; +import com.example.demo.domain.vo.SumCoin; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public interface StatisticsService { + + Statistics getStatistics(); + Statisticss stats(); + + SumCoin getSumCoin(); + SumCoin getYearConsumeCoin(); + SumCoin getDayConsumeCoin(); + List getMediuPayCoin(); + List getMediuConsumeCoin(); + SumCoin getMess(Integer jwcode); + List getMediumAreaPay(); + List getMediumAreaConsume(); +} diff --git a/src/main/java/com/example/demo/sevice/UserSevice.java b/src/main/java/com/example/demo/sevice/UserSevice.java new file mode 100644 index 0000000..91a6ae1 --- /dev/null +++ b/src/main/java/com/example/demo/sevice/UserSevice.java @@ -0,0 +1,14 @@ +package com.example.demo.sevice; + + +import com.example.demo.domain.entity.User; +import com.example.demo.domain.vo.UserVo; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +public interface UserSevice { + List search(UserVo userVo) throws Exception; + PageInfo searchForPage(Integer pageNum, Integer pageSize, User User); + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..990d911 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,25 @@ +server: + port: 10010 + +spring: + datasource: + hikari: # HikariCP连接池配置 + maximum-pool-size: 10 # 最大连接数 + minimum-idle: 5 # 最小空闲连接数 + idle-timeout: 30000 # 空闲连接超时时间(毫秒) + max-lifetime: 1800000 # 连接最大存活时间(毫秒) + connection-timeout: 30000 # 连接超时时间(毫秒) + pool-name: HwgoldHikariCP # 连接池名称 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://39.101.133.168/hwgold?serverTimezone=GMT%2b8 + username: hwgold + password: 'AGX4Z3YMxiCG3GR2' + application: + name: demo +mybatis: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +upload: + path: D:/gold1/ \ No newline at end of file diff --git a/src/test/java/com/example/demo/DemoApplicationTests.java b/src/test/java/com/example/demo/DemoApplicationTests.java new file mode 100644 index 0000000..2778a6a --- /dev/null +++ b/src/test/java/com/example/demo/DemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DemoApplicationTests { + + @Test + void contextLoads() { + } + +}